From adc46de59a2e14f4ea58ba1b54ffdd73dd58009d Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 16 Nov 2022 18:15:33 +0100 Subject: [PATCH 0001/2372] Update prettier and re-format text --- CHANGELOG.md | 4 ++-- devtools/format_md.sh | 2 +- devtools/format_yml.sh | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8847ec6ffb..fffd4fe228 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,8 +23,8 @@ and this project adheres to - all: Bump a few dependency versions to make the codebase compile with `-Zminimal-versions` ([#1465]). -- cosmwasm-profiler: Package was removed 🪦. It served its job showing us that we - cannot properly measure different runtimes for differet Wasm opcodes. +- cosmwasm-profiler: Package was removed 🪦. It served its job showing us that + we cannot properly measure different runtimes for differet Wasm opcodes. - cosmwasm-schema: schema generation is now locked to produce strictly `draft-07` schemas - cosmwasm-schema: `QueryResponses` derive now sets the `JsonSchema` trait bound diff --git a/devtools/format_md.sh b/devtools/format_md.sh index 1ad0f38f34..f45b8c6907 100755 --- a/devtools/format_md.sh +++ b/devtools/format_md.sh @@ -11,4 +11,4 @@ while getopts c option; do esac done -npx prettier@2.2.1 --$op "./**/*.md" +npx prettier@2.7.1 --$op "./**/*.md" diff --git a/devtools/format_yml.sh b/devtools/format_yml.sh index 36d684bf59..142ca7a43b 100755 --- a/devtools/format_yml.sh +++ b/devtools/format_yml.sh @@ -11,4 +11,4 @@ while getopts c option; do esac done -npx prettier@2.2.1 --$op "./**/*.yml" +npx prettier@2.7.1 --$op "./**/*.yml" From 889062fd4f25aadd2f2470d350e4b097f990f947 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 21 Nov 2022 14:10:14 +0100 Subject: [PATCH 0002/2372] Add CI job for testing cosmwasm-vm on Windows --- .circleci/config.yml | 45 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 01ce7296d3..cd8159bc5b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,6 +2,7 @@ version: 2.1 orbs: codecov: codecov/codecov@3.2.0 + win: circleci/windows@5.0 workflows: test: @@ -15,6 +16,7 @@ workflows: - package_std - package_storage - package_vm + - package_vm_windows - contract_burner - contract_crypto_verify - contract_cyberpunk @@ -376,6 +378,49 @@ jobs: - target/debug/deps key: cargocache-v2-package_vm-rust:1.59.0-{{ checksum "Cargo.lock" }} + package_vm_windows: + executor: + name: win/default + shell: bash.exe + steps: + - run: + name: Enable symlinks for the checkout + command: git config --global core.symlinks true + - checkout + - run: + name: Reset git config set by CircleCI to make Cargo work + command: git config --global --unset url.ssh://git@github.com.insteadof + - run: + name: Install Rust + command: | + set -o errexit + curl -sS --output rustup-init.exe https://static.rust-lang.org/rustup/dist/x86_64-pc-windows-msvc/rustup-init.exe + ./rustup-init.exe --default-toolchain 1.65.0 -y + echo 'export PATH="$PATH;$USERPROFILE/.cargo/bin"' >> "$BASH_ENV" + - run: + name: Version information + command: | + set -o errexit + rustc --version; cargo --version; rustup --version; rustup target list --installed + - restore_cache: + keys: + - cargocache-v2-package_vm_windows-rust:1.65.0-{{ checksum "Cargo.lock" }} + - run: + name: Test + working_directory: ~/project/packages/vm + command: cargo test --locked + - run: + name: Test with all features + working_directory: ~/project/packages/vm + command: cargo test --locked --features allow_interface_version_7,iterator,staking,stargate + - save_cache: + paths: + - /usr/local/cargo/registry + - target/debug/.fingerprint + - target/debug/build + - target/debug/deps + key: cargocache-v2-package_vm_windows-rust:1.65.0-{{ checksum "Cargo.lock" }} + contract_burner: docker: - image: rust:1.59.0 From 0b39abee2f06d0c24510c34f1f29ab6ed923e149 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 30 Aug 2022 16:41:43 +0200 Subject: [PATCH 0003/2372] Change filesystem errors to be consistent across operating systems --- packages/vm/src/cache.rs | 17 +++---- packages/vm/src/filesystem.rs | 43 ++++++++++++++++++ packages/vm/src/lib.rs | 1 + packages/vm/src/modules/file_system_cache.rs | 47 ++++++++++++-------- packages/vm/src/modules/mod.rs | 2 +- 5 files changed, 79 insertions(+), 31 deletions(-) create mode 100644 packages/vm/src/filesystem.rs diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 6310f3ca40..16e9bfea72 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -1,5 +1,5 @@ use std::collections::HashSet; -use std::fs::{create_dir_all, File, OpenOptions}; +use std::fs::{File, OpenOptions}; use std::io::{Read, Write}; use std::marker::PhantomData; use std::path::{Path, PathBuf}; @@ -10,6 +10,7 @@ use crate::capabilities::required_capabilities_from_module; use crate::checksum::Checksum; use crate::compatibility::check_wasm; use crate::errors::{VmError, VmResult}; +use crate::filesystem::mkdir_p; use crate::instance::{Instance, InstanceOptions}; use crate::modules::{FileSystemCache, InMemoryCache, PinnedMemoryCache}; use crate::size::Size; @@ -108,15 +109,9 @@ where let wasm_path = state_path.join(WASM_DIR); // Ensure all the needed directories exist on disk. - for path in [&state_path, &cache_path, &wasm_path].iter() { - create_dir_all(path).map_err(|e| { - VmError::cache_err(format!( - "Error creating directory {}: {}", - path.display(), - e - )) - })?; - } + mkdir_p(&state_path).map_err(|_e| VmError::cache_err("Error creating state directory"))?; + mkdir_p(&cache_path).map_err(|_e| VmError::cache_err("Error creating cache directory"))?; + mkdir_p(&wasm_path).map_err(|_e| VmError::cache_err("Error creating wasm directory"))?; let fs_cache = FileSystemCache::new(cache_path.join(MODULES_DIR)) .map_err(|e| VmError::cache_err(format!("Error file system cache: {}", e)))?; @@ -373,7 +368,7 @@ mod tests { use crate::errors::VmError; use crate::testing::{mock_backend, mock_env, mock_info, MockApi, MockQuerier, MockStorage}; use cosmwasm_std::{coins, Empty}; - use std::fs::OpenOptions; + use std::fs::{create_dir_all, OpenOptions}; use std::io::Write; use tempfile::TempDir; diff --git a/packages/vm/src/filesystem.rs b/packages/vm/src/filesystem.rs new file mode 100644 index 0000000000..45a60f435f --- /dev/null +++ b/packages/vm/src/filesystem.rs @@ -0,0 +1,43 @@ +use std::{fs::create_dir_all, path::Path}; + +#[derive(Debug)] +pub struct MkdirPFailure; + +/// An implementation for `mkdir -p`. +/// +/// This is a thin wrapper around fs::create_dir_all that +/// hides all OS specific error messages to ensure they don't end up +/// breaking consensus. +pub fn mkdir_p(path: &Path) -> Result<(), MkdirPFailure> { + create_dir_all(path).map_err(|_e| MkdirPFailure) +} + +#[cfg(test)] +mod tests { + use tempfile::TempDir; + + use super::*; + + #[test] + fn mkdir_p_works() { + let tmp_root = TempDir::new().unwrap(); + + // Can create + let path = tmp_root.path().join("something"); + assert!(!path.is_dir()); + mkdir_p(&path).unwrap(); + assert!(path.is_dir()); + + // Can be called on existing dir + let path = tmp_root.path().join("something else"); + assert!(!path.is_dir()); + mkdir_p(&path).unwrap(); + assert!(path.is_dir()); + mkdir_p(&path).unwrap(); // no-op + assert!(path.is_dir()); + + // Fails for dir with null + let path = tmp_root.path().join("something\0with NULL"); + mkdir_p(&path).unwrap_err(); + } +} diff --git a/packages/vm/src/lib.rs b/packages/vm/src/lib.rs index 37713763fa..986275853b 100644 --- a/packages/vm/src/lib.rs +++ b/packages/vm/src/lib.rs @@ -9,6 +9,7 @@ mod compatibility; mod conversion; mod environment; mod errors; +mod filesystem; mod imports; mod instance; mod limited; diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 0488ca7635..406a0ebcc3 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -1,12 +1,13 @@ -use std::fs; use std::io; use std::path::PathBuf; +use thiserror::Error; use wasmer::{DeserializeError, Module, Store}; use crate::checksum::Checksum; use crate::errors::{VmError, VmResult}; +use crate::filesystem::mkdir_p; use crate::modules::current_wasmer_module_version; /// Bump this version whenever the module system changes in a way @@ -47,6 +48,20 @@ pub struct FileSystemCache { wasmer_module_version: u32, } +/// An error type that hides system specific error information +/// to ensure deterministic errors across operating systems. +#[derive(Error, Debug)] +pub enum NewFileSystemCacheError { + #[error("Could not get metadata of cache path")] + CouldntGetMetadata, + #[error("The supplied path is readonly")] + ReadonlyPath, + #[error("The supplied path already exists but is no directory")] + ExistsButNoDirectory, + #[error("Could not create cache path")] + CouldntCreatePath, +} + impl FileSystemCache { /// Construct a new `FileSystemCache` around the specified directory. /// The contents of the cache are stored in sub-versioned directories. @@ -55,12 +70,14 @@ impl FileSystemCache { /// /// This method is unsafe because there's no way to ensure the artifacts /// stored in this cache haven't been corrupted or tampered with. - pub unsafe fn new(path: impl Into) -> io::Result { + pub unsafe fn new(path: impl Into) -> Result { let wasmer_module_version = current_wasmer_module_version(); let path: PathBuf = path.into(); if path.exists() { - let metadata = path.metadata()?; + let metadata = path + .metadata() + .map_err(|_e| NewFileSystemCacheError::CouldntGetMetadata)?; if metadata.is_dir() { if !metadata.permissions().readonly() { Ok(Self { @@ -68,25 +85,14 @@ impl FileSystemCache { wasmer_module_version, }) } else { - // This directory is readonly. - Err(io::Error::new( - io::ErrorKind::PermissionDenied, - format!("the supplied path is readonly: {}", path.display()), - )) + Err(NewFileSystemCacheError::ReadonlyPath) } } else { - // This path points to a file. - Err(io::Error::new( - io::ErrorKind::PermissionDenied, - format!( - "the supplied path already points to a file: {}", - path.display() - ), - )) + Err(NewFileSystemCacheError::ExistsButNoDirectory) } } else { // Create the directory and any parent directories if they don't yet exist. - fs::create_dir_all(&path)?; + mkdir_p(&path).map_err(|_e| NewFileSystemCacheError::CouldntCreatePath)?; Ok(Self { base_path: path, wasmer_module_version, @@ -120,8 +126,9 @@ impl FileSystemCache { /// Stores a serialized module to the file system. Returns the size of the serialized module. pub fn store(&mut self, checksum: &Checksum, module: &Module) -> VmResult<()> { let modules_dir = self.latest_modules_path(); - fs::create_dir_all(&modules_dir) - .map_err(|e| VmError::cache_err(format!("Error creating directory: {}", e)))?; + mkdir_p(&modules_dir) + .map_err(|_e| VmError::cache_err("Error creating modules directory"))?; + let filename = checksum.to_hex(); let path = modules_dir.join(filename); module @@ -142,6 +149,8 @@ impl FileSystemCache { #[cfg(test)] mod tests { + use std::fs; + use super::*; use crate::size::Size; use crate::wasm_backend::{compile, make_runtime_store}; diff --git a/packages/vm/src/modules/mod.rs b/packages/vm/src/modules/mod.rs index c00ebae121..daa0adef11 100644 --- a/packages/vm/src/modules/mod.rs +++ b/packages/vm/src/modules/mod.rs @@ -4,7 +4,7 @@ mod pinned_memory_cache; mod sized_module; mod versioning; -pub use file_system_cache::FileSystemCache; +pub use file_system_cache::{FileSystemCache, NewFileSystemCacheError}; pub use in_memory_cache::InMemoryCache; pub use pinned_memory_cache::PinnedMemoryCache; pub use versioning::current_wasmer_module_version; From 530c979eb0447a8dbfa0254a3710bd41f85f321b Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 30 Aug 2022 16:55:06 +0200 Subject: [PATCH 0004/2372] Remove system specific detail from error message --- packages/vm/src/cache.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 16e9bfea72..b08b9c7c97 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -351,12 +351,12 @@ fn save_wasm_to_disk(dir: impl Into, wasm: &[u8]) -> VmResult fn load_wasm_from_disk(dir: impl Into, checksum: &Checksum) -> VmResult> { // this requires the directory and file to exist let path = dir.into().join(checksum.to_hex()); - let mut file = File::open(path) - .map_err(|e| VmError::cache_err(format!("Error opening Wasm file for reading: {}", e)))?; + let mut file = + File::open(path).map_err(|_e| VmError::cache_err("Error opening Wasm file for reading"))?; let mut wasm = Vec::::new(); file.read_to_end(&mut wasm) - .map_err(|e| VmError::cache_err(format!("Error reading Wasm file: {}", e)))?; + .map_err(|_e| VmError::cache_err("Error reading Wasm file"))?; Ok(wasm) } @@ -518,8 +518,7 @@ mod tests { match cache.load_wasm(&checksum).unwrap_err() { VmError::CacheErr { msg, .. } => { - assert!(msg - .starts_with("Error opening Wasm file for reading: No such file or directory")) + assert_eq!(msg, "Error opening Wasm file for reading") } e => panic!("Unexpected error: {:?}", e), } From b4316bfa8d36898366bd7ac742a222ca5481e0d8 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 21 Nov 2022 17:23:19 +0100 Subject: [PATCH 0005/2372] Add CHANGELOG entry --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fffd4fe228..4c6ad45371 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,15 @@ and this project adheres to ## [Unreleased] +### Changed + +- cosmwasm-vm: Avoid exposing OS specific file system errors in order to test + cosmwasm-vm on Windows. This gives us confidence for integrating cosmwasm-vm + in a libwasmvm build on Windows. This change is likely to be consensus + breaking as error messages change. ([#1406]) + +[#1406]: https://github.com/CosmWasm/cosmwasm/pull/1406 + ## [1.1.6] - 2022-11-16 ### Added From 3c26a3d77c4f5e717f9cb33f191af3f1a2031f1a Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 8 Nov 2022 16:10:14 +0100 Subject: [PATCH 0006/2372] Add `cosmwasm_1_2 feature` --- packages/std/Cargo.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 0c792c491e..ee6d84597a 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -36,6 +36,9 @@ ibc3 = ["stargate"] # This feature makes `BankQuery::Supply` available for the contract to call, but requires # the host blockchain to run CosmWasm `1.1.0` or higher. cosmwasm_1_1 = [] +# This feature makes `GovMsg::VoteWeighted` available for the contract to call, but requires +# the host blockchain to run CosmWasm `1.2.0` or higher. +cosmwasm_1_2 = [] [dependencies] base64 = "0.13.0" From 869072e6e8f8fdd277c7d5708d68ed626457da37 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 8 Nov 2022 16:41:27 +0100 Subject: [PATCH 0007/2372] Add `GovMsg::VoteWeighted` --- packages/std/src/lib.rs | 2 ++ packages/std/src/results/cosmos_msg.rs | 15 +++++++++++++++ packages/std/src/results/mod.rs | 2 ++ 3 files changed, 19 insertions(+) diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 1f37bed1d6..26445f4b55 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -63,6 +63,8 @@ pub use crate::query::{ pub use crate::query::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; #[allow(deprecated)] pub use crate::results::SubMsgExecutionResponse; +#[cfg(all(feature = "stargate", feature = "cosmwasm_1_2"))] +pub use crate::results::WeightedVoteOption; pub use crate::results::{ attr, wasm_execute, wasm_instantiate, Attribute, BankMsg, ContractResult, CosmosMsg, CustomMsg, Empty, Event, QueryResponse, Reply, ReplyOn, Response, SubMsg, SubMsgResponse, SubMsgResult, diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index d72f98ddda..2761ac280b 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -9,6 +9,8 @@ use crate::errors::StdResult; #[cfg(feature = "stargate")] use crate::ibc::IbcMsg; use crate::serde::to_binary; +#[cfg(all(feature = "stargate", feature = "cosmwasm_1_2"))] +use crate::Decimal; use super::Empty; @@ -183,6 +185,12 @@ pub enum WasmMsg { pub enum GovMsg { /// This maps directly to [MsgVote](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/gov/v1beta1/tx.proto#L46-L56) in the Cosmos SDK with voter set to the contract address. Vote { proposal_id: u64, vote: VoteOption }, + /// This maps directly to [MsgVoteWeighted](https://github.com/cosmos/cosmos-sdk/blob/v0.45.8/proto/cosmos/gov/v1beta1/tx.proto#L66-L78) in the Cosmos SDK with voter set to the contract address. + #[cfg(feature = "cosmwasm_1_2")] + VoteWeighted { + proposal_id: u64, + vote: WeightedVoteOption, + }, } #[cfg(feature = "stargate")] @@ -195,6 +203,13 @@ pub enum VoteOption { NoWithVeto, } +#[cfg(all(feature = "stargate", feature = "cosmwasm_1_2"))] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +pub struct WeightedVoteOption { + option: VoteOption, + weight: Decimal, +} + /// Shortcut helper as the construction of WasmMsg::Instantiate can be quite verbose in contract code. /// /// When using this, `admin` is always unset. If you need more flexibility, create the message directly. diff --git a/packages/std/src/results/mod.rs b/packages/std/src/results/mod.rs index 95dd1dd8ef..90b8879746 100644 --- a/packages/std/src/results/mod.rs +++ b/packages/std/src/results/mod.rs @@ -10,6 +10,8 @@ mod submessages; mod system_result; pub use contract_result::ContractResult; +#[cfg(all(feature = "stargate", feature = "cosmwasm_1_2"))] +pub use cosmos_msg::WeightedVoteOption; pub use cosmos_msg::{wasm_execute, wasm_instantiate, BankMsg, CosmosMsg, CustomMsg, WasmMsg}; #[cfg(feature = "staking")] pub use cosmos_msg::{DistributionMsg, StakingMsg}; From 9a46fe97576cb38a6ba77103f2afb861eef2858b Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 8 Nov 2022 16:47:43 +0100 Subject: [PATCH 0008/2372] Update CHANGELOG --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c6ad45371..e106965a72 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,8 +25,13 @@ and this project adheres to `CanonicalAddr` ([#1463]). - cosmwasm-std: Implement `PartialEq` between `CanonicalAddr` and `HexBinary`/`Binary` ([#1463]). +- cosmwasm-std: Add `GovMsg::VoteWeighted`. In order to use this in a contract, + the `cosmwasm_1_2` feature needs to be enabled for the `cosmwasm_std` + dependency. This makes the contract incompatible with chains running versions + of CosmWasm earlier than 1.2.0 ([#1481]). [#1463]: https://github.com/CosmWasm/cosmwasm/pull/1463 +[#1481]: https://github.com/CosmWasm/cosmwasm/pull/1481 ### Changed From e59234e6b27aef17441bfe849293ecb4924a04ef Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 21 Nov 2022 18:01:33 +0100 Subject: [PATCH 0009/2372] update CHANGELOG --- CHANGELOG.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e106965a72..47cc8557eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,15 @@ and this project adheres to ## [Unreleased] +### Added + +- cosmwasm-std: Add `GovMsg::VoteWeighted`. In order to use this in a contract, + the `cosmwasm_1_2` feature needs to be enabled for the `cosmwasm_std` + dependency. This makes the contract incompatible with chains running versions + of CosmWasm earlier than 1.2.0 ([#1481]). + +[#1481]: https://github.com/CosmWasm/cosmwasm/pull/1481 + ### Changed - cosmwasm-vm: Avoid exposing OS specific file system errors in order to test @@ -25,13 +34,8 @@ and this project adheres to `CanonicalAddr` ([#1463]). - cosmwasm-std: Implement `PartialEq` between `CanonicalAddr` and `HexBinary`/`Binary` ([#1463]). -- cosmwasm-std: Add `GovMsg::VoteWeighted`. In order to use this in a contract, - the `cosmwasm_1_2` feature needs to be enabled for the `cosmwasm_std` - dependency. This makes the contract incompatible with chains running versions - of CosmWasm earlier than 1.2.0 ([#1481]). [#1463]: https://github.com/CosmWasm/cosmwasm/pull/1463 -[#1481]: https://github.com/CosmWasm/cosmwasm/pull/1481 ### Changed From 7e117a38fc3bc7084fb7162945b2666d342354b0 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 21 Nov 2022 18:58:56 +0100 Subject: [PATCH 0010/2372] Add the `cosmwasm_1_2` export --- packages/std/src/exports.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/std/src/exports.rs b/packages/std/src/exports.rs index a2c986806f..5b4b30925c 100644 --- a/packages/std/src/exports.rs +++ b/packages/std/src/exports.rs @@ -45,6 +45,10 @@ extern "C" fn requires_stargate() -> () {} #[no_mangle] extern "C" fn requires_cosmwasm_1_1() -> () {} +#[cfg(feature = "cosmwasm_1_2")] +#[no_mangle] +extern "C" fn requires_cosmwasm_1_2() -> () {} + /// interface_version_* exports mark which Wasm VM interface level this contract is compiled for. /// They can be checked by cosmwasm_vm. /// Update this whenever the Wasm VM interface breaks. From 2a5951cf88892bc405662dee396781d9eeaf1179 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 7 Nov 2022 20:57:05 +0100 Subject: [PATCH 0011/2372] schema: Add option to generate separate JSON schema files --- packages/schema-derive/src/generate_api.rs | 37 +++++++++++++++---- packages/schema/src/idl.rs | 42 ++++++++++++++++++++++ 2 files changed, 72 insertions(+), 7 deletions(-) diff --git a/packages/schema-derive/src/generate_api.rs b/packages/schema-derive/src/generate_api.rs index f3f8bbcaa8..33064df1de 100644 --- a/packages/schema-derive/src/generate_api.rs +++ b/packages/schema-derive/src/generate_api.rs @@ -15,23 +15,46 @@ pub fn write_api_impl(input: Options) -> Block { { #[cfg(target_arch = "wasm32")] compile_error!("can't compile schema generator for the `wasm32` arch\nhint: are you trying to compile a smart contract without specifying `--lib`?"); - use ::std::env::current_dir; + use ::std::env; use ::std::fs::{create_dir_all, write}; use ::cosmwasm_schema::{remove_schemas, Api, QueryResponses}; - let mut out_dir = current_dir().unwrap(); + if env::args().find(|arg| arg == "--help").is_some() { + println!("USAGE:"); + println!(" cargo schema [OPTIONS]"); + println!(); + println!("FLAGS:"); + println!(" --basic"); + println!(" Generate pure JSON schema files rather than the \"unified\" format."); + println!(" --help"); + println!(" Print this helpfile."); + return; + } + + let basic = env::args().find(|arg| arg == "--basic").is_some(); + + let mut out_dir = env::current_dir().unwrap(); out_dir.push("schema"); create_dir_all(&out_dir).unwrap(); remove_schemas(&out_dir).unwrap(); - let path = out_dir.join(concat!(#name, ".json")); - let api = #api_object.render(); - let json = api.to_string().unwrap(); - write(&path, json + "\n").unwrap(); - println!("Exported the full API as {}", path.to_str().unwrap()); + if basic { + for (filename, json) in api.to_schema_files().unwrap() { + let path = out_dir.join(filename); + + write(&path, json + "\n").unwrap(); + println!("Exported {}", path.to_str().unwrap()); + } + } else { + let path = out_dir.join(concat!(#name, ".json")); + + let json = api.to_string().unwrap(); + write(&path, json + "\n").unwrap(); + println!("Exported the full API as {}", path.to_str().unwrap()); + } } } } diff --git a/packages/schema/src/idl.rs b/packages/schema/src/idl.rs index 8297d6f191..ec2c5478aa 100644 --- a/packages/schema/src/idl.rs +++ b/packages/schema/src/idl.rs @@ -85,6 +85,48 @@ impl JsonApi { serde_json::to_string_pretty(&self).map_err(Into::into) } + pub fn to_schema_files(&self) -> Result, EncodeError> { + let mut result = vec![( + "instantiate.json".to_string(), + serde_json::to_string_pretty(&self.instantiate)?, + )]; + + if let Some(execute) = &self.execute { + result.push(( + "execute.json".to_string(), + serde_json::to_string_pretty(&execute)?, + )); + } + if let Some(query) = &self.execute { + result.push(( + "query.json".to_string(), + serde_json::to_string_pretty(&query)?, + )); + } + if let Some(migrate) = &self.execute { + result.push(( + "migrate.json".to_string(), + serde_json::to_string_pretty(&migrate)?, + )); + } + if let Some(sudo) = &self.execute { + result.push(( + "sudo.json".to_string(), + serde_json::to_string_pretty(&sudo)?, + )); + } + if let Some(responses) = &self.responses { + for (name, response) in responses { + result.push(( + format!("response_to_{}.json", name), + serde_json::to_string_pretty(&response)?, + )); + } + } + + Ok(result) + } + pub fn to_writer(&self, writer: impl std::io::Write) -> Result<(), EncodeError> { serde_json::to_writer_pretty(writer, self).map_err(Into::into) } From c15d57dc2d6a92b8edb1aa792035e4ecd40f862f Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 8 Nov 2022 12:12:28 +0100 Subject: [PATCH 0012/2372] CHANGELOG update --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 47cc8557eb..7b1f062f2f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,9 @@ and this project adheres to `CanonicalAddr` ([#1463]). - cosmwasm-std: Implement `PartialEq` between `CanonicalAddr` and `HexBinary`/`Binary` ([#1463]). +- cosmwasm-schema: In contracts, `cosmwasm schema` now accepts the `--basic` + flag. This will output a separate JSON Schema file for each entrypoint, + similar to the old way. No unified file is produced this way. [#1463]: https://github.com/CosmWasm/cosmwasm/pull/1463 From afc2a7e184120027da420ae65e3efd6e4b520fd8 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 22 Nov 2022 00:32:34 +0100 Subject: [PATCH 0013/2372] make schema gen export raw schemas by default --- CHANGELOG.md | 5 +- contracts/burner/schema/raw/instantiate.json | 7 + .../crypto-verify/schema/raw/instantiate.json | 6 + ...response_to_list_verification_schemes.json | 17 + .../response_to_verify_cosmos_signature.json | 14 + .../raw/response_to_verify_ethereum_text.json | 14 + ...sponse_to_verify_ethereum_transaction.json | 14 + .../response_to_verify_tendermint_batch.json | 14 + ...sponse_to_verify_tendermint_signature.json | 14 + contracts/cyberpunk/schema/raw/execute.json | 52 ++ .../cyberpunk/schema/raw/instantiate.json | 6 + contracts/cyberpunk/schema/raw/migrate.json | 52 ++ contracts/cyberpunk/schema/raw/query.json | 52 ++ .../schema/raw/response_to_mirror_env.json | 98 ++ contracts/cyberpunk/schema/raw/sudo.json | 52 ++ contracts/floaty/schema/raw/execute.json | 20 + contracts/floaty/schema/raw/instantiate.json | 18 + contracts/floaty/schema/raw/migrate.json | 20 + contracts/floaty/schema/raw/query.json | 20 + .../schema/raw/response_to_other_balance.json | 38 + .../schema/raw/response_to_verifier.json | 14 + contracts/floaty/schema/raw/sudo.json | 20 + contracts/hackatom/schema/raw/execute.json | 128 +++ .../hackatom/schema/raw/instantiate.json | 18 + contracts/hackatom/schema/raw/migrate.json | 128 +++ contracts/hackatom/schema/raw/query.json | 128 +++ .../schema/raw/response_to_get_int.json | 16 + .../schema/raw/response_to_other_balance.json | 38 + .../schema/raw/response_to_recurse.json | 25 + .../schema/raw/response_to_verifier.json | 14 + contracts/hackatom/schema/raw/sudo.json | 128 +++ .../ibc-reflect-send/schema/raw/execute.json | 817 +++++++++++++++++ .../schema/raw/instantiate.json | 7 + .../ibc-reflect-send/schema/raw/migrate.json | 817 +++++++++++++++++ .../ibc-reflect-send/schema/raw/query.json | 817 +++++++++++++++++ .../schema/raw/response_to_account.json | 70 ++ .../schema/raw/response_to_admin.json | 14 + .../schema/raw/response_to_list_accounts.json | 85 ++ .../ibc-reflect-send/schema/raw/sudo.json | 817 +++++++++++++++++ .../ibc-reflect/schema/raw/instantiate.json | 17 + .../schema/raw/response_to_account.json | 14 + .../schema/raw/response_to_list_accounts.json | 35 + contracts/queue/schema/raw/execute.json | 41 + contracts/queue/schema/raw/instantiate.json | 6 + contracts/queue/schema/raw/migrate.json | 41 + contracts/queue/schema/raw/query.json | 41 + .../queue/schema/raw/response_to_count.json | 16 + .../queue/schema/raw/response_to_list.json | 40 + .../raw/response_to_open_iterators.json | 6 + .../queue/schema/raw/response_to_reducer.json | 29 + .../queue/schema/raw/response_to_sum.json | 15 + contracts/queue/schema/raw/sudo.json | 41 + contracts/reflect/schema/raw/execute.json | 854 ++++++++++++++++++ contracts/reflect/schema/raw/instantiate.json | 6 + contracts/reflect/schema/raw/migrate.json | 854 ++++++++++++++++++ contracts/reflect/schema/raw/query.json | 854 ++++++++++++++++++ .../schema/raw/response_to_capitalized.json | 14 + .../reflect/schema/raw/response_to_chain.json | 20 + .../reflect/schema/raw/response_to_owner.json | 14 + .../reflect/schema/raw/response_to_raw.json | 25 + .../raw/response_to_sub_msg_result.json | 119 +++ contracts/reflect/schema/raw/sudo.json | 854 ++++++++++++++++++ contracts/staking/schema/raw/execute.json | 116 +++ contracts/staking/schema/raw/instantiate.json | 60 ++ contracts/staking/schema/raw/migrate.json | 116 +++ contracts/staking/schema/raw/query.json | 116 +++ .../schema/raw/response_to_balance.json | 20 + .../schema/raw/response_to_claims.json | 20 + .../schema/raw/response_to_investment.json | 75 ++ .../schema/raw/response_to_token_info.json | 28 + contracts/staking/schema/raw/sudo.json | 116 +++ packages/schema-derive/src/generate_api.rs | 36 +- 72 files changed, 9266 insertions(+), 27 deletions(-) create mode 100644 contracts/burner/schema/raw/instantiate.json create mode 100644 contracts/crypto-verify/schema/raw/instantiate.json create mode 100644 contracts/crypto-verify/schema/raw/response_to_list_verification_schemes.json create mode 100644 contracts/crypto-verify/schema/raw/response_to_verify_cosmos_signature.json create mode 100644 contracts/crypto-verify/schema/raw/response_to_verify_ethereum_text.json create mode 100644 contracts/crypto-verify/schema/raw/response_to_verify_ethereum_transaction.json create mode 100644 contracts/crypto-verify/schema/raw/response_to_verify_tendermint_batch.json create mode 100644 contracts/crypto-verify/schema/raw/response_to_verify_tendermint_signature.json create mode 100644 contracts/cyberpunk/schema/raw/execute.json create mode 100644 contracts/cyberpunk/schema/raw/instantiate.json create mode 100644 contracts/cyberpunk/schema/raw/migrate.json create mode 100644 contracts/cyberpunk/schema/raw/query.json create mode 100644 contracts/cyberpunk/schema/raw/response_to_mirror_env.json create mode 100644 contracts/cyberpunk/schema/raw/sudo.json create mode 100644 contracts/floaty/schema/raw/execute.json create mode 100644 contracts/floaty/schema/raw/instantiate.json create mode 100644 contracts/floaty/schema/raw/migrate.json create mode 100644 contracts/floaty/schema/raw/query.json create mode 100644 contracts/floaty/schema/raw/response_to_other_balance.json create mode 100644 contracts/floaty/schema/raw/response_to_verifier.json create mode 100644 contracts/floaty/schema/raw/sudo.json create mode 100644 contracts/hackatom/schema/raw/execute.json create mode 100644 contracts/hackatom/schema/raw/instantiate.json create mode 100644 contracts/hackatom/schema/raw/migrate.json create mode 100644 contracts/hackatom/schema/raw/query.json create mode 100644 contracts/hackatom/schema/raw/response_to_get_int.json create mode 100644 contracts/hackatom/schema/raw/response_to_other_balance.json create mode 100644 contracts/hackatom/schema/raw/response_to_recurse.json create mode 100644 contracts/hackatom/schema/raw/response_to_verifier.json create mode 100644 contracts/hackatom/schema/raw/sudo.json create mode 100644 contracts/ibc-reflect-send/schema/raw/execute.json create mode 100644 contracts/ibc-reflect-send/schema/raw/instantiate.json create mode 100644 contracts/ibc-reflect-send/schema/raw/migrate.json create mode 100644 contracts/ibc-reflect-send/schema/raw/query.json create mode 100644 contracts/ibc-reflect-send/schema/raw/response_to_account.json create mode 100644 contracts/ibc-reflect-send/schema/raw/response_to_admin.json create mode 100644 contracts/ibc-reflect-send/schema/raw/response_to_list_accounts.json create mode 100644 contracts/ibc-reflect-send/schema/raw/sudo.json create mode 100644 contracts/ibc-reflect/schema/raw/instantiate.json create mode 100644 contracts/ibc-reflect/schema/raw/response_to_account.json create mode 100644 contracts/ibc-reflect/schema/raw/response_to_list_accounts.json create mode 100644 contracts/queue/schema/raw/execute.json create mode 100644 contracts/queue/schema/raw/instantiate.json create mode 100644 contracts/queue/schema/raw/migrate.json create mode 100644 contracts/queue/schema/raw/query.json create mode 100644 contracts/queue/schema/raw/response_to_count.json create mode 100644 contracts/queue/schema/raw/response_to_list.json create mode 100644 contracts/queue/schema/raw/response_to_open_iterators.json create mode 100644 contracts/queue/schema/raw/response_to_reducer.json create mode 100644 contracts/queue/schema/raw/response_to_sum.json create mode 100644 contracts/queue/schema/raw/sudo.json create mode 100644 contracts/reflect/schema/raw/execute.json create mode 100644 contracts/reflect/schema/raw/instantiate.json create mode 100644 contracts/reflect/schema/raw/migrate.json create mode 100644 contracts/reflect/schema/raw/query.json create mode 100644 contracts/reflect/schema/raw/response_to_capitalized.json create mode 100644 contracts/reflect/schema/raw/response_to_chain.json create mode 100644 contracts/reflect/schema/raw/response_to_owner.json create mode 100644 contracts/reflect/schema/raw/response_to_raw.json create mode 100644 contracts/reflect/schema/raw/response_to_sub_msg_result.json create mode 100644 contracts/reflect/schema/raw/sudo.json create mode 100644 contracts/staking/schema/raw/execute.json create mode 100644 contracts/staking/schema/raw/instantiate.json create mode 100644 contracts/staking/schema/raw/migrate.json create mode 100644 contracts/staking/schema/raw/query.json create mode 100644 contracts/staking/schema/raw/response_to_balance.json create mode 100644 contracts/staking/schema/raw/response_to_claims.json create mode 100644 contracts/staking/schema/raw/response_to_investment.json create mode 100644 contracts/staking/schema/raw/response_to_token_info.json create mode 100644 contracts/staking/schema/raw/sudo.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b1f062f2f..1c28ed4589 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ and this project adheres to the `cosmwasm_1_2` feature needs to be enabled for the `cosmwasm_std` dependency. This makes the contract incompatible with chains running versions of CosmWasm earlier than 1.2.0 ([#1481]). +- cosmwasm-schema: In contracts, `cosmwasm schema` will now output a separate + JSON Schema file for each entrypoint in the `raw` subdirectory. [#1481]: https://github.com/CosmWasm/cosmwasm/pull/1481 @@ -34,9 +36,6 @@ and this project adheres to `CanonicalAddr` ([#1463]). - cosmwasm-std: Implement `PartialEq` between `CanonicalAddr` and `HexBinary`/`Binary` ([#1463]). -- cosmwasm-schema: In contracts, `cosmwasm schema` now accepts the `--basic` - flag. This will output a separate JSON Schema file for each entrypoint, - similar to the old way. No unified file is produced this way. [#1463]: https://github.com/CosmWasm/cosmwasm/pull/1463 diff --git a/contracts/burner/schema/raw/instantiate.json b/contracts/burner/schema/raw/instantiate.json new file mode 100644 index 0000000000..b055cda393 --- /dev/null +++ b/contracts/burner/schema/raw/instantiate.json @@ -0,0 +1,7 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "InstantiateMsg", + "description": "A placeholder where we don't take any input", + "type": "object", + "additionalProperties": false +} diff --git a/contracts/crypto-verify/schema/raw/instantiate.json b/contracts/crypto-verify/schema/raw/instantiate.json new file mode 100644 index 0000000000..1352613d57 --- /dev/null +++ b/contracts/crypto-verify/schema/raw/instantiate.json @@ -0,0 +1,6 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "InstantiateMsg", + "type": "object", + "additionalProperties": false +} diff --git a/contracts/crypto-verify/schema/raw/response_to_list_verification_schemes.json b/contracts/crypto-verify/schema/raw/response_to_list_verification_schemes.json new file mode 100644 index 0000000000..26fa42ab41 --- /dev/null +++ b/contracts/crypto-verify/schema/raw/response_to_list_verification_schemes.json @@ -0,0 +1,17 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ListVerificationsResponse", + "type": "object", + "required": [ + "verification_schemes" + ], + "properties": { + "verification_schemes": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false +} diff --git a/contracts/crypto-verify/schema/raw/response_to_verify_cosmos_signature.json b/contracts/crypto-verify/schema/raw/response_to_verify_cosmos_signature.json new file mode 100644 index 0000000000..a2cdc3461c --- /dev/null +++ b/contracts/crypto-verify/schema/raw/response_to_verify_cosmos_signature.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "VerifyResponse", + "type": "object", + "required": [ + "verifies" + ], + "properties": { + "verifies": { + "type": "boolean" + } + }, + "additionalProperties": false +} diff --git a/contracts/crypto-verify/schema/raw/response_to_verify_ethereum_text.json b/contracts/crypto-verify/schema/raw/response_to_verify_ethereum_text.json new file mode 100644 index 0000000000..a2cdc3461c --- /dev/null +++ b/contracts/crypto-verify/schema/raw/response_to_verify_ethereum_text.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "VerifyResponse", + "type": "object", + "required": [ + "verifies" + ], + "properties": { + "verifies": { + "type": "boolean" + } + }, + "additionalProperties": false +} diff --git a/contracts/crypto-verify/schema/raw/response_to_verify_ethereum_transaction.json b/contracts/crypto-verify/schema/raw/response_to_verify_ethereum_transaction.json new file mode 100644 index 0000000000..a2cdc3461c --- /dev/null +++ b/contracts/crypto-verify/schema/raw/response_to_verify_ethereum_transaction.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "VerifyResponse", + "type": "object", + "required": [ + "verifies" + ], + "properties": { + "verifies": { + "type": "boolean" + } + }, + "additionalProperties": false +} diff --git a/contracts/crypto-verify/schema/raw/response_to_verify_tendermint_batch.json b/contracts/crypto-verify/schema/raw/response_to_verify_tendermint_batch.json new file mode 100644 index 0000000000..a2cdc3461c --- /dev/null +++ b/contracts/crypto-verify/schema/raw/response_to_verify_tendermint_batch.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "VerifyResponse", + "type": "object", + "required": [ + "verifies" + ], + "properties": { + "verifies": { + "type": "boolean" + } + }, + "additionalProperties": false +} diff --git a/contracts/crypto-verify/schema/raw/response_to_verify_tendermint_signature.json b/contracts/crypto-verify/schema/raw/response_to_verify_tendermint_signature.json new file mode 100644 index 0000000000..a2cdc3461c --- /dev/null +++ b/contracts/crypto-verify/schema/raw/response_to_verify_tendermint_signature.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "VerifyResponse", + "type": "object", + "required": [ + "verifies" + ], + "properties": { + "verifies": { + "type": "boolean" + } + }, + "additionalProperties": false +} diff --git a/contracts/cyberpunk/schema/raw/execute.json b/contracts/cyberpunk/schema/raw/execute.json new file mode 100644 index 0000000000..8e7af5fe3c --- /dev/null +++ b/contracts/cyberpunk/schema/raw/execute.json @@ -0,0 +1,52 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Hashes some data. Uses CPU and memory, but no external calls.", + "type": "object", + "required": [ + "argon2" + ], + "properties": { + "argon2": { + "type": "object", + "required": [ + "mem_cost", + "time_cost" + ], + "properties": { + "mem_cost": { + "description": "The amount of memory requested (KB).", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "time_cost": { + "description": "The number of passes.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Returns the env for testing", + "type": "object", + "required": [ + "mirror_env" + ], + "properties": { + "mirror_env": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/contracts/cyberpunk/schema/raw/instantiate.json b/contracts/cyberpunk/schema/raw/instantiate.json new file mode 100644 index 0000000000..5f6dfaf43c --- /dev/null +++ b/contracts/cyberpunk/schema/raw/instantiate.json @@ -0,0 +1,6 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "InstantiateMsg", + "description": "An empty struct that serves as a placeholder in different places, such as contracts that don't set a custom message.\n\nIt is designed to be expressable in correct JSON and JSON Schema but contains no meaningful data. Previously we used enums without cases, but those cannot represented as valid JSON Schema (https://github.com/CosmWasm/cosmwasm/issues/451)", + "type": "object" +} diff --git a/contracts/cyberpunk/schema/raw/migrate.json b/contracts/cyberpunk/schema/raw/migrate.json new file mode 100644 index 0000000000..8e7af5fe3c --- /dev/null +++ b/contracts/cyberpunk/schema/raw/migrate.json @@ -0,0 +1,52 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Hashes some data. Uses CPU and memory, but no external calls.", + "type": "object", + "required": [ + "argon2" + ], + "properties": { + "argon2": { + "type": "object", + "required": [ + "mem_cost", + "time_cost" + ], + "properties": { + "mem_cost": { + "description": "The amount of memory requested (KB).", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "time_cost": { + "description": "The number of passes.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Returns the env for testing", + "type": "object", + "required": [ + "mirror_env" + ], + "properties": { + "mirror_env": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/contracts/cyberpunk/schema/raw/query.json b/contracts/cyberpunk/schema/raw/query.json new file mode 100644 index 0000000000..8e7af5fe3c --- /dev/null +++ b/contracts/cyberpunk/schema/raw/query.json @@ -0,0 +1,52 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Hashes some data. Uses CPU and memory, but no external calls.", + "type": "object", + "required": [ + "argon2" + ], + "properties": { + "argon2": { + "type": "object", + "required": [ + "mem_cost", + "time_cost" + ], + "properties": { + "mem_cost": { + "description": "The amount of memory requested (KB).", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "time_cost": { + "description": "The number of passes.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Returns the env for testing", + "type": "object", + "required": [ + "mirror_env" + ], + "properties": { + "mirror_env": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/contracts/cyberpunk/schema/raw/response_to_mirror_env.json b/contracts/cyberpunk/schema/raw/response_to_mirror_env.json new file mode 100644 index 0000000000..a14d618225 --- /dev/null +++ b/contracts/cyberpunk/schema/raw/response_to_mirror_env.json @@ -0,0 +1,98 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Env", + "type": "object", + "required": [ + "block", + "contract" + ], + "properties": { + "block": { + "$ref": "#/definitions/BlockInfo" + }, + "contract": { + "$ref": "#/definitions/ContractInfo" + }, + "transaction": { + "description": "Information on the transaction this message was executed in. The field is unset when the `MsgExecuteContract`/`MsgInstantiateContract`/`MsgMigrateContract` is not executed as part of a transaction.", + "anyOf": [ + { + "$ref": "#/definitions/TransactionInfo" + }, + { + "type": "null" + } + ] + } + }, + "definitions": { + "Addr": { + "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", + "type": "string" + }, + "BlockInfo": { + "type": "object", + "required": [ + "chain_id", + "height", + "time" + ], + "properties": { + "chain_id": { + "type": "string" + }, + "height": { + "description": "The height of a block is the number of blocks preceding it in the blockchain.", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "time": { + "description": "Absolute time of the block creation in seconds since the UNIX epoch (00:00:00 on 1970-01-01 UTC).\n\nThe source of this is the [BFT Time in Tendermint](https://github.com/tendermint/tendermint/blob/58dc1726/spec/consensus/bft-time.md), which has the same nanosecond precision as the `Timestamp` type.\n\n# Examples\n\nUsing chrono:\n\n``` # use cosmwasm_std::{Addr, BlockInfo, ContractInfo, Env, MessageInfo, Timestamp, TransactionInfo}; # let env = Env { # block: BlockInfo { # height: 12_345, # time: Timestamp::from_nanos(1_571_797_419_879_305_533), # chain_id: \"cosmos-testnet-14002\".to_string(), # }, # transaction: Some(TransactionInfo { index: 3 }), # contract: ContractInfo { # address: Addr::unchecked(\"contract\"), # }, # }; # extern crate chrono; use chrono::NaiveDateTime; let seconds = env.block.time.seconds(); let nsecs = env.block.time.subsec_nanos(); let dt = NaiveDateTime::from_timestamp(seconds as i64, nsecs as u32); ```\n\nCreating a simple millisecond-precision timestamp (as used in JavaScript):\n\n``` # use cosmwasm_std::{Addr, BlockInfo, ContractInfo, Env, MessageInfo, Timestamp, TransactionInfo}; # let env = Env { # block: BlockInfo { # height: 12_345, # time: Timestamp::from_nanos(1_571_797_419_879_305_533), # chain_id: \"cosmos-testnet-14002\".to_string(), # }, # transaction: Some(TransactionInfo { index: 3 }), # contract: ContractInfo { # address: Addr::unchecked(\"contract\"), # }, # }; let millis = env.block.time.nanos() / 1_000_000; ```", + "allOf": [ + { + "$ref": "#/definitions/Timestamp" + } + ] + } + } + }, + "ContractInfo": { + "type": "object", + "required": [ + "address" + ], + "properties": { + "address": { + "$ref": "#/definitions/Addr" + } + } + }, + "Timestamp": { + "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", + "allOf": [ + { + "$ref": "#/definitions/Uint64" + } + ] + }, + "TransactionInfo": { + "type": "object", + "required": [ + "index" + ], + "properties": { + "index": { + "description": "The position of this transaction in the block. The first transaction has index 0.\n\nThis allows you to get a unique transaction indentifier in this chain using the pair (`env.block.height`, `env.transaction.index`).", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + } + }, + "Uint64": { + "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", + "type": "string" + } + } +} diff --git a/contracts/cyberpunk/schema/raw/sudo.json b/contracts/cyberpunk/schema/raw/sudo.json new file mode 100644 index 0000000000..8e7af5fe3c --- /dev/null +++ b/contracts/cyberpunk/schema/raw/sudo.json @@ -0,0 +1,52 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Hashes some data. Uses CPU and memory, but no external calls.", + "type": "object", + "required": [ + "argon2" + ], + "properties": { + "argon2": { + "type": "object", + "required": [ + "mem_cost", + "time_cost" + ], + "properties": { + "mem_cost": { + "description": "The amount of memory requested (KB).", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "time_cost": { + "description": "The number of passes.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Returns the env for testing", + "type": "object", + "required": [ + "mirror_env" + ], + "properties": { + "mirror_env": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/contracts/floaty/schema/raw/execute.json b/contracts/floaty/schema/raw/execute.json new file mode 100644 index 0000000000..76967fd17b --- /dev/null +++ b/contracts/floaty/schema/raw/execute.json @@ -0,0 +1,20 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Releasing all funds in the contract to the beneficiary. This is the only \"proper\" action of this demo contract.", + "type": "object", + "required": [ + "release" + ], + "properties": { + "release": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/contracts/floaty/schema/raw/instantiate.json b/contracts/floaty/schema/raw/instantiate.json new file mode 100644 index 0000000000..8639103d34 --- /dev/null +++ b/contracts/floaty/schema/raw/instantiate.json @@ -0,0 +1,18 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "InstantiateMsg", + "type": "object", + "required": [ + "beneficiary", + "verifier" + ], + "properties": { + "beneficiary": { + "type": "string" + }, + "verifier": { + "type": "string" + } + }, + "additionalProperties": false +} diff --git a/contracts/floaty/schema/raw/migrate.json b/contracts/floaty/schema/raw/migrate.json new file mode 100644 index 0000000000..76967fd17b --- /dev/null +++ b/contracts/floaty/schema/raw/migrate.json @@ -0,0 +1,20 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Releasing all funds in the contract to the beneficiary. This is the only \"proper\" action of this demo contract.", + "type": "object", + "required": [ + "release" + ], + "properties": { + "release": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/contracts/floaty/schema/raw/query.json b/contracts/floaty/schema/raw/query.json new file mode 100644 index 0000000000..76967fd17b --- /dev/null +++ b/contracts/floaty/schema/raw/query.json @@ -0,0 +1,20 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Releasing all funds in the contract to the beneficiary. This is the only \"proper\" action of this demo contract.", + "type": "object", + "required": [ + "release" + ], + "properties": { + "release": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/contracts/floaty/schema/raw/response_to_other_balance.json b/contracts/floaty/schema/raw/response_to_other_balance.json new file mode 100644 index 0000000000..20f0a47f1c --- /dev/null +++ b/contracts/floaty/schema/raw/response_to_other_balance.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "AllBalanceResponse", + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "description": "Returns all non-zero coins held by this account.", + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + }, + "definitions": { + "Coin": { + "type": "object", + "required": [ + "amount", + "denom" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + } + } + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } +} diff --git a/contracts/floaty/schema/raw/response_to_verifier.json b/contracts/floaty/schema/raw/response_to_verifier.json new file mode 100644 index 0000000000..fb04c86d67 --- /dev/null +++ b/contracts/floaty/schema/raw/response_to_verifier.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "VerifierResponse", + "type": "object", + "required": [ + "verifier" + ], + "properties": { + "verifier": { + "type": "string" + } + }, + "additionalProperties": false +} diff --git a/contracts/floaty/schema/raw/sudo.json b/contracts/floaty/schema/raw/sudo.json new file mode 100644 index 0000000000..76967fd17b --- /dev/null +++ b/contracts/floaty/schema/raw/sudo.json @@ -0,0 +1,20 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Releasing all funds in the contract to the beneficiary. This is the only \"proper\" action of this demo contract.", + "type": "object", + "required": [ + "release" + ], + "properties": { + "release": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/contracts/hackatom/schema/raw/execute.json b/contracts/hackatom/schema/raw/execute.json new file mode 100644 index 0000000000..a82fdeef2d --- /dev/null +++ b/contracts/hackatom/schema/raw/execute.json @@ -0,0 +1,128 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Releasing all funds in the contract to the beneficiary. This is the only \"proper\" action of this demo contract.", + "type": "object", + "required": [ + "release" + ], + "properties": { + "release": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Infinite loop to burn cpu cycles (only run when metering is enabled)", + "type": "object", + "required": [ + "cpu_loop" + ], + "properties": { + "cpu_loop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Infinite loop making storage calls (to test when their limit hits)", + "type": "object", + "required": [ + "storage_loop" + ], + "properties": { + "storage_loop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Infinite loop reading and writing memory", + "type": "object", + "required": [ + "memory_loop" + ], + "properties": { + "memory_loop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Infinite loop sending message to itself", + "type": "object", + "required": [ + "message_loop" + ], + "properties": { + "message_loop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Allocate large amounts of memory without consuming much gas", + "type": "object", + "required": [ + "allocate_large_memory" + ], + "properties": { + "allocate_large_memory": { + "type": "object", + "required": [ + "pages" + ], + "properties": { + "pages": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Trigger a panic to ensure framework handles gracefully", + "type": "object", + "required": [ + "panic" + ], + "properties": { + "panic": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Starting with CosmWasm 0.10, some API calls return user errors back to the contract. This triggers such user errors, ensuring the transaction does not fail in the backend.", + "type": "object", + "required": [ + "user_errors_in_api_calls" + ], + "properties": { + "user_errors_in_api_calls": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/contracts/hackatom/schema/raw/instantiate.json b/contracts/hackatom/schema/raw/instantiate.json new file mode 100644 index 0000000000..8639103d34 --- /dev/null +++ b/contracts/hackatom/schema/raw/instantiate.json @@ -0,0 +1,18 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "InstantiateMsg", + "type": "object", + "required": [ + "beneficiary", + "verifier" + ], + "properties": { + "beneficiary": { + "type": "string" + }, + "verifier": { + "type": "string" + } + }, + "additionalProperties": false +} diff --git a/contracts/hackatom/schema/raw/migrate.json b/contracts/hackatom/schema/raw/migrate.json new file mode 100644 index 0000000000..a82fdeef2d --- /dev/null +++ b/contracts/hackatom/schema/raw/migrate.json @@ -0,0 +1,128 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Releasing all funds in the contract to the beneficiary. This is the only \"proper\" action of this demo contract.", + "type": "object", + "required": [ + "release" + ], + "properties": { + "release": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Infinite loop to burn cpu cycles (only run when metering is enabled)", + "type": "object", + "required": [ + "cpu_loop" + ], + "properties": { + "cpu_loop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Infinite loop making storage calls (to test when their limit hits)", + "type": "object", + "required": [ + "storage_loop" + ], + "properties": { + "storage_loop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Infinite loop reading and writing memory", + "type": "object", + "required": [ + "memory_loop" + ], + "properties": { + "memory_loop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Infinite loop sending message to itself", + "type": "object", + "required": [ + "message_loop" + ], + "properties": { + "message_loop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Allocate large amounts of memory without consuming much gas", + "type": "object", + "required": [ + "allocate_large_memory" + ], + "properties": { + "allocate_large_memory": { + "type": "object", + "required": [ + "pages" + ], + "properties": { + "pages": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Trigger a panic to ensure framework handles gracefully", + "type": "object", + "required": [ + "panic" + ], + "properties": { + "panic": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Starting with CosmWasm 0.10, some API calls return user errors back to the contract. This triggers such user errors, ensuring the transaction does not fail in the backend.", + "type": "object", + "required": [ + "user_errors_in_api_calls" + ], + "properties": { + "user_errors_in_api_calls": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/contracts/hackatom/schema/raw/query.json b/contracts/hackatom/schema/raw/query.json new file mode 100644 index 0000000000..a82fdeef2d --- /dev/null +++ b/contracts/hackatom/schema/raw/query.json @@ -0,0 +1,128 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Releasing all funds in the contract to the beneficiary. This is the only \"proper\" action of this demo contract.", + "type": "object", + "required": [ + "release" + ], + "properties": { + "release": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Infinite loop to burn cpu cycles (only run when metering is enabled)", + "type": "object", + "required": [ + "cpu_loop" + ], + "properties": { + "cpu_loop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Infinite loop making storage calls (to test when their limit hits)", + "type": "object", + "required": [ + "storage_loop" + ], + "properties": { + "storage_loop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Infinite loop reading and writing memory", + "type": "object", + "required": [ + "memory_loop" + ], + "properties": { + "memory_loop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Infinite loop sending message to itself", + "type": "object", + "required": [ + "message_loop" + ], + "properties": { + "message_loop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Allocate large amounts of memory without consuming much gas", + "type": "object", + "required": [ + "allocate_large_memory" + ], + "properties": { + "allocate_large_memory": { + "type": "object", + "required": [ + "pages" + ], + "properties": { + "pages": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Trigger a panic to ensure framework handles gracefully", + "type": "object", + "required": [ + "panic" + ], + "properties": { + "panic": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Starting with CosmWasm 0.10, some API calls return user errors back to the contract. This triggers such user errors, ensuring the transaction does not fail in the backend.", + "type": "object", + "required": [ + "user_errors_in_api_calls" + ], + "properties": { + "user_errors_in_api_calls": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/contracts/hackatom/schema/raw/response_to_get_int.json b/contracts/hackatom/schema/raw/response_to_get_int.json new file mode 100644 index 0000000000..018fd695e1 --- /dev/null +++ b/contracts/hackatom/schema/raw/response_to_get_int.json @@ -0,0 +1,16 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "IntResponse", + "type": "object", + "required": [ + "int" + ], + "properties": { + "int": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false +} diff --git a/contracts/hackatom/schema/raw/response_to_other_balance.json b/contracts/hackatom/schema/raw/response_to_other_balance.json new file mode 100644 index 0000000000..20f0a47f1c --- /dev/null +++ b/contracts/hackatom/schema/raw/response_to_other_balance.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "AllBalanceResponse", + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "description": "Returns all non-zero coins held by this account.", + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + }, + "definitions": { + "Coin": { + "type": "object", + "required": [ + "amount", + "denom" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + } + } + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } +} diff --git a/contracts/hackatom/schema/raw/response_to_recurse.json b/contracts/hackatom/schema/raw/response_to_recurse.json new file mode 100644 index 0000000000..3d50847ef9 --- /dev/null +++ b/contracts/hackatom/schema/raw/response_to_recurse.json @@ -0,0 +1,25 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "RecurseResponse", + "type": "object", + "required": [ + "hashed" + ], + "properties": { + "hashed": { + "description": "hashed is the result of running sha256 \"work+1\" times on the contract's human address", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + }, + "additionalProperties": false, + "definitions": { + "Binary": { + "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", + "type": "string" + } + } +} diff --git a/contracts/hackatom/schema/raw/response_to_verifier.json b/contracts/hackatom/schema/raw/response_to_verifier.json new file mode 100644 index 0000000000..fb04c86d67 --- /dev/null +++ b/contracts/hackatom/schema/raw/response_to_verifier.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "VerifierResponse", + "type": "object", + "required": [ + "verifier" + ], + "properties": { + "verifier": { + "type": "string" + } + }, + "additionalProperties": false +} diff --git a/contracts/hackatom/schema/raw/sudo.json b/contracts/hackatom/schema/raw/sudo.json new file mode 100644 index 0000000000..a82fdeef2d --- /dev/null +++ b/contracts/hackatom/schema/raw/sudo.json @@ -0,0 +1,128 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Releasing all funds in the contract to the beneficiary. This is the only \"proper\" action of this demo contract.", + "type": "object", + "required": [ + "release" + ], + "properties": { + "release": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Infinite loop to burn cpu cycles (only run when metering is enabled)", + "type": "object", + "required": [ + "cpu_loop" + ], + "properties": { + "cpu_loop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Infinite loop making storage calls (to test when their limit hits)", + "type": "object", + "required": [ + "storage_loop" + ], + "properties": { + "storage_loop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Infinite loop reading and writing memory", + "type": "object", + "required": [ + "memory_loop" + ], + "properties": { + "memory_loop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Infinite loop sending message to itself", + "type": "object", + "required": [ + "message_loop" + ], + "properties": { + "message_loop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Allocate large amounts of memory without consuming much gas", + "type": "object", + "required": [ + "allocate_large_memory" + ], + "properties": { + "allocate_large_memory": { + "type": "object", + "required": [ + "pages" + ], + "properties": { + "pages": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Trigger a panic to ensure framework handles gracefully", + "type": "object", + "required": [ + "panic" + ], + "properties": { + "panic": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Starting with CosmWasm 0.10, some API calls return user errors back to the contract. This triggers such user errors, ensuring the transaction does not fail in the backend.", + "type": "object", + "required": [ + "user_errors_in_api_calls" + ], + "properties": { + "user_errors_in_api_calls": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/contracts/ibc-reflect-send/schema/raw/execute.json b/contracts/ibc-reflect-send/schema/raw/execute.json new file mode 100644 index 0000000000..e08109d489 --- /dev/null +++ b/contracts/ibc-reflect-send/schema/raw/execute.json @@ -0,0 +1,817 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Changes the admin", + "type": "object", + "required": [ + "update_admin" + ], + "properties": { + "update_admin": { + "type": "object", + "required": [ + "admin" + ], + "properties": { + "admin": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "send_msgs" + ], + "properties": { + "send_msgs": { + "type": "object", + "required": [ + "channel_id", + "msgs" + ], + "properties": { + "channel_id": { + "type": "string" + }, + "msgs": { + "type": "array", + "items": { + "$ref": "#/definitions/CosmosMsg_for_Empty" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "check_remote_balance" + ], + "properties": { + "check_remote_balance": { + "type": "object", + "required": [ + "channel_id" + ], + "properties": { + "channel_id": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "If you sent funds to this contract, it will attempt to ibc transfer them to the account on the remote side of this channel. If we don't have the address yet, this fails.", + "type": "object", + "required": [ + "send_funds" + ], + "properties": { + "send_funds": { + "type": "object", + "required": [ + "reflect_channel_id", + "transfer_channel_id" + ], + "properties": { + "reflect_channel_id": { + "description": "The channel id we use above to talk with the reflect contract", + "type": "string" + }, + "transfer_channel_id": { + "description": "The channel to use for ibctransfer. This is bound to a different port and handled by a different module. It should connect to the same chain as the reflect_channel_id does", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ], + "definitions": { + "BankMsg": { + "description": "The message types of the bank module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto", + "oneOf": [ + { + "description": "Sends native tokens from the contract to the given address.\n\nThis is translated to a [MsgSend](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto#L19-L28). `from_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "send" + ], + "properties": { + "send": { + "type": "object", + "required": [ + "amount", + "to_address" + ], + "properties": { + "amount": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "to_address": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This will burn the given coins from the contract's account. There is no Cosmos SDK message that performs this, but it can be done by calling the bank keeper. Important if a contract controls significant token supply that must be retired.", + "type": "object", + "required": [ + "burn" + ], + "properties": { + "burn": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + } + } + }, + "additionalProperties": false + } + ] + }, + "Binary": { + "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", + "type": "string" + }, + "Coin": { + "type": "object", + "required": [ + "amount", + "denom" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + } + } + }, + "CosmosMsg_for_Empty": { + "oneOf": [ + { + "type": "object", + "required": [ + "bank" + ], + "properties": { + "bank": { + "$ref": "#/definitions/BankMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "custom" + ], + "properties": { + "custom": { + "$ref": "#/definitions/Empty" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "staking" + ], + "properties": { + "staking": { + "$ref": "#/definitions/StakingMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "distribution" + ], + "properties": { + "distribution": { + "$ref": "#/definitions/DistributionMsg" + } + }, + "additionalProperties": false + }, + { + "description": "A Stargate message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", + "type": "object", + "required": [ + "stargate" + ], + "properties": { + "stargate": { + "type": "object", + "required": [ + "type_url", + "value" + ], + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "$ref": "#/definitions/Binary" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "ibc" + ], + "properties": { + "ibc": { + "$ref": "#/definitions/IbcMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "wasm" + ], + "properties": { + "wasm": { + "$ref": "#/definitions/WasmMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "gov" + ], + "properties": { + "gov": { + "$ref": "#/definitions/GovMsg" + } + }, + "additionalProperties": false + } + ] + }, + "DistributionMsg": { + "description": "The message types of the distribution module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto", + "oneOf": [ + { + "description": "This is translated to a [MsgSetWithdrawAddress](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#L29-L37). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "set_withdraw_address" + ], + "properties": { + "set_withdraw_address": { + "type": "object", + "required": [ + "address" + ], + "properties": { + "address": { + "description": "The `withdraw_address`", + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This is translated to a [[MsgWithdrawDelegatorReward](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#L42-L50). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "withdraw_delegator_reward" + ], + "properties": { + "withdraw_delegator_reward": { + "type": "object", + "required": [ + "validator" + ], + "properties": { + "validator": { + "description": "The `validator_address`", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "Empty": { + "description": "An empty struct that serves as a placeholder in different places, such as contracts that don't set a custom message.\n\nIt is designed to be expressable in correct JSON and JSON Schema but contains no meaningful data. Previously we used enums without cases, but those cannot represented as valid JSON Schema (https://github.com/CosmWasm/cosmwasm/issues/451)", + "type": "object" + }, + "GovMsg": { + "oneOf": [ + { + "description": "This maps directly to [MsgVote](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/gov/v1beta1/tx.proto#L46-L56) in the Cosmos SDK with voter set to the contract address.", + "type": "object", + "required": [ + "vote" + ], + "properties": { + "vote": { + "type": "object", + "required": [ + "proposal_id", + "vote" + ], + "properties": { + "proposal_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "vote": { + "$ref": "#/definitions/VoteOption" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "IbcMsg": { + "description": "These are messages in the IBC lifecycle. Only usable by IBC-enabled contracts (contracts that directly speak the IBC protocol via 6 entry points)", + "oneOf": [ + { + "description": "Sends bank tokens owned by the contract to the given address on another chain. The channel must already be established between the ibctransfer module on this chain and a matching module on the remote chain. We cannot select the port_id, this is whatever the local chain has bound the ibctransfer module to.", + "type": "object", + "required": [ + "transfer" + ], + "properties": { + "transfer": { + "type": "object", + "required": [ + "amount", + "channel_id", + "timeout", + "to_address" + ], + "properties": { + "amount": { + "description": "packet data only supports one coin https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/ibc/applications/transfer/v1/transfer.proto#L11-L20", + "allOf": [ + { + "$ref": "#/definitions/Coin" + } + ] + }, + "channel_id": { + "description": "exisiting channel to send the tokens over", + "type": "string" + }, + "timeout": { + "description": "when packet times out, measured on remote chain", + "allOf": [ + { + "$ref": "#/definitions/IbcTimeout" + } + ] + }, + "to_address": { + "description": "address on the remote chain to receive these tokens", + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Sends an IBC packet with given data over the existing channel. Data should be encoded in a format defined by the channel version, and the module on the other side should know how to parse this.", + "type": "object", + "required": [ + "send_packet" + ], + "properties": { + "send_packet": { + "type": "object", + "required": [ + "channel_id", + "data", + "timeout" + ], + "properties": { + "channel_id": { + "type": "string" + }, + "data": { + "$ref": "#/definitions/Binary" + }, + "timeout": { + "description": "when packet times out, measured on remote chain", + "allOf": [ + { + "$ref": "#/definitions/IbcTimeout" + } + ] + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This will close an existing channel that is owned by this contract. Port is auto-assigned to the contract's IBC port", + "type": "object", + "required": [ + "close_channel" + ], + "properties": { + "close_channel": { + "type": "object", + "required": [ + "channel_id" + ], + "properties": { + "channel_id": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "IbcTimeout": { + "description": "In IBC each package must set at least one type of timeout: the timestamp or the block height. Using this rather complex enum instead of two timeout fields we ensure that at least one timeout is set.", + "type": "object", + "properties": { + "block": { + "anyOf": [ + { + "$ref": "#/definitions/IbcTimeoutBlock" + }, + { + "type": "null" + } + ] + }, + "timestamp": { + "anyOf": [ + { + "$ref": "#/definitions/Timestamp" + }, + { + "type": "null" + } + ] + } + } + }, + "IbcTimeoutBlock": { + "description": "IBCTimeoutHeight Height is a monotonically increasing data type that can be compared against another Height for the purposes of updating and freezing clients. Ordering is (revision_number, timeout_height)", + "type": "object", + "required": [ + "height", + "revision" + ], + "properties": { + "height": { + "description": "block height after which the packet times out. the height within the given revision", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "revision": { + "description": "the version that the client is currently on (eg. after reseting the chain this could increment 1 as height drops to 0)", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + } + }, + "StakingMsg": { + "description": "The message types of the staking module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto", + "oneOf": [ + { + "description": "This is translated to a [MsgDelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L81-L90). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "delegate" + ], + "properties": { + "delegate": { + "type": "object", + "required": [ + "amount", + "validator" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Coin" + }, + "validator": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This is translated to a [MsgUndelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L112-L121). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "undelegate" + ], + "properties": { + "undelegate": { + "type": "object", + "required": [ + "amount", + "validator" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Coin" + }, + "validator": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This is translated to a [MsgBeginRedelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L95-L105). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "redelegate" + ], + "properties": { + "redelegate": { + "type": "object", + "required": [ + "amount", + "dst_validator", + "src_validator" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Coin" + }, + "dst_validator": { + "type": "string" + }, + "src_validator": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "Timestamp": { + "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", + "allOf": [ + { + "$ref": "#/definitions/Uint64" + } + ] + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + }, + "Uint64": { + "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", + "type": "string" + }, + "VoteOption": { + "type": "string", + "enum": [ + "yes", + "no", + "abstain", + "no_with_veto" + ] + }, + "WasmMsg": { + "description": "The message types of the wasm module.\n\nSee https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto", + "oneOf": [ + { + "description": "Dispatches a call to another contract at a known address (with known ABI).\n\nThis is translated to a [MsgExecuteContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L68-L78). `sender` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "execute" + ], + "properties": { + "execute": { + "type": "object", + "required": [ + "contract_addr", + "funds", + "msg" + ], + "properties": { + "contract_addr": { + "type": "string" + }, + "funds": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "msg": { + "description": "msg is the json-encoded ExecuteMsg struct (as raw Binary)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.16.0-alpha1/x/wasm/internal/types/tx.proto#L47-L61). `sender` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "instantiate" + ], + "properties": { + "instantiate": { + "type": "object", + "required": [ + "code_id", + "funds", + "label", + "msg" + ], + "properties": { + "admin": { + "type": [ + "string", + "null" + ] + }, + "code_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "funds": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "label": { + "description": "A human-readbale label for the contract", + "type": "string" + }, + "msg": { + "description": "msg is the JSON-encoded InstantiateMsg struct (as raw Binary)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Migrates a given contracts to use new wasm code. Passes a MigrateMsg to allow us to customize behavior.\n\nOnly the contract admin (as defined in wasmd), if any, is able to make this call.\n\nThis is translated to a [MsgMigrateContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L86-L96). `sender` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "migrate" + ], + "properties": { + "migrate": { + "type": "object", + "required": [ + "contract_addr", + "msg", + "new_code_id" + ], + "properties": { + "contract_addr": { + "type": "string" + }, + "msg": { + "description": "msg is the json-encoded MigrateMsg struct that will be passed to the new code", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "new_code_id": { + "description": "the code_id of the new logic to place in the given contract", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Sets a new admin (for migrate) on the given contract. Fails if this contract is not currently admin of the target contract.", + "type": "object", + "required": [ + "update_admin" + ], + "properties": { + "update_admin": { + "type": "object", + "required": [ + "admin", + "contract_addr" + ], + "properties": { + "admin": { + "type": "string" + }, + "contract_addr": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Clears the admin on the given contract, so no more migration possible. Fails if this contract is not currently admin of the target contract.", + "type": "object", + "required": [ + "clear_admin" + ], + "properties": { + "clear_admin": { + "type": "object", + "required": [ + "contract_addr" + ], + "properties": { + "contract_addr": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + } + } +} diff --git a/contracts/ibc-reflect-send/schema/raw/instantiate.json b/contracts/ibc-reflect-send/schema/raw/instantiate.json new file mode 100644 index 0000000000..4eb2ede310 --- /dev/null +++ b/contracts/ibc-reflect-send/schema/raw/instantiate.json @@ -0,0 +1,7 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "InstantiateMsg", + "description": "This needs no info. Owner of the contract is whoever signed the InstantiateMsg.", + "type": "object", + "additionalProperties": false +} diff --git a/contracts/ibc-reflect-send/schema/raw/migrate.json b/contracts/ibc-reflect-send/schema/raw/migrate.json new file mode 100644 index 0000000000..e08109d489 --- /dev/null +++ b/contracts/ibc-reflect-send/schema/raw/migrate.json @@ -0,0 +1,817 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Changes the admin", + "type": "object", + "required": [ + "update_admin" + ], + "properties": { + "update_admin": { + "type": "object", + "required": [ + "admin" + ], + "properties": { + "admin": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "send_msgs" + ], + "properties": { + "send_msgs": { + "type": "object", + "required": [ + "channel_id", + "msgs" + ], + "properties": { + "channel_id": { + "type": "string" + }, + "msgs": { + "type": "array", + "items": { + "$ref": "#/definitions/CosmosMsg_for_Empty" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "check_remote_balance" + ], + "properties": { + "check_remote_balance": { + "type": "object", + "required": [ + "channel_id" + ], + "properties": { + "channel_id": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "If you sent funds to this contract, it will attempt to ibc transfer them to the account on the remote side of this channel. If we don't have the address yet, this fails.", + "type": "object", + "required": [ + "send_funds" + ], + "properties": { + "send_funds": { + "type": "object", + "required": [ + "reflect_channel_id", + "transfer_channel_id" + ], + "properties": { + "reflect_channel_id": { + "description": "The channel id we use above to talk with the reflect contract", + "type": "string" + }, + "transfer_channel_id": { + "description": "The channel to use for ibctransfer. This is bound to a different port and handled by a different module. It should connect to the same chain as the reflect_channel_id does", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ], + "definitions": { + "BankMsg": { + "description": "The message types of the bank module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto", + "oneOf": [ + { + "description": "Sends native tokens from the contract to the given address.\n\nThis is translated to a [MsgSend](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto#L19-L28). `from_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "send" + ], + "properties": { + "send": { + "type": "object", + "required": [ + "amount", + "to_address" + ], + "properties": { + "amount": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "to_address": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This will burn the given coins from the contract's account. There is no Cosmos SDK message that performs this, but it can be done by calling the bank keeper. Important if a contract controls significant token supply that must be retired.", + "type": "object", + "required": [ + "burn" + ], + "properties": { + "burn": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + } + } + }, + "additionalProperties": false + } + ] + }, + "Binary": { + "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", + "type": "string" + }, + "Coin": { + "type": "object", + "required": [ + "amount", + "denom" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + } + } + }, + "CosmosMsg_for_Empty": { + "oneOf": [ + { + "type": "object", + "required": [ + "bank" + ], + "properties": { + "bank": { + "$ref": "#/definitions/BankMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "custom" + ], + "properties": { + "custom": { + "$ref": "#/definitions/Empty" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "staking" + ], + "properties": { + "staking": { + "$ref": "#/definitions/StakingMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "distribution" + ], + "properties": { + "distribution": { + "$ref": "#/definitions/DistributionMsg" + } + }, + "additionalProperties": false + }, + { + "description": "A Stargate message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", + "type": "object", + "required": [ + "stargate" + ], + "properties": { + "stargate": { + "type": "object", + "required": [ + "type_url", + "value" + ], + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "$ref": "#/definitions/Binary" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "ibc" + ], + "properties": { + "ibc": { + "$ref": "#/definitions/IbcMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "wasm" + ], + "properties": { + "wasm": { + "$ref": "#/definitions/WasmMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "gov" + ], + "properties": { + "gov": { + "$ref": "#/definitions/GovMsg" + } + }, + "additionalProperties": false + } + ] + }, + "DistributionMsg": { + "description": "The message types of the distribution module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto", + "oneOf": [ + { + "description": "This is translated to a [MsgSetWithdrawAddress](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#L29-L37). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "set_withdraw_address" + ], + "properties": { + "set_withdraw_address": { + "type": "object", + "required": [ + "address" + ], + "properties": { + "address": { + "description": "The `withdraw_address`", + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This is translated to a [[MsgWithdrawDelegatorReward](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#L42-L50). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "withdraw_delegator_reward" + ], + "properties": { + "withdraw_delegator_reward": { + "type": "object", + "required": [ + "validator" + ], + "properties": { + "validator": { + "description": "The `validator_address`", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "Empty": { + "description": "An empty struct that serves as a placeholder in different places, such as contracts that don't set a custom message.\n\nIt is designed to be expressable in correct JSON and JSON Schema but contains no meaningful data. Previously we used enums without cases, but those cannot represented as valid JSON Schema (https://github.com/CosmWasm/cosmwasm/issues/451)", + "type": "object" + }, + "GovMsg": { + "oneOf": [ + { + "description": "This maps directly to [MsgVote](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/gov/v1beta1/tx.proto#L46-L56) in the Cosmos SDK with voter set to the contract address.", + "type": "object", + "required": [ + "vote" + ], + "properties": { + "vote": { + "type": "object", + "required": [ + "proposal_id", + "vote" + ], + "properties": { + "proposal_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "vote": { + "$ref": "#/definitions/VoteOption" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "IbcMsg": { + "description": "These are messages in the IBC lifecycle. Only usable by IBC-enabled contracts (contracts that directly speak the IBC protocol via 6 entry points)", + "oneOf": [ + { + "description": "Sends bank tokens owned by the contract to the given address on another chain. The channel must already be established between the ibctransfer module on this chain and a matching module on the remote chain. We cannot select the port_id, this is whatever the local chain has bound the ibctransfer module to.", + "type": "object", + "required": [ + "transfer" + ], + "properties": { + "transfer": { + "type": "object", + "required": [ + "amount", + "channel_id", + "timeout", + "to_address" + ], + "properties": { + "amount": { + "description": "packet data only supports one coin https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/ibc/applications/transfer/v1/transfer.proto#L11-L20", + "allOf": [ + { + "$ref": "#/definitions/Coin" + } + ] + }, + "channel_id": { + "description": "exisiting channel to send the tokens over", + "type": "string" + }, + "timeout": { + "description": "when packet times out, measured on remote chain", + "allOf": [ + { + "$ref": "#/definitions/IbcTimeout" + } + ] + }, + "to_address": { + "description": "address on the remote chain to receive these tokens", + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Sends an IBC packet with given data over the existing channel. Data should be encoded in a format defined by the channel version, and the module on the other side should know how to parse this.", + "type": "object", + "required": [ + "send_packet" + ], + "properties": { + "send_packet": { + "type": "object", + "required": [ + "channel_id", + "data", + "timeout" + ], + "properties": { + "channel_id": { + "type": "string" + }, + "data": { + "$ref": "#/definitions/Binary" + }, + "timeout": { + "description": "when packet times out, measured on remote chain", + "allOf": [ + { + "$ref": "#/definitions/IbcTimeout" + } + ] + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This will close an existing channel that is owned by this contract. Port is auto-assigned to the contract's IBC port", + "type": "object", + "required": [ + "close_channel" + ], + "properties": { + "close_channel": { + "type": "object", + "required": [ + "channel_id" + ], + "properties": { + "channel_id": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "IbcTimeout": { + "description": "In IBC each package must set at least one type of timeout: the timestamp or the block height. Using this rather complex enum instead of two timeout fields we ensure that at least one timeout is set.", + "type": "object", + "properties": { + "block": { + "anyOf": [ + { + "$ref": "#/definitions/IbcTimeoutBlock" + }, + { + "type": "null" + } + ] + }, + "timestamp": { + "anyOf": [ + { + "$ref": "#/definitions/Timestamp" + }, + { + "type": "null" + } + ] + } + } + }, + "IbcTimeoutBlock": { + "description": "IBCTimeoutHeight Height is a monotonically increasing data type that can be compared against another Height for the purposes of updating and freezing clients. Ordering is (revision_number, timeout_height)", + "type": "object", + "required": [ + "height", + "revision" + ], + "properties": { + "height": { + "description": "block height after which the packet times out. the height within the given revision", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "revision": { + "description": "the version that the client is currently on (eg. after reseting the chain this could increment 1 as height drops to 0)", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + } + }, + "StakingMsg": { + "description": "The message types of the staking module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto", + "oneOf": [ + { + "description": "This is translated to a [MsgDelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L81-L90). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "delegate" + ], + "properties": { + "delegate": { + "type": "object", + "required": [ + "amount", + "validator" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Coin" + }, + "validator": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This is translated to a [MsgUndelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L112-L121). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "undelegate" + ], + "properties": { + "undelegate": { + "type": "object", + "required": [ + "amount", + "validator" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Coin" + }, + "validator": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This is translated to a [MsgBeginRedelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L95-L105). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "redelegate" + ], + "properties": { + "redelegate": { + "type": "object", + "required": [ + "amount", + "dst_validator", + "src_validator" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Coin" + }, + "dst_validator": { + "type": "string" + }, + "src_validator": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "Timestamp": { + "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", + "allOf": [ + { + "$ref": "#/definitions/Uint64" + } + ] + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + }, + "Uint64": { + "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", + "type": "string" + }, + "VoteOption": { + "type": "string", + "enum": [ + "yes", + "no", + "abstain", + "no_with_veto" + ] + }, + "WasmMsg": { + "description": "The message types of the wasm module.\n\nSee https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto", + "oneOf": [ + { + "description": "Dispatches a call to another contract at a known address (with known ABI).\n\nThis is translated to a [MsgExecuteContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L68-L78). `sender` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "execute" + ], + "properties": { + "execute": { + "type": "object", + "required": [ + "contract_addr", + "funds", + "msg" + ], + "properties": { + "contract_addr": { + "type": "string" + }, + "funds": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "msg": { + "description": "msg is the json-encoded ExecuteMsg struct (as raw Binary)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.16.0-alpha1/x/wasm/internal/types/tx.proto#L47-L61). `sender` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "instantiate" + ], + "properties": { + "instantiate": { + "type": "object", + "required": [ + "code_id", + "funds", + "label", + "msg" + ], + "properties": { + "admin": { + "type": [ + "string", + "null" + ] + }, + "code_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "funds": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "label": { + "description": "A human-readbale label for the contract", + "type": "string" + }, + "msg": { + "description": "msg is the JSON-encoded InstantiateMsg struct (as raw Binary)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Migrates a given contracts to use new wasm code. Passes a MigrateMsg to allow us to customize behavior.\n\nOnly the contract admin (as defined in wasmd), if any, is able to make this call.\n\nThis is translated to a [MsgMigrateContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L86-L96). `sender` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "migrate" + ], + "properties": { + "migrate": { + "type": "object", + "required": [ + "contract_addr", + "msg", + "new_code_id" + ], + "properties": { + "contract_addr": { + "type": "string" + }, + "msg": { + "description": "msg is the json-encoded MigrateMsg struct that will be passed to the new code", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "new_code_id": { + "description": "the code_id of the new logic to place in the given contract", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Sets a new admin (for migrate) on the given contract. Fails if this contract is not currently admin of the target contract.", + "type": "object", + "required": [ + "update_admin" + ], + "properties": { + "update_admin": { + "type": "object", + "required": [ + "admin", + "contract_addr" + ], + "properties": { + "admin": { + "type": "string" + }, + "contract_addr": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Clears the admin on the given contract, so no more migration possible. Fails if this contract is not currently admin of the target contract.", + "type": "object", + "required": [ + "clear_admin" + ], + "properties": { + "clear_admin": { + "type": "object", + "required": [ + "contract_addr" + ], + "properties": { + "contract_addr": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + } + } +} diff --git a/contracts/ibc-reflect-send/schema/raw/query.json b/contracts/ibc-reflect-send/schema/raw/query.json new file mode 100644 index 0000000000..e08109d489 --- /dev/null +++ b/contracts/ibc-reflect-send/schema/raw/query.json @@ -0,0 +1,817 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Changes the admin", + "type": "object", + "required": [ + "update_admin" + ], + "properties": { + "update_admin": { + "type": "object", + "required": [ + "admin" + ], + "properties": { + "admin": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "send_msgs" + ], + "properties": { + "send_msgs": { + "type": "object", + "required": [ + "channel_id", + "msgs" + ], + "properties": { + "channel_id": { + "type": "string" + }, + "msgs": { + "type": "array", + "items": { + "$ref": "#/definitions/CosmosMsg_for_Empty" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "check_remote_balance" + ], + "properties": { + "check_remote_balance": { + "type": "object", + "required": [ + "channel_id" + ], + "properties": { + "channel_id": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "If you sent funds to this contract, it will attempt to ibc transfer them to the account on the remote side of this channel. If we don't have the address yet, this fails.", + "type": "object", + "required": [ + "send_funds" + ], + "properties": { + "send_funds": { + "type": "object", + "required": [ + "reflect_channel_id", + "transfer_channel_id" + ], + "properties": { + "reflect_channel_id": { + "description": "The channel id we use above to talk with the reflect contract", + "type": "string" + }, + "transfer_channel_id": { + "description": "The channel to use for ibctransfer. This is bound to a different port and handled by a different module. It should connect to the same chain as the reflect_channel_id does", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ], + "definitions": { + "BankMsg": { + "description": "The message types of the bank module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto", + "oneOf": [ + { + "description": "Sends native tokens from the contract to the given address.\n\nThis is translated to a [MsgSend](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto#L19-L28). `from_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "send" + ], + "properties": { + "send": { + "type": "object", + "required": [ + "amount", + "to_address" + ], + "properties": { + "amount": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "to_address": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This will burn the given coins from the contract's account. There is no Cosmos SDK message that performs this, but it can be done by calling the bank keeper. Important if a contract controls significant token supply that must be retired.", + "type": "object", + "required": [ + "burn" + ], + "properties": { + "burn": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + } + } + }, + "additionalProperties": false + } + ] + }, + "Binary": { + "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", + "type": "string" + }, + "Coin": { + "type": "object", + "required": [ + "amount", + "denom" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + } + } + }, + "CosmosMsg_for_Empty": { + "oneOf": [ + { + "type": "object", + "required": [ + "bank" + ], + "properties": { + "bank": { + "$ref": "#/definitions/BankMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "custom" + ], + "properties": { + "custom": { + "$ref": "#/definitions/Empty" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "staking" + ], + "properties": { + "staking": { + "$ref": "#/definitions/StakingMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "distribution" + ], + "properties": { + "distribution": { + "$ref": "#/definitions/DistributionMsg" + } + }, + "additionalProperties": false + }, + { + "description": "A Stargate message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", + "type": "object", + "required": [ + "stargate" + ], + "properties": { + "stargate": { + "type": "object", + "required": [ + "type_url", + "value" + ], + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "$ref": "#/definitions/Binary" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "ibc" + ], + "properties": { + "ibc": { + "$ref": "#/definitions/IbcMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "wasm" + ], + "properties": { + "wasm": { + "$ref": "#/definitions/WasmMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "gov" + ], + "properties": { + "gov": { + "$ref": "#/definitions/GovMsg" + } + }, + "additionalProperties": false + } + ] + }, + "DistributionMsg": { + "description": "The message types of the distribution module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto", + "oneOf": [ + { + "description": "This is translated to a [MsgSetWithdrawAddress](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#L29-L37). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "set_withdraw_address" + ], + "properties": { + "set_withdraw_address": { + "type": "object", + "required": [ + "address" + ], + "properties": { + "address": { + "description": "The `withdraw_address`", + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This is translated to a [[MsgWithdrawDelegatorReward](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#L42-L50). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "withdraw_delegator_reward" + ], + "properties": { + "withdraw_delegator_reward": { + "type": "object", + "required": [ + "validator" + ], + "properties": { + "validator": { + "description": "The `validator_address`", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "Empty": { + "description": "An empty struct that serves as a placeholder in different places, such as contracts that don't set a custom message.\n\nIt is designed to be expressable in correct JSON and JSON Schema but contains no meaningful data. Previously we used enums without cases, but those cannot represented as valid JSON Schema (https://github.com/CosmWasm/cosmwasm/issues/451)", + "type": "object" + }, + "GovMsg": { + "oneOf": [ + { + "description": "This maps directly to [MsgVote](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/gov/v1beta1/tx.proto#L46-L56) in the Cosmos SDK with voter set to the contract address.", + "type": "object", + "required": [ + "vote" + ], + "properties": { + "vote": { + "type": "object", + "required": [ + "proposal_id", + "vote" + ], + "properties": { + "proposal_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "vote": { + "$ref": "#/definitions/VoteOption" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "IbcMsg": { + "description": "These are messages in the IBC lifecycle. Only usable by IBC-enabled contracts (contracts that directly speak the IBC protocol via 6 entry points)", + "oneOf": [ + { + "description": "Sends bank tokens owned by the contract to the given address on another chain. The channel must already be established between the ibctransfer module on this chain and a matching module on the remote chain. We cannot select the port_id, this is whatever the local chain has bound the ibctransfer module to.", + "type": "object", + "required": [ + "transfer" + ], + "properties": { + "transfer": { + "type": "object", + "required": [ + "amount", + "channel_id", + "timeout", + "to_address" + ], + "properties": { + "amount": { + "description": "packet data only supports one coin https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/ibc/applications/transfer/v1/transfer.proto#L11-L20", + "allOf": [ + { + "$ref": "#/definitions/Coin" + } + ] + }, + "channel_id": { + "description": "exisiting channel to send the tokens over", + "type": "string" + }, + "timeout": { + "description": "when packet times out, measured on remote chain", + "allOf": [ + { + "$ref": "#/definitions/IbcTimeout" + } + ] + }, + "to_address": { + "description": "address on the remote chain to receive these tokens", + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Sends an IBC packet with given data over the existing channel. Data should be encoded in a format defined by the channel version, and the module on the other side should know how to parse this.", + "type": "object", + "required": [ + "send_packet" + ], + "properties": { + "send_packet": { + "type": "object", + "required": [ + "channel_id", + "data", + "timeout" + ], + "properties": { + "channel_id": { + "type": "string" + }, + "data": { + "$ref": "#/definitions/Binary" + }, + "timeout": { + "description": "when packet times out, measured on remote chain", + "allOf": [ + { + "$ref": "#/definitions/IbcTimeout" + } + ] + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This will close an existing channel that is owned by this contract. Port is auto-assigned to the contract's IBC port", + "type": "object", + "required": [ + "close_channel" + ], + "properties": { + "close_channel": { + "type": "object", + "required": [ + "channel_id" + ], + "properties": { + "channel_id": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "IbcTimeout": { + "description": "In IBC each package must set at least one type of timeout: the timestamp or the block height. Using this rather complex enum instead of two timeout fields we ensure that at least one timeout is set.", + "type": "object", + "properties": { + "block": { + "anyOf": [ + { + "$ref": "#/definitions/IbcTimeoutBlock" + }, + { + "type": "null" + } + ] + }, + "timestamp": { + "anyOf": [ + { + "$ref": "#/definitions/Timestamp" + }, + { + "type": "null" + } + ] + } + } + }, + "IbcTimeoutBlock": { + "description": "IBCTimeoutHeight Height is a monotonically increasing data type that can be compared against another Height for the purposes of updating and freezing clients. Ordering is (revision_number, timeout_height)", + "type": "object", + "required": [ + "height", + "revision" + ], + "properties": { + "height": { + "description": "block height after which the packet times out. the height within the given revision", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "revision": { + "description": "the version that the client is currently on (eg. after reseting the chain this could increment 1 as height drops to 0)", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + } + }, + "StakingMsg": { + "description": "The message types of the staking module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto", + "oneOf": [ + { + "description": "This is translated to a [MsgDelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L81-L90). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "delegate" + ], + "properties": { + "delegate": { + "type": "object", + "required": [ + "amount", + "validator" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Coin" + }, + "validator": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This is translated to a [MsgUndelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L112-L121). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "undelegate" + ], + "properties": { + "undelegate": { + "type": "object", + "required": [ + "amount", + "validator" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Coin" + }, + "validator": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This is translated to a [MsgBeginRedelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L95-L105). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "redelegate" + ], + "properties": { + "redelegate": { + "type": "object", + "required": [ + "amount", + "dst_validator", + "src_validator" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Coin" + }, + "dst_validator": { + "type": "string" + }, + "src_validator": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "Timestamp": { + "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", + "allOf": [ + { + "$ref": "#/definitions/Uint64" + } + ] + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + }, + "Uint64": { + "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", + "type": "string" + }, + "VoteOption": { + "type": "string", + "enum": [ + "yes", + "no", + "abstain", + "no_with_veto" + ] + }, + "WasmMsg": { + "description": "The message types of the wasm module.\n\nSee https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto", + "oneOf": [ + { + "description": "Dispatches a call to another contract at a known address (with known ABI).\n\nThis is translated to a [MsgExecuteContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L68-L78). `sender` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "execute" + ], + "properties": { + "execute": { + "type": "object", + "required": [ + "contract_addr", + "funds", + "msg" + ], + "properties": { + "contract_addr": { + "type": "string" + }, + "funds": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "msg": { + "description": "msg is the json-encoded ExecuteMsg struct (as raw Binary)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.16.0-alpha1/x/wasm/internal/types/tx.proto#L47-L61). `sender` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "instantiate" + ], + "properties": { + "instantiate": { + "type": "object", + "required": [ + "code_id", + "funds", + "label", + "msg" + ], + "properties": { + "admin": { + "type": [ + "string", + "null" + ] + }, + "code_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "funds": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "label": { + "description": "A human-readbale label for the contract", + "type": "string" + }, + "msg": { + "description": "msg is the JSON-encoded InstantiateMsg struct (as raw Binary)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Migrates a given contracts to use new wasm code. Passes a MigrateMsg to allow us to customize behavior.\n\nOnly the contract admin (as defined in wasmd), if any, is able to make this call.\n\nThis is translated to a [MsgMigrateContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L86-L96). `sender` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "migrate" + ], + "properties": { + "migrate": { + "type": "object", + "required": [ + "contract_addr", + "msg", + "new_code_id" + ], + "properties": { + "contract_addr": { + "type": "string" + }, + "msg": { + "description": "msg is the json-encoded MigrateMsg struct that will be passed to the new code", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "new_code_id": { + "description": "the code_id of the new logic to place in the given contract", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Sets a new admin (for migrate) on the given contract. Fails if this contract is not currently admin of the target contract.", + "type": "object", + "required": [ + "update_admin" + ], + "properties": { + "update_admin": { + "type": "object", + "required": [ + "admin", + "contract_addr" + ], + "properties": { + "admin": { + "type": "string" + }, + "contract_addr": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Clears the admin on the given contract, so no more migration possible. Fails if this contract is not currently admin of the target contract.", + "type": "object", + "required": [ + "clear_admin" + ], + "properties": { + "clear_admin": { + "type": "object", + "required": [ + "contract_addr" + ], + "properties": { + "contract_addr": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + } + } +} diff --git a/contracts/ibc-reflect-send/schema/raw/response_to_account.json b/contracts/ibc-reflect-send/schema/raw/response_to_account.json new file mode 100644 index 0000000000..3b022b2f57 --- /dev/null +++ b/contracts/ibc-reflect-send/schema/raw/response_to_account.json @@ -0,0 +1,70 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "AccountInfo", + "type": "object", + "required": [ + "channel_id", + "last_update_time", + "remote_balance" + ], + "properties": { + "channel_id": { + "type": "string" + }, + "last_update_time": { + "description": "last block balance was updated (0 is never)", + "allOf": [ + { + "$ref": "#/definitions/Timestamp" + } + ] + }, + "remote_addr": { + "description": "in normal cases, it should be set, but there is a delay between binding the channel and making a query and in that time it is empty", + "type": [ + "string", + "null" + ] + }, + "remote_balance": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + }, + "additionalProperties": false, + "definitions": { + "Coin": { + "type": "object", + "required": [ + "amount", + "denom" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + } + } + }, + "Timestamp": { + "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", + "allOf": [ + { + "$ref": "#/definitions/Uint64" + } + ] + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + }, + "Uint64": { + "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", + "type": "string" + } + } +} diff --git a/contracts/ibc-reflect-send/schema/raw/response_to_admin.json b/contracts/ibc-reflect-send/schema/raw/response_to_admin.json new file mode 100644 index 0000000000..627be7a025 --- /dev/null +++ b/contracts/ibc-reflect-send/schema/raw/response_to_admin.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "AdminResponse", + "type": "object", + "required": [ + "admin" + ], + "properties": { + "admin": { + "type": "string" + } + }, + "additionalProperties": false +} diff --git a/contracts/ibc-reflect-send/schema/raw/response_to_list_accounts.json b/contracts/ibc-reflect-send/schema/raw/response_to_list_accounts.json new file mode 100644 index 0000000000..bb03b416b9 --- /dev/null +++ b/contracts/ibc-reflect-send/schema/raw/response_to_list_accounts.json @@ -0,0 +1,85 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ListAccountsResponse", + "type": "object", + "required": [ + "accounts" + ], + "properties": { + "accounts": { + "type": "array", + "items": { + "$ref": "#/definitions/AccountInfo" + } + } + }, + "additionalProperties": false, + "definitions": { + "AccountInfo": { + "type": "object", + "required": [ + "channel_id", + "last_update_time", + "remote_balance" + ], + "properties": { + "channel_id": { + "type": "string" + }, + "last_update_time": { + "description": "last block balance was updated (0 is never)", + "allOf": [ + { + "$ref": "#/definitions/Timestamp" + } + ] + }, + "remote_addr": { + "description": "in normal cases, it should be set, but there is a delay between binding the channel and making a query and in that time it is empty", + "type": [ + "string", + "null" + ] + }, + "remote_balance": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + }, + "additionalProperties": false + }, + "Coin": { + "type": "object", + "required": [ + "amount", + "denom" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + } + } + }, + "Timestamp": { + "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", + "allOf": [ + { + "$ref": "#/definitions/Uint64" + } + ] + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + }, + "Uint64": { + "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", + "type": "string" + } + } +} diff --git a/contracts/ibc-reflect-send/schema/raw/sudo.json b/contracts/ibc-reflect-send/schema/raw/sudo.json new file mode 100644 index 0000000000..e08109d489 --- /dev/null +++ b/contracts/ibc-reflect-send/schema/raw/sudo.json @@ -0,0 +1,817 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Changes the admin", + "type": "object", + "required": [ + "update_admin" + ], + "properties": { + "update_admin": { + "type": "object", + "required": [ + "admin" + ], + "properties": { + "admin": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "send_msgs" + ], + "properties": { + "send_msgs": { + "type": "object", + "required": [ + "channel_id", + "msgs" + ], + "properties": { + "channel_id": { + "type": "string" + }, + "msgs": { + "type": "array", + "items": { + "$ref": "#/definitions/CosmosMsg_for_Empty" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "check_remote_balance" + ], + "properties": { + "check_remote_balance": { + "type": "object", + "required": [ + "channel_id" + ], + "properties": { + "channel_id": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "If you sent funds to this contract, it will attempt to ibc transfer them to the account on the remote side of this channel. If we don't have the address yet, this fails.", + "type": "object", + "required": [ + "send_funds" + ], + "properties": { + "send_funds": { + "type": "object", + "required": [ + "reflect_channel_id", + "transfer_channel_id" + ], + "properties": { + "reflect_channel_id": { + "description": "The channel id we use above to talk with the reflect contract", + "type": "string" + }, + "transfer_channel_id": { + "description": "The channel to use for ibctransfer. This is bound to a different port and handled by a different module. It should connect to the same chain as the reflect_channel_id does", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ], + "definitions": { + "BankMsg": { + "description": "The message types of the bank module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto", + "oneOf": [ + { + "description": "Sends native tokens from the contract to the given address.\n\nThis is translated to a [MsgSend](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto#L19-L28). `from_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "send" + ], + "properties": { + "send": { + "type": "object", + "required": [ + "amount", + "to_address" + ], + "properties": { + "amount": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "to_address": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This will burn the given coins from the contract's account. There is no Cosmos SDK message that performs this, but it can be done by calling the bank keeper. Important if a contract controls significant token supply that must be retired.", + "type": "object", + "required": [ + "burn" + ], + "properties": { + "burn": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + } + } + }, + "additionalProperties": false + } + ] + }, + "Binary": { + "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", + "type": "string" + }, + "Coin": { + "type": "object", + "required": [ + "amount", + "denom" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + } + } + }, + "CosmosMsg_for_Empty": { + "oneOf": [ + { + "type": "object", + "required": [ + "bank" + ], + "properties": { + "bank": { + "$ref": "#/definitions/BankMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "custom" + ], + "properties": { + "custom": { + "$ref": "#/definitions/Empty" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "staking" + ], + "properties": { + "staking": { + "$ref": "#/definitions/StakingMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "distribution" + ], + "properties": { + "distribution": { + "$ref": "#/definitions/DistributionMsg" + } + }, + "additionalProperties": false + }, + { + "description": "A Stargate message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", + "type": "object", + "required": [ + "stargate" + ], + "properties": { + "stargate": { + "type": "object", + "required": [ + "type_url", + "value" + ], + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "$ref": "#/definitions/Binary" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "ibc" + ], + "properties": { + "ibc": { + "$ref": "#/definitions/IbcMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "wasm" + ], + "properties": { + "wasm": { + "$ref": "#/definitions/WasmMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "gov" + ], + "properties": { + "gov": { + "$ref": "#/definitions/GovMsg" + } + }, + "additionalProperties": false + } + ] + }, + "DistributionMsg": { + "description": "The message types of the distribution module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto", + "oneOf": [ + { + "description": "This is translated to a [MsgSetWithdrawAddress](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#L29-L37). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "set_withdraw_address" + ], + "properties": { + "set_withdraw_address": { + "type": "object", + "required": [ + "address" + ], + "properties": { + "address": { + "description": "The `withdraw_address`", + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This is translated to a [[MsgWithdrawDelegatorReward](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#L42-L50). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "withdraw_delegator_reward" + ], + "properties": { + "withdraw_delegator_reward": { + "type": "object", + "required": [ + "validator" + ], + "properties": { + "validator": { + "description": "The `validator_address`", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "Empty": { + "description": "An empty struct that serves as a placeholder in different places, such as contracts that don't set a custom message.\n\nIt is designed to be expressable in correct JSON and JSON Schema but contains no meaningful data. Previously we used enums without cases, but those cannot represented as valid JSON Schema (https://github.com/CosmWasm/cosmwasm/issues/451)", + "type": "object" + }, + "GovMsg": { + "oneOf": [ + { + "description": "This maps directly to [MsgVote](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/gov/v1beta1/tx.proto#L46-L56) in the Cosmos SDK with voter set to the contract address.", + "type": "object", + "required": [ + "vote" + ], + "properties": { + "vote": { + "type": "object", + "required": [ + "proposal_id", + "vote" + ], + "properties": { + "proposal_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "vote": { + "$ref": "#/definitions/VoteOption" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "IbcMsg": { + "description": "These are messages in the IBC lifecycle. Only usable by IBC-enabled contracts (contracts that directly speak the IBC protocol via 6 entry points)", + "oneOf": [ + { + "description": "Sends bank tokens owned by the contract to the given address on another chain. The channel must already be established between the ibctransfer module on this chain and a matching module on the remote chain. We cannot select the port_id, this is whatever the local chain has bound the ibctransfer module to.", + "type": "object", + "required": [ + "transfer" + ], + "properties": { + "transfer": { + "type": "object", + "required": [ + "amount", + "channel_id", + "timeout", + "to_address" + ], + "properties": { + "amount": { + "description": "packet data only supports one coin https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/ibc/applications/transfer/v1/transfer.proto#L11-L20", + "allOf": [ + { + "$ref": "#/definitions/Coin" + } + ] + }, + "channel_id": { + "description": "exisiting channel to send the tokens over", + "type": "string" + }, + "timeout": { + "description": "when packet times out, measured on remote chain", + "allOf": [ + { + "$ref": "#/definitions/IbcTimeout" + } + ] + }, + "to_address": { + "description": "address on the remote chain to receive these tokens", + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Sends an IBC packet with given data over the existing channel. Data should be encoded in a format defined by the channel version, and the module on the other side should know how to parse this.", + "type": "object", + "required": [ + "send_packet" + ], + "properties": { + "send_packet": { + "type": "object", + "required": [ + "channel_id", + "data", + "timeout" + ], + "properties": { + "channel_id": { + "type": "string" + }, + "data": { + "$ref": "#/definitions/Binary" + }, + "timeout": { + "description": "when packet times out, measured on remote chain", + "allOf": [ + { + "$ref": "#/definitions/IbcTimeout" + } + ] + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This will close an existing channel that is owned by this contract. Port is auto-assigned to the contract's IBC port", + "type": "object", + "required": [ + "close_channel" + ], + "properties": { + "close_channel": { + "type": "object", + "required": [ + "channel_id" + ], + "properties": { + "channel_id": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "IbcTimeout": { + "description": "In IBC each package must set at least one type of timeout: the timestamp or the block height. Using this rather complex enum instead of two timeout fields we ensure that at least one timeout is set.", + "type": "object", + "properties": { + "block": { + "anyOf": [ + { + "$ref": "#/definitions/IbcTimeoutBlock" + }, + { + "type": "null" + } + ] + }, + "timestamp": { + "anyOf": [ + { + "$ref": "#/definitions/Timestamp" + }, + { + "type": "null" + } + ] + } + } + }, + "IbcTimeoutBlock": { + "description": "IBCTimeoutHeight Height is a monotonically increasing data type that can be compared against another Height for the purposes of updating and freezing clients. Ordering is (revision_number, timeout_height)", + "type": "object", + "required": [ + "height", + "revision" + ], + "properties": { + "height": { + "description": "block height after which the packet times out. the height within the given revision", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "revision": { + "description": "the version that the client is currently on (eg. after reseting the chain this could increment 1 as height drops to 0)", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + } + }, + "StakingMsg": { + "description": "The message types of the staking module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto", + "oneOf": [ + { + "description": "This is translated to a [MsgDelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L81-L90). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "delegate" + ], + "properties": { + "delegate": { + "type": "object", + "required": [ + "amount", + "validator" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Coin" + }, + "validator": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This is translated to a [MsgUndelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L112-L121). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "undelegate" + ], + "properties": { + "undelegate": { + "type": "object", + "required": [ + "amount", + "validator" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Coin" + }, + "validator": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This is translated to a [MsgBeginRedelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L95-L105). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "redelegate" + ], + "properties": { + "redelegate": { + "type": "object", + "required": [ + "amount", + "dst_validator", + "src_validator" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Coin" + }, + "dst_validator": { + "type": "string" + }, + "src_validator": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "Timestamp": { + "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", + "allOf": [ + { + "$ref": "#/definitions/Uint64" + } + ] + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + }, + "Uint64": { + "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", + "type": "string" + }, + "VoteOption": { + "type": "string", + "enum": [ + "yes", + "no", + "abstain", + "no_with_veto" + ] + }, + "WasmMsg": { + "description": "The message types of the wasm module.\n\nSee https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto", + "oneOf": [ + { + "description": "Dispatches a call to another contract at a known address (with known ABI).\n\nThis is translated to a [MsgExecuteContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L68-L78). `sender` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "execute" + ], + "properties": { + "execute": { + "type": "object", + "required": [ + "contract_addr", + "funds", + "msg" + ], + "properties": { + "contract_addr": { + "type": "string" + }, + "funds": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "msg": { + "description": "msg is the json-encoded ExecuteMsg struct (as raw Binary)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.16.0-alpha1/x/wasm/internal/types/tx.proto#L47-L61). `sender` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "instantiate" + ], + "properties": { + "instantiate": { + "type": "object", + "required": [ + "code_id", + "funds", + "label", + "msg" + ], + "properties": { + "admin": { + "type": [ + "string", + "null" + ] + }, + "code_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "funds": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "label": { + "description": "A human-readbale label for the contract", + "type": "string" + }, + "msg": { + "description": "msg is the JSON-encoded InstantiateMsg struct (as raw Binary)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Migrates a given contracts to use new wasm code. Passes a MigrateMsg to allow us to customize behavior.\n\nOnly the contract admin (as defined in wasmd), if any, is able to make this call.\n\nThis is translated to a [MsgMigrateContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L86-L96). `sender` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "migrate" + ], + "properties": { + "migrate": { + "type": "object", + "required": [ + "contract_addr", + "msg", + "new_code_id" + ], + "properties": { + "contract_addr": { + "type": "string" + }, + "msg": { + "description": "msg is the json-encoded MigrateMsg struct that will be passed to the new code", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "new_code_id": { + "description": "the code_id of the new logic to place in the given contract", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Sets a new admin (for migrate) on the given contract. Fails if this contract is not currently admin of the target contract.", + "type": "object", + "required": [ + "update_admin" + ], + "properties": { + "update_admin": { + "type": "object", + "required": [ + "admin", + "contract_addr" + ], + "properties": { + "admin": { + "type": "string" + }, + "contract_addr": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Clears the admin on the given contract, so no more migration possible. Fails if this contract is not currently admin of the target contract.", + "type": "object", + "required": [ + "clear_admin" + ], + "properties": { + "clear_admin": { + "type": "object", + "required": [ + "contract_addr" + ], + "properties": { + "contract_addr": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + } + } +} diff --git a/contracts/ibc-reflect/schema/raw/instantiate.json b/contracts/ibc-reflect/schema/raw/instantiate.json new file mode 100644 index 0000000000..1320f1a0b9 --- /dev/null +++ b/contracts/ibc-reflect/schema/raw/instantiate.json @@ -0,0 +1,17 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "InstantiateMsg", + "description": "Just needs to know the code_id of a reflect contract to spawn sub-accounts", + "type": "object", + "required": [ + "reflect_code_id" + ], + "properties": { + "reflect_code_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + }, + "additionalProperties": false +} diff --git a/contracts/ibc-reflect/schema/raw/response_to_account.json b/contracts/ibc-reflect/schema/raw/response_to_account.json new file mode 100644 index 0000000000..84edc87b94 --- /dev/null +++ b/contracts/ibc-reflect/schema/raw/response_to_account.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "AccountResponse", + "type": "object", + "properties": { + "account": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false +} diff --git a/contracts/ibc-reflect/schema/raw/response_to_list_accounts.json b/contracts/ibc-reflect/schema/raw/response_to_list_accounts.json new file mode 100644 index 0000000000..22591bd068 --- /dev/null +++ b/contracts/ibc-reflect/schema/raw/response_to_list_accounts.json @@ -0,0 +1,35 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ListAccountsResponse", + "type": "object", + "required": [ + "accounts" + ], + "properties": { + "accounts": { + "type": "array", + "items": { + "$ref": "#/definitions/AccountInfo" + } + } + }, + "additionalProperties": false, + "definitions": { + "AccountInfo": { + "type": "object", + "required": [ + "account", + "channel_id" + ], + "properties": { + "account": { + "type": "string" + }, + "channel_id": { + "type": "string" + } + }, + "additionalProperties": false + } + } +} diff --git a/contracts/queue/schema/raw/execute.json b/contracts/queue/schema/raw/execute.json new file mode 100644 index 0000000000..1877209732 --- /dev/null +++ b/contracts/queue/schema/raw/execute.json @@ -0,0 +1,41 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "type": "object", + "required": [ + "enqueue" + ], + "properties": { + "enqueue": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "integer", + "format": "int32" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "dequeue" + ], + "properties": { + "dequeue": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/contracts/queue/schema/raw/instantiate.json b/contracts/queue/schema/raw/instantiate.json new file mode 100644 index 0000000000..1352613d57 --- /dev/null +++ b/contracts/queue/schema/raw/instantiate.json @@ -0,0 +1,6 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "InstantiateMsg", + "type": "object", + "additionalProperties": false +} diff --git a/contracts/queue/schema/raw/migrate.json b/contracts/queue/schema/raw/migrate.json new file mode 100644 index 0000000000..1877209732 --- /dev/null +++ b/contracts/queue/schema/raw/migrate.json @@ -0,0 +1,41 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "type": "object", + "required": [ + "enqueue" + ], + "properties": { + "enqueue": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "integer", + "format": "int32" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "dequeue" + ], + "properties": { + "dequeue": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/contracts/queue/schema/raw/query.json b/contracts/queue/schema/raw/query.json new file mode 100644 index 0000000000..1877209732 --- /dev/null +++ b/contracts/queue/schema/raw/query.json @@ -0,0 +1,41 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "type": "object", + "required": [ + "enqueue" + ], + "properties": { + "enqueue": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "integer", + "format": "int32" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "dequeue" + ], + "properties": { + "dequeue": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/contracts/queue/schema/raw/response_to_count.json b/contracts/queue/schema/raw/response_to_count.json new file mode 100644 index 0000000000..cf6f1c3cdd --- /dev/null +++ b/contracts/queue/schema/raw/response_to_count.json @@ -0,0 +1,16 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "CountResponse", + "type": "object", + "required": [ + "count" + ], + "properties": { + "count": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false +} diff --git a/contracts/queue/schema/raw/response_to_list.json b/contracts/queue/schema/raw/response_to_list.json new file mode 100644 index 0000000000..e4da637795 --- /dev/null +++ b/contracts/queue/schema/raw/response_to_list.json @@ -0,0 +1,40 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ListResponse", + "type": "object", + "required": [ + "early", + "empty", + "late" + ], + "properties": { + "early": { + "description": "List all IDs lower than 0x20", + "type": "array", + "items": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "empty": { + "description": "List an empty range, both bounded", + "type": "array", + "items": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "late": { + "description": "List all IDs starting from 0x20", + "type": "array", + "items": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + } + }, + "additionalProperties": false +} diff --git a/contracts/queue/schema/raw/response_to_open_iterators.json b/contracts/queue/schema/raw/response_to_open_iterators.json new file mode 100644 index 0000000000..ad4ff226d4 --- /dev/null +++ b/contracts/queue/schema/raw/response_to_open_iterators.json @@ -0,0 +1,6 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Empty", + "description": "An empty struct that serves as a placeholder in different places, such as contracts that don't set a custom message.\n\nIt is designed to be expressable in correct JSON and JSON Schema but contains no meaningful data. Previously we used enums without cases, but those cannot represented as valid JSON Schema (https://github.com/CosmWasm/cosmwasm/issues/451)", + "type": "object" +} diff --git a/contracts/queue/schema/raw/response_to_reducer.json b/contracts/queue/schema/raw/response_to_reducer.json new file mode 100644 index 0000000000..612b4029a8 --- /dev/null +++ b/contracts/queue/schema/raw/response_to_reducer.json @@ -0,0 +1,29 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ReducerResponse", + "type": "object", + "required": [ + "counters" + ], + "properties": { + "counters": { + "type": "array", + "items": { + "type": "array", + "items": [ + { + "type": "integer", + "format": "int32" + }, + { + "type": "integer", + "format": "int32" + } + ], + "maxItems": 2, + "minItems": 2 + } + } + }, + "additionalProperties": false +} diff --git a/contracts/queue/schema/raw/response_to_sum.json b/contracts/queue/schema/raw/response_to_sum.json new file mode 100644 index 0000000000..c8133fe4e0 --- /dev/null +++ b/contracts/queue/schema/raw/response_to_sum.json @@ -0,0 +1,15 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "SumResponse", + "type": "object", + "required": [ + "sum" + ], + "properties": { + "sum": { + "type": "integer", + "format": "int32" + } + }, + "additionalProperties": false +} diff --git a/contracts/queue/schema/raw/sudo.json b/contracts/queue/schema/raw/sudo.json new file mode 100644 index 0000000000..1877209732 --- /dev/null +++ b/contracts/queue/schema/raw/sudo.json @@ -0,0 +1,41 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "type": "object", + "required": [ + "enqueue" + ], + "properties": { + "enqueue": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "integer", + "format": "int32" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "dequeue" + ], + "properties": { + "dequeue": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/contracts/reflect/schema/raw/execute.json b/contracts/reflect/schema/raw/execute.json new file mode 100644 index 0000000000..e0db5ae603 --- /dev/null +++ b/contracts/reflect/schema/raw/execute.json @@ -0,0 +1,854 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "type": "object", + "required": [ + "reflect_msg" + ], + "properties": { + "reflect_msg": { + "type": "object", + "required": [ + "msgs" + ], + "properties": { + "msgs": { + "type": "array", + "items": { + "$ref": "#/definitions/CosmosMsg_for_CustomMsg" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "reflect_sub_msg" + ], + "properties": { + "reflect_sub_msg": { + "type": "object", + "required": [ + "msgs" + ], + "properties": { + "msgs": { + "type": "array", + "items": { + "$ref": "#/definitions/SubMsg_for_CustomMsg" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "change_owner" + ], + "properties": { + "change_owner": { + "type": "object", + "required": [ + "owner" + ], + "properties": { + "owner": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ], + "definitions": { + "BankMsg": { + "description": "The message types of the bank module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto", + "oneOf": [ + { + "description": "Sends native tokens from the contract to the given address.\n\nThis is translated to a [MsgSend](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto#L19-L28). `from_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "send" + ], + "properties": { + "send": { + "type": "object", + "required": [ + "amount", + "to_address" + ], + "properties": { + "amount": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "to_address": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This will burn the given coins from the contract's account. There is no Cosmos SDK message that performs this, but it can be done by calling the bank keeper. Important if a contract controls significant token supply that must be retired.", + "type": "object", + "required": [ + "burn" + ], + "properties": { + "burn": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + } + } + }, + "additionalProperties": false + } + ] + }, + "Binary": { + "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", + "type": "string" + }, + "Coin": { + "type": "object", + "required": [ + "amount", + "denom" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + } + } + }, + "CosmosMsg_for_CustomMsg": { + "oneOf": [ + { + "type": "object", + "required": [ + "bank" + ], + "properties": { + "bank": { + "$ref": "#/definitions/BankMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "custom" + ], + "properties": { + "custom": { + "$ref": "#/definitions/CustomMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "staking" + ], + "properties": { + "staking": { + "$ref": "#/definitions/StakingMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "distribution" + ], + "properties": { + "distribution": { + "$ref": "#/definitions/DistributionMsg" + } + }, + "additionalProperties": false + }, + { + "description": "A Stargate message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", + "type": "object", + "required": [ + "stargate" + ], + "properties": { + "stargate": { + "type": "object", + "required": [ + "type_url", + "value" + ], + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "$ref": "#/definitions/Binary" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "ibc" + ], + "properties": { + "ibc": { + "$ref": "#/definitions/IbcMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "wasm" + ], + "properties": { + "wasm": { + "$ref": "#/definitions/WasmMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "gov" + ], + "properties": { + "gov": { + "$ref": "#/definitions/GovMsg" + } + }, + "additionalProperties": false + } + ] + }, + "CustomMsg": { + "description": "CustomMsg is an override of CosmosMsg::Custom to show this works and can be extended in the contract", + "oneOf": [ + { + "type": "object", + "required": [ + "debug" + ], + "properties": { + "debug": { + "type": "string" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "raw" + ], + "properties": { + "raw": { + "$ref": "#/definitions/Binary" + } + }, + "additionalProperties": false + } + ] + }, + "DistributionMsg": { + "description": "The message types of the distribution module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto", + "oneOf": [ + { + "description": "This is translated to a [MsgSetWithdrawAddress](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#L29-L37). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "set_withdraw_address" + ], + "properties": { + "set_withdraw_address": { + "type": "object", + "required": [ + "address" + ], + "properties": { + "address": { + "description": "The `withdraw_address`", + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This is translated to a [[MsgWithdrawDelegatorReward](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#L42-L50). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "withdraw_delegator_reward" + ], + "properties": { + "withdraw_delegator_reward": { + "type": "object", + "required": [ + "validator" + ], + "properties": { + "validator": { + "description": "The `validator_address`", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "GovMsg": { + "oneOf": [ + { + "description": "This maps directly to [MsgVote](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/gov/v1beta1/tx.proto#L46-L56) in the Cosmos SDK with voter set to the contract address.", + "type": "object", + "required": [ + "vote" + ], + "properties": { + "vote": { + "type": "object", + "required": [ + "proposal_id", + "vote" + ], + "properties": { + "proposal_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "vote": { + "$ref": "#/definitions/VoteOption" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "IbcMsg": { + "description": "These are messages in the IBC lifecycle. Only usable by IBC-enabled contracts (contracts that directly speak the IBC protocol via 6 entry points)", + "oneOf": [ + { + "description": "Sends bank tokens owned by the contract to the given address on another chain. The channel must already be established between the ibctransfer module on this chain and a matching module on the remote chain. We cannot select the port_id, this is whatever the local chain has bound the ibctransfer module to.", + "type": "object", + "required": [ + "transfer" + ], + "properties": { + "transfer": { + "type": "object", + "required": [ + "amount", + "channel_id", + "timeout", + "to_address" + ], + "properties": { + "amount": { + "description": "packet data only supports one coin https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/ibc/applications/transfer/v1/transfer.proto#L11-L20", + "allOf": [ + { + "$ref": "#/definitions/Coin" + } + ] + }, + "channel_id": { + "description": "exisiting channel to send the tokens over", + "type": "string" + }, + "timeout": { + "description": "when packet times out, measured on remote chain", + "allOf": [ + { + "$ref": "#/definitions/IbcTimeout" + } + ] + }, + "to_address": { + "description": "address on the remote chain to receive these tokens", + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Sends an IBC packet with given data over the existing channel. Data should be encoded in a format defined by the channel version, and the module on the other side should know how to parse this.", + "type": "object", + "required": [ + "send_packet" + ], + "properties": { + "send_packet": { + "type": "object", + "required": [ + "channel_id", + "data", + "timeout" + ], + "properties": { + "channel_id": { + "type": "string" + }, + "data": { + "$ref": "#/definitions/Binary" + }, + "timeout": { + "description": "when packet times out, measured on remote chain", + "allOf": [ + { + "$ref": "#/definitions/IbcTimeout" + } + ] + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This will close an existing channel that is owned by this contract. Port is auto-assigned to the contract's IBC port", + "type": "object", + "required": [ + "close_channel" + ], + "properties": { + "close_channel": { + "type": "object", + "required": [ + "channel_id" + ], + "properties": { + "channel_id": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "IbcTimeout": { + "description": "In IBC each package must set at least one type of timeout: the timestamp or the block height. Using this rather complex enum instead of two timeout fields we ensure that at least one timeout is set.", + "type": "object", + "properties": { + "block": { + "anyOf": [ + { + "$ref": "#/definitions/IbcTimeoutBlock" + }, + { + "type": "null" + } + ] + }, + "timestamp": { + "anyOf": [ + { + "$ref": "#/definitions/Timestamp" + }, + { + "type": "null" + } + ] + } + } + }, + "IbcTimeoutBlock": { + "description": "IBCTimeoutHeight Height is a monotonically increasing data type that can be compared against another Height for the purposes of updating and freezing clients. Ordering is (revision_number, timeout_height)", + "type": "object", + "required": [ + "height", + "revision" + ], + "properties": { + "height": { + "description": "block height after which the packet times out. the height within the given revision", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "revision": { + "description": "the version that the client is currently on (eg. after reseting the chain this could increment 1 as height drops to 0)", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + } + }, + "ReplyOn": { + "description": "Use this to define when the contract gets a response callback. If you only need it for errors or success you can select just those in order to save gas.", + "type": "string", + "enum": [ + "always", + "error", + "success", + "never" + ] + }, + "StakingMsg": { + "description": "The message types of the staking module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto", + "oneOf": [ + { + "description": "This is translated to a [MsgDelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L81-L90). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "delegate" + ], + "properties": { + "delegate": { + "type": "object", + "required": [ + "amount", + "validator" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Coin" + }, + "validator": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This is translated to a [MsgUndelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L112-L121). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "undelegate" + ], + "properties": { + "undelegate": { + "type": "object", + "required": [ + "amount", + "validator" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Coin" + }, + "validator": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This is translated to a [MsgBeginRedelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L95-L105). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "redelegate" + ], + "properties": { + "redelegate": { + "type": "object", + "required": [ + "amount", + "dst_validator", + "src_validator" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Coin" + }, + "dst_validator": { + "type": "string" + }, + "src_validator": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "SubMsg_for_CustomMsg": { + "description": "A submessage that will guarantee a `reply` call on success or error, depending on the `reply_on` setting. If you do not need to process the result, use regular messages instead.\n\nNote: On error the submessage execution will revert any partial state changes due to this message, but not revert any state changes in the calling contract. If this is required, it must be done manually in the `reply` entry point.", + "type": "object", + "required": [ + "id", + "msg", + "reply_on" + ], + "properties": { + "gas_limit": { + "description": "Gas limit measured in [Cosmos SDK gas](https://github.com/CosmWasm/cosmwasm/blob/main/docs/GAS.md).", + "type": [ + "integer", + "null" + ], + "format": "uint64", + "minimum": 0.0 + }, + "id": { + "description": "An arbitrary ID chosen by the contract. This is typically used to match `Reply`s in the `reply` entry point to the submessage.", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "msg": { + "$ref": "#/definitions/CosmosMsg_for_CustomMsg" + }, + "reply_on": { + "$ref": "#/definitions/ReplyOn" + } + } + }, + "Timestamp": { + "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", + "allOf": [ + { + "$ref": "#/definitions/Uint64" + } + ] + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + }, + "Uint64": { + "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", + "type": "string" + }, + "VoteOption": { + "type": "string", + "enum": [ + "yes", + "no", + "abstain", + "no_with_veto" + ] + }, + "WasmMsg": { + "description": "The message types of the wasm module.\n\nSee https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto", + "oneOf": [ + { + "description": "Dispatches a call to another contract at a known address (with known ABI).\n\nThis is translated to a [MsgExecuteContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L68-L78). `sender` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "execute" + ], + "properties": { + "execute": { + "type": "object", + "required": [ + "contract_addr", + "funds", + "msg" + ], + "properties": { + "contract_addr": { + "type": "string" + }, + "funds": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "msg": { + "description": "msg is the json-encoded ExecuteMsg struct (as raw Binary)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.16.0-alpha1/x/wasm/internal/types/tx.proto#L47-L61). `sender` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "instantiate" + ], + "properties": { + "instantiate": { + "type": "object", + "required": [ + "code_id", + "funds", + "label", + "msg" + ], + "properties": { + "admin": { + "type": [ + "string", + "null" + ] + }, + "code_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "funds": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "label": { + "description": "A human-readbale label for the contract", + "type": "string" + }, + "msg": { + "description": "msg is the JSON-encoded InstantiateMsg struct (as raw Binary)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Migrates a given contracts to use new wasm code. Passes a MigrateMsg to allow us to customize behavior.\n\nOnly the contract admin (as defined in wasmd), if any, is able to make this call.\n\nThis is translated to a [MsgMigrateContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L86-L96). `sender` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "migrate" + ], + "properties": { + "migrate": { + "type": "object", + "required": [ + "contract_addr", + "msg", + "new_code_id" + ], + "properties": { + "contract_addr": { + "type": "string" + }, + "msg": { + "description": "msg is the json-encoded MigrateMsg struct that will be passed to the new code", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "new_code_id": { + "description": "the code_id of the new logic to place in the given contract", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Sets a new admin (for migrate) on the given contract. Fails if this contract is not currently admin of the target contract.", + "type": "object", + "required": [ + "update_admin" + ], + "properties": { + "update_admin": { + "type": "object", + "required": [ + "admin", + "contract_addr" + ], + "properties": { + "admin": { + "type": "string" + }, + "contract_addr": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Clears the admin on the given contract, so no more migration possible. Fails if this contract is not currently admin of the target contract.", + "type": "object", + "required": [ + "clear_admin" + ], + "properties": { + "clear_admin": { + "type": "object", + "required": [ + "contract_addr" + ], + "properties": { + "contract_addr": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + } + } +} diff --git a/contracts/reflect/schema/raw/instantiate.json b/contracts/reflect/schema/raw/instantiate.json new file mode 100644 index 0000000000..1352613d57 --- /dev/null +++ b/contracts/reflect/schema/raw/instantiate.json @@ -0,0 +1,6 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "InstantiateMsg", + "type": "object", + "additionalProperties": false +} diff --git a/contracts/reflect/schema/raw/migrate.json b/contracts/reflect/schema/raw/migrate.json new file mode 100644 index 0000000000..e0db5ae603 --- /dev/null +++ b/contracts/reflect/schema/raw/migrate.json @@ -0,0 +1,854 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "type": "object", + "required": [ + "reflect_msg" + ], + "properties": { + "reflect_msg": { + "type": "object", + "required": [ + "msgs" + ], + "properties": { + "msgs": { + "type": "array", + "items": { + "$ref": "#/definitions/CosmosMsg_for_CustomMsg" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "reflect_sub_msg" + ], + "properties": { + "reflect_sub_msg": { + "type": "object", + "required": [ + "msgs" + ], + "properties": { + "msgs": { + "type": "array", + "items": { + "$ref": "#/definitions/SubMsg_for_CustomMsg" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "change_owner" + ], + "properties": { + "change_owner": { + "type": "object", + "required": [ + "owner" + ], + "properties": { + "owner": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ], + "definitions": { + "BankMsg": { + "description": "The message types of the bank module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto", + "oneOf": [ + { + "description": "Sends native tokens from the contract to the given address.\n\nThis is translated to a [MsgSend](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto#L19-L28). `from_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "send" + ], + "properties": { + "send": { + "type": "object", + "required": [ + "amount", + "to_address" + ], + "properties": { + "amount": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "to_address": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This will burn the given coins from the contract's account. There is no Cosmos SDK message that performs this, but it can be done by calling the bank keeper. Important if a contract controls significant token supply that must be retired.", + "type": "object", + "required": [ + "burn" + ], + "properties": { + "burn": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + } + } + }, + "additionalProperties": false + } + ] + }, + "Binary": { + "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", + "type": "string" + }, + "Coin": { + "type": "object", + "required": [ + "amount", + "denom" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + } + } + }, + "CosmosMsg_for_CustomMsg": { + "oneOf": [ + { + "type": "object", + "required": [ + "bank" + ], + "properties": { + "bank": { + "$ref": "#/definitions/BankMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "custom" + ], + "properties": { + "custom": { + "$ref": "#/definitions/CustomMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "staking" + ], + "properties": { + "staking": { + "$ref": "#/definitions/StakingMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "distribution" + ], + "properties": { + "distribution": { + "$ref": "#/definitions/DistributionMsg" + } + }, + "additionalProperties": false + }, + { + "description": "A Stargate message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", + "type": "object", + "required": [ + "stargate" + ], + "properties": { + "stargate": { + "type": "object", + "required": [ + "type_url", + "value" + ], + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "$ref": "#/definitions/Binary" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "ibc" + ], + "properties": { + "ibc": { + "$ref": "#/definitions/IbcMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "wasm" + ], + "properties": { + "wasm": { + "$ref": "#/definitions/WasmMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "gov" + ], + "properties": { + "gov": { + "$ref": "#/definitions/GovMsg" + } + }, + "additionalProperties": false + } + ] + }, + "CustomMsg": { + "description": "CustomMsg is an override of CosmosMsg::Custom to show this works and can be extended in the contract", + "oneOf": [ + { + "type": "object", + "required": [ + "debug" + ], + "properties": { + "debug": { + "type": "string" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "raw" + ], + "properties": { + "raw": { + "$ref": "#/definitions/Binary" + } + }, + "additionalProperties": false + } + ] + }, + "DistributionMsg": { + "description": "The message types of the distribution module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto", + "oneOf": [ + { + "description": "This is translated to a [MsgSetWithdrawAddress](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#L29-L37). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "set_withdraw_address" + ], + "properties": { + "set_withdraw_address": { + "type": "object", + "required": [ + "address" + ], + "properties": { + "address": { + "description": "The `withdraw_address`", + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This is translated to a [[MsgWithdrawDelegatorReward](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#L42-L50). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "withdraw_delegator_reward" + ], + "properties": { + "withdraw_delegator_reward": { + "type": "object", + "required": [ + "validator" + ], + "properties": { + "validator": { + "description": "The `validator_address`", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "GovMsg": { + "oneOf": [ + { + "description": "This maps directly to [MsgVote](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/gov/v1beta1/tx.proto#L46-L56) in the Cosmos SDK with voter set to the contract address.", + "type": "object", + "required": [ + "vote" + ], + "properties": { + "vote": { + "type": "object", + "required": [ + "proposal_id", + "vote" + ], + "properties": { + "proposal_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "vote": { + "$ref": "#/definitions/VoteOption" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "IbcMsg": { + "description": "These are messages in the IBC lifecycle. Only usable by IBC-enabled contracts (contracts that directly speak the IBC protocol via 6 entry points)", + "oneOf": [ + { + "description": "Sends bank tokens owned by the contract to the given address on another chain. The channel must already be established between the ibctransfer module on this chain and a matching module on the remote chain. We cannot select the port_id, this is whatever the local chain has bound the ibctransfer module to.", + "type": "object", + "required": [ + "transfer" + ], + "properties": { + "transfer": { + "type": "object", + "required": [ + "amount", + "channel_id", + "timeout", + "to_address" + ], + "properties": { + "amount": { + "description": "packet data only supports one coin https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/ibc/applications/transfer/v1/transfer.proto#L11-L20", + "allOf": [ + { + "$ref": "#/definitions/Coin" + } + ] + }, + "channel_id": { + "description": "exisiting channel to send the tokens over", + "type": "string" + }, + "timeout": { + "description": "when packet times out, measured on remote chain", + "allOf": [ + { + "$ref": "#/definitions/IbcTimeout" + } + ] + }, + "to_address": { + "description": "address on the remote chain to receive these tokens", + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Sends an IBC packet with given data over the existing channel. Data should be encoded in a format defined by the channel version, and the module on the other side should know how to parse this.", + "type": "object", + "required": [ + "send_packet" + ], + "properties": { + "send_packet": { + "type": "object", + "required": [ + "channel_id", + "data", + "timeout" + ], + "properties": { + "channel_id": { + "type": "string" + }, + "data": { + "$ref": "#/definitions/Binary" + }, + "timeout": { + "description": "when packet times out, measured on remote chain", + "allOf": [ + { + "$ref": "#/definitions/IbcTimeout" + } + ] + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This will close an existing channel that is owned by this contract. Port is auto-assigned to the contract's IBC port", + "type": "object", + "required": [ + "close_channel" + ], + "properties": { + "close_channel": { + "type": "object", + "required": [ + "channel_id" + ], + "properties": { + "channel_id": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "IbcTimeout": { + "description": "In IBC each package must set at least one type of timeout: the timestamp or the block height. Using this rather complex enum instead of two timeout fields we ensure that at least one timeout is set.", + "type": "object", + "properties": { + "block": { + "anyOf": [ + { + "$ref": "#/definitions/IbcTimeoutBlock" + }, + { + "type": "null" + } + ] + }, + "timestamp": { + "anyOf": [ + { + "$ref": "#/definitions/Timestamp" + }, + { + "type": "null" + } + ] + } + } + }, + "IbcTimeoutBlock": { + "description": "IBCTimeoutHeight Height is a monotonically increasing data type that can be compared against another Height for the purposes of updating and freezing clients. Ordering is (revision_number, timeout_height)", + "type": "object", + "required": [ + "height", + "revision" + ], + "properties": { + "height": { + "description": "block height after which the packet times out. the height within the given revision", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "revision": { + "description": "the version that the client is currently on (eg. after reseting the chain this could increment 1 as height drops to 0)", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + } + }, + "ReplyOn": { + "description": "Use this to define when the contract gets a response callback. If you only need it for errors or success you can select just those in order to save gas.", + "type": "string", + "enum": [ + "always", + "error", + "success", + "never" + ] + }, + "StakingMsg": { + "description": "The message types of the staking module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto", + "oneOf": [ + { + "description": "This is translated to a [MsgDelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L81-L90). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "delegate" + ], + "properties": { + "delegate": { + "type": "object", + "required": [ + "amount", + "validator" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Coin" + }, + "validator": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This is translated to a [MsgUndelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L112-L121). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "undelegate" + ], + "properties": { + "undelegate": { + "type": "object", + "required": [ + "amount", + "validator" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Coin" + }, + "validator": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This is translated to a [MsgBeginRedelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L95-L105). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "redelegate" + ], + "properties": { + "redelegate": { + "type": "object", + "required": [ + "amount", + "dst_validator", + "src_validator" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Coin" + }, + "dst_validator": { + "type": "string" + }, + "src_validator": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "SubMsg_for_CustomMsg": { + "description": "A submessage that will guarantee a `reply` call on success or error, depending on the `reply_on` setting. If you do not need to process the result, use regular messages instead.\n\nNote: On error the submessage execution will revert any partial state changes due to this message, but not revert any state changes in the calling contract. If this is required, it must be done manually in the `reply` entry point.", + "type": "object", + "required": [ + "id", + "msg", + "reply_on" + ], + "properties": { + "gas_limit": { + "description": "Gas limit measured in [Cosmos SDK gas](https://github.com/CosmWasm/cosmwasm/blob/main/docs/GAS.md).", + "type": [ + "integer", + "null" + ], + "format": "uint64", + "minimum": 0.0 + }, + "id": { + "description": "An arbitrary ID chosen by the contract. This is typically used to match `Reply`s in the `reply` entry point to the submessage.", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "msg": { + "$ref": "#/definitions/CosmosMsg_for_CustomMsg" + }, + "reply_on": { + "$ref": "#/definitions/ReplyOn" + } + } + }, + "Timestamp": { + "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", + "allOf": [ + { + "$ref": "#/definitions/Uint64" + } + ] + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + }, + "Uint64": { + "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", + "type": "string" + }, + "VoteOption": { + "type": "string", + "enum": [ + "yes", + "no", + "abstain", + "no_with_veto" + ] + }, + "WasmMsg": { + "description": "The message types of the wasm module.\n\nSee https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto", + "oneOf": [ + { + "description": "Dispatches a call to another contract at a known address (with known ABI).\n\nThis is translated to a [MsgExecuteContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L68-L78). `sender` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "execute" + ], + "properties": { + "execute": { + "type": "object", + "required": [ + "contract_addr", + "funds", + "msg" + ], + "properties": { + "contract_addr": { + "type": "string" + }, + "funds": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "msg": { + "description": "msg is the json-encoded ExecuteMsg struct (as raw Binary)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.16.0-alpha1/x/wasm/internal/types/tx.proto#L47-L61). `sender` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "instantiate" + ], + "properties": { + "instantiate": { + "type": "object", + "required": [ + "code_id", + "funds", + "label", + "msg" + ], + "properties": { + "admin": { + "type": [ + "string", + "null" + ] + }, + "code_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "funds": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "label": { + "description": "A human-readbale label for the contract", + "type": "string" + }, + "msg": { + "description": "msg is the JSON-encoded InstantiateMsg struct (as raw Binary)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Migrates a given contracts to use new wasm code. Passes a MigrateMsg to allow us to customize behavior.\n\nOnly the contract admin (as defined in wasmd), if any, is able to make this call.\n\nThis is translated to a [MsgMigrateContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L86-L96). `sender` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "migrate" + ], + "properties": { + "migrate": { + "type": "object", + "required": [ + "contract_addr", + "msg", + "new_code_id" + ], + "properties": { + "contract_addr": { + "type": "string" + }, + "msg": { + "description": "msg is the json-encoded MigrateMsg struct that will be passed to the new code", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "new_code_id": { + "description": "the code_id of the new logic to place in the given contract", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Sets a new admin (for migrate) on the given contract. Fails if this contract is not currently admin of the target contract.", + "type": "object", + "required": [ + "update_admin" + ], + "properties": { + "update_admin": { + "type": "object", + "required": [ + "admin", + "contract_addr" + ], + "properties": { + "admin": { + "type": "string" + }, + "contract_addr": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Clears the admin on the given contract, so no more migration possible. Fails if this contract is not currently admin of the target contract.", + "type": "object", + "required": [ + "clear_admin" + ], + "properties": { + "clear_admin": { + "type": "object", + "required": [ + "contract_addr" + ], + "properties": { + "contract_addr": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + } + } +} diff --git a/contracts/reflect/schema/raw/query.json b/contracts/reflect/schema/raw/query.json new file mode 100644 index 0000000000..e0db5ae603 --- /dev/null +++ b/contracts/reflect/schema/raw/query.json @@ -0,0 +1,854 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "type": "object", + "required": [ + "reflect_msg" + ], + "properties": { + "reflect_msg": { + "type": "object", + "required": [ + "msgs" + ], + "properties": { + "msgs": { + "type": "array", + "items": { + "$ref": "#/definitions/CosmosMsg_for_CustomMsg" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "reflect_sub_msg" + ], + "properties": { + "reflect_sub_msg": { + "type": "object", + "required": [ + "msgs" + ], + "properties": { + "msgs": { + "type": "array", + "items": { + "$ref": "#/definitions/SubMsg_for_CustomMsg" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "change_owner" + ], + "properties": { + "change_owner": { + "type": "object", + "required": [ + "owner" + ], + "properties": { + "owner": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ], + "definitions": { + "BankMsg": { + "description": "The message types of the bank module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto", + "oneOf": [ + { + "description": "Sends native tokens from the contract to the given address.\n\nThis is translated to a [MsgSend](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto#L19-L28). `from_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "send" + ], + "properties": { + "send": { + "type": "object", + "required": [ + "amount", + "to_address" + ], + "properties": { + "amount": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "to_address": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This will burn the given coins from the contract's account. There is no Cosmos SDK message that performs this, but it can be done by calling the bank keeper. Important if a contract controls significant token supply that must be retired.", + "type": "object", + "required": [ + "burn" + ], + "properties": { + "burn": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + } + } + }, + "additionalProperties": false + } + ] + }, + "Binary": { + "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", + "type": "string" + }, + "Coin": { + "type": "object", + "required": [ + "amount", + "denom" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + } + } + }, + "CosmosMsg_for_CustomMsg": { + "oneOf": [ + { + "type": "object", + "required": [ + "bank" + ], + "properties": { + "bank": { + "$ref": "#/definitions/BankMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "custom" + ], + "properties": { + "custom": { + "$ref": "#/definitions/CustomMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "staking" + ], + "properties": { + "staking": { + "$ref": "#/definitions/StakingMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "distribution" + ], + "properties": { + "distribution": { + "$ref": "#/definitions/DistributionMsg" + } + }, + "additionalProperties": false + }, + { + "description": "A Stargate message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", + "type": "object", + "required": [ + "stargate" + ], + "properties": { + "stargate": { + "type": "object", + "required": [ + "type_url", + "value" + ], + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "$ref": "#/definitions/Binary" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "ibc" + ], + "properties": { + "ibc": { + "$ref": "#/definitions/IbcMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "wasm" + ], + "properties": { + "wasm": { + "$ref": "#/definitions/WasmMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "gov" + ], + "properties": { + "gov": { + "$ref": "#/definitions/GovMsg" + } + }, + "additionalProperties": false + } + ] + }, + "CustomMsg": { + "description": "CustomMsg is an override of CosmosMsg::Custom to show this works and can be extended in the contract", + "oneOf": [ + { + "type": "object", + "required": [ + "debug" + ], + "properties": { + "debug": { + "type": "string" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "raw" + ], + "properties": { + "raw": { + "$ref": "#/definitions/Binary" + } + }, + "additionalProperties": false + } + ] + }, + "DistributionMsg": { + "description": "The message types of the distribution module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto", + "oneOf": [ + { + "description": "This is translated to a [MsgSetWithdrawAddress](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#L29-L37). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "set_withdraw_address" + ], + "properties": { + "set_withdraw_address": { + "type": "object", + "required": [ + "address" + ], + "properties": { + "address": { + "description": "The `withdraw_address`", + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This is translated to a [[MsgWithdrawDelegatorReward](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#L42-L50). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "withdraw_delegator_reward" + ], + "properties": { + "withdraw_delegator_reward": { + "type": "object", + "required": [ + "validator" + ], + "properties": { + "validator": { + "description": "The `validator_address`", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "GovMsg": { + "oneOf": [ + { + "description": "This maps directly to [MsgVote](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/gov/v1beta1/tx.proto#L46-L56) in the Cosmos SDK with voter set to the contract address.", + "type": "object", + "required": [ + "vote" + ], + "properties": { + "vote": { + "type": "object", + "required": [ + "proposal_id", + "vote" + ], + "properties": { + "proposal_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "vote": { + "$ref": "#/definitions/VoteOption" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "IbcMsg": { + "description": "These are messages in the IBC lifecycle. Only usable by IBC-enabled contracts (contracts that directly speak the IBC protocol via 6 entry points)", + "oneOf": [ + { + "description": "Sends bank tokens owned by the contract to the given address on another chain. The channel must already be established between the ibctransfer module on this chain and a matching module on the remote chain. We cannot select the port_id, this is whatever the local chain has bound the ibctransfer module to.", + "type": "object", + "required": [ + "transfer" + ], + "properties": { + "transfer": { + "type": "object", + "required": [ + "amount", + "channel_id", + "timeout", + "to_address" + ], + "properties": { + "amount": { + "description": "packet data only supports one coin https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/ibc/applications/transfer/v1/transfer.proto#L11-L20", + "allOf": [ + { + "$ref": "#/definitions/Coin" + } + ] + }, + "channel_id": { + "description": "exisiting channel to send the tokens over", + "type": "string" + }, + "timeout": { + "description": "when packet times out, measured on remote chain", + "allOf": [ + { + "$ref": "#/definitions/IbcTimeout" + } + ] + }, + "to_address": { + "description": "address on the remote chain to receive these tokens", + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Sends an IBC packet with given data over the existing channel. Data should be encoded in a format defined by the channel version, and the module on the other side should know how to parse this.", + "type": "object", + "required": [ + "send_packet" + ], + "properties": { + "send_packet": { + "type": "object", + "required": [ + "channel_id", + "data", + "timeout" + ], + "properties": { + "channel_id": { + "type": "string" + }, + "data": { + "$ref": "#/definitions/Binary" + }, + "timeout": { + "description": "when packet times out, measured on remote chain", + "allOf": [ + { + "$ref": "#/definitions/IbcTimeout" + } + ] + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This will close an existing channel that is owned by this contract. Port is auto-assigned to the contract's IBC port", + "type": "object", + "required": [ + "close_channel" + ], + "properties": { + "close_channel": { + "type": "object", + "required": [ + "channel_id" + ], + "properties": { + "channel_id": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "IbcTimeout": { + "description": "In IBC each package must set at least one type of timeout: the timestamp or the block height. Using this rather complex enum instead of two timeout fields we ensure that at least one timeout is set.", + "type": "object", + "properties": { + "block": { + "anyOf": [ + { + "$ref": "#/definitions/IbcTimeoutBlock" + }, + { + "type": "null" + } + ] + }, + "timestamp": { + "anyOf": [ + { + "$ref": "#/definitions/Timestamp" + }, + { + "type": "null" + } + ] + } + } + }, + "IbcTimeoutBlock": { + "description": "IBCTimeoutHeight Height is a monotonically increasing data type that can be compared against another Height for the purposes of updating and freezing clients. Ordering is (revision_number, timeout_height)", + "type": "object", + "required": [ + "height", + "revision" + ], + "properties": { + "height": { + "description": "block height after which the packet times out. the height within the given revision", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "revision": { + "description": "the version that the client is currently on (eg. after reseting the chain this could increment 1 as height drops to 0)", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + } + }, + "ReplyOn": { + "description": "Use this to define when the contract gets a response callback. If you only need it for errors or success you can select just those in order to save gas.", + "type": "string", + "enum": [ + "always", + "error", + "success", + "never" + ] + }, + "StakingMsg": { + "description": "The message types of the staking module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto", + "oneOf": [ + { + "description": "This is translated to a [MsgDelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L81-L90). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "delegate" + ], + "properties": { + "delegate": { + "type": "object", + "required": [ + "amount", + "validator" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Coin" + }, + "validator": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This is translated to a [MsgUndelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L112-L121). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "undelegate" + ], + "properties": { + "undelegate": { + "type": "object", + "required": [ + "amount", + "validator" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Coin" + }, + "validator": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This is translated to a [MsgBeginRedelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L95-L105). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "redelegate" + ], + "properties": { + "redelegate": { + "type": "object", + "required": [ + "amount", + "dst_validator", + "src_validator" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Coin" + }, + "dst_validator": { + "type": "string" + }, + "src_validator": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "SubMsg_for_CustomMsg": { + "description": "A submessage that will guarantee a `reply` call on success or error, depending on the `reply_on` setting. If you do not need to process the result, use regular messages instead.\n\nNote: On error the submessage execution will revert any partial state changes due to this message, but not revert any state changes in the calling contract. If this is required, it must be done manually in the `reply` entry point.", + "type": "object", + "required": [ + "id", + "msg", + "reply_on" + ], + "properties": { + "gas_limit": { + "description": "Gas limit measured in [Cosmos SDK gas](https://github.com/CosmWasm/cosmwasm/blob/main/docs/GAS.md).", + "type": [ + "integer", + "null" + ], + "format": "uint64", + "minimum": 0.0 + }, + "id": { + "description": "An arbitrary ID chosen by the contract. This is typically used to match `Reply`s in the `reply` entry point to the submessage.", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "msg": { + "$ref": "#/definitions/CosmosMsg_for_CustomMsg" + }, + "reply_on": { + "$ref": "#/definitions/ReplyOn" + } + } + }, + "Timestamp": { + "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", + "allOf": [ + { + "$ref": "#/definitions/Uint64" + } + ] + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + }, + "Uint64": { + "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", + "type": "string" + }, + "VoteOption": { + "type": "string", + "enum": [ + "yes", + "no", + "abstain", + "no_with_veto" + ] + }, + "WasmMsg": { + "description": "The message types of the wasm module.\n\nSee https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto", + "oneOf": [ + { + "description": "Dispatches a call to another contract at a known address (with known ABI).\n\nThis is translated to a [MsgExecuteContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L68-L78). `sender` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "execute" + ], + "properties": { + "execute": { + "type": "object", + "required": [ + "contract_addr", + "funds", + "msg" + ], + "properties": { + "contract_addr": { + "type": "string" + }, + "funds": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "msg": { + "description": "msg is the json-encoded ExecuteMsg struct (as raw Binary)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.16.0-alpha1/x/wasm/internal/types/tx.proto#L47-L61). `sender` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "instantiate" + ], + "properties": { + "instantiate": { + "type": "object", + "required": [ + "code_id", + "funds", + "label", + "msg" + ], + "properties": { + "admin": { + "type": [ + "string", + "null" + ] + }, + "code_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "funds": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "label": { + "description": "A human-readbale label for the contract", + "type": "string" + }, + "msg": { + "description": "msg is the JSON-encoded InstantiateMsg struct (as raw Binary)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Migrates a given contracts to use new wasm code. Passes a MigrateMsg to allow us to customize behavior.\n\nOnly the contract admin (as defined in wasmd), if any, is able to make this call.\n\nThis is translated to a [MsgMigrateContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L86-L96). `sender` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "migrate" + ], + "properties": { + "migrate": { + "type": "object", + "required": [ + "contract_addr", + "msg", + "new_code_id" + ], + "properties": { + "contract_addr": { + "type": "string" + }, + "msg": { + "description": "msg is the json-encoded MigrateMsg struct that will be passed to the new code", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "new_code_id": { + "description": "the code_id of the new logic to place in the given contract", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Sets a new admin (for migrate) on the given contract. Fails if this contract is not currently admin of the target contract.", + "type": "object", + "required": [ + "update_admin" + ], + "properties": { + "update_admin": { + "type": "object", + "required": [ + "admin", + "contract_addr" + ], + "properties": { + "admin": { + "type": "string" + }, + "contract_addr": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Clears the admin on the given contract, so no more migration possible. Fails if this contract is not currently admin of the target contract.", + "type": "object", + "required": [ + "clear_admin" + ], + "properties": { + "clear_admin": { + "type": "object", + "required": [ + "contract_addr" + ], + "properties": { + "contract_addr": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + } + } +} diff --git a/contracts/reflect/schema/raw/response_to_capitalized.json b/contracts/reflect/schema/raw/response_to_capitalized.json new file mode 100644 index 0000000000..543a4fa4c4 --- /dev/null +++ b/contracts/reflect/schema/raw/response_to_capitalized.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "CapitalizedResponse", + "type": "object", + "required": [ + "text" + ], + "properties": { + "text": { + "type": "string" + } + }, + "additionalProperties": false +} diff --git a/contracts/reflect/schema/raw/response_to_chain.json b/contracts/reflect/schema/raw/response_to_chain.json new file mode 100644 index 0000000000..aa0adb0fc6 --- /dev/null +++ b/contracts/reflect/schema/raw/response_to_chain.json @@ -0,0 +1,20 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ChainResponse", + "type": "object", + "required": [ + "data" + ], + "properties": { + "data": { + "$ref": "#/definitions/Binary" + } + }, + "additionalProperties": false, + "definitions": { + "Binary": { + "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", + "type": "string" + } + } +} diff --git a/contracts/reflect/schema/raw/response_to_owner.json b/contracts/reflect/schema/raw/response_to_owner.json new file mode 100644 index 0000000000..d91dde1494 --- /dev/null +++ b/contracts/reflect/schema/raw/response_to_owner.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "OwnerResponse", + "type": "object", + "required": [ + "owner" + ], + "properties": { + "owner": { + "type": "string" + } + }, + "additionalProperties": false +} diff --git a/contracts/reflect/schema/raw/response_to_raw.json b/contracts/reflect/schema/raw/response_to_raw.json new file mode 100644 index 0000000000..85774defd5 --- /dev/null +++ b/contracts/reflect/schema/raw/response_to_raw.json @@ -0,0 +1,25 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "RawResponse", + "type": "object", + "required": [ + "data" + ], + "properties": { + "data": { + "description": "The returned value of the raw query. Empty data can be the result of a non-existent key or an empty value. We cannot differentiate those two cases in cross contract queries.", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + }, + "additionalProperties": false, + "definitions": { + "Binary": { + "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", + "type": "string" + } + } +} diff --git a/contracts/reflect/schema/raw/response_to_sub_msg_result.json b/contracts/reflect/schema/raw/response_to_sub_msg_result.json new file mode 100644 index 0000000000..e7a26e26fb --- /dev/null +++ b/contracts/reflect/schema/raw/response_to_sub_msg_result.json @@ -0,0 +1,119 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reply", + "description": "The result object returned to `reply`. We always get the ID from the submessage back and then must handle success and error cases ourselves.", + "type": "object", + "required": [ + "id", + "result" + ], + "properties": { + "id": { + "description": "The ID that the contract set when emitting the `SubMsg`. Use this to identify which submessage triggered the `reply`.", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "result": { + "$ref": "#/definitions/SubMsgResult" + } + }, + "definitions": { + "Attribute": { + "description": "An key value pair that is used in the context of event attributes in logs", + "type": "object", + "required": [ + "key", + "value" + ], + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, + "Binary": { + "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", + "type": "string" + }, + "Event": { + "description": "A full [*Cosmos SDK* event].\n\nThis version uses string attributes (similar to [*Cosmos SDK* StringEvent]), which then get magically converted to bytes for Tendermint somewhere between the Rust-Go interface, JSON deserialization and the `NewEvent` call in Cosmos SDK.\n\n[*Cosmos SDK* event]: https://docs.cosmos.network/main/core/events.html [*Cosmos SDK* StringEvent]: https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/base/abci/v1beta1/abci.proto#L56-L70", + "type": "object", + "required": [ + "attributes", + "type" + ], + "properties": { + "attributes": { + "description": "The attributes to be included in the event.\n\nYou can learn more about these from [*Cosmos SDK* docs].\n\n[*Cosmos SDK* docs]: https://docs.cosmos.network/main/core/events.html", + "type": "array", + "items": { + "$ref": "#/definitions/Attribute" + } + }, + "type": { + "description": "The event type. This is renamed to \"ty\" because \"type\" is reserved in Rust. This sucks, we know.", + "type": "string" + } + } + }, + "SubMsgResponse": { + "description": "The information we get back from a successful sub message execution, with full Cosmos SDK events.", + "type": "object", + "required": [ + "events" + ], + "properties": { + "data": { + "anyOf": [ + { + "$ref": "#/definitions/Binary" + }, + { + "type": "null" + } + ] + }, + "events": { + "type": "array", + "items": { + "$ref": "#/definitions/Event" + } + } + } + }, + "SubMsgResult": { + "description": "This is the result type that is returned from a sub message execution.\n\nWe use a custom type here instead of Rust's Result because we want to be able to define the serialization, which is a public interface. Every language that compiles to Wasm and runs in the ComsWasm VM needs to create the same JSON representation.\n\nUntil version 1.0.0-beta5, `ContractResult` was used instead of this type. Once serialized, the two types are the same. However, in the Rust type system we want different types for clarity and documenation reasons.\n\n# Examples\n\nSuccess:\n\n``` # use cosmwasm_std::{to_vec, Binary, Event, SubMsgResponse, SubMsgResult}; let response = SubMsgResponse { data: Some(Binary::from_base64(\"MTIzCg==\").unwrap()), events: vec![Event::new(\"wasm\").add_attribute(\"fo\", \"ba\")], }; let result: SubMsgResult = SubMsgResult::Ok(response); assert_eq!(to_vec(&result).unwrap(), br#\"{\"ok\":{\"events\":[{\"type\":\"wasm\",\"attributes\":[{\"key\":\"fo\",\"value\":\"ba\"}]}],\"data\":\"MTIzCg==\"}}\"#); ```\n\nFailure:\n\n``` # use cosmwasm_std::{to_vec, SubMsgResult, Response}; let error_msg = String::from(\"Something went wrong\"); let result = SubMsgResult::Err(error_msg); assert_eq!(to_vec(&result).unwrap(), br#\"{\"error\":\"Something went wrong\"}\"#); ```", + "oneOf": [ + { + "type": "object", + "required": [ + "ok" + ], + "properties": { + "ok": { + "$ref": "#/definitions/SubMsgResponse" + } + }, + "additionalProperties": false + }, + { + "description": "An error type that every custom error created by contract developers can be converted to. This could potientially have more structure, but String is the easiest.", + "type": "object", + "required": [ + "error" + ], + "properties": { + "error": { + "type": "string" + } + }, + "additionalProperties": false + } + ] + } + } +} diff --git a/contracts/reflect/schema/raw/sudo.json b/contracts/reflect/schema/raw/sudo.json new file mode 100644 index 0000000000..e0db5ae603 --- /dev/null +++ b/contracts/reflect/schema/raw/sudo.json @@ -0,0 +1,854 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "type": "object", + "required": [ + "reflect_msg" + ], + "properties": { + "reflect_msg": { + "type": "object", + "required": [ + "msgs" + ], + "properties": { + "msgs": { + "type": "array", + "items": { + "$ref": "#/definitions/CosmosMsg_for_CustomMsg" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "reflect_sub_msg" + ], + "properties": { + "reflect_sub_msg": { + "type": "object", + "required": [ + "msgs" + ], + "properties": { + "msgs": { + "type": "array", + "items": { + "$ref": "#/definitions/SubMsg_for_CustomMsg" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "change_owner" + ], + "properties": { + "change_owner": { + "type": "object", + "required": [ + "owner" + ], + "properties": { + "owner": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ], + "definitions": { + "BankMsg": { + "description": "The message types of the bank module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto", + "oneOf": [ + { + "description": "Sends native tokens from the contract to the given address.\n\nThis is translated to a [MsgSend](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto#L19-L28). `from_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "send" + ], + "properties": { + "send": { + "type": "object", + "required": [ + "amount", + "to_address" + ], + "properties": { + "amount": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "to_address": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This will burn the given coins from the contract's account. There is no Cosmos SDK message that performs this, but it can be done by calling the bank keeper. Important if a contract controls significant token supply that must be retired.", + "type": "object", + "required": [ + "burn" + ], + "properties": { + "burn": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + } + } + }, + "additionalProperties": false + } + ] + }, + "Binary": { + "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", + "type": "string" + }, + "Coin": { + "type": "object", + "required": [ + "amount", + "denom" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + } + } + }, + "CosmosMsg_for_CustomMsg": { + "oneOf": [ + { + "type": "object", + "required": [ + "bank" + ], + "properties": { + "bank": { + "$ref": "#/definitions/BankMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "custom" + ], + "properties": { + "custom": { + "$ref": "#/definitions/CustomMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "staking" + ], + "properties": { + "staking": { + "$ref": "#/definitions/StakingMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "distribution" + ], + "properties": { + "distribution": { + "$ref": "#/definitions/DistributionMsg" + } + }, + "additionalProperties": false + }, + { + "description": "A Stargate message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", + "type": "object", + "required": [ + "stargate" + ], + "properties": { + "stargate": { + "type": "object", + "required": [ + "type_url", + "value" + ], + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "$ref": "#/definitions/Binary" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "ibc" + ], + "properties": { + "ibc": { + "$ref": "#/definitions/IbcMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "wasm" + ], + "properties": { + "wasm": { + "$ref": "#/definitions/WasmMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "gov" + ], + "properties": { + "gov": { + "$ref": "#/definitions/GovMsg" + } + }, + "additionalProperties": false + } + ] + }, + "CustomMsg": { + "description": "CustomMsg is an override of CosmosMsg::Custom to show this works and can be extended in the contract", + "oneOf": [ + { + "type": "object", + "required": [ + "debug" + ], + "properties": { + "debug": { + "type": "string" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "raw" + ], + "properties": { + "raw": { + "$ref": "#/definitions/Binary" + } + }, + "additionalProperties": false + } + ] + }, + "DistributionMsg": { + "description": "The message types of the distribution module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto", + "oneOf": [ + { + "description": "This is translated to a [MsgSetWithdrawAddress](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#L29-L37). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "set_withdraw_address" + ], + "properties": { + "set_withdraw_address": { + "type": "object", + "required": [ + "address" + ], + "properties": { + "address": { + "description": "The `withdraw_address`", + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This is translated to a [[MsgWithdrawDelegatorReward](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#L42-L50). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "withdraw_delegator_reward" + ], + "properties": { + "withdraw_delegator_reward": { + "type": "object", + "required": [ + "validator" + ], + "properties": { + "validator": { + "description": "The `validator_address`", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "GovMsg": { + "oneOf": [ + { + "description": "This maps directly to [MsgVote](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/gov/v1beta1/tx.proto#L46-L56) in the Cosmos SDK with voter set to the contract address.", + "type": "object", + "required": [ + "vote" + ], + "properties": { + "vote": { + "type": "object", + "required": [ + "proposal_id", + "vote" + ], + "properties": { + "proposal_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "vote": { + "$ref": "#/definitions/VoteOption" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "IbcMsg": { + "description": "These are messages in the IBC lifecycle. Only usable by IBC-enabled contracts (contracts that directly speak the IBC protocol via 6 entry points)", + "oneOf": [ + { + "description": "Sends bank tokens owned by the contract to the given address on another chain. The channel must already be established between the ibctransfer module on this chain and a matching module on the remote chain. We cannot select the port_id, this is whatever the local chain has bound the ibctransfer module to.", + "type": "object", + "required": [ + "transfer" + ], + "properties": { + "transfer": { + "type": "object", + "required": [ + "amount", + "channel_id", + "timeout", + "to_address" + ], + "properties": { + "amount": { + "description": "packet data only supports one coin https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/ibc/applications/transfer/v1/transfer.proto#L11-L20", + "allOf": [ + { + "$ref": "#/definitions/Coin" + } + ] + }, + "channel_id": { + "description": "exisiting channel to send the tokens over", + "type": "string" + }, + "timeout": { + "description": "when packet times out, measured on remote chain", + "allOf": [ + { + "$ref": "#/definitions/IbcTimeout" + } + ] + }, + "to_address": { + "description": "address on the remote chain to receive these tokens", + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Sends an IBC packet with given data over the existing channel. Data should be encoded in a format defined by the channel version, and the module on the other side should know how to parse this.", + "type": "object", + "required": [ + "send_packet" + ], + "properties": { + "send_packet": { + "type": "object", + "required": [ + "channel_id", + "data", + "timeout" + ], + "properties": { + "channel_id": { + "type": "string" + }, + "data": { + "$ref": "#/definitions/Binary" + }, + "timeout": { + "description": "when packet times out, measured on remote chain", + "allOf": [ + { + "$ref": "#/definitions/IbcTimeout" + } + ] + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This will close an existing channel that is owned by this contract. Port is auto-assigned to the contract's IBC port", + "type": "object", + "required": [ + "close_channel" + ], + "properties": { + "close_channel": { + "type": "object", + "required": [ + "channel_id" + ], + "properties": { + "channel_id": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "IbcTimeout": { + "description": "In IBC each package must set at least one type of timeout: the timestamp or the block height. Using this rather complex enum instead of two timeout fields we ensure that at least one timeout is set.", + "type": "object", + "properties": { + "block": { + "anyOf": [ + { + "$ref": "#/definitions/IbcTimeoutBlock" + }, + { + "type": "null" + } + ] + }, + "timestamp": { + "anyOf": [ + { + "$ref": "#/definitions/Timestamp" + }, + { + "type": "null" + } + ] + } + } + }, + "IbcTimeoutBlock": { + "description": "IBCTimeoutHeight Height is a monotonically increasing data type that can be compared against another Height for the purposes of updating and freezing clients. Ordering is (revision_number, timeout_height)", + "type": "object", + "required": [ + "height", + "revision" + ], + "properties": { + "height": { + "description": "block height after which the packet times out. the height within the given revision", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "revision": { + "description": "the version that the client is currently on (eg. after reseting the chain this could increment 1 as height drops to 0)", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + } + }, + "ReplyOn": { + "description": "Use this to define when the contract gets a response callback. If you only need it for errors or success you can select just those in order to save gas.", + "type": "string", + "enum": [ + "always", + "error", + "success", + "never" + ] + }, + "StakingMsg": { + "description": "The message types of the staking module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto", + "oneOf": [ + { + "description": "This is translated to a [MsgDelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L81-L90). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "delegate" + ], + "properties": { + "delegate": { + "type": "object", + "required": [ + "amount", + "validator" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Coin" + }, + "validator": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This is translated to a [MsgUndelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L112-L121). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "undelegate" + ], + "properties": { + "undelegate": { + "type": "object", + "required": [ + "amount", + "validator" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Coin" + }, + "validator": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This is translated to a [MsgBeginRedelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L95-L105). `delegator_address` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "redelegate" + ], + "properties": { + "redelegate": { + "type": "object", + "required": [ + "amount", + "dst_validator", + "src_validator" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Coin" + }, + "dst_validator": { + "type": "string" + }, + "src_validator": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, + "SubMsg_for_CustomMsg": { + "description": "A submessage that will guarantee a `reply` call on success or error, depending on the `reply_on` setting. If you do not need to process the result, use regular messages instead.\n\nNote: On error the submessage execution will revert any partial state changes due to this message, but not revert any state changes in the calling contract. If this is required, it must be done manually in the `reply` entry point.", + "type": "object", + "required": [ + "id", + "msg", + "reply_on" + ], + "properties": { + "gas_limit": { + "description": "Gas limit measured in [Cosmos SDK gas](https://github.com/CosmWasm/cosmwasm/blob/main/docs/GAS.md).", + "type": [ + "integer", + "null" + ], + "format": "uint64", + "minimum": 0.0 + }, + "id": { + "description": "An arbitrary ID chosen by the contract. This is typically used to match `Reply`s in the `reply` entry point to the submessage.", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "msg": { + "$ref": "#/definitions/CosmosMsg_for_CustomMsg" + }, + "reply_on": { + "$ref": "#/definitions/ReplyOn" + } + } + }, + "Timestamp": { + "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", + "allOf": [ + { + "$ref": "#/definitions/Uint64" + } + ] + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + }, + "Uint64": { + "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", + "type": "string" + }, + "VoteOption": { + "type": "string", + "enum": [ + "yes", + "no", + "abstain", + "no_with_veto" + ] + }, + "WasmMsg": { + "description": "The message types of the wasm module.\n\nSee https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto", + "oneOf": [ + { + "description": "Dispatches a call to another contract at a known address (with known ABI).\n\nThis is translated to a [MsgExecuteContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L68-L78). `sender` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "execute" + ], + "properties": { + "execute": { + "type": "object", + "required": [ + "contract_addr", + "funds", + "msg" + ], + "properties": { + "contract_addr": { + "type": "string" + }, + "funds": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "msg": { + "description": "msg is the json-encoded ExecuteMsg struct (as raw Binary)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.16.0-alpha1/x/wasm/internal/types/tx.proto#L47-L61). `sender` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "instantiate" + ], + "properties": { + "instantiate": { + "type": "object", + "required": [ + "code_id", + "funds", + "label", + "msg" + ], + "properties": { + "admin": { + "type": [ + "string", + "null" + ] + }, + "code_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "funds": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "label": { + "description": "A human-readbale label for the contract", + "type": "string" + }, + "msg": { + "description": "msg is the JSON-encoded InstantiateMsg struct (as raw Binary)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Migrates a given contracts to use new wasm code. Passes a MigrateMsg to allow us to customize behavior.\n\nOnly the contract admin (as defined in wasmd), if any, is able to make this call.\n\nThis is translated to a [MsgMigrateContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L86-L96). `sender` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "migrate" + ], + "properties": { + "migrate": { + "type": "object", + "required": [ + "contract_addr", + "msg", + "new_code_id" + ], + "properties": { + "contract_addr": { + "type": "string" + }, + "msg": { + "description": "msg is the json-encoded MigrateMsg struct that will be passed to the new code", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "new_code_id": { + "description": "the code_id of the new logic to place in the given contract", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Sets a new admin (for migrate) on the given contract. Fails if this contract is not currently admin of the target contract.", + "type": "object", + "required": [ + "update_admin" + ], + "properties": { + "update_admin": { + "type": "object", + "required": [ + "admin", + "contract_addr" + ], + "properties": { + "admin": { + "type": "string" + }, + "contract_addr": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Clears the admin on the given contract, so no more migration possible. Fails if this contract is not currently admin of the target contract.", + "type": "object", + "required": [ + "clear_admin" + ], + "properties": { + "clear_admin": { + "type": "object", + "required": [ + "contract_addr" + ], + "properties": { + "contract_addr": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + } + } +} diff --git a/contracts/staking/schema/raw/execute.json b/contracts/staking/schema/raw/execute.json new file mode 100644 index 0000000000..159d67cd90 --- /dev/null +++ b/contracts/staking/schema/raw/execute.json @@ -0,0 +1,116 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Transfer moves the derivative token", + "type": "object", + "required": [ + "transfer" + ], + "properties": { + "transfer": { + "type": "object", + "required": [ + "amount", + "recipient" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "recipient": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Bond will bond all staking tokens sent with the message and release derivative tokens", + "type": "object", + "required": [ + "bond" + ], + "properties": { + "bond": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Unbond will \"burn\" the given amount of derivative tokens and send the unbonded staking tokens to the message sender (after exit tax is deducted)", + "type": "object", + "required": [ + "unbond" + ], + "properties": { + "unbond": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Claim is used to claim your native tokens that you previously \"unbonded\" after the chain-defined waiting period (eg. 3 weeks)", + "type": "object", + "required": [ + "claim" + ], + "properties": { + "claim": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Reinvest will check for all accumulated rewards, withdraw them, and re-bond them to the same validator. Anyone can call this, which updates the value of the token (how much under custody).", + "type": "object", + "required": [ + "reinvest" + ], + "properties": { + "reinvest": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "_BondAllTokens can only be called by the contract itself, after all rewards have been withdrawn. This is an example of using \"callbacks\" in message flows. This can only be invoked by the contract itself as a return from Reinvest", + "type": "object", + "required": [ + "__bond_all_tokens" + ], + "properties": { + "__bond_all_tokens": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ], + "definitions": { + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } +} diff --git a/contracts/staking/schema/raw/instantiate.json b/contracts/staking/schema/raw/instantiate.json new file mode 100644 index 0000000000..dd25457114 --- /dev/null +++ b/contracts/staking/schema/raw/instantiate.json @@ -0,0 +1,60 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "InstantiateMsg", + "type": "object", + "required": [ + "decimals", + "exit_tax", + "min_withdrawal", + "name", + "symbol", + "validator" + ], + "properties": { + "decimals": { + "description": "decimal places of the derivative token (for UI) TODO: does this make sense? Do we need to normalize on this? We don't even know the decimals of the native token", + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "exit_tax": { + "description": "this is how much the owner takes as a cut when someone unbonds TODO", + "allOf": [ + { + "$ref": "#/definitions/Decimal" + } + ] + }, + "min_withdrawal": { + "description": "This is the minimum amount we will pull out to reinvest, as well as a minumum that can be unbonded (to avoid needless staking tx)", + "allOf": [ + { + "$ref": "#/definitions/Uint128" + } + ] + }, + "name": { + "description": "name of the derivative token (FIXME: auto-generate?)", + "type": "string" + }, + "symbol": { + "description": "symbol / ticker of the derivative token", + "type": "string" + }, + "validator": { + "description": "This is the validator that all tokens will be bonded to", + "type": "string" + } + }, + "additionalProperties": false, + "definitions": { + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } +} diff --git a/contracts/staking/schema/raw/migrate.json b/contracts/staking/schema/raw/migrate.json new file mode 100644 index 0000000000..159d67cd90 --- /dev/null +++ b/contracts/staking/schema/raw/migrate.json @@ -0,0 +1,116 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Transfer moves the derivative token", + "type": "object", + "required": [ + "transfer" + ], + "properties": { + "transfer": { + "type": "object", + "required": [ + "amount", + "recipient" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "recipient": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Bond will bond all staking tokens sent with the message and release derivative tokens", + "type": "object", + "required": [ + "bond" + ], + "properties": { + "bond": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Unbond will \"burn\" the given amount of derivative tokens and send the unbonded staking tokens to the message sender (after exit tax is deducted)", + "type": "object", + "required": [ + "unbond" + ], + "properties": { + "unbond": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Claim is used to claim your native tokens that you previously \"unbonded\" after the chain-defined waiting period (eg. 3 weeks)", + "type": "object", + "required": [ + "claim" + ], + "properties": { + "claim": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Reinvest will check for all accumulated rewards, withdraw them, and re-bond them to the same validator. Anyone can call this, which updates the value of the token (how much under custody).", + "type": "object", + "required": [ + "reinvest" + ], + "properties": { + "reinvest": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "_BondAllTokens can only be called by the contract itself, after all rewards have been withdrawn. This is an example of using \"callbacks\" in message flows. This can only be invoked by the contract itself as a return from Reinvest", + "type": "object", + "required": [ + "__bond_all_tokens" + ], + "properties": { + "__bond_all_tokens": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ], + "definitions": { + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } +} diff --git a/contracts/staking/schema/raw/query.json b/contracts/staking/schema/raw/query.json new file mode 100644 index 0000000000..159d67cd90 --- /dev/null +++ b/contracts/staking/schema/raw/query.json @@ -0,0 +1,116 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Transfer moves the derivative token", + "type": "object", + "required": [ + "transfer" + ], + "properties": { + "transfer": { + "type": "object", + "required": [ + "amount", + "recipient" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "recipient": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Bond will bond all staking tokens sent with the message and release derivative tokens", + "type": "object", + "required": [ + "bond" + ], + "properties": { + "bond": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Unbond will \"burn\" the given amount of derivative tokens and send the unbonded staking tokens to the message sender (after exit tax is deducted)", + "type": "object", + "required": [ + "unbond" + ], + "properties": { + "unbond": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Claim is used to claim your native tokens that you previously \"unbonded\" after the chain-defined waiting period (eg. 3 weeks)", + "type": "object", + "required": [ + "claim" + ], + "properties": { + "claim": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Reinvest will check for all accumulated rewards, withdraw them, and re-bond them to the same validator. Anyone can call this, which updates the value of the token (how much under custody).", + "type": "object", + "required": [ + "reinvest" + ], + "properties": { + "reinvest": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "_BondAllTokens can only be called by the contract itself, after all rewards have been withdrawn. This is an example of using \"callbacks\" in message flows. This can only be invoked by the contract itself as a return from Reinvest", + "type": "object", + "required": [ + "__bond_all_tokens" + ], + "properties": { + "__bond_all_tokens": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ], + "definitions": { + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } +} diff --git a/contracts/staking/schema/raw/response_to_balance.json b/contracts/staking/schema/raw/response_to_balance.json new file mode 100644 index 0000000000..7dcf4d4a51 --- /dev/null +++ b/contracts/staking/schema/raw/response_to_balance.json @@ -0,0 +1,20 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "BalanceResponse", + "type": "object", + "required": [ + "balance" + ], + "properties": { + "balance": { + "$ref": "#/definitions/Uint128" + } + }, + "additionalProperties": false, + "definitions": { + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } +} diff --git a/contracts/staking/schema/raw/response_to_claims.json b/contracts/staking/schema/raw/response_to_claims.json new file mode 100644 index 0000000000..b393e85853 --- /dev/null +++ b/contracts/staking/schema/raw/response_to_claims.json @@ -0,0 +1,20 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ClaimsResponse", + "type": "object", + "required": [ + "claims" + ], + "properties": { + "claims": { + "$ref": "#/definitions/Uint128" + } + }, + "additionalProperties": false, + "definitions": { + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } +} diff --git a/contracts/staking/schema/raw/response_to_investment.json b/contracts/staking/schema/raw/response_to_investment.json new file mode 100644 index 0000000000..ffa5b81226 --- /dev/null +++ b/contracts/staking/schema/raw/response_to_investment.json @@ -0,0 +1,75 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "InvestmentResponse", + "type": "object", + "required": [ + "exit_tax", + "min_withdrawal", + "nominal_value", + "owner", + "staked_tokens", + "token_supply", + "validator" + ], + "properties": { + "exit_tax": { + "description": "this is how much the owner takes as a cut when someone unbonds", + "allOf": [ + { + "$ref": "#/definitions/Decimal" + } + ] + }, + "min_withdrawal": { + "description": "This is the minimum amount we will pull out to reinvest, as well as a minumum that can be unbonded (to avoid needless staking tx)", + "allOf": [ + { + "$ref": "#/definitions/Uint128" + } + ] + }, + "nominal_value": { + "$ref": "#/definitions/Decimal" + }, + "owner": { + "description": "owner created the contract and takes a cut", + "type": "string" + }, + "staked_tokens": { + "$ref": "#/definitions/Coin" + }, + "token_supply": { + "$ref": "#/definitions/Uint128" + }, + "validator": { + "description": "All tokens are bonded to this validator", + "type": "string" + } + }, + "additionalProperties": false, + "definitions": { + "Coin": { + "type": "object", + "required": [ + "amount", + "denom" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + } + } + }, + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } +} diff --git a/contracts/staking/schema/raw/response_to_token_info.json b/contracts/staking/schema/raw/response_to_token_info.json new file mode 100644 index 0000000000..76b139ecf9 --- /dev/null +++ b/contracts/staking/schema/raw/response_to_token_info.json @@ -0,0 +1,28 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "TokenInfoResponse", + "description": "TokenInfoResponse is info to display the derivative token in a UI", + "type": "object", + "required": [ + "decimals", + "name", + "symbol" + ], + "properties": { + "decimals": { + "description": "decimal places of the derivative token (for UI)", + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "name": { + "description": "name of the derivative token", + "type": "string" + }, + "symbol": { + "description": "symbol / ticker of the derivative token", + "type": "string" + } + }, + "additionalProperties": false +} diff --git a/contracts/staking/schema/raw/sudo.json b/contracts/staking/schema/raw/sudo.json new file mode 100644 index 0000000000..159d67cd90 --- /dev/null +++ b/contracts/staking/schema/raw/sudo.json @@ -0,0 +1,116 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Transfer moves the derivative token", + "type": "object", + "required": [ + "transfer" + ], + "properties": { + "transfer": { + "type": "object", + "required": [ + "amount", + "recipient" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "recipient": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Bond will bond all staking tokens sent with the message and release derivative tokens", + "type": "object", + "required": [ + "bond" + ], + "properties": { + "bond": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Unbond will \"burn\" the given amount of derivative tokens and send the unbonded staking tokens to the message sender (after exit tax is deducted)", + "type": "object", + "required": [ + "unbond" + ], + "properties": { + "unbond": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Claim is used to claim your native tokens that you previously \"unbonded\" after the chain-defined waiting period (eg. 3 weeks)", + "type": "object", + "required": [ + "claim" + ], + "properties": { + "claim": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Reinvest will check for all accumulated rewards, withdraw them, and re-bond them to the same validator. Anyone can call this, which updates the value of the token (how much under custody).", + "type": "object", + "required": [ + "reinvest" + ], + "properties": { + "reinvest": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "_BondAllTokens can only be called by the contract itself, after all rewards have been withdrawn. This is an example of using \"callbacks\" in message flows. This can only be invoked by the contract itself as a return from Reinvest", + "type": "object", + "required": [ + "__bond_all_tokens" + ], + "properties": { + "__bond_all_tokens": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ], + "definitions": { + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } +} diff --git a/packages/schema-derive/src/generate_api.rs b/packages/schema-derive/src/generate_api.rs index 33064df1de..f67ac94318 100644 --- a/packages/schema-derive/src/generate_api.rs +++ b/packages/schema-derive/src/generate_api.rs @@ -20,20 +20,6 @@ pub fn write_api_impl(input: Options) -> Block { use ::cosmwasm_schema::{remove_schemas, Api, QueryResponses}; - if env::args().find(|arg| arg == "--help").is_some() { - println!("USAGE:"); - println!(" cargo schema [OPTIONS]"); - println!(); - println!("FLAGS:"); - println!(" --basic"); - println!(" Generate pure JSON schema files rather than the \"unified\" format."); - println!(" --help"); - println!(" Print this helpfile."); - return; - } - - let basic = env::args().find(|arg| arg == "--basic").is_some(); - let mut out_dir = env::current_dir().unwrap(); out_dir.push("schema"); create_dir_all(&out_dir).unwrap(); @@ -41,19 +27,21 @@ pub fn write_api_impl(input: Options) -> Block { let api = #api_object.render(); - if basic { - for (filename, json) in api.to_schema_files().unwrap() { - let path = out_dir.join(filename); - write(&path, json + "\n").unwrap(); - println!("Exported {}", path.to_str().unwrap()); - } - } else { - let path = out_dir.join(concat!(#name, ".json")); + let path = out_dir.join(concat!(#name, ".json")); + + let json = api.to_string().unwrap(); + write(&path, json + "\n").unwrap(); + println!("Exported the full API as {}", path.to_str().unwrap()); + + let raw_dir = out_dir.join("raw"); + create_dir_all(&raw_dir).unwrap(); + + for (filename, json) in api.to_schema_files().unwrap() { + let path = raw_dir.join(filename); - let json = api.to_string().unwrap(); write(&path, json + "\n").unwrap(); - println!("Exported the full API as {}", path.to_str().unwrap()); + println!("Exported {}", path.to_str().unwrap()); } } } From d52f9777d90643974831dd90fcaf5c9989554677 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 21 Nov 2022 17:59:37 +0100 Subject: [PATCH 0014/2372] Add initial instantiate2_address implementation --- Cargo.lock | 1 + contracts/burner/Cargo.lock | 1 + contracts/crypto-verify/Cargo.lock | 1 + contracts/cyberpunk/Cargo.lock | 1 + contracts/floaty/Cargo.lock | 1 + contracts/hackatom/Cargo.lock | 1 + contracts/ibc-reflect-send/Cargo.lock | 1 + contracts/ibc-reflect/Cargo.lock | 1 + contracts/queue/Cargo.lock | 1 + contracts/reflect/Cargo.lock | 1 + contracts/staking/Cargo.lock | 1 + packages/std/Cargo.toml | 1 + packages/std/src/addresses.rs | 151 ++++++++++++++++++++++++++ packages/std/src/lib.rs | 2 +- 14 files changed, 164 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index a0c1c8f276..3409fe6398 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -321,6 +321,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", + "sha2 0.10.3", "thiserror", "uint", ] diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index aab6e4eb26..8ce9fa5f8b 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -223,6 +223,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", + "sha2 0.10.3", "thiserror", "uint", ] diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 70e33e0629..45b1e80a9c 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -218,6 +218,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", + "sha2 0.10.3", "thiserror", "uint", ] diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 0b83be8a3d..b62dcbdf63 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -241,6 +241,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", + "sha2 0.10.3", "thiserror", "uint", ] diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 500aa21fdc..1f2c2202d3 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -212,6 +212,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", + "sha2 0.10.3", "thiserror", "uint", ] diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 8390c799d5..9cc29d7b9e 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -212,6 +212,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", + "sha2 0.10.3", "thiserror", "uint", ] diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 5049396e67..fd280678ff 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -212,6 +212,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", + "sha2 0.10.3", "thiserror", "uint", ] diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 98831f4271..198d980637 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -212,6 +212,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", + "sha2 0.10.3", "thiserror", "uint", ] diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index cd65a4253e..bdc63c558c 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -212,6 +212,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", + "sha2 0.10.3", "thiserror", "uint", ] diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 881705e2ac..f1005dd6fc 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -212,6 +212,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", + "sha2 0.10.3", "thiserror", "uint", ] diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 4e52d9f26d..db94696e4c 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -212,6 +212,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", + "sha2 0.10.3", "thiserror", "uint", ] diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index ee6d84597a..fe71667207 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -47,6 +47,7 @@ derivative = "2" forward_ref = "1" hex = "0.4" schemars = "0.8.3" +sha2 = "0.10.3" serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } serde-json-wasm = { version = "0.4.1" } thiserror = "1.0.13" diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index ef03d5ab60..4fa4cb19bd 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -1,5 +1,9 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +use sha2::{ + digest::{Digest, Update}, + Sha256, +}; use std::borrow::Cow; use std::fmt; use std::ops::Deref; @@ -271,9 +275,95 @@ impl fmt::Display for CanonicalAddr { } } +#[derive(Debug)] +pub enum Instantiate2AddressError { + /// Checksum must be 32 bytes + InvalidChecksumLength, + /// Salt must be between 1 and 64 bytes + InvalidSaltLength, +} + +/// Creates a contract address using the predictable address format introduced with +/// wasmd 0.29. When using instantiate2, this is a way to precompute the address. +/// Then using instantiate, the contract address will use a different algorithm and +/// cannot be pre-computed as it contains inputs from the chain's state at the time of +/// message execution. +/// +/// The predicable address format of instantiate2 is stable. But bear in mind this is +/// a powerful tool that requires multiple software components to work together smoothly. +/// It should be used carefully and tested thoroughly to avoid the loss of funds. +/// +/// This method operates on [`CanonicalAddr`] to be implemented without chain interaction. +/// The typical usage looks like this: +/// +/// ``` +/// # use cosmwasm_std::{ +/// # HexBinary, +/// # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, +/// # Response, QueryResponse, +/// # }; +/// # type ExecuteMsg = (); +/// use cosmwasm_std::instantiate2_address; +/// +/// #[entry_point] +/// pub fn execute( +/// deps: DepsMut, +/// env: Env, +/// info: MessageInfo, +/// msg: ExecuteMsg, +/// ) -> Result { +/// let canonical_creator = deps.api.addr_canonicalize(env.contract.address.as_str())?; +/// let checksum = HexBinary::from_hex("9af782a3a1bcbcd22dbb6a45c751551d9af782a3a1bcbcd22dbb6a45c751551d")?; +/// let salt = b"instance 1231"; +/// let canonical_addr = instantiate2_address(&checksum, &canonical_creator, salt, None) +/// .map_err(|_| StdError::generic_err("Could not calculate addr"))?; +/// let addr = deps.api.addr_humanize(&canonical_addr)?; +/// +/// # Ok(Default::default()) +/// } +/// ``` +pub fn instantiate2_address( + checksum: &[u8], + creator: &CanonicalAddr, + salt: &[u8], + msg: Option<&[u8]>, +) -> Result { + if checksum.len() != 32 { + return Err(Instantiate2AddressError::InvalidChecksumLength); + } + + if salt.is_empty() || salt.len() > 64 { + return Err(Instantiate2AddressError::InvalidSaltLength); + }; + + let msg = msg.unwrap_or_default(); + + let mut key = Vec::::new(); + key.extend_from_slice(b"wasm\0"); + key.extend_from_slice(&(checksum.len() as u64).to_be_bytes()); + key.extend_from_slice(checksum); + key.extend_from_slice(&(creator.len() as u64).to_be_bytes()); + key.extend_from_slice(creator); + key.extend_from_slice(&(salt.len() as u64).to_be_bytes()); + key.extend_from_slice(salt); + key.extend_from_slice(&(msg.len() as u64).to_be_bytes()); + key.extend_from_slice(msg); + let address_data = hash("module", &key); + Ok(address_data.into()) +} + +/// The "Basic Address" Hash from +/// https://github.com/cosmos/cosmos-sdk/blob/v0.45.8/docs/architecture/adr-028-public-key-addresses.md +fn hash(ty: &str, key: &[u8]) -> Vec { + let inner = Sha256::digest(ty.as_bytes()); + Sha256::new().chain(inner).chain(key).finalize().to_vec() +} + #[cfg(test)] mod tests { use super::*; + use crate::HexBinary; + use hex_literal::hex; use std::collections::hash_map::DefaultHasher; use std::collections::HashSet; use std::hash::{Hash, Hasher}; @@ -567,4 +657,65 @@ mod tests { // pass by value assert_eq!(value, &flexible(addr)); } + + #[test] + fn instantiate2_address_works() { + let checksum1 = + HexBinary::from_hex("13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5") + .unwrap(); + let creator1 = CanonicalAddr::from(hex!("9999999999aaaaaaaaaabbbbbbbbbbcccccccccc")); + let salt1 = hex!("61"); + let salt2 = hex!("aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae"); + let msg1: Option<&[u8]> = None; + let msg2: Option<&[u8]> = Some(b"{}"); + let msg3: Option<&[u8]> = Some(b"{\"some\":123,\"structure\":{\"nested\":[\"ok\",true]}}"); + + // No msg + let expected = CanonicalAddr::from(hex!( + "5e865d3e45ad3e961f77fd77d46543417ced44d924dc3e079b5415ff6775f847" + )); + assert_eq!( + instantiate2_address(&checksum1, &creator1, &salt1, msg1).unwrap(), + expected + ); + + // With msg + let expected = CanonicalAddr::from(hex!( + "0995499608947a5281e2c7ebd71bdb26a1ad981946dad57f6c4d3ee35de77835" + )); + assert_eq!( + instantiate2_address(&checksum1, &creator1, &salt1, msg2).unwrap(), + expected + ); + + // Long msg + let expected = CanonicalAddr::from(hex!( + "83326e554723b15bac664ceabc8a5887e27003abe9fbd992af8c7bcea4745167" + )); + assert_eq!( + instantiate2_address(&checksum1, &creator1, &salt1, msg3).unwrap(), + expected + ); + + // Long salt + let expected = CanonicalAddr::from(hex!( + "9384c6248c0bb171e306fd7da0993ec1e20eba006452a3a9e078883eb3594564" + )); + assert_eq!( + instantiate2_address(&checksum1, &creator1, &salt2, None).unwrap(), + expected + ); + + // Salt too short or too long + let empty = Vec::::new(); + assert!(matches!( + instantiate2_address(&checksum1, &creator1, &empty, None).unwrap_err(), + Instantiate2AddressError::InvalidSaltLength + )); + let too_long = vec![0x11; 65]; + assert!(matches!( + instantiate2_address(&checksum1, &creator1, &too_long, None).unwrap_err(), + Instantiate2AddressError::InvalidSaltLength + )); + } } diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 26445f4b55..4a03d3025a 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -25,7 +25,7 @@ mod timestamp; mod traits; mod types; -pub use crate::addresses::{Addr, CanonicalAddr}; +pub use crate::addresses::{instantiate2_address, Addr, CanonicalAddr}; pub use crate::binary::Binary; pub use crate::coin::{coin, coins, has_coins, Coin}; pub use crate::deps::{Deps, DepsMut, OwnedDeps}; From f5b007a39714d2a41493f5ffa637b8310ae838ab Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 18 Oct 2022 11:39:38 +0200 Subject: [PATCH 0015/2372] Test invalid checksum lengths --- packages/std/src/addresses.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index 4fa4cb19bd..0220f93dc3 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -717,5 +717,22 @@ mod tests { instantiate2_address(&checksum1, &creator1, &too_long, None).unwrap_err(), Instantiate2AddressError::InvalidSaltLength )); + + // invalid checksum length + let broken_cs = hex!("13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2"); + assert!(matches!( + instantiate2_address(&broken_cs, &creator1, &salt1, None).unwrap_err(), + Instantiate2AddressError::InvalidChecksumLength + )); + let broken_cs = hex!(""); + assert!(matches!( + instantiate2_address(&broken_cs, &creator1, &salt1, None).unwrap_err(), + Instantiate2AddressError::InvalidChecksumLength + )); + let broken_cs = hex!("13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2aaaa"); + assert!(matches!( + instantiate2_address(&broken_cs, &creator1, &salt1, None).unwrap_err(), + Instantiate2AddressError::InvalidChecksumLength + )); } } From c5ddc3d0ac00049eabc7b9d71939f4807f5c96db Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 18 Oct 2022 16:13:10 +0200 Subject: [PATCH 0016/2372] Test instantiate2_address against test vectors --- Cargo.lock | 1 + packages/std/Cargo.toml | 1 + packages/std/src/addresses.rs | 69 ++++ .../std/testdata/instantiate2_addresses.json | 386 ++++++++++++++++++ 4 files changed, 457 insertions(+) create mode 100644 packages/std/testdata/instantiate2_addresses.json diff --git a/Cargo.lock b/Cargo.lock index 3409fe6398..d43b7d1b6f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -321,6 +321,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", + "serde_json", "sha2 0.10.3", "thiserror", "uint", diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index fe71667207..5d7475d060 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -61,3 +61,4 @@ cosmwasm-schema = { path = "../schema" } # The chrono dependency is only used in an example, which Rust compiles for us. If this causes trouble, remove it. chrono = { version = "0.4", default-features = false, features = ["alloc", "std"] } hex-literal = "0.3.1" +serde_json = "1.0.81" diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index 0220f93dc3..8b1d0102b4 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -735,4 +735,73 @@ mod tests { Instantiate2AddressError::InvalidChecksumLength )); } + + #[test] + fn instantiate2_address_works_for_cosmjs_testvectors() { + // Test data from https://github.com/cosmos/cosmjs/pull/1253 + const COSMOS_ED25519_TESTS_JSON: &str = "./testdata/instantiate2_addresses.json"; + + #[derive(Deserialize, Debug)] + #[serde(rename_all = "camelCase")] + #[allow(dead_code)] + struct In { + checksum: HexBinary, + creator: String, + creator_data: HexBinary, + salt: HexBinary, + msg: Option, + } + + #[derive(Deserialize, Debug)] + #[serde(rename_all = "camelCase")] + #[allow(dead_code)] + struct Intermediate { + key: HexBinary, + address_data: HexBinary, + } + + #[derive(Deserialize, Debug)] + #[serde(rename_all = "camelCase")] + #[allow(dead_code)] + struct Out { + address: String, + } + + #[derive(Deserialize, Debug)] + #[allow(dead_code)] + struct Row { + #[serde(rename = "in")] + input: In, + intermediate: Intermediate, + out: Out, + } + + fn read_tests() -> Vec { + use std::fs::File; + use std::io::BufReader; + + // Open the file in read-only mode with buffer. + let file = File::open(COSMOS_ED25519_TESTS_JSON).unwrap(); + let reader = BufReader::new(file); + + serde_json::from_reader(reader).unwrap() + } + + for Row { + input, + intermediate, + out: _, + } in read_tests() + { + let msg = input.msg.map(|msg| msg.into_bytes()); + let addr = instantiate2_address( + &input.checksum, + &input.creator_data.into(), + &input.salt, + msg.as_deref(), + ) + .unwrap(); + assert_eq!(addr, intermediate.address_data); + } + } } diff --git a/packages/std/testdata/instantiate2_addresses.json b/packages/std/testdata/instantiate2_addresses.json new file mode 100644 index 0000000000..a12ad69521 --- /dev/null +++ b/packages/std/testdata/instantiate2_addresses.json @@ -0,0 +1,386 @@ +[ + { + "in": { + "checksum": "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbcccccccccc", + "salt": "61", + "msg": null + }, + "intermediate": { + "key": "7761736d00000000000000002013a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a500000000000000149999999999aaaaaaaaaabbbbbbbbbbcccccccccc0000000000000001610000000000000000", + "addressData": "5e865d3e45ad3e961f77fd77d46543417ced44d924dc3e079b5415ff6775f847" + }, + "out": { + "address": "purple1t6r960j945lfv8mhl4mage2rg97w63xeynwrupum2s2l7em4lprs9ce5hk" + } + }, + { + "in": { + "checksum": "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbcccccccccc", + "salt": "61", + "msg": "{}" + }, + "intermediate": { + "key": "7761736d00000000000000002013a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a500000000000000149999999999aaaaaaaaaabbbbbbbbbbcccccccccc00000000000000016100000000000000027b7d", + "addressData": "0995499608947a5281e2c7ebd71bdb26a1ad981946dad57f6c4d3ee35de77835" + }, + "out": { + "address": "purple1px25n9sgj3a99q0zcl4awx7my6s6mxqegmdd2lmvf5lwxh080q6suttktr" + } + }, + { + "in": { + "checksum": "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbcccccccccc", + "salt": "61", + "msg": "{\"some\":123,\"structure\":{\"nested\":[\"ok\",true]}}" + }, + "intermediate": { + "key": "7761736d00000000000000002013a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a500000000000000149999999999aaaaaaaaaabbbbbbbbbbcccccccccc000000000000000161000000000000002f7b22736f6d65223a3132332c22737472756374757265223a7b226e6573746564223a5b226f6b222c747275655d7d7d", + "addressData": "83326e554723b15bac664ceabc8a5887e27003abe9fbd992af8c7bcea4745167" + }, + "out": { + "address": "purple1svexu428ywc4htrxfn4tezjcsl38qqata8aany4033auafr529ns4v254c" + } + }, + { + "in": { + "checksum": "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbcccccccccc", + "salt": "aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae", + "msg": null + }, + "intermediate": { + "key": "7761736d00000000000000002013a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a500000000000000149999999999aaaaaaaaaabbbbbbbbbbcccccccccc0000000000000040aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae0000000000000000", + "addressData": "9384c6248c0bb171e306fd7da0993ec1e20eba006452a3a9e078883eb3594564" + }, + "out": { + "address": "purple1jwzvvfyvpwchrccxl476pxf7c83qawsqv3f2820q0zyrav6eg4jqdcq7gc" + } + }, + { + "in": { + "checksum": "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbcccccccccc", + "salt": "aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae", + "msg": "{}" + }, + "intermediate": { + "key": "7761736d00000000000000002013a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a500000000000000149999999999aaaaaaaaaabbbbbbbbbbcccccccccc0000000000000040aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae00000000000000027b7d", + "addressData": "9a8d5f98fb186825401a26206158e7a1213311a9b6a87944469913655af52ffb" + }, + "out": { + "address": "purple1n2x4lx8mrp5z2sq6ycsxzk885ysnxydfk658j3zxnyfk2kh49lasesxf6j" + } + }, + { + "in": { + "checksum": "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbcccccccccc", + "salt": "aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae", + "msg": "{\"some\":123,\"structure\":{\"nested\":[\"ok\",true]}}" + }, + "intermediate": { + "key": "7761736d00000000000000002013a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a500000000000000149999999999aaaaaaaaaabbbbbbbbbbcccccccccc0000000000000040aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae000000000000002f7b22736f6d65223a3132332c22737472756374757265223a7b226e6573746564223a5b226f6b222c747275655d7d7d", + "addressData": "932f07bc53f7d0b0b43cb5a54ac3e245b205e6ae6f7c1d991dc6af4a2ff9ac18" + }, + "out": { + "address": "purple1jvhs00zn7lgtpdpukkj54slzgkeqte4wda7pmxgac6h55tle4svq8cmp60" + } + }, + { + "in": { + "checksum": "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff", + "salt": "61", + "msg": null + }, + "intermediate": { + "key": "7761736d00000000000000002013a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a500000000000000209999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff0000000000000001610000000000000000", + "addressData": "9725e94f528d8b78d33c25f3dfcd60e6142d8be60ab36f6a5b59036fd51560db" + }, + "out": { + "address": "purple1juj7jn6j3k9h35euyhealntquc2zmzlxp2ek76jmtypkl4g4vrdsfwmwxk" + } + }, + { + "in": { + "checksum": "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff", + "salt": "61", + "msg": "{}" + }, + "intermediate": { + "key": "7761736d00000000000000002013a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a500000000000000209999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff00000000000000016100000000000000027b7d", + "addressData": "b056e539bbaf447ba18f3f13b792970111fc78933eb6700f4d227b5216d63658" + }, + "out": { + "address": "purple1kptw2wdm4az8hgv08ufm0y5hqyglc7yn86m8qr6dyfa4y9kkxevqmkm9q3" + } + }, + { + "in": { + "checksum": "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff", + "salt": "61", + "msg": "{\"some\":123,\"structure\":{\"nested\":[\"ok\",true]}}" + }, + "intermediate": { + "key": "7761736d00000000000000002013a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a500000000000000209999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff000000000000000161000000000000002f7b22736f6d65223a3132332c22737472756374757265223a7b226e6573746564223a5b226f6b222c747275655d7d7d", + "addressData": "6c98434180f052294ff89fb6d2dae34f9f4468b0b8e6e7c002b2a44adee39abd" + }, + "out": { + "address": "purple1djvyxsvq7pfzjnlcn7md9khrf705g69shrnw0sqzk2jy4hhrn27sjh2ysy" + } + }, + { + "in": { + "checksum": "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff", + "salt": "aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae", + "msg": null + }, + "intermediate": { + "key": "7761736d00000000000000002013a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a500000000000000209999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff0000000000000040aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae0000000000000000", + "addressData": "0aaf1c31c5d529d21d898775bc35b3416f47bfd99188c334c6c716102cbd3101" + }, + "out": { + "address": "purple1p2h3cvw9655ay8vfsa6mcddng9h5007ejxyvxdxxcutpqt9axyqsagmmay" + } + }, + { + "in": { + "checksum": "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff", + "salt": "aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae", + "msg": "{}" + }, + "intermediate": { + "key": "7761736d00000000000000002013a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a500000000000000209999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff0000000000000040aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae00000000000000027b7d", + "addressData": "36fe6ab732187cdfed46290b448b32eb7f4798e7a4968b0537de8a842cbf030e" + }, + "out": { + "address": "purple1xmlx4dejrp7dlm2x9y95fzejadl50x885jtgkpfhm69ggt9lqv8qk3vn4f" + } + }, + { + "in": { + "checksum": "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff", + "salt": "aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae", + "msg": "{\"some\":123,\"structure\":{\"nested\":[\"ok\",true]}}" + }, + "intermediate": { + "key": "7761736d00000000000000002013a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a500000000000000209999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff0000000000000040aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae000000000000002f7b22736f6d65223a3132332c22737472756374757265223a7b226e6573746564223a5b226f6b222c747275655d7d7d", + "addressData": "a0d0c942adac6f3e5e7c23116c4c42a24e96e0ab75f53690ec2d3de16067c751" + }, + "out": { + "address": "purple15rgvjs4d43hnuhnuyvgkcnzz5f8fdc9twh6ndy8v9577zcr8cags40l9dt" + } + }, + { + "in": { + "checksum": "1da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbcccccccccc", + "salt": "61", + "msg": null + }, + "intermediate": { + "key": "7761736d0000000000000000201da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b00000000000000149999999999aaaaaaaaaabbbbbbbbbbcccccccccc0000000000000001610000000000000000", + "addressData": "b95c467218d408a0f93046f227b6ece7fe18133ff30113db4d2a7becdfeca141" + }, + "out": { + "address": "purple1h9wyvusc6sy2p7fsgmez0dhvullpsyel7vq38k6d9fa7ehlv59qsvnyh36" + } + }, + { + "in": { + "checksum": "1da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbcccccccccc", + "salt": "61", + "msg": "{}" + }, + "intermediate": { + "key": "7761736d0000000000000000201da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b00000000000000149999999999aaaaaaaaaabbbbbbbbbbcccccccccc00000000000000016100000000000000027b7d", + "addressData": "23fe45dbbd45dc6cd25244a74b6e99e7a65bf0bac2f2842a05049d37555a3ae6" + }, + "out": { + "address": "purple1y0lytkaaghwxe5jjgjn5km5eu7n9hu96ctegg2s9qjwnw4268tnqxhg60a" + } + }, + { + "in": { + "checksum": "1da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbcccccccccc", + "salt": "61", + "msg": "{\"some\":123,\"structure\":{\"nested\":[\"ok\",true]}}" + }, + "intermediate": { + "key": "7761736d0000000000000000201da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b00000000000000149999999999aaaaaaaaaabbbbbbbbbbcccccccccc000000000000000161000000000000002f7b22736f6d65223a3132332c22737472756374757265223a7b226e6573746564223a5b226f6b222c747275655d7d7d", + "addressData": "6faea261ed63baa65b05726269e83b217fa6205dc7d9fb74f9667d004a69c082" + }, + "out": { + "address": "purple1d7h2yc0dvwa2vkc9wf3xn6pmy9l6vgzaclvlka8eve7sqjnfczpqqsdnwu" + } + }, + { + "in": { + "checksum": "1da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbcccccccccc", + "salt": "aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae", + "msg": null + }, + "intermediate": { + "key": "7761736d0000000000000000201da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b00000000000000149999999999aaaaaaaaaabbbbbbbbbbcccccccccc0000000000000040aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae0000000000000000", + "addressData": "67a3ab6384729925fdb144574628ce96836fe098d2c6be4e84ac106b2728d96c" + }, + "out": { + "address": "purple1v736kcuyw2vjtld3g3t5v2xwj6pklcyc6trtun5y4sgxkfegm9kq7vgpnt" + } + }, + { + "in": { + "checksum": "1da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbcccccccccc", + "salt": "aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae", + "msg": "{}" + }, + "intermediate": { + "key": "7761736d0000000000000000201da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b00000000000000149999999999aaaaaaaaaabbbbbbbbbbcccccccccc0000000000000040aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae00000000000000027b7d", + "addressData": "23a121263bfce05c144f4af86f3d8a9f87dc56f9dc48dbcffc8c5a614da4c661" + }, + "out": { + "address": "purple1ywsjzf3mlns9c9z0ftux70v2n7rac4hem3ydhnlu33dxzndycesssc7x2m" + } + }, + { + "in": { + "checksum": "1da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbcccccccccc", + "salt": "aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae", + "msg": "{\"some\":123,\"structure\":{\"nested\":[\"ok\",true]}}" + }, + "intermediate": { + "key": "7761736d0000000000000000201da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b00000000000000149999999999aaaaaaaaaabbbbbbbbbbcccccccccc0000000000000040aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae000000000000002f7b22736f6d65223a3132332c22737472756374757265223a7b226e6573746564223a5b226f6b222c747275655d7d7d", + "addressData": "dd90dba6d6fcd5fb9c9c8f536314eb1bb29cb5aa084b633c5806b926a5636b58" + }, + "out": { + "address": "purple1mkgdhfkkln2lh8yu3afkx98trwefedd2pp9kx0zcq6ujdftrddvq50esay" + } + }, + { + "in": { + "checksum": "1da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff", + "salt": "61", + "msg": null + }, + "intermediate": { + "key": "7761736d0000000000000000201da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b00000000000000209999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff0000000000000001610000000000000000", + "addressData": "547a743022f4f1af05b102f57bf1c1c7d7ee81bae427dc20d36b2c4ec57612ae" + }, + "out": { + "address": "purple123a8gvpz7nc67pd3qt6hhuwpclt7aqd6usnacgxndvkya3tkz2hq5hz38f" + } + }, + { + "in": { + "checksum": "1da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff", + "salt": "61", + "msg": "{}" + }, + "intermediate": { + "key": "7761736d0000000000000000201da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b00000000000000209999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff00000000000000016100000000000000027b7d", + "addressData": "416e169110e4b411bc53162d7503b2bbf14d6b36b1413a4f4c9af622696e9665" + }, + "out": { + "address": "purple1g9hpdygsuj6pr0znzckh2qajh0c566ekk9qn5n6vntmzy6twjejsrl9alk" + } + }, + { + "in": { + "checksum": "1da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff", + "salt": "61", + "msg": "{\"some\":123,\"structure\":{\"nested\":[\"ok\",true]}}" + }, + "intermediate": { + "key": "7761736d0000000000000000201da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b00000000000000209999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff000000000000000161000000000000002f7b22736f6d65223a3132332c22737472756374757265223a7b226e6573746564223a5b226f6b222c747275655d7d7d", + "addressData": "619a0988b92d8796cea91dea63cbb1f1aefa4a6b6ee5c5d1e937007252697220" + }, + "out": { + "address": "purple1vxdqnz9e9kredn4frh4x8ja37xh05jntdmjut50fxuq8y5nfwgsquu9mxh" + } + }, + { + "in": { + "checksum": "1da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff", + "salt": "aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae", + "msg": null + }, + "intermediate": { + "key": "7761736d0000000000000000201da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b00000000000000209999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff0000000000000040aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae0000000000000000", + "addressData": "d8af856a6a04852d19b647ad6d4336eb26e077f740aef1a0331db34d299a885a" + }, + "out": { + "address": "purple1mzhc26n2qjzj6xdkg7kk6sekavnwqalhgzh0rgpnrke562v63pdq8grp8q" + } + }, + { + "in": { + "checksum": "1da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff", + "salt": "aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae", + "msg": "{}" + }, + "intermediate": { + "key": "7761736d0000000000000000201da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b00000000000000209999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff0000000000000040aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae00000000000000027b7d", + "addressData": "c7fb7bea96daab23e416c4fcf328215303005e1d0d5424257335568e5381e33c" + }, + "out": { + "address": "purple1clahh65km24j8eqkcn70x2pp2vpsqhsap42zgftnx4tgu5upuv7q9ywjws" + } + }, + { + "in": { + "checksum": "1da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff", + "salt": "aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae", + "msg": "{\"some\":123,\"structure\":{\"nested\":[\"ok\",true]}}" + }, + "intermediate": { + "key": "7761736d0000000000000000201da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b00000000000000209999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff0000000000000040aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae000000000000002f7b22736f6d65223a3132332c22737472756374757265223a7b226e6573746564223a5b226f6b222c747275655d7d7d", + "addressData": "ccdf9dea141a6c2475870529ab38fae9dec30df28e005894fe6578b66133ab4a" + }, + "out": { + "address": "purple1en0em6s5rfkzgav8q556kw86a80vxr0j3cq93987v4utvcfn4d9q0tql4w" + } + } +] From e05b74e82c3e16a94de64984ccaf3e47885cadc8 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 21 Nov 2022 19:16:11 +0100 Subject: [PATCH 0017/2372] Test Basic Address hash --- packages/std/src/addresses.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index 8b1d0102b4..9112fac447 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -804,4 +804,14 @@ mod tests { assert_eq!(addr, intermediate.address_data); } } + + #[test] + fn hash_works() { + // Test case from https://github.com/cosmos/cosmos-sdk/blob/v0.47.0-alpha1/types/address/hash_test.go#L19-L24 + let expected = [ + 195, 235, 23, 251, 9, 99, 177, 195, 81, 122, 182, 124, 36, 113, 245, 156, 76, 188, 221, + 83, 181, 192, 227, 82, 100, 177, 161, 133, 240, 160, 5, 25, + ]; + assert_eq!(hash("1", &[1]), expected); + } } From b1215387410c33c778d86ba9e642b410bdcaaf19 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 21 Nov 2022 19:16:30 +0100 Subject: [PATCH 0018/2372] Fix doc text --- packages/std/src/addresses.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index 9112fac447..93248e0018 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -285,7 +285,7 @@ pub enum Instantiate2AddressError { /// Creates a contract address using the predictable address format introduced with /// wasmd 0.29. When using instantiate2, this is a way to precompute the address. -/// Then using instantiate, the contract address will use a different algorithm and +/// When using instantiate, the contract address will use a different algorithm and /// cannot be pre-computed as it contains inputs from the chain's state at the time of /// message execution. /// From 4e844177a936656ba1c3c981c759d4cdb24fc7b3 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 22 Nov 2022 11:10:00 +0100 Subject: [PATCH 0019/2372] Add CHANGELOG entry for instantiate2_address --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c28ed4589..1b19dd6701 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,9 +12,12 @@ and this project adheres to the `cosmwasm_1_2` feature needs to be enabled for the `cosmwasm_std` dependency. This makes the contract incompatible with chains running versions of CosmWasm earlier than 1.2.0 ([#1481]). +- cosmwasm-std: Add `instantiate2_address` which allows calculating the + predictable addresses for `MsgInstantiateContract2` ([#1437]). - cosmwasm-schema: In contracts, `cosmwasm schema` will now output a separate JSON Schema file for each entrypoint in the `raw` subdirectory. +[#1437]: https://github.com/CosmWasm/cosmwasm/issues/1437 [#1481]: https://github.com/CosmWasm/cosmwasm/pull/1481 ### Changed From b54c8ed0d6c139120737767fdab989d74159a479 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 22 Nov 2022 14:43:19 +0100 Subject: [PATCH 0020/2372] docs: provide a list of all built-in capabilities --- docs/CAPABILITIES-BUILT-IN.md | 17 +++++++++++++++++ docs/CAPABILITIES.md | 11 +---------- 2 files changed, 18 insertions(+), 10 deletions(-) create mode 100644 docs/CAPABILITIES-BUILT-IN.md diff --git a/docs/CAPABILITIES-BUILT-IN.md b/docs/CAPABILITIES-BUILT-IN.md new file mode 100644 index 0000000000..c3e425e554 --- /dev/null +++ b/docs/CAPABILITIES-BUILT-IN.md @@ -0,0 +1,17 @@ +# Built-in capabilities + +Since capabilities can be created between contract and environment, we don't +know them all in the VM. This is a list of all built-in capabilities, but chains +might define others. + +- `iterator` is for storage backends that allow range queries. Not all types of + databases do that. There are trees that don't allow it and Secret Network does + not support iterators for other technical reasons. +- `stargate` is for messages and queries that came with the Cosmos SDK upgrade + "Stargate". It primarily includes protobuf messages and IBC support. +- `staking` is for chains with the Cosmos SDK staking module. There are Cosmos + chains that don't use this (e.g. Tgrade). +- `cosmwasm_1_1` enables the `BankQuery::Supply` query. Only chains running + CosmWasm `1.1.0` or higher support this query. +- `cosmwasm_1_2` enables the `GovMsg::VoteWeighted` message. Only chains running + CosmWasm `1.2.0` or higher support this query. diff --git a/docs/CAPABILITIES.md b/docs/CAPABILITIES.md index 2679f5dd7c..0886d15b64 100644 --- a/docs/CAPABILITIES.md +++ b/docs/CAPABILITIES.md @@ -83,16 +83,7 @@ underscores. ## Common capabilities -Here is a list of capabilities created in the past. Since capabilities can be -created between contract and environment, we don't know them all in the VM. - -- `iterator` is for storage backends that allow range queries. Not all types of - databases do that. There are trees that don't allow it and Secret Network does - not support iterators for other technical reasons. -- `stargate` is for messages and queries that came with the Cosmos SDK upgrade - "Stargate". It primarily includes protobuf messages and IBC support. -- `staking` is for chains with the Cosmos SDK staking module. There are Cosmos - chains that don't use this (e.g. Tgrade). +Here is a list of all [built-in capabilities](CAPABILITIES-BUILT-IN.md). ## What's a good capability? From 46350b89c750c4fbbd4aaa5b974bf63c5c2dca06 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 22 Nov 2022 14:45:19 +0100 Subject: [PATCH 0021/2372] Revert "docs: provide a list of all built-in capabilities" This reverts commit b54c8ed0d6c139120737767fdab989d74159a479. --- docs/CAPABILITIES-BUILT-IN.md | 17 ----------------- docs/CAPABILITIES.md | 11 ++++++++++- 2 files changed, 10 insertions(+), 18 deletions(-) delete mode 100644 docs/CAPABILITIES-BUILT-IN.md diff --git a/docs/CAPABILITIES-BUILT-IN.md b/docs/CAPABILITIES-BUILT-IN.md deleted file mode 100644 index c3e425e554..0000000000 --- a/docs/CAPABILITIES-BUILT-IN.md +++ /dev/null @@ -1,17 +0,0 @@ -# Built-in capabilities - -Since capabilities can be created between contract and environment, we don't -know them all in the VM. This is a list of all built-in capabilities, but chains -might define others. - -- `iterator` is for storage backends that allow range queries. Not all types of - databases do that. There are trees that don't allow it and Secret Network does - not support iterators for other technical reasons. -- `stargate` is for messages and queries that came with the Cosmos SDK upgrade - "Stargate". It primarily includes protobuf messages and IBC support. -- `staking` is for chains with the Cosmos SDK staking module. There are Cosmos - chains that don't use this (e.g. Tgrade). -- `cosmwasm_1_1` enables the `BankQuery::Supply` query. Only chains running - CosmWasm `1.1.0` or higher support this query. -- `cosmwasm_1_2` enables the `GovMsg::VoteWeighted` message. Only chains running - CosmWasm `1.2.0` or higher support this query. diff --git a/docs/CAPABILITIES.md b/docs/CAPABILITIES.md index 0886d15b64..2679f5dd7c 100644 --- a/docs/CAPABILITIES.md +++ b/docs/CAPABILITIES.md @@ -83,7 +83,16 @@ underscores. ## Common capabilities -Here is a list of all [built-in capabilities](CAPABILITIES-BUILT-IN.md). +Here is a list of capabilities created in the past. Since capabilities can be +created between contract and environment, we don't know them all in the VM. + +- `iterator` is for storage backends that allow range queries. Not all types of + databases do that. There are trees that don't allow it and Secret Network does + not support iterators for other technical reasons. +- `stargate` is for messages and queries that came with the Cosmos SDK upgrade + "Stargate". It primarily includes protobuf messages and IBC support. +- `staking` is for chains with the Cosmos SDK staking module. There are Cosmos + chains that don't use this (e.g. Tgrade). ## What's a good capability? From 9fd98903ecbe02d892dfd86ede20ec55203fe434 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 22 Nov 2022 14:46:34 +0100 Subject: [PATCH 0022/2372] docs: provide a list of all built-in capabilities --- docs/CAPABILITIES-BUILT-IN.md | 17 +++++++++++++++++ docs/CAPABILITIES.md | 11 +---------- 2 files changed, 18 insertions(+), 10 deletions(-) create mode 100644 docs/CAPABILITIES-BUILT-IN.md diff --git a/docs/CAPABILITIES-BUILT-IN.md b/docs/CAPABILITIES-BUILT-IN.md new file mode 100644 index 0000000000..c3e425e554 --- /dev/null +++ b/docs/CAPABILITIES-BUILT-IN.md @@ -0,0 +1,17 @@ +# Built-in capabilities + +Since capabilities can be created between contract and environment, we don't +know them all in the VM. This is a list of all built-in capabilities, but chains +might define others. + +- `iterator` is for storage backends that allow range queries. Not all types of + databases do that. There are trees that don't allow it and Secret Network does + not support iterators for other technical reasons. +- `stargate` is for messages and queries that came with the Cosmos SDK upgrade + "Stargate". It primarily includes protobuf messages and IBC support. +- `staking` is for chains with the Cosmos SDK staking module. There are Cosmos + chains that don't use this (e.g. Tgrade). +- `cosmwasm_1_1` enables the `BankQuery::Supply` query. Only chains running + CosmWasm `1.1.0` or higher support this query. +- `cosmwasm_1_2` enables the `GovMsg::VoteWeighted` message. Only chains running + CosmWasm `1.2.0` or higher support this query. diff --git a/docs/CAPABILITIES.md b/docs/CAPABILITIES.md index 2679f5dd7c..0886d15b64 100644 --- a/docs/CAPABILITIES.md +++ b/docs/CAPABILITIES.md @@ -83,16 +83,7 @@ underscores. ## Common capabilities -Here is a list of capabilities created in the past. Since capabilities can be -created between contract and environment, we don't know them all in the VM. - -- `iterator` is for storage backends that allow range queries. Not all types of - databases do that. There are trees that don't allow it and Secret Network does - not support iterators for other technical reasons. -- `stargate` is for messages and queries that came with the Cosmos SDK upgrade - "Stargate". It primarily includes protobuf messages and IBC support. -- `staking` is for chains with the Cosmos SDK staking module. There are Cosmos - chains that don't use this (e.g. Tgrade). +Here is a list of all [built-in capabilities](CAPABILITIES-BUILT-IN.md). ## What's a good capability? From 6cbfcaa6d457862e19e4e227e031430db574ac82 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 22 Nov 2022 14:48:43 +0100 Subject: [PATCH 0023/2372] typo --- docs/CAPABILITIES-BUILT-IN.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/CAPABILITIES-BUILT-IN.md b/docs/CAPABILITIES-BUILT-IN.md index c3e425e554..f0cabc280b 100644 --- a/docs/CAPABILITIES-BUILT-IN.md +++ b/docs/CAPABILITIES-BUILT-IN.md @@ -12,6 +12,6 @@ might define others. - `staking` is for chains with the Cosmos SDK staking module. There are Cosmos chains that don't use this (e.g. Tgrade). - `cosmwasm_1_1` enables the `BankQuery::Supply` query. Only chains running - CosmWasm `1.1.0` or higher support this query. + CosmWasm `1.1.0` or higher support this. - `cosmwasm_1_2` enables the `GovMsg::VoteWeighted` message. Only chains running - CosmWasm `1.2.0` or higher support this query. + CosmWasm `1.2.0` or higher support this. From 0f4468a3f153da726c42343fbf1722c857487c13 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 22 Nov 2022 15:16:54 +0100 Subject: [PATCH 0024/2372] Update docs/CAPABILITIES.md Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- docs/CAPABILITIES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/CAPABILITIES.md b/docs/CAPABILITIES.md index 0886d15b64..e647274c85 100644 --- a/docs/CAPABILITIES.md +++ b/docs/CAPABILITIES.md @@ -81,7 +81,7 @@ function name in Rust and other CosmWasm smart contract languages such as Go. By convention, the name should be short and all lower ASCII alphanumerical plus underscores. -## Common capabilities +## Built-in capabilities Here is a list of all [built-in capabilities](CAPABILITIES-BUILT-IN.md). From 546cb4a6bd3d3005db18f729eb7531312bf0f6bb Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 23 Nov 2022 18:30:08 +0100 Subject: [PATCH 0025/2372] Use Display representation for embedding Wasmer InstantiationErrors --- CHANGELOG.md | 3 +++ packages/vm/src/instance.rs | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b1953c0b3b..34c3b1682f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,8 +26,11 @@ and this project adheres to cosmwasm-vm on Windows. This gives us confidence for integrating cosmwasm-vm in a libwasmvm build on Windows. This change is likely to be consensus breaking as error messages change. ([#1406]) +- cosmwasm-vm: Use `Display` representation for embedding Wasmer + `InstantiationError`s ([#1508]). [#1406]: https://github.com/CosmWasm/cosmwasm/pull/1406 +[#1508]: https://github.com/CosmWasm/cosmwasm/issues/1508 ## [1.1.8] - 2022-11-22 diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 66801435c7..706f261716 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -231,7 +231,7 @@ where WasmerInstance::new(module, &import_obj) } .map_err(|original| { - VmError::instantiation_err(format!("Error instantiating module: {:?}", original)) + VmError::instantiation_err(format!("Error instantiating module: {original}")) })?, ); From 52d26594c1089af05fd1d33dab0d4dae037b3278 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 23 Nov 2022 19:18:58 +0100 Subject: [PATCH 0026/2372] Fix link to cargo registry on Windows --- .circleci/config.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index cd8159bc5b..3e32556e5c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -404,7 +404,7 @@ jobs: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_vm_windows-rust:1.65.0-{{ checksum "Cargo.lock" }} + - cachev3-package_vm_windows-rust:1.65.0-{{ checksum "Cargo.lock" }} - run: name: Test working_directory: ~/project/packages/vm @@ -415,11 +415,12 @@ jobs: command: cargo test --locked --features allow_interface_version_7,iterator,staking,stargate - save_cache: paths: - - /usr/local/cargo/registry + # ".." is the easiest way to get $HOME here (pwd is $HOME\project) + - ../.cargo/registry - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_vm_windows-rust:1.65.0-{{ checksum "Cargo.lock" }} + key: cachev3-package_vm_windows-rust:1.65.0-{{ checksum "Cargo.lock" }} contract_burner: docker: From 01f74b252393320749f2ceffe4de37e030e4a3a0 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 28 Nov 2022 10:42:41 +0100 Subject: [PATCH 0027/2372] Remove check_contract implementation --- packages/vm/examples/check_contract.rs | 60 +++----------------------- 1 file changed, 6 insertions(+), 54 deletions(-) diff --git a/packages/vm/examples/check_contract.rs b/packages/vm/examples/check_contract.rs index 1d53b164ee..8b17dec808 100644 --- a/packages/vm/examples/check_contract.rs +++ b/packages/vm/examples/check_contract.rs @@ -1,57 +1,9 @@ -use std::fs::File; -use std::io::Read; - -use clap::{App, Arg}; - -use cosmwasm_vm::capabilities_from_csv; -use cosmwasm_vm::internals::{check_wasm, compile}; - -const DEFAULT_AVAILABLE_CAPABILITIES: &str = "iterator,staking,stargate,cosmwasm_1_1"; - pub fn main() { - eprintln!("`check_contract` will be removed from the next version of `cosmwasm-vm` - please use `cosmwasm-check` instead."); + eprintln!("`check_contract` has been removed from `cosmwasm-vm` examples - please use `cosmwasm-check` instead."); + eprintln!("See https://crates.io/crates/cosmwasm-check"); + eprintln!(); eprintln!("> cargo install cosmwasm-check"); - - let matches = App::new("Contract checking") - .version("0.1.0") - .long_about("Checks the given wasm file (memories, exports, imports, available capabilities, and non-determinism).") - .author("Mauro Lacy ") - .arg( - Arg::with_name("CAPABILITIES") - // `long` setting required to turn the position argument into an option 🤷 - .long("available-capabilities") - .aliases(&["FEATURES", "supported-features"]) // Old names - .value_name("CAPABILITIES") - .help("Sets the available capabilities that the desired target chain has") - .takes_value(true) - ) - .arg( - Arg::with_name("WASM") - .help("Wasm file to read and compile") - .required(true) - .index(1), - ) - .get_matches(); - - // Available capabilities - let available_capabilities_csv = matches - .value_of("CAPABILITIES") - .unwrap_or(DEFAULT_AVAILABLE_CAPABILITIES); - let available_capabilities = capabilities_from_csv(available_capabilities_csv); - println!("Available capabilities: {:?}", available_capabilities); - - // File - let path = matches.value_of("WASM").expect("Error parsing file name"); - let mut file = File::open(path).unwrap(); - - // Read wasm - let mut wasm = Vec::::new(); - file.read_to_end(&mut wasm).unwrap(); - - // Check wasm - check_wasm(&wasm, &available_capabilities).unwrap(); - - // Compile module - compile(&wasm, None, &[]).unwrap(); - println!("contract checks passed.") + eprintln!("> cosmwasm-check --help"); + eprintln!(); + std::process::exit(74); } From b2ad9ce2727af5516fdc3e2ef181a61e8481c9ae Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 28 Nov 2022 12:21:59 +0100 Subject: [PATCH 0028/2372] test nested QueryMsg with generics --- Cargo.lock | 56 +++++++++++++++--- packages/schema/Cargo.toml | 1 + packages/schema/tests/generics.rs | 4 ++ packages/schema/tests/idl.rs | 94 ++++++++++++++++++++----------- 4 files changed, 114 insertions(+), 41 deletions(-) create mode 100644 packages/schema/tests/generics.rs diff --git a/Cargo.lock b/Cargo.lock index 0c1203379c..858b9ddcf0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -251,7 +251,7 @@ dependencies = [ "anyhow", "clap", "colored", - "cosmwasm-std", + "cosmwasm-std 1.1.8", "cosmwasm-vm", ] @@ -274,11 +274,33 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cosmwasm-crypto" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "532d2ba11b7157e3b67114389925568af29ce3e452b582d6bdfe751cb2dadfb1" +dependencies = [ + "digest 0.10.3", + "ed25519-zebra", + "k256", + "rand_core 0.6.3", + "thiserror", +] + +[[package]] +name = "cosmwasm-derive" +version = "1.1.8" +dependencies = [ + "cosmwasm-std 1.1.8", + "syn", +] + [[package]] name = "cosmwasm-derive" version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8568b289cc366981319ab39edd85d666456456f7c126433ef065ebe5257f27b2" dependencies = [ - "cosmwasm-std", "syn", ] @@ -288,6 +310,7 @@ version = "1.1.8" dependencies = [ "anyhow", "cosmwasm-schema-derive", + "cosmwasm-std 1.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "schemars", "semver", "serde", @@ -311,8 +334,8 @@ version = "1.1.8" dependencies = [ "base64", "chrono", - "cosmwasm-crypto", - "cosmwasm-derive", + "cosmwasm-crypto 1.1.8", + "cosmwasm-derive 1.1.8", "cosmwasm-schema", "derivative", "forward_ref", @@ -327,11 +350,30 @@ dependencies = [ "uint", ] +[[package]] +name = "cosmwasm-std" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d1ceebd520a10167e35080e4f55f6b0284bb8ea364dec0f22197da96acd9e64" +dependencies = [ + "base64", + "cosmwasm-crypto 1.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cosmwasm-derive 1.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "derivative", + "forward_ref", + "hex", + "schemars", + "serde", + "serde-json-wasm", + "thiserror", + "uint", +] + [[package]] name = "cosmwasm-storage" version = "1.1.8" dependencies = [ - "cosmwasm-std", + "cosmwasm-std 1.1.8", "serde", ] @@ -343,8 +385,8 @@ dependencies = [ "bytecheck", "clap", "clru", - "cosmwasm-crypto", - "cosmwasm-std", + "cosmwasm-crypto 1.1.8", + "cosmwasm-std 1.1.8", "criterion", "enumset", "hex", diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index 543e9c460f..751c40b3c4 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -16,5 +16,6 @@ thiserror = "1.0.13" [dev-dependencies] anyhow = "1.0.57" +cosmwasm-std = "1.1.8" semver = "1" tempfile = "3" diff --git a/packages/schema/tests/generics.rs b/packages/schema/tests/generics.rs new file mode 100644 index 0000000000..aa1a62bbdc --- /dev/null +++ b/packages/schema/tests/generics.rs @@ -0,0 +1,4 @@ +use std::collections::HashMap; + +use cosmwasm_schema::{cw_serde, generate_api, QueryResponses, IDL_VERSION}; +use serde_json::Value; diff --git a/packages/schema/tests/idl.rs b/packages/schema/tests/idl.rs index 5f1f8b036d..16442fc328 100644 --- a/packages/schema/tests/idl.rs +++ b/packages/schema/tests/idl.rs @@ -1,36 +1,32 @@ use std::collections::HashMap; -use cosmwasm_schema::{generate_api, QueryResponses, IDL_VERSION}; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; +use cosmwasm_schema::{cw_serde, generate_api, QueryResponses, IDL_VERSION}; use serde_json::Value; -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[cw_serde] pub struct InstantiateMsg { pub admin: String, pub cap: u128, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] -#[serde(rename_all = "snake_case")] +#[cw_serde] pub enum ExecuteMsg { Mint { amount: u128 }, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, QueryResponses)] -#[serde(rename_all = "snake_case")] +#[cw_serde] +#[derive(QueryResponses)] pub enum QueryMsg { #[returns(u128)] Balance { account: String }, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] -#[serde(rename_all = "snake_case")] +#[cw_serde] pub enum SudoMsg { SetAdmin { new_admin: String }, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[cw_serde] pub struct MigrateMsg { pub admin: String, pub cap: u128, @@ -107,15 +103,15 @@ fn test_query_responses() { api.get("responses").unwrap().get("balance").unwrap(); } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, QueryResponses)] -#[serde(rename_all = "snake_case")] +#[cw_serde] +#[derive(QueryResponses)] pub enum QueryMsgWithGenerics { #[returns(u128)] QueryData { data: T }, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, QueryResponses)] -#[serde(rename_all = "snake_case")] +#[cw_serde] +#[derive(QueryResponses)] pub enum QueryMsgWithGenericsAndTraitBounds where T: PartialEq, @@ -124,8 +120,8 @@ where QueryData { data: T }, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, QueryResponses)] -#[serde(rename_all = "snake_case")] +#[cw_serde] +#[derive(QueryResponses)] pub enum QueryMsgWithGenericsAndDefaultType { #[returns(u128)] QueryData { data: T }, @@ -191,7 +187,8 @@ fn test_query_responses_generics_and_trait_bounds() { api.get("responses").unwrap().get("query_data").unwrap(); } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, QueryResponses)] +#[cw_serde] +#[derive(QueryResponses)] #[serde(untagged)] #[query_responses(nested)] pub enum NestedQueryMsg { @@ -199,24 +196,15 @@ pub enum NestedQueryMsg { Sub(SubQueryMsg1), } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, QueryResponses)] -#[serde(rename_all = "snake_case")] +#[cw_serde] +#[derive(QueryResponses)] pub enum SubQueryMsg1 { #[returns(u128)] Variant1 { test: String }, } -#[test] -fn test_nested_query_responses() { - let api_str = generate_api! { - instantiate: InstantiateMsg, - query: NestedQueryMsg, - } - .render() - .to_string() - .unwrap(); - - let api: Value = serde_json::from_str(&api_str).unwrap(); +fn test_nested_query_responses_impl(api: &str) { + let api: Value = serde_json::from_str(api).unwrap(); let queries = api .get("query") .unwrap() @@ -274,14 +262,52 @@ fn test_nested_query_responses() { api.get("responses").unwrap().get("variant1").unwrap(); } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, QueryResponses)] -#[serde(rename_all = "snake_case")] +#[test] +fn test_nested_query_responses() { + let api_str = generate_api! { + instantiate: InstantiateMsg, + query: NestedQueryMsg, + } + .render() + .to_string() + .unwrap(); + + test_nested_query_responses_impl(&api_str); +} + +#[cw_serde] +#[derive(QueryResponses)] +#[serde(untagged)] +#[query_responses(nested)] +pub enum NestedQueryMsgGenerics { + /// A configuration message to a base implementation. + Query(T), + /// Custom query + Sub(U), +} + +#[test] +fn test_nested_query_responses_with_generics() { + let api_str = generate_api! { + instantiate: InstantiateMsg, + query: NestedQueryMsgGenerics, + } + .render() + .to_string() + .unwrap(); + + test_nested_query_responses_impl(&api_str); +} + +#[cw_serde] +#[derive(QueryResponses)] enum QueryMsg2 { #[returns(u128)] Balance {}, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, QueryResponses)] +#[cw_serde] +#[derive(QueryResponses)] #[query_responses(nested)] enum NestedNameCollision { Q1(QueryMsg), From 25ae6ebddff2f7418a96bdae8fa531c92b26adc3 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 28 Nov 2022 12:45:22 +0100 Subject: [PATCH 0029/2372] Support nested QueryMsg with generics --- packages/schema-derive/src/query_responses.rs | 19 +++++++++----- packages/schema/tests/generics.rs | 4 --- packages/schema/tests/idl.rs | 26 +++++++++---------- 3 files changed, 26 insertions(+), 23 deletions(-) delete mode 100644 packages/schema/tests/generics.rs diff --git a/packages/schema-derive/src/query_responses.rs b/packages/schema-derive/src/query_responses.rs index 195bb93d78..f3d9b755de 100644 --- a/packages/schema-derive/src/query_responses.rs +++ b/packages/schema-derive/src/query_responses.rs @@ -1,6 +1,8 @@ mod context; -use syn::{parse_quote, Expr, ExprTuple, Generics, ItemEnum, ItemImpl, Type, Variant}; +use syn::{ + parse_quote, Expr, ExprTuple, Generics, ItemEnum, ItemImpl, Type, TypeParamBound, Variant, +}; use self::context::Context; @@ -13,7 +15,11 @@ pub fn query_responses_derive_impl(input: ItemEnum) -> ItemImpl { // Handle generics if the type has any let (_, type_generics, where_clause) = input.generics.split_for_impl(); - let impl_generics = impl_generics(&ctx, &input.generics); + let impl_generics = impl_generics( + &ctx, + &input.generics, + &[parse_quote! {::cosmwasm_schema::QueryResponses}], + ); let subquery_len = subquery_calls.len(); parse_quote! { @@ -24,7 +30,7 @@ pub fn query_responses_derive_impl(input: ItemEnum) -> ItemImpl { let subqueries = [ #( #subquery_calls, )* ]; - ::cosmwasm_schema::combine_subqueries::<#subquery_len, #ident>(subqueries) + ::cosmwasm_schema::combine_subqueries::<#subquery_len, #ident #type_generics>(subqueries) } } } @@ -37,7 +43,7 @@ pub fn query_responses_derive_impl(input: ItemEnum) -> ItemImpl { // Handle generics if the type has any let (_, type_generics, where_clause) = input.generics.split_for_impl(); - let impl_generics = impl_generics(&ctx, &input.generics); + let impl_generics = impl_generics(&ctx, &input.generics, &[]); parse_quote! { #[automatically_derived] @@ -55,7 +61,7 @@ pub fn query_responses_derive_impl(input: ItemEnum) -> ItemImpl { /// Takes a list of generics from the type definition and produces a list of generics /// for the expanded `impl` block, adding trait bounds like `JsonSchema` as appropriate. -fn impl_generics(ctx: &Context, generics: &Generics) -> Generics { +fn impl_generics(ctx: &Context, generics: &Generics, bounds: &[TypeParamBound]) -> Generics { let mut impl_generics = generics.to_owned(); for param in impl_generics.type_params_mut() { // remove the default type if present, as those are invalid in @@ -65,7 +71,8 @@ fn impl_generics(ctx: &Context, generics: &Generics) -> Generics { if !ctx.no_bounds_for.contains(¶m.ident) { param .bounds - .push(parse_quote! {::cosmwasm_schema::schemars::JsonSchema}) + .push(parse_quote! {::cosmwasm_schema::schemars::JsonSchema}); + param.bounds.extend(bounds.to_owned()); } } diff --git a/packages/schema/tests/generics.rs b/packages/schema/tests/generics.rs deleted file mode 100644 index aa1a62bbdc..0000000000 --- a/packages/schema/tests/generics.rs +++ /dev/null @@ -1,4 +0,0 @@ -use std::collections::HashMap; - -use cosmwasm_schema::{cw_serde, generate_api, QueryResponses, IDL_VERSION}; -use serde_json::Value; diff --git a/packages/schema/tests/idl.rs b/packages/schema/tests/idl.rs index 16442fc328..0ef92a826b 100644 --- a/packages/schema/tests/idl.rs +++ b/packages/schema/tests/idl.rs @@ -279,25 +279,25 @@ fn test_nested_query_responses() { #[derive(QueryResponses)] #[serde(untagged)] #[query_responses(nested)] -pub enum NestedQueryMsgGenerics { +pub enum NestedQueryMsgGenerics { /// A configuration message to a base implementation. Query(T), /// Custom query Sub(U), } -#[test] -fn test_nested_query_responses_with_generics() { - let api_str = generate_api! { - instantiate: InstantiateMsg, - query: NestedQueryMsgGenerics, - } - .render() - .to_string() - .unwrap(); - - test_nested_query_responses_impl(&api_str); -} +// #[test] +// fn test_nested_query_responses_with_generics() { +// let api_str = generate_api! { +// instantiate: InstantiateMsg, +// query: NestedQueryMsgGenerics, +// } +// .render() +// .to_string() +// .unwrap(); + +// test_nested_query_responses_impl(&api_str); +// } #[cw_serde] #[derive(QueryResponses)] From 72ab73400ac005d230e30553fcf6f6f89d79384c Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 28 Nov 2022 12:51:25 +0100 Subject: [PATCH 0030/2372] Update CHANGELOG --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 34c3b1682f..97bc9c80dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,13 @@ and this project adheres to [#1406]: https://github.com/CosmWasm/cosmwasm/pull/1406 [#1508]: https://github.com/CosmWasm/cosmwasm/issues/1508 +### Fixed + +- cosmwasm-schema: Nested QueryMsg with generics is now supported by the + QueryResponses macro ([#1516]). + +[#1516]: https://github.com/CosmWasm/cosmwasm/issues/1516 + ## [1.1.8] - 2022-11-22 ### Fixed From 5de0bf428a43e311e042539cf5063f29eb6db436 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 28 Nov 2022 17:42:58 +0100 Subject: [PATCH 0031/2372] Test nested QueryMsg w generics --- packages/schema/src/query_response.rs | 2 +- packages/schema/tests/idl.rs | 26 ++++++++++++-------------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/packages/schema/src/query_response.rs b/packages/schema/src/query_response.rs index 20cf84e261..3917470ec0 100644 --- a/packages/schema/src/query_response.rs +++ b/packages/schema/src/query_response.rs @@ -170,7 +170,7 @@ fn check_api_integrity( // If `any_of` exists, we assume schema is generated from untagged enum any_of .into_iter() - .map(|schema| dbg!(schema.into_object())) + .map(|schema| schema.into_object()) .filter_map(|obj| { if let Some(reference) = obj.reference { // Subschemas can be hidden behind references - we want to map them to proper diff --git a/packages/schema/tests/idl.rs b/packages/schema/tests/idl.rs index 0ef92a826b..2b35c7f8c6 100644 --- a/packages/schema/tests/idl.rs +++ b/packages/schema/tests/idl.rs @@ -280,24 +280,22 @@ fn test_nested_query_responses() { #[serde(untagged)] #[query_responses(nested)] pub enum NestedQueryMsgGenerics { - /// A configuration message to a base implementation. Query(T), - /// Custom query Sub(U), } -// #[test] -// fn test_nested_query_responses_with_generics() { -// let api_str = generate_api! { -// instantiate: InstantiateMsg, -// query: NestedQueryMsgGenerics, -// } -// .render() -// .to_string() -// .unwrap(); - -// test_nested_query_responses_impl(&api_str); -// } +#[test] +fn test_nested_query_responses_with_generics() { + let api_str = generate_api! { + instantiate: InstantiateMsg, + query: NestedQueryMsgGenerics, + } + .render() + .to_string() + .unwrap(); + + test_nested_query_responses_impl(&api_str); +} #[cw_serde] #[derive(QueryResponses)] From e4000df9d275c83a3242d4e81f9cb2367d1c498e Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 28 Nov 2022 20:26:23 +0100 Subject: [PATCH 0032/2372] Fix nested QueryMsg with doc comments errors --- CHANGELOG.md | 2 + packages/schema/src/query_response.rs | 136 +------------------------- packages/schema/tests/idl.rs | 68 +------------ 3 files changed, 6 insertions(+), 200 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 97bc9c80dd..1d780adf87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,8 @@ and this project adheres to - cosmwasm-schema: Nested QueryMsg with generics is now supported by the QueryResponses macro ([#1516]). +- cosmwasm-schema: A nested QueryMsg no longer causes runtime errors if it + contains doc comments. [#1516]: https://github.com/CosmWasm/cosmwasm/issues/1516 diff --git a/packages/schema/src/query_response.rs b/packages/schema/src/query_response.rs index 3917470ec0..85ecc7f3b2 100644 --- a/packages/schema/src/query_response.rs +++ b/packages/schema/src/query_response.rs @@ -1,9 +1,6 @@ use std::collections::{BTreeMap, BTreeSet}; -use schemars::{ - schema::{InstanceType, RootSchema, SingleOrVec, SubschemaValidation}, - JsonSchema, -}; +use schemars::{schema::RootSchema, JsonSchema}; use thiserror::Error; pub use cosmwasm_schema_derive::QueryResponses; @@ -69,10 +66,6 @@ pub trait QueryResponses: JsonSchema { fn response_schemas() -> Result, IntegrityError> { let response_schemas = Self::response_schemas_impl(); - let queries: BTreeSet<_> = response_schemas.keys().cloned().collect(); - - check_api_integrity::(queries)?; - Ok(response_schemas) } @@ -95,121 +88,6 @@ pub fn combine_subqueries( map } -/// Returns possible enum variants from `one_of` analysis -fn enum_variants( - subschemas: SubschemaValidation, -) -> Result>, IntegrityError> { - let iter = subschemas - .one_of - .ok_or(IntegrityError::InvalidQueryMsgSchema)? - .into_iter() - .map(|s| { - let s = s.into_object(); - - if let Some(SingleOrVec::Single(ty)) = s.instance_type { - match *ty { - // We'll have an object if the Rust enum variant was C-like or tuple-like - InstanceType::Object => s - .object - .ok_or(IntegrityError::InvalidQueryMsgSchema)? - .required - .into_iter() - .next() - .ok_or(IntegrityError::InvalidQueryMsgSchema), - // We might have a string here if the Rust enum variant was unit-like - InstanceType::String => { - let values = s.enum_values.ok_or(IntegrityError::InvalidQueryMsgSchema)?; - - if values.len() != 1 { - return Err(IntegrityError::InvalidQueryMsgSchema); - } - - values[0] - .as_str() - .map(String::from) - .ok_or(IntegrityError::InvalidQueryMsgSchema) - } - _ => Err(IntegrityError::InvalidQueryMsgSchema), - } - } else { - Err(IntegrityError::InvalidQueryMsgSchema) - } - }); - - Ok(iter) -} - -fn verify_queries( - query_msg: BTreeSet, - responses: BTreeSet, -) -> Result<(), IntegrityError> { - if query_msg != responses { - return Err(IntegrityError::InconsistentQueries { - query_msg, - responses, - }); - } - - Ok(()) -} - -/// `generated_queries` is expected to be a sorted slice here! -fn check_api_integrity( - generated_queries: BTreeSet, -) -> Result<(), IntegrityError> { - let schema = crate::schema_for!(T); - - let subschemas = if let Some(subschemas) = schema.schema.subschemas { - subschemas - } else { - // No subschemas - no resposnes are expected - return verify_queries(BTreeSet::new(), generated_queries); - }; - - let schema_queries = if let Some(any_of) = subschemas.any_of { - // If `any_of` exists, we assume schema is generated from untagged enum - any_of - .into_iter() - .map(|schema| schema.into_object()) - .filter_map(|obj| { - if let Some(reference) = obj.reference { - // Subschemas can be hidden behind references - we want to map them to proper - // subschemas in such case - - // Only references to definitions are supported - let reference = match reference.strip_prefix("#/definitions/") { - Some(reference) => reference, - None => { - return Some(Err(IntegrityError::ExternalReference { - reference: reference.to_owned(), - })) - } - }; - - let schema = match schema.definitions.get(reference) { - Some(schema) => schema.clone(), - None => return Some(Err(IntegrityError::InvalidQueryMsgSchema)), - }; - - Ok(schema.into_object().subschemas).transpose() - } else { - Ok(obj.subschemas).transpose() - } - }) - .map(|subschema| enum_variants(*subschema?)) - .collect::, _>>()? - .into_iter() - .flatten() - .collect::>()? - } else { - // If `any_of` is not present, there was no untagged enum on top, we expect normal enum at - // this point - enum_variants(*subschemas)?.collect::>()? - }; - - verify_queries(schema_queries, generated_queries) -} - #[derive(Debug, Error, PartialEq, Eq)] pub enum IntegrityError { #[error("the structure of the QueryMsg schema was unexpected")] @@ -299,18 +177,6 @@ mod tests { } } - #[test] - fn bad_msg_fails() { - let err = BadMsg::response_schemas().unwrap_err(); - assert_eq!( - err, - IntegrityError::InconsistentQueries { - query_msg: BTreeSet::from(["balance-for".to_string()]), - responses: BTreeSet::from(["balance_for".to_string()]) - } - ); - } - #[derive(Debug, JsonSchema)] #[serde(rename_all = "snake_case")] #[allow(dead_code)] diff --git a/packages/schema/tests/idl.rs b/packages/schema/tests/idl.rs index 2b35c7f8c6..b8701d4231 100644 --- a/packages/schema/tests/idl.rs +++ b/packages/schema/tests/idl.rs @@ -203,76 +203,15 @@ pub enum SubQueryMsg1 { Variant1 { test: String }, } -fn test_nested_query_responses_impl(api: &str) { - let api: Value = serde_json::from_str(api).unwrap(); - let queries = api - .get("query") - .unwrap() - .get("anyOf") - .unwrap() - .as_array() - .unwrap(); - let definitions = api.get("query").unwrap().get("definitions").unwrap(); - - // Find the subqueries - assert_eq!(queries.len(), 2); - assert_eq!( - queries[0].get("$ref").unwrap().as_str().unwrap(), - "#/definitions/QueryMsg" - ); - assert_eq!( - queries[1].get("$ref").unwrap().as_str().unwrap(), - "#/definitions/SubQueryMsg1" - ); - let query_msg_queries = definitions - .get("QueryMsg") - .unwrap() - .get("oneOf") - .unwrap() - .as_array() - .unwrap(); - let sub_query_msg_queries = definitions - .get("SubQueryMsg1") - .unwrap() - .get("oneOf") - .unwrap() - .as_array() - .unwrap(); - - // Find "balance" and "variant1" queries in the query schema - assert_eq!( - query_msg_queries[0] - .get("required") - .unwrap() - .get(0) - .unwrap(), - "balance" - ); - assert_eq!( - sub_query_msg_queries[0] - .get("required") - .unwrap() - .get(0) - .unwrap(), - "variant1" - ); - - // Find "balance" and "variant1" queries in responses - api.get("responses").unwrap().get("balance").unwrap(); - api.get("responses").unwrap().get("variant1").unwrap(); -} - #[test] fn test_nested_query_responses() { - let api_str = generate_api! { + generate_api! { instantiate: InstantiateMsg, query: NestedQueryMsg, } .render() .to_string() .unwrap(); - - test_nested_query_responses_impl(&api_str); } #[cw_serde] @@ -280,21 +219,20 @@ fn test_nested_query_responses() { #[serde(untagged)] #[query_responses(nested)] pub enum NestedQueryMsgGenerics { + /// doc comment Query(T), Sub(U), } #[test] fn test_nested_query_responses_with_generics() { - let api_str = generate_api! { + generate_api! { instantiate: InstantiateMsg, query: NestedQueryMsgGenerics, } .render() .to_string() .unwrap(); - - test_nested_query_responses_impl(&api_str); } #[cw_serde] From 2333f19d2ed9146696ddc533fdd4b2345f35cd67 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 29 Nov 2022 15:34:24 +0100 Subject: [PATCH 0033/2372] fix schema dependencies --- Cargo.lock | 57 ++++++-------------------------------- packages/schema/Cargo.toml | 2 +- 2 files changed, 9 insertions(+), 50 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 858b9ddcf0..815caa2d27 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -251,7 +251,7 @@ dependencies = [ "anyhow", "clap", "colored", - "cosmwasm-std 1.1.8", + "cosmwasm-std", "cosmwasm-vm", ] @@ -274,33 +274,11 @@ dependencies = [ "thiserror", ] -[[package]] -name = "cosmwasm-crypto" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "532d2ba11b7157e3b67114389925568af29ce3e452b582d6bdfe751cb2dadfb1" -dependencies = [ - "digest 0.10.3", - "ed25519-zebra", - "k256", - "rand_core 0.6.3", - "thiserror", -] - -[[package]] -name = "cosmwasm-derive" -version = "1.1.8" -dependencies = [ - "cosmwasm-std 1.1.8", - "syn", -] - [[package]] name = "cosmwasm-derive" version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8568b289cc366981319ab39edd85d666456456f7c126433ef065ebe5257f27b2" dependencies = [ + "cosmwasm-std", "syn", ] @@ -310,7 +288,7 @@ version = "1.1.8" dependencies = [ "anyhow", "cosmwasm-schema-derive", - "cosmwasm-std 1.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cosmwasm-std", "schemars", "semver", "serde", @@ -334,8 +312,8 @@ version = "1.1.8" dependencies = [ "base64", "chrono", - "cosmwasm-crypto 1.1.8", - "cosmwasm-derive 1.1.8", + "cosmwasm-crypto", + "cosmwasm-derive", "cosmwasm-schema", "derivative", "forward_ref", @@ -350,30 +328,11 @@ dependencies = [ "uint", ] -[[package]] -name = "cosmwasm-std" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d1ceebd520a10167e35080e4f55f6b0284bb8ea364dec0f22197da96acd9e64" -dependencies = [ - "base64", - "cosmwasm-crypto 1.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "cosmwasm-derive 1.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "derivative", - "forward_ref", - "hex", - "schemars", - "serde", - "serde-json-wasm", - "thiserror", - "uint", -] - [[package]] name = "cosmwasm-storage" version = "1.1.8" dependencies = [ - "cosmwasm-std 1.1.8", + "cosmwasm-std", "serde", ] @@ -385,8 +344,8 @@ dependencies = [ "bytecheck", "clap", "clru", - "cosmwasm-crypto 1.1.8", - "cosmwasm-std 1.1.8", + "cosmwasm-crypto", + "cosmwasm-std", "criterion", "enumset", "hex", diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index 751c40b3c4..4e06a667fc 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -16,6 +16,6 @@ thiserror = "1.0.13" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = "1.1.8" +cosmwasm-std = { version = "1.1.8", path = "../std" } semver = "1" tempfile = "3" From f853b546162f9970872e49a7e43d9221a31ee02f Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 6 Dec 2022 09:45:59 +0100 Subject: [PATCH 0034/2372] Add cache test new_base_dir_will_be_created --- packages/vm/src/cache.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index b08b9c7c97..50ddc2f306 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -44,6 +44,10 @@ pub struct Metrics { #[derive(Clone, Debug)] pub struct CacheOptions { + /// The base directory of this cache. + /// + /// If this does not exist, it will be created. Not sure if this behaviour + /// is desired but wasmd relies on it. pub base_dir: PathBuf, pub available_capabilities: HashSet, pub memory_cache_size: Size, @@ -407,6 +411,20 @@ mod tests { } } + #[test] + fn new_base_dir_will_be_created() { + let dir = TempDir::new() + .unwrap() + .into_path() + .join("non-existent-sub-dir"); + let options = CacheOptions { + base_dir: dir.clone(), + ..make_testing_options() + }; + let _cache = unsafe { Cache::::new(options).unwrap() }; + assert!(dir.is_dir()); + } + #[test] fn save_wasm_works() { let cache: Cache = From e5de160432cbe9924b3d3c92760bbadc10163934 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 6 Dec 2022 10:41:00 +0100 Subject: [PATCH 0035/2372] Check new base dir does not exist yet --- packages/vm/src/cache.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 50ddc2f306..ea56e30df4 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -413,16 +413,17 @@ mod tests { #[test] fn new_base_dir_will_be_created() { - let dir = TempDir::new() + let my_base_dir = TempDir::new() .unwrap() .into_path() .join("non-existent-sub-dir"); let options = CacheOptions { - base_dir: dir.clone(), + base_dir: my_base_dir.clone(), ..make_testing_options() }; + assert!(!my_base_dir.is_dir()); let _cache = unsafe { Cache::::new(options).unwrap() }; - assert!(dir.is_dir()); + assert!(my_base_dir.is_dir()); } #[test] From a474ae3fcc37fd49813b31bbe880f8ff7fae1fd7 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 6 Dec 2022 11:30:07 +0100 Subject: [PATCH 0036/2372] Fix data in raw/{query,migrate,sudo}.json --- packages/schema/src/idl.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/schema/src/idl.rs b/packages/schema/src/idl.rs index ec2c5478aa..0cad4da9f0 100644 --- a/packages/schema/src/idl.rs +++ b/packages/schema/src/idl.rs @@ -97,19 +97,19 @@ impl JsonApi { serde_json::to_string_pretty(&execute)?, )); } - if let Some(query) = &self.execute { + if let Some(query) = &self.query { result.push(( "query.json".to_string(), serde_json::to_string_pretty(&query)?, )); } - if let Some(migrate) = &self.execute { + if let Some(migrate) = &self.migrate { result.push(( "migrate.json".to_string(), serde_json::to_string_pretty(&migrate)?, )); } - if let Some(sudo) = &self.execute { + if let Some(sudo) = &self.sudo { result.push(( "sudo.json".to_string(), serde_json::to_string_pretty(&sudo)?, From e10ea6fd2b0760e0609db9777789ffa0ada1022c Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 6 Dec 2022 11:30:20 +0100 Subject: [PATCH 0037/2372] Regenerate contract schemas --- contracts/burner/schema/raw/migrate.json | 14 + contracts/crypto-verify/schema/raw/query.json | 268 ++++++ contracts/cyberpunk/schema/raw/query.json | 34 +- contracts/floaty/schema/raw/query.json | 30 +- contracts/hackatom/schema/raw/migrate.json | 135 +-- contracts/hackatom/schema/raw/query.json | 100 +-- contracts/hackatom/schema/raw/sudo.json | 132 +-- .../ibc-reflect-send/schema/raw/query.json | 780 +----------------- contracts/ibc-reflect/schema/raw/migrate.json | 6 + contracts/ibc-reflect/schema/raw/query.json | 42 + contracts/queue/schema/raw/migrate.json | 41 +- contracts/queue/schema/raw/query.json | 69 +- contracts/reflect/schema/raw/query.json | 721 +++++----------- contracts/staking/schema/raw/query.json | 76 +- 14 files changed, 732 insertions(+), 1716 deletions(-) create mode 100644 contracts/burner/schema/raw/migrate.json create mode 100644 contracts/crypto-verify/schema/raw/query.json create mode 100644 contracts/ibc-reflect/schema/raw/migrate.json create mode 100644 contracts/ibc-reflect/schema/raw/query.json diff --git a/contracts/burner/schema/raw/migrate.json b/contracts/burner/schema/raw/migrate.json new file mode 100644 index 0000000000..231a265325 --- /dev/null +++ b/contracts/burner/schema/raw/migrate.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "MigrateMsg", + "type": "object", + "required": [ + "payout" + ], + "properties": { + "payout": { + "type": "string" + } + }, + "additionalProperties": false +} diff --git a/contracts/crypto-verify/schema/raw/query.json b/contracts/crypto-verify/schema/raw/query.json new file mode 100644 index 0000000000..dbb6e99374 --- /dev/null +++ b/contracts/crypto-verify/schema/raw/query.json @@ -0,0 +1,268 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "QueryMsg", + "oneOf": [ + { + "description": "Cosmos format (secp256k1 verification scheme).", + "type": "object", + "required": [ + "verify_cosmos_signature" + ], + "properties": { + "verify_cosmos_signature": { + "type": "object", + "required": [ + "message", + "public_key", + "signature" + ], + "properties": { + "message": { + "description": "Message to verify.", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "public_key": { + "description": "Serialized compressed (33 bytes) or uncompressed (65 bytes) public key.", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "signature": { + "description": "Serialized signature. Cosmos format (64 bytes).", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Ethereum text verification (compatible to the eth_sign RPC/web3 enpoint). This cannot be used to verify transaction.\n\nSee https://web3js.readthedocs.io/en/v1.2.0/web3-eth.html#sign", + "type": "object", + "required": [ + "verify_ethereum_text" + ], + "properties": { + "verify_ethereum_text": { + "type": "object", + "required": [ + "message", + "signature", + "signer_address" + ], + "properties": { + "message": { + "description": "Message to verify. This will be wrapped in the standard container `\"\\x19Ethereum Signed Message:\\n\" + len(message) + message` before verification.", + "type": "string" + }, + "signature": { + "description": "Serialized signature. Fixed length format (64 bytes `r` and `s` plus the one byte `v`).", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "signer_address": { + "description": "Signer address. This is matched case insensitive, so you can provide checksummed and non-checksummed addresses. Checksums are not validated.", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "verify_ethereum_transaction" + ], + "properties": { + "verify_ethereum_transaction": { + "type": "object", + "required": [ + "chain_id", + "data", + "from", + "gas_limit", + "gas_price", + "nonce", + "r", + "s", + "to", + "v", + "value" + ], + "properties": { + "chain_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "data": { + "$ref": "#/definitions/Binary" + }, + "from": { + "description": "Ethereum address in hex format (42 characters, starting with 0x)", + "type": "string" + }, + "gas_limit": { + "$ref": "#/definitions/Uint128" + }, + "gas_price": { + "$ref": "#/definitions/Uint128" + }, + "nonce": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "r": { + "$ref": "#/definitions/Binary" + }, + "s": { + "$ref": "#/definitions/Binary" + }, + "to": { + "description": "Ethereum address in hex format (42 characters, starting with 0x)", + "type": "string" + }, + "v": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "value": { + "$ref": "#/definitions/Uint128" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Tendermint format (ed25519 verification scheme).", + "type": "object", + "required": [ + "verify_tendermint_signature" + ], + "properties": { + "verify_tendermint_signature": { + "type": "object", + "required": [ + "message", + "public_key", + "signature" + ], + "properties": { + "message": { + "description": "Message to verify.", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "public_key": { + "description": "Serialized public key. Tendermint format (32 bytes).", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "signature": { + "description": "Serialized signature. Tendermint format (64 bytes).", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Tendermint format (batch ed25519 verification scheme).", + "type": "object", + "required": [ + "verify_tendermint_batch" + ], + "properties": { + "verify_tendermint_batch": { + "type": "object", + "required": [ + "messages", + "public_keys", + "signatures" + ], + "properties": { + "messages": { + "description": "Messages to verify.", + "type": "array", + "items": { + "$ref": "#/definitions/Binary" + } + }, + "public_keys": { + "description": "Serialized public keys. Tendermint format (32 bytes).", + "type": "array", + "items": { + "$ref": "#/definitions/Binary" + } + }, + "signatures": { + "description": "Serialized signatures. Tendermint format (64 bytes).", + "type": "array", + "items": { + "$ref": "#/definitions/Binary" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Returns a list of supported verification schemes. No pagination - this is a short list.", + "type": "object", + "required": [ + "list_verification_schemes" + ], + "properties": { + "list_verification_schemes": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ], + "definitions": { + "Binary": { + "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", + "type": "string" + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } +} diff --git a/contracts/cyberpunk/schema/raw/query.json b/contracts/cyberpunk/schema/raw/query.json index 8e7af5fe3c..18c07a5622 100644 --- a/contracts/cyberpunk/schema/raw/query.json +++ b/contracts/cyberpunk/schema/raw/query.json @@ -1,39 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ExecuteMsg", + "title": "QueryMsg", "oneOf": [ - { - "description": "Hashes some data. Uses CPU and memory, but no external calls.", - "type": "object", - "required": [ - "argon2" - ], - "properties": { - "argon2": { - "type": "object", - "required": [ - "mem_cost", - "time_cost" - ], - "properties": { - "mem_cost": { - "description": "The amount of memory requested (KB).", - "type": "integer", - "format": "uint32", - "minimum": 0.0 - }, - "time_cost": { - "description": "The number of passes.", - "type": "integer", - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, { "description": "Returns the env for testing", "type": "object", diff --git a/contracts/floaty/schema/raw/query.json b/contracts/floaty/schema/raw/query.json index 76967fd17b..b96c3dfb8a 100644 --- a/contracts/floaty/schema/raw/query.json +++ b/contracts/floaty/schema/raw/query.json @@ -1,20 +1,42 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ExecuteMsg", + "title": "QueryMsg", "oneOf": [ { - "description": "Releasing all funds in the contract to the beneficiary. This is the only \"proper\" action of this demo contract.", + "description": "returns a human-readable representation of the verifier use to ensure query path works in integration tests", "type": "object", "required": [ - "release" + "verifier" ], "properties": { - "release": { + "verifier": { "type": "object", "additionalProperties": false } }, "additionalProperties": false + }, + { + "description": "This returns cosmwasm_std::AllBalanceResponse to demo use of the querier", + "type": "object", + "required": [ + "other_balance" + ], + "properties": { + "other_balance": { + "type": "object", + "required": [ + "address" + ], + "properties": { + "address": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false } ] } diff --git a/contracts/hackatom/schema/raw/migrate.json b/contracts/hackatom/schema/raw/migrate.json index a82fdeef2d..2696e3ac26 100644 --- a/contracts/hackatom/schema/raw/migrate.json +++ b/contracts/hackatom/schema/raw/migrate.json @@ -1,128 +1,15 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ExecuteMsg", - "oneOf": [ - { - "description": "Releasing all funds in the contract to the beneficiary. This is the only \"proper\" action of this demo contract.", - "type": "object", - "required": [ - "release" - ], - "properties": { - "release": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Infinite loop to burn cpu cycles (only run when metering is enabled)", - "type": "object", - "required": [ - "cpu_loop" - ], - "properties": { - "cpu_loop": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Infinite loop making storage calls (to test when their limit hits)", - "type": "object", - "required": [ - "storage_loop" - ], - "properties": { - "storage_loop": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Infinite loop reading and writing memory", - "type": "object", - "required": [ - "memory_loop" - ], - "properties": { - "memory_loop": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Infinite loop sending message to itself", - "type": "object", - "required": [ - "message_loop" - ], - "properties": { - "message_loop": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Allocate large amounts of memory without consuming much gas", - "type": "object", - "required": [ - "allocate_large_memory" - ], - "properties": { - "allocate_large_memory": { - "type": "object", - "required": [ - "pages" - ], - "properties": { - "pages": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Trigger a panic to ensure framework handles gracefully", - "type": "object", - "required": [ - "panic" - ], - "properties": { - "panic": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Starting with CosmWasm 0.10, some API calls return user errors back to the contract. This triggers such user errors, ensuring the transaction does not fail in the backend.", - "type": "object", - "required": [ - "user_errors_in_api_calls" - ], - "properties": { - "user_errors_in_api_calls": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false + "title": "MigrateMsg", + "description": "MigrateMsg allows a privileged contract administrator to run a migration on the contract. In this (demo) case it is just migrating from one hackatom code to the same code, but taking advantage of the migration step to set a new validator.\n\nNote that the contract doesn't enforce permissions here, this is done by blockchain logic (in the future by blockchain governance)", + "type": "object", + "required": [ + "verifier" + ], + "properties": { + "verifier": { + "type": "string" } - ] + }, + "additionalProperties": false } diff --git a/contracts/hackatom/schema/raw/query.json b/contracts/hackatom/schema/raw/query.json index a82fdeef2d..dfd58202b2 100644 --- a/contracts/hackatom/schema/raw/query.json +++ b/contracts/hackatom/schema/raw/query.json @@ -1,15 +1,15 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ExecuteMsg", + "title": "QueryMsg", "oneOf": [ { - "description": "Releasing all funds in the contract to the beneficiary. This is the only \"proper\" action of this demo contract.", + "description": "returns a human-readable representation of the verifier use to ensure query path works in integration tests", "type": "object", "required": [ - "release" + "verifier" ], "properties": { - "release": { + "verifier": { "type": "object", "additionalProperties": false } @@ -17,75 +17,47 @@ "additionalProperties": false }, { - "description": "Infinite loop to burn cpu cycles (only run when metering is enabled)", + "description": "This returns cosmwasm_std::AllBalanceResponse to demo use of the querier", "type": "object", "required": [ - "cpu_loop" + "other_balance" ], "properties": { - "cpu_loop": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Infinite loop making storage calls (to test when their limit hits)", - "type": "object", - "required": [ - "storage_loop" - ], - "properties": { - "storage_loop": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Infinite loop reading and writing memory", - "type": "object", - "required": [ - "memory_loop" - ], - "properties": { - "memory_loop": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Infinite loop sending message to itself", - "type": "object", - "required": [ - "message_loop" - ], - "properties": { - "message_loop": { + "other_balance": { "type": "object", + "required": [ + "address" + ], + "properties": { + "address": { + "type": "string" + } + }, "additionalProperties": false } }, "additionalProperties": false }, { - "description": "Allocate large amounts of memory without consuming much gas", + "description": "Recurse will execute a query into itself up to depth-times and return Each step of the recursion may perform some extra work to test gas metering (`work` rounds of sha256 on contract). Now that we have Env, we can auto-calculate the address to recurse into", "type": "object", "required": [ - "allocate_large_memory" + "recurse" ], "properties": { - "allocate_large_memory": { + "recurse": { "type": "object", "required": [ - "pages" + "depth", + "work" ], "properties": { - "pages": { + "depth": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "work": { "type": "integer", "format": "uint32", "minimum": 0.0 @@ -97,27 +69,13 @@ "additionalProperties": false }, { - "description": "Trigger a panic to ensure framework handles gracefully", - "type": "object", - "required": [ - "panic" - ], - "properties": { - "panic": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Starting with CosmWasm 0.10, some API calls return user errors back to the contract. This triggers such user errors, ensuring the transaction does not fail in the backend.", + "description": "GetInt returns a hardcoded u32 value", "type": "object", "required": [ - "user_errors_in_api_calls" + "get_int" ], "properties": { - "user_errors_in_api_calls": { + "get_int": { "type": "object", "additionalProperties": false } diff --git a/contracts/hackatom/schema/raw/sudo.json b/contracts/hackatom/schema/raw/sudo.json index a82fdeef2d..d41253aeb0 100644 --- a/contracts/hackatom/schema/raw/sudo.json +++ b/contracts/hackatom/schema/raw/sudo.json @@ -1,128 +1,56 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ExecuteMsg", + "title": "SudoMsg", + "description": "SudoMsg is only exposed for internal Cosmos SDK modules to call. This is showing how we can expose \"admin\" functionality than can not be called by external users or contracts, but only trusted (native/Go) code in the blockchain", "oneOf": [ { - "description": "Releasing all funds in the contract to the beneficiary. This is the only \"proper\" action of this demo contract.", "type": "object", "required": [ - "release" + "steal_funds" ], "properties": { - "release": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Infinite loop to burn cpu cycles (only run when metering is enabled)", - "type": "object", - "required": [ - "cpu_loop" - ], - "properties": { - "cpu_loop": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Infinite loop making storage calls (to test when their limit hits)", - "type": "object", - "required": [ - "storage_loop" - ], - "properties": { - "storage_loop": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Infinite loop reading and writing memory", - "type": "object", - "required": [ - "memory_loop" - ], - "properties": { - "memory_loop": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Infinite loop sending message to itself", - "type": "object", - "required": [ - "message_loop" - ], - "properties": { - "message_loop": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Allocate large amounts of memory without consuming much gas", - "type": "object", - "required": [ - "allocate_large_memory" - ], - "properties": { - "allocate_large_memory": { + "steal_funds": { "type": "object", "required": [ - "pages" + "amount", + "recipient" ], "properties": { - "pages": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 + "amount": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "recipient": { + "type": "string" } }, "additionalProperties": false } }, "additionalProperties": false - }, - { - "description": "Trigger a panic to ensure framework handles gracefully", + } + ], + "definitions": { + "Coin": { "type": "object", "required": [ - "panic" + "amount", + "denom" ], "properties": { - "panic": { - "type": "object", - "additionalProperties": false + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" } - }, - "additionalProperties": false + } }, - { - "description": "Starting with CosmWasm 0.10, some API calls return user errors back to the contract. This triggers such user errors, ensuring the transaction does not fail in the backend.", - "type": "object", - "required": [ - "user_errors_in_api_calls" - ], - "properties": { - "user_errors_in_api_calls": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" } - ] + } } diff --git a/contracts/ibc-reflect-send/schema/raw/query.json b/contracts/ibc-reflect-send/schema/raw/query.json index e08109d489..05a60cc1b8 100644 --- a/contracts/ibc-reflect-send/schema/raw/query.json +++ b/contracts/ibc-reflect-send/schema/raw/query.json @@ -1,24 +1,15 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ExecuteMsg", + "title": "QueryMsg", "oneOf": [ { - "description": "Changes the admin", "type": "object", "required": [ - "update_admin" + "admin" ], "properties": { - "update_admin": { + "admin": { "type": "object", - "required": [ - "admin" - ], - "properties": { - "admin": { - "type": "string" - } - }, "additionalProperties": false } }, @@ -27,26 +18,11 @@ { "type": "object", "required": [ - "send_msgs" + "list_accounts" ], "properties": { - "send_msgs": { + "list_accounts": { "type": "object", - "required": [ - "channel_id", - "msgs" - ], - "properties": { - "channel_id": { - "type": "string" - }, - "msgs": { - "type": "array", - "items": { - "$ref": "#/definitions/CosmosMsg_for_Empty" - } - } - }, "additionalProperties": false } }, @@ -55,10 +31,10 @@ { "type": "object", "required": [ - "check_remote_balance" + "account" ], "properties": { - "check_remote_balance": { + "account": { "type": "object", "required": [ "channel_id" @@ -72,746 +48,6 @@ } }, "additionalProperties": false - }, - { - "description": "If you sent funds to this contract, it will attempt to ibc transfer them to the account on the remote side of this channel. If we don't have the address yet, this fails.", - "type": "object", - "required": [ - "send_funds" - ], - "properties": { - "send_funds": { - "type": "object", - "required": [ - "reflect_channel_id", - "transfer_channel_id" - ], - "properties": { - "reflect_channel_id": { - "description": "The channel id we use above to talk with the reflect contract", - "type": "string" - }, - "transfer_channel_id": { - "description": "The channel to use for ibctransfer. This is bound to a different port and handled by a different module. It should connect to the same chain as the reflect_channel_id does", - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - ], - "definitions": { - "BankMsg": { - "description": "The message types of the bank module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto", - "oneOf": [ - { - "description": "Sends native tokens from the contract to the given address.\n\nThis is translated to a [MsgSend](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto#L19-L28). `from_address` is automatically filled with the current contract's address.", - "type": "object", - "required": [ - "send" - ], - "properties": { - "send": { - "type": "object", - "required": [ - "amount", - "to_address" - ], - "properties": { - "amount": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } - }, - "to_address": { - "type": "string" - } - } - } - }, - "additionalProperties": false - }, - { - "description": "This will burn the given coins from the contract's account. There is no Cosmos SDK message that performs this, but it can be done by calling the bank keeper. Important if a contract controls significant token supply that must be retired.", - "type": "object", - "required": [ - "burn" - ], - "properties": { - "burn": { - "type": "object", - "required": [ - "amount" - ], - "properties": { - "amount": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } - } - } - } - }, - "additionalProperties": false - } - ] - }, - "Binary": { - "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", - "type": "string" - }, - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "CosmosMsg_for_Empty": { - "oneOf": [ - { - "type": "object", - "required": [ - "bank" - ], - "properties": { - "bank": { - "$ref": "#/definitions/BankMsg" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "custom" - ], - "properties": { - "custom": { - "$ref": "#/definitions/Empty" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "staking" - ], - "properties": { - "staking": { - "$ref": "#/definitions/StakingMsg" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "distribution" - ], - "properties": { - "distribution": { - "$ref": "#/definitions/DistributionMsg" - } - }, - "additionalProperties": false - }, - { - "description": "A Stargate message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", - "type": "object", - "required": [ - "stargate" - ], - "properties": { - "stargate": { - "type": "object", - "required": [ - "type_url", - "value" - ], - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "$ref": "#/definitions/Binary" - } - } - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "ibc" - ], - "properties": { - "ibc": { - "$ref": "#/definitions/IbcMsg" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "wasm" - ], - "properties": { - "wasm": { - "$ref": "#/definitions/WasmMsg" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "gov" - ], - "properties": { - "gov": { - "$ref": "#/definitions/GovMsg" - } - }, - "additionalProperties": false - } - ] - }, - "DistributionMsg": { - "description": "The message types of the distribution module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto", - "oneOf": [ - { - "description": "This is translated to a [MsgSetWithdrawAddress](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#L29-L37). `delegator_address` is automatically filled with the current contract's address.", - "type": "object", - "required": [ - "set_withdraw_address" - ], - "properties": { - "set_withdraw_address": { - "type": "object", - "required": [ - "address" - ], - "properties": { - "address": { - "description": "The `withdraw_address`", - "type": "string" - } - } - } - }, - "additionalProperties": false - }, - { - "description": "This is translated to a [[MsgWithdrawDelegatorReward](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#L42-L50). `delegator_address` is automatically filled with the current contract's address.", - "type": "object", - "required": [ - "withdraw_delegator_reward" - ], - "properties": { - "withdraw_delegator_reward": { - "type": "object", - "required": [ - "validator" - ], - "properties": { - "validator": { - "description": "The `validator_address`", - "type": "string" - } - } - } - }, - "additionalProperties": false - } - ] - }, - "Empty": { - "description": "An empty struct that serves as a placeholder in different places, such as contracts that don't set a custom message.\n\nIt is designed to be expressable in correct JSON and JSON Schema but contains no meaningful data. Previously we used enums without cases, but those cannot represented as valid JSON Schema (https://github.com/CosmWasm/cosmwasm/issues/451)", - "type": "object" - }, - "GovMsg": { - "oneOf": [ - { - "description": "This maps directly to [MsgVote](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/gov/v1beta1/tx.proto#L46-L56) in the Cosmos SDK with voter set to the contract address.", - "type": "object", - "required": [ - "vote" - ], - "properties": { - "vote": { - "type": "object", - "required": [ - "proposal_id", - "vote" - ], - "properties": { - "proposal_id": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "vote": { - "$ref": "#/definitions/VoteOption" - } - } - } - }, - "additionalProperties": false - } - ] - }, - "IbcMsg": { - "description": "These are messages in the IBC lifecycle. Only usable by IBC-enabled contracts (contracts that directly speak the IBC protocol via 6 entry points)", - "oneOf": [ - { - "description": "Sends bank tokens owned by the contract to the given address on another chain. The channel must already be established between the ibctransfer module on this chain and a matching module on the remote chain. We cannot select the port_id, this is whatever the local chain has bound the ibctransfer module to.", - "type": "object", - "required": [ - "transfer" - ], - "properties": { - "transfer": { - "type": "object", - "required": [ - "amount", - "channel_id", - "timeout", - "to_address" - ], - "properties": { - "amount": { - "description": "packet data only supports one coin https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/ibc/applications/transfer/v1/transfer.proto#L11-L20", - "allOf": [ - { - "$ref": "#/definitions/Coin" - } - ] - }, - "channel_id": { - "description": "exisiting channel to send the tokens over", - "type": "string" - }, - "timeout": { - "description": "when packet times out, measured on remote chain", - "allOf": [ - { - "$ref": "#/definitions/IbcTimeout" - } - ] - }, - "to_address": { - "description": "address on the remote chain to receive these tokens", - "type": "string" - } - } - } - }, - "additionalProperties": false - }, - { - "description": "Sends an IBC packet with given data over the existing channel. Data should be encoded in a format defined by the channel version, and the module on the other side should know how to parse this.", - "type": "object", - "required": [ - "send_packet" - ], - "properties": { - "send_packet": { - "type": "object", - "required": [ - "channel_id", - "data", - "timeout" - ], - "properties": { - "channel_id": { - "type": "string" - }, - "data": { - "$ref": "#/definitions/Binary" - }, - "timeout": { - "description": "when packet times out, measured on remote chain", - "allOf": [ - { - "$ref": "#/definitions/IbcTimeout" - } - ] - } - } - } - }, - "additionalProperties": false - }, - { - "description": "This will close an existing channel that is owned by this contract. Port is auto-assigned to the contract's IBC port", - "type": "object", - "required": [ - "close_channel" - ], - "properties": { - "close_channel": { - "type": "object", - "required": [ - "channel_id" - ], - "properties": { - "channel_id": { - "type": "string" - } - } - } - }, - "additionalProperties": false - } - ] - }, - "IbcTimeout": { - "description": "In IBC each package must set at least one type of timeout: the timestamp or the block height. Using this rather complex enum instead of two timeout fields we ensure that at least one timeout is set.", - "type": "object", - "properties": { - "block": { - "anyOf": [ - { - "$ref": "#/definitions/IbcTimeoutBlock" - }, - { - "type": "null" - } - ] - }, - "timestamp": { - "anyOf": [ - { - "$ref": "#/definitions/Timestamp" - }, - { - "type": "null" - } - ] - } - } - }, - "IbcTimeoutBlock": { - "description": "IBCTimeoutHeight Height is a monotonically increasing data type that can be compared against another Height for the purposes of updating and freezing clients. Ordering is (revision_number, timeout_height)", - "type": "object", - "required": [ - "height", - "revision" - ], - "properties": { - "height": { - "description": "block height after which the packet times out. the height within the given revision", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "revision": { - "description": "the version that the client is currently on (eg. after reseting the chain this could increment 1 as height drops to 0)", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - } - } - }, - "StakingMsg": { - "description": "The message types of the staking module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto", - "oneOf": [ - { - "description": "This is translated to a [MsgDelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L81-L90). `delegator_address` is automatically filled with the current contract's address.", - "type": "object", - "required": [ - "delegate" - ], - "properties": { - "delegate": { - "type": "object", - "required": [ - "amount", - "validator" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Coin" - }, - "validator": { - "type": "string" - } - } - } - }, - "additionalProperties": false - }, - { - "description": "This is translated to a [MsgUndelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L112-L121). `delegator_address` is automatically filled with the current contract's address.", - "type": "object", - "required": [ - "undelegate" - ], - "properties": { - "undelegate": { - "type": "object", - "required": [ - "amount", - "validator" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Coin" - }, - "validator": { - "type": "string" - } - } - } - }, - "additionalProperties": false - }, - { - "description": "This is translated to a [MsgBeginRedelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L95-L105). `delegator_address` is automatically filled with the current contract's address.", - "type": "object", - "required": [ - "redelegate" - ], - "properties": { - "redelegate": { - "type": "object", - "required": [ - "amount", - "dst_validator", - "src_validator" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Coin" - }, - "dst_validator": { - "type": "string" - }, - "src_validator": { - "type": "string" - } - } - } - }, - "additionalProperties": false - } - ] - }, - "Timestamp": { - "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", - "allOf": [ - { - "$ref": "#/definitions/Uint64" - } - ] - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - }, - "Uint64": { - "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", - "type": "string" - }, - "VoteOption": { - "type": "string", - "enum": [ - "yes", - "no", - "abstain", - "no_with_veto" - ] - }, - "WasmMsg": { - "description": "The message types of the wasm module.\n\nSee https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto", - "oneOf": [ - { - "description": "Dispatches a call to another contract at a known address (with known ABI).\n\nThis is translated to a [MsgExecuteContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L68-L78). `sender` is automatically filled with the current contract's address.", - "type": "object", - "required": [ - "execute" - ], - "properties": { - "execute": { - "type": "object", - "required": [ - "contract_addr", - "funds", - "msg" - ], - "properties": { - "contract_addr": { - "type": "string" - }, - "funds": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } - }, - "msg": { - "description": "msg is the json-encoded ExecuteMsg struct (as raw Binary)", - "allOf": [ - { - "$ref": "#/definitions/Binary" - } - ] - } - } - } - }, - "additionalProperties": false - }, - { - "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.16.0-alpha1/x/wasm/internal/types/tx.proto#L47-L61). `sender` is automatically filled with the current contract's address.", - "type": "object", - "required": [ - "instantiate" - ], - "properties": { - "instantiate": { - "type": "object", - "required": [ - "code_id", - "funds", - "label", - "msg" - ], - "properties": { - "admin": { - "type": [ - "string", - "null" - ] - }, - "code_id": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "funds": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } - }, - "label": { - "description": "A human-readbale label for the contract", - "type": "string" - }, - "msg": { - "description": "msg is the JSON-encoded InstantiateMsg struct (as raw Binary)", - "allOf": [ - { - "$ref": "#/definitions/Binary" - } - ] - } - } - } - }, - "additionalProperties": false - }, - { - "description": "Migrates a given contracts to use new wasm code. Passes a MigrateMsg to allow us to customize behavior.\n\nOnly the contract admin (as defined in wasmd), if any, is able to make this call.\n\nThis is translated to a [MsgMigrateContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L86-L96). `sender` is automatically filled with the current contract's address.", - "type": "object", - "required": [ - "migrate" - ], - "properties": { - "migrate": { - "type": "object", - "required": [ - "contract_addr", - "msg", - "new_code_id" - ], - "properties": { - "contract_addr": { - "type": "string" - }, - "msg": { - "description": "msg is the json-encoded MigrateMsg struct that will be passed to the new code", - "allOf": [ - { - "$ref": "#/definitions/Binary" - } - ] - }, - "new_code_id": { - "description": "the code_id of the new logic to place in the given contract", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - } - } - } - }, - "additionalProperties": false - }, - { - "description": "Sets a new admin (for migrate) on the given contract. Fails if this contract is not currently admin of the target contract.", - "type": "object", - "required": [ - "update_admin" - ], - "properties": { - "update_admin": { - "type": "object", - "required": [ - "admin", - "contract_addr" - ], - "properties": { - "admin": { - "type": "string" - }, - "contract_addr": { - "type": "string" - } - } - } - }, - "additionalProperties": false - }, - { - "description": "Clears the admin on the given contract, so no more migration possible. Fails if this contract is not currently admin of the target contract.", - "type": "object", - "required": [ - "clear_admin" - ], - "properties": { - "clear_admin": { - "type": "object", - "required": [ - "contract_addr" - ], - "properties": { - "contract_addr": { - "type": "string" - } - } - } - }, - "additionalProperties": false - } - ] } - } + ] } diff --git a/contracts/ibc-reflect/schema/raw/migrate.json b/contracts/ibc-reflect/schema/raw/migrate.json new file mode 100644 index 0000000000..2bba958247 --- /dev/null +++ b/contracts/ibc-reflect/schema/raw/migrate.json @@ -0,0 +1,6 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "MigrateMsg", + "description": "An empty struct that serves as a placeholder in different places, such as contracts that don't set a custom message.\n\nIt is designed to be expressable in correct JSON and JSON Schema but contains no meaningful data. Previously we used enums without cases, but those cannot represented as valid JSON Schema (https://github.com/CosmWasm/cosmwasm/issues/451)", + "type": "object" +} diff --git a/contracts/ibc-reflect/schema/raw/query.json b/contracts/ibc-reflect/schema/raw/query.json new file mode 100644 index 0000000000..2fb7b34e6f --- /dev/null +++ b/contracts/ibc-reflect/schema/raw/query.json @@ -0,0 +1,42 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "QueryMsg", + "oneOf": [ + { + "description": "Returns (reflect) account that is attached to this channel, or none.", + "type": "object", + "required": [ + "account" + ], + "properties": { + "account": { + "type": "object", + "required": [ + "channel_id" + ], + "properties": { + "channel_id": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Returns all (channel, reflect_account) pairs. No pagination - this is a test contract", + "type": "object", + "required": [ + "list_accounts" + ], + "properties": { + "list_accounts": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/contracts/queue/schema/raw/migrate.json b/contracts/queue/schema/raw/migrate.json index 1877209732..7fbe8c5708 100644 --- a/contracts/queue/schema/raw/migrate.json +++ b/contracts/queue/schema/raw/migrate.json @@ -1,41 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ExecuteMsg", - "oneOf": [ - { - "type": "object", - "required": [ - "enqueue" - ], - "properties": { - "enqueue": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "integer", - "format": "int32" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "dequeue" - ], - "properties": { - "dequeue": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - } - ] + "title": "MigrateMsg", + "type": "object", + "additionalProperties": false } diff --git a/contracts/queue/schema/raw/query.json b/contracts/queue/schema/raw/query.json index 1877209732..3c61d5fc57 100644 --- a/contracts/queue/schema/raw/query.json +++ b/contracts/queue/schema/raw/query.json @@ -1,24 +1,15 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ExecuteMsg", + "title": "QueryMsg", "oneOf": [ { "type": "object", "required": [ - "enqueue" + "count" ], "properties": { - "enqueue": { + "count": { "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "integer", - "format": "int32" - } - }, "additionalProperties": false } }, @@ -27,15 +18,65 @@ { "type": "object", "required": [ - "dequeue" + "sum" ], "properties": { - "dequeue": { + "sum": { "type": "object", "additionalProperties": false } }, "additionalProperties": false + }, + { + "type": "object", + "required": [ + "reducer" + ], + "properties": { + "reducer": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "list" + ], + "properties": { + "list": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Opens the given number of iterators for no reason other than testing. Returns and `Empty` response.", + "type": "object", + "required": [ + "open_iterators" + ], + "properties": { + "open_iterators": { + "type": "object", + "required": [ + "count" + ], + "properties": { + "count": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false } ] } diff --git a/contracts/reflect/schema/raw/query.json b/contracts/reflect/schema/raw/query.json index e0db5ae603..04512e6f3f 100644 --- a/contracts/reflect/schema/raw/query.json +++ b/contracts/reflect/schema/raw/query.json @@ -1,24 +1,35 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ExecuteMsg", + "title": "QueryMsg", "oneOf": [ { "type": "object", "required": [ - "reflect_msg" + "owner" ], "properties": { - "reflect_msg": { + "owner": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "This will call out to SpecialQuery::Capitalized", + "type": "object", + "required": [ + "capitalized" + ], + "properties": { + "capitalized": { "type": "object", "required": [ - "msgs" + "text" ], "properties": { - "msgs": { - "type": "array", - "items": { - "$ref": "#/definitions/CosmosMsg_for_CustomMsg" - } + "text": { + "type": "string" } }, "additionalProperties": false @@ -27,22 +38,20 @@ "additionalProperties": false }, { + "description": "Queries the blockchain and returns the result untouched", "type": "object", "required": [ - "reflect_sub_msg" + "chain" ], "properties": { - "reflect_sub_msg": { + "chain": { "type": "object", "required": [ - "msgs" + "request" ], "properties": { - "msgs": { - "type": "array", - "items": { - "$ref": "#/definitions/SubMsg_for_CustomMsg" - } + "request": { + "$ref": "#/definitions/QueryRequest_for_SpecialQuery" } }, "additionalProperties": false @@ -51,19 +60,48 @@ "additionalProperties": false }, { + "description": "Queries another contract and returns the data", "type": "object", "required": [ - "change_owner" + "raw" ], "properties": { - "change_owner": { + "raw": { "type": "object", "required": [ - "owner" + "contract", + "key" ], "properties": { - "owner": { + "contract": { "type": "string" + }, + "key": { + "$ref": "#/definitions/Binary" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "If there was a previous ReflectSubMsg with this ID, returns cosmwasm_std::Reply", + "type": "object", + "required": [ + "sub_msg_result" + ], + "properties": { + "sub_msg_result": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 } }, "additionalProperties": false @@ -73,30 +111,22 @@ } ], "definitions": { - "BankMsg": { - "description": "The message types of the bank module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto", + "BankQuery": { "oneOf": [ { - "description": "Sends native tokens from the contract to the given address.\n\nThis is translated to a [MsgSend](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto#L19-L28). `from_address` is automatically filled with the current contract's address.", + "description": "This calls into the native bank module for querying the total supply of one denomination. It does the same as the SupplyOf call in Cosmos SDK's RPC API. Return value is of type SupplyResponse.", "type": "object", "required": [ - "send" + "supply" ], "properties": { - "send": { + "supply": { "type": "object", "required": [ - "amount", - "to_address" + "denom" ], "properties": { - "amount": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } - }, - "to_address": { + "denom": { "type": "string" } } @@ -105,133 +135,133 @@ "additionalProperties": false }, { - "description": "This will burn the given coins from the contract's account. There is no Cosmos SDK message that performs this, but it can be done by calling the bank keeper. Important if a contract controls significant token supply that must be retired.", + "description": "This calls into the native bank module for one denomination Return value is BalanceResponse", "type": "object", "required": [ - "burn" + "balance" ], "properties": { - "burn": { + "balance": { "type": "object", "required": [ - "amount" + "address", + "denom" ], "properties": { - "amount": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } + "address": { + "type": "string" + }, + "denom": { + "type": "string" } } } }, "additionalProperties": false - } - ] - }, - "Binary": { - "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", - "type": "string" - }, - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" }, - "denom": { - "type": "string" - } - } - }, - "CosmosMsg_for_CustomMsg": { - "oneOf": [ { + "description": "This calls into the native bank module for all denominations. Note that this may be much more expensive than Balance and should be avoided if possible. Return value is AllBalanceResponse.", "type": "object", "required": [ - "bank" - ], - "properties": { - "bank": { - "$ref": "#/definitions/BankMsg" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "custom" + "all_balances" ], "properties": { - "custom": { - "$ref": "#/definitions/CustomMsg" + "all_balances": { + "type": "object", + "required": [ + "address" + ], + "properties": { + "address": { + "type": "string" + } + } } }, "additionalProperties": false - }, + } + ] + }, + "Binary": { + "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", + "type": "string" + }, + "IbcQuery": { + "description": "These are queries to the various IBC modules to see the state of the contract's IBC connection. These will return errors if the contract is not \"ibc enabled\"", + "oneOf": [ { + "description": "Gets the Port ID the current contract is bound to.\n\nReturns a `PortIdResponse`.", "type": "object", "required": [ - "staking" + "port_id" ], "properties": { - "staking": { - "$ref": "#/definitions/StakingMsg" + "port_id": { + "type": "object" } }, "additionalProperties": false }, { + "description": "Lists all channels that are bound to a given port. If `port_id` is omitted, this list all channels bound to the contract's port.\n\nReturns a `ListChannelsResponse`.", "type": "object", "required": [ - "distribution" + "list_channels" ], "properties": { - "distribution": { - "$ref": "#/definitions/DistributionMsg" + "list_channels": { + "type": "object", + "properties": { + "port_id": { + "type": [ + "string", + "null" + ] + } + } } }, "additionalProperties": false }, { - "description": "A Stargate message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", + "description": "Lists all information for a (portID, channelID) pair. If port_id is omitted, it will default to the contract's own channel. (To save a PortId{} call)\n\nReturns a `ChannelResponse`.", "type": "object", "required": [ - "stargate" + "channel" ], "properties": { - "stargate": { + "channel": { "type": "object", "required": [ - "type_url", - "value" + "channel_id" ], "properties": { - "type_url": { + "channel_id": { "type": "string" }, - "value": { - "$ref": "#/definitions/Binary" + "port_id": { + "type": [ + "string", + "null" + ] } } } }, "additionalProperties": false - }, + } + ] + }, + "QueryRequest_for_SpecialQuery": { + "oneOf": [ { "type": "object", "required": [ - "ibc" + "bank" ], "properties": { - "ibc": { - "$ref": "#/definitions/IbcMsg" + "bank": { + "$ref": "#/definitions/BankQuery" } }, "additionalProperties": false @@ -239,11 +269,11 @@ { "type": "object", "required": [ - "wasm" + "custom" ], "properties": { - "wasm": { - "$ref": "#/definitions/WasmMsg" + "custom": { + "$ref": "#/definitions/SpecialQuery" } }, "additionalProperties": false @@ -251,64 +281,39 @@ { "type": "object", "required": [ - "gov" - ], - "properties": { - "gov": { - "$ref": "#/definitions/GovMsg" - } - }, - "additionalProperties": false - } - ] - }, - "CustomMsg": { - "description": "CustomMsg is an override of CosmosMsg::Custom to show this works and can be extended in the contract", - "oneOf": [ - { - "type": "object", - "required": [ - "debug" + "staking" ], "properties": { - "debug": { - "type": "string" + "staking": { + "$ref": "#/definitions/StakingQuery" } }, "additionalProperties": false }, { + "description": "A Stargate query is encoded the same way as abci_query, with path and protobuf encoded request data. The format is defined in [ADR-21](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-021-protobuf-query-encoding.md). The response is protobuf encoded data directly without a JSON response wrapper. The caller is responsible for compiling the proper protobuf definitions for both requests and responses.", "type": "object", "required": [ - "raw" - ], - "properties": { - "raw": { - "$ref": "#/definitions/Binary" - } - }, - "additionalProperties": false - } - ] - }, - "DistributionMsg": { - "description": "The message types of the distribution module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto", - "oneOf": [ - { - "description": "This is translated to a [MsgSetWithdrawAddress](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#L29-L37). `delegator_address` is automatically filled with the current contract's address.", - "type": "object", - "required": [ - "set_withdraw_address" + "stargate" ], "properties": { - "set_withdraw_address": { + "stargate": { "type": "object", "required": [ - "address" + "data", + "path" ], "properties": { - "address": { - "description": "The `withdraw_address`", + "data": { + "description": "this is the expected protobuf message type (not any), binary encoded", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "path": { + "description": "this is the fully qualified service path used for routing, eg. custom/cosmos_sdk.x.bank.v1.Query/QueryBalance", "type": "string" } } @@ -317,244 +322,99 @@ "additionalProperties": false }, { - "description": "This is translated to a [[MsgWithdrawDelegatorReward](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#L42-L50). `delegator_address` is automatically filled with the current contract's address.", "type": "object", "required": [ - "withdraw_delegator_reward" + "ibc" ], "properties": { - "withdraw_delegator_reward": { - "type": "object", - "required": [ - "validator" - ], - "properties": { - "validator": { - "description": "The `validator_address`", - "type": "string" - } - } + "ibc": { + "$ref": "#/definitions/IbcQuery" } }, "additionalProperties": false - } - ] - }, - "GovMsg": { - "oneOf": [ + }, { - "description": "This maps directly to [MsgVote](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/gov/v1beta1/tx.proto#L46-L56) in the Cosmos SDK with voter set to the contract address.", "type": "object", "required": [ - "vote" + "wasm" ], "properties": { - "vote": { - "type": "object", - "required": [ - "proposal_id", - "vote" - ], - "properties": { - "proposal_id": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "vote": { - "$ref": "#/definitions/VoteOption" - } - } + "wasm": { + "$ref": "#/definitions/WasmQuery" } }, "additionalProperties": false } ] }, - "IbcMsg": { - "description": "These are messages in the IBC lifecycle. Only usable by IBC-enabled contracts (contracts that directly speak the IBC protocol via 6 entry points)", + "SpecialQuery": { + "description": "An implementation of QueryRequest::Custom to show this works and can be extended in the contract", "oneOf": [ { - "description": "Sends bank tokens owned by the contract to the given address on another chain. The channel must already be established between the ibctransfer module on this chain and a matching module on the remote chain. We cannot select the port_id, this is whatever the local chain has bound the ibctransfer module to.", "type": "object", "required": [ - "transfer" + "ping" ], "properties": { - "transfer": { + "ping": { "type": "object", - "required": [ - "amount", - "channel_id", - "timeout", - "to_address" - ], - "properties": { - "amount": { - "description": "packet data only supports one coin https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/ibc/applications/transfer/v1/transfer.proto#L11-L20", - "allOf": [ - { - "$ref": "#/definitions/Coin" - } - ] - }, - "channel_id": { - "description": "exisiting channel to send the tokens over", - "type": "string" - }, - "timeout": { - "description": "when packet times out, measured on remote chain", - "allOf": [ - { - "$ref": "#/definitions/IbcTimeout" - } - ] - }, - "to_address": { - "description": "address on the remote chain to receive these tokens", - "type": "string" - } - } + "additionalProperties": false } }, "additionalProperties": false }, { - "description": "Sends an IBC packet with given data over the existing channel. Data should be encoded in a format defined by the channel version, and the module on the other side should know how to parse this.", "type": "object", "required": [ - "send_packet" + "capitalized" ], "properties": { - "send_packet": { + "capitalized": { "type": "object", "required": [ - "channel_id", - "data", - "timeout" + "text" ], "properties": { - "channel_id": { + "text": { "type": "string" - }, - "data": { - "$ref": "#/definitions/Binary" - }, - "timeout": { - "description": "when packet times out, measured on remote chain", - "allOf": [ - { - "$ref": "#/definitions/IbcTimeout" - } - ] } - } + }, + "additionalProperties": false } }, "additionalProperties": false - }, + } + ] + }, + "StakingQuery": { + "oneOf": [ { - "description": "This will close an existing channel that is owned by this contract. Port is auto-assigned to the contract's IBC port", + "description": "Returns the denomination that can be bonded (if there are multiple native tokens on the chain)", "type": "object", "required": [ - "close_channel" + "bonded_denom" ], "properties": { - "close_channel": { - "type": "object", - "required": [ - "channel_id" - ], - "properties": { - "channel_id": { - "type": "string" - } - } + "bonded_denom": { + "type": "object" } }, "additionalProperties": false - } - ] - }, - "IbcTimeout": { - "description": "In IBC each package must set at least one type of timeout: the timestamp or the block height. Using this rather complex enum instead of two timeout fields we ensure that at least one timeout is set.", - "type": "object", - "properties": { - "block": { - "anyOf": [ - { - "$ref": "#/definitions/IbcTimeoutBlock" - }, - { - "type": "null" - } - ] - }, - "timestamp": { - "anyOf": [ - { - "$ref": "#/definitions/Timestamp" - }, - { - "type": "null" - } - ] - } - } - }, - "IbcTimeoutBlock": { - "description": "IBCTimeoutHeight Height is a monotonically increasing data type that can be compared against another Height for the purposes of updating and freezing clients. Ordering is (revision_number, timeout_height)", - "type": "object", - "required": [ - "height", - "revision" - ], - "properties": { - "height": { - "description": "block height after which the packet times out. the height within the given revision", - "type": "integer", - "format": "uint64", - "minimum": 0.0 }, - "revision": { - "description": "the version that the client is currently on (eg. after reseting the chain this could increment 1 as height drops to 0)", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - } - } - }, - "ReplyOn": { - "description": "Use this to define when the contract gets a response callback. If you only need it for errors or success you can select just those in order to save gas.", - "type": "string", - "enum": [ - "always", - "error", - "success", - "never" - ] - }, - "StakingMsg": { - "description": "The message types of the staking module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto", - "oneOf": [ { - "description": "This is translated to a [MsgDelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L81-L90). `delegator_address` is automatically filled with the current contract's address.", + "description": "AllDelegations will return all delegations by the delegator", "type": "object", "required": [ - "delegate" + "all_delegations" ], "properties": { - "delegate": { + "all_delegations": { "type": "object", "required": [ - "amount", - "validator" + "delegator" ], "properties": { - "amount": { - "$ref": "#/definitions/Coin" - }, - "validator": { + "delegator": { "type": "string" } } @@ -563,21 +423,21 @@ "additionalProperties": false }, { - "description": "This is translated to a [MsgUndelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L112-L121). `delegator_address` is automatically filled with the current contract's address.", + "description": "Delegation will return more detailed info on a particular delegation, defined by delegator/validator pair", "type": "object", "required": [ - "undelegate" + "delegation" ], "properties": { - "undelegate": { + "delegation": { "type": "object", "required": [ - "amount", + "delegator", "validator" ], "properties": { - "amount": { - "$ref": "#/definitions/Coin" + "delegator": { + "type": "string" }, "validator": { "type": "string" @@ -588,172 +448,63 @@ "additionalProperties": false }, { - "description": "This is translated to a [MsgBeginRedelegate](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/tx.proto#L95-L105). `delegator_address` is automatically filled with the current contract's address.", + "description": "Returns all validators in the currently active validator set.\n\nThe query response type is `AllValidatorsResponse`.", "type": "object", "required": [ - "redelegate" + "all_validators" ], "properties": { - "redelegate": { - "type": "object", - "required": [ - "amount", - "dst_validator", - "src_validator" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Coin" - }, - "dst_validator": { - "type": "string" - }, - "src_validator": { - "type": "string" - } - } + "all_validators": { + "type": "object" } }, "additionalProperties": false - } - ] - }, - "SubMsg_for_CustomMsg": { - "description": "A submessage that will guarantee a `reply` call on success or error, depending on the `reply_on` setting. If you do not need to process the result, use regular messages instead.\n\nNote: On error the submessage execution will revert any partial state changes due to this message, but not revert any state changes in the calling contract. If this is required, it must be done manually in the `reply` entry point.", - "type": "object", - "required": [ - "id", - "msg", - "reply_on" - ], - "properties": { - "gas_limit": { - "description": "Gas limit measured in [Cosmos SDK gas](https://github.com/CosmWasm/cosmwasm/blob/main/docs/GAS.md).", - "type": [ - "integer", - "null" - ], - "format": "uint64", - "minimum": 0.0 - }, - "id": { - "description": "An arbitrary ID chosen by the contract. This is typically used to match `Reply`s in the `reply` entry point to the submessage.", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "msg": { - "$ref": "#/definitions/CosmosMsg_for_CustomMsg" }, - "reply_on": { - "$ref": "#/definitions/ReplyOn" - } - } - }, - "Timestamp": { - "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", - "allOf": [ { - "$ref": "#/definitions/Uint64" - } - ] - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - }, - "Uint64": { - "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", - "type": "string" - }, - "VoteOption": { - "type": "string", - "enum": [ - "yes", - "no", - "abstain", - "no_with_veto" - ] - }, - "WasmMsg": { - "description": "The message types of the wasm module.\n\nSee https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto", - "oneOf": [ - { - "description": "Dispatches a call to another contract at a known address (with known ABI).\n\nThis is translated to a [MsgExecuteContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L68-L78). `sender` is automatically filled with the current contract's address.", + "description": "Returns the validator at the given address. Returns None if the validator is not part of the currently active validator set.\n\nThe query response type is `ValidatorResponse`.", "type": "object", "required": [ - "execute" + "validator" ], "properties": { - "execute": { + "validator": { "type": "object", "required": [ - "contract_addr", - "funds", - "msg" + "address" ], "properties": { - "contract_addr": { + "address": { + "description": "The validator's address (e.g. (e.g. cosmosvaloper1...))", "type": "string" - }, - "funds": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } - }, - "msg": { - "description": "msg is the json-encoded ExecuteMsg struct (as raw Binary)", - "allOf": [ - { - "$ref": "#/definitions/Binary" - } - ] } } } }, "additionalProperties": false - }, + } + ] + }, + "WasmQuery": { + "oneOf": [ { - "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.16.0-alpha1/x/wasm/internal/types/tx.proto#L47-L61). `sender` is automatically filled with the current contract's address.", + "description": "this queries the public API of another contract at a known address (with known ABI) Return value is whatever the contract returns (caller should know), wrapped in a ContractResult that is JSON encoded.", "type": "object", "required": [ - "instantiate" + "smart" ], "properties": { - "instantiate": { + "smart": { "type": "object", "required": [ - "code_id", - "funds", - "label", + "contract_addr", "msg" ], "properties": { - "admin": { - "type": [ - "string", - "null" - ] - }, - "code_id": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "funds": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } - }, - "label": { - "description": "A human-readbale label for the contract", + "contract_addr": { "type": "string" }, "msg": { - "description": "msg is the JSON-encoded InstantiateMsg struct (as raw Binary)", + "description": "msg is the json-encoded QueryMsg struct", "allOf": [ { "$ref": "#/definitions/Binary" @@ -766,61 +517,29 @@ "additionalProperties": false }, { - "description": "Migrates a given contracts to use new wasm code. Passes a MigrateMsg to allow us to customize behavior.\n\nOnly the contract admin (as defined in wasmd), if any, is able to make this call.\n\nThis is translated to a [MsgMigrateContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L86-L96). `sender` is automatically filled with the current contract's address.", + "description": "this queries the raw kv-store of the contract. returns the raw, unparsed data stored at that key, which may be an empty vector if not present", "type": "object", "required": [ - "migrate" + "raw" ], "properties": { - "migrate": { + "raw": { "type": "object", "required": [ "contract_addr", - "msg", - "new_code_id" + "key" ], "properties": { "contract_addr": { "type": "string" }, - "msg": { - "description": "msg is the json-encoded MigrateMsg struct that will be passed to the new code", + "key": { + "description": "Key is the raw key used in the contracts Storage", "allOf": [ { "$ref": "#/definitions/Binary" } ] - }, - "new_code_id": { - "description": "the code_id of the new logic to place in the given contract", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - } - } - } - }, - "additionalProperties": false - }, - { - "description": "Sets a new admin (for migrate) on the given contract. Fails if this contract is not currently admin of the target contract.", - "type": "object", - "required": [ - "update_admin" - ], - "properties": { - "update_admin": { - "type": "object", - "required": [ - "admin", - "contract_addr" - ], - "properties": { - "admin": { - "type": "string" - }, - "contract_addr": { - "type": "string" } } } @@ -828,13 +547,13 @@ "additionalProperties": false }, { - "description": "Clears the admin on the given contract, so no more migration possible. Fails if this contract is not currently admin of the target contract.", + "description": "returns a ContractInfoResponse with metadata on the contract from the runtime", "type": "object", "required": [ - "clear_admin" + "contract_info" ], "properties": { - "clear_admin": { + "contract_info": { "type": "object", "required": [ "contract_addr" diff --git a/contracts/staking/schema/raw/query.json b/contracts/staking/schema/raw/query.json index 159d67cd90..6427a6bc87 100644 --- a/contracts/staking/schema/raw/query.json +++ b/contracts/staking/schema/raw/query.json @@ -1,25 +1,21 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ExecuteMsg", + "title": "QueryMsg", "oneOf": [ { - "description": "Transfer moves the derivative token", + "description": "Balance shows the number of staking derivatives", "type": "object", "required": [ - "transfer" + "balance" ], "properties": { - "transfer": { + "balance": { "type": "object", "required": [ - "amount", - "recipient" + "address" ], "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "recipient": { + "address": { "type": "string" } }, @@ -29,34 +25,20 @@ "additionalProperties": false }, { - "description": "Bond will bond all staking tokens sent with the message and release derivative tokens", + "description": "Claims shows the number of tokens this address can access when they are done unbonding", "type": "object", "required": [ - "bond" + "claims" ], "properties": { - "bond": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Unbond will \"burn\" the given amount of derivative tokens and send the unbonded staking tokens to the message sender (after exit tax is deducted)", - "type": "object", - "required": [ - "unbond" - ], - "properties": { - "unbond": { + "claims": { "type": "object", "required": [ - "amount" + "address" ], "properties": { - "amount": { - "$ref": "#/definitions/Uint128" + "address": { + "type": "string" } }, "additionalProperties": false @@ -65,13 +47,13 @@ "additionalProperties": false }, { - "description": "Claim is used to claim your native tokens that you previously \"unbonded\" after the chain-defined waiting period (eg. 3 weeks)", + "description": "TokenInfo shows the metadata of the token for UIs", "type": "object", "required": [ - "claim" + "token_info" ], "properties": { - "claim": { + "token_info": { "type": "object", "additionalProperties": false } @@ -79,38 +61,18 @@ "additionalProperties": false }, { - "description": "Reinvest will check for all accumulated rewards, withdraw them, and re-bond them to the same validator. Anyone can call this, which updates the value of the token (how much under custody).", + "description": "Investment shows info on total staking tokens under custody, with which validator, as well as how many derivative tokens are lists. It also shows with the exit tax.", "type": "object", "required": [ - "reinvest" + "investment" ], "properties": { - "reinvest": { + "investment": { "type": "object", "additionalProperties": false } }, "additionalProperties": false - }, - { - "description": "_BondAllTokens can only be called by the contract itself, after all rewards have been withdrawn. This is an example of using \"callbacks\" in message flows. This can only be invoked by the contract itself as a return from Reinvest", - "type": "object", - "required": [ - "__bond_all_tokens" - ], - "properties": { - "__bond_all_tokens": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - } - ], - "definitions": { - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" } - } + ] } From c939aff71fe2ca0e09926eccb62c7e99c0c8e809 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 6 Dec 2022 11:45:52 +0100 Subject: [PATCH 0038/2372] Add PR links to raw JSON Schema directory change --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d780adf87..d6472e1d97 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,10 +15,13 @@ and this project adheres to - cosmwasm-std: Add `instantiate2_address` which allows calculating the predictable addresses for `MsgInstantiateContract2` ([#1437]). - cosmwasm-schema: In contracts, `cosmwasm schema` will now output a separate - JSON Schema file for each entrypoint in the `raw` subdirectory. + JSON Schema file for each entrypoint in the `raw` subdirectory ([#1478], + [#1533]). [#1437]: https://github.com/CosmWasm/cosmwasm/issues/1437 [#1481]: https://github.com/CosmWasm/cosmwasm/pull/1481 +[#1478]: https://github.com/CosmWasm/cosmwasm/pull/1478 +[#1533]: https://github.com/CosmWasm/cosmwasm/pull/1533 ### Changed From a82b4a9631852bab3cf7030615c6c61b54383cdc Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 6 Dec 2022 10:46:37 +0100 Subject: [PATCH 0039/2372] Test cpu_loop --- contracts/cyberpunk/src/contract.rs | 11 +++++++++++ contracts/cyberpunk/src/msg.rs | 2 ++ packages/vm/README.md | 6 ++++++ packages/vm/src/calls.rs | 19 +++++++++++++++++++ packages/vm/testdata/cyberpunk.wasm | Bin 0 -> 160084 bytes 5 files changed, 38 insertions(+) create mode 100644 packages/vm/testdata/cyberpunk.wasm diff --git a/contracts/cyberpunk/src/contract.rs b/contracts/cyberpunk/src/contract.rs index 7ea42967ac..5b8a37015c 100644 --- a/contracts/cyberpunk/src/contract.rs +++ b/contracts/cyberpunk/src/contract.rs @@ -33,6 +33,7 @@ pub fn execute( mem_cost, time_cost, } => execute::argon2(mem_cost, time_cost), + CpuLoop {} => execute::cpu_loop(), MirrorEnv {} => execute::mirror_env(env), } } @@ -62,6 +63,16 @@ mod execute { //Ok(Response::new()) } + pub fn cpu_loop() -> Result { + let mut counter = 0u64; + loop { + counter += 1; + if counter >= 9_000_000_000 { + counter = 0; + } + } + } + pub fn mirror_env(env: Env) -> Result { Ok(Response::new().set_data(to_binary(&env)?)) } diff --git a/contracts/cyberpunk/src/msg.rs b/contracts/cyberpunk/src/msg.rs index 98a03b0b7b..83626ccd43 100644 --- a/contracts/cyberpunk/src/msg.rs +++ b/contracts/cyberpunk/src/msg.rs @@ -9,6 +9,8 @@ pub enum ExecuteMsg { /// The number of passes. time_cost: u32, }, + /// Infinite loop to burn cpu cycles (only run when metering is enabled) + CpuLoop {}, /// Returns the env for testing MirrorEnv {}, } diff --git a/packages/vm/README.md b/packages/vm/README.md index f3b0cc1bb5..2d85697bed 100644 --- a/packages/vm/README.md +++ b/packages/vm/README.md @@ -50,6 +50,12 @@ run through [rust-optimizer](https://github.com/CosmWasm/rust-optimizer). To rebuild the test contracts, go to the repo root and do ```sh +docker run --rm -v "$(pwd)":/code \ + --mount type=volume,source="devcontract_cache_cyberpunk",target=/code/contracts/cyberpunk/target \ + --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ + cosmwasm/rust-optimizer:0.12.10 ./contracts/cyberpunk \ + && cp artifacts/cyberpunk.wasm packages/vm/testdata/cyberpunk.wasm + docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_hackatom",target=/code/contracts/hackatom/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 55ec230e5f..63b90922ff 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -595,6 +595,7 @@ mod tests { use cosmwasm_std::{coins, Empty}; static CONTRACT: &[u8] = include_bytes!("../testdata/hackatom.wasm"); + static CYBERPUNK: &[u8] = include_bytes!("../testdata/cyberpunk.wasm"); #[test] fn call_instantiate_works() { @@ -627,6 +628,24 @@ mod tests { .unwrap(); } + #[test] + fn call_execute_runs_out_of_gas() { + let mut instance = mock_instance(CYBERPUNK, &[]); + + // init + let info = mock_info("creator", &[]); + call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, br#"{}"#) + .unwrap() + .unwrap(); + + // execute + let info = mock_info("looper", &[]); + let msg = br#"{"cpu_loop":{}}"#; + let err = + call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap_err(); + assert!(matches!(err, VmError::GasDepletion {})); + } + #[test] fn call_migrate_works() { let mut instance = mock_instance(CONTRACT, &[]); diff --git a/packages/vm/testdata/cyberpunk.wasm b/packages/vm/testdata/cyberpunk.wasm new file mode 100644 index 0000000000000000000000000000000000000000..4fa2b7cbfeb193da0bb8123425df632ba3b166ed GIT binary patch literal 160084 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

7*vC(IQ~nsAsS4L;U=h_C+0Qo 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 f16hpv49awr$@p}_WstkW2n!JYfV1^88_NGLL Date: Tue, 6 Dec 2022 12:18:41 +0100 Subject: [PATCH 0040/2372] Update schemas for new cpu_loop type --- contracts/cyberpunk/schema/cyberpunk.json | 14 ++++++++++++++ contracts/cyberpunk/schema/raw/execute.json | 14 ++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/contracts/cyberpunk/schema/cyberpunk.json b/contracts/cyberpunk/schema/cyberpunk.json index 9439d30556..2daf62f72e 100644 --- a/contracts/cyberpunk/schema/cyberpunk.json +++ b/contracts/cyberpunk/schema/cyberpunk.json @@ -44,6 +44,20 @@ }, "additionalProperties": false }, + { + "description": "Infinite loop to burn cpu cycles (only run when metering is enabled)", + "type": "object", + "required": [ + "cpu_loop" + ], + "properties": { + "cpu_loop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, { "description": "Returns the env for testing", "type": "object", diff --git a/contracts/cyberpunk/schema/raw/execute.json b/contracts/cyberpunk/schema/raw/execute.json index 8e7af5fe3c..5e811f8e5d 100644 --- a/contracts/cyberpunk/schema/raw/execute.json +++ b/contracts/cyberpunk/schema/raw/execute.json @@ -34,6 +34,20 @@ }, "additionalProperties": false }, + { + "description": "Infinite loop to burn cpu cycles (only run when metering is enabled)", + "type": "object", + "required": [ + "cpu_loop" + ], + "properties": { + "cpu_loop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, { "description": "Returns the env for testing", "type": "object", From b3d136e87e3e91701fded2527200bfadeae51528 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 6 Dec 2022 10:56:58 +0100 Subject: [PATCH 0041/2372] Add contract folders to arm64 caching --- .circleci/config.yml | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 3e32556e5c..00aa2091c9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -94,7 +94,7 @@ jobs: command: rustup target add wasm32-unknown-unknown && rustup target list --installed - restore_cache: keys: - - cargocache-v2-arm64-rust:1.59.0-{{ checksum "Cargo.lock" }} + - cachev3-arm64-rust:1.59.0-{{ checksum "Cargo.lock" }} - run: name: "contracts/crypto-verify: integration-test" working_directory: ~/project/contracts/crypto-verify @@ -134,7 +134,42 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-arm64-rust:1.59.0-{{ checksum "Cargo.lock" }} + # crypto-verify + - contracts/crypto-verify/target/debug/.fingerprint + - contracts/crypto-verify/target/debug/build + - contracts/crypto-verify/target/debug/deps + - contracts/crypto-verify/target/wasm32-unknown-unknown/release/.fingerprint + - contracts/crypto-verify/target/wasm32-unknown-unknown/release/build + - contracts/crypto-verify/target/wasm32-unknown-unknown/release/deps + # hackatom + - contracts/hackatom/target/debug/.fingerprint + - contracts/hackatom/target/debug/build + - contracts/hackatom/target/debug/deps + - contracts/hackatom/target/wasm32-unknown-unknown/release/.fingerprint + - contracts/hackatom/target/wasm32-unknown-unknown/release/build + - contracts/hackatom/target/wasm32-unknown-unknown/release/deps + # queue + - contracts/queue/target/debug/.fingerprint + - contracts/queue/target/debug/build + - contracts/queue/target/debug/deps + - contracts/queue/target/wasm32-unknown-unknown/release/.fingerprint + - contracts/queue/target/wasm32-unknown-unknown/release/build + - contracts/queue/target/wasm32-unknown-unknown/release/deps + # reflect + - contracts/reflect/target/debug/.fingerprint + - contracts/reflect/target/debug/build + - contracts/reflect/target/debug/deps + - contracts/reflect/target/wasm32-unknown-unknown/release/.fingerprint + - contracts/reflect/target/wasm32-unknown-unknown/release/build + - contracts/reflect/target/wasm32-unknown-unknown/release/deps + # staking + - contracts/staking/target/debug/.fingerprint + - contracts/staking/target/debug/build + - contracts/staking/target/debug/deps + - contracts/staking/target/wasm32-unknown-unknown/release/.fingerprint + - contracts/staking/target/wasm32-unknown-unknown/release/build + - contracts/staking/target/wasm32-unknown-unknown/release/deps + key: cachev3-arm64-rust:1.59.0-{{ checksum "Cargo.lock" }} package_crypto: docker: From 43d345a4f19ad20014aa34d8597bc712bc427a98 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 6 Dec 2022 18:31:37 +0100 Subject: [PATCH 0042/2372] Split into two caches: v4-arm64-workspace-... and v4-arm64-contracts-... --- .circleci/config.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 00aa2091c9..851bcd8a04 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -94,7 +94,12 @@ jobs: command: rustup target add wasm32-unknown-unknown && rustup target list --installed - restore_cache: keys: - - cachev3-arm64-rust:1.59.0-{{ checksum "Cargo.lock" }} + - v4-arm64-workspace-rust:1.59.0-{{ checksum "Cargo.lock" }} + - v4-arm64-workspace-rust:1.59.0- + - restore_cache: + keys: + - v4-arm64-contracts-rust:1.59.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} + - v4-arm64-contracts-rust:1.59.0- - run: name: "contracts/crypto-verify: integration-test" working_directory: ~/project/contracts/crypto-verify @@ -129,11 +134,16 @@ jobs: # use all features command: cargo test --locked --features iterator,staking,stargate - save_cache: + key: v4-arm64-workspace-rust:1.59.0-{{ checksum "Cargo.lock" }} paths: - ~/.cargo/registry - target/debug/.fingerprint - target/debug/build - target/debug/deps + - save_cache: + key: v4-arm64-contracts-rust:1.59.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} + paths: + - ~/.cargo/registry # crypto-verify - contracts/crypto-verify/target/debug/.fingerprint - contracts/crypto-verify/target/debug/build @@ -169,7 +179,6 @@ jobs: - contracts/staking/target/wasm32-unknown-unknown/release/.fingerprint - contracts/staking/target/wasm32-unknown-unknown/release/build - contracts/staking/target/wasm32-unknown-unknown/release/deps - key: cachev3-arm64-rust:1.59.0-{{ checksum "Cargo.lock" }} package_crypto: docker: From b23b02067cf6b0c6b76f5e4d87353798a74d71e6 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 6 Dec 2022 19:00:23 +0100 Subject: [PATCH 0043/2372] Use cache From 694875e3cde5aa255e96e34d6e0de6fe137dc9e2 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 6 Dec 2022 19:45:47 +0100 Subject: [PATCH 0044/2372] Upgrade serde-json-wasm to 0.5.0 --- CHANGELOG.md | 2 ++ Cargo.lock | 4 ++-- contracts/burner/Cargo.lock | 4 ++-- contracts/crypto-verify/Cargo.lock | 4 ++-- contracts/cyberpunk/Cargo.lock | 4 ++-- contracts/floaty/Cargo.lock | 4 ++-- contracts/hackatom/Cargo.lock | 4 ++-- contracts/ibc-reflect-send/Cargo.lock | 4 ++-- contracts/ibc-reflect/Cargo.lock | 4 ++-- contracts/queue/Cargo.lock | 4 ++-- contracts/reflect/Cargo.lock | 4 ++-- contracts/staking/Cargo.lock | 4 ++-- packages/std/Cargo.toml | 2 +- 13 files changed, 25 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8e3840168..b2b253cc22 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,8 @@ and this project adheres to - cosmwasm-schema: In contracts, `cosmwasm schema` will now output a separate JSON Schema file for each entrypoint in the `raw` subdirectory ([#1478], [#1533]). +- cosmwasm-std: Upgrade `serde-json-wasm` dependency to 0.5.0 which adds map + support to `to_vec`/`to_binary` and friends. [#1437]: https://github.com/CosmWasm/cosmwasm/issues/1437 [#1481]: https://github.com/CosmWasm/cosmwasm/pull/1481 diff --git a/Cargo.lock b/Cargo.lock index b468d26695..021ce07392 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1568,9 +1568,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479b4dbc401ca13ee8ce902851b834893251404c4f3c65370a49e047a6be09a5" +checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" dependencies = [ "serde", ] diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 47624e7fc9..9044ff718a 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -1282,9 +1282,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479b4dbc401ca13ee8ce902851b834893251404c4f3c65370a49e047a6be09a5" +checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" dependencies = [ "serde", ] diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 91b16b5216..4bebe371ca 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -1330,9 +1330,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479b4dbc401ca13ee8ce902851b834893251404c4f3c65370a49e047a6be09a5" +checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" dependencies = [ "serde", ] diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index fa1b022caa..58b2b8dcf5 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -1332,9 +1332,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479b4dbc401ca13ee8ce902851b834893251404c4f3c65370a49e047a6be09a5" +checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" dependencies = [ "serde", ] diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index b8f7d7347b..a91764061f 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -1292,9 +1292,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479b4dbc401ca13ee8ce902851b834893251404c4f3c65370a49e047a6be09a5" +checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" dependencies = [ "serde", ] diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index b707cf2b96..a88a63914f 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -1293,9 +1293,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479b4dbc401ca13ee8ce902851b834893251404c4f3c65370a49e047a6be09a5" +checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" dependencies = [ "serde", ] diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index fa5c44979e..eef33fcda3 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -1291,9 +1291,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479b4dbc401ca13ee8ce902851b834893251404c4f3c65370a49e047a6be09a5" +checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" dependencies = [ "serde", ] diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index a664494d0e..2433c84e57 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -1291,9 +1291,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479b4dbc401ca13ee8ce902851b834893251404c4f3c65370a49e047a6be09a5" +checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" dependencies = [ "serde", ] diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 1bb95637c9..69ea329dbb 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -1282,9 +1282,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479b4dbc401ca13ee8ce902851b834893251404c4f3c65370a49e047a6be09a5" +checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" dependencies = [ "serde", ] diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 62fed006eb..7ffedc112b 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -1292,9 +1292,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479b4dbc401ca13ee8ce902851b834893251404c4f3c65370a49e047a6be09a5" +checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" dependencies = [ "serde", ] diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index e23dfbfab0..0c4a548896 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -1285,9 +1285,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479b4dbc401ca13ee8ce902851b834893251404c4f3c65370a49e047a6be09a5" +checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" dependencies = [ "serde", ] diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 993238c5ad..a960528f7b 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -49,7 +49,7 @@ hex = "0.4" schemars = "0.8.3" sha2 = "0.10.3" serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } -serde-json-wasm = { version = "0.4.1" } +serde-json-wasm = { version = "0.5.0" } thiserror = "1.0.13" uint = "0.9.3" From 368e93311983d25f160c36a8604dc63bfdc72b65 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 7 Dec 2022 12:40:58 +0100 Subject: [PATCH 0045/2372] Create introduction to the CosmWasm development contracts --- contracts/README.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/contracts/README.md b/contracts/README.md index 30e1103c01..cb89fc0039 100644 --- a/contracts/README.md +++ b/contracts/README.md @@ -4,6 +4,39 @@ Those contracts are made for development purpose only. For more realistic example contracts, see [cosmwasm-examples](https://github.com/CosmWasm/cosmwasm-examples). +## The contracts + +Introducing the development contracts in the order they were created. + +1. **hackatom** is the very first development contract that was created at a + Cosmos Hackatom in Berlin in 2019, the event where CosmWasm was born. It is a + very basic escrow contract. During the years of CosmWasm development, many + more test cases were hacked into it. +2. **queue** shows and tests the newly added iterator support + ([#181](https://github.com/CosmWasm/cosmwasm/pull/181)). +3. **reflect** is an evolution of the + [mask contract](https://medium.com/cosmwasm/introducing-the-mask-41d11e51bccf), + which allows the user to send messages to the contract which are then emitted + with the contract as the sender. It later got support to handle sub messages + and replys ([#796](https://github.com/CosmWasm/cosmwasm/pull/796)). +4. **staking** is a staking derivates example showing how the contract itself + can be a delegator. +5. **burner** shows how contract migrations work, which were added in CosmWasm + 0.9 ([#413](https://github.com/CosmWasm/cosmwasm/pull/413)). It shuts down + the contract my clearing all state and sending all tokens to a given address. +6. **ibc-reflect**/**ibc-reflect-send** are inspired by the idea of Interchain + Accounts and demonstrate the power of contract to contract IBC. + ibc-reflect-send receives a message on chain A and sends it to an ibc-reflect + instance on chain B where the message is executed. +7. **crypto-verify** shows how to use the CosmWasm crypto APIs for signature + verification ([#783](https://github.com/CosmWasm/cosmwasm/pull/783)). +8. **floaty** emits float operations when compiled to Wasm and allows us to test + how tooling and the runtime deal with those operations + ([#970](https://github.com/CosmWasm/cosmwasm/pull/970)). +9. **cyberpunk** is an attempt to cleanup hackatom and make writing runtime + tests (cosmwasm-vm/wamsmvm) easier by avoid the need for the escrow setup + that hackatom has. + ## Optimized builds Those development contracts are used for testing in other repos, e.g. in From fb6b6080b8d13e8d1adfd278285396878cc835e1 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 7 Dec 2022 12:52:50 +0100 Subject: [PATCH 0046/2372] Add StorageLoop, MemoryLoop, MessageLoop, AllocateLargeMemory and Panic to cyberpunk --- contracts/cyberpunk/schema/cyberpunk.json | 80 +++++++++++ contracts/cyberpunk/schema/raw/execute.json | 80 +++++++++++ contracts/cyberpunk/src/contract.rs | 150 ++++++++++++++------ contracts/cyberpunk/src/msg.rs | 10 ++ 4 files changed, 276 insertions(+), 44 deletions(-) diff --git a/contracts/cyberpunk/schema/cyberpunk.json b/contracts/cyberpunk/schema/cyberpunk.json index 2daf62f72e..666e8042a7 100644 --- a/contracts/cyberpunk/schema/cyberpunk.json +++ b/contracts/cyberpunk/schema/cyberpunk.json @@ -58,6 +58,86 @@ }, "additionalProperties": false }, + { + "description": "Infinite loop making storage calls (to test when their limit hits)", + "type": "object", + "required": [ + "storage_loop" + ], + "properties": { + "storage_loop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Infinite loop reading and writing memory", + "type": "object", + "required": [ + "memory_loop" + ], + "properties": { + "memory_loop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Infinite loop sending message to itself", + "type": "object", + "required": [ + "message_loop" + ], + "properties": { + "message_loop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Allocate large amounts of memory without consuming much gas", + "type": "object", + "required": [ + "allocate_large_memory" + ], + "properties": { + "allocate_large_memory": { + "type": "object", + "required": [ + "pages" + ], + "properties": { + "pages": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Trigger a panic to ensure framework handles gracefully", + "type": "object", + "required": [ + "panic" + ], + "properties": { + "panic": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, { "description": "Returns the env for testing", "type": "object", diff --git a/contracts/cyberpunk/schema/raw/execute.json b/contracts/cyberpunk/schema/raw/execute.json index 5e811f8e5d..8ad4797118 100644 --- a/contracts/cyberpunk/schema/raw/execute.json +++ b/contracts/cyberpunk/schema/raw/execute.json @@ -48,6 +48,86 @@ }, "additionalProperties": false }, + { + "description": "Infinite loop making storage calls (to test when their limit hits)", + "type": "object", + "required": [ + "storage_loop" + ], + "properties": { + "storage_loop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Infinite loop reading and writing memory", + "type": "object", + "required": [ + "memory_loop" + ], + "properties": { + "memory_loop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Infinite loop sending message to itself", + "type": "object", + "required": [ + "message_loop" + ], + "properties": { + "message_loop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Allocate large amounts of memory without consuming much gas", + "type": "object", + "required": [ + "allocate_large_memory" + ], + "properties": { + "allocate_large_memory": { + "type": "object", + "required": [ + "pages" + ], + "properties": { + "pages": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Trigger a panic to ensure framework handles gracefully", + "type": "object", + "required": [ + "panic" + ], + "properties": { + "panic": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, { "description": "Returns the env for testing", "type": "object", diff --git a/contracts/cyberpunk/src/contract.rs b/contracts/cyberpunk/src/contract.rs index 5b8a37015c..1133dc3a63 100644 --- a/contracts/cyberpunk/src/contract.rs +++ b/contracts/cyberpunk/src/contract.rs @@ -1,6 +1,6 @@ use cosmwasm_std::{ entry_point, to_binary, Deps, DepsMut, Empty, Env, MessageInfo, QueryResponse, Response, - StdError, StdResult, + StdError, StdResult, WasmMsg, }; use crate::errors::ContractError; @@ -21,7 +21,7 @@ pub fn instantiate( #[entry_point] pub fn execute( - _deps: DepsMut, + deps: DepsMut, env: Env, _info: MessageInfo, msg: ExecuteMsg, @@ -32,50 +32,116 @@ pub fn execute( Argon2 { mem_cost, time_cost, - } => execute::argon2(mem_cost, time_cost), - CpuLoop {} => execute::cpu_loop(), - MirrorEnv {} => execute::mirror_env(env), + } => execute_argon2(mem_cost, time_cost), + CpuLoop {} => execute_cpu_loop(), + StorageLoop {} => execute_storage_loop(deps), + MemoryLoop {} => execute_memory_loop(), + MessageLoop {} => execute_message_loop(env), + AllocateLargeMemory { pages } => execute_allocate_large_memory(pages), + Panic {} => execute_panic(), + MirrorEnv {} => execute_mirror_env(env), } } -mod execute { - use super::*; +fn execute_argon2(mem_cost: u32, time_cost: u32) -> Result { + let password = b"password"; + let salt = b"othersalt"; + let config = argon2::Config { + variant: argon2::Variant::Argon2i, + version: argon2::Version::Version13, + mem_cost, + time_cost, + lanes: 4, + thread_mode: argon2::ThreadMode::Sequential, + secret: &[], + ad: &[], + hash_length: 32, + }; + let hash = argon2::hash_encoded(password, salt, &config) + .map_err(|e| StdError::generic_err(format!("hash_encoded errored: {}", e)))?; + // let matches = argon2::verify_encoded(&hash, password).unwrap(); + // assert!(matches); + Ok(Response::new().set_data(hash.into_bytes())) + //Ok(Response::new()) +} - pub fn argon2(mem_cost: u32, time_cost: u32) -> Result { - let password = b"password"; - let salt = b"othersalt"; - let config = argon2::Config { - variant: argon2::Variant::Argon2i, - version: argon2::Version::Version13, - mem_cost, - time_cost, - lanes: 4, - thread_mode: argon2::ThreadMode::Sequential, - secret: &[], - ad: &[], - hash_length: 32, - }; - let hash = argon2::hash_encoded(password, salt, &config) - .map_err(|e| StdError::generic_err(format!("hash_encoded errored: {}", e)))?; - // let matches = argon2::verify_encoded(&hash, password).unwrap(); - // assert!(matches); - Ok(Response::new().set_data(hash.into_bytes())) - //Ok(Response::new()) +fn execute_cpu_loop() -> Result { + let mut counter = 0u64; + loop { + counter += 1; + if counter >= 9_000_000_000 { + counter = 0; + } } +} - pub fn cpu_loop() -> Result { - let mut counter = 0u64; - loop { - counter += 1; - if counter >= 9_000_000_000 { - counter = 0; - } - } +fn execute_storage_loop(deps: DepsMut) -> Result { + let mut test_case = 0u64; + loop { + deps.storage + .set(b"test.key", test_case.to_string().as_bytes()); + test_case += 1; } +} + +fn execute_memory_loop() -> Result { + let mut data = vec![1usize]; + loop { + // add one element + data.push((*data.last().expect("must not be empty")) + 1); + } +} + +fn execute_message_loop(env: Env) -> Result { + let resp = Response::new().add_message(WasmMsg::Execute { + contract_addr: env.contract.address.into(), + msg: to_binary(&ExecuteMsg::MessageLoop {})?, + funds: vec![], + }); + Ok(resp) +} - pub fn mirror_env(env: Env) -> Result { - Ok(Response::new().set_data(to_binary(&env)?)) +#[allow(unused_variables)] +fn execute_allocate_large_memory(pages: u32) -> Result { + // We create memory pages explicitely since Rust's default allocator seems to be clever enough + // to not grow memory for unused capacity like `Vec::::with_capacity(100 * 1024 * 1024)`. + // Even with std::alloc::alloc the memory did now grow beyond 1.5 MiB. + + #[cfg(target_arch = "wasm32")] + { + use core::arch::wasm32; + let old_size = wasm32::memory_grow(0, pages as usize); + if old_size == usize::max_value() { + return Err(StdError::generic_err("memory.grow failed").into()); + } + Ok(Response::new().set_data((old_size as u32).to_be_bytes())) } + + #[cfg(not(target_arch = "wasm32"))] + Err(StdError::generic_err("Unsupported architecture").into()) +} + +fn execute_panic() -> Result { + // Uncomment your favourite panic case + + // panicked at 'This page intentionally faulted', src/contract.rs:53:5 + panic!("This page intentionally faulted"); + + // panicked at 'oh no (a = 3)', src/contract.rs:56:5 + // let a = 3; + // panic!("oh no (a = {a})"); + + // panicked at 'attempt to subtract with overflow', src/contract.rs:59:13 + // #[allow(arithmetic_overflow)] + // let _ = 5u32 - 8u32; + + // panicked at 'no entry found for key', src/contract.rs:62:13 + // let map = std::collections::HashMap::::new(); + // let _ = map["foo"]; +} + +fn execute_mirror_env(env: Env) -> Result { + Ok(Response::new().set_data(to_binary(&env)?)) } #[entry_point] @@ -83,14 +149,10 @@ pub fn query(_deps: Deps, env: Env, msg: QueryMsg) -> StdResult { use QueryMsg::*; match msg { - MirrorEnv {} => to_binary(&query::mirror_env(env)), + MirrorEnv {} => to_binary(&query_mirror_env(env)), } } -mod query { - use super::*; - - pub fn mirror_env(env: Env) -> Env { - env - } +fn query_mirror_env(env: Env) -> Env { + env } diff --git a/contracts/cyberpunk/src/msg.rs b/contracts/cyberpunk/src/msg.rs index 83626ccd43..a671a11c34 100644 --- a/contracts/cyberpunk/src/msg.rs +++ b/contracts/cyberpunk/src/msg.rs @@ -11,6 +11,16 @@ pub enum ExecuteMsg { }, /// Infinite loop to burn cpu cycles (only run when metering is enabled) CpuLoop {}, + /// Infinite loop making storage calls (to test when their limit hits) + StorageLoop {}, + /// Infinite loop reading and writing memory + MemoryLoop {}, + /// Infinite loop sending message to itself + MessageLoop {}, + /// Allocate large amounts of memory without consuming much gas + AllocateLargeMemory { pages: u32 }, + /// Trigger a panic to ensure framework handles gracefully + Panic {}, /// Returns the env for testing MirrorEnv {}, } From 49cf319ec7ca26b0782d2bbd8fdb5af48c40173f Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 7 Dec 2022 14:42:27 +0100 Subject: [PATCH 0047/2372] Add Unreachable message to cyberpunk contract --- contracts/cyberpunk/schema/cyberpunk.json | 14 ++++++++++++++ contracts/cyberpunk/schema/raw/execute.json | 14 ++++++++++++++ contracts/cyberpunk/src/contract.rs | 9 +++++++++ contracts/cyberpunk/src/msg.rs | 5 +++++ 4 files changed, 42 insertions(+) diff --git a/contracts/cyberpunk/schema/cyberpunk.json b/contracts/cyberpunk/schema/cyberpunk.json index 666e8042a7..1584ac900e 100644 --- a/contracts/cyberpunk/schema/cyberpunk.json +++ b/contracts/cyberpunk/schema/cyberpunk.json @@ -138,6 +138,20 @@ }, "additionalProperties": false }, + { + "description": "In contrast to Panic, this does not use the panic handler.\n\nFrom : \"Generates the unreachable instruction, which causes an unconditional trap.\"", + "type": "object", + "required": [ + "unreachable" + ], + "properties": { + "unreachable": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, { "description": "Returns the env for testing", "type": "object", diff --git a/contracts/cyberpunk/schema/raw/execute.json b/contracts/cyberpunk/schema/raw/execute.json index 8ad4797118..e096feab6f 100644 --- a/contracts/cyberpunk/schema/raw/execute.json +++ b/contracts/cyberpunk/schema/raw/execute.json @@ -128,6 +128,20 @@ }, "additionalProperties": false }, + { + "description": "In contrast to Panic, this does not use the panic handler.\n\nFrom : \"Generates the unreachable instruction, which causes an unconditional trap.\"", + "type": "object", + "required": [ + "unreachable" + ], + "properties": { + "unreachable": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, { "description": "Returns the env for testing", "type": "object", diff --git a/contracts/cyberpunk/src/contract.rs b/contracts/cyberpunk/src/contract.rs index 1133dc3a63..8edd2c6e1e 100644 --- a/contracts/cyberpunk/src/contract.rs +++ b/contracts/cyberpunk/src/contract.rs @@ -39,6 +39,7 @@ pub fn execute( MessageLoop {} => execute_message_loop(env), AllocateLargeMemory { pages } => execute_allocate_large_memory(pages), Panic {} => execute_panic(), + Unreachable {} => execute_unreachable(), MirrorEnv {} => execute_mirror_env(env), } } @@ -140,6 +141,14 @@ fn execute_panic() -> Result { // let _ = map["foo"]; } +fn execute_unreachable() -> Result { + #[cfg(target_arch = "wasm32")] + core::arch::wasm32::unreachable(); + + #[cfg(not(target_arch = "wasm32"))] + Err(StdError::generic_err("Unsupported architecture").into()) +} + fn execute_mirror_env(env: Env) -> Result { Ok(Response::new().set_data(to_binary(&env)?)) } diff --git a/contracts/cyberpunk/src/msg.rs b/contracts/cyberpunk/src/msg.rs index a671a11c34..33d73a51b1 100644 --- a/contracts/cyberpunk/src/msg.rs +++ b/contracts/cyberpunk/src/msg.rs @@ -21,6 +21,11 @@ pub enum ExecuteMsg { AllocateLargeMemory { pages: u32 }, /// Trigger a panic to ensure framework handles gracefully Panic {}, + /// In contrast to Panic, this does not use the panic handler. + /// + /// From : + /// "Generates the unreachable instruction, which causes an unconditional trap." + Unreachable {}, /// Returns the env for testing MirrorEnv {}, } From 7063e441936f42ae8825f47a3c236c328cc70559 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 7 Dec 2022 14:42:41 +0100 Subject: [PATCH 0048/2372] Cleanup cyberpunk unreachable --- contracts/cyberpunk/src/contract.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/contracts/cyberpunk/src/contract.rs b/contracts/cyberpunk/src/contract.rs index 8edd2c6e1e..f5f1b98655 100644 --- a/contracts/cyberpunk/src/contract.rs +++ b/contracts/cyberpunk/src/contract.rs @@ -8,15 +8,12 @@ use crate::msg::{ExecuteMsg, QueryMsg}; #[entry_point] pub fn instantiate( - deps: DepsMut, + _deps: DepsMut, _env: Env, _info: MessageInfo, _msg: Empty, ) -> Result { - deps.api.debug("here we go 🚀"); - - // This adds some unrelated event attribute for testing purposes - Ok(Response::new().add_attribute("Let the", "hacking begin")) + Ok(Response::default()) } #[entry_point] From fbb75a6d8666ac024bf1bf240d9ebc75d48d187e Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 7 Dec 2022 14:43:25 +0100 Subject: [PATCH 0049/2372] Re-build cyberpunk.wasm --- packages/vm/testdata/cyberpunk.wasm | Bin 160084 -> 165993 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/vm/testdata/cyberpunk.wasm b/packages/vm/testdata/cyberpunk.wasm index 4fa2b7cbfeb193da0bb8123425df632ba3b166ed..982acad20c86b3607dd8c95d1b6a37f5b87ec6ee 100644 GIT binary patch delta 62749 zcmeFa3z$_^`9HqbK9@N&=bV{6%mBm8!0dCFkwF+Pio;E17RpUT@fzL|Qd0+0Au==d z42p`1IkwS_iaHty8YYS*8rATNiV_ve3YBs!Dk>@}>Pt!b`+VND_n9*=lJ)!cJpcdm z#5|n6_uA|FuJ^v)wf5^jEBcTKf~_mK}}Q=3g`( zjYj%WA;}Y|(xZ0an;HT}csKE^z)${7u?W$q;|54vmx7x>TQeRi!P)BT0FREiV ztM98HsMpmGwfd_1nwt8mYWSo2gW9WpuP*!yS>DI%5J#D{=B`y zzTf_e{ebHOK-9sgd^+~V1dct0q4RlVqaAvs$; zQ_p&fQzKQ!hG$Zhs(dvjsL`^T(Tc63t@;V?N9oJr`<8TC&O_dbrL#tT)y50A)lE&d zCV&5(C*Sg7iN>yJPdi4}Wdjy*cNr-saMN>Z{(4($6>+f{45m5#V^-G!!cZM3iE&$SMqhwCCh zk7)ql)y`4s3GWNeF!e?6RcCb7vRgVWJr*U`s#d*)4;{AxAoqAx<#WBuinjusqf5?E zPkOhMoat?hejCrZ*yBgOJJ_ztMQ$8y>2`a5Hd1f75%waRaM3-dL*a3$YIPIN8t<|4 z2@Q`jp$!Sjc?7pj))JM8B56On+i16`Y#KRLpCd>1L+WmHCAu)p(yA2UY32m#C=s@jm@V_eqyE@y8WUp+Ch3c z>82g&%wDw2HrMnS^pR=itsB+Ecug(Z$UBYVT`(TU6S6ukT5Ng9#&2TO38I2vto1I3v14kX(Poo8ND+dd$1K z-;lF=@2PfLGpR@mx)mh|F@_W_GN2Uuo+|7+I-N9~#y~7x)#?^`ss01c08A}BCqR;N zN1#TLkj7IAS@WG&b}j%bFm`G?;8tpk52U3bEv`M?!yO}-Q61K+`*fMb>$4VXqTIs-Yud#ZvXGb358z%DSuyHz%3 z7-@wm0nDl(Ry$rz?FChw=dAY zOoLvl+%mT>_*S!BiMu|a{$|?&|Hs=LZmV!3m6m~3I3wM%Mmq{di;KmH=wnEpop6gt z?%?96mb?UASd1pGC4;xwQ*_Pg)~CvVSM`{jMth^m^x?HrWx&Dupr^4#tr&_ser$xp zspBNt?x3-eDqLdhDCi8mBpG6M1r}($lgNqbB5^g9AolvZ6+{3`XMeuu zoXRkX8mJDL&}%b4tG!3->eOm)b6thg3lW}~`NU>(ETD4M~zgn0vQfN$2GCPGI5i;6ZWWJ^hg5@32-h5@t$+Z*}?L2oD% zc*7|}_SfYXa!wfFHf8$YZO;q>V*epiQwb55i9_H;GmzGXH5Yky8n}Thz z038utR+WKt%Z`r8c!Ii~%esvag%~ypK<-b091G!7F5MLlPozqD2eJ(+~N!Lqcy@>Iqfzypg{c;RjW|_^mh(cO|{RJ+KHSJEmO_U+Q3Cylkbzk z`{n1VY+u)IvgV-c(H5aOJe`w`d%61ID(JGR0)b)ybSP3IB%yNu!Xc_U=}>);!L0F)YZ!0_c&{C(xsT&k z6kBK~)4+=Guta64^`Q=+y_J%}OGPaTlBjS{8Kc5M+`z*c|MzI9Tq*`H6ZM%*_yZbM zgIeQHYE;vccq=e10#(gC;*)BP_l+aw=Gqic4{a0AjOq>i$@htDE9i){MpajA7S13j zm*i{@WuHsNM&=@Gs+9z7xiD15QgslqPDR_+w2e3=gj67F?Uo#$PSfvNY{@`X8~F;E zjaMfFDQ(>{pIw@sjRnP9@-w9~!ZskOk*y1c6U=~MD7-C>wAeY@%z8wovq%qzmH+~T z5|8WTxYz=b6a-|HA}SSyW(1UTG7*ZF7=^2?A=ksU$DwWNX6W4b40uw+zxxu^KNm@r zvxZROM$E)P0SL==%Y8~@^B!_Pv7UFm=(lpud8la`LWr6T)&ic?nLQMcybdMPEQc zjrQCuS_Vf!@<{6v0^m~ZELxZWEE?@AKms{jFJpI`tc#(703f!8S`tEFDCP>U8Ua9I zW+Aj}Km&%9rAvwMf-43Sp}U&_i0;nX4v&8$J`e$+?phkktYsP!%1R1#j)YDgv<%iK zxD4hEyrvc1Y^M&wg(T<6f<%&vNoD5%7zGIASaE&_pR=b8x?yc{;HAOHBls#)FPbq$;N zud`Ke(eNtph`WYo$vJGpz#jKoMyMvgtwHte8*`zCIpd+nr2zy;7SQjDUU}2KC4Z)y zg)jf)t#5j)46chP`BX6+BPH;M%p2jsAM%$GZ`f^jdfP|VW%jZD=t7kL3wacbg6Wi6 z!-2E7G(xUAqb@8PpM`n_p~7};v~=UBn$ozxKwB9+>K25B7op$tLHG9@l`u8~xG_oDzFfrVL44$b;TN z*DOZPuaB=Sp6oa$Dmb`n89xzPln?r8|7_F6wk-sXvl!-~WDAF{+V$|)F_uA1F-pxl38DjS= z!y~wYNm|CrL!l6 zt|wu$M>NK!y~W;`F-P=;8==wOVh27Pd2{n(@2WAQpj38@S#q4mAtaoBZfQEjN{X~C z+Lm65I)d?W@?piUwQ2dY75KaG7WK?KrW*BJe@q4>_V6*oj}a`R(o!5?+4-CzJfjnH zvT;l_bS{}}5uKPSE0glxKc*ivsD90}jz|Z_A?-;Rhb0^~jl;N^Gm2DH;@#eS)Sxur zjoC~y3#`s4SPf)*ghG~C-e?Z2!@Zd2IOf?IJ1en@gQW?0$=LI{AGVHd8Awu-)=-rN z&M6&9W}~$9(q6;3!D^K^W8AP~o@5PCM?3+0>E^Y~swJkE+QkQ#TpLIcHMgLQK=!+2wySTH~yLncG#IZGeqFRD(~TAo1q%KAkGX+R#|SWB!Vnl$g);U&n>JCEcg}HhYQzJx z+crM5U3NxXl+ZpojBUqVkWNi;6H^vainH3TCZB+wk2>KQWct|&LvUYm;$Q=l&H|WhQ5iZRVeL!b4NOiyv7xAx5+M=s zMmAS@_nlaqr&`-kZQ>xRrH70F+i~KUI#MkZly0iEQwdV-+91!cDNP2-WX~kqi>FLZ zyi8~mfo#7trT-P-g8>Z$B!?ao{wd-@2pGW4J8GmYNGO|dPg83X|0;>B3nUZN2L?DL zUBbR4(=g(NHedEePtB-O?~JL(08+P4{S;BC#4EJ#NIQLtCCA?w_*x>!z75Orf1ORtJ8-MEpsc-su5MFfddG~>{XqAQYmw}!xs@But-tr$i~+;S zn(bvA3$((e5N*jRXiZ4ezy%~*foDrP2!C-u=pUdp2m}HGUX^whF7r+~DXZ3d3r_l? z`s#*(GaaRNdasUjKZJU9)yb1ELre&t7KjrfZ3u>3lei#dC(bGovSt{>gSHRts8XB>j zJ{zW;W~;(=ykfJCckb!i5;xr}0^&(;#2M!$?lBJ=ynD_V;f?x8%-eECL)q#!B*7nz$>>IP}aBeS-|ec#T$5^G&uZ&YYV#a1)E7tFNCq6TNfKx&X^tH=cD# zVn1I*@#42-~J|eJHh+hoYHdrBdJkLD*=Gi@VPmaC26YsU200Y*c&~krUIl4QwyXV z)w{w@yg6r7@w)|;5Ai0PGgz9Q;B7yrw1~CNchacxD7DG!I;UTW6IL2!r5kF_{irJc z9%^Vb%b5FkoGubt5`ZF!6yfCz1$H5Uj1Yc?-_%?+uw(jyWDbZ>0L- zhRf%TSLJ(slr+wifE0G`Qn>{eC&U34XYi6Ts1^HQzs%Ehf7y0X7@C@42OzfryI&740A z9lC%15G=%Qp8xkg2N^+jChjdBRTVBz|MrSZX4k8o^!B>YR>s;X=-MmZU_yd+6WRj1 zYWhT-z3Wx)lusOu6{VX#G4H5<-CXkeUfF=2PQ3D0eW>3DV1;9&Ro@2n`Kq(=^3JQq zrH$U`DntF-uewwiA?nl`D zUv0Q}(JQLvAz2Ym&>Y8-I1Fuwau*#gg5f#qn(V-~H?jQvu2`1z$#joFTh0?3mR*xp z;D`@=x=xi-Oy=PeY1P}k?_GOdiNU2dAgs6f)7d&hSP>Q$BwMS1W5#*HH1F!qd;-|@ z)6bB+9>>qG4GEzRQ4w_C|yejG@!4rHiA1$zzsKyLDsq( zSa`|}nSYwE)_diKM3t#+4C|PJ&;x}fF;m^|Z|E=Tc+eEB*L+)`dv+x#EM1|2kbm!; zeB&_m;@TUJkskH;zIEex+`WGz2Xkbu2ES8tqos#7{1#>;Hhhz&>Cffrkz+&dDE$8N zF!@Hb)lV}0uWHRgxil_#D-Rn$zKZIT-NH$zhuapDX2A%M!3vMqa8KJzrC#)B|3qC_ zQZO@9Z#q%ExZ%#5n$@6?9&Ei5m~5O!B;92si;dpfH%|nW)+`yr2#8qkuTFvIOIDkvIvk z%+qGi;8P5vVo5k=$W5s9*^9gz;x!SNcHV>WX=U9jKsLlhy?5a)$Ev;F%3F?e!Xd?s z)2QA1^(|A>R&V63XH^{h3e@j)+?MrTxHT0HFh)0Jj{*MV*5mDscX*?2Ju~md3ac(y z9XPbyL$^(Z^SfiD8gz&Y%bT#Yr1r1NAW}+TEC9Qbgb~28?Q=*|&Qadnr8T1t&OmsD z8M^&*P{N4YSnKqiQR+1Bz*0EQdTn-Ct!c$MhHemW6%g(*JxfR4v@L($vG6F{4EHFH z#)_<>ctjNi|7^G(6?og^pLhN6-EaNwt>^bzr$aF{oU>>AVdgvemL?cTI{!8v zzWpKJGHwM`36g388JLRvq#imvaY;~ga-)E1EdBqgkuyl#S>>W#W{bbop$wwNFmnt+`_Jd1bjonw+6Y!5C13ntz3cV1N) z(t=rUvz+@>I_=dhKf;^4tS0j)GrP=;g%DUV^<04CLN!`*vs@WnxvUz?SI;kV$Cxz? z7;|uE0YtH$>lh{-Zgp8+36|9mC~()v91FldVBBY1mI$IeAn0VJCa|8MrLqgfa3^A& zD5wS?!mTmeS4eC_BMh<(^z%l<^JOtF(|~GNq`>lMut;H6Lrwp*T9~YWaS11scrFnk z#`;!!+wPiq@){Yk%77%BEa0?RF9^G7qnolA%OVW22!edVRtc#5tH->HKDV#{)YMf4 z)JcGP*pXsHHzL+B1Az}{fGp8}dBn9~Tv6}%yQ>jDcFx_|e&C2=dP1$D<;6%A{gvCi zd+x3qxED4GF&F`8Fp;<9pSIy?o%izHz!39#FZ#~)4&>Z}+l1G*{lsFdP^?0QZi)A? z_Q5$s-E86$49AVUqGCFXI5t9tdT}Vua#>xT99+oBJMjkdH8~-{6Exc4 zMG3=$ln6r+_97UC|C=>vFjWv;93fCKH_8yG9K|5HJdiL(b1r69qw~U5;ygf`Ql9dr z(RReMVCmt3{6!Kx`KX681`kCO0lkD8dxc3h>Rzx)+-P4+o?47ou++ULym{r_~Sy5Mj@NScz1SrsNh&Ki?^I zu1%DDrce*X1$rp^FMWeG1Er{I`Ps_%#@cDNlr`F>(;8WXU!Vub{SmQ>& z>=jXO_XD?RK9Mbj%4xEVIK_yo2h|#n&7_n7S_I9Vx0l7UkHnN?|Ik?}A z`%VcO=!#`z=(}QE{b;oJ$Bbw0K#XCRLnCeRObu$^%NiT)j%XIX@5Y?HHj3yA_9Cj& z)5Jf!G)9ETlpymGb1M;?=9WJA1A?K5m;I&szQ zrV|>S(cNgtu?uS%h%9^1ok&h^m2nB3v&PQYSbG;B%No0QMHy#Ess`O`vfhY*YrZSX z(w14dDFLTL+zwU(q{C>=8N;z}kCDH^rHPPI=3ulJgbjKXHU56)k2+%{NH3q6ZM+`K zP(+#cs{yRAvT5nQHmOL>FHMvdCyL@&DZ#p#_|v1oI+HAY%PNrt7g`b5%u(fd(`V@l zSJ6!mK;uzoijiIDGvyxI8kL3clPTgVFuk{ouY=T(C5R?#D16Rvkrp9Y*)4WUgv<9{ zU332&Vvo6`WgD-u%|HyGQ<3qQN-f2xrH<<`$j1a!?wBOYbV;PCY26K4kD3e^MJ5wZ z0sy9!A^|_DVk=x$D$0d*i3|=0QPo|Iw&(&yMFY&#m7->Nb%Le|Zz~X%J7o$Q?Hw`W z!B}mYf z=shF8R`41(qhY-0@)*Qa;u;JI6%jl{kxjV}J|ca>!9zh@j(oBLV3rZlk@i>?lK|90 z1tYC{QGJu;!`N7~FiFB08d(v`R5NioW>3hDx3nKHSrWHnh|6*ie9k!~)N&!%;EKj7 zrTDrcx(m*LU|RYa0zM1~No$qDKMg7s)Q$-?bArk%wUs1R(eNUY$}B~4O;$M-vnI;{ z!Wv(AT-JD{6Tvk1GbxAbL|Ia3UatjYg|Fr%Nr$Ag6>!uQk^;UuG?FvohTz)^Ek#i8 zV3vwuk*^=bQaOcWsRk#7r~XrxiZWoSV2b3bdOOfEM+S!Z0RXlG>GOPt`YurdE8UR- zCWfSdiETyUXrO>^i-^+INi@d-Rm3dHf(lHQ*>IrQq6sYf2%Fp(R?EIpIc>6DKu3UWLg`izH$Zv8;C8(}C`(cZ<|yE%!E$Nq#041%P|s&;~Wg^aO&`8vcRNLN(cc4iPlq=+NO=}Cu&kYN-} z)9+yjFB%vF!C-{FoWg#`7*!)A48~h+y1Q29*Fbu02x&|yp(ld3$$BDUK&+FJq!X!P z@0mvi<|zAgM^N6NKu1^uN^8^-;MSwP79!DNK_Xap{~098^@>G>NJL8b z7mx_J`%jUm0E13hB@DX|g+2&_pv!|p7!2BPleeUyi8on)qlPjq?dYOZLhwZvCu#I` z^CE;n7+%y9U;b$K%8PbOS%WWFCB=|v&=Cl`?SptxS6J}};mbR)&p#Y5+JPoQeAy9J z+l?=8*n%(HgIpoLY?qwf`0|=<_|t#!Wvk4h!I!NDO3;OxtnV6pDbw*(k>Cp=z#t5R z+<}NGfWPkMFPnSEmyJ@^;0xSSz-YZ5Nx+wl*!e)+Kp8e=M2Tr)eb_{rIyuA`a)Hyx zzMCAShn-Cvtb-dN7H3e53UqD;Rv6Z>7EMb0Ckn5X%FPa&ClH{L#5yB&dd8+>@ivyT(ANU!$cMmCuA; zeHSDc{gv=Y66lm{@S5o7j3;?1}l3P(QB`fTJcM(r0v74;>8KZ-l1P)+e^w23W)}Y}?mH;E*y~<-myVOFH1Trir z4wWd62(-NsFlX`;|CX8ph`lw4aJwJ^oKoF_r~nb5QHYr(2mwS86$V_LW)>9#S`adN zKtV-@vZT8J^|crgF8k)Xqh*9m!~3RPHz2p%FG zmYDKY0HUEW0&R^*)|G?35a3BaW8lDo@u~D-OZ2@AXc?tydesVwX3W_yt zno+}{wXhG&l|x4oK($vwz!aIb;j_ELn!6=*4~6d6>QDhaws&iR&d^Xo zcZJn{+2pKHEmyKb?-T2be0(hYpgy|h$f}le1 zL|BJmwcYsgjKP;6tT2x+YY)PgC;p2sfeqPFfG-^eN^o5_S&tfgNnyWkRPY5Wa}m9w zAoq#_=nJ+O`~LnyY(Y}si)b&vmgUsu5C$MZqMNs{*`;Bn#1w=&hF%D;?!Rm~*YL=eW)V4v5cC!;7QxM>z;; zE&p-qsV8Dq&Me7XgQAUmS*C}k(K9Ah+Qo}La1|-wLsWRLfhDp zNv!amexyFfeNWwn<7I_nDKC{S?^P&qsXG)(7YmQ!E(6G!oO1n7>&c&eO z1J*VZ{W|ARiNxI-f%}S!{lUU;exDx-g_{++`O9e{j?5OnZgDhS#-H~u%rNF+SRr+z zK)vt9M@7CF_^1L!FDnYZ(aWKG9qOaPuET<4y0PJOr-~Nf$bZ(ouu9G31bi6xLd$%a zcCC!M+ah2BA8E3*ph?_#qr8ESC32#=A!MT$)$Ic`H!M3Gsw91|<_3feD7F_oADKIh z>L!|-PzfRnLY#*)9NrR9_lhx?sZevp$wm%yXtxflyP@i6uA8Am=tXuO6Kv=KWf+Gr zDa0ngP-xj0QpA#@+5Rp|j&8A8uamVP=)8$V3!CkI=A?#06;ygMS!*t=RuxTgDmU_JL3+l?C$>+?DV^6@?u=Sf0mP`J1b% zb7sB03@=TTJ3{akw_-?uFI49!gYLrR;BW;M^Ds8j#m=mZx9aX_i{*Igj<#5ar*-+* z3or-d$Le=}wPG()au`WL(sOZ~++^Z0*5lSOx9f0=@C&k-wYW70ljv2r#r6ZHuD~rS zievG@B(x*J+{y|vddmrQ5#hg!S44Pp@fsPL!@@f3Ej}O)qyzZq){Mn6I<6JX_5r3N z0AxR}sBbAruM>4MY(rXN^2J(rD(ln*tz-j z=C19714a^bD{N%{QL(K4DmxO5#fuVH{Y6>=_2B|kmQ9?TWZuCCP)cM>vVa0l1QC|o>A7!KD`_3?HiF3Aa27MEOlf|bG5nP9oNU~#h+ z7ocJlF2J%%T)-wAT;QBZ;R3Hk0vBLS6c@|{nq_CP@fR`5xJz6!(L$sP;e0GF7#<;> zz!pC_ex#!q5j-I_`2EjSRj8H`tR+uns}VwTd@;hRK_{ zZ=dVF#i2<-1|Fk?Jxnojt^M#Kk<0AnmEwh7C3FR@mKg3}MF1Mi8`Cf#n&Fy|`z5^Z zGWXE^n{zm(NnRYV@M5dEhiWf}v#{_!-fuMNh@ot@*PHu2ykBeXp|#4PTrnQU!7w!r z7wTbn3oS6bZJ8h5jgzz-vyRHYZVd03%f&0VRd+HAtS?>aoC!Q^fvB}2E$B4hdNE$% zGS{`9a;tC5*3i)d5mvJ%i`B_fp>&X8lq_lmHk!(|TFzOx0|w5;8`V0^WQ0Syw~W*t z5qt-C0OHDQIFZ2-rU**I1*)b>yd&_YHe2QG{NjMr_$-gu(b#{39r0>iHQGn#mLQ%T zDdWAybw>;!NHGV_`Pd0Y;NksJg_>jDrRxM45oAFQ7er_GLU@eGAVg47z|UAh)`TH- zs0iVL0}_z}Yc1zmY>$?!<&0u_hsq#tBT6Pg<{X;TLZ)jkYOO_P2UBUG4`9_vjM`Mj za6s>`Pq_ma7bgwy%!Ce9#mb%Y@OI>vYD%O5Ms-B=+>-44{UV&n;&dv* zRdHk#Gyrewmj=!*0oMnRaWGDjS=CfoQ2?wZ+ByXs9?&2!m3=Yixu^tfWsz$>$BHZ6y%4ww_8liz zP!s?DGIcT5^dkXp1%aFYz*XvOof9^#8t6a-$^|AEU_n06e0DI8iM{R#oR??Da zN5p=353aAy9n$Kie5)7+rH|6DuQe5`a1YVWRiKYj1w}5Nls(%V5z917<=dup3(}Yn?@X|=p(2LJ+k!m zNRlAcY;ryVXzWEgIzLlFJ;sgkd>5d1iMQ;TK~o?t*g9gtUDr-mF-MQqLv$;bDUo1z zpx6LF8>l=$8p9!ee|V;Ew%nwZOIoj3hbgGel?TXztE>$;C-d;bXlsVM;@L?+6Bo=l zFcmZ5BI73^`Gqtgsf9u6_IAwvFhezZ+2`@F5bunF33h+fb3SmZB8rY->D_S=m~}TEYKSP#V*t$5;8%Ng+vJlNSNTn zGZhFI=S903NQ#0foQCkl=f-{%2!W_=w`2z6eJG2dIuh%F>6sEjP~cR;JaO17a8%$v ziMv}UKB4foW=q{tzDeS~JKd3VujR{)U~@PytOTNsy+#E%84?1^Mf@$JpwX9vkw+?1 z!mvxUdUVXDcxqL`iPv9KY8 zpj}h~MH0Vmt8=RmK|4KEXm5pr29!88TE&JS*MPD>rQ4togE_dcV-d?AueZq7`6nHKz9LcL05hNs)D}KW{vvKY zrE{Oub=PE~$j;$okj=9J(KumTi3_JFI4BYRRsfrrisLMi6Xzs82>p-NFCLK(QzQo# z(z1cehyVxu;OLr-FVy9@nTz8I4;-?bmB?;7M*)D&WemQvb5O})(4kIn3v72IAGXb) z(Dp2J)P}PioR_C$YCy>NCy_wrf-KGi5HYu{VT%T*KQ`K6Zya+1>|{x8`a{s;kQZJo zbb#_wy9nzY@7?xdrfw@H8(bt)9cjUOsJcE|J3DP_rn(^e)!uhrJYJ^D0N=vldfWhM zBqeq*9ISz?|4S!e7-%3H@gN!q#wbH2r{kOgv8F>hiTcZ700a;mEH?Qj=(r9}GeJz@ zD_Gg!jCo7GTAjlK<`b|s#Du|#l7=hT8X$inCW6x+rPgFRtI%0-Cq&&S0S$+vw2nw) zQT_@bWjWhWaeiPbKd?{(%IQ`6%*aGt+lB`jSyERD`J!(T^o^K=dfFh*Nui)<0s}b2 zDFO}%LZe+7X4|g26BsG-cP#Iu>RBGK^eS_UNndO3sxi2i6ja)n_sFI}YKr&uP1U&> z@R8CZXo)y7AQc59B5F2Q@;h*fGx((*2r7Z-)jRpHC*+_&MBu}6a0eg|@OZeP>_%MB zSJF8K;Oh10gB~e#rn`8*7eCHDIpBSsg9`+Nkj40T4w$BQKz%VLAvH)S0I>Tcse`u& z#FsuflhF;xqm~Rj7&zY#NSYw!16}Y4-$|oA&N&5XU}=ztoMt{PSGiU_kb_R>Wf)m- z3-d`2GN~|H!&}&?;Vn#4T_+h(Fa=a-qhgZ4tkZMAI~qAS2oHBz++BvNOIwl&86?cb z9iY>$a=5`V^w!WtfdC2YdtuUEBt>;6;7_(M z*&$|%S?_*9qGBT@irKu21K;4EtilCKAr34q*ppT)d(yCDBGQr)wHOkTE=CGUU_q26 z_OeCP1Mo#<=MA5s{(uAL(1-la8!&d$GaH8qfLoFeIHDaZ{ewG!vluQ;5JG951MXVo zMFNN|1h>2pu`Yul|EmW711vD)5AHyYK*)EXuz9Lj;ZCn8g|6Om3%by8E6Ijb!(Dk$ zsCJ@bqEKo0Od7&C%!vKG=BL%(`dBUTGyIA#29rYRi!QYE0oapaX)0>#D2KxUyBCz%yhg?B_3 zH}D>F@1lcy>|G?f5*djcrqUcmR)CWvESU~LN$MqVI6g&O0rWBKVB_-!MLfZ_F`0Hb zaU3V*=d}zXzx|x>DkD2Pi0X|AfvIUN<*8@vOn$LpJpw?^gJk%UG z1H$WmC`RVVpGS8)U@&6v1Osc~5@0kh`or}KEM^$zM^wL#I@l_SOYg*klQV7=q~NqU zqI-T8uIp`EzF z7TTVMffVP6ik+Yqf)S}gpX{k5U<^F)#XJygLp+tYfPhf1JODgVz1v{1m?WsrAbOij z(m`F6NeAxdSPaZ21RIGr-)X`0AZItG3*Lm7PI7Y^&9r0a2J4M^7uCUGB_cIOQNWVe z-Ds1w55n|nG#rC>d{yNaL1ng!+mU6CE&07KAaa z=)n}BQ4lWFRRAiONjZoe(sfV<%qvR*Gwe&47mtC?mLRQL?;&hZ%h5rcLVTmkbB|#b7^A7eQ?o?Q9 z$VBtdXe5DoXp!l_JcQ75@e5Gl7=7|a#>og@r}hzO`RoXlMKQ(5mpBV5JV@Wd`WW&u zW~SR@>wS z0Krc!JFZE)3Cl3 zvKzUDK?M8&yK`y7;n2Y`Fi`&kh|Agy=00Gv$Ge|*TC}G$V1cF6;$5%itRMo|^cvv-5??&lh5LV6R@qSmtj05Kf zVAK+7xLd*=5GfLHNtBk9j)D{u8nL1~g;53VJOCi3^Jf{LALcBBtv7XACmnQ{0YV=R zQgOdnX(w|w&obyh)B%p;=b0;TDOeaFPglV)hcEY1f1(S9o&e3!obSlseV$CtTK{EEPACwL}kD!vl-)^Xr;=s!Y_ike0rXIzB zvnb$Vhx{7v(r-`Bp9sX~=e|Ai$TgA^x;BE6iWqmmg2fuaiuf!7V~b47Q5>zA{?3FU zh5H_DV@-iD!c-Gd1}yQe{LZB~Px43K8Hb}4%eH39@)hw=c^t+zY3ogW!y^RD0qwzl zSMRQEL%e@%ongOmn>YQt_f>F-4FlMt$TxWIG%Ek&cOT6kZDKkh=MR*i?C@&Iet_9c zqzww4j0X^(x958obf4aM+Dm6O-VzSardVbDmt_HK9(nO3Ug3Cml;kO3ue|id{6QS~ z7QH*RHK*7=Ea1U(N49O-&L|B!9Jbl?at?t%PrW=CCqcdT@>w`GW5_GRk#goM`C~H# z!UolL1J!z98XCh&drxDk*dl{=zNM1)6{&bGf6~9Li%&&=aoRlI;d4z&Q_0f^#c+PC zuzpl&ZfvZ`N=k85gPZf-8}{naxgTSr&wMvBvnI%ff&U8lhnC*Lhh>~yiq6EsKfL*= zY*B_YWfqu7RPS3WZdLB_g_00H@QkRPO7ICa!Cy+DXU{+aF7sg(A&AAEQ3`Ks)Y*#j z*kHFgZ+X9cb-enq*RZ`|_AV^H8AlSB^L%uK>>H*T>X#pIVF7!=&z@5P|7FzS}f9>epj@1}8e*h4DBcL6*=F`XuRU~YA zmNY6bC>#)BfN?p1f%GAP1oTBV<~ZMmLQT;DC#Il?z8341#E2S-ae4(KGitC97e5%0YQf;3vfxa9 zten@q4wCWo>)Cml$)k*XLHqO?s=(FPh+~GJ;&JiVIQnoDk?s#R556mIJ^*lnh1Xo+ zs0!D1_*QS?;^#VXOnO^hKP&fw4PM{IwF54|FjfeUu=B!4uDp<7C1Mi16+c{_IU6ms;nY760^7kVp5QeG?VPOM z*!!bmRoh)!dKs3sSla8mV|rL-&q|i@T6ef%$|jTI?{LQj^{$i@EGxJ;0h-4YLpQw_ z0L$og;hQiaDEx;VC$$7w4s>Vv9Lm({ZQTi`l0y=9N)GQcZ%i8$to^NoL({mbwqx~9 zkJsyDsNPTCsKK#=e}CiX^0Topg(b`)7Yeh0%RBx}Hy1c1S8&OXPNdLFxi+5=G|-*n zkc6PcjbRax4%8^N&m~12l2S0{UG-WqJbq&)Sr!4P+Q-x}Hvw4S_FsT@=!ENDSPf^Mh7-$MQ8uyH668#?j4L^sYZqv6J@0q^6|K@`3DiTi*!GLb zl^_i7yr1y9QP=(Cbo{>jlOwSvvHvG-_YjZ&>B)F;=TDDN+q`FSKf`#UfIvr-X50(`(Z#s7I8bD??Qxubinma>#9y6I3byQQUQ3b<-PMxKkxTHDZ=+hs&n!1}i@tqT0vRI5nboXRmuuo%^f#sW2Z|yrrp|fwj z(}2>Ltq2PEnP*jnTIWst*#Pxr@2sDVs+-8qkbsGU;e!QJ5WzerR{SC;I{>2gazU-J^yoldF z{Nf)V`QQEWe08CB(yxwD7kF*I`Ye7A{HkThgaCe>uKi-g$$5U5~;i{QCO%(sj)2ee2glSpTnGyZvsj>^DbN?!6o7bhZh&ci)ev zFKw9hn>wY=^gi+1&G;R;=MMb7xMxE1nG_2hT<0jubA~;nOz~iolP@C^c%QZL=>Xpy z@Q(alHQJo=yIXJ|>r21;gHj*y_Wp6hhAa0jHn-nH`d9z-W{iOH_t*95c&sO&I=&D9 z>i7Ex*c(>~6(3j~QgLtxJlKXbQ1SVHt4=R_ym0nz{@aPY$>%rzHnvv+8T|K#i$7$1 z7EsiLn*kSk2{+rb20fBRiFU+$VTKMcfzbM*ts-9g-^TXVufP0V_u8)+?+&`W3uAdmI zhX;7qCP|!isEfLtPlA>~2}yX*Z?06WIH>p0N>y`m@MfzZEDDAgyfjRpcA)fH!D3b% z1uxjhr!P^N42rLi+Y+xUc?{9eRXH!|Fn(vo`g7tGNQ&MLD|h?MoVzoJS_xUWiGndw@(IXKiCD{*=+ zo-}3yXMbb1T?=2)_V2Dz8;1PTY&81t@x3eiscOG(e^ov4b@r~mUj98?FvA?i9wt2* zCSVwnaDb_>p8yJHEuf$s|JZ6(a}36E6xjF&4`Z>-NG^=$x$x#$+n-des?<9FtpVyt zd&SFsQMDQweT=YOT&qsX?ORXrQxHA69MeX3AjS%~I*$ojfvEB>y+ca09Z~|Aci0ju zfWD>;?E5f{06Py`n@MUKrb_+ewRoHy9@>YM>AT>^pU8 zaP7KVHv=$@V1Gb*u)lFsr*Pkh`u$Vu)EKqoLuCAB9X@z>i~sjJRa?8{a5Wy~ss=UQ zpW~{`NiPB6p%xlF&{*Q=vV1&Fug4hlSRfBR7q^@DTb{3F;2q7xUYHs zo31(*=e^&TRp$@v4L~Kx%Z%D@8LW=BJD&BwlvNXl2atlo$h9-`&C{S|Y=lGDN9g|NV$7$aZoZUXfyaMHGkfLGu3hBd)ah4*iJh4RqxH_am-W>i=IKaoyXbYHfVU z`q3j)rMGf;MGuCH&#|78*a&?G{@+dheIwM^?x!D)P#;Tdf{KQ-fj{d{8mX%Boo`wk z@L9ni$iMjn-l#Xde=No4zk2^{#UN9}Y2z9I?xW!AZE!I#=oRi1`Rs-N_*B){?^WvZ z4h~ZTSt|W@@Z|5Bs*cG0LG*ln=mA;A|zKqAd)(od=s0P&37O24z`5n+#daB1H7qVfH(CV;44rU-X5hI z)9bs?t)unEcc2K|;a84UbJPp|Cq}CVyKAq%e6;#{|7FkNm2rJMg}k-;0Iiz$p1=Gk z^|AOF>zM}kEi;L0f<8CwO@`_WH>#)dWfnpxI?#4x8nc*KG$E*(628<~4Qf3={oTLnIDDIo4ZT)yzk?M~V@bFjo63a?b zvK$8@>p1=jUt*KGyez|qxpfi#@-KB;%Jg=fjLt7VUOkx(fUwOZZ9QI{7bY$H3Sr=n znxxJf6oM)Qiw+VFm|{;%QX|4*>rAm-lhiH4I-a2(PrN*qTjsFC9#bVsHSVjRzdE?C z;Pm~?U*4jY%-zZQT7qB>3lu_Cy~?{k7WCT?_5f7S`=Bgqv& zby{n1ar;l7poTQVCItV8+!h3#fiaN_)@}htK6eS;xMvTouI6(h`&r+I?Mq}IL7>orM z1aA2&r>GI-^i4oJhf^G=39t4Ghjo+ge8IR${a;Q~N2)LT<G52zgv*}>3{0Szs;)vbbM(=0AF*uwJ7%h(2onQ5O+<|n8xO3uaGylz5>RIP zm0tNxGt07&umul+`!Cg9f9w?1SZ6|= zxG#tpfd%fNh-E`qf&kNv`wyS4h7R0?x@edi_|h=vq7i;zneX#kPE#X4%7qnKRY7WC zH-}T8-9V&CFC^Me>0<+rQiuwulIX+LWHTvf4b^Ld3jU^3)rhzll@URLJ{kzlA%QHT z29AFJ*#Ol`{z=2hxD9a$fJUE^xpyuYPmmx-F=F&R&cQ>Sx8Ly zzdub?71E4*x{Bir0zgXz&^qdLg-_@Cmz}Ogh2z@xp~jV`w1cPlP0mPR!95)I76L2>JWaiY_p+4;X%vsV0aMp zU@(hR#P9fsa%(};Si6mwD?~=lYGE`6Bl3}!#n(^&j94r;3*OC`qw0fqqZk>4;AE^Fn{qeLQMaCB#x&i)^;m%1jEM{l-o1SVW7-Cn z8>k!tF%VV-h0LIWLc64pk3qTT8ySRCW*{*+-C(>j>B0VCNfC@g&r--k#G^391{O-K zZjSH)!l5pT{QG=$t~vvgb=J9R5TGyr_WVK54e$E zOfgxC8N-OUY>9@w(SP?`RU0XGR{PcGsUi5v9lWv~5k#0on=E{d0NY|=k>GPIi0nsw z_@cId(RpfGw%ECmIq`)83CFDAhg}Y;c-wi<{8;fH&QlXru|Mp5)z~PXpdky)a5;VUi@gHx1&_Q~L9_6XW>CgK0~d{x~S1X?Fz zi(SS;e?Iut7pR6Y#ZHciJvxc)3o-`Ve1FCa8Jmp);24-x^a2zA=?hd12Diq4`2scg zw4hQ1sH6Tz0No}F8@f@C>`7|0=g7JIOb*XM#AoecyfEc7z}f~haPkRuKp?a+x-iqn z&-?*4{@nVaTn;QxzIT@`F<(3?3C`J+kFtxqE0!9}oqce3fdnGd%jF%SKd`|nmBn(W znQ;c*%2A$Zb-KVGU2L*u@C4+ri7Yqva9@@*lg{LH1?tEU*e&z(rCV4U8KY>>$|U4{ zlch0{NGvr4f=2fPYvf!{Kzd1pgT(jLA{oTb_ohLC;7RQI3I+7aa|S3bR%&|p5RkDjMSq*g0*AebqC?xpI8J_x7WE$$gXT1@c`{ukz{6DI^+yUs0352Po93{L0? zcpVP>I;5cdib$%Kh-FaZdO!0qHI^cheUUvmhz2Klv*{*l6mX7pHCdzO#7pdnAzI^j z3*tSAse53lDd|RGy{spntWhyWm>yzY4ME$2lb`~@Nj?uGQl_XZhy5xTdXc~SQ>wlK zp|?GUzF7HheM*h;&%HRk6^U^sa$>oOp; za32VE6h;F1gGgd5v*9cz_}Qopti(0Ykyr2*+&s{dA=~kM*n)L|ah5NcH_wbh;-7l4 zss+cs;$k&OnA}|#tA^5m$!!!d@QB}ev8o!y$q5JyBgua>0v|;MwMd*UlAo~=5r`wT z7GzSw*L?R9e31}7E`IYNZMa%G;A$!PjvJl$$y6!f#*%d8gRtZs*n)$1I3p-vFl&Xu z7^nvymJqh~1j^Ep#zu+^XF@?F@bK=G&Q+imd^`=2LIo9ckP{ouW=6mqIKtTuS(}tO zJZr-)0by-Ij$mydN3caV1$d-L$0^pYa_9?=5a&mhieQrH-+upvFT|&zPhdpKyyMoq zRN*`HehOTmCW>Fc0=>op-6uIpyj=)BiaTwS9}(h=!e5$HrX> zR9o#obS0GB8~m;-)tp4o#C3klRqDt~MJ+D^O8|MuUY-J;AfJseOyM4L;{QQh0ee=# z$Xrpe2qtm>B-EJ%QEOJ1>GyBH46l$Md-0$drTurWQni&hJ8dO+L1GF@Eo4wIIpVOZ zg*xu}w5o((69u?ag1UfvxvC!$kO?+LBhBanOKb=X%mMeqfz#Mos%7&pS2ghjsiMR` z=Sb!H>n>NrN^K*mxmS~!esQ^)5#i0~RyANk@RHE9c?>ct>kw5swV*we8%%Qoz!LDHYXSLDT=!s*W5dqQz88tRbimk|uaI z42;ZPHh2ms&Y7<==Mfa-1NdLU&wzww6HqHlgvSa73O8&E1_JgQcN3K8r6h$YXUxbc zeuoPh6}m@Q|8Tx)2w}}V;UTQIanpiqtYmXr9?>LYDN5`j4}ucedW+6@36p3g7*Ifh9dhrSE@{CAD37 z2uli@Ff6HWo+UxOlSos+$lO(`W^50g1e_DhW{_bvgYw*Gph*yejQf5u)BbB${TtlJ zKmTe~ECTwnt5w5U0q1EipawbDMGhz+HM9#gh<;M=b%2;qBEJa$%Ax%Gf3ZZMhJBzV zf-hMGlC!M2k3}@Oc)n(gITk>m5Ce5oTzz_;mruSsEiq zIK0FTMPDz*NI5087$dpBmN3Rh)QTL=8o|+oZV5b#lmGO+mv8=`m*0Bf7uIRLnvSBj#Aj70w z#PB+zr&PZWvPsUIXcS{uNF<7@ zK`Mpj2$X8>5a(FHeneG<*MA{q8s=ou|M)eCEhe)AvS29G!SkbFN-e{b6Og3fa`?t7 zeO)Q+HtmsTz#*lo3QFO#+)}Eaam?UzO+e-pGX!c_^GrD3qIwlno)Y@uz;1Di-TAnc zuXbSzA)*PP7`tVnp_!+k&zJ$kCM*;!2wHQ2<~CqXk5>LOjZ~&ZpETMpjKoRTs_c1U zZ9-+DmV)II0X?S1!PFQ{wj34;zk)~2$4*D6j^q0pP=%laBfOi7GICE&Nr)p5BT%gT z&TCa=IuHX`l%$^Y&b4Y_z0E@!Br{KFV7;(GsF6t;Dn%JT`x$ja?PKCe5K0exd)+#p zfAMG3u<-^TFyo@Z#qm0yQp~v~KE!cE3nwv-d$ujJ>~H;ys^j4zDHn$Uay8lFL~`v; z4%zQJ1x|}f%u?}nYCJ516RuOEarxAB@Dp=03%EI@mMku~IGXlpuo|3G`l7!9Im*Mx zNn`5R&cpsMuT$gTqObd`I{Tov%DKe5S zsz$%=dNtf$^<96~^%6jxO8J{}s;|BDyS^W!Bu&cht^PYm!OC{|4XVoCo_{>=2GwM* z-Rj?QgPMR4Y(yZThJNZhVfL~ck-f`2@_pPtbsbt*+no~gOLJ?5opnDf>uR+{c5t6z4Ls>%I` zRg~#p@Dl7&*vtDi77Mz|1ZNFUp=Z_Gn6IRlnr#wpVJ9{-XR^1PIWmmGtY2odtvIu%Ro+O037ILTp&atbMw(BIg##>A!iis>f!D z_it7wSC3~4I8}q|#R@n$fy6^5G~T~t2_l~!^vB+!be!v*&Y%4oZ&9}+DRHaPWhRNv zxCoKf-*&6IF!%i*lCm0gmI11^ej#`qK<}lk9||68Q_z%ceN*sQLj~5>KY!hnt>ZTh zZT+?2@d%#WYwLT1$3}R~@c7don9O78D6{qR<}s&-2vO+wzi(cT(SK1&=jUv249Q|47Wp>UXxA!msj^WO%p z57435d}k?QD6sN~;71@Rf`EqFwf@Ar)X}QSzv?cP9W@>wNv9_s1)x(!xRi((DxL+( zka!*nWD*^7sq{DBrH=6r+@%JpgkSwRHF##~1OHj_4?GTQJ~QE8i11_{bSyE!vY-Ts z{}21t>0-oQX`H#|Fa4ZqQvLm}d`=C^IR*c$g8P4ZYceb3!!c0uFM{8w6O&JEV)uk= z({ITmH&$Z(k88F83E`Xz_{7*f7v~LQo48H)FNPzB0SYYWR&1?7~ulncsLh3!cUv6SP16R8Tn;`3_Hyb1=x>G(Bz(gNM4 z7EZA6)l4L$x)bnOL?raNMi(u>sdUHz{1-HsuOmEogEBYjJk%TdAfMx3_udIeHEJX;`kCdbFGzLl zay9bwD3o1v59j5V0Qm#fz-TH8fYI;;xVKKmp@VJiX-F$V3nfr#_(h{Az^~&Oa7aQS z%ZO>#15J42ay2;J@nf*Kj9!KdVpVr9S50ybb9lNmHdvGSF=~`SUFJ#lHsf4*y}!ph zd6IX~O2B>4Vt9;4B(D)hv|+!Eu7q;(%!4kpP2L+}(A4f9$I#y2lz;KP>P5BEzwkaa z)StLQHK>)(&szbV9ce#(5K&lisq%k%KNQ@2QsV<)LiwlLA5bH@pMKlpY1V^<@1E}Q zRK8MO(OvGDmC{ZF{=%3C?zYfE#ZBq(|sTaJ@7UWoU zpS1Rq`_x#3Sc>7&21h@mE`7CmP}l(oKaOC)npc)fY~+~dmY-*NEEc6s^y|LyEs;HxUG zz4y#XLLLM*36BsG*f|NW0O5_1@Y+ETQ6BcwD{?Imk`oA!2T4G%w;n){s3;)d&|5(8 z0}VoJP&8D~;{E6?2r5?UM@2A5Y@tF$LYu3!3 zy=K}A7)?Pp!SOT9ja(g#F?^g9`j|5J0O~>zCRh7%6X+n*X-cMB5`vg+O$g!_;9Elw zUfJ0-E~Kthi@9Bwvw8ZIHrT~p^@*FOy&my)rhSm;$JMf(;^E%M(0aXAu}{HIu?+hv zveKtP5%!LNH!%C_s`raxNZZ{~e<=;_!=e@q#4+D5|J&2ZtG;wkBY*g!7@TVB(_RmE}tUi0~7PrPV;?Ahj-6FNGw+w~a zeFoH=NKsL3c~s{5oD7eLGCZU9?-o6g*=M`4LwrEQ9g0*Y&ONEikBYWx+OKeK;MDhM zJ3oQf=aP>SGCk;ZLj34n<8~2h?LnKGK#vnj@Nm}~!qZ(M)Y8M%6T-HMljn&b!BBxm z2*r8G-xA{I_`3L)3B`L*brak#o8VRx3KjVG8-PNMxJW2e(K9!K09$#P9ww4j1$2Q2 z2!*oQLnu_WorFTYwv|w*O&gj}KHdcS>N`+&@Jjg0cL%Z33l(vS$PjddP^hMF5egOf z3ZYQ7UucqUBcae^T0w|b3UrgcyACMSh>d`THG-Fj40Z6QO-N4@iuAHM?oz6EUJ_Y} z__RLPpvKf_96+_I5uKA?VWAjS=F47SuZ)X>h5nstYz?NpqqXyD#Atl&t7`U$X>nCw z9V9#RduY}1Wzp%U$atMkI7gY}D6NyxEFJbDw3Rd5Rp@+-1p{J^F5n>2pd7fC>Y&?e z+BE4V;yYC*sMfwLvU@m|>I~OXogarmoIG%vY_4mU40SU9qP~1tbZzq&So`-f!uFea zN_BrlbnfVwu7h$%D`zBkz2B>8uL$c-SQ``Q1Q@LI5?j7Gv~mZvi8k2KLkKu&EFTt4 zPT1!fOVb~B!I&AcIHQidA~HI|1fTR8=JV>)*s!?0qHhb(MA#qiP`ImPV#4_s-qPkI z{03%Y=uqZIYTI5|*Bb-LXT zyej+&=Y^lv&$&~n_2Bc>YR#)6=?>i{2?Knx@mWzl#SX4{mOUiQPthEE39dP0mcl%u zAEdAs&A01NlR5azJqSB<>dRL}s)TR8CWhqHaVG*DK|^k&hp{DYOSm0Ci-X>C44D@U zl5LpL($_@tSl49U1gz@}oaA=f%qAn^2ThiEVwQ9Bl*yJxjAHxo%+J0iI^XBE9W_Fu z&|qkgXs}xs3#^FafDyMmoI!Yj4aS zy#^zpVQqFyul`7rp$xLokMDCH^Ui&ukHzlrj1D4%yIDA-bi<-p5A_YGg3YKRf)@bff$)FmEG{Sb1r{uxMMgi$!hV1&I%u=RksTg`!G_6_2v}FdLopYs z=YE5Gal9wziWGD?o31k@N}quC%1U!sz&RC7p05+&CfzKo=214e2&)jbo~?0=FFF&u z<{(YO;o~I2f}U4wMnj^}d?hUiN8rISj3?w8uyoB->L@7W2L9z8G+?R6g==FIU9bd} z&C(1X`TKLUf>t+?3$6mf@a9OPAxv_KF$Ot^JInEQ1=|D3hIv8o(^B)V*fpVTSxtn^ z>S}f4b&=Y_wV$cF>=(&$$xfBCUt|mjOM=r@ah|15wB4zN9EE!5@(nE>%+J-@{n!%z zT=-#&TZ?mltGRXuUW*E0fHN*Mc^QS#k4A(4+}T0SxdXPU*;jb2g7>`?O5U^pqu|c8 z;MuKAYv~x*bcPU44C_2&=lbK3&d(QUw!B!a`Wz75VeT`Hch-;s$=oR?-ipP$pn74& z)3mi6J$DZF+@Lq3-@rCY_&{|n&O+)TuBS9`OCK)A#wCLeNJG!KqY9qA3Ng+ASk4gl z^K~MJE!r@FzV8*?#N!+Fs{VlJF|J;i=fE7UP(}YysDeq1Mp5I8Hs?wDY!dqxR{9OT zKI4ka8RqJqH^g22(6LlE&_wLlv73Dk1ofZK1_n}HxknIET^)Zzw7u13DBh6Cy1Bz+ zECe1HBf|F0=UqdQ5;)F=_|nmt0L;TG^-a;Ig=<|@-TkKM9OU!DUa0$A*atL(>J3&5 zPsa*0TcPcwdNKkp>a@jFj3^96rem!fpgE@cAuQaqj6I92$S!*4E+$<#{`bM82TZydIBe14E+#UT{y;*8H2rP2gZh6aqNmmt@-&I z~+lmLi%ODvuoHNqb9jHj`n6IWkx?brTuP8)d-hx;38) zd`8WgM^6B{$Gl#&!swh?VR++YiMD8&ZtLtrS|k?IT#vvAIo|&WbdfiCV%4Ft|1+#T zOOJ|nGxP#0ynht3RQ3}c>N(;aSNMzOCwupjl2c)Xt3-#mGidf37RRYP~L)w?KwsyEjqM>2jBfvcqjyC0< z4tdZY!g$9WPHZ>z56$sSnKMpH3_K!BOalA5;tB>i9U_>oSoCORd825_ZwF+KY zpr*;VG|x87x5ZozI5&T<8Q7a~WFYN7bL2sDf@O0H4;`A5qy3Npk&lh5jM*8y1`fF; zw{FMrB^xy=cZHkujfrwU>7F?|SOsL{oK z=W7>*@2F283>0{S_6M-_0__xYf&CRWknzdR5CdJwUichvPwx)0bB%z^U61wDL2R98 zSa+ga-mzKF{9B-CYmU9qDcW2w)9|=(-8A>J;9ETL=bVq}WAM$TCWn~72v4#bzE-)% z#egVXyAA50<6^v3Q-yvdx22F_@WpW(fn6gU(?mGQ-o8TB9~apJ4zuh?c7e}pr>?)( zPPc9tn@+>c^=jh#qDye^b)<{(l1O&Jc1FFa z@=8Li@r2(_$lyK(`V#~U^DcQqjK$t2A4Dg)=3Di^A4H$1ecz&j*VXDjh?J>KZ$jV&3EZZOv-dj1 zYF`^vXKfF7bdb;75RbaJCcWK!MXa#p=NXMY}}7?ChE;cG5^n=ZD)5s5wV+CPdx z{oU@uR5aO6G7h!{j*v~NV%d`#VcQVfv0s??Jw@o+a+sZD1^nmT$CCoW&E zQs12vE9IUl^~j$vR5nzpU;PQ?U0tb8{z=SiyAN^)Ox4D~(BM$&XRoVL6F(9ieZZ(W zABj8Up(?et6;9C{`AD>H`$O}=FG&?Vh2q+t5+gEx)G#ooXB%HW*ystG5MFpn6#a9Q zzK_Lxyth@|)5LH2{u)({PJ<9&m60hr7Vocl96`T-SdX?KO22>j&1sP(H;Z+vm$$>~ ziJPZI`?wm1IsJxxPFZI}dd30J>$jCW|Jf29dQnGsVjO^Zy>`|aF+n6b7BH-cG#_M; zYlySLkInaRdAx>xX~IFPAgv1$aEs@Yu=K zyrH)JP1MQyCu<-1LcA(lY~W0&s?^9UB3st2REw`bGOVdm)mI!z@WB<4pY=2|)i>7H ztpvF=b%YO5Jo(4z6EXr6u8b)7O3aKqpgDzgS)tzlN~CsRx3|&Vt~(maH@o-&_1@RQ zuex8wsq9D8l&d0De6JP)lBXY4)d2fHs#W4B`w+~Icwt^vtYWp=Y zxb44_#HTwFSNKrtfNZ{WO-v1!)rHr^T;~bBRHaT{hba10m1^@H1Uh8&nD0cTghbx| zo!BO?RHkZ;g`eVO$;JM$6+X(OZ9#w*m3ow?5EvoSE;vMm<8gx?> z!P{~Zk=`3-PqNAmoI&^C;A1T4hVw4)OO%Stp;CD&8+9h2v}2`Q*J3 z9MykqAv0zD>e}|v@&OUQLOCGlM;RJ@H|*Rc`nM z;vaLuxiFbF2oHACTBe_q>XDPg4f6~JNmjW<+!7~KbL-Zk>zw0b(6YJFA7O5#X3dcb zJwC!YuS3S?2D^hqCa~iWp{)dURCz6BlKOR=oCL1>dz{=V9#hY@ltal0yW^#vwe>99 zGG0z;3Dui7qQMviCik-VA0aypvgB|wY2jNje4?kX4|q&XY9+Ns;O1S6yzdh@_H?ba z93^(u-fGGZMAUW)i>)dlK~9g_>x3UnkbPzK7FC@f=gZw&RHsDQGpQO{1|_F`^X5%s zzCPB9#)0aAM42nApH*8EWrwJX5UMz!`9`8lY3qa`46ti$*~h54e5WoY%BrOQtI%Va z_O6Za4hsA8U%-FOXYNr?wv}Cb?0Xtu54&m|yseOX8{oer%{@4OU_)UBD{;0ozgHi% z#Rar4s_E_IFf?aVJ2_d%V^8Y&#G(+QRPT>bDJa#Y27CHEAwRr>e5vh56y-cqe%7a< zhG&vwRR`yp+SSDCV^}fxLMiS^H9uM6l-((jqFzdtY5$x8lipFzB74b?H>9RsSks&iaTUdZiVFDC=arV0F*;bjScfYrOUu3Z{IUf) z4rxnE27qdMerZKzWl?cJ2mXkPMWG_^z>kLi7JPR5Yw+XXzv#ki;Is8lz-PsmxcG(e zV*&4AdSmdh3_K7hKOC9eaN2>|bWM}osG#M+W#Hio( zkiVA4@f}}J*9;MbbLLKsFTX6X?~M6k;}I1+GYyx;hD zHL|y~L-lNd=9C041S~;{0qPxQGTd^t<4Ck0h5Ql3e^B6k4^!b@Gm1{;qZ*& z;k_$|_bwX__)sg;0EzKC_&)fDUH_=-zw7!Qo%Ul3s9NyYAI>EJs zd&2zxbBmF#0B$neNVvXmiE!7D=Vx#qz`X(Y0^Dl22jS+xJ)BH#wO1<#%fT&Z^f+!sPqn+J^sCPX%m0vzI;fm?DerXD;6 zaH4TrV?-e$!dtWmFqzy-uncf`1s(@X=3C!UwHYdBW)ACQ8ux_JZw5ZRf|NT>eroej zOj};Q>yXBB^0_orE|Y^&oS6syo*YbLl}YOT9NAu8O;HzeWNt!6s;Ordb`B+0Mr!Tw zVZcYt1|nLjoHW_7by0CyX?bOZ!!wJzsHG$1Sb40AIzr#HRGX2=d61?0kCY>l@3BlH z8#yiN;%Io$s42S+=^h&?$H(pkKF5JikCZ>jj7~ERJB)rrh~7y*Jp`-!M?sHXo~D-4 z-=3y+j*?liCy<`Q6Y$wls7Fh`f;Ev5GQ+QI8*qVN<=HY>F88aS+w!5Tn|@Q*=eDAS zMFjzC=3?uiKzZpB{7=zMP*Ien39S0oe+v(}*?p)cqTP5Hm z4V#99ul2aX(gh_2hQU$CzfI|CL$1u~ybrY90N+uvFmGN_fi*j@$f~F;$1odeoljS1 zb7f|3M22ZlfwACIsCu-yc@=>ngF@s+Ht?*+?SYa&c~QO{3} zhEK8k1*&ur?gHGO;m*O;!PR%Ky);%%^<@pt>erXbbU~o+f|5W*eqLEXbKuoX)0l}2 zy27=?o6ip+3D5c*@pv^;tsO6a68ly!hbaJmHeOD>FD$R((gKH(uYrb|9t9D{vIqYh zVJcf5ycA(7Xt@gt3j^gA^zFh0^X3^wRd3A4C<$b-}xAr!TX-ISuj+uM# zY1Q^FIWXSp1JR5r=_AxVO_dCkX_%n+MNr&{fx0DX^+1U2Cnm`@tpX+ar3FsYjop3J zS9i&w!QDttL95_67kV%iJu3{ZMHp|ELU_XLH;?{XgvrPr+<-6zcQ{PO^x*Fi9zsDI z9+4JCkciQm)eL6)J^Hr5hr@Br=n048;{lT+z4R?LzHMVf>retUa-#Gn&**C!K!*}| zQw4hNXA@;s!X_7A1D^%`rmxyR5xXZR`l>G`%JvD-{Tvn!!*`e@pOX3gYF~igA{afu zG!FMSjVictaM5swk!aj4a6{k*!wrHP2nX8fD1>7=0&WIe9$a`FS$RfjNx&*Cv^Hlu z1)#e=KA+TzI-7_3If}Zl9kbd&(QPs>J&tczX|3Irqz% z!No&OJ*htcKNaaZpdb!@7@{dHpIby(sPkgJbaUX`RilpgI%O{6?*#dz3i5f=@-fVe zVz`!Y$X+WJlS_*#N=wE>uo$&xnoLwF(`DdvWhK$TQc;;ekm^dBK1h-UenIXTGJ93rElVkJV%*7%D+3bJ(jdli%=j)A(xq$*JuhQz?y|>lF#rK5IC774)ah=%V)hE=5nexuybdXTI zE`rZu9*0j>e8x>W1L1!}a{x4Cd+HHh5p{^;m}XHPORqxsNw}xrEdKp0ws&lAcvhB* z&X*nIN$hq0YL%5QyT~!OsY&_ro33MS!%7fnE*T=>hm)=WycX_hHK#y!PgpX>A*}>I zbVl@&G3tL8$SiqijQXHJ=EhzHo=uDztGWba``GNUjtT&HWI$%dP66B=_>!@zA|S^m ztO87hbsPL%@VDoxqXAhJ_5A9$jJSa+uMj*|Rw!Gjg@rN++xu!wq3n}z;dWW zc3`x6uTW+tXN+?ckpb}8)*tugl|VPtB6gMapdxRj^pLZ_=sj)N{qMdy}a3wI3GC+kGVOGGF== R9|oW0!R5fUgZsiZ{|nX)waEYg delta 57182 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

PF7U|ohT%Qt&*Vc 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 From c7c5ba271123f4a9e228be0762e03ec30d2ab580 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 7 Dec 2022 14:43:33 +0100 Subject: [PATCH 0050/2372] Test panic and unreachable --- packages/vm/src/calls.rs | 46 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 63b90922ff..32c7eff3eb 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -646,6 +646,52 @@ mod tests { assert!(matches!(err, VmError::GasDepletion {})); } + #[test] + fn call_execute_handles_panic() { + let mut instance = mock_instance(CYBERPUNK, &[]); + + let info = mock_info("creator", &[]); + call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, br#"{}"#) + .unwrap() + .unwrap(); + + // execute + let info = mock_info("troll", &[]); + let msg = br#"{"panic":{}}"#; + let err = + call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap_err(); + match err { + VmError::RuntimeErr { msg } => { + assert!(msg.contains( + "RuntimeError: Aborted: panicked at 'This page intentionally faulted'" + )) + } + err => panic!("Unexpected error: {:?}", err), + } + } + + #[test] + fn call_execute_handles_unreachable() { + let mut instance = mock_instance(CYBERPUNK, &[]); + + let info = mock_info("creator", &[]); + call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, br#"{}"#) + .unwrap() + .unwrap(); + + // execute + let info = mock_info("troll", &[]); + let msg = br#"{"unreachable":{}}"#; + let err = + call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap_err(); + match err { + VmError::RuntimeErr { msg } => { + assert!(msg.contains("RuntimeError: unreachable")) + } + err => panic!("Unexpected error: {:?}", err), + } + } + #[test] fn call_migrate_works() { let mut instance = mock_instance(CONTRACT, &[]); From 364778f2ed7ffb647b6f6b27e5e929ea7584511f Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 8 Dec 2022 14:58:35 +0100 Subject: [PATCH 0051/2372] Contracts: Move all schema.rs from examples to src/bin --- contracts/burner/.cargo/config | 6 +++--- contracts/burner/{examples => src/bin}/schema.rs | 0 contracts/crypto-verify/.cargo/config | 6 +++--- contracts/crypto-verify/{examples => src/bin}/schema.rs | 0 contracts/cyberpunk/.cargo/config | 6 +++--- contracts/cyberpunk/{examples => src/bin}/schema.rs | 0 contracts/floaty/.cargo/config | 6 +++--- contracts/floaty/{examples => src/bin}/schema.rs | 0 contracts/hackatom/.cargo/config | 6 +++--- contracts/hackatom/{examples => src/bin}/schema.rs | 0 contracts/ibc-reflect-send/.cargo/config | 6 +++--- contracts/ibc-reflect-send/{examples => src/bin}/schema.rs | 0 contracts/ibc-reflect/.cargo/config | 6 +++--- contracts/ibc-reflect/{examples => src/bin}/schema.rs | 0 contracts/queue/.cargo/config | 6 +++--- contracts/queue/{examples => src/bin}/schema.rs | 0 contracts/reflect/.cargo/config | 6 +++--- contracts/reflect/{examples => src/bin}/schema.rs | 0 contracts/staking/.cargo/config | 6 +++--- contracts/staking/{examples => src/bin}/schema.rs | 0 20 files changed, 30 insertions(+), 30 deletions(-) rename contracts/burner/{examples => src/bin}/schema.rs (100%) rename contracts/crypto-verify/{examples => src/bin}/schema.rs (100%) rename contracts/cyberpunk/{examples => src/bin}/schema.rs (100%) rename contracts/floaty/{examples => src/bin}/schema.rs (100%) rename contracts/hackatom/{examples => src/bin}/schema.rs (100%) rename contracts/ibc-reflect-send/{examples => src/bin}/schema.rs (100%) rename contracts/ibc-reflect/{examples => src/bin}/schema.rs (100%) rename contracts/queue/{examples => src/bin}/schema.rs (100%) rename contracts/reflect/{examples => src/bin}/schema.rs (100%) rename contracts/staking/{examples => src/bin}/schema.rs (100%) diff --git a/contracts/burner/.cargo/config b/contracts/burner/.cargo/config index 8d4bc738b1..f5174787c2 100644 --- a/contracts/burner/.cargo/config +++ b/contracts/burner/.cargo/config @@ -1,6 +1,6 @@ [alias] -wasm = "build --release --target wasm32-unknown-unknown" -wasm-debug = "build --target wasm32-unknown-unknown" +wasm = "build --release --lib --target wasm32-unknown-unknown" +wasm-debug = "build --lib --target wasm32-unknown-unknown" unit-test = "test --lib" integration-test = "test --test integration" -schema = "run --example schema" +schema = "run --bin schema" diff --git a/contracts/burner/examples/schema.rs b/contracts/burner/src/bin/schema.rs similarity index 100% rename from contracts/burner/examples/schema.rs rename to contracts/burner/src/bin/schema.rs diff --git a/contracts/crypto-verify/.cargo/config b/contracts/crypto-verify/.cargo/config index 8d4bc738b1..f5174787c2 100644 --- a/contracts/crypto-verify/.cargo/config +++ b/contracts/crypto-verify/.cargo/config @@ -1,6 +1,6 @@ [alias] -wasm = "build --release --target wasm32-unknown-unknown" -wasm-debug = "build --target wasm32-unknown-unknown" +wasm = "build --release --lib --target wasm32-unknown-unknown" +wasm-debug = "build --lib --target wasm32-unknown-unknown" unit-test = "test --lib" integration-test = "test --test integration" -schema = "run --example schema" +schema = "run --bin schema" diff --git a/contracts/crypto-verify/examples/schema.rs b/contracts/crypto-verify/src/bin/schema.rs similarity index 100% rename from contracts/crypto-verify/examples/schema.rs rename to contracts/crypto-verify/src/bin/schema.rs diff --git a/contracts/cyberpunk/.cargo/config b/contracts/cyberpunk/.cargo/config index 8d4bc738b1..f5174787c2 100644 --- a/contracts/cyberpunk/.cargo/config +++ b/contracts/cyberpunk/.cargo/config @@ -1,6 +1,6 @@ [alias] -wasm = "build --release --target wasm32-unknown-unknown" -wasm-debug = "build --target wasm32-unknown-unknown" +wasm = "build --release --lib --target wasm32-unknown-unknown" +wasm-debug = "build --lib --target wasm32-unknown-unknown" unit-test = "test --lib" integration-test = "test --test integration" -schema = "run --example schema" +schema = "run --bin schema" diff --git a/contracts/cyberpunk/examples/schema.rs b/contracts/cyberpunk/src/bin/schema.rs similarity index 100% rename from contracts/cyberpunk/examples/schema.rs rename to contracts/cyberpunk/src/bin/schema.rs diff --git a/contracts/floaty/.cargo/config b/contracts/floaty/.cargo/config index 8d4bc738b1..f5174787c2 100644 --- a/contracts/floaty/.cargo/config +++ b/contracts/floaty/.cargo/config @@ -1,6 +1,6 @@ [alias] -wasm = "build --release --target wasm32-unknown-unknown" -wasm-debug = "build --target wasm32-unknown-unknown" +wasm = "build --release --lib --target wasm32-unknown-unknown" +wasm-debug = "build --lib --target wasm32-unknown-unknown" unit-test = "test --lib" integration-test = "test --test integration" -schema = "run --example schema" +schema = "run --bin schema" diff --git a/contracts/floaty/examples/schema.rs b/contracts/floaty/src/bin/schema.rs similarity index 100% rename from contracts/floaty/examples/schema.rs rename to contracts/floaty/src/bin/schema.rs diff --git a/contracts/hackatom/.cargo/config b/contracts/hackatom/.cargo/config index 8d4bc738b1..f5174787c2 100644 --- a/contracts/hackatom/.cargo/config +++ b/contracts/hackatom/.cargo/config @@ -1,6 +1,6 @@ [alias] -wasm = "build --release --target wasm32-unknown-unknown" -wasm-debug = "build --target wasm32-unknown-unknown" +wasm = "build --release --lib --target wasm32-unknown-unknown" +wasm-debug = "build --lib --target wasm32-unknown-unknown" unit-test = "test --lib" integration-test = "test --test integration" -schema = "run --example schema" +schema = "run --bin schema" diff --git a/contracts/hackatom/examples/schema.rs b/contracts/hackatom/src/bin/schema.rs similarity index 100% rename from contracts/hackatom/examples/schema.rs rename to contracts/hackatom/src/bin/schema.rs diff --git a/contracts/ibc-reflect-send/.cargo/config b/contracts/ibc-reflect-send/.cargo/config index 8d4bc738b1..f5174787c2 100644 --- a/contracts/ibc-reflect-send/.cargo/config +++ b/contracts/ibc-reflect-send/.cargo/config @@ -1,6 +1,6 @@ [alias] -wasm = "build --release --target wasm32-unknown-unknown" -wasm-debug = "build --target wasm32-unknown-unknown" +wasm = "build --release --lib --target wasm32-unknown-unknown" +wasm-debug = "build --lib --target wasm32-unknown-unknown" unit-test = "test --lib" integration-test = "test --test integration" -schema = "run --example schema" +schema = "run --bin schema" diff --git a/contracts/ibc-reflect-send/examples/schema.rs b/contracts/ibc-reflect-send/src/bin/schema.rs similarity index 100% rename from contracts/ibc-reflect-send/examples/schema.rs rename to contracts/ibc-reflect-send/src/bin/schema.rs diff --git a/contracts/ibc-reflect/.cargo/config b/contracts/ibc-reflect/.cargo/config index 8d4bc738b1..f5174787c2 100644 --- a/contracts/ibc-reflect/.cargo/config +++ b/contracts/ibc-reflect/.cargo/config @@ -1,6 +1,6 @@ [alias] -wasm = "build --release --target wasm32-unknown-unknown" -wasm-debug = "build --target wasm32-unknown-unknown" +wasm = "build --release --lib --target wasm32-unknown-unknown" +wasm-debug = "build --lib --target wasm32-unknown-unknown" unit-test = "test --lib" integration-test = "test --test integration" -schema = "run --example schema" +schema = "run --bin schema" diff --git a/contracts/ibc-reflect/examples/schema.rs b/contracts/ibc-reflect/src/bin/schema.rs similarity index 100% rename from contracts/ibc-reflect/examples/schema.rs rename to contracts/ibc-reflect/src/bin/schema.rs diff --git a/contracts/queue/.cargo/config b/contracts/queue/.cargo/config index 8d4bc738b1..f5174787c2 100644 --- a/contracts/queue/.cargo/config +++ b/contracts/queue/.cargo/config @@ -1,6 +1,6 @@ [alias] -wasm = "build --release --target wasm32-unknown-unknown" -wasm-debug = "build --target wasm32-unknown-unknown" +wasm = "build --release --lib --target wasm32-unknown-unknown" +wasm-debug = "build --lib --target wasm32-unknown-unknown" unit-test = "test --lib" integration-test = "test --test integration" -schema = "run --example schema" +schema = "run --bin schema" diff --git a/contracts/queue/examples/schema.rs b/contracts/queue/src/bin/schema.rs similarity index 100% rename from contracts/queue/examples/schema.rs rename to contracts/queue/src/bin/schema.rs diff --git a/contracts/reflect/.cargo/config b/contracts/reflect/.cargo/config index 8d4bc738b1..f5174787c2 100644 --- a/contracts/reflect/.cargo/config +++ b/contracts/reflect/.cargo/config @@ -1,6 +1,6 @@ [alias] -wasm = "build --release --target wasm32-unknown-unknown" -wasm-debug = "build --target wasm32-unknown-unknown" +wasm = "build --release --lib --target wasm32-unknown-unknown" +wasm-debug = "build --lib --target wasm32-unknown-unknown" unit-test = "test --lib" integration-test = "test --test integration" -schema = "run --example schema" +schema = "run --bin schema" diff --git a/contracts/reflect/examples/schema.rs b/contracts/reflect/src/bin/schema.rs similarity index 100% rename from contracts/reflect/examples/schema.rs rename to contracts/reflect/src/bin/schema.rs diff --git a/contracts/staking/.cargo/config b/contracts/staking/.cargo/config index 8d4bc738b1..f5174787c2 100644 --- a/contracts/staking/.cargo/config +++ b/contracts/staking/.cargo/config @@ -1,6 +1,6 @@ [alias] -wasm = "build --release --target wasm32-unknown-unknown" -wasm-debug = "build --target wasm32-unknown-unknown" +wasm = "build --release --lib --target wasm32-unknown-unknown" +wasm-debug = "build --lib --target wasm32-unknown-unknown" unit-test = "test --lib" integration-test = "test --test integration" -schema = "run --example schema" +schema = "run --bin schema" diff --git a/contracts/staking/examples/schema.rs b/contracts/staking/src/bin/schema.rs similarity index 100% rename from contracts/staking/examples/schema.rs rename to contracts/staking/src/bin/schema.rs From c5ee42a1a66223dfbd842ce25a20560446c2829b Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 8 Dec 2022 15:11:00 +0100 Subject: [PATCH 0052/2372] Remove poorly maintaned schema generator from cosmwasm-std --- .circleci/config.yml | 13 -- packages/std/.cargo/config | 5 +- packages/std/examples/schema.rs | 17 -- packages/std/schema/block_info.json | 43 ---- packages/std/schema/cosmos_msg.json | 303 ------------------------- packages/std/schema/query_request.json | 208 ----------------- packages/std/schema/timestamp.json | 16 -- 7 files changed, 2 insertions(+), 603 deletions(-) delete mode 100644 packages/std/examples/schema.rs delete mode 100644 packages/std/schema/block_info.json delete mode 100644 packages/std/schema/cosmos_msg.json delete mode 100644 packages/std/schema/query_request.json delete mode 100644 packages/std/schema/timestamp.json diff --git a/.circleci/config.yml b/.circleci/config.yml index 851bcd8a04..3e54ea7ac7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -329,19 +329,6 @@ jobs: name: Run unit tests (all features) working_directory: ~/project/packages/std command: cargo test --locked --features abort,iterator,staking,stargate,cosmwasm_1_1 - - run: - name: Build and run schema generator - working_directory: ~/project/packages/std - command: cargo schema --features cosmwasm_1_1 --locked - - run: - name: Ensure schemas are up-to-date - command: | - CHANGES_IN_REPO=$(git status --porcelain) - if [[ -n "$CHANGES_IN_REPO" ]]; then - echo "Repository is dirty. Showing 'git status' and 'git --no-pager diff' for debugging now:" - git status && git --no-pager diff - exit 1 - fi - save_cache: paths: - /usr/local/cargo/registry diff --git a/packages/std/.cargo/config b/packages/std/.cargo/config index 7d1a066c82..b93207d67e 100644 --- a/packages/std/.cargo/config +++ b/packages/std/.cargo/config @@ -1,5 +1,4 @@ [alias] -wasm = "build --release --target wasm32-unknown-unknown" -wasm-debug = "build --target wasm32-unknown-unknown" +wasm = "build --release --lib --target wasm32-unknown-unknown" +wasm-debug = "build --lib --target wasm32-unknown-unknown" unit-test = "test --lib" -schema = "run --example schema" diff --git a/packages/std/examples/schema.rs b/packages/std/examples/schema.rs deleted file mode 100644 index 0fe2eac963..0000000000 --- a/packages/std/examples/schema.rs +++ /dev/null @@ -1,17 +0,0 @@ -use std::env::current_dir; -use std::fs::create_dir_all; - -use cosmwasm_schema::{export_schema, export_schema_with_title, remove_schemas, schema_for}; -use cosmwasm_std::{BlockInfo, CosmosMsg, Empty, QueryRequest, Timestamp}; - -fn main() { - let mut out_dir = current_dir().unwrap(); - out_dir.push("schema"); - create_dir_all(&out_dir).unwrap(); - remove_schemas(&out_dir).unwrap(); - - export_schema(&schema_for!(BlockInfo), &out_dir); - export_schema(&schema_for!(Timestamp), &out_dir); - export_schema_with_title(&schema_for!(CosmosMsg), &out_dir, "CosmosMsg"); - export_schema_with_title(&schema_for!(QueryRequest), &out_dir, "QueryRequest"); -} diff --git a/packages/std/schema/block_info.json b/packages/std/schema/block_info.json deleted file mode 100644 index 2ddc87f0d3..0000000000 --- a/packages/std/schema/block_info.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "BlockInfo", - "type": "object", - "required": [ - "chain_id", - "height", - "time" - ], - "properties": { - "chain_id": { - "type": "string" - }, - "height": { - "description": "The height of a block is the number of blocks preceding it in the blockchain.", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "time": { - "description": "Absolute time of the block creation in seconds since the UNIX epoch (00:00:00 on 1970-01-01 UTC).\n\nThe source of this is the [BFT Time in Tendermint](https://github.com/tendermint/tendermint/blob/58dc1726/spec/consensus/bft-time.md), which has the same nanosecond precision as the `Timestamp` type.\n\n# Examples\n\nUsing chrono:\n\n``` # use cosmwasm_std::{Addr, BlockInfo, ContractInfo, Env, MessageInfo, Timestamp, TransactionInfo}; # let env = Env { # block: BlockInfo { # height: 12_345, # time: Timestamp::from_nanos(1_571_797_419_879_305_533), # chain_id: \"cosmos-testnet-14002\".to_string(), # }, # transaction: Some(TransactionInfo { index: 3 }), # contract: ContractInfo { # address: Addr::unchecked(\"contract\"), # }, # }; # extern crate chrono; use chrono::NaiveDateTime; let seconds = env.block.time.seconds(); let nsecs = env.block.time.subsec_nanos(); let dt = NaiveDateTime::from_timestamp(seconds as i64, nsecs as u32); ```\n\nCreating a simple millisecond-precision timestamp (as used in JavaScript):\n\n``` # use cosmwasm_std::{Addr, BlockInfo, ContractInfo, Env, MessageInfo, Timestamp, TransactionInfo}; # let env = Env { # block: BlockInfo { # height: 12_345, # time: Timestamp::from_nanos(1_571_797_419_879_305_533), # chain_id: \"cosmos-testnet-14002\".to_string(), # }, # transaction: Some(TransactionInfo { index: 3 }), # contract: ContractInfo { # address: Addr::unchecked(\"contract\"), # }, # }; let millis = env.block.time.nanos() / 1_000_000; ```", - "allOf": [ - { - "$ref": "#/definitions/Timestamp" - } - ] - } - }, - "definitions": { - "Timestamp": { - "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", - "allOf": [ - { - "$ref": "#/definitions/Uint64" - } - ] - }, - "Uint64": { - "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", - "type": "string" - } - } -} diff --git a/packages/std/schema/cosmos_msg.json b/packages/std/schema/cosmos_msg.json deleted file mode 100644 index 8361702ac2..0000000000 --- a/packages/std/schema/cosmos_msg.json +++ /dev/null @@ -1,303 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "CosmosMsg", - "oneOf": [ - { - "type": "object", - "required": [ - "bank" - ], - "properties": { - "bank": { - "$ref": "#/definitions/BankMsg" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "custom" - ], - "properties": { - "custom": { - "$ref": "#/definitions/Empty" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "wasm" - ], - "properties": { - "wasm": { - "$ref": "#/definitions/WasmMsg" - } - }, - "additionalProperties": false - } - ], - "definitions": { - "BankMsg": { - "description": "The message types of the bank module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto", - "oneOf": [ - { - "description": "Sends native tokens from the contract to the given address.\n\nThis is translated to a [MsgSend](https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto#L19-L28). `from_address` is automatically filled with the current contract's address.", - "type": "object", - "required": [ - "send" - ], - "properties": { - "send": { - "type": "object", - "required": [ - "amount", - "to_address" - ], - "properties": { - "amount": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } - }, - "to_address": { - "type": "string" - } - } - } - }, - "additionalProperties": false - }, - { - "description": "This will burn the given coins from the contract's account. There is no Cosmos SDK message that performs this, but it can be done by calling the bank keeper. Important if a contract controls significant token supply that must be retired.", - "type": "object", - "required": [ - "burn" - ], - "properties": { - "burn": { - "type": "object", - "required": [ - "amount" - ], - "properties": { - "amount": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } - } - } - } - }, - "additionalProperties": false - } - ] - }, - "Binary": { - "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", - "type": "string" - }, - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "Empty": { - "description": "An empty struct that serves as a placeholder in different places, such as contracts that don't set a custom message.\n\nIt is designed to be expressable in correct JSON and JSON Schema but contains no meaningful data. Previously we used enums without cases, but those cannot represented as valid JSON Schema (https://github.com/CosmWasm/cosmwasm/issues/451)", - "type": "object" - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - }, - "WasmMsg": { - "description": "The message types of the wasm module.\n\nSee https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto", - "oneOf": [ - { - "description": "Dispatches a call to another contract at a known address (with known ABI).\n\nThis is translated to a [MsgExecuteContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L68-L78). `sender` is automatically filled with the current contract's address.", - "type": "object", - "required": [ - "execute" - ], - "properties": { - "execute": { - "type": "object", - "required": [ - "contract_addr", - "funds", - "msg" - ], - "properties": { - "contract_addr": { - "type": "string" - }, - "funds": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } - }, - "msg": { - "description": "msg is the json-encoded ExecuteMsg struct (as raw Binary)", - "allOf": [ - { - "$ref": "#/definitions/Binary" - } - ] - } - } - } - }, - "additionalProperties": false - }, - { - "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.16.0-alpha1/x/wasm/internal/types/tx.proto#L47-L61). `sender` is automatically filled with the current contract's address.", - "type": "object", - "required": [ - "instantiate" - ], - "properties": { - "instantiate": { - "type": "object", - "required": [ - "code_id", - "funds", - "label", - "msg" - ], - "properties": { - "admin": { - "type": [ - "string", - "null" - ] - }, - "code_id": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "funds": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } - }, - "label": { - "description": "A human-readbale label for the contract", - "type": "string" - }, - "msg": { - "description": "msg is the JSON-encoded InstantiateMsg struct (as raw Binary)", - "allOf": [ - { - "$ref": "#/definitions/Binary" - } - ] - } - } - } - }, - "additionalProperties": false - }, - { - "description": "Migrates a given contracts to use new wasm code. Passes a MigrateMsg to allow us to customize behavior.\n\nOnly the contract admin (as defined in wasmd), if any, is able to make this call.\n\nThis is translated to a [MsgMigrateContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L86-L96). `sender` is automatically filled with the current contract's address.", - "type": "object", - "required": [ - "migrate" - ], - "properties": { - "migrate": { - "type": "object", - "required": [ - "contract_addr", - "msg", - "new_code_id" - ], - "properties": { - "contract_addr": { - "type": "string" - }, - "msg": { - "description": "msg is the json-encoded MigrateMsg struct that will be passed to the new code", - "allOf": [ - { - "$ref": "#/definitions/Binary" - } - ] - }, - "new_code_id": { - "description": "the code_id of the new logic to place in the given contract", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - } - } - } - }, - "additionalProperties": false - }, - { - "description": "Sets a new admin (for migrate) on the given contract. Fails if this contract is not currently admin of the target contract.", - "type": "object", - "required": [ - "update_admin" - ], - "properties": { - "update_admin": { - "type": "object", - "required": [ - "admin", - "contract_addr" - ], - "properties": { - "admin": { - "type": "string" - }, - "contract_addr": { - "type": "string" - } - } - } - }, - "additionalProperties": false - }, - { - "description": "Clears the admin on the given contract, so no more migration possible. Fails if this contract is not currently admin of the target contract.", - "type": "object", - "required": [ - "clear_admin" - ], - "properties": { - "clear_admin": { - "type": "object", - "required": [ - "contract_addr" - ], - "properties": { - "contract_addr": { - "type": "string" - } - } - } - }, - "additionalProperties": false - } - ] - } - } -} diff --git a/packages/std/schema/query_request.json b/packages/std/schema/query_request.json deleted file mode 100644 index 5653739422..0000000000 --- a/packages/std/schema/query_request.json +++ /dev/null @@ -1,208 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "QueryRequest", - "oneOf": [ - { - "type": "object", - "required": [ - "bank" - ], - "properties": { - "bank": { - "$ref": "#/definitions/BankQuery" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "custom" - ], - "properties": { - "custom": { - "$ref": "#/definitions/Empty" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "wasm" - ], - "properties": { - "wasm": { - "$ref": "#/definitions/WasmQuery" - } - }, - "additionalProperties": false - } - ], - "definitions": { - "BankQuery": { - "oneOf": [ - { - "description": "This calls into the native bank module for querying the total supply of one denomination. It does the same as the SupplyOf call in Cosmos SDK's RPC API. Return value is of type SupplyResponse.", - "type": "object", - "required": [ - "supply" - ], - "properties": { - "supply": { - "type": "object", - "required": [ - "denom" - ], - "properties": { - "denom": { - "type": "string" - } - } - } - }, - "additionalProperties": false - }, - { - "description": "This calls into the native bank module for one denomination Return value is BalanceResponse", - "type": "object", - "required": [ - "balance" - ], - "properties": { - "balance": { - "type": "object", - "required": [ - "address", - "denom" - ], - "properties": { - "address": { - "type": "string" - }, - "denom": { - "type": "string" - } - } - } - }, - "additionalProperties": false - }, - { - "description": "This calls into the native bank module for all denominations. Note that this may be much more expensive than Balance and should be avoided if possible. Return value is AllBalanceResponse.", - "type": "object", - "required": [ - "all_balances" - ], - "properties": { - "all_balances": { - "type": "object", - "required": [ - "address" - ], - "properties": { - "address": { - "type": "string" - } - } - } - }, - "additionalProperties": false - } - ] - }, - "Binary": { - "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", - "type": "string" - }, - "Empty": { - "description": "An empty struct that serves as a placeholder in different places, such as contracts that don't set a custom message.\n\nIt is designed to be expressable in correct JSON and JSON Schema but contains no meaningful data. Previously we used enums without cases, but those cannot represented as valid JSON Schema (https://github.com/CosmWasm/cosmwasm/issues/451)", - "type": "object" - }, - "WasmQuery": { - "oneOf": [ - { - "description": "this queries the public API of another contract at a known address (with known ABI) Return value is whatever the contract returns (caller should know), wrapped in a ContractResult that is JSON encoded.", - "type": "object", - "required": [ - "smart" - ], - "properties": { - "smart": { - "type": "object", - "required": [ - "contract_addr", - "msg" - ], - "properties": { - "contract_addr": { - "type": "string" - }, - "msg": { - "description": "msg is the json-encoded QueryMsg struct", - "allOf": [ - { - "$ref": "#/definitions/Binary" - } - ] - } - } - } - }, - "additionalProperties": false - }, - { - "description": "this queries the raw kv-store of the contract. returns the raw, unparsed data stored at that key, which may be an empty vector if not present", - "type": "object", - "required": [ - "raw" - ], - "properties": { - "raw": { - "type": "object", - "required": [ - "contract_addr", - "key" - ], - "properties": { - "contract_addr": { - "type": "string" - }, - "key": { - "description": "Key is the raw key used in the contracts Storage", - "allOf": [ - { - "$ref": "#/definitions/Binary" - } - ] - } - } - } - }, - "additionalProperties": false - }, - { - "description": "returns a ContractInfoResponse with metadata on the contract from the runtime", - "type": "object", - "required": [ - "contract_info" - ], - "properties": { - "contract_info": { - "type": "object", - "required": [ - "contract_addr" - ], - "properties": { - "contract_addr": { - "type": "string" - } - } - } - }, - "additionalProperties": false - } - ] - } - } -} diff --git a/packages/std/schema/timestamp.json b/packages/std/schema/timestamp.json deleted file mode 100644 index 6dd9971a14..0000000000 --- a/packages/std/schema/timestamp.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Timestamp", - "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", - "allOf": [ - { - "$ref": "#/definitions/Uint64" - } - ], - "definitions": { - "Uint64": { - "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", - "type": "string" - } - } -} From e2cb4be7cc73629e3bf74de86e176b01df6eb528 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 12 Dec 2022 11:59:58 +0100 Subject: [PATCH 0053/2372] Move riffle_shuffle insto its own file --- packages/std/src/testing/mock.rs | 96 +--------------------------- packages/std/src/testing/mod.rs | 4 +- packages/std/src/testing/shuffle.rs | 98 +++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+), 95 deletions(-) create mode 100644 packages/std/src/testing/shuffle.rs diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 8639d8c7b9..a8c4d2141b 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -34,6 +34,8 @@ use crate::traits::{Api, Querier, QuerierResult}; use crate::types::{BlockInfo, ContractInfo, Env, MessageInfo, TransactionInfo}; use crate::Attribute; +use super::riffle_shuffle; + pub const MOCK_CONTRACT_ADDR: &str = "cosmos2contract"; /// Creates all external requirements that can be injected for unit tests. @@ -728,68 +730,6 @@ impl StakingQuerier { } } -/// Performs a perfect shuffle (in shuffle) -/// -/// https://en.wikipedia.org/wiki/Riffle_shuffle_permutation#Perfect_shuffles -/// https://en.wikipedia.org/wiki/In_shuffle -/// -/// The number of shuffles required to restore the original order are listed in -/// https://oeis.org/A002326, e.g.: -/// -/// ```ignore -/// 2: 2 -/// 4: 4 -/// 6: 3 -/// 8: 6 -/// 10: 10 -/// 12: 12 -/// 14: 4 -/// 16: 8 -/// 18: 18 -/// 20: 6 -/// 22: 11 -/// 24: 20 -/// 26: 18 -/// 28: 28 -/// 30: 5 -/// 32: 10 -/// 34: 12 -/// 36: 36 -/// 38: 12 -/// 40: 20 -/// 42: 14 -/// 44: 12 -/// 46: 23 -/// 48: 21 -/// 50: 8 -/// 52: 52 -/// 54: 20 -/// 56: 18 -/// 58: 58 -/// 60: 60 -/// 62: 6 -/// 64: 12 -/// 66: 66 -/// 68: 22 -/// 70: 35 -/// 72: 9 -/// 74: 20 -/// ``` -pub fn riffle_shuffle(input: &[T]) -> Vec { - assert!( - input.len() % 2 == 0, - "Method only defined for even number of elements" - ); - let mid = input.len() / 2; - let (left, right) = input.split_at(mid); - let mut out = Vec::::with_capacity(input.len()); - for i in 0..mid { - out.push(right[i].clone()); - out.push(left[i].clone()); - } - out -} - pub fn digit_sum(input: &[u8]) -> usize { input.iter().fold(0, |sum, val| sum + (*val as usize)) } @@ -1569,38 +1509,6 @@ mod tests { } } - #[test] - fn riffle_shuffle_works() { - // Example from https://en.wikipedia.org/wiki/In_shuffle - let start = [0xA, 0x2, 0x3, 0x4, 0x5, 0x6]; - let round1 = riffle_shuffle(&start); - assert_eq!(round1, [0x4, 0xA, 0x5, 0x2, 0x6, 0x3]); - let round2 = riffle_shuffle(&round1); - assert_eq!(round2, [0x2, 0x4, 0x6, 0xA, 0x3, 0x5]); - let round3 = riffle_shuffle(&round2); - assert_eq!(round3, start); - - // For 14 elements, the original order is restored after 4 executions - // See https://en.wikipedia.org/wiki/In_shuffle#Mathematics and https://oeis.org/A002326 - let original = [12, 33, 76, 576, 0, 44, 1, 14, 78, 99, 871212, -7, 2, -1]; - let mut result = Vec::from(original); - for _ in 0..4 { - result = riffle_shuffle(&result); - } - assert_eq!(result, original); - - // For 24 elements, the original order is restored after 20 executions - let original = [ - 7, 4, 2, 4656, 23, 45, 23, 1, 12, 76, 576, 0, 12, 1, 14, 78, 99, 12, 1212, 444, 31, - 111, 424, 34, - ]; - let mut result = Vec::from(original); - for _ in 0..20 { - result = riffle_shuffle(&result); - } - assert_eq!(result, original); - } - #[test] fn digit_sum_works() { assert_eq!(digit_sum(&[]), 0); diff --git a/packages/std/src/testing/mod.rs b/packages/std/src/testing/mod.rs index b317d61c48..657aada5de 100644 --- a/packages/std/src/testing/mod.rs +++ b/packages/std/src/testing/mod.rs @@ -5,6 +5,7 @@ mod assertions; mod mock; +mod shuffle; pub use assertions::assert_approx_eq_impl; @@ -12,7 +13,7 @@ pub use assertions::assert_approx_eq_impl; pub use mock::StakingQuerier; pub use mock::{ digit_sum, mock_dependencies, mock_dependencies_with_balance, mock_dependencies_with_balances, - mock_env, mock_info, mock_wasmd_attr, riffle_shuffle, BankQuerier, MockApi, MockQuerier, + mock_env, mock_info, mock_wasmd_attr, BankQuerier, MockApi, MockQuerier, MockQuerierCustomHandlerResult, MockStorage, MOCK_CONTRACT_ADDR, }; #[cfg(feature = "stargate")] @@ -21,3 +22,4 @@ pub use mock::{ mock_ibc_channel_connect_ack, mock_ibc_channel_connect_confirm, mock_ibc_channel_open_init, mock_ibc_channel_open_try, mock_ibc_packet_ack, mock_ibc_packet_recv, mock_ibc_packet_timeout, }; +pub use shuffle::riffle_shuffle; diff --git a/packages/std/src/testing/shuffle.rs b/packages/std/src/testing/shuffle.rs new file mode 100644 index 0000000000..2ad949cb73 --- /dev/null +++ b/packages/std/src/testing/shuffle.rs @@ -0,0 +1,98 @@ +/// Performs a perfect shuffle (in shuffle) +/// +/// https://en.wikipedia.org/wiki/Riffle_shuffle_permutation#Perfect_shuffles +/// https://en.wikipedia.org/wiki/In_shuffle +/// +/// The number of shuffles required to restore the original order are listed in +/// https://oeis.org/A002326, e.g.: +/// +/// ```ignore +/// 2: 2 +/// 4: 4 +/// 6: 3 +/// 8: 6 +/// 10: 10 +/// 12: 12 +/// 14: 4 +/// 16: 8 +/// 18: 18 +/// 20: 6 +/// 22: 11 +/// 24: 20 +/// 26: 18 +/// 28: 28 +/// 30: 5 +/// 32: 10 +/// 34: 12 +/// 36: 36 +/// 38: 12 +/// 40: 20 +/// 42: 14 +/// 44: 12 +/// 46: 23 +/// 48: 21 +/// 50: 8 +/// 52: 52 +/// 54: 20 +/// 56: 18 +/// 58: 58 +/// 60: 60 +/// 62: 6 +/// 64: 12 +/// 66: 66 +/// 68: 22 +/// 70: 35 +/// 72: 9 +/// 74: 20 +/// ``` +pub fn riffle_shuffle(input: &[T]) -> Vec { + assert!( + input.len() % 2 == 0, + "Method only defined for even number of elements" + ); + let mid = input.len() / 2; + let (left, right) = input.split_at(mid); + let mut out = Vec::::with_capacity(input.len()); + for i in 0..mid { + out.push(right[i].clone()); + out.push(left[i].clone()); + } + out +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn riffle_shuffle_works() { + // Example from https://en.wikipedia.org/wiki/In_shuffle + let start = [0xA, 0x2, 0x3, 0x4, 0x5, 0x6]; + let round1 = riffle_shuffle(&start); + assert_eq!(round1, [0x4, 0xA, 0x5, 0x2, 0x6, 0x3]); + let round2 = riffle_shuffle(&round1); + assert_eq!(round2, [0x2, 0x4, 0x6, 0xA, 0x3, 0x5]); + let round3 = riffle_shuffle(&round2); + assert_eq!(round3, start); + + // For 14 elements, the original order is restored after 4 executions + // See https://en.wikipedia.org/wiki/In_shuffle#Mathematics and https://oeis.org/A002326 + let original = [12, 33, 76, 576, 0, 44, 1, 14, 78, 99, 871212, -7, 2, -1]; + let mut result = Vec::from(original); + for _ in 0..4 { + result = riffle_shuffle(&result); + } + assert_eq!(result, original); + + // For 24 elements, the original order is restored after 20 executions + let original = [ + 7, 4, 2, 4656, 23, 45, 23, 1, 12, 76, 576, 0, 12, 1, 14, 78, 99, 12, 1212, 444, 31, + 111, 424, 34, + ]; + let mut result = Vec::from(original); + for _ in 0..20 { + result = riffle_shuffle(&result); + } + assert_eq!(result, original); + } +} From 736aef5e6fb33b4b930f2db45405225b80ee65d2 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 12 Dec 2022 12:00:15 +0100 Subject: [PATCH 0054/2372] Improve docs and testing --- packages/std/src/testing/mock.rs | 33 ++++++++++++------- packages/std/src/testing/shuffle.rs | 49 ++++++----------------------- packages/vm/src/testing/mock.rs | 8 +++-- 3 files changed, 37 insertions(+), 53 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index a8c4d2141b..ffa4cf5a54 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -77,10 +77,15 @@ pub fn mock_dependencies_with_balances( // We can later make simplifications here if needed pub type MockStorage = MemoryStorage; -/// Length of canonical addresses created with this API. Contracts should not make any assumtions +/// Length of canonical addresses created with this API. Contracts should not make any assumptions /// what this value is. +/// +/// The mock API can only canonicalize and humanize addresses up to this length. So it must be +/// long enough to store common bech32 addresses. +/// /// The value here must be restorable with `SHUFFLES_ENCODE` + `SHUFFLES_DECODE` in-shuffles. -const CANONICAL_LENGTH: usize = 54; +/// See for a table of those values. +const CANONICAL_LENGTH: usize = 54; // n = 27 const SHUFFLES_ENCODE: usize = 18; const SHUFFLES_DECODE: usize = 2; @@ -90,7 +95,7 @@ const SHUFFLES_DECODE: usize = 2; // not really smart, but allows us to see a difference (and consistent length for canonical adddresses) #[derive(Copy, Clone)] pub struct MockApi { - /// Length of canonical addresses created with this API. Contracts should not make any assumtions + /// Length of canonical addresses created with this API. Contracts should not make any assumptions /// what this value is. canonical_length: usize, } @@ -118,14 +123,16 @@ impl Api for MockApi { fn addr_canonicalize(&self, input: &str) -> StdResult { // Dummy input validation. This is more sophisticated for formats like bech32, where format and checksum are validated. - if input.len() < 3 { + let min_length = 3; + let max_length = self.canonical_length; + if input.len() < min_length { return Err(StdError::generic_err( - "Invalid input: human address too short", + format!("Invalid input: human address too short for this mock implementation (must be >= {min_length})."), )); } - if input.len() > self.canonical_length { + if input.len() > max_length { return Err(StdError::generic_err( - "Invalid input: human address too long", + format!("Invalid input: human address too long for this mock implementation (must be <= {max_length})."), )); } @@ -822,20 +829,24 @@ mod tests { } #[test] - #[should_panic(expected = "address too short")] fn addr_canonicalize_min_input_length() { let api = MockApi::default(); let human = String::from("1"); - let _ = api.addr_canonicalize(&human).unwrap(); + let err = api.addr_canonicalize(&human).unwrap_err(); + assert!(err + .to_string() + .contains("human address too short for this mock implementation (must be >= 3)")); } #[test] - #[should_panic(expected = "address too long")] fn addr_canonicalize_max_input_length() { let api = MockApi::default(); let human = String::from("some-extremely-long-address-not-supported-by-this-api-longer-than-54"); - let _ = api.addr_canonicalize(&human).unwrap(); + let err = api.addr_canonicalize(&human).unwrap_err(); + assert!(err + .to_string() + .contains("human address too long for this mock implementation (must be <= 54)")); } #[test] diff --git a/packages/std/src/testing/shuffle.rs b/packages/std/src/testing/shuffle.rs index 2ad949cb73..aa04c17ff2 100644 --- a/packages/std/src/testing/shuffle.rs +++ b/packages/std/src/testing/shuffle.rs @@ -4,46 +4,17 @@ /// https://en.wikipedia.org/wiki/In_shuffle /// /// The number of shuffles required to restore the original order are listed in -/// https://oeis.org/A002326, e.g.: +/// and , e.g.: /// -/// ```ignore -/// 2: 2 -/// 4: 4 -/// 6: 3 -/// 8: 6 -/// 10: 10 -/// 12: 12 -/// 14: 4 -/// 16: 8 -/// 18: 18 -/// 20: 6 -/// 22: 11 -/// 24: 20 -/// 26: 18 -/// 28: 28 -/// 30: 5 -/// 32: 10 -/// 34: 12 -/// 36: 36 -/// 38: 12 -/// 40: 20 -/// 42: 14 -/// 44: 12 -/// 46: 23 -/// 48: 21 -/// 50: 8 -/// 52: 52 -/// 54: 20 -/// 56: 18 -/// 58: 58 -/// 60: 60 -/// 62: 6 -/// 64: 12 -/// 66: 66 -/// 68: 22 -/// 70: 35 -/// 72: 9 -/// 74: 20 +/// ```text +/// 2 (n=1): 2 +/// 4 (n=2): 4 +/// 6 (n=3): 3 +/// 8 (n=4): 6 +/// 10 (n=5): 10 +/// 12 (n=6): 12 +/// 14 (n=7): 4 +/// 16 (n=8): 8 /// ``` pub fn riffle_shuffle(input: &[T]) -> Vec { assert!( diff --git a/packages/vm/src/testing/mock.rs b/packages/vm/src/testing/mock.rs index 131a7c43a7..53c2a42093 100644 --- a/packages/vm/src/testing/mock.rs +++ b/packages/vm/src/testing/mock.rs @@ -33,10 +33,12 @@ pub fn mock_backend_with_balances( } } -/// Length of canonical addresses created with this API. Contracts should not make any assumtions +/// Length of canonical addresses created with this API. Contracts should not make any assumptions /// what this value is. +/// /// The value here must be restorable with `SHUFFLES_ENCODE` + `SHUFFLES_DECODE` in-shuffles. -const CANONICAL_LENGTH: usize = 54; +/// See for a table of those values. +const CANONICAL_LENGTH: usize = 54; // n = 27 const SHUFFLES_ENCODE: usize = 18; const SHUFFLES_DECODE: usize = 2; @@ -46,7 +48,7 @@ const SHUFFLES_DECODE: usize = 2; /// This is not really smart, but allows us to see a difference (and consistent length for canonical adddresses). #[derive(Copy, Clone)] pub struct MockApi { - /// Length of canonical addresses created with this API. Contracts should not make any assumtions + /// Length of canonical addresses created with this API. Contracts should not make any assumptions /// what this value is. canonical_length: usize, /// When set, all calls to the API fail with BackendError::Unknown containing this message From b7cd07277ade64e073b88d680c30c848da611fa4 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 12 Dec 2022 13:02:36 +0100 Subject: [PATCH 0055/2372] Increate CANONICAL_LENGTH from 54 to 90 in MockApi --- packages/std/src/testing/mock.rs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index ffa4cf5a54..1417b93d1f 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -85,9 +85,9 @@ pub type MockStorage = MemoryStorage; /// /// The value here must be restorable with `SHUFFLES_ENCODE` + `SHUFFLES_DECODE` in-shuffles. /// See for a table of those values. -const CANONICAL_LENGTH: usize = 54; // n = 27 +const CANONICAL_LENGTH: usize = 90; // n = 45 -const SHUFFLES_ENCODE: usize = 18; +const SHUFFLES_ENCODE: usize = 10; const SHUFFLES_DECODE: usize = 2; // MockPrecompiles zero pads all human addresses to make them fit the canonical_length @@ -826,6 +826,13 @@ mod tests { let canonical = api.addr_canonicalize(&original).unwrap(); let recovered = api.addr_humanize(&canonical).unwrap(); assert_eq!(recovered, "cosmwasmchef"); + + // Long input (Juno contract address) + let original = + String::from("juno1v82su97skv6ucfqvuvswe0t5fph7pfsrtraxf0x33d8ylj5qnrysdvkc95"); + let canonical = api.addr_canonicalize(&original).unwrap(); + let recovered = api.addr_humanize(&canonical).unwrap(); + assert_eq!(recovered, original); } #[test] @@ -842,11 +849,11 @@ mod tests { fn addr_canonicalize_max_input_length() { let api = MockApi::default(); let human = - String::from("some-extremely-long-address-not-supported-by-this-api-longer-than-54"); + String::from("some-extremely-long-address-not-supported-by-this-api-longer-than-supported------------------------"); let err = api.addr_canonicalize(&human).unwrap_err(); assert!(err .to_string() - .contains("human address too long for this mock implementation (must be <= 54)")); + .contains("human address too long for this mock implementation (must be <= 90)")); } #[test] From 4792a97d92e05ea91453e361375aaa113d635413 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 12 Dec 2022 13:06:07 +0100 Subject: [PATCH 0056/2372] Improve error messages for BackendApi length restrictions --- packages/vm/src/testing/mock.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/vm/src/testing/mock.rs b/packages/vm/src/testing/mock.rs index 53c2a42093..554ecf77f2 100644 --- a/packages/vm/src/testing/mock.rs +++ b/packages/vm/src/testing/mock.rs @@ -90,18 +90,20 @@ impl BackendApi for MockApi { } // Dummy input validation. This is more sophisticated for formats like bech32, where format and checksum are validated. - if normalized.len() < 3 { + let min_length = 3; + let max_length = self.canonical_length; + if normalized.len() < min_length { return ( Err(BackendError::user_err( - "Invalid input: human address too short", + format!("Invalid input: human address too short for this mock implementation (must be >= {min_length})."), )), gas_info, ); } - if normalized.len() > self.canonical_length { + if normalized.len() > max_length { return ( Err(BackendError::user_err( - "Invalid input: human address too long", + format!("Invalid input: human address too long for this mock implementation (must be <= {max_length})."), )), gas_info, ); @@ -249,7 +251,7 @@ mod tests { let api = MockApi::default(); let human = "1"; match api.canonical_address(human).0.unwrap_err() { - BackendError::UserErr { .. } => {} + BackendError::UserErr { msg } => assert!(msg.contains("too short")), err => panic!("Unexpected error: {:?}", err), } } @@ -259,7 +261,7 @@ mod tests { let api = MockApi::default(); let human = "longer-than-the-address-length-supported-by-this-api-longer-than-54"; match api.canonical_address(human).0.unwrap_err() { - BackendError::UserErr { .. } => {} + BackendError::UserErr { msg } => assert!(msg.contains("too long")), err => panic!("Unexpected error: {:?}", err), } } From a20595157290a864be57db8a74223a51d58a91de Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 12 Dec 2022 13:19:09 +0100 Subject: [PATCH 0057/2372] Increase CANONICAL_LENGTH from 54 to 64 on backend MockApi --- packages/vm/src/imports.rs | 10 ++++++++-- packages/vm/src/testing/mock.rs | 11 +++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index d99e6b7ecc..357fbe024f 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -887,7 +887,10 @@ mod tests { let res = do_addr_validate(&env, source_ptr3).unwrap(); assert_ne!(res, 0); let err = String::from_utf8(force_read(&env, res)).unwrap(); - assert_eq!(err, "Invalid input: human address too long"); + assert_eq!( + err, + "Invalid input: human address too long for this mock implementation (must be <= 64)." + ); let res = do_addr_validate(&env, source_ptr4).unwrap(); assert_ne!(res, 0); @@ -982,7 +985,10 @@ mod tests { let res = do_addr_canonicalize(&env, source_ptr3, dest_ptr).unwrap(); assert_ne!(res, 0); let err = String::from_utf8(force_read(&env, res)).unwrap(); - assert_eq!(err, "Invalid input: human address too long"); + assert_eq!( + err, + "Invalid input: human address too long for this mock implementation (must be <= 64)." + ); } #[test] diff --git a/packages/vm/src/testing/mock.rs b/packages/vm/src/testing/mock.rs index 554ecf77f2..64bacb40cf 100644 --- a/packages/vm/src/testing/mock.rs +++ b/packages/vm/src/testing/mock.rs @@ -38,9 +38,9 @@ pub fn mock_backend_with_balances( /// /// The value here must be restorable with `SHUFFLES_ENCODE` + `SHUFFLES_DECODE` in-shuffles. /// See for a table of those values. -const CANONICAL_LENGTH: usize = 54; // n = 27 +const CANONICAL_LENGTH: usize = 64; // n = 32 -const SHUFFLES_ENCODE: usize = 18; +const SHUFFLES_ENCODE: usize = 10; const SHUFFLES_DECODE: usize = 2; /// Zero-pads all human addresses to make them fit the canonical_length and @@ -233,6 +233,13 @@ mod tests { let canonical = api.canonical_address(&original).0.unwrap(); let recovered = api.human_address(&canonical).0.unwrap(); assert_eq!(recovered, "cosmwasmchef"); + + // Long input (Juno contract address) + let original = + String::from("juno1v82su97skv6ucfqvuvswe0t5fph7pfsrtraxf0x33d8ylj5qnrysdvkc95"); + let canonical = api.canonical_address(&original).0.unwrap(); + let recovered = api.human_address(&canonical).0.unwrap(); + assert_eq!(recovered, original); } #[test] From a11e471bea3d08b0403b177c208d362a76735574 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 12 Dec 2022 13:22:10 +0100 Subject: [PATCH 0058/2372] Add CHANGELOG entry: Increase length limit for address conversion --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b2b253cc22..e6451e14d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,8 +43,11 @@ and this project adheres to QueryResponses macro ([#1516]). - cosmwasm-schema: A nested QueryMsg no longer causes runtime errors if it contains doc comments. +- cosmwasm-std/cosmwasm-vm: Increase length limit for address conversion in + `MockApi` to support addresses longer than 54 bytes ([#1529]). [#1516]: https://github.com/CosmWasm/cosmwasm/issues/1516 +[#1529]: https://github.com/CosmWasm/cosmwasm/issues/1529 ## [1.1.9] - 2022-12-06 From 87f396619aebcf0a9f858505346b5788400c9448 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 12 Dec 2022 13:34:15 +0100 Subject: [PATCH 0059/2372] Hackatom: Change error case to too long and increase value to > 90 bytes --- contracts/hackatom/src/contract.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/hackatom/src/contract.rs b/contracts/hackatom/src/contract.rs index 8365b78b55..26ffed649a 100644 --- a/contracts/hackatom/src/contract.rs +++ b/contracts/hackatom/src/contract.rs @@ -196,9 +196,9 @@ fn do_user_errors_in_api_calls(api: &dyn Api) -> Result { } } - let invalid_bech32 = - "bn9hhssomeltvhzgvuqkwjkpwxojfuigltwedayzxljucefikuieillowaticksoistqoynmgcnj219a"; - match api.addr_canonicalize(invalid_bech32).unwrap_err() { + let too_long = + "bn9hhssomeltvhzgvuqkwjkpwxojfuigltwedayzxljucefikuieillowaticksoistqoynmgcnj219aewfwefwwegwg"; + match api.addr_canonicalize(too_long).unwrap_err() { StdError::GenericErr { .. } => {} err => { return Err(StdError::generic_err(format!( From c97f6636e2e8ef1678426afd04935b33accf2332 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 12 Dec 2022 13:49:49 +0100 Subject: [PATCH 0060/2372] Sort contracts alphabetically --- .circleci/config.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 3e54ea7ac7..b969e0c321 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1142,6 +1142,13 @@ jobs: mkdir -p target/wasm32-unknown-unknown/release touch target/wasm32-unknown-unknown/release/cyberpunk.wasm cargo clippy --all-targets -- -D warnings + - run: + name: Clippy linting on floaty + working_directory: ~/project/contracts/floaty + command: | + mkdir -p target/wasm32-unknown-unknown/release + touch target/wasm32-unknown-unknown/release/floaty.wasm + cargo clippy --all-targets -- -D warnings - run: name: Clippy linting on hackatom working_directory: ~/project/contracts/hackatom @@ -1163,13 +1170,6 @@ jobs: mkdir -p target/wasm32-unknown-unknown/release touch target/wasm32-unknown-unknown/release/ibc_reflect_send.wasm cargo clippy --all-targets -- -D warnings - - run: - name: Clippy linting on floaty - working_directory: ~/project/contracts/floaty - command: | - mkdir -p target/wasm32-unknown-unknown/release - touch target/wasm32-unknown-unknown/release/floaty.wasm - cargo clippy --all-targets -- -D warnings - run: name: Clippy linting on queue working_directory: ~/project/contracts/queue From 1d7a94e15c05b23ef716c440be8a71a1d1f99c0f Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 12 Dec 2022 13:50:12 +0100 Subject: [PATCH 0061/2372] Add missing cyberpunk and floaty entries to clippy config --- .circleci/config.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b969e0c321..5172194814 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1071,7 +1071,8 @@ jobs: command: rustc --version && cargo --version - restore_cache: keys: - - cargocache-v2-clippy-rust:<< parameters.rust-version >>-{{ checksum "Cargo.lock" }}-{{ checksum "contracts/burner/Cargo.lock" }}-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/ibc-reflect/Cargo.lock" }}-{{ checksum "contracts/ibc-reflect-send/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} + - v1-clippy-rust:<< parameters.rust-version >>-{{ checksum "Cargo.lock" }}-{{ checksum "contracts/burner/Cargo.lock" }}-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/cyberpunk/Cargo.lock" }}-{{ checksum "contracts/floaty/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/ibc-reflect/Cargo.lock" }}-{{ checksum "contracts/ibc-reflect-send/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} + - v1-clippy-rust:<< parameters.rust-version >>- - run: name: Add clippy component command: rustup component add clippy @@ -1194,15 +1195,23 @@ jobs: - save_cache: paths: - /usr/local/cargo/registry + # Workspace - target/debug/.fingerprint - target/debug/build - target/debug/deps + # Contracts - contracts/burner/target/debug/.fingerprint - contracts/burner/target/debug/build - contracts/burner/target/debug/deps - contracts/crypto-verify/target/debug/.fingerprint - contracts/crypto-verify/target/debug/build - contracts/crypto-verify/target/debug/deps + - contracts/cyberpunk/target/debug/.fingerprint + - contracts/cyberpunk/target/debug/build + - contracts/cyberpunk/target/debug/deps + - contracts/floaty/target/debug/.fingerprint + - contracts/floaty/target/debug/build + - contracts/floaty/target/debug/deps - contracts/hackatom/target/debug/.fingerprint - contracts/hackatom/target/debug/build - contracts/hackatom/target/debug/deps @@ -1221,7 +1230,7 @@ jobs: - contracts/staking/target/debug/.fingerprint - contracts/staking/target/debug/build - contracts/staking/target/debug/deps - key: cargocache-v2-clippy-rust:<< parameters.rust-version >>-{{ checksum "Cargo.lock" }}-{{ checksum "contracts/burner/Cargo.lock" }}-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/ibc-reflect/Cargo.lock" }}-{{ checksum "contracts/ibc-reflect-send/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} + key: v1-clippy-rust:<< parameters.rust-version >>-{{ checksum "Cargo.lock" }}-{{ checksum "contracts/burner/Cargo.lock" }}-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/cyberpunk/Cargo.lock" }}-{{ checksum "contracts/floaty/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/ibc-reflect/Cargo.lock" }}-{{ checksum "contracts/ibc-reflect-send/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} benchmarking: docker: From 0b3db002e048dec4cb992479c2f34308a5f01b21 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 12 Dec 2022 16:04:23 +0100 Subject: [PATCH 0062/2372] Fix check_workspace.sh [skip ci] --- devtools/check_workspace.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/devtools/check_workspace.sh b/devtools/check_workspace.sh index 9609054c4c..d24813c5ed 100755 --- a/devtools/check_workspace.sh +++ b/devtools/check_workspace.sh @@ -12,7 +12,6 @@ cargo fmt cargo wasm-debug cargo wasm-debug --features iterator,staking,stargate cargo clippy --all-targets --features iterator,staking,stargate -- -D warnings - cargo schema --features cosmwasm_1_1 ) (cd packages/storage && cargo build && cargo clippy --all-targets --features iterator -- -D warnings) (cd packages/schema && cargo build && cargo clippy --all-targets -- -D warnings) From 122d1d499fee0ea595e9cf0a9971ea93f50c3edc Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 12 Dec 2022 16:32:27 +0100 Subject: [PATCH 0063/2372] Pull out check_contract CI command and check contract formatting there --- .circleci/config.yml | 316 +++++++------------------------------------ 1 file changed, 48 insertions(+), 268 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 5172194814..6e864281b3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -4,6 +4,44 @@ orbs: codecov: codecov/codecov@3.2.0 win: circleci/windows@5.0 +commands: + check_contract: + steps: + - run: + name: Add wasm32 target + command: rustup target add wasm32-unknown-unknown && rustup target list --installed + - run: + name: Add clippy and rustfmt components + command: rustup component add clippy rustfmt + - run: + name: Check formatting + command: cargo fmt -- --check + - run: + name: Unit tests + command: cargo unit-test --locked + - run: + name: Build wasm binary + command: cargo wasm --locked + # After wasm build to ensure target/wasm32-unknown-unknown/release/.wasm exists + - run: + name: Clippy + command: cargo clippy --all-targets -- -D warnings + - run: + name: Integration tests (singlepass backend) + command: cargo integration-test --locked --no-default-features + - run: + name: Build and run schema generator + command: cargo schema --locked + - run: + name: Ensure schemas are up-to-date + command: | + CHANGES_IN_REPO=$(git status --porcelain) + if [[ -n "$CHANGES_IN_REPO" ]]; then + echo "Repository is dirty. Showing 'git status' and 'git --no-pager diff' for debugging now:" + git status && git --no-pager diff + exit 1 + fi + workflows: test: # Keep those job names in sync with .mergify.yml @@ -468,30 +506,7 @@ jobs: - restore_cache: keys: - cargocache-v2-contract_burner-rust:1.59.0-{{ checksum "Cargo.lock" }} - - run: - name: Add wasm32 target - command: rustup target add wasm32-unknown-unknown && rustup target list --installed - - run: - name: Build wasm binary - command: cargo wasm --locked - - run: - name: Unit tests - command: cargo unit-test --locked - - run: - name: Integration tests (singlepass backend) - command: cargo integration-test --locked --no-default-features - - run: - name: Build and run schema generator - command: cargo schema --locked - - run: - name: Ensure schemas are up-to-date - command: | - CHANGES_IN_REPO=$(git status --porcelain) - if [[ -n "$CHANGES_IN_REPO" ]]; then - echo "Repository is dirty. Showing 'git status' and 'git --no-pager diff' for debugging now:" - git status && git --no-pager diff - exit 1 - fi + - check_contract - save_cache: paths: - /usr/local/cargo/registry @@ -518,30 +533,7 @@ jobs: - restore_cache: keys: - cargocache-v2-contract_crypto_verify-rust:1.59.0-{{ checksum "Cargo.lock" }} - - run: - name: Add wasm32 target - command: rustup target add wasm32-unknown-unknown && rustup target list --installed - - run: - name: Build wasm binary - command: cargo wasm --locked - - run: - name: Unit tests - command: cargo unit-test --locked - - run: - name: Integration tests (singlepass backend) - command: cargo integration-test --locked --no-default-features - - run: - name: Build and run schema generator - command: cargo schema --locked - - run: - name: Ensure schemas are up-to-date - command: | - CHANGES_IN_REPO=$(git status --porcelain) - if [[ -n "$CHANGES_IN_REPO" ]]; then - echo "Repository is dirty. Showing 'git status' and 'git --no-pager diff' for debugging now:" - git status && git --no-pager diff - exit 1 - fi + - check_contract - save_cache: paths: - /usr/local/cargo/registry @@ -568,30 +560,7 @@ jobs: - restore_cache: keys: - cargocache-v2-contract_cyberpunk-rust:1.59.0-{{ checksum "Cargo.lock" }} - - run: - name: Add wasm32 target - command: rustup target add wasm32-unknown-unknown && rustup target list --installed - - run: - name: Build wasm binary - command: cargo wasm --locked - - run: - name: Unit tests - command: cargo unit-test --locked - - run: - name: Integration tests (singlepass backend) - command: cargo integration-test --locked --no-default-features - - run: - name: Build and run schema generator - command: cargo schema --locked - - run: - name: Ensure schemas are up-to-date - command: | - CHANGES_IN_REPO=$(git status --porcelain) - if [[ -n "$CHANGES_IN_REPO" ]]; then - echo "Repository is dirty. Showing 'git status' and 'git --no-pager diff' for debugging now:" - git status && git --no-pager diff - exit 1 - fi + - check_contract - save_cache: paths: - /usr/local/cargo/registry @@ -618,30 +587,7 @@ jobs: - restore_cache: keys: - cargocache-v2-contract_hackatom-rust:1.59.0-{{ checksum "Cargo.lock" }} - - run: - name: Add wasm32 target - command: rustup target add wasm32-unknown-unknown && rustup target list --installed - - run: - name: Build wasm binary - command: cargo wasm --locked - - run: - name: Unit tests - command: cargo unit-test --locked - - run: - name: Integration tests - command: cargo integration-test --locked - - run: - name: Build and run schema generator - command: cargo schema --locked - - run: - name: Ensure schemas are up-to-date - command: | - CHANGES_IN_REPO=$(git status --porcelain) - if [[ -n "$CHANGES_IN_REPO" ]]; then - echo "Repository is dirty. Showing 'git status' and 'git --no-pager diff' for debugging now:" - git status && git --no-pager diff - exit 1 - fi + - check_contract - save_cache: paths: - /usr/local/cargo/registry @@ -668,30 +614,7 @@ jobs: - restore_cache: keys: - cargocache-v2-contract_ibc_reflect-rust:1.59.0-{{ checksum "Cargo.lock" }} - - run: - name: Add wasm32 target - command: rustup target add wasm32-unknown-unknown && rustup target list --installed - - run: - name: Build wasm binary - command: cargo wasm --locked - - run: - name: Unit tests - command: cargo unit-test --locked - - run: - name: Integration tests (singlepass backend) - command: cargo integration-test --locked --no-default-features - - run: - name: Build and run schema generator - command: cargo schema --locked - - run: - name: Ensure schemas are up-to-date - command: | - CHANGES_IN_REPO=$(git status --porcelain) - if [[ -n "$CHANGES_IN_REPO" ]]; then - echo "Repository is dirty. Showing 'git status' and 'git --no-pager diff' for debugging now:" - git status && git --no-pager diff - exit 1 - fi + - check_contract - save_cache: paths: - /usr/local/cargo/registry @@ -718,30 +641,7 @@ jobs: - restore_cache: keys: - cargocache-v2-contract_ibc_reflect_send-rust:1.59.0-{{ checksum "Cargo.lock" }} - - run: - name: Add wasm32 target - command: rustup target add wasm32-unknown-unknown && rustup target list --installed - - run: - name: Build wasm binary - command: cargo wasm --locked - - run: - name: Unit tests - command: cargo unit-test --locked - - run: - name: Integration tests (singlepass backend) - command: cargo integration-test --locked --no-default-features - - run: - name: Build and run schema generator - command: cargo schema --locked - - run: - name: Ensure schemas are up-to-date - command: | - CHANGES_IN_REPO=$(git status --porcelain) - if [[ -n "$CHANGES_IN_REPO" ]]; then - echo "Repository is dirty. Showing 'git status' and 'git --no-pager diff' for debugging now:" - git status && git --no-pager diff - exit 1 - fi + - check_contract - save_cache: paths: - /usr/local/cargo/registry @@ -768,30 +668,7 @@ jobs: - restore_cache: keys: - cargocache-v2-contract_floaty-rust:1.59.0-{{ checksum "Cargo.lock" }} - - run: - name: Add wasm32 target - command: rustup target add wasm32-unknown-unknown && rustup target list --installed - - run: - name: Build wasm binary - command: cargo wasm --locked - - run: - name: Unit tests - command: cargo unit-test --locked - - run: - name: Integration tests (singlepass backend) - command: cargo integration-test --locked --no-default-features - - run: - name: Build and run schema generator - command: cargo schema --locked - - run: - name: Ensure schemas are up-to-date - command: | - CHANGES_IN_REPO=$(git status --porcelain) - if [[ -n "$CHANGES_IN_REPO" ]]; then - echo "Repository is dirty. Showing 'git status' and 'git --no-pager diff' for debugging now:" - git status && git --no-pager diff - exit 1 - fi + - check_contract - save_cache: paths: - /usr/local/cargo/registry @@ -818,30 +695,7 @@ jobs: - restore_cache: keys: - cargocache-v2-contract_queue-rust:1.59.0-{{ checksum "Cargo.lock" }} - - run: - name: Add wasm32 target - command: rustup target add wasm32-unknown-unknown && rustup target list --installed - - run: - name: Build wasm binary - command: cargo wasm --locked - - run: - name: Unit tests - command: cargo unit-test --locked - - run: - name: Integration tests (singlepass backend) - command: cargo integration-test --locked --no-default-features - - run: - name: Build and run schema generator - command: cargo schema --locked - - run: - name: Ensure schemas are up-to-date - command: | - CHANGES_IN_REPO=$(git status --porcelain) - if [[ -n "$CHANGES_IN_REPO" ]]; then - echo "Repository is dirty. Showing 'git status' and 'git --no-pager diff' for debugging now:" - git status && git --no-pager diff - exit 1 - fi + - check_contract - save_cache: paths: - /usr/local/cargo/registry @@ -868,30 +722,7 @@ jobs: - restore_cache: keys: - cargocache-v2-contract_reflect-rust:1.59.0-{{ checksum "Cargo.lock" }} - - run: - name: Add wasm32 target - command: rustup target add wasm32-unknown-unknown && rustup target list --installed - - run: - name: Build wasm binary - command: cargo wasm --locked - - run: - name: Unit tests - command: cargo unit-test --locked - - run: - name: Integration tests (singlepass backend) - command: cargo integration-test --locked --no-default-features - - run: - name: Build and run schema generator - command: cargo schema --locked - - run: - name: Ensure schemas are up-to-date - command: | - CHANGES_IN_REPO=$(git status --porcelain) - if [[ -n "$CHANGES_IN_REPO" ]]; then - echo "Repository is dirty. Showing 'git status' and 'git --no-pager diff' for debugging now:" - git status && git --no-pager diff - exit 1 - fi + - check_contract - save_cache: paths: - /usr/local/cargo/registry @@ -918,30 +749,7 @@ jobs: - restore_cache: keys: - cargocache-v2-contract_staking-rust:1.59.0-{{ checksum "Cargo.lock" }} - - run: - name: Add wasm32 target - command: rustup target add wasm32-unknown-unknown && rustup target list --installed - - run: - name: Build wasm binary - command: cargo wasm --locked - - run: - name: Unit tests - command: cargo unit-test --locked - - run: - name: Integration tests (singlepass backend) - command: cargo integration-test --locked --no-default-features - - run: - name: Build and run schema generator - command: cargo schema --locked - - run: - name: Ensure schemas are up-to-date - command: | - CHANGES_IN_REPO=$(git status --porcelain) - if [[ -n "$CHANGES_IN_REPO" ]]; then - echo "Repository is dirty. Showing 'git status' and 'git --no-pager diff' for debugging now:" - git status && git --no-pager diff - exit 1 - fi + - check_contract - save_cache: paths: - /usr/local/cargo/registry @@ -970,34 +778,6 @@ jobs: - run: name: Check formatting of workspace command: cargo fmt -- --check - - run: - name: Check formatting of contract burner - working_directory: ~/project/contracts/burner - command: cargo fmt -- --check - - run: - name: Check formatting of contract crypto-verify - working_directory: ~/project/contracts/crypto-verify - command: cargo fmt -- --check - - run: - name: Check formatting of contract hackatom - working_directory: ~/project/contracts/hackatom - command: cargo fmt -- --check - - run: - name: Check formatting of contract floaty - working_directory: ~/project/contracts/floaty - command: cargo fmt -- --check - - run: - name: Check formatting of contract reflect - working_directory: ~/project/contracts/reflect - command: cargo fmt -- --check - - run: - name: Check formatting of contract queue - working_directory: ~/project/contracts/queue - command: cargo fmt -- --check - - run: - name: Check formatting of contract staking - working_directory: ~/project/contracts/staking - command: cargo fmt -- --check - save_cache: paths: - /usr/local/cargo/registry From 09484ec489c948bb4631d90ed168d384becaa5b0 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 12 Dec 2022 16:38:11 +0100 Subject: [PATCH 0064/2372] Remove contracts from clippy job --- .circleci/config.yml | 110 ++----------------------------------------- 1 file changed, 3 insertions(+), 107 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6e864281b3..f9f6afc4ea 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -851,8 +851,8 @@ jobs: command: rustc --version && cargo --version - restore_cache: keys: - - v1-clippy-rust:<< parameters.rust-version >>-{{ checksum "Cargo.lock" }}-{{ checksum "contracts/burner/Cargo.lock" }}-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/cyberpunk/Cargo.lock" }}-{{ checksum "contracts/floaty/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/ibc-reflect/Cargo.lock" }}-{{ checksum "contracts/ibc-reflect-send/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} - - v1-clippy-rust:<< parameters.rust-version >>- + - v2-clippy-rust:<< parameters.rust-version >>-{{ checksum "Cargo.lock" }} + - v2-clippy-rust:<< parameters.rust-version >>- - run: name: Add clippy component command: rustup component add clippy @@ -899,79 +899,6 @@ jobs: name: Clippy linting on vm (all feature flags) working_directory: ~/project/packages/vm command: cargo clippy --all-targets --features iterator,staking,stargate -- -D warnings - # - # Contracts - # - - run: - name: Clippy linting on burner - working_directory: ~/project/contracts/burner - command: | - mkdir -p target/wasm32-unknown-unknown/release - touch target/wasm32-unknown-unknown/release/burner.wasm - cargo clippy --all-targets -- -D warnings - - run: - name: Clippy linting on crypto-verify - working_directory: ~/project/contracts/crypto-verify - command: | - mkdir -p target/wasm32-unknown-unknown/release - touch target/wasm32-unknown-unknown/release/crypto_verify.wasm - cargo clippy --all-targets -- -D warnings - - run: - name: Clippy linting on cyberpunk - working_directory: ~/project/contracts/cyberpunk - command: | - mkdir -p target/wasm32-unknown-unknown/release - touch target/wasm32-unknown-unknown/release/cyberpunk.wasm - cargo clippy --all-targets -- -D warnings - - run: - name: Clippy linting on floaty - working_directory: ~/project/contracts/floaty - command: | - mkdir -p target/wasm32-unknown-unknown/release - touch target/wasm32-unknown-unknown/release/floaty.wasm - cargo clippy --all-targets -- -D warnings - - run: - name: Clippy linting on hackatom - working_directory: ~/project/contracts/hackatom - command: | - mkdir -p target/wasm32-unknown-unknown/release - touch target/wasm32-unknown-unknown/release/hackatom.wasm - cargo clippy --all-targets -- -D warnings - - run: - name: Clippy linting on ibc-reflect - working_directory: ~/project/contracts/ibc-reflect - command: | - mkdir -p target/wasm32-unknown-unknown/release - touch target/wasm32-unknown-unknown/release/ibc_reflect.wasm - cargo clippy --all-targets -- -D warnings - - run: - name: Clippy linting on ibc-reflect-send - working_directory: ~/project/contracts/ibc-reflect-send - command: | - mkdir -p target/wasm32-unknown-unknown/release - touch target/wasm32-unknown-unknown/release/ibc_reflect_send.wasm - cargo clippy --all-targets -- -D warnings - - run: - name: Clippy linting on queue - working_directory: ~/project/contracts/queue - command: | - mkdir -p target/wasm32-unknown-unknown/release - touch target/wasm32-unknown-unknown/release/queue.wasm - cargo clippy --all-targets -- -D warnings - - run: - name: Clippy linting on reflect - working_directory: ~/project/contracts/reflect - command: | - mkdir -p target/wasm32-unknown-unknown/release - touch target/wasm32-unknown-unknown/release/reflect.wasm - cargo clippy --all-targets -- -D warnings - - run: - name: Clippy linting on staking - working_directory: ~/project/contracts/staking - command: | - mkdir -p target/wasm32-unknown-unknown/release - touch target/wasm32-unknown-unknown/release/staking.wasm - cargo clippy --all-targets -- -D warnings - save_cache: paths: - /usr/local/cargo/registry @@ -979,38 +906,7 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - # Contracts - - contracts/burner/target/debug/.fingerprint - - contracts/burner/target/debug/build - - contracts/burner/target/debug/deps - - contracts/crypto-verify/target/debug/.fingerprint - - contracts/crypto-verify/target/debug/build - - contracts/crypto-verify/target/debug/deps - - contracts/cyberpunk/target/debug/.fingerprint - - contracts/cyberpunk/target/debug/build - - contracts/cyberpunk/target/debug/deps - - contracts/floaty/target/debug/.fingerprint - - contracts/floaty/target/debug/build - - contracts/floaty/target/debug/deps - - contracts/hackatom/target/debug/.fingerprint - - contracts/hackatom/target/debug/build - - contracts/hackatom/target/debug/deps - - contracts/ibc-reflect/target/debug/.fingerprint - - contracts/ibc-reflect/target/debug/build - - contracts/ibc-reflect/target/debug/deps - - contracts/ibc-reflect-send/target/debug/.fingerprint - - contracts/ibc-reflect-send/target/debug/build - - contracts/ibc-reflect-send/target/debug/deps - - contracts/queue/target/debug/.fingerprint - - contracts/queue/target/debug/build - - contracts/queue/target/debug/deps - - contracts/reflect/target/debug/.fingerprint - - contracts/reflect/target/debug/build - - contracts/reflect/target/debug/deps - - contracts/staking/target/debug/.fingerprint - - contracts/staking/target/debug/build - - contracts/staking/target/debug/deps - key: v1-clippy-rust:<< parameters.rust-version >>-{{ checksum "Cargo.lock" }}-{{ checksum "contracts/burner/Cargo.lock" }}-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/cyberpunk/Cargo.lock" }}-{{ checksum "contracts/floaty/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/ibc-reflect/Cargo.lock" }}-{{ checksum "contracts/ibc-reflect-send/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} + key: v2-clippy-rust:<< parameters.rust-version >>-{{ checksum "Cargo.lock" }} benchmarking: docker: From 49ff9fb098f8915b14ba8044b2321423daf128c5 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 12 Dec 2022 16:39:43 +0100 Subject: [PATCH 0065/2372] Bump min Rust to 1.60.0 --- .circleci/config.yml | 138 +++++++++++++++++++-------------------- .github/workflows/ci.yml | 2 +- 2 files changed, 70 insertions(+), 70 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f9f6afc4ea..01000ce3ac 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -71,7 +71,7 @@ workflows: matrix: parameters: # Run with MSRV and some modern stable Rust - rust-version: ["1.59.0", "1.65.0"] + rust-version: ["1.60.0", "1.65.0"] - benchmarking: requires: - package_vm @@ -123,7 +123,7 @@ jobs: command: | wget https://static.rust-lang.org/rustup/dist/aarch64-unknown-linux-gnu/rustup-init chmod +x rustup-init - ./rustup-init -y --default-toolchain 1.59.0 --profile minimal + ./rustup-init -y --default-toolchain 1.60.0 --profile minimal - run: name: Version information command: rustc --version; cargo --version; rustup --version; rustup target list --installed @@ -132,12 +132,12 @@ jobs: command: rustup target add wasm32-unknown-unknown && rustup target list --installed - restore_cache: keys: - - v4-arm64-workspace-rust:1.59.0-{{ checksum "Cargo.lock" }} - - v4-arm64-workspace-rust:1.59.0- + - v4-arm64-workspace-rust:1.60.0-{{ checksum "Cargo.lock" }} + - v4-arm64-workspace-rust:1.60.0- - restore_cache: keys: - - v4-arm64-contracts-rust:1.59.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} - - v4-arm64-contracts-rust:1.59.0- + - v4-arm64-contracts-rust:1.60.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} + - v4-arm64-contracts-rust:1.60.0- - run: name: "contracts/crypto-verify: integration-test" working_directory: ~/project/contracts/crypto-verify @@ -172,14 +172,14 @@ jobs: # use all features command: cargo test --locked --features iterator,staking,stargate - save_cache: - key: v4-arm64-workspace-rust:1.59.0-{{ checksum "Cargo.lock" }} + key: v4-arm64-workspace-rust:1.60.0-{{ checksum "Cargo.lock" }} paths: - ~/.cargo/registry - target/debug/.fingerprint - target/debug/build - target/debug/deps - save_cache: - key: v4-arm64-contracts-rust:1.59.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} + key: v4-arm64-contracts-rust:1.60.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} paths: - ~/.cargo/registry # crypto-verify @@ -220,7 +220,7 @@ jobs: package_crypto: docker: - - image: rust:1.59.0 + - image: rust:1.60.0 steps: - checkout - run: @@ -228,7 +228,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_crypto-rust:1.59.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_crypto-rust:1.60.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/crypto @@ -243,11 +243,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_crypto-rust:1.59.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_crypto-rust:1.60.0-{{ checksum "Cargo.lock" }} package_check: docker: - - image: rust:1.59.0 + - image: rust:1.60.0 steps: - checkout - run: @@ -255,7 +255,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_check-rust:1.59.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_check-rust:1.60.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/check @@ -270,11 +270,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_check-rust:1.59.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_check-rust:1.60.0-{{ checksum "Cargo.lock" }} package_schema: docker: - - image: rust:1.59.0 + - image: rust:1.60.0 steps: - checkout - run: @@ -282,7 +282,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_schema-rust:1.59.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_schema-rust:1.60.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/schema @@ -297,11 +297,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_schema-rust:1.59.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_schema-rust:1.60.0-{{ checksum "Cargo.lock" }} package_schema_derive: docker: - - image: rust:1.59.0 + - image: rust:1.60.0 steps: - checkout - run: @@ -309,7 +309,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_schema_derive-rust:1.59.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_schema_derive-rust:1.60.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/schema-derive @@ -324,11 +324,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_schema_derive-rust:1.59.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_schema_derive-rust:1.60.0-{{ checksum "Cargo.lock" }} package_std: docker: - - image: rust:1.59.0 + - image: rust:1.60.0 environment: # Limit the number of parallel jobs to avoid OOM crashes during doc testing RUST_TEST_THREADS: 8 @@ -339,7 +339,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_std-rust:1.59.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_std-rust:1.60.0-{{ checksum "Cargo.lock" }} - run: name: Add wasm32 target command: rustup target add wasm32-unknown-unknown && rustup target list --installed @@ -373,11 +373,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_std-rust:1.59.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_std-rust:1.60.0-{{ checksum "Cargo.lock" }} package_storage: docker: - - image: rust:1.59.0 + - image: rust:1.60.0 steps: - checkout - run: @@ -385,7 +385,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_storage-rust:1.59.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_storage-rust:1.60.0-{{ checksum "Cargo.lock" }} - run: name: Build library for native target working_directory: ~/project/packages/storage @@ -404,11 +404,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_storage-rust:1.59.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_storage-rust:1.60.0-{{ checksum "Cargo.lock" }} package_vm: docker: - - image: rust:1.59.0 + - image: rust:1.60.0 steps: - checkout - run: @@ -416,7 +416,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_vm-rust:1.59.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_vm-rust:1.60.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/vm @@ -445,7 +445,7 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_vm-rust:1.59.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_vm-rust:1.60.0-{{ checksum "Cargo.lock" }} package_vm_windows: executor: @@ -493,7 +493,7 @@ jobs: contract_burner: docker: - - image: rust:1.59.0 + - image: rust:1.60.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/burner @@ -505,7 +505,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_burner-rust:1.59.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_burner-rust:1.60.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -516,11 +516,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_burner-rust:1.59.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_burner-rust:1.60.0-{{ checksum "Cargo.lock" }} contract_crypto_verify: docker: - - image: rust:1.59.0 + - image: rust:1.60.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/crypto-verify @@ -532,7 +532,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_crypto_verify-rust:1.59.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_crypto_verify-rust:1.60.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -543,11 +543,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_crypto_verify-rust:1.59.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_crypto_verify-rust:1.60.0-{{ checksum "Cargo.lock" }} contract_cyberpunk: docker: - - image: rust:1.59.0 + - image: rust:1.60.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/cyberpunk @@ -559,7 +559,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_cyberpunk-rust:1.59.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_cyberpunk-rust:1.60.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -570,11 +570,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_cyberpunk-rust:1.59.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_cyberpunk-rust:1.60.0-{{ checksum "Cargo.lock" }} contract_hackatom: docker: - - image: rust:1.59.0 + - image: rust:1.60.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/hackatom @@ -586,7 +586,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_hackatom-rust:1.59.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_hackatom-rust:1.60.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -597,11 +597,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_hackatom-rust:1.59.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_hackatom-rust:1.60.0-{{ checksum "Cargo.lock" }} contract_ibc_reflect: docker: - - image: rust:1.59.0 + - image: rust:1.60.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/ibc-reflect @@ -613,7 +613,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_ibc_reflect-rust:1.59.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_ibc_reflect-rust:1.60.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -624,11 +624,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_ibc_reflect-rust:1.59.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_ibc_reflect-rust:1.60.0-{{ checksum "Cargo.lock" }} contract_ibc_reflect_send: docker: - - image: rust:1.59.0 + - image: rust:1.60.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/ibc-reflect-send @@ -640,7 +640,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_ibc_reflect_send-rust:1.59.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_ibc_reflect_send-rust:1.60.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -651,11 +651,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_ibc_reflect_send-rust:1.59.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_ibc_reflect_send-rust:1.60.0-{{ checksum "Cargo.lock" }} contract_floaty: docker: - - image: rust:1.59.0 + - image: rust:1.60.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/floaty @@ -667,7 +667,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_floaty-rust:1.59.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_floaty-rust:1.60.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -678,11 +678,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_floaty-rust:1.59.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_floaty-rust:1.60.0-{{ checksum "Cargo.lock" }} contract_queue: docker: - - image: rust:1.59.0 + - image: rust:1.60.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/queue @@ -694,7 +694,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_queue-rust:1.59.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_queue-rust:1.60.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -705,11 +705,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_queue-rust:1.59.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_queue-rust:1.60.0-{{ checksum "Cargo.lock" }} contract_reflect: docker: - - image: rust:1.59.0 + - image: rust:1.60.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/reflect @@ -721,7 +721,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_reflect-rust:1.59.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_reflect-rust:1.60.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -732,11 +732,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_reflect-rust:1.59.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_reflect-rust:1.60.0-{{ checksum "Cargo.lock" }} contract_staking: docker: - - image: rust:1.59.0 + - image: rust:1.60.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/staking @@ -748,7 +748,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_staking-rust:1.59.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_staking-rust:1.60.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -759,11 +759,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_staking-rust:1.59.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_staking-rust:1.60.0-{{ checksum "Cargo.lock" }} fmt: docker: - - image: rust:1.59.0 + - image: rust:1.60.0 steps: - checkout - run: @@ -771,7 +771,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-fmt-rust:1.59.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-fmt-rust:1.60.0-{{ checksum "Cargo.lock" }} - run: name: Add rustfmt component command: rustup component add rustfmt @@ -784,7 +784,7 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-fmt-rust:1.59.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-fmt-rust:1.60.0-{{ checksum "Cargo.lock" }} fmt_extra: docker: @@ -806,7 +806,7 @@ jobs: deadlinks: docker: - - image: rust:1.59.0 + - image: rust:1.60.0 steps: - checkout - run: @@ -814,7 +814,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-deadlinks-rust:1.59.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-deadlinks-rust:1.60.0-{{ checksum "Cargo.lock" }} - run: name: Generate docs command: cargo doc @@ -834,7 +834,7 @@ jobs: - target/debug/build - target/debug/deps - /root/.cache/pip - key: cargocache-v2-deadlinks-rust:1.59.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-deadlinks-rust:1.60.0-{{ checksum "Cargo.lock" }} clippy: parameters: @@ -910,7 +910,7 @@ jobs: benchmarking: docker: - - image: rust:1.59.0 + - image: rust:1.60.0 environment: RUST_BACKTRACE: 1 steps: @@ -920,7 +920,7 @@ jobs: command: rustc --version && cargo --version - restore_cache: keys: - - cargocache-v2-benchmarking-rust:1.59.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-benchmarking-rust:1.60.0-{{ checksum "Cargo.lock" }} - run: name: Run vm benchmarks (Singlepass) working_directory: ~/project/packages/vm @@ -938,7 +938,7 @@ jobs: - target/release/.fingerprint - target/release/build - target/release/deps - key: cargocache-v2-benchmarking-rust:1.59.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-benchmarking-rust:1.60.0-{{ checksum "Cargo.lock" }} coverage: # https://circleci.com/developer/images?imageType=machine @@ -1005,7 +1005,7 @@ jobs: name: Check development contracts command: | echo "Checking all contracts under ./artifacts" - docker run --volumes-from with_code rust:1.59.0 \ + docker run --volumes-from with_code rust:1.60.0 \ /bin/bash -e -c 'export GLOBIGNORE="artifacts/floaty.wasm"; cd ./code; cargo run --bin cosmwasm-check artifacts/*.wasm' docker cp with_code:/code/artifacts . - run: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index def0099f59..1d50ccbda5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,7 +33,7 @@ jobs: - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: 1.59.0 + toolchain: 1.60.0 target: wasm32-unknown-unknown profile: minimal override: true From f14d30845c0e3067b42b843dfc58b70e6215a30d Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 12 Dec 2022 18:14:08 +0100 Subject: [PATCH 0066/2372] Bump cosmwasm-std version to 1.1.9 in [dev-dependencies] [skip ci] --- packages/schema/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index ad891e54ea..747fcba35f 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -16,6 +16,6 @@ thiserror = "1.0.13" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = { version = "1.1.8", path = "../std" } +cosmwasm-std = { version = "1.1.9", path = "../std" } semver = "1" tempfile = "3" From 4525f29fe0971ee0a8a044bfcdcda26444bb10a4 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 12 Dec 2022 18:16:33 +0100 Subject: [PATCH 0067/2372] Set version: 1.2.0-beta.0 --- Cargo.lock | 16 ++++++++-------- contracts/burner/Cargo.lock | 12 ++++++------ contracts/crypto-verify/Cargo.lock | 14 +++++++------- contracts/cyberpunk/Cargo.lock | 14 +++++++------- contracts/floaty/Cargo.lock | 14 +++++++------- contracts/hackatom/Cargo.lock | 14 +++++++------- contracts/ibc-reflect-send/Cargo.lock | 14 +++++++------- contracts/ibc-reflect/Cargo.lock | 14 +++++++------- contracts/queue/Cargo.lock | 12 ++++++------ contracts/reflect/Cargo.lock | 14 +++++++------- contracts/staking/Cargo.lock | 14 +++++++------- packages/check/Cargo.toml | 6 +++--- packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema-derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 6 +++--- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 19 files changed, 93 insertions(+), 93 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 021ce07392..c939cf06c2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -246,7 +246,7 @@ dependencies = [ [[package]] name = "cosmwasm-check" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "anyhow", "clap", @@ -257,7 +257,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "base64", "criterion", @@ -276,7 +276,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "cosmwasm-std", "syn", @@ -284,7 +284,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "anyhow", "cosmwasm-schema-derive", @@ -299,7 +299,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "proc-macro2", "quote", @@ -308,7 +308,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "base64", "chrono", @@ -330,7 +330,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "cosmwasm-std", "serde", @@ -338,7 +338,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 9044ff718a..20129c0bbf 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -174,7 +174,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -185,14 +185,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -203,7 +203,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "proc-macro2", "quote", @@ -212,7 +212,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -230,7 +230,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 4bebe371ca..92ebf0a51e 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 58b2b8dcf5..04d7002ab4 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -203,14 +203,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -221,7 +221,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "proc-macro2", "quote", @@ -230,7 +230,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -248,7 +248,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "cosmwasm-std", "serde", @@ -256,7 +256,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index a91764061f..b1857e209a 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index a88a63914f..b46d6b0382 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index eef33fcda3..ec798a0102 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 2433c84e57..a60ff962fb 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 69ea329dbb..69f5ecff87 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 7ffedc112b..d5ba929da6 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 0c4a548896..ad437ec305 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.1.9" +version = "1.2.0-beta.0" dependencies = [ "bitflags", "bytecheck", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index 2d094890a7..a2d0cfe904 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-check" -version = "1.1.9" +version = "1.2.0-beta.0" authors = ["Mauro Lacy "] edition = "2021" description = "A CLI tool for verifying CosmWasm smart contracts" @@ -11,5 +11,5 @@ license = "Apache-2.0" anyhow = "1.0.57" clap = "2" colored = "2" -cosmwasm-vm = { path = "../vm", version = "1.1.9" } -cosmwasm-std = { path = "../std", version = "1.1.9" } +cosmwasm-vm = { path = "../vm", version = "1.2.0-beta.0" } +cosmwasm-std = { path = "../std", version = "1.2.0-beta.0" } diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index c5b07db3ce..5b11b33ead 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "1.1.9" +version = "1.2.0-beta.0" authors = ["Mauro Lacy "] edition = "2021" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index 939cebab5d..2a1eea212e 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "1.1.9" +version = "1.2.0-beta.0" authors = ["Simon Warta "] edition = "2021" description = "A package for auto-generated code used for CosmWasm contract development. This is shipped as part of cosmwasm-std. Do not use directly." diff --git a/packages/schema-derive/Cargo.toml b/packages/schema-derive/Cargo.toml index 7527b0442d..743ccb4a58 100644 --- a/packages/schema-derive/Cargo.toml +++ b/packages/schema-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema-derive" -version = "1.1.9" +version = "1.2.0-beta.0" authors = ["Tomasz Kurcz "] edition = "2021" description = "Derive macros for cosmwasm-schema" diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index 747fcba35f..eb96253d69 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "1.1.9" +version = "1.2.0-beta.0" authors = ["Simon Warta ", "Ethan Frey "] edition = "2021" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." @@ -8,7 +8,7 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/schema" license = "Apache-2.0" [dependencies] -cosmwasm-schema-derive = { version = "=1.1.9", path = "../schema-derive" } +cosmwasm-schema-derive = { version = "=1.2.0-beta.0", path = "../schema-derive" } schemars = "0.8.3" serde = "1.0" serde_json = "1.0.40" @@ -16,6 +16,6 @@ thiserror = "1.0.13" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = { version = "1.1.9", path = "../std" } +cosmwasm-std = { version = "1.2.0-beta.0", path = "../std" } semver = "1" tempfile = "3" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index a960528f7b..7ea7191bed 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "1.1.9" +version = "1.2.0-beta.0" authors = ["Ethan Frey "] edition = "2021" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -42,7 +42,7 @@ cosmwasm_1_2 = [] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "1.1.9" } +cosmwasm-derive = { path = "../derive", version = "1.2.0-beta.0" } derivative = "2" forward_ref = "1" hex = "0.4" @@ -54,7 +54,7 @@ thiserror = "1.0.13" uint = "0.9.3" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "1.1.9" } +cosmwasm-crypto = { path = "../crypto", version = "1.2.0-beta.0" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 07c778d2b5..b726c7d125 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "1.1.9" +version = "1.2.0-beta.0" authors = ["Ethan Frey "] edition = "2021" description = "CosmWasm library with useful helpers for Storage patterns" @@ -16,5 +16,5 @@ iterator = ["cosmwasm-std/iterator"] [dependencies] # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.1.9", default-features = false } +cosmwasm-std = { path = "../std", version = "1.2.0-beta.0", default-features = false } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 685474d650..b00693b1fa 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "1.1.9" +version = "1.2.0-beta.0" authors = ["Ethan Frey "] edition = "2021" description = "VM bindings to run cosmwams contracts" @@ -41,8 +41,8 @@ required-features = ["iterator"] [dependencies] clru = "0.4.0" # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.1.9", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "1.1.9" } +cosmwasm-std = { path = "../std", version = "1.2.0-beta.0", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "1.2.0-beta.0" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.3" From da768196643beb50beeb7e4d4471ba1c3ee1dd07 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 20 Dec 2022 10:41:21 +0100 Subject: [PATCH 0068/2372] Organize From implementations --- packages/std/src/binary.rs | 17 +++++++++-------- packages/std/src/hex_binary.rs | 17 +++++++++-------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/packages/std/src/binary.rs b/packages/std/src/binary.rs index 4ee4b253fb..192d68fd6b 100644 --- a/packages/std/src/binary.rs +++ b/packages/std/src/binary.rs @@ -83,12 +83,6 @@ impl fmt::Debug for Binary { } } -impl From<&[u8]> for Binary { - fn from(binary: &[u8]) -> Self { - Self(binary.to_vec()) - } -} - /// Just like Vec, Binary is a smart pointer to [u8]. /// This implements `*binary` for us and allows us to /// do `&*binary`, returning a `&[u8]` from a `&Binary`. @@ -102,14 +96,21 @@ impl Deref for Binary { } } -// Reference +// Slice +impl From<&[u8]> for Binary { + fn from(binary: &[u8]) -> Self { + Self(binary.to_vec()) + } +} + +// Array reference impl From<&[u8; LENGTH]> for Binary { fn from(source: &[u8; LENGTH]) -> Self { Self(source.to_vec()) } } -// Owned +// Owned array impl From<[u8; LENGTH]> for Binary { fn from(source: [u8; LENGTH]) -> Self { Self(source.into()) diff --git a/packages/std/src/hex_binary.rs b/packages/std/src/hex_binary.rs index 4aa5f7cc8e..4cc8f45ee7 100644 --- a/packages/std/src/hex_binary.rs +++ b/packages/std/src/hex_binary.rs @@ -79,12 +79,6 @@ impl fmt::Debug for HexBinary { } } -impl From<&[u8]> for HexBinary { - fn from(binary: &[u8]) -> Self { - Self(binary.to_vec()) - } -} - /// Just like Vec, HexBinary is a smart pointer to [u8]. /// This implements `*data` for us and allows us to /// do `&*data`, returning a `&[u8]` from a `&HexBinary`. @@ -98,14 +92,21 @@ impl Deref for HexBinary { } } -// Reference +// Slice +impl From<&[u8]> for HexBinary { + fn from(binary: &[u8]) -> Self { + Self(binary.to_vec()) + } +} + +// Array reference impl From<&[u8; LENGTH]> for HexBinary { fn from(source: &[u8; LENGTH]) -> Self { Self(source.to_vec()) } } -// Owned +// Owned array impl From<[u8; LENGTH]> for HexBinary { fn from(source: [u8; LENGTH]) -> Self { Self(source.into()) From 3d8bfa05b81c4c22c2bcb452daf0e7e2bd5e0c92 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 20 Dec 2022 10:51:01 +0100 Subject: [PATCH 0069/2372] Implement AsRef<[u8]> for Binary and HexBinary --- CHANGELOG.md | 2 ++ packages/std/src/binary.rs | 34 ++++++++++++++++++++++++++++++++++ packages/std/src/hex_binary.rs | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6451e14d0..d71e2f5465 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,11 +19,13 @@ and this project adheres to [#1533]). - cosmwasm-std: Upgrade `serde-json-wasm` dependency to 0.5.0 which adds map support to `to_vec`/`to_binary` and friends. +- cosmwasm-std: Implement `AsRef<[u8]>` for `Binary` and `HexBinary` ([#1550]). [#1437]: https://github.com/CosmWasm/cosmwasm/issues/1437 [#1481]: https://github.com/CosmWasm/cosmwasm/pull/1481 [#1478]: https://github.com/CosmWasm/cosmwasm/pull/1478 [#1533]: https://github.com/CosmWasm/cosmwasm/pull/1533 +[#1550]: https://github.com/CosmWasm/cosmwasm/issues/1550 ### Changed diff --git a/packages/std/src/binary.rs b/packages/std/src/binary.rs index 192d68fd6b..4e69b0ff20 100644 --- a/packages/std/src/binary.rs +++ b/packages/std/src/binary.rs @@ -96,6 +96,12 @@ impl Deref for Binary { } } +impl AsRef<[u8]> for Binary { + fn as_ref(&self) -> &[u8] { + self.as_slice() + } +} + // Slice impl From<&[u8]> for Binary { fn from(binary: &[u8]) -> Self { @@ -497,6 +503,34 @@ mod tests { assert_eq!(binary_slice, &[7u8, 35, 49, 101, 0, 255]); } + #[test] + fn binary_implements_as_ref() { + // Can use as_ref (this we already get via the Deref implementation) + let data = Binary(vec![7u8, 35, 49, 101, 0, 255]); + assert_eq!(data.as_ref(), &[7u8, 35, 49, 101, 0, 255]); + + let data = Binary(vec![7u8, 35, 49, 101, 0, 255]); + let data_ref = &data; + assert_eq!(data_ref.as_ref(), &[7u8, 35, 49, 101, 0, 255]); + + // Implements as ref + + // This is a dummy function to mimic the signature of + // https://docs.rs/sha2/0.10.6/sha2/trait.Digest.html#tymethod.digest + fn hash(data: impl AsRef<[u8]>) -> u64 { + let mut hasher = DefaultHasher::new(); + data.as_ref().hash(&mut hasher); + hasher.finish() + } + + let data = Binary(vec![7u8, 35, 49, 101, 0, 255]); + hash(data); + + let data = Binary(vec![7u8, 35, 49, 101, 0, 255]); + let data_ref = &data; + hash(data_ref); + } + #[test] fn binary_implements_hash() { let a1 = Binary::from([0, 187, 61, 11, 250, 0]); diff --git a/packages/std/src/hex_binary.rs b/packages/std/src/hex_binary.rs index 4cc8f45ee7..fcbcc4c05b 100644 --- a/packages/std/src/hex_binary.rs +++ b/packages/std/src/hex_binary.rs @@ -92,6 +92,12 @@ impl Deref for HexBinary { } } +impl AsRef<[u8]> for HexBinary { + fn as_ref(&self) -> &[u8] { + self.as_slice() + } +} + // Slice impl From<&[u8]> for HexBinary { fn from(binary: &[u8]) -> Self { @@ -561,6 +567,34 @@ mod tests { assert_eq!(data_slice, &[7u8, 35, 49, 101, 0, 255]); } + #[test] + fn hex_binary_implements_as_ref() { + // Can use as_ref (this we already get via the Deref implementation) + let data = HexBinary(vec![7u8, 35, 49, 101, 0, 255]); + assert_eq!(data.as_ref(), &[7u8, 35, 49, 101, 0, 255]); + + let data = HexBinary(vec![7u8, 35, 49, 101, 0, 255]); + let data_ref = &data; + assert_eq!(data_ref.as_ref(), &[7u8, 35, 49, 101, 0, 255]); + + // Implements as ref + + // This is a dummy function to mimic the signature of + // https://docs.rs/sha2/0.10.6/sha2/trait.Digest.html#tymethod.digest + fn hash(data: impl AsRef<[u8]>) -> u64 { + let mut hasher = DefaultHasher::new(); + data.as_ref().hash(&mut hasher); + hasher.finish() + } + + let data = HexBinary(vec![7u8, 35, 49, 101, 0, 255]); + hash(data); + + let data = HexBinary(vec![7u8, 35, 49, 101, 0, 255]); + let data_ref = &data; + hash(data_ref); + } + #[test] fn hex_binary_implements_hash() { let a1 = HexBinary::from([0, 187, 61, 11, 250, 0]); From 3b352a921aa730e91f6cbf404e5cfc84178a3041 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 12 Dec 2022 13:55:04 +0100 Subject: [PATCH 0070/2372] Add missing cosmwasm_1_2 features --- .circleci/config.yml | 8 ++++---- devtools/check_workspace.sh | 2 +- packages/check/src/main.rs | 2 +- packages/vm/src/testing/instance.rs | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 01000ce3ac..926f083f3d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -358,15 +358,15 @@ jobs: - run: name: Build library for native target (all features) working_directory: ~/project/packages/std - command: cargo build --locked --features abort,iterator,staking,stargate,cosmwasm_1_1 + command: cargo build --locked --features abort,iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2 - run: name: Build library for wasm target (all features) working_directory: ~/project/packages/std - command: cargo wasm --locked --features abort,iterator,staking,stargate,cosmwasm_1_1 + command: cargo wasm --locked --features abort,iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2 - run: name: Run unit tests (all features) working_directory: ~/project/packages/std - command: cargo test --locked --features abort,iterator,staking,stargate,cosmwasm_1_1 + command: cargo test --locked --features abort,iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2 - save_cache: paths: - /usr/local/cargo/registry @@ -882,7 +882,7 @@ jobs: - run: name: Clippy linting on std (all feature flags) working_directory: ~/project/packages/std - command: cargo clippy --all-targets --features abort,iterator,staking,stargate -- -D warnings + command: cargo clippy --all-targets --features abort,iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2 -- -D warnings - run: name: Clippy linting on storage (no feature flags) working_directory: ~/project/packages/storage diff --git a/devtools/check_workspace.sh b/devtools/check_workspace.sh index d24813c5ed..a9969ae5f8 100755 --- a/devtools/check_workspace.sh +++ b/devtools/check_workspace.sh @@ -8,7 +8,7 @@ cargo fmt ( cd packages/std cargo check - cargo check --features iterator,staking,stargate + cargo check --features iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2 cargo wasm-debug cargo wasm-debug --features iterator,staking,stargate cargo clippy --all-targets --features iterator,staking,stargate -- -D warnings diff --git a/packages/check/src/main.rs b/packages/check/src/main.rs index 1d4e6eb67d..c1f7da1784 100644 --- a/packages/check/src/main.rs +++ b/packages/check/src/main.rs @@ -10,7 +10,7 @@ use colored::Colorize; use cosmwasm_vm::capabilities_from_csv; use cosmwasm_vm::internals::{check_wasm, compile}; -const DEFAULT_AVAILABLE_CAPABILITIES: &str = "iterator,staking,stargate,cosmwasm_1_1"; +const DEFAULT_AVAILABLE_CAPABILITIES: &str = "iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2"; pub fn main() { let matches = App::new("Contract checking") diff --git a/packages/vm/src/testing/instance.rs b/packages/vm/src/testing/instance.rs index 6311c10a67..14b85cf7c9 100644 --- a/packages/vm/src/testing/instance.rs +++ b/packages/vm/src/testing/instance.rs @@ -98,7 +98,7 @@ pub struct MockInstanceOptions<'a> { impl MockInstanceOptions<'_> { fn default_capabilities() -> HashSet { #[allow(unused_mut)] - let mut out = capabilities_from_csv("iterator,staking,cosmwasm_1_1"); + let mut out = capabilities_from_csv("iterator,staking,cosmwasm_1_1,cosmwasm_1_2"); #[cfg(feature = "stargate")] out.insert("stargate".to_string()); out From 36146e7cc3e7aba6de333b0855eb850771ead43b Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 12 Dec 2022 13:59:47 +0100 Subject: [PATCH 0071/2372] Add WasmMsg::Instantiate2 --- CHANGELOG.md | 4 +++ .../schema/ibc-reflect-send.json | 2 +- .../ibc-reflect-send/schema/packet_msg.json | 2 +- .../ibc-reflect-send/schema/raw/execute.json | 2 +- .../ibc-reflect-send/schema/raw/migrate.json | 2 +- .../ibc-reflect-send/schema/raw/sudo.json | 2 +- contracts/ibc-reflect/schema/packet_msg.json | 2 +- contracts/reflect/schema/raw/execute.json | 2 +- contracts/reflect/schema/raw/migrate.json | 2 +- contracts/reflect/schema/raw/sudo.json | 2 +- contracts/reflect/schema/reflect.json | 2 +- docs/CAPABILITIES-BUILT-IN.md | 4 +-- packages/std/src/results/cosmos_msg.rs | 26 ++++++++++++++++++- 13 files changed, 41 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d71e2f5465..a329879f66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,9 @@ and this project adheres to of CosmWasm earlier than 1.2.0 ([#1481]). - cosmwasm-std: Add `instantiate2_address` which allows calculating the predictable addresses for `MsgInstantiateContract2` ([#1437]). +- cosmwasm-std: Add `WasmMsg::Instantiate2` (requires `cosmwasm_1_2`, see + `GovMsg::VoteWeighted` above) to instantiate contracts at a predictable + address ([#1436]). - cosmwasm-schema: In contracts, `cosmwasm schema` will now output a separate JSON Schema file for each entrypoint in the `raw` subdirectory ([#1478], [#1533]). @@ -21,6 +24,7 @@ and this project adheres to support to `to_vec`/`to_binary` and friends. - cosmwasm-std: Implement `AsRef<[u8]>` for `Binary` and `HexBinary` ([#1550]). +[#1436]: https://github.com/CosmWasm/cosmwasm/issues/1436 [#1437]: https://github.com/CosmWasm/cosmwasm/issues/1437 [#1481]: https://github.com/CosmWasm/cosmwasm/pull/1481 [#1478]: https://github.com/CosmWasm/cosmwasm/pull/1478 diff --git a/contracts/ibc-reflect-send/schema/ibc-reflect-send.json b/contracts/ibc-reflect-send/schema/ibc-reflect-send.json index 5f6fe80a2c..b42ac67e89 100644 --- a/contracts/ibc-reflect-send/schema/ibc-reflect-send.json +++ b/contracts/ibc-reflect-send/schema/ibc-reflect-send.json @@ -690,7 +690,7 @@ "additionalProperties": false }, { - "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.16.0-alpha1/x/wasm/internal/types/tx.proto#L47-L61). `sender` is automatically filled with the current contract's address.", + "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThe contract address is non-predictable. But it is guaranteed that when emitting the same Instantiate message multiple times, multiple instances on different addresses will be generated. See also Instantiate2.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.29.2/proto/cosmwasm/wasm/v1/tx.proto#L53-L71). `sender` is automatically filled with the current contract's address.", "type": "object", "required": [ "instantiate" diff --git a/contracts/ibc-reflect-send/schema/packet_msg.json b/contracts/ibc-reflect-send/schema/packet_msg.json index 1aeb3db835..7bc2a45e21 100644 --- a/contracts/ibc-reflect-send/schema/packet_msg.json +++ b/contracts/ibc-reflect-send/schema/packet_msg.json @@ -628,7 +628,7 @@ "additionalProperties": false }, { - "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.16.0-alpha1/x/wasm/internal/types/tx.proto#L47-L61). `sender` is automatically filled with the current contract's address.", + "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThe contract address is non-predictable. But it is guaranteed that when emitting the same Instantiate message multiple times, multiple instances on different addresses will be generated. See also Instantiate2.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.29.2/proto/cosmwasm/wasm/v1/tx.proto#L53-L71). `sender` is automatically filled with the current contract's address.", "type": "object", "required": [ "instantiate" diff --git a/contracts/ibc-reflect-send/schema/raw/execute.json b/contracts/ibc-reflect-send/schema/raw/execute.json index e08109d489..a382cb2aac 100644 --- a/contracts/ibc-reflect-send/schema/raw/execute.json +++ b/contracts/ibc-reflect-send/schema/raw/execute.json @@ -679,7 +679,7 @@ "additionalProperties": false }, { - "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.16.0-alpha1/x/wasm/internal/types/tx.proto#L47-L61). `sender` is automatically filled with the current contract's address.", + "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThe contract address is non-predictable. But it is guaranteed that when emitting the same Instantiate message multiple times, multiple instances on different addresses will be generated. See also Instantiate2.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.29.2/proto/cosmwasm/wasm/v1/tx.proto#L53-L71). `sender` is automatically filled with the current contract's address.", "type": "object", "required": [ "instantiate" diff --git a/contracts/ibc-reflect-send/schema/raw/migrate.json b/contracts/ibc-reflect-send/schema/raw/migrate.json index e08109d489..a382cb2aac 100644 --- a/contracts/ibc-reflect-send/schema/raw/migrate.json +++ b/contracts/ibc-reflect-send/schema/raw/migrate.json @@ -679,7 +679,7 @@ "additionalProperties": false }, { - "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.16.0-alpha1/x/wasm/internal/types/tx.proto#L47-L61). `sender` is automatically filled with the current contract's address.", + "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThe contract address is non-predictable. But it is guaranteed that when emitting the same Instantiate message multiple times, multiple instances on different addresses will be generated. See also Instantiate2.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.29.2/proto/cosmwasm/wasm/v1/tx.proto#L53-L71). `sender` is automatically filled with the current contract's address.", "type": "object", "required": [ "instantiate" diff --git a/contracts/ibc-reflect-send/schema/raw/sudo.json b/contracts/ibc-reflect-send/schema/raw/sudo.json index e08109d489..a382cb2aac 100644 --- a/contracts/ibc-reflect-send/schema/raw/sudo.json +++ b/contracts/ibc-reflect-send/schema/raw/sudo.json @@ -679,7 +679,7 @@ "additionalProperties": false }, { - "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.16.0-alpha1/x/wasm/internal/types/tx.proto#L47-L61). `sender` is automatically filled with the current contract's address.", + "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThe contract address is non-predictable. But it is guaranteed that when emitting the same Instantiate message multiple times, multiple instances on different addresses will be generated. See also Instantiate2.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.29.2/proto/cosmwasm/wasm/v1/tx.proto#L53-L71). `sender` is automatically filled with the current contract's address.", "type": "object", "required": [ "instantiate" diff --git a/contracts/ibc-reflect/schema/packet_msg.json b/contracts/ibc-reflect/schema/packet_msg.json index 11f1cb38eb..259c21b1bd 100644 --- a/contracts/ibc-reflect/schema/packet_msg.json +++ b/contracts/ibc-reflect/schema/packet_msg.json @@ -473,7 +473,7 @@ "additionalProperties": false }, { - "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.16.0-alpha1/x/wasm/internal/types/tx.proto#L47-L61). `sender` is automatically filled with the current contract's address.", + "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThe contract address is non-predictable. But it is guaranteed that when emitting the same Instantiate message multiple times, multiple instances on different addresses will be generated. See also Instantiate2.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.29.2/proto/cosmwasm/wasm/v1/tx.proto#L53-L71). `sender` is automatically filled with the current contract's address.", "type": "object", "required": [ "instantiate" diff --git a/contracts/reflect/schema/raw/execute.json b/contracts/reflect/schema/raw/execute.json index e0db5ae603..1ccfba3b0e 100644 --- a/contracts/reflect/schema/raw/execute.json +++ b/contracts/reflect/schema/raw/execute.json @@ -716,7 +716,7 @@ "additionalProperties": false }, { - "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.16.0-alpha1/x/wasm/internal/types/tx.proto#L47-L61). `sender` is automatically filled with the current contract's address.", + "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThe contract address is non-predictable. But it is guaranteed that when emitting the same Instantiate message multiple times, multiple instances on different addresses will be generated. See also Instantiate2.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.29.2/proto/cosmwasm/wasm/v1/tx.proto#L53-L71). `sender` is automatically filled with the current contract's address.", "type": "object", "required": [ "instantiate" diff --git a/contracts/reflect/schema/raw/migrate.json b/contracts/reflect/schema/raw/migrate.json index e0db5ae603..1ccfba3b0e 100644 --- a/contracts/reflect/schema/raw/migrate.json +++ b/contracts/reflect/schema/raw/migrate.json @@ -716,7 +716,7 @@ "additionalProperties": false }, { - "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.16.0-alpha1/x/wasm/internal/types/tx.proto#L47-L61). `sender` is automatically filled with the current contract's address.", + "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThe contract address is non-predictable. But it is guaranteed that when emitting the same Instantiate message multiple times, multiple instances on different addresses will be generated. See also Instantiate2.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.29.2/proto/cosmwasm/wasm/v1/tx.proto#L53-L71). `sender` is automatically filled with the current contract's address.", "type": "object", "required": [ "instantiate" diff --git a/contracts/reflect/schema/raw/sudo.json b/contracts/reflect/schema/raw/sudo.json index e0db5ae603..1ccfba3b0e 100644 --- a/contracts/reflect/schema/raw/sudo.json +++ b/contracts/reflect/schema/raw/sudo.json @@ -716,7 +716,7 @@ "additionalProperties": false }, { - "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.16.0-alpha1/x/wasm/internal/types/tx.proto#L47-L61). `sender` is automatically filled with the current contract's address.", + "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThe contract address is non-predictable. But it is guaranteed that when emitting the same Instantiate message multiple times, multiple instances on different addresses will be generated. See also Instantiate2.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.29.2/proto/cosmwasm/wasm/v1/tx.proto#L53-L71). `sender` is automatically filled with the current contract's address.", "type": "object", "required": [ "instantiate" diff --git a/contracts/reflect/schema/reflect.json b/contracts/reflect/schema/reflect.json index 515e97eac5..ab4e2c0cc6 100644 --- a/contracts/reflect/schema/reflect.json +++ b/contracts/reflect/schema/reflect.json @@ -726,7 +726,7 @@ "additionalProperties": false }, { - "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.16.0-alpha1/x/wasm/internal/types/tx.proto#L47-L61). `sender` is automatically filled with the current contract's address.", + "description": "Instantiates a new contracts from previously uploaded Wasm code.\n\nThe contract address is non-predictable. But it is guaranteed that when emitting the same Instantiate message multiple times, multiple instances on different addresses will be generated. See also Instantiate2.\n\nThis is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.29.2/proto/cosmwasm/wasm/v1/tx.proto#L53-L71). `sender` is automatically filled with the current contract's address.", "type": "object", "required": [ "instantiate" diff --git a/docs/CAPABILITIES-BUILT-IN.md b/docs/CAPABILITIES-BUILT-IN.md index f0cabc280b..8fdd679fe1 100644 --- a/docs/CAPABILITIES-BUILT-IN.md +++ b/docs/CAPABILITIES-BUILT-IN.md @@ -13,5 +13,5 @@ might define others. chains that don't use this (e.g. Tgrade). - `cosmwasm_1_1` enables the `BankQuery::Supply` query. Only chains running CosmWasm `1.1.0` or higher support this. -- `cosmwasm_1_2` enables the `GovMsg::VoteWeighted` message. Only chains running - CosmWasm `1.2.0` or higher support this. +- `cosmwasm_1_2` enables the `GovMsg::VoteWeighted` and `WasmMsg::Instantiate2` + messages. Only chains running CosmWasm `1.2.0` or higher support this. diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index 2761ac280b..e7c63418f4 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -141,7 +141,12 @@ pub enum WasmMsg { }, /// Instantiates a new contracts from previously uploaded Wasm code. /// - /// This is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.16.0-alpha1/x/wasm/internal/types/tx.proto#L47-L61). + /// The contract address is non-predictable. But it is guaranteed that + /// when emitting the same Instantiate message multiple times, + /// multiple instances on different addresses will be generated. See also + /// Instantiate2. + /// + /// This is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.29.2/proto/cosmwasm/wasm/v1/tx.proto#L53-L71). /// `sender` is automatically filled with the current contract's address. Instantiate { admin: Option, @@ -153,6 +158,25 @@ pub enum WasmMsg { /// A human-readbale label for the contract label: String, }, + /// Instantiates a new contracts from previously uploaded Wasm code + /// using a predictable address derivation algorithm implemented in + /// [`cosmwasm_std::instantiate2_address`]. + /// + /// This is translated to a [MsgInstantiateContract2](https://github.com/CosmWasm/wasmd/blob/v0.29.2/proto/cosmwasm/wasm/v1/tx.proto#L73-L96). + /// `sender` is automatically filled with the current contract's address. + #[cfg(feature = "cosmwasm_1_2")] + Instantiate2 { + admin: Option, + code_id: u64, + /// A human-readbale label for the contract + label: String, + /// msg is the JSON-encoded InstantiateMsg struct (as raw Binary) + #[derivative(Debug(format_with = "binary_to_string"))] + msg: Binary, + funds: Vec, + salt: Binary, + fix_msg: bool, + }, /// Migrates a given contracts to use new wasm code. Passes a MigrateMsg to allow us to /// customize behavior. /// From f59ee3dc04573b7e14670d3dfedddcbd7fa1fcea Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 20 Dec 2022 14:44:42 +0100 Subject: [PATCH 0072/2372] Remove msg argument from instantiate2_address --- packages/std/src/addresses.rs | 52 +++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index 93248e0018..880e2171b7 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -315,7 +315,7 @@ pub enum Instantiate2AddressError { /// let canonical_creator = deps.api.addr_canonicalize(env.contract.address.as_str())?; /// let checksum = HexBinary::from_hex("9af782a3a1bcbcd22dbb6a45c751551d9af782a3a1bcbcd22dbb6a45c751551d")?; /// let salt = b"instance 1231"; -/// let canonical_addr = instantiate2_address(&checksum, &canonical_creator, salt, None) +/// let canonical_addr = instantiate2_address(&checksum, &canonical_creator, salt) /// .map_err(|_| StdError::generic_err("Could not calculate addr"))?; /// let addr = deps.api.addr_humanize(&canonical_addr)?; /// @@ -326,7 +326,19 @@ pub fn instantiate2_address( checksum: &[u8], creator: &CanonicalAddr, salt: &[u8], - msg: Option<&[u8]>, +) -> Result { + instantiate2_address_impl(checksum, creator, salt, b"") +} + +/// The instantiate2 address derivation implementation. This API is used for +/// testing puposes only. The `msg` field is discouraged and should not be used. +/// Use [`instantiate2_address`]. +#[doc(hidden)] +fn instantiate2_address_impl( + checksum: &[u8], + creator: &CanonicalAddr, + salt: &[u8], + msg: &[u8], ) -> Result { if checksum.len() != 32 { return Err(Instantiate2AddressError::InvalidChecksumLength); @@ -336,8 +348,6 @@ pub fn instantiate2_address( return Err(Instantiate2AddressError::InvalidSaltLength); }; - let msg = msg.unwrap_or_default(); - let mut key = Vec::::new(); key.extend_from_slice(b"wasm\0"); key.extend_from_slice(&(checksum.len() as u64).to_be_bytes()); @@ -659,23 +669,23 @@ mod tests { } #[test] - fn instantiate2_address_works() { + fn instantiate2_address_impl_works() { let checksum1 = HexBinary::from_hex("13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5") .unwrap(); let creator1 = CanonicalAddr::from(hex!("9999999999aaaaaaaaaabbbbbbbbbbcccccccccc")); let salt1 = hex!("61"); let salt2 = hex!("aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae"); - let msg1: Option<&[u8]> = None; - let msg2: Option<&[u8]> = Some(b"{}"); - let msg3: Option<&[u8]> = Some(b"{\"some\":123,\"structure\":{\"nested\":[\"ok\",true]}}"); + let msg1: &[u8] = b""; + let msg2: &[u8] = b"{}"; + let msg3: &[u8] = b"{\"some\":123,\"structure\":{\"nested\":[\"ok\",true]}}"; // No msg let expected = CanonicalAddr::from(hex!( "5e865d3e45ad3e961f77fd77d46543417ced44d924dc3e079b5415ff6775f847" )); assert_eq!( - instantiate2_address(&checksum1, &creator1, &salt1, msg1).unwrap(), + instantiate2_address_impl(&checksum1, &creator1, &salt1, msg1).unwrap(), expected ); @@ -684,7 +694,7 @@ mod tests { "0995499608947a5281e2c7ebd71bdb26a1ad981946dad57f6c4d3ee35de77835" )); assert_eq!( - instantiate2_address(&checksum1, &creator1, &salt1, msg2).unwrap(), + instantiate2_address_impl(&checksum1, &creator1, &salt1, msg2).unwrap(), expected ); @@ -693,7 +703,7 @@ mod tests { "83326e554723b15bac664ceabc8a5887e27003abe9fbd992af8c7bcea4745167" )); assert_eq!( - instantiate2_address(&checksum1, &creator1, &salt1, msg3).unwrap(), + instantiate2_address_impl(&checksum1, &creator1, &salt1, msg3).unwrap(), expected ); @@ -702,42 +712,42 @@ mod tests { "9384c6248c0bb171e306fd7da0993ec1e20eba006452a3a9e078883eb3594564" )); assert_eq!( - instantiate2_address(&checksum1, &creator1, &salt2, None).unwrap(), + instantiate2_address_impl(&checksum1, &creator1, &salt2, b"").unwrap(), expected ); // Salt too short or too long let empty = Vec::::new(); assert!(matches!( - instantiate2_address(&checksum1, &creator1, &empty, None).unwrap_err(), + instantiate2_address_impl(&checksum1, &creator1, &empty, b"").unwrap_err(), Instantiate2AddressError::InvalidSaltLength )); let too_long = vec![0x11; 65]; assert!(matches!( - instantiate2_address(&checksum1, &creator1, &too_long, None).unwrap_err(), + instantiate2_address_impl(&checksum1, &creator1, &too_long, b"").unwrap_err(), Instantiate2AddressError::InvalidSaltLength )); // invalid checksum length let broken_cs = hex!("13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2"); assert!(matches!( - instantiate2_address(&broken_cs, &creator1, &salt1, None).unwrap_err(), + instantiate2_address_impl(&broken_cs, &creator1, &salt1, b"").unwrap_err(), Instantiate2AddressError::InvalidChecksumLength )); let broken_cs = hex!(""); assert!(matches!( - instantiate2_address(&broken_cs, &creator1, &salt1, None).unwrap_err(), + instantiate2_address_impl(&broken_cs, &creator1, &salt1, b"").unwrap_err(), Instantiate2AddressError::InvalidChecksumLength )); let broken_cs = hex!("13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2aaaa"); assert!(matches!( - instantiate2_address(&broken_cs, &creator1, &salt1, None).unwrap_err(), + instantiate2_address_impl(&broken_cs, &creator1, &salt1, b"").unwrap_err(), Instantiate2AddressError::InvalidChecksumLength )); } #[test] - fn instantiate2_address_works_for_cosmjs_testvectors() { + fn instantiate2_address_impl_works_for_cosmjs_testvectors() { // Test data from https://github.com/cosmos/cosmjs/pull/1253 const COSMOS_ED25519_TESTS_JSON: &str = "./testdata/instantiate2_addresses.json"; @@ -793,12 +803,12 @@ mod tests { out: _, } in read_tests() { - let msg = input.msg.map(|msg| msg.into_bytes()); - let addr = instantiate2_address( + let msg = input.msg.map(|msg| msg.into_bytes()).unwrap_or_default(); + let addr = instantiate2_address_impl( &input.checksum, &input.creator_data.into(), &input.salt, - msg.as_deref(), + &msg, ) .unwrap(); assert_eq!(addr, intermediate.address_data); From 93582b9029c9635a4d7f4c7f43b153c47a42c78a Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 20 Dec 2022 18:17:33 +0100 Subject: [PATCH 0073/2372] Link update PR #1554 to instantiate2_address/Instantiate2 CHANGELOGs --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a329879f66..806a673192 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,10 +13,10 @@ and this project adheres to dependency. This makes the contract incompatible with chains running versions of CosmWasm earlier than 1.2.0 ([#1481]). - cosmwasm-std: Add `instantiate2_address` which allows calculating the - predictable addresses for `MsgInstantiateContract2` ([#1437]). + predictable addresses for `MsgInstantiateContract2` ([#1437], [#1554]). - cosmwasm-std: Add `WasmMsg::Instantiate2` (requires `cosmwasm_1_2`, see `GovMsg::VoteWeighted` above) to instantiate contracts at a predictable - address ([#1436]). + address ([#1436], [#1554])). - cosmwasm-schema: In contracts, `cosmwasm schema` will now output a separate JSON Schema file for each entrypoint in the `raw` subdirectory ([#1478], [#1533]). @@ -30,6 +30,7 @@ and this project adheres to [#1478]: https://github.com/CosmWasm/cosmwasm/pull/1478 [#1533]: https://github.com/CosmWasm/cosmwasm/pull/1533 [#1550]: https://github.com/CosmWasm/cosmwasm/issues/1550 +[#1554]: https://github.com/CosmWasm/cosmwasm/pull/1554 ### Changed From ccf3f08e5238064f173971ace03d5213654199a3 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 20 Dec 2022 18:22:24 +0100 Subject: [PATCH 0074/2372] Remove fix_msg argument from Instantiate2 --- packages/std/src/results/cosmos_msg.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index e7c63418f4..cc24034322 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -164,6 +164,7 @@ pub enum WasmMsg { /// /// This is translated to a [MsgInstantiateContract2](https://github.com/CosmWasm/wasmd/blob/v0.29.2/proto/cosmwasm/wasm/v1/tx.proto#L73-L96). /// `sender` is automatically filled with the current contract's address. + /// `fix_msg` is automatically set to false. #[cfg(feature = "cosmwasm_1_2")] Instantiate2 { admin: Option, @@ -175,7 +176,6 @@ pub enum WasmMsg { msg: Binary, funds: Vec, salt: Binary, - fix_msg: bool, }, /// Migrates a given contracts to use new wasm code. Passes a MigrateMsg to allow us to /// customize behavior. From c8bfa9cf32efceb37f57afa4005eff8c1ffad764 Mon Sep 17 00:00:00 2001 From: 0xArb Date: Sun, 18 Dec 2022 13:45:00 +1300 Subject: [PATCH 0075/2372] supplyresponse::new --- packages/std/src/query/bank.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/std/src/query/bank.rs b/packages/std/src/query/bank.rs index 9656ea6138..373ba8fcd9 100644 --- a/packages/std/src/query/bank.rs +++ b/packages/std/src/query/bank.rs @@ -31,6 +31,16 @@ pub struct SupplyResponse { pub amount: Coin, } +#[cfg(feature = "cosmwasm_1_1")] +impl SupplyResponse { + pub fn new(amount: Coin) -> Self { + Self { + amount, + } + } +} + + #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] pub struct BalanceResponse { From 6da0ab73364aa02638509846e2b919d79fa523de Mon Sep 17 00:00:00 2001 From: Simon Warta <2603011+webmaster128@users.noreply.github.com> Date: Wed, 21 Dec 2022 17:47:23 +0100 Subject: [PATCH 0076/2372] Format code --- packages/std/src/query/bank.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/std/src/query/bank.rs b/packages/std/src/query/bank.rs index 373ba8fcd9..d8d99d030e 100644 --- a/packages/std/src/query/bank.rs +++ b/packages/std/src/query/bank.rs @@ -34,13 +34,10 @@ pub struct SupplyResponse { #[cfg(feature = "cosmwasm_1_1")] impl SupplyResponse { pub fn new(amount: Coin) -> Self { - Self { - amount, - } + Self { amount } } } - #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] pub struct BalanceResponse { From ad62c70065e010675cebb59aa6b8ab77610b0550 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 21 Dec 2022 17:52:35 +0100 Subject: [PATCH 0077/2372] Improve documentation for query response constructors --- packages/std/src/query/bank.rs | 5 +++++ packages/std/src/query/wasm.rs | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/std/src/query/bank.rs b/packages/std/src/query/bank.rs index d8d99d030e..e53dbcc9b0 100644 --- a/packages/std/src/query/bank.rs +++ b/packages/std/src/query/bank.rs @@ -33,6 +33,11 @@ pub struct SupplyResponse { #[cfg(feature = "cosmwasm_1_1")] impl SupplyResponse { + /// Constructor for testing frameworks such as cw-multi-test. + /// This is required because query response types should be #[non_exhaustive]. + /// As a contract developer you should not need this constructor since + /// query responses are constructed for you via deserialization. + #[doc(hidden)] pub fn new(amount: Coin) -> Self { Self { amount } } diff --git a/packages/std/src/query/wasm.rs b/packages/std/src/query/wasm.rs index cbac899834..fee0334635 100644 --- a/packages/std/src/query/wasm.rs +++ b/packages/std/src/query/wasm.rs @@ -41,7 +41,10 @@ pub struct ContractInfoResponse { } impl ContractInfoResponse { - /// Convenience constructor for tests / mocks + /// Constructor for testing frameworks such as cw-multi-test. + /// This is required because query response types should be #[non_exhaustive]. + /// As a contract developer you should not need this constructor since + /// query responses are constructed for you via deserialization. #[doc(hidden)] pub fn new(code_id: u64, creator: impl Into) -> Self { Self { From 629aa722fc16721b0c82d394788baa0f00f3dd42 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 21 Dec 2022 17:56:36 +0100 Subject: [PATCH 0078/2372] Add CHANGELOG entry for SupplyResponse::new --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 806a673192..f8b77d714d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ and this project adheres to - cosmwasm-std: Upgrade `serde-json-wasm` dependency to 0.5.0 which adds map support to `to_vec`/`to_binary` and friends. - cosmwasm-std: Implement `AsRef<[u8]>` for `Binary` and `HexBinary` ([#1550]). +- cosmwasm-std: Add constructor `SupplyResponse::new` ([#1552]). [#1436]: https://github.com/CosmWasm/cosmwasm/issues/1436 [#1437]: https://github.com/CosmWasm/cosmwasm/issues/1437 @@ -30,6 +31,7 @@ and this project adheres to [#1478]: https://github.com/CosmWasm/cosmwasm/pull/1478 [#1533]: https://github.com/CosmWasm/cosmwasm/pull/1533 [#1550]: https://github.com/CosmWasm/cosmwasm/issues/1550 +[#1552]: https://github.com/CosmWasm/cosmwasm/pull/1552 [#1554]: https://github.com/CosmWasm/cosmwasm/pull/1554 ### Changed From 25349990bf7b1adb90e39eca2b6849420fe5dd65 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 23 Dec 2022 14:13:53 +0100 Subject: [PATCH 0079/2372] Bump clippy to and fix some new warnings --- .circleci/config.yml | 2 +- contracts/crypto-verify/src/ethereum.rs | 2 +- packages/crypto/benches/main.rs | 2 +- packages/crypto/src/secp256k1.rs | 4 ++-- packages/vm/src/cache.rs | 4 ++-- packages/vm/src/imports.rs | 4 +++- packages/vm/src/modules/file_system_cache.rs | 2 +- packages/vm/src/modules/pinned_memory_cache.rs | 2 +- packages/vm/src/wasm_backend/gatekeeper.rs | 6 +++--- packages/vm/src/wasm_backend/store.rs | 2 +- 10 files changed, 16 insertions(+), 14 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 926f083f3d..0c248018e2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -71,7 +71,7 @@ workflows: matrix: parameters: # Run with MSRV and some modern stable Rust - rust-version: ["1.60.0", "1.65.0"] + rust-version: ["1.60.0", "1.66.0"] - benchmarking: requires: - package_vm diff --git a/contracts/crypto-verify/src/ethereum.rs b/contracts/crypto-verify/src/ethereum.rs index b47fe49335..bc6d8981dd 100644 --- a/contracts/crypto-verify/src/ethereum.rs +++ b/contracts/crypto-verify/src/ethereum.rs @@ -19,7 +19,7 @@ pub fn verify_transaction( ) -> StdResult { let sign_bytes = serialize_unsigned_transaction(to, nonce, gas, gas_price, value, data, chain_id); - let hash = Keccak256::digest(&sign_bytes); + let hash = Keccak256::digest(sign_bytes); let mut rs: Vec = Vec::with_capacity(64); rs.resize(32 - r.len(), 0); // Left pad r to 32 bytes rs.extend_from_slice(r); diff --git a/packages/crypto/benches/main.rs b/packages/crypto/benches/main.rs index 9135759c5f..e1efbfe2a3 100644 --- a/packages/crypto/benches/main.rs +++ b/packages/crypto/benches/main.rs @@ -78,7 +78,7 @@ fn bench_crypto(c: &mut Criterion) { group.bench_function("secp256k1_verify", |b| { let message = hex::decode(COSMOS_SECP256K1_MSG_HEX).unwrap(); - let message_hash = Sha256::digest(&message); + let message_hash = Sha256::digest(message); let signature = hex::decode(COSMOS_SECP256K1_SIGNATURE_HEX).unwrap(); let public_key = base64::decode(COSMOS_SECP256K1_PUBKEY_BASE64).unwrap(); b.iter(|| { diff --git a/packages/crypto/src/secp256k1.rs b/packages/crypto/src/secp256k1.rs index dda5ce2571..4783de67c9 100644 --- a/packages/crypto/src/secp256k1.rs +++ b/packages/crypto/src/secp256k1.rs @@ -253,7 +253,7 @@ mod tests { let signature = hex::decode(sig).unwrap(); // Explicit hash - let message_hash = Sha256::digest(&message); + let message_hash = Sha256::digest(message); // secp256k1_verify works assert!( @@ -290,7 +290,7 @@ mod tests { let message = hex::decode(&encoded.message).unwrap(); let hash = hex::decode(&encoded.message_hash).unwrap(); - let message_hash = Sha256::digest(&message); + let message_hash = Sha256::digest(message); assert_eq!(hash.as_slice(), message_hash.as_slice()); let signature = hex::decode(&encoded.signature).unwrap(); diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index ea56e30df4..f971530ba9 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -336,7 +336,7 @@ fn save_wasm_to_disk(dir: impl Into, wasm: &[u8]) -> VmResult // calculate filename let checksum = Checksum::generate(wasm); let filename = checksum.to_hex(); - let filepath = dir.into().join(&filename); + let filepath = dir.into().join(filename); // write data to file // Since the same filename (a collision resistent hash) cannot be generated from two different byte codes @@ -561,7 +561,7 @@ mod tests { .path() .join(STATE_DIR) .join(WASM_DIR) - .join(&checksum.to_hex()); + .join(checksum.to_hex()); let mut file = OpenOptions::new().write(true).open(filepath).unwrap(); file.write_all(b"broken data").unwrap(); diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 357fbe024f..4473282ce6 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -225,6 +225,7 @@ pub fn do_secp256k1_verify( let gas_info = GasInfo::with_cost(env.gas_config.secp256k1_verify_cost); process_gas_info::(env, gas_info)?; let result = secp256k1_verify(&hash, &signature, &pubkey); + #[allow(clippy::bool_to_int_with_if)] Ok(result.map_or_else( |err| match err { CryptoError::InvalidHashFormat { .. } @@ -285,6 +286,7 @@ pub fn do_ed25519_verify( let gas_info = GasInfo::with_cost(env.gas_config.ed25519_verify_cost); process_gas_info::(env, gas_info)?; let result = ed25519_verify(&message, &signature, &pubkey); + #[allow(clippy::bool_to_int_with_if)] Ok(result.map_or_else( |err| match err { CryptoError::InvalidPubkeyFormat { .. } @@ -588,7 +590,7 @@ mod tests { let result = do_db_read(&env, key_ptr); let value_ptr = result.unwrap(); assert!(value_ptr > 0); - assert_eq!(force_read(&env, value_ptr as u32), VALUE1); + assert_eq!(force_read(&env, value_ptr), VALUE1); } #[test] diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 406a0ebcc3..a529e432de 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -106,7 +106,7 @@ impl FileSystemCache { let filename = checksum.to_hex(); let file_path = self.latest_modules_path().join(filename); - let result = unsafe { Module::deserialize_from_file(store, &file_path) }; + let result = unsafe { Module::deserialize_from_file(store, file_path) }; match result { Ok(module) => Ok(Some(module)), Err(DeserializeError::Io(err)) => match err.kind() { diff --git a/packages/vm/src/modules/pinned_memory_cache.rs b/packages/vm/src/modules/pinned_memory_cache.rs index 61ef8cc746..2f1a976d82 100644 --- a/packages/vm/src/modules/pinned_memory_cache.rs +++ b/packages/vm/src/modules/pinned_memory_cache.rs @@ -52,7 +52,7 @@ impl PinnedMemoryCache { /// This is based on the values provided with `store`. No actual /// memory size is measured here. pub fn size(&self) -> usize { - self.modules.iter().map(|(_, module)| module.size).sum() + self.modules.values().map(|module| module.size).sum() } } diff --git a/packages/vm/src/wasm_backend/gatekeeper.rs b/packages/vm/src/wasm_backend/gatekeeper.rs index c5c82efaff..897a500beb 100644 --- a/packages/vm/src/wasm_backend/gatekeeper.rs +++ b/packages/vm/src/wasm_backend/gatekeeper.rs @@ -711,7 +711,7 @@ mod tests { let mut compiler_config = Cranelift::default(); compiler_config.push_middleware(deterministic); let store = Store::new(&Universal::new(compiler_config).engine()); - let result = Module::new(&store, &wasm); + let result = Module::new(&store, wasm); assert!(result.is_ok()); } @@ -732,7 +732,7 @@ mod tests { let mut compiler_config = Cranelift::default(); compiler_config.push_middleware(deterministic); let store = Store::new(&Universal::new(compiler_config).engine()); - let result = Module::new(&store, &wasm); + let result = Module::new(&store, wasm); assert!(result .unwrap_err() .to_string() @@ -759,7 +759,7 @@ mod tests { let mut compiler_config = Cranelift::default(); compiler_config.push_middleware(deterministic); let store = Store::new(&Universal::new(compiler_config).engine()); - let result = Module::new(&store, &wasm); + let result = Module::new(&store, wasm); assert!(result .unwrap_err() .to_string() diff --git a/packages/vm/src/wasm_backend/store.rs b/packages/vm/src/wasm_backend/store.rs index 570692b590..1f98f6bd1c 100644 --- a/packages/vm/src/wasm_backend/store.rs +++ b/packages/vm/src/wasm_backend/store.rs @@ -171,7 +171,7 @@ mod tests { let serialized = { let wasm = wat::parse_str(EXPORTED_MEMORY_WAT).unwrap(); let store = make_compile_time_store(None, &[]); - let module = Module::new(&store, &wasm).unwrap(); + let module = Module::new(&store, wasm).unwrap(); module.serialize().unwrap() }; From e348516b88f8a90f5e564646210e1e1b92fe261e Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 2 Jan 2023 15:17:35 +0100 Subject: [PATCH 0080/2372] Create constants ED25519_VERIFY_CODE_{IN,}VALID and SECP256K1_VERIFY_CODE_{IN,}VALID --- packages/vm/src/imports.rs | 59 +++++++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 14 deletions(-) diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 4473282ce6..7932887928 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -212,6 +212,12 @@ pub fn do_addr_humanize( } } +/// Return code (error code) for a valid signature +const SECP256K1_VERIFY_CODE_VALID: u32 = 0; + +/// Return code (error code) for an invalid signature +const SECP256K1_VERIFY_CODE_INVALID: u32 = 1; + pub fn do_secp256k1_verify( env: &Environment, hash_ptr: u32, @@ -225,9 +231,15 @@ pub fn do_secp256k1_verify( let gas_info = GasInfo::with_cost(env.gas_config.secp256k1_verify_cost); process_gas_info::(env, gas_info)?; let result = secp256k1_verify(&hash, &signature, &pubkey); - #[allow(clippy::bool_to_int_with_if)] - Ok(result.map_or_else( - |err| match err { + let code = match result { + Ok(valid) => { + if valid { + SECP256K1_VERIFY_CODE_VALID + } else { + SECP256K1_VERIFY_CODE_INVALID + } + } + Err(err) => match err { CryptoError::InvalidHashFormat { .. } | CryptoError::InvalidPubkeyFormat { .. } | CryptoError::InvalidSignatureFormat { .. } @@ -236,8 +248,8 @@ pub fn do_secp256k1_verify( panic!("Error must not happen for this call") } }, - |valid| if valid { 0 } else { 1 }, - )) + }; + Ok(code) } pub fn do_secp256k1_recover_pubkey( @@ -273,6 +285,12 @@ pub fn do_secp256k1_recover_pubkey( } } +/// Return code (error code) for a valid signature +const ED25519_VERIFY_CODE_VALID: u32 = 0; + +/// Return code (error code) for an invalid signature +const ED25519_VERIFY_CODE_INVALID: u32 = 1; + pub fn do_ed25519_verify( env: &Environment, message_ptr: u32, @@ -286,9 +304,15 @@ pub fn do_ed25519_verify( let gas_info = GasInfo::with_cost(env.gas_config.ed25519_verify_cost); process_gas_info::(env, gas_info)?; let result = ed25519_verify(&message, &signature, &pubkey); - #[allow(clippy::bool_to_int_with_if)] - Ok(result.map_or_else( - |err| match err { + let code = match result { + Ok(valid) => { + if valid { + ED25519_VERIFY_CODE_VALID + } else { + ED25519_VERIFY_CODE_INVALID + } + } + Err(err) => match err { CryptoError::InvalidPubkeyFormat { .. } | CryptoError::InvalidSignatureFormat { .. } | CryptoError::GenericErr { .. } => err.code(), @@ -298,8 +322,8 @@ pub fn do_ed25519_verify( panic!("Error must not happen for this call") } }, - |valid| if valid { 0 } else { 1 }, - )) + }; + Ok(code) } pub fn do_ed25519_batch_verify( @@ -336,8 +360,15 @@ pub fn do_ed25519_batch_verify( let gas_info = GasInfo::with_cost(max(gas_cost, env.gas_config.ed25519_verify_cost)); process_gas_info::(env, gas_info)?; let result = ed25519_batch_verify(&messages, &signatures, &public_keys); - Ok(result.map_or_else( - |err| match err { + let code = match result { + Ok(valid) => { + if valid { + ED25519_VERIFY_CODE_VALID + } else { + ED25519_VERIFY_CODE_INVALID + } + } + Err(err) => match err { CryptoError::BatchErr { .. } | CryptoError::InvalidPubkeyFormat { .. } | CryptoError::InvalidSignatureFormat { .. } @@ -346,8 +377,8 @@ pub fn do_ed25519_batch_verify( panic!("Error must not happen for this call") } }, - |valid| (!valid).into(), - )) + }; + Ok(code) } /// Prints a debug message to console. From a3f9ad780ee0da27deedcb8a3be518e018b96460 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 2 Jan 2023 14:52:36 +0100 Subject: [PATCH 0081/2372] Add QueryResponseType trait --- packages/std/src/query/bank.rs | 23 ++++++++++------------- packages/std/src/query/mod.rs | 1 + packages/std/src/query/query_response.rs | 16 ++++++++++++++++ packages/std/src/query/wasm.rs | 6 +++++- 4 files changed, 32 insertions(+), 14 deletions(-) create mode 100644 packages/std/src/query/query_response.rs diff --git a/packages/std/src/query/bank.rs b/packages/std/src/query/bank.rs index e53dbcc9b0..b3a43e11d5 100644 --- a/packages/std/src/query/bank.rs +++ b/packages/std/src/query/bank.rs @@ -3,6 +3,8 @@ use serde::{Deserialize, Serialize}; use crate::Coin; +use super::query_response::QueryResponseType; + #[non_exhaustive] #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] @@ -22,7 +24,7 @@ pub enum BankQuery { } #[cfg(feature = "cosmwasm_1_1")] -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] #[non_exhaustive] pub struct SupplyResponse { @@ -32,18 +34,9 @@ pub struct SupplyResponse { } #[cfg(feature = "cosmwasm_1_1")] -impl SupplyResponse { - /// Constructor for testing frameworks such as cw-multi-test. - /// This is required because query response types should be #[non_exhaustive]. - /// As a contract developer you should not need this constructor since - /// query responses are constructed for you via deserialization. - #[doc(hidden)] - pub fn new(amount: Coin) -> Self { - Self { amount } - } -} +impl QueryResponseType for SupplyResponse {} -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] pub struct BalanceResponse { /// Always returns a Coin with the requested denom. @@ -51,9 +44,13 @@ pub struct BalanceResponse { pub amount: Coin, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +impl QueryResponseType for BalanceResponse {} + +#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] pub struct AllBalanceResponse { /// Returns all non-zero coins held by this account. pub amount: Vec, } + +impl QueryResponseType for AllBalanceResponse {} diff --git a/packages/std/src/query/mod.rs b/packages/std/src/query/mod.rs index 67a2fcdb0d..5ca17fe35b 100644 --- a/packages/std/src/query/mod.rs +++ b/packages/std/src/query/mod.rs @@ -7,6 +7,7 @@ use crate::Empty; mod bank; mod ibc; +mod query_response; mod staking; mod wasm; diff --git a/packages/std/src/query/query_response.rs b/packages/std/src/query/query_response.rs new file mode 100644 index 0000000000..dca2e766c9 --- /dev/null +++ b/packages/std/src/query/query_response.rs @@ -0,0 +1,16 @@ +use serde::de::DeserializeOwned; + +/// A marker trait for query response types. +/// +/// Those types have in common that they should be `#[non_exhaustive]` in order +/// to allow adding fields in a backwards compatible way. In contracts they are +/// only constructed through deserialization. We want to make it hard for +/// contract developers to construct those types themselves as this is most likely +/// not what they should do. +/// +/// In hosts they are constructed as follows: +/// - wasmvm: Go types with the same JSON layout +/// - multi-test/cw-sdk: create a default instance and mutate the fields +/// +/// This trait is crate-internal and can change any time. +pub(crate) trait QueryResponseType: Default + DeserializeOwned {} diff --git a/packages/std/src/query/wasm.rs b/packages/std/src/query/wasm.rs index fee0334635..09302d0563 100644 --- a/packages/std/src/query/wasm.rs +++ b/packages/std/src/query/wasm.rs @@ -3,6 +3,8 @@ use serde::{Deserialize, Serialize}; use crate::Binary; +use super::query_response::QueryResponseType; + #[non_exhaustive] #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] @@ -27,7 +29,7 @@ pub enum WasmQuery { } #[non_exhaustive] -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] pub struct ContractInfoResponse { pub code_id: u64, /// address that instantiated this contract @@ -40,6 +42,8 @@ pub struct ContractInfoResponse { pub ibc_port: Option, } +impl QueryResponseType for ContractInfoResponse {} + impl ContractInfoResponse { /// Constructor for testing frameworks such as cw-multi-test. /// This is required because query response types should be #[non_exhaustive]. From 34f78d3613d17d9b72cc49a24ded2354b9eacd68 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 2 Jan 2023 14:55:28 +0100 Subject: [PATCH 0082/2372] Adapt CHANGELOG entry and add follow-up PR link --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8b77d714d..451055879c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,7 +23,8 @@ and this project adheres to - cosmwasm-std: Upgrade `serde-json-wasm` dependency to 0.5.0 which adds map support to `to_vec`/`to_binary` and friends. - cosmwasm-std: Implement `AsRef<[u8]>` for `Binary` and `HexBinary` ([#1550]). -- cosmwasm-std: Add constructor `SupplyResponse::new` ([#1552]). +- cosmwasm-std: Allow constructing `SupplyResponse` via a `Default` + implementation ([#1552], [#1560]). [#1436]: https://github.com/CosmWasm/cosmwasm/issues/1436 [#1437]: https://github.com/CosmWasm/cosmwasm/issues/1437 @@ -33,6 +34,7 @@ and this project adheres to [#1550]: https://github.com/CosmWasm/cosmwasm/issues/1550 [#1552]: https://github.com/CosmWasm/cosmwasm/pull/1552 [#1554]: https://github.com/CosmWasm/cosmwasm/pull/1554 +[#1560]: https://github.com/CosmWasm/cosmwasm/pull/1560 ### Changed From 54dc68c8b316699b8662c592079d21d5634268b5 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 2 Jan 2023 15:00:05 +0100 Subject: [PATCH 0083/2372] Improve doc string of ContractInfo --- contracts/reflect/schema/raw/query.json | 2 +- contracts/reflect/schema/reflect.json | 2 +- packages/std/src/query/wasm.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/reflect/schema/raw/query.json b/contracts/reflect/schema/raw/query.json index 04512e6f3f..914555088d 100644 --- a/contracts/reflect/schema/raw/query.json +++ b/contracts/reflect/schema/raw/query.json @@ -547,7 +547,7 @@ "additionalProperties": false }, { - "description": "returns a ContractInfoResponse with metadata on the contract from the runtime", + "description": "Returns a [`ContractInfoResponse`] with metadata on the contract from the runtime", "type": "object", "required": [ "contract_info" diff --git a/contracts/reflect/schema/reflect.json b/contracts/reflect/schema/reflect.json index ab4e2c0cc6..603c401cd4 100644 --- a/contracts/reflect/schema/reflect.json +++ b/contracts/reflect/schema/reflect.json @@ -1411,7 +1411,7 @@ "additionalProperties": false }, { - "description": "returns a ContractInfoResponse with metadata on the contract from the runtime", + "description": "Returns a [`ContractInfoResponse`] with metadata on the contract from the runtime", "type": "object", "required": [ "contract_info" diff --git a/packages/std/src/query/wasm.rs b/packages/std/src/query/wasm.rs index 09302d0563..6bd52dde91 100644 --- a/packages/std/src/query/wasm.rs +++ b/packages/std/src/query/wasm.rs @@ -24,7 +24,7 @@ pub enum WasmQuery { /// Key is the raw key used in the contracts Storage key: Binary, }, - /// returns a ContractInfoResponse with metadata on the contract from the runtime + /// Returns a [`ContractInfoResponse`] with metadata on the contract from the runtime ContractInfo { contract_addr: String }, } From 71b1f5e129b6fc391d8d06dbb5fabeab7aec7ef5 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 2 Jan 2023 15:00:17 +0100 Subject: [PATCH 0084/2372] Deprecate ContractInfoResponse::new --- packages/std/src/query/wasm.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/std/src/query/wasm.rs b/packages/std/src/query/wasm.rs index 6bd52dde91..153b35f51c 100644 --- a/packages/std/src/query/wasm.rs +++ b/packages/std/src/query/wasm.rs @@ -50,13 +50,13 @@ impl ContractInfoResponse { /// As a contract developer you should not need this constructor since /// query responses are constructed for you via deserialization. #[doc(hidden)] + #[deprecated( + note = "Use ContractInfoResponse::default() and mutate the fields you want to set." + )] pub fn new(code_id: u64, creator: impl Into) -> Self { - Self { - code_id, - creator: creator.into(), - admin: None, - pinned: false, - ibc_port: None, - } + let mut out = ContractInfoResponse::default(); + out.code_id = code_id; + out.creator = creator.into(); + out } } From 03f803d8e17fba3e9a5539caafbd3243e9f9b8fd Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 2 Jan 2023 16:15:16 +0100 Subject: [PATCH 0085/2372] Make clippy happy --- packages/std/src/query/wasm.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/std/src/query/wasm.rs b/packages/std/src/query/wasm.rs index 153b35f51c..2be597ae65 100644 --- a/packages/std/src/query/wasm.rs +++ b/packages/std/src/query/wasm.rs @@ -54,9 +54,10 @@ impl ContractInfoResponse { note = "Use ContractInfoResponse::default() and mutate the fields you want to set." )] pub fn new(code_id: u64, creator: impl Into) -> Self { - let mut out = ContractInfoResponse::default(); - out.code_id = code_id; - out.creator = creator.into(); - out + ContractInfoResponse { + code_id, + creator: creator.into(), + ..Default::default() + } } } From 49ae7cf2b72e6f8cf4fe9ab1d860ce3d610d0276 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 3 Jan 2023 15:38:40 +0100 Subject: [PATCH 0086/2372] Enable cosmwasm_1_2 in coverage testing --- .circleci/config.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0c248018e2..f9de137824 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -956,8 +956,13 @@ jobs: mkdir -p reports/schema mkdir -p reports/std mkdir -p reports/storage + CRYPTO=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/crypto --packages cosmwasm-crypto" + DERIVE=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/derive --packages cosmwasm-derive" + SCHEMA=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/schema --packages cosmwasm-schema" + STD=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/std --packages cosmwasm-std --features cosmwasm_1_2" + STORAGE="cargo tarpaulin --skip-clean --out Xml --output-dir reports/storage --packages cosmwasm-storage" docker run --security-opt seccomp=unconfined -v "${PWD}:/volume" xd009642/tarpaulin:0.21.0 \ - sh -c "cargo tarpaulin --skip-clean --out Xml --output-dir reports/crypto --packages cosmwasm-crypto && cargo tarpaulin --skip-clean --out Xml --output-dir reports/derive --packages cosmwasm-derive && cargo tarpaulin --skip-clean --out Xml --output-dir reports/schema --packages cosmwasm-schema && cargo tarpaulin --skip-clean --out Xml --output-dir reports/std --packages cosmwasm-std && cargo tarpaulin --skip-clean --out Xml --output-dir reports/storage --packages cosmwasm-storage" + sh -c "$CRYPTO && $DERIVE && $SCHEMA && $STD && $STORAGE" - codecov/upload: file: reports/crypto/cobertura.xml flags: cosmwasm-crypto From a4c54e40939075d7a6d04e7dd8fc33ce711375ee Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 3 Jan 2023 16:05:07 +0100 Subject: [PATCH 0087/2372] Add more features to coverage --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f9de137824..ad9fc54090 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -959,7 +959,7 @@ jobs: CRYPTO=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/crypto --packages cosmwasm-crypto" DERIVE=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/derive --packages cosmwasm-derive" SCHEMA=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/schema --packages cosmwasm-schema" - STD=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/std --packages cosmwasm-std --features cosmwasm_1_2" + STD=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/std --packages cosmwasm-std --features abort,iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2" STORAGE="cargo tarpaulin --skip-clean --out Xml --output-dir reports/storage --packages cosmwasm-storage" docker run --security-opt seccomp=unconfined -v "${PWD}:/volume" xd009642/tarpaulin:0.21.0 \ sh -c "$CRYPTO && $DERIVE && $SCHEMA && $STD && $STORAGE" From 358dc3eedfda57395718855c368017f109435173 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 3 Jan 2023 18:51:40 +0100 Subject: [PATCH 0088/2372] Bump min thiserror version to 1.0.26 for consistency --- contracts/cyberpunk/Cargo.toml | 2 +- contracts/floaty/Cargo.toml | 2 +- contracts/hackatom/Cargo.toml | 2 +- contracts/reflect/Cargo.toml | 2 +- packages/crypto/Cargo.toml | 2 +- packages/schema/Cargo.toml | 2 +- packages/std/Cargo.toml | 2 +- packages/vm/Cargo.toml | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/contracts/cyberpunk/Cargo.toml b/contracts/cyberpunk/Cargo.toml index b4cdca0d35..32f43bf413 100644 --- a/contracts/cyberpunk/Cargo.toml +++ b/contracts/cyberpunk/Cargo.toml @@ -32,7 +32,7 @@ backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] cosmwasm-schema = { path = "../../packages/schema" } cosmwasm-std = { path = "../../packages/std", default-features = false, features = ["abort"] } rust-argon2 = "0.8" -thiserror = "1.0" +thiserror = "1.0.26" [dev-dependencies] cosmwasm-storage = { path = "../../packages/storage", default-features = false } diff --git a/contracts/floaty/Cargo.toml b/contracts/floaty/Cargo.toml index e16a126438..b16a2c282b 100644 --- a/contracts/floaty/Cargo.toml +++ b/contracts/floaty/Cargo.toml @@ -35,7 +35,7 @@ cosmwasm-schema = { path = "../../packages/schema" } cosmwasm-std = { path = "../../packages/std" } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } -thiserror = "1.0" +thiserror = "1.0.26" [dev-dependencies] cosmwasm-storage = { path = "../../packages/storage" } diff --git a/contracts/hackatom/Cargo.toml b/contracts/hackatom/Cargo.toml index 1a91f1100f..fa1b8ccf7d 100644 --- a/contracts/hackatom/Cargo.toml +++ b/contracts/hackatom/Cargo.toml @@ -36,7 +36,7 @@ cosmwasm-std = { path = "../../packages/std", default-features = false, features schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } sha2 = "0.10" -thiserror = "1.0" +thiserror = "1.0.26" [dev-dependencies] cosmwasm-storage = { path = "../../packages/storage", default-features = false } diff --git a/contracts/reflect/Cargo.toml b/contracts/reflect/Cargo.toml index eab872fe3e..c331845ac1 100644 --- a/contracts/reflect/Cargo.toml +++ b/contracts/reflect/Cargo.toml @@ -38,7 +38,7 @@ cosmwasm-std = { path = "../../packages/std", default-features = false, features cosmwasm-storage = { path = "../../packages/storage", default-features = false } schemars = "0.8.3" serde = { version = "=1.0.103", default-features = false, features = ["derive"] } -thiserror = "1.0" +thiserror = "1.0.26" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["stargate"] } diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 5b11b33ead..441efe5197 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -23,7 +23,7 @@ k256 = { version = "0.11.1", features = ["ecdsa"] } ed25519-zebra = "3" digest = "0.10" rand_core = { version = "0.6", features = ["getrandom"] } -thiserror = "1.0.13" +thiserror = "1.0.26" [dev-dependencies] criterion = "0.3" diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index eb96253d69..b883c13463 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -12,7 +12,7 @@ cosmwasm-schema-derive = { version = "=1.2.0-beta.0", path = "../schema-derive" schemars = "0.8.3" serde = "1.0" serde_json = "1.0.40" -thiserror = "1.0.13" +thiserror = "1.0.26" [dev-dependencies] anyhow = "1.0.57" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 7ea7191bed..8a8c1f0615 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -50,7 +50,7 @@ schemars = "0.8.3" sha2 = "0.10.3" serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } serde-json-wasm = { version = "0.5.0" } -thiserror = "1.0.13" +thiserror = "1.0.26" uint = "0.9.3" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index b00693b1fa..fcfdcb8ac9 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -49,7 +49,7 @@ schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } serde_json = "1.0.40" sha2 = "0.10.3" -thiserror = "1.0.13" +thiserror = "1.0.26" wasmer = { version = "=2.3.0", default-features = false, features = ["cranelift", "universal", "singlepass"] } wasmer-middlewares = "=2.3.0" loupe = "0.1.3" From 2c1035529140d9c06a912e6ee5fcc66d2bcec5a8 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 4 Jan 2023 10:20:06 +0100 Subject: [PATCH 0089/2372] Add Never type for to avoid ibc_packet_receive errors --- CHANGELOG.md | 3 ++ IBC.md | 52 +++++++++++++++------------ contracts/ibc-reflect-send/src/ibc.rs | 4 +-- contracts/ibc-reflect/src/contract.rs | 4 +-- packages/std/src/lib.rs | 2 ++ packages/std/src/never.rs | 21 +++++++++++ 6 files changed, 60 insertions(+), 26 deletions(-) create mode 100644 packages/std/src/never.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 451055879c..3839dbc6c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,9 @@ and this project adheres to - cosmwasm-std: Implement `AsRef<[u8]>` for `Binary` and `HexBinary` ([#1550]). - cosmwasm-std: Allow constructing `SupplyResponse` via a `Default` implementation ([#1552], [#1560]). +- cosmwasm-std: Add `Never` type which cannot be instantiated. This can be used + as the error type for the `ibc_packet_receive` to gain confidence that the + implementations never errors and the transaction does not get reverted. [#1436]: https://github.com/CosmWasm/cosmwasm/issues/1436 [#1437]: https://github.com/CosmWasm/cosmwasm/issues/1437 diff --git a/IBC.md b/IBC.md index 41497bdd48..fcefc92ffe 100644 --- a/IBC.md +++ b/IBC.md @@ -264,7 +264,9 @@ pub fn ibc_packet_receive( deps: DepsMut, env: Env, msg: IbcPacketReceiveMsg, -) -> StdResult { } +) -> Result { + // ... +} ``` This is a very special entry point as it has a unique workflow. (Please see the @@ -350,27 +352,33 @@ produced 3 suggestions on how to handle errors and rollbacks _inside [main dispatch loop in `ibc-reflect`](https://github.com/CosmWasm/cosmwasm/blob/cd784cd1148ee395574f3e564f102d0d7b5adcc3/contracts/ibc-reflect/src/contract.rs#L217-L248): ```rust - (|| { - // which local channel did this packet come on - let caller = packet.dest.channel_id; - let msg: PacketMsg = from_slice(&packet.data)?; - match msg { - PacketMsg::Dispatch { msgs } => receive_dispatch(deps, caller, msgs), - PacketMsg::WhoAmI {} => receive_who_am_i(deps, caller), - PacketMsg::Balances {} => receive_balances(deps, caller), - } - })() - .or_else(|e| { - // we try to capture all app-level errors and convert them into - // acknowledgement packets that contain an error code. - let acknowledgement = encode_ibc_error(format!("invalid packet: {}", e)); - Ok(IbcReceiveResponse { - acknowledgement, - submessages: vec![], - messages: vec![], - attributes: vec![], - }) - }) + pub fn ibc_packet_receive( + deps: DepsMut, + _env: Env, + msg: IbcPacketReceiveMsg, + ) -> Result { + (|| { + // which local channel did this packet come on + let caller = packet.dest.channel_id; + let msg: PacketMsg = from_slice(&packet.data)?; + match msg { + PacketMsg::Dispatch { msgs } => receive_dispatch(deps, caller, msgs), + PacketMsg::WhoAmI {} => receive_who_am_i(deps, caller), + PacketMsg::Balances {} => receive_balances(deps, caller), + } + })() + .or_else(|e| { + // we try to capture all app-level errors and convert them into + // acknowledgement packets that contain an error code. + let acknowledgement = encode_ibc_error(format!("invalid packet: {}", e)); + Ok(IbcReceiveResponse { + acknowledgement, + submessages: vec![], + messages: vec![], + attributes: vec![], + }) + }) + } ``` 2. If we modify state with an external call, we need to wrap it in a diff --git a/contracts/ibc-reflect-send/src/ibc.rs b/contracts/ibc-reflect-send/src/ibc.rs index dca8cbf78c..2284c48457 100644 --- a/contracts/ibc-reflect-send/src/ibc.rs +++ b/contracts/ibc-reflect-send/src/ibc.rs @@ -1,7 +1,7 @@ use cosmwasm_std::{ entry_point, from_slice, to_binary, DepsMut, Env, IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcMsg, IbcOrder, IbcPacketAckMsg, - IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, StdError, StdResult, + IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, Never, StdError, StdResult, }; use crate::ibc_msg::{ @@ -95,7 +95,7 @@ pub fn ibc_packet_receive( _deps: DepsMut, _env: Env, _packet: IbcPacketReceiveMsg, -) -> StdResult { +) -> Result { Ok(IbcReceiveResponse::new() .set_ack(b"{}") .add_attribute("action", "ibc_packet_ack")) diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index a43e581461..04750f00ec 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -2,7 +2,7 @@ use cosmwasm_std::{ entry_point, from_slice, to_binary, wasm_execute, BankMsg, Binary, CosmosMsg, Deps, DepsMut, Empty, Env, Event, Ibc3ChannelOpenResponse, IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcChannelOpenResponse, IbcOrder, IbcPacketAckMsg, - IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, MessageInfo, Order, + IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, MessageInfo, Never, Order, QueryResponse, Reply, Response, StdError, StdResult, SubMsg, SubMsgResponse, SubMsgResult, WasmMsg, }; @@ -233,7 +233,7 @@ pub fn ibc_packet_receive( deps: DepsMut, _env: Env, msg: IbcPacketReceiveMsg, -) -> StdResult { +) -> Result { // put this in a closure so we can convert all error responses into acknowledgements (|| { let packet = msg.packet; diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 4a03d3025a..809e87484f 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -15,6 +15,7 @@ mod import_helpers; #[cfg(feature = "iterator")] mod iterator; mod math; +mod never; mod panic; mod query; mod results; @@ -48,6 +49,7 @@ pub use crate::math::{ Decimal, Decimal256, Decimal256RangeExceeded, DecimalRangeExceeded, Fraction, Isqrt, Uint128, Uint256, Uint512, Uint64, }; +pub use crate::never::Never; #[cfg(feature = "cosmwasm_1_1")] pub use crate::query::SupplyResponse; pub use crate::query::{ diff --git a/packages/std/src/never.rs b/packages/std/src/never.rs new file mode 100644 index 0000000000..60b5861f85 --- /dev/null +++ b/packages/std/src/never.rs @@ -0,0 +1,21 @@ +/// Never can never be instantiated. This can be used in places +/// where we want to ensure that no error is returned, such as +/// the `ibc_packet_receive` entry point. +/// +/// Once the ! type is stable, this is not needed anymore. +/// See . +pub enum Never {} + +impl core::fmt::Debug for Never { + fn fmt(&self, _f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + // This is unreachable because no instance of Never can exist + unreachable!() + } +} + +impl core::fmt::Display for Never { + fn fmt(&self, _f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + // This is unreachable because no instance of Never can exist + unreachable!() + } +} From a570cc417d6d073134a23c12b1edc05f2220b718 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 24 Nov 2022 10:22:46 +0100 Subject: [PATCH 0090/2372] Improve Never documentation --- packages/std/src/never.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/std/src/never.rs b/packages/std/src/never.rs index 60b5861f85..fa30f18287 100644 --- a/packages/std/src/never.rs +++ b/packages/std/src/never.rs @@ -2,10 +2,14 @@ /// where we want to ensure that no error is returned, such as /// the `ibc_packet_receive` entry point. /// +/// In contrast to `Empty`, this does not have a JSON schema +/// and cannot be used for message and query types. +/// /// Once the ! type is stable, this is not needed anymore. /// See . pub enum Never {} +// The Debug implementation is needed to allow the use of `Result::unwrap`. impl core::fmt::Debug for Never { fn fmt(&self, _f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { // This is unreachable because no instance of Never can exist @@ -13,6 +17,8 @@ impl core::fmt::Debug for Never { } } +// The Display implementation is needed to fulfill the ToString requirement of +// entry point errors: `Result, E>` with `E: ToString`. impl core::fmt::Display for Never { fn fmt(&self, _f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { // This is unreachable because no instance of Never can exist From cd87530ca589c5c58cc9bd15bd2eb3678f7995e0 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 2 Jan 2023 17:08:11 +0100 Subject: [PATCH 0091/2372] Make unreachable implementation type-safe --- packages/std/src/never.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/std/src/never.rs b/packages/std/src/never.rs index fa30f18287..4b9f6c7b8a 100644 --- a/packages/std/src/never.rs +++ b/packages/std/src/never.rs @@ -12,8 +12,8 @@ pub enum Never {} // The Debug implementation is needed to allow the use of `Result::unwrap`. impl core::fmt::Debug for Never { fn fmt(&self, _f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - // This is unreachable because no instance of Never can exist - unreachable!() + // Unreachable because no instance of Never can exist + match *self {} } } @@ -21,7 +21,7 @@ impl core::fmt::Debug for Never { // entry point errors: `Result, E>` with `E: ToString`. impl core::fmt::Display for Never { fn fmt(&self, _f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - // This is unreachable because no instance of Never can exist - unreachable!() + // Unreachable because no instance of Never can exist + match *self {} } } From 2b8c55333d8c7077cd206691f416c4982e70f368 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 2 Jan 2023 17:13:17 +0100 Subject: [PATCH 0092/2372] Improve CHANGELOG --- CHANGELOG.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3839dbc6c6..8292e9dfea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,13 +26,15 @@ and this project adheres to - cosmwasm-std: Allow constructing `SupplyResponse` via a `Default` implementation ([#1552], [#1560]). - cosmwasm-std: Add `Never` type which cannot be instantiated. This can be used - as the error type for the `ibc_packet_receive` to gain confidence that the - implementations never errors and the transaction does not get reverted. + as the error type for `ibc_packet_receive` or `ibc_packet_ack` to gain + confidence that the implementations never errors and the transaction does not + get reverted. ([#1513]) [#1436]: https://github.com/CosmWasm/cosmwasm/issues/1436 [#1437]: https://github.com/CosmWasm/cosmwasm/issues/1437 [#1481]: https://github.com/CosmWasm/cosmwasm/pull/1481 [#1478]: https://github.com/CosmWasm/cosmwasm/pull/1478 +[#1513]: https://github.com/CosmWasm/cosmwasm/pull/1513 [#1533]: https://github.com/CosmWasm/cosmwasm/pull/1533 [#1550]: https://github.com/CosmWasm/cosmwasm/issues/1550 [#1552]: https://github.com/CosmWasm/cosmwasm/pull/1552 From 5a6fec162b88cf46439d1319903bec55febc9e34 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 3 Jan 2023 14:26:34 +0100 Subject: [PATCH 0093/2372] Check workspace with different features --- devtools/check_workspace.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/devtools/check_workspace.sh b/devtools/check_workspace.sh index a9969ae5f8..7304866eed 100755 --- a/devtools/check_workspace.sh +++ b/devtools/check_workspace.sh @@ -7,8 +7,10 @@ cargo fmt (cd packages/derive && cargo check && cargo clippy --all-targets -- -D warnings) ( cd packages/std + # default, min, all cargo check - cargo check --features iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2 + cargo check --no-default-features + cargo check --features abort,iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2 cargo wasm-debug cargo wasm-debug --features iterator,staking,stargate cargo clippy --all-targets --features iterator,staking,stargate -- -D warnings From e2814e55d9cc243f9bf600db5ef67f09031654c9 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 5 Jan 2023 16:00:29 +0100 Subject: [PATCH 0094/2372] Add new `WasmQuery::CodeInfo` --- CHANGELOG.md | 3 +++ packages/std/src/errors/system_error.rs | 6 ++++++ packages/std/src/lib.rs | 2 ++ packages/std/src/query/mod.rs | 2 ++ packages/std/src/query/wasm.rs | 23 +++++++++++++++++++++++ packages/std/src/testing/mock.rs | 23 ++++++++++++++++------- 6 files changed, 52 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8292e9dfea..5012273c5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,8 @@ and this project adheres to as the error type for `ibc_packet_receive` or `ibc_packet_ack` to gain confidence that the implementations never errors and the transaction does not get reverted. ([#1513]) +- cosmwasm-std: Add new `WasmQuery::CodeInfo` to get the checksum of a code ID + ([#1561]). [#1436]: https://github.com/CosmWasm/cosmwasm/issues/1436 [#1437]: https://github.com/CosmWasm/cosmwasm/issues/1437 @@ -40,6 +42,7 @@ and this project adheres to [#1552]: https://github.com/CosmWasm/cosmwasm/pull/1552 [#1554]: https://github.com/CosmWasm/cosmwasm/pull/1554 [#1560]: https://github.com/CosmWasm/cosmwasm/pull/1560 +[#1561]: https://github.com/CosmWasm/cosmwasm/pull/1561 ### Changed diff --git a/packages/std/src/errors/system_error.rs b/packages/std/src/errors/system_error.rs index 27cd40f12e..97d7bba3cb 100644 --- a/packages/std/src/errors/system_error.rs +++ b/packages/std/src/errors/system_error.rs @@ -28,6 +28,11 @@ pub enum SystemError { /// The address that was attempted to query addr: String, }, + /// A Wasm code was not found. + NoSuchCode { + /// The code ID that is missing + code_id: u64, + }, Unknown {}, UnsupportedRequest { kind: String, @@ -52,6 +57,7 @@ impl std::fmt::Display for SystemError { String::from_utf8_lossy(response) ), SystemError::NoSuchContract { addr } => write!(f, "No such contract: {}", addr), + SystemError::NoSuchCode { code_id } => write!(f, "No such code: {}", code_id), SystemError::Unknown {} => write!(f, "Unknown system error"), SystemError::UnsupportedRequest { kind } => { write!(f, "Unsupported query type: {}", kind) diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 809e87484f..d40d25d68f 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -50,6 +50,8 @@ pub use crate::math::{ Uint256, Uint512, Uint64, }; pub use crate::never::Never; +#[cfg(feature = "cosmwasm_1_2")] +pub use crate::query::CodeInfoResponse; #[cfg(feature = "cosmwasm_1_1")] pub use crate::query::SupplyResponse; pub use crate::query::{ diff --git a/packages/std/src/query/mod.rs b/packages/std/src/query/mod.rs index 5ca17fe35b..50061df091 100644 --- a/packages/std/src/query/mod.rs +++ b/packages/std/src/query/mod.rs @@ -21,6 +21,8 @@ pub use staking::{ AllDelegationsResponse, AllValidatorsResponse, BondedDenomResponse, Delegation, DelegationResponse, FullDelegation, StakingQuery, Validator, ValidatorResponse, }; +#[cfg(feature = "cosmwasm_1_2")] +pub use wasm::CodeInfoResponse; pub use wasm::{ContractInfoResponse, WasmQuery}; #[non_exhaustive] diff --git a/packages/std/src/query/wasm.rs b/packages/std/src/query/wasm.rs index 2be597ae65..3cd5cb2378 100644 --- a/packages/std/src/query/wasm.rs +++ b/packages/std/src/query/wasm.rs @@ -26,6 +26,9 @@ pub enum WasmQuery { }, /// Returns a [`ContractInfoResponse`] with metadata on the contract from the runtime ContractInfo { contract_addr: String }, + /// Returns a [`CodeInfoResponse`] with metadata of the code + #[cfg(feature = "cosmwasm_1_2")] + CodeInfo { code_id: u64 }, } #[non_exhaustive] @@ -61,3 +64,23 @@ impl ContractInfoResponse { } } } + +/// The essential data from wasmd's [CodeInfo]/[CodeInfoResponse]. +/// +/// `code_hash`/`data_hash` was renamed to `checksum` to follow the CosmWasm +/// convention and naming in `instantiate2_address`. +/// +/// [CodeInfo]: https://github.com/CosmWasm/wasmd/blob/v0.30.0/proto/cosmwasm/wasm/v1/types.proto#L62-L72 +/// [CodeInfoResponse]: https://github.com/CosmWasm/wasmd/blob/v0.30.0/proto/cosmwasm/wasm/v1/query.proto#L184-L199 +#[non_exhaustive] +#[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] +#[cfg(feature = "cosmwasm_1_2")] +pub struct CodeInfoResponse { + /// The address that initially stored the code + pub creator: String, + /// The hash of the Wasm blob + pub checksum: Binary, +} + +#[cfg(feature = "cosmwasm_1_2")] +impl QueryResponseType for CodeInfoResponse {} diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 1417b93d1f..41a64e0001 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -562,13 +562,22 @@ impl WasmQuerier { impl Default for WasmQuerier { fn default() -> Self { let handler = Box::from(|request: &WasmQuery| -> QuerierResult { - let addr = match request { - WasmQuery::Smart { contract_addr, .. } => contract_addr, - WasmQuery::Raw { contract_addr, .. } => contract_addr, - WasmQuery::ContractInfo { contract_addr, .. } => contract_addr, - } - .clone(); - SystemResult::Err(SystemError::NoSuchContract { addr }) + let err = match request { + WasmQuery::Smart { contract_addr, .. } => SystemError::NoSuchContract { + addr: contract_addr.clone(), + }, + WasmQuery::Raw { contract_addr, .. } => SystemError::NoSuchContract { + addr: contract_addr.clone(), + }, + WasmQuery::ContractInfo { contract_addr, .. } => SystemError::NoSuchContract { + addr: contract_addr.clone(), + }, + #[cfg(feature = "cosmwasm_1_2")] + WasmQuery::CodeInfo { code_id, .. } => { + SystemError::NoSuchCode { code_id: *code_id } + } + }; + SystemResult::Err(err) }); Self::new(handler) } From e92c8e506778b9c90185c703fbdade50e74fd67a Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 3 Jan 2023 14:57:41 +0100 Subject: [PATCH 0095/2372] Fix WasmQuery::CodeInfo testing code --- packages/std/src/testing/mock.rs | 48 ++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 41a64e0001..598881782b 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -1390,7 +1390,7 @@ mod tests { let any_addr = "foo".to_string(); - // Query WasmQuery::Raw + // By default, querier errors for WasmQuery::Raw let system_err = querier .query(&WasmQuery::Raw { contract_addr: any_addr.clone(), @@ -1402,7 +1402,7 @@ mod tests { err => panic!("Unexpected error: {:?}", err), } - // Query WasmQuery::Smart + // By default, querier errors for WasmQuery::Smart let system_err = querier .query(&WasmQuery::Smart { contract_addr: any_addr.clone(), @@ -1414,7 +1414,7 @@ mod tests { err => panic!("Unexpected error: {:?}", err), } - // Query WasmQuery::ContractInfo + // By default, querier errors for WasmQuery::ContractInfo let system_err = querier .query(&WasmQuery::ContractInfo { contract_addr: any_addr.clone(), @@ -1425,6 +1425,18 @@ mod tests { err => panic!("Unexpected error: {:?}", err), } + #[cfg(feature = "cosmwasm_1_2")] + { + // By default, querier errors for WasmQuery::CodeInfo + let system_err = querier + .query(&WasmQuery::CodeInfo { code_id: 4 }) + .unwrap_err(); + match system_err { + SystemError::NoSuchCode { code_id } => assert_eq!(code_id, 4), + err => panic!("Unexpected error: {:?}", err), + } + } + querier.update_handler(|request| { let constract1 = Addr::unchecked("contract1"); let mut storage1 = HashMap::::default(); @@ -1478,6 +1490,23 @@ mod tests { }) } } + #[cfg(feature = "cosmwasm_1_2")] + WasmQuery::CodeInfo { code_id } => { + let code_id = *code_id; + if code_id == 4 { + use crate::CodeInfoResponse; + let response = CodeInfoResponse { + creator: "lalala".into(), + checksum: Binary::from_base64( + "hM8ggQ/UKcr1iJjDIQ/LcXWaJ77N2uCNvehmjqL0cl0=", + ) + .unwrap(), + }; + SystemResult::Ok(ContractResult::Ok(to_binary(&response).unwrap())) + } else { + SystemResult::Err(SystemError::NoSuchCode { code_id }) + } + } } }); @@ -1534,6 +1563,19 @@ mod tests { ), res => panic!("Unexpected result: {:?}", res), } + + // WasmQuery::ContractInfo + #[cfg(feature = "cosmwasm_1_2")] + { + let result = querier.query(&WasmQuery::CodeInfo { code_id: 4 }); + match result { + SystemResult::Ok(ContractResult::Ok(value)) => assert_eq!( + value, + br#"{"creator":"lalala","checksum":"hM8ggQ/UKcr1iJjDIQ/LcXWaJ77N2uCNvehmjqL0cl0="}"# + ), + res => panic!("Unexpected result: {:?}", res), + } + } } #[test] From 910f85370eea58c705b9e59db56e438542c1d02d Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 3 Jan 2023 18:16:15 +0100 Subject: [PATCH 0096/2372] Add query_wasm_code_info to querier --- packages/std/src/traits.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 57bd5d81b2..e3ba067b6e 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -8,6 +8,8 @@ use crate::coin::Coin; use crate::errors::{RecoverPubkeyError, StdError, StdResult, VerificationError}; #[cfg(feature = "iterator")] use crate::iterator::{Order, Record}; +#[cfg(feature = "cosmwasm_1_2")] +use crate::query::CodeInfoResponse; #[cfg(feature = "cosmwasm_1_1")] use crate::query::SupplyResponse; use crate::query::{ @@ -304,6 +306,13 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { self.query(&request) } + /// Given a code ID, query information about that code. + #[cfg(feature = "cosmwasm_1_2")] + pub fn query_wasm_code_info(&self, code_id: u64) -> StdResult { + let request = WasmQuery::CodeInfo { code_id }.into(); + self.query(&request) + } + #[cfg(feature = "staking")] pub fn query_all_validators(&self) -> StdResult> { let request = StakingQuery::AllValidators {}.into(); From e41df95bc01e1bb53c1dea39cc9df7cd57ad3cf1 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 5 Jan 2023 16:03:56 +0100 Subject: [PATCH 0097/2372] Add code_id to CodeInfoResponse --- packages/std/src/query/wasm.rs | 1 + packages/std/src/testing/mock.rs | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/std/src/query/wasm.rs b/packages/std/src/query/wasm.rs index 3cd5cb2378..54442a0d34 100644 --- a/packages/std/src/query/wasm.rs +++ b/packages/std/src/query/wasm.rs @@ -76,6 +76,7 @@ impl ContractInfoResponse { #[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] #[cfg(feature = "cosmwasm_1_2")] pub struct CodeInfoResponse { + pub code_id: u64, /// The address that initially stored the code pub creator: String, /// The hash of the Wasm blob diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 598881782b..03ab1d0936 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -1496,6 +1496,7 @@ mod tests { if code_id == 4 { use crate::CodeInfoResponse; let response = CodeInfoResponse { + code_id, creator: "lalala".into(), checksum: Binary::from_base64( "hM8ggQ/UKcr1iJjDIQ/LcXWaJ77N2uCNvehmjqL0cl0=", @@ -1571,7 +1572,7 @@ mod tests { match result { SystemResult::Ok(ContractResult::Ok(value)) => assert_eq!( value, - br#"{"creator":"lalala","checksum":"hM8ggQ/UKcr1iJjDIQ/LcXWaJ77N2uCNvehmjqL0cl0="}"# + br#"{"code_id":4,"creator":"lalala","checksum":"hM8ggQ/UKcr1iJjDIQ/LcXWaJ77N2uCNvehmjqL0cl0="}"# ), res => panic!("Unexpected result: {:?}", res), } From afd3c34657705595ee8d847baf3d1680da2acd54 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 5 Jan 2023 16:06:34 +0100 Subject: [PATCH 0098/2372] Test cosmwasm_1_1,cosmwasm_1_2 in local cosmwasm-std testing --- devtools/test_workspace.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devtools/test_workspace.sh b/devtools/test_workspace.sh index 0fdcfb2012..f1790536e0 100755 --- a/devtools/test_workspace.sh +++ b/devtools/test_workspace.sh @@ -4,7 +4,7 @@ command -v shellcheck >/dev/null && shellcheck "$0" cargo fmt (cd packages/crypto && cargo test) -(cd packages/std && cargo test --features iterator) +(cd packages/std && cargo test --features iterator,cosmwasm_1_1,cosmwasm_1_2) (cd packages/storage && cargo test --features iterator) (cd packages/schema && cargo test) (cd packages/schema-derive && cargo test) From 224b80c2fb40f56547ed1344aef82b0589ee018c Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 5 Jan 2023 16:10:54 +0100 Subject: [PATCH 0099/2372] Make checksum HexBinary --- packages/std/src/query/wasm.rs | 4 +++- packages/std/src/testing/mock.rs | 8 ++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/std/src/query/wasm.rs b/packages/std/src/query/wasm.rs index 54442a0d34..13070c18f1 100644 --- a/packages/std/src/query/wasm.rs +++ b/packages/std/src/query/wasm.rs @@ -2,6 +2,8 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use crate::Binary; +#[cfg(feature = "cosmwasm_1_2")] +use crate::HexBinary; use super::query_response::QueryResponseType; @@ -80,7 +82,7 @@ pub struct CodeInfoResponse { /// The address that initially stored the code pub creator: String, /// The hash of the Wasm blob - pub checksum: Binary, + pub checksum: HexBinary, } #[cfg(feature = "cosmwasm_1_2")] diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 03ab1d0936..023ef30ff8 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -1492,14 +1492,14 @@ mod tests { } #[cfg(feature = "cosmwasm_1_2")] WasmQuery::CodeInfo { code_id } => { + use crate::{CodeInfoResponse, HexBinary}; let code_id = *code_id; if code_id == 4 { - use crate::CodeInfoResponse; let response = CodeInfoResponse { code_id, creator: "lalala".into(), - checksum: Binary::from_base64( - "hM8ggQ/UKcr1iJjDIQ/LcXWaJ77N2uCNvehmjqL0cl0=", + checksum: HexBinary::from_hex( + "84cf20810fd429caf58898c3210fcb71759a27becddae08dbde8668ea2f4725d", ) .unwrap(), }; @@ -1572,7 +1572,7 @@ mod tests { match result { SystemResult::Ok(ContractResult::Ok(value)) => assert_eq!( value, - br#"{"code_id":4,"creator":"lalala","checksum":"hM8ggQ/UKcr1iJjDIQ/LcXWaJ77N2uCNvehmjqL0cl0="}"# + br#"{"code_id":4,"creator":"lalala","checksum":"84cf20810fd429caf58898c3210fcb71759a27becddae08dbde8668ea2f4725d"}"# ), res => panic!("Unexpected result: {:?}", res), } From d980067810d18723f75cdb47bd1166625087c45d Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 3 Jan 2023 18:16:58 +0100 Subject: [PATCH 0100/2372] Export Instantiate2AddressError and make it usable --- packages/std/src/addresses.rs | 12 +++++++++++- packages/std/src/lib.rs | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index 880e2171b7..39a4719291 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -7,6 +7,7 @@ use sha2::{ use std::borrow::Cow; use std::fmt; use std::ops::Deref; +use thiserror::Error; use crate::{binary::Binary, HexBinary}; @@ -275,7 +276,7 @@ impl fmt::Display for CanonicalAddr { } } -#[derive(Debug)] +#[derive(Error, Debug, PartialEq, Eq)] pub enum Instantiate2AddressError { /// Checksum must be 32 bytes InvalidChecksumLength, @@ -283,6 +284,15 @@ pub enum Instantiate2AddressError { InvalidSaltLength, } +impl fmt::Display for Instantiate2AddressError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + Instantiate2AddressError::InvalidChecksumLength => write!(f, "invalid checksum length"), + Instantiate2AddressError::InvalidSaltLength => write!(f, "invalid salt length"), + } + } +} + /// Creates a contract address using the predictable address format introduced with /// wasmd 0.29. When using instantiate2, this is a way to precompute the address. /// When using instantiate, the contract address will use a different algorithm and diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index d40d25d68f..a15f0f4c62 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -26,7 +26,7 @@ mod timestamp; mod traits; mod types; -pub use crate::addresses::{instantiate2_address, Addr, CanonicalAddr}; +pub use crate::addresses::{instantiate2_address, Addr, CanonicalAddr, Instantiate2AddressError}; pub use crate::binary::Binary; pub use crate::coin::{coin, coins, has_coins, Coin}; pub use crate::deps::{Deps, DepsMut, OwnedDeps}; From e86d906d9728ed2b6c9572a8ee45ae16ea9bb16c Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 3 Jan 2023 18:33:36 +0100 Subject: [PATCH 0101/2372] Add virus contract --- contracts/README.md | 8 + contracts/virus/.cargo/config | 6 + contracts/virus/Cargo.lock | 1936 +++++++++++++++++++ contracts/virus/Cargo.toml | 42 + contracts/virus/README.md | 3 + contracts/virus/schema/raw/execute.json | 35 + contracts/virus/schema/raw/instantiate.json | 6 + contracts/virus/schema/virus.json | 50 + contracts/virus/src/bin/schema.rs | 10 + contracts/virus/src/contract.rs | 99 + contracts/virus/src/errors.rs | 11 + contracts/virus/src/lib.rs | 3 + contracts/virus/src/msg.rs | 15 + contracts/virus/tests/integration.rs | 1 + 14 files changed, 2225 insertions(+) create mode 100644 contracts/virus/.cargo/config create mode 100644 contracts/virus/Cargo.lock create mode 100644 contracts/virus/Cargo.toml create mode 100644 contracts/virus/README.md create mode 100644 contracts/virus/schema/raw/execute.json create mode 100644 contracts/virus/schema/raw/instantiate.json create mode 100644 contracts/virus/schema/virus.json create mode 100644 contracts/virus/src/bin/schema.rs create mode 100644 contracts/virus/src/contract.rs create mode 100644 contracts/virus/src/errors.rs create mode 100644 contracts/virus/src/lib.rs create mode 100644 contracts/virus/src/msg.rs create mode 100644 contracts/virus/tests/integration.rs diff --git a/contracts/README.md b/contracts/README.md index cb89fc0039..1f581ed2e0 100644 --- a/contracts/README.md +++ b/contracts/README.md @@ -36,6 +36,8 @@ Introducing the development contracts in the order they were created. 9. **cyberpunk** is an attempt to cleanup hackatom and make writing runtime tests (cosmwasm-vm/wamsmvm) easier by avoid the need for the escrow setup that hackatom has. +10. **virus** is a contract that reproduces itself and does nothing useful + beyond that, showing how to use instantiate2 from a contract. ## Optimized builds @@ -92,6 +94,11 @@ docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_staking",target=/code/contracts/staking/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ cosmwasm/rust-optimizer:0.12.9 ./contracts/staking + +docker run --rm -v "$(pwd)":/code \ + --mount type=volume,source="devcontract_cache_virus",target=/code/contracts/virus/target \ + --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ + cosmwasm/rust-optimizer:0.12.9 ./contracts/virus ``` ## Entry points @@ -107,3 +114,4 @@ points in order to demonstrate and test the flexibility we have. | queue | yes | yes | | reflect | yes | no | | staking | yes | no | +| virus | no | no | diff --git a/contracts/virus/.cargo/config b/contracts/virus/.cargo/config new file mode 100644 index 0000000000..f5174787c2 --- /dev/null +++ b/contracts/virus/.cargo/config @@ -0,0 +1,6 @@ +[alias] +wasm = "build --release --lib --target wasm32-unknown-unknown" +wasm-debug = "build --lib --target wasm32-unknown-unknown" +unit-test = "test --lib" +integration-test = "test --test integration" +schema = "run --bin schema" diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock new file mode 100644 index 0000000000..c46c654d81 --- /dev/null +++ b/contracts/virus/Cargo.lock @@ -0,0 +1,1936 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a2e47a1fbe209ee101dd6d61285226744c6c8d3c21c8dc878ba6cb9f467f3a" +dependencies = [ + "gimli 0.24.0", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom 0.2.3", + "once_cell", + "version_check", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7815ea54e4d821e791162e078acbebfd6d8c8939cd559c9335dceb1c8ca7282" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object 0.25.3", + "rustc-demangle", +] + +[[package]] +name = "base16ct" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + +[[package]] +name = "base64ct" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea908e7347a8c64e378c17e30ef880ad73e3b4498346b055c2c00ea342f3179" + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9df67f7bf9ef8498769f994239c45613ef0c5899415fb58e9add412d2c1a538" + +[[package]] +name = "bytecheck" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "314889ea31cda264cb7c3d6e6e5c9415a987ecb0e72c17c00d36fbb881d34abe" +dependencies = [ + "bytecheck_derive", + "ptr_meta", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a2b3b92c135dae665a6f760205b89187638e83bed17ef3e44e83c712cf30600" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "cc" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70cc2f62c6ce1868963827bd677764c62d07c3d9a3e1fb1177ee1a9ab199eb2" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clru" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" + +[[package]] +name = "const-oid" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "722e23542a15cea1f65d4a1419c4cfd7a26706c70871a13a04238ca3f40f1661" + +[[package]] +name = "corosensei" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9847f90f32a50b0dcbd68bc23ff242798b13080b97b0569f6ed96a45ce4cf2cd" +dependencies = [ + "autocfg", + "cfg-if", + "libc", + "scopeguard", + "windows-sys", +] + +[[package]] +name = "cosmwasm-crypto" +version = "1.2.0-beta.0" +dependencies = [ + "digest 0.10.3", + "ed25519-zebra", + "k256", + "rand_core 0.6.3", + "thiserror", +] + +[[package]] +name = "cosmwasm-derive" +version = "1.2.0-beta.0" +dependencies = [ + "syn", +] + +[[package]] +name = "cosmwasm-schema" +version = "1.2.0-beta.0" +dependencies = [ + "cosmwasm-schema-derive", + "schemars", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cosmwasm-schema-derive" +version = "1.2.0-beta.0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "cosmwasm-std" +version = "1.2.0-beta.0" +dependencies = [ + "base64", + "cosmwasm-crypto", + "cosmwasm-derive", + "derivative", + "forward_ref", + "hex", + "schemars", + "serde", + "serde-json-wasm", + "sha2 0.10.3", + "thiserror", + "uint", +] + +[[package]] +name = "cosmwasm-vm" +version = "1.2.0-beta.0" +dependencies = [ + "bitflags", + "bytecheck", + "clru", + "cosmwasm-crypto", + "cosmwasm-std", + "enumset", + "hex", + "loupe", + "parity-wasm", + "schemars", + "serde", + "serde_json", + "sha2 0.10.3", + "thiserror", + "wasmer", + "wasmer-middlewares", +] + +[[package]] +name = "cpufeatures" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66c99696f6c9dd7f35d486b9d04d7e6e202aa3e8c40d553f2fdf5e7e0c6a71ef" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +dependencies = [ + "libc", +] + +[[package]] +name = "cranelift-bforest" +version = "0.82.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38faa2a16616c8e78a18d37b4726b98bfd2de192f2fdc8a39ddf568a408a0f75" +dependencies = [ + "cranelift-entity", +] + +[[package]] +name = "cranelift-codegen" +version = "0.82.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26f192472a3ba23860afd07d2b0217dc628f21fcc72617aa1336d98e1671f33b" +dependencies = [ + "cranelift-bforest", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-entity", + "gimli 0.26.1", + "log", + "regalloc", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.82.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f32ddb89e9b89d3d9b36a5b7d7ea3261c98235a76ac95ba46826b8ec40b1a24" +dependencies = [ + "cranelift-codegen-shared", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.82.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01fd0d9f288cc1b42d9333b7a776b17e278fc888c28e6a0f09b5573d45a150bc" + +[[package]] +name = "cranelift-entity" +version = "0.82.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3bfe172b83167604601faf9dc60453e0d0a93415b57a9c4d1a7ae6849185cf" + +[[package]] +name = "cranelift-frontend" +version = "0.82.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a006e3e32d80ce0e4ba7f1f9ddf66066d052a8c884a110b91d05404d6ce26dce" +dependencies = [ + "cranelift-codegen", + "log", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "crc32fast" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "lazy_static", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" +dependencies = [ + "cfg-if", + "lazy_static", +] + +[[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.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f2b443d17d49dad5ef0ede301c3179cc923b8822f3393b4d2c28c269dd4a122" +dependencies = [ + "generic-array", + "rand_core 0.6.3", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "curve25519-dalek" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "639891fde0dbea823fc3d798a0fdf9d2f9440a42d64a78ab3488b0ca025117b3" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "darling" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "757c0ded2af11d8e739c4daea1ac623dd1624b06c844cf3f5a39f1bdbd99bb12" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c34d8efb62d0c2d7f60ece80f75e5c63c1588ba68032740494b0b9a996466e3" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade7bff147130fe5e6d39f089c6bd49ec0250f35d70b2eebf72afdfc919f15cc" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "der" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dd2ae565c0a381dde7fade45fce95984c568bdcb4700a4fdbe3175e0380b2f" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +dependencies = [ + "block-buffer 0.10.2", + "crypto-common", + "subtle", +] + +[[package]] +name = "dyn-clone" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee2626afccd7561a06cf1367e2950c4718ea04565e20fb5029b6c7d8ad09abcf" + +[[package]] +name = "dynasm" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "add9a102807b524ec050363f09e06f1504214b0e1c7797f64261c891022dce8b" +dependencies = [ + "bitflags", + "byteorder", + "lazy_static", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dynasmrt" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64fba5a42bd76a17cad4bfa00de168ee1cbfa06a5e8ce992ae880218c05641a9" +dependencies = [ + "byteorder", + "dynasm", + "memmap2", +] + +[[package]] +name = "ecdsa" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bd46e0c364655e5baf2f5e99b603e7a09905da9966d7928d7470af393b28670" +dependencies = [ + "der", + "elliptic-curve", + "rfc6979", + "signature", +] + +[[package]] +name = "ed25519-zebra" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "403ef3e961ab98f0ba902771d29f842058578bb1ce7e3c59dad5a6a93e784c69" +dependencies = [ + "curve25519-dalek", + "hex", + "rand_core 0.6.3", + "serde", + "sha2 0.9.5", + "thiserror", + "zeroize", +] + +[[package]] +name = "either" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" + +[[package]] +name = "elliptic-curve" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c47abd0a791d2ac0c7aa1118715f85b83689e4522c4e3a244e159d4fc9848a8d" +dependencies = [ + "base16ct", + "crypto-bigint", + "der", + "digest 0.10.3", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.3", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "enum-iterator" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eeac5c5edb79e4e39fe8439ef35207780a11f69c52cbe424ce3dfad4cb78de6" +dependencies = [ + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "enumset" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e76129da36102af021b8e5000dab2c1c30dbef85c1e482beeff8da5dde0e0b0" +dependencies = [ + "enumset_derive", +] + +[[package]] +name = "enumset_derive" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6451128aa6655d880755345d085494cf7561a6bee7c8dc821e5d77e6d267ecd4" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + +[[package]] +name = "ff" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df689201f395c6b90dfe87127685f8dbfc083a5e779e613575d8bd7314300c3e" +dependencies = [ + "rand_core 0.6.3", + "subtle", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "forward_ref" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" + +[[package]] +name = "generic-array" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", +] + +[[package]] +name = "gimli" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189" + +[[package]] +name = "gimli" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" +dependencies = [ + "fallible-iterator", + "indexmap", + "stable_deref_trait", +] + +[[package]] +name = "group" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7391856def869c1c81063a03457c676fbcd419709c3dfb33d8d319de484b154d" +dependencies = [ + "ff", + "rand_core 0.6.3", + "subtle", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c21d40587b92fa6a6c6e3c1bdbf87d75511db5672f9c93175574b3a00df1758" +dependencies = [ + "ahash", +] + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.3", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "indexmap" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +dependencies = [ + "autocfg", + "hashbrown 0.11.2", + "serde", +] + +[[package]] +name = "itoa" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" + +[[package]] +name = "js-sys" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "k256" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c8a5a96d92d849c4499d99461da81c9cdc1467418a8ed2aaeb407e8d85940ed" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "sha2 0.10.3", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "leb128" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3576a87f2ba00f6f106fdfcd16db1d698d648a26ad8e0573cad8537c3c362d2a" + +[[package]] +name = "libc" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" + +[[package]] +name = "libloading" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "loupe" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" +dependencies = [ + "indexmap", + "loupe-derive", + "rustversion", +] + +[[package]] +name = "loupe-derive" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fbfc88337168279f2e9ae06e157cfed4efd3316e14dc96ed074d4f2e6c5952" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + +[[package]] +name = "memmap2" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4647a11b578fead29cdbb34d4adef8dd3dc35b876c9c6d5240d83f205abfe96e" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg", +] + +[[package]] +name = "more-asserts" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" + +[[package]] +name = "num_cpus" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a38f2be3697a57b4060074ff41b44c16870d916ad7877c17696e063257482bc7" +dependencies = [ + "memchr", +] + +[[package]] +name = "object" +version = "0.28.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40bec70ba014595f99f7aa110b84331ffe1ee9aece7fe6f387cc7e3ecda4d456" +dependencies = [ + "crc32fast", + "hashbrown 0.11.2", + "indexmap", + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "parity-wasm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" + +[[package]] +name = "pin-project-lite" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" + +[[package]] +name = "pkcs8" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "quote" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +dependencies = [ + "libc", + "rand_chacha", + "rand_core 0.6.3", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.3", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom 0.2.3", +] + +[[package]] +name = "rand_hc" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" +dependencies = [ + "rand_core 0.6.3", +] + +[[package]] +name = "rayon" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" +dependencies = [ + "autocfg", + "crossbeam-deque", + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "lazy_static", + "num_cpus", +] + +[[package]] +name = "redox_syscall" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regalloc" +version = "0.0.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62446b1d3ebf980bdc68837700af1d77b37bc430e524bf95319c6eada2a4cc02" +dependencies = [ + "log", + "rustc-hash", + "smallvec", +] + +[[package]] +name = "region" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76e189c2369884dce920945e2ddf79b3dff49e071a167dd1817fa9c4c00d512e" +dependencies = [ + "bitflags", + "libc", + "mach", + "winapi", +] + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + +[[package]] +name = "rend" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79af64b4b6362ffba04eef3a4e10829718a4896dac19daa741851c86781edf95" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "rfc6979" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88c86280f057430a52f4861551b092a01b419b8eacefc7c995eacb9dc132fe32" +dependencies = [ + "crypto-bigint", + "hmac", + "zeroize", +] + +[[package]] +name = "rkyv" +version = "0.7.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5230ae2981a885590b0dc84e0b24c0ed23ad24f7adc0eb824b26cafa961f7c36" +dependencies = [ + "bytecheck", + "hashbrown 0.12.0", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc752d5925dbcb324522f3a4c93193d17f107b2e11810913aa3ad352fa01480" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustversion" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" + +[[package]] +name = "ryu" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" + +[[package]] +name = "schemars" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a48d098c2a7fdf5740b19deb1181b4fb8a9e68e03ae517c14cde04b5725409" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9ea2a613fe4cd7118b2bb101a25d8ae6192e1975179b67b2f17afd11e70ac8" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "sec1" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "serde" +version = "1.0.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-json-wasm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_bytes" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_derive_internals" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b362ae5752fd2137731f9fa25fd4d9058af34666ca1966fb969119cc35719f12" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures 0.1.5", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899bf02746a2c92bf1053d9327dadb252b01af1f81f90cdb902411f518bc7215" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.2", + "digest 0.10.3", +] + +[[package]] +name = "signature" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f054c6c1a6e95179d6f23ed974060dcefb2d9388bb7256900badad682c499de4" +dependencies = [ + "digest 0.10.3", + "rand_core 0.6.3", +] + +[[package]] +name = "smallvec" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" + +[[package]] +name = "spki" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "syn" +version = "1.0.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "target-lexicon" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9bffcddbc2458fa3e6058414599e3c838a022abae82e5c67b4f7f80298d5bff" + +[[package]] +name = "tempfile" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" +dependencies = [ + "cfg-if", + "libc", + "rand", + "redox_syscall", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "thiserror" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" +dependencies = [ + "cfg-if", + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9ff14f98b1a4b289c6248a023c1c2fa1491062964e9fed67ab29c4e4da4a052" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + +[[package]] +name = "uint" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f03af7ccf01dd611cc450a0d10dbc9b745770d096473e2faf0ca6e2d66d1e0" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "version_check" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" + +[[package]] +name = "virus" +version = "0.0.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cosmwasm-vm", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "wasm-bindgen" +version = "0.2.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" + +[[package]] +name = "wasmer" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea8d8361c9d006ea3d7797de7bd6b1492ffd0f91a22430cfda6c1658ad57bedf" +dependencies = [ + "cfg-if", + "indexmap", + "js-sys", + "loupe", + "more-asserts", + "target-lexicon", + "thiserror", + "wasm-bindgen", + "wasmer-artifact", + "wasmer-compiler", + "wasmer-compiler-cranelift", + "wasmer-compiler-singlepass", + "wasmer-derive", + "wasmer-engine", + "wasmer-engine-dylib", + "wasmer-engine-universal", + "wasmer-types", + "wasmer-vm", + "winapi", +] + +[[package]] +name = "wasmer-artifact" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aaf9428c29c1d8ad2ac0e45889ba8a568a835e33fd058964e5e500f2f7ce325" +dependencies = [ + "enumset", + "loupe", + "thiserror", + "wasmer-compiler", + "wasmer-types", +] + +[[package]] +name = "wasmer-compiler" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67a6cd866aed456656db2cfea96c18baabbd33f676578482b85c51e1ee19d2c" +dependencies = [ + "enumset", + "loupe", + "rkyv", + "serde", + "serde_bytes", + "smallvec", + "target-lexicon", + "thiserror", + "wasmer-types", + "wasmparser", +] + +[[package]] +name = "wasmer-compiler-cranelift" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48be2f9f6495f08649e4f8b946a2cbbe119faf5a654aa1457f9504a99d23dae0" +dependencies = [ + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "gimli 0.26.1", + "loupe", + "more-asserts", + "rayon", + "smallvec", + "target-lexicon", + "tracing", + "wasmer-compiler", + "wasmer-types", +] + +[[package]] +name = "wasmer-compiler-singlepass" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29ca2a35204d8befa85062bc7aac259a8db8070b801b8a783770ba58231d729e" +dependencies = [ + "byteorder", + "dynasm", + "dynasmrt", + "gimli 0.26.1", + "lazy_static", + "loupe", + "more-asserts", + "rayon", + "smallvec", + "wasmer-compiler", + "wasmer-types", +] + +[[package]] +name = "wasmer-derive" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00e50405cc2a2f74ff574584710a5f2c1d5c93744acce2ca0866084739284b51" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "wasmer-engine" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f98f010978c244db431b392aeab0661df7ea0822343334f8f2a920763548e45" +dependencies = [ + "backtrace", + "enumset", + "lazy_static", + "loupe", + "memmap2", + "more-asserts", + "rustc-demangle", + "serde", + "serde_bytes", + "target-lexicon", + "thiserror", + "wasmer-artifact", + "wasmer-compiler", + "wasmer-types", + "wasmer-vm", +] + +[[package]] +name = "wasmer-engine-dylib" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0358af9c154724587731175553805648d9acb8f6657880d165e378672b7e53" +dependencies = [ + "cfg-if", + "enum-iterator", + "enumset", + "leb128", + "libloading", + "loupe", + "object 0.28.3", + "rkyv", + "serde", + "tempfile", + "tracing", + "wasmer-artifact", + "wasmer-compiler", + "wasmer-engine", + "wasmer-object", + "wasmer-types", + "wasmer-vm", + "which", +] + +[[package]] +name = "wasmer-engine-universal" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "440dc3d93c9ca47865a4f4edd037ea81bf983b5796b59b3d712d844b32dbef15" +dependencies = [ + "cfg-if", + "enumset", + "leb128", + "loupe", + "region", + "rkyv", + "wasmer-compiler", + "wasmer-engine", + "wasmer-engine-universal-artifact", + "wasmer-types", + "wasmer-vm", + "winapi", +] + +[[package]] +name = "wasmer-engine-universal-artifact" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f1db3f54152657eb6e86c44b66525ff7801dad8328fe677da48dd06af9ad41" +dependencies = [ + "enum-iterator", + "enumset", + "loupe", + "rkyv", + "thiserror", + "wasmer-artifact", + "wasmer-compiler", + "wasmer-types", +] + +[[package]] +name = "wasmer-middlewares" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7812438ed2f37203a37007cdb5332b8475cb2b16e15d51299b2647894e9ed3a" +dependencies = [ + "loupe", + "wasmer", + "wasmer-types", + "wasmer-vm", +] + +[[package]] +name = "wasmer-object" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d831335ff3a44ecf451303f6f891175c642488036b92ceceb24ac8623a8fa8b" +dependencies = [ + "object 0.28.3", + "thiserror", + "wasmer-compiler", + "wasmer-types", +] + +[[package]] +name = "wasmer-types" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39df01ea05dc0a9bab67e054c7cb01521e53b35a7bb90bd02eca564ed0b2667f" +dependencies = [ + "backtrace", + "enum-iterator", + "indexmap", + "loupe", + "more-asserts", + "rkyv", + "serde", + "thiserror", +] + +[[package]] +name = "wasmer-vm" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d965fa61f4dc4cdb35a54daaf7ecec3563fbb94154a6c35433f879466247dd" +dependencies = [ + "backtrace", + "cc", + "cfg-if", + "corosensei", + "enum-iterator", + "indexmap", + "lazy_static", + "libc", + "loupe", + "mach", + "memoffset", + "more-asserts", + "region", + "rkyv", + "scopeguard", + "serde", + "thiserror", + "wasmer-artifact", + "wasmer-types", + "winapi", +] + +[[package]] +name = "wasmparser" +version = "0.83.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a" + +[[package]] +name = "which" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55551e42cbdf2ce2bedd2203d0cc08dba002c27510f86dab6d0ce304cba3dfe" +dependencies = [ + "either", + "libc", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43dbb096663629518eb1dfa72d80243ca5a6aca764cae62a2df70af760a9be75" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" + +[[package]] +name = "windows_i686_gnu" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" + +[[package]] +name = "windows_i686_msvc" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" + +[[package]] +name = "zeroize" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" diff --git a/contracts/virus/Cargo.toml b/contracts/virus/Cargo.toml new file mode 100644 index 0000000000..24df513fab --- /dev/null +++ b/contracts/virus/Cargo.toml @@ -0,0 +1,42 @@ +[package] +name = "virus" +version = "0.0.0" +authors = ["Simon Warta "] +edition = "2021" +publish = false +license = "Apache-2.0" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +crate-type = ["cdylib", "rlib"] + +[profile.release] +opt-level = 3 +debug = false +rpath = false +lto = true +debug-assertions = false +codegen-units = 1 +panic = 'abort' +incremental = false +overflow-checks = true + +[features] +# Add feature "cranelift" to default if you need 32 bit or ARM support +default = [] +# Use cranelift backend instead of singlepass. This is required for development on 32 bit or ARM machines. +cranelift = ["cosmwasm-vm/cranelift"] +# for quicker tests, cargo test --lib +# for more explicit tests, cargo test --features=backtraces +backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] + +[dependencies] +cosmwasm-schema = { path = "../../packages/schema" } +cosmwasm-std = { path = "../../packages/std", features = ["cosmwasm_1_2"] } +schemars = "0.8.3" +serde = { version = "1.0.103", default-features = false, features = ["derive"] } +thiserror = "1.0.26" + +[dev-dependencies] +cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator"] } diff --git a/contracts/virus/README.md b/contracts/virus/README.md new file mode 100644 index 0000000000..497dbf17e3 --- /dev/null +++ b/contracts/virus/README.md @@ -0,0 +1,3 @@ +# Virus contract + +A contract that clones itself over various levels. diff --git a/contracts/virus/schema/raw/execute.json b/contracts/virus/schema/raw/execute.json new file mode 100644 index 0000000000..0c6d37f103 --- /dev/null +++ b/contracts/virus/schema/raw/execute.json @@ -0,0 +1,35 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "type": "object", + "required": [ + "spread" + ], + "properties": { + "spread": { + "type": "object", + "required": [ + "levels", + "parent_path" + ], + "properties": { + "levels": { + "description": "The number of levels of spreading. When set to 0, the contract performs a no-op.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "parent_path": { + "description": "A slash separated path to the instance creating this one. The root is the empty string.", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/contracts/virus/schema/raw/instantiate.json b/contracts/virus/schema/raw/instantiate.json new file mode 100644 index 0000000000..1352613d57 --- /dev/null +++ b/contracts/virus/schema/raw/instantiate.json @@ -0,0 +1,6 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "InstantiateMsg", + "type": "object", + "additionalProperties": false +} diff --git a/contracts/virus/schema/virus.json b/contracts/virus/schema/virus.json new file mode 100644 index 0000000000..71f03d0963 --- /dev/null +++ b/contracts/virus/schema/virus.json @@ -0,0 +1,50 @@ +{ + "contract_name": "virus", + "contract_version": "0.0.0", + "idl_version": "1.0.0", + "instantiate": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "InstantiateMsg", + "type": "object", + "additionalProperties": false + }, + "execute": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "type": "object", + "required": [ + "spread" + ], + "properties": { + "spread": { + "type": "object", + "required": [ + "levels", + "parent_path" + ], + "properties": { + "levels": { + "description": "The number of levels of spreading. When set to 0, the contract performs a no-op.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "parent_path": { + "description": "A slash separated path to the instance creating this one. The root is the empty string.", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + "query": null, + "migrate": null, + "sudo": null, + "responses": null +} diff --git a/contracts/virus/src/bin/schema.rs b/contracts/virus/src/bin/schema.rs new file mode 100644 index 0000000000..3417811600 --- /dev/null +++ b/contracts/virus/src/bin/schema.rs @@ -0,0 +1,10 @@ +use cosmwasm_schema::write_api; + +use virus::msg::{ExecuteMsg, InstantiateMsg}; + +fn main() { + write_api! { + instantiate: InstantiateMsg, + execute: ExecuteMsg, + } +} diff --git a/contracts/virus/src/contract.rs b/contracts/virus/src/contract.rs new file mode 100644 index 0000000000..dabd590cbd --- /dev/null +++ b/contracts/virus/src/contract.rs @@ -0,0 +1,99 @@ +use cosmwasm_std::{ + entry_point, instantiate2_address, to_binary, Attribute, Binary, CodeInfoResponse, + ContractInfoResponse, DepsMut, Env, MessageInfo, Response, StdError, StdResult, WasmMsg, +}; + +use crate::errors::ContractError; +use crate::msg::{ExecuteMsg, InstantiateMsg}; + +#[entry_point] +pub fn instantiate( + _deps: DepsMut, + _env: Env, + _info: MessageInfo, + _msg: InstantiateMsg, +) -> StdResult { + Err(StdError::generic_err( + "You can only use this contract for migrations", + )) +} + +#[entry_point] +pub fn execute( + deps: DepsMut, + env: Env, + info: MessageInfo, + msg: ExecuteMsg, +) -> Result { + match msg { + ExecuteMsg::Spread { + parent_path, + levels, + } => execute_spread(deps, env, info, parent_path, levels), + } +} + +/// Basic reproduction number +const R0: u32 = 2; + +pub fn execute_spread( + deps: DepsMut, + env: Env, + _info: MessageInfo, + parent_path: String, + levels: u32, +) -> Result { + if levels == 0 { + return Ok(Response::new()); + } + + let creator = deps.api.addr_canonicalize(env.contract.address.as_str())?; + let ContractInfoResponse { code_id, .. } = deps + .querier + .query_wasm_contract_info(env.contract.address)?; + let CodeInfoResponse { checksum, .. } = deps.querier.query_wasm_code_info(code_id)?; + + let mut msgs = Vec::::new(); + let mut attributes = Vec::::new(); + for i in 0..R0 { + let path = format!("{parent_path}/{i}"); + let label = format!("Instance {path}"); + let salt = Binary::from(path.as_bytes()); + + attributes.push(Attribute::new(format!("path{i}"), path.clone())); + + let address = deps + .api + .addr_humanize(&instantiate2_address(&checksum, &creator, &salt)?)?; + attributes.push(Attribute::new( + format!("predicted_address{i}"), + address.clone(), + )); + + msgs.push(WasmMsg::Instantiate2 { + admin: None, + code_id, + label, + msg: to_binary(&InstantiateMsg {})?, + funds: vec![], + salt, + }); + + // we know the address of the newly instantiated contract, so let's execute it right away + msgs.push(WasmMsg::Execute { + contract_addr: address.into(), + msg: to_binary(&ExecuteMsg::Spread { + parent_path: path, + levels: levels - 1, + })?, + funds: vec![], + }); + } + + Ok(Response::new() + .add_attributes(attributes) + .add_messages(msgs)) +} + +#[cfg(test)] +mod tests {} diff --git a/contracts/virus/src/errors.rs b/contracts/virus/src/errors.rs new file mode 100644 index 0000000000..5a5361b574 --- /dev/null +++ b/contracts/virus/src/errors.rs @@ -0,0 +1,11 @@ +use cosmwasm_std::{Instantiate2AddressError, StdError}; +use thiserror::Error; + +#[derive(Error, Debug, PartialEq)] +pub enum ContractError { + #[error("{0}")] + /// this is needed so we can use `bucket.load(...)?` and have it auto-converted to the custom error + Std(#[from] StdError), + #[error("{0}")] + Instantiate2Address(#[from] Instantiate2AddressError), +} diff --git a/contracts/virus/src/lib.rs b/contracts/virus/src/lib.rs new file mode 100644 index 0000000000..33208e28f1 --- /dev/null +++ b/contracts/virus/src/lib.rs @@ -0,0 +1,3 @@ +pub mod contract; +mod errors; +pub mod msg; diff --git a/contracts/virus/src/msg.rs b/contracts/virus/src/msg.rs new file mode 100644 index 0000000000..cdf26cc717 --- /dev/null +++ b/contracts/virus/src/msg.rs @@ -0,0 +1,15 @@ +use cosmwasm_schema::cw_serde; + +#[cw_serde] +pub struct InstantiateMsg {} + +#[cw_serde] +pub enum ExecuteMsg { + Spread { + /// A slash separated path to the instance creating this one. + /// The root is the empty string. + parent_path: String, + /// The number of levels of spreading. When set to 0, the contract performs a no-op. + levels: u32, + }, +} diff --git a/contracts/virus/tests/integration.rs b/contracts/virus/tests/integration.rs new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/contracts/virus/tests/integration.rs @@ -0,0 +1 @@ + From af99739be4a9aab12ad858e71436df232e284b7f Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 5 Jan 2023 17:44:12 +0100 Subject: [PATCH 0102/2372] Test contract_virus in CI --- .circleci/config.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index ad9fc54090..9d3e0d6975 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -65,6 +65,7 @@ workflows: - contract_queue - contract_reflect - contract_staking + - contract_virus - fmt - fmt_extra - clippy: @@ -138,6 +139,9 @@ jobs: keys: - v4-arm64-contracts-rust:1.60.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} - v4-arm64-contracts-rust:1.60.0- + # Test a few contracts that do something potentially interesting in the VM + # to test contract execution on ARM64. + # No need to add all contracts here. - run: name: "contracts/crypto-verify: integration-test" working_directory: ~/project/contracts/crypto-verify @@ -761,6 +765,33 @@ jobs: - target/wasm32-unknown-unknown/release/deps key: cargocache-v2-contract_staking-rust:1.60.0-{{ checksum "Cargo.lock" }} + contract_virus: + docker: + - image: rust:1.60.0 + environment: + RUST_BACKTRACE: 1 + working_directory: ~/cosmwasm/contracts/virus + steps: + - checkout: + path: ~/cosmwasm + - run: + name: Version information + command: rustc --version; cargo --version; rustup --version + - restore_cache: + keys: + - cargocache-v2-contract_virus-rust:1.60.0-{{ checksum "Cargo.lock" }} + - check_contract + - save_cache: + paths: + - /usr/local/cargo/registry + - target/debug/.fingerprint + - target/debug/build + - target/debug/deps + - target/wasm32-unknown-unknown/release/.fingerprint + - target/wasm32-unknown-unknown/release/build + - target/wasm32-unknown-unknown/release/deps + key: cargocache-v2-contract_virus-rust:1.60.0-{{ checksum "Cargo.lock" }} + fmt: docker: - image: rust:1.60.0 From f1c2ef6392b2323df2c23c0eff35b6cbcf18786d Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 5 Jan 2023 18:07:43 +0100 Subject: [PATCH 0103/2372] Let feature cosmwasm_1_2 enable cosmwasm_1_1 in cosmwasm-std --- .circleci/config.yml | 10 +++++----- devtools/check_workspace.sh | 2 +- devtools/test_workspace.sh | 2 +- packages/std/Cargo.toml | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9d3e0d6975..3c01ff12e9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -362,15 +362,15 @@ jobs: - run: name: Build library for native target (all features) working_directory: ~/project/packages/std - command: cargo build --locked --features abort,iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2 + command: cargo build --locked --features abort,iterator,staking,stargate,cosmwasm_1_2 - run: name: Build library for wasm target (all features) working_directory: ~/project/packages/std - command: cargo wasm --locked --features abort,iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2 + command: cargo wasm --locked --features abort,iterator,staking,stargate,cosmwasm_1_2 - run: name: Run unit tests (all features) working_directory: ~/project/packages/std - command: cargo test --locked --features abort,iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2 + command: cargo test --locked --features abort,iterator,staking,stargate,cosmwasm_1_2 - save_cache: paths: - /usr/local/cargo/registry @@ -913,7 +913,7 @@ jobs: - run: name: Clippy linting on std (all feature flags) working_directory: ~/project/packages/std - command: cargo clippy --all-targets --features abort,iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2 -- -D warnings + command: cargo clippy --all-targets --features abort,iterator,staking,stargate,cosmwasm_1_2 -- -D warnings - run: name: Clippy linting on storage (no feature flags) working_directory: ~/project/packages/storage @@ -990,7 +990,7 @@ jobs: CRYPTO=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/crypto --packages cosmwasm-crypto" DERIVE=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/derive --packages cosmwasm-derive" SCHEMA=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/schema --packages cosmwasm-schema" - STD=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/std --packages cosmwasm-std --features abort,iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2" + STD=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/std --packages cosmwasm-std --features abort,iterator,staking,stargate,cosmwasm_1_2" STORAGE="cargo tarpaulin --skip-clean --out Xml --output-dir reports/storage --packages cosmwasm-storage" docker run --security-opt seccomp=unconfined -v "${PWD}:/volume" xd009642/tarpaulin:0.21.0 \ sh -c "$CRYPTO && $DERIVE && $SCHEMA && $STD && $STORAGE" diff --git a/devtools/check_workspace.sh b/devtools/check_workspace.sh index 7304866eed..1747d316d6 100755 --- a/devtools/check_workspace.sh +++ b/devtools/check_workspace.sh @@ -10,7 +10,7 @@ cargo fmt # default, min, all cargo check cargo check --no-default-features - cargo check --features abort,iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2 + cargo check --features abort,iterator,staking,stargate,cosmwasm_1_2 cargo wasm-debug cargo wasm-debug --features iterator,staking,stargate cargo clippy --all-targets --features iterator,staking,stargate -- -D warnings diff --git a/devtools/test_workspace.sh b/devtools/test_workspace.sh index f1790536e0..5ade3f183f 100755 --- a/devtools/test_workspace.sh +++ b/devtools/test_workspace.sh @@ -4,7 +4,7 @@ command -v shellcheck >/dev/null && shellcheck "$0" cargo fmt (cd packages/crypto && cargo test) -(cd packages/std && cargo test --features iterator,cosmwasm_1_1,cosmwasm_1_2) +(cd packages/std && cargo test --features iterator,cosmwasm_1_2) (cd packages/storage && cargo test --features iterator) (cd packages/schema && cargo test) (cd packages/schema-derive && cargo test) diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 8a8c1f0615..54545e9976 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -38,7 +38,7 @@ ibc3 = ["stargate"] cosmwasm_1_1 = [] # This feature makes `GovMsg::VoteWeighted` available for the contract to call, but requires # the host blockchain to run CosmWasm `1.2.0` or higher. -cosmwasm_1_2 = [] +cosmwasm_1_2 = ["cosmwasm_1_1"] [dependencies] base64 = "0.13.0" From c3cde9b6acd8196a61939c70d407110770a4489d Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 5 Jan 2023 18:35:54 +0100 Subject: [PATCH 0104/2372] Add FileSystemCache::remove --- packages/vm/src/modules/file_system_cache.rs | 47 ++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index a529e432de..95b1a3e288 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -1,3 +1,4 @@ +use std::fs; use std::io; use std::path::PathBuf; use thiserror::Error; @@ -137,6 +138,22 @@ impl FileSystemCache { Ok(()) } + /// Removes a serialized module from the file system. + /// + /// Returns true if the file existed and false if the file did not exist. + pub fn remove(&mut self, checksum: &Checksum) -> VmResult { + let filename = checksum.to_hex(); + let file_path = self.latest_modules_path().join(filename); + + if file_path.exists() { + fs::remove_file(file_path) + .map_err(|_e| VmError::cache_err("Error deleting module from disk"))?; + Ok(true) + } else { + Ok(false) + } + } + /// The path to the latest version of the modules. fn latest_modules_path(&self) -> PathBuf { let version = format!( @@ -225,4 +242,34 @@ mod tests { ); let _serialized_module = fs::read(file_path).unwrap(); } + + #[test] + fn file_system_cache_remove_works() { + let tmp_dir = TempDir::new().unwrap(); + let mut cache = unsafe { FileSystemCache::new(tmp_dir.path()).unwrap() }; + + // Create module + let wasm = wat::parse_str(SOME_WAT).unwrap(); + let checksum = Checksum::generate(&wasm); + + // Store module + let module = compile(&wasm, None, &[]).unwrap(); + cache.store(&checksum, &module).unwrap(); + + // It's there + let store = make_runtime_store(TESTING_MEMORY_LIMIT); + assert!(cache.load(&checksum, &store).unwrap().is_some()); + + // Remove module + let existed = cache.remove(&checksum).unwrap(); + assert!(existed); + + // it's gone now + let store = make_runtime_store(TESTING_MEMORY_LIMIT); + assert!(cache.load(&checksum, &store).unwrap().is_none()); + + // Remove again + let existed = cache.remove(&checksum).unwrap(); + assert!(!existed); + } } From b72579fb1d967a4e48b4e6c4a0e18de292dfd895 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 5 Jan 2023 22:23:45 +0100 Subject: [PATCH 0105/2372] Add Cache::remove_wasm --- CHANGELOG.md | 2 + packages/vm/src/cache.rs | 87 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 88 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5012273c5e..c0079be3a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,8 @@ and this project adheres to get reverted. ([#1513]) - cosmwasm-std: Add new `WasmQuery::CodeInfo` to get the checksum of a code ID ([#1561]). +- cosmwasm-vm: Add `Cache::remove_wasm` to remove obsolete Wasm blobs and their + compiled modules. [#1436]: https://github.com/CosmWasm/cosmwasm/issues/1436 [#1437]: https://github.com/CosmWasm/cosmwasm/issues/1437 diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index f971530ba9..263979f0ca 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -1,5 +1,5 @@ use std::collections::HashSet; -use std::fs::{File, OpenOptions}; +use std::fs::{self, File, OpenOptions}; use std::io::{Read, Write}; use std::marker::PhantomData; use std::path::{Path, PathBuf}; @@ -57,6 +57,7 @@ pub struct CacheOptions { } pub struct CacheInner { + /// The directory in which the Wasm blobs are stored in the file system. wasm_path: PathBuf, /// Instances memory limit in bytes. Use a value that is divisible by the Wasm page size 65536, /// e.g. full MiBs. @@ -161,6 +162,25 @@ where Ok(checksum) } + /// Removes the Wasm blob for the given checksum from disk and its + /// compiled module from the file system cache. + /// + /// The existence of the original code is required since the caller (wasmd) + /// has to keep track of which entries we have here. + pub fn remove_wasm(&self, checksum: &Checksum) -> VmResult<()> { + let mut cache = self.inner.lock().unwrap(); + + // Remove compiled moduled from disk (if it exists). + // Here we could also delete from memory caches but this is not really + // necessary as they are pushed out from the LRU over time or disappear + // when the node process restarts. + cache.fs_cache.remove(checksum)?; + + let path = &cache.wasm_path; + remove_wasm_from_disk(path, checksum)?; + Ok(()) + } + /// Retrieves a Wasm blob that was previously stored via save_wasm. /// When the cache is instantiated with the same base dir, this finds Wasm files on disc across multiple cache instances (i.e. node restarts). /// This function is public to allow a checksum to Wasm lookup in the blockchain. @@ -364,6 +384,23 @@ fn load_wasm_from_disk(dir: impl Into, checksum: &Checksum) -> VmResult Ok(wasm) } +/// Removes the Wasm blob for the given checksum from disk. +/// +/// In contrast to the file system cache, the existence of the original +/// code is required. So a non-existent file leads to an error as it +/// indicates a bug. +fn remove_wasm_from_disk(dir: impl Into, checksum: &Checksum) -> VmResult<()> { + let path = dir.into().join(checksum.to_hex()); + + if !path.exists() { + return Err(VmError::cache_err("Wasm file does not exist")); + } + + fs::remove_file(path).map_err(|_e| VmError::cache_err("Error removing Wasm file from disk"))?; + + Ok(()) +} + #[cfg(test)] mod tests { use super::*; @@ -573,6 +610,37 @@ mod tests { } } + #[test] + fn remove_wasm_works() { + let cache: Cache = + unsafe { Cache::new(make_testing_options()).unwrap() }; + + // Store + let checksum = cache.save_wasm(CONTRACT).unwrap(); + + // Exists + cache.load_wasm(&checksum).unwrap(); + + // Remove + cache.remove_wasm(&checksum).unwrap(); + + // Does not exist anymore + match cache.load_wasm(&checksum).unwrap_err() { + VmError::CacheErr { msg, .. } => { + assert_eq!(msg, "Error opening Wasm file for reading") + } + e => panic!("Unexpected error: {:?}", e), + } + + // Removing again fails + match cache.remove_wasm(&checksum).unwrap_err() { + VmError::CacheErr { msg, .. } => { + assert_eq!(msg, "Wasm file does not exist") + } + e => panic!("Unexpected error: {:?}", e), + } + } + #[test] fn get_instance_finds_cached_module() { let cache = unsafe { Cache::new(make_testing_options()).unwrap() }; @@ -988,6 +1056,23 @@ mod tests { assert_eq!(code, loaded); } + #[test] + fn remove_wasm_from_disk_works() { + let tmp_dir = TempDir::new().unwrap(); + let path = tmp_dir.path(); + let code = vec![12u8; 17]; + let checksum = save_wasm_to_disk(path, &code).unwrap(); + + remove_wasm_from_disk(path, &checksum).unwrap(); + + // removing again fails + + match remove_wasm_from_disk(path, &checksum).unwrap_err() { + VmError::CacheErr { msg } => assert_eq!(msg, "Wasm file does not exist"), + err => panic!("Unexpected error: {:?}", err), + } + } + #[test] fn analyze_works() { let cache: Cache = From 2eb97078418ca81a8dd1858871681ab97c4cd079 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 9 Jan 2023 14:01:13 +0100 Subject: [PATCH 0106/2372] Set version: 1.2.0-beta.1 --- Cargo.lock | 16 ++++++++-------- contracts/burner/Cargo.lock | 12 ++++++------ contracts/crypto-verify/Cargo.lock | 14 +++++++------- contracts/cyberpunk/Cargo.lock | 14 +++++++------- contracts/floaty/Cargo.lock | 14 +++++++------- contracts/hackatom/Cargo.lock | 14 +++++++------- contracts/ibc-reflect-send/Cargo.lock | 14 +++++++------- contracts/ibc-reflect/Cargo.lock | 14 +++++++------- contracts/queue/Cargo.lock | 12 ++++++------ contracts/reflect/Cargo.lock | 14 +++++++------- contracts/staking/Cargo.lock | 14 +++++++------- contracts/virus/Cargo.lock | 12 ++++++------ packages/check/Cargo.toml | 6 +++--- packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema-derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 6 +++--- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 20 files changed, 99 insertions(+), 99 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c939cf06c2..a1f4a425a2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -246,7 +246,7 @@ dependencies = [ [[package]] name = "cosmwasm-check" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "anyhow", "clap", @@ -257,7 +257,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "base64", "criterion", @@ -276,7 +276,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "cosmwasm-std", "syn", @@ -284,7 +284,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "anyhow", "cosmwasm-schema-derive", @@ -299,7 +299,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -308,7 +308,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "base64", "chrono", @@ -330,7 +330,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "cosmwasm-std", "serde", @@ -338,7 +338,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 20129c0bbf..589314d265 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -174,7 +174,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -185,14 +185,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -203,7 +203,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -212,7 +212,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -230,7 +230,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 92ebf0a51e..3e8436c182 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 04d7002ab4..909cb32f3c 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -203,14 +203,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -221,7 +221,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -230,7 +230,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -248,7 +248,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "cosmwasm-std", "serde", @@ -256,7 +256,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index b1857e209a..d239763137 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index b46d6b0382..ed498ec5b7 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index ec798a0102..cbc830b156 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index a60ff962fb..755dbb1dbb 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 69f5ecff87..2b0f4a530a 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index d5ba929da6..0fe87e3355 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index ad437ec305..881e97a462 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index c46c654d81..df0f4018ce 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" dependencies = [ "bitflags", "bytecheck", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index a2d0cfe904..4ff693f28a 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-check" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" authors = ["Mauro Lacy "] edition = "2021" description = "A CLI tool for verifying CosmWasm smart contracts" @@ -11,5 +11,5 @@ license = "Apache-2.0" anyhow = "1.0.57" clap = "2" colored = "2" -cosmwasm-vm = { path = "../vm", version = "1.2.0-beta.0" } -cosmwasm-std = { path = "../std", version = "1.2.0-beta.0" } +cosmwasm-vm = { path = "../vm", version = "1.2.0-beta.1" } +cosmwasm-std = { path = "../std", version = "1.2.0-beta.1" } diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 441efe5197..d390a0eb5f 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" authors = ["Mauro Lacy "] edition = "2021" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index 2a1eea212e..1ef336cbb4 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" authors = ["Simon Warta "] edition = "2021" description = "A package for auto-generated code used for CosmWasm contract development. This is shipped as part of cosmwasm-std. Do not use directly." diff --git a/packages/schema-derive/Cargo.toml b/packages/schema-derive/Cargo.toml index 743ccb4a58..5a4e776491 100644 --- a/packages/schema-derive/Cargo.toml +++ b/packages/schema-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" authors = ["Tomasz Kurcz "] edition = "2021" description = "Derive macros for cosmwasm-schema" diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index b883c13463..88f5df5588 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" authors = ["Simon Warta ", "Ethan Frey "] edition = "2021" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." @@ -8,7 +8,7 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/schema" license = "Apache-2.0" [dependencies] -cosmwasm-schema-derive = { version = "=1.2.0-beta.0", path = "../schema-derive" } +cosmwasm-schema-derive = { version = "=1.2.0-beta.1", path = "../schema-derive" } schemars = "0.8.3" serde = "1.0" serde_json = "1.0.40" @@ -16,6 +16,6 @@ thiserror = "1.0.26" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = { version = "1.2.0-beta.0", path = "../std" } +cosmwasm-std = { version = "1.2.0-beta.1", path = "../std" } semver = "1" tempfile = "3" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 54545e9976..7645600597 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" authors = ["Ethan Frey "] edition = "2021" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -42,7 +42,7 @@ cosmwasm_1_2 = ["cosmwasm_1_1"] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "1.2.0-beta.0" } +cosmwasm-derive = { path = "../derive", version = "1.2.0-beta.1" } derivative = "2" forward_ref = "1" hex = "0.4" @@ -54,7 +54,7 @@ thiserror = "1.0.26" uint = "0.9.3" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "1.2.0-beta.0" } +cosmwasm-crypto = { path = "../crypto", version = "1.2.0-beta.1" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index b726c7d125..a582c7ded8 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" authors = ["Ethan Frey "] edition = "2021" description = "CosmWasm library with useful helpers for Storage patterns" @@ -16,5 +16,5 @@ iterator = ["cosmwasm-std/iterator"] [dependencies] # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.2.0-beta.0", default-features = false } +cosmwasm-std = { path = "../std", version = "1.2.0-beta.1", default-features = false } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index fcfdcb8ac9..60ba7e1600 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "1.2.0-beta.0" +version = "1.2.0-beta.1" authors = ["Ethan Frey "] edition = "2021" description = "VM bindings to run cosmwams contracts" @@ -41,8 +41,8 @@ required-features = ["iterator"] [dependencies] clru = "0.4.0" # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.2.0-beta.0", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "1.2.0-beta.0" } +cosmwasm-std = { path = "../std", version = "1.2.0-beta.1", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "1.2.0-beta.1" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.3" From 89fbcb9c3529ccae023bb84053be37e3efd06487 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 9 Jan 2023 15:39:28 +0100 Subject: [PATCH 0107/2372] Test and fix GovMsg serialization --- packages/std/src/results/cosmos_msg.rs | 45 +++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index cc24034322..9ee3a9a90a 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -213,7 +213,7 @@ pub enum GovMsg { #[cfg(feature = "cosmwasm_1_2")] VoteWeighted { proposal_id: u64, - vote: WeightedVoteOption, + options: Vec, }, } @@ -359,4 +359,47 @@ mod tests { "Execute { contract_addr: \"joe\", msg: Binary(009f9296), funds: [] }" ); } + + #[test] + #[cfg(feature = "stargate")] + fn gov_msg_serializes_to_correct_json() { + // Vote + let msg = GovMsg::Vote { + proposal_id: 4, + vote: VoteOption::NoWithVeto, + }; + let json = to_binary(&msg).unwrap(); + assert_eq!( + String::from_utf8_lossy(&json), + r#"{"vote":{"proposal_id":4,"vote":"no_with_veto"}}"#, + ); + + // VoteWeighted + #[cfg(feature = "cosmwasm_1_2")] + { + let msg = GovMsg::VoteWeighted { + proposal_id: 25, + options: vec![ + WeightedVoteOption { + weight: Decimal::percent(25), + option: VoteOption::Yes, + }, + WeightedVoteOption { + weight: Decimal::percent(25), + option: VoteOption::No, + }, + WeightedVoteOption { + weight: Decimal::percent(50), + option: VoteOption::Abstain, + }, + ], + }; + + let json = to_binary(&msg).unwrap(); + assert_eq!( + String::from_utf8_lossy(&json), + r#"{"vote_weighted":{"proposal_id":25,"options":[{"option":"yes","weight":"0.25"},{"option":"no","weight":"0.25"},{"option":"abstain","weight":"0.5"}]}}"#, + ); + } + } } From 63e71be2e9215901f59a95badf6ea457fde3ebea Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 9 Jan 2023 15:39:42 +0100 Subject: [PATCH 0108/2372] Add comment to vote field --- packages/std/src/results/cosmos_msg.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index 9ee3a9a90a..3696caea64 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -208,7 +208,14 @@ pub enum WasmMsg { #[serde(rename_all = "snake_case")] pub enum GovMsg { /// This maps directly to [MsgVote](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/gov/v1beta1/tx.proto#L46-L56) in the Cosmos SDK with voter set to the contract address. - Vote { proposal_id: u64, vote: VoteOption }, + Vote { + proposal_id: u64, + /// The vote option. + /// + /// This should be called "option" for consistency with Cosmos SDK. Sorry for that. + /// See . + vote: VoteOption, + }, /// This maps directly to [MsgVoteWeighted](https://github.com/cosmos/cosmos-sdk/blob/v0.45.8/proto/cosmos/gov/v1beta1/tx.proto#L66-L78) in the Cosmos SDK with voter set to the contract address. #[cfg(feature = "cosmwasm_1_2")] VoteWeighted { From e9ee6f52a3e56dfa388facdb63f3a988da198825 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 9 Jan 2023 17:53:31 +0100 Subject: [PATCH 0109/2372] Update schemas --- contracts/ibc-reflect-send/schema/ibc-reflect-send.json | 7 ++++++- contracts/ibc-reflect-send/schema/packet_msg.json | 7 ++++++- contracts/ibc-reflect-send/schema/raw/execute.json | 7 ++++++- contracts/ibc-reflect/schema/packet_msg.json | 7 ++++++- contracts/reflect/schema/raw/execute.json | 7 ++++++- contracts/reflect/schema/reflect.json | 7 ++++++- 6 files changed, 36 insertions(+), 6 deletions(-) diff --git a/contracts/ibc-reflect-send/schema/ibc-reflect-send.json b/contracts/ibc-reflect-send/schema/ibc-reflect-send.json index b42ac67e89..1498f82a21 100644 --- a/contracts/ibc-reflect-send/schema/ibc-reflect-send.json +++ b/contracts/ibc-reflect-send/schema/ibc-reflect-send.json @@ -378,7 +378,12 @@ "minimum": 0.0 }, "vote": { - "$ref": "#/definitions/VoteOption" + "description": "The vote option.\n\nThis should be called \"option\" for consistency with Cosmos SDK. Sorry for that. See .", + "allOf": [ + { + "$ref": "#/definitions/VoteOption" + } + ] } } } diff --git a/contracts/ibc-reflect-send/schema/packet_msg.json b/contracts/ibc-reflect-send/schema/packet_msg.json index 7bc2a45e21..4bf172b75e 100644 --- a/contracts/ibc-reflect-send/schema/packet_msg.json +++ b/contracts/ibc-reflect-send/schema/packet_msg.json @@ -316,7 +316,12 @@ "minimum": 0.0 }, "vote": { - "$ref": "#/definitions/VoteOption" + "description": "The vote option.\n\nThis should be called \"option\" for consistency with Cosmos SDK. Sorry for that. See .", + "allOf": [ + { + "$ref": "#/definitions/VoteOption" + } + ] } } } diff --git a/contracts/ibc-reflect-send/schema/raw/execute.json b/contracts/ibc-reflect-send/schema/raw/execute.json index a382cb2aac..198ed94097 100644 --- a/contracts/ibc-reflect-send/schema/raw/execute.json +++ b/contracts/ibc-reflect-send/schema/raw/execute.json @@ -367,7 +367,12 @@ "minimum": 0.0 }, "vote": { - "$ref": "#/definitions/VoteOption" + "description": "The vote option.\n\nThis should be called \"option\" for consistency with Cosmos SDK. Sorry for that. See .", + "allOf": [ + { + "$ref": "#/definitions/VoteOption" + } + ] } } } diff --git a/contracts/ibc-reflect/schema/packet_msg.json b/contracts/ibc-reflect/schema/packet_msg.json index 259c21b1bd..432e357fe3 100644 --- a/contracts/ibc-reflect/schema/packet_msg.json +++ b/contracts/ibc-reflect/schema/packet_msg.json @@ -245,7 +245,12 @@ "minimum": 0.0 }, "vote": { - "$ref": "#/definitions/VoteOption" + "description": "The vote option.\n\nThis should be called \"option\" for consistency with Cosmos SDK. Sorry for that. See .", + "allOf": [ + { + "$ref": "#/definitions/VoteOption" + } + ] } } } diff --git a/contracts/reflect/schema/raw/execute.json b/contracts/reflect/schema/raw/execute.json index 1ccfba3b0e..8568a9e798 100644 --- a/contracts/reflect/schema/raw/execute.json +++ b/contracts/reflect/schema/raw/execute.json @@ -362,7 +362,12 @@ "minimum": 0.0 }, "vote": { - "$ref": "#/definitions/VoteOption" + "description": "The vote option.\n\nThis should be called \"option\" for consistency with Cosmos SDK. Sorry for that. See .", + "allOf": [ + { + "$ref": "#/definitions/VoteOption" + } + ] } } } diff --git a/contracts/reflect/schema/reflect.json b/contracts/reflect/schema/reflect.json index 603c401cd4..1f91a514a4 100644 --- a/contracts/reflect/schema/reflect.json +++ b/contracts/reflect/schema/reflect.json @@ -372,7 +372,12 @@ "minimum": 0.0 }, "vote": { - "$ref": "#/definitions/VoteOption" + "description": "The vote option.\n\nThis should be called \"option\" for consistency with Cosmos SDK. Sorry for that. See .", + "allOf": [ + { + "$ref": "#/definitions/VoteOption" + } + ] } } } From 5bad054733bc601f0d9f38fadfefde223ccad00f Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 10 Jan 2023 16:03:38 +0100 Subject: [PATCH 0110/2372] Move some test code --- packages/std/src/results/cosmos_msg.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index 3696caea64..f69b37564e 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -331,13 +331,13 @@ mod tests { } } - #[cosmwasm_schema::cw_serde] - enum ExecuteMsg { - Mint { coin: Coin }, - } - #[test] fn wasm_msg_debug_decodes_binary_string_when_possible() { + #[cosmwasm_schema::cw_serde] + enum ExecuteMsg { + Mint { coin: Coin }, + } + let msg = WasmMsg::Execute { contract_addr: "joe".to_string(), msg: to_binary(&ExecuteMsg::Mint { From 76365af99fec75c686f6336c4c421af3eb4a2ae7 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 10 Jan 2023 16:03:56 +0100 Subject: [PATCH 0111/2372] Add WasmMsg::Instantiate/Instantiate2 serialization tests --- packages/std/src/results/cosmos_msg.rs | 63 ++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index f69b37564e..c62ba25185 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -331,6 +331,69 @@ mod tests { } } + #[test] + fn wasm_msg_serializes_to_correct_json() { + // Instantiate with admin + let msg = WasmMsg::Instantiate { + admin: Some("king".to_string()), + code_id: 7897, + msg: br#"{"claim":{}}"#.into(), + funds: vec![], + label: "my instance".to_string(), + }; + let json = to_binary(&msg).unwrap(); + assert_eq!( + String::from_utf8_lossy(&json), + r#"{"instantiate":{"admin":"king","code_id":7897,"msg":"eyJjbGFpbSI6e319","funds":[],"label":"my instance"}}"#, + ); + + // Instantiate without admin + let msg = WasmMsg::Instantiate { + admin: None, + code_id: 7897, + msg: br#"{"claim":{}}"#.into(), + funds: vec![], + label: "my instance".to_string(), + }; + let json = to_binary(&msg).unwrap(); + assert_eq!( + String::from_utf8_lossy(&json), + r#"{"instantiate":{"admin":null,"code_id":7897,"msg":"eyJjbGFpbSI6e319","funds":[],"label":"my instance"}}"#, + ); + + // Instantiate with funds + let msg = WasmMsg::Instantiate { + admin: None, + code_id: 7897, + msg: br#"{"claim":{}}"#.into(), + funds: vec![coin(321, "stones")], + label: "my instance".to_string(), + }; + let json = to_binary(&msg).unwrap(); + assert_eq!( + String::from_utf8_lossy(&json), + r#"{"instantiate":{"admin":null,"code_id":7897,"msg":"eyJjbGFpbSI6e319","funds":[{"denom":"stones","amount":"321"}],"label":"my instance"}}"#, + ); + + // Instantiate2 + #[cfg(feature = "cosmwasm_1_2")] + { + let msg = WasmMsg::Instantiate2 { + admin: None, + code_id: 7897, + label: "my instance".to_string(), + msg: br#"{"claim":{}}"#.into(), + funds: vec![coin(321, "stones")], + salt: Binary::from_base64("UkOVazhiwoo=").unwrap(), + }; + let json = to_binary(&msg).unwrap(); + assert_eq!( + String::from_utf8_lossy(&json), + r#"{"instantiate2":{"admin":null,"code_id":7897,"label":"my instance","msg":"eyJjbGFpbSI6e319","funds":[{"denom":"stones","amount":"321"}],"salt":"UkOVazhiwoo="}}"#, + ); + } + } + #[test] fn wasm_msg_debug_decodes_binary_string_when_possible() { #[cosmwasm_schema::cw_serde] From d15b463844c9859f2e371c449923ebd129ee7bc3 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 11 Jan 2023 11:20:46 +0100 Subject: [PATCH 0112/2372] Test serialisation of WasmQuery::ContractInfo/CodeInfo, Contract/CodeInfoResponse --- packages/std/src/query/wasm.rs | 65 ++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/packages/std/src/query/wasm.rs b/packages/std/src/query/wasm.rs index 13070c18f1..039251a4d7 100644 --- a/packages/std/src/query/wasm.rs +++ b/packages/std/src/query/wasm.rs @@ -87,3 +87,68 @@ pub struct CodeInfoResponse { #[cfg(feature = "cosmwasm_1_2")] impl QueryResponseType for CodeInfoResponse {} + +#[cfg(test)] +mod tests { + use super::*; + use crate::to_binary; + + #[test] + fn wasm_query_contract_info_serialization() { + let query = WasmQuery::ContractInfo { + contract_addr: "aabbccdd456".into(), + }; + let json = to_binary(&query).unwrap(); + assert_eq!( + String::from_utf8_lossy(&json), + r#"{"contract_info":{"contract_addr":"aabbccdd456"}}"#, + ); + } + + #[test] + #[cfg(feature = "cosmwasm_1_2")] + fn wasm_query_code_info_serialization() { + let query = WasmQuery::CodeInfo { code_id: 70 }; + let json = to_binary(&query).unwrap(); + assert_eq!( + String::from_utf8_lossy(&json), + r#"{"code_info":{"code_id":70}}"#, + ); + } + + #[test] + fn contract_info_response_serialization() { + let response = ContractInfoResponse { + code_id: 67, + creator: "jane".to_string(), + admin: Some("king".to_string()), + pinned: true, + ibc_port: Some("wasm.123".to_string()), + }; + let json = to_binary(&response).unwrap(); + assert_eq!( + String::from_utf8_lossy(&json), + r#"{"code_id":67,"creator":"jane","admin":"king","pinned":true,"ibc_port":"wasm.123"}"#, + ); + } + + #[test] + #[cfg(feature = "cosmwasm_1_2")] + fn code_info_response_serialization() { + use crate::HexBinary; + + let response = CodeInfoResponse { + code_id: 67, + creator: "jane".to_string(), + checksum: HexBinary::from_hex( + "f7bb7b18fb01bbf425cf4ed2cd4b7fb26a019a7fc75a4dc87e8a0b768c501f00", + ) + .unwrap(), + }; + let json = to_binary(&response).unwrap(); + assert_eq!( + String::from_utf8_lossy(&json), + r#"{"code_id":67,"creator":"jane","checksum":"f7bb7b18fb01bbf425cf4ed2cd4b7fb26a019a7fc75a4dc87e8a0b768c501f00"}"#, + ); + } +} From b4261e20fb65a6070ffa4d31e1c74818a071fc6f Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 11 Jan 2023 18:33:48 +0100 Subject: [PATCH 0113/2372] Test SystemError::NoSuchContract/NoSuchCode serialization --- packages/std/src/errors/system_error.rs | 45 +++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/packages/std/src/errors/system_error.rs b/packages/std/src/errors/system_error.rs index 97d7bba3cb..d763f213c8 100644 --- a/packages/std/src/errors/system_error.rs +++ b/packages/std/src/errors/system_error.rs @@ -65,3 +65,48 @@ impl std::fmt::Display for SystemError { } } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::{from_slice, to_vec}; + + #[test] + fn system_error_no_such_contract_serialization() { + let err = SystemError::NoSuchContract { + addr: "gibtsnicht".to_string(), + }; + + // ser + let json = to_vec(&err).unwrap(); + assert_eq!( + String::from_utf8_lossy(&json), + r#"{"no_such_contract":{"addr":"gibtsnicht"}}"#, + ); + + // de + let err: SystemError = from_slice(br#"{"no_such_contract":{"addr":"nada"}}"#).unwrap(); + assert_eq!( + err, + SystemError::NoSuchContract { + addr: "nada".to_string() + } + ); + } + + #[test] + fn system_error_no_such_code_serialization() { + let err = SystemError::NoSuchCode { code_id: 13 }; + + // ser + let json = to_vec(&err).unwrap(); + assert_eq!( + String::from_utf8_lossy(&json), + r#"{"no_such_code":{"code_id":13}}"#, + ); + + // de + let err: SystemError = from_slice(br#"{"no_such_code":{"code_id":987}}"#).unwrap(); + assert_eq!(err, SystemError::NoSuchCode { code_id: 987 },); + } +} From 6f6d4b1a2042ad70c53d1a7f313781a6a75cc7ab Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 12 Jan 2023 16:34:58 +0100 Subject: [PATCH 0114/2372] Test size_of for Uint64/128/256/512 --- packages/std/src/math/uint128.rs | 5 +++++ packages/std/src/math/uint256.rs | 5 +++++ packages/std/src/math/uint512.rs | 5 +++++ packages/std/src/math/uint64.rs | 5 +++++ 4 files changed, 20 insertions(+) diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index f6d8041184..a6f3681c40 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -540,6 +540,11 @@ mod tests { use super::*; use crate::{from_slice, to_vec}; + #[test] + fn size_of_works() { + assert_eq!(std::mem::size_of::(), 16); + } + #[test] fn uint128_zero_works() { let zero = Uint128::zero(); diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 3469b1d80a..743281735d 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -668,6 +668,11 @@ mod tests { use super::*; use crate::{from_slice, to_vec}; + #[test] + fn size_of_works() { + assert_eq!(std::mem::size_of::(), 32); + } + #[test] fn uint256_new_works() { let num = Uint256::new([1; 32]); diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index fe7c1c7a2d..99e3b87359 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -623,6 +623,11 @@ mod tests { use super::*; use crate::{from_slice, to_vec}; + #[test] + fn size_of_works() { + assert_eq!(std::mem::size_of::(), 64); + } + #[test] fn uint512_new_works() { let num = Uint512::new([1; 64]); diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index 57cf1154f4..97032633e2 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -494,6 +494,11 @@ mod tests { use super::*; use crate::{from_slice, to_vec}; + #[test] + fn size_of_works() { + assert_eq!(std::mem::size_of::(), 8); + } + #[test] fn uint64_zero_works() { let zero = Uint64::zero(); From 3cf3c67a267fefa3900083ca8ab9ca065fdf383b Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 12 Jan 2023 17:21:38 +0100 Subject: [PATCH 0115/2372] Set version: 1.2.0-rc.1 --- Cargo.lock | 16 ++++++++-------- contracts/burner/Cargo.lock | 12 ++++++------ contracts/crypto-verify/Cargo.lock | 14 +++++++------- contracts/cyberpunk/Cargo.lock | 14 +++++++------- contracts/floaty/Cargo.lock | 14 +++++++------- contracts/hackatom/Cargo.lock | 14 +++++++------- contracts/ibc-reflect-send/Cargo.lock | 14 +++++++------- contracts/ibc-reflect/Cargo.lock | 14 +++++++------- contracts/queue/Cargo.lock | 12 ++++++------ contracts/reflect/Cargo.lock | 14 +++++++------- contracts/staking/Cargo.lock | 14 +++++++------- contracts/virus/Cargo.lock | 12 ++++++------ packages/check/Cargo.toml | 6 +++--- packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema-derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 6 +++--- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 20 files changed, 99 insertions(+), 99 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a1f4a425a2..9604275615 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -246,7 +246,7 @@ dependencies = [ [[package]] name = "cosmwasm-check" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "anyhow", "clap", @@ -257,7 +257,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "base64", "criterion", @@ -276,7 +276,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "cosmwasm-std", "syn", @@ -284,7 +284,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "anyhow", "cosmwasm-schema-derive", @@ -299,7 +299,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -308,7 +308,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "base64", "chrono", @@ -330,7 +330,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "cosmwasm-std", "serde", @@ -338,7 +338,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 589314d265..975c437322 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -174,7 +174,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -185,14 +185,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -203,7 +203,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -212,7 +212,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -230,7 +230,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 3e8436c182..187d140bdc 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 909cb32f3c..35f96f2141 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -203,14 +203,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -221,7 +221,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -230,7 +230,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -248,7 +248,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "cosmwasm-std", "serde", @@ -256,7 +256,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index d239763137..1628503aae 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index ed498ec5b7..449690c348 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index cbc830b156..cef2629547 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 755dbb1dbb..0a502905a3 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 2b0f4a530a..b9bc042b47 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 0fe87e3355..d543df2de5 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 881e97a462..ffaa239794 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index df0f4018ce..e7745e4945 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" dependencies = [ "bitflags", "bytecheck", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index 4ff693f28a..e50773015d 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-check" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" authors = ["Mauro Lacy "] edition = "2021" description = "A CLI tool for verifying CosmWasm smart contracts" @@ -11,5 +11,5 @@ license = "Apache-2.0" anyhow = "1.0.57" clap = "2" colored = "2" -cosmwasm-vm = { path = "../vm", version = "1.2.0-beta.1" } -cosmwasm-std = { path = "../std", version = "1.2.0-beta.1" } +cosmwasm-vm = { path = "../vm", version = "1.2.0-rc.1" } +cosmwasm-std = { path = "../std", version = "1.2.0-rc.1" } diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index d390a0eb5f..ff6e0b6f9f 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" authors = ["Mauro Lacy "] edition = "2021" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index 1ef336cbb4..4485606ec6 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" authors = ["Simon Warta "] edition = "2021" description = "A package for auto-generated code used for CosmWasm contract development. This is shipped as part of cosmwasm-std. Do not use directly." diff --git a/packages/schema-derive/Cargo.toml b/packages/schema-derive/Cargo.toml index 5a4e776491..c063f4c68f 100644 --- a/packages/schema-derive/Cargo.toml +++ b/packages/schema-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema-derive" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" authors = ["Tomasz Kurcz "] edition = "2021" description = "Derive macros for cosmwasm-schema" diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index 88f5df5588..0700262526 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" authors = ["Simon Warta ", "Ethan Frey "] edition = "2021" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." @@ -8,7 +8,7 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/schema" license = "Apache-2.0" [dependencies] -cosmwasm-schema-derive = { version = "=1.2.0-beta.1", path = "../schema-derive" } +cosmwasm-schema-derive = { version = "=1.2.0-rc.1", path = "../schema-derive" } schemars = "0.8.3" serde = "1.0" serde_json = "1.0.40" @@ -16,6 +16,6 @@ thiserror = "1.0.26" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = { version = "1.2.0-beta.1", path = "../std" } +cosmwasm-std = { version = "1.2.0-rc.1", path = "../std" } semver = "1" tempfile = "3" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 7645600597..4be42c970f 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" authors = ["Ethan Frey "] edition = "2021" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -42,7 +42,7 @@ cosmwasm_1_2 = ["cosmwasm_1_1"] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "1.2.0-beta.1" } +cosmwasm-derive = { path = "../derive", version = "1.2.0-rc.1" } derivative = "2" forward_ref = "1" hex = "0.4" @@ -54,7 +54,7 @@ thiserror = "1.0.26" uint = "0.9.3" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "1.2.0-beta.1" } +cosmwasm-crypto = { path = "../crypto", version = "1.2.0-rc.1" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index a582c7ded8..a6b75470e4 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" authors = ["Ethan Frey "] edition = "2021" description = "CosmWasm library with useful helpers for Storage patterns" @@ -16,5 +16,5 @@ iterator = ["cosmwasm-std/iterator"] [dependencies] # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.2.0-beta.1", default-features = false } +cosmwasm-std = { path = "../std", version = "1.2.0-rc.1", default-features = false } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 60ba7e1600..07c9c53cbf 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "1.2.0-beta.1" +version = "1.2.0-rc.1" authors = ["Ethan Frey "] edition = "2021" description = "VM bindings to run cosmwams contracts" @@ -41,8 +41,8 @@ required-features = ["iterator"] [dependencies] clru = "0.4.0" # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.2.0-beta.1", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "1.2.0-beta.1" } +cosmwasm-std = { path = "../std", version = "1.2.0-rc.1", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "1.2.0-rc.1" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.3" From cb4cc5ea39d7a55564321241409db7399a3c01cb Mon Sep 17 00:00:00 2001 From: Gabe Rodriguez Date: Tue, 3 Jan 2023 20:12:33 +0100 Subject: [PATCH 0116/2372] Support fraction multiply --- packages/std/src/errors/mod.rs | 5 +- packages/std/src/errors/std_error.rs | 11 +- packages/std/src/lib.rs | 2 +- packages/std/src/math/decimal.rs | 4 +- packages/std/src/math/decimal256.rs | 4 +- packages/std/src/math/fraction.rs | 27 ++++- packages/std/src/math/mod.rs | 2 +- packages/std/src/math/uint128.rs | 172 ++++++++++++++++++++++++++- 8 files changed, 214 insertions(+), 13 deletions(-) diff --git a/packages/std/src/errors/mod.rs b/packages/std/src/errors/mod.rs index bf7e61f433..01793bfe17 100644 --- a/packages/std/src/errors/mod.rs +++ b/packages/std/src/errors/mod.rs @@ -5,8 +5,9 @@ mod verification_error; pub use recover_pubkey_error::RecoverPubkeyError; pub use std_error::{ - CheckedFromRatioError, CheckedMultiplyRatioError, ConversionOverflowError, DivideByZeroError, - OverflowError, OverflowOperation, RoundUpOverflowError, StdError, StdResult, + CheckedFromRatioError, CheckedMultiplyFractionalError, CheckedMultiplyRatioError, + ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, + RoundUpOverflowError, StdError, StdResult, }; pub use system_error::SystemError; pub use verification_error::VerificationError; diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index fa5c27f328..101c1a040d 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -543,7 +543,7 @@ impl ConversionOverflowError { } #[derive(Error, Debug, PartialEq, Eq)] -#[error("Cannot devide {operand} by zero")] +#[error("Cannot divide {operand} by zero")] pub struct DivideByZeroError { pub operand: String, } @@ -556,6 +556,15 @@ impl DivideByZeroError { } } +#[derive(Error, Debug, PartialEq, Eq)] +pub enum CheckedMultiplyFractionalError { + #[error("{0}")] + DivideByZero(#[from] DivideByZeroError), + + #[error("{0}")] + ConversionOverflow(#[from] ConversionOverflowError), +} + #[derive(Error, Debug, PartialEq, Eq)] pub enum CheckedMultiplyRatioError { #[error("Denominator must not be zero")] diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index a15f0f4c62..af696d5d12 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -46,7 +46,7 @@ pub use crate::ibc::{ #[cfg(feature = "iterator")] pub use crate::iterator::{Order, Record}; pub use crate::math::{ - Decimal, Decimal256, Decimal256RangeExceeded, DecimalRangeExceeded, Fraction, Isqrt, Uint128, + Decimal, Decimal256, Decimal256RangeExceeded, DecimalRangeExceeded, Fractional, Isqrt, Uint128, Uint256, Uint512, Uint64, }; pub use crate::never::Never; diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 72975e22e3..867b8dc6bd 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -12,7 +12,7 @@ use crate::errors::{ OverflowOperation, RoundUpOverflowError, StdError, }; -use super::Fraction; +use super::Fractional; use super::Isqrt; use super::{Uint128, Uint256}; @@ -359,7 +359,7 @@ impl Decimal { } } -impl Fraction for Decimal { +impl Fractional for Decimal { #[inline] fn numerator(&self) -> Uint128 { self.0 diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 0c2b134b5b..7d5c3c981f 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -13,7 +13,7 @@ use crate::errors::{ }; use crate::{Decimal, Uint512}; -use super::Fraction; +use super::Fractional; use super::Isqrt; use super::Uint256; @@ -376,7 +376,7 @@ impl Decimal256 { } } -impl Fraction for Decimal256 { +impl Fractional for Decimal256 { #[inline] fn numerator(&self) -> Uint256 { self.0 diff --git a/packages/std/src/math/fraction.rs b/packages/std/src/math/fraction.rs index ca187ad78c..489db1a3d9 100644 --- a/packages/std/src/math/fraction.rs +++ b/packages/std/src/math/fraction.rs @@ -1,7 +1,9 @@ +use serde::{Deserialize, Serialize}; + /// A fraction `p`/`q` with integers `p` and `q`. /// /// `p` is called the numerator and `q` is called the denominator. -pub trait Fraction: Sized { +pub trait Fractional: Sized { /// Returns the numerator `p` fn numerator(&self) -> T; /// Returns the denominator `q` @@ -12,3 +14,26 @@ pub trait Fraction: Sized { /// If `p` is zero, None is returned. fn inv(&self) -> Option; } + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +pub struct Fraction(T, T); + +impl Fraction { + pub fn new(numerator: T, denominator: T) -> Self { + Self(numerator, denominator) + } +} + +impl Fractional for Fraction { + fn numerator(&self) -> T { + self.0.clone() + } + + fn denominator(&self) -> T { + self.1.clone() + } + + fn inv(&self) -> Option { + unimplemented!() + } +} diff --git a/packages/std/src/math/mod.rs b/packages/std/src/math/mod.rs index 706d23005d..8151fd6f56 100644 --- a/packages/std/src/math/mod.rs +++ b/packages/std/src/math/mod.rs @@ -9,7 +9,7 @@ mod uint64; pub use decimal::{Decimal, DecimalRangeExceeded}; pub use decimal256::{Decimal256, Decimal256RangeExceeded}; -pub use fraction::Fraction; +pub use fraction::Fractional; pub use isqrt::Isqrt; pub use uint128::Uint128; pub use uint256::Uint256; diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index a6f3681c40..3d999ea600 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -8,9 +8,10 @@ use std::ops::{ use std::str::FromStr; use crate::errors::{ - CheckedMultiplyRatioError, DivideByZeroError, OverflowError, OverflowOperation, StdError, + CheckedMultiplyFractionalError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, + OverflowOperation, StdError, }; -use crate::{ConversionOverflowError, Uint256, Uint64}; +use crate::{ConversionOverflowError, Fractional, Uint256, Uint64}; /// A thin wrapper around u128 that is using strings for JSON encoding/decoding, /// such that the full u128 range can be used for clients that convert JSON numbers to floats, @@ -136,6 +137,37 @@ impl Uint128 { .unwrap() } + pub fn mul_floored, T: Into>(self, rhs: F) -> Self { + self.checked_mul_floored(rhs).unwrap() + } + + pub fn checked_mul_floored, T: Into>( + self, + rhs: F, + ) -> Result { + let res = self + .full_mul(rhs.numerator()) + .checked_div(Uint256::from(rhs.denominator().into()))?; + Ok(res.try_into()?) + } + + pub fn mul_ceil + Clone, T: Into>(self, rhs: F) -> Self { + self.checked_mul_ceil(rhs).unwrap() + } + + pub fn checked_mul_ceil + Clone, T: Into>( + self, + rhs: F, + ) -> Result { + let mut result = self.checked_mul_floored(rhs.clone())?; + let numerator = Uint256::from(rhs.numerator().into()); + let denominator = Uint256::from(rhs.denominator().into()); + if !numerator.checked_rem(denominator)?.is_zero() { + result += Uint128::one(); + }; + Ok(result) + } + pub fn checked_add(self, other: Self) -> Result { self.0 .checked_add(other.0) @@ -538,7 +570,9 @@ impl PartialEq for &Uint128 { #[cfg(test)] mod tests { use super::*; - use crate::{from_slice, to_vec}; + use crate::errors::CheckedMultiplyFractionalError::{ConversionOverflow, DivideByZero}; + use crate::math::fraction::Fraction; + use crate::{from_slice, to_vec, Decimal}; #[test] fn size_of_works() { @@ -1039,4 +1073,136 @@ mod tests { assert_eq!(&lhs == &rhs, expected); } } + + #[test] + fn mul_floored_works_with_zero() { + let fraction = Fraction::new(Uint128::zero(), Uint128::new(21)); + let res = Uint128::new(123456).mul_floored(fraction); + assert_eq!(Uint128::zero(), res) + } + + #[test] + fn mul_floored_does_nothing_with_one() { + let fraction = Fraction::new(Uint128::one(), Uint128::one()); + let res = Uint128::new(123456).mul_floored(fraction); + assert_eq!(Uint128::new(123456), res) + } + + #[test] + fn mul_floored_rounds_down_with_normal_case() { + let fraction = Fraction::new(8u128, 21u128); + let res = Uint128::new(123456).mul_floored(fraction); // 47030.8571 + assert_eq!(Uint128::new(47030), res) + } + + #[test] + fn mul_floored_works_with_decimal() { + let decimal = Decimal::from_ratio(8u128, 21u128); + let res = Uint128::new(123456).mul_floored(decimal); // 47030.8571 + assert_eq!(Uint128::new(47030), res) + } + + #[test] + #[should_panic(expected = "ConversionOverflowError")] + fn mul_floored_panics_on_overflow() { + let fraction = Fraction::new(21u128, 8u128); + Uint128::MAX.mul_floored(fraction); + } + + #[test] + fn checked_mul_floored_does_not_panic_on_overflow() { + let fraction = Fraction::new(21u128, 8u128); + assert_eq!( + Uint128::MAX.checked_mul_floored(fraction), + Err(ConversionOverflow(ConversionOverflowError { + source_type: "Uint256", + target_type: "Uint128", + value: "893241213167463466591358344508391555069".to_string() + })), + ); + } + + #[test] + #[should_panic(expected = "DivideByZeroError")] + fn mul_floored_panics_on_zero_div() { + let fraction = Fraction::new(21u128, 0u128); + Uint128::new(123456).mul_floored(fraction); + } + + #[test] + fn checked_mul_floored_does_not_panic_on_zero_div() { + let fraction = Fraction::new(21u128, 0u128); + assert_eq!( + Uint128::new(123456).checked_mul_floored(fraction), + Err(DivideByZero(DivideByZeroError { + operand: "2592576".to_string() + })), + ); + } + + #[test] + fn mul_ceil_works_with_zero() { + let fraction = Fraction::new(Uint128::zero(), Uint128::new(21)); + let res = Uint128::new(123456).mul_ceil(fraction); + assert_eq!(Uint128::zero(), res) + } + + #[test] + fn mul_ceil_does_nothing_with_one() { + let fraction = Fraction::new(Uint128::one(), Uint128::one()); + let res = Uint128::new(123456).mul_ceil(fraction); + assert_eq!(Uint128::new(123456), res) + } + + #[test] + fn mul_ceil_rounds_up_with_normal_case() { + let fraction = Fraction::new(8u128, 21u128); + let res = Uint128::new(123456).mul_ceil(fraction); // 47030.8571 + assert_eq!(Uint128::new(47031), res) + } + + #[test] + fn mul_ceil_works_with_decimal() { + let decimal = Decimal::from_ratio(8u128, 21u128); + let res = Uint128::new(123456).mul_ceil(decimal); // 47030.8571 + assert_eq!(Uint128::new(47031), res) + } + + #[test] + #[should_panic(expected = "ConversionOverflowError")] + fn mul_ceil_panics_on_overflow() { + let fraction = Fraction::new(21u128, 8u128); + Uint128::MAX.mul_ceil(fraction); + } + + #[test] + fn checked_mul_ceil_does_not_panic_on_overflow() { + let fraction = Fraction::new(21u128, 8u128); + assert_eq!( + Uint128::MAX.checked_mul_ceil(fraction), + Err(ConversionOverflow(ConversionOverflowError { + source_type: "Uint256", + target_type: "Uint128", + value: "893241213167463466591358344508391555069".to_string() + })), + ); + } + + #[test] + #[should_panic(expected = "DivideByZeroError")] + fn mul_ceil_panics_on_zero_div() { + let fraction = Fraction::new(21u128, 0u128); + Uint128::new(123456).mul_ceil(fraction); + } + + #[test] + fn checked_mul_ceil_does_not_panic_on_zero_div() { + let fraction = Fraction::new(21u128, 0u128); + assert_eq!( + Uint128::new(123456).checked_mul_ceil(fraction), + Err(DivideByZero(DivideByZeroError { + operand: "2592576".to_string() + })), + ); + } } From 1135c8af73c8d8bcab85d582b265eab24bca4475 Mon Sep 17 00:00:00 2001 From: Gabe Rodriguez Date: Tue, 3 Jan 2023 21:47:14 +0100 Subject: [PATCH 0117/2372] Add macro abstraction support --- packages/std/src/errors/std_error.rs | 3 ++ packages/std/src/math/fraction.rs | 63 ++++++++++++++++++++++++++++ packages/std/src/math/uint128.rs | 56 +++++++------------------ 3 files changed, 81 insertions(+), 41 deletions(-) diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index 101c1a040d..89df9b793a 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -563,6 +563,9 @@ pub enum CheckedMultiplyFractionalError { #[error("{0}")] ConversionOverflow(#[from] ConversionOverflowError), + + #[error("{0}")] + Overflow(#[from] OverflowError), } #[derive(Error, Debug, PartialEq, Eq)] diff --git a/packages/std/src/math/fraction.rs b/packages/std/src/math/fraction.rs index 489db1a3d9..10e824c8fe 100644 --- a/packages/std/src/math/fraction.rs +++ b/packages/std/src/math/fraction.rs @@ -1,5 +1,8 @@ use serde::{Deserialize, Serialize}; +use crate::errors::CheckedMultiplyFractionalError; +use crate::Uint512; + /// A fraction `p`/`q` with integers `p` and `q`. /// /// `p` is called the numerator and `q` is called the denominator. @@ -37,3 +40,63 @@ impl Fractional for Fraction { unimplemented!() } } + +pub trait FractionMath { + fn checked_mul_floored, T: Into>( + self, + rhs: F, + ) -> Result + where + Self: Sized; + + fn mul_floored, T: Into>(self, rhs: F) -> Self; + + fn checked_mul_ceil + Clone, T: Into>( + self, + rhs: F, + ) -> Result + where + Self: Sized; + + fn mul_ceil + Clone, T: Into>(self, rhs: F) -> Self; +} + +#[macro_export] +macro_rules! fraction_math { + ($name:ident) => { + impl FractionMath for $name { + fn checked_mul_floored, T: Into>( + self, + rhs: F, + ) -> Result { + let res = Uint512::from(self) + .checked_mul(rhs.numerator().into())? + .checked_div(rhs.denominator().into())?; + Ok(res.try_into()?) + } + + fn mul_floored, T: Into>(self, rhs: F) -> Self { + self.checked_mul_floored(rhs).unwrap() + } + + fn mul_ceil + Clone, T: Into>(self, rhs: F) -> Self { + self.checked_mul_ceil(rhs).unwrap() + } + + fn checked_mul_ceil + Clone, T: Into>( + self, + rhs: F, + ) -> Result { + let floor_result = self.checked_mul_floored(rhs.clone())?; + let numerator = rhs.numerator().into(); + let denominator = rhs.denominator().into(); + if !numerator.checked_rem(denominator)?.is_zero() { + let ceil_result = Uint512::one().checked_add(floor_result.into())?; + Ok(ceil_result.try_into()?) + } else { + Ok(floor_result) + } + } + } + }; +} diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 3d999ea600..91e315aa1f 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -1,17 +1,19 @@ -use forward_ref::{forward_ref_binop, forward_ref_op_assign}; -use schemars::JsonSchema; -use serde::{de, ser, Deserialize, Deserializer, Serialize}; use std::fmt::{self}; use std::ops::{ Add, AddAssign, Div, DivAssign, Mul, MulAssign, Rem, RemAssign, Shr, ShrAssign, Sub, SubAssign, }; use std::str::FromStr; +use forward_ref::{forward_ref_binop, forward_ref_op_assign}; +use schemars::JsonSchema; +use serde::{de, ser, Deserialize, Deserializer, Serialize}; + +use crate::errors::CheckedMultiplyFractionalError; use crate::errors::{ - CheckedMultiplyFractionalError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, - OverflowOperation, StdError, + CheckedMultiplyRatioError, DivideByZeroError, OverflowError, OverflowOperation, StdError, }; -use crate::{ConversionOverflowError, Fractional, Uint256, Uint64}; +use crate::math::fraction::FractionMath; +use crate::{fraction_math, ConversionOverflowError, Fractional, Uint256, Uint512, Uint64}; /// A thin wrapper around u128 that is using strings for JSON encoding/decoding, /// such that the full u128 range can be used for clients that convert JSON numbers to floats, @@ -137,37 +139,6 @@ impl Uint128 { .unwrap() } - pub fn mul_floored, T: Into>(self, rhs: F) -> Self { - self.checked_mul_floored(rhs).unwrap() - } - - pub fn checked_mul_floored, T: Into>( - self, - rhs: F, - ) -> Result { - let res = self - .full_mul(rhs.numerator()) - .checked_div(Uint256::from(rhs.denominator().into()))?; - Ok(res.try_into()?) - } - - pub fn mul_ceil + Clone, T: Into>(self, rhs: F) -> Self { - self.checked_mul_ceil(rhs).unwrap() - } - - pub fn checked_mul_ceil + Clone, T: Into>( - self, - rhs: F, - ) -> Result { - let mut result = self.checked_mul_floored(rhs.clone())?; - let numerator = Uint256::from(rhs.numerator().into()); - let denominator = Uint256::from(rhs.denominator().into()); - if !numerator.checked_rem(denominator)?.is_zero() { - result += Uint128::one(); - }; - Ok(result) - } - pub fn checked_add(self, other: Self) -> Result { self.0 .checked_add(other.0) @@ -262,6 +233,8 @@ impl Uint128 { } } +fraction_math!(Uint128); + // `From` is implemented manually instead of // using `impl> From for Uint128` because // of the conflict with `TryFrom<&str>` as described here @@ -569,11 +542,12 @@ impl PartialEq for &Uint128 { #[cfg(test)] mod tests { - use super::*; use crate::errors::CheckedMultiplyFractionalError::{ConversionOverflow, DivideByZero}; - use crate::math::fraction::Fraction; + use crate::math::fraction::{Fraction, FractionMath}; use crate::{from_slice, to_vec, Decimal}; + use super::*; + #[test] fn size_of_works() { assert_eq!(std::mem::size_of::(), 16); @@ -1115,7 +1089,7 @@ mod tests { assert_eq!( Uint128::MAX.checked_mul_floored(fraction), Err(ConversionOverflow(ConversionOverflowError { - source_type: "Uint256", + source_type: "Uint512", target_type: "Uint128", value: "893241213167463466591358344508391555069".to_string() })), @@ -1181,7 +1155,7 @@ mod tests { assert_eq!( Uint128::MAX.checked_mul_ceil(fraction), Err(ConversionOverflow(ConversionOverflowError { - source_type: "Uint256", + source_type: "Uint512", target_type: "Uint128", value: "893241213167463466591358344508391555069".to_string() })), From 33df9fdcec4b0ec1adeae22f4ce4dcb1dbf08e15 Mon Sep 17 00:00:00 2001 From: Gabe Rodriguez Date: Tue, 3 Jan 2023 22:00:58 +0100 Subject: [PATCH 0118/2372] Higher bit size tests --- packages/std/src/math/uint128.rs | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 91e315aa1f..c455b6bfa7 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -544,7 +544,7 @@ impl PartialEq for &Uint128 { mod tests { use crate::errors::CheckedMultiplyFractionalError::{ConversionOverflow, DivideByZero}; use crate::math::fraction::{Fraction, FractionMath}; - use crate::{from_slice, to_vec, Decimal}; + use crate::{from_slice, to_vec, Decimal, Decimal256}; use super::*; @@ -1069,6 +1069,13 @@ mod tests { assert_eq!(Uint128::new(47030), res) } + #[test] + fn mul_floored_works_with_higher_bit_sizes() { + let fraction = Fraction::new(Uint256::from(8u128), Uint256::from(21u128)); + let res = Uint128::new(123456).mul_floored(fraction); // 47030.8571 + assert_eq!(Uint128::new(47030), res) + } + #[test] fn mul_floored_works_with_decimal() { let decimal = Decimal::from_ratio(8u128, 21u128); @@ -1076,6 +1083,13 @@ mod tests { assert_eq!(Uint128::new(47030), res) } + #[test] + fn mul_floored_works_with_decimal256() { + let decimal = Decimal256::from_ratio(8u128, 21u128); + let res = Uint128::new(123456).mul_floored(decimal); // 47030.8571 + assert_eq!(Uint128::new(47030), res) + } + #[test] #[should_panic(expected = "ConversionOverflowError")] fn mul_floored_panics_on_overflow() { @@ -1135,6 +1149,13 @@ mod tests { assert_eq!(Uint128::new(47031), res) } + #[test] + fn mul_ceil_works_with_higher_bit_sizes() { + let fraction = Fraction::new(Uint256::from(8u128), Uint256::from(21u128)); + let res = Uint128::new(123456).mul_ceil(fraction); // 47030.8571 + assert_eq!(Uint128::new(47031), res) + } + #[test] fn mul_ceil_works_with_decimal() { let decimal = Decimal::from_ratio(8u128, 21u128); @@ -1142,6 +1163,13 @@ mod tests { assert_eq!(Uint128::new(47031), res) } + #[test] + fn mul_ceil_works_with_decimal256() { + let decimal = Decimal256::from_ratio(8u128, 21u128); + let res = Uint128::new(123456).mul_ceil(decimal); // 47030.8571 + assert_eq!(Uint128::new(47031), res) + } + #[test] #[should_panic(expected = "ConversionOverflowError")] fn mul_ceil_panics_on_overflow() { From 70fc13509ad04d9845c8991257efb3261b0f08c4 Mon Sep 17 00:00:00 2001 From: Gabe Rodriguez Date: Wed, 4 Jan 2023 17:02:56 +0100 Subject: [PATCH 0119/2372] Macro & math updates --- packages/std/src/errors/mod.rs | 2 +- packages/std/src/errors/std_error.rs | 2 +- packages/std/src/lib.rs | 2 +- packages/std/src/math/decimal.rs | 4 +- packages/std/src/math/decimal256.rs | 4 +- packages/std/src/math/fraction.rs | 72 +++++++----------------- packages/std/src/math/mod.rs | 2 +- packages/std/src/math/uint128.rs | 82 ++++++++++++---------------- 8 files changed, 63 insertions(+), 107 deletions(-) diff --git a/packages/std/src/errors/mod.rs b/packages/std/src/errors/mod.rs index 01793bfe17..705382b732 100644 --- a/packages/std/src/errors/mod.rs +++ b/packages/std/src/errors/mod.rs @@ -5,7 +5,7 @@ mod verification_error; pub use recover_pubkey_error::RecoverPubkeyError; pub use std_error::{ - CheckedFromRatioError, CheckedMultiplyFractionalError, CheckedMultiplyRatioError, + CheckedFromRatioError, CheckedMultiplyFractionError, CheckedMultiplyRatioError, ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, RoundUpOverflowError, StdError, StdResult, }; diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index 89df9b793a..79b6a82f27 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -557,7 +557,7 @@ impl DivideByZeroError { } #[derive(Error, Debug, PartialEq, Eq)] -pub enum CheckedMultiplyFractionalError { +pub enum CheckedMultiplyFractionError { #[error("{0}")] DivideByZero(#[from] DivideByZeroError), diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index af696d5d12..a15f0f4c62 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -46,7 +46,7 @@ pub use crate::ibc::{ #[cfg(feature = "iterator")] pub use crate::iterator::{Order, Record}; pub use crate::math::{ - Decimal, Decimal256, Decimal256RangeExceeded, DecimalRangeExceeded, Fractional, Isqrt, Uint128, + Decimal, Decimal256, Decimal256RangeExceeded, DecimalRangeExceeded, Fraction, Isqrt, Uint128, Uint256, Uint512, Uint64, }; pub use crate::never::Never; diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 867b8dc6bd..72975e22e3 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -12,7 +12,7 @@ use crate::errors::{ OverflowOperation, RoundUpOverflowError, StdError, }; -use super::Fractional; +use super::Fraction; use super::Isqrt; use super::{Uint128, Uint256}; @@ -359,7 +359,7 @@ impl Decimal { } } -impl Fractional for Decimal { +impl Fraction for Decimal { #[inline] fn numerator(&self) -> Uint128 { self.0 diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 7d5c3c981f..0c2b134b5b 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -13,7 +13,7 @@ use crate::errors::{ }; use crate::{Decimal, Uint512}; -use super::Fractional; +use super::Fraction; use super::Isqrt; use super::Uint256; @@ -376,7 +376,7 @@ impl Decimal256 { } } -impl Fractional for Decimal256 { +impl Fraction for Decimal256 { #[inline] fn numerator(&self) -> Uint256 { self.0 diff --git a/packages/std/src/math/fraction.rs b/packages/std/src/math/fraction.rs index 10e824c8fe..7d6afedcba 100644 --- a/packages/std/src/math/fraction.rs +++ b/packages/std/src/math/fraction.rs @@ -1,12 +1,7 @@ -use serde::{Deserialize, Serialize}; - -use crate::errors::CheckedMultiplyFractionalError; -use crate::Uint512; - /// A fraction `p`/`q` with integers `p` and `q`. /// /// `p` is called the numerator and `q` is called the denominator. -pub trait Fractional: Sized { +pub trait Fraction: Sized { /// Returns the numerator `p` fn numerator(&self) -> T; /// Returns the denominator `q` @@ -18,16 +13,7 @@ pub trait Fractional: Sized { fn inv(&self) -> Option; } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] -pub struct Fraction(T, T); - -impl Fraction { - pub fn new(numerator: T, denominator: T) -> Self { - Self(numerator, denominator) - } -} - -impl Fractional for Fraction { +impl Fraction for (T, T) { fn numerator(&self) -> T { self.0.clone() } @@ -37,66 +23,46 @@ impl Fractional for Fraction { } fn inv(&self) -> Option { - unimplemented!() + Some((self.1.clone(), self.0.clone())) } } -pub trait FractionMath { - fn checked_mul_floored, T: Into>( - self, - rhs: F, - ) -> Result - where - Self: Sized; - - fn mul_floored, T: Into>(self, rhs: F) -> Self; - - fn checked_mul_ceil + Clone, T: Into>( - self, - rhs: F, - ) -> Result - where - Self: Sized; - - fn mul_ceil + Clone, T: Into>(self, rhs: F) -> Self; -} - #[macro_export] -macro_rules! fraction_math { - ($name:ident) => { - impl FractionMath for $name { - fn checked_mul_floored, T: Into>( +macro_rules! impl_mul_fraction { + ($UintBase:ident, $UintLarger:ident) => { + impl $UintBase { + pub fn checked_mul_floored, T: Into<$UintBase>>( self, rhs: F, - ) -> Result { - let res = Uint512::from(self) - .checked_mul(rhs.numerator().into())? - .checked_div(rhs.denominator().into())?; + ) -> Result { + let res = self + .full_mul(rhs.numerator().into()) + .checked_div($UintLarger::from(rhs.denominator().into()))?; Ok(res.try_into()?) } - fn mul_floored, T: Into>(self, rhs: F) -> Self { + pub fn mul_floored, T: Into<$UintBase>>(self, rhs: F) -> Self { self.checked_mul_floored(rhs).unwrap() } - fn mul_ceil + Clone, T: Into>(self, rhs: F) -> Self { - self.checked_mul_ceil(rhs).unwrap() - } - - fn checked_mul_ceil + Clone, T: Into>( + pub fn checked_mul_ceil + Clone, T: Into<$UintBase>>( self, rhs: F, - ) -> Result { + ) -> Result { let floor_result = self.checked_mul_floored(rhs.clone())?; let numerator = rhs.numerator().into(); let denominator = rhs.denominator().into(); if !numerator.checked_rem(denominator)?.is_zero() { - let ceil_result = Uint512::one().checked_add(floor_result.into())?; + let ceil_result = $UintLarger::one().checked_add(floor_result.into())?; Ok(ceil_result.try_into()?) } else { Ok(floor_result) } } + + pub fn mul_ceil + Clone, T: Into<$UintBase>>(self, rhs: F) -> Self { + self.checked_mul_ceil(rhs).unwrap() + } } }; } diff --git a/packages/std/src/math/mod.rs b/packages/std/src/math/mod.rs index 8151fd6f56..706d23005d 100644 --- a/packages/std/src/math/mod.rs +++ b/packages/std/src/math/mod.rs @@ -9,7 +9,7 @@ mod uint64; pub use decimal::{Decimal, DecimalRangeExceeded}; pub use decimal256::{Decimal256, Decimal256RangeExceeded}; -pub use fraction::Fractional; +pub use fraction::Fraction; pub use isqrt::Isqrt; pub use uint128::Uint128; pub use uint256::Uint256; diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index c455b6bfa7..48234453f8 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -8,12 +8,11 @@ use forward_ref::{forward_ref_binop, forward_ref_op_assign}; use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; -use crate::errors::CheckedMultiplyFractionalError; use crate::errors::{ - CheckedMultiplyRatioError, DivideByZeroError, OverflowError, OverflowOperation, StdError, + CheckedMultiplyFractionError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, + OverflowOperation, StdError, }; -use crate::math::fraction::FractionMath; -use crate::{fraction_math, ConversionOverflowError, Fractional, Uint256, Uint512, Uint64}; +use crate::{impl_mul_fraction, ConversionOverflowError, Fraction, Uint256, Uint64}; /// A thin wrapper around u128 that is using strings for JSON encoding/decoding, /// such that the full u128 range can be used for clients that convert JSON numbers to floats, @@ -233,7 +232,7 @@ impl Uint128 { } } -fraction_math!(Uint128); +impl_mul_fraction!(Uint128, Uint256); // `From` is implemented manually instead of // using `impl> From for Uint128` because @@ -542,9 +541,8 @@ impl PartialEq for &Uint128 { #[cfg(test)] mod tests { - use crate::errors::CheckedMultiplyFractionalError::{ConversionOverflow, DivideByZero}; - use crate::math::fraction::{Fraction, FractionMath}; - use crate::{from_slice, to_vec, Decimal, Decimal256}; + use crate::errors::CheckedMultiplyFractionError::{ConversionOverflow, DivideByZero}; + use crate::{from_slice, to_vec, Decimal}; use super::*; @@ -1050,30 +1048,33 @@ mod tests { #[test] fn mul_floored_works_with_zero() { - let fraction = Fraction::new(Uint128::zero(), Uint128::new(21)); + let fraction = (Uint128::zero(), Uint128::new(21)); let res = Uint128::new(123456).mul_floored(fraction); assert_eq!(Uint128::zero(), res) } #[test] fn mul_floored_does_nothing_with_one() { - let fraction = Fraction::new(Uint128::one(), Uint128::one()); + let fraction = (Uint128::one(), Uint128::one()); let res = Uint128::new(123456).mul_floored(fraction); assert_eq!(Uint128::new(123456), res) } #[test] fn mul_floored_rounds_down_with_normal_case() { - let fraction = Fraction::new(8u128, 21u128); + let fraction = (8u128, 21u128); let res = Uint128::new(123456).mul_floored(fraction); // 47030.8571 assert_eq!(Uint128::new(47030), res) } #[test] - fn mul_floored_works_with_higher_bit_sizes() { - let fraction = Fraction::new(Uint256::from(8u128), Uint256::from(21u128)); - let res = Uint128::new(123456).mul_floored(fraction); // 47030.8571 - assert_eq!(Uint128::new(47030), res) + fn mul_floored_works_when_operation_temporarily_takes_above_max() { + let fraction = (8u128, 21u128); + let res = Uint128::MAX.mul_floored(fraction); // 129_631_377_874_643_224_176_523_659_974_006_937_697.14285 + assert_eq!( + Uint128::new(129_631_377_874_643_224_176_523_659_974_006_937_697), + res + ) } #[test] @@ -1083,27 +1084,20 @@ mod tests { assert_eq!(Uint128::new(47030), res) } - #[test] - fn mul_floored_works_with_decimal256() { - let decimal = Decimal256::from_ratio(8u128, 21u128); - let res = Uint128::new(123456).mul_floored(decimal); // 47030.8571 - assert_eq!(Uint128::new(47030), res) - } - #[test] #[should_panic(expected = "ConversionOverflowError")] fn mul_floored_panics_on_overflow() { - let fraction = Fraction::new(21u128, 8u128); + let fraction = (21u128, 8u128); Uint128::MAX.mul_floored(fraction); } #[test] fn checked_mul_floored_does_not_panic_on_overflow() { - let fraction = Fraction::new(21u128, 8u128); + let fraction = (21u128, 8u128); assert_eq!( Uint128::MAX.checked_mul_floored(fraction), Err(ConversionOverflow(ConversionOverflowError { - source_type: "Uint512", + source_type: "Uint256", target_type: "Uint128", value: "893241213167463466591358344508391555069".to_string() })), @@ -1113,13 +1107,13 @@ mod tests { #[test] #[should_panic(expected = "DivideByZeroError")] fn mul_floored_panics_on_zero_div() { - let fraction = Fraction::new(21u128, 0u128); + let fraction = (21u128, 0u128); Uint128::new(123456).mul_floored(fraction); } #[test] fn checked_mul_floored_does_not_panic_on_zero_div() { - let fraction = Fraction::new(21u128, 0u128); + let fraction = (21u128, 0u128); assert_eq!( Uint128::new(123456).checked_mul_floored(fraction), Err(DivideByZero(DivideByZeroError { @@ -1130,30 +1124,33 @@ mod tests { #[test] fn mul_ceil_works_with_zero() { - let fraction = Fraction::new(Uint128::zero(), Uint128::new(21)); + let fraction = (Uint128::zero(), Uint128::new(21)); let res = Uint128::new(123456).mul_ceil(fraction); assert_eq!(Uint128::zero(), res) } #[test] fn mul_ceil_does_nothing_with_one() { - let fraction = Fraction::new(Uint128::one(), Uint128::one()); + let fraction = (Uint128::one(), Uint128::one()); let res = Uint128::new(123456).mul_ceil(fraction); assert_eq!(Uint128::new(123456), res) } #[test] fn mul_ceil_rounds_up_with_normal_case() { - let fraction = Fraction::new(8u128, 21u128); + let fraction = (8u128, 21u128); let res = Uint128::new(123456).mul_ceil(fraction); // 47030.8571 assert_eq!(Uint128::new(47031), res) } #[test] - fn mul_ceil_works_with_higher_bit_sizes() { - let fraction = Fraction::new(Uint256::from(8u128), Uint256::from(21u128)); - let res = Uint128::new(123456).mul_ceil(fraction); // 47030.8571 - assert_eq!(Uint128::new(47031), res) + fn mul_ceil_works_when_operation_temporarily_takes_above_max() { + let fraction = (8u128, 21u128); + let res = Uint128::MAX.mul_ceil(fraction); // 129_631_377_874_643_224_176_523_659_974_006_937_697.14285 + assert_eq!( + Uint128::new(129_631_377_874_643_224_176_523_659_974_006_937_698), + res + ) } #[test] @@ -1163,27 +1160,20 @@ mod tests { assert_eq!(Uint128::new(47031), res) } - #[test] - fn mul_ceil_works_with_decimal256() { - let decimal = Decimal256::from_ratio(8u128, 21u128); - let res = Uint128::new(123456).mul_ceil(decimal); // 47030.8571 - assert_eq!(Uint128::new(47031), res) - } - #[test] #[should_panic(expected = "ConversionOverflowError")] fn mul_ceil_panics_on_overflow() { - let fraction = Fraction::new(21u128, 8u128); + let fraction = (21u128, 8u128); Uint128::MAX.mul_ceil(fraction); } #[test] fn checked_mul_ceil_does_not_panic_on_overflow() { - let fraction = Fraction::new(21u128, 8u128); + let fraction = (21u128, 8u128); assert_eq!( Uint128::MAX.checked_mul_ceil(fraction), Err(ConversionOverflow(ConversionOverflowError { - source_type: "Uint512", + source_type: "Uint256", target_type: "Uint128", value: "893241213167463466591358344508391555069".to_string() })), @@ -1193,13 +1183,13 @@ mod tests { #[test] #[should_panic(expected = "DivideByZeroError")] fn mul_ceil_panics_on_zero_div() { - let fraction = Fraction::new(21u128, 0u128); + let fraction = (21u128, 0u128); Uint128::new(123456).mul_ceil(fraction); } #[test] fn checked_mul_ceil_does_not_panic_on_zero_div() { - let fraction = Fraction::new(21u128, 0u128); + let fraction = (21u128, 0u128); assert_eq!( Uint128::new(123456).checked_mul_ceil(fraction), Err(DivideByZero(DivideByZeroError { From eddb6b30d49e5893ceafd4f15ae6af179b35d86d Mon Sep 17 00:00:00 2001 From: Gabe Rodriguez Date: Wed, 4 Jan 2023 22:16:37 +0100 Subject: [PATCH 0120/2372] extend macro to Uint64/256 --- packages/std/src/math/fraction.rs | 18 +-- packages/std/src/math/uint128.rs | 4 +- packages/std/src/math/uint256.rs | 187 +++++++++++++++++++++++++++++- packages/std/src/math/uint64.rs | 142 ++++++++++++++++++++++- 4 files changed, 333 insertions(+), 18 deletions(-) diff --git a/packages/std/src/math/fraction.rs b/packages/std/src/math/fraction.rs index 7d6afedcba..eca7cea8f0 100644 --- a/packages/std/src/math/fraction.rs +++ b/packages/std/src/math/fraction.rs @@ -29,23 +29,24 @@ impl Fraction for (T, T) { #[macro_export] macro_rules! impl_mul_fraction { - ($UintBase:ident, $UintLarger:ident) => { - impl $UintBase { - pub fn checked_mul_floored, T: Into<$UintBase>>( + ($Uint:ident) => { + impl $Uint { + pub fn checked_mul_floored, T: Into<$Uint>>( self, rhs: F, ) -> Result { + let divisor = rhs.denominator().into(); let res = self .full_mul(rhs.numerator().into()) - .checked_div($UintLarger::from(rhs.denominator().into()))?; + .checked_div(divisor.into())?; Ok(res.try_into()?) } - pub fn mul_floored, T: Into<$UintBase>>(self, rhs: F) -> Self { + pub fn mul_floored, T: Into<$Uint>>(self, rhs: F) -> Self { self.checked_mul_floored(rhs).unwrap() } - pub fn checked_mul_ceil + Clone, T: Into<$UintBase>>( + pub fn checked_mul_ceil + Clone, T: Into<$Uint>>( self, rhs: F, ) -> Result { @@ -53,14 +54,13 @@ macro_rules! impl_mul_fraction { let numerator = rhs.numerator().into(); let denominator = rhs.denominator().into(); if !numerator.checked_rem(denominator)?.is_zero() { - let ceil_result = $UintLarger::one().checked_add(floor_result.into())?; - Ok(ceil_result.try_into()?) + Ok($Uint::one().checked_add(floor_result)?) } else { Ok(floor_result) } } - pub fn mul_ceil + Clone, T: Into<$UintBase>>(self, rhs: F) -> Self { + pub fn mul_ceil + Clone, T: Into<$Uint>>(self, rhs: F) -> Self { self.checked_mul_ceil(rhs).unwrap() } } diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 48234453f8..1372c64aaf 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -232,7 +232,7 @@ impl Uint128 { } } -impl_mul_fraction!(Uint128, Uint256); +impl_mul_fraction!(Uint128); // `From` is implemented manually instead of // using `impl> From for Uint128` because @@ -1175,7 +1175,7 @@ mod tests { Err(ConversionOverflow(ConversionOverflowError { source_type: "Uint256", target_type: "Uint128", - value: "893241213167463466591358344508391555069".to_string() + value: "893241213167463466591358344508391555069".to_string() // raises prior to rounding up })), ); } diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 743281735d..f7ad54e32c 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -9,10 +9,10 @@ use std::ops::{ use std::str::FromStr; use crate::errors::{ - CheckedMultiplyRatioError, ConversionOverflowError, DivideByZeroError, OverflowError, - OverflowOperation, StdError, + CheckedMultiplyFractionError, CheckedMultiplyRatioError, ConversionOverflowError, + DivideByZeroError, OverflowError, OverflowOperation, StdError, }; -use crate::{Uint128, Uint512, Uint64}; +use crate::{impl_mul_fraction, Fraction, Uint128, Uint512, Uint64}; /// This module is purely a workaround that lets us ignore lints for all the code /// the `construct_uint!` macro generates. @@ -336,6 +336,8 @@ impl Uint256 { } } +impl_mul_fraction!(Uint256); + impl From for Uint256 { fn from(val: Uint128) -> Self { val.u128().into() @@ -666,7 +668,8 @@ impl PartialEq for &Uint256 { #[cfg(test)] mod tests { use super::*; - use crate::{from_slice, to_vec}; + use crate::errors::CheckedMultiplyFractionError::{ConversionOverflow, DivideByZero}; + use crate::{from_slice, to_vec, Decimal, Decimal256}; #[test] fn size_of_works() { @@ -1664,4 +1667,180 @@ mod tests { assert_eq!(&lhs == &rhs, expected); } } + + #[test] + fn mul_floored_works_with_zero() { + let fraction = (Uint256::zero(), Uint256::from(21u32)); + let res = Uint256::from(123456u32).mul_floored(fraction); + assert_eq!(Uint256::zero(), res) + } + + #[test] + fn mul_floored_does_nothing_with_one() { + let fraction = (Uint256::one(), Uint256::one()); + let res = Uint256::from(123456u32).mul_floored(fraction); + assert_eq!(Uint256::from(123456u32), res) + } + + #[test] + fn mul_floored_rounds_down_with_normal_case() { + let fraction = (Uint256::from(8u128), Uint256::from(21u128)); + let res = Uint256::from(123456u32).mul_floored(fraction); // 47030.8571 + assert_eq!(Uint256::from(47030u32), res) + } + + #[test] + fn mul_floored_works_when_operation_temporarily_takes_above_max() { + let fraction = (8u128, 21u128); + let res = Uint256::MAX.mul_floored(fraction); // 44_111_272_090_406_169_685_169_899_050_928_726_801_245_708_444_053_548_205_507_651_050_633_573_196_165.71428571 + assert_eq!( + Uint256::from_str( + "44111272090406169685169899050928726801245708444053548205507651050633573196165" + ) + .unwrap(), + res + ) + } + + #[test] + fn mul_floored_works_with_decimal() { + let decimal = Decimal::from_ratio(8u128, 21u128); + let res = Uint256::from(123456u32).mul_floored(decimal); // 47030.8571 + assert_eq!(Uint256::from(47030u32), res) + } + + #[test] + fn mul_floored_works_with_decimal256() { + let decimal = Decimal256::from_ratio(8u128, 21u128); + let res = Uint256::from(123456u32).mul_floored(decimal); // 47030.8571 + assert_eq!(Uint256::from(47030u32), res) + } + + #[test] + #[should_panic(expected = "ConversionOverflowError")] + fn mul_floored_panics_on_overflow() { + let fraction = (21u128, 8u128); + Uint256::MAX.mul_floored(fraction); + } + + #[test] + fn checked_mul_floored_does_not_panic_on_overflow() { + let fraction = (21u128, 8u128); + assert_eq!( + Uint256::MAX.checked_mul_floored(fraction), + Err(ConversionOverflow(ConversionOverflowError { + source_type: "Uint512", + target_type: "Uint256", + value: + "303954234247955012986873835647805758114833709747306480603576158020771965304829" + .to_string() + })), + ); + } + + #[test] + #[should_panic(expected = "DivideByZeroError")] + fn mul_floored_panics_on_zero_div() { + let fraction = (21u128, 0u128); + Uint256::from(123456u32).mul_floored(fraction); + } + + #[test] + fn checked_mul_floored_does_not_panic_on_zero_div() { + let fraction = (21u128, 0u128); + assert_eq!( + Uint256::from(123456u32).checked_mul_floored(fraction), + Err(DivideByZero(DivideByZeroError { + operand: "2592576".to_string() + })), + ); + } + + #[test] + fn mul_ceil_works_with_zero() { + let fraction = (Uint256::zero(), Uint256::from(21u32)); + let res = Uint256::from(123456u32).mul_ceil(fraction); + assert_eq!(Uint256::zero(), res) + } + + #[test] + fn mul_ceil_does_nothing_with_one() { + let fraction = (Uint256::one(), Uint256::one()); + let res = Uint256::from(123456u32).mul_ceil(fraction); + assert_eq!(Uint256::from(123456u32), res) + } + + #[test] + fn mul_ceil_rounds_up_with_normal_case() { + let fraction = (8u128, 21u128); + let res = Uint256::from(123456u32).mul_ceil(fraction); // 47030.8571 + assert_eq!(Uint256::from(47031u32), res) + } + + #[test] + fn mul_ceil_works_when_operation_temporarily_takes_above_max() { + let fraction = (8u128, 21u128); + let res = Uint256::MAX.mul_ceil(fraction); // 44_111_272_090_406_169_685_169_899_050_928_726_801_245_708_444_053_548_205_507_651_050_633_573_196_165.71428571 + assert_eq!( + Uint256::from_str( + "44111272090406169685169899050928726801245708444053548205507651050633573196166" + ) + .unwrap(), + res + ) + } + + #[test] + fn mul_ceil_works_with_decimal() { + let decimal = Decimal::from_ratio(8u128, 21u128); + let res = Uint256::from(123456u32).mul_ceil(decimal); // 47030.8571 + assert_eq!(Uint256::from(47031u32), res) + } + + #[test] + fn mul_ceil_works_with_decimal256() { + let decimal = Decimal256::from_ratio(8u128, 21u128); + let res = Uint256::from(123456u32).mul_ceil(decimal); // 47030.8571 + assert_eq!(Uint256::from(47031u32), res) + } + + #[test] + #[should_panic(expected = "ConversionOverflowError")] + fn mul_ceil_panics_on_overflow() { + let fraction = (21u128, 8u128); + Uint256::MAX.mul_ceil(fraction); + } + + #[test] + fn checked_mul_ceil_does_not_panic_on_overflow() { + let fraction = (21u128, 8u128); + assert_eq!( + Uint256::MAX.checked_mul_ceil(fraction), + Err(ConversionOverflow(ConversionOverflowError { + source_type: "Uint512", + target_type: "Uint256", + value: + "303954234247955012986873835647805758114833709747306480603576158020771965304829" // raises prior to rounding up + .to_string() + })), + ); + } + + #[test] + #[should_panic(expected = "DivideByZeroError")] + fn mul_ceil_panics_on_zero_div() { + let fraction = (21u128, 0u128); + Uint256::from(123456u32).mul_ceil(fraction); + } + + #[test] + fn checked_mul_ceil_does_not_panic_on_zero_div() { + let fraction = (21u128, 0u128); + assert_eq!( + Uint256::from(123456u32).checked_mul_ceil(fraction), + Err(DivideByZero(DivideByZeroError { + operand: "2592576".to_string() + })), + ); + } } diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index 97032633e2..afe0baeb58 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -7,9 +7,10 @@ use std::ops::{ }; use crate::errors::{ - CheckedMultiplyRatioError, DivideByZeroError, OverflowError, OverflowOperation, StdError, + CheckedMultiplyFractionError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, + OverflowOperation, StdError, }; -use crate::Uint128; +use crate::{impl_mul_fraction, Fraction, Uint128}; /// A thin wrapper around u64 that is using strings for JSON encoding/decoding, /// such that the full u64 range can be used for clients that convert JSON numbers to floats, @@ -226,6 +227,8 @@ impl Uint64 { } } +impl_mul_fraction!(Uint64); + // `From` is implemented manually instead of // using `impl> From for Uint64` because // of the conflict with `TryFrom<&str>` as described here @@ -492,7 +495,8 @@ impl PartialEq for &Uint64 { #[cfg(test)] mod tests { use super::*; - use crate::{from_slice, to_vec}; + use crate::errors::CheckedMultiplyFractionError::{ConversionOverflow, DivideByZero}; + use crate::{from_slice, to_vec, ConversionOverflowError}; #[test] fn size_of_works() { @@ -955,4 +959,136 @@ mod tests { assert_eq!(&lhs == &rhs, expected); } } + + #[test] + fn mul_floored_works_with_zero() { + let fraction = (0u32, 21u32); + let res = Uint64::new(123456).mul_floored(fraction); + assert_eq!(Uint64::zero(), res) + } + + #[test] + fn mul_floored_does_nothing_with_one() { + let fraction = (Uint64::one(), Uint64::one()); + let res = Uint64::new(123456).mul_floored(fraction); + assert_eq!(Uint64::new(123456), res) + } + + #[test] + fn mul_floored_rounds_down_with_normal_case() { + let fraction = (8u64, 21u64); + let res = Uint64::new(123456).mul_floored(fraction); // 47030.8571 + assert_eq!(Uint64::new(47030), res) + } + + #[test] + fn mul_floored_works_when_operation_temporarily_takes_above_max() { + let fraction = (8u64, 21u64); + let res = Uint64::MAX.mul_floored(fraction); // 7_027_331_075_698_876_805.71428571 + assert_eq!(Uint64::new(7_027_331_075_698_876_805), res) + } + + #[test] + #[should_panic(expected = "ConversionOverflowError")] + fn mul_floored_panics_on_overflow() { + let fraction = (21u64, 8u64); + Uint64::MAX.mul_floored(fraction); + } + + #[test] + fn checked_mul_floored_does_not_panic_on_overflow() { + let fraction = (21u64, 8u64); + assert_eq!( + Uint64::MAX.checked_mul_floored(fraction), + Err(ConversionOverflow(ConversionOverflowError { + source_type: "Uint128", + target_type: "Uint64", + value: "48422703193487572989".to_string() + })), + ); + } + + #[test] + #[should_panic(expected = "DivideByZeroError")] + fn mul_floored_panics_on_zero_div() { + let fraction = (21u64, 0u64); + Uint64::new(123456).mul_floored(fraction); + } + + #[test] + fn checked_mul_floored_does_not_panic_on_zero_div() { + let fraction = (21u64, 0u64); + assert_eq!( + Uint64::new(123456).checked_mul_floored(fraction), + Err(DivideByZero(DivideByZeroError { + operand: "2592576".to_string() + })), + ); + } + + #[test] + fn mul_ceil_works_with_zero() { + let fraction = (Uint64::zero(), Uint64::new(21)); + let res = Uint64::new(123456).mul_ceil(fraction); + assert_eq!(Uint64::zero(), res) + } + + #[test] + fn mul_ceil_does_nothing_with_one() { + let fraction = (Uint64::one(), Uint64::one()); + let res = Uint64::new(123456).mul_ceil(fraction); + assert_eq!(Uint64::new(123456), res) + } + + #[test] + fn mul_ceil_rounds_up_with_normal_case() { + let fraction = (8u64, 21u64); + let res = Uint64::new(123456).mul_ceil(fraction); // 47030.8571 + assert_eq!(Uint64::new(47031), res) + } + + #[test] + fn mul_ceil_works_when_operation_temporarily_takes_above_max() { + let fraction = (8u64, 21u64); + let res = Uint64::MAX.mul_ceil(fraction); // 7_027_331_075_698_876_805.71428571 + assert_eq!(Uint64::new(7_027_331_075_698_876_806), res) + } + + #[test] + #[should_panic(expected = "ConversionOverflowError")] + fn mul_ceil_panics_on_overflow() { + let fraction = (21u64, 8u64); + Uint64::MAX.mul_ceil(fraction); + } + + #[test] + fn checked_mul_ceil_does_not_panic_on_overflow() { + let fraction = (21u64, 8u64); + assert_eq!( + Uint64::MAX.checked_mul_ceil(fraction), + Err(ConversionOverflow(ConversionOverflowError { + source_type: "Uint128", + target_type: "Uint64", + value: "48422703193487572989".to_string() // raises prior to rounding up + })), + ); + } + + #[test] + #[should_panic(expected = "DivideByZeroError")] + fn mul_ceil_panics_on_zero_div() { + let fraction = (21u64, 0u64); + Uint64::new(123456).mul_ceil(fraction); + } + + #[test] + fn checked_mul_ceil_does_not_panic_on_zero_div() { + let fraction = (21u64, 0u64); + assert_eq!( + Uint64::new(123456).checked_mul_ceil(fraction), + Err(DivideByZero(DivideByZeroError { + operand: "2592576".to_string() + })), + ); + } } From 9a51c7c9c74eb02212d5fe0770b65e409e5d8cc6 Mon Sep 17 00:00:00 2001 From: Gabe Rodriguez Date: Sat, 7 Jan 2023 00:46:11 +0100 Subject: [PATCH 0121/2372] tests + trait update --- packages/std/src/math/fraction.rs | 39 +++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/packages/std/src/math/fraction.rs b/packages/std/src/math/fraction.rs index eca7cea8f0..6b2762f868 100644 --- a/packages/std/src/math/fraction.rs +++ b/packages/std/src/math/fraction.rs @@ -1,3 +1,5 @@ +use crate::Uint256; + /// A fraction `p`/`q` with integers `p` and `q`. /// /// `p` is called the numerator and `q` is called the denominator. @@ -13,17 +15,21 @@ pub trait Fraction: Sized { fn inv(&self) -> Option; } -impl Fraction for (T, T) { +impl> Fraction for (T, T) { fn numerator(&self) -> T { - self.0.clone() + self.0 } fn denominator(&self) -> T { - self.1.clone() + self.1 } fn inv(&self) -> Option { - Some((self.1.clone(), self.0.clone())) + if self.numerator().into() == Uint256::zero() { + None + } else { + Some((self.1, self.0)) + } } } @@ -46,13 +52,13 @@ macro_rules! impl_mul_fraction { self.checked_mul_floored(rhs).unwrap() } - pub fn checked_mul_ceil + Clone, T: Into<$Uint>>( + pub fn checked_mul_ceil, T: Into<$Uint>>( self, rhs: F, ) -> Result { - let floor_result = self.checked_mul_floored(rhs.clone())?; let numerator = rhs.numerator().into(); let denominator = rhs.denominator().into(); + let floor_result = self.checked_mul_floored(rhs)?; if !numerator.checked_rem(denominator)?.is_zero() { Ok($Uint::one().checked_add(floor_result)?) } else { @@ -60,9 +66,28 @@ macro_rules! impl_mul_fraction { } } - pub fn mul_ceil + Clone, T: Into<$Uint>>(self, rhs: F) -> Self { + pub fn mul_ceil, T: Into<$Uint>>(self, rhs: F) -> Self { self.checked_mul_ceil(rhs).unwrap() } } }; } + +#[cfg(test)] +mod tests { + use crate::{Fraction, Uint128, Uint64}; + + #[test] + fn fraction_tuple_methods() { + let fraction = (Uint64::one(), Uint64::new(2)); + assert_eq!(Uint64::one(), fraction.numerator()); + assert_eq!(Uint64::new(2), fraction.denominator()); + assert_eq!(Some((Uint64::new(2), Uint64::one())), fraction.inv()); + } + + #[test] + fn inverse_with_zero_denominator() { + let fraction = (Uint128::zero(), Uint128::one()); + assert_eq!(None, fraction.inv()); + } +} From df4503ce11984e96c8f2fbb08123c7ff6e8498c7 Mon Sep 17 00:00:00 2001 From: Gabe Rodriguez Date: Sun, 8 Jan 2023 11:16:33 +0100 Subject: [PATCH 0122/2372] Ensure no rounds on even divides --- packages/std/src/math/fraction.rs | 8 +++++--- packages/std/src/math/uint128.rs | 14 ++++++++++++++ packages/std/src/math/uint256.rs | 14 ++++++++++++++ packages/std/src/math/uint64.rs | 14 ++++++++++++++ 4 files changed, 47 insertions(+), 3 deletions(-) diff --git a/packages/std/src/math/fraction.rs b/packages/std/src/math/fraction.rs index 6b2762f868..bd8762fac5 100644 --- a/packages/std/src/math/fraction.rs +++ b/packages/std/src/math/fraction.rs @@ -56,10 +56,12 @@ macro_rules! impl_mul_fraction { self, rhs: F, ) -> Result { - let numerator = rhs.numerator().into(); - let denominator = rhs.denominator().into(); + let divisor = rhs.denominator().into(); + let remainder = self + .full_mul(rhs.numerator().into()) + .checked_rem(divisor.into())?; let floor_result = self.checked_mul_floored(rhs)?; - if !numerator.checked_rem(denominator)?.is_zero() { + if !remainder.is_zero() { Ok($Uint::one().checked_add(floor_result)?) } else { Ok(floor_result) diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 1372c64aaf..390880398a 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -1067,6 +1067,13 @@ mod tests { assert_eq!(Uint128::new(47030), res) } + #[test] + fn mul_floored_does_not_round_on_even_divide() { + let fraction = (2u128, 5u128); + let res = Uint128::new(25).mul_floored(fraction); + assert_eq!(Uint128::new(10), res) + } + #[test] fn mul_floored_works_when_operation_temporarily_takes_above_max() { let fraction = (8u128, 21u128); @@ -1143,6 +1150,13 @@ mod tests { assert_eq!(Uint128::new(47031), res) } + #[test] + fn mul_ceil_does_not_round_on_even_divide() { + let fraction = (2u128, 5u128); + let res = Uint128::new(25).mul_ceil(fraction); + assert_eq!(Uint128::new(10), res) + } + #[test] fn mul_ceil_works_when_operation_temporarily_takes_above_max() { let fraction = (8u128, 21u128); diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index f7ad54e32c..68c9bf0e71 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -1689,6 +1689,13 @@ mod tests { assert_eq!(Uint256::from(47030u32), res) } + #[test] + fn mul_floored_does_not_round_on_even_divide() { + let fraction = (2u128, 5u128); + let res = Uint256::from(25u32).mul_floored(fraction); + assert_eq!(Uint256::from(10u32), res) + } + #[test] fn mul_floored_works_when_operation_temporarily_takes_above_max() { let fraction = (8u128, 21u128); @@ -1777,6 +1784,13 @@ mod tests { assert_eq!(Uint256::from(47031u32), res) } + #[test] + fn mul_ceil_does_not_round_on_even_divide() { + let fraction = (2u128, 5u128); + let res = Uint256::from(25u32).mul_ceil(fraction); + assert_eq!(Uint256::from(10u32), res) + } + #[test] fn mul_ceil_works_when_operation_temporarily_takes_above_max() { let fraction = (8u128, 21u128); diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index afe0baeb58..2600dbab94 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -981,6 +981,13 @@ mod tests { assert_eq!(Uint64::new(47030), res) } + #[test] + fn mul_floored_does_not_round_on_even_divide() { + let fraction = (2u64, 5u64); + let res = Uint64::new(25).mul_floored(fraction); + assert_eq!(Uint64::new(10), res) + } + #[test] fn mul_floored_works_when_operation_temporarily_takes_above_max() { let fraction = (8u64, 21u64); @@ -1047,6 +1054,13 @@ mod tests { assert_eq!(Uint64::new(47031), res) } + #[test] + fn mul_ceil_does_not_round_on_even_divide() { + let fraction = (2u64, 5u64); + let res = Uint64::new(25).mul_ceil(fraction); + assert_eq!(Uint64::new(10), res) + } + #[test] fn mul_ceil_works_when_operation_temporarily_takes_above_max() { let fraction = (8u64, 21u64); From cdc653dd7524720391625fc6d4857245a16199d5 Mon Sep 17 00:00:00 2001 From: Gabe Rodriguez Date: Sun, 8 Jan 2023 11:17:53 +0100 Subject: [PATCH 0123/2372] Improve zero denom check --- packages/std/src/math/fraction.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/std/src/math/fraction.rs b/packages/std/src/math/fraction.rs index bd8762fac5..5f8a117e92 100644 --- a/packages/std/src/math/fraction.rs +++ b/packages/std/src/math/fraction.rs @@ -1,5 +1,3 @@ -use crate::Uint256; - /// A fraction `p`/`q` with integers `p` and `q`. /// /// `p` is called the numerator and `q` is called the denominator. @@ -15,7 +13,7 @@ pub trait Fraction: Sized { fn inv(&self) -> Option; } -impl> Fraction for (T, T) { +impl + PartialEq> Fraction for (T, T) { fn numerator(&self) -> T { self.0 } @@ -25,7 +23,7 @@ impl> Fraction for (T, T) { } fn inv(&self) -> Option { - if self.numerator().into() == Uint256::zero() { + if self.numerator() == 0u8.into() { None } else { Some((self.1, self.0)) From 8b63fcd4faef054fe71d9edfbab15582d643adb9 Mon Sep 17 00:00:00 2001 From: Gabe Rodriguez Date: Sun, 8 Jan 2023 12:07:58 +0100 Subject: [PATCH 0124/2372] make floor/ceil tenses consistent --- packages/std/src/math/fraction.rs | 8 +++--- packages/std/src/math/uint128.rs | 40 ++++++++++++++-------------- packages/std/src/math/uint256.rs | 44 +++++++++++++++---------------- packages/std/src/math/uint64.rs | 36 ++++++++++++------------- 4 files changed, 64 insertions(+), 64 deletions(-) diff --git a/packages/std/src/math/fraction.rs b/packages/std/src/math/fraction.rs index 5f8a117e92..e170869bf3 100644 --- a/packages/std/src/math/fraction.rs +++ b/packages/std/src/math/fraction.rs @@ -35,7 +35,7 @@ impl + PartialEq> Fraction for (T, T) { macro_rules! impl_mul_fraction { ($Uint:ident) => { impl $Uint { - pub fn checked_mul_floored, T: Into<$Uint>>( + pub fn checked_mul_floor, T: Into<$Uint>>( self, rhs: F, ) -> Result { @@ -46,8 +46,8 @@ macro_rules! impl_mul_fraction { Ok(res.try_into()?) } - pub fn mul_floored, T: Into<$Uint>>(self, rhs: F) -> Self { - self.checked_mul_floored(rhs).unwrap() + pub fn mul_floor, T: Into<$Uint>>(self, rhs: F) -> Self { + self.checked_mul_floor(rhs).unwrap() } pub fn checked_mul_ceil, T: Into<$Uint>>( @@ -58,7 +58,7 @@ macro_rules! impl_mul_fraction { let remainder = self .full_mul(rhs.numerator().into()) .checked_rem(divisor.into())?; - let floor_result = self.checked_mul_floored(rhs)?; + let floor_result = self.checked_mul_floor(rhs)?; if !remainder.is_zero() { Ok($Uint::one().checked_add(floor_result)?) } else { diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 390880398a..9bc21ac54d 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -1047,37 +1047,37 @@ mod tests { } #[test] - fn mul_floored_works_with_zero() { + fn mul_floor_works_with_zero() { let fraction = (Uint128::zero(), Uint128::new(21)); - let res = Uint128::new(123456).mul_floored(fraction); + let res = Uint128::new(123456).mul_floor(fraction); assert_eq!(Uint128::zero(), res) } #[test] - fn mul_floored_does_nothing_with_one() { + fn mul_floor_does_nothing_with_one() { let fraction = (Uint128::one(), Uint128::one()); - let res = Uint128::new(123456).mul_floored(fraction); + let res = Uint128::new(123456).mul_floor(fraction); assert_eq!(Uint128::new(123456), res) } #[test] - fn mul_floored_rounds_down_with_normal_case() { + fn mul_floor_rounds_down_with_normal_case() { let fraction = (8u128, 21u128); - let res = Uint128::new(123456).mul_floored(fraction); // 47030.8571 + let res = Uint128::new(123456).mul_floor(fraction); // 47030.8571 assert_eq!(Uint128::new(47030), res) } #[test] - fn mul_floored_does_not_round_on_even_divide() { + fn mul_floor_does_not_round_on_even_divide() { let fraction = (2u128, 5u128); - let res = Uint128::new(25).mul_floored(fraction); + let res = Uint128::new(25).mul_floor(fraction); assert_eq!(Uint128::new(10), res) } #[test] - fn mul_floored_works_when_operation_temporarily_takes_above_max() { + fn mul_floor_works_when_operation_temporarily_takes_above_max() { let fraction = (8u128, 21u128); - let res = Uint128::MAX.mul_floored(fraction); // 129_631_377_874_643_224_176_523_659_974_006_937_697.14285 + let res = Uint128::MAX.mul_floor(fraction); // 129_631_377_874_643_224_176_523_659_974_006_937_697.14285 assert_eq!( Uint128::new(129_631_377_874_643_224_176_523_659_974_006_937_697), res @@ -1085,24 +1085,24 @@ mod tests { } #[test] - fn mul_floored_works_with_decimal() { + fn mul_floor_works_with_decimal() { let decimal = Decimal::from_ratio(8u128, 21u128); - let res = Uint128::new(123456).mul_floored(decimal); // 47030.8571 + let res = Uint128::new(123456).mul_floor(decimal); // 47030.8571 assert_eq!(Uint128::new(47030), res) } #[test] #[should_panic(expected = "ConversionOverflowError")] - fn mul_floored_panics_on_overflow() { + fn mul_floor_panics_on_overflow() { let fraction = (21u128, 8u128); - Uint128::MAX.mul_floored(fraction); + Uint128::MAX.mul_floor(fraction); } #[test] - fn checked_mul_floored_does_not_panic_on_overflow() { + fn checked_mul_floor_does_not_panic_on_overflow() { let fraction = (21u128, 8u128); assert_eq!( - Uint128::MAX.checked_mul_floored(fraction), + Uint128::MAX.checked_mul_floor(fraction), Err(ConversionOverflow(ConversionOverflowError { source_type: "Uint256", target_type: "Uint128", @@ -1113,16 +1113,16 @@ mod tests { #[test] #[should_panic(expected = "DivideByZeroError")] - fn mul_floored_panics_on_zero_div() { + fn mul_floor_panics_on_zero_div() { let fraction = (21u128, 0u128); - Uint128::new(123456).mul_floored(fraction); + Uint128::new(123456).mul_floor(fraction); } #[test] - fn checked_mul_floored_does_not_panic_on_zero_div() { + fn checked_mul_floor_does_not_panic_on_zero_div() { let fraction = (21u128, 0u128); assert_eq!( - Uint128::new(123456).checked_mul_floored(fraction), + Uint128::new(123456).checked_mul_floor(fraction), Err(DivideByZero(DivideByZeroError { operand: "2592576".to_string() })), diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 68c9bf0e71..664cdb8651 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -1669,37 +1669,37 @@ mod tests { } #[test] - fn mul_floored_works_with_zero() { + fn mul_floor_works_with_zero() { let fraction = (Uint256::zero(), Uint256::from(21u32)); - let res = Uint256::from(123456u32).mul_floored(fraction); + let res = Uint256::from(123456u32).mul_floor(fraction); assert_eq!(Uint256::zero(), res) } #[test] - fn mul_floored_does_nothing_with_one() { + fn mul_floor_does_nothing_with_one() { let fraction = (Uint256::one(), Uint256::one()); - let res = Uint256::from(123456u32).mul_floored(fraction); + let res = Uint256::from(123456u32).mul_floor(fraction); assert_eq!(Uint256::from(123456u32), res) } #[test] - fn mul_floored_rounds_down_with_normal_case() { + fn mul_floor_rounds_down_with_normal_case() { let fraction = (Uint256::from(8u128), Uint256::from(21u128)); - let res = Uint256::from(123456u32).mul_floored(fraction); // 47030.8571 + let res = Uint256::from(123456u32).mul_floor(fraction); // 47030.8571 assert_eq!(Uint256::from(47030u32), res) } #[test] - fn mul_floored_does_not_round_on_even_divide() { + fn mul_floor_does_not_round_on_even_divide() { let fraction = (2u128, 5u128); - let res = Uint256::from(25u32).mul_floored(fraction); + let res = Uint256::from(25u32).mul_floor(fraction); assert_eq!(Uint256::from(10u32), res) } #[test] - fn mul_floored_works_when_operation_temporarily_takes_above_max() { + fn mul_floor_works_when_operation_temporarily_takes_above_max() { let fraction = (8u128, 21u128); - let res = Uint256::MAX.mul_floored(fraction); // 44_111_272_090_406_169_685_169_899_050_928_726_801_245_708_444_053_548_205_507_651_050_633_573_196_165.71428571 + let res = Uint256::MAX.mul_floor(fraction); // 44_111_272_090_406_169_685_169_899_050_928_726_801_245_708_444_053_548_205_507_651_050_633_573_196_165.71428571 assert_eq!( Uint256::from_str( "44111272090406169685169899050928726801245708444053548205507651050633573196165" @@ -1710,31 +1710,31 @@ mod tests { } #[test] - fn mul_floored_works_with_decimal() { + fn mul_floor_works_with_decimal() { let decimal = Decimal::from_ratio(8u128, 21u128); - let res = Uint256::from(123456u32).mul_floored(decimal); // 47030.8571 + let res = Uint256::from(123456u32).mul_floor(decimal); // 47030.8571 assert_eq!(Uint256::from(47030u32), res) } #[test] - fn mul_floored_works_with_decimal256() { + fn mul_floor_works_with_decimal256() { let decimal = Decimal256::from_ratio(8u128, 21u128); - let res = Uint256::from(123456u32).mul_floored(decimal); // 47030.8571 + let res = Uint256::from(123456u32).mul_floor(decimal); // 47030.8571 assert_eq!(Uint256::from(47030u32), res) } #[test] #[should_panic(expected = "ConversionOverflowError")] - fn mul_floored_panics_on_overflow() { + fn mul_floor_panics_on_overflow() { let fraction = (21u128, 8u128); - Uint256::MAX.mul_floored(fraction); + Uint256::MAX.mul_floor(fraction); } #[test] - fn checked_mul_floored_does_not_panic_on_overflow() { + fn checked_mul_floor_does_not_panic_on_overflow() { let fraction = (21u128, 8u128); assert_eq!( - Uint256::MAX.checked_mul_floored(fraction), + Uint256::MAX.checked_mul_floor(fraction), Err(ConversionOverflow(ConversionOverflowError { source_type: "Uint512", target_type: "Uint256", @@ -1747,16 +1747,16 @@ mod tests { #[test] #[should_panic(expected = "DivideByZeroError")] - fn mul_floored_panics_on_zero_div() { + fn mul_floor_panics_on_zero_div() { let fraction = (21u128, 0u128); - Uint256::from(123456u32).mul_floored(fraction); + Uint256::from(123456u32).mul_floor(fraction); } #[test] - fn checked_mul_floored_does_not_panic_on_zero_div() { + fn checked_mul_floor_does_not_panic_on_zero_div() { let fraction = (21u128, 0u128); assert_eq!( - Uint256::from(123456u32).checked_mul_floored(fraction), + Uint256::from(123456u32).checked_mul_floor(fraction), Err(DivideByZero(DivideByZeroError { operand: "2592576".to_string() })), diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index 2600dbab94..7cba8cb0e9 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -961,52 +961,52 @@ mod tests { } #[test] - fn mul_floored_works_with_zero() { + fn mul_floor_works_with_zero() { let fraction = (0u32, 21u32); - let res = Uint64::new(123456).mul_floored(fraction); + let res = Uint64::new(123456).mul_floor(fraction); assert_eq!(Uint64::zero(), res) } #[test] - fn mul_floored_does_nothing_with_one() { + fn mul_floor_does_nothing_with_one() { let fraction = (Uint64::one(), Uint64::one()); - let res = Uint64::new(123456).mul_floored(fraction); + let res = Uint64::new(123456).mul_floor(fraction); assert_eq!(Uint64::new(123456), res) } #[test] - fn mul_floored_rounds_down_with_normal_case() { + fn mul_floor_rounds_down_with_normal_case() { let fraction = (8u64, 21u64); - let res = Uint64::new(123456).mul_floored(fraction); // 47030.8571 + let res = Uint64::new(123456).mul_floor(fraction); // 47030.8571 assert_eq!(Uint64::new(47030), res) } #[test] - fn mul_floored_does_not_round_on_even_divide() { + fn mul_floor_does_not_round_on_even_divide() { let fraction = (2u64, 5u64); - let res = Uint64::new(25).mul_floored(fraction); + let res = Uint64::new(25).mul_floor(fraction); assert_eq!(Uint64::new(10), res) } #[test] - fn mul_floored_works_when_operation_temporarily_takes_above_max() { + fn mul_floor_works_when_operation_temporarily_takes_above_max() { let fraction = (8u64, 21u64); - let res = Uint64::MAX.mul_floored(fraction); // 7_027_331_075_698_876_805.71428571 + let res = Uint64::MAX.mul_floor(fraction); // 7_027_331_075_698_876_805.71428571 assert_eq!(Uint64::new(7_027_331_075_698_876_805), res) } #[test] #[should_panic(expected = "ConversionOverflowError")] - fn mul_floored_panics_on_overflow() { + fn mul_floor_panics_on_overflow() { let fraction = (21u64, 8u64); - Uint64::MAX.mul_floored(fraction); + Uint64::MAX.mul_floor(fraction); } #[test] - fn checked_mul_floored_does_not_panic_on_overflow() { + fn checked_mul_floor_does_not_panic_on_overflow() { let fraction = (21u64, 8u64); assert_eq!( - Uint64::MAX.checked_mul_floored(fraction), + Uint64::MAX.checked_mul_floor(fraction), Err(ConversionOverflow(ConversionOverflowError { source_type: "Uint128", target_type: "Uint64", @@ -1017,16 +1017,16 @@ mod tests { #[test] #[should_panic(expected = "DivideByZeroError")] - fn mul_floored_panics_on_zero_div() { + fn mul_floor_panics_on_zero_div() { let fraction = (21u64, 0u64); - Uint64::new(123456).mul_floored(fraction); + Uint64::new(123456).mul_floor(fraction); } #[test] - fn checked_mul_floored_does_not_panic_on_zero_div() { + fn checked_mul_floor_does_not_panic_on_zero_div() { let fraction = (21u64, 0u64); assert_eq!( - Uint64::new(123456).checked_mul_floored(fraction), + Uint64::new(123456).checked_mul_floor(fraction), Err(DivideByZero(DivideByZeroError { operand: "2592576".to_string() })), From e79ab95eef56cfb881e39c4c430a3d6f1322cbc4 Mon Sep 17 00:00:00 2001 From: Gabe Rodriguez Date: Thu, 12 Jan 2023 11:10:33 +0100 Subject: [PATCH 0125/2372] Add fraction division support --- packages/std/src/math/fraction.rs | 47 +++++++++ packages/std/src/math/uint128.rs | 142 ++++++++++++++++++++++++++++ packages/std/src/math/uint256.rs | 152 ++++++++++++++++++++++++++++++ packages/std/src/math/uint64.rs | 110 +++++++++++++++++++++ 4 files changed, 451 insertions(+) diff --git a/packages/std/src/math/fraction.rs b/packages/std/src/math/fraction.rs index e170869bf3..de3a85a0d5 100644 --- a/packages/std/src/math/fraction.rs +++ b/packages/std/src/math/fraction.rs @@ -69,6 +69,53 @@ macro_rules! impl_mul_fraction { pub fn mul_ceil, T: Into<$Uint>>(self, rhs: F) -> Self { self.checked_mul_ceil(rhs).unwrap() } + + pub fn div_floor, T: Into<$Uint>>(self, rhs: F) -> Self + where + Self: Sized, + { + self.checked_div_floor(rhs).unwrap() + } + + pub fn checked_div_floor, T: Into<$Uint>>( + self, + rhs: F, + ) -> Result + where + Self: Sized, + { + let divisor = rhs.numerator().into(); + let res = self + .full_mul(rhs.denominator().into()) + .checked_div(divisor.into())?; + Ok(res.try_into()?) + } + + pub fn div_ceil, T: Into<$Uint>>(self, rhs: F) -> Self + where + Self: Sized, + { + self.checked_div_ceil(rhs).unwrap() + } + + pub fn checked_div_ceil, T: Into<$Uint>>( + self, + rhs: F, + ) -> Result + where + Self: Sized, + { + let divisor = rhs.numerator().into(); + let remainder = self + .full_mul(rhs.denominator().into()) + .checked_rem(divisor.into())?; + let floor_result = self.checked_div_floor(rhs)?; + if !remainder.is_zero() { + Ok($Uint::one().checked_add(floor_result)?) + } else { + Ok(floor_result) + } + } } }; } diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 9bc21ac54d..2296f40bff 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -1211,4 +1211,146 @@ mod tests { })), ); } + + #[test] + #[should_panic(expected = "DivideByZeroError")] + fn div_floor_raises_with_zero() { + let fraction = (Uint128::zero(), Uint128::new(21)); + Uint128::new(123456).div_floor(fraction); + } + + #[test] + fn div_floor_does_nothing_with_one() { + let fraction = (Uint128::one(), Uint128::one()); + let res = Uint128::new(123456).div_floor(fraction); + assert_eq!(Uint128::new(123456), res) + } + + #[test] + fn div_floor_rounds_down_with_normal_case() { + let fraction = (5u128, 21u128); + let res = Uint128::new(123456).div_floor(fraction); // 518515.2 + assert_eq!(Uint128::new(518515), res) + } + + #[test] + fn div_floor_does_not_round_on_even_divide() { + let fraction = (5u128, 2u128); + let res = Uint128::new(25).div_floor(fraction); + assert_eq!(Uint128::new(10), res) + } + + #[test] + fn div_floor_works_when_operation_temporarily_takes_above_max() { + let fraction = (21u128, 8u128); + let res = Uint128::MAX.div_floor(fraction); // 129_631_377_874_643_224_176_523_659_974_006_937_697.1428 + assert_eq!( + Uint128::new(129_631_377_874_643_224_176_523_659_974_006_937_697), + res + ) + } + + #[test] + fn div_floor_works_with_decimal() { + let decimal = Decimal::from_ratio(21u128, 8u128); + let res = Uint128::new(123456).div_floor(decimal); // 47030.8571 + assert_eq!(Uint128::new(47030), res) + } + + #[test] + fn div_floor_works_with_decimal_evenly() { + let res = Uint128::new(60).div_floor(Decimal::from_atomics(6u128, 0).unwrap()); + assert_eq!(res, Uint128::new(10)); + } + + #[test] + #[should_panic(expected = "ConversionOverflowError")] + fn div_floor_panics_on_overflow() { + let fraction = (8u128, 21u128); + Uint128::MAX.div_floor(fraction); + } + + #[test] + fn div_floor_does_not_panic_on_overflow() { + let fraction = (8u128, 21u128); + assert_eq!( + Uint128::MAX.checked_div_floor(fraction), + Err(ConversionOverflow(ConversionOverflowError { + source_type: "Uint256", + target_type: "Uint128", + value: "893241213167463466591358344508391555069".to_string() + })), + ); + } + + #[test] + #[should_panic(expected = "DivideByZeroError")] + fn div_ceil_raises_with_zero() { + let fraction = (Uint128::zero(), Uint128::new(21)); + Uint128::new(123456).div_ceil(fraction); + } + + #[test] + fn div_ceil_does_nothing_with_one() { + let fraction = (Uint128::one(), Uint128::one()); + let res = Uint128::new(123456).div_ceil(fraction); + assert_eq!(Uint128::new(123456), res) + } + + #[test] + fn div_ceil_rounds_up_with_normal_case() { + let fraction = (5u128, 21u128); + let res = Uint128::new(123456).div_ceil(fraction); // 518515.2 + assert_eq!(Uint128::new(518516), res) + } + + #[test] + fn div_ceil_does_not_round_on_even_divide() { + let fraction = (5u128, 2u128); + let res = Uint128::new(25).div_ceil(fraction); + assert_eq!(Uint128::new(10), res) + } + + #[test] + fn div_ceil_works_when_operation_temporarily_takes_above_max() { + let fraction = (21u128, 8u128); + let res = Uint128::MAX.div_ceil(fraction); // 129_631_377_874_643_224_176_523_659_974_006_937_697.1428 + assert_eq!( + Uint128::new(129_631_377_874_643_224_176_523_659_974_006_937_698), + res + ) + } + + #[test] + fn div_ceil_works_with_decimal() { + let decimal = Decimal::from_ratio(21u128, 8u128); + let res = Uint128::new(123456).div_ceil(decimal); // 47030.8571 + assert_eq!(Uint128::new(47031), res) + } + + #[test] + fn div_ceil_works_with_decimal_evenly() { + let res = Uint128::new(60).div_ceil(Decimal::from_atomics(6u128, 0).unwrap()); + assert_eq!(res, Uint128::new(10)); + } + + #[test] + #[should_panic(expected = "ConversionOverflowError")] + fn div_ceil_panics_on_overflow() { + let fraction = (8u128, 21u128); + Uint128::MAX.div_ceil(fraction); + } + + #[test] + fn div_ceil_does_not_panic_on_overflow() { + let fraction = (8u128, 21u128); + assert_eq!( + Uint128::MAX.checked_div_ceil(fraction), + Err(ConversionOverflow(ConversionOverflowError { + source_type: "Uint256", + target_type: "Uint128", + value: "893241213167463466591358344508391555069".to_string() + })), + ); + } } diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 664cdb8651..d613436730 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -1857,4 +1857,156 @@ mod tests { })), ); } + + #[test] + #[should_panic(expected = "DivideByZeroError")] + fn div_floor_raises_with_zero() { + let fraction = (Uint256::zero(), Uint256::from(21u32)); + Uint256::from(123456u128).div_floor(fraction); + } + + #[test] + fn div_floor_does_nothing_with_one() { + let fraction = (Uint256::one(), Uint256::one()); + let res = Uint256::from(123456u128).div_floor(fraction); + assert_eq!(Uint256::from(123456u128), res) + } + + #[test] + fn div_floor_rounds_down_with_normal_case() { + let fraction = (5u128, 21u128); + let res = Uint256::from(123456u128).div_floor(fraction); // 518515.2 + assert_eq!(Uint256::from(518515u128), res) + } + + #[test] + fn div_floor_does_not_round_on_even_divide() { + let fraction = (5u128, 2u128); + let res = Uint256::from(25u128).div_floor(fraction); + assert_eq!(Uint256::from(10u128), res) + } + + #[test] + fn div_floor_works_when_operation_temporarily_takes_above_max() { + let fraction = (21u128, 8u128); + let res = Uint256::MAX.div_floor(fraction); // 44_111_272_090_406_169_685_169_899_050_928_726_801_245_708_444_053_548_205_507_651_050_633_573_196_165.71428571 + assert_eq!( + Uint256::from_str( + "44111272090406169685169899050928726801245708444053548205507651050633573196165" + ) + .unwrap(), + res + ) + } + + #[test] + fn div_floor_works_with_decimal() { + let decimal = Decimal::from_ratio(21u128, 8u128); + let res = Uint256::from(123456u128).div_floor(decimal); // 47030.8571 + assert_eq!(Uint256::from(47030u128), res) + } + + #[test] + fn div_floor_works_with_decimal_evenly() { + let res = Uint256::from(60u128).div_floor(Decimal::from_atomics(6u128, 0).unwrap()); + assert_eq!(res, Uint256::from(10u128)); + } + + #[test] + #[should_panic(expected = "ConversionOverflowError")] + fn div_floor_panics_on_overflow() { + let fraction = (8u128, 21u128); + Uint256::MAX.div_floor(fraction); + } + + #[test] + fn div_floor_does_not_panic_on_overflow() { + let fraction = (8u128, 21u128); + assert_eq!( + Uint256::MAX.checked_div_floor(fraction), + Err(ConversionOverflow(ConversionOverflowError { + source_type: "Uint512", + target_type: "Uint256", + value: + "303954234247955012986873835647805758114833709747306480603576158020771965304829" + .to_string() + })), + ); + } + + #[test] + #[should_panic(expected = "DivideByZeroError")] + fn div_ceil_raises_with_zero() { + let fraction = (Uint256::zero(), Uint256::from(21u128)); + Uint256::from(123456u128).div_ceil(fraction); + } + + #[test] + fn div_ceil_does_nothing_with_one() { + let fraction = (Uint256::one(), Uint256::one()); + let res = Uint256::from(123456u128).div_ceil(fraction); + assert_eq!(Uint256::from(123456u128), res) + } + + #[test] + fn div_ceil_rounds_up_with_normal_case() { + let fraction = (5u128, 21u128); + let res = Uint256::from(123456u128).div_ceil(fraction); // 518515.2 + assert_eq!(Uint256::from(518516u128), res) + } + + #[test] + fn div_ceil_does_not_round_on_even_divide() { + let fraction = (5u128, 2u128); + let res = Uint256::from(25u128).div_ceil(fraction); + assert_eq!(Uint256::from(10u128), res) + } + + #[test] + fn div_ceil_works_when_operation_temporarily_takes_above_max() { + let fraction = (21u128, 8u128); + let res = Uint256::MAX.div_ceil(fraction); // 44_111_272_090_406_169_685_169_899_050_928_726_801_245_708_444_053_548_205_507_651_050_633_573_196_165.71428571 + assert_eq!( + Uint256::from_str( + "44111272090406169685169899050928726801245708444053548205507651050633573196166" + ) + .unwrap(), + res + ) + } + + #[test] + fn div_ceil_works_with_decimal() { + let decimal = Decimal::from_ratio(21u128, 8u128); + let res = Uint256::from(123456u128).div_ceil(decimal); // 47030.8571 + assert_eq!(Uint256::from(47031u128), res) + } + + #[test] + fn div_ceil_works_with_decimal_evenly() { + let res = Uint256::from(60u128).div_ceil(Decimal::from_atomics(6u128, 0).unwrap()); + assert_eq!(res, Uint256::from(10u128)); + } + + #[test] + #[should_panic(expected = "ConversionOverflowError")] + fn div_ceil_panics_on_overflow() { + let fraction = (8u128, 21u128); + Uint256::MAX.div_ceil(fraction); + } + + #[test] + fn div_ceil_does_not_panic_on_overflow() { + let fraction = (8u128, 21u128); + assert_eq!( + Uint256::MAX.checked_div_ceil(fraction), + Err(ConversionOverflow(ConversionOverflowError { + source_type: "Uint512", + target_type: "Uint256", + value: + "303954234247955012986873835647805758114833709747306480603576158020771965304829" + .to_string() // raises prior to rounding up + })), + ); + } } diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index 7cba8cb0e9..d6fc5fca95 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -1105,4 +1105,114 @@ mod tests { })), ); } + + #[test] + #[should_panic(expected = "DivideByZeroError")] + fn div_floor_raises_with_zero() { + let fraction = (Uint64::zero(), Uint64::new(21)); + Uint64::new(123456).div_floor(fraction); + } + + #[test] + fn div_floor_does_nothing_with_one() { + let fraction = (Uint64::one(), Uint64::one()); + let res = Uint64::new(123456).div_floor(fraction); + assert_eq!(Uint64::new(123456), res) + } + + #[test] + fn div_floor_rounds_down_with_normal_case() { + let fraction = (5u64, 21u64); + let res = Uint64::new(123456).div_floor(fraction); // 518515.2 + assert_eq!(Uint64::new(518515), res) + } + + #[test] + fn div_floor_does_not_round_on_even_divide() { + let fraction = (5u64, 2u64); + let res = Uint64::new(25).div_floor(fraction); + assert_eq!(Uint64::new(10), res) + } + + #[test] + fn div_floor_works_when_operation_temporarily_takes_above_max() { + let fraction = (21u64, 8u64); + let res = Uint64::MAX.div_floor(fraction); // 7_027_331_075_698_876_805.71428 + assert_eq!(Uint64::new(7_027_331_075_698_876_805), res) + } + + #[test] + #[should_panic(expected = "ConversionOverflowError")] + fn div_floor_panics_on_overflow() { + let fraction = (8u64, 21u64); + Uint64::MAX.div_floor(fraction); + } + + #[test] + fn div_floor_does_not_panic_on_overflow() { + let fraction = (8u64, 21u64); + assert_eq!( + Uint64::MAX.checked_div_floor(fraction), + Err(ConversionOverflow(ConversionOverflowError { + source_type: "Uint128", + target_type: "Uint64", + value: "48422703193487572989".to_string() + })), + ); + } + + #[test] + #[should_panic(expected = "DivideByZeroError")] + fn div_ceil_raises_with_zero() { + let fraction = (Uint64::zero(), Uint64::new(21)); + Uint64::new(123456).div_ceil(fraction); + } + + #[test] + fn div_ceil_does_nothing_with_one() { + let fraction = (Uint64::one(), Uint64::one()); + let res = Uint64::new(123456).div_ceil(fraction); + assert_eq!(Uint64::new(123456), res) + } + + #[test] + fn div_ceil_rounds_up_with_normal_case() { + let fraction = (5u64, 21u64); + let res = Uint64::new(123456).div_ceil(fraction); // 518515.2 + assert_eq!(Uint64::new(518516), res) + } + + #[test] + fn div_ceil_does_not_round_on_even_divide() { + let fraction = (5u64, 2u64); + let res = Uint64::new(25).div_ceil(fraction); + assert_eq!(Uint64::new(10), res) + } + + #[test] + fn div_ceil_works_when_operation_temporarily_takes_above_max() { + let fraction = (21u64, 8u64); + let res = Uint64::MAX.div_ceil(fraction); // 7_027_331_075_698_876_805.71428 + assert_eq!(Uint64::new(7_027_331_075_698_876_806), res) + } + + #[test] + #[should_panic(expected = "ConversionOverflowError")] + fn div_ceil_panics_on_overflow() { + let fraction = (8u64, 21u64); + Uint64::MAX.div_ceil(fraction); + } + + #[test] + fn div_ceil_does_not_panic_on_overflow() { + let fraction = (8u64, 21u64); + assert_eq!( + Uint64::MAX.checked_div_ceil(fraction), + Err(ConversionOverflow(ConversionOverflowError { + source_type: "Uint128", + target_type: "Uint64", + value: "48422703193487572989".to_string() + })), + ); + } } From c1b78e9d0c1143377a4e3729410384ae0e43941b Mon Sep 17 00:00:00 2001 From: Gabe Rodriguez Date: Wed, 18 Jan 2023 15:53:29 +0100 Subject: [PATCH 0126/2372] Ceil math without redundant expansion --- packages/std/src/math/fraction.rs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/packages/std/src/math/fraction.rs b/packages/std/src/math/fraction.rs index de3a85a0d5..44025ac212 100644 --- a/packages/std/src/math/fraction.rs +++ b/packages/std/src/math/fraction.rs @@ -54,11 +54,10 @@ macro_rules! impl_mul_fraction { self, rhs: F, ) -> Result { - let divisor = rhs.denominator().into(); - let remainder = self - .full_mul(rhs.numerator().into()) - .checked_rem(divisor.into())?; - let floor_result = self.checked_mul_floor(rhs)?; + let dividend = self.full_mul(rhs.numerator().into()); + let divisor = rhs.denominator().into().into(); + let floor_result = dividend.checked_div(divisor)?.try_into()?; + let remainder = dividend.checked_rem(divisor)?; if !remainder.is_zero() { Ok($Uint::one().checked_add(floor_result)?) } else { @@ -105,11 +104,10 @@ macro_rules! impl_mul_fraction { where Self: Sized, { - let divisor = rhs.numerator().into(); - let remainder = self - .full_mul(rhs.denominator().into()) - .checked_rem(divisor.into())?; - let floor_result = self.checked_div_floor(rhs)?; + let dividend = self.full_mul(rhs.denominator().into()); + let divisor = rhs.numerator().into().into(); + let floor_result = dividend.checked_div(divisor)?.try_into()?; + let remainder = dividend.checked_rem(divisor)?; if !remainder.is_zero() { Ok($Uint::one().checked_add(floor_result)?) } else { From fac345e88e618052c9076d17a613958173b47594 Mon Sep 17 00:00:00 2001 From: Gabe Rodriguez Date: Wed, 18 Jan 2023 16:32:06 +0100 Subject: [PATCH 0127/2372] Add rustdocs --- packages/std/src/math/fraction.rs | 66 ++++++++++++++++++++++++++----- 1 file changed, 57 insertions(+), 9 deletions(-) diff --git a/packages/std/src/math/fraction.rs b/packages/std/src/math/fraction.rs index 44025ac212..0056f4a0a0 100644 --- a/packages/std/src/math/fraction.rs +++ b/packages/std/src/math/fraction.rs @@ -35,6 +35,17 @@ impl + PartialEq> Fraction for (T, T) { macro_rules! impl_mul_fraction { ($Uint:ident) => { impl $Uint { + /// Multiply `self` with a struct implementing [`Fraction`] (e.g. [`crate::Decimal`]). + /// Result is rounded down. + /// + /// ## Examples + /// + /// ``` + /// use cosmwasm_std::Uint128; + /// let fraction = (8u128, 21u128); + /// let res = Uint128::new(123456).checked_mul_floor(fraction).unwrap(); + /// assert_eq!(Uint128::new(47030), res); // 47030.8571 rounds down + /// ``` pub fn checked_mul_floor, T: Into<$Uint>>( self, rhs: F, @@ -46,10 +57,22 @@ macro_rules! impl_mul_fraction { Ok(res.try_into()?) } + /// Same operation as `checked_mul_floor` except unwrapped pub fn mul_floor, T: Into<$Uint>>(self, rhs: F) -> Self { self.checked_mul_floor(rhs).unwrap() } + /// Multiply `self` with a struct implementing [`Fraction`] (e.g. [`crate::Decimal`]). + /// Result is rounded up. + /// + /// ## Examples + /// + /// ``` + /// use cosmwasm_std::Uint128; + /// let fraction = (8u128, 21u128); + /// let res = Uint128::new(123456).checked_mul_ceil(fraction).unwrap(); + /// assert_eq!(Uint128::new(47031), res); // 47030.8571 rounds up + /// ``` pub fn checked_mul_ceil, T: Into<$Uint>>( self, rhs: F, @@ -65,17 +88,22 @@ macro_rules! impl_mul_fraction { } } + /// Same operation as `checked_mul_ceil` except unwrapped pub fn mul_ceil, T: Into<$Uint>>(self, rhs: F) -> Self { self.checked_mul_ceil(rhs).unwrap() } - pub fn div_floor, T: Into<$Uint>>(self, rhs: F) -> Self - where - Self: Sized, - { - self.checked_div_floor(rhs).unwrap() - } - + /// Divide `self` with a struct implementing [`Fraction`] (e.g. [`crate::Decimal`]). + /// Result is rounded down. + /// + /// ## Examples + /// + /// ``` + /// use cosmwasm_std::Uint128; + /// let fraction = (4u128, 5u128); + /// let res = Uint128::new(789).checked_div_floor(fraction).unwrap(); + /// assert_eq!(Uint128::new(986), res); // 986.25 rounds down + /// ``` pub fn checked_div_floor, T: Into<$Uint>>( self, rhs: F, @@ -90,13 +118,25 @@ macro_rules! impl_mul_fraction { Ok(res.try_into()?) } - pub fn div_ceil, T: Into<$Uint>>(self, rhs: F) -> Self + /// Same operation as `checked_div_floor` except unwrapped + pub fn div_floor, T: Into<$Uint>>(self, rhs: F) -> Self where Self: Sized, { - self.checked_div_ceil(rhs).unwrap() + self.checked_div_floor(rhs).unwrap() } + /// Divide `self` with a struct implementing [`Fraction`] (e.g. [`crate::Decimal`]). + /// Result is rounded up. + /// + /// ## Examples + /// + /// ``` + /// use cosmwasm_std::Uint128; + /// let fraction = (4u128, 5u128); + /// let res = Uint128::new(789).checked_div_ceil(fraction).unwrap(); + /// assert_eq!(Uint128::new(987), res); // 986.25 rounds up + /// ``` pub fn checked_div_ceil, T: Into<$Uint>>( self, rhs: F, @@ -114,6 +154,14 @@ macro_rules! impl_mul_fraction { Ok(floor_result) } } + + /// Same operation as `checked_div_ceil` except unwrapped + pub fn div_ceil, T: Into<$Uint>>(self, rhs: F) -> Self + where + Self: Sized, + { + self.checked_div_ceil(rhs).unwrap() + } } }; } From d8c52e53eb86d2dab2fbe652fd4ee683ba00cbab Mon Sep 17 00:00:00 2001 From: Gabe Rodriguez Date: Wed, 18 Jan 2023 16:40:32 +0100 Subject: [PATCH 0128/2372] add to changlog --- CHANGELOG.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c0079be3a8..b7b4fd59eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,11 +33,15 @@ and this project adheres to ([#1561]). - cosmwasm-vm: Add `Cache::remove_wasm` to remove obsolete Wasm blobs and their compiled modules. +- cosmwasm-std: Implement fraction multiplication and division. Assists with + Uint & Decimal arithmetic and exposes methods for flooring/ceiling result + ([#1485], [#1566]). [#1436]: https://github.com/CosmWasm/cosmwasm/issues/1436 [#1437]: https://github.com/CosmWasm/cosmwasm/issues/1437 -[#1481]: https://github.com/CosmWasm/cosmwasm/pull/1481 [#1478]: https://github.com/CosmWasm/cosmwasm/pull/1478 +[#1481]: https://github.com/CosmWasm/cosmwasm/pull/1481 +[#1485]: https://github.com/CosmWasm/cosmwasm/issues/1485 [#1513]: https://github.com/CosmWasm/cosmwasm/pull/1513 [#1533]: https://github.com/CosmWasm/cosmwasm/pull/1533 [#1550]: https://github.com/CosmWasm/cosmwasm/issues/1550 @@ -45,6 +49,7 @@ and this project adheres to [#1554]: https://github.com/CosmWasm/cosmwasm/pull/1554 [#1560]: https://github.com/CosmWasm/cosmwasm/pull/1560 [#1561]: https://github.com/CosmWasm/cosmwasm/pull/1561 +[#1566]: https://github.com/CosmWasm/cosmwasm/pull/1566 ### Changed From 686020bc9291b796fd5101daf164219e30fc498f Mon Sep 17 00:00:00 2001 From: dzmitry-lahoda Date: Wed, 18 Jan 2023 22:25:52 +0000 Subject: [PATCH 0129/2372] fixed link in SEMANTICS.md to actors info --- SEMANTICS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SEMANTICS.md b/SEMANTICS.md index 9f05d7e434..b6dd65dc25 100644 --- a/SEMANTICS.md +++ b/SEMANTICS.md @@ -184,7 +184,7 @@ this by following the actor model, which doesn't nest function calls, but returns messages that will be executed later. This means all state that is carried over between one call and the next happens in storage and not in memory. For more information on this design, I recommend you read -[our docs on the Actor Model](https://docs.cosmwasm.com/docs/1.0/architecture/actor). +[our docs on the Actor Model](https://github.com/InterWasm/docs/blob/archive/docs/03-architecture/02-actor.md). ### Submessages From 63020b5280f1f39b1523cba9e407e7b3a7619a21 Mon Sep 17 00:00:00 2001 From: dzmitry-lahoda Date: Wed, 18 Jan 2023 22:49:03 +0000 Subject: [PATCH 0130/2372] Update SEMANTICS.md --- SEMANTICS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SEMANTICS.md b/SEMANTICS.md index b6dd65dc25..7826204f52 100644 --- a/SEMANTICS.md +++ b/SEMANTICS.md @@ -184,7 +184,7 @@ this by following the actor model, which doesn't nest function calls, but returns messages that will be executed later. This means all state that is carried over between one call and the next happens in storage and not in memory. For more information on this design, I recommend you read -[our docs on the Actor Model](https://github.com/InterWasm/docs/blob/archive/docs/03-architecture/02-actor.md). +[our docs on the Actor Model](https://book.cosmwasm.com/actor-model.html). ### Submessages From 96130f8eae2da0de32f44c594ba212a66dcb8b32 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 23 Jan 2023 12:42:58 +0100 Subject: [PATCH 0131/2372] Update bumpalo to 3.12.0 --- Cargo.lock | 4 ++-- contracts/burner/Cargo.lock | 4 ++-- contracts/crypto-verify/Cargo.lock | 4 ++-- contracts/cyberpunk/Cargo.lock | 4 ++-- contracts/floaty/Cargo.lock | 4 ++-- contracts/hackatom/Cargo.lock | 4 ++-- contracts/ibc-reflect-send/Cargo.lock | 4 ++-- contracts/ibc-reflect/Cargo.lock | 4 ++-- contracts/queue/Cargo.lock | 4 ++-- contracts/reflect/Cargo.lock | 4 ++-- contracts/staking/Cargo.lock | 4 ++-- contracts/virus/Cargo.lock | 4 ++-- 12 files changed, 24 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9604275615..79eb734d56 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -131,9 +131,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.9.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecheck" diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 975c437322..181701d128 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -93,9 +93,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.7.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9df67f7bf9ef8498769f994239c45613ef0c5899415fb58e9add412d2c1a538" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "burner" diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 187d140bdc..ae10f6d1dc 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -93,9 +93,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.7.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9df67f7bf9ef8498769f994239c45613ef0c5899415fb58e9add412d2c1a538" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecheck" diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 35f96f2141..11a7eebc5c 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -116,9 +116,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.7.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9df67f7bf9ef8498769f994239c45613ef0c5899415fb58e9add412d2c1a538" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecheck" diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 1628503aae..8baf510210 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -93,9 +93,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.7.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9df67f7bf9ef8498769f994239c45613ef0c5899415fb58e9add412d2c1a538" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecheck" diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 449690c348..16cf4c2c5d 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -93,9 +93,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.7.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9df67f7bf9ef8498769f994239c45613ef0c5899415fb58e9add412d2c1a538" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecheck" diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index cef2629547..2679bb7895 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -93,9 +93,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.7.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9df67f7bf9ef8498769f994239c45613ef0c5899415fb58e9add412d2c1a538" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecheck" diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 0a502905a3..764b289d8b 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -93,9 +93,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.7.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9df67f7bf9ef8498769f994239c45613ef0c5899415fb58e9add412d2c1a538" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecheck" diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index b9bc042b47..5c077df376 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -93,9 +93,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.7.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9df67f7bf9ef8498769f994239c45613ef0c5899415fb58e9add412d2c1a538" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecheck" diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index d543df2de5..f81a5eb3cf 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -93,9 +93,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.7.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9df67f7bf9ef8498769f994239c45613ef0c5899415fb58e9add412d2c1a538" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecheck" diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index ffaa239794..db3276dc82 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -93,9 +93,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.7.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9df67f7bf9ef8498769f994239c45613ef0c5899415fb58e9add412d2c1a538" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecheck" diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index e7745e4945..1c527ed61b 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -93,9 +93,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.7.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9df67f7bf9ef8498769f994239c45613ef0c5899415fb58e9add412d2c1a538" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecheck" From bd374ea72dcb47d5a9dc6fdfb7b04e86a8e87995 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 24 Jan 2023 13:30:09 +0100 Subject: [PATCH 0132/2372] Add docs on using cosmwasm-std --- docs/USING_COSMWASM_STD.md | 89 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 docs/USING_COSMWASM_STD.md diff --git a/docs/USING_COSMWASM_STD.md b/docs/USING_COSMWASM_STD.md new file mode 100644 index 0000000000..45841e908b --- /dev/null +++ b/docs/USING_COSMWASM_STD.md @@ -0,0 +1,89 @@ +# Using cosmwasm-std + +cosmwasm-std is the standard library for building contracts in CosmWasm. It is +compiled as part of the contract to Wasm. When creating a dependency to +cosmwasm-std, the required Wasm imports and exports are created implicitely via +C interfaces, e.g.: + +```rust +// Exports +#[no_mangle] +extern "C" fn interface_version_8() -> () { /* ... */ } +#[no_mangle] +extern "C" fn allocate(size: usize) -> u32 { /* ... */ } +#[no_mangle] +extern "C" fn deallocate(pointer: u32) { /* ... */ } + +// Imports +extern "C" { + #[cfg(feature = "abort")] + fn abort(source_ptr: u32); + + fn db_read(key: u32) -> u32; + fn db_write(key: u32, value: u32); + fn db_remove(key: u32); + + /* ... */ +} +``` + +As those exports are not namespaced, only one version of cosmwasm-std must exist +in the dependency tree. Otherwise conflicting C exports are created. + +## cosmwasm-std features + +The libarary comes with the following features: + +| Feature | Enabled by default | Description | +| ------------ | ------------------ | -------------------------------------------------------------------------- | +| iterator | x | Storage iterators | +| abort | x | A panic handler that aborts the contract execution with a helpfull message | +| stargate | | Cosmos SDK 0.40+ features and IBC | +| ibc3 | | New fields added in IBC v3 | +| staking | | Access to the staking module | +| baktraces | | Add backtraces to errors (for unit testing) | +| cosmwasm_1_1 | | Features that require CosmWasm 1.1+ on the chain | +| cosmwasm_1_2 | | Features that require CosmWasm 1.2+ on the chain | + +## The cosmwasm-std dependency for contract developers + +As a contract developer you can simply specify the dependency as follows in +`Cargo.toml`: + +```toml +cosmwasm-std = { version = "1.2.0" } +``` + +Please note that it is recommended to set all 3 version components and use the +minimum version you are willing to accept in the contract. For contracts this +would usually be the latest stable version. + +Most likely you also want to enable the `stargate`, which is pretty basic these +days and maybe you know your chain supports CosmWasm 1.2 or higher. Then you add +those features: + +```toml +cosmwasm-std = { version = "1.2.0", features = ["stargate", "cosmwasm_1_2"] } +``` + +## The cosmwasm-std dependency for library developers + +When you are creating a library that uses cosmwasm-std, you should be incredibly +careful with which features you require. The moment you add e.g. `cosmwasm_1_2` +there it becomes impossible to use the contract in chains with lower CosmWasm +versions. If you add `abort`, it becomes impossible for the contract developer +to opt out of the abort feature due to your library. Since this affects the +default features `abort` and `iterator`, you should always disable default +features. + +Also libraries should define a loose version range that allows the contract +developer to control which cosmwasm-std version they want to use in the final +project. E.g. if your library does not work with 1.0.0 due to a bug fixed in +1.0.1, your min version is 1.0.1 and not the latest stable. + +A typical dependency then looks like this: + +```toml +# We really need `stargate` here as this is an IBC related library. `abort` and `iterator` are not needed. +cosmwasm-std = { version = "1.0.1", default-features = false, features = ["stargate"] } +``` From baa6ad56782fd8fd424532d2f7225469d6b0d14e Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 24 Jan 2023 13:39:55 +0100 Subject: [PATCH 0133/2372] Add MIGRATING section for 1.2 Closes #1522 --- MIGRATING.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/MIGRATING.md b/MIGRATING.md index b9cadf4b64..0000f999fc 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -4,6 +4,47 @@ This guide explains what is needed to upgrade contracts when migrating over major releases of `cosmwasm`. Note that you can also view the [complete CHANGELOG](./CHANGELOG.md) to understand the differences. +## 1.1.x -> 1.2.0 + +- Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): + + ``` + [dependencies] + cosmwasm-std = "1.2.0" + cosmwasm-storage = "1.2.0" + # ... + + [dev-dependencies] + cosmwasm-schema = "1.2.0" + cosmwasm-vm = "1.2.0" + # ... + ``` + +- If you want to use a fewture that os only available on CosmWasm 1.2+ chains, + use this feature: + + ```diff + -cosmwasm-std = { version = "1.1.0", features = ["stargate"] } + +cosmwasm-std = { version = "1.1.0", features = ["stargate", "cosmwasm_1_2"] } + ``` + + Please note that `cosmwasm_1_2` implies `cosmwasm_1_1`, so there is no need to + set both. + +- If you use mixed type multiplication between `Uint{64,128,256}` and + `Decimal{,256}`, check out + `mul_floor`/`checked_mul_floor`/`mul_ceil`/`checked_mul_ceil`. Mixed type + arithmetic [will be removed](https://github.com/CosmWasm/cosmwasm/issues/1485) + at some point. + + ```diff + let a = Uint128::new(123); + let b = Decimal::percent(150) + + -let c = a * b; + +let c = a.mul_floor(b); + ``` + ## 1.0.0 -> 1.1.0 - Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): From 2dabcf0da461720cdd3597af2587a56f69d0fefb Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 24 Jan 2023 15:01:47 +0100 Subject: [PATCH 0134/2372] Set version: 1.2.0 --- CHANGELOG.md | 5 ++++- Cargo.lock | 16 ++++++++-------- contracts/burner/Cargo.lock | 12 ++++++------ contracts/crypto-verify/Cargo.lock | 14 +++++++------- contracts/cyberpunk/Cargo.lock | 14 +++++++------- contracts/floaty/Cargo.lock | 14 +++++++------- contracts/hackatom/Cargo.lock | 14 +++++++------- contracts/ibc-reflect-send/Cargo.lock | 14 +++++++------- contracts/ibc-reflect/Cargo.lock | 14 +++++++------- contracts/queue/Cargo.lock | 12 ++++++------ contracts/reflect/Cargo.lock | 14 +++++++------- contracts/staking/Cargo.lock | 14 +++++++------- contracts/virus/Cargo.lock | 12 ++++++------ packages/check/Cargo.toml | 6 +++--- packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema-derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 6 +++--- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 21 files changed, 103 insertions(+), 100 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7b4fd59eb..1adcf6d475 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ and this project adheres to ## [Unreleased] +## [1.2.0] - 2023-01-24 + ### Added - cosmwasm-std: Add `GovMsg::VoteWeighted`. In order to use this in a contract, @@ -1608,7 +1610,8 @@ Some main points: All future Changelog entries will reference this base -[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.1.9...HEAD +[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.0...HEAD +[1.2.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.1.9...v1.2.0 [1.1.9]: https://github.com/CosmWasm/cosmwasm/compare/v1.1.8...v1.1.9 [1.1.8]: https://github.com/CosmWasm/cosmwasm/compare/v1.1.6...v1.1.8 [1.1.6]: https://github.com/CosmWasm/cosmwasm/compare/v1.1.5...v1.1.6 diff --git a/Cargo.lock b/Cargo.lock index 79eb734d56..eae3adcab8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -246,7 +246,7 @@ dependencies = [ [[package]] name = "cosmwasm-check" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "anyhow", "clap", @@ -257,7 +257,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "base64", "criterion", @@ -276,7 +276,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "cosmwasm-std", "syn", @@ -284,7 +284,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "anyhow", "cosmwasm-schema-derive", @@ -299,7 +299,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "proc-macro2", "quote", @@ -308,7 +308,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "base64", "chrono", @@ -330,7 +330,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "cosmwasm-std", "serde", @@ -338,7 +338,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 181701d128..20a0bf204d 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -174,7 +174,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -185,14 +185,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -203,7 +203,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "proc-macro2", "quote", @@ -212,7 +212,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -230,7 +230,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index ae10f6d1dc..0fa8440fb7 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 11a7eebc5c..c5987f97dc 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -203,14 +203,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -221,7 +221,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "proc-macro2", "quote", @@ -230,7 +230,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -248,7 +248,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "cosmwasm-std", "serde", @@ -256,7 +256,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 8baf510210..495ecd0e42 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 16cf4c2c5d..b76cc69f07 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 2679bb7895..9c5b2a1f77 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 764b289d8b..46792be82f 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 5c077df376..0c284845a1 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index f81a5eb3cf..64da836cd1 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index db3276dc82..35a8d3288d 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 1c527ed61b..4e6882ec84 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0-rc.1" +version = "1.2.0" dependencies = [ "bitflags", "bytecheck", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index e50773015d..e09ee94e48 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-check" -version = "1.2.0-rc.1" +version = "1.2.0" authors = ["Mauro Lacy "] edition = "2021" description = "A CLI tool for verifying CosmWasm smart contracts" @@ -11,5 +11,5 @@ license = "Apache-2.0" anyhow = "1.0.57" clap = "2" colored = "2" -cosmwasm-vm = { path = "../vm", version = "1.2.0-rc.1" } -cosmwasm-std = { path = "../std", version = "1.2.0-rc.1" } +cosmwasm-vm = { path = "../vm", version = "1.2.0" } +cosmwasm-std = { path = "../std", version = "1.2.0" } diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index ff6e0b6f9f..cbadde4722 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "1.2.0-rc.1" +version = "1.2.0" authors = ["Mauro Lacy "] edition = "2021" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index 4485606ec6..5a111016fb 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "1.2.0-rc.1" +version = "1.2.0" authors = ["Simon Warta "] edition = "2021" description = "A package for auto-generated code used for CosmWasm contract development. This is shipped as part of cosmwasm-std. Do not use directly." diff --git a/packages/schema-derive/Cargo.toml b/packages/schema-derive/Cargo.toml index c063f4c68f..04b09449e2 100644 --- a/packages/schema-derive/Cargo.toml +++ b/packages/schema-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema-derive" -version = "1.2.0-rc.1" +version = "1.2.0" authors = ["Tomasz Kurcz "] edition = "2021" description = "Derive macros for cosmwasm-schema" diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index 0700262526..01d1b23c2e 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "1.2.0-rc.1" +version = "1.2.0" authors = ["Simon Warta ", "Ethan Frey "] edition = "2021" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." @@ -8,7 +8,7 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/schema" license = "Apache-2.0" [dependencies] -cosmwasm-schema-derive = { version = "=1.2.0-rc.1", path = "../schema-derive" } +cosmwasm-schema-derive = { version = "=1.2.0", path = "../schema-derive" } schemars = "0.8.3" serde = "1.0" serde_json = "1.0.40" @@ -16,6 +16,6 @@ thiserror = "1.0.26" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = { version = "1.2.0-rc.1", path = "../std" } +cosmwasm-std = { version = "1.2.0", path = "../std" } semver = "1" tempfile = "3" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 4be42c970f..42e053bf58 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "1.2.0-rc.1" +version = "1.2.0" authors = ["Ethan Frey "] edition = "2021" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -42,7 +42,7 @@ cosmwasm_1_2 = ["cosmwasm_1_1"] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "1.2.0-rc.1" } +cosmwasm-derive = { path = "../derive", version = "1.2.0" } derivative = "2" forward_ref = "1" hex = "0.4" @@ -54,7 +54,7 @@ thiserror = "1.0.26" uint = "0.9.3" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "1.2.0-rc.1" } +cosmwasm-crypto = { path = "../crypto", version = "1.2.0" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index a6b75470e4..6332d2e1b2 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "1.2.0-rc.1" +version = "1.2.0" authors = ["Ethan Frey "] edition = "2021" description = "CosmWasm library with useful helpers for Storage patterns" @@ -16,5 +16,5 @@ iterator = ["cosmwasm-std/iterator"] [dependencies] # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.2.0-rc.1", default-features = false } +cosmwasm-std = { path = "../std", version = "1.2.0", default-features = false } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 07c9c53cbf..0fb8290d5b 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "1.2.0-rc.1" +version = "1.2.0" authors = ["Ethan Frey "] edition = "2021" description = "VM bindings to run cosmwams contracts" @@ -41,8 +41,8 @@ required-features = ["iterator"] [dependencies] clru = "0.4.0" # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.2.0-rc.1", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "1.2.0-rc.1" } +cosmwasm-std = { path = "../std", version = "1.2.0", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "1.2.0" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.3" From 4628c7e98d32867d1d139b966ffb2a97ab05c476 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 25 Jan 2023 11:59:03 +0100 Subject: [PATCH 0135/2372] Make fields of WeightedVoteOption public --- CHANGELOG.md | 7 +++ packages/std/src/results/cosmos_msg.rs | 73 +++++++++++++++++++++++++- 2 files changed, 78 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1adcf6d475..33fbbdf0dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,13 @@ and this project adheres to ## [Unreleased] +### Fixed + +- cosmwasm-std: Make fields of `WeightedVoteOption` public to allow constructing + it ([#1597]). + +[#1597]: https://github.com/CosmWasm/cosmwasm/issues/1597 + ## [1.2.0] - 2023-01-24 ### Added diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index c62ba25185..3e93ba1868 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -203,6 +203,75 @@ pub enum WasmMsg { ClearAdmin { contract_addr: String }, } +/// This message type allows the contract interact with the [x/gov] module in order +/// to cast votes. +/// +/// [x/gov]: https://github.com/cosmos/cosmos-sdk/tree/v0.45.12/x/gov +/// +/// ## Examples +/// +/// Cast a simple vote: +/// +/// ``` +/// # use cosmwasm_std::{ +/// # HexBinary, +/// # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, +/// # Response, QueryResponse, +/// # }; +/// # type ExecuteMsg = (); +/// use cosmwasm_std::{GovMsg, VoteOption}; +/// +/// #[entry_point] +/// pub fn execute( +/// deps: DepsMut, +/// env: Env, +/// info: MessageInfo, +/// msg: ExecuteMsg, +/// ) -> Result { +/// // ... +/// Ok(Response::new().add_message(GovMsg::Vote { +/// proposal_id: 4, +/// vote: VoteOption::Yes, +/// })) +/// } +/// ``` +/// +/// Cast a weighted vote: +/// +/// ``` +/// # use cosmwasm_std::{ +/// # HexBinary, +/// # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, +/// # Response, QueryResponse, +/// # }; +/// # type ExecuteMsg = (); +/// # #[cfg(feature = "cosmwasm_1_2")] +/// use cosmwasm_std::{Decimal, GovMsg, VoteOption, WeightedVoteOption}; +/// +/// # #[cfg(feature = "cosmwasm_1_2")] +/// #[entry_point] +/// pub fn execute( +/// deps: DepsMut, +/// env: Env, +/// info: MessageInfo, +/// msg: ExecuteMsg, +/// ) -> Result { +/// // ... +/// Ok(Response::new().add_message(GovMsg::VoteWeighted { +/// proposal_id: 4, +/// options: vec![ +/// WeightedVoteOption { +/// option: VoteOption::Yes, +/// weight: Decimal::percent(65), +/// }, +/// WeightedVoteOption { +/// option: VoteOption::Abstain, +/// weight: Decimal::percent(35), +/// }, +/// ], +/// })) +/// } +/// ``` #[cfg(feature = "stargate")] #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] @@ -237,8 +306,8 @@ pub enum VoteOption { #[cfg(all(feature = "stargate", feature = "cosmwasm_1_2"))] #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] pub struct WeightedVoteOption { - option: VoteOption, - weight: Decimal, + pub option: VoteOption, + pub weight: Decimal, } /// Shortcut helper as the construction of WasmMsg::Instantiate can be quite verbose in contract code. From 7b89a920ceed2ef1e99d9ce6318212dac1a8b99a Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 25 Jan 2023 11:59:34 +0100 Subject: [PATCH 0136/2372] Add abort and cosmwasm_1_2 to docs --- packages/std/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 42e053bf58..831b45ae22 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -9,7 +9,7 @@ license = "Apache-2.0" readme = "README.md" [package.metadata.docs.rs] -features = ["stargate", "staking", "ibc3"] +features = ["abort", "stargate", "staking", "ibc3", "cosmwasm_1_2"] [features] default = ["iterator", "abort"] From 648afc1c7d45b62279043d13ac8c464c045df009 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 25 Jan 2023 12:00:50 +0100 Subject: [PATCH 0137/2372] Add rust-analyzer settings --- .gitignore | 1 - .vscode/settings.json | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 .vscode/settings.json diff --git a/.gitignore b/.gitignore index b0ea61c7fa..6f20a8ecdb 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,6 @@ target/ artifacts/ # IDEs -.vscode/ .idea/ *.iml diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..4fc9b25774 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "rust-analyzer.cargo.features": ["abort", "stargate", "staking", "cosmwasm_1_2"] +} From 90779fa30db7207b4f880e394101b3a801a9231c Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 25 Jan 2023 12:17:47 +0100 Subject: [PATCH 0138/2372] Update schemas to doc changes --- contracts/ibc-reflect-send/schema/ibc-reflect-send.json | 1 + contracts/ibc-reflect-send/schema/packet_msg.json | 1 + contracts/ibc-reflect-send/schema/raw/execute.json | 1 + contracts/ibc-reflect/schema/packet_msg.json | 1 + contracts/reflect/schema/raw/execute.json | 1 + contracts/reflect/schema/reflect.json | 1 + 6 files changed, 6 insertions(+) diff --git a/contracts/ibc-reflect-send/schema/ibc-reflect-send.json b/contracts/ibc-reflect-send/schema/ibc-reflect-send.json index 1498f82a21..33fb5467c8 100644 --- a/contracts/ibc-reflect-send/schema/ibc-reflect-send.json +++ b/contracts/ibc-reflect-send/schema/ibc-reflect-send.json @@ -357,6 +357,7 @@ "type": "object" }, "GovMsg": { + "description": "This message type allows the contract interact with the [x/gov] module in order to cast votes.\n\n[x/gov]: https://github.com/cosmos/cosmos-sdk/tree/v0.45.12/x/gov\n\n## Examples\n\nCast a simple vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); use cosmwasm_std::{GovMsg, VoteOption};\n\n#[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::Vote { proposal_id: 4, vote: VoteOption::Yes, })) } ```\n\nCast a weighted vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); # #[cfg(feature = \"cosmwasm_1_2\")] use cosmwasm_std::{Decimal, GovMsg, VoteOption, WeightedVoteOption};\n\n# #[cfg(feature = \"cosmwasm_1_2\")] #[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::VoteWeighted { proposal_id: 4, options: vec![ WeightedVoteOption { option: VoteOption::Yes, weight: Decimal::percent(65), }, WeightedVoteOption { option: VoteOption::Abstain, weight: Decimal::percent(35), }, ], })) } ```", "oneOf": [ { "description": "This maps directly to [MsgVote](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/gov/v1beta1/tx.proto#L46-L56) in the Cosmos SDK with voter set to the contract address.", diff --git a/contracts/ibc-reflect-send/schema/packet_msg.json b/contracts/ibc-reflect-send/schema/packet_msg.json index 4bf172b75e..ed5b77d0b8 100644 --- a/contracts/ibc-reflect-send/schema/packet_msg.json +++ b/contracts/ibc-reflect-send/schema/packet_msg.json @@ -295,6 +295,7 @@ "type": "object" }, "GovMsg": { + "description": "This message type allows the contract interact with the [x/gov] module in order to cast votes.\n\n[x/gov]: https://github.com/cosmos/cosmos-sdk/tree/v0.45.12/x/gov\n\n## Examples\n\nCast a simple vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); use cosmwasm_std::{GovMsg, VoteOption};\n\n#[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::Vote { proposal_id: 4, vote: VoteOption::Yes, })) } ```\n\nCast a weighted vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); # #[cfg(feature = \"cosmwasm_1_2\")] use cosmwasm_std::{Decimal, GovMsg, VoteOption, WeightedVoteOption};\n\n# #[cfg(feature = \"cosmwasm_1_2\")] #[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::VoteWeighted { proposal_id: 4, options: vec![ WeightedVoteOption { option: VoteOption::Yes, weight: Decimal::percent(65), }, WeightedVoteOption { option: VoteOption::Abstain, weight: Decimal::percent(35), }, ], })) } ```", "oneOf": [ { "description": "This maps directly to [MsgVote](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/gov/v1beta1/tx.proto#L46-L56) in the Cosmos SDK with voter set to the contract address.", diff --git a/contracts/ibc-reflect-send/schema/raw/execute.json b/contracts/ibc-reflect-send/schema/raw/execute.json index 198ed94097..db374275af 100644 --- a/contracts/ibc-reflect-send/schema/raw/execute.json +++ b/contracts/ibc-reflect-send/schema/raw/execute.json @@ -346,6 +346,7 @@ "type": "object" }, "GovMsg": { + "description": "This message type allows the contract interact with the [x/gov] module in order to cast votes.\n\n[x/gov]: https://github.com/cosmos/cosmos-sdk/tree/v0.45.12/x/gov\n\n## Examples\n\nCast a simple vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); use cosmwasm_std::{GovMsg, VoteOption};\n\n#[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::Vote { proposal_id: 4, vote: VoteOption::Yes, })) } ```\n\nCast a weighted vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); # #[cfg(feature = \"cosmwasm_1_2\")] use cosmwasm_std::{Decimal, GovMsg, VoteOption, WeightedVoteOption};\n\n# #[cfg(feature = \"cosmwasm_1_2\")] #[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::VoteWeighted { proposal_id: 4, options: vec![ WeightedVoteOption { option: VoteOption::Yes, weight: Decimal::percent(65), }, WeightedVoteOption { option: VoteOption::Abstain, weight: Decimal::percent(35), }, ], })) } ```", "oneOf": [ { "description": "This maps directly to [MsgVote](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/gov/v1beta1/tx.proto#L46-L56) in the Cosmos SDK with voter set to the contract address.", diff --git a/contracts/ibc-reflect/schema/packet_msg.json b/contracts/ibc-reflect/schema/packet_msg.json index 432e357fe3..bd940ab4f0 100644 --- a/contracts/ibc-reflect/schema/packet_msg.json +++ b/contracts/ibc-reflect/schema/packet_msg.json @@ -224,6 +224,7 @@ "type": "object" }, "GovMsg": { + "description": "This message type allows the contract interact with the [x/gov] module in order to cast votes.\n\n[x/gov]: https://github.com/cosmos/cosmos-sdk/tree/v0.45.12/x/gov\n\n## Examples\n\nCast a simple vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); use cosmwasm_std::{GovMsg, VoteOption};\n\n#[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::Vote { proposal_id: 4, vote: VoteOption::Yes, })) } ```\n\nCast a weighted vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); # #[cfg(feature = \"cosmwasm_1_2\")] use cosmwasm_std::{Decimal, GovMsg, VoteOption, WeightedVoteOption};\n\n# #[cfg(feature = \"cosmwasm_1_2\")] #[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::VoteWeighted { proposal_id: 4, options: vec![ WeightedVoteOption { option: VoteOption::Yes, weight: Decimal::percent(65), }, WeightedVoteOption { option: VoteOption::Abstain, weight: Decimal::percent(35), }, ], })) } ```", "oneOf": [ { "description": "This maps directly to [MsgVote](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/gov/v1beta1/tx.proto#L46-L56) in the Cosmos SDK with voter set to the contract address.", diff --git a/contracts/reflect/schema/raw/execute.json b/contracts/reflect/schema/raw/execute.json index 8568a9e798..732cf6db15 100644 --- a/contracts/reflect/schema/raw/execute.json +++ b/contracts/reflect/schema/raw/execute.json @@ -341,6 +341,7 @@ ] }, "GovMsg": { + "description": "This message type allows the contract interact with the [x/gov] module in order to cast votes.\n\n[x/gov]: https://github.com/cosmos/cosmos-sdk/tree/v0.45.12/x/gov\n\n## Examples\n\nCast a simple vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); use cosmwasm_std::{GovMsg, VoteOption};\n\n#[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::Vote { proposal_id: 4, vote: VoteOption::Yes, })) } ```\n\nCast a weighted vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); # #[cfg(feature = \"cosmwasm_1_2\")] use cosmwasm_std::{Decimal, GovMsg, VoteOption, WeightedVoteOption};\n\n# #[cfg(feature = \"cosmwasm_1_2\")] #[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::VoteWeighted { proposal_id: 4, options: vec![ WeightedVoteOption { option: VoteOption::Yes, weight: Decimal::percent(65), }, WeightedVoteOption { option: VoteOption::Abstain, weight: Decimal::percent(35), }, ], })) } ```", "oneOf": [ { "description": "This maps directly to [MsgVote](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/gov/v1beta1/tx.proto#L46-L56) in the Cosmos SDK with voter set to the contract address.", diff --git a/contracts/reflect/schema/reflect.json b/contracts/reflect/schema/reflect.json index 1f91a514a4..f73dcfe4bf 100644 --- a/contracts/reflect/schema/reflect.json +++ b/contracts/reflect/schema/reflect.json @@ -351,6 +351,7 @@ ] }, "GovMsg": { + "description": "This message type allows the contract interact with the [x/gov] module in order to cast votes.\n\n[x/gov]: https://github.com/cosmos/cosmos-sdk/tree/v0.45.12/x/gov\n\n## Examples\n\nCast a simple vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); use cosmwasm_std::{GovMsg, VoteOption};\n\n#[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::Vote { proposal_id: 4, vote: VoteOption::Yes, })) } ```\n\nCast a weighted vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); # #[cfg(feature = \"cosmwasm_1_2\")] use cosmwasm_std::{Decimal, GovMsg, VoteOption, WeightedVoteOption};\n\n# #[cfg(feature = \"cosmwasm_1_2\")] #[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::VoteWeighted { proposal_id: 4, options: vec![ WeightedVoteOption { option: VoteOption::Yes, weight: Decimal::percent(65), }, WeightedVoteOption { option: VoteOption::Abstain, weight: Decimal::percent(35), }, ], })) } ```", "oneOf": [ { "description": "This maps directly to [MsgVote](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/gov/v1beta1/tx.proto#L46-L56) in the Cosmos SDK with voter set to the contract address.", From 28b49f9c972061d6d6133c84c6a48bc27b440e90 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 26 Jan 2023 11:21:23 +0100 Subject: [PATCH 0139/2372] Improve comments on high/low-S handling of secp256k1_verify/secp256k1_recover_pubkey --- packages/crypto/src/secp256k1.rs | 85 +++++++++++++++++++++++++------- 1 file changed, 66 insertions(+), 19 deletions(-) diff --git a/packages/crypto/src/secp256k1.rs b/packages/crypto/src/secp256k1.rs index 4783de67c9..9bceee4dfd 100644 --- a/packages/crypto/src/secp256k1.rs +++ b/packages/crypto/src/secp256k1.rs @@ -35,6 +35,11 @@ pub const ECDSA_PUBKEY_MAX_LEN: usize = ECDSA_UNCOMPRESSED_PUBKEY_LEN; /// - signature: Serialized "compact" signature (64 bytes). /// - public key: [Serialized according to SEC 2](https://www.oreilly.com/library/view/programming-bitcoin/9781492031482/ch04.html) /// (33 or 65 bytes). +/// +/// This implementation accepts both high-S and low-S signatures. Some applications +/// including Ethereum transactions consider high-S signatures invalid in order to +/// avoid maleability. If that's the case for your protocol, the signature needs +/// to be tested for low-S in addition to this verification. pub fn secp256k1_verify( message_hash: &[u8], signature: &[u8], @@ -49,7 +54,10 @@ pub fn secp256k1_verify( let mut signature = Signature::from_bytes(&signature).map_err(|e| CryptoError::generic_err(e.to_string()))?; - // Non low-S signatures require normalization + + // High-S signatures require normalization since our verification implementation + // rejects them by default. If we had a verifier that does not restrict to + // low-S only, this step was not needed. if let Some(normalized) = signature.normalize_s() { signature = normalized; } @@ -74,6 +82,22 @@ pub fn secp256k1_verify( /// /// Returns the recovered pubkey in compressed form, which can be used /// in secp256k1_verify directly. +/// +/// This implementation accepts both high-S and low-S signatures. This is the +/// same behavior as Ethereum's `ecrecover`. The reason is that high-S signatures +/// may be perfectly valid if the application protocol does not disallow them. +/// Or as [EIP-2] put it "The ECDSA recover precompiled contract remains unchanged +/// and will keep accepting high s-values; this is useful e.g. if a contract +/// recovers old Bitcoin signatures.". +/// +/// See also OpenZeppilin's [ECDSA.recover implementation](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.1/contracts/utils/cryptography/ECDSA.sol#L138-L149) +/// which adds further restrictions to avoid potential siganture maleability. +/// Please note that restricting signatures to low-S does not make signatures unique +/// in the sense that for each (pubkey, message) there is only one signature. The +/// signer can generate an arbitrary amount of valid signatures. +/// +/// +/// [EIP-2]: https://eips.ethereum.org/EIPS/eip-2 pub fn secp256k1_recover_pubkey( message_hash: &[u8], signature: &[u8], @@ -161,7 +185,10 @@ mod tests { elliptic_curve::rand_core::OsRng, elliptic_curve::sec1::ToEncodedPoint, }; + use serde::Deserialize; use sha2::Sha256; + use std::fs::File; + use std::io::BufReader; // For generic signature verification const MSG: &str = "Hello World!"; @@ -181,6 +208,15 @@ mod tests { // Test data originally from https://github.com/cosmos/cosmjs/blob/v0.24.0-alpha.22/packages/crypto/src/secp256k1.spec.ts#L195-L394 const COSMOS_SECP256K1_TESTS_JSON: &str = "./testdata/secp256k1_tests.json"; + #[derive(Deserialize, Debug)] + struct Encoded { + message: String, + message_hash: String, + signature: String, + #[serde(rename = "pubkey")] + public_key: String, + } + #[test] fn test_secp256k1_verify() { // Explicit / external hashing @@ -266,20 +302,6 @@ mod tests { #[test] fn test_cosmos_extra_secp256k1_verify() { - use std::fs::File; - use std::io::BufReader; - - use serde::Deserialize; - - #[derive(Deserialize, Debug)] - struct Encoded { - message: String, - message_hash: String, - signature: String, - #[serde(rename = "pubkey")] - public_key: String, - } - // Open the file in read-only mode with buffer. let file = File::open(COSMOS_SECP256K1_TESTS_JSON).unwrap(); let reader = BufReader::new(file); @@ -288,15 +310,13 @@ mod tests { for (i, encoded) in (1..).zip(codes) { let message = hex::decode(&encoded.message).unwrap(); + let signature = hex::decode(&encoded.signature).unwrap(); + let public_key = hex::decode(&encoded.public_key).unwrap(); let hash = hex::decode(&encoded.message_hash).unwrap(); let message_hash = Sha256::digest(message); assert_eq!(hash.as_slice(), message_hash.as_slice()); - let signature = hex::decode(&encoded.signature).unwrap(); - - let public_key = hex::decode(&encoded.public_key).unwrap(); - // secp256k1_verify() works assert!( secp256k1_verify(&message_hash, &signature, &public_key).unwrap(), @@ -327,6 +347,7 @@ mod tests { } // Test data from https://github.com/randombit/botan/blob/2.9.0/src/tests/data/pubkey/ecdsa_key_recovery.vec + // This is a high-s value (`0x81F1A4457589F30D76AB9F89E748A68C8A94C30FE0BAC8FB5C0B54EA70BF6D2F > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0` is true) { let expected_x = "F3F8BB913AA68589A2C8C607A877AB05252ADBD963E1BE846DDEB8456942AEDC"; let expected_y = "A2ED51F08CA3EF3DAC0A7504613D54CD539FC1B3CBC92453CD704B6A2D012B2C"; @@ -349,6 +370,32 @@ mod tests { let pubkey = secp256k1_recover_pubkey(&message_hash, &r_s, recovery_param).unwrap(); assert_eq!(pubkey, expected); } + + let file = File::open(COSMOS_SECP256K1_TESTS_JSON).unwrap(); + let reader = BufReader::new(file); + let codes: Vec = serde_json::from_reader(reader).unwrap(); + for (i, encoded) in (1..).zip(codes) { + let message = hex::decode(&encoded.message).unwrap(); + let signature = hex::decode(&encoded.signature).unwrap(); + let public_key = hex::decode(&encoded.public_key).unwrap(); + + let hash = hex::decode(&encoded.message_hash).unwrap(); + let message_hash = Sha256::digest(message); + assert_eq!(hash.as_slice(), message_hash.as_slice()); + + // Since the recovery param is mossing in the test vectors, we try both 0 and 1 + let try0 = secp256k1_recover_pubkey(&message_hash, &signature, 0); + let try1 = secp256k1_recover_pubkey(&message_hash, &signature, 1); + match (try0, try1) { + (Ok(recovered0), Ok(recovered1)) => { + // Got two different pubkeys. Without the recoverey param, we don't know which one is the right one. + assert!(recovered0 == public_key || recovered1 == public_key) + }, + (Ok(recovered), Err(_)) => assert_eq!(recovered, public_key), + (Err(_), Ok(recovered)) => assert_eq!(recovered, public_key), + (Err(_), Err(_)) => panic!("secp256k1_recover_pubkey failed (test case {i} in {COSMOS_SECP256K1_TESTS_JSON})"), + } + } } #[test] From 07a01eba174217ef9ab237c18c3ac399d3fcc84b Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 26 Jan 2023 11:44:12 +0100 Subject: [PATCH 0140/2372] Improve some test code --- packages/crypto/src/secp256k1.rs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/packages/crypto/src/secp256k1.rs b/packages/crypto/src/secp256k1.rs index 9bceee4dfd..b2f606227c 100644 --- a/packages/crypto/src/secp256k1.rs +++ b/packages/crypto/src/secp256k1.rs @@ -292,11 +292,8 @@ mod tests { let message_hash = Sha256::digest(message); // secp256k1_verify works - assert!( - secp256k1_verify(&message_hash, &signature, &public_key).unwrap(), - "secp256k1_verify() failed (test case {})", - i - ); + let valid = secp256k1_verify(&message_hash, &signature, &public_key).unwrap(); + assert!(valid, "secp256k1_verify() failed (test case {i})",); } } @@ -318,10 +315,10 @@ mod tests { assert_eq!(hash.as_slice(), message_hash.as_slice()); // secp256k1_verify() works + let valid = secp256k1_verify(&message_hash, &signature, &public_key).unwrap(); assert!( - secp256k1_verify(&message_hash, &signature, &public_key).unwrap(), - "verify() failed (test case {})", - i + valid, + "secp256k1_verify failed (test case {i} in {COSMOS_SECP256K1_TESTS_JSON})" ); } } From 401b6fb50fcbb3a2dbf1e9465232478600a2dbc3 Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Thu, 26 Jan 2023 12:20:41 +0200 Subject: [PATCH 0141/2372] Debug impl for Decimal256 uses decimal output. --- packages/std/src/math/decimal.rs | 18 +++++++++++++++++- packages/std/src/math/decimal256.rs | 18 +++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 72975e22e3..005d9e1844 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -19,7 +19,7 @@ use super::{Uint128, Uint256}; /// A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0 /// /// The greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18) -#[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] +#[derive(Copy, Clone, Default, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] pub struct Decimal(#[schemars(with = "String")] Uint128); #[derive(Error, Debug, PartialEq, Eq)] @@ -457,6 +457,12 @@ impl fmt::Display for Decimal { } } +impl fmt::Debug for Decimal { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self) + } +} + impl Add for Decimal { type Output = Self; @@ -2015,4 +2021,14 @@ mod tests { assert_eq!(&lhs == &rhs, expected); } } + + #[test] + fn decimal_implements_debug() { + let test_cases = ["5", "5.01", "42", "0", "2"]; + + for s in test_cases { + let decimal = Decimal::from_str(s).unwrap(); + assert_eq!(s, format!("{:?}", decimal)); + } + } } diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 0c2b134b5b..0a96886827 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -22,7 +22,7 @@ use super::Uint256; /// The greatest possible value that can be represented is /// 115792089237316195423570985008687907853269984665640564039457.584007913129639935 /// (which is (2^256 - 1) / 10^18) -#[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] +#[derive(Copy, Clone, Default, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] pub struct Decimal256(#[schemars(with = "String")] Uint256); #[derive(Error, Debug, PartialEq, Eq)] @@ -482,6 +482,12 @@ impl fmt::Display for Decimal256 { } } +impl fmt::Debug for Decimal256 { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self) + } +} + impl Add for Decimal256 { type Output = Self; @@ -2162,4 +2168,14 @@ mod tests { assert_eq!(&lhs == &rhs, expected); } } + + #[test] + fn decimal256_implements_debug() { + let test_cases = ["5", "5.01", "42", "0", "2"]; + + for s in test_cases { + let decimal256 = Decimal256::from_str(s).unwrap(); + assert_eq!(s, format!("{:?}", decimal256)); + } + } } From bfb15c6744720a3347c7f63739fced0acb46416e Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Thu, 26 Jan 2023 14:19:23 +0200 Subject: [PATCH 0142/2372] Include type in Debug output --- packages/std/src/math/decimal.rs | 4 ++-- packages/std/src/math/decimal256.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 005d9e1844..c1dd504db2 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -459,7 +459,7 @@ impl fmt::Display for Decimal { impl fmt::Debug for Decimal { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", self) + write!(f, "Decimal({})", self) } } @@ -2028,7 +2028,7 @@ mod tests { for s in test_cases { let decimal = Decimal::from_str(s).unwrap(); - assert_eq!(s, format!("{:?}", decimal)); + assert_eq!(format!("Decimal({})", s), format!("{:?}", decimal)); } } } diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 0a96886827..c987f739fa 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -484,7 +484,7 @@ impl fmt::Display for Decimal256 { impl fmt::Debug for Decimal256 { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", self) + write!(f, "Decimal256({})", self) } } @@ -2175,7 +2175,7 @@ mod tests { for s in test_cases { let decimal256 = Decimal256::from_str(s).unwrap(); - assert_eq!(s, format!("{:?}", decimal256)); + assert_eq!(format!("Decimal256({})", s), format!("{:?}", decimal256)); } } } From 3ba7f27567b438d2274b7ffdd5ce517253d356f3 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 26 Jan 2023 17:55:23 +0100 Subject: [PATCH 0143/2372] Improve decimal{,256}_implements_debug test code --- packages/std/src/math/decimal.rs | 7 +++++-- packages/std/src/math/decimal256.rs | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index c1dd504db2..a146c62b94 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -2024,11 +2024,14 @@ mod tests { #[test] fn decimal_implements_debug() { - let test_cases = ["5", "5.01", "42", "0", "2"]; + let decimal = Decimal::from_str("123.45").unwrap(); + assert_eq!(format!("{:?}", decimal), "Decimal(123.45)"); + let test_cases = ["5", "5.01", "42", "0", "2"]; for s in test_cases { let decimal = Decimal::from_str(s).unwrap(); - assert_eq!(format!("Decimal({})", s), format!("{:?}", decimal)); + let expected = format!("Decimal({})", s); + assert_eq!(format!("{:?}", decimal), expected); } } } diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index c987f739fa..2ae938e614 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -2171,11 +2171,14 @@ mod tests { #[test] fn decimal256_implements_debug() { - let test_cases = ["5", "5.01", "42", "0", "2"]; + let decimal = Decimal256::from_str("123.45").unwrap(); + assert_eq!(format!("{:?}", decimal), "Decimal256(123.45)"); + let test_cases = ["5", "5.01", "42", "0", "2"]; for s in test_cases { let decimal256 = Decimal256::from_str(s).unwrap(); - assert_eq!(format!("Decimal256({})", s), format!("{:?}", decimal256)); + let expected = format!("Decimal256({})", s); + assert_eq!(format!("{:?}", decimal256), expected); } } } From 28e690507282fcbe9bd2e515ba83e4ba8994c8fe Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 26 Jan 2023 18:04:39 +0100 Subject: [PATCH 0144/2372] Add CHANGELOG entry --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 33fbbdf0dc..ea5f0b20d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,13 @@ and this project adheres to [#1597]: https://github.com/CosmWasm/cosmwasm/issues/1597 +### Changed + +- cosmwasm-std: Improve readability of `Debug` output for `Decimal` and + `Decimal256` ([#1600]). + +[#1600]: https://github.com/CosmWasm/cosmwasm/pull/1600 + ## [1.2.0] - 2023-01-24 ### Added From 4e688bac824833b062ec2a48d0c54ee628b5acf3 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 26 Jan 2023 18:52:14 +0100 Subject: [PATCH 0145/2372] Add to_uint_floor, to_uint_ceil --- packages/std/src/math/decimal.rs | 48 +++++++++++++++++++++++++++++ packages/std/src/math/decimal256.rs | 48 +++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index a146c62b94..d416a30f40 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -357,6 +357,54 @@ impl Decimal { Err(_) => Self::MAX, } } + + /// Converts this decimal to an unsigned integer by truncating + /// the fractional part, e.g. 22.5 becomes 22. + /// + /// ## Examples + /// + /// ``` + /// use std::str::FromStr; + /// use cosmwasm_std::{Decimal, Uint128}; + /// + /// let d = Decimal::from_str("12.345").unwrap(); + /// assert_eq!(d.to_uint_floor(), Uint128::new(12)); + /// + /// let d = Decimal::from_str("12.999").unwrap(); + /// assert_eq!(d.to_uint_floor(), Uint128::new(12)); + /// + /// let d = Decimal::from_str("75.0").unwrap(); + /// assert_eq!(d.to_uint_floor(), Uint128::new(75)); + /// ``` + pub fn to_uint_floor(self) -> Uint128 { + self.0 / Self::DECIMAL_FRACTIONAL + } + + /// Converts this decimal to an unsigned integer by rounting up + /// to the next integer, e.g. 22.3 becomes 23. + /// + /// ## Examples + /// + /// ``` + /// use std::str::FromStr; + /// use cosmwasm_std::{Decimal, Uint128}; + /// + /// let d = Decimal::from_str("12.345").unwrap(); + /// assert_eq!(d.to_uint_ceil(), Uint128::new(13)); + /// + /// let d = Decimal::from_str("12.999").unwrap(); + /// assert_eq!(d.to_uint_ceil(), Uint128::new(13)); + /// + /// let d = Decimal::from_str("75.0").unwrap(); + /// assert_eq!(d.to_uint_ceil(), Uint128::new(75)); + /// ``` + pub fn to_uint_ceil(self) -> Uint128 { + if (self.0 % Self::DECIMAL_FRACTIONAL).is_zero() { + self.0 / Self::DECIMAL_FRACTIONAL + } else { + self.0 / Self::DECIMAL_FRACTIONAL + Uint128::one() + } + } } impl Fraction for Decimal { diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 2ae938e614..68e113001b 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -374,6 +374,54 @@ impl Decimal256 { Err(_) => Self::MAX, } } + + /// Converts this decimal to an unsigned integer by truncating + /// the fractional part, e.g. 22.5 becomes 22. + /// + /// ## Examples + /// + /// ``` + /// use std::str::FromStr; + /// use cosmwasm_std::{Decimal256, Uint256}; + /// + /// let d = Decimal256::from_str("12.345").unwrap(); + /// assert_eq!(d.to_uint_floor(), Uint256::from(12u64)); + /// + /// let d = Decimal256::from_str("12.999").unwrap(); + /// assert_eq!(d.to_uint_floor(), Uint256::from(12u64)); + /// + /// let d = Decimal256::from_str("75.0").unwrap(); + /// assert_eq!(d.to_uint_floor(), Uint256::from(75u64)); + /// ``` + pub fn to_uint_floor(self) -> Uint256 { + self.0 / Self::DECIMAL_FRACTIONAL + } + + /// Converts this decimal to an unsigned integer by rounting up + /// to the next integer, e.g. 22.3 becomes 23. + /// + /// ## Examples + /// + /// ``` + /// use std::str::FromStr; + /// use cosmwasm_std::{Decimal256, Uint256}; + /// + /// let d = Decimal256::from_str("12.345").unwrap(); + /// assert_eq!(d.to_uint_ceil(), Uint256::from(13u64)); + /// + /// let d = Decimal256::from_str("12.999").unwrap(); + /// assert_eq!(d.to_uint_ceil(), Uint256::from(13u64)); + /// + /// let d = Decimal256::from_str("75.0").unwrap(); + /// assert_eq!(d.to_uint_ceil(), Uint256::from(75u64)); + /// ``` + pub fn to_uint_ceil(self) -> Uint256 { + if (self.0 % Self::DECIMAL_FRACTIONAL).is_zero() { + self.0 / Self::DECIMAL_FRACTIONAL + } else { + self.0 / Self::DECIMAL_FRACTIONAL + Uint256::one() + } + } } impl Fraction for Decimal256 { From 2bcc2d1760f0e5ab657cfdba78a9fc5e7d824f40 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 26 Jan 2023 22:21:41 +0100 Subject: [PATCH 0146/2372] Add unit tests --- packages/std/src/math/decimal.rs | 36 +++++++++++++++++++++++ packages/std/src/math/decimal256.rs | 44 +++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index d416a30f40..82408f0510 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -2050,6 +2050,42 @@ mod tests { )); } + #[test] + fn decimal_to_uint_floor_works() { + let d = Decimal::from_str("12.000000000000000001").unwrap(); + assert_eq!(d.to_uint_floor(), Uint128::new(12)); + let d = Decimal::from_str("12.345").unwrap(); + assert_eq!(d.to_uint_floor(), Uint128::new(12)); + let d = Decimal::from_str("12.999").unwrap(); + assert_eq!(d.to_uint_floor(), Uint128::new(12)); + + let d = Decimal::from_str("75.0").unwrap(); + assert_eq!(d.to_uint_floor(), Uint128::new(75)); + let d = Decimal::from_str("0.0").unwrap(); + assert_eq!(d.to_uint_floor(), Uint128::new(0)); + + let d = Decimal::MAX; + assert_eq!(d.to_uint_floor(), Uint128::new(340282366920938463463)); + } + + #[test] + fn decimal_to_uint_ceil_works() { + let d = Decimal::from_str("12.000000000000000001").unwrap(); + assert_eq!(d.to_uint_ceil(), Uint128::new(13)); + let d = Decimal::from_str("12.345").unwrap(); + assert_eq!(d.to_uint_ceil(), Uint128::new(13)); + let d = Decimal::from_str("12.999").unwrap(); + assert_eq!(d.to_uint_ceil(), Uint128::new(13)); + + let d = Decimal::from_str("75.0").unwrap(); + assert_eq!(d.to_uint_ceil(), Uint128::new(75)); + let d = Decimal::from_str("0.0").unwrap(); + assert_eq!(d.to_uint_ceil(), Uint128::new(0)); + + let d = Decimal::MAX; + assert_eq!(d.to_uint_ceil(), Uint128::new(340282366920938463464)); + } + #[test] fn decimal_partial_eq() { let test_cases = [ diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 68e113001b..2777b63866 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -2197,6 +2197,50 @@ mod tests { assert_eq!(Decimal256::MAX.checked_ceil(), Err(RoundUpOverflowError)); } + #[test] + fn decimal256_to_uint_floor_works() { + let d = Decimal256::from_str("12.000000000000000001").unwrap(); + assert_eq!(d.to_uint_floor(), Uint256::from_u128(12)); + let d = Decimal256::from_str("12.345").unwrap(); + assert_eq!(d.to_uint_floor(), Uint256::from_u128(12)); + let d = Decimal256::from_str("12.999").unwrap(); + assert_eq!(d.to_uint_floor(), Uint256::from_u128(12)); + + let d = Decimal256::from_str("75.0").unwrap(); + assert_eq!(d.to_uint_floor(), Uint256::from_u128(75)); + let d = Decimal256::from_str("0.0").unwrap(); + assert_eq!(d.to_uint_floor(), Uint256::from_u128(0)); + + let d = Decimal256::MAX; + assert_eq!( + d.to_uint_floor(), + Uint256::from_str("115792089237316195423570985008687907853269984665640564039457") + .unwrap() + ); + } + + #[test] + fn decimal256_to_uint_ceil_works() { + let d = Decimal256::from_str("12.000000000000000001").unwrap(); + assert_eq!(d.to_uint_ceil(), Uint256::from_u128(13)); + let d = Decimal256::from_str("12.345").unwrap(); + assert_eq!(d.to_uint_ceil(), Uint256::from_u128(13)); + let d = Decimal256::from_str("12.999").unwrap(); + assert_eq!(d.to_uint_ceil(), Uint256::from_u128(13)); + + let d = Decimal256::from_str("75.0").unwrap(); + assert_eq!(d.to_uint_ceil(), Uint256::from_u128(75)); + let d = Decimal256::from_str("0.0").unwrap(); + assert_eq!(d.to_uint_ceil(), Uint256::from_u128(0)); + + let d = Decimal256::MAX; + assert_eq!( + d.to_uint_ceil(), + Uint256::from_str("115792089237316195423570985008687907853269984665640564039458") + .unwrap() + ); + } + #[test] fn decimal256_partial_eq() { let test_cases = [ From 3b7b3a4a553fa299de3799352b86ea414c9b4e89 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 30 Jan 2023 13:23:53 +0100 Subject: [PATCH 0147/2372] Implement to_uint_ceil without modulo operation --- packages/std/src/math/decimal.rs | 10 +++++++--- packages/std/src/math/decimal256.rs | 10 +++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 82408f0510..80c610cf6b 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -399,10 +399,14 @@ impl Decimal { /// assert_eq!(d.to_uint_ceil(), Uint128::new(75)); /// ``` pub fn to_uint_ceil(self) -> Uint128 { - if (self.0 % Self::DECIMAL_FRACTIONAL).is_zero() { - self.0 / Self::DECIMAL_FRACTIONAL + // Using `q = 1 + ((x - 1) / y); // if x != 0` with unsigned integers x, y, q + // from https://stackoverflow.com/a/2745086/2013738. We know `x + y` CAN overflow. + let x = self.0; + let y = Self::DECIMAL_FRACTIONAL; + if x.is_zero() { + Uint128::zero() } else { - self.0 / Self::DECIMAL_FRACTIONAL + Uint128::one() + Uint128::one() + ((x - Uint128::one()) / y) } } } diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 2777b63866..bd286a5f98 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -416,10 +416,14 @@ impl Decimal256 { /// assert_eq!(d.to_uint_ceil(), Uint256::from(75u64)); /// ``` pub fn to_uint_ceil(self) -> Uint256 { - if (self.0 % Self::DECIMAL_FRACTIONAL).is_zero() { - self.0 / Self::DECIMAL_FRACTIONAL + // Using `q = 1 + ((x - 1) / y); // if x != 0` with unsigned integers x, y, q + // from https://stackoverflow.com/a/2745086/2013738. We know `x + y` CAN overflow. + let x = self.0; + let y = Self::DECIMAL_FRACTIONAL; + if x.is_zero() { + Uint256::zero() } else { - self.0 / Self::DECIMAL_FRACTIONAL + Uint256::one() + Uint256::one() + ((x - Uint256::one()) / y) } } } From a31e81ffbc6f7c25606a24df3d11c86b2c839585 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 30 Jan 2023 13:32:18 +0100 Subject: [PATCH 0148/2372] Test to_uint_floor for value < 1 --- packages/std/src/math/decimal.rs | 2 ++ packages/std/src/math/decimal256.rs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 80c610cf6b..d4c63651bd 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -2062,6 +2062,8 @@ mod tests { assert_eq!(d.to_uint_floor(), Uint128::new(12)); let d = Decimal::from_str("12.999").unwrap(); assert_eq!(d.to_uint_floor(), Uint128::new(12)); + let d = Decimal::from_str("0.98451384").unwrap(); + assert_eq!(d.to_uint_floor(), Uint128::new(0)); let d = Decimal::from_str("75.0").unwrap(); assert_eq!(d.to_uint_floor(), Uint128::new(75)); diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index bd286a5f98..45e7e8d83a 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -2209,6 +2209,8 @@ mod tests { assert_eq!(d.to_uint_floor(), Uint256::from_u128(12)); let d = Decimal256::from_str("12.999").unwrap(); assert_eq!(d.to_uint_floor(), Uint256::from_u128(12)); + let d = Decimal256::from_str("0.98451384").unwrap(); + assert_eq!(d.to_uint_floor(), Uint256::from_u128(0)); let d = Decimal256::from_str("75.0").unwrap(); assert_eq!(d.to_uint_floor(), Uint256::from_u128(75)); From 6ca600b0c8a7ca4afe6af6db33e2d9e18bb8de31 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 30 Jan 2023 13:32:54 +0100 Subject: [PATCH 0149/2372] Test compatibility with old workaround --- packages/std/src/math/decimal.rs | 13 +++++++++++++ packages/std/src/math/decimal256.rs | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index d4c63651bd..5f1473dfd0 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -2072,6 +2072,19 @@ mod tests { let d = Decimal::MAX; assert_eq!(d.to_uint_floor(), Uint128::new(340282366920938463463)); + + // Does the same as the old workaround `Uint128::one() * my_decimal`. + // This block can be deleted as part of https://github.com/CosmWasm/cosmwasm/issues/1485. + let tests = vec![ + Decimal::from_str("12.345").unwrap(), + Decimal::from_str("0.98451384").unwrap(), + Decimal::from_str("178.0").unwrap(), + Decimal::MIN, + Decimal::MAX, + ]; + for my_decimal in tests.into_iter() { + assert_eq!(my_decimal.to_uint_floor(), Uint128::one() * my_decimal); + } } #[test] diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 45e7e8d83a..1092776c68 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -2223,6 +2223,19 @@ mod tests { Uint256::from_str("115792089237316195423570985008687907853269984665640564039457") .unwrap() ); + + // Does the same as the old workaround `Uint256::one() * my_decimal`. + // This block can be deleted as part of https://github.com/CosmWasm/cosmwasm/issues/1485. + let tests = vec![ + Decimal256::from_str("12.345").unwrap(), + Decimal256::from_str("0.98451384").unwrap(), + Decimal256::from_str("178.0").unwrap(), + Decimal256::MIN, + Decimal256::MAX, + ]; + for my_decimal in tests.into_iter() { + assert_eq!(my_decimal.to_uint_floor(), Uint256::one() * my_decimal); + } } #[test] From 9c76900a7a009671a1506241df133bb527c23fdb Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 30 Jan 2023 13:54:14 +0100 Subject: [PATCH 0150/2372] Fix virus instantiation --- contracts/virus/src/contract.rs | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/contracts/virus/src/contract.rs b/contracts/virus/src/contract.rs index dabd590cbd..202881b346 100644 --- a/contracts/virus/src/contract.rs +++ b/contracts/virus/src/contract.rs @@ -1,6 +1,6 @@ use cosmwasm_std::{ entry_point, instantiate2_address, to_binary, Attribute, Binary, CodeInfoResponse, - ContractInfoResponse, DepsMut, Env, MessageInfo, Response, StdError, StdResult, WasmMsg, + ContractInfoResponse, DepsMut, Env, MessageInfo, Response, StdResult, WasmMsg, }; use crate::errors::ContractError; @@ -13,9 +13,7 @@ pub fn instantiate( _info: MessageInfo, _msg: InstantiateMsg, ) -> StdResult { - Err(StdError::generic_err( - "You can only use this contract for migrations", - )) + Ok(Response::new()) } #[entry_point] @@ -96,4 +94,18 @@ pub fn execute_spread( } #[cfg(test)] -mod tests {} +mod tests { + use super::*; + use cosmwasm_std::testing::{mock_dependencies, mock_env, mock_info}; + + const CREATOR: &str = "creator"; + + #[test] + fn instantiate_works() { + let mut deps = mock_dependencies(); + let msg = InstantiateMsg {}; + let info = mock_info(CREATOR, &[]); + let res = instantiate(deps.as_mut(), mock_env(), info, msg).unwrap(); + assert_eq!(0, res.messages.len()); + } +} From 893786af4309d7550176e8387493a6a08237b123 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 30 Jan 2023 14:36:25 +0100 Subject: [PATCH 0151/2372] Add CHANGELOG entry for to_uint_floor/to_uint_ceil [ci skip] --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea5f0b20d1..81599bf158 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,13 @@ and this project adheres to ## [Unreleased] +### Added + +- cosmwasm-std: Add `Decimal{,256}::to_uint_floor` and `::to_uint_ceil` for + efficient and explicit decimal to uint conversion ([#1603]). + +[#1603]: https://github.com/CosmWasm/cosmwasm/pull/1603 + ### Fixed - cosmwasm-std: Make fields of `WeightedVoteOption` public to allow constructing From 9e822c43e2e93449307dc34c3f3bd01317a2a2b5 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 30 Jan 2023 14:38:23 +0100 Subject: [PATCH 0152/2372] Set version: 1.2.1 --- CHANGELOG.md | 5 ++++- Cargo.lock | 16 ++++++++-------- contracts/burner/Cargo.lock | 12 ++++++------ contracts/crypto-verify/Cargo.lock | 14 +++++++------- contracts/cyberpunk/Cargo.lock | 14 +++++++------- contracts/floaty/Cargo.lock | 14 +++++++------- contracts/hackatom/Cargo.lock | 14 +++++++------- contracts/ibc-reflect-send/Cargo.lock | 14 +++++++------- contracts/ibc-reflect/Cargo.lock | 14 +++++++------- contracts/queue/Cargo.lock | 12 ++++++------ contracts/reflect/Cargo.lock | 14 +++++++------- contracts/staking/Cargo.lock | 14 +++++++------- contracts/virus/Cargo.lock | 12 ++++++------ packages/check/Cargo.toml | 6 +++--- packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema-derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 6 +++--- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 21 files changed, 103 insertions(+), 100 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81599bf158..4077ac9e36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ and this project adheres to ## [Unreleased] +## [1.2.1] - 2023-01-30 + ### Added - cosmwasm-std: Add `Decimal{,256}::to_uint_floor` and `::to_uint_ceil` for @@ -1631,7 +1633,8 @@ Some main points: All future Changelog entries will reference this base -[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.0...HEAD +[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.1...HEAD +[1.2.1]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.0...v1.2.1 [1.2.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.1.9...v1.2.0 [1.1.9]: https://github.com/CosmWasm/cosmwasm/compare/v1.1.8...v1.1.9 [1.1.8]: https://github.com/CosmWasm/cosmwasm/compare/v1.1.6...v1.1.8 diff --git a/Cargo.lock b/Cargo.lock index eae3adcab8..450164ed4e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -246,7 +246,7 @@ dependencies = [ [[package]] name = "cosmwasm-check" -version = "1.2.0" +version = "1.2.1" dependencies = [ "anyhow", "clap", @@ -257,7 +257,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0" +version = "1.2.1" dependencies = [ "base64", "criterion", @@ -276,7 +276,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0" +version = "1.2.1" dependencies = [ "cosmwasm-std", "syn", @@ -284,7 +284,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "1.2.0" +version = "1.2.1" dependencies = [ "anyhow", "cosmwasm-schema-derive", @@ -299,7 +299,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0" +version = "1.2.1" dependencies = [ "proc-macro2", "quote", @@ -308,7 +308,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0" +version = "1.2.1" dependencies = [ "base64", "chrono", @@ -330,7 +330,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0" +version = "1.2.1" dependencies = [ "cosmwasm-std", "serde", @@ -338,7 +338,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0" +version = "1.2.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 20a0bf204d..64ab9e5c20 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -174,7 +174,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0" +version = "1.2.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -185,14 +185,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0" +version = "1.2.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0" +version = "1.2.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -203,7 +203,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0" +version = "1.2.1" dependencies = [ "proc-macro2", "quote", @@ -212,7 +212,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0" +version = "1.2.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -230,7 +230,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0" +version = "1.2.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 0fa8440fb7..373b1570ea 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0" +version = "1.2.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0" +version = "1.2.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0" +version = "1.2.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0" +version = "1.2.1" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0" +version = "1.2.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0" +version = "1.2.1" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0" +version = "1.2.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index c5987f97dc..ae70be30ec 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0" +version = "1.2.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -203,14 +203,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0" +version = "1.2.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0" +version = "1.2.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -221,7 +221,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0" +version = "1.2.1" dependencies = [ "proc-macro2", "quote", @@ -230,7 +230,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0" +version = "1.2.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -248,7 +248,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0" +version = "1.2.1" dependencies = [ "cosmwasm-std", "serde", @@ -256,7 +256,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0" +version = "1.2.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 495ecd0e42..6d88927bcc 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0" +version = "1.2.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0" +version = "1.2.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0" +version = "1.2.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0" +version = "1.2.1" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0" +version = "1.2.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0" +version = "1.2.1" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0" +version = "1.2.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index b76cc69f07..1115f5ad91 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0" +version = "1.2.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0" +version = "1.2.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0" +version = "1.2.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0" +version = "1.2.1" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0" +version = "1.2.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0" +version = "1.2.1" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0" +version = "1.2.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 9c5b2a1f77..96690b1028 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0" +version = "1.2.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0" +version = "1.2.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0" +version = "1.2.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0" +version = "1.2.1" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0" +version = "1.2.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0" +version = "1.2.1" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0" +version = "1.2.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 46792be82f..9f4ff5b1b7 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0" +version = "1.2.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0" +version = "1.2.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0" +version = "1.2.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0" +version = "1.2.1" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0" +version = "1.2.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0" +version = "1.2.1" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0" +version = "1.2.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 0c284845a1..36b1b458a5 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0" +version = "1.2.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0" +version = "1.2.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0" +version = "1.2.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0" +version = "1.2.1" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0" +version = "1.2.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0" +version = "1.2.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 64da836cd1..76cb94c658 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0" +version = "1.2.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0" +version = "1.2.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0" +version = "1.2.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0" +version = "1.2.1" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0" +version = "1.2.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0" +version = "1.2.1" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0" +version = "1.2.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 35a8d3288d..f08f9f6c11 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0" +version = "1.2.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0" +version = "1.2.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0" +version = "1.2.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0" +version = "1.2.1" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0" +version = "1.2.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.0" +version = "1.2.1" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0" +version = "1.2.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 4e6882ec84..69daf93200 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.0" +version = "1.2.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0" +version = "1.2.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0" +version = "1.2.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0" +version = "1.2.1" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.0" +version = "1.2.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.0" +version = "1.2.1" dependencies = [ "bitflags", "bytecheck", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index e09ee94e48..a99865dbd8 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-check" -version = "1.2.0" +version = "1.2.1" authors = ["Mauro Lacy "] edition = "2021" description = "A CLI tool for verifying CosmWasm smart contracts" @@ -11,5 +11,5 @@ license = "Apache-2.0" anyhow = "1.0.57" clap = "2" colored = "2" -cosmwasm-vm = { path = "../vm", version = "1.2.0" } -cosmwasm-std = { path = "../std", version = "1.2.0" } +cosmwasm-vm = { path = "../vm", version = "1.2.1" } +cosmwasm-std = { path = "../std", version = "1.2.1" } diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index cbadde4722..7691f40bb2 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "1.2.0" +version = "1.2.1" authors = ["Mauro Lacy "] edition = "2021" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index 5a111016fb..38a24c375d 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "1.2.0" +version = "1.2.1" authors = ["Simon Warta "] edition = "2021" description = "A package for auto-generated code used for CosmWasm contract development. This is shipped as part of cosmwasm-std. Do not use directly." diff --git a/packages/schema-derive/Cargo.toml b/packages/schema-derive/Cargo.toml index 04b09449e2..61314c5324 100644 --- a/packages/schema-derive/Cargo.toml +++ b/packages/schema-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema-derive" -version = "1.2.0" +version = "1.2.1" authors = ["Tomasz Kurcz "] edition = "2021" description = "Derive macros for cosmwasm-schema" diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index 01d1b23c2e..faa8e5854b 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "1.2.0" +version = "1.2.1" authors = ["Simon Warta ", "Ethan Frey "] edition = "2021" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." @@ -8,7 +8,7 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/schema" license = "Apache-2.0" [dependencies] -cosmwasm-schema-derive = { version = "=1.2.0", path = "../schema-derive" } +cosmwasm-schema-derive = { version = "=1.2.1", path = "../schema-derive" } schemars = "0.8.3" serde = "1.0" serde_json = "1.0.40" @@ -16,6 +16,6 @@ thiserror = "1.0.26" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = { version = "1.2.0", path = "../std" } +cosmwasm-std = { version = "1.2.1", path = "../std" } semver = "1" tempfile = "3" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 831b45ae22..7b286142b8 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "1.2.0" +version = "1.2.1" authors = ["Ethan Frey "] edition = "2021" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -42,7 +42,7 @@ cosmwasm_1_2 = ["cosmwasm_1_1"] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "1.2.0" } +cosmwasm-derive = { path = "../derive", version = "1.2.1" } derivative = "2" forward_ref = "1" hex = "0.4" @@ -54,7 +54,7 @@ thiserror = "1.0.26" uint = "0.9.3" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "1.2.0" } +cosmwasm-crypto = { path = "../crypto", version = "1.2.1" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 6332d2e1b2..e3b95773ad 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "1.2.0" +version = "1.2.1" authors = ["Ethan Frey "] edition = "2021" description = "CosmWasm library with useful helpers for Storage patterns" @@ -16,5 +16,5 @@ iterator = ["cosmwasm-std/iterator"] [dependencies] # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.2.0", default-features = false } +cosmwasm-std = { path = "../std", version = "1.2.1", default-features = false } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 0fb8290d5b..1e5c85759b 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "1.2.0" +version = "1.2.1" authors = ["Ethan Frey "] edition = "2021" description = "VM bindings to run cosmwams contracts" @@ -41,8 +41,8 @@ required-features = ["iterator"] [dependencies] clru = "0.4.0" # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.2.0", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "1.2.0" } +cosmwasm-std = { path = "../std", version = "1.2.1", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "1.2.1" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.3" From 32f308a1a56ae5b8278947891306f7a374c3df94 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 30 Jan 2023 18:16:17 +0100 Subject: [PATCH 0153/2372] Add type-safe unwrap example --- packages/std/src/never.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/packages/std/src/never.rs b/packages/std/src/never.rs index 4b9f6c7b8a..51173892f5 100644 --- a/packages/std/src/never.rs +++ b/packages/std/src/never.rs @@ -7,6 +7,24 @@ /// /// Once the ! type is stable, this is not needed anymore. /// See . +/// +/// ## Examples +/// +/// When using `Never` in a `Result`, we can unwrap in a type-safe way: +/// +/// ``` +/// use cosmwasm_std::Never; +/// +/// pub fn safe_unwrap(res: Result) -> T { +/// match res { +/// Ok(value) => value, +/// Err(err) => match err {}, +/// } +/// } +/// +/// let res: Result = Ok(5); +/// assert_eq!(safe_unwrap(res), 5); +/// ``` pub enum Never {} // The Debug implementation is needed to allow the use of `Result::unwrap`. From 30db426e2f8185ef977d24c8b560786a0f3bb07d Mon Sep 17 00:00:00 2001 From: Gabe Rodriguez Date: Wed, 8 Feb 2023 10:09:13 +0100 Subject: [PATCH 0154/2372] Expose CheckedMultiplyFractionError publicly --- packages/std/src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index a15f0f4c62..ccc28b2c91 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -31,9 +31,9 @@ pub use crate::binary::Binary; pub use crate::coin::{coin, coins, has_coins, Coin}; pub use crate::deps::{Deps, DepsMut, OwnedDeps}; pub use crate::errors::{ - CheckedFromRatioError, CheckedMultiplyRatioError, ConversionOverflowError, DivideByZeroError, - OverflowError, OverflowOperation, RecoverPubkeyError, StdError, StdResult, SystemError, - VerificationError, + CheckedFromRatioError, CheckedMultiplyFractionError, CheckedMultiplyRatioError, + ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, + RecoverPubkeyError, StdError, StdResult, SystemError, VerificationError, }; pub use crate::hex_binary::HexBinary; #[cfg(feature = "stargate")] From 4eb32795a944c62b56a376f1359226c1ae9184f0 Mon Sep 17 00:00:00 2001 From: TomL94 Date: Wed, 22 Feb 2023 13:48:01 +0200 Subject: [PATCH 0155/2372] Fix backtraces feature --- Cargo.lock | 8 ++++---- packages/crypto/Cargo.toml | 7 +++++-- packages/crypto/src/lib.rs | 3 ++- packages/std/src/lib.rs | 3 ++- packages/vm/src/lib.rs | 3 ++- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 450164ed4e..b0dd83c5b9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1743,18 +1743,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.31" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.31" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 7691f40bb2..8e2107099f 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -23,11 +23,14 @@ k256 = { version = "0.11.1", features = ["ecdsa"] } ed25519-zebra = "3" digest = "0.10" rand_core = { version = "0.6", features = ["getrandom"] } -thiserror = "1.0.26" +thiserror = "1.0.38" [dev-dependencies] criterion = "0.3" -serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } +serde = { version = "1.0.103", default-features = false, features = [ + "derive", + "alloc", +] } serde_json = "1.0.40" sha2 = "0.10" base64 = "0.13.0" diff --git a/packages/crypto/src/lib.rs b/packages/crypto/src/lib.rs index 97bf244c43..01ee97bbf7 100644 --- a/packages/crypto/src/lib.rs +++ b/packages/crypto/src/lib.rs @@ -2,7 +2,8 @@ //! Please don't use any of these types directly, as //! they might change frequently, or be removed in the future. //! This crate does not adhere to semantic versioning. -#![cfg_attr(feature = "backtraces", feature(backtrace))] +#![cfg_attr(feature = "backtraces", feature(error_generic_member_access))] +#![cfg_attr(feature = "backtraces", feature(provide_any))] mod ed25519; mod errors; diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index a15f0f4c62..13087241c5 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -1,4 +1,5 @@ -#![cfg_attr(feature = "backtraces", feature(backtrace))] +#![cfg_attr(feature = "backtraces", feature(error_generic_member_access))] +#![cfg_attr(feature = "backtraces", feature(provide_any))] // Exposed on all platforms diff --git a/packages/vm/src/lib.rs b/packages/vm/src/lib.rs index 986275853b..19bb888f82 100644 --- a/packages/vm/src/lib.rs +++ b/packages/vm/src/lib.rs @@ -1,4 +1,5 @@ -#![cfg_attr(feature = "backtraces", feature(backtrace))] +#![cfg_attr(feature = "backtraces", feature(error_generic_member_access))] +#![cfg_attr(feature = "backtraces", feature(provide_any))] mod backend; mod cache; From 3bee042f1ddef316e4454040226f985bbfb91474 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 2 Mar 2023 10:53:44 +0100 Subject: [PATCH 0156/2372] Add update_crate script --- devtools/update_crate.sh | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100755 devtools/update_crate.sh diff --git a/devtools/update_crate.sh b/devtools/update_crate.sh new file mode 100755 index 0000000000..500d36f6e0 --- /dev/null +++ b/devtools/update_crate.sh @@ -0,0 +1,15 @@ +#!/bin/bash +set -o errexit -o nounset -o pipefail +command -v shellcheck >/dev/null && shellcheck "$0" + +CRATE_NAME="$1" + +# Update root Cargo.lock +cargo update -p "$CRATE_NAME" + +for contract_dir in contracts/*/; do + ( + cd "$contract_dir" + cargo update -p "$CRATE_NAME" + ) +done From 1f10b7876205c0e85602b2974f0a31590d7359e4 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 2 Mar 2023 10:54:00 +0100 Subject: [PATCH 0157/2372] Update schemars to 0.8.12 --- Cargo.lock | 12 ++++++------ contracts/burner/Cargo.lock | 12 ++++++------ contracts/crypto-verify/Cargo.lock | 12 ++++++------ contracts/cyberpunk/Cargo.lock | 12 ++++++------ contracts/floaty/Cargo.lock | 12 ++++++------ contracts/hackatom/Cargo.lock | 12 ++++++------ contracts/ibc-reflect-send/Cargo.lock | 12 ++++++------ contracts/ibc-reflect/Cargo.lock | 12 ++++++------ contracts/queue/Cargo.lock | 12 ++++++------ contracts/reflect/Cargo.lock | 12 ++++++------ contracts/staking/Cargo.lock | 12 ++++++------ contracts/virus/Cargo.lock | 12 ++++++------ 12 files changed, 72 insertions(+), 72 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 450164ed4e..055a5732eb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1503,9 +1503,9 @@ dependencies = [ [[package]] name = "schemars" -version = "0.8.8" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6b5a3c80cea1ab61f4260238409510e814e38b4b563c06044edf91e7dc070e3" +checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" dependencies = [ "dyn-clone", "schemars_derive", @@ -1515,9 +1515,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.8" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ae4dce13e8614c46ac3c38ef1c0d668b101df6ac39817aebdaa26642ddae9b" +checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" dependencies = [ "proc-macro2", "quote", @@ -1607,9 +1607,9 @@ dependencies = [ [[package]] name = "serde_derive_internals" -version = "0.25.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 64ab9e5c20..56ca559f5c 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -1223,9 +1223,9 @@ checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "schemars" -version = "0.8.6" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a48d098c2a7fdf5740b19deb1181b4fb8a9e68e03ae517c14cde04b5725409" +checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" dependencies = [ "dyn-clone", "schemars_derive", @@ -1235,9 +1235,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.6" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9ea2a613fe4cd7118b2bb101a25d8ae6192e1975179b67b2f17afd11e70ac8" +checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" dependencies = [ "proc-macro2", "quote", @@ -1311,9 +1311,9 @@ dependencies = [ [[package]] name = "serde_derive_internals" -version = "0.25.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 373b1570ea..dc4e38526b 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -1271,9 +1271,9 @@ checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "schemars" -version = "0.8.6" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a48d098c2a7fdf5740b19deb1181b4fb8a9e68e03ae517c14cde04b5725409" +checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" dependencies = [ "dyn-clone", "schemars_derive", @@ -1283,9 +1283,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.6" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9ea2a613fe4cd7118b2bb101a25d8ae6192e1975179b67b2f17afd11e70ac8" +checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" dependencies = [ "proc-macro2", "quote", @@ -1359,9 +1359,9 @@ dependencies = [ [[package]] name = "serde_derive_internals" -version = "0.25.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index ae70be30ec..db0f949870 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -1273,9 +1273,9 @@ checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "schemars" -version = "0.8.6" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a48d098c2a7fdf5740b19deb1181b4fb8a9e68e03ae517c14cde04b5725409" +checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" dependencies = [ "dyn-clone", "schemars_derive", @@ -1285,9 +1285,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.6" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9ea2a613fe4cd7118b2bb101a25d8ae6192e1975179b67b2f17afd11e70ac8" +checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" dependencies = [ "proc-macro2", "quote", @@ -1361,9 +1361,9 @@ dependencies = [ [[package]] name = "serde_derive_internals" -version = "0.25.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 6d88927bcc..6c8bc31a67 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -1233,9 +1233,9 @@ checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "schemars" -version = "0.8.6" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a48d098c2a7fdf5740b19deb1181b4fb8a9e68e03ae517c14cde04b5725409" +checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" dependencies = [ "dyn-clone", "schemars_derive", @@ -1245,9 +1245,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.6" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9ea2a613fe4cd7118b2bb101a25d8ae6192e1975179b67b2f17afd11e70ac8" +checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" dependencies = [ "proc-macro2", "quote", @@ -1321,9 +1321,9 @@ dependencies = [ [[package]] name = "serde_derive_internals" -version = "0.25.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 1115f5ad91..11cf5a009c 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -1234,9 +1234,9 @@ checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "schemars" -version = "0.8.6" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a48d098c2a7fdf5740b19deb1181b4fb8a9e68e03ae517c14cde04b5725409" +checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" dependencies = [ "dyn-clone", "schemars_derive", @@ -1246,9 +1246,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.6" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9ea2a613fe4cd7118b2bb101a25d8ae6192e1975179b67b2f17afd11e70ac8" +checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" dependencies = [ "proc-macro2", "quote", @@ -1322,9 +1322,9 @@ dependencies = [ [[package]] name = "serde_derive_internals" -version = "0.25.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 96690b1028..db1014cba7 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -1232,9 +1232,9 @@ checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "schemars" -version = "0.8.6" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a48d098c2a7fdf5740b19deb1181b4fb8a9e68e03ae517c14cde04b5725409" +checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" dependencies = [ "dyn-clone", "schemars_derive", @@ -1244,9 +1244,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.6" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9ea2a613fe4cd7118b2bb101a25d8ae6192e1975179b67b2f17afd11e70ac8" +checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" dependencies = [ "proc-macro2", "quote", @@ -1320,9 +1320,9 @@ dependencies = [ [[package]] name = "serde_derive_internals" -version = "0.25.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 9f4ff5b1b7..bde4bf016a 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -1232,9 +1232,9 @@ checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "schemars" -version = "0.8.6" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a48d098c2a7fdf5740b19deb1181b4fb8a9e68e03ae517c14cde04b5725409" +checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" dependencies = [ "dyn-clone", "schemars_derive", @@ -1244,9 +1244,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.6" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9ea2a613fe4cd7118b2bb101a25d8ae6192e1975179b67b2f17afd11e70ac8" +checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" dependencies = [ "proc-macro2", "quote", @@ -1320,9 +1320,9 @@ dependencies = [ [[package]] name = "serde_derive_internals" -version = "0.25.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 36b1b458a5..db3ffc084c 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -1223,9 +1223,9 @@ checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "schemars" -version = "0.8.6" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a48d098c2a7fdf5740b19deb1181b4fb8a9e68e03ae517c14cde04b5725409" +checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" dependencies = [ "dyn-clone", "schemars_derive", @@ -1235,9 +1235,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.6" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9ea2a613fe4cd7118b2bb101a25d8ae6192e1975179b67b2f17afd11e70ac8" +checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" dependencies = [ "proc-macro2", "quote", @@ -1311,9 +1311,9 @@ dependencies = [ [[package]] name = "serde_derive_internals" -version = "0.25.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 76cb94c658..dfda6dbb1d 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -1233,9 +1233,9 @@ checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "schemars" -version = "0.8.6" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a48d098c2a7fdf5740b19deb1181b4fb8a9e68e03ae517c14cde04b5725409" +checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" dependencies = [ "dyn-clone", "schemars_derive", @@ -1245,9 +1245,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.6" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9ea2a613fe4cd7118b2bb101a25d8ae6192e1975179b67b2f17afd11e70ac8" +checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" dependencies = [ "proc-macro2", "quote", @@ -1321,9 +1321,9 @@ dependencies = [ [[package]] name = "serde_derive_internals" -version = "0.25.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index f08f9f6c11..df8d3d66ce 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -1226,9 +1226,9 @@ checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "schemars" -version = "0.8.6" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a48d098c2a7fdf5740b19deb1181b4fb8a9e68e03ae517c14cde04b5725409" +checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" dependencies = [ "dyn-clone", "schemars_derive", @@ -1238,9 +1238,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.6" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9ea2a613fe4cd7118b2bb101a25d8ae6192e1975179b67b2f17afd11e70ac8" +checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" dependencies = [ "proc-macro2", "quote", @@ -1314,9 +1314,9 @@ dependencies = [ [[package]] name = "serde_derive_internals" -version = "0.25.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 69daf93200..4b3cd2be27 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -1212,9 +1212,9 @@ checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "schemars" -version = "0.8.6" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a48d098c2a7fdf5740b19deb1181b4fb8a9e68e03ae517c14cde04b5725409" +checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" dependencies = [ "dyn-clone", "schemars_derive", @@ -1224,9 +1224,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.6" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9ea2a613fe4cd7118b2bb101a25d8ae6192e1975179b67b2f17afd11e70ac8" +checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" dependencies = [ "proc-macro2", "quote", @@ -1300,9 +1300,9 @@ dependencies = [ [[package]] name = "serde_derive_internals" -version = "0.25.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", From 3895f20c1142da31a6414d9c57f03dae4f7ec341 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 2 Mar 2023 11:11:06 +0100 Subject: [PATCH 0158/2372] Re-generate schemas --- contracts/reflect/schema/raw/execute.json | 35 +++++++++++++++++++---- contracts/reflect/schema/reflect.json | 35 +++++++++++++++++++---- 2 files changed, 58 insertions(+), 12 deletions(-) diff --git a/contracts/reflect/schema/raw/execute.json b/contracts/reflect/schema/raw/execute.json index 732cf6db15..5460db7a9b 100644 --- a/contracts/reflect/schema/raw/execute.json +++ b/contracts/reflect/schema/raw/execute.json @@ -532,12 +532,35 @@ }, "ReplyOn": { "description": "Use this to define when the contract gets a response callback. If you only need it for errors or success you can select just those in order to save gas.", - "type": "string", - "enum": [ - "always", - "error", - "success", - "never" + "oneOf": [ + { + "description": "Always perform a callback after SubMsg is processed", + "type": "string", + "enum": [ + "always" + ] + }, + { + "description": "Only callback if SubMsg returned an error, no callback on success case", + "type": "string", + "enum": [ + "error" + ] + }, + { + "description": "Only callback if SubMsg was successful, no callback on error case", + "type": "string", + "enum": [ + "success" + ] + }, + { + "description": "Never make a callback - this is like the original CosmosMsg semantics", + "type": "string", + "enum": [ + "never" + ] + } ] }, "StakingMsg": { diff --git a/contracts/reflect/schema/reflect.json b/contracts/reflect/schema/reflect.json index f73dcfe4bf..aa6f6da44c 100644 --- a/contracts/reflect/schema/reflect.json +++ b/contracts/reflect/schema/reflect.json @@ -542,12 +542,35 @@ }, "ReplyOn": { "description": "Use this to define when the contract gets a response callback. If you only need it for errors or success you can select just those in order to save gas.", - "type": "string", - "enum": [ - "always", - "error", - "success", - "never" + "oneOf": [ + { + "description": "Always perform a callback after SubMsg is processed", + "type": "string", + "enum": [ + "always" + ] + }, + { + "description": "Only callback if SubMsg returned an error, no callback on success case", + "type": "string", + "enum": [ + "error" + ] + }, + { + "description": "Only callback if SubMsg was successful, no callback on error case", + "type": "string", + "enum": [ + "success" + ] + }, + { + "description": "Never make a callback - this is like the original CosmosMsg semantics", + "type": "string", + "enum": [ + "never" + ] + } ] }, "StakingMsg": { From e5a623ca40d68d6bb755025b60f7d8ab351770b1 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 2 Mar 2023 11:40:20 +0100 Subject: [PATCH 0159/2372] Upgrade clippy job to Rust 1.67.1 --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 3c01ff12e9..d299a74156 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -72,7 +72,7 @@ workflows: matrix: parameters: # Run with MSRV and some modern stable Rust - rust-version: ["1.60.0", "1.66.0"] + rust-version: ["1.60.0", "1.67.1"] - benchmarking: requires: - package_vm From d436094b346b9b4bd3a73a07bbf2a3f9f1037cef Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 2 Mar 2023 11:59:17 +0100 Subject: [PATCH 0160/2372] Add CHANGELOG entry for CheckedMultiplyFractionError --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4077ac9e36..8c818e9af7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ and this project adheres to ## [Unreleased] +### Fixed + +- cosmwasm-std: Add missing export `CheckedMultiplyFractionError` ([#1608]). + +[#1608]: https://github.com/CosmWasm/cosmwasm/pull/1608 + ## [1.2.1] - 2023-01-30 ### Added From c19953d6bdcb4db350d5dae9f9353510562b6022 Mon Sep 17 00:00:00 2001 From: Nikhil Suri Date: Sat, 4 Mar 2023 22:38:54 +0000 Subject: [PATCH 0161/2372] Add mocking capabilities for ibc querying --- packages/std/src/testing/mock.rs | 191 ++++++++++++++++++++++++++++++- 1 file changed, 188 insertions(+), 3 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 023ef30ff8..e283024f41 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -33,6 +33,8 @@ use crate::timestamp::Timestamp; use crate::traits::{Api, Querier, QuerierResult}; use crate::types::{BlockInfo, ContractInfo, Env, MessageInfo, TransactionInfo}; use crate::Attribute; +#[cfg(feature = "stargate")] +use crate::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; use super::riffle_shuffle; @@ -435,6 +437,8 @@ pub struct MockQuerier { #[cfg(feature = "staking")] staking: StakingQuerier, wasm: WasmQuerier, + #[cfg(feature = "stargate")] + ibc: IbcQuerier, /// A handler to handle custom queries. This is set to a dummy handler that /// always errors by default. Update it via `with_custom_handler`. /// @@ -449,6 +453,8 @@ impl MockQuerier { #[cfg(feature = "staking")] staking: StakingQuerier::default(), wasm: WasmQuerier::default(), + #[cfg(feature = "stargate")] + ibc: IbcQuerier::default(), // strange argument notation suggested as a workaround here: https://github.com/rust-lang/rust/issues/41078#issuecomment-294296365 custom_handler: Box::from(|_: &_| -> MockQuerierCustomHandlerResult { SystemResult::Err(SystemError::UnsupportedRequest { @@ -477,6 +483,11 @@ impl MockQuerier { self.staking = StakingQuerier::new(denom, validators, delegations); } + #[cfg(feature = "stargate")] + pub fn update_ibc(&mut self, port_id: &str, channels: &[IbcChannel]) { + self.ibc = IbcQuerier::new(port_id, channels); + } + pub fn update_wasm(&mut self, handler: WH) where WH: Fn(&WasmQuery) -> QuerierResult, @@ -527,9 +538,7 @@ impl MockQuerier { kind: "Stargate".to_string(), }), #[cfg(feature = "stargate")] - QueryRequest::Ibc(_) => SystemResult::Err(SystemError::UnsupportedRequest { - kind: "Ibc".to_string(), - }), + QueryRequest::Ibc(msg) => self.ibc.query(msg), } } } @@ -675,6 +684,70 @@ impl BankQuerier { } } +#[cfg(feature = "stargate")] +#[derive(Clone, Default)] +pub struct IbcQuerier { + port_id: String, + channels: Vec, +} + +#[cfg(feature = "stargate")] +impl IbcQuerier { + /// Create a mock querier where: + /// - port_id is the port the "contract" is bound to + /// - channels are a list of ibc channels + pub fn new(port_id: &str, channels: &[IbcChannel]) -> Self { + IbcQuerier { + port_id: port_id.to_string(), + channels: channels.to_vec(), + } + } + + pub fn query(&self, request: &IbcQuery) -> QuerierResult { + let contract_result: ContractResult = match request { + IbcQuery::Channel { + channel_id, + port_id, + } => { + let channel = self + .channels + .iter() + .find(|c| match port_id { + Some(p) => c.endpoint.channel_id.eq(channel_id) && c.endpoint.port_id.eq(p), + None => { + c.endpoint.channel_id.eq(channel_id) + && c.endpoint.port_id == self.port_id + } + }) + .cloned(); + let res = ChannelResponse { channel }; + to_binary(&res).into() + } + IbcQuery::ListChannels { port_id } => { + let channels = self + .channels + .iter() + .filter(|c| match port_id { + Some(p) => c.endpoint.port_id.eq(p), + None => c.endpoint.port_id == self.port_id, + }) + .cloned() + .collect(); + let res = ListChannelsResponse { channels }; + to_binary(&res).into() + } + IbcQuery::PortId {} => { + let res = PortIdResponse { + port_id: self.port_id.clone(), + }; + to_binary(&res).into() + } + }; + // system result is always ok in the mock implementation + SystemResult::Ok(contract_result) + } +} + #[cfg(feature = "staking")] #[derive(Clone, Default)] pub struct StakingQuerier { @@ -1189,6 +1262,118 @@ mod tests { assert_eq!(res.amount, coin(0, "ELF")); } + #[cfg(feature = "stargate")] + #[test] + fn ibc_querier_channel_existing() { + let chan1 = mock_ibc_channel("channel-0", IbcOrder::Ordered, "ibc"); + let chan2 = mock_ibc_channel("channel-1", IbcOrder::Ordered, "ibc"); + + let ibc = IbcQuerier::new("myport", &[chan1.clone(), chan2]); + + // query existing + let query = &IbcQuery::Channel { + channel_id: "channel-0".to_string(), + port_id: Some("my_port".to_string()), + }; + let raw = ibc.query(query).unwrap().unwrap(); + let chan: ChannelResponse = from_binary(&raw).unwrap(); + assert_eq!(chan.channel, Some(chan1)); + } + + #[cfg(feature = "stargate")] + #[test] + fn ibc_querier_channel_existing_no_port() { + let chan1 = IbcChannel { + endpoint: IbcEndpoint { + port_id: "myport".to_string(), + channel_id: "channel-0".to_string(), + }, + counterparty_endpoint: IbcEndpoint { + port_id: "their_port".to_string(), + channel_id: "channel-7".to_string(), + }, + order: IbcOrder::Ordered, + version: "ibc".to_string(), + connection_id: "connection-2".to_string(), + }; + let chan2 = mock_ibc_channel("channel-1", IbcOrder::Ordered, "ibc"); + + let ibc = IbcQuerier::new("myport", &[chan1.clone(), chan2]); + + // query existing + let query = &IbcQuery::Channel { + channel_id: "channel-0".to_string(), + port_id: Some("myport".to_string()), + }; + let raw = ibc.query(query).unwrap().unwrap(); + let chan: ChannelResponse = from_binary(&raw).unwrap(); + assert_eq!(chan.channel, Some(chan1)); + } + + #[cfg(feature = "stargate")] + #[test] + fn ibc_querier_channel_none() { + let chan1 = mock_ibc_channel("channel-0", IbcOrder::Ordered, "ibc"); + let chan2 = mock_ibc_channel("channel-1", IbcOrder::Ordered, "ibc"); + + let ibc = IbcQuerier::new("myport", &[chan1, chan2]); + + // query non-existing + let query = &IbcQuery::Channel { + channel_id: "channel-0".to_string(), + port_id: None, + }; + let raw = ibc.query(query).unwrap().unwrap(); + let chan: ChannelResponse = from_binary(&raw).unwrap(); + assert_eq!(chan.channel, None); + } + + #[cfg(feature = "stargate")] + #[test] + fn ibc_querier_channels_matching() { + let chan1 = mock_ibc_channel("channel-0", IbcOrder::Ordered, "ibc"); + let chan2 = mock_ibc_channel("channel-1", IbcOrder::Ordered, "ibc"); + + let ibc = IbcQuerier::new("myport", &[chan1.clone(), chan2.clone()]); + + // query channels matching "my_port" (should match both above) + let query = &&IbcQuery::ListChannels { + port_id: Some("my_port".to_string()), + }; + let raw = ibc.query(query).unwrap().unwrap(); + let res: ListChannelsResponse = from_binary(&raw).unwrap(); + assert_eq!(res.channels, vec![chan1, chan2]); + } + + #[cfg(feature = "stargate")] + #[test] + fn ibc_querier_channels_no_matching() { + let chan1 = mock_ibc_channel("channel-0", IbcOrder::Ordered, "ibc"); + let chan2 = mock_ibc_channel("channel-1", IbcOrder::Ordered, "ibc"); + + let ibc = IbcQuerier::new("myport", &[chan1, chan2]); + + // query channels matching "myport" (should be none) + let query = &&IbcQuery::ListChannels { port_id: None }; + let raw = ibc.query(query).unwrap().unwrap(); + let res: ListChannelsResponse = from_binary(&raw).unwrap(); + assert_eq!(res.channels, vec![]); + } + + #[cfg(feature = "stargate")] + #[test] + fn ibc_querier_port() { + let chan1 = mock_ibc_channel("channel-0", IbcOrder::Ordered, "ibc"); + + let ibc = IbcQuerier::new("myport", &[chan1]); + + // query channels matching "myport" (should be none) + let query = &&IbcQuery::PortId {}; + let raw = ibc.query(query).unwrap().unwrap(); + let res: PortIdResponse = from_binary(&raw).unwrap(); + assert_eq!(res.port_id, "myport"); + } + #[cfg(feature = "staking")] #[test] fn staking_querier_all_validators() { From 30ea965a65d500a691cf6f645d737aefde4005ee Mon Sep 17 00:00:00 2001 From: TomL94 Date: Sun, 5 Mar 2023 12:04:34 +0200 Subject: [PATCH 0162/2372] Update contracts' cargo.lock --- contracts/burner/Cargo.lock | 8 ++++---- contracts/crypto-verify/Cargo.lock | 8 ++++---- contracts/cyberpunk/Cargo.lock | 8 ++++---- contracts/floaty/Cargo.lock | 8 ++++---- contracts/hackatom/Cargo.lock | 8 ++++---- contracts/ibc-reflect-send/Cargo.lock | 8 ++++---- contracts/ibc-reflect/Cargo.lock | 8 ++++---- contracts/queue/Cargo.lock | 8 ++++---- contracts/reflect/Cargo.lock | 8 ++++---- contracts/staking/Cargo.lock | 8 ++++---- contracts/virus/Cargo.lock | 8 ++++---- 11 files changed, 44 insertions(+), 44 deletions(-) diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 56ca559f5c..f613b9a2db 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -1438,18 +1438,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.26" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2" +checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.26" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745" +checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index dc4e38526b..ee27054a22 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -1496,18 +1496,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.26" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2" +checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.26" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745" +checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index db0f949870..2dfea418e2 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -1488,18 +1488,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.26" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2" +checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.26" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745" +checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 6c8bc31a67..4413bbd35e 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -1448,18 +1448,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.26" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2" +checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.26" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745" +checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 11cf5a009c..68e5f33a73 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -1449,18 +1449,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.26" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2" +checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.26" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745" +checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index db1014cba7..adf7c89ef0 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -1447,18 +1447,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.26" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2" +checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.26" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745" +checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index bde4bf016a..2b006e26ed 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -1447,18 +1447,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.26" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2" +checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.26" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745" +checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index db3ffc084c..cdaee9dacb 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -1438,18 +1438,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.26" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2" +checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.26" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745" +checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index dfda6dbb1d..f26ddb5536 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -1448,18 +1448,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.26" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2" +checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.26" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745" +checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index df8d3d66ce..a71c08b1d8 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -1475,18 +1475,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.26" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2" +checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.26" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745" +checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 4b3cd2be27..a18cd16f0e 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -1427,18 +1427,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.26" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2" +checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.26" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745" +checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", From 63364659b4fe54b9ecd68c1e93a7152f6e43561a Mon Sep 17 00:00:00 2001 From: Simon Warta <2603011+webmaster128@users.noreply.github.com> Date: Mon, 6 Mar 2023 09:51:02 +0100 Subject: [PATCH 0163/2372] Update packages/crypto/Cargo.toml --- packages/crypto/Cargo.toml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 8e2107099f..e2933e0fa6 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -27,10 +27,7 @@ thiserror = "1.0.38" [dev-dependencies] criterion = "0.3" -serde = { version = "1.0.103", default-features = false, features = [ - "derive", - "alloc", -] } +serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } serde_json = "1.0.40" sha2 = "0.10" base64 = "0.13.0" From f0890e1960469c921473e8f008b7c7aa12802996 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 6 Mar 2023 10:01:07 +0100 Subject: [PATCH 0164/2372] Add CHANGELOG entry for backtraces fix --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c818e9af7..7f34f092d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,9 +8,12 @@ and this project adheres to ### Fixed +- all: Fix `backtraces` feature for newer versions of Rust. This still requires + Rust nightly ([#1613]). - cosmwasm-std: Add missing export `CheckedMultiplyFractionError` ([#1608]). [#1608]: https://github.com/CosmWasm/cosmwasm/pull/1608 +[#1613]: https://github.com/CosmWasm/cosmwasm/pull/1613 ## [1.2.1] - 2023-01-30 From 687d6672ef65d4a9d23d53e5be26a7da1f712ab1 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 7 Mar 2023 17:29:00 +0100 Subject: [PATCH 0165/2372] Remove unnecessary double references --- packages/std/src/testing/mock.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index e283024f41..d219236578 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -1337,7 +1337,7 @@ mod tests { let ibc = IbcQuerier::new("myport", &[chan1.clone(), chan2.clone()]); // query channels matching "my_port" (should match both above) - let query = &&IbcQuery::ListChannels { + let query = &IbcQuery::ListChannels { port_id: Some("my_port".to_string()), }; let raw = ibc.query(query).unwrap().unwrap(); @@ -1354,7 +1354,7 @@ mod tests { let ibc = IbcQuerier::new("myport", &[chan1, chan2]); // query channels matching "myport" (should be none) - let query = &&IbcQuery::ListChannels { port_id: None }; + let query = &IbcQuery::ListChannels { port_id: None }; let raw = ibc.query(query).unwrap().unwrap(); let res: ListChannelsResponse = from_binary(&raw).unwrap(); assert_eq!(res.channels, vec![]); @@ -1368,7 +1368,7 @@ mod tests { let ibc = IbcQuerier::new("myport", &[chan1]); // query channels matching "myport" (should be none) - let query = &&IbcQuery::PortId {}; + let query = &IbcQuery::PortId {}; let raw = ibc.query(query).unwrap().unwrap(); let res: PortIdResponse = from_binary(&raw).unwrap(); assert_eq!(res.port_id, "myport"); From e32896d94a724cf30391c12d4bc10cbfec8b3e65 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 7 Mar 2023 17:35:25 +0100 Subject: [PATCH 0166/2372] Add CHANGELOG entry for #1620 --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f34f092d3..59e5e0fb6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,14 @@ and this project adheres to ## [Unreleased] +### Added + +- cosmwasm-std: Add an IBC querier implementation to `testing::MockQuerier` + ([#1620], [#1624]). + +[#1620]: https://github.com/CosmWasm/cosmwasm/pull/1620 +[#1624]: https://github.com/CosmWasm/cosmwasm/pull/1624 + ### Fixed - all: Fix `backtraces` feature for newer versions of Rust. This still requires From 28b2e251385075cb02b3b3c95ee6a08f7792ac9a Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 7 Mar 2023 17:49:15 +0100 Subject: [PATCH 0167/2372] Add #[must_use] annotations to Timestamp math functions --- CHANGELOG.md | 1 + packages/std/src/timestamp.rs | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 59e5e0fb6a..d4ca2834d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to - cosmwasm-std: Add an IBC querier implementation to `testing::MockQuerier` ([#1620], [#1624]). +- cosmwasm-std: Add `#[must_use]` annotations to `Timestamp` math functions. [#1620]: https://github.com/CosmWasm/cosmwasm/pull/1620 [#1624]: https://github.com/CosmWasm/cosmwasm/pull/1624 diff --git a/packages/std/src/timestamp.rs b/packages/std/src/timestamp.rs index fa96fb477c..a8e4ea8585 100644 --- a/packages/std/src/timestamp.rs +++ b/packages/std/src/timestamp.rs @@ -38,19 +38,23 @@ impl Timestamp { Timestamp(Uint64::new(seconds_since_epoch * 1_000_000_000)) } + #[must_use = "this returns the result of the operation, without modifying the original"] pub const fn plus_seconds(&self, addition: u64) -> Timestamp { self.plus_nanos(addition * 1_000_000_000) } + #[must_use = "this returns the result of the operation, without modifying the original"] pub const fn plus_nanos(&self, addition: u64) -> Timestamp { let nanos = Uint64::new(self.0.u64() + addition); Timestamp(nanos) } + #[must_use = "this returns the result of the operation, without modifying the original"] pub const fn minus_seconds(&self, subtrahend: u64) -> Timestamp { self.minus_nanos(subtrahend * 1_000_000_000) } + #[must_use = "this returns the result of the operation, without modifying the original"] pub const fn minus_nanos(&self, subtrahend: u64) -> Timestamp { let nanos = Uint64::new(self.0.u64() - subtrahend); Timestamp(nanos) From 6e336912edc0e6b2d321f3f7f5fb517cabc04714 Mon Sep 17 00:00:00 2001 From: Simon Warta <2603011+webmaster128@users.noreply.github.com> Date: Wed, 8 Mar 2023 11:18:11 +0100 Subject: [PATCH 0168/2372] Update packages/crypto/src/secp256k1.rs Co-authored-by: Mauro Lacy --- packages/crypto/src/secp256k1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/crypto/src/secp256k1.rs b/packages/crypto/src/secp256k1.rs index b2f606227c..c072e22342 100644 --- a/packages/crypto/src/secp256k1.rs +++ b/packages/crypto/src/secp256k1.rs @@ -95,7 +95,7 @@ pub fn secp256k1_verify( /// Please note that restricting signatures to low-S does not make signatures unique /// in the sense that for each (pubkey, message) there is only one signature. The /// signer can generate an arbitrary amount of valid signatures. -/// +/// /// /// [EIP-2]: https://eips.ethereum.org/EIPS/eip-2 pub fn secp256k1_recover_pubkey( From 1104982eaf4fc9ba7fb6567c8a05756ff5673eff Mon Sep 17 00:00:00 2001 From: Simon Warta <2603011+webmaster128@users.noreply.github.com> Date: Wed, 8 Mar 2023 11:18:21 +0100 Subject: [PATCH 0169/2372] Update packages/crypto/src/secp256k1.rs Co-authored-by: Mauro Lacy --- packages/crypto/src/secp256k1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/crypto/src/secp256k1.rs b/packages/crypto/src/secp256k1.rs index c072e22342..d8193894ca 100644 --- a/packages/crypto/src/secp256k1.rs +++ b/packages/crypto/src/secp256k1.rs @@ -38,7 +38,7 @@ pub const ECDSA_PUBKEY_MAX_LEN: usize = ECDSA_UNCOMPRESSED_PUBKEY_LEN; /// /// This implementation accepts both high-S and low-S signatures. Some applications /// including Ethereum transactions consider high-S signatures invalid in order to -/// avoid maleability. If that's the case for your protocol, the signature needs +/// avoid malleability. If that's the case for your protocol, the signature needs /// to be tested for low-S in addition to this verification. pub fn secp256k1_verify( message_hash: &[u8], From fca5d20cbf371dbc598f225e818ba4b277509fdf Mon Sep 17 00:00:00 2001 From: Simon Warta <2603011+webmaster128@users.noreply.github.com> Date: Wed, 8 Mar 2023 11:18:31 +0100 Subject: [PATCH 0170/2372] Update packages/crypto/src/secp256k1.rs Co-authored-by: Mauro Lacy --- packages/crypto/src/secp256k1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/crypto/src/secp256k1.rs b/packages/crypto/src/secp256k1.rs index d8193894ca..aff73ee405 100644 --- a/packages/crypto/src/secp256k1.rs +++ b/packages/crypto/src/secp256k1.rs @@ -385,7 +385,7 @@ mod tests { let try1 = secp256k1_recover_pubkey(&message_hash, &signature, 1); match (try0, try1) { (Ok(recovered0), Ok(recovered1)) => { - // Got two different pubkeys. Without the recoverey param, we don't know which one is the right one. + // Got two different pubkeys. Without the recovery param, we don't know which one is the right one. assert!(recovered0 == public_key || recovered1 == public_key) }, (Ok(recovered), Err(_)) => assert_eq!(recovered, public_key), From 46c709888dba414aad53d52e6068635cd94bc140 Mon Sep 17 00:00:00 2001 From: Simon Warta <2603011+webmaster128@users.noreply.github.com> Date: Wed, 8 Mar 2023 11:18:47 +0100 Subject: [PATCH 0171/2372] Update packages/crypto/src/secp256k1.rs Co-authored-by: Mauro Lacy --- packages/crypto/src/secp256k1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/crypto/src/secp256k1.rs b/packages/crypto/src/secp256k1.rs index aff73ee405..fda2ec51a9 100644 --- a/packages/crypto/src/secp256k1.rs +++ b/packages/crypto/src/secp256k1.rs @@ -90,7 +90,7 @@ pub fn secp256k1_verify( /// and will keep accepting high s-values; this is useful e.g. if a contract /// recovers old Bitcoin signatures.". /// -/// See also OpenZeppilin's [ECDSA.recover implementation](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.1/contracts/utils/cryptography/ECDSA.sol#L138-L149) +/// See also OpenZeppelin's [ECDSA.recover implementation](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.1/contracts/utils/cryptography/ECDSA.sol#L138-L149) /// which adds further restrictions to avoid potential siganture maleability. /// Please note that restricting signatures to low-S does not make signatures unique /// in the sense that for each (pubkey, message) there is only one signature. The From 5ecada96f07a4a0894939ca073c449389204ae1a Mon Sep 17 00:00:00 2001 From: Simon Warta <2603011+webmaster128@users.noreply.github.com> Date: Wed, 8 Mar 2023 11:19:05 +0100 Subject: [PATCH 0172/2372] Update packages/crypto/src/secp256k1.rs Co-authored-by: Mauro Lacy --- packages/crypto/src/secp256k1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/crypto/src/secp256k1.rs b/packages/crypto/src/secp256k1.rs index fda2ec51a9..0a65893af8 100644 --- a/packages/crypto/src/secp256k1.rs +++ b/packages/crypto/src/secp256k1.rs @@ -91,7 +91,7 @@ pub fn secp256k1_verify( /// recovers old Bitcoin signatures.". /// /// See also OpenZeppelin's [ECDSA.recover implementation](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.1/contracts/utils/cryptography/ECDSA.sol#L138-L149) -/// which adds further restrictions to avoid potential siganture maleability. +/// which adds further restrictions to avoid potential signature malleability. /// Please note that restricting signatures to low-S does not make signatures unique /// in the sense that for each (pubkey, message) there is only one signature. The /// signer can generate an arbitrary amount of valid signatures. From 74ddd303e6a225734c3ee06b338865240e543e25 Mon Sep 17 00:00:00 2001 From: Simon Warta <2603011+webmaster128@users.noreply.github.com> Date: Wed, 8 Mar 2023 11:23:08 +0100 Subject: [PATCH 0173/2372] Update packages/crypto/src/secp256k1.rs Co-authored-by: Mauro Lacy --- packages/crypto/src/secp256k1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/crypto/src/secp256k1.rs b/packages/crypto/src/secp256k1.rs index 0a65893af8..ae42f83a5d 100644 --- a/packages/crypto/src/secp256k1.rs +++ b/packages/crypto/src/secp256k1.rs @@ -380,7 +380,7 @@ mod tests { let message_hash = Sha256::digest(message); assert_eq!(hash.as_slice(), message_hash.as_slice()); - // Since the recovery param is mossing in the test vectors, we try both 0 and 1 + // Since the recovery param is missing in the test vectors, we try both 0 and 1 let try0 = secp256k1_recover_pubkey(&message_hash, &signature, 0); let try1 = secp256k1_recover_pubkey(&message_hash, &signature, 1); match (try0, try1) { From 479178dc1cfd566ec2e79d4814d3188a877c17b7 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 8 Mar 2023 13:36:32 +0100 Subject: [PATCH 0174/2372] Set version: 1.2.2 --- CHANGELOG.md | 5 ++++- Cargo.lock | 16 ++++++++-------- contracts/burner/Cargo.lock | 12 ++++++------ contracts/crypto-verify/Cargo.lock | 14 +++++++------- contracts/cyberpunk/Cargo.lock | 14 +++++++------- contracts/floaty/Cargo.lock | 14 +++++++------- contracts/hackatom/Cargo.lock | 14 +++++++------- contracts/ibc-reflect-send/Cargo.lock | 14 +++++++------- contracts/ibc-reflect/Cargo.lock | 14 +++++++------- contracts/queue/Cargo.lock | 12 ++++++------ contracts/reflect/Cargo.lock | 14 +++++++------- contracts/staking/Cargo.lock | 14 +++++++------- contracts/virus/Cargo.lock | 12 ++++++------ packages/check/Cargo.toml | 6 +++--- packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema-derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 6 +++--- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 21 files changed, 103 insertions(+), 100 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d4ca2834d8..481d980afb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ and this project adheres to ## [Unreleased] +## [1.2.2] - 2023-03-08 + ### Added - cosmwasm-std: Add an IBC querier implementation to `testing::MockQuerier` @@ -1651,7 +1653,8 @@ Some main points: All future Changelog entries will reference this base -[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.1...HEAD +[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.2...HEAD +[1.2.2]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.1...v1.2.2 [1.2.1]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.0...v1.2.1 [1.2.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.1.9...v1.2.0 [1.1.9]: https://github.com/CosmWasm/cosmwasm/compare/v1.1.8...v1.1.9 diff --git a/Cargo.lock b/Cargo.lock index bf22bb3b85..5747ff6670 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -246,7 +246,7 @@ dependencies = [ [[package]] name = "cosmwasm-check" -version = "1.2.1" +version = "1.2.2" dependencies = [ "anyhow", "clap", @@ -257,7 +257,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.1" +version = "1.2.2" dependencies = [ "base64", "criterion", @@ -276,7 +276,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.1" +version = "1.2.2" dependencies = [ "cosmwasm-std", "syn", @@ -284,7 +284,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "1.2.1" +version = "1.2.2" dependencies = [ "anyhow", "cosmwasm-schema-derive", @@ -299,7 +299,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.1" +version = "1.2.2" dependencies = [ "proc-macro2", "quote", @@ -308,7 +308,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.1" +version = "1.2.2" dependencies = [ "base64", "chrono", @@ -330,7 +330,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.1" +version = "1.2.2" dependencies = [ "cosmwasm-std", "serde", @@ -338,7 +338,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.1" +version = "1.2.2" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index f613b9a2db..bf45efb652 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -174,7 +174,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.1" +version = "1.2.2" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -185,14 +185,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.1" +version = "1.2.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.1" +version = "1.2.2" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -203,7 +203,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.1" +version = "1.2.2" dependencies = [ "proc-macro2", "quote", @@ -212,7 +212,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.1" +version = "1.2.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -230,7 +230,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.1" +version = "1.2.2" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index ee27054a22..ea8e54fda2 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.1" +version = "1.2.2" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.1" +version = "1.2.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.1" +version = "1.2.2" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.1" +version = "1.2.2" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.1" +version = "1.2.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.1" +version = "1.2.2" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.1" +version = "1.2.2" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 2dfea418e2..0703c242d4 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.1" +version = "1.2.2" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -203,14 +203,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.1" +version = "1.2.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.1" +version = "1.2.2" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -221,7 +221,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.1" +version = "1.2.2" dependencies = [ "proc-macro2", "quote", @@ -230,7 +230,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.1" +version = "1.2.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -248,7 +248,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.1" +version = "1.2.2" dependencies = [ "cosmwasm-std", "serde", @@ -256,7 +256,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.1" +version = "1.2.2" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 4413bbd35e..e4b2f89ba9 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.1" +version = "1.2.2" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.1" +version = "1.2.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.1" +version = "1.2.2" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.1" +version = "1.2.2" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.1" +version = "1.2.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.1" +version = "1.2.2" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.1" +version = "1.2.2" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 68e5f33a73..2c99f6dcb2 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.1" +version = "1.2.2" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.1" +version = "1.2.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.1" +version = "1.2.2" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.1" +version = "1.2.2" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.1" +version = "1.2.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.1" +version = "1.2.2" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.1" +version = "1.2.2" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index adf7c89ef0..c5476f7a93 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.1" +version = "1.2.2" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.1" +version = "1.2.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.1" +version = "1.2.2" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.1" +version = "1.2.2" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.1" +version = "1.2.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.1" +version = "1.2.2" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.1" +version = "1.2.2" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 2b006e26ed..580aa5a367 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.1" +version = "1.2.2" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.1" +version = "1.2.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.1" +version = "1.2.2" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.1" +version = "1.2.2" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.1" +version = "1.2.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.1" +version = "1.2.2" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.1" +version = "1.2.2" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index cdaee9dacb..0ef494e360 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.1" +version = "1.2.2" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.1" +version = "1.2.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.1" +version = "1.2.2" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.1" +version = "1.2.2" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.1" +version = "1.2.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.1" +version = "1.2.2" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index f26ddb5536..109202788c 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.1" +version = "1.2.2" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.1" +version = "1.2.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.1" +version = "1.2.2" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.1" +version = "1.2.2" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.1" +version = "1.2.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.1" +version = "1.2.2" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.1" +version = "1.2.2" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index a71c08b1d8..25b4f2599b 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.1" +version = "1.2.2" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.1" +version = "1.2.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.1" +version = "1.2.2" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.1" +version = "1.2.2" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.1" +version = "1.2.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.1" +version = "1.2.2" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.1" +version = "1.2.2" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index a18cd16f0e..a87e7ee0d4 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.1" +version = "1.2.2" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.1" +version = "1.2.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.1" +version = "1.2.2" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.1" +version = "1.2.2" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.1" +version = "1.2.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.1" +version = "1.2.2" dependencies = [ "bitflags", "bytecheck", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index a99865dbd8..ade4cfa491 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-check" -version = "1.2.1" +version = "1.2.2" authors = ["Mauro Lacy "] edition = "2021" description = "A CLI tool for verifying CosmWasm smart contracts" @@ -11,5 +11,5 @@ license = "Apache-2.0" anyhow = "1.0.57" clap = "2" colored = "2" -cosmwasm-vm = { path = "../vm", version = "1.2.1" } -cosmwasm-std = { path = "../std", version = "1.2.1" } +cosmwasm-vm = { path = "../vm", version = "1.2.2" } +cosmwasm-std = { path = "../std", version = "1.2.2" } diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index e2933e0fa6..0e7fdfafbe 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "1.2.1" +version = "1.2.2" authors = ["Mauro Lacy "] edition = "2021" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index 38a24c375d..236b8bfacf 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "1.2.1" +version = "1.2.2" authors = ["Simon Warta "] edition = "2021" description = "A package for auto-generated code used for CosmWasm contract development. This is shipped as part of cosmwasm-std. Do not use directly." diff --git a/packages/schema-derive/Cargo.toml b/packages/schema-derive/Cargo.toml index 61314c5324..220c2b88d0 100644 --- a/packages/schema-derive/Cargo.toml +++ b/packages/schema-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema-derive" -version = "1.2.1" +version = "1.2.2" authors = ["Tomasz Kurcz "] edition = "2021" description = "Derive macros for cosmwasm-schema" diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index faa8e5854b..981fda9b3e 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "1.2.1" +version = "1.2.2" authors = ["Simon Warta ", "Ethan Frey "] edition = "2021" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." @@ -8,7 +8,7 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/schema" license = "Apache-2.0" [dependencies] -cosmwasm-schema-derive = { version = "=1.2.1", path = "../schema-derive" } +cosmwasm-schema-derive = { version = "=1.2.2", path = "../schema-derive" } schemars = "0.8.3" serde = "1.0" serde_json = "1.0.40" @@ -16,6 +16,6 @@ thiserror = "1.0.26" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = { version = "1.2.1", path = "../std" } +cosmwasm-std = { version = "1.2.2", path = "../std" } semver = "1" tempfile = "3" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 7b286142b8..93101489d4 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "1.2.1" +version = "1.2.2" authors = ["Ethan Frey "] edition = "2021" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -42,7 +42,7 @@ cosmwasm_1_2 = ["cosmwasm_1_1"] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "1.2.1" } +cosmwasm-derive = { path = "../derive", version = "1.2.2" } derivative = "2" forward_ref = "1" hex = "0.4" @@ -54,7 +54,7 @@ thiserror = "1.0.26" uint = "0.9.3" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "1.2.1" } +cosmwasm-crypto = { path = "../crypto", version = "1.2.2" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index e3b95773ad..4b7b0b22b3 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "1.2.1" +version = "1.2.2" authors = ["Ethan Frey "] edition = "2021" description = "CosmWasm library with useful helpers for Storage patterns" @@ -16,5 +16,5 @@ iterator = ["cosmwasm-std/iterator"] [dependencies] # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.2.1", default-features = false } +cosmwasm-std = { path = "../std", version = "1.2.2", default-features = false } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 1e5c85759b..d2929ce19c 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "1.2.1" +version = "1.2.2" authors = ["Ethan Frey "] edition = "2021" description = "VM bindings to run cosmwams contracts" @@ -41,8 +41,8 @@ required-features = ["iterator"] [dependencies] clru = "0.4.0" # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.2.1", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "1.2.1" } +cosmwasm-std = { path = "../std", version = "1.2.2", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "1.2.2" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.3" From 3a052bab38679d2a18e1f5c394efeff8601a8347 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 13 Mar 2023 17:43:08 +0100 Subject: [PATCH 0175/2372] Use saturating increments for Stats fields --- CHANGELOG.md | 3 +++ packages/vm/src/cache.rs | 20 ++++++++++++++------ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 481d980afb..a9407f0864 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ and this project adheres to ## [Unreleased] +- cosmwasm-vm: Use saturating increments for `Stats` fields to ensure we don't + run into overflow issues. + ## [1.2.2] - 2023-03-08 ### Added diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 263979f0ca..3984e5e114 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -25,6 +25,13 @@ const CACHE_DIR: &str = "cache"; // Cacheable things. const MODULES_DIR: &str = "modules"; +/// Statistics about the usage of a cache instance. Those values are node +/// specific and must not be used in a consensus critical context. +/// When a node is hit by a client for simulations or other queries, hits and misses +/// increase. Also a node restart will reset the values. +/// +/// All values should be increment using saturated addition to ensure the node does not +/// crash in case the stats exceed the integer limit. #[derive(Debug, Default, Clone, Copy)] pub struct Stats { pub hits_pinned_memory_cache: u32, @@ -228,7 +235,7 @@ where // Try to get module from the memory cache if let Some(module) = cache.memory_cache.load(checksum)? { - cache.stats.hits_memory_cache += 1; + cache.stats.hits_memory_cache = cache.stats.hits_memory_cache.saturating_add(1); return cache .pinned_memory_cache .store(checksum, module.module, module.size); @@ -237,7 +244,7 @@ where // Try to get module from file system cache let store = make_runtime_store(Some(cache.instance_memory_limit)); if let Some(module) = cache.fs_cache.load(checksum, &store)? { - cache.stats.hits_fs_cache += 1; + cache.stats.hits_fs_cache = cache.stats.hits_fs_cache.saturating_add(1); let module_size = loupe::size_of_val(&module); return cache .pinned_memory_cache @@ -295,20 +302,21 @@ where let mut cache = self.inner.lock().unwrap(); // Try to get module from the pinned memory cache if let Some(module) = cache.pinned_memory_cache.load(checksum)? { - cache.stats.hits_pinned_memory_cache += 1; + cache.stats.hits_pinned_memory_cache = + cache.stats.hits_pinned_memory_cache.saturating_add(1); return Ok(module); } // Get module from memory cache if let Some(module) = cache.memory_cache.load(checksum)? { - cache.stats.hits_memory_cache += 1; + cache.stats.hits_memory_cache = cache.stats.hits_memory_cache.saturating_add(1); return Ok(module.module); } // Get module from file system cache let store = make_runtime_store(Some(cache.instance_memory_limit)); if let Some(module) = cache.fs_cache.load(checksum, &store)? { - cache.stats.hits_fs_cache += 1; + cache.stats.hits_fs_cache = cache.stats.hits_fs_cache.saturating_add(1); let module_size = loupe::size_of_val(&module); cache .memory_cache @@ -322,7 +330,7 @@ where // serialization format. If you do not replay all transactions, previous calls of `save_wasm` // stored the old module format. let wasm = self.load_wasm_with_path(&cache.wasm_path, checksum)?; - cache.stats.misses += 1; + cache.stats.misses = cache.stats.misses.saturating_add(1); let module = compile(&wasm, Some(cache.instance_memory_limit), &[])?; cache.fs_cache.store(checksum, &module)?; let module_size = loupe::size_of_val(&module); From 28471aac48a490cf2d9220be976bf2272936a499 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 14 Mar 2023 13:24:34 +0100 Subject: [PATCH 0176/2372] Discourage the use of u128/i128 as message fields --- docs/MESSAGE_TYPES.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/MESSAGE_TYPES.md b/docs/MESSAGE_TYPES.md index faaf1e65d1..05ff61a0c3 100644 --- a/docs/MESSAGE_TYPES.md +++ b/docs/MESSAGE_TYPES.md @@ -14,7 +14,7 @@ Rust types as well as `cosmwasm_std` types and how they are encoded in JSON. | bool | `true` or `false` | `true` | | | u32/i32 | number | `123` | | | u64/i64 | number | `123456` | Supported in Rust and Go. Other implementations (`jq`, `JavaScript`) do not support the full uint64/int64 range. | -| u128/i128 | string | `"340282366920938463463374607431768211455", "-2766523308300312711084346401884294402"` | | +| u128/i128 | string | `"340282366920938463463374607431768211455", "-2766523308300312711084346401884294402"` | 🚫 Strongly discouraged because the JSON type in serde-json-wasm is wrong and will change. See [Dev Note #4: u128/i128 serialization][dev-note-4]. | | usize/isize | number | `123456` | 🚫 Don't use this type because it has a different size in unit tests (64 bit) and Wasm (32 bit). Also it tends to issue float instructions such that the contracts cannot be uploaded. | | String | string | `"foo"` | | &str | string | `"foo"` | 🚫 Unsuppored since message types must be owned (DeserializeOwned) | @@ -41,5 +41,7 @@ Rust types as well as `cosmwasm_std` types and how they are encoded in JSON. [binary]: https://docs.rs/cosmwasm-std/1.1.1/cosmwasm_std/struct.Binary.html [hexbinary]: https://docs.rs/cosmwasm-std/1.1.1/cosmwasm_std/struct.HexBinary.html +[dev-note-4]: + https://medium.com/cosmwasm/dev-note-4-u128-i128-serialization-in-cosmwasm-90cb76784d44 [^1]: https://www.json.org/ From a4a6fbfc72454af32f77c7735e7e077b4d25083c Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 4 Jan 2023 23:13:42 +0100 Subject: [PATCH 0177/2372] Split payment and cleanup implementations --- contracts/burner/schema/burner.json | 1 + contracts/burner/schema/raw/migrate.json | 1 + contracts/burner/src/contract.rs | 124 ++++++++++++++++++----- contracts/burner/src/msg.rs | 13 +++ contracts/burner/tests/integration.rs | 82 +++++++++++---- 5 files changed, 177 insertions(+), 44 deletions(-) diff --git a/contracts/burner/schema/burner.json b/contracts/burner/schema/burner.json index 58e102e12e..9aa679c82d 100644 --- a/contracts/burner/schema/burner.json +++ b/contracts/burner/schema/burner.json @@ -20,6 +20,7 @@ ], "properties": { "payout": { + "description": "The address we send all remaining balance to", "type": "string" } }, diff --git a/contracts/burner/schema/raw/migrate.json b/contracts/burner/schema/raw/migrate.json index 231a265325..30b6f16527 100644 --- a/contracts/burner/schema/raw/migrate.json +++ b/contracts/burner/schema/raw/migrate.json @@ -7,6 +7,7 @@ ], "properties": { "payout": { + "description": "The address we send all remaining balance to", "type": "string" } }, diff --git a/contracts/burner/src/contract.rs b/contracts/burner/src/contract.rs index e486be5b18..e2cd85fb37 100644 --- a/contracts/burner/src/contract.rs +++ b/contracts/burner/src/contract.rs @@ -2,7 +2,7 @@ use cosmwasm_std::{ entry_point, BankMsg, DepsMut, Env, MessageInfo, Order, Response, StdError, StdResult, }; -use crate::msg::{InstantiateMsg, MigrateMsg}; +use crate::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg}; #[entry_point] pub fn instantiate( @@ -18,31 +18,58 @@ pub fn instantiate( #[entry_point] pub fn migrate(deps: DepsMut, env: Env, msg: MigrateMsg) -> StdResult { - // delete all state - let keys: Vec<_> = deps - .storage - .range(None, None, Order::Ascending) - .map(|(k, _)| k) - .collect(); - let count = keys.len(); - for k in keys { - deps.storage.remove(&k); - } - // get balance and send all to recipient let balance = deps.querier.query_all_balances(env.contract.address)?; let send = BankMsg::Send { to_address: msg.payout.clone(), amount: balance, }; + Ok(Response::new() + .add_message(send) + .add_attribute("action", "burn") + .add_attribute("payout", msg.payout)) +} + +#[entry_point] +pub fn execute(deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg) -> StdResult { + match msg { + ExecuteMsg::Cleanup { limit } => execute_cleanup(deps, env, info, limit), + } +} + +pub fn execute_cleanup( + deps: DepsMut, + _env: Env, + _info: MessageInfo, + limit: Option, +) -> StdResult { + // the number of elements we can still take (decreasing over time) + let mut limit = limit.unwrap_or(u32::MAX) as usize; - let data_msg = format!("burnt {} keys", count).into_bytes(); + let mut deleted = 0; + const PER_SCAN: usize = 20; + loop { + let take_this_scan = std::cmp::min(PER_SCAN, limit); + let keys: Vec<_> = deps + .storage + .range(None, None, Order::Ascending) + .take(take_this_scan) + .map(|(k, _)| k) + .collect(); + let deleted_this_scan = keys.len(); + for k in keys { + deps.storage.remove(&k); + } + deleted += deleted_this_scan; + limit -= deleted_this_scan; + if limit == 0 || deleted_this_scan < take_this_scan { + break; + } + } Ok(Response::new() - .add_message(send) .add_attribute("action", "burn") - .add_attribute("payout", msg.payout) - .set_data(data_msg)) + .add_attribute("deleted_entries", deleted.to_string())) } #[cfg(test)] @@ -51,7 +78,18 @@ mod tests { use cosmwasm_std::testing::{ mock_dependencies, mock_dependencies_with_balance, mock_env, mock_info, }; - use cosmwasm_std::{coins, StdError, Storage, SubMsg}; + use cosmwasm_std::{coins, Attribute, StdError, Storage, SubMsg}; + + /// Gets the value of the first attribute with the given key + fn first_attr(data: impl AsRef<[Attribute]>, search_key: &str) -> Option { + data.as_ref().iter().find_map(|a| { + if a.key == search_key { + Some(a.value.clone()) + } else { + None + } + }) + } #[test] fn instantiate_fails() { @@ -70,16 +108,9 @@ mod tests { } #[test] - fn migrate_cleans_up_data() { + fn migrate_sends_funds() { let mut deps = mock_dependencies_with_balance(&coins(123456, "gold")); - // store some sample data - deps.storage.set(b"foo", b"bar"); - deps.storage.set(b"key2", b"data2"); - deps.storage.set(b"key3", b"cool stuff"); - let cnt = deps.storage.range(None, None, Order::Ascending).count(); - assert_eq!(3, cnt); - // change the verifier via migrate let payout = String::from("someone else"); let msg = MigrateMsg { @@ -96,9 +127,48 @@ mod tests { amount: coins(123456, "gold"), }) ); + } + + #[test] + fn execute_cleans_up_data() { + let mut deps = mock_dependencies_with_balance(&coins(123456, "gold")); + + // store some sample data + deps.storage.set(b"foo", b"bar"); + deps.storage.set(b"key2", b"data2"); + deps.storage.set(b"key3", b"cool stuff"); + let cnt = deps.storage.range(None, None, Order::Ascending).count(); + assert_eq!(cnt, 3); + + // change the verifier via migrate + let payout = String::from("someone else"); + let msg = MigrateMsg { payout }; + let _res = migrate(deps.as_mut(), mock_env(), msg).unwrap(); + + let res = execute( + deps.as_mut(), + mock_env(), + mock_info("anon", &[]), + ExecuteMsg::Cleanup { limit: Some(2) }, + ) + .unwrap(); + assert_eq!(first_attr(res.attributes, "deleted_entries").unwrap(), "2"); + + // One item should be left + let cnt = deps.storage.range(None, None, Order::Ascending).count(); + assert_eq!(cnt, 1); + + let res = execute( + deps.as_mut(), + mock_env(), + mock_info("anon", &[]), + ExecuteMsg::Cleanup { limit: Some(2) }, + ) + .unwrap(); + assert_eq!(first_attr(res.attributes, "deleted_entries").unwrap(), "1"); - // check there is no data in storage + // Now all are gone let cnt = deps.storage.range(None, None, Order::Ascending).count(); - assert_eq!(0, cnt); + assert_eq!(cnt, 0); } } diff --git a/contracts/burner/src/msg.rs b/contracts/burner/src/msg.rs index f948004231..602223eccb 100644 --- a/contracts/burner/src/msg.rs +++ b/contracts/burner/src/msg.rs @@ -2,9 +2,22 @@ use cosmwasm_schema::cw_serde; #[cw_serde] pub struct MigrateMsg { + /// The address we send all remaining balance to pub payout: String, } /// A placeholder where we don't take any input #[cw_serde] pub struct InstantiateMsg {} + +#[cw_serde] +pub enum ExecuteMsg { + /// Cleans up the given number of state elements. + /// Call this multiple times to increamentally clean up state. + Cleanup { + /// The number of state elements to delete. + /// + /// Set this to None for unlimited cleanup (if your state is small or you are feeling YOLO) + limit: Option, + }, +} diff --git a/contracts/burner/tests/integration.rs b/contracts/burner/tests/integration.rs index 8f30c2cca7..fe6069d4c9 100644 --- a/contracts/burner/tests/integration.rs +++ b/contracts/burner/tests/integration.rs @@ -17,10 +17,10 @@ //! }); //! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) -use cosmwasm_std::{coins, BankMsg, ContractResult, Order, Response, SubMsg}; -use cosmwasm_vm::testing::{instantiate, migrate, mock_env, mock_info, mock_instance}; +use cosmwasm_std::{coins, Attribute, BankMsg, ContractResult, Order, Response, SubMsg}; +use cosmwasm_vm::testing::{execute, instantiate, migrate, mock_env, mock_info, mock_instance}; -use burner::msg::{InstantiateMsg, MigrateMsg}; +use burner::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg}; use cosmwasm_vm::Storage; // This line will test the output of cargo wasm @@ -28,6 +28,17 @@ static WASM: &[u8] = include_bytes!("../target/wasm32-unknown-unknown/release/bu // You can uncomment this line instead to test productionified build from rust-optimizer // static WASM: &[u8] = include_bytes!("../contract.wasm"); +/// Gets the value of the first attribute with the given key +fn first_attr(data: impl AsRef<[Attribute]>, search_key: &str) -> Option { + data.as_ref().iter().find_map(|a| { + if a.key == search_key { + Some(a.value.clone()) + } else { + None + } + }) +} + #[test] fn instantiate_fails() { let mut deps = mock_instance(WASM, &[]); @@ -44,21 +55,9 @@ fn instantiate_fails() { } #[test] -fn migrate_cleans_up_data() { +fn migrate_sends_funds() { let mut deps = mock_instance(WASM, &coins(123456, "gold")); - // store some sample data - deps.with_storage(|storage| { - storage.set(b"foo", b"bar").0.unwrap(); - storage.set(b"key2", b"data2").0.unwrap(); - storage.set(b"key3", b"cool stuff").0.unwrap(); - let iter_id = storage.scan(None, None, Order::Ascending).0.unwrap(); - let cnt = storage.all(iter_id).0.unwrap().len(); - assert_eq!(3, cnt); - Ok(()) - }) - .unwrap(); - // change the verifier via migrate let payout = String::from("someone else"); let msg = MigrateMsg { @@ -75,12 +74,61 @@ fn migrate_cleans_up_data() { amount: coins(123456, "gold"), }), ); +} + +#[test] +fn execute_cleans_up_data() { + let mut deps = mock_instance(WASM, &coins(123456, "gold")); + + // store some sample data + deps.with_storage(|storage| { + storage.set(b"foo", b"bar").0.unwrap(); + storage.set(b"key2", b"data2").0.unwrap(); + storage.set(b"key3", b"cool stuff").0.unwrap(); + let iter_id = storage.scan(None, None, Order::Ascending).0.unwrap(); + let cnt = storage.all(iter_id).0.unwrap().len(); + assert_eq!(cnt, 3); + Ok(()) + }) + .unwrap(); + + // change the verifier via migrate + let payout = String::from("someone else"); + let msg = MigrateMsg { payout }; + let _res: Response = migrate(&mut deps, mock_env(), msg).unwrap(); + + let res: Response = execute( + &mut deps, + mock_env(), + mock_info("anon", &[]), + ExecuteMsg::Cleanup { limit: Some(2) }, + ) + .unwrap(); + assert_eq!(first_attr(res.attributes, "deleted_entries").unwrap(), "2"); + + // One item should be left + deps.with_storage(|storage| { + let iter_id = storage.scan(None, None, Order::Ascending).0.unwrap(); + let cnt = storage.all(iter_id).0.unwrap().len(); + assert_eq!(cnt, 1); + Ok(()) + }) + .unwrap(); + + let res: Response = execute( + &mut deps, + mock_env(), + mock_info("anon", &[]), + ExecuteMsg::Cleanup { limit: Some(2) }, + ) + .unwrap(); + assert_eq!(first_attr(res.attributes, "deleted_entries").unwrap(), "1"); // check there is no data in storage deps.with_storage(|storage| { let iter_id = storage.scan(None, None, Order::Ascending).0.unwrap(); let cnt = storage.all(iter_id).0.unwrap().len(); - assert_eq!(0, cnt); + assert_eq!(cnt, 0); Ok(()) }) .unwrap(); From 86313551f38e8ade85a06ef3617a0159f7d7f69c Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 4 Jan 2023 23:19:58 +0100 Subject: [PATCH 0178/2372] Remove license files at contract level --- contracts/burner/LICENSE | 202 --------------------------------------- contracts/burner/NOTICE | 13 --- 2 files changed, 215 deletions(-) delete mode 100644 contracts/burner/LICENSE delete mode 100644 contracts/burner/NOTICE diff --git a/contracts/burner/LICENSE b/contracts/burner/LICENSE deleted file mode 100644 index d645695673..0000000000 --- a/contracts/burner/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/contracts/burner/NOTICE b/contracts/burner/NOTICE deleted file mode 100644 index b8f34a8f13..0000000000 --- a/contracts/burner/NOTICE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2020 Ethan Frey - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. From 4ed470acd374f3c47dae19d205329875ce0e29ad Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 4 Jan 2023 23:20:32 +0100 Subject: [PATCH 0179/2372] Add me to authors --- contracts/burner/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/burner/Cargo.toml b/contracts/burner/Cargo.toml index 93a74b7efe..7484840261 100644 --- a/contracts/burner/Cargo.toml +++ b/contracts/burner/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "burner" version = "0.0.0" -authors = ["Ethan Frey "] +authors = ["Ethan Frey ", "Simon Warta "] edition = "2021" publish = false license = "Apache-2.0" From 7c3cf31c347e173cd3cabfb89641fe729f4f2495 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 5 Jan 2023 17:59:05 +0100 Subject: [PATCH 0180/2372] Bump to cosmwasm/rust-optimizer:0.12.11 --- .circleci/config.yml | 2 +- README.md | 2 +- contracts/README.md | 20 ++++++++++---------- packages/vm/README.md | 8 ++++---- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d299a74156..166f2be8be 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1036,7 +1036,7 @@ jobs: name: Build development contracts command: | echo "Building all contracts under ./contracts" - docker run --volumes-from with_code cosmwasm/rust-optimizer:0.12.9 ./contracts/*/ + docker run --volumes-from with_code cosmwasm/rust-optimizer:0.12.11 ./contracts/*/ - run: name: Check development contracts command: | diff --git a/README.md b/README.md index b71dab0b68..f2c06ae3b8 100644 --- a/README.md +++ b/README.md @@ -412,7 +412,7 @@ but the quickstart guide is: docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="$(basename "$(pwd)")_cache",target=/code/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.9 + cosmwasm/rust-optimizer:0.12.11 ``` It will output a highly size-optimized build as `contract.wasm` in `$CODE`. With diff --git a/contracts/README.md b/contracts/README.md index 1f581ed2e0..f4b931d197 100644 --- a/contracts/README.md +++ b/contracts/README.md @@ -53,52 +53,52 @@ reason, use the following commands: docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_burner",target=/code/contracts/burner/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.9 ./contracts/burner + cosmwasm/rust-optimizer:0.12.11 ./contracts/burner docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_crypto_verify",target=/code/contracts/crypto-verify/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.9 ./contracts/crypto-verify + cosmwasm/rust-optimizer:0.12.11 ./contracts/crypto-verify docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_floaty",target=/code/contracts/floaty/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.9 ./contracts/floaty + cosmwasm/rust-optimizer:0.12.11 ./contracts/floaty docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_hackatom",target=/code/contracts/hackatom/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.9 ./contracts/hackatom + cosmwasm/rust-optimizer:0.12.11 ./contracts/hackatom docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_ibc_reflect",target=/code/contracts/ibc-reflect/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.9 ./contracts/ibc-reflect + cosmwasm/rust-optimizer:0.12.11 ./contracts/ibc-reflect docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_ibc_reflect_send",target=/code/contracts/ibc-reflect-send/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.9 ./contracts/ibc-reflect-send + cosmwasm/rust-optimizer:0.12.11 ./contracts/ibc-reflect-send docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_queue",target=/code/contracts/queue/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.9 ./contracts/queue + cosmwasm/rust-optimizer:0.12.11 ./contracts/queue docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_reflect",target=/code/contracts/reflect/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.9 ./contracts/reflect + cosmwasm/rust-optimizer:0.12.11 ./contracts/reflect docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_staking",target=/code/contracts/staking/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.9 ./contracts/staking + cosmwasm/rust-optimizer:0.12.11 ./contracts/staking docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_virus",target=/code/contracts/virus/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.9 ./contracts/virus + cosmwasm/rust-optimizer:0.12.11 ./contracts/virus ``` ## Entry points diff --git a/packages/vm/README.md b/packages/vm/README.md index 2d85697bed..26baa85caa 100644 --- a/packages/vm/README.md +++ b/packages/vm/README.md @@ -53,25 +53,25 @@ To rebuild the test contracts, go to the repo root and do docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_cyberpunk",target=/code/contracts/cyberpunk/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.10 ./contracts/cyberpunk \ + cosmwasm/rust-optimizer:0.12.11 ./contracts/cyberpunk \ && cp artifacts/cyberpunk.wasm packages/vm/testdata/cyberpunk.wasm docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_hackatom",target=/code/contracts/hackatom/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.9 ./contracts/hackatom \ + cosmwasm/rust-optimizer:0.12.11 ./contracts/hackatom \ && cp artifacts/hackatom.wasm packages/vm/testdata/hackatom_1.0.wasm docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_ibc_reflect",target=/code/contracts/ibc-reflect/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.9 ./contracts/ibc-reflect \ + cosmwasm/rust-optimizer:0.12.11 ./contracts/ibc-reflect \ && cp artifacts/ibc_reflect.wasm packages/vm/testdata/ibc_reflect_1.0.wasm docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_floaty",target=/code/contracts/floaty/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.9 ./contracts/floaty \ + cosmwasm/rust-optimizer:0.12.11 ./contracts/floaty \ && cp artifacts/floaty.wasm packages/vm/testdata/floaty_1.0.wasm ``` From a3d5c4c3c3588d9f1375c34b566ee329fdfc12b4 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 22 Mar 2023 11:00:00 +0100 Subject: [PATCH 0181/2372] Set version: 1.2.3 --- CHANGELOG.md | 5 ++++- Cargo.lock | 16 ++++++++-------- contracts/burner/Cargo.lock | 12 ++++++------ contracts/crypto-verify/Cargo.lock | 14 +++++++------- contracts/cyberpunk/Cargo.lock | 14 +++++++------- contracts/floaty/Cargo.lock | 14 +++++++------- contracts/hackatom/Cargo.lock | 14 +++++++------- contracts/ibc-reflect-send/Cargo.lock | 14 +++++++------- contracts/ibc-reflect/Cargo.lock | 14 +++++++------- contracts/queue/Cargo.lock | 12 ++++++------ contracts/reflect/Cargo.lock | 14 +++++++------- contracts/staking/Cargo.lock | 14 +++++++------- contracts/virus/Cargo.lock | 12 ++++++------ packages/check/Cargo.toml | 6 +++--- packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema-derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 6 +++--- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 21 files changed, 103 insertions(+), 100 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a9407f0864..c889600c51 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ and this project adheres to ## [Unreleased] +## [1.2.3] - 2023-03-22 + - cosmwasm-vm: Use saturating increments for `Stats` fields to ensure we don't run into overflow issues. @@ -1656,7 +1658,8 @@ Some main points: All future Changelog entries will reference this base -[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.2...HEAD +[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.3...HEAD +[1.2.3]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.2...v1.2.3 [1.2.2]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.1...v1.2.2 [1.2.1]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.0...v1.2.1 [1.2.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.1.9...v1.2.0 diff --git a/Cargo.lock b/Cargo.lock index 5747ff6670..8b50daa42a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -246,7 +246,7 @@ dependencies = [ [[package]] name = "cosmwasm-check" -version = "1.2.2" +version = "1.2.3" dependencies = [ "anyhow", "clap", @@ -257,7 +257,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.2" +version = "1.2.3" dependencies = [ "base64", "criterion", @@ -276,7 +276,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.2" +version = "1.2.3" dependencies = [ "cosmwasm-std", "syn", @@ -284,7 +284,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "1.2.2" +version = "1.2.3" dependencies = [ "anyhow", "cosmwasm-schema-derive", @@ -299,7 +299,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.2" +version = "1.2.3" dependencies = [ "proc-macro2", "quote", @@ -308,7 +308,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.2" +version = "1.2.3" dependencies = [ "base64", "chrono", @@ -330,7 +330,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.2" +version = "1.2.3" dependencies = [ "cosmwasm-std", "serde", @@ -338,7 +338,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.2" +version = "1.2.3" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index bf45efb652..1f34106c3c 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -174,7 +174,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.2" +version = "1.2.3" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -185,14 +185,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.2" +version = "1.2.3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.2" +version = "1.2.3" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -203,7 +203,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.2" +version = "1.2.3" dependencies = [ "proc-macro2", "quote", @@ -212,7 +212,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.2" +version = "1.2.3" dependencies = [ "base64", "cosmwasm-crypto", @@ -230,7 +230,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.2" +version = "1.2.3" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index ea8e54fda2..3a242b0ab1 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.2" +version = "1.2.3" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.2" +version = "1.2.3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.2" +version = "1.2.3" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.2" +version = "1.2.3" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.2" +version = "1.2.3" dependencies = [ "base64", "cosmwasm-crypto", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.2" +version = "1.2.3" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.2" +version = "1.2.3" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 0703c242d4..5d748dc697 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.2" +version = "1.2.3" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -203,14 +203,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.2" +version = "1.2.3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.2" +version = "1.2.3" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -221,7 +221,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.2" +version = "1.2.3" dependencies = [ "proc-macro2", "quote", @@ -230,7 +230,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.2" +version = "1.2.3" dependencies = [ "base64", "cosmwasm-crypto", @@ -248,7 +248,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.2" +version = "1.2.3" dependencies = [ "cosmwasm-std", "serde", @@ -256,7 +256,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.2" +version = "1.2.3" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index e4b2f89ba9..e71c9a5f03 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.2" +version = "1.2.3" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.2" +version = "1.2.3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.2" +version = "1.2.3" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.2" +version = "1.2.3" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.2" +version = "1.2.3" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.2" +version = "1.2.3" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.2" +version = "1.2.3" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 2c99f6dcb2..ab8b12b3b4 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.2" +version = "1.2.3" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.2" +version = "1.2.3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.2" +version = "1.2.3" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.2" +version = "1.2.3" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.2" +version = "1.2.3" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.2" +version = "1.2.3" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.2" +version = "1.2.3" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index c5476f7a93..3f968aa2de 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.2" +version = "1.2.3" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.2" +version = "1.2.3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.2" +version = "1.2.3" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.2" +version = "1.2.3" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.2" +version = "1.2.3" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.2" +version = "1.2.3" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.2" +version = "1.2.3" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 580aa5a367..051e88b9d8 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.2" +version = "1.2.3" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.2" +version = "1.2.3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.2" +version = "1.2.3" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.2" +version = "1.2.3" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.2" +version = "1.2.3" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.2" +version = "1.2.3" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.2" +version = "1.2.3" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 0ef494e360..2f440904e5 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.2" +version = "1.2.3" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.2" +version = "1.2.3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.2" +version = "1.2.3" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.2" +version = "1.2.3" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.2" +version = "1.2.3" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.2" +version = "1.2.3" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 109202788c..5531ebb18c 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.2" +version = "1.2.3" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.2" +version = "1.2.3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.2" +version = "1.2.3" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.2" +version = "1.2.3" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.2" +version = "1.2.3" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.2" +version = "1.2.3" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.2" +version = "1.2.3" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 25b4f2599b..a5f85c41a6 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.2" +version = "1.2.3" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.2" +version = "1.2.3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.2" +version = "1.2.3" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.2" +version = "1.2.3" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.2" +version = "1.2.3" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.2" +version = "1.2.3" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.2" +version = "1.2.3" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index a87e7ee0d4..e35f813893 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.2" +version = "1.2.3" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.2" +version = "1.2.3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.2" +version = "1.2.3" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.2" +version = "1.2.3" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.2" +version = "1.2.3" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.2" +version = "1.2.3" dependencies = [ "bitflags", "bytecheck", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index ade4cfa491..2ddbc968cc 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-check" -version = "1.2.2" +version = "1.2.3" authors = ["Mauro Lacy "] edition = "2021" description = "A CLI tool for verifying CosmWasm smart contracts" @@ -11,5 +11,5 @@ license = "Apache-2.0" anyhow = "1.0.57" clap = "2" colored = "2" -cosmwasm-vm = { path = "../vm", version = "1.2.2" } -cosmwasm-std = { path = "../std", version = "1.2.2" } +cosmwasm-vm = { path = "../vm", version = "1.2.3" } +cosmwasm-std = { path = "../std", version = "1.2.3" } diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 0e7fdfafbe..aa828ad79e 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "1.2.2" +version = "1.2.3" authors = ["Mauro Lacy "] edition = "2021" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index 236b8bfacf..5a6d5da5a1 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "1.2.2" +version = "1.2.3" authors = ["Simon Warta "] edition = "2021" description = "A package for auto-generated code used for CosmWasm contract development. This is shipped as part of cosmwasm-std. Do not use directly." diff --git a/packages/schema-derive/Cargo.toml b/packages/schema-derive/Cargo.toml index 220c2b88d0..7761b98e71 100644 --- a/packages/schema-derive/Cargo.toml +++ b/packages/schema-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema-derive" -version = "1.2.2" +version = "1.2.3" authors = ["Tomasz Kurcz "] edition = "2021" description = "Derive macros for cosmwasm-schema" diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index 981fda9b3e..5e4b4f3711 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "1.2.2" +version = "1.2.3" authors = ["Simon Warta ", "Ethan Frey "] edition = "2021" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." @@ -8,7 +8,7 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/schema" license = "Apache-2.0" [dependencies] -cosmwasm-schema-derive = { version = "=1.2.2", path = "../schema-derive" } +cosmwasm-schema-derive = { version = "=1.2.3", path = "../schema-derive" } schemars = "0.8.3" serde = "1.0" serde_json = "1.0.40" @@ -16,6 +16,6 @@ thiserror = "1.0.26" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = { version = "1.2.2", path = "../std" } +cosmwasm-std = { version = "1.2.3", path = "../std" } semver = "1" tempfile = "3" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 93101489d4..06d7686e41 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "1.2.2" +version = "1.2.3" authors = ["Ethan Frey "] edition = "2021" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -42,7 +42,7 @@ cosmwasm_1_2 = ["cosmwasm_1_1"] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "1.2.2" } +cosmwasm-derive = { path = "../derive", version = "1.2.3" } derivative = "2" forward_ref = "1" hex = "0.4" @@ -54,7 +54,7 @@ thiserror = "1.0.26" uint = "0.9.3" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "1.2.2" } +cosmwasm-crypto = { path = "../crypto", version = "1.2.3" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 4b7b0b22b3..2d08dbb3e3 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "1.2.2" +version = "1.2.3" authors = ["Ethan Frey "] edition = "2021" description = "CosmWasm library with useful helpers for Storage patterns" @@ -16,5 +16,5 @@ iterator = ["cosmwasm-std/iterator"] [dependencies] # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.2.2", default-features = false } +cosmwasm-std = { path = "../std", version = "1.2.3", default-features = false } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index d2929ce19c..b4b8981bbd 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "1.2.2" +version = "1.2.3" authors = ["Ethan Frey "] edition = "2021" description = "VM bindings to run cosmwams contracts" @@ -41,8 +41,8 @@ required-features = ["iterator"] [dependencies] clru = "0.4.0" # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.2.2", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "1.2.2" } +cosmwasm-std = { path = "../std", version = "1.2.3", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "1.2.3" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.3" From f5bab840ea03d6b9c2efb042f5dbef6c92ddef58 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 27 Mar 2023 10:07:26 +0200 Subject: [PATCH 0182/2372] Check table section --- CHANGELOG.md | 6 +++ packages/vm/src/compatibility.rs | 81 +++++++++++++++++++++++++++++++- 2 files changed, 86 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c889600c51..e588c6ccbc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ and this project adheres to ## [Unreleased] +### Changed + +- cosmwasm-vm: Add checks for table section of Wasm blob ([#1631]). + +[#1631]: https://github.com/CosmWasm/cosmwasm/pull/1631 + ## [1.2.3] - 2023-03-22 - cosmwasm-vm: Use saturating increments for `Stats` fields to ensure we don't diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index c2c9826a9d..20680a450c 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -1,4 +1,4 @@ -use parity_wasm::elements::{External, ImportEntry, Module}; +use parity_wasm::elements::{External, ImportEntry, Module, TableType}; use std::collections::BTreeSet; use std::collections::HashSet; @@ -49,10 +49,25 @@ const SUPPORTED_INTERFACE_VERSIONS: &[&str] = &[ ]; const MEMORY_LIMIT: u32 = 512; // in pages +/// The upper limit for the `max` value of each table. CosmWasm contracts have +/// initial=max for 1 table. See +/// +/// ```plain +/// $ wasm-objdump --section=table -x packages/vm/testdata/hackatom.wasm +/// Section Details: +/// +/// Table[1]: +/// - table[0] type=funcref initial=161 max=161 +/// ``` +/// +/// As of March 2023, on Juno mainnet the largest value for production contracts +/// is 485. Most are between 100 and 300. +const TABLE_SIZE_LIMIT: u32 = 2500; // entries /// Checks if the data is valid wasm and compatibility with the CosmWasm API (imports and exports) pub fn check_wasm(wasm_code: &[u8], available_capabilities: &HashSet) -> VmResult<()> { let module = deserialize_wasm(wasm_code)?; + check_wasm_tables(&module)?; check_wasm_memories(&module)?; check_interface_version(&module)?; check_wasm_exports(&module)?; @@ -61,6 +76,38 @@ pub fn check_wasm(wasm_code: &[u8], available_capabilities: &HashSet) -> Ok(()) } +fn check_wasm_tables(module: &Module) -> VmResult<()> { + let sections: &[TableType] = module + .table_section() + .map_or(&[], |section| section.entries()); + match sections.len() { + 0 => Ok(()), + 1 => { + let limits = sections[0].limits(); + if let Some(maximum) = limits.maximum() { + if limits.initial() > maximum { + return Err(VmError::static_validation_err( + "Wasm contract's first table section has a initial limit > max limit", + )); + } + if maximum > TABLE_SIZE_LIMIT { + return Err(VmError::static_validation_err( + "Wasm contract's first table section has a too large max limit", + )); + } + Ok(()) + } else { + Err(VmError::static_validation_err( + "Wasm contract must not have unbound table section", + )) + } + } + _ => Err(VmError::static_validation_err( + "Wasm contract must not have more than 1 table section", + )), + } +} + fn check_wasm_memories(module: &Module) -> VmResult<()> { let section = match module.memory_section() { Some(section) => section, @@ -252,6 +299,38 @@ mod tests { }; } + #[test] + fn check_wasm_tables_works() { + // No tables is fine + let wasm = wat::parse_str("(module)").unwrap(); + check_wasm_tables(&deserialize_wasm(&wasm).unwrap()).unwrap(); + + // One table (bound) + let wasm = wat::parse_str("(module (table $name 123 123 funcref))").unwrap(); + check_wasm_tables(&deserialize_wasm(&wasm).unwrap()).unwrap(); + + // One table (bound, initial > max) + let wasm = wat::parse_str("(module (table $name 124 123 funcref))").unwrap(); + let err = check_wasm_tables(&deserialize_wasm(&wasm).unwrap()).unwrap_err(); + assert!(err + .to_string() + .contains("Wasm contract's first table section has a initial limit > max limit")); + + // One table (bound, max too large) + let wasm = wat::parse_str("(module (table $name 100 9999 funcref))").unwrap(); + let err = check_wasm_tables(&deserialize_wasm(&wasm).unwrap()).unwrap_err(); + assert!(err + .to_string() + .contains("Wasm contract's first table section has a too large max limit")); + + // One table (unbound) + let wasm = wat::parse_str("(module (table $name 100 funcref))").unwrap(); + let err = check_wasm_tables(&deserialize_wasm(&wasm).unwrap()).unwrap_err(); + assert!(err + .to_string() + .contains("Wasm contract must not have unbound table section")); + } + #[test] fn check_wasm_memories_ok() { let wasm = wat::parse_str("(module (memory 1))").unwrap(); From 8c63257a11c4d8115c104c678de3cfa4af49d2b8 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 27 Mar 2023 10:28:22 +0200 Subject: [PATCH 0183/2372] Add Cache::save_wasm_unchecked --- CHANGELOG.md | 8 ++++++ packages/vm/src/cache.rs | 55 ++++++++++++++++++++++++++++++++-------- 2 files changed, 52 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e588c6ccbc..9b95cf4e85 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,14 @@ and this project adheres to ## [Unreleased] +### Added + +- cosmwasm-vm: Add `Cache::save_wasm_unchecked` to save Wasm blobs that have + been checked before. This is useful for state-sync where we know the Wasm code + was checked when it was first uploaded. ([#1635]) + +[#1635]: https://github.com/CosmWasm/cosmwasm/pull/1635 + ### Changed - cosmwasm-vm: Add checks for table section of Wasm blob ([#1631]). diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 3984e5e114..46a64e5e80 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -159,8 +159,27 @@ where } } + /// Takes a Wasm bytecode and stores it to the cache. + /// + /// This performs static checks, compiles the bytescode to a module and + /// stores the Wasm file on disk. + /// + /// This does the same as [`save_wasm_unchecked`] plus the static checks. + /// When a Wasm blob is stored the first time, use this function. pub fn save_wasm(&self, wasm: &[u8]) -> VmResult { check_wasm(wasm, &self.available_capabilities)?; + self.save_wasm_unchecked(wasm) + } + + /// Takes a Wasm bytecode and stores it to the cache. + /// + /// This compiles the bytescode to a module and + /// stores the Wasm file on disk. + /// + /// This does the same as [`save_wasm`] but without the static checks. + /// When a Wasm blob is stored which was previously checked (e.g. as part of state sync), + /// use this function. + pub fn save_wasm_unchecked(&self, wasm: &[u8]) -> VmResult { let module = compile(wasm, None, &[])?; let mut cache = self.inner.lock().unwrap(); @@ -431,6 +450,14 @@ mod tests { static CONTRACT: &[u8] = include_bytes!("../testdata/hackatom.wasm"); static IBC_CONTRACT: &[u8] = include_bytes!("../testdata/ibc_reflect.wasm"); + // Invalid because it doesn't contain required memory and exports + static INVALID_CONTRACT_WAT: &str = r#"(module + (type $t0 (func (param i32) (result i32))) + (func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32) + get_local $p0 + i32.const 1 + i32.add)) + "#; fn default_capabilities() -> HashSet { capabilities_from_csv("iterator,staking") @@ -489,17 +516,7 @@ mod tests { #[test] fn save_wasm_rejects_invalid_contract() { - // Invalid because it doesn't contain required memory and exports - let wasm = wat::parse_str( - r#"(module - (type $t0 (func (param i32) (result i32))) - (func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32) - get_local $p0 - i32.const 1 - i32.add)) - "#, - ) - .unwrap(); + let wasm = wat::parse_str(INVALID_CONTRACT_WAT).unwrap(); let cache: Cache = unsafe { Cache::new(make_testing_options()).unwrap() }; @@ -530,6 +547,22 @@ mod tests { assert_eq!(cache.stats().misses, 0); } + #[test] + fn save_wasm_unchecked_works() { + let cache: Cache = + unsafe { Cache::new(make_testing_options()).unwrap() }; + cache.save_wasm_unchecked(CONTRACT).unwrap(); + } + + #[test] + fn save_wasm_unchecked_accepts_invalid_contract() { + let wasm = wat::parse_str(INVALID_CONTRACT_WAT).unwrap(); + + let cache: Cache = + unsafe { Cache::new(make_testing_options()).unwrap() }; + cache.save_wasm_unchecked(&wasm).unwrap(); + } + #[test] fn load_wasm_works() { let cache: Cache = From 20dd2c4d028878077face190780d405c033ab61f Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 13 Mar 2023 15:53:08 +0100 Subject: [PATCH 0184/2372] Remove unnecessary vector clone --- packages/vm/src/compatibility.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index 20680a450c..af797a3645 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -191,14 +191,14 @@ fn check_wasm_exports(module: &Module) -> VmResult<()> { /// When this is not the case, we either have an incompatibility between contract and VM /// or a error in the contract. fn check_wasm_imports(module: &Module, supported_imports: &[&str]) -> VmResult<()> { - let required_imports: Vec = module + let required_imports: &[ImportEntry] = module .import_section() - .map_or(vec![], |import_section| import_section.entries().to_vec()); + .map_or(&[], |import_section| import_section.entries()); let required_import_names: BTreeSet<_> = required_imports.iter().map(full_import_name).collect(); for required_import in required_imports { - let full_name = full_import_name(&required_import); + let full_name = full_import_name(required_import); if !supported_imports.contains(&full_name.as_str()) { return Err(VmError::static_validation_err(format!( "Wasm contract requires unsupported import: \"{}\". Required imports: {}. Available imports: {:?}.", From 9a3ec6438151485b4111771a9dc60d58fac529ed Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 13 Mar 2023 16:24:16 +0100 Subject: [PATCH 0185/2372] Only create BTreeSet of names for the error message --- packages/vm/src/compatibility.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index af797a3645..59b3680833 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -194,12 +194,12 @@ fn check_wasm_imports(module: &Module, supported_imports: &[&str]) -> VmResult<( let required_imports: &[ImportEntry] = module .import_section() .map_or(&[], |import_section| import_section.entries()); - let required_import_names: BTreeSet<_> = - required_imports.iter().map(full_import_name).collect(); for required_import in required_imports { let full_name = full_import_name(required_import); if !supported_imports.contains(&full_name.as_str()) { + let required_import_names: BTreeSet<_> = + required_imports.iter().map(full_import_name).collect(); return Err(VmError::static_validation_err(format!( "Wasm contract requires unsupported import: \"{}\". Required imports: {}. Available imports: {:?}.", full_name, required_import_names.to_string_limited(200), supported_imports From 1fc64c7b4275b08d4e36aa9b97960250db149330 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 27 Mar 2023 10:55:54 +0200 Subject: [PATCH 0186/2372] Limit number of imports during static validation --- CHANGELOG.md | 2 + packages/vm/src/compatibility.rs | 132 +++++++++++++++++++++++++++++++ 2 files changed, 134 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b95cf4e85..4e032aaaaf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,9 @@ and this project adheres to ### Changed - cosmwasm-vm: Add checks for table section of Wasm blob ([#1631]). +- cosmwasm-vm: Limit number of imports during static validation ([#1629]). +[#1629]: https://github.com/CosmWasm/cosmwasm/pull/1629 [#1631]: https://github.com/CosmWasm/cosmwasm/pull/1631 ## [1.2.3] - 2023-03-22 diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index 59b3680833..428d51554f 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -64,6 +64,12 @@ const MEMORY_LIMIT: u32 = 512; // in pages /// is 485. Most are between 100 and 300. const TABLE_SIZE_LIMIT: u32 = 2500; // entries +/// If the contract has more than this amount of imports, it will be rejected +/// during static validation before even looking into the imports. We keep this +/// number high since failing early gives less detailed error messages. Especially +/// when a user accidentally includes wasm-bindgen, they get a bunch of unsupported imports. +const MAX_IMPORTS: usize = 100; + /// Checks if the data is valid wasm and compatibility with the CosmWasm API (imports and exports) pub fn check_wasm(wasm_code: &[u8], available_capabilities: &HashSet) -> VmResult<()> { let module = deserialize_wasm(wasm_code)?; @@ -195,6 +201,14 @@ fn check_wasm_imports(module: &Module, supported_imports: &[&str]) -> VmResult<( .import_section() .map_or(&[], |import_section| import_section.entries()); + if required_imports.len() > MAX_IMPORTS { + return Err(VmError::static_validation_err(format!( + "Import count exceeds limit. Imports: {}. Limit: {}.", + required_imports.len(), + MAX_IMPORTS + ))); + } + for required_import in required_imports { let full_name = full_import_name(required_import); if !supported_imports.contains(&full_name.as_str()) { @@ -640,6 +654,124 @@ mod tests { check_wasm_imports(&deserialize_wasm(&wasm).unwrap(), SUPPORTED_IMPORTS).unwrap(); } + #[test] + fn check_wasm_imports_exceeds_limit() { + let wasm = wat::parse_str( + r#"(module + (import "env" "db_write" (func (param i32 i32) (result i32))) + (import "env" "db_remove" (func (param i32) (result i32))) + (import "env" "addr_validate" (func (param i32) (result i32))) + (import "env" "addr_canonicalize" (func (param i32 i32) (result i32))) + (import "env" "addr_humanize" (func (param i32 i32) (result i32))) + (import "env" "secp256k1_verify" (func (param i32 i32 i32) (result i32))) + (import "env" "secp256k1_recover_pubkey" (func (param i32 i32 i32) (result i64))) + (import "env" "ed25519_verify" (func (param i32 i32 i32) (result i32))) + (import "env" "ed25519_batch_verify" (func (param i32 i32 i32) (result i32))) + (import "env" "spam01" (func (param i32 i32) (result i32))) + (import "env" "spam02" (func (param i32 i32) (result i32))) + (import "env" "spam03" (func (param i32 i32) (result i32))) + (import "env" "spam04" (func (param i32 i32) (result i32))) + (import "env" "spam05" (func (param i32 i32) (result i32))) + (import "env" "spam06" (func (param i32 i32) (result i32))) + (import "env" "spam07" (func (param i32 i32) (result i32))) + (import "env" "spam08" (func (param i32 i32) (result i32))) + (import "env" "spam09" (func (param i32 i32) (result i32))) + (import "env" "spam10" (func (param i32 i32) (result i32))) + (import "env" "spam11" (func (param i32 i32) (result i32))) + (import "env" "spam12" (func (param i32 i32) (result i32))) + (import "env" "spam13" (func (param i32 i32) (result i32))) + (import "env" "spam14" (func (param i32 i32) (result i32))) + (import "env" "spam15" (func (param i32 i32) (result i32))) + (import "env" "spam16" (func (param i32 i32) (result i32))) + (import "env" "spam17" (func (param i32 i32) (result i32))) + (import "env" "spam18" (func (param i32 i32) (result i32))) + (import "env" "spam19" (func (param i32 i32) (result i32))) + (import "env" "spam20" (func (param i32 i32) (result i32))) + (import "env" "spam21" (func (param i32 i32) (result i32))) + (import "env" "spam22" (func (param i32 i32) (result i32))) + (import "env" "spam23" (func (param i32 i32) (result i32))) + (import "env" "spam24" (func (param i32 i32) (result i32))) + (import "env" "spam25" (func (param i32 i32) (result i32))) + (import "env" "spam26" (func (param i32 i32) (result i32))) + (import "env" "spam27" (func (param i32 i32) (result i32))) + (import "env" "spam28" (func (param i32 i32) (result i32))) + (import "env" "spam29" (func (param i32 i32) (result i32))) + (import "env" "spam30" (func (param i32 i32) (result i32))) + (import "env" "spam31" (func (param i32 i32) (result i32))) + (import "env" "spam32" (func (param i32 i32) (result i32))) + (import "env" "spam33" (func (param i32 i32) (result i32))) + (import "env" "spam34" (func (param i32 i32) (result i32))) + (import "env" "spam35" (func (param i32 i32) (result i32))) + (import "env" "spam36" (func (param i32 i32) (result i32))) + (import "env" "spam37" (func (param i32 i32) (result i32))) + (import "env" "spam38" (func (param i32 i32) (result i32))) + (import "env" "spam39" (func (param i32 i32) (result i32))) + (import "env" "spam40" (func (param i32 i32) (result i32))) + (import "env" "spam41" (func (param i32 i32) (result i32))) + (import "env" "spam42" (func (param i32 i32) (result i32))) + (import "env" "spam43" (func (param i32 i32) (result i32))) + (import "env" "spam44" (func (param i32 i32) (result i32))) + (import "env" "spam45" (func (param i32 i32) (result i32))) + (import "env" "spam46" (func (param i32 i32) (result i32))) + (import "env" "spam47" (func (param i32 i32) (result i32))) + (import "env" "spam48" (func (param i32 i32) (result i32))) + (import "env" "spam49" (func (param i32 i32) (result i32))) + (import "env" "spam50" (func (param i32 i32) (result i32))) + (import "env" "spam51" (func (param i32 i32) (result i32))) + (import "env" "spam52" (func (param i32 i32) (result i32))) + (import "env" "spam53" (func (param i32 i32) (result i32))) + (import "env" "spam54" (func (param i32 i32) (result i32))) + (import "env" "spam55" (func (param i32 i32) (result i32))) + (import "env" "spam56" (func (param i32 i32) (result i32))) + (import "env" "spam57" (func (param i32 i32) (result i32))) + (import "env" "spam58" (func (param i32 i32) (result i32))) + (import "env" "spam59" (func (param i32 i32) (result i32))) + (import "env" "spam60" (func (param i32 i32) (result i32))) + (import "env" "spam61" (func (param i32 i32) (result i32))) + (import "env" "spam62" (func (param i32 i32) (result i32))) + (import "env" "spam63" (func (param i32 i32) (result i32))) + (import "env" "spam64" (func (param i32 i32) (result i32))) + (import "env" "spam65" (func (param i32 i32) (result i32))) + (import "env" "spam66" (func (param i32 i32) (result i32))) + (import "env" "spam67" (func (param i32 i32) (result i32))) + (import "env" "spam68" (func (param i32 i32) (result i32))) + (import "env" "spam69" (func (param i32 i32) (result i32))) + (import "env" "spam70" (func (param i32 i32) (result i32))) + (import "env" "spam71" (func (param i32 i32) (result i32))) + (import "env" "spam72" (func (param i32 i32) (result i32))) + (import "env" "spam73" (func (param i32 i32) (result i32))) + (import "env" "spam74" (func (param i32 i32) (result i32))) + (import "env" "spam75" (func (param i32 i32) (result i32))) + (import "env" "spam76" (func (param i32 i32) (result i32))) + (import "env" "spam77" (func (param i32 i32) (result i32))) + (import "env" "spam78" (func (param i32 i32) (result i32))) + (import "env" "spam79" (func (param i32 i32) (result i32))) + (import "env" "spam80" (func (param i32 i32) (result i32))) + (import "env" "spam81" (func (param i32 i32) (result i32))) + (import "env" "spam82" (func (param i32 i32) (result i32))) + (import "env" "spam83" (func (param i32 i32) (result i32))) + (import "env" "spam84" (func (param i32 i32) (result i32))) + (import "env" "spam85" (func (param i32 i32) (result i32))) + (import "env" "spam86" (func (param i32 i32) (result i32))) + (import "env" "spam87" (func (param i32 i32) (result i32))) + (import "env" "spam88" (func (param i32 i32) (result i32))) + (import "env" "spam89" (func (param i32 i32) (result i32))) + (import "env" "spam90" (func (param i32 i32) (result i32))) + (import "env" "spam91" (func (param i32 i32) (result i32))) + (import "env" "spam92" (func (param i32 i32) (result i32))) + )"#, + ) + .unwrap(); + let err = + check_wasm_imports(&deserialize_wasm(&wasm).unwrap(), SUPPORTED_IMPORTS).unwrap_err(); + match err { + VmError::StaticValidationErr { msg, .. } => { + assert_eq!(msg, "Import count exceeds limit. Imports: 101. Limit: 100."); + } + err => panic!("Unexpected error: {:?}", err), + } + } + #[test] fn check_wasm_imports_missing() { let wasm = wat::parse_str( From ade785e3a419e9bb56fac0184e62f55956dd8821 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 13 Mar 2023 17:12:25 +0100 Subject: [PATCH 0187/2372] Upgrade parity-wasm to 0.45 --- Cargo.lock | 4 ++-- contracts/burner/Cargo.lock | 4 ++-- contracts/crypto-verify/Cargo.lock | 4 ++-- contracts/cyberpunk/Cargo.lock | 4 ++-- contracts/floaty/Cargo.lock | 4 ++-- contracts/hackatom/Cargo.lock | 4 ++-- contracts/ibc-reflect-send/Cargo.lock | 4 ++-- contracts/ibc-reflect/Cargo.lock | 4 ++-- contracts/queue/Cargo.lock | 4 ++-- contracts/reflect/Cargo.lock | 4 ++-- contracts/staking/Cargo.lock | 4 ++-- contracts/virus/Cargo.lock | 4 ++-- packages/vm/Cargo.toml | 2 +- 13 files changed, 25 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8b50daa42a..0d4c9e75a2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1173,9 +1173,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-wasm" -version = "0.42.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "pin-project-lite" diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 1f34106c3c..09f43a75d1 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -949,9 +949,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-wasm" -version = "0.42.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "pin-project-lite" diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 3a242b0ab1..c44004f0a2 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -981,9 +981,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-wasm" -version = "0.42.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "pin-project-lite" diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 5d748dc697..ee82689005 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -987,9 +987,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-wasm" -version = "0.42.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "pin-project-lite" diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index e71c9a5f03..a217daf11f 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -959,9 +959,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-wasm" -version = "0.42.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "pin-project-lite" diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index ab8b12b3b4..f388ec77c5 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -960,9 +960,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-wasm" -version = "0.42.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "pin-project-lite" diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 3f968aa2de..99eb548a5a 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -958,9 +958,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-wasm" -version = "0.42.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "pin-project-lite" diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 051e88b9d8..d5c9576422 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -958,9 +958,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-wasm" -version = "0.42.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "pin-project-lite" diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 2f440904e5..d01c16462f 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -938,9 +938,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-wasm" -version = "0.42.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "pin-project-lite" diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 5531ebb18c..9ac802138a 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -946,9 +946,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-wasm" -version = "0.42.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "pin-project-lite" diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index a5f85c41a6..45626e9d59 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -952,9 +952,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-wasm" -version = "0.42.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "pin-project-lite" diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index e35f813893..ae89e3b9f9 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -938,9 +938,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-wasm" -version = "0.42.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "pin-project-lite" diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index b4b8981bbd..e15ed48528 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -44,7 +44,7 @@ clru = "0.4.0" cosmwasm-std = { path = "../std", version = "1.2.3", default-features = false } cosmwasm-crypto = { path = "../crypto", version = "1.2.3" } hex = "0.4" -parity-wasm = "0.42" +parity-wasm = "0.45" schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } serde_json = "1.0.40" From e8eea4aa8873808ced62d11139a46c8f9bc4da1c Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 27 Mar 2023 11:30:49 +0200 Subject: [PATCH 0188/2372] Remove check_contract example --- CHANGELOG.md | 3 +++ packages/vm/Cargo.toml | 4 ---- packages/vm/examples/check_contract.rs | 9 --------- 3 files changed, 3 insertions(+), 13 deletions(-) delete mode 100644 packages/vm/examples/check_contract.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e032aaaaf..74c9ed5a34 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,10 @@ and this project adheres to - cosmwasm-vm: Add checks for table section of Wasm blob ([#1631]). - cosmwasm-vm: Limit number of imports during static validation ([#1629]). +- cosmwasm-vm: The `check_contract` example was removed. Please use the crate + [cosmwasm-check](https://crates.io/crates/cosmwasm-check) instead ([#1511]). +[#1511]: https://github.com/CosmWasm/cosmwasm/issues/1511 [#1629]: https://github.com/CosmWasm/cosmwasm/pull/1629 [#1631]: https://github.com/CosmWasm/cosmwasm/pull/1631 diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index e15ed48528..ff555d2121 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -34,10 +34,6 @@ allow_interface_version_7 = [] # See https://bheisler.github.io/criterion.rs/book/faq.html#cargo-bench-gives-unrecognized-option-errors-for-valid-command-line-options bench = false -[[example]] -name = "check_contract" -required-features = ["iterator"] - [dependencies] clru = "0.4.0" # Uses the path when built locally; uses the given version from crates.io when published diff --git a/packages/vm/examples/check_contract.rs b/packages/vm/examples/check_contract.rs deleted file mode 100644 index 8b17dec808..0000000000 --- a/packages/vm/examples/check_contract.rs +++ /dev/null @@ -1,9 +0,0 @@ -pub fn main() { - eprintln!("`check_contract` has been removed from `cosmwasm-vm` examples - please use `cosmwasm-check` instead."); - eprintln!("See https://crates.io/crates/cosmwasm-check"); - eprintln!(); - eprintln!("> cargo install cosmwasm-check"); - eprintln!("> cosmwasm-check --help"); - eprintln!(); - std::process::exit(74); -} From 2a1c698520a1aacedfe3f4803b0d7d653892217a Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 27 Mar 2023 15:58:36 +0200 Subject: [PATCH 0189/2372] Add comment on discourages non-empty msg values --- packages/std/src/addresses.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index 39a4719291..bdb171e357 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -337,7 +337,10 @@ pub fn instantiate2_address( creator: &CanonicalAddr, salt: &[u8], ) -> Result { - instantiate2_address_impl(checksum, creator, salt, b"") + // Non-empty msg values are discouraged. + // See https://medium.com/cosmwasm/dev-note-3-limitations-of-instantiate2-and-how-to-deal-with-them-a3f946874230. + let msg = b""; + instantiate2_address_impl(checksum, creator, salt, msg) } /// The instantiate2 address derivation implementation. This API is used for From 15f996d5a5d3d851ef8a63fe98d60fc562e1fb18 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 4 Apr 2023 11:24:25 +0200 Subject: [PATCH 0190/2372] Improve section on depth-first execution order --- SEMANTICS.md | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/SEMANTICS.md b/SEMANTICS.md index 7826204f52..9534693616 100644 --- a/SEMANTICS.md +++ b/SEMANTICS.md @@ -172,11 +172,25 @@ will be ignored, and any messages they return will also be processed. If they return an error, the parent call will return an error, thus rolling back state of the whole transaction. -Note that the messages are executed _depth-first_. This means if contract A -returns M1 (`WasmMsg::Execute`) and M2 (`BankMsg::Send`), and contract B (from -the `WasmMsg::Execute`) returns N1 and N2 (eg. `StakingMsg` and +Note that the messages are executed +[_depth-first_](https://en.wikipedia.org/wiki/Depth-first_search). This means if +contract A returns M1 (`WasmMsg::Execute`) and M2 (`BankMsg::Send`), and +contract B (from the `WasmMsg::Execute`) returns N1 and N2 (eg. `StakingMsg` and `DistributionMsg`), the order of execution would be **M1, N1, N2, M2**. +```mermaid +graph TD; + A[contract A] + M1[M1 / contract B] + M2[M2 / bank send] + N1[N1 / staking] + N2[N2 / distribution] + A --> M1; + A --> M2; + M1 --> N1; + M1 --> N2; +``` + This may be hard to understand at first. "Why can't I just call another contract?", you may ask. However, we do this to prevent one of most widespread and hardest to detect security holes in Ethereum contracts - reentrancy. We do From 9ccb10c628c76cb77c676947c35e771574febf11 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 4 Apr 2023 15:07:40 +0200 Subject: [PATCH 0191/2372] Bump optimizer to 0.12.13 --- .circleci/config.yml | 2 +- README.md | 2 +- contracts/README.md | 20 ++++++++++---------- packages/vm/README.md | 8 ++++---- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 166f2be8be..425c01533d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1036,7 +1036,7 @@ jobs: name: Build development contracts command: | echo "Building all contracts under ./contracts" - docker run --volumes-from with_code cosmwasm/rust-optimizer:0.12.11 ./contracts/*/ + docker run --volumes-from with_code cosmwasm/rust-optimizer:0.12.13 ./contracts/*/ - run: name: Check development contracts command: | diff --git a/README.md b/README.md index f2c06ae3b8..cb619b1dff 100644 --- a/README.md +++ b/README.md @@ -412,7 +412,7 @@ but the quickstart guide is: docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="$(basename "$(pwd)")_cache",target=/code/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.11 + cosmwasm/rust-optimizer:0.12.13 ``` It will output a highly size-optimized build as `contract.wasm` in `$CODE`. With diff --git a/contracts/README.md b/contracts/README.md index f4b931d197..845af6995d 100644 --- a/contracts/README.md +++ b/contracts/README.md @@ -53,52 +53,52 @@ reason, use the following commands: docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_burner",target=/code/contracts/burner/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.11 ./contracts/burner + cosmwasm/rust-optimizer:0.12.13 ./contracts/burner docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_crypto_verify",target=/code/contracts/crypto-verify/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.11 ./contracts/crypto-verify + cosmwasm/rust-optimizer:0.12.13 ./contracts/crypto-verify docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_floaty",target=/code/contracts/floaty/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.11 ./contracts/floaty + cosmwasm/rust-optimizer:0.12.13 ./contracts/floaty docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_hackatom",target=/code/contracts/hackatom/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.11 ./contracts/hackatom + cosmwasm/rust-optimizer:0.12.13 ./contracts/hackatom docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_ibc_reflect",target=/code/contracts/ibc-reflect/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.11 ./contracts/ibc-reflect + cosmwasm/rust-optimizer:0.12.13 ./contracts/ibc-reflect docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_ibc_reflect_send",target=/code/contracts/ibc-reflect-send/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.11 ./contracts/ibc-reflect-send + cosmwasm/rust-optimizer:0.12.13 ./contracts/ibc-reflect-send docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_queue",target=/code/contracts/queue/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.11 ./contracts/queue + cosmwasm/rust-optimizer:0.12.13 ./contracts/queue docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_reflect",target=/code/contracts/reflect/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.11 ./contracts/reflect + cosmwasm/rust-optimizer:0.12.13 ./contracts/reflect docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_staking",target=/code/contracts/staking/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.11 ./contracts/staking + cosmwasm/rust-optimizer:0.12.13 ./contracts/staking docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_virus",target=/code/contracts/virus/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.11 ./contracts/virus + cosmwasm/rust-optimizer:0.12.13 ./contracts/virus ``` ## Entry points diff --git a/packages/vm/README.md b/packages/vm/README.md index 26baa85caa..793f428beb 100644 --- a/packages/vm/README.md +++ b/packages/vm/README.md @@ -53,25 +53,25 @@ To rebuild the test contracts, go to the repo root and do docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_cyberpunk",target=/code/contracts/cyberpunk/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.11 ./contracts/cyberpunk \ + cosmwasm/rust-optimizer:0.12.13 ./contracts/cyberpunk \ && cp artifacts/cyberpunk.wasm packages/vm/testdata/cyberpunk.wasm docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_hackatom",target=/code/contracts/hackatom/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.11 ./contracts/hackatom \ + cosmwasm/rust-optimizer:0.12.13 ./contracts/hackatom \ && cp artifacts/hackatom.wasm packages/vm/testdata/hackatom_1.0.wasm docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_ibc_reflect",target=/code/contracts/ibc-reflect/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.11 ./contracts/ibc-reflect \ + cosmwasm/rust-optimizer:0.12.13 ./contracts/ibc-reflect \ && cp artifacts/ibc_reflect.wasm packages/vm/testdata/ibc_reflect_1.0.wasm docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_floaty",target=/code/contracts/floaty/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.11 ./contracts/floaty \ + cosmwasm/rust-optimizer:0.12.13 ./contracts/floaty \ && cp artifacts/floaty.wasm packages/vm/testdata/floaty_1.0.wasm ``` From 2ca2ba4291b44d71c061a0cab9d11c3b739f6a25 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 4 Apr 2023 15:12:06 +0200 Subject: [PATCH 0192/2372] Rename test contracts to 1_2.wasm and add missing abort import --- packages/vm/README.md | 6 +++--- packages/vm/src/environment.rs | 1 + packages/vm/src/imports.rs | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/vm/README.md b/packages/vm/README.md index 793f428beb..7fc48e561f 100644 --- a/packages/vm/README.md +++ b/packages/vm/README.md @@ -60,19 +60,19 @@ docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_hackatom",target=/code/contracts/hackatom/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ cosmwasm/rust-optimizer:0.12.13 ./contracts/hackatom \ - && cp artifacts/hackatom.wasm packages/vm/testdata/hackatom_1.0.wasm + && cp artifacts/hackatom.wasm packages/vm/testdata/hackatom_1.2.wasm docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_ibc_reflect",target=/code/contracts/ibc-reflect/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ cosmwasm/rust-optimizer:0.12.13 ./contracts/ibc-reflect \ - && cp artifacts/ibc_reflect.wasm packages/vm/testdata/ibc_reflect_1.0.wasm + && cp artifacts/ibc_reflect.wasm packages/vm/testdata/ibc_reflect_1.2.wasm docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_floaty",target=/code/contracts/floaty/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ cosmwasm/rust-optimizer:0.12.13 ./contracts/floaty \ - && cp artifacts/floaty.wasm packages/vm/testdata/floaty_1.0.wasm + && cp artifacts/floaty.wasm packages/vm/testdata/floaty_1.2.wasm ``` ## Testing diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index d66aa88c8b..4072b3fbbd 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -413,6 +413,7 @@ mod tests { "ed25519_verify" => Function::new_native(store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), "ed25519_batch_verify" => Function::new_native(store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), "debug" => Function::new_native(store, |_a: u32| {}), + "abort" => Function::new_native(store, |_a: u32| {}), }, }; let instance = Box::from(WasmerInstance::new(&module, &import_obj).unwrap()); diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 7932887928..bae11f403c 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -561,6 +561,7 @@ mod tests { "ed25519_verify" => Function::new_native(store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), "ed25519_batch_verify" => Function::new_native(store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), "debug" => Function::new_native(store, |_a: u32| {}), + "abort" => Function::new_native(store, |_a: u32| {}), }, }; let instance = Box::from(WasmerInstance::new(&module, &import_obj).unwrap()); From 0cfeac7f1ecacab2d272359f19f7ba612ae63603 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 5 Apr 2023 10:53:09 +0200 Subject: [PATCH 0193/2372] Recompile testdata .wasm files for vm tests and adjust tests --- packages/vm/src/cache.rs | 3 +-- packages/vm/src/instance.rs | 8 ++++---- packages/vm/testdata/cyberpunk.wasm | Bin 165993 -> 170650 bytes packages/vm/testdata/floaty.wasm | 2 +- packages/vm/testdata/floaty_1.2.wasm | Bin 0 -> 163839 bytes packages/vm/testdata/hackatom.wasm | 2 +- packages/vm/testdata/hackatom_1.2.wasm | Bin 0 -> 181627 bytes packages/vm/testdata/ibc_reflect.wasm | 2 +- packages/vm/testdata/ibc_reflect_1.2.wasm | Bin 0 -> 269374 bytes 9 files changed, 8 insertions(+), 9 deletions(-) create mode 100644 packages/vm/testdata/floaty_1.2.wasm create mode 100644 packages/vm/testdata/hackatom_1.2.wasm create mode 100644 packages/vm/testdata/ibc_reflect_1.2.wasm diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 3984e5e114..36c18a6ad1 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -1102,9 +1102,8 @@ mod tests { report2, AnalysisReport { has_ibc_entry_points: true, - required_capabilities: HashSet::from_iter(vec![ + required_capabilities: HashSet::from_iter([ "iterator".to_string(), - "staking".to_string(), "stargate".to_string() ]), } diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 706f261716..dd33e90b2c 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -708,7 +708,7 @@ mod tests { let report2 = instance.create_gas_report(); assert_eq!(report2.used_externally, 73); - assert_eq!(report2.used_internally, 5775750198); + assert_eq!(report2.used_internally, 5764950198); assert_eq!(report2.limit, LIMIT); assert_eq!( report2.remaining, @@ -897,7 +897,7 @@ mod tests { .unwrap(); let init_used = orig_gas - instance.get_gas_left(); - assert_eq!(init_used, 5775750271); + assert_eq!(init_used, 5764950271); } #[test] @@ -920,7 +920,7 @@ mod tests { .unwrap(); let execute_used = gas_before_execute - instance.get_gas_left(); - assert_eq!(execute_used, 8627053606); + assert_eq!(execute_used, 8548903606); } #[test] @@ -954,6 +954,6 @@ mod tests { assert_eq!(answer.as_slice(), b"{\"verifier\":\"verifies\"}"); let query_used = gas_before_query - instance.get_gas_left(); - assert_eq!(query_used, 4438350006); + assert_eq!(query_used, 4493700006); } } diff --git a/packages/vm/testdata/cyberpunk.wasm b/packages/vm/testdata/cyberpunk.wasm index 982acad20c86b3607dd8c95d1b6a37f5b87ec6ee..96737a33880c757c4f74550ac4627474067a83a2 100644 GIT binary patch literal 170650 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 literal 165993 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

m~y*eu9rQw9V#m`X9hTHmo19zynF`C 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

nJ?=n>gxU*(UhyE|M&%J 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 literal 0 HcmV?d00001 diff --git a/packages/vm/testdata/hackatom.wasm b/packages/vm/testdata/hackatom.wasm index 76495bcd7b..c7941a1a8f 120000 --- a/packages/vm/testdata/hackatom.wasm +++ b/packages/vm/testdata/hackatom.wasm @@ -1 +1 @@ -hackatom_1.0.wasm \ No newline at end of file +hackatom_1.2.wasm \ No newline at end of file diff --git a/packages/vm/testdata/hackatom_1.2.wasm b/packages/vm/testdata/hackatom_1.2.wasm new file mode 100644 index 0000000000000000000000000000000000000000..f15360139aa648df28bbc97182f1e53ca18d4e16 GIT binary patch literal 181627 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 literal 0 HcmV?d00001 diff --git a/packages/vm/testdata/ibc_reflect.wasm b/packages/vm/testdata/ibc_reflect.wasm index c5b6708f3d..b2876f3146 120000 --- a/packages/vm/testdata/ibc_reflect.wasm +++ b/packages/vm/testdata/ibc_reflect.wasm @@ -1 +1 @@ -ibc_reflect_1.0.wasm \ No newline at end of file +ibc_reflect_1.2.wasm \ No newline at end of file diff --git a/packages/vm/testdata/ibc_reflect_1.2.wasm b/packages/vm/testdata/ibc_reflect_1.2.wasm new file mode 100644 index 0000000000000000000000000000000000000000..228bdfbffff907f9e65442b87a3c1392bc3f4dd9 GIT binary patch literal 269374 zcmeFa4ZL1eb?1Lxp0|6SdvBf#0RoA7p2zg#&6IqI9ZXW>V{`H$y!^G(Sm_My*dYjM zAwga)5pn(u!~&XDv}r|&7TdJaLMv#rR-&cjwSyg0Y-39`R&1lCE&Uf;T4=?o9sl3o zT6>@8JU2J5Fm~qi{}a9EJm>6}wbx#6d+oK?NiMnW^=XnM>0Em1rtIdM)0_1-*_7XG z_qrsTQu{xz8vNwGsSDS(UA;tl)21ZZ)Co_jLR4z`vt(1kk649U>*6MF?54!q_Q(9n zZ&I_}*c?}0P1Sz-lk6rvZ`^#-O*bXkd$UFP=Buu6Uh=xDXSXE{-M24$-Nmz;FS#sf z>Q{$fZ=Ahi+vX(I&oO)X`m3+sJS=?OrI%clWU=a1n{U|WRVOdG?6TR5ufOEVD=xc) z`qtdEJ)^?aS6y)_Z~pVa@Vc#=-<0&!($wb5zVBr(d+GO&)L9%KzV4E3mtH>ds(IPw*S+B< zeKg%`->`Z1O&4E!`6X9e1-zfnK9{9=KHZ+2%+owg8~nAKw3W8>Uz)elByFUPcAmCd zd9MHSU&?=!F6PR^Q59?(v*=oFR7 zvup_?zb3tve?Xi}w@%G(PRs4v=aTNtNqPIOPuX>+uI=5~39Z*}e*M+6Z_1MH6<1xi z?UJjuT_GBJeRFp6HCMhVxvFV1m0aDs;&qp5zOK4z^OYB0ea+^pl50+^Kf3g4-dwsZ zxpsQw>6KSsw>g<@zy6A!oK>^eouIeZTyp8w&D)^;OE+HueQ%qpJ>*sLhI*-OSG<1n z)o<9AT;I9m$}6wFRIPk89lvaI_3O9N>DkTKzTt}5&DUMb0A_zuMLtn`2v5=Z)w4W2 z@rtYX@e`L^x>=-o-4$0~b@5srk6(N-oO8*=o3FYoPrDaieEH@}uDSSimt40w&&K`= z)Rt-YmUQEX(udMjzncA3`a`ezSo-nwfpl;B+v$Vp@1*}V{UjplQ|a%f|1Dkm-_r|E zIrX9+{gMClA7A~4*^mF&Yyb0`PW``c+?oE+&!)Gf8{eP)T)OJ#)7#T`q;F4O^MUj? z(jWOxznH!={qbK&-3f*Nx1~RmzBT>n^p^Ce(jDo> zhtrL}2Ddz(ZhXyOrhk#XIsM1WxeK7k_c7L`f`}ORz*=znf{mtxS*#p_5+1~8q*(b6;%KkVT|C9GD`ds!I z==bIqCuOm9kS$NLb=kTiEz>Q7bi-s)Br{nu$jfxwpi!j!Yh18&kd_@vbY7{uo3ATh zbbY@;oxHKG$jWqewxr04e08>%OHwwr(7@`fH<5OE%iR*LYKLFFExn72Y$j{;b6t`R zw2&0EK(}h4F_EcKM@!7h5)X;7}2iNIJBp(pYWSxFfsMXz|WgVZZ7e%YL$X~a3S+q2t z&DB{)&l*K*OL_WP31~~pVhpmaQMO&YESr z*Yoa%wIGiBkU%p@vYOgynQtjSH2kgB+C!MEwKTSt9o$;^E6*e^4^U)VG?GTSFWFM$ zy|1StS&-70$u^3FxLycFHOl?TmX)Z83Qtgz;VHEN`*71ZTp`iveu$^k@gxK{%4J*l z^H}2aoIt>h71@Prkk5{OMsOSmY{Vfq4<0fI{Pj225ZKsK-p_A_6sM#4To4GxvK4u6 zqcB#k5+?sFbuKNotjLpo8>U)fccZu-;@L30IxB>Wfb6r9<=ksx8W3@L%TLWE2#Zed z1giz_)?U6%FIz=BytJtkAj}_4u1uEqzMM|vLjBnbqy9`@!J?}qCXQUlCh-U@(aub^ zN{|?#G;4&i5MPLi7T}BHpo31NgRuqa;DgNjiX>S>cL?4s<;Ok+)$duwtL3R64KEUw#H-h2C8();bqBy^GX{vfmI6(tFa=jhM*y+5JwOtwxE zTMv8BXd1w=QJt~W*&`fvrZ~zby+=c30u88qZ&Jzxa1vgYbM#!U0g7jnE#Ew3mkuGacU zaVw1EHeuX!k#4OZO0CM)S6XLi0cdDmEve+*{_HfmM;i>gr>Cu@$z8Q5xjV07l)LuY zCDypCWjRHgjWo+b4(7w}s_)9n0;ay&_vYXw1iQqmJdaE4{bmD7{olZ`Ibp z|F_XxK&-v{Q*dbr2h+=8JuWliDy{|dorYkngxvNEy`@D*g-0iiIdq>!Bq2iigo#A&5BKVF7 zzEdZ7G@b~4d_JPb>xk|+!GF3D5xs895Yg=+qM7I*S9AxWxfr6`hG=^YqWM+H6`mc8 zXjOB$(l+bRDk4{`aFi>&s#*baR>cs_3q$n0S{0(1hDxr4YA#pQq7Xf=VnnpP4v1cb z+~|GH%sHXi^l+zKDak4D>wP6P zdZ;TWqXhm`3do4T)Ec}ZGFkAYUL7YHt=kH}e!G+9H#a0VpGtrfhRxB@MK&~#v1rzr zWh0~J9F0Gx%)@3QpOs8_c`Z=NZ{31MZDMIGmZs#oMAsf`pxA^^$+BT(G68x~&z*i| zN?UkGHBef37tbv6*DMS8CDLLkggq(Dv#^ljll2C)E3$Kj+~LYNFCU5K_R$pr!I%sh zj6f(d2O^6=$V^nnS&%APgVrFT!q&1WLrgDP&@81HSygM$EI+-yGRT`O2g}d!`;5d^ zCRS-UK5NZ1t6qo$=Cu|%z+M|Y0{iN0ZIMTNYn9E(0M!j?R_0bJy!0Qe`Nose(@K7=aF~a-1{=CaOm3}|KZnu z<4?YE&u8BHPncVJEc?B+Kye64kLMSMhJcBBGvT^cS25sJ+SA2UwYuKfAkTst|>Y<(*9pClC-=%-O~GLh6JJLts5~#)ACzb zj;kaAZimdb_P(fLFLvb79KE#E%b;ELGeCbG+zk?Sem7JPuw7_9{bjAE)O#vA_mrz< z&q_AaDN}wsbeolXpN8uIO&~Gn2K$!sB@kurxAb$Tj8IH$L=lF8c=1gASu10Jt1N0g zGYgxW!mKi6m`rHlE{BczbNbNwh5uJzQ(*n}oZ-wSW;TY5sA^9obiAmty7TghgRJiN zXX%7YV^kO}BnE>hV<1AbIe=!eiRm<90&w$8;8+6Iq@0p9uc6Omi;*T=di|y@9r=Sa zO7531y{mU!)AFkViIuQMNsEmLPSCU}B^%ll(RV*_Yvfr!xh*?sF|t;&KSFSv?= z{5svcobkGoh1@Et%D}lZ>#Cm?lYN#XNzq-ME#rbQvxG}WZlRz;Vnp=cr)hKOoI?8InCkt3CKL-J?=3ec1~bzk4nzUtnW_1Mh%57tu~0TaUp?A56p0xkh3xq zaswH$xWjZZC!?^D6=N&1WKDhpZ9wS!Wsy0^dmjX^%vihk8xkZmbOQ*_R%AC0rq&lb z?g1p(1lf6$qUiE~)r51HwE@JScJa1cKA2jQUsQC3dwbd~rqkp!ii>n3wZu zMN*rh29H|6ssu8l)pb6av-=Gx-b^&PgYl_>TXm&{?Yib?B{y=JdPT;7imCN8fSSHM z`7iuHOI&|eax?v`-O_Kvy$7%y4pCrc=qD(6 zvI?AWDYlfme%0Irw9kqTEtTEO^9~*h_hDknl}(v=XC-I>Opfx8tvjBJveNR4{Dc^| zYrB>N9+4>hmk{6Sep$|C&;OjGY{4CuC03ANd9@ead{twhPK|L< zW8eOl!#CDNNJ+2C&0OS?Xl*=#c_G=^F5wa6gqW>?R*V>g2r1WayUK)2LzJ>yVzAr; zp3JF%PAs3$kB5FOIyE4-%SCQ8*_Br9C`m&V)-;^n{oa zJ&y1IZ8fLVm z8CZrfzF5SzN_GIOAo-IDT7fiCi17uvvHW@1-x6WWZbNg)8*2-JE7}}3!W+7l0H$l( z9WdqDeP_mGWjFKxgZ>rT=$M-5cGIkzH=3OUGQm2Fa_E;aes{J^ z;Lq{j0)gMGK>c^yf3w{1-!1=*8SKBC{=4D7!I-K8fz2*OdK)Gskr!_fcdN>RMRG49 zxxPRVXI)8uYe)z)*i-AQ8+z;hGW)Qgq-0gpd*eV_FPCNep1Uf`HZR}Bj~R31mpv#Dplk7wADDs~TNz3$aAgB~b#)2o02UA!ENy z==4nJ*l!w9OI7(9{ho=xQ&*X^yyQw8m1R##3J;=*lJ#$qBQskAQ6kJmAgMEI0=Pxf zo5au&CbYF=W7W+U*(45{`)GH_)ON#m$d+7*+D451#vlKi3(9O;znOty@FBB)$(4dH zD}hhDW}`bynTat8ch*W2dj7Y|o_txh^ya4RFg4<$@c=8LMc^lxCi~Hji+W#TFnw^g zGWl}aNB`-ce(gtGUMt^jX4>zc6PUl8>IZvMO{Kkk)GPPVOxpW>YvNIw;L*c8LX7WA z2V=Ca);^Q=)5w|n{jgeRou6^BD*M?(LcK4g_7i@461RKvErW)hpNwd2&JLEKDEcob zv;LykSY9zb6M>qh_~{Z;jq+avu|q$Zm196Y(JiLS?KfT9XUG%qr;UtJVLl)oaJkrc z=43Pkus;RZ0(Z`lVM@k38L(Sfo>;QaVC2xcY|>*_dUr6bH}gV?KPDpOFYabsM|WF zC10 zh|J6%FqE{?@oL=y98yGDqt-ffZq9>p*fxWfB52HSIVq*Y%e)K5GwED`pyrU9b}#LL z@r?bS^{2s9$$!~pS}gi-Wk5#eJ|naRTN0$~=b0<yaNW+chr^Q4cD53-ibnbfcKNx#qkUsMw!4Wp5k3z1e3B9nS(LZl@@(KI1~ zToQ}eI};+UiE&)6E<{i|5s1D6Q3wdFAiRgb^pYT{OOTdig*EL(X8X9I*mbfAMK#9u zP8FvMGfNyZmH4m*(qXLt3gVQyEkSyF+bXY&4}u1^Iq@?9ZlAq69276+jVeiI&zq44NyZ`GAnK#WNNF(V5`2@8;1u#W?FUv!V4 z^TMBy$Y{987%e=2q2%Vsi&Ix;`^4`!Cmzuix5~r14v;>&7Hg11u3`{SG`s-EQ{aRk zD9Zm@6H_iNEx{vOYf<%p(RuUOME1A>{DGVIi-oqa^zGm~eIQUhL2XS?GkbKJE7>SZl-< z7o6d$MQIf^@(d=hQI7HWAkq)Np3DaeQjthbN~>5RJ3qfy)AIsb7ko&!knz2seV5(O zBp=FGC%?Du1N z-;55HLQ%d?yS`vCb}fryWS80JjsB!*f+J#7#NyIys75kvj^%P$KBS4j891jai}VL| z#iOwo>D%4FY|KhUX+Bh;MhmjM4dEYSdh^!}{uY?Af3Z^mnvq8qc14^H>Zxk?ZIYej!n{+e``Be zBS!V3kzi>FX-(&giWlC~?|JWd2Qe>v0rMtr^aj)7EZd|FDwCvzS;72?M1 zGiM_ZUsD+-SM;eO9=P1vYo11f7$rRbI8Bl(TZc&!|M{3@EZKG_UUFOEj0fYS7mX8H z%Zto3VOtihjA`NT($gR=Tif7~s_5*JKC*LVvdKpz4JidTuEhuo(!!dbOin9L>{4)1 ze_YIE&3nn&KDrz8#1sI2t*YH0jrPe!w9M?(>=Rl@ht&d15*^V#VR?fa+Lkw`=sFkd z6+{L0iO;$zc>a`WzgL`6HqS$Xj+bAMYSW5_y<6rFLelGHrA6+YGVgV_7?*-QMPdgs z9jBxb0An$XX?A#KqXjXugGDyonRLk_Mn&DzMacr~X5Iq4; zor||<)q<1Emv-xYP6F?p0~7o=~hF_*bgxoQ*No+oZ>sRH~l7F zdfSJl+5Ki)sm=4PO(Xvc5WK4{u)VaiE|BDDmYwTmRa-mF``3@(H0a;MlDChfw+K)b z=ufRr`Y$wd8ShE#4X@M>A~3CqP(mXX$}!$lOX3HLdZ8>3!-#{I<$Z6ErYTW%eg zv}1`8XR_1@G(F$BOwtW18HnbdW+sSH~wcEUPwoHCt*gfWqSCN1Z!6UX(?)`?9_ zP;f}VgiR!9vUj#lGysF}+XXz4<=zvZ*cB94pe<;mayDr}inFOH{bVgW93on+Y)r1; z53id1Ij|%?UzzNz@D!X))&{CFRtx~mlg8u17S1M4`lE!gYcdCB^qr#JsVA7eaw2_KcS-hSg6oZ*r z9DUreD+d5lp0t1~Bg*6eK);y4tQEF8n3--GhF6tfHVeWAiKE6;&d^K48so6+JhW22 ztCHN-Mp2RrXy+1JZ_4~-{+EY|J7`Sx;zln!YV`8cfdqGmT99-Nl{f@$SVlv02tjvd znVg-FoIPQF715>7p;p~Pl7&BLUNXgG3_`+W3?6fnF_@n^0GFN*?Em#kmMMpPjpO0E+Pd=EaN9NxHH?d{kGK zYoE^60VnYsS}x2#07{tNYbCV7B<@A0A(Ta)kRUd}`QvL_JK&|DT5R8^BZhfUte z?MiHZJhqErUSDj0@U|md{x0=&4?U@<`rl1Y)&kG(fRysX<9FYXklyKNf;cM;#ys`ST4Ushkkr+c(qI3DpuUWwbMi+a}=x z+$jA-`+;m01Jx&4wdw_0aTOP6<8&^}(hL_SX*m~Wrr^TFC=P{rQ5*`!=lQZ+mNw#bDW1*>Me$+=)hSDScelo#Dykb!_Y)W z^osyAEl5iGj<^bQcDT8T*wWm5QihOFK12%yS6>Kv$HE_r#iab&P813Uwltx=@8JO! zMxi#gH`rtE{!yBy+Qq8^Bo(`YNYJ7ZY0l1}DljGG@+}tn&)viCQ51mMiiG?7HJc!hYX1<4I zb$@dz8}mq--64|3gHKW|Nwby7C3aqnpo>wfss2mFw7~PNAmIHVY3)Bki0fvgH);Lp>k#sR|%--?t zRY%d%qE8(iepe-AV zYG)+hqe?F+dn|q|!uNFSEQ-u1-j1_cG^!riH{mp=Z|5GrHATBvvecZm*NohWFeqxr?6q?AlX+OlvZ=u5#xL@C+y4T1;Va0{CMFifjCZ--NA z6DF5SR{F#aW3m)&*{&rHuH;}Z+@M) z>D0D`L}S8S@LCOG%d~9)(U3>qWBQtMgY64fom5q<1{qCn^L> z8{SjASk>P5_jOc(7T5Y<+P)5vQI4Yol8CheDB`|m;J!N)Sr2ME_A=jK!i|uWT1%U1`pP^ryUWC5wgb%HenrFx}2qlSchI_6!f9X zH5%^9zc|VnUK5wqv1RR6ufgprdIfmiEVK3Cz9se{)OV?OB#p zC+92*yOLOF6KM?pC$dYNS#v4IG>R@$psp8}puIB8AT(be_CY1+4zeY{*m(=#j^Wfh zO9IDrHW!O@?44EQ8{jj=PHWCE19c)JldA661CdKdYbH8bku6)3Bk_2@+#^fHm<0UE z*ACSX$qzF)Eikv7A?!$L*qe^FU@T%R!{m@3O)f`;0W!yTk`}{H&sRa|a9HXakaVyL zNnslU^ELSpOVZ~ipXJabJBN0kBYC;uVZ>=+)4Vbb5FuU9{+Nw1uX{j&)}r1Sd)+v| zRKiN!djI3dWG1Pg`whau%A^mlt1h6>_rDT@JYN@UV`w!vkTI@f8=z{5c|Q~D zo30EnI7vw4SWeZ&jRV%#7upopj4df=xmf6K%(~+~FY&l~(4|bHI01k^+DVv^jAKrk zELJkv@BkDjqpl{#!r*_qezNd*=+t0#I_=mXEJoAl)Pj|rPA8z#3`B9knzDFNe7XN_ zKsY@92t@502Lv%9cyR84&ixtH404xoGDFSwNMr>>3e-|umZrFYXC6ctr`)1_4NGRj zN@PiljaaHiFh&C6j1@$q6B$aAi#>o*;;SWfl7+k$0`yKto(0tZbI8>JO=B=Rsb=de z7K%|?Du_&@Y}rhrINzuNGhZ5Wrcq+dX)S{dXzpE(b;DJ#kIrpXXN=hP>wR8fxIUL7 zgA%+UxYk%s(f_Pc#feA|MS_AIeghWkKSEFCy5|mTbM@D@pwuC99V`hMJOEZBjmx5j zV);kUcK>3FGj4V^Sdr>RIyBe&Y8vsNE7IPMoD38)3!nFhLzg^}2hRjm&T%k3*O3mc zEC9D)!kv{cEWp#rz#au<$EkRE>)Ym7NZQ#?8mEHsm>M{mhR-@wyPV6j#zernxzHm1 z=@LtGrGnu(1`vSYi~~ffpjgn^dx=-WimSa2Vfqv@Ug+5ofsI<*j1;ny?-Vj|-do|L z5zFiR1b>IwEhJ8q-QsMg_~i?~UFL5w2N}Wnk{qwnd3}DYWkF&%vR^~wE8T{k%OSy) zMc)>de~u(pJwm>>d1!z%ZK5>SIxrnrVNAyQy?>)tmk_PyissO*sQ*KcS}$$PG~m>% zSz3{uy(U|xck4LGU`6ULQDlU}LuyWV6Gr4==};?|uU(UGgjxRjP6+EOP@Sfz_r20; zYM4JZlxTAzyg5^;rfbrvXu6=4gjY4TY*BgNn#`K6^5o)ZvPL4*+KP2;Qdssc5r?l4)66qC$ z7sSfff`CwNgH1ADnp$eXW!m?Eshc7v-d)C7vz&P2oaNV*EGo=@wxN#?GLvLD09q2Q(Asf z58HYuOooS_h$S7lhJR_Yg&7l*v?-4a)~%E;)3MeRznqO(nIa(C$TO0uV91v&mx-Up zLlUwVPj1DxokkT z60Bm`*1`EOlC7i}+~AM4Vit{fh*9)zXKjM&W27OChVD>(TueOTM?y^5YsolQeQYy^ z^gN^>8Bu+zc1-Dcyu#LUO!7@>bjG1i>rOK#2~0kowEUx6DmIp>SAK=xA+vy0dQLfe zJnL3-s0s1hnjIVSb_GpnCqH?2p_YrL2|2waLAV%N8tOx9PWrGl)Q1`o`cR{l(t*w* zRz(+;KC}T>`Y^(UF)WA>BV=S+nOr1A!d)dO@vj2(>Re?nmkm1exe8y3 z#DI8A9lAmJ`Tza7%JOxHL6omUG^i+6BQoQvufj#PV~a}Gsm8C3a@BLogcYf`vM)u0 zvM>LSQ~!<$|QwP@}MZ;%CUu2drMPH!?jd_!(71S40Pl5PIZiq)k zdeDH5Ae%Xb#Ch;hZ5m*XmODP@+Xq-_W?JwF*A>SDk?$%Vw!`~xhw2hgS*pB-&*rDZtn1dU3pkIOvJ&iJkptHf>;sDMs{rlfw7NgO2l*T z@>t$HKdyeve!TB=qOqpLwukWJ(Pwb#JV#F+stlPm>dBLv#ykOBkI#=6TMd4^O|Xpl z@h*#gJohlTAI}R%Kc2hj%#XLpR++=s@%Xyt796`DZ28zvkqk7F*Icg=FIuW1qiY~O9MTLc7`Fs0RnA&# zrsu65le1PBK7`K_Nk8hd43ge2AT6unR_+G3XDVw8h$UW;-OCIP-PCei=x494ouq(30 zn(Q2@Z9C5(Y@kar_>hiB-D^t9lJPBAQPpOY71)Y|d9Y^BS(6uPW0k`ka+A3btCb^Z z4(muxvhQNP*gb}#df#hD^bRQEQV^40l7i+TJINh(CbnBv_^jo zU98j($ljPomPgOBGtY91vzTBn5)v+1Bcx~L%-Tixqg5%t zaVywqgpH_d-68(f;{4R^F3XZ&Jsm9&Mtz5X;muloPxSsg)ex)Jb$b_kf<%8}1(v%r z-@&>=h;jIL;;?XIW#)6ZORnjW0y32JHbNjCTpobI76J zd^Z^WJ>CfGa1b@;QW7#*LIDEwQv%?vB;3t3(7UAOfTVXq1GiEi6Vt84XP3H`hMHy` zN-#bU&X$RqKi5Gl8+$nvQ)}PlOC5!?Yc2P2F5X2DJE5`l2@wu{twgFsBKAM#Eds zbEA9`a$U-9c@=_o~)ikO`~$;Y2A^c&GKTBHzc9-(iR4oGCTh zT^ZRBvizizE*}~#ZIKyeH0UksNx}tkx}1@$v@=n zPkZ|zv6I5@MziuXb?_|AibsXcNS_gz$^@LQdBEyaV>5&C5G&eO(iFWeEI1@TjV2YW zm=D7eJ)ut1!xEd}xM^E1W(!SJ(j3K~OZSHGM7^^R#Z&-|J1EHY*eSUy)TIZ!YI&pz z9Pp|_6xEAm(@}t#n)M>HeLQ{S$HDY8zgKK;TFy~*b1kc6bV$Oijj4e@xODx0FZsn#>}tRK3?d$jIF(94UET$uLeuaeo)1 z6VhCsDJnH$bzzaePaU(l7-TIV3}x+oddC><*7bISeYb9rwbEDIp&eGkU)*UvU1!x~ zEfWcOnU)#CX%mX9)zt6Hh{o5=qnX&oLcC#;ATJ~g5IYP(sWBf@mpUq@DMG95%!Ol8#S z#wt)<#VU`&X+kV>&0mn9<512Cb}S9Zj2-QY*ufKJY)UHR2qUb0WEgQF5Ts%-W|EPB zZ3$!I2}(m8Qo~>I>#@)mF=BEVFi6AN@13J~#W=I_!KN-(2oCq~mZ-j1AJ=_6F; zTEO29Wuf(EU`v}=B{|o*4|};2YhE@L1uSKQ*#^vRZF}X8RB2u}6?Hc!XnhVMt-`l(>|jx}YZ%smFum;zPTaZMTEAwb^`5m(E?LXuj4rjxXb3R4zDGDN~7@SrEuH*ADxGYhC>O=hl4ci|kW zAWTQWXrUmsL$F>yks5=j2Uws9we|ndY3Ry=qU^M(zW=2)ZHIk03;>75pkxg5>*3#% zW{rVyreB2&^S4Z8S!x3|mz-6#*v`PU)ardQe4kWK(F2)Qjvwh} zC(n;rT(=doOByi#(;(JCRtv@>%bll4Wcmhdoh_0ou7?lnY!OFr)JlPgpGn9PiDvPg z+mZLHcmz#M_`#yK3XhzSLQr4JDM9J-to#EqDWAagb6ig>JHvDBbS*n<$}PPqJ9X45 zrm^G_Qte^iw6RT^9La!3C;TWEi*t3V4yPqHYp0GpT{0(^sDEOpXyzQqndrUJFyf~s zE*vZd>l~Qapa#yf6G%kloRR#XL%T8|`zxoCAcZrM3mo$JY+O}dMLGj6=aU17%Q*nj z?6=YFn0;*p8(Q86Yq8b?HPyojv85?*{lxg2-d5xn^~u`F{#XAb@8@Li$GSU5-QoIh zx1)m6`%2Z1P{!kwi2~i*X!-*h9$-~$8;~lJe?303hi0XOQizh7aT|$7SXgb}UR+S- z+xn+aTTzC1I_z*FCSh}%r{iw9pI&j4$g5nWz!&%Of-ETfvJ|3dvj%EKN=?or3^-|7 zq$`^cVxthFOTTZXNBiQQ#qOes4*E!)h8Pm6uT{JjWdKFX+9f)in(I`mvV;>oju*5T zdwGJRqi8BbDlZppAq#+VQ0vDeKkNf<^1+w++a;B5lDnI?kQhG)FpatW}hF`KM01JG}*ygTwh!JUM$Yeg46`OQ|1f=Md zA%!%53S!_58+0yywdVzkuxi64<%-^2ZElWmbWeuJA_CP(&O_sJ)Y=I-JM%@;N@S9P zz|OW}auyymo&;Zd4!24s$t0mqgIW5^PXTC(u6zIF&mumL5M772;NL_?yn<3WKygdz9# zDQms6kqr=hgSXFQ-PDwodesAXyo6K61_ml*RL>M?Akk zGZ^a}KS{>MQUq&GNKpBAUrf(sL4&x=<2Eq)Sla*_rYD805W@}yqMs4K&DM-3cTKBi znj*w%H(6<2=QVTC5eAII8e`}PgRnnxgn{VfaP~n4+3jzeOV|ZDTLP&9kyueWW?qFu z6e@BDA_J1cl+GY{RO*{kd@TjJti=ssqD*6lY~2I7Oq3B^!%l&WRM7nl9+J1qDA2Z> ztV%Fv?5RhP%gmFJqM9M$I8L!)i>lWBY#Ps69hwrJhxvDu^nSvHg$>1wub&t_VKpj8 zgh>}%j07pf2M^}Y5AJ@Va&#A7Lj2xvuJ2Ve-ZeU3XMIYe04&#FNhRc z=u07HWFDRX#P%`6jD!#GJufq|#Gtem!`z>4^X+qQ8>9vv@oP5qz3&SHQ13N}ms>kl zKD6We+_6FSxSwCrXvnw_ zrq3p~Vim<`O?~u+zwX$T6tsBChwyISYUV4A@Pz^i_j$4ZSO*J!cg-t=Em55i(3Yry zf<)kIwZ8F}@B4+ewnVMK5H`Bn>fZy?iz<4*Rx@mg+G`vG@}wE^EM~EWt$?Nem~dF` z)*ywz0qV;F7N6jJZKoL95SH*JfA#G#OcH&UOarDUShNq4p>(D9JkEwERXDsbsQ&q~ zM$ZDm=lrV#>^1hYQpfWAGa%RN00{Dx`(s5euDi zG=)y?RxxqMI?EnBfwxktq`$gVc(3hoi#QA6;W%iA$y1|>(6Uxg=!&o6kC_S*Jv`wH zX!_(Zx>j=?U+Oc3@wKFa^QNc8F$WyB&`A5*LF9v!HEkt5=k%|1I3aIy~2bpTd z@Fs4K#73(8+#o;dZYo6FD=;OV@aR~UyLHFh29=8~y=fb#cAbxmrNtGNepB6djtNVu z9I!MqGQXtL@?p&!VSbNlgb_xCB$buGH|@cIU6{MT-!RG8k0|~~taDgCJOTsl7XvA1 z$I#3g{TLe?>Og5i2^CC!+yOb9r1i72=_jOkDx&3MRT0yN)`fT6MwLk;AapxdLs9)3 zuLmg}L+z26!4eUf`v0_mQml{-{ir5Sl>?0&C*()njguS;rY{K0CI}ck9Dgh{VxLa1 zF@I5wwU24cs{CCTbA-{%o39$ZD0pUuo@!Vpn?Mys(^;W3BCxV^*tH*HBhziwDktDd&zI|z_5^Z3hNX@tYPE&EZ7 zk>&AE>_bN^n+2R+3l@xjJ>*l1Oyjv5@FU8wZoV~5lbA-{FJI-ksY2&cduz}c*BjXJRo`eJD zISy+XlA_f@<>=e~I$!(6T4N+ee0(5UrX;w-Y_TGWFeps?UfSyI^g#`lUwmQ9B>ChUVOj*~x=0adp& z5hyf1T!48G5dZ{_nfTS+Y0Qts8%DavjkUjTSJx^AlG!cpUzJ+APH zBR66y^+-0Aal&z7*=ioCdE=hrYTmv|bEM{No9eilhiJhdN2x{3%e0s?YDC+fZe)C1 zX-4cskG7@czIN^~-Z1~wKmF+!K42$$tiX^T66LNrrj#P?xH6;NR=#;^86u1T)AG-L z2I|X0f{5_!t9q7&{1D;U7xgTrhX~I;t7j9GgENn0xk-DQ$13Hp4}NGN6JO$CWnL0J z3-d*vc^3TR6?W=kxl~t;!F`BEP?kLgj@a8M zYt`9-n8dbkna8PL#QH>;wesrZfXPOWDQkO7SzB@a9CmH-ku9Qel-9dt2Lh%Lh!a;5OYc2ZsIrD-*|p(cdRvjvmm-5K%4rA&OC{N2 z)J2ZfqMVRM9s?p)A7(?P)pI}wmvxTFv$es5P*R3|R+h3$X~^?VT2w1A9WY|PH6wnZ zB>ANXDnsai7Nls%fyrluYB?~K{EqBHO}p2SADVay-C>0S`reE07J1L*hXJCbV|U-*OLF6N2n!BeN)gXnh+Z!=gqJ*Fw0v3YF1}ehsARK$qXTy{RE0EzRsOuLGyl)p#;tWw$L zCrWfWmuOE}eu_Vn@x!W%kl(YCmlT}pR1Ak*1APH)YkyEuiLmjs(q7$qbTFq56``|E=5 zeBZ=J@R<%&ECEEo50@dgr;I56qsh+JsTK*J{e#1488(H8j?2OzxhTj^K7|#0{rs87 zZ+rSV6_SB$_Rq+Jev!AvzCkEA(S&j zcS7wdyYo+(Sk3c`rUj65@?afhFdXobSmejOx6dWL-&Poj_<7`8CKlN;FKaKOCC*}< zYYApZ=s=2E7)a1r7Au2Y^7$}uSkFF(A$bF?%=JPY`$4C=N<3{(HD%^t9oPZ97noEh zbW79p0#_Y|vt<2S31!~L*Y#+wJZVe$fp^!kt@X$zS^td->=*05-(CF>ZEN!6Y3(i1 z#bYy!&~)ff`HV|}AsO>-sH%1z8&J_OqO7FZY~-lM6vb0o76~GCVL?4AcfNT}WT8+@ z*blDsQlI_&`}N&4KH7XHvQqhRPczr|KhQqyXBkrzxRP>B#|PVpA?)Y)!{53 z)gvqm_$0ttep!zUo(jYRJYrjZ1jHd<=?g!N?!$n{+z$VNx;Cgw@?0xv;VF1Ozl4C5 zhznaU>bn}Q#F_DE8TJ}fSbG*>!;Hd1+>|m?%t;t_u2eY8cUJDws=GPLtcu>QGjEUx z5!tpa(EY&ZNEiokxZQ-4DjdP#zg#oS60H2&KTY{A`VjUgU&`PFIK;?;D?z~8QLVHL z4g%qK*jj|ONP*yS4W=T6!kp) z#BJ~V=6$<9Av#@PZo~s$|J{#&r6tqfX#JbN`}x1&6zxJ&69PnRv{8;eDpy`>bTo0e zQLZjHHQ(JR-u3gNc-KFlQM|vL9XU4rd5B1c9tcE}3CO3)lG6NT_LURVJ8$liJ31xQ zTXw(Uod8*&~l+P#nKPLuqP|^4!jyNc>ntI*9dH_9`AzriQ8UloF^+h^7`M zzD&anbqxX-A#{%EAwg?UVjEZ+{Q6%Ai;dET5j&f4lgIZa4~HO&Y7emuBZ7!HLDfU6uwfF(w+M^t>oyIiz z7U`&YFjNI@!F+eg|K;<^|K-mo`TyRjS@-6aatrMtw~)KzI06hMRYyb(^Ky>dtHa0P zl&B{L^W#T4-HqSsnt0qupCr@4nth_+;G|cL|;?gw4ui6ZK)W z)424<)@S`m{y!!0t$%sA#@}3>BKV8&mg_BdKc2qmC+C!Xkq&|wlgT=6C(ZG$pc~3w zc*leXUz$F!7JX7bDt{tbfDIZ})Uk2=dKp!%`S8(s`@Hl75qQ?Tm-G)E=M!u(W|j>& zw)<)e`=I5Gjwfq(=;NamdlLM7R1dH{rJ(%q&9d!E2m@ss41c_y9oRRhnaW&Km``PS zmUh=CoS}spewasD`7HS0yB1Yq3Ar5eeVie9DlI1aNN3!IR)m7`UQBA)m6e=_;1EXm z!O?sCNp?)#s*`q!&#Gkw%gr4rg`ET3-w4&SXfxwjJ?)?<&IaAyU|&F8&qtt(srA{b zmwH4k%TmtChlF7TOMd_11mTlu`A3+xr;MT8lS*zAI{tQbG(vDOuWOVufaRug1_*?<2KpA~y z?{S~%itIi>aA{1Tk5=F%>uHSt?!i)Kb6I()s zox+c8vUvehGj8QM5~m6JD2!UZ%_{aJ@hXyl+5s#PUndA7vJ+VV3;8!_J!B{1N;V$^ zkDhq`x0dE4bKfurVO#Q5qPiJ~)@T3l*)M}-j%Bb{ind1mPA>dTU&|5#(R zXW8HZFN0A5RZMO)+6Fu2ErPn!dy$V{%|n~y&B*%GtVN1N_eee)7f0A?MIl8i3dd&3 z;RkuT5DFZmPb)|&3?|oazv-4fX#q?ZAo%V9M^+07Lfs$;%vD8`2m)$3oB9++5kv~4 zYBT2!6G6j-aVCP4{_gf5f_4NEq)cob|I*|R6G5D$Gug%8ou1t&_PoP;Ml3J7$6V7C zaR^=TyUQ6vOCDQ!>Jf+C0j4uVNiG{gL)sv%$Qw0h`<0D+0Eo_NYJG@ zVx*(Y`Z5`AJz>E6FF4ee_$%$79$D8j;T?0X#5U|xnher*0JlOziw%Gp$WKD=)Mk{@BPgmS zh828&+@Q@Wv!wcHaMQk_oKn^nEEolGy>g~Dg)5@~RRqnhOy(H{q$OmRgCz?^Iav$q z_XQT~9Nj7*4oe`V=g`Mu`n`OfRso>lKVQ;BW1<$AFtVV5dN@4CwuSO)xgilhzs+|A zCpa_Ls*H#T^uk6&duT*d(F!a?tm!BS$o)a1wwz(xHMVzZT+IXnq7jXUToP{F`z@>ylE|DH@XP9!3CmHgtc7p-ymE_H-^qxUxihVI@j80U77Z6@d4~IuD!B{ zklf%BTj3xub|k84kwO&!14#)lfq=ZWhr8@ZwTn!KG?u-(ZV#XEzR^kPhDq6<_F)7c zF^BtlSNaHq08Y>MuH@t1Ol599ESlKFxuqThQ1+=6`Q`l+k?+$Uql2uvOjtN8xm=2O ze1nZ<-PSmXeH$lBrmQ$oD9?&T+AKEdb|DwGpEq*BgkXDk!zADLRPLr}hR#|jMzyT- zMP^zgYD5bwObr5$3*pw|lxQMMEr(qRU|K!2n}h9=6TX|+ndI!V&@2q7+4RU<@GBGUb~(66IJglKk| zk&7K4-=6lzRrAKE=T&in?jrXXu#9)Y9ylGFi3>!LR!2jZv?NU;X0`pqFQ5(D)iLh7 z1@Lkd7OpKh9%I^4Nd;f!xIUi?6MhaCrr-KUhHQZJNDV*BH<-x@Y9<#u+Yl17Ehe;4 zqZvgx5RgG5O4(_r^`A`H)*q^x5{I%mr*-n4&Cv^%;v&Ko-e7tGeM|4(iHsKZbI*6< z(rQ#(YBMDAQ)TyCcPxwFAsR#a)LgyX?>EusE@eImE4DpE)d)w(=-2HEWTvrqUia^h zVnfQ2A%T;`MR5ItXjKl}0bvz>^iYlfD;{{MXDX?|%Gwn?=^yPwKO zgo3H|YPCT~PB`&`pAv-~hC5YNgSKx~Z%{tFszI~y>N%JoHTtX(qaHXFYSD4%_oV!(t``XFeD2pHe`5J}i1TZRg1*n1ullEkeCxn-t= zECZ_I-ufwW6r6@^6^Gv)nV9qhPEalCpxPIq#jxulP>!`xOMxaSaOZC}Nps2Jx6Nv((8e7WU@0n8> z$oXD0YH2wBl`LjUGB5_IA=Y-LjyYS>=%kEJg=SF0P3ib~&tC=dZ2PF5m#ObP^)t=; zp|U0MWn~dhOuOU)s^dA4EI!AkDo@hx%fP=)n9T_znQqt|HPEt#IU^3k+i6zLYM$it zXgH0;+U;I$PdC}q$4xe=uxfSeS=BS388O>aKkFR|7WQblQ0jI49G^X16`ywBxKQ`% z=b*e+#6eo!hzU)ewQf&mVvDM~${w9re{{AzS|{GJVc(Lc(=i@fSzKKlul&nk&u%2~-}-C&wTK7$ivEHk;8={iXu-o3VOhkY-?^Tn?Vv8uT!>RD6aI#Ddq zFf4cJUg^gsu|j3|GalOs>{454<0j?bz@NLNk9}C2sP9_k1r|`j1?|guEx9%TRGOI+ z*)o6F|B>@Tftu4Sh7ooK=de>HbjEAv+Z_rp>@7vq76eZvL|0ohl;Y{MCrvwuXPM-z zU(a%hLF}1DgHo}8C3+Xp14HZx8Pw>VV(QRjI0%7DsXFC!!`uIO8eKdh8S!F^AVv5v zHwb0saC=JBC+v(Un$XYQ4*{r782-Suyqi6XoQC?j2x!JBU5vzU0Bg_47bD;rg?2_*-A;po1YYsYKud$b7>Sxb28D2xbsWtE?uW7Ht05d`S)_ zo+n{`o`e*-fffh)Gap)=dYKQcXhNs4(F_hMAg&*_bG%J_z>UKKHC&l;DN*d;&8QD9 zqP>lbEX!4H{jIr$e0u%h!2lm{hlr|Jt|E zU^}@QMat}E$iH|Zx47B+9fBoJ%^{YB{z2VxN=P0B40~kz zk=3KHRf_2vw`~_b_>|+Vq2`GpM1n7*coT4U2GdlvYr7wkE`q^pPH9*x6Lu4Gt=B`p z+GmK-4?EaH6NYYOXF}KQ6x9`{I#m@7F_|+L!SMrv(9*5mD@3J+FHSs6_g*0%3hmF)-0(Y7 zgsxRxlV2p~j8_YB+(%cfOz~)%)>Dt~6l{&7?a}s#uwlI4y65Ft_Ns7$Igo7Bf=f5i zCKOPoPa62%*B*<^V0c3hq5?1m@)_>0J!6kxpxp5LhR-zchv|kLf=tQ2=XAwrdr()* zwY|EY8j!^L^>+Q{6Ae3bWmD@`T~FqlC%TTWHg6{zTnYs_Wp%cV3-+M=V0iT82V3HP zFzmt0_|;pTZQ^p84bx;P@+@LN9vNl*tbVWC%7{*gKLzf)Dhi*yA_I9dP@Sh@X*mLD>%I-$6&lZ%hZ!SyBSiY8G zSkpRFDw?mR81{CXnvZk`Y1DxqnOznO7}7fEC~)-!L}_~hVlL;xd|bwb>Da`D*$~J~ z#+h803r;v|Do*FZOw4d$B9?PuA_^`{1Zg%k5pstz5prHK5g11@%qO@o5%PO65lLYV zB#HkJfrE;xCM7Xnb(j(bV+=8cYrR=4l4NjvwMpTsJg%ty4Y-EwyCrr|l1YJBTu#Ak z3^(~zrr`-uP^NEU%_JOf{=1ZYvg{yX>=g&CDILMcQl+@Gom8Ey%n&t_VNxU7JFv$1 z>oP|3t2NOY~O{Y_J+0 z!2Bw0;dqRn*|l-A-0-jXIY60rioY1zzsogGa*)zeLH=^Djj36J!uUD97HP<2|Bh1> z^(y;!GLOK-Yc$E-=AE~PZsDaCkmvi<^*wZZXU4B>cZYpPOxFla&2)ur-Ckf1 z9THsN#J}y^L71_WrmlIkm96G1juN1=<+* zHarBly+9k)K6~ZTG%cnlB^Uc_l6W~m3_6i9!zc!{l?e&X^$whKr zNbJ~)fY?62td>O^4Z(#Xgz*S4iqV8-*c2Xxd_KI(Rn_1%k$)(7EznJlUQ>4)`^<{G z#ywx>3_*E50Ab{rywof(4n`bO8ZR=FOaB+T(%tAW2(RjkRw|yhh=i3%0!J&jPdjer zaG7JfTn;XrjRX=TvP5Ep^_jH*>$63pX4?zpRFID7$YAhhi2vg=NlN!GT==wTFHd&y zIb85&F)OmC&*p;7%=$u2oXG`^#rL3;8BE`U!t>xOja9bNV9qP!nnq+?)5ruD8j*&e z5rJcB56j@_fX7MIF+ZDo>=ox1wi7H5u(S=25W8s)BjqV z3<$WGKuscZm>O#pdwv7l7x&1!QSYtQ9=UuF8S^Wapmpt%Yg~qAq4Ftn!|y&hT`J$= zp3xw(O7BJG0vT9F6PE{u&F9_U!@-EUzsEvN`%}o{7PCK=M|~Hsl`@uujQQM6U3n%o974K5yOXmcho#TyHaPiJ3_$E&Jgf(d+_}1 z81?*6Qz1V;5LQS0RLIW{%nSM1O=bTOTXi9HO`oX@*aM@sT(FZWCEw#o84zHV;iS1K zg&o7-)0N5Xw$qd;%Z^RRX{Ap_N(;%iafjccoA{zQut3Khd11(f$Om@w z;$)Qi80!ton(7^g^XwxX3#iZ(ivxA74s4kMdJsSp?!^+|I{Z#rh>`kQwubsk1PYZ1 zQHt%DBD@6*X60M$12M|NL6tL-+tQaOZ>Dn@&)aonO|ED$#KsL=Sd+_t!s=cA6W00i zpP&X5M|7(DPjEeK;@1gEzJVLXgQnp93;D%%+(s@-JtoFdYg9sRnF~4m0}^t05)g8l zmrA5DC&5K0F@lPFB+;(Pgtp>l_@Je`4{Jn}8}1RLtoTipFH}Z$3@3;rzH$Vh)ZOh8 z#|RONv2rB3@aE|M`4llHy&&lQ2Qit+=lcw2e0)|{C((VA_PaPOL%H$sQIkwI6 zDK@90`vS)9h3yEx&MNT&gHZbJbkM1LG@NszMH3hVi126_Aq^2_CXJBjADF>QOM&Rg zFvdD}(v@x<1Wh6p7zheQYk?YRTe$t0k}`~NOy3y`Sy*P|#|bY3AKRyv-7lb)0^{0K zr>kbq`~kP8(I0SEs-+YMTnG{jB!y?v*qD!$<0nY_CkESvqVT;HHB-GN!WzuSxYp}# zajEYx@qPDbI3i=;R*K^_<}9=ZZRJaY<^+J8mxaDhGH0$8o!7VIio>bSyE6CU5Gx(W z?0P%H1zlK8&s#~$f^_|2`x?w}u8_@u-J&^Y_cp5v62;AS!%S?|YDSUT`y6y9yy>kH zjo?AYO0`A4rg!8$N*9uDL5VPc@K@Iu^-k+eYI!MqwsE!9pKHg!K&hl;?~#!L@*%X` z5hg(DFC!q6f&!tSm#tI`H6)=t?Q&&eS9G0C0 zJD1yLeVyWDaxlMPG`onxh;u(o#d$-`*zB1tzB_Q6;Ki#_V|e|(n;8TR*q!Jo{?A?_ z=CJ%_R@R(S2#2vy_GBCO{6QL9Fbz^MzS}SayiRhmRE`I9tt1WsdVpBahgeWXXxa{_ z&6CFn%^hBM8kw=NGKsdlguZgRNU+x(M%c26FnxAS7huI!hJ37oX7Ixn{=gkZ97o0( zrI1=9!dVzpxQ%$0h{LLtH)z5n`^g*7QP{rj+A-e`xFfopg}k|h7Sacl;MkkBGSm#_ z?3N~|4GUNO1cN~<$>hh@4l5A%4OtxNPyZ`@hH_HJ2FDWY!@PWa`y5}@#6__oeu(mE zJ+XXOZ6+y1Dq2+KK_8;DhMEbgGp#oiK1Dffh`suehP0GBXx@DiwdOu_G^JHkq~>;M z^`rh23kut{_g#sZaYe3#Le; z8Nw~F+G3Q{7ry(%CqXN;w0o@0>xSi`O4}o1&K0j>G_u^PYKGSmMDiQ9VE)n z{VPod84t76W&6i8B&DE;vRyR(cL(0}^gq4reINf8NxY6I;Jq=E@3qE!Hs&|>{7=cl z$228}DgCcJC2SY8`Rp_Q*_WToeZR!KXvZMVOZg=|IXV`x#)et_>Wu|188-I(Ps!r~ z^r*SyFr~wkyz5_&OPZPzn~;ips>q&o!xT zU*XOTg5vv~TsIhB?+c#%*ix3=tQwR%tYzNCVM<=Q?`%=- z^C~lMTRk_61~tbW!dMmWxMi;yj9cTpzwrJWZND|N$6~t})1I;AU)7grIV7MZc$K`@ z?^r3yki_>iOy1kDuR_WgWy@1&XDS%2?Lf;9pA_b$S6+VKxH3~zrN@pUnXlY{^E3HA zbg-HFoHO~dB$5>@V9jn0yG8Ycz6Vxi(;hauyHPd@t^Yr1yKe-OFw2w-0lh z`7OKeGK=p^2X?+;PuhE7wyySXK^H&o5B0oyqgMBk`%_En+!BibLKPTP==eBD+$f*D~^v5c%hO96e^RKyYnprrgw%=yn&tB zm`i(qppmoB0un4TgP$vtYx@-Q%x+fysP`71Fq}$2>1*&!iq&h=2vO5l+c5drnA- z%IzIc_T2k1?!agtGWPnTFd#5pWPQQ_v5V@f04+t|E~UPmgQaaRGTYA>yZJ?!h+2cM z?kCPMA#GR^g9NMv9nuNa0x$~88P`F3kYV9UT!|CXX+(u9*_;qCo2pR-E{P8t+s`c1iPWO~Cj8_GOt`IfAMr>ZriA_}^Y_A)KC?0aJLFzpO z^i)0A8Z!2v5QxwN`=i!FR|L`6pb0u$2h7#vl%t95c{ zCB()NzB3}86+BrrzaRps<=@#>n_-%&HtBV|-Y(<5*_)1=*s({>av9y*$uj63D?n)G zn>dap+aDqUV2j9S)~yQ`?%HHL#B8&t73anFq4V-Vo|?)s6tfFQ4G>6s3k3DG%5aNG%dsx!<1D#C8COyK#>RF zvLb?p_Mq&9+(XcY;t%F@WpD05T|t~^Mlrz9jNxhz!4e8W$d$Q;zW}F51dz8UgM*!V zXDBZ0qdydC$#t*hFooJY##s@OWcApF&$)Btv%O|bhF4#J4_|~lqo;82kwAbbOqku<_2UFBHEG< zcrb@`O*=>&!>9qsZ%vmZm~M^hm^m~-qS4S1yB2*KG}153xsLU|-JRP!l4sjJl90ecW&1II)eM3SW=;t-yhG^wgOD(cIAq-HAD7 zvPaT^9X#C^ER=Oyqk#hWE0a=mxH4HMjUEgXomkUwY6c3AMhuj-;xV^R&gKmfBJ{L& z&3yLXEGt*MmE+JJGuhF!VI&6~KDVKQsR12 zX7y1?Yib~^+21E)5NBK@cL}`Mt}8n`-==#pnUExLtB64tfQ{aZeX^nn;k_-021!lF z7?lazjf8!wQ{NIPx3tJmp@^?cN+JtXU5**mk)(IBX>njqPOO*fD>wP@7Ob zZ3KoG60TGco71uPF(+Kb(<(5`SV4JMgz}<&R`PAd=Zw-b-tqI$~5>vg~hI6s=9 zM6}ET>46QMZEvhU_olS`mR>Z#YbHcpZ=01FsZ-6HC08tV16FpM86$N~^QoN(ox%Z~ zr)gH?`*R<}6UNd{4b9^68J-a71VYNExFrfxx6i5^)j+9!Za2e?HFlH)H6x5M}DyjxameHyu5}-4h(0 z>-N5ya!WWHkxc(Ddv615*LBr-p8NeirK=A+^7pydvLh!Jb{r>m>~ximh!dweGZnhJ z3U?J%<4mQhjqI8Ut`wcAN>5&h23|mcmqvg>+#o1d=P@`Sx?DY?$AJf9n8%C(1q>*} z0fq6<55{SfM$k&f6!ZK4*WTxz``(i*J3voQ5l8Rbv(GvEW9{{|*IIk+KWa%5#D68q z%ZioPLO+kwHFQ*dS0_?{8oT`B!@`k4f$;=A?T$~OpTgK&R1uh`q4M8t)OAn$!&1l# zFN>&MH7ht{_yvBjLP9Z8Y{O;0H<{iI)0V9RNaX4}kKEI~J%|`%#W>Z{c%l7a?aiW@ zN7Tgw?Z=Xe#<)u5II1gp$U7PfjE&XTgtzSH5TJ%{)K>@4(WN3$KPfpd^7Tr=)O)ta zq8=v$DF+AIdv^^AS_*ZJmz7i`BxX?&d@dOUSagKeVIBX#&$k~r9MQ90W+^y!=15i4B{pYElTZ{9|cYg76VT0u(@WIR4?spmKNl25#YU-CY>Jtj)&uI-NQ zb21=eJmSMP7-La_Zr`(RPwmQ;5(Dx{@-U%(WM!!tDB_}sIN&kZ&8V39&b?!kBRFt7 zJGy|y-SkHdhyn_JA>#ao4#h~Z$TI(3Ex5ErN6Ok0X2B*P|IWwDcFTIam|x;FGAvv* zxJ9e%dxv(B>->e;r?h8zU4E=Ck)lFU;PhPT^%M1-^zJ9?JIMp&9_hy0?L#4YB(^(h zjK8oAHtWF559G=^qE;rNoD_)E#VhLWC_G3O;krQj2&;{{Ks3vyx@5^X4f~v{-#x{h zmn3xwYg|fLFXa;T`DqNBC+WS=bDe8mKd-5bCCFHiTANxwvv3H743!`$Wb0mEh+G5+ z3C5}AGhaB0;Xr%61ysC|%W8%0_LvHgf~%NzNI)Y*wMbv_{IJZa#m3)(lBr<}%&%w? zU`mJAZMPtQl?zTSHVZE{W4rRu;Mk?Y-5D~58W4IeA_w?&T9D)VOkE=A<;}ZBIEH|} zGrT>pF=Ah=kMlqpj#jRD#z0*$0~=CA7U=;+7NN+r;jf4oRN>uRm%2_J!7l_Lf0?R! zl34mu!c^5IL1?T8a*1$6_CnSkr@woxsNTp2v{AjNo7L}GD~A6XcS24~L9^iB#bZ2s z{uAlhzyI&s_uyf0qMwz%_vp#TK;lsKUfu-u%<|Jd26i&RkKvmyv6LiTa(k0o;gALE zc1{G9@lRh}B&)B?s%O z%R0R>cTuWOdOl}67($WtpWUN9icV5QTdVDQ#lHZ4o77$VBZ`Gv=c^7q zo|UpJi=&^}8c;0UQtuNy!Eo{(!%rnBorqyrH=#ZnsXY>2R9(jc>t^l6lSd*n?9nU> zr~;E8BM~pkReq8xg%byh6;(PN>MqqZKVM2O@E*K5xuGJ@!ZG=mNR)N#v04Ib}bU-Dwr5j4urj}+^H#|-p9w@%ZQxI z9*7jy)Ksy#QzY$c*;r{`vBaj-C#z%Kgy}k{3n5vH(hUA!bBX zSX=ICztCOSuL+75KsfQ3^a2JAzcA7ZF$XzF__S7BX`kVRUaA|GD27Q<>RCzaGRP)Zop7(W3VcMHi4QqG4$<1lioGXX`@Z62-P%=ef1TT9b zp3(ektx-bri+INa&A-kG;VtY3#lrP48gI}ow5uew&dQLV!CJ_33B)L%3+It8iEI4{ zwW@a;s#7RljNZV%R#lKUo1)Pu?nZCufcR7YO>>EEm%OhbnCN4dexUcmbgK3T{fz;IInz!80Fr{?n_S<$={EBzwbkV;0=cK~xVcj%!MY9iW+#OfLBKozj9z`+_`%hikyEYsdqNt(`#njuwe` z!IJkKu_)S?Ju5qSEz~hw1$!QF?g1~w05YP5eYIvZiAQxH1Mxk0RA)W*6Wpkm0t>!j zKD9Tpln0;kp6F;j@u}Q8e2Uf=ZUFE`p*KkMOgbR|B(wnZE$6F{IW-BElFNF6MGv8_#6qi;%d zk!R`FV0PoXCY^oP;D}27ahh-n;GP;;AF$h9EocnnRtyX{jxPGK$Zez(Xx)W`xVI2 z_fow^mP)p{O$Z~Jsp|n{9lX@19x9OC3Eay|{<U7zJUrhM48dmGN zOxJvP1pq~3%6~0Q`Fi4L797P z0Ri^}h?FfVofU2zAN2b0<_t8yKc8AYZDgal7S33_nZ#Fp$LOB+p)4$dz0iC6kLIf{ zDQzbW4f*E?mV11AkGS4|9uMg$`(9ojBHr)$Sq?lBzw)4pL}m^S*$XY!5@hyuZC*fq-sa_&zvM6c0v8G#S)_{QFq}#{L)YNt!~!=K;7!MC14daza;=@SJZ*J z-L}F#x4Dj_a?efGL0b}|+RQ338m425QE*5@G{jK4lqkghNM3pzTn|m9DMridM{|sD zaXhT~dG!V9-A-$#am(=qo?EkEyR$V50|{VR45wYwz%zGp8!;TToRUESR&dapoL`pM zCHCQ>uGrfz=!$jlysr2QtXbom+vu^mYmtp;7JIKx85t7$(H>U!E6L^5TOb4;gqftr zuLZHg$0Umvg5RRX8&M`ERz)i2QX5-sSP@em7iCYWiGifN_ylmMMm=Vy+%*KeDIn>V zB&S&$+#+w=4N21{so~Y`$imh0mwHLWNMeyaf!l$dTZQ}n^3Jrd*{=rf(ZTDvwhl~gJXvsg5I{pT!Hn%;_kFtxWfn%-j4EPAA=~&yCvgD z{fIAzdOS36VmIn!44H=VQtDNWV*g|mAp2!TVF*q}veRk%u!Rx!rz+OFu}Aya?&$h} zQr*F6>BgPj2f21;*(O6@W;GvWZ?{r^A1syFaUWz5}Q%f*uJ#VVbedJ zkS%YglOY-(;`1!Y>f+S!S=SMg?Aw%2zyX~A>7nsW2?pO1x}#z`1%qN#@{f8X)8)Ok zz*fEG1R6=U*RY6%-%#w&<{=*dI3uY7kF>D&Gpd)AXLL6OToj9z`|C ztgcfASz`H>$Jqv~oz6}Pbm-B#zG{@@74teJu3SMe`6~5A6n#??S7*8-7VgGuTu8?3 zLRT=G<(Yo1IqQ@DR5@Dp_Nv2zt+1#ns-IA}Y6p?DHC%OVnMXP|YKydbQ&eF|b^A6| zBw=-X)vN;9E0%G45>|>=HAgCt$uk0rQN+S($c!>6=(+7f&HqYt)yKy^MGA;diLaYS zGkUY!ne$x9YlA&{C$x>3 zX<&8DHkNoI?no0+rit*8NINAIE>p2W(5|)@PJ+SqQYJZb{k3l9mj}!JiR&L!*Tnjp zT>n(!`WRIC+&wszxxQOJ)g0F8X|DfFTO40dC~wFUH!61_h+tw$i+V$b=ZGG{v-rU2 zxB?^9S>SJ+drjRndynqIZZ6YZ3l+qCn#I#_88!QKcXYGdKz~EfYjlV4U#2?_02H&J z5A@0NPoE5Z`eYtSY+L3ZZwvl$FVv0}K^!AoVJEyo+^mMH5?YpbV0~a2Tb7O_;3Q3l zH&{zrQ#sZNObynS2wy-G1gWhR9hhiE2rj!ItQ8?dYziqnOVYulyM*s|AbCA3cfl#3 z$6aDxC6wylUWm+m=RD8N$|T%Bh;LG;LXC*4UKk5cf_J?kup<9~vb}R%<>)uX%UI)L z6ApvgTMjg)As2?Uzy-Z;h6^}F4(W)tP?#ODxWooYG%6Y}3&S^sjJY!an1o?!(qw(I zE9uys2cErjBAJFy+CdL7U|=;Li%rKN+2%GeIPqz;eoere(gfU|CIGdR_!0wtjn!Za znl2vzWGSTH64_!f3SLmwsB8-b?a-hl)A6LTt^`Vl1%u~c zb6S0H!}`l`A0=t3Bq<6FE{R1qJGHrxcpAlT>HHPzYFUEe6Z77e%Mku^Hca@sT+>ofbhny<18D05(I9;T{eE(;hE*p zeFDdeaP#tQpP^c1MR}e62@c)zDy7#WvF=@X`7k)LDN_c=uGh(9Uc1U{aQ6e{wQ$Ru z9j71*_q8&uD`+8nrjw2kn@Dqwj-V_a|<=*dgmT&Oz))H# zf&t0QJ@T}^U*n!Ij(lIky#NG!2Ul64diFlQTzaRM;lAMBjc;eH^`J#SC*yIcRRP`sQ{=9$7 zRX>K)ZRn2cxpY0twOXUr$?#5dHyQjX?%0{@4D+sYl{#0o_$3fXwl)P^m=w=*ohLr> z(2?;XL03c{FyMX)dYrL68&L=brl>8Dub<-K6uD-z4Ne~7xMuPR#$}(D!Q$VVRo-^4 z|9~tbqQ(MVut?^l*6?7tNUag_vY0C2#D&nWAxxf%`|NO{Y3WFj^L{QEJqA=ka}G5n z|2l9ao2UJtOaXy&P)7s=&e3VVqBuZ(OKcn(oqnO&D=tplVNpjiFY-}>-J&$1MMZc8 zEEgpp)y;fgF8WuQ!(l(RS{2C7K`VY;VT*i(JaK@91MX8LXb z#UStGLN9OULKhDRdOCVwQNpmK4&n>1hm*;|thM;HDbQ6XbQy%Z4d>C#$X;OeZxrG> zAjGv(-mKa>4y4jUM_dwl+hP1nOu3sl#a;cPeW?B~o23b9I@%idn3L)%_CWkIsipYf ztHmSL|NcX31)KiwDGKg6dFhv%_y2Zs;~fz1p%V=7K?2&oXK88a3{JK~vJN37Z1Yo4 z)NiPQ@yQ&c^TNL@$i^+7~TNerkUA?E(w=;=!?Yszt!+_28%8Y?aqXj3z5fS#GZ@ zuLmKJMT&VT0h~-*tr7Tv6te5AFO9i7zESye`L!33#09gCE(@bub-^^H%S<(|<;#sZ z^j4b;0HZR+%j*|A!`S)nmQnvkg&N^=b+Zwcn{39>{ph$qPgY|eXos}stI)=;EBj;I zp9p5unMwUhUJB{#z`ckjT(`DYIp{Tl1zi?mJX$ky*B$RjAL$bcW~yBp(vIr)*v?<= z!iIx(-8|exAhyxk&|)UiaeL?_yw{PEO5~rjI*;!YdvKKId&dYVj`!oFWMa;ktM|YY z=k&7Q5p$CmQyDS8i6_F>-ewLLy764Z{7#`pn&wesnho3JKsUT6Dpo_b3k$R}(&|+o zwG9sNBg!ivn9pliia+8~7LQi@{=1mL%g&zL-D2_IGItZ?NRVF;uV|cx(l4)5)68*d z*jUr>$kIbL09Zll(Wt`!YUY;MT&dV>QKh&h+YQQVVX>BQj2m`HVml;QRT?TaCO#tLc4xdJP6j1wHky0cMvwSQlOMw#=D4m=%jt0TIm9| zU3WjCXQ2K+FK30veOI33n;;B?%tdZbwJUhl0yq;UcND9qoJxowif!yzfu@0t6{og+6)* zQUQ~Sm5fh=-qlsZw^3xMYK`_f3(M<6ph}DDO33>vWk7N%^@-k74f`O_>Md@JHT%Xa zbY?;vB_V`3^5Ul{j`%jI*$5`7+2x!T+xpOV8u279eypEcdRC;KAzIw&PDLmN0L992 zttZv#LG;sDG&-d}D76MF(6o z*&DM6NAN1`98=q_o@eP9iv||Mlw6bU=F45_*Pim~^o!%6stc3%S!lMO14L)LR;yY4 zuXmssUOGpBhS!OkHpH-I71rgCL zJR`Zvvo3k5Q4(Qs1o7r~)b$sL*O!4t_`J?)*pxt4i8ZZ^H(0`IDT}A1&MHCQsM*_; zTY5ylD6(}|Na;l~PI{vKC|9Mr@`+DJW^+MXuu-(XF_2#y=y%*9C7ziN5SHuXV`dG(W`Y}5B^{8=WlV}snkd10Jc_6i!M}8_Xz)VTR_~HSCdFtWi#QjUCJg$l+fKDd_^SJ+wQN)%1-vSC!YWtZI=c zY6t78E{UV|jII^RZd0spG#{}442D@ogXvs;a;-O%Aii4a3*#`iB+-lI$*2z9)+NM# z@(#3}ON18Mrm~SxUAD=L>PCOeIYxCbwSnpofKfdNI&d8_N;1{BzK#Yth3kC7p8Tuk z?Gc?eTV5)nQyPPVd2KqqHJMI1J?1&Osr87uSbo#}#jpEX4Zrig;x~KRChvG-EgMpR zb~|k5SY2J!C{@Mb3X`fhNnjEs%2dQ+(QD;86!Y>H;vHhQp>u)5&-ViH&-9pn?w?aw zG}rZ>IurP2F0~05_OmqzgO4MYU$ZPOoJ^G>V5=9N(P>Mv7!L4}#V_#(j8ERMQ3GW* zITBpuZRSzlLxJML*FuumG@UA9AA?;AQ?$|FN*j#`*DbVx?jlwOY$1@myDj5mZI)Jt zq!Tfx2V@=Y+d@shKYRGETOTX$J3RB?`o=H(+qo}*oxT%hQv2IY4 z+N-qTJ=LRDXY&+B)bT=u%q>_ozys$nF(Ug$WLKshLW5jHwJI7$(M&{$vC_z0XgJ-x zw9A!`A+Y>qsYXa5L_U#Oxoq3g<8uX@cL_*a@y9zfii5>VG_OT*YFd*rlLErPASef0 za*A6%k>U$tf;6>0@7w1ib*nk)c?*-{3o$9ED}V`8Q@1+*eNa~;s}P~f`k>qVz)G_| zz^>Z-fNF4qZSWXFMG>l%I=0b@8R_~`4jr??2y&ecsA7|3Iu?`7^WyB1O3;*kI`Wv| zBqip|W_rui#fiBJ0-+g47{gM~-yFJeURRv zf`IjZL4KD%)FH*T48uafrXO4aM03NDwqy@9CqW}K4&7=)8=0EKT&W713mXgz@Ehd} zkDJF7+>Rb@Sk%P?%)}uh8&2tHD92FG*QOFP4`noAs2GrG>VkI?X!BfviLt0hG$qtR ztu^{g>w+c`&SCM)uNj(b_szV@yDGffw=Ow#DTuE!J}p$1(MPgMxFm-r=wX!*2GdXp zSE(oG)MMf3T9@mj03O^@=N>k&Qv)lObzS)em5@Vhv}swX;A%cWYP!TAA`@tYl5#AT z{UpHVy<;+@Q^&zV$ppDLfYU5OA*5mvY=6*yQ7Mjw6hNy@Iv|V_ikTBFa621hkI6At zTSc{yxU+{fYHEqrHUD{2CN4dF<<$^9d0Tv`h_DA1cWSR>8W(#wcjlHv<+F*(p<;%R zuty(f;xO$W_h#V0BGvS~$haUm7#dxa>Wh;`z51cRSw|_rl|nKkgzaqbMKtIo?|I>) zXjyT7vT_qu@D*M;$N|3Ia0Q+j8)5#&Mq-@Iwo-c75F@|M7ftfu=6D;|5-T8o4-fPA z;$g7@y>lW)-V`uX5SR|M3OvwE4YZuogbuk_ei^k6K)P=&=&ASvS%!*V*N{lVB>WN= z0Ka?`qGGv{orw;udx){Dq@K)+AjO&&JqM8quv-UZj&hknDpHa7%9Q+j#ME$x^EvqYrWXfHCa%fChJ z@j9QBFod>weDg0Yo)f6Brvu53R7zQ6lX1_f`XsLNJwYup4U);*dlVE{koto|%#R2m zP#nXkN2^P;8VU4=Zla)XY6-gRN@1^R9~cUh&I=-9NQVNUeW5h-F2CYDV=``bmFA1a zs9(PJ9m!Naz|ZSW$S>yMu?4ODK}_g~w;ODaHg|_vAE|yC?@jIG!{+?2n)le8f2?^g zS5JDmTiqZNzI%xd7%>to`R>)~ysIb`x(ad*_v!KhDSfsvw|QAXuwr)!5^BGF3^pC0DK3P+9%w(zyaXk5<>brrua`SBI-|MkC5C!2{2AHz6iOrL zrisBJ$5HM&zp1An3EAm+-t36+sjI2)YF43$@jhX6>d!UNA8L6}eZx1UCj3#4gWy%M zIy6C)X72ky9P$ZJ)~^H9iXlDd%3_ZhUFfdTLU|;T(A!;{)lTRcZt&; zD0gLrvaFO>WEVc0JyeTMTjBr4Q?YA?gFJ(-xDY+Tdnw>jPBt9#UA`hPcz?86mS|RP zb2Jkr2g<>y=o~7k@zF7XH^iPJT_Li+wvAlgG@d|ett0mpL=-5}#)n{ly7uFj0~wNc z0j202Eo|!Df}Z2ABeo-f$E_eEFtf)N+LPi=e~I0LL7;?jpGb!ctBT1F7|MX1AT#idm5G5g8n z#@xxIm8wsCSpVPEEllVTgROhCnpo|%e%aDb!>kqoCw1K$WFxmKG}upMEFz{8IxP+I z%u$OeqE>_={g$|( zMZDN!$2htOH0VoAjvbKK1{IinJgqw27pt&N_w6gu>LXkNY99`$eW-@ok_HoCyC|@! zkH-`aAV7iQ`jE! zpgSizCR@UstCibw_}`RsBG`d04&!1wisS(sLcmgymm(q6p;q-#{HGt1?q=&cJu`-e z_j(St4L1V}k4Za(Oc=~$aunhip{LZX_{NBk1X{WTx&CvnjT*+p?33q^l-sw}2@nQ3Kd5h~w`Z@{6Yn zTzE9YB|Z)=wL6BH!&w!2fQIc*gdi?49y1zqAbjyj9MY>!bxdf=AR*cuk^xQe(ou&@ z!fD2>2!uh@fg^vE!gUZu=`F=zLQpVvie|*vydu)CaaRSVBb1Ke&UnlUi94YQ6iXZi z7+ZFaRJS7nB2bRlhf;kKKqQ>$3lR_T4Dei1db6zY%MmPjtTiIReyu#<))OQ_=Gav7 zI;j|#Jk-eEVCs7tetC)xD9&+jowQO0p@5f=0tQ*b%X!;@7ttycP<5u$#Tx7rpecf= z1{xV^1vCl202&tq4J8Yp`7uCK3{(ahWfP!*Dmpl`R^n=y?G+ZOva%&!hLFqEML8sM zq#8@~@~BxiA3R$1|Eu_hXkx^h`{>&A6@o!Wu^lKd;ECB`hWhQvy=ohz>5b+ety;OZ z_SV{}pS<9R4Sm-}w9T|pP7SO|Sl1h3BlIABrvPb!u^6;aS$L?ydulc#jR7E?OlpO) z=kf`u4qVr&M&WOpUy*F_q+b&@^LB)ldc~q?&nU@D!X__Ds=rWp?}!^X@EfC7u_~sE z$~`TCX++GJ8wK>r;bm#92#u-$tcU{Pg9pXm#(IbvNv(F2A*gnfhVp|*2j>DGX#hf* z6HtpDCtyv=vJ4fX$G`?yT&74WGZkiR;8BeY@xi0jK=Y>uGt3`_U~K)>;V=K{C%*o> zzwzmR`{xb}_gfR{HZpno^+40V>GM4Oeyr(d44Ubg;g?%hYdq0`4?#5Pkf1n$iKj;8Z=eZz_M+B!IZWTY>@33$=+1Ax z0-9qAGMdu|+CNx)I3qh#uehiY6ACQ$C}L?3;RJ_sr_Ax|-9;O3;d8hgGJz8}FBvLl$@^-7dVUK9M);TaC?jQYri2GJ5Y!Wxt z%PXNj4S~MAb{+r$(@~bXR!RmXrVfyJ+jPzjVdiBi&J4u^)67fjj7_07dBuZE3Or8!`>j&oBdCZOC!+2*8}S0Rme>lNl$wRyxQIu1g*9 z4@T5M{K8KCNcL5J9PN}CqrQ$ooL2!r3)Z$Q=MCnx_@p|@(hiRJ`;1X$d$BmzaHW;s zx20|tOw_#&C+|K!{H$PCx2CF}U|p^2$yRFggal|H#cS)rUu_y+xI|>O&fXNGMsj;# zDt+Y_5PWUfoB1oawyQH{5Bvy!!SD?l!fH!I7}(X;sRfCEjYM*Dy_C@J6^yo;#DM$J zPRzYrKeaOD>SPfOTPc7&_Jd5?^MKK2@HeV2xD+GVJw0~6FSy5JvrE-LXJqC25Ffen zfC(k8l__#GhMXgq*X6N@9&s3uHp|db2aP_`oCWeU{E4`oc;jN$8&VSlhD=ICS8{9O z1x~4+-TBzWc4B#LI@Pny#hYS3e&lWK-5+V`Sksl+M(Bq|n?gTU_?bdKHU{*_Qh8C= z<;^EZ9%^s?ubCuh^4q^$1Nj3Ymgcm_!9QalcunX z>mCzdhJ( zylN(cyKkUIUE3_~@JUrHVL{*EkPJ45&{p3|KF> ztACBb35_9pXw!}qwF#h&8 z=&O#%beA6)&EX+ee>n<%O?(=&a_xnC-w0J*Z$E6vcCLl%;z(9Hh4sF;+GuyDPR)c` zFR*vQuiQyaVJEY3G9vH&?>iY$FOm`Y866)I?LfzqtF9SM^G^ho#@U(CM6arI(56h) z^NNCS-O-E3N7$aIRdEA$W90ChZ_%DvRry{90$oR}Y|29GT3j;uJay^>c;GWMnXA71dXduEinR zDL>H+EV*h|Egl^|#v``6lb>h?{Vl4Zvd-4ZI;yOs{Ghmyp&i%fmaRdiwiV@YYUpZBn$ zqqSgtVt}#*A<3Gt-Vdcq{;8^r}+zY+}LL>W?} z+}Wx%DjYfx;0~^=7ZX<1FGdVjAo2SJnsbB9#3LwL^AK|*(@yRifWI`PBKkldrq-Ci zG^WOP8LDRK0qH@U*x9cBGPVtDVUbGPQM1HVhg4pqnP-JNWg<@|(zvh{-v_IH!t2+FSEOzp#OwIC$haVOwRE=~4P$adrh zBoxu>9GS~=Vo5qx2d0PJ-CBs>+f4TwnV5Q}{M{fk++MB`+lbp$lLu^}`~CVl=-#aB zGIVc(R#Xqs^8L^Z&iL?l)X=_TLmcmwrP;efJSx;n+a9c|pD~!1CMuYb1@1ecW$n`e zxDCZk)G0MhQ?3Qx3X_^$l3pf(kH$+>`$mi#;6?|Fb7Sf9awn9EV;!kRsB|5(Z%xW| z=w8Z@A1cmPGScL4Pe$6D67na6HKLtrN^&7x5VHr5&+AI4yO}>b8a6PdwCDkh6L^P5 zMXEc~h!RE5l5o;b38mq;8sJ$K+ZbpR>WuuI=2E)-GgyInO(jMUKeJ9Jnhb_jk5F&b zlp91OMb4pADLziMzD-RWEF2q`R5&6PH>+?IB_g_0+FxjJJ}l)??OORb60rhq{b?MD?TZf+u8BLE62^(m0f^piFGYwU^xQv0YCmKyP3NpI^( z`*X?U>(nj86FvN0Ce(TxK(gM3e74@^a`ZMUg;{TNt_?T~Xos~1R+t5xlSsmG(8ct4 zPz}W0`Sh`JLR* z_%MouxyU9}LEf60;k2ezg?>^M0LT`dV3Q)CaZM=#jQ5g?08Wy;7M%@7rX6^UEsKBA zhd5W|qa(b$y&@H$6&=2oRZ^I!CW0M}xGg7A<_x=n+u+on$iR3z$##hkTLvYa1}Mx9 z1^?r;j}NV+h8k@86zlC5rEZ_F=7BoW(6au}W#}Z$FE%>&7hmEFX;3fd3P6wRie@D- zD#SUaD}agp7n*EtAU0(u>TR$ki!Uv`pT}3gvN)Oi+04Y|| zdbq9tCdoE)t{ZBBpu}V6hBEGsP|U+8DYKYyw#V*4kD;i>P8Ccw5CDzr!eC!v1H@{ z%vTo1i@c#Ad3~w9<+(japdoNCj5xM}MCDhw<*`U>*;elnB*A zLCrRM!g~RVYAbKbNCF zwnq2LD0n*;j=sH{%Tq4DlV3bO0OKkMKT+%xJAxoORE*(|GIe@g;e+Hu8_Id#b-*Al z4m!mXL_l?8rN}h;!+ziDMmhTFx;%N^!{0@?%Q=E83&wKwk?Jdxt^Z1OR{gu?Jz;5o z*u4L}`eq)5E{z{JwPJzQq9fA#>4$W^1ShF~@-Zovr_+cmpoqu&CyvUOckL@rkn_$Es{>rkO0%P}9r+3*OR@)On(nOIE0S{%wg!RF{y z{SLR17TVh`7!cEAQPlK;0r3Un=Hzl`TD`=2K{76UKr1r6M|dB7cYHwvnwmRAdtpTP~@<;SRiirJA`uP&}EGIJcO3fli zI#w1G7zn=b(KT#`C3J{qdh)R*Rk!+>!@7I8pF@bUTIYK#XF;T%P@1_1tf1U0{^-?} zyy&GYGG+T3kNJ2PI&sjMEQm;AGi_cr z7vOrl&Lpr6ClCnXHT;FVOcHNknPqZa?u17sI3DiU2KIE;2xogDEm<&I3P&r@tnmuS z#ds5MNnAC%0<~HpfL|g{^MKbX8m&Cz5^C;OT{gev-#7Df$pfKFLl=OfjU%NTE9c1)sa@I5n}=S}7xN|@og zB(1b2CGNkMViU(C?S*4<{d<_v<{7kBc{VvFf95?nCOfa%F&V;Ot7CGL^ReAfkof(# z;E=S36o;f8lQ<;JosQcv`Dz`Kp!vihnJpmUkZfg#q>qiN89ENhM};CN{!aBGhh#Bv zNG3-V6M`$@(JYztsztro4~<$p$Xzk1>Pj7w{$zS(d^v|ChP7GRlS4AwBe890*b|4O z7h7Sg$w#BOC=bTpCWoXt{D>;h5_Cn3ORmUPa`C>8E$L9m!P*tcdT-R}Ozc@+a^mmt zuGW6?K6WGqYI~N?QVDw&`fkLq^1QZZc|&C@>{;?c=C=Qdm{r3I8BG-vgH}2TQwFU< zwx}>@`88s7CI&6G-qe+T%SZ|$)h175ESZ}YEtgC_PaTs1s5P-@IgL7=NOQWAgJ7$d zuxOEfH7r`wZb!0<+M-4JwXkS)vaKi#Uf5gFrO|7WMN8JJY|*koP*Xz(wy|iTnp}}Z zt2KPTKymJG*P_*GTC{2}UMM?F3x2Zh+YbV3Kiv(Bmei_NShP<2)RBfo3yXSYtYV|5 zl|txm*rN5TeXobNm;s)(WSyqlDT|hTninm|5dz7aA&b^bvS6`3-;g+m?4D7%^am+8 z(jRnXeg14e`PRas^=GnZ%}p#?H7x&F&1~u6i`0_&)0U8jjfq8zug6fD(uv7OwAHTA zQccnpSbK%@OKjqgq++1{WG@%}mqFeJ7`@N9UeG<`wPj0&7~RVdgKNv~Fx0Cb(7U*{ zGBc}!nH>s?RxmN_)@T6YUQ-sW<>>G>KC0TOHAoh%vIC3QnX)_Zo!wPQ5U}a7W)JTU zo-^gz32hA7o>9%9n0D=~c%rv)?P$nashwotS!0t~rcT}_JIh3GqibHNc{!4-Vd#NV zx{d;|;5({S7OqOev7?8LFt6z7*&=P6g)9y#sX1rT-q|-}jh30S_D+LWpuKO0jMCmk zFw)+IOePd_cTB%qx>OINqOPW14&KO{V_PKNoQyKfOb7Pngha7Le6Dmre0JKU!*MnVL?0Pqf#|#}on|^A;h{j>_TCVS!9E_8kI#aaSCmBmx&EB9Q5{Q^(VZ2=p`}0_P=Pvr}h2f^i0vIT%ODK#A0coa1z?CZ*c{TIfM)u&=;COOHZpYt)t6xIdaNGynp}HWsE2S3s zhoQ}Za5l$D1JMf`A<&z_G-ZU})EY<<==K->p@r_}P|%uRSTT{pG-gu@GA3#$z9cYg z(oyU@QhC-<0M`~Bg<7nmu(l6@QyuT6@SEA}9#8(atgR^gCatx?3WbQigle@_Q_0~s zUlLHZdKWi35p?NbV8z-1Pp{;U37#~B)|F-o-it1jQFH-0Q|B{DlS=Xj7GF1CZ`66qodj(%4 zLVPWdEfSkAW&7fvrT%kKqzl;_({FT*}Sj)5mhT^N$tlcx*=tO`bR zC?@A{o}9ubR`q@8!5ryFZ8s3udUP%JIXEoZ8D!Kg+m;Na}pcx zd*wf1)1BSnJLN7s)gJz)27sRKa05c~--N-M%bn7JlZtPH4|-P}b8mK*Dv}c2krH1h zY>O{B1_F<&YCkZZmts%Z2+n{#_h3<4wQf6DYqm2{@DgOu_od%;!^qW5My{M>au!+C zf>AoZq=L4Rkt=6)9H!@taz46+E}pw^4eJj&AWhu5eY8|;v2jHc&}d6)XmluSTsC)f z(7<%e%uWSu71jU39_VT(j&CCC$u(^g7Y8m>JGF$L-Sjw_xRe<{ z#va9;I})8vIUq|DLIso(SaZ-p^F6NNW@Qzd1Um&@XnDl1rmKx{7S$ zdu4ar`x!QKpvbf2PTjmIzpdV-w*{e2wFWfUid_3(T-g$9Z*sa5%Hmo8mjl!djvS^6 z!THl;^|D=`0y(k+ql^gs&pInN2TvH{rTTDI$tjhiCAWNTy5+OcGDzQ1e%;*vkydy4 zlkGd}{i!gsj2;RZ0y(6zD0-FEktp1W5i*W1qTGuQwm8wMQgnOh+p|E*xpr zOUO>6UN_Ekdt>p@_WXzf1)D6ZudGClroJz6)$Wu^%!yoXu5oyaD=)9Qrvr1+Uh?;P zWUHjVCxwihVlc=0KehW_#%zZ_V}2-FJ=X$_(y12YE?K~d`ktzt8K}tP>;I{Bf58M) z0M8xr=^k%|oG7D{?~e<7vRZdch{yxoIPSV*TjiSvz}suPS;)))a+ zS%B4=c8EFd#@p==vmH#O%dI1a(+fxCzLPhMMi3{CGl?D9sT7BU`llD@`Xey#-}(pl zbROmwlZm+PVbYh;OG~5132Z>}1x-YfN}SgM*dnub3wSsHVgz$fVoJ!F#1wo}=ku^9 z%%{+ZSYQQs-G86@L@` zAWI8ro-{*=)6ZymL2dzMqQEk=~nCj4|=o9K1VLa(gVTz>6*;ZyQ zRUF`>At{Wi`qUG(zSXLJh?@h2GLBS4L!*}|+8&vSVdVE<7x9SuGu$MljN^4e0R)B| zcj`D0QycK(yd@Um$ZyRyz~C>v%Y75{D4A@ch0(Z#@c@z-4dWi`>>vcT&M&54%Gbo? zDFa(^_`8>umWbB_#|ohuu?m%fw4j-YF=21J=cJs?tqLNfQuQ?Gbf;D|*JPk*n4ey% zAyPP3ay?Q>-q!HbB4zl^Ij$lsiCx{B#E%C;(F2i+#lCU62w;#Xl%-{$Nms*iG9(s7 z>eVF4GH?p{%p1}Ds276f0!S4 zP(gA^R$m08hVVCyWTZ(8Bp4fz=Z#hH^8n(-mVk)g(=*AW_pANje4-U|pBm8sppIOn zLNH0daRDhae99{~q_>DwOUwiXc_t)1cs!X22TL|*f|yN^t^HcqQm@IDdh@1ADM_X~ z{}5XGhbF~840ZhyYdZh|_v!#g;nexIGKvu}Yr7TJu$25Wd~5CM+%g_Z!+nK?AFf$YHG+L55}hNp+GZTE*41D&SgRs|(m>PeGlS z6z=Co%N^-Q1h;?}Y`kjpbk!vs16)@jCP6sQq(nVEMo+c&*NmJTldTn zaE6Kf)F&B5WH_-xiCi>%$NfzC!uaG8L5vS9E;_b})n+U>Q9iYK*Q&092o*ePcNa!N zySpF-+tQWH-Fur5VzEe*N;nfLVQh5DwtmWOh#{G z@RG^?E2xJRaeHqV3OrUmz4Z#QY#1_|zJXU8%l6AZvQ|{Drx~p9c9fbmrj#BkR@1MoP|K-d##00lMCU>V$+LIXY_)$t<4 z5X!hu(2Qf=Ad~GP+Zv&7GDE8qog>3rgQ`+o?}Tt^TqYj+8bm0SOon5}j->|_HDkx3 z!hgg&o8!eA+j3I8820`Qt+cflDCQEuZ{t$&V#~{L>FIbe?a#S*jJbRM6Y1GcJ=os! zk*?##W*UhsBDKS>3PD*IAV>Z4yl_>Af;bJt($;V>cn|-{R5EQy%BCa%T>GfZnNCqL zSTfm&hpXZ!inHeHtjIX2V zUN~^|a&P!ZFy?qw$_8YAfi0z}wqA-DOV1-<^7~0)(bbFp5wDF=?2h6u`uDevxiG#a z%(#!Al3u*rw?XlHiIV9aob1cy?fYBHT^(tVBF0eW=@6DLYW{Zh;9&8H%udOihD{@k zD-(}7MQJb!3G1Z|kndNk50AvQS@|vZxhiUFkg6tXtD@66ZYy>`b~`n8AY5cjYlSf_ zA7Wr@j~(P_4H(mGf@v7j{G6T+8LXaTAQ}Xm72K8ECb&y2E3_*ZwVT>%O^Z5gOW9;i z>xZ{oAtAX^LP9i&akK+7IAu=j%Y`yAr}^{Lv6CRcAi2v=^+$GGJe77Auj0TE7@uVF z0z*#fB+q=Dr|ccx1Gy<;OwsFAi@8e?W8LY9F$A=iT3Q!LS{J-Y-UIJ}^xWEs5EI0KpP;KaQpYPFZ5%7U9^((KAa31Gw*o9pFTCM06od4$H77A`70^!!-_jv z3cxGQ`{0PNX!*o+%PY|`=ydt6dGi`1jY5@2Gm0H;6w09Sc)((^6Y>|5PxI^jI)tS< zYG56M*C{s`gRhRcR)4MlyqdM($~n(d84_O76)ow4u4qpe zxynYgp?iE>&k*MIRYj-wQp{T7n4Zl)rdAMT6OVh5Pcw(y!s9qH3_$0NbyUEztX+MT zEAnLm<)>70^)kg-k2R>DrZ{W5E_lWTp$oe}A&CWslN!#?x!}O0;CUC^IVpI-1@}(0 zk%6~>Y8at7x1SVHKFwf33+?Jt0#y@49I{67lMN7Ir+|-dUJRUbL1VeF;ey7|sOMb} zAaWfST@WC0!O~_B#V*-pjWpI4>u{SCoL3~DwdE~Qftd+cF{O;()49+Xtf#`4aYcC1I!-VC1w8o@JAsl`1ho`tFsC-V8pR z0@2~rUY1m*ysE*MKsY#qV)V=#6r(4U18Pt`G6dEDOQ7Nji$E1~R|3DNvE~nfyiz^P zRPo_urQ=PiYTAc)S)~K-UDi2#n&5#couiyc=uuWVN(=tKb(I7EUB*lK?-kR)LwQlFX`+J4Mat$rv?-dRyUw^M~!1MlI;doUFhpjFWzn4)ww$nCR!N9TO zPIAHg7pZL&DZxe7Hdt-8WlPQ+ST1t-@61Ho(3@n9soL{Wq_mL7=2j|{jP)M|y_D7h zahL^Rb<9cvnwHcP>zA>Q7A31LdBX3YWz{85x&$?=E_uo&=vj5i(=I{Ls!N`637XbK zA-Mw)Owc_Fy;L5K(N!|ucJ+1HRC6EY2{_MlA%avEDf2Juie|c`FVRS)(nuqHmgE^< z<5$B9g8LnnpsCdVfh@mUlpOpo6kft`fl)k^dM~l4fHdaq>TB}SH8s{JRdaPza8AZ) zgY+p4Cz-EZ@U#mWO8qk~Xejm1x}c%dKj(smQm^C23N-E-n4#2b7)hyrLV)-|UejSd zVWa_+I8qGCW4Z!5>6QX19vy>J=5K-W1=4POl3z-w;U$c8%`-XI2Bt6`VJOq=T7zaW zDEB!yDFb=VwSg&IGpiHM^kmha5eQI!cA64$hH_diDA}C| zhry;ehduruv}=3D_P^xvdkFlApbdG*@q=>Wnf<%WpL|Vlf%t`+sr_y8uJ5BkgORV- zT2MaMXJaQaz9*c)bq8I~0!$JYlyk0+3Wh#>bllsI2`T=I*ju(6*gz8}Siw-klS?oS zNi*do#SX6i5cb8gL#}2Qa8d{f{$(Sd8UAzmm7ae!QWrip4rxMr;9{LP38C5W- z;eqzPT_8%q0OFvq9ObFrJNR;_8Vbj`*7bma__rfOXOh z!y=}S8oq5btaNm`0Zi$5AixP+SfqTum%+{HE^QLcE5^mgHqaPHtpPobSnz>J#3yJX z7L@FSf$0n&PBf8+xg~5Ef@Bbwe6arB-HVBY5~#J#ui+RC=m|@5NAi!%$Q`fy#xSIHOgmKbKQ>P3jzSy%e9CpR1b#Gkl~6#SSCgf9Zcy31aQGRJy!K({fW zbTX|c3hfY|I3~)jaq6MtU5J4cTFMIH$__osA$_S543pzs2^|%~G~OME;^Ap1!d7AK zJ)Jvg%3#DMH~?jEo8EbklF;ZEhsiw%_2F|`YEgpAtK`=3bv%Sz_inym1Kp8wH&ZCE z7S-EH+LOdiQQbW`^{BwpS?;W#$SRvX`i1FqA&t5}03(WJl( z&x|5AKENz-dAKoI58<>U6odH0!6Fk(?-z{fbQ?>ZGWsEzCizj_~}xgIqXE zY!c)`q$nph7)2O;bjZx-IhUnQy5UastjpjhdXE!(m_AM5!<-~2W|;azvHO^M%WBfE zb~!arsehu68T5+jH*ehrB0vF%h`WMBaf;CUq3*`81qx%M0p+PPpi+a#mbyV00mw&V zuqfH2=jY*voDtT-4Q_%n!yoU|$zY4{H4ZR&_jTjNs>^8)IvH%y6TOSOuYUP|8@#*f zd~me8O|}Yn38)>+V5i;*hAa|}P_G##M1&HobXMVH9Cdr7 z`qLk)BSvPcKjP-L!Y9@chZtc(9@eudOi0+5f;u>n7%y}1aAQyIQ#wx)K3JD9PEBwl zObCuR)-iCf5QPb~D)2;1oC{3cVL~eo69RA&fD90ZBPId9a|M{si7Nx0GP4pxLuX|? zR7Hpoqf{jFbcoPwGel^HsU*(+zg9du8}AvL4?!f%wU=b3g%+G!tizyqf5ZsEkuxM7 z3qWj{oFodGQ@VB98Nhh10SH<01PDeAAau9D;8FKD3P{iqD6ITtFgyknBwyw-w8ahr zC%P5tgAUY7K|%u{_u?nkifV&DJh4(RnoFT$;11{eD0J*UfCedatXKU%uNo)tDEZ71 z`f5&4V~4qtPrpgX;e!3!;f6!Va;#MX0&-qJNcdp=H3I=$F#EBLp;ivGOg2$RV;Nvw z%N1ySKv>3*iJuQz1o-myC#E!Sois6OUYhV}=K!CBX@x!_>W9h^ss5!XJ^v7a`A3ci z3Kk*UQZeY3o-1I_B@M~2sX_E9TWb*-BuG z9(73=$8k8-C8ul($Kk~ICCjDWy$h(c}G1xPEWPK(xk4kr+fuGnsU?d39&-Tf;H#aMu-%NRWR{J1FpyFELfmIk+b7z z-K$Z8HMa%<^zGhxTN zK8D2Q^2kWYL()yVpx-lgyu^F85iH_MloRkhvib?m?jgr!YHw?T10(o1<|du)@Z?+9j|RT!{k&bhLX; zN=6gp2G1*(HZCg`Gpx7TEMVH#rzb4YkoLyq1=aZ=6*!VmH}^_ObA-I&5w!s2??jt` zy}4wfAR-D}GEopsF(?Bot!U&l*Gw=hc`@Q7lhY|#R)`9Vba4!ralk2MB4qJk(^L&0 zut+Ia6$`*1N$f8G;o2m`#OEaOm%i3$c*cFAuc<`SKtJxx&^Sanp|Vl zv#s%5f;bbAX__LiN+=p6O?9A$qNfu@GqHL;0gQFqwv@;WDrx?_11{$h0S_!i6G1GHSeB!FWk4sK3A^CdKe4&W~DcJD=olpVKS7zWBhtu9u%AC#&%Bv+`0#g+u$)=4#*+w z0JlAg)|n1)b5W{Hv1DH3dcP=N?uQ+DMNRePxKwZ(rPpw=_Q;7|M(4o! z+>Kq)4f%&1=ayS=8nZpsuv9Cg`ri|&0u?7akAhu*kbb zT>**5h%ok7sVfTlC>7cUaF)6nIFSLJ(M`Hu?8sce6m~{?R4J3%QPjj9%|kna&gftN z(H-rgMPOD@Eqx45+m9WiO8=rQPgT2W@#ts2i${26IE%@#Z|QsL-JfbeTe)eQ8VHJ3 z4L42Ikiz3`k{Xx7IB#S| zG;1Iho9NTnfQ(gzZk488y6`Zy+wP8*$3pXM+7j`kHgdbS(Aitf@#gpyXFlG*uj^fQ4Zk9GdhY`q+M-h+ z>s~SUj?eSlvOaKPkZz?zWOCoc95pb|;GQc8vP(EJ*C)Dc4&{2H%Mp8Ak9Wy* z$#tbWx<=PyoV=mya(8sSu1CA08+3)TW_5+KuGSUGnu~cH-J|Q-?&w~XKi?hQs_U8V z=oal3%%E(bT6`uH6MAJ(fo@7UWsJj(nc>0Qenj=1?~FwrAVPkU2_3{Ufsb{)*clu9 z;&paOUQ3j!9?oRN@?+L;QyCdJ9{$b$v@>Eo|K;DPOm|%KI$37K;< z%es;-NIy4SUh+4m~Amm9JBapa^I^{ z&aIMnId-)pi81H>k%rt!_As0TVjyyF^k&9xb;C;^_KSl*=eoi_>l6ozf5$g>6#uup z?mT*_EAcFY#pv~tTQ4fX@f9;PX49wIR>KdHQvk6wmWSj7&st^1|F@sgf8bUR_iXI+qp!Y zUZT^d;GpH3SzGH0UcIO*cy&%!@an9t;MMcGf>&pB1+P|h1+Sje6}&pBD|m%Z+<1kT z+jxc7+jxZ++<1jo+<1i%$9TndL*vzwuHei`O=*b;C0YCJU z5IMbiUa~V+M0V!7xpysIO~0?MTIiu2nQ6nZ@wznP_rYiQ{9%pB>xUf+9Bmg{ zKk^0{7p0!E2&1QwYDT#m&Tvm#4~_Sw3bi$b3cWRj3JYeuJ=($c99lpfV6M<*dXJ;X z;rs+3C|#t-NdThH4Mh+#t|l56Tt1Eh@N|3Yda`*cc{G zT5X2O!3gb<6ZNFFHO2c<(wTD|eS4t&LPt&*GCXupfVeV=d@4j)?6px#C64iVy_3r< zZj0(GfBY{$J$UD$&9WCEhFP9oIJs6}Z+{<(zA=<78hXFic%LNz?q}X7Y@+!-rLeV& z4Bn=|bW|jYjwYF6(GUCE18>hzY{(>_R((j{ZVxfx|zX+#=IJyGkT zVU|*+_kl=s5?x@lgHGkpVvN_4%6h#gr3|{%BoBVZxZsRaCbZqv(*=iAcGmP zl7#-mxbK@}sKVw143hY4L>)?rDd4?&1dPk#yE~N<7R6PT8e2;u`G)k_G?p_gc0pr`kOKEMvJY z@^2Ua6sffPa51`z>s9>Q%kR6n-oU?W_;(xs?&RMd%HP7jdyvm(=4=fwG1tv9^6}j8 zo6TmhDV~`f>)<`Gh@i*kXW`!QQa&9ZJr6VWcM-u z-l5S109Yt8;XOS~sWJu0x#2t704~2|C>q4uL64Qg?C36;?vW8%p#ZG%E^Q?&?>byA ze`X}-Ep4-Tx*pC~Wl5yV=hfv9?L8r#&)u$5$+;+>mf)}Bv;-YJh;D{aR>>B|d1uR) zskACo?KxMw*mEj5WWs0xIt+;MH(D8Q+WTr5DN~>p@AKxVGZ+G)W}>h{juZbU(!^X$ z+qu;*q@kRRHeqxg1l2POZ9ewq+Qs79Y7hC0%Xz2^8g~Qn=Hv8Q38EQ36V#~r^VFV*MV%k``{ji!oi+i8-0?9!~J zp*>m@Ix^tyqdR6=UH`AZJ~&f-|Hs$JDl@SUF3LWL`c%$HnE&M;eEz5V*g6-TrzmQn z9!!?1r|th0R%Eu;gOyPA6jSxkBqlsN17szf!2&%ikq(p=H5=w9cnG&_qMeXaIrI2< z-fVYMPUyQnBc%ag6LgWf5ob?WO7$`j$-HpmZ#yr{zr6u0~UV%YM1|W?0K?r!n zU_>}qCNR_qJq{KGpKn*cF(((oAI>%%y~UScG0)A>9CR~&^Wmlc@nfQ+g9Qv`u6*-n zz!Z-EZC5Wqk>FhHr-QH9yL5(qqtDMqGU=G^yjl0m0NhJif{)u5`9gF1DUI>zF%c=e zX*q4yUFOAJF?cllvriM{*_#0B6jGmk(p1H+#;!_=?SiFkbQF6?f8)RUM2bn0Vb zFIowT*XoHr`Z+$=^^~a^%FwyI>;kU@$YpFZy!DL!y?y||iWnx=+;J^dwvv4t2J6-95BuobZ zW<=f2KTp4cxv6n;r|H?gyvZ_=!_OH{K^8o&2y}no&|a`{o&#u z(id-iV7W8Jvl;`KYPtclM!6C1dxhg$hM|lI0Sd8?c6F(@cxIjm8Jb6mSPd9`5pr4t zM^pxzwt)@9pOxZFNEE=Bn@7A#U8><7Aa1ogEM@~p1W8SRxY$p89w1FW@Hx)gebJ3% z2!h`97ac8wFjPc3f(6D2|27w5@m|ZPUrO?6O{k+(lbU<8xY=-6o6tQmdw=l-(ui1voQU8g;3OhRftssV zOk%3uidIx_!%$JEFCNfbn=R%>}qwZ06>YjDYyUJGT6&%OPB&O|J`}(P#&YnQJ zK_ROX1}Ar%i=B=M_1PvCR`E6*%;Ebp+Xw~mokr?eiyG^YPLVjJLpENS=;5NTs3A`2 zLP#R5(3AwBU!IelQN%p0hpz!3>*0KDJ)D=VhbtK37Xa&IFBOnln_~<0oZKJraBF?f zT(Z6d0>JPQD~wsq&R6qmKms4NqHc(sY{2#>3|n>g>ON_0Q1cTLx1#FVha!U?$`LV01l)EXAN4wZC0^uj>Un62)?PBF<+^^sY9!!?saZ5`u20Q|CVim2Dm53?l5y#zGim+mHo}RTiS%`ire!`MGTuC3r1fJC?bzgMU8hp3rV5~*YrVV7z>&i#x zX2)>QbGjqO_XVyM`w`Fh=^gN9__NA_c54OKw5zU|+ioFTX}6aoTuHQdg=!F!m^Ikd z*|9Wn>*z-`b@2f6}g_#xB>crBl4XtR)kmJGRQWP_5muAGFx{ z0$JWz98G49IXb~4YmS_7hnZZ_Jw1|6uQ`+IQ#!pz@ktfolC4?)SCL1WlJjgvku@=x z5;V&1#EryH+tnvAiA*&d`9hwVtGXz?p#rjK7`_W~Y%N@4hJ18(s?+R*sKW&|F(c4_V}k7Ygx3x}jc+F6Q3lHKtzasMw+O=jr=-&xP!M}QgJUv!zd zzfF#r=X1@@_9O<4xI7$1oYg9 z%@X4II)4(L-_o+qwZ|(;og!eEF4r4X{+h?8O4mIquWGPhVVH6qt;vU}Ln7MYgy%DU z^L&tfisu6{l?2b1qW}T7OHibXy+?PqT+7$*4 zS3^aEs3;5^ZCN<_nO8gaepDpQylU~NSy7TA!r71_yMR-YB39aVNnv1Su$2ZJH^o8K z_)sWqSh$EbSvq!)3Oc#KLG)&(+e;GW^RkkJ8Wtztry(>XQR90B)h0<~K`g-w5!I3i zt$(c78>CsiWa;!0oREDKCh<5?>q4XCWxw-sqvWW0^3l1;SI1m(Y)&FExHRtY4Us!c z51T9NKZYvexDz9BCV)$8jK#P%N z{n=JfNKx2jrWbag%gGcAouHeBn5_*(mlw0}+orf1HpQ%&WVF1km}Lko2hZ3zu&B`L zTHi^SG%9Bn7sY%QWbmt>*4j}1-bUnD)HS5yIII`dlNOgRA}+P_tVSjB)Ir+BjAh(< z+6B$b1TH8iZ#?UQ0~0g~$tQuqW?I$rgrq7fE>O9)ogh$RAy-LoPhpQ%ZW6@8p3BN^ zut~C8PUu>q{CpDFrxRG(@Y;I4(h zRd_~NedxcXt92&};Ydzq*hqImIoABDFUeveD@@{zKo>KK`T}!jK_vYt?yN)YegJYT z=N@?6XRJpSg1_8I+zb&qyh zCQAo7X+leyRbyR^v*eX^tI2xW>%gpAb*ID>Yt>uHN~*3;Ip z5bM@P4NR}7rCkX?(iN)CqdVr?z4%|NCue3uDO&8J(DbDR_Ny;tpAsnq2&WK~`qh(K zig!@9&{5kIcILAUgUWYD<(>Fnt5ZM)ixZ8DPYMzCVxwvdB(eo9HYzSS03CGi%%jU% zHB#gH4BRjEoA<4Y@t8On(vGL2>#{<&cv*#veiluYtZPgCj*cuw*e#@!@ya)-mEm2P zC}jzd4W*3vV!zNVUaZpYy)Yvr*f!onE6U0rS)0RDLQzuUz_QCKZ}M!Mmx~BelVof?Je5yD|QMt?YqyR`!-GrozVi(WLAxB>`~d=9#~1ZLeKxdkJ|G2da@L5PM=F zx_%nZH)A?HB%9l$zk^3jliwy)uonlI2A+T8s^Bgyznet(4R-F$qK_-biw6@H2-)~5S9Z!w2|iuNe+4&&uP8byVeUvvN33{mD-mJk=tHvuDPT_ z>Dca|@MM?UMxmTXqttOo*z<@(E+fm;uK%p+r2W+w331J4x~~!1s!7HSiQ;i(X1eqK zKGaEe)oIngK@l^>mYeI6neItL265^Z``GZol6)xz<;v&7M;D_ZI2Gw)YX?xAK0Y$D2XyjU8gRWSJGWq&Hh52!Nt<495&=(y`+tAu73~FR^f^!x; zz?L>%&~_u;yv)t6v^uOUbI97wmN_YR%Ua{JWPDyq9+jQpTHcvdGPDG%WU`8>Tz(^6 z6$Gd&+odk*%9gSv)syURHob4L)>T_Adb0ZMsx3FN3NF-lQaBg$orK4gTl3_*moICJ zHBaLcT_e(971KU0>B)BBZ}D--d;bbPF0W_9CcqSJ_4rVC*vMD_U6BS=?gF)TRlN_6 zWVzmZWHi^oe?zbxwojhSaWRF=5vvS8o>#iBdBtt(7!o40c^LMOh)MX*VNVm-n)b9` z-DFS0YSwy|cedKop1o3g8uMuti+KN<^?yOT8kn!Mi3k3FSH)^&Kbwg7sOSj#UD6d? zvG)_Y!z^o@nJ8N1T3dVow6OWuF_hXm5nS{NP|zAdYXqiT^#D9E`PTYjWyVTi*Q%w6 zSUu5od>!6zUVm%~`ODb(*yQBII^oRws^z=gF>QgV|LEI4{O%5GN`zwJwdYEK6 zM)J!n%H%JP1zC$~17Me2kTuqTm*+e4X{ySrs#f^j^Hjtz9HZl*uQ$|zUrV&K9<;>% z!s_3%BdLwZcbIh4@jM;Pi&|EU6-P;fvnZbt_L*Q=I|C+*&#MHDJVuPacNCum`wtdB zi$VW`kB@FswOFQjCwu)47EjHx0k&@LU8uVV{{Nui70VQyONNC$J(5+i5 zGIkt(E@p=G%39;}>OW|S$zb7S=rsv0HyTqc+!L|l3}QwZ%87_YVmgAD9ub^Lkr9bt zm_Y;s0-QcZM@px!q;|es|D>3>X`B zR$->TI7=A|tubt7>SeV;^|I$xsCM?RKxbh9)&nMT%BIkC7ZZulUCd4hY1kqgnorR6 zVS>!`j-+yp6QdWb?^m%eK;OrVa9ZE}Oto6?vTc20&`ofrs7bb;3$pK0j_eC7l|V1_ zl%+kJf!=W%EI*|Y;rYic697@Xwc*wnA?IorL>BC!j+PmDGFEghodHOC}?*~~8@}RITXf4E-Nx`aC$~xK%7g*qkS{AcHP8p4aYj?$tm(U6I2ixXT$O z39b`#yc=96%)D>!Oa=4qItg5)Z_&K}XuzOF?*L$qja04^YRFtCP-3ihFXAC0wrxNX zr$&_@$p?v6{%mqYm0DLT^FDPb>`L&1V6AW7H=>Cu1m3y=Qd1P^Ar13>$1Lz^I~w?9 z-cK49_*R)fNA2OU%92m#c!;EuL{%u5_hqeLW!_KoEExD@-f!+5WTlz+o0|l|yx(b5 z+%)ee)_odRO``PbNNwH+Kv=3U@8f@D9u&e7h_nHJO@E6bk!jx@9dT$e^jKlq&)5X{ z{#-7Kt)TJP`ueCe5;u~OsKjSYs1Kt@`d3!x$y$S4t$)h+8ostI$WaZ_G=FK3<5J>4 z3ezCRlwg1#mD0GDJIB?zYT(>e?IZXmyETfEXB*7cDp@dWCjjpA1KJ5d(Y>SsD8=xq zcLET~*OdWfj9<3^Z=LNMy}S%*Qr5Rg7CoZBO{Tc*$QDEJb2N#a+MDLqV2U*z1CTUb zKSs6~F4y&=lq$2n=qygi|G|U6JKGSUBh>k63wC?2&{J@@RA=}UlYmcu07OxFTq)^D>#-zgIx^>c#h_< z&IZFOEWZkwl0K=)hObGKh2=B&LU!)zgmo;>7Km$IG>(C|4ppn05!ZU`M83UbV0p$W2P(*gm@EZaSNu-e)jOwhMF9$lQ3zmI`OL==bGC78ttmPZ#&EFP_5DR^bml&DC0nQFZ}7}m@DiuK|ew9?4F zt~3_|i@=WJ>O-{8(K@w%wY#tpP+lIweXVUq&FhHt*#*U}ec3kXXa}7Z5{#Z3bnZht z93l_sHt0|YCf z6~HKuB6l_P!AZ2lQZy!e)6_na#WpsWCVhiR0sdxdbcw2#XEU=Nnflb&S86ya(I3eg zruCL-Pudc})7m&ja^3=VZMhn?s9&o^m;q3|dO`82Hmc+fwL(?;p?N-uOgMftRtcIH zxU6YYL>TaBapBn^&pr?%!n9%H5n&`CFyL7N0y8vhP}%{j+LxX$S!G>`wEsV3bxhcW zOsdzEGz((^&l3uEmuN_c<3a(F*EaSYCTS!Z>@H~(LDYA1U^EKGYkaG6{2QrNDh?j{ z5(?qk)ZC07d)?GE6i@0bLM+q9&>m!H`hMPrwZjLcNUW*tv5yzX$P%6KFCvT34#}?6 zg$wC$bJ*Sct2FA6=M{CeZ>rzWA&;07g>AzizE~s{l^~4|u9?dQKap3XtF*pLs+LHL zo`4`N+nTASYPnqr(9OC=R#|S{ao{iLnTB}I`?aoWNpcm>J`j8cwRx6$Sn_hC%I~Cu zM3caFp(+(MuRX`8BVj>?4?~9}wQa69`=aMqR4w7a&#PLJkF=elSxTw&6C+9xG?N)X zWCG9pCg0?Yp0?6{i?&Ov3m%rMBT5UG1`2g z1_I2t%r~)b1zv(L*R3(AB;(r_{T)WIGuHW8kINu21!xn(SwMv@_NIz(nalv?V|7RRx!|I#Ew0w-jFH6%^tyvg2MSq3X$!bkmms`s zG&msObX~%xVv)!-QX|sKa^8a2e8Xo*8bv)@uxE^r5ezNkU{)Ru+ui^o!a&>JMi1TPmzs^6=+$B!*) zNc}pG)VH+=9XiL4DJ6c?n`M4XDm$cpkN|{38L3=9F7N|-Q1zL%&W)3vN&+@;hL<(B zuT3CTXq!-sY(1=cMf}4SJD`r6e098%uo?$d?o1jIdI2Kj)pl&CJi@Pd@=vCdKG=ni z$a9=uTdQ9u_!aYa64Su1E!Ddve)Zxn0g7}cx#^=yix_2+ucXmU=S*NhQ6nX7QRLiy z;vyBs>PkD3Q4Lm4j+lBthpH!s?Fk*Op7_xY45)fCZ)F&8_2dHGHh{z@>N@#QbZ*2Z zC47@-eo|}_V4*V@VAq82zNx|hZ2WVuW+7Q5O?Q9>VhI$rvGrC{8}Vk_Rtxk7!W$Lb z{^|{%Rn*25T&FfhgPeA*Pi>TqhQ!JNe-?v^cyydCuu8$*JR0foL+c!Xm!g4q-DOA>#k7EYappgeiHpsAezX=>>vw^_fPMU&#hRs6AujYY4SgM}mOQ z;Rjl|p+f|zb4!waz(p!8Gm4N(%PHv?i=F2r+yQpFJ7Zp3J;|#|FECzCXgfTqMN2mJ z>huDW<%Fyx4MEplBU{TpX-+x}TH&8P4-BPy>YAq)5Us&+Q*Z||&!1kP;+Zg8Y{HNo z-ydLvv41Arc~&d2IccJYPLhuFLGCs z7irx%aHH%*o}o&1T0e0W>+zC_t565xf`oI4P@5US3AF?gqobE<8DBh4kcE$-Q&9(k z%WtdNH7e=}vl=4m+U+)kI-uC>SjgpN9b2-+>RR3BOefb8SPIy>ivM+->wwk>>~3tE zG`&nB)zCqW&LArk4+j3gC+3lk&+OrjoDxWY-x-+M`*dTyd?75s(`p|Y1n{JKxNmA}g8*)c1n`8F4;#eFae_R|BgT9p8*U9M^v9u$CH*8Nj#t$R%DsqR zQ0^tgLgfej%hBj-;%8ehQKPrb;+puG0c~s8ET&VjJC7QnCLGN>10A^ZW-(A*L!&oz zI?|}}BNg#GqDrAW4UL{UqDIe$p+jPJTWgIT;nFO`Mg*}C+qy<$OvMZIu8y>K?f?TI z|KC{J)^70%o!;WWTzgmIzi0mFDhW0L%eq^I~%qu3Bnd$E|6v&$?`?lLV z*{Bv4DiLKeYM_*=H;G5Jb-7Fcij~?rv67e&n%erL1APr`eNv-Z4<)LF|rH7q$+lCMXL5zcMo*o zw-K|nzVOSoVWl?1`IN9{m8xxl2Hwk`aWQXH)$XrUwfnN?NA(G9wUF2uA0UwG6{@ze zTfxp=$58fYFmbsR&Ib90$Tt+}fDMBPTWtlCb13C^7(yi!M2mvaa`+QRS_f5AN+<+g z%B<_2uA-W0Aa>PsSW(A?T8}mzRa+*98_(uZeC6+cgv1ST+|rC8yd~;;d?rT&+v~rS z?#)hw>E3W0)4ky_D|PRy(ud{W={o_HKJ2+};OWJt*geyNEB$p1Ex6W~Q97%WDqIV; zgS&GLSXywUAq&El7Q6u2j#}^sObQTzolO=3;a(*Nz|l-w{n6{eBpZ+(oFb8oX$d2; zit^TQ-8Xf;kqpy*NgQ6is&rmU_-?ic->0b8ePlCn<%4oj={2ow)ZDg0>D}sKV^^s3 zYVD0Ey(TQ7QEqaL@&)Uh?do1$=S-p0O0|yJhHXRDHBItxgYkbT$P$NzJ<=qRRWVlI zF(qxeJa6H4pihO}=j;h)l;C+xoR1c8c*28Iun^>6`f|8o9h|e==AnlVF~-k6lT7(sy7_@QCi7Osh0#pG;$XrPF{DsuwF28}|2#Qdq7;tW<1-=cWQDj&76snSIo)m}8d z%9ocqTKuW5+oYDdz7C%33StIEi>wT3&`be=36KV@MH)0^ zKx^+#lDX&p-RFMiZ+_?3Kl5zz7Nss5V`59V2J^PGfM(%2&@4Y@Rx2@HOO{!J_cd!_ zTU50qBel?^WKlb67XXs^lM!12H1djSm}c9OR?g6ZLvB!s z&>M!RQXp2I)Iho(i%H%ha>_H4@<9rghVqo(T97K>YshHrx7Q)R( zvXzA@K`u){W_w4_SKB*cA({M&Q>V$V=G;lSnC*fkXM0XlwWQ%(r=yN{va84=_ou=`m7zGC z-J*o-_av=64uKO_YMSUniZZFdBf0F+ahsiV8$HzmZ%mhqoQuCWq}4OYc9V*Pa1za=rT1h8 zExjjKZIh`+#gZ- zLF_*g_{S0FA2F+!iRMP?%*Gl#bd>zuU?V9ic*qG%62a&eVvqZKHKeEsC|0nus%N&D zAjyX%TS-told5dRN7_Pdl9;sO1KBaH--&_K7f}K=Ih!;jEs?keVmA=pj>D-C+9XdQ zE~n-QH{4+@h?FLAxFHGa1d_z9j#}Xy4WxEZG~ha%5Mni(d?3Ja!Qq&~L6nlfwx6(i zw^dybw#kg^atggO66Yk*Y|I+)H=vM4;sAA>c-@rp*j)?kiX-~Qn24<>WOr3iC!j{H z{Xvs`GyojWtaI!MiG4SBxH>;NkHTPd0BqdAAR;uI++*znN#CpNxCqxsi)*``YwT58 zl!gv4j1~S|%!K|ns$}lQqBLkVj3F0kr;^V?XGHYkP9@Ty8R?M*S*|k~(jb%0mUTDo zRGu`6sM@LQlo;QM$B*7Qmb|vPQ`r&vbXL5!*-d>@i6P6KJnU4mDWI-h?oMT5OxH*7 z3U$;4D-o59F&L^b24>jCU~#7w*@a0Bk?iyC{nrr5S|CXf$?W4%kqmo)lg&Uuk)_~X z{zJUZa-x&s#wdhDH4~mZ3;NgWzRF-Ls(~L4`&XDtmxbxRvYPHUcTA}}@idLmqYWez zM8T@|&0*72U6i2p2Dh9$Y#MS=l_7n7xd^?!DHnzK9cOB$f~?1Hlc{iamls-FY(rVM zLCYc@CSp)KhgEimQMu3x$ii$1Q30_@Ie^{{CIa*><=7ETZT7Zbp`+;jr6iv!DfzF6 z5y@T>$;w?$R_^rWQkjLo+dxM|rCb71mCdZ`p5pbCav`;aw=N640oK`ui%ePEgh@Yd zFdFVuxUp8>?2BLLipsvmTF8tht|p_WCN4GKijlJQ5@^Sz_f{KD^3A-mta8au!}4|0^X#Db$6!t0V!fP_Wk)-7;8QK|(bmGlbA+%c)F$ z54kgBvT?;pEPWF9ii`%{fC9CWH}ELTDb}#a8eU^NyRwGOWVcl&gI7v{6wLRiN_qC0 zu|O*o)2;bw!z3bO@J-e!XADz;F*Gx#GoYB&b5+K4#u7C1nc7mYTMTP9nX%SEjMzfu z!=hF!<`+xD8Yw+(gQ}?O8@N6{n-tW@RHuNVP5WS?M8yB z+PAu@B$x=MMk)ymMm91nDoeWHCIVssG{{Yr^YoYlZ`F2eku+0r=3?}z4jZPrjXI}} zL`@A&(sXlPrQEN{NvI+0;;zk!B(4NbWQKaNU>*hIfbHx_fDfGL9Jd~1D+Qm7Oup7v zF(pinI-)~z|M$(D5Tvi3IU(VVBr0E%M`&A;Qxr9eraZ34PGl|-QwM(=-0lUi0vM>* z<96V%?ILz?k3wOS>*gxP#uF>#Ov1Za2`uLR6tu)O;h?WZ9hn=h&arW4xfO3@rtP4Q ztLKqea3giy=+sq*!ZNz6XORX=nG0$bX~Kj*5&<%ex1PpGU80cyoQp<+uyOYS8VP)c zDkFg{+eSd6=X*3NXe$ybXhO19rjU<=ccYnCDcvC6JAjw?I?7}lxXIH>f`VE02*grC zs=ty_7DR|#6YOe;BE}3&n+DnA1X)hJ*+eX=F+pws!>|Or zd!cc<8d#v8P{LbIE{|f(Fl3UEV55*faD0hUBaK6r!$SkF7 z8)lT#b`UH=4{XzAjqK$=B#}laVyO>Kzt6Bd*WDAGTPe!c{SR%z*3* z93l)J>CR&Ks=z?Cb7o@yE{=I-yGwab{0Q@@a{LZd?gIQm>Eqcl$*XncK=)L~HFJ_V z-=NKKWV4;T{^DqU^gW_USU!HM!tpWWbmWPySgjwtZC}LlYOq~QOEu(ed;eh5O^KzN z+m%S|E~d+r6cQ3EH(^{KZbV!l1bDpQ|GRf`EI|vopv7Gqh5jA3NB616o*lod%-MP1 z^NrNYCa~gCnNyX~wxpPTOU8N-R6+sBNC~c1F~{}p@Bf!YZzdzSN*819oBT+^P1?$8 zX&Fog}X>&WNhY-&s3lY{+m%s$<)Z{+}{2lJS6~yaBGY;<*ka6;ZTt`EbE*K*0>* zrf0lc2i?De*3)%c4=}lQ-_&M5${yV=x6|XHahw1@oAA9ZNdSE|m}cukN7Uz~Haxe> zf0Xy13+0yF61k1B$`Yw4)2$RDWRvsOtvq|2lz&nWw8KfC+2JI1(H^tIY0cTrCbW@O zeWT6m8}4w`WQUXn3^pLGo!~o$eAV$rj#Fo>jcrP+Eo@V=O8l50%QHlN5F9{XH?@I| zXd_Y|G5t2^N5hAUKAIhDD^G_J@x_kV7P!mp*VAmT&kHIWl|7x?UK&_fl6sM4rcMY0 z{k6i5wGN*8;8Id1{a?^}bV8&rmhFq`rTfBL01VgxO5&cKvk{i*UM(qTBcB(J604gH zr(Hb&VgH^Yv&r{3g8ROMHT~MIz$l8I$yKz%AsmXj_lu$DrOfnkQZdsT{DPT2PAc|7 zEF%bWd8y5pSlTvUXwx=d1VOnir{vNZCnowx4}Dl1+)%v zP4W^ySVJTjM-~Im?cBL*?Y7tk187lz<3FcmtZP#VMqL{y_-bltUOvNZ_;#7w2Br2| z;D=9}9}3_xEKh#7Ehfk^=cgHiw50Rn?OT)YFxUdt_jIZxwX`G!?DB{>BT8&U>K-+V zvumz2*J@ZKh}lwib<2#y0#gR&tnF*`f&Gr$c$=ZeD3r0!A~MOK0Tq;x36Tt|hYpG@ zF?o5hoxW33u>Hutr!f_ZDcST!&)#A zU_Mt@w8*{FCSn1J{%oTn1NeD^MZOG25u`2{>`3b#Jm&)JBro{_iLlEJ)+=C#tAjF@ zv#um@S^fx6`-Q2S(ah)j*hh%NlB1ddVtAd9Lwp2YJDk>!YXUH~08<2B$&zyHdrDWi zf^gMzYue|Ke&^@e|351naLR)qUtoArjp_dWKL{|}>L~}{k2KTg<#WcUhg2lc9pRR!{usV!JOlBElf`w$;nfDq1LyHj z$vJ+sJ!%?Q^JCm?Xsk56T$s?40Lu`a`!lU#+Wil0D%(0NK>))fkFtRa#E$BQW)Lcl>2ev3h&W>Ws+@In?)8}d~6kAXuR(*1ZN<;5m)@wv}F5Mm5L3=@`6 z3Cp!S!kX@1cO`_Ig(^ zeK;mF;BeWqo7sQZ6r1@Ih_fA3%wVg%3%$XZctT;_6bY@P0^FB00K zJX4M4X$aO+hPkKPa^kRJ4Wtpz&zB6zOyj24PbovBDinoC8f7WxT9z@-jn7~rv8fmXA6&P;8rqAXX~GmzrW+)JFy%xCv@b6lHKJ1y zkQF?Atwp$+&sU6{^_Xd#5}Lv~jVqKcH0TQ;5Jv_tgP`GR?26V`w`9`TWl9ui_Z|lh zd2G2c6h(||!XcpATu~QTeU~EHwkRRlh(&_+0C~2A znnAK7ajmb#lvCKn_7Gc*2$CCMDPK%GAzw5zCGQ}P(={QNJ@%Gtag<;-2)Syj2>9h! z9|-tbwbuk3(5QM5@RM{v;K_XtG0Y$ zut|o=&uY-rOu~^~DiE9mmF-}2=;7^*#=2gZgVh*Hd+0o0TZh@!8Hz#jsyULR=o~1= zUN1;U2gTpnhFpI&_iz5_lOO!Q|KGEp`uEAL;dA0FBOvVaG=83~{=EE+=kU1kW;2jR zvbmV-SpPeQY=o1ei@Q-^oXVl_;%>vqA7Xe;aE>c7y1$B<5plDKJH{>odQN>41Xxp zpd^Sak!2fAO}#a`Tdhnq6H&4N3@oVPFzY3SZK-t|Ie==2YgGj zy-E&f(!_>hZn7v8v6HcHN?U3#gmZCcID&~@dwvNRg7Zo^!bs%Qx|C>=6M)VHPn-S9 zcF@g!MVlLC`tfL~TuSW~s&-P3!42t#CSI^Uj6~Ps#e(ZJH~9g1FR)tw1BS>==ra;0 zZ}Py$D^Q7|L5)w1*-{h0et|7R!lTME)N3#}5c261^ca|42eK!{pq$Z4o6lnW#z0Cn zc$n4?*toa(3F_}adv2ysRu9-wLv@dz_yRm^OE}bHW+3Int}3!8l8&pI^h6z7#%yBt zDvU!sZ-3)d67@&6z5Q$-rW_Y+iI89pA@4@ku^T`_#9ztJ9KotBkXJ(h|0 zVO_1~C4=g}dx(wJoiWS*^UzWWc|TBiEcS15Ll3 zdmq-PMVX(p2x&%((DFb8@HlA7`S(G0I^|)2*uRZuU=4))dPk52l(+;0vB@RwxteX8 z{v(YCh9Fods}hDnv`x6-&&JL_Ps5Q}K1FID#AZmtBI*w$RreYls zF-ci~+Hlr#^x3dQGRcN`Gk)vf_RZyUiHNchxtGpleV)A(I@owLV~=jG9s#*F`_Zl- zG7LIW8*-2r?FqnDPYi7p1a8u4d}0H^PC_1mlMeyXm+=~uE1%Jib4P*hr`Y$l8UCj#6)tm{!{yL~OHN#U@m1F2lXIU9^f_w`9+@ zxZX%o2VFs{XLRLUz~xqPgOQe@D9#O5`#+e=-pr2|(cFve!31~P>`tfQTxWOJa5rst z7;QN1(QaET%GU5F=Vlfj8{Am@+ZvI4(eqye8=n!TldMk~l{PM2>rx)`>rpN>XeoIzY{sP1R?Yq+IP48H{cIh4JVhaTt z@X(>w5FY;~+Qx7UwW2K(n9bCuJ61WDphApD;VyVXoPr90L~besjI~u>#NOI!Y`17G zY%k_M=_b6#j6dt$qdsM)CGF}PH78P6cYPZ>tvA%@`TGqWdYty z=UW9R8k7Zgj-h0s&k*JV<+MxtX}KXv`}J24x)1$}rG(gB=?d7-_LoQM-!xQiSW#Qh z9q^)GU0ba?$jM%Pa0F%zfmoklMhp$cG`dp(nNH`J67^t7SY}kw1p+-=cH9WaBZGGY z5jTe%Rxj~_n(vWv58G=V9`HI3lfs zC|Em;{-{f!@NDu{DKY#wFXJQE%U_bN#MFzX?i;M6Nl)0f%G}UG=MCbZa-#q*Z_V!0 z=jv_)rfR8l`~yI#WQjqly6C--+}+sh zqXe(8__VLP@N|bjo4zhKwb1h3KOCEKWDQL@3R?$vyu(}S{{+ow2x`93=SO6N5FCz} zIZfTh^n*Q9kasc^26Li=$U(>(z&Fy}_|pZ{^c@S#->z20gT7uelsc#_VuBJPBoLvv-W9&uH*~?Ruy89^lSLU3%yCn!^m(7+a{KWWvdK zx$JUQwHG-!z=M=Z@jT2*Vu50PKQ%~L@eKDiYP7W$QfXKP?3c%{LRS{R+iu8oc%(G| z95dM?tpRa+Guh!5%ZKa3G?eXCwK!`TN0LLEJ!zF=2d2kKq+$OlPR1E3yf&U*5YEI~ zgss|BOLb@ykd(ixhvA@t3{R6f)gh3xnlt~83>&3ZsF=0atx#8l#rRtegEEe{8g;Tw zC#RL%JjW$urPf5Dm2dZEOear5S_F^ZTvD7lEe-NA0U8GJRiQN+I^aNAI*4znqr_;o z!$~059vZAbD)1|G+!p6TOTM0p;(Nqct|iTI+UbA?;7N}LcB2ps&3Q1S;ZRKhW{sLy zlr~Azb&b2Y4K>PHza;b2Fy#u%imSRLKNYfHCbzfh8Ck4wF0iQO_)O~M6kF-D@p~vn^8N>0z2-gDU zzawoA(O6YbmF3Z9&*(G4y$qGRsbhwi)`Y1NCq`50e#41d--JlrQJ&?R|LnG;9af7|OM;P&BYw#jn zPquLF;`&4j#~rRGT7wts`gjXRHLk~7_^xq1CLNaRA}(OM9&LG=3CPuqenYM-oCR{l zfwr2&!OL_#-x}Pk_vpTM#0R?YMyHqS%)JPH1eOp5-zFwWh#!}54I+z|MY1OhI;M2I zz^_jA3vH%8LBP61GL&<0qsBtQ)sa5>LNboLa_ML<>-$?eS~7iKG8Tn)gif;TD|-p6 z#-7mms_Q7(lwknziMoFdRr@gAmtg~g6=CycHO}O{_$B?u|NpeEc+sEI6^usH&x)H7 z9&{y**b}xvKNyskJN;TV?{FE+=xOrC|$={KH+=XJ$Y@vN>m zYo5~;AERex!Y}tgbJE25>D;YfFsl8LV9rc>8DJBAA41St1F=!Ir0Z zGO!gYf7GJzTf7SdhT|A8Si9yxV&YQu*)j!Q>Mx(>_9p-AEVsi@!=WW$@;J-2JZiVc zbUSaiY+2Gr{F|u$gx!k_NS8gXUtAZ%Rm)v|F`}&HIco3tSOy)0#XU&7#BQY6jot2u z0K6Y_CtXg>)PnC#ri2{{b5{)e}VNYW+%K*Mm2+f7R&orJa+7nz)t1`#!$#dpOYFGr4 zWKY4?7Fx&%5RWtFdITDo;0|sh!h+sKgrFxOkvde>3C{;2ex{yvL?j)z)T#veS=GmT z0z0zITgRXVvEv92bQ~?Ldg5n_&#(&P$&BQ@5(4uJmQ!{XMNjLQ2Yub=u{SYrzh(00gsUVIA#lH6sU$5J zIc8}syKw%5y)%`hB?i}Xm4qDvbwVv);~h}!r&*|D3zbTuRtVgem%LYt)NKZE6nmbc z=VaO(i1lrZf%_r)HjRP%RzYfk`}S4niiD0{t&&*AZg~8JKn0Jdk0$K~+OTh3T={CHM zi>dRMLfQ)kJ*yRHHH1wm7mV_H_aBA^Uazg2>-bZxA=q`nCiMP61(4;tEQhmL4VPT`~TB0!*a82x8uU(-PkZMa?0ufBD08+$fs6z}f;@i06FN8nD zE=%P_!|NDk3b;ddv+j3<0>>z=_zRu@ce=i5JDd!D7!(Qa>^3KK>BI19ESLfe&V7oq12AJ zX12muI^=-EBJ00|%1Rzd8W)X5gqK_wr#bD*syAF z!dQDRX@h1)}W9>zA6UMoGF7a;qJf&~6r{}3y! zfADw{imadNjFz!xDXWOC7A!Q&7NG~KXWHimBan|Ox$LYxIo^13#-6|uVi_?58M#hF zU&L7sGqsUhEpYELBUgsn;8sYK#;s&ti0sN0?}}ZC#WdIzU-WkZQ6mid0C2*mZq^)k zXGb?W6h>`i=g9^b%IjI&5TFF!8I;)GsiEX^XY*#n8_}QOUa>?LYQE1*3d$^e1*&c0 z3b^Iz-G^irQ}qTk7uZk@we`4@>V4~x=^Zfu?0!sR@U6$4aqE#N&XovRZ#|lfD_Q3A zzXCNK0$dXp*m}%Lmyym@TaQtWT5ddH5-54LexeCJV^R~(nP4R-h!c!)1Kur3qA|6? z>9F+}XBHW!BBE5M+?I`*2`Egj@Qc68 z$^O1+!JN}%K|j1OR7Gl}X}A4LO+W%1qCOeAg2tjo3_%)|K@MPH{0|krg)14$&75ru zgWpZ)u`pD!hE}Z_Ga5ipFdi#F_M3Yb|9hXZGqRh6b$2!vIJ3=eVEe zUYl)hcX%e)BQ6B{1XLTN_3j)heiL<}D@$sf$?hAP+2K8I%0>{3mTWRFML|$v$$FM- ztIQ=ZM8hPChT>qAaEN`>>KizzD6Ll!$0St1UD#k%?`bY&UK#8?my&nxDgsd!c~@LbR3lA*N= zFN?MAmd$*sKakNh+so6oQZi*pYQ}1Ju)$az@-b=0xy;HGL7*~D?<7|MB4qfU8pcBn z@UeDq(P`G8xMgZ+kJJD|mY``|+qkndXA?9NWM+V3#F1H0@(Kgn3bS)z=4KbhImAHo zNsj-Vd`|SJa9f^|ia4_dO0j1$i?Ss6i=q|Ton(Rq@qQ3nk$U)Ub*AuK85C~$)AvnF z^Kzx}5aDFW#K;AXhyt=JM8^*!5pqC)&>)r(?88)efq-6B0f}zmcs?J?KT$(RTEprq z_J+1f504f_ZD(z5npU;rwY6zl^^-?$(}<7~*~K!^3hmisFf)B(618(74`Bk;^ZAy} z>(&nL;09eU&jFV)|E-etSdAaVakA^u&>t|4E5b9GI8pw8D3S^U1Y4~OeMK!Y~S~9a0zWJM7YKHEZ1z5PI-|YSy?s;+K=_p#RF34g6 z53mC(^+Bj+!IIkrK)i;3yo`gEp zU0>o?J+RaKs?JwZ=NAz_Wkzpw-**!Tt!McJHFC7Wc-3B2ht*L+6GVw^y&^u+Fx`zP zQ=Ydcbh&zh-zR10c6_2vp8#W*nT28(lB#Gkc=d>`;FawyfL9Cp4PM!vfYfdM2CvMP z4_-Z`@4+kC^o3Vn(iOZqtt)#Ar*s9cmUIQLp41h*I;ksog^Q};)d^j}D;$C|nT?O@ z3SKR8)mj?TZfR>1+iKV=K$PSmf@U04d66eMSKaq#^xA7UP zuDHoxYFlupe@5Vfc0u&XY1+cf?Oktk@_Q|B->m5z$+N|Tr6OAWq*74-Y#*=x& z%u}QL1jmr`mh((=elF#xQ%;PJyJ0k(~muospda1e7&43T|`h3Svyf_)%3o zhaB^SoC(zv2r^GRUxML3WI>{ukz@f^TZNH5M*23?ia0UK9^*zq;Aa$o9yR1Yqcx0M zbsBf9HVQOr?sEW8?%6jrK{^^J8%7xfI2XQICuY+|x2()BCNN{1GCqV6&DI!Zm|BLA ze216`u_Vw;gkIvHoVqWYL+DFm5h9il^1>`DZR)8kE6#cd6%i{c8kQ9@N|KXBVy=vm z)=PFmt(SRiSuu(LRV$Bvcu7v(#y^H~>V|+BR-J5E0vz*BG@dwi9zyCn_ z?t9CeU1ff@?#0tgA<+ErP5VHR-;G^Ql_OpEAI?;|Kd)ofImVH#n&v;=yw3?y z(WWjI-1!fGPQIZ^?1s;H{J~aC|G^CTsHK`Z1!5{<|6M%basc6}Q_l0V#rwaq+%sy? z_?#Yh=zn&gd~m*d7xTbmv|fKNd1@5og1o4{D?e0L-iV?+-%`&3!Z0)688t<}iuM6C z%>IEPoI=3J8H^I0=$>ut1NsSuw94n`vi+fQKIk1IV;W?$R4{=m6ECP5+0jyBQ$!AUM){ZVq93m=BwA&pZK?w zWiYBPE7ODOu|6mWNhVrJcaRHt-<8jd)N|JqoMT0Az$#fW4l#1u6*Gq=@1MY`ZnE!C zck}&7c-l~JmG8ZmhI=->mX*>P^OiBBwA>MxY&I?5sv4R{T}wVDlVr7^hh2C~`7}MW zKLD0I zhJtBI zCk8Io`JFiK^9+#-UWAQH?-2VWzYgTE?Phy=ulNLPN`s!542cc$qB=IE_Ia@*M0qGE1`VZfRluM?Q@-l#S= zT^qA`gX>XmF-yk-;PPD&Kv)N4%1an^Vvu&2Xk}F3#C|3K4<=L$E+Qeb;3OcxTry<> zu<}b-TCu*!%3Y8h9!vgf9{{OStP2pAI{+YkY6+y!7y~Jc9ea^pOb85)tYCw=~UaNC*PJ0%(BCcOy>;%|!X`(<#m((W0$^nNy3|!54@|q@qTfs!gIVa5v0n~L@1LOd-*P#Sk~QK6rX&ef;Q_9{OiA0 zU~4gj5#lzLG^-j~+U?X7s1FJ3C}iEm8q9mBhGx>2kdL(YKc|WJ#Aec6_5t=AG?ic} zi=Sw?5=IN**9qBb9O|Vh;ZJzs^I~n&Fe{g@`tR{2!-VyW+yP|kB105a65biqwZv@< zOc!s;@J5&FjV6d!CLpn{L?7OtrL8avt+-+tVn!^~Fc(z@c6ZYK+)&0GCeWiCDIi1Y zC7k$;IEagfBqh+(O3RRH_3A(6_p)t&@YM+gsUtgZH&s#!r2l12u?#e#BeDtZm(0%6 zVN|@9mtP`Er+_S9SLO1fOL(4@XSno#voQrh36uWj<8I-f=EEfP@HdtiaGzQh`A%5U z(koR9EKcyY|36XJ69FBO9L6d@1Q!)CF?}UKR5S$?sd6Zb6+>Yp{HWhZKWd;uVhL_h zDt@_8xE^AT0^guiT)Hsc9`Xf~$e6=$;c!$UT}v#c1CIw>9tNqT%%bCtc9EP+C3B}g zz5L}bKJ@Lce&B)LAEuFz4>H&nLrEA)@H#Tg+?(xH-Aw+0=}wyEt#$``mX=@rB9QI& z|1cABrsYTfn4c5+357_@|G31@jrs|1O3P>TbDMrLVQIOfZ#V0wcyoD1Z@1{D2m(l; zxN-7{l#lDhMES4nQplyST;jg}zw#NKWpuswYXIJJ7;oKkrv@Sk>Ud7at=DzGtRr>5 zR(FI|dx?%@BOS@SBcILE+*u+dBJF?9mumlyf(V@Ue=FNSbi*K_v-8AP!R-vLgAC>c z+U_sEM@Z=&qJ*+?!@a{+IdRuc!PAR?t@ z4p#K8qwoBHt{RDE!R&c zRD>nnpV1$RYKb5EZSK#;2a{-nqHl(8*Ce3@nkiz3tRsJ%XX$%czv=+9wGsvNn?5L^ScoV&U=6IpBEl*f1ArbPP2*h8o#i{~t5^#Cb`b z6ZZH;1Al{{Q-qw?9AreeD+rUb{7T`gjs&VBVm`W52kmCjb0Ly0M$IxWN2jl z6&hXbc!XP*F(8Wla7Wa8^%@A}C#gpW|~if#w;CrLkY`N-{( z@)#6V+z!?DG3R!Pb33M*F87y=Xs`Y4!t;M?qpLl5 zdP}woTIa0eX6{hMfbkByyP3P9sD>j{m;ZL}9X`{5O*&gxx0!&1OrpvFk~Nr>$AG_p zlsRa!@?~n!$O|66JoeUf7h4l00eC#I#y%Dp)m~_Jvo(+?NJX?8?rz?%`qhJ7@s2)= zq`k`9WE;3V45Ao5x!6L(a)6Jd4ofIy^a-8j?ls)a*xhXg4Ly4mcRPSf=H1+T0GPae z1SZr5H52wXfkCGNSf2WnV~l}C(3!m@b9l^Dt%&f>s1*ok10ItOaj4>NWxe{xm$Tk~ z%-6;0Y_I-RxLwO6Yoq8%SjqFCHv-Js-yVDZZ;^H`@$K_34RcKyL2r60)V+*lh4`{| zyAMBqpMQ*( zp}$!|sL-#L;#MX%X312-YgF*=P!afYPw0%SWi~ zmTV7qTzs91N8E;_ukp`lEY7ga>VXzOJHeQ?al9$gzr_^J(DZXJP}AD&pux$3mNCo! zYt$8SK^HC3fI#g+Df0{$BLPIhI0CPPkbA)T{_kmmSzQ^8sVWPvVioPqcMK9x)Q1Vyyve zxEhYx)U?}%o{UM>^g~R=TO23|EwU_3a$zj8a|VE^2a>0JlDVl_7Q8he@A3ad2nfao z!G~q1S3=w!BwFUJsri@qdfr5kOMSh-Tl@N#N6>`9Vi0QLiDOBy8rXT>Yv79EY>gxc z>_e%5y$m$6MFF6WICKnl(VQl-m&_>^t~bpcz^C9*tW3QxW^PJD;g{NMo}?_?`JhVz z2I=4P{Wk)6t>}MrFYgZCp5Q0Oug?ADl73ARdM{=Ij)6j|Uy&|M28nz0P|KHJw!hBo zux8P73mr4=iofhYLV!jCq$cnNVv9r<@L=-(6rw9Nvo_EZa;6-Qhl^+1yfj5C)asREPeM( zw`#r)E#gylzNDnl_J9WrLU%la-9ijAxCWOp#ot;|3nq0jMD13#krmjy!37UGM9tbN zGoBue;du)Jej}_YemeM5|R$>zzaibCWd8dBUN!}6EMtdvI>I^y|rT2 zfNZ2xbbF$T^tr60gj?$llBthn8n$a^rf+JIvunNo+Da^?**!4b%aZutqz%RJk)v9uID`ps$Dyt;OgqeVm~$u? z-~L&0$3ZRxARHv-vWX)8apRa#u}OxnX;n6iQK*}@xpa#vCKfdE^HAlmNhg)SCDgAN zlQcvmETs4tfN&3+*RCUj`>sD?vE%^ru;2K*eN%SEGl960pQ`qD3vJ`!*`meY=H#^s z=L;45KY)fD3SC?(Bx21byDSz25fIab42dl%NNolI*0ZCa;NGsy3AY}>k>oZ>_OR<= zB3*%zEzcMVf)odOm19I?fWmF9yOt<~>Q$W^*@fVuiD7-RJ*w|nXq))}d~Sh=ls!h- z8Qg})6!pOUE0P!KtC!f}QxLJ4?B>CQE;9;%U?|$#paxt96hQ;_Ym=pFR7b5-%AB*^ zT-otONe9@+eRaZ42tLUP$F<@@kZ5zat7V0(t>xAs)gP$SzaNo9HOmsCd0R+9C9?Ab z-~wk3V)W+(xS9~-&De~=s+a_ySviSNh1Tf9>9D8BFz0Q0oD@A<^hQrSON@N*B6|It zPxsqw%`n?KJW&UE0BJmete~b_DXv7~%ww``K%c$2&gjoe&(vd3xnIBvR)=#+Y$@JV{~In&i-HoBj-L;WI(wrR4V61j5>k z7w^;oL8{r}#qFFqVvT^e`PN~CrcxH4DF<;dKV@g2QsZq7j{)!j@je z1`TMi@W3vO+cr6=8RU#_8&Ac*+<0mzj<$ltdw-8ZqahuLW+ENX36YN21xZ?B=#UPK zPEI;9_EW@XzmyUdZQ6H~aH`b}>CKGDYIYJw>RcQojZ0iJA27HJnO{eUQC}$gTb8~R zX@s&SfbawzS*}0QhF!aAND*e(Gl&X%Bt=MIQ9Bj*bgGsRz@&!1OcU>N{L2gSu}x)d z{!82KJZZOE05mPXjs3gi*l+}YetkFof(urXP)0|@VWVV(ny24s`FAQk$+y)SqL8M{ z-oF0}yd@S#2QF0Kw&L3_>08S(M~-&}m6rdV%5PSA%~6oTI91x(Hb@;)iBA8~wAmYy z%eH#&&$ImbW-o#w+xr5{qbj4%*@5X+GCrPy=bYD>l>heYDY?EBVv(1BuHHfv)Tsz!N3Xritr5-Mu5YP29m7T3t)F)Yza7{L-wc<_XN0JK#u zV^Ss&?xVrN5MXW)6*fv>0UL#U!rFCG25dqFSK4DeOOO3cFN0K9}A2=l$|lF3;Kq%$vC5 zlRK^8-UGK}Z{q>>JZVu#5yMPL_pyy1WTyT{xd5P(QROeRA4?T@J?{QI1 zD!zZ%`@~%5y~B<2)rY!od~Aq8x0GQM>GLkSFfKJ44v!^?a}9r*=t?ekD!)jpn35|7 z^6UZ5#Qr*QNj&Q8=NS?zx83~%(g=+!OzBQ)?3RyzcS%MnKO{SjM^|<7-eG&XlgKFt znoxE_4j~11l41fY@&r#1>3dx8shu29C}DW`J0nNP*L65i7MS>Gsbg+DR7%I};3Bp- zUaORk@_`gT`yOd}I~1H&K|VV$P^KbSUarnac`3-cCjT#7fn_#CVkr;*4sd%ExRvwA z0OWP$ydKCA3lLn(p+Rzc9xK38;7u#T_WoD$cjMgm(lQ3Oy`?IVH%eI2^w9d&ss!;=RUPd{E8D6PWM`{NbQ&eLS0y@) z5(df8%8shUSSZm2H-;OEO>?h$sMt7n`$LC{&2um3@0Ph4{%)Nc@^{VFL)HA>QkKV`UUH^6d#`hhfp6-I)UD)tG?sw?^;+Q?3;r>76dV1T! zp+kpm1^oo7ZetKW4XHgJZ#=K3VZ1T8iAITf8YUVgdW{nGH1rxJCL1N{X_#!3m}-=$ zr(vp5V!BbHo`&g0i4Bbs^)zexk1T zv8hp_o`y}05}O+(>S@^AD6yqcqMim0F{)bG+9**^!`4QLZH*H3G;C{>*xo3iX?V+& z_|9XmqwYA=fmX*AsG0W0==AO4Ji_ZKK4_Mu~btb~Z{} z*C$aRep*EdSk6LNi{#0`xS^@QBeC~;$>L_Hxls)S7liPnwSZ2-xBbQ4lwDblVH zmjeUw5xUha`bB4$6Ep;)V^demW>7AEA~GB8a?p1~;VNO{lP4(i^72_O&e@$Im5bs~ z#($NSNKx9m{fEWm-4*&+vJwZ)d0jJsc2$$lt%)Fj?c*$9a@W3GTtz2DzO%; z_U5`DYq82sS+mLsU{Vhx;v(_5jXKt1m9pk}D`J&DN(?mg z!)+2WB?BeanN|TVj9}mVzY2K6yR2MVIkzX`+(yypOniW4sO`9L%mgKjJ{`%9B>mF= zckdiXj05>6K)e;M+CoJTkzxmiJu_wr4JGXaQ_rJG3jjuDTr_V|Mc^Dz5?f-X=(tMiE8I%R zSyv$PDL%(XS`m7^3SU`R-ICBmTnTu+3R#gRQ5Rm1SwgQ@VJhA4mINb8vJ^trZ5zoX z^#RNE_1I+fdKHcmKinW6|?f(Y(Z>_jp|tx!H`Okb`5{0}Le8wFyyN(>%?Ms>HBs&1zWJJ|p^hT?U?Vv+)-1*FB4 zvHUVkb&pL)$M(WkN%>j@R8i(WRqZF$RJ(e8Ez>XTlr~($D0Fnt7 zQ+Fq@QUF;Sf}?dq{L6;df#}$?wRyt#>bRFJlb<1?QNcK>8+&?${&E~fd~kl{gZbYL z_)|=m6L+v8r2k1Li^2`WObg#CSEorl8+5zH>eEepOb@5a+uu?C!+Sr0I&+AOMC}3e zixJelhgXZ_(0M^{6-laTh3<;!>G6JovYS{43U&ZYunGG)+JA9})TT$|;&Hh?VAVAP z1Q%Q%lpp#K3|}r0`p(^Blk#B+0Sf7v>(U#n&Je-5zTfgQLzkZ0QUBx&3LX^A2TVPC z5_&wd`Z2F2lm=+U=CLS=R@H-T`VD<*+rQbJ2^QD{;*+ zSXmJ8#s|i1RE+TcjdL@h7}5wr)>_5zE|OKoYtsTPCR9u^63v5p-YCRI%CHwhE@6*% ztzrZ@Zk+3fViHcU%*h1Cp05||bJ2lNXweOw_mtVl#tJ}$@^ z$ycp((-Wj|7^a+b#u+smQi_V3CYE~!qY`*~TQP2`J_qUT;mKZEa>g4TI=&~IVjPRR zf8%U84}C|1e0Zr)E7g{gZE|oon_wkIyp-F!?QN!&e@cpfU-0kb_J+dswzGCHD8vY`ubbu?W+1a zUsZj@{Z((ZQ_M;j*ADnNBP0*daHH~=jI)`CGvp>YLvpu=(RG&!$ZA z2GEL?`;2V-8H*UdKGIBBI@6To4}`y?2{B>#W`12$Jmg3ckR4ta>TP8Yl#hJZ4VW3v zDQj*eW93eiC_Wr3uN4L(%^}rJ!a2vl`fK;2-qD_;R){GjuY(8^9eU~;kqn*(XRs-r z(gUMF%$Eoj1VchacQ3h;>8qEo_zEh-SCFgG%9JUD$HNtmJ9iR# zx<0mX^%!)6ssMw!D;M95deI$Sd^toIe^2DgVVkWG_#YlM+V2=EpNP~80*4w}=Iptpejl7d5S{Dsw zl1P6BrF0r&<#TcLWuV>9MB42fWArZ=N$hr(c#hRX=IfyO2C)UC{$P+TMuKq3!Kq zd$^CbW8YQ)1b}+~aN>>qBi8vfb^qW^Qs@m8a664adgPmNIyKwJnw>6B#b2@TQ;oSF zE1!w4=^_b?s$XKHhg7XbKQym@;bNJ;OBmS(zu1&T*f)p_x^QL=-ME7Z=%TlluN5Da zy>U1p43&!|S}METXbSR5Q8&+ho!S>A@Ca+q#J0){JTG5b9@E6zj;f5NNL8)=ZzG@M z-b>pZTvy=S>|4#Vi)Gj1Ey{9(s9`#t(gkU|*@V~*;#r79CY-@F!Y6D;TG}5GiSn{N zWDgPqD$1lLP|>V5x{-ZMEF~Pz5QxOyn1N2S(J{F=)P4ym>iNPV}MWDqVyVDIej~xTxQ!ISXAqsQUmuUfq9?BUZJkXCTz* z#+XBCj0HhtAV7F!sWhl*9!dc!aFX=D^ZFy^ zn#E=ppC|MyS~^9vXY@>l8RKTp@|iUpvQhyWP4nB~H<8JB8j=)aAWMeo-{6t9bPOm0 zP^O{^zzv>W3c#fegT3H}52n|zk5s>Xp_|`J$(Q5y4cKwEw@8HXhD-|o(LyQ2ICz?w zds-U7ytXOHqd8@tieLtRG?7{ejcCrbzxHU(OMP8MbAE9}r^EPLbQ0`RYj%+#UJh-H zs?}G{K@Cm4iHZIav#FRF4!Qw5>dL{JVKPOaov^P#e?V5fiU6oU$dib0O{3anj^z*1 zDsB<1v$e}O!iX${n4YOGb`hl%K8E)gftYcZ#_XaQH!P)CpI7RzLYxf?C7p2-J8Osx zG!mXIe`s9`jDIiJBd!ibncf&+a- zcF`278Rn%kY$40%kXY!XTm%awT3gd{=q{WLIw0r%g~V`~wFn=>RS>0JUd81+-II`OltS{6mYB)3BKN6eI2>n_Ky(q( z^S)bh>97tgr8_paT$xmOmj!AY-b;81DF&)J6_7QR1_--JD?u}rpy{=hzJS%OD8R)I z(xb8>Mt`ynHqb;97l1jya$FdpP~{RD1T&8SL^g?twcyDd=f?uZfW6%G$Jo3ExS9e= zvp6&blxz|&&7@-QeI|WQeVrselLC|H-*&CSx21q@1);~ET}lujB+?lE9p-lv z{}!6R!N2+D?+Z2lfj)RT8~U&syzg9uJ~^FY@{RCT=wpK4`sj0#rhWkE<4Cj`eQc_P zHZ^e&7{7l+`eI(CM1iaTW>bn;UdVF7@j;gD)xUrsm*RHiw<=sBU_as#`qA9C8n~2+ zRc3txfW;LfIvE~aF*=DR#7PCMUyw;X`vaNOiiNMF2?n!~NoCnb?ei*#!dJ42t238j z8nCGVcEoBiF1xVJYP_JHC+1x%mB+qd(Medy;XMl;imY=JOg0yRMJngLBS!PDDrQBE z4_nhcvrBXm{u_hpp$ZwVvp{!6RTKB)w8G+46v-7ID7HivgS7>mBTs7GT}oJ6NnX-X)|fkrTKc5aj-&KMGXN|A8mk)adQXkh}cjA zmde)vY*FpddUec?R0=zzvp+HHDz;#lPmiSuww*-A9UB884Xe|*rQp-0j81H^MF5d! z?|AhhF#cLoW!GYClF6=ol|Vkx05Wr7>2D37csXgi*FcY3N~-ufhpy5mSI{-^tVH`L zA2x;AABtH2-{wCai>CJjTr_9@V7*1N%v)bHYcIKr>n^!N)z{zGLYr^-G@K#6M~q0C zn-P;wfjGoX$sDaDRP4+-cQLYNB8m|mQ5W`NgmIG2;4|&Me_F^IfYA>}EB`bQG}eL$ zn$e|POG01HAj2S``py|vPx++Uu7}E*<#J_eP%E9{rSt9S(m^4 z{2R-X9z-h7@8p@TjKTs*+4ns^F^PZO5uzrwSEkfWxl;G7H)osOS7H&<6ZsJ88CdhK zvTxYi(O-LcHu5CQdY@jCKS$_dmlhXORQmntq3L##Ew=v0IWa(!mL@s03;|S`mqZc2nD2CMi&fTt zjBj^69R^{GVOUARC2m5l_}YQHN#ne+6nUaUyHTqJq?kq;qR@~_j1eE zfM&(<);hqM>%7D>I!X;lhU`?nSZyA+hI}Z;H3X?+v&qLP6oHSSi_u8hBazqcwZ`_c zsz;;a+C4ebV;Gi+V#SDb4mlP*?~km(D@J7RUjkQk|FiJ=cpPxZ^1vpTOSp`%ocCJ> zX-6hv%aIm1U8TQZKx!{!Cb20}$^#T9xls3*HnO%)zCw0n{8{yL-_*-Z8Jv8%GAf|? z%mOl1&eU==`6}>E-Yk%kM)T&n;$Z3oS|Ah9f8%?Q*~HaBG^|$ z1q5-ZIdPiS9|}-5|BUw7bIx_whKYoXyw>6xR^$C`LDH8c5=Q8XNm_eV+yytXhlgc`<4 zdE}t?u?Z13*jC+^&6B+eq&cFhN%%3YoGr|#KK})u>wBCGgyAVg$W0WpC7@g)7O^iD`^N5__pCxz|uDh7xey3R?Q99viMk&6ST((eaZ~7F|Q~bEJ9>v%rk?Gh0Gum zdT7}}Y>AWGiDQG=m{y#*y#wX?EPntw<^58klGuT}06op$Y0V2kLK8!s_N#M))eLDu zQjsjH+l#P&qG_8P3N(8URP~jz)v3n4)Cio@(rNuFCXG-5RZMslS&AS$wni1i;;M?Vkt%4-OpqcIz>V4%tDPLoi9iC2;kzw$ zHr+KT_)@FKqyMyA58@Z0iDlA6)l)w|xY#7WJbW_7oE!kD*td@wxXy-@IH0DV_-jA| zSi+uX!XdzTr{F3qgfCS=0K&=&Lg~!`+N4R1b>b?}(xHxrq1_y8*cxo-ofh4=@~tpA zk*7s63_n`IgC=M_NEuE=C-+U=V&@D`-hxWBPwPk&#v9cEj)-;E+*wWvzKA2kzNuNO z!RYaNMV-evPJPV~Q8;63+CcCW9gnb)@TgWmuUoS((FfVfPaBoA#Rpm*vk{(F>N8Q( z*h>!lYWDK9_p&A7@IpSho5&wC-w8~t;0W_Ye2k`cYgJ05G9c=0NCd&#SOGlLCW{XI zMm5ovoN2wGSD%|`vBznZ7UC<-g_9d4nW5!KhqdWygo>ySC`NbkI_O25DkI6v(<^dDv`L7x;Gr8kUD%c`kxNx-LqWxDQE zpvJPqp?7rTsT_x2u4nRr{r*y}fc=)zo<u0XF>N0sT+WL6-AmRM5MsdK7_;? zX`JACSQWCf4mj@}^x$UAe?fM4k#ksOI{W)Xgs@j}wzk4n?4&i}s@9ObGtSnYB*H6q z&bB~rVn04$lJjh`-~)n2JC*G^M-p%AI&W(e2SWF#*^3;6Y9l;{Qzsi$J_tjCo-(L; z8x+!NWN%gnQg-|>bV#Hqui2ZSpq-Nq%o^+sfC-Au-h$)9B;8XGAU4+|DZl%tpZU$s z>jsnJT=h`IZKjHV_->k0KJXTf|q*4Gcdit3u_&MzS$*f8k%t+%_z5swfqu)fSgRvs68&4|DZ)i-4|3h z)XI`3759U{n8VTHuz<0B4E3P0x3~}xwV7emsV=Q( zAT$?Th$Kf!l`o9)BtQGwY6OwZ@X^EqU9m7^EgdInCxee!1>v6I(3F-V}oCz zK{a+pjainPSZ^hRTiueup;K%WLZ__A!GVv^PRBjnsPYS;%G04rier%=4$)iJLL-?C zt(v4}lH0saO0%`5-b5ud-G`KW5NcrBFq3H_t`%I6nE@brssT}D01e+YnBxnJ|Bv^z zk*v?$z`XSleG4Qu_Rn9}?V%~kggT>BOO26#E{uFhBL{z1!Hf4U zm#n5XW>HxoyE;Tdo=eV=tW(c(=0L&e1kP2 zy2MNw0@OcQ7A9{Lo^vd%HNdx~Vtz6-a>5z`i-gaR+KM&vNSYOo0*Z5tEw_&1oSzPx z=K)>pu`nhIJamOlkpyCH4q%G>=;I%@67^B%tGnNot5K)VbnBrgqSf? zL;PzImQ4FSLd&tukA!JC6510YY3-PHh+6_b1-azfa&wQN6L~7iIHGQfvs%(4WR6D7 zAEIVotcO)MeYKh+TkfbHd%~bY1)+ap7Fo@jjh8i8v#kPVikM&l&{?yB7-7F!);PT3 zHd8(owMrCD;!uq{ON$&c?!4kPU6IZh8MG=QJt}#cf;^*%Vc7(2(e&GD z?}Hhj*mD;}e(LUnQyqL!1L~b83}gFTGB?rxCTnzeeu3KGg7*)%=hGqn$g$2}8g4Ik zyj5??a|+$)(;$tUOPP52ba4L{sWrlnw7gxu{h|h~@{3?MZ~vUUjfvFUS0sOyzdAk5 zgw7^lHP!gcD;B-QC{0&$c&{zQ7?U|mCn6*MCd6K~owd#c;XmGGzwV-z^mPc^yS6#f!>uAMc&)AyM*fHBN^44?);=U<&X$eng?F6PX|Tsq*$ zPvlAijZ?Spq(0Zn>Xo1YokiwBs|(8tFhO}-jxk6{jj^Ge z*+$r{hiCpj?#>0kuBy8G=W*}cJ9B4}8we1RK+ar20^~7yPBOf50to~VkcaqACdo}Q znaNBtk3g)#1R|oMqVieVT8k}Jd{nXZt7uW9Ma7DWEec=NiWXbiT8)ZIE1K{3UwfZB z_s&d01ogAuz|B7U?AO|Buf5jVYwf*{$6LnOzv6MHH6{Z&Eva$zHm;y^{PTV*<5>9v z)~j?sub7bcW6br;{8L!eG8Uo1*sltION*_0fF^_Eqh?q}9J&r6*PhX0>+ZTLKg32> z$Jy_;PW=`aTi?F_&2KFnVzHH_{mv}5zAg#$TUu;A$1NM4quC(&8P~J@-@V0_N6oLc z*y7^g8jpJ?^VHGc9i9fq)Vy)lvzFRoYmP(GoZ4dRMEBxEVePIu3V)BEG}=0!U`++iQFjDeVA&O*uWZFlG~~`8(u3t6yt5 z&xPqFd~~B$<(^FcyjGld6&2PT9@GFXOlhasuhrp^3v!3^c(6$4KItG>{iDD8;*CH1 z;@3a=-Qf9?yFGG2bU43%*Ak@yMMYW{czV3N;SilQHmZZh9V)e^YXT_u~XNQ0R_hN#6T0 z+a=*MfyvdGM1NPjA5zy3?fu|JlNtlVSuD+Qr;|al;^efY%G~+|w@OcngR&0I5BLB| zrfoX0IJXh2YulV}f2y5voiz*RD<+GqNW$wNj7~g}HiS@jP6$`hY_;0(W|m_syj{~a z6PgmEA#BKV{De|7>PjKYtkki7AHg&;N!9EYp7YC%9mx#i?3pcQc(O%_UlM3hV*AX@ zJ;*vBl{hS|!2>3nri%exDLHBl(>aOP3=YcO>b6YPtr^_@k;5$+5GVI{f3AhEE)1TUF*h+v`p-2EtGb-?2CLjO8CFu@6y1tN|9yqv>q3E zn^`(tm#>oP8@7Ryhex%2TQGyU1A-A)zo!svJ+3Bi259RHp*pkrW}Ro^nx;pTdMF^( z0d1IR1Trk&Cm@65Sa+_HYxFft+}^KY!U7`KJ%giTFu4>v6T6}`OhM+`rKe@C(Juot z8Scn6+yiAqIPT+X4>Y?iv3%%>Z*(>K3&!YBPj+@vTZ~%WuKPlqOOx@T}f>C?iA$eO&)Z#?rlalPqVkSQnhg-@wG3_sOM=ZUxH@R z@x5n!oy(56PMGYtI*qkO=^eE?-DyRbhT|zUj-isePp@=t-B$|H5;ce6knN1I?dKnV zk{1G!z$3^J*z^iYpA6lNDBO!Dj=0L5tfd-vJh67j*gj6}LCj7>XJ7gizaxnW$6T%3 zLt}TNc(UcJy)T^|L7BXCZTAcyB6|d>_I`WNIgMk?Qw%?{lSQSE<{eAt9-3#&(mnfY z#X9i7XZQ1kr1bCLy{SIA0r7r=SLMHr@AWywe(UP|6Xk44-}e~; zodTrJeYypmI>l7$a=t}5+a}E^R!L5O@d;0w6oTVBs&;DnLj`^ap3?Izs>^plFUt2t z+6xgSj@PT`Bg!{9VB%?YIlri!rAYx3r>e{ODdjAtZX-owXT^VfPBG`PE_}e1`D+E_ z5fuqR6Pu$8VkwhWa+^xGrgt1kCE^mk65-(~jdrnNDECo~21s+iF6X1l+1ilvd%RLk z&FH$E_bBI44LKilImyT1F@NWv$}rP3+5Ft4yd4&0S2!OP{qorL2sSr0JN>m;t|YFd zkdO1QiyY;P&(Gkj#IJnK zjOF$2STd81qFOiEq@;1ryjd+h^14K=u z9d-0{(>{Otprqv7w9-0Vg!D}xJzk%ljM7i}=xlv;GD_d&qqAD4Df${8ouh9;M(MY| z?5cXM`XoWSJf;n!lLw{TGW(@SNrIf-KTxi&ws(? zKGPB7tv_fE1uM)eL|`S-SFv~s+T(atdK9ghD>iNByjFVLMQNCDQQuof zM{~Qdg6MRKz}jBP0I@ra(ql@9($c4+FzzYAo<@KxP3%j=+KC3^bZ=ZCZOZW9@}nNZ zldn!G?v-lg8bLYn>)>O9jG?1x3>~nDiLhYQnSl8TFAP2)2NrhRyE|9}XX*1H2mYf~ z*?+%n?1_CD_H=sc$gr37U_u{X5f-mcu@s~a{n7rwo$@S-J&O?XLM;~y+X+rSp$4w) zyoVba`$k2R*?Hy%;{P^wm^?J#T&Www)?|Tz45&BXt~;~^u132>Sp3u&78@`a*XS?j z>Cb+UT2rSwiQDDh^6s*W*K&E#w{f6*^$+5*y>G&JSPaiN3KoTiZd5tL5B*cg;Kiru_3P;8QB0YeN58h43$OvGoVA!K;`vJ-YyF z8{!`0ml+!|lx?R6v16FrjVblt1UvjqFXh`Lm~NFoorK)tZnwy_Kuv64Nx&^{^33Nk z2z+;&eRrWi+e8h1^$izp>`^^PCSWZvbml&70dpx|_~Xr|_ze4V1N$o-@-Iur>}S{M z#fTW)hgM*J4^8kXM6o~4F`my(AP_p8eW_51eJnhsF=m7svbGsDc66rS&Z3vL9ZU4# zpcg202LPQ0G67!SM;4)db?+yAbeTiaBA*@;=BDPQ9Y|S9A_h>ZRQdC! zJr&zgj!DQ>nBuOhMyXtIhSY!h5-Fb+r&2KlTbUd|iPpLja$`O%RB20H3Dk=tDA86| z0uAH{N;KD%fV-5S!D-OoA&`(`22-hFkK^@?h(lCDB+!)n0U3oV%hU)CQ;#qY@?~V*rU7@kM zf>meNQxsI4m`YaNjNOi=%_)^tS4Y*Vu7RpUPt^rMXZ@5NUy7@2=UnXH%I%8|xZE%s zD*?u~hIz85$moH1S2}vP9m^vlUo53Fqj!IjCBW#d_g=qF$85Pf$Hsy#Gcc-;Z0YDd zF&7l4`o^bRaqi{8k7(|SqcFL6%W)0}fRh+1aqxqDCn-v&+U|)_&S=_eQb##8>aw&9 z4{~!PH%bc#uKpbzy^lF;kkEu;YX^0^2$6FDAsp-qj<#5nu9|l*jh%6~W6j3i%qd7vrAy`Sor99T`_jn^AAEQ#{71gu?HOjy2ti^@6;yPgDGzqj6#9%DJyIm- zfOH9-a9~Ks;feV!ZC4AS!)73rd^sd6IVB|J6>@h!>ROvy9-`atRJXNKx0rq1Olfa# zNVAxwVI`tQ1c(%WM5&f6rZ;8|jaUv11gsKAS%7G@gMaD^w!-3x7c&UBweDsuPjt=Z zjhm8kQOg)x#(a8|u8chpaJ%jNAg+~hd2-wJK`B#5>s1TD*1f<} zW^s2?A>UM(FGc!x0a|_s3e$3ja6IhkqGs0WtHN zXyHd=E%2oXTf{@hiPKd^u}W%2BNt))Y>lW%={AdHQmz##_Zz~%PYk|aX;?bMZ=PL= zd^%Ov<+QAWl{_8R!O8)aqq*H_2g=E>)-rsmV~~G3QG#cwuuX^~KxM*G-RCyl5v@x@ zRzE~jEr#A?N)w+70MI(sWs1G1)3e%ATOrq1QOjf6&x9)4(wI-dbBT*X5%-fzwxCl< zq2XOoN(iCY90C9xAaCjnIks~(nM4ixzcW4@63aE|B-GTT6MWN)6>}s!a~bzd(N}3y zc6kHY332WhZxoc7DM%|mFQ@JDCT|(agrzh=S8$Bgvw#N$Dp>1E?7Jc{=%s822GMjB zb123D+X-XOwiCvR6%#1SX;q^-%369djB>SG1asVOhT&7ni;+cn`|3b9?B*1(xuiD=A)tYLX zPERd%2R&aW+woYNkzWUdC_7Yf9q*#^EykHb=9h_>3UGxc+#hR;B!>#F_u9y4r9z`gG;)c z?y={e+2(`NS^*A|KNX8nlStau6809Q((R5?OvTK_b}U(-$BO>Z6PS@J@dQJZTzF&+ z(ntP7I(^L@ah0F`80T1P2vksFUun?P#UEz-3G8qrYb6x~b%JbsO;bxOvy@vicfY?- z852W;XWqc#GR~O0I7403k7^w-lHA|@p8|`yEQjYaN-SRym?nuRwNE(E3$tK?pH_T5GWSqp$gg*S_^nzWXC_tJUxM z<}bgx|6jiKl?SkDvp4egPYK2~rFJ+M1nYh1?u&|+qJ^jy>!p8)pm0Y;kYa7@r0_vf z&i-M@ZdDX@4_J80j52K&t5^3V&ct{e9cbdSL@iIXm+dGp#4_HfISA7idz7(+`kk^; z-@w$Yfvm+T_M%=ru@`k_Aolp!NYsH@E9CVRwNR(>n7$H1dBTkc-vk!Gf+zM|N^%Hz z53+Wukl;S5!o=5LX>6o(q(SM$pdFmLokM`9YK=_gK?up^K2&1`h!<;d_jx7+vm{gc ze&#q&I8yHtWg8cJYh34*q--MAzuk3qIr79z>!kv7*c9HTEBf`iZQF*$6ac zBY>cFBY<4V5UCM}Yy?Ol5Lz`fCs?p~LCQ^7-Wc51 zL>W+mLNfK*UFk#r3ly|-VV(mQdw13;1P@u_-NTiDgU>i_VF~6;gFvyW3!8i}3JJ*W zm~W^Sh!3;B+b|=JZdF&z4n%Zpr#&;k8ewW&m&DiXG76PND;_St8c-oKZrv!AqE!aL zoL!Y*xcmz`odm~f#0=?AU5Zyx|a2iwjhB za1Td4%EZ_w#TW#b;f%>nCWkZf8_KfYGH!zsb_MM_DY$En{RspvMHZkCy4b3Xg&k$F z@p9@_?6AVwRkfw5|I8|rcoqv{w!?(Lx0}}}2>RGP>!YUf!EhLY2-@)IIlvXu-Oc^dNnI$0UEf1=r zHfL}MiEsFMS_z&<9&waQIp9lWHlZ*9FrgsCY)YBU)sc(7Zt)r_hVwXsLtOrmztX5S zuUMco&;~Sa^GWKVrqg)Zh-^>NINCrX%4kC)$4tpaPE$pjbD1jj|JC;jOGNs(o7)w7 zC#RN^j1oakG>*wH)Df60^SQixRnQ)Cb(siK0aT5c)NMxBudM{LBwq9uUNf918YCr+ zIoI@x6mV437)q4kPPpZ3*}x-SV@rz+`H-51!QN?_iw#7M;BA|#jfKl&E)zFHfDO1H zPDTN$)D-rGFa-lnvAs2YLX(B(T&2aH0TO{q!SqQrsDA`EwWy|x)Dwrv^ngnO-1}f| z?LoW>xNgNtqYvFvsA#NL(qhyppAac^6uCbnFI#j_eq#h71?4yKMS9yRWRoJRx5B4p zwG)DxFbRbhAMiCx5yOc206zs(GG#lvV?d(5o z)9_76+LEcJU1Z8YO&zN#1FW_*MtnU(b)p-ZVy7nH#X8z&b$@Ah(C zmNse4FmY+Py8Oy$twvQDXM`8Jg=m4cjGhpKriBPib%?1Iu&L--1U(Lfq1t??Xh_>* zN4T0G6>So8Z5!EYPfr8cvWj=e&XhOsOeP~C^>|XURe!|Vfl!<^Ya&Ct1U418jxjX8 zV~w1WD#VTLS{=uOy*#W(i5RTM2R>u5J0o}v5*HiMd8k(kxHt(fpx!JyE6CiK&NN;c zN@ot$P+$AVJ+LuN_onsD6D0>RVn-UM-V8iWxHLGTYQSb zTDChBxy`32tYv$9eac;m=#8qrvp#aSB6_2g_t!`6QABT)^5Oc(ens>~DfiY#?pH)_ zlyYBvgS+(a>QJV1_%HHz2$8WY+EG^h(Xcdu#LY6Hs#>+)5;N7w}Z(A*7^x-;qEgUD4i&}bkxfqrA%A%h& zNF&jzOll-{yD)d~*Wh&m!Y06Dq6GazPo(sj@+5@32B_WmyLqd85>4asc@b2PjWNaF z+DTO&3`EihShImckeZ<&@~VNXkyKsDNiw>{rci(sawtGXJPisQ&|t8xpX!(mMM*=D zX(RORM|^9S7n3Su=$|A>j@g|;4RVZOv_(3rI)>JXEJ#8yvI2I2w3yPpI(Z>AV}^G~ z28y(rEg8)~=BVjl+qyi<_16|!&iE;Xo!Tj&0l{poy48Q4P|9&O&T7xatJuV-)w-7F zWJl3JpH_`5#c|?TGf`GKia!eyh62j4eM$rd)9jkns-nWedW_zW`xCEO!sjPY&NZR+ zJy$_sY8p`{q6~N0iXJ@;cxM|uI(nCLgI8tSKxaMRyp8JO$d-C9NLlMs6%pYOa9ncf z&mx-m@JEf>u`i0MFpwHqPeTpF19nK80TwZUXvDw^N~Z3*AS%U4MN1pP*6VGBVy$JX z+9t>XlAsB>``}CTN@QjfVRMWVL!9!^RyI+OATnKxHwWj~KelF0ilw&|jD|62S7_1< zM&gs9kQl8xB%fq;!G=!3Jb_ON9xW2a_#~r5-J%P}Csp`2$0vb0%s8cM5{h=+sd3BD zmL&CDL=43SqEVgZXroOGi1x7DvM%3vZplJk^1zI75Fcm*!i+V_@M}}P#v0{j(O^3e zGu8+YPsj^m@m{Dx)-DmU>|$iI9ZAu4R5DlKl5|)LBlTd9na(&GLaCX`}8^7&1JpDkKzmp*MlNvVr1-xMqm*?3fcgzn0n6|j6bI{r+A&oS{^tSKs2R7aDY^)>nAH28f=g~@tOHQmsPxE+6 z2r-o0OR?+|hvuyPdvRo%#UB`)6llt%`)OL;hZ!F%(3|qVYY#ywz1zQ6mO6Xrl_LQn8Ac^XKg#rdiBZP<=>VSSetj6TAb+DRLjNqE)v`{VNbrE7*%+je;yu(djj=_;BtDW{ao6zgvgE^y3!7Bp4K}g#+ zK;@W1#AyhygAAceO4z%rG*#&0LWF>L&^uUaaSutbt8^5P>G4Y5-OImo*3KeT@<5g< zww5HY$Xps>oZMYY;QK2jpMZb2bPCU|1YXc^FqJRPNYw1$s>!T-r4yBp)xjZ>TkDcb z+O0)iXMI#>jNs|Arm(8K4o9gqG9gdFif%8tu-8Ix>%-pC@!HNu2g?;H$|0k|1ZReo zeE(W;=8iq?HXM*_J=|XUNMuJXc+n16dhBe{K4!;wQG{0k%Vav;#I(n zc6N{xQ5|U~O|p+T$3Eg&SQg=?BAQ+)e!R@>rsiBam4PTdIsC$$Vr=s5S|0b%KwoE<^Bo71NZwHjp}Tf z(y!ja+-x?U4m+O)uBCyo&9O~6y8;Er7HE;_1(Rx?h;(89px%Or2E9Pn8nZrKoA! z`NJUs0ug}C6on_v;djM>D!!v9f1n}Ej zM-gjpqK#Du7T6t|L84VUx{_ng66CYZ8E#pN2$@kS_zuE8v;regF*~W1{=z|_!&`@92}SQ%j(r&`m2V`-#$x6}lex$9FHgc$}*U%OTF zEzCyHHKPhO{H3?#yxk&b58U9x08roR_tM2uNia(Iy>!wHvYl;h*!^r<+I}4n)X|Ad z3unmbD)tX*MY`pzRtDPyjg%}U<1vE6bFC5oHQ{oMCfpCx1c5+9T38E_W*cL3X4V@< zM>K9qlP>>PJ;b;f<~r#*_Elcm(F}pY+^p4kK7py-;esI=yX?kPLU31iJ}+m=pP+U7 zu&oESDyMpua1*xz*5hYthMx>!Q|v{2=?D&3n#+EJt8v=wK?nO`bjL0oA~bMue(2MYt{`x$}s1kNqI zjyI?o6;6Z(0wvY$rw%$W+R+(bK%EYw9M1-&st<(5YU^+)#V8u5pwuI@tOJy~qQPW_ z0Jfvb2JTpIt@bn7beafYbAh_c_f&{gB-pyt$g z#n{OJ2A!!J!~U5(8hYkQ#0YEs;m#9hB;7zJMlfpSKp>|7pD_o0p=;J&tU4U+82xa( z-dJKx*N{m?;Z7R4mi&A{if3JWQP_o?7R40Y1s!o>SN0atGi3*CN}nWm%omJOEUXNd zBoROs1u|jThckSb_;9WdJAAmpLU#1JKT|MPN#Eo?0rvblMf1#FopE)0^>wT~YYvN~ zXo^krW|Kw!7&>J$0ScsV%w}T@VX^_&UNUp+M!MMaSZ)2wVbcX|upN;P=LeA*$S#OK z=MMQImRJZQHrTGlrm5Huf?jJ#RHNFEw#9Iv`#I*puxbXQR=K4aY(Un0Q#>TkZOe6S zSdf>wiSgmSV&dLNnWzJ=_?hqD)Z z+(5!1Oz;W2%m5(<+LdvMX7q#^%s+8lL$W^aUK9wG3g#_^=HFM6TV zYzZN_jZEl1tCqj_-%sDNHEE6iI$OTw=g*?$R~NXcOB2&Zm5q+!`Fbjg<=QbXLW1mv_^35s?rf%4m}1RTipw-UsNaHovdZY7|M-AZ6( z^ff)ZHbtv627yzv2->)pz3WuwZW(Z!9}RLkAh^Y7X=1}V-5#@Zo!$4(`2bd}6I$^Q z3Uc2qK{lvsT)3JxN&vlQ!&ZAd^sp>(jx;N-P_cVtX{Qr6S08w@Ofu zk2MN65n##Ekm&SG8n2xN*doDRajrsyF;pxEk=Ynixw_n#sv@Kl%`esR)%0rX2*I1La z!CG>vJ`ZVaTRmc%et|6xOmTrVF3Aqf!pvE&I&B|WBq2wgFg(xOoH+5kjU;i#*#smT zUqg0FhCo-(o}2A|Haz8Ibx$fbemWLNx3N@`Sb}Uv{bTu0BQC*Df@Q))`72TB6S5P6 z0NDZkf?Y&mriuzAZkDDfO?2a0trS~abTrmRnNf-uB`M9`Y?vAAbpOCC^r(8fA!-)T z$aLtGIm~|miq%k}c+5;lU3F$cnv*(ph~_$}(BF3O>uOD81ORm=%yCg&xrCmQ1f~DV zg)LsMb_B#dHwYT@tc>Pl5{gAex^~COM-fk}Bc7taufps$En4k)JwkgXmdC$FNsViHn6tllo${lWXl{WcG&BCZ#;W7@u7VQ~qt%lENl$`6#BN^lg!;%?> zTB+vv*z$gVi0e&Ku$8F>O~aWKtQH$T{%IIO+LmoMRiB)WKjLOCtP7I*ZAnI;U^;?N@Ur|&i~AZ&9W5A zZk7hTExMS+O!_cas9D^ z+UrZ(P?p(bj=W`F71Bq=`fNFuvdiCYf}uOABj*%`oNi18HLiq%fN}?*ntT`pf!1Bc zbSnH06@~2!%>q@IE_1Vru9o9%$GWy=U9_A}-*o+jZ7n({kWV-4O7FP-d=lU{c^)s} zgZ0u_sBDfa)~d}8MVv@!KMIRg%au%dDFT*PZ-}m==No-YE$q(po~+4lX%0 z!;0pZe4zpFB)+vfBjLKgz;{Thm92CAz}k(mLOXGFLRC^uRccWp1%LtsrPss}*DK3O zf&)YT+R&6ggsdDG1bJ!ZOtT71Vg^*~d^6%0sW~Bj%&IhLo|Q%^)I2L8AyaVJZ%-~d zjeTSM+w|kkOVE%2FLT;az~#N-(9Mz=swDlMvXefpo*C^%Xy)(8*ZdtE+4cSo+`Hc2 z!J8s??GcpQp|GS0l~Dc;p1i*!uj2z9yeP@v0V|hqQw2~0DdK~4rTka$AA9M$;9f}0 z!@^-*hbxk!&K1IQ<_git4d?dY=z!cF5VyHKxTww!t7B#`Ia@DAo&FX`9>Z3h{#L(l z+y0S6CoDGZK)0%^P%3 zop=duvUuX|xiB@6*L7#*@gcjmDh&-z2P#J&1RimvE1w36X9U3OLWf&N;f$%NC}yc* z&8N9mx4GaXzxvPDE{n)x1WbRb*}`b;H(Wy)!ZlkH4A)DIPCCG_2uF4-S)m>67)=>% znDYFQeC-BiW?Pb9y?1nU^p4Qc8WVGNt!7PA!3D5b$(#+uS~UeI2QdqM5HkUX3Zv^K zhOp(?%9;~_>@+p*fOKwR#mpN>D=muS#_fUQ^6p=$8j@6*|(CG~0lT0WXENYwfg! z@+UCE(fU<;0;X~8VCDdVh;Q>r^OjPlEbT>*5=fQ_)1d>EQo>k*>CCM{7&kJo!Bs*? zyI7lrZPS(_$1nPcQu)yfMQHLVi>V~Ot;O7s}CN$@t5!Vr*BVtA%Fy{4}R+5 zg)cxc#Puy~^PpV@^6CIlUZ?YOy}%N%hS+DtMk`~_*S)GzT>V%uT50BAuEYw5(@*>i z4G2$*{48BfaUr7{uA> zodoXESi=|!ipQAX7Pbf}0V*F0`f*=OQZ3f5UeE=m`VRx5Er@_KPC*$NCkGLRKofm9 zCQ!KUd`(+yH2=TSUtuR!W+N zgtSMZPgcg%FWaI}pRq%hfYKv*eWBp=R0cY+<{2`5?yBTxwTsbk^b@mG(&E%8X1caV z^8#_I=4n#KHajL^j(fDKUG2@5fwigo(tty(S=dm5?GjtWSk1b|leez%U|0&K8#cq>WAyN`O4u1f_mmA?pIhK9TN8{6tC(bl$s8mNOvzcpDzIJ0w&76X zJW=`MTrdJjE4vke5xGTS#f)?ux!T2b9~{($61dqRl(LziDRWfTS?Pq}DNz`iR(!Z- za?;Vo`E~O$!;k*G8@LGIbGzHoxqN3lh~kN;WOR}MW*)7g_colmjyr)tODP;@$U{A} zF-5eHqp7ZwM9qhsF;I3Z1{EE4U`Z=%RqBfHe}TU5yS6v2|*xBP6oUQNUc0 z+6)Cti4IB!##~Zf;bnXg6G?axQ!&RK8D!)Z0mPAADucCZSG(+VVYEtBNjHW&?UEZ* zq=90}&2sWMU?Ude$(z?hF=jt=v&NHo@;sR*&y#ubJei#0$=U``^LXeQ?#4>ml?|S3 zOMJ9!H9?P$AxD4kf+?d_PXBzV$twIZe0P=$A<*ScrsN~Y)T^x)p73fwd9 z!tLyt%k^=|3nQ5LcCtyL4Phf_?!bZ$iR7{@cWX{|%EShB`AcN_cPFW{NFBQKmIE z?Z%v_8kDFO(i9mp02v)DN9^;m|*=TJpf0~ucpAM(% z^{puOlny7spj%1H@6Q5^6s(eaM!#97y4}{`!iyq9u^14P)nrw4%U!n`O{Gvsd>yZJ$NhmIE$we z#LJvMc%)iq&85YRGAEXF0Ue|$>)!iP7E5-e`Q4?z32SP60me27OzjfkI56Ajq%>p# zFevXG&I7FoARf+lv}3DH3OdUHHvCx*NQ^1g9;NiMcBaEXaef1}mYwNPUmdqK4yP1< zreiEcT8VApmSuu79iJToo(nz?0X&OA0ne-v@QjIo=kC>d;OP^F7e1Ba`%!ZJAh0tj zzy5x>3p>ohLO&iD>j$5xJVZaHxPDA={g~qVp-aH(2BEGW^t2Uo>c014JEB*(Op__< zRj434X@da8>j|za&uUbrG>pny3t^iRgm`&_N-3?#-J7elA!jR7khIPyU9Uu^yk4h9}yNZgQ&C6{9o0rqYc6MPEPXc55+tt2Q2EuF!FyZ_Ze$LBxw=t{7pZgcM5Y4KQ2og6x>+ zs|Ege%5$0+So@1|VHjtT`Y;cdh!G`g+r(MQpVOu)!uz8(+i|qladWbSgIm$a)4~wY z$CwDX~-7?VhK7SI9aED2LYuNjVQL*1CjJ-^Lx zQ7>|l`>q%qE$U4eO{qrGqS)GmUoc*kG`FJ@G2I0{akjL3gmm@O$oJ_LuV5CMC^UV7k&uUKS zP#dWB@`g$SL|H^ig|)FdH~W0H`FNkW95+aQe@KsS;!b1abkJ=$R%4e!>zo4oDv zVU?x2QDs?6aWx6pZbvN1n{V`uHY2QnDD2M#S=|fCRLt}Yl290GaMH(R)s@U(gz6U+ z_39TjX9Fd@k#X}wKozwikZsqPYp-(IP$`^$+)p zb(VUSV!9?g0f-XQE@_6gY7HH;o0(6V?k#vY4|H>+d4_3wx(`^~rv>Bmt_&`+(~7Kf zT2DX~buhEQ3U&b?YCIwdaG^C;=59d@c<2r^VgK-PSo2u*$}OXX2-z8HyDozacfAob zzya9klH_qLX?+)Ax6zH7lKZgNT1!;n=6|v-invjHnG%p@R zYc@0WXdXBY6@RX^H+}G9r>`UZ3-97Nzi!a3KYqs(rQY;ACB6Ul!#w`U44=R*iFX`m zSRzT@(d&xaFeN4fhMCpzD2tOG4!le?OPatNwi@&Jz7HQ~~cw+iZ z=_y)QA<@f~f)-bS^#oFu&$hbWgYtzO=G zr4l?386$gXXgJn84MfblR^??}(WE77w4}v%PC5qw9npL<3JYQgIIE&nH5CMBn)D0~qMJrE?W{WxP^|#nNC6{Y$Ig_EONGx__ z4+LzT0HYbYXZ|D>mx2}NfNk*0X@eh!+qI;Q&bKMryUSkn^p>CPSMQLjBGJ4$Xr=#4yK?X@*2v8if3+@D(wxqjz^2CE z*btfct-rB>H@dNbz}?sY9&HDsf$48-!0vm<8ykQePK&{@4pwP_qUVX1Hn1s3-=!0y zGuhy_DWc8j9MX*TFmnB?*y@!5Q?IctXiNNbm+H=Tk^6XQ;;?ny>!Bwh^(mnxtQ&Xa zkxRK9>EDpjZknH#h1g9POfzu3J(TeYA{WomtVfO2!5-bL%}L*wm$I7hUfMdd289=a zhsO(X#nXZf`YXv(Rf212s)QZfNJwtz zEGBK2lCXiCrdVatnEKtMHdwZ+`zG(zebY#KD@Ao5k%?xCEJ8s+G2j{;YQpR%-$JYm zOao+RDlG6_ljh!ZhR)JyH?B2>oJg8kK@!Ks!1vD`nWzj@1Kv<3gbl%L)q-pj(#CtG zKY)Mu~9D#q6>5LdqN#V0$aZ+8~8^fKthu=Zn3rgF<{B;Qpu_Nu^!KpV2>)B)e zI)O<%xw%rfjuddG=i+s*tnl)tS5~+NETAwQyYerjC0qw`a##KZX;y0AD_<$o#tB-q6-feFH<)^_#YJ_xD%(e6YS}^H8;a^ZK3Ln|iCm zo4bd*hkJHZ2S$d62fO=+wp0g)2iA9Q-aJ?x8tUFLFw#F9ED6d%F$jVa2up-bgl&YE zUVh%1%hz9ZiG^#f?#O4 zd&f=y+d0tFKfFl|R|j`?4-W5HpS>Iy+*}>pT^$_i8R*|MK$kWR^F)7k4h#+xj8(c? zl@3;S_bBVOYR}ef!}PX);F`Yb=B?Eo)&Aju!Je%>{oQ>Y4TIIb?mgAP0RULv)88{} z55t3dg5_a3Xr>?M5DEtlqsroOJJ7$SXK+XGLeg7E-$*FjIP6+Av}_?DTh`zvU)LK6 zTgeODOU`v;bSVH_ULD#w&_5&`t?nM`*_6e*8KItyBg569>TY^4MEd2`P1T;=)hx%k zpl)-ue_%&ouu^pp@)P`mO=G9_)DQhBO|VYkr?D#YLs|q!@jIH|bbj@Dk0E|d_t1`> zjhh&(!L8lH)lDNq!vi}ucK7#s>RQd?^GB+Kd%FAj)^F_Y>t?WrJUM{?Xl&E4kymeZ z&yJz3MsvJ!BWkIl1uE;&z=}|-gIh-WHxH?2*Q(~8>R>XoXK1*(BdHD!4h(iBUyI7Y zvA~w4X6Zz+K&(YyhPreZyT{ zBmLJ5cJG{f>V{;XKk4pIHmn&O+>q?}_OiIr>f^l(PJKK-F5WpV{`_(Ao5saY92fuoxb_~& z;(K;h*N+VLSr4}k>^^s3Xve@1tc3I(;4w$Im9U9$J)!91rGzoz3w`>UoQt17u$zLr z2ZpOVnOOrv%(kA*9zk1Dj;hO4t`XR;s;U3YVd(+pwvD#O?7SbH92Ehk?TkrGXLBaxUKTfFm@HHR* z458-6$Nc*j0QIFiMVI{p>#yk<-nM>sb$FnABdzuDYEP8`Tc3CRd>LUx*%uJ1?h6T3 z*FdikXt2+x-$a<_{S_k{>1WU8t=&WG`+9ct3=bNyU0&VUx93vWnpoV(Cgu$oyQX{3 z(3%}Phxbr!ji&uD1C(Z*Ae;D_ua5tS&NU{&@A3RZL$mnJ=GVYfJs&-R_kvaVPvkd; zU&60DIj?7ECrmNv*|D?FSSE6UIWSlqX1tgpOa|*-GSUx)!;7n%`}Q>Oi+1W+I0%Q> zv~Xp0VgoF5R-UyQ8|fd(+Bg)sBUIJsStR2lp&w z8V+o-=`#e^>))!`b8}NUxQIIc4TdJ3H9R;{-O}AR#K;fr5Mx@;lJn4x z>Pq|iRy!_~;R^1xez3Zw4~VbkgRXgJ+u*cr-lHCE{cXsD|zV=dI+_`|uL zr%?`mapob4k=s~$R~Py0>Fmaw0M*q6L$4D9nhFj5%JN)hf;-)$xzm`#0d)jmPQ-yn zQmy}IPt3AzY^qIYSyV~8Yx;LLlw-CGSG&4E(iX(+1jM_ZOsMRLyRm6tklF`qns#-$ z={jx*Xw(opnSecel1`djI5b2NZXjSXdJ zaGmj5@dT>La%ISJ>hFYXwf25B;>v1o&^Hg&m8YwE?y2KSdgkyvH*wbWZy6YqQIb0q ze$U}|62BciL#TRNlPx{fKGd)c_q4io#ODZ6VS zLp1CG^aB&|*Amx&ppt75DTOwJK{EM;Q{4D`8+gy)H|SO*>#y0yDsspAo-Cd%1+w^N zw2SUxD)n-gIuQ|C|It{6j6pHj1dI+00+|HtrTx4Z8rf+YHLqD6po(O$LB{jFXrI4( zQScLBlb&#H-C{EFdQY+gy(HOK)j+mREt~F>jdguBXObpb;+^oUHKz~kjd&LLLbLUY z6h{F&O+;&5v77Ru0pD*Ga*6B7QWw*zhc&o|KGSZ4;3JgR+RWprkI|r{(^VcMP5S1; zgj&aqV|J6NH9m{x-~=(1wY_6#EB_B=Bb1F~HiGEwWvBOF=)=o>cs8MExlyEy*DTJp zk)E(t8W=>Vn!?vt?ca*Ny%TtPuB~o%>!v%Xdp>n*9s680Gd+ld}8=wCXmtZNyARs5v?KU1Ap>W*QkhZ(xCdvo_r!l8xL{*fJ3EsNAv zI(jGepXVPAJ#Pn`mjFfwKXp}qb@@?oY#rW+(;$6R6(6{|F6Ry=WRGTO1NNzHIlpWX z(#i7*ek=K93ym(G#VpR`_e>WWYD0e#3cv1!#*;@iE;Jeic1^}QD@1K6aD^EqEmfp5?-?Fi2uB*(;U?E+-m>i=K-G&bV}`mLmkq5TP=(kBzX zcatXJo8`%beogoy*~i3w5Ip4bf0s}+R*$Du#21bX4K8Fo+1f((XyB96%=vcI6p_AwHI~FWjvY^9?Y&K(qb$I$Q<>1A% z(XV#+W$~EKiT3N`C)LGsq>Gtk>3>gLi|;J{$hi2|iHpf+>E9lg{@A$me;=3rpX1Vh zJTCpG)U@FaT!pv`rb%<5%G09u#64$Fh#qZPGZt)Tlem2(jjTJ0zGc$2&&2+$WuC9UpI=& zrftlLd5-a-*=7op6Kz9xA6E{ptZVC!X{)~PcM-3L^+Uwf*Go~3BtVmEwpC4e+%(dM z)d%el)x>}p*@A<>OVF{typ6IF%Ujk=!XPWJ`KvJ#|H$Omxjc(!>Muicrr^Kyc&FT5)$dhO zbWvM3CR*~a03clkxvTu5rQU3P8)?E13OvTXZ8iRUH}5r8WAB~B5bwU9G|{M6*71%E zRizj^+fo7a+eJh2T7XYy5A5vg3@}7~NzJ zbXM)lsH;ML%|BtPJ}wxtxO4#F!^4Dd+MM``YBY5xb*Y}LjCiPM^U90QIPdbV=_v0sXrM3XSJ+@)g7#K$SEa$ z^Md5!0f-%!29}oO{OYjLzH7h?;zP-n!GRr?ftHes8Jk@cE+SvTEc4&4lst)SUhg{AZe20*Fr(Sqd4fduW9@-)$N^$7S!t0;NTwCnS)k&kKAz>r+ehuYfrAOCffi=iXmP{bziuL zmznlsE-b~)#kwh*|GZ>JcdwYt@HP;-10^>Z8qhj=pud`6|JLeHT^P_}e!(Nqhh)tm z=n`x7n6u^a+0NP03;l@SiN?i`^jpjCe0~@3TgT6F+2H}!2ciLWO-tZ-*++@DB82UBK_;>ZpHFSI^t2XBKc+JKIKfboW!BE`7gm$6HaZ92hWK zwPmaZdt3KTR?m#4kjVetOo6SM0z%yjp10sp%1aN=a8hKVi%?aUI>oM&#kdQYfy{e|rdp$c1m$Ykp@9d^+o(IOgZJ!l z@UI^if4PrejzxnxU|wZNSyL7}3Vdpg<9~;sqa84Y!97Tq4)P_mE8Znu=IfIKbQml% z>!>cPp7agmms2GxC;eRIG8te#6X@o4@<|WQWF`gz*bifj94~o2S^vM&C<6qpgt)mCuP%RJWLFaL1k8l`Z;pp zSozC6c$Wz}U*{EBla5gQ+cC;vrJq?_vR((l>uFnbcV5r#9_V4?p5zty-Mf;zcrV$J z=^&DK`*|n50sx_(p*r`ivbOege#{4x&Ia9q8%mO4zD$zO!y6uk@Dp6H4#M%3zMgkXWlSxQ}%8^?W>_gFTzF~kdmDv8zm`f zNPmj-V@ZDjrMAe@sTtu@XIC7YV}q5Az!1`6Q?;HRAm7l7Zp1vR@(+HhV-|HN0hof4rc2t$#WXgkAwY zGi=gMeY=+scj)!`9Wp)YXwoC=GQ$<|apf;1UXL&3sIUJr(y!Rocg42B%LcA_-bf!# z-E{M2PdQF8x4C-VbDWXx)r3uyc|D={L53^p9niiLmYBD&T65(i)mN%`VvCT`CcFX9--FnuOXCS^NoaBb4haG>z8P(3SF7X>*4YP zEV9RrZ%UHmfj_3aoZt=fh4}Q7oxyaqEYNNu1oL>O4FSF~M;4B;SvKKCdc;e}CqDBn z>ee{^9^-i}zY%_e{08{-@w=IP`n&LoOD{n*}=X7T5%$MN}D-sS!ZeW*wBc zZ9Q6Q$aOE3Qq5X3(w2EEJwh6_t*kanM}zmxU$NlQjoYOiil<0^k_%Sm-0~UjN6>L3 z-|Zh0whOW(P4(;1{tnnKOoGMuBpdc}UOS=ZI>*ZK(G+0{; zRWSpD-0oz9_6A@j+F<(wc#t}mY>=$paJW{~`&u2R%sYi`KUVORSDjKa6>aSWoV4d=^#@eMlH&nmERloY_t5$vCaqO2i3M;amJEGkG>NL=eNevIXSx1I_;0Sx-#(D95A1ogwFwx$$xpD>md3{6QIZa0!@h^Ir%^_Kb>lT*e4k}MCfa@LY)-AG zJDby6fI)V|5$Sd{7t}-x+C~&PXP(0k;>(IQq;F>Nzvelqi+_aYu5oeEb(a4ro)?ab zOOMRbf5EeKmil;mUHs_K;XX^BJ}zDw7jGl3IhEyCTyi{%w~os{bzFR!kB`|rv0m-y zmH~e7&UsD`&FaeRzghf@tgN>&n(!RjvtuJ%2ll>Yi>y8ig5XhK&l7~At6vaOG+2`f zwd%DsS!Y((?qvD=jXiRGdq@@pGv=3r(S?FXo8Pf$@sg#>mUpgLxhh?K z?s;q0o`1o*3op9(d6!)F{L8Pn@~RiS@I^0v$%gKYY}ek_v%R-($Ie}YjrlJ18LuX% z<=e8=9YTk{U7VD2fuY(ugCi9GK}x_1O)yMLc`ey5B`euf6l@G zf9RjyA3Wz*?Ek^v_5NSE5Z#8~Lkr5mZTzm}H(k$5`7PnMnBO9P9sJ1mB4l>vf0P`5 z3BUSxFD1S~OMCQ+e_Q5kCG(OXc#>z?CLSl0&Xa|{UID@r%!Ctu(NA|6K}2Ef}y0knfiV}yV6^8olbwt4jE)8bgVRs$CF4mf34Rw zy-9=>OV5@)X0owvB-;iCdYvb*+jY#lujJ6Ym^$Q#9^ZzQR6g3dnLN_dZ{jB%HH)9k z;OP)X7C(!)_JnNYC%c$%r8SfAmeGg$SLG*blhU{F)B3kQ&o<&c{vCnQ#&$y4vs6aE zK7Kp+VS;RUKcKV;hcX7cui-$YHqj5+%DTM+ z!rZF1b?9kNml!M*HJIB8C&IF2$1rd_N?RJc&9s#e{@{}zKXqbWVD^-GYBIEKV1zx! zn0(GWOG~q4E(_re-NPFa4!%ILwlBzDp0m=?&s;*;-%Es$NYF~C{+-QWXkAc`&z;0= z&xWmM8`E}?wiZXS?Ao#`%J%##(7az%T$6z>2Z}IjzG92Wo0 z=F_GUaj=cD6b-RkLMBm$fl)B`z2Yt-Z-PIkYyzG>Lnz*%b@4smUw@DDPUDec`#s{X_y#>R7aB(c(o*7A;-0Y|-*Xor_j1TDiDm@uJ0x7cW`7bn&vq%NKVp zUa@%Pl8z;dmMmVfWXaMc%a$x((z#^Cl9fw4mM&VlcHWoJj{qRz#gOFEZ! zF6&(0+1a_GbLEPT6^m9ZUa@4w(iO{AEML*NV#SJ;D**O^P~iKYHLyhr8=xpyHWX{3hbZ zPF8jZK~!Ccyx6pD5Zo8fa`YtLDEkeEpP_zdWp-4T(Wgt%{IV)Uvd)l`te_6j;)R5j zS{>|R_jLP8-it!BbXVThKIT9+VyBRKlY_TYM)3b7p?FI8|M)LR-|`DK{w|3Q`xlS< z%ju7sO;q&ZW3@j-rwFm4j0|s?@4TrstH0wF4l6$26o)Wn+9FyY!*BOaeu0EP<$ouXoc|G_e1}=x6XpdhHnXcHtK7UOFt<*i%!It&Q?qa<$0~=lHJHgjzKbb$ zGNJ56l4)6dCeN}V24S4fH#J3tredLaTFdOx@vSr4%2QgW=F0I=M;+aKY~Bt)deOx{e`>+Pb6)zg_21d|hBvgc||y!R8I{OZF8et6@nUw`Mj zKJm%VeD2Ht`1K2J|M(X_`=u|hyX4ZVU-a_zuYKd2KJ?cg`Q)cQ`?-gw9ednMUi#CY z{qo@Gj$QxsttoT*2WFqJ{#Dm~;Dguy&ArDScjBD2=U;N^3t#-wmtS}N|NhKFU;V~` zAO2);=uN{TZ+q^7h4230M?U$vFF*XPKV0?uw|Bg0&fh=urGuAT`r?-qic`y{Ed2ft z`Ug7CI%oBoTi<-e){*-^|KL|1`9J^q%Y#9(zH-C2ayOh;oRw>uw)g#0M&Fm8)4X?9 ze0(v?EzB*=72>eaRG8Ls+0>&7R~6#i?3U)Z7#HG*nb?}k$EBul$}#y%3bP7V7ow)) zS})6;8_$o!+_a{ttzEejPF|nv$ZbD)^#1$}cgHiEZumv~qQbGwGn%KjPH)}b)Y3Gw z=|zRp^J`n?@xi1pUR0Wwo7q%~N8eAC;P)8@zR zQ`@JG-jciF_m3|fbMtNah50iI(Ucj@qo1e@w~l^oW@~=*V1D#ltv~wXxU+fhOQ(|1b z(3;PWzN@_VCxtLMt%=k(y17be<->)`f~J@=%LoHHh(R8IQqx%(fqfgf6YA}eLp#n zdoud(_~&8kDQBF0$)#_4$2XzQ2YhQK!>+XE-2k+kh;0Hd~Kk$jSzP$2#`8YQ}-V%ok7mVI;LcD0|?A%GsC+1Jj zpO>3*+UR?mPRgB>n_FC3y5!uwoz2I#6la{VW@Wso*xYd}_YTg=hpSfPF3K;=wG^5Q ztCCZ4tOVjh4!hAW-kG_86i5C=GM&I@F%9>J3Q`^y9O)bmk<&GQu=$V_Z zXuY7hW$l_-7Zk5(TUTfq{ps446XNsNb;eVQEln#6Eqj+AUpOP4{ep1n;HaI@R_4OZ5b-=JZ9}HG!?FHK7RBy zd(V$wy?W{~`!1W))HM3l)AMJyhdbxTGjq}2Rdc3w<-@%Xo_52(jQ;G@i*qfx=*DU1 zU3}K)r_XE(b64eOEsge0nU~w#`hu3x53D$$ZCR>lgro6Un`|B^`d2U_&r94YkN|C-XmjrLlZwOv?^c}%b z$0c)GlMQozFz=4jPwPnL4ZQ2odC^@P=AZcU4GV%_Cd=P(aKrLngx_8swzPMi)b{Pp z_f6?uxp2liS9Z+qzTn3vzVqT$OS>;Su>GCSzjUDe@;|=!otFn+?!Kb>m3Lkd{A2r- z!K2^4>I2{DzWRHQwZG`W$KUy)B>4V|4usdgIM~THk@+Y{5&wl3lsb+nhgG;;6ot9x zgeT5=NvW&3Ih>ITn_&+5)8jLXr_BhHP736TaJ529bVAsr;<+MOTB4a@6s?4d#yX=g3M)mmsH*jQ@gPq5HZu<@7pPqY-o#@=sMEQTzb-8Y%{ zvSh-NBvySnZDPVTV!a(G?|RC?h%#+k(ku8Op4jo~G~H=`xI>&PHU+b2VOtzucF0~- zvzE_GXXaEwik@Y4y=PYHG$@wess}T6R?*6zQ~acD4dq5$R=;!Qd{BF7h?+yI_=EEF z2tD90iNgk)Ua2P91j0js5S?~31(e$c2XIbrb5{zeJImRx)C>ayUeHluGnN=8aZK{g zZ=G6W*-VcX4$@xLKwZ`l)U_TlU+9H*76}H*bqVM9-+v1ZJ$LgQ@ZWBj<1VpXti?X& FqhErKIC%g7 literal 0 HcmV?d00001 From e8b9690ac7a2284f854ba9ec6ec386966cf4c10f Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 5 Apr 2023 13:21:08 +0200 Subject: [PATCH 0194/2372] Fix argon2 benchmarking (not in hackatom anymore) --- packages/vm/benches/main.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/vm/benches/main.rs b/packages/vm/benches/main.rs index 970a1ca9c3..f764394ba7 100644 --- a/packages/vm/benches/main.rs +++ b/packages/vm/benches/main.rs @@ -32,6 +32,7 @@ const INSTANTIATION_THREADS: usize = 128; const CONTRACTS: u64 = 10; static CONTRACT: &[u8] = include_bytes!("../testdata/hackatom.wasm"); +static CYBERPUNK: &[u8] = include_bytes!("../testdata/cyberpunk.wasm"); fn bench_instance(c: &mut Criterion) { let mut group = c.benchmark_group("Instance"); @@ -94,12 +95,11 @@ fn bench_instance(c: &mut Criterion) { ..DEFAULT_INSTANCE_OPTIONS }; let mut instance = - Instance::from_code(CONTRACT, backend, much_gas, Some(DEFAULT_MEMORY_LIMIT)).unwrap(); + Instance::from_code(CYBERPUNK, backend, much_gas, Some(DEFAULT_MEMORY_LIMIT)).unwrap(); let info = mock_info("creator", &coins(1000, "earth")); - let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; let contract_result = - call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); + call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, b"{}").unwrap(); assert!(contract_result.into_result().is_ok()); let mut gas_used = 0; From 3a478e9f4cea6e5c197a6194c723a24aaa68bce5 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 5 Apr 2023 13:22:02 +0200 Subject: [PATCH 0195/2372] Upgrade criterion to 0.4 --- Cargo.lock | 160 ++++++++++++++++++------------------- packages/crypto/Cargo.toml | 2 +- packages/vm/Cargo.toml | 2 +- 3 files changed, 81 insertions(+), 83 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8b50daa42a..c82a7bf2ff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -28,6 +28,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + [[package]] name = "ansi_term" version = "0.12.1" @@ -117,18 +123,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "bstr" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" -dependencies = [ - "lazy_static", - "memchr", - "regex-automata", - "serde", -] - [[package]] name = "bumpalo" version = "3.12.0" @@ -164,12 +158,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "cast" -version = "0.2.7" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c24dab4283a142afa2fdca129b80ad2c6284e073930f964c3a1293c225ee39a" -dependencies = [ - "rustc_version", -] +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" @@ -193,6 +184,33 @@ dependencies = [ "num-traits", ] +[[package]] +name = "ciborium" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c137568cc60b904a7724001b35ce2630fd00d5d84805fbb608ab89509d788f" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346de753af073cc87b52b2083a506b38ac176a44cfb05497b622e27be899b369" + +[[package]] +name = "ciborium-ll" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213030a2b5a4e0c0892b6652260cf6ccac84827b83a85a534e178e3906c4cf1b" +dependencies = [ + "ciborium-io", + "half", +] + [[package]] name = "clap" version = "2.34.0" @@ -203,11 +221,32 @@ dependencies = [ "atty", "bitflags", "strsim", - "textwrap", + "textwrap 0.11.0", "unicode-width", "vec_map", ] +[[package]] +name = "clap" +version = "3.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5" +dependencies = [ + "bitflags", + "clap_lex", + "indexmap", + "textwrap 0.16.0", +] + +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + [[package]] name = "clru" version = "0.4.0" @@ -249,7 +288,7 @@ name = "cosmwasm-check" version = "1.2.3" dependencies = [ "anyhow", - "clap", + "clap 2.34.0", "colored", "cosmwasm-std", "cosmwasm-vm", @@ -342,7 +381,7 @@ version = "1.2.3" dependencies = [ "bitflags", "bytecheck", - "clap", + "clap 2.34.0", "clru", "cosmwasm-crypto", "cosmwasm-std", @@ -444,15 +483,16 @@ dependencies = [ [[package]] name = "criterion" -version = "0.3.5" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1604dafd25fba2fe2d5895a9da139f8dc9b319a5fe5354ca137cbbce4e178d10" +checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb" dependencies = [ + "anes", "atty", "cast", - "clap", + "ciborium", + "clap 3.2.23", "criterion-plot", - "csv", "itertools", "lazy_static", "num-traits", @@ -461,7 +501,6 @@ dependencies = [ "rayon", "regex", "serde", - "serde_cbor", "serde_derive", "serde_json", "tinytemplate", @@ -470,9 +509,9 @@ dependencies = [ [[package]] name = "criterion-plot" -version = "0.4.4" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d00996de9f2f7559f7f4dc286073197f83e92256a59ed395f9aac01fe717da57" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" dependencies = [ "cast", "itertools", @@ -551,28 +590,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "csv" -version = "1.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1" -dependencies = [ - "bstr", - "csv-core", - "itoa 0.4.8", - "ryu", - "serde", -] - -[[package]] -name = "csv-core" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" -dependencies = [ - "memchr", -] - [[package]] name = "curve25519-dalek" version = "3.2.0" @@ -973,12 +990,6 @@ dependencies = [ "either", ] -[[package]] -name = "itoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" - [[package]] name = "itoa" version = "1.0.1" @@ -1171,6 +1182,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "os_str_bytes" +version = "6.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" + [[package]] name = "parity-wasm" version = "0.42.2" @@ -1381,12 +1398,6 @@ dependencies = [ "regex-syntax", ] -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" - [[package]] name = "regex-syntax" version = "0.6.25" @@ -1471,15 +1482,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver", -] - [[package]] name = "rustversion" version = "1.0.6" @@ -1584,16 +1586,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_cbor" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" -dependencies = [ - "half", - "serde", -] - [[package]] name = "serde_derive" version = "1.0.137" @@ -1622,7 +1614,7 @@ version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" dependencies = [ - "itoa 1.0.1", + "itoa", "ryu", "serde", ] @@ -1741,6 +1733,12 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "textwrap" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" + [[package]] name = "thiserror" version = "1.0.38" diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index aa828ad79e..bc22c35913 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -26,7 +26,7 @@ rand_core = { version = "0.6", features = ["getrandom"] } thiserror = "1.0.38" [dev-dependencies] -criterion = "0.3" +criterion = "0.4" serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } serde_json = "1.0.40" sha2 = "0.10" diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index b4b8981bbd..38d2e0bce5 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -67,7 +67,7 @@ bitflags = "1.1.0" # https://github.com/CensoredUsername/dynasm-rs/pull/74 # wasmer-middlewares = { path = "../../../wasmer/lib/middlewares" } [dev-dependencies] -criterion = { version = "0.3", features = [ "html_reports" ] } +criterion = { version = "0.4", features = [ "html_reports" ] } hex-literal = "0.3.1" tempfile = "3.1.0" wat = "1.0" From 01ff17c373749be4f1d99e741e706b463cb6c1dc Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 5 Apr 2023 13:24:37 +0200 Subject: [PATCH 0196/2372] Cleanup benchmarking branch list in CI --- .circleci/config.yml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 425c01533d..2ce1523101 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -84,14 +84,7 @@ workflows: - main - /^[0-9]+\.[0-9]+$/ # Add your branch here if benchmarking matters to your work - - benchmarking - - update-wasmer - - metering-restart - - load-wasm-speed - - cache-analyze - - fix-benches - - benchmark_argon2 - - get_instance-multi-threaded-benchmark-multi-contract + - fix-benchmarking - coverage deploy: jobs: From 6f415ec32bdc4f8f734d435447df306534d6cbaf Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 6 Apr 2023 14:18:32 +0200 Subject: [PATCH 0197/2372] Bump clippy to Rust 1.68.2 --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 2ce1523101..05d72ae197 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -72,7 +72,7 @@ workflows: matrix: parameters: # Run with MSRV and some modern stable Rust - rust-version: ["1.60.0", "1.67.1"] + rust-version: ["1.60.0", "1.68.2"] - benchmarking: requires: - package_vm From 3795f5cd03288405335d4fb0c46c239dbf4c7e60 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 4 Apr 2023 15:58:32 +0200 Subject: [PATCH 0198/2372] Track call depth --- packages/vm/src/environment.rs | 41 ++++++++++++++++++++++++++++-- packages/vm/src/errors/vm_error.rs | 12 +++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index 4072b3fbbd..02270726ec 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -9,6 +9,13 @@ use wasmer_middlewares::metering::{get_remaining_points, set_remaining_points, M use crate::backend::{BackendApi, GasInfo, Querier, Storage}; use crate::errors::{VmError, VmResult}; +/// Keep this as low as necessary to avoid deepy nested errors like this: +/// +/// ```plain +/// RuntimeErr { msg: "Wasmer runtime error: RuntimeError: Error executing Wasm: Wasmer runtime error: RuntimeError: Error executing Wasm: Wasmer runtime error: RuntimeError: Error executing Wasm: Wasmer runtime error: RuntimeError: Error executing Wasm: Wasmer runtime error: RuntimeError: Maximum call depth exceeded." } +/// ``` +const MAX_CALL_DEPTH: usize = 2; + /// Never can never be instantiated. /// Replace this with the [never primitive type](https://doc.rust-lang.org/std/primitive.never.html) when stable. #[derive(Debug)] @@ -167,7 +174,8 @@ impl Environment { let func = instance.exports.get_function(name)?; Ok(func.clone()) })?; - func.call(args).map_err(|runtime_err| -> VmError { + self.increment_call_depth()?; + let res = func.call(args).map_err(|runtime_err| -> VmError { self.with_wasmer_instance::<_, Never>(|instance| { let err: VmError = match get_remaining_points(instance) { MeteringPoints::Remaining(_) => VmError::from(runtime_err), @@ -176,7 +184,9 @@ impl Environment { Err(err) }) .unwrap_err() // with_wasmer_instance can only succeed if the callback succeeds - }) + }); + self.decrement_call_depth(); + res } pub fn call_function0(&self, name: &str, args: &[Val]) -> VmResult<()> { @@ -237,6 +247,31 @@ impl Environment { }) } + /// Increments the call depth by 1 and returns the new value + pub fn increment_call_depth(&self) -> VmResult { + let new = self.with_context_data_mut(|context_data| { + let new = context_data.call_depth + 1; + context_data.call_depth = new; + new + }); + if new > MAX_CALL_DEPTH { + return Err(VmError::max_call_depth_exceeded()); + } + Ok(new) + } + + /// Decrements the call depth by 1 and returns the new value + pub fn decrement_call_depth(&self) -> usize { + self.with_context_data_mut(|context_data| { + let new = context_data + .call_depth + .checked_sub(1) + .expect("Call depth < 0. This is a bug."); + context_data.call_depth = new; + new + }) + } + pub fn get_gas_left(&self) -> u64 { self.with_wasmer_instance(|instance| { Ok(match get_remaining_points(instance) { @@ -316,6 +351,7 @@ pub struct ContextData { gas_state: GasState, storage: Option, storage_readonly: bool, + call_depth: usize, querier: Option, /// A non-owning link to the wasmer instance wasmer_instance: Option>, @@ -327,6 +363,7 @@ impl ContextData { gas_state: GasState::with_limit(gas_limit), storage: None, storage_readonly: true, + call_depth: 0, querier: None, wasmer_instance: None, } diff --git a/packages/vm/src/errors/vm_error.rs b/packages/vm/src/errors/vm_error.rs index 6140799bc4..51f472cf7d 100644 --- a/packages/vm/src/errors/vm_error.rs +++ b/packages/vm/src/errors/vm_error.rs @@ -145,6 +145,11 @@ pub enum VmError { #[cfg(feature = "backtraces")] backtrace: Backtrace, }, + #[error("Maximum call depth exceeded.")] + MaxCallDepthExceeded { + #[cfg(feature = "backtraces")] + backtrace: Backtrace, + }, } impl VmError { @@ -314,6 +319,13 @@ impl VmError { backtrace: Backtrace::capture(), } } + + pub(crate) fn max_call_depth_exceeded() -> Self { + VmError::MaxCallDepthExceeded { + #[cfg(feature = "backtraces")] + backtrace: Backtrace::capture(), + } + } } impl From for VmError { From 721195cdef67772f825c59ad9cc1be45ce926fb2 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 17 Apr 2023 16:24:00 +0200 Subject: [PATCH 0199/2372] Set version: 1.2.4 --- CHANGELOG.md | 9 ++++++++- Cargo.lock | 16 ++++++++-------- contracts/burner/Cargo.lock | 12 ++++++------ contracts/crypto-verify/Cargo.lock | 14 +++++++------- contracts/cyberpunk/Cargo.lock | 14 +++++++------- contracts/floaty/Cargo.lock | 14 +++++++------- contracts/hackatom/Cargo.lock | 14 +++++++------- contracts/ibc-reflect-send/Cargo.lock | 14 +++++++------- contracts/ibc-reflect/Cargo.lock | 14 +++++++------- contracts/queue/Cargo.lock | 12 ++++++------ contracts/reflect/Cargo.lock | 14 +++++++------- contracts/staking/Cargo.lock | 14 +++++++------- contracts/virus/Cargo.lock | 12 ++++++------ packages/check/Cargo.toml | 6 +++--- packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema-derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 6 +++--- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 21 files changed, 107 insertions(+), 100 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c889600c51..5bc4fb32ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ and this project adheres to ## [Unreleased] +## [1.2.4] - 2023-04-17 + +### Fixed + +- cosmwasm-vm: Add call depths limit + ## [1.2.3] - 2023-03-22 - cosmwasm-vm: Use saturating increments for `Stats` fields to ensure we don't @@ -1658,7 +1664,8 @@ Some main points: All future Changelog entries will reference this base -[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.3...HEAD +[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.4...HEAD +[1.2.4]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.3...v1.2.4 [1.2.3]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.2...v1.2.3 [1.2.2]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.1...v1.2.2 [1.2.1]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.0...v1.2.1 diff --git a/Cargo.lock b/Cargo.lock index c82a7bf2ff..3eacb1a185 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -285,7 +285,7 @@ dependencies = [ [[package]] name = "cosmwasm-check" -version = "1.2.3" +version = "1.2.4" dependencies = [ "anyhow", "clap 2.34.0", @@ -296,7 +296,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.3" +version = "1.2.4" dependencies = [ "base64", "criterion", @@ -315,7 +315,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.3" +version = "1.2.4" dependencies = [ "cosmwasm-std", "syn", @@ -323,7 +323,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "1.2.3" +version = "1.2.4" dependencies = [ "anyhow", "cosmwasm-schema-derive", @@ -338,7 +338,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.3" +version = "1.2.4" dependencies = [ "proc-macro2", "quote", @@ -347,7 +347,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.3" +version = "1.2.4" dependencies = [ "base64", "chrono", @@ -369,7 +369,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.3" +version = "1.2.4" dependencies = [ "cosmwasm-std", "serde", @@ -377,7 +377,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.3" +version = "1.2.4" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 1f34106c3c..5d93e7a370 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -174,7 +174,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.3" +version = "1.2.4" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -185,14 +185,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.3" +version = "1.2.4" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.3" +version = "1.2.4" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -203,7 +203,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.3" +version = "1.2.4" dependencies = [ "proc-macro2", "quote", @@ -212,7 +212,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.3" +version = "1.2.4" dependencies = [ "base64", "cosmwasm-crypto", @@ -230,7 +230,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.3" +version = "1.2.4" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 3a242b0ab1..e30f40df49 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.3" +version = "1.2.4" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.3" +version = "1.2.4" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.3" +version = "1.2.4" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.3" +version = "1.2.4" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.3" +version = "1.2.4" dependencies = [ "base64", "cosmwasm-crypto", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.3" +version = "1.2.4" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.3" +version = "1.2.4" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 5d748dc697..f220e6b9d9 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.3" +version = "1.2.4" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -203,14 +203,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.3" +version = "1.2.4" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.3" +version = "1.2.4" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -221,7 +221,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.3" +version = "1.2.4" dependencies = [ "proc-macro2", "quote", @@ -230,7 +230,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.3" +version = "1.2.4" dependencies = [ "base64", "cosmwasm-crypto", @@ -248,7 +248,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.3" +version = "1.2.4" dependencies = [ "cosmwasm-std", "serde", @@ -256,7 +256,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.3" +version = "1.2.4" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index e71c9a5f03..7ab3d6df08 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.3" +version = "1.2.4" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.3" +version = "1.2.4" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.3" +version = "1.2.4" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.3" +version = "1.2.4" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.3" +version = "1.2.4" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.3" +version = "1.2.4" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.3" +version = "1.2.4" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index ab8b12b3b4..7397d116cc 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.3" +version = "1.2.4" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.3" +version = "1.2.4" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.3" +version = "1.2.4" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.3" +version = "1.2.4" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.3" +version = "1.2.4" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.3" +version = "1.2.4" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.3" +version = "1.2.4" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 3f968aa2de..5bdb650b8a 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.3" +version = "1.2.4" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.3" +version = "1.2.4" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.3" +version = "1.2.4" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.3" +version = "1.2.4" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.3" +version = "1.2.4" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.3" +version = "1.2.4" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.3" +version = "1.2.4" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 051e88b9d8..eb882f8e61 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.3" +version = "1.2.4" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.3" +version = "1.2.4" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.3" +version = "1.2.4" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.3" +version = "1.2.4" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.3" +version = "1.2.4" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.3" +version = "1.2.4" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.3" +version = "1.2.4" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 2f440904e5..bdb29f47b7 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.3" +version = "1.2.4" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.3" +version = "1.2.4" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.3" +version = "1.2.4" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.3" +version = "1.2.4" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.3" +version = "1.2.4" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.3" +version = "1.2.4" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 5531ebb18c..a7575cf815 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.3" +version = "1.2.4" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.3" +version = "1.2.4" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.3" +version = "1.2.4" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.3" +version = "1.2.4" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.3" +version = "1.2.4" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.3" +version = "1.2.4" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.3" +version = "1.2.4" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index a5f85c41a6..b9c3db5597 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.3" +version = "1.2.4" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.3" +version = "1.2.4" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.3" +version = "1.2.4" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.3" +version = "1.2.4" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.3" +version = "1.2.4" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.3" +version = "1.2.4" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.3" +version = "1.2.4" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index e35f813893..0bb9672903 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.3" +version = "1.2.4" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.3" +version = "1.2.4" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.3" +version = "1.2.4" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.3" +version = "1.2.4" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.3" +version = "1.2.4" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.3" +version = "1.2.4" dependencies = [ "bitflags", "bytecheck", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index 2ddbc968cc..825ed222e5 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-check" -version = "1.2.3" +version = "1.2.4" authors = ["Mauro Lacy "] edition = "2021" description = "A CLI tool for verifying CosmWasm smart contracts" @@ -11,5 +11,5 @@ license = "Apache-2.0" anyhow = "1.0.57" clap = "2" colored = "2" -cosmwasm-vm = { path = "../vm", version = "1.2.3" } -cosmwasm-std = { path = "../std", version = "1.2.3" } +cosmwasm-vm = { path = "../vm", version = "1.2.4" } +cosmwasm-std = { path = "../std", version = "1.2.4" } diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index bc22c35913..594696fe1b 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "1.2.3" +version = "1.2.4" authors = ["Mauro Lacy "] edition = "2021" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index 5a6d5da5a1..4993cb1acf 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "1.2.3" +version = "1.2.4" authors = ["Simon Warta "] edition = "2021" description = "A package for auto-generated code used for CosmWasm contract development. This is shipped as part of cosmwasm-std. Do not use directly." diff --git a/packages/schema-derive/Cargo.toml b/packages/schema-derive/Cargo.toml index 7761b98e71..94bb8df670 100644 --- a/packages/schema-derive/Cargo.toml +++ b/packages/schema-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema-derive" -version = "1.2.3" +version = "1.2.4" authors = ["Tomasz Kurcz "] edition = "2021" description = "Derive macros for cosmwasm-schema" diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index 5e4b4f3711..82a8203265 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "1.2.3" +version = "1.2.4" authors = ["Simon Warta ", "Ethan Frey "] edition = "2021" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." @@ -8,7 +8,7 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/schema" license = "Apache-2.0" [dependencies] -cosmwasm-schema-derive = { version = "=1.2.3", path = "../schema-derive" } +cosmwasm-schema-derive = { version = "=1.2.4", path = "../schema-derive" } schemars = "0.8.3" serde = "1.0" serde_json = "1.0.40" @@ -16,6 +16,6 @@ thiserror = "1.0.26" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = { version = "1.2.3", path = "../std" } +cosmwasm-std = { version = "1.2.4", path = "../std" } semver = "1" tempfile = "3" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 06d7686e41..036b8e8809 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "1.2.3" +version = "1.2.4" authors = ["Ethan Frey "] edition = "2021" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -42,7 +42,7 @@ cosmwasm_1_2 = ["cosmwasm_1_1"] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "1.2.3" } +cosmwasm-derive = { path = "../derive", version = "1.2.4" } derivative = "2" forward_ref = "1" hex = "0.4" @@ -54,7 +54,7 @@ thiserror = "1.0.26" uint = "0.9.3" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "1.2.3" } +cosmwasm-crypto = { path = "../crypto", version = "1.2.4" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 2d08dbb3e3..ce9ba8d8cc 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "1.2.3" +version = "1.2.4" authors = ["Ethan Frey "] edition = "2021" description = "CosmWasm library with useful helpers for Storage patterns" @@ -16,5 +16,5 @@ iterator = ["cosmwasm-std/iterator"] [dependencies] # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.2.3", default-features = false } +cosmwasm-std = { path = "../std", version = "1.2.4", default-features = false } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 38d2e0bce5..7be9e965cd 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "1.2.3" +version = "1.2.4" authors = ["Ethan Frey "] edition = "2021" description = "VM bindings to run cosmwams contracts" @@ -41,8 +41,8 @@ required-features = ["iterator"] [dependencies] clru = "0.4.0" # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.2.3", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "1.2.3" } +cosmwasm-std = { path = "../std", version = "1.2.4", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "1.2.4" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.3" From b0cb936387625e0f5820775eaf8cd8c199ab63e6 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 19 Apr 2023 12:00:54 +0200 Subject: [PATCH 0200/2372] Avoid using loupe for module sizes This essentially reverts https://github.com/CosmWasm/cosmwasm/pull/1041 --- packages/vm/src/cache.rs | 14 ++++----- packages/vm/src/modules/file_system_cache.rs | 31 +++++++++++++++----- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 5f3376ad37..dcedd488cc 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -262,9 +262,8 @@ where // Try to get module from file system cache let store = make_runtime_store(Some(cache.instance_memory_limit)); - if let Some(module) = cache.fs_cache.load(checksum, &store)? { + if let Some((module, module_size)) = cache.fs_cache.load(checksum, &store)? { cache.stats.hits_fs_cache = cache.stats.hits_fs_cache.saturating_add(1); - let module_size = loupe::size_of_val(&module); return cache .pinned_memory_cache .store(checksum, module, module_size); @@ -274,8 +273,7 @@ where let code = self.load_wasm_with_path(&cache.wasm_path, checksum)?; let module = compile(&code, Some(cache.instance_memory_limit), &[])?; // Store into the fs cache too - cache.fs_cache.store(checksum, &module)?; - let module_size = loupe::size_of_val(&module); + let module_size = cache.fs_cache.store(checksum, &module)?; cache .pinned_memory_cache .store(checksum, module, module_size) @@ -334,9 +332,9 @@ where // Get module from file system cache let store = make_runtime_store(Some(cache.instance_memory_limit)); - if let Some(module) = cache.fs_cache.load(checksum, &store)? { + if let Some((module, module_size)) = cache.fs_cache.load(checksum, &store)? { cache.stats.hits_fs_cache = cache.stats.hits_fs_cache.saturating_add(1); - let module_size = loupe::size_of_val(&module); + cache .memory_cache .store(checksum, module.clone(), module_size)?; @@ -351,8 +349,8 @@ where let wasm = self.load_wasm_with_path(&cache.wasm_path, checksum)?; cache.stats.misses = cache.stats.misses.saturating_add(1); let module = compile(&wasm, Some(cache.instance_memory_limit), &[])?; - cache.fs_cache.store(checksum, &module)?; - let module_size = loupe::size_of_val(&module); + let module_size = cache.fs_cache.store(checksum, &module)?; + cache .memory_cache .store(checksum, module.clone(), module_size)?; diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 95b1a3e288..08d751a0f7 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -103,13 +103,23 @@ impl FileSystemCache { /// Loads a serialized module from the file system and returns a module (i.e. artifact + store), /// along with the size of the serialized module. - pub fn load(&self, checksum: &Checksum, store: &Store) -> VmResult> { + /// The serialized module size is a good approximation (~100.06 %) of the in-memory module size. + /// It should not be considered as the exact in-memory module size. + pub fn load(&self, checksum: &Checksum, store: &Store) -> VmResult> { let filename = checksum.to_hex(); let file_path = self.latest_modules_path().join(filename); - let result = unsafe { Module::deserialize_from_file(store, file_path) }; + let result = unsafe { Module::deserialize_from_file(store, &file_path) }; match result { - Ok(module) => Ok(Some(module)), + Ok(module) => { + let module_size = file_path + .metadata() + .map_err(|e| { + VmError::cache_err(format!("Error getting module file size: {}", e)) + })? + .len(); + Ok(Some((module, module_size as usize))) + } Err(DeserializeError::Io(err)) => match err.kind() { io::ErrorKind::NotFound => Ok(None), _ => Err(VmError::cache_err(format!( @@ -125,7 +135,9 @@ impl FileSystemCache { } /// Stores a serialized module to the file system. Returns the size of the serialized module. - pub fn store(&mut self, checksum: &Checksum, module: &Module) -> VmResult<()> { + /// The serialized module size is a good approximation (~100.06 %) of the in-memory module size. + /// It should not be considered as the exact in-memory module size. + pub fn store(&mut self, checksum: &Checksum, module: &Module) -> VmResult { let modules_dir = self.latest_modules_path(); mkdir_p(&modules_dir) .map_err(|_e| VmError::cache_err("Error creating modules directory"))?; @@ -133,9 +145,13 @@ impl FileSystemCache { let filename = checksum.to_hex(); let path = modules_dir.join(filename); module - .serialize_to_file(path) + .serialize_to_file(path.clone()) .map_err(|e| VmError::cache_err(format!("Error writing module to disk: {}", e)))?; - Ok(()) + let module_size = path + .metadata() + .map_err(|e| VmError::cache_err(format!("Error getting module file size: {}", e)))? + .len(); + Ok(module_size as usize) } /// Removes a serialized module from the file system. @@ -212,7 +228,8 @@ mod tests { // Check the returned module is functional. // This is not really testing the cache API but better safe than sorry. { - let cached_module = cached.unwrap(); + let (cached_module, module_size) = cached.unwrap(); + assert_eq!(module_size, module.serialize().unwrap().len()); let import_object = imports! {}; let instance = WasmerInstance::new(&cached_module, &import_object).unwrap(); set_remaining_points(&instance, TESTING_GAS_LIMIT); From 70517fd987c9ec0b3851f4987936d181a231a1a4 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 19 Apr 2023 12:18:56 +0200 Subject: [PATCH 0201/2372] Pull out estimate_module_size --- packages/vm/src/modules/file_system_cache.rs | 36 ++++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 08d751a0f7..a0729f3a23 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -1,5 +1,6 @@ use std::fs; use std::io; +use std::path::Path; use std::path::PathBuf; use thiserror::Error; @@ -103,8 +104,6 @@ impl FileSystemCache { /// Loads a serialized module from the file system and returns a module (i.e. artifact + store), /// along with the size of the serialized module. - /// The serialized module size is a good approximation (~100.06 %) of the in-memory module size. - /// It should not be considered as the exact in-memory module size. pub fn load(&self, checksum: &Checksum, store: &Store) -> VmResult> { let filename = checksum.to_hex(); let file_path = self.latest_modules_path().join(filename); @@ -112,13 +111,8 @@ impl FileSystemCache { let result = unsafe { Module::deserialize_from_file(store, &file_path) }; match result { Ok(module) => { - let module_size = file_path - .metadata() - .map_err(|e| { - VmError::cache_err(format!("Error getting module file size: {}", e)) - })? - .len(); - Ok(Some((module, module_size as usize))) + let module_size = estimate_module_size(&file_path)?; + Ok(Some((module, module_size))) } Err(DeserializeError::Io(err)) => match err.kind() { io::ErrorKind::NotFound => Ok(None), @@ -145,13 +139,10 @@ impl FileSystemCache { let filename = checksum.to_hex(); let path = modules_dir.join(filename); module - .serialize_to_file(path.clone()) + .serialize_to_file(&path) .map_err(|e| VmError::cache_err(format!("Error writing module to disk: {}", e)))?; - let module_size = path - .metadata() - .map_err(|e| VmError::cache_err(format!("Error getting module file size: {}", e)))? - .len(); - Ok(module_size as usize) + let module_size = estimate_module_size(&path)?; + Ok(module_size) } /// Removes a serialized module from the file system. @@ -180,6 +171,21 @@ impl FileSystemCache { } } +/// Estimates the in-memory size of a wasmer Module based on the size it takes on disk. +/// The serialized module size is a good approximation (~100.06 %) of the in-memory module size. +/// It should not be considered as the exact in-memory module size. +/// The reason this works well is that Wasmer uses rkyv for module serialization to disk, which +/// is more or less a 1:1 dump of the memory. +fn estimate_module_size(module_path: &Path) -> VmResult { + let module_size: usize = module_path + .metadata() + .map_err(|_e| VmError::cache_err("Error getting file metadata"))? // ensure error message is not system specific + .len() + .try_into() + .expect("Could not convert file size to usize"); + Ok(module_size) +} + #[cfg(test)] mod tests { use std::fs; From adf463bf94a52fd096c56df7a46218a323c76683 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 19 Apr 2023 12:26:33 +0200 Subject: [PATCH 0202/2372] Add CHANGELOG entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 60a94e7347..b044c5e856 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,8 @@ and this project adheres to - cosmwasm-vm: Limit number of imports during static validation ([#1629]). - cosmwasm-vm: The `check_contract` example was removed. Please use the crate [cosmwasm-check](https://crates.io/crates/cosmwasm-check) instead ([#1511]). +- cosmwasm-vm: Avoid using loupe for getting the `Module` size in the file + system cache to prepare for the Wasmer 3 upgrade. [#1511]: https://github.com/CosmWasm/cosmwasm/issues/1511 [#1629]: https://github.com/CosmWasm/cosmwasm/pull/1629 From dd43ad94e336e0df45dbdbf069f78e70857d5071 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 20 Apr 2023 12:08:54 +0200 Subject: [PATCH 0203/2372] Remove size estimation comment from store --- packages/vm/src/modules/file_system_cache.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index a0729f3a23..058e73fc7f 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -129,8 +129,6 @@ impl FileSystemCache { } /// Stores a serialized module to the file system. Returns the size of the serialized module. - /// The serialized module size is a good approximation (~100.06 %) of the in-memory module size. - /// It should not be considered as the exact in-memory module size. pub fn store(&mut self, checksum: &Checksum, module: &Module) -> VmResult { let modules_dir = self.latest_modules_path(); mkdir_p(&modules_dir) From cdfaf8db4f8ff9e8868fc1a95951663a955cd511 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 20 Apr 2023 12:14:20 +0200 Subject: [PATCH 0204/2372] Rename estimate_module_size to module_size --- packages/vm/src/modules/file_system_cache.rs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 058e73fc7f..feb7215712 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -111,7 +111,7 @@ impl FileSystemCache { let result = unsafe { Module::deserialize_from_file(store, &file_path) }; match result { Ok(module) => { - let module_size = estimate_module_size(&file_path)?; + let module_size = module_size(&file_path)?; Ok(Some((module, module_size))) } Err(DeserializeError::Io(err)) => match err.kind() { @@ -139,7 +139,7 @@ impl FileSystemCache { module .serialize_to_file(&path) .map_err(|e| VmError::cache_err(format!("Error writing module to disk: {}", e)))?; - let module_size = estimate_module_size(&path)?; + let module_size = module_size(&path)?; Ok(module_size) } @@ -169,12 +169,8 @@ impl FileSystemCache { } } -/// Estimates the in-memory size of a wasmer Module based on the size it takes on disk. -/// The serialized module size is a good approximation (~100.06 %) of the in-memory module size. -/// It should not be considered as the exact in-memory module size. -/// The reason this works well is that Wasmer uses rkyv for module serialization to disk, which -/// is more or less a 1:1 dump of the memory. -fn estimate_module_size(module_path: &Path) -> VmResult { +/// Returns the size of the module stored on disk +fn module_size(module_path: &Path) -> VmResult { let module_size: usize = module_path .metadata() .map_err(|_e| VmError::cache_err("Error getting file metadata"))? // ensure error message is not system specific From 4d6126e2716ea498840cc20f138d7f1ddbf7879b Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 19 Apr 2023 14:25:41 +0200 Subject: [PATCH 0205/2372] Add target_id --- Cargo.lock | 2 + contracts/burner/Cargo.lock | 5 ++- contracts/crypto-verify/Cargo.lock | 5 ++- contracts/cyberpunk/Cargo.lock | 5 ++- contracts/floaty/Cargo.lock | 5 ++- contracts/hackatom/Cargo.lock | 5 ++- contracts/ibc-reflect-send/Cargo.lock | 5 ++- contracts/ibc-reflect/Cargo.lock | 5 ++- contracts/queue/Cargo.lock | 5 ++- contracts/reflect/Cargo.lock | 5 ++- contracts/staking/Cargo.lock | 5 ++- contracts/virus/Cargo.lock | 5 ++- packages/vm/Cargo.toml | 2 + packages/vm/src/modules/file_system_cache.rs | 39 +++++++++++++++++++- 14 files changed, 75 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 49591b6d59..ab6558fe85 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -385,6 +385,7 @@ dependencies = [ "clru", "cosmwasm-crypto", "cosmwasm-std", + "crc32fast", "criterion", "enumset", "hex", @@ -397,6 +398,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.3", + "target-lexicon", "tempfile", "thiserror", "wasmer", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 54a32fc3b3..34e6a44f5c 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -237,6 +237,7 @@ dependencies = [ "clru", "cosmwasm-crypto", "cosmwasm-std", + "crc32fast", "enumset", "hex", "loupe", @@ -329,9 +330,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 0b499b9bae..cb0b85462e 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -240,6 +240,7 @@ dependencies = [ "clru", "cosmwasm-crypto", "cosmwasm-std", + "crc32fast", "enumset", "hex", "loupe", @@ -332,9 +333,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 282dc858c7..670c06f60e 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -263,6 +263,7 @@ dependencies = [ "clru", "cosmwasm-crypto", "cosmwasm-std", + "crc32fast", "enumset", "hex", "loupe", @@ -355,9 +356,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 595f20e041..adb80440c3 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -234,6 +234,7 @@ dependencies = [ "clru", "cosmwasm-crypto", "cosmwasm-std", + "crc32fast", "enumset", "hex", "loupe", @@ -326,9 +327,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 3deee4c5b8..6a6f8b1f75 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -234,6 +234,7 @@ dependencies = [ "clru", "cosmwasm-crypto", "cosmwasm-std", + "crc32fast", "enumset", "hex", "loupe", @@ -326,9 +327,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index c5dc7a5d52..635c031955 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -234,6 +234,7 @@ dependencies = [ "clru", "cosmwasm-crypto", "cosmwasm-std", + "crc32fast", "enumset", "hex", "loupe", @@ -326,9 +327,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 352884d804..5f7eaa7c25 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -234,6 +234,7 @@ dependencies = [ "clru", "cosmwasm-crypto", "cosmwasm-std", + "crc32fast", "enumset", "hex", "loupe", @@ -326,9 +327,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 9aac97b1f2..9331333d93 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -226,6 +226,7 @@ dependencies = [ "clru", "cosmwasm-crypto", "cosmwasm-std", + "crc32fast", "enumset", "hex", "loupe", @@ -318,9 +319,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 3fc0f33c7b..cfe2547ef8 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -234,6 +234,7 @@ dependencies = [ "clru", "cosmwasm-crypto", "cosmwasm-std", + "crc32fast", "enumset", "hex", "loupe", @@ -326,9 +327,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 91a90e6689..cd8b5c088e 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -234,6 +234,7 @@ dependencies = [ "clru", "cosmwasm-crypto", "cosmwasm-std", + "crc32fast", "enumset", "hex", "loupe", @@ -326,9 +327,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 413e017b1a..9a0324f83c 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -226,6 +226,7 @@ dependencies = [ "clru", "cosmwasm-crypto", "cosmwasm-std", + "crc32fast", "enumset", "hex", "loupe", @@ -318,9 +319,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 4cd374d42d..d7f1a815fd 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -36,6 +36,7 @@ bench = false [dependencies] clru = "0.4.0" +crc32fast = "1.3.2" # Uses the path when built locally; uses the given version from crates.io when published cosmwasm-std = { path = "../std", version = "1.2.4", default-features = false } cosmwasm-crypto = { path = "../crypto", version = "1.2.4" } @@ -70,6 +71,7 @@ wat = "1.0" clap = "2.33.3" rand = "0.8" leb128 = "0.2" +target-lexicon = "0.12" [[bench]] name = "main" diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index feb7215712..3d1ba1ae24 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -1,10 +1,11 @@ use std::fs; +use std::hash::Hash; use std::io; use std::path::Path; use std::path::PathBuf; use thiserror::Error; -use wasmer::{DeserializeError, Module, Store}; +use wasmer::{DeserializeError, Module, Store, Target}; use crate::checksum::Checksum; use crate::errors::{VmError, VmResult}; @@ -180,6 +181,18 @@ fn module_size(module_path: &Path) -> VmResult { Ok(module_size) } +/// Creates an identifier for the Wasmer `Target` that is used for +/// cache invalidation. The output is reasonable human friendly to be useable +/// in file path component. +#[allow(unused)] +fn target_id(target: &Target) -> String { + // Use a custom Hasher implementation to avoid randomization. + let mut deterministic_hasher = crc32fast::Hasher::new(); + target.hash(&mut deterministic_hasher); + let hash = deterministic_hasher.finalize(); + format!("{}-{:08X}", target.triple(), hash) // print 4 byte hash as 8 hex characters +} + #[cfg(test)] mod tests { use std::fs; @@ -289,4 +302,28 @@ mod tests { let existed = cache.remove(&checksum).unwrap(); assert!(!existed); } + + #[test] + fn target_id_works() { + let triple = wasmer::Triple { + architecture: wasmer::Architecture::X86_64, + vendor: target_lexicon::Vendor::Nintendo, + operating_system: target_lexicon::OperatingSystem::Fuchsia, + environment: target_lexicon::Environment::Gnu, + binary_format: target_lexicon::BinaryFormat::Coff, + }; + let target = Target::new(triple.clone(), wasmer::CpuFeature::POPCNT.into()); + let id = target_id(&target); + assert_eq!(id, "x86_64-nintendo-fuchsia-gnu-coff-4721E3F4"); + // Changing CPU features changes the hash part + let target = Target::new(triple, wasmer::CpuFeature::AVX512DQ.into()); + let id = target_id(&target); + assert_eq!(id, "x86_64-nintendo-fuchsia-gnu-coff-D5C8034F"); + + // Works for durrect target (hashing is deterministic); + let target = Target::default(); + let id1 = target_id(&target); + let id2 = target_id(&target); + assert_eq!(id1, id2); + } } From 95a27e71e27fc22bc8729f91303ca1ed3ce05e61 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 19 Apr 2023 14:53:45 +0200 Subject: [PATCH 0206/2372] Add target_id to modules path --- Cargo.lock | 7 ++ packages/vm/Cargo.toml | 1 + packages/vm/src/modules/file_system_cache.rs | 86 ++++++++++++-------- 3 files changed, 61 insertions(+), 33 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ab6558fe85..f327920bd0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -388,6 +388,7 @@ dependencies = [ "crc32fast", "criterion", "enumset", + "glob", "hex", "hex-literal", "leb128", @@ -892,6 +893,12 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + [[package]] name = "group" version = "0.12.0" diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index d7f1a815fd..74a5ac1a00 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -65,6 +65,7 @@ bitflags = "1.1.0" # https://github.com/CensoredUsername/dynasm-rs/pull/74 [dev-dependencies] criterion = { version = "0.4", features = [ "html_reports" ] } +glob = "0.3.1" hex-literal = "0.3.1" tempfile = "3.1.0" wat = "1.0" diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 3d1ba1ae24..c87f54de31 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -45,10 +45,7 @@ const MODULE_SERIALIZATION_VERSION: &str = "v4"; /// Representation of a directory that contains compiled Wasm artifacts. pub struct FileSystemCache { - /// The base path this cache operates in. Within this path, versioned directories are created. - /// A sophisticated version of this cache might be able to read multiple input versions in the future. - base_path: PathBuf, - wasmer_module_version: u32, + modules_path: PathBuf, } /// An error type that hides system specific error information @@ -73,19 +70,20 @@ impl FileSystemCache { /// /// This method is unsafe because there's no way to ensure the artifacts /// stored in this cache haven't been corrupted or tampered with. - pub unsafe fn new(path: impl Into) -> Result { - let wasmer_module_version = current_wasmer_module_version(); - - let path: PathBuf = path.into(); - if path.exists() { - let metadata = path + pub unsafe fn new(base_path: impl Into) -> Result { + let base_path: PathBuf = base_path.into(); + if base_path.exists() { + let metadata = base_path .metadata() .map_err(|_e| NewFileSystemCacheError::CouldntGetMetadata)?; if metadata.is_dir() { if !metadata.permissions().readonly() { Ok(Self { - base_path: path, - wasmer_module_version, + modules_path: modules_path( + &base_path, + current_wasmer_module_version(), + &Target::default(), + ), }) } else { Err(NewFileSystemCacheError::ReadonlyPath) @@ -95,10 +93,13 @@ impl FileSystemCache { } } else { // Create the directory and any parent directories if they don't yet exist. - mkdir_p(&path).map_err(|_e| NewFileSystemCacheError::CouldntCreatePath)?; + mkdir_p(&base_path).map_err(|_e| NewFileSystemCacheError::CouldntCreatePath)?; Ok(Self { - base_path: path, - wasmer_module_version, + modules_path: modules_path( + &base_path, + current_wasmer_module_version(), + &Target::default(), + ), }) } } @@ -107,7 +108,7 @@ impl FileSystemCache { /// along with the size of the serialized module. pub fn load(&self, checksum: &Checksum, store: &Store) -> VmResult> { let filename = checksum.to_hex(); - let file_path = self.latest_modules_path().join(filename); + let file_path = self.modules_path.join(filename); let result = unsafe { Module::deserialize_from_file(store, &file_path) }; match result { @@ -131,12 +132,11 @@ impl FileSystemCache { /// Stores a serialized module to the file system. Returns the size of the serialized module. pub fn store(&mut self, checksum: &Checksum, module: &Module) -> VmResult { - let modules_dir = self.latest_modules_path(); - mkdir_p(&modules_dir) + mkdir_p(&self.modules_path) .map_err(|_e| VmError::cache_err("Error creating modules directory"))?; let filename = checksum.to_hex(); - let path = modules_dir.join(filename); + let path = self.modules_path.join(filename); module .serialize_to_file(&path) .map_err(|e| VmError::cache_err(format!("Error writing module to disk: {}", e)))?; @@ -149,7 +149,7 @@ impl FileSystemCache { /// Returns true if the file existed and false if the file did not exist. pub fn remove(&mut self, checksum: &Checksum) -> VmResult { let filename = checksum.to_hex(); - let file_path = self.latest_modules_path().join(filename); + let file_path = self.modules_path.join(filename); if file_path.exists() { fs::remove_file(file_path) @@ -159,15 +159,6 @@ impl FileSystemCache { Ok(false) } } - - /// The path to the latest version of the modules. - fn latest_modules_path(&self) -> PathBuf { - let version = format!( - "{}-wasmer{}", - MODULE_SERIALIZATION_VERSION, self.wasmer_module_version - ); - self.base_path.join(version) - } } /// Returns the size of the module stored on disk @@ -184,7 +175,6 @@ fn module_size(module_path: &Path) -> VmResult { /// Creates an identifier for the Wasmer `Target` that is used for /// cache invalidation. The output is reasonable human friendly to be useable /// in file path component. -#[allow(unused)] fn target_id(target: &Target) -> String { // Use a custom Hasher implementation to avoid randomization. let mut deterministic_hasher = crc32fast::Hasher::new(); @@ -193,6 +183,16 @@ fn target_id(target: &Target) -> String { format!("{}-{:08X}", target.triple(), hash) // print 4 byte hash as 8 hex characters } +/// The path to the latest version of the modules. +fn modules_path(base_path: &Path, wasmer_module_version: u32, target: &Target) -> PathBuf { + let version_dir = format!( + "{}-wasmer{}", + MODULE_SERIALIZATION_VERSION, wasmer_module_version + ); + let target_dir = target_id(target); + base_path.join(version_dir).join(target_dir) +} + #[cfg(test)] mod tests { use std::fs; @@ -265,11 +265,13 @@ mod tests { let module = compile(&wasm, None, &[]).unwrap(); cache.store(&checksum, &module).unwrap(); - let file_path = format!( - "{}/v4-wasmer1/{}", + let mut globber = glob::glob(&format!( + "{}/v4-wasmer1/**/{}", tmp_dir.path().to_string_lossy(), checksum - ); + )) + .expect("Failed to read glob pattern"); + let file_path = globber.next().unwrap().unwrap(); let _serialized_module = fs::read(file_path).unwrap(); } @@ -326,4 +328,22 @@ mod tests { let id2 = target_id(&target); assert_eq!(id1, id2); } + + #[test] + fn modules_path_works() { + let base = PathBuf::from("./modules/"); + let triple = wasmer::Triple { + architecture: wasmer::Architecture::X86_64, + vendor: target_lexicon::Vendor::Nintendo, + operating_system: target_lexicon::OperatingSystem::Fuchsia, + environment: target_lexicon::Environment::Gnu, + binary_format: target_lexicon::BinaryFormat::Coff, + }; + let target = Target::new(triple, wasmer::CpuFeature::POPCNT.into()); + let p = modules_path(&base, 17, &target); + assert_eq!( + p.as_os_str(), + "./modules/v4-wasmer17/x86_64-nintendo-fuchsia-gnu-coff-4721E3F4" + ); + } } From cea6e8821c48a172f04de3d2592fe937e7608eca Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 19 Apr 2023 15:19:14 +0200 Subject: [PATCH 0207/2372] Make modules_path_works test Windows complient --- packages/vm/src/modules/file_system_cache.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index c87f54de31..209a10020f 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -331,7 +331,7 @@ mod tests { #[test] fn modules_path_works() { - let base = PathBuf::from("./modules/"); + let base = PathBuf::from("modules"); let triple = wasmer::Triple { architecture: wasmer::Architecture::X86_64, vendor: target_lexicon::Vendor::Nintendo, @@ -343,7 +343,11 @@ mod tests { let p = modules_path(&base, 17, &target); assert_eq!( p.as_os_str(), - "./modules/v4-wasmer17/x86_64-nintendo-fuchsia-gnu-coff-4721E3F4" + if cfg!(windows) { + "modules\\v4-wasmer17\\x86_64-nintendo-fuchsia-gnu-coff-4721E3F4" + } else { + "modules/v4-wasmer17/x86_64-nintendo-fuchsia-gnu-coff-4721E3F4" + } ); } } From 75a06f0ee95e71e1f7cf0135face0d3106a16c7e Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 20 Apr 2023 17:10:40 +0200 Subject: [PATCH 0208/2372] Refactor FileSystemCache::new to only have one ending --- packages/vm/src/modules/file_system_cache.rs | 34 ++++++++------------ 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 209a10020f..77b997ab6c 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -76,32 +76,24 @@ impl FileSystemCache { let metadata = base_path .metadata() .map_err(|_e| NewFileSystemCacheError::CouldntGetMetadata)?; - if metadata.is_dir() { - if !metadata.permissions().readonly() { - Ok(Self { - modules_path: modules_path( - &base_path, - current_wasmer_module_version(), - &Target::default(), - ), - }) - } else { - Err(NewFileSystemCacheError::ReadonlyPath) - } - } else { - Err(NewFileSystemCacheError::ExistsButNoDirectory) + if !metadata.is_dir() { + return Err(NewFileSystemCacheError::ExistsButNoDirectory); + } + if metadata.permissions().readonly() { + return Err(NewFileSystemCacheError::ReadonlyPath); } } else { // Create the directory and any parent directories if they don't yet exist. mkdir_p(&base_path).map_err(|_e| NewFileSystemCacheError::CouldntCreatePath)?; - Ok(Self { - modules_path: modules_path( - &base_path, - current_wasmer_module_version(), - &Target::default(), - ), - }) } + + Ok(Self { + modules_path: modules_path( + &base_path, + current_wasmer_module_version(), + &Target::default(), + ), + }) } /// Loads a serialized module from the file system and returns a module (i.e. artifact + store), From c88b03564237d090a01bd820005ad0637200ea3d Mon Sep 17 00:00:00 2001 From: kogisin Date: Sun, 23 Apr 2023 15:13:52 +0900 Subject: [PATCH 0209/2372] fix: remove as well --- SEMANTICS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SEMANTICS.md b/SEMANTICS.md index 9534693616..33cab27441 100644 --- a/SEMANTICS.md +++ b/SEMANTICS.md @@ -295,7 +295,7 @@ After the `submessage` is finished, the caller will get a chance to handle the result. It will get the original `id` of the subcall so it can switch on how to process this, and the `Result` of the execution, both success and error. Note that it includes all events returned by the submessage, which applies to native -sdk modules as well (like Bank) as well as the data returned from below. This +sdk modules (like Bank) as well as the data returned from below. This and the original call id provide all context to continue processing it. If you need more state, you must save some local context to the store (under the `id`) before returning the `submessage` in the original `execute`, and load it in From 761fff1ef52d52ca771eff4c9fbbc0817f23e77a Mon Sep 17 00:00:00 2001 From: kogisin Date: Sun, 23 Apr 2023 15:21:16 +0900 Subject: [PATCH 0210/2372] fix: typographic errors --- SEMANTICS.md | 2 +- contracts/README.md | 2 +- contracts/staking/README.md | 2 +- docs/USING_COSMWASM_STD.md | 6 +++--- packages/crypto/README.md | 4 ++-- packages/storage/README.md | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/SEMANTICS.md b/SEMANTICS.md index 33cab27441..d675e71421 100644 --- a/SEMANTICS.md +++ b/SEMANTICS.md @@ -366,7 +366,7 @@ of reentrancy, as the query cannot modify any state or execute our contract. When we "make a query", we serialize a [`QueryRequest` struct](https://github.com/CosmWasm/cosmwasm/blob/v0.14.0-beta4/packages/std/src/query/mod.rs#L27-L48) that represents all possible calls, and then pass that over FFI to the runtime, -where it is interpretted in the `x/wasm` SDK module. This is extensible with +where it is interpreted in the `x/wasm` SDK module. This is extensible with blockchain-specific custom queries just like `CosmosMsg` accepts custom results. Also note the ability to perform raw protobuf "Stargate" queries: diff --git a/contracts/README.md b/contracts/README.md index 845af6995d..7ed97a842b 100644 --- a/contracts/README.md +++ b/contracts/README.md @@ -19,7 +19,7 @@ Introducing the development contracts in the order they were created. which allows the user to send messages to the contract which are then emitted with the contract as the sender. It later got support to handle sub messages and replys ([#796](https://github.com/CosmWasm/cosmwasm/pull/796)). -4. **staking** is a staking derivates example showing how the contract itself +4. **staking** is a staking derivatives example showing how the contract itself can be a delegator. 5. **burner** shows how contract migrations work, which were added in CosmWasm 0.9 ([#413](https://github.com/CosmWasm/cosmwasm/pull/413)). It shuts down diff --git a/contracts/staking/README.md b/contracts/staking/README.md index 3221f42946..5ecaa7ac78 100644 --- a/contracts/staking/README.md +++ b/contracts/staking/README.md @@ -22,7 +22,7 @@ unbonding period). To show an example of charging for such a service, we allow the contract owner to take a small exit tax, thus maybe 98% of the tokens will be unbonded and sent to the original account, and 2% of the tokens are not unbonded, but rather -transfered to the owners account. (The ownership can also be transfered). +transferred to the owners account. (The ownership can also be transferred). ## Using this project diff --git a/docs/USING_COSMWASM_STD.md b/docs/USING_COSMWASM_STD.md index 45841e908b..5452faa398 100644 --- a/docs/USING_COSMWASM_STD.md +++ b/docs/USING_COSMWASM_STD.md @@ -2,7 +2,7 @@ cosmwasm-std is the standard library for building contracts in CosmWasm. It is compiled as part of the contract to Wasm. When creating a dependency to -cosmwasm-std, the required Wasm imports and exports are created implicitely via +cosmwasm-std, the required Wasm imports and exports are created implicitly via C interfaces, e.g.: ```rust @@ -37,11 +37,11 @@ The libarary comes with the following features: | Feature | Enabled by default | Description | | ------------ | ------------------ | -------------------------------------------------------------------------- | | iterator | x | Storage iterators | -| abort | x | A panic handler that aborts the contract execution with a helpfull message | +| abort | x | A panic handler that aborts the contract execution with a helpful message | | stargate | | Cosmos SDK 0.40+ features and IBC | | ibc3 | | New fields added in IBC v3 | | staking | | Access to the staking module | -| baktraces | | Add backtraces to errors (for unit testing) | +| backtraces | | Add backtraces to errors (for unit testing) | | cosmwasm_1_1 | | Features that require CosmWasm 1.1+ on the chain | | cosmwasm_1_2 | | Features that require CosmWasm 1.2+ on the chain | diff --git a/packages/crypto/README.md b/packages/crypto/README.md index b1dc660d0e..cf927879a7 100644 --- a/packages/crypto/README.md +++ b/packages/crypto/README.md @@ -11,9 +11,9 @@ and [cosmwasm-std](`https://crates.io/crates/cosmwasm-std`) crates. - `secp256k1_verify()`: Digital signature verification using the ECDSA sepc256k1 scheme, for Cosmos signature / public key formats. - `ed25519_verify()`: Digital signature verification using the EdDSA ed25519 - scheme, for Tendemint signature / public key formats. + scheme, for Tendermint signature / public key formats. - `ed25519_batch_verify()`: Batch digital signature verification using the EdDSA - ed25519 scheme, for Tendemint signature / public key formats. + ed25519 scheme, for Tendermint signature / public key formats. ## Benchmarking diff --git a/packages/storage/README.md b/packages/storage/README.md index 5ed7379226..933028028e 100644 --- a/packages/storage/README.md +++ b/packages/storage/README.md @@ -4,7 +4,7 @@ CosmWasm library with useful helpers for Storage patterns. You can use `Storage` implementations in `cosmwasm-std`, or rely on these to remove some common -boilterplate. +boilerplate. ## Contents From cd3749c5ab254b9ddf5a25761aefecb0ba9e7f95 Mon Sep 17 00:00:00 2001 From: kogisin Date: Sun, 23 Apr 2023 15:25:40 +0900 Subject: [PATCH 0211/2372] fix: fix The to They --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cb619b1dff..7536c89f59 100644 --- a/README.md +++ b/README.md @@ -137,7 +137,7 @@ See [Minimum Supported Rust Version (MSRV)](./docs/MSRV.md). ## API entry points -WebAssembly contracts are basically black boxes. The have no default entry +WebAssembly contracts are basically black boxes. They have no default entry points, and no access to the outside world by default. To make them useful, we need to add a few elements. From 0a04e658252f8c3166025d903867f28c23d6e715 Mon Sep 17 00:00:00 2001 From: kogisin Date: Mon, 24 Apr 2023 15:49:36 +0900 Subject: [PATCH 0212/2372] fix: fix validate markdown files issue by running format_md script --- SEMANTICS.md | 14 +++++++------- docs/USING_COSMWASM_STD.md | 24 ++++++++++++------------ 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/SEMANTICS.md b/SEMANTICS.md index d675e71421..dc6afcb66a 100644 --- a/SEMANTICS.md +++ b/SEMANTICS.md @@ -295,13 +295,13 @@ After the `submessage` is finished, the caller will get a chance to handle the result. It will get the original `id` of the subcall so it can switch on how to process this, and the `Result` of the execution, both success and error. Note that it includes all events returned by the submessage, which applies to native -sdk modules (like Bank) as well as the data returned from below. This -and the original call id provide all context to continue processing it. If you -need more state, you must save some local context to the store (under the `id`) -before returning the `submessage` in the original `execute`, and load it in -`reply`. We explicitly prohibit passing information in contract memory, as that -is the key vector for reentrancy attacks, which are a large security surface -area in Ethereum. +sdk modules (like Bank) as well as the data returned from below. This and the +original call id provide all context to continue processing it. If you need more +state, you must save some local context to the store (under the `id`) before +returning the `submessage` in the original `execute`, and load it in `reply`. We +explicitly prohibit passing information in contract memory, as that is the key +vector for reentrancy attacks, which are a large security surface area in +Ethereum. The `reply` call may return `Err` itself, in which case it is treated like the caller errored, and aborting the transaction. However, on successful processing, diff --git a/docs/USING_COSMWASM_STD.md b/docs/USING_COSMWASM_STD.md index 5452faa398..7da8fa6e92 100644 --- a/docs/USING_COSMWASM_STD.md +++ b/docs/USING_COSMWASM_STD.md @@ -2,8 +2,8 @@ cosmwasm-std is the standard library for building contracts in CosmWasm. It is compiled as part of the contract to Wasm. When creating a dependency to -cosmwasm-std, the required Wasm imports and exports are created implicitly via -C interfaces, e.g.: +cosmwasm-std, the required Wasm imports and exports are created implicitly via C +interfaces, e.g.: ```rust // Exports @@ -34,16 +34,16 @@ in the dependency tree. Otherwise conflicting C exports are created. The libarary comes with the following features: -| Feature | Enabled by default | Description | -| ------------ | ------------------ | -------------------------------------------------------------------------- | -| iterator | x | Storage iterators | -| abort | x | A panic handler that aborts the contract execution with a helpful message | -| stargate | | Cosmos SDK 0.40+ features and IBC | -| ibc3 | | New fields added in IBC v3 | -| staking | | Access to the staking module | -| backtraces | | Add backtraces to errors (for unit testing) | -| cosmwasm_1_1 | | Features that require CosmWasm 1.1+ on the chain | -| cosmwasm_1_2 | | Features that require CosmWasm 1.2+ on the chain | +| Feature | Enabled by default | Description | +| ------------ | ------------------ | ------------------------------------------------------------------------- | +| iterator | x | Storage iterators | +| abort | x | A panic handler that aborts the contract execution with a helpful message | +| stargate | | Cosmos SDK 0.40+ features and IBC | +| ibc3 | | New fields added in IBC v3 | +| staking | | Access to the staking module | +| backtraces | | Add backtraces to errors (for unit testing) | +| cosmwasm_1_1 | | Features that require CosmWasm 1.1+ on the chain | +| cosmwasm_1_2 | | Features that require CosmWasm 1.2+ on the chain | ## The cosmwasm-std dependency for contract developers From 9c16d6ff736abf3d3ef33197ffab70759ac05a51 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 24 Apr 2023 17:19:22 +0200 Subject: [PATCH 0213/2372] Add CHANGELOG entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b044c5e856..024c86839e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,10 +22,13 @@ and this project adheres to [cosmwasm-check](https://crates.io/crates/cosmwasm-check) instead ([#1511]). - cosmwasm-vm: Avoid using loupe for getting the `Module` size in the file system cache to prepare for the Wasmer 3 upgrade. +- cosmwasm-vm: Add target (triple + CPU features) into the module cache + directory to avoid using modules compiled for a different system ([#1664]). [#1511]: https://github.com/CosmWasm/cosmwasm/issues/1511 [#1629]: https://github.com/CosmWasm/cosmwasm/pull/1629 [#1631]: https://github.com/CosmWasm/cosmwasm/pull/1631 +[#1664]: https://github.com/CosmWasm/cosmwasm/pull/1664 ## [1.2.4] - 2023-04-17 From f7d2546746372ca684598db5434a68518fa7f07a Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 24 Apr 2023 17:41:30 +0200 Subject: [PATCH 0214/2372] Bump MODULE_SERIALIZATION_VERSION to v5 --- CHANGELOG.md | 3 ++- packages/vm/src/modules/file_system_cache.rs | 10 ++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 024c86839e..08dbcc5e15 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,7 +23,8 @@ and this project adheres to - cosmwasm-vm: Avoid using loupe for getting the `Module` size in the file system cache to prepare for the Wasmer 3 upgrade. - cosmwasm-vm: Add target (triple + CPU features) into the module cache - directory to avoid using modules compiled for a different system ([#1664]). + directory to avoid using modules compiled for a different system. Bump + `MODULE_SERIALIZATION_VERSION` to "v5". ([#1664]) [#1511]: https://github.com/CosmWasm/cosmwasm/issues/1511 [#1629]: https://github.com/CosmWasm/cosmwasm/pull/1629 diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 77b997ab6c..f8b3cceebd 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -41,7 +41,9 @@ use crate::modules::current_wasmer_module_version; /// the module header version (). In cosmwasm-vm 1.1.0-1.1.1 /// the old value "v3" is still used along with Wasmer 2.3.0 (bug). From cosmwasm 1.1.2 onwards, this is /// fixed by bumping to "v4". -const MODULE_SERIALIZATION_VERSION: &str = "v4"; +/// - **v5**:
+/// Version for cosmwasm_vm 1.3+ which adds a sub-folder with the target identier for the modules. +const MODULE_SERIALIZATION_VERSION: &str = "v5"; /// Representation of a directory that contains compiled Wasm artifacts. pub struct FileSystemCache { @@ -258,7 +260,7 @@ mod tests { cache.store(&checksum, &module).unwrap(); let mut globber = glob::glob(&format!( - "{}/v4-wasmer1/**/{}", + "{}/v5-wasmer1/**/{}", tmp_dir.path().to_string_lossy(), checksum )) @@ -336,9 +338,9 @@ mod tests { assert_eq!( p.as_os_str(), if cfg!(windows) { - "modules\\v4-wasmer17\\x86_64-nintendo-fuchsia-gnu-coff-4721E3F4" + "modules\\v5-wasmer17\\x86_64-nintendo-fuchsia-gnu-coff-4721E3F4" } else { - "modules/v4-wasmer17/x86_64-nintendo-fuchsia-gnu-coff-4721E3F4" + "modules/v5-wasmer17/x86_64-nintendo-fuchsia-gnu-coff-4721E3F4" } ); } From f097f599afdc08a961d47727617817d44e5f4f18 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 20 Apr 2023 14:16:56 +0200 Subject: [PATCH 0215/2372] Add configurable debug_handler to Environment --- packages/vm/src/environment.rs | 15 ++++++++++++--- packages/vm/src/imports.rs | 5 +++-- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index 02270726ec..0ca0753f5b 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -1,6 +1,7 @@ //! Internal details to be used by instance.rs only use std::borrow::{Borrow, BorrowMut}; use std::ptr::NonNull; +use std::rc::Rc; use std::sync::{Arc, RwLock}; use wasmer::{HostEnvInitError, Instance as WasmerInstance, Memory, Val, WasmerEnv}; @@ -79,12 +80,14 @@ impl GasState { } } +pub type DebugHandlerFn = dyn for<'a> Fn(/* msg */ &'a str, /* gas remaining */ u64); + /// A environment that provides access to the ContextData. /// The environment is clonable but clones access the same underlying data. pub struct Environment { pub api: A, - pub print_debug: bool, pub gas_config: GasConfig, + pub debug_handler: Option>, data: Arc>>, } @@ -96,8 +99,8 @@ impl Clone for Environment { fn clone(&self) -> Self { Environment { api: self.api, - print_debug: self.print_debug, gas_config: self.gas_config.clone(), + debug_handler: self.debug_handler.clone(), data: self.data.clone(), } } @@ -113,8 +116,14 @@ impl Environment { pub fn new(api: A, gas_limit: u64, print_debug: bool) -> Self { Environment { api, - print_debug, gas_config: GasConfig::default(), + debug_handler: if print_debug { + Some(Rc::new(|msg: &str, _gas_remaining| { + println!("{msg}"); + })) + } else { + None + }, data: Arc::new(RwLock::new(ContextData::new(gas_limit))), } } diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index bae11f403c..cdc27bf1d9 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -387,10 +387,11 @@ pub fn do_debug( env: &Environment, message_ptr: u32, ) -> VmResult<()> { - if env.print_debug { + if let Some(debug_handler) = env.debug_handler.as_ref() { let message_data = read_region(&env.memory(), message_ptr, MAX_LENGTH_DEBUG)?; let msg = String::from_utf8_lossy(&message_data); - println!("{}", msg); + let gas_remaining = env.get_gas_left(); + (*debug_handler)(&msg, gas_remaining); } Ok(()) } From 2d365a8397cda21d7d2dba3fc90d64efea8f5302 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 21 Apr 2023 10:41:46 +0200 Subject: [PATCH 0216/2372] Add set_debug_handler/unset_debug_handler to Instance; fix internal cloning --- packages/vm/src/environment.rs | 34 +++++++++++++++++++++++----------- packages/vm/src/imports.rs | 4 ++-- packages/vm/src/instance.rs | 19 ++++++++++++++++++- 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index 0ca0753f5b..7dba979c95 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -80,6 +80,12 @@ impl GasState { } } +// Unfortunately we cannot create an alias for the trait (https://github.com/rust-lang/rust/issues/41517). +// So we need to copy it in a few places. +// +// /- BEGIN TRAIT END TRAIT \ +// | | +// v v pub type DebugHandlerFn = dyn for<'a> Fn(/* msg */ &'a str, /* gas remaining */ u64); /// A environment that provides access to the ContextData. @@ -87,7 +93,6 @@ pub type DebugHandlerFn = dyn for<'a> Fn(/* msg */ &'a str, /* gas remaining */ pub struct Environment { pub api: A, pub gas_config: GasConfig, - pub debug_handler: Option>, data: Arc>>, } @@ -100,7 +105,6 @@ impl Clone for Environment { Environment { api: self.api, gas_config: self.gas_config.clone(), - debug_handler: self.debug_handler.clone(), data: self.data.clone(), } } @@ -113,21 +117,27 @@ impl WasmerEnv for Environment { } impl Environment { - pub fn new(api: A, gas_limit: u64, print_debug: bool) -> Self { + pub fn new(api: A, gas_limit: u64) -> Self { Environment { api, gas_config: GasConfig::default(), - debug_handler: if print_debug { - Some(Rc::new(|msg: &str, _gas_remaining| { - println!("{msg}"); - })) - } else { - None - }, data: Arc::new(RwLock::new(ContextData::new(gas_limit))), } } + pub fn set_debug_handler(&self, debug_handler: Option>) { + self.with_context_data_mut(|context_data| { + context_data.debug_handler = debug_handler; + }) + } + + pub fn debug_handler(&self) -> Option> { + self.with_context_data(|context_data| { + // This clone here requires us to wrap the function in Rc instead of Box + context_data.debug_handler.clone() + }) + } + fn with_context_data_mut(&self, callback: C) -> R where C: FnOnce(&mut ContextData) -> R, @@ -362,6 +372,7 @@ pub struct ContextData { storage_readonly: bool, call_depth: usize, querier: Option, + debug_handler: Option>, /// A non-owning link to the wasmer instance wasmer_instance: Option>, } @@ -374,6 +385,7 @@ impl ContextData { storage_readonly: true, call_depth: 0, querier: None, + debug_handler: None, wasmer_instance: None, } } @@ -438,7 +450,7 @@ mod tests { Environment, Box, ) { - let env = Environment::new(MockApi::default(), gas_limit, false); + let env = Environment::new(MockApi::default(), gas_limit); let module = compile(CONTRACT, TESTING_MEMORY_LIMIT, &[]).unwrap(); let store = module.store(); diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index cdc27bf1d9..fe394adf6e 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -387,7 +387,7 @@ pub fn do_debug( env: &Environment, message_ptr: u32, ) -> VmResult<()> { - if let Some(debug_handler) = env.debug_handler.as_ref() { + if let Some(debug_handler) = env.debug_handler() { let message_data = read_region(&env.memory(), message_ptr, MAX_LENGTH_DEBUG)?; let msg = String::from_utf8_lossy(&message_data); let gas_remaining = env.get_gas_left(); @@ -541,7 +541,7 @@ mod tests { Box, ) { let gas_limit = TESTING_GAS_LIMIT; - let env = Environment::new(api, gas_limit, false); + let env = Environment::new(api, gas_limit); let module = compile(CONTRACT, TESTING_MEMORY_LIMIT, &[]).unwrap(); let store = module.store(); diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index dd33e90b2c..e63378c4ae 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -1,5 +1,6 @@ use std::collections::{HashMap, HashSet}; use std::ptr::NonNull; +use std::rc::Rc; use std::sync::Mutex; use wasmer::{Exports, Function, ImportObject, Instance as WasmerInstance, Module, Val}; @@ -85,7 +86,12 @@ where ) -> VmResult { let store = module.store(); - let env = Environment::new(backend.api, gas_limit, print_debug); + let env = Environment::new(backend.api, gas_limit); + if print_debug { + env.set_debug_handler(Some(Rc::new(|msg: &str, _gas_remaining| { + println!("{msg}"); + }))) + } let mut import_obj = ImportObject::new(); let mut env_imports = Exports::new(); @@ -265,6 +271,17 @@ where } } + pub fn set_debug_handler(&mut self, debug_handler: H) + where + H: for<'a> Fn(/* msg */ &'a str, /* gas remaining */ u64) + 'static, + { + self.env.set_debug_handler(Some(Rc::new(debug_handler))); + } + + pub fn unset_debug_handler(&mut self) { + self.env.set_debug_handler(None); + } + /// Returns the features required by this contract. /// /// This is not needed for production because we can do static analysis From 6affd2517c0dd5d4138b31f61111cede0088a389 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 24 Apr 2023 18:09:41 +0200 Subject: [PATCH 0217/2372] Print debug to STDERR by default --- CHANGELOG.md | 3 +++ packages/vm/src/instance.rs | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 08dbcc5e15..42b8872fb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,11 +25,14 @@ and this project adheres to - cosmwasm-vm: Add target (triple + CPU features) into the module cache directory to avoid using modules compiled for a different system. Bump `MODULE_SERIALIZATION_VERSION` to "v5". ([#1664]) +- cosmwasm-vm: When enabling `print_debug` the debug logs are now printed to + STDERR instead of STDOUT by default ([#1667]). [#1511]: https://github.com/CosmWasm/cosmwasm/issues/1511 [#1629]: https://github.com/CosmWasm/cosmwasm/pull/1629 [#1631]: https://github.com/CosmWasm/cosmwasm/pull/1631 [#1664]: https://github.com/CosmWasm/cosmwasm/pull/1664 +[#1667]: https://github.com/CosmWasm/cosmwasm/pull/1667 ## [1.2.4] - 2023-04-17 diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index e63378c4ae..b82d1a6efb 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -89,7 +89,7 @@ where let env = Environment::new(backend.api, gas_limit); if print_debug { env.set_debug_handler(Some(Rc::new(|msg: &str, _gas_remaining| { - println!("{msg}"); + eprintln!("{msg}"); }))) } From 60feac8115c0b1abdec1da52e306ae5a02082e7f Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 21 Apr 2023 13:00:55 +0200 Subject: [PATCH 0218/2372] Add debug example to cyberpunk --- contracts/cyberpunk/schema/cyberpunk.json | 14 +++++ contracts/cyberpunk/schema/raw/execute.json | 14 +++++ contracts/cyberpunk/src/contract.rs | 61 ++++++++++++++++++++- contracts/cyberpunk/src/msg.rs | 2 + contracts/cyberpunk/tests/integration.rs | 23 ++++++++ 5 files changed, 113 insertions(+), 1 deletion(-) diff --git a/contracts/cyberpunk/schema/cyberpunk.json b/contracts/cyberpunk/schema/cyberpunk.json index 1584ac900e..dcce96d609 100644 --- a/contracts/cyberpunk/schema/cyberpunk.json +++ b/contracts/cyberpunk/schema/cyberpunk.json @@ -165,6 +165,20 @@ } }, "additionalProperties": false + }, + { + "description": "Does a bit of work and calls debug", + "type": "object", + "required": [ + "debug" + ], + "properties": { + "debug": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false } ] }, diff --git a/contracts/cyberpunk/schema/raw/execute.json b/contracts/cyberpunk/schema/raw/execute.json index e096feab6f..8ea521b97f 100644 --- a/contracts/cyberpunk/schema/raw/execute.json +++ b/contracts/cyberpunk/schema/raw/execute.json @@ -155,6 +155,20 @@ } }, "additionalProperties": false + }, + { + "description": "Does a bit of work and calls debug", + "type": "object", + "required": [ + "debug" + ], + "properties": { + "debug": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false } ] } diff --git a/contracts/cyberpunk/src/contract.rs b/contracts/cyberpunk/src/contract.rs index f5f1b98655..55acddaf6b 100644 --- a/contracts/cyberpunk/src/contract.rs +++ b/contracts/cyberpunk/src/contract.rs @@ -1,5 +1,5 @@ use cosmwasm_std::{ - entry_point, to_binary, Deps, DepsMut, Empty, Env, MessageInfo, QueryResponse, Response, + entry_point, to_binary, Api, Deps, DepsMut, Empty, Env, MessageInfo, QueryResponse, Response, StdError, StdResult, WasmMsg, }; @@ -38,6 +38,7 @@ pub fn execute( Panic {} => execute_panic(), Unreachable {} => execute_unreachable(), MirrorEnv {} => execute_mirror_env(env), + Debug {} => execute_debug(deps.api), } } @@ -150,6 +151,33 @@ fn execute_mirror_env(env: Env) -> Result { Ok(Response::new().set_data(to_binary(&env)?)) } +fn execute_debug(api: &dyn Api) -> Result { + api.debug("Hey, ho – let's go"); + + let password = b"password"; + let salt = b"othersalt"; + + for r in 1..10 { + api.debug(&format!("Round {r} starting")); + let config = argon2::Config { + variant: argon2::Variant::Argon2i, + version: argon2::Version::Version13, + mem_cost: 32, + time_cost: r, + lanes: 4, + thread_mode: argon2::ThreadMode::Sequential, + secret: &[], + ad: &[], + hash_length: 32, + }; + let _hash = argon2::hash_encoded(password, salt, &config).unwrap(); + api.debug(&format!("Round {r} done")); + } + + api.debug("Work completed, bye"); + Ok(Response::default()) +} + #[entry_point] pub fn query(_deps: Deps, env: Env, msg: QueryMsg) -> StdResult { use QueryMsg::*; @@ -162,3 +190,34 @@ pub fn query(_deps: Deps, env: Env, msg: QueryMsg) -> StdResult { fn query_mirror_env(env: Env) -> Env { env } + +#[cfg(test)] +mod tests { + use super::*; + use cosmwasm_std::testing::{ + mock_dependencies, mock_env, mock_info, MockApi, MockQuerier, MockStorage, + }; + use cosmwasm_std::OwnedDeps; + + fn setup() -> OwnedDeps { + let mut deps = mock_dependencies(); + let msg = Empty {}; + let info = mock_info("creator", &[]); + let res = instantiate(deps.as_mut(), mock_env(), info, msg).unwrap(); + assert_eq!(0, res.messages.len()); + deps + } + + #[test] + fn instantiate_works() { + setup(); + } + + #[test] + fn debug_works() { + let mut deps = setup(); + + let msg = ExecuteMsg::Debug {}; + execute(deps.as_mut(), mock_env(), mock_info("caller", &[]), msg).unwrap(); + } +} diff --git a/contracts/cyberpunk/src/msg.rs b/contracts/cyberpunk/src/msg.rs index 33d73a51b1..7abb882009 100644 --- a/contracts/cyberpunk/src/msg.rs +++ b/contracts/cyberpunk/src/msg.rs @@ -28,6 +28,8 @@ pub enum ExecuteMsg { Unreachable {}, /// Returns the env for testing MirrorEnv {}, + /// Does a bit of work and calls debug + Debug {}, } #[cw_serde] diff --git a/contracts/cyberpunk/tests/integration.rs b/contracts/cyberpunk/tests/integration.rs index 3de369d239..c7f04693e0 100644 --- a/contracts/cyberpunk/tests/integration.rs +++ b/contracts/cyberpunk/tests/integration.rs @@ -21,6 +21,7 @@ use cosmwasm_std::{from_binary, Empty, Env, Response}; use cosmwasm_vm::testing::{ execute, instantiate, mock_env, mock_info, mock_instance, mock_instance_with_gas_limit, query, }; +use std::time::SystemTime; use cyberpunk::msg::{ExecuteMsg, QueryMsg}; @@ -53,6 +54,28 @@ fn execute_argon2() { assert!(gas_used < expected * 120 / 100, "Gas used: {}", gas_used); } +// Test with +// cargo integration-test debug_works -- --nocapture +#[test] +fn debug_works() { + let mut deps = mock_instance_with_gas_limit(WASM, 100_000_000_000_000); + + let _res: Response = + instantiate(&mut deps, mock_env(), mock_info("admin", &[]), Empty {}).unwrap(); + + let msg = ExecuteMsg::Debug {}; + let _res: Response = execute(&mut deps, mock_env(), mock_info("caller", &[]), msg).unwrap(); + + let start = SystemTime::now(); + deps.set_debug_handler(move |msg, gas_remaining| { + let runtime = SystemTime::now().duration_since(start).unwrap().as_micros(); + eprintln!("{msg} (gas: {gas_remaining}, runtime: {runtime}µs)"); + }); + + let msg = ExecuteMsg::Debug {}; + let _res: Response = execute(&mut deps, mock_env(), mock_info("caller", &[]), msg).unwrap(); +} + #[test] fn test_env() { let mut deps = mock_instance(WASM, &[]); From dd9bb4765b639927c6c2bb363233de8d0d7e17dd Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 24 Apr 2023 18:11:55 +0200 Subject: [PATCH 0219/2372] Create extensible DebugInfo struct --- Cargo.lock | 1 + contracts/burner/Cargo.lock | 1 + contracts/crypto-verify/Cargo.lock | 1 + contracts/cyberpunk/Cargo.lock | 1 + contracts/cyberpunk/tests/integration.rs | 5 +++-- contracts/floaty/Cargo.lock | 1 + contracts/hackatom/Cargo.lock | 1 + contracts/ibc-reflect-send/Cargo.lock | 1 + contracts/ibc-reflect/Cargo.lock | 1 + contracts/queue/Cargo.lock | 1 + contracts/reflect/Cargo.lock | 1 + contracts/staking/Cargo.lock | 1 + contracts/virus/Cargo.lock | 1 + packages/vm/Cargo.toml | 1 + packages/vm/src/environment.rs | 26 ++++++++++++++++++++---- packages/vm/src/imports.rs | 11 ++++++++-- packages/vm/src/instance.rs | 4 +++- packages/vm/src/lib.rs | 2 +- 18 files changed, 51 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f327920bd0..908cd9a779 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -387,6 +387,7 @@ dependencies = [ "cosmwasm-std", "crc32fast", "criterion", + "derivative", "enumset", "glob", "hex", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 34e6a44f5c..7c79465c26 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -238,6 +238,7 @@ dependencies = [ "cosmwasm-crypto", "cosmwasm-std", "crc32fast", + "derivative", "enumset", "hex", "loupe", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index cb0b85462e..1d15e1a799 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -241,6 +241,7 @@ dependencies = [ "cosmwasm-crypto", "cosmwasm-std", "crc32fast", + "derivative", "enumset", "hex", "loupe", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 670c06f60e..81b6eb4876 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -264,6 +264,7 @@ dependencies = [ "cosmwasm-crypto", "cosmwasm-std", "crc32fast", + "derivative", "enumset", "hex", "loupe", diff --git a/contracts/cyberpunk/tests/integration.rs b/contracts/cyberpunk/tests/integration.rs index c7f04693e0..aa2f8cf894 100644 --- a/contracts/cyberpunk/tests/integration.rs +++ b/contracts/cyberpunk/tests/integration.rs @@ -67,9 +67,10 @@ fn debug_works() { let _res: Response = execute(&mut deps, mock_env(), mock_info("caller", &[]), msg).unwrap(); let start = SystemTime::now(); - deps.set_debug_handler(move |msg, gas_remaining| { + deps.set_debug_handler(move |msg, info| { + let gas = info.gas_remaining; let runtime = SystemTime::now().duration_since(start).unwrap().as_micros(); - eprintln!("{msg} (gas: {gas_remaining}, runtime: {runtime}µs)"); + eprintln!("{msg} (gas: {gas}, runtime: {runtime}µs)"); }); let msg = ExecuteMsg::Debug {}; diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index adb80440c3..9a99000538 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -235,6 +235,7 @@ dependencies = [ "cosmwasm-crypto", "cosmwasm-std", "crc32fast", + "derivative", "enumset", "hex", "loupe", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 6a6f8b1f75..452f2fa57b 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -235,6 +235,7 @@ dependencies = [ "cosmwasm-crypto", "cosmwasm-std", "crc32fast", + "derivative", "enumset", "hex", "loupe", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 635c031955..da048e234c 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -235,6 +235,7 @@ dependencies = [ "cosmwasm-crypto", "cosmwasm-std", "crc32fast", + "derivative", "enumset", "hex", "loupe", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 5f7eaa7c25..20148d0bc9 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -235,6 +235,7 @@ dependencies = [ "cosmwasm-crypto", "cosmwasm-std", "crc32fast", + "derivative", "enumset", "hex", "loupe", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 9331333d93..7687cbe7e0 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -227,6 +227,7 @@ dependencies = [ "cosmwasm-crypto", "cosmwasm-std", "crc32fast", + "derivative", "enumset", "hex", "loupe", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index cfe2547ef8..45197abab8 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -235,6 +235,7 @@ dependencies = [ "cosmwasm-crypto", "cosmwasm-std", "crc32fast", + "derivative", "enumset", "hex", "loupe", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index cd8b5c088e..ef63f9f593 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -235,6 +235,7 @@ dependencies = [ "cosmwasm-crypto", "cosmwasm-std", "crc32fast", + "derivative", "enumset", "hex", "loupe", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 9a0324f83c..577a77cba6 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -227,6 +227,7 @@ dependencies = [ "cosmwasm-crypto", "cosmwasm-std", "crc32fast", + "derivative", "enumset", "hex", "loupe", diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 74a5ac1a00..331a04eb0d 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -40,6 +40,7 @@ crc32fast = "1.3.2" # Uses the path when built locally; uses the given version from crates.io when published cosmwasm-std = { path = "../std", version = "1.2.4", default-features = false } cosmwasm-crypto = { path = "../crypto", version = "1.2.4" } +derivative = "2" hex = "0.4" parity-wasm = "0.45" schemars = "0.8.3" diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index 7dba979c95..e9be792609 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -1,9 +1,11 @@ //! Internal details to be used by instance.rs only use std::borrow::{Borrow, BorrowMut}; +use std::marker::PhantomData; use std::ptr::NonNull; use std::rc::Rc; use std::sync::{Arc, RwLock}; +use derivative::Derivative; use wasmer::{HostEnvInitError, Instance as WasmerInstance, Memory, Val, WasmerEnv}; use wasmer_middlewares::metering::{get_remaining_points, set_remaining_points, MeteringPoints}; @@ -80,13 +82,29 @@ impl GasState { } } +/// Additional environmental information in a debug call. +/// +/// The currently unused lifetime parameter 'a allows accessing referenced data in the debug implementation +/// without cloning it. +#[derive(Derivative)] +#[derivative(Debug)] +#[non_exhaustive] +pub struct DebugInfo<'a> { + pub gas_remaining: u64, + // This field is just to allow us to add the unused lifetime parameter. It can be removed + // at any time. + #[doc(hidden)] + #[derivative(Debug = "ignore")] + pub(crate) __lifetime: PhantomData<&'a ()>, +} + // Unfortunately we cannot create an alias for the trait (https://github.com/rust-lang/rust/issues/41517). // So we need to copy it in a few places. // -// /- BEGIN TRAIT END TRAIT \ -// | | -// v v -pub type DebugHandlerFn = dyn for<'a> Fn(/* msg */ &'a str, /* gas remaining */ u64); +// /- BEGIN TRAIT END TRAIT \ +// | | +// v v +pub type DebugHandlerFn = dyn for<'a> Fn(/* msg */ &'a str, DebugInfo<'a>); /// A environment that provides access to the ContextData. /// The environment is clonable but clones access the same underlying data. diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index fe394adf6e..91e35f59b8 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -1,6 +1,7 @@ //! Import implementations use std::cmp::max; +use std::marker::PhantomData; use cosmwasm_crypto::{ ed25519_batch_verify, ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, CryptoError, @@ -14,7 +15,7 @@ use cosmwasm_std::Order; use crate::backend::{BackendApi, BackendError, Querier, Storage}; use crate::conversion::{ref_to_u32, to_u32}; -use crate::environment::{process_gas_info, Environment}; +use crate::environment::{process_gas_info, DebugInfo, Environment}; use crate::errors::{CommunicationError, VmError, VmResult}; #[cfg(feature = "iterator")] use crate::memory::maybe_read_region; @@ -391,7 +392,13 @@ pub fn do_debug( let message_data = read_region(&env.memory(), message_ptr, MAX_LENGTH_DEBUG)?; let msg = String::from_utf8_lossy(&message_data); let gas_remaining = env.get_gas_left(); - (*debug_handler)(&msg, gas_remaining); + (*debug_handler)( + &msg, + DebugInfo { + gas_remaining, + __lifetime: PhantomData::default(), + }, + ); } Ok(()) } diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index b82d1a6efb..b01ee51ae4 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -21,6 +21,8 @@ use crate::memory::{read_region, write_region}; use crate::size::Size; use crate::wasm_backend::compile; +pub use crate::environment::DebugInfo; // Re-exported as public via to be usable for set_debug_handler + #[derive(Copy, Clone, Debug)] pub struct GasReport { /// The original limit the instance was created with @@ -273,7 +275,7 @@ where pub fn set_debug_handler(&mut self, debug_handler: H) where - H: for<'a> Fn(/* msg */ &'a str, /* gas remaining */ u64) + 'static, + H: for<'a> Fn(/* msg */ &'a str, DebugInfo<'a>) + 'static, { self.env.set_debug_handler(Some(Rc::new(debug_handler))); } diff --git a/packages/vm/src/lib.rs b/packages/vm/src/lib.rs index 19bb888f82..1e5ba03837 100644 --- a/packages/vm/src/lib.rs +++ b/packages/vm/src/lib.rs @@ -45,7 +45,7 @@ pub use crate::errors::{ CommunicationError, CommunicationResult, RegionValidationError, RegionValidationResult, VmError, VmResult, }; -pub use crate::instance::{GasReport, Instance, InstanceOptions}; +pub use crate::instance::{DebugInfo, GasReport, Instance, InstanceOptions}; pub use crate::serde::{from_slice, to_vec}; pub use crate::size::Size; From 004e5d6e85c8b4284fb6b12d28bc114032ed03b1 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 21 Apr 2023 13:30:37 +0200 Subject: [PATCH 0220/2372] Test unset_debug_handler in integration test --- contracts/cyberpunk/tests/integration.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/contracts/cyberpunk/tests/integration.rs b/contracts/cyberpunk/tests/integration.rs index aa2f8cf894..c05e061dea 100644 --- a/contracts/cyberpunk/tests/integration.rs +++ b/contracts/cyberpunk/tests/integration.rs @@ -75,6 +75,12 @@ fn debug_works() { let msg = ExecuteMsg::Debug {}; let _res: Response = execute(&mut deps, mock_env(), mock_info("caller", &[]), msg).unwrap(); + + eprintln!("Unsetting debug handler. From here nothing is printed anymore."); + deps.unset_debug_handler(); + + let msg = ExecuteMsg::Debug {}; + let _res: Response = execute(&mut deps, mock_env(), mock_info("caller", &[]), msg).unwrap(); } #[test] From a15c725cb8456dbb5dee6e85f8e268c01283d0dc Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 25 Apr 2023 10:32:13 +0200 Subject: [PATCH 0221/2372] Rebuild cyberpunk testing contract --- packages/vm/testdata/cyberpunk.wasm | Bin 170650 -> 172461 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/vm/testdata/cyberpunk.wasm b/packages/vm/testdata/cyberpunk.wasm index 96737a33880c757c4f74550ac4627474067a83a2..68aa44257f0d1ffeea63324d3af51528474f473d 100644 GIT binary patch delta 52267 zcmdpfd3aUT)&AM%4jJwZoIrp;0-Sr9g3NATve=1{oy}I`gbSs^W;|>f5yQ-7;VdNSe^NDwv8bU!Q5NcNvL*%^ zQlSu&0dy#jp&Y}=Qjv)2+(lADZeFN&;x2WUiiDJrAMF}SDW{^M&WNQ9XW3)hWmnF)=$ebqzu=;Cue<1)YcIR%%5z5>=erw1 z#i_png^r3XQ^}jnUcXkim_P1QsTQf*)a|NDEmn6ZS1nO@s-?bgq_+x+a)2pUmkv!?zt1rLi%04%% zn^5hSGY04(=NO4;^cCb+-RmYt7M-i)D|`F71d|pZ&bZnXpY~h zo>FzH?{n%&HSSsUN3}z}s$NrD)zj)3b!?;R^Dp(W`ltGbddj?DpZZ9BtrnYim{sNy z^G@?t^D(o}R^^#1%zMoz&HK!1^M3Q!=2kOzRb|fO=3h(|PW3Vzds;H9w_&Ri_r-9n zs&j9MoTMJz_+q4;ihin$nDv?aR`j=iaO0Y+p{my{%8oczxgD}2C1&p=VkKsYwMM>n zxXe~o!^W?(3l$pck~>wc*?4KLL}tfMRFAnY$12svjc3QVDfNKcquq&1UhMtmSU8)q@y_mY7!q1Nh9a8rppBvR!iM~TC?K!E7U!p%I&yS2g$sYo8!WvEV`A7=7u_tGw>sAt??cR34xI~Pt;4I9rXyiTF@SG(R0X4x$*zuegDhXbO zveSp%zZ4B?FLArvwm~|%);70S@j&&kJGJ zz~rQl7fuoJGB0^7F!EBeNB%RIi%AKL!JG&bv|xg;{OiM3BmLlj zLid*gisKF7oVrVH|(jqWX#b5%meQ*kMI(f+O7!YDQ*(~v}d()6n$a`u?cMji_ z`B50>dqc*wYf$k#a&iev*0_U)_Ruv!Cty7Hw4no3jrYw&bt03)>@tF4Zw$Q_4W2aY zO108`YS>Q@E*kDPPU=TZZ`&kAqC9K(HM&92F>CG|elk)^M#$uAP$Jf9@14nNC@^*B zh_S#_{{?IZoAVym91vs?8w}ayOSQQrk9895q@cKIhoN*P!<=IQIpm z=43Kc2}BP*1A)JLN24|O&!hWhU}v=(A9J#*^Ugb3^>ycrnU?z*AZGGx~Hl|nC zRmzn5R?>7j9m}>fR%_f5V~++q{CsTRPJ-2;)0}VA^n@8g5y0@U``Fmg$p2vMvzW8> zNA%9-oT1tK+&7Lmy9?(w4Cd}_w1+lfmnOL2Q}@Ji-7uM#j!S5XNbbr3+U^`TL9-iq zE0BnlD#3x0uP8KBlCtyQxb>RI4`3pg@T>6@Ls>`q?AD0VaZLWvN1jwHjOM5ri5!SN z$8?mP>ujZ5j6g1~JF@R#83mLs5J?v>i^!t6WQ+)O+gC?+SD3q^vO$=~*2mvRsgQ~vg{?dTUp%wgOkiC-6=adG0ze<8#7@lirqTlA^aVB zG-%L0`{;psTum~rYIn)eLy%m5^l3VobeDzU_C01Ol21QoXach$;xo%vAjc%aNEj{1 zDoe&tw&s}YNeLkbQj+lj6G@ymO!QGj?Gpp4Hc!kzRWv}A={yAE%83G1iDNTR6^;9- z>X0q~R7HJh)&XQV{n*#Q+wm?j^sM_>rQ9A<#=A=<9UW)@ljJrjFNz|z2JWLt#d@Uk zO$}C;$Nuw;b;RfkjicBD`}7Wz?(_X5sHwC-lVM z?k6U}zhx&LkMP11dvyj(P>oS1`?^FvVT1G_0o9-Q0t(!Al8wKQp41h8UpVOkv-W0p z@X71i!?p+$!W>_z{QYDX{5Wf>`gi!T`jm<0dgbQ7)Af#1Pg85$(@#AaR?zBGZ&fgf zhW~I0BES7%FB3T*oOYJlU3AM8@PZjz>}V zj45iP`}P?>ft4}-%*&w>ByF zs-N_7xBvJV(+^HPJM7k;^#Q6bKYNr;?6>jY*_SA_ZsUdL9H~0iDonTEPS}n^Tdi>) zKerChTzB4f{5|UYE+~5X`Jbu$%%UONvL4-d?gc$n*#`>VAZdtP)GareZ|5RCR2>98c+kIGz?Y#xt=J& zm&Pm8fRi3StHdzZ{A@aeboc8%Y_I23%V2b}vFp$8Fx9>8+Fx`90-pcHFd*>2FGB3_ z;4kMYpsr%(;hi3lR%;aS9HQcdRcbxrzBuy=;Cb|oNz^>+#-;5xn6bEF8zm-ZW10KS zjZ@VEcj_!M?$xta;cu4|h38oL`;$~Zgl|e+*IzTSD#2>EOh$(W#F9XgB}oP4lH~TT z7>zow%r1--Ps|I`JV!ydqM}CumD8b%_b5g)y0k7=GBFPt&l%{qo0wg2WYEIIJfhg| zQE2)QkWr1K3%b|N?hVkE&DH?^P=o0nIVXnD@pFps_u@Ijg(^%Z&Tavb3FAZ$;n6u1 zRgH6o<8Nqg=^@Kao!cEHuAIx#x6dtx0laqZWKgb`zeAl9+dsd~K%=0~1@1XFIjU}B z^-YtwJlk{gIUvhPx15|y(wm@E$~L|8k5Zl7TW%^uvESb^FTF}UW5H4yF0wMDt@inX z_3bj^pgOlQC&ge?x%~6Y!e|RJ)B%^ps`al!Dd0B;4*-@ z^LDr9w*Es~XVIwLc{_?LYdEE=?h@Kh1_ypnxBn>l2g;E>Ffa`3ZU$*uDIKIeW?FY| zy#Dr%Dt13JVM`d$noFxH@ZiOhwXp$?H(*-NUfc=8@D`t`Qw!Nnjr-+d znjll|5NkT*R72OB5RfzO7z`qP@Q#z9&i{$OHLl~97C$6{q}oiXV718dv~jElUDv%q z1F**j;3wV?_qZjOntN{ExN%8}LVd(iGT7xyd-MzVHB&(N%q>X)Z*N%IxtL`s9g$&) zWI^OoqAMHd`peQQTlY%KWQj+E@JX+D3gnZDQRC&HK9)deEJlqJ51N{LVIgdk>?Q@SiFMq_$Wrk}J-Usuv#H@)X z;{2|SCi3{LizeFfTOUnWEV(_JfH%geW*<=B;bdogQ|8XFRm6nqh?6%7oQU2c6o-i% z1UKnmE`qf>n2+FE9qfW&jShBT3o9dujz~HXDNh3Q5_5MrS;+66uqE_OKL!X~IpG9w zGssvFP8cZ$=7$|MJx|4L+K%WQe`}jZ%%0g(MhbdGN(P<+tW?vB05hNh=I?|G{If=d z4lu1w14ZDR{jh&5;jrpRN?1(g^+B0sg6oPXM^6za_&pFA6{@27kECjTfj_HXycZcB ztG1-!d}(m<3@3??lbi5|Av4eJtP#Y)vZ!V?Gv0%PB#yG^XGv)q$x4?B){29S<?HAk2_=OdGMH&*}9MB*Gf^OA}S_*#T7H1{4;YU|50^!4YsGcG|KiVVM{% zGvz;qn?0?ai46d(uH8phbQ%zL{ziS0Bgz1t4xu4CjDp)K^-XJ7JUhn9cFg@~MKYBx z4T~s59a%>Vsj)_VBp!`{=1r8BPk&vl0G*=*fOg(yPuW%h0bLgLMRJJ=SW(l!(PJgsx$4box48jKKZ|65$ zYS!~>a&U3zU5yh1bGtniAcc}QJ$!@12SzD(wK0hi)_AnPXJym&?2TL;pSC$O%-wM?9iXk&T&ckE<|@j zmH!bhi~QIr0&q*DSy4111;PZfGOatdYq{B+LMd4d3=3tpB_%;P6y2?)BxENhZ<+GZ zerPFq9;yan5|tn(?HDEHzdgWsF%ejS9^jA>+L#Tt7bXJ%RD|7E9_*3=?fCNO035)9 zKsv}t+lK@Y*nvja8A1yPaI8np>SR)*C zMtKGwrviu~7-Rxc&Pvfxq8vcPRMjH!mPhpjak|*rmU$2=2E-H)7BH%)QPfCh+E}!s zFbpIZSHgpkI+{XI2|e{UVTo)94-4Z$iKW1{pphZqRdVHTu|m=M2Np&o0d~|3t;GXJ zkY#CW(^r8MdgM}QPPmJ}RiMdeqN^@Xmwqtyulq>asgcB$2h@a<`U)y33+lrFwKyI1 zbXxepc?QEGW_O)n&tDDo)OB?ts`;-mqt#dZRvTNkDoUKw!1?ycYr9md7CLGmdDS5y zlnpa3B>NNF?(g;k$Y+pJSV&YG1QAU}5uc30J{e_03c@MpZ?0@XOW4tnrl0U3+M*%K za)&<9wLBZ$)n*jh;1{aZg>qU_Ois`)@r{iLp$BLQ<}J9#p=QoW;}P* ze>4$0(FiBtiB)xOI4FdGEJN8COS4@|)cO=X!2AnCgZI=kOY$l9k`0~v*&j9_PinggYC zP)^_^1&5oL3J|xlRFI{CUOs6{Qdk{=6zmFGSDq3m)EtKl>qoa&Ffhrq|yCwW$ z)Kye6CHRPcf_4WcADk*U3u}&C0#lxLBkK+_JRAv_agAO@wNfW-xi|)Wua86YMg>TN zdgi`$-A;hohauooScf>g!mT=|@p%X^xk`|oOdc#^gOT-VMZ}HQVAZjo78c#4Xb1<3 zs7Zdb{y$Pg+)iZmN7rjbv}gVQZAHY>1Vn86T6;hagt}Hl?b}jB771~?U;c-+>51SO zonRvBIT3W2VGRksyk;c`*gC;2Q>2Qcat0OE_8F|G;GFvtH8L0{64W3Vsm& zcUM%r`t<^NR?GENR?sRX(|>h6 zMN{FwXN*(o`VQjnT4P_7HpZpGK41Z?C#agPv2b--d&;RUJ&n}NAvjDlMdY+a5i}!Y ze~YYqU{k+#{%rH84Oo*098cFBovAxIgXs3%FwjN+-r5=JEDRTnKhwb}$z_j^l(o~# zkN5gtTRWlW|KfCs&TggbxB*9-g2s~X5`j(UFMp*%*)-0U`>$X1Nrgq59h(QQ1J}6l zCx3fkE5>M`w!cGb!)9rvwPEhG)XuFHEJ z@SV6Jtp`D->FpDZsFvFtM4WaWVOxr}2tnfp5v*ARwMc@Ul|AE{QfyJt{yg+BxgEDG z(_Wz=0FMG3L%xqew`lSCzt01QgZSY}$##01o%vFz*(=Ff6gr zM(<$A`L-7~MK|vMt{0b%>_cvKrCRQFVToe(vpWLqIDG~T1z8BOttgFIG|UGomBK%FG0?;vsQvK#c00*aBb&wLzmHSUWy%9O#}fk2ocny*&N+! z9fG+!xD~;C9o&Lo7aiR6BZNEX@cb;eae+~Z*&R#GTIs7laDm<5EcA-mNoHdzgtoY= zQa(|T~nIS$8~Q;}7k#0>+z8>n#o1jjzIbFcvu!G#g{ zZw*YWY@JqwM}dJby`^R`J^&<+553AffrW&z#$o9M%Qoz;qe3T4m1x-O48jfqET15wP}nt`V2nyhqUDcI=`wLF!=*9?V1`kNO<`9tR2Da4 zzzdGHal;xP1DzRY2HgWD6x)t(u+3b@v}_z6!v}x{yUb>p4}KU&#Zq)3@O)H4fpbjf zj|=NihXaBAioa-2Ae;^uz=^T+SqH;` zx$Cq%>mXNuoMLAefV1ZDU_{snTVs-#K%NDHa07t+aL(}oRk+({?YPCS6{l`zC%kZkUMnj7UeN%E1me~X7}s#Hyi4-f zXi0MtoB_!Ql77UJ zowdRTTfqmQO5LW>9|uK8nJYyg;`9kilpqN$ZBgZe48vN7Ff<5xiTVgOH1J`ttu$b0 zWTk?HkdjqC6)o|pNR~*X88#h%_Ze1AS51 zGeCw1v!)|hIO7^7T<27L9g_HU*IYvvh%X*sfpridz)t{T!W?u{ZH@|o_;H%hsRb1e zF^nTn0gaS9HHh~&j8PJ=ZjKNqP8X5*idQ7GAQB#nN4#PCRAFidN(-;~qPGxOM*<}< z8s3Fm>l-D4%HR=oa)Q4DZ16-`3ueK2jTZc5GhWzS9uv%)8tM9gCZ=KI zAjGS$8bDe5g|a}rDiGbED*=(DMREgkY66vnVkY<$D+#@s(3DYPAQSdvBp4~-loGR0 zq#MKq;PFkCfFUX{?*{6nVJ65z{|dqj8IVx{O34t-U>}Mjni;}Lfi0~Pav~sLF98HG zrVX742RH?r4;9v9;O^{X#MukNa0)^AFlR#zVhakD-rU?iWRx76g)DJfnn})zC zg&PYYY_KHc>=ASWP z9$6Av`8$jXO)n@@VB-p^HaVzm&|Wn(PH%J=SQ+W=#mYdhIlLjI0g+$Z`83G8k1k3A#=fhgvK(8xc-r*dBU>K#+_O(+IUd8^rcUs81rAjw(+;TH*Q) zZD!NSodlH&Z~9Jji~|djd3qdJ z>*F*W!jvg8Y_bF%3>^j34fCj)3PBrJY7JuZpC=#IzlYSojv<=8NwozKcqL}a07I)8$t(w?=BOz}2!#;}OQ^}X90xwLoYx+CHTO6t zG$YZ@1X6$t)4>K$A@-Oe4$6?DX*&t>p-{N!GD$^+_}Y1PJH)JVYlyaYvE?BaFAdgk z%FZINIF|xdtLtUUWQCpC;N|OiAcU6&V225s{A+2LFc}1IRA9X1m0}D8u!z;tKXl$G z*pLDPq!EW-Mg!b*LSv0HY?FreRQaUDSO%!Q5vBB?Wmb%W&{r`ZlN5Az+>e0X`-hBM)k26-YC=O?duSDe#6H?$SNvE(& ztbdzR=mDt1N*Tu~eMXgKva@7P9ZY%r5k_^6X+HFgUDf)VkXe1RpZTi-Gglw_uEshV z49P>^Cb`&_L*J$>P;ltmJ0gk!oS8+D zAH3VY=L4()3n9dNhUOpxYulJA#Ibo<|a zq;H84G|6IfmnSi9T!!-RiCv1yFrnP|o=q(~XxLLKSDB%~O}Wb4?)@Jey2oFL7+|ETj_KuL)?x*PwF)8i;ZFSGxCamiAyFa3!&xf|VTqI1aS%6i^y|3T5< z=T$OG4%=cQA{&QtUsnm}HXVS3)Pb-AnZlrZ#s?!VdL0UDnjM-_Y_>IZg@Ld}1DNlI-8G4dM}}1}UQV1rh8tTW=}YGhypZci#s+b6${( zmT1>4+&f0S?w-20PwGA8Ks-a#*|>=~4ZTsQhn)jxME+3pLI6z@7nR}6!-F332kA+i z<;8zM4q@gTWDWjd4&*WZo5wK+uLAf3hlmF&gr~rX2y}B~ks=AbL!&5c`Je3y9$9Da z1~>o10>B5K6iXu$DufM~j)F5bj1t?>2m9vu#U((+yGO%d!@q^%$K{1goDCP;2K{4x zd3pF9j5UF|&^y{1B2)QUKeH$0TTggq>N_(Q{02EZ$=D=05-7$SC@Bnl{|= zk1na#(e#PZgN!f}cz+BQ1_+i>kj3xtn@2~z^;@i8xJn@EIQ7o;&P8aQ+6bI6U*w5gl5jqFp4%_l=33Lnl?- zy>ed{_ow@g?BLQ;EJ06Vd-H;&``Et2IxnuH{lis|Q_t|0JL(`+-GA;oBlWZifmcB* z6@M*01A-{l#X*#3QgIGlXC}i=trTs{lA_`7EZU;gmPK)x2GoKHabNg&Zt)rDp@Oyt z`_2a5yO9zQF|0E-Ui#15R7MGbBq(99gxg{N1@WaARl;dlfpN`qXYcPjMklP51gd`v zq@88woSc{AH0ivpL0*vH*KXQ>L`s*~)w;yq)(Hoj6Yc>7W1Owa2?0A4H#B1vlxa=3 zBfHqydas`y^qB@QC?N?Y;>`2wq@lp!e0WrR=qsfq_t{UT#&y$cbwZC%i*UJg?587g z&#?1tjV<@*pO*MT($z8`TAqfeRu4LzVB^-2(-4e6#3XP0Ark}IuS~S zAuWU?S8OIaV0s%ov$X#+%&rA}fQIKCKzP@eXniTr3_`$42rQZ(cIysyfgZf=^I>@T zs_t{%NPXw?$>|}uCx0=bTUf(MKp-%%ETHjD(SplwU-UJ9r`(Ez{oD_}n2gFJzwCpC ze*C4~+(h-4#cc_S-+wtlo#W;oT+faLh@A&dYOZy{SG|!j{i~ifP)OTf47*q-NGpUP zUg0U_^g&>9F1nay% zVa2BxFg#oEseAV~qvNQFJFSmESHcc@>zl4>nRoolYI16)G>Nw82Zyl=mdy5-mmdx> ztyG9N1{-m;JklEi93mWj6eL3=hjuuajE%+i5FjB+<*X@r7y~sWJUvM~rEnbLd5A~h zlB`fcF8Mz+19>c$Do$pztz6v}FA5=*?~R06f@Mvt8m~--*V$R?W+gk|WIX+=ToeKG zi7Z_2yIC?QZxH^cBk${+HZgQ+~Btp4kjq&*4j_x>ovO&$G@rAcx zBtD^1b0|Jg=L7M9Nm7Cjw&Z%_gKae%A6zIZ#;3!PSc^s+?25(lxknrkxYN(&Dhve2 z#rm4-E^IL2aG7(HeS{&_1sAiJbBu}p(1=r(H!aZ)2(Hc%>m0jWJyY-#Tgj|-$qvYu zErDbd1Mlb$JemNF&=|8ju1;nH6WK()F$GSvY$ta{GUOPOB}|mdS{kH= z0AL<)$ob8YWbF^kEj6*97QuE1E5s$oW;ltNs*(!DiT02fl{i<2BnpptFrUS_Y0^Eb z_cKjrKYSoaO|b-A!`fkBI=gi;Q{g2REQZGSQrZuhWF|8c?>t{aNzc0nS=D0!5hdhmP+Cg zWOzTrTXed3)oOKkFVkyucu$IvYDDPcp#y^>$No?d#M&_kmQ4#nqtj_a)1i_e#6mV2 zvCEx0HdYNJw6jhFS(d@>RiQEfib=l^S)hv4dA3?-chD5S8df^!JZfj3jJx=hB)K!n zL7cj^?S^$aLa2Kla^P8)a?!TSfdN=V(UTbi`$U{0NqG}VQbS?CsbjB!AhILy){jnF zFoFSF6tJ;j1mhtZ@Ol#wa5E_GG$q~~YZRS?6X;4p5QF4^=E1J?YsfAS23LSWC{w}h z9BxM$N2pfy%#?#^wa(=$bGn)N3eaLjSV+GxJT+nfLz=cj5VA2uhHodMKmr>#k3)K* z4YmhkBU!L4vmHuHVR)6GG}twye0DuTZ6b>=%P~pzkmI=hjB$W$5+P_oQAo`x@-$SeRkN}< zQ5Z3dc^ojnfqh&Uhj7iInt&XJ&wz)=&v6^S=#;{`8O`J94qigR2_wu2u|~XOq#y`P z`$-swjGX>q>|S8WlP)!l_&{m;yU@EX61jIpB2E3_YjRmH;mKuNq zm;QjyI4Xl?vYpkBz^WLa&AS~8H?8rl7MsWcq6sOifR^~pKmWTa}CLK{|k4Ldm0BIrI_lQ^Cp%O%~BOfVXVCJYC3hp>%hbw?n!H6aLn z5wAE_luJTvZ=;DE>=DN?zffX4nUv&&qbcrQ8CZqqg1<-tIn&@SFlXS%QbOq3Hcg!D z2lr+pQmXYgayT$%;(lVh$f$-H|#u6 zEX;bqMR>zp6QfWbxJ-rW0kny1P!J%+-w@z6sZB+CgFvels14Q^a1jXWY*_q9Y343Z zhS++#VhWoy|5;7!4*zErLzxxvRM7VV3tUr4+gXHMu!8BDC`UJ-Rsanpj0`!V;8ze2k2IB| zk1|Ml7Q`5K$ttpm3Um@LC)~Dd#R_Hy0y8j06f_ey835f$wC$m`phS)Up#p4#WcyFt z4yj^i$K7BG@xq`fo#lHMDj)Q796w=R;D5j(EZdP-1=j5nTf#iX#J~|dC}*6)|{VaO*UOmnAn&sS%dDIA;lCpyMr=;muFLYAQ&a(M?0W82;ssHRtw;H zAV5n5IL}VE$C9f+5u_R4^Ix5#9TmD*l8bgo0TFd!NH!e;JG$q*)FYLJx>?#}%bG9; zhL)ImSxzp>QKO>WYLyh%voBCWT3ti(!bXcgV})VaC2)32%))Hi7TE;V#s{M)#s`Y8 z5FCpPc3yxKED$WluvCpBiseBzKF9=O^bs`E!4gBuV3WJv3<4Yns|^ODCOD7w8^_LF za3n(Hz|vf<&7NcgIoKqe#^pTIoY^+;=YRvd*>JeP>;vP%2E!Nq_QnTL*k}wZ6a2O1 zOe4C$8@OU3;=ycaXL27sH4cpp!>SY$4+rQ74D2+THR4u+V56@cCZZjNi9*$7KmwEd z1{pqy!yBK%Bb=ygIHsQkPj$!%Nm9s9;>%UMPfb+&NnnW(?&dKm;wRzM6=nq88F2AN z`JxNX8?duzGE{_;p^1P9PJD=I%_E$zPgAnvE>ZxNMhM`U+zG>Oj9`=mha?= z>WeVR1N+|4i(pB5+^kQ)?(};gigKVWjD%2O-+=oCHY62pLx^33SwWFxDA@ewn4xyy zZjk|N=Mhk5VQES=NXdhRQFa0X0LcVe=n#2fNNYoLfIm_IBzq6I3kyK`qyy#_U~tO- z3FylKNY>aSrW$b}CXyHiMDfWjcc~bhSOB?%L04P@fH6R~KrUQjA=yrb-TNh4gd-8- z#wQyGF+zTl+}7hb<=pQmW(IJE*<2{OTuk#g0FQ0Rx(?1PE;v;4{2;~p zo$~I#Om#^egmagmt2F2UgOZ9CnzQnAAM_ZuA^n56peW8bs%Z2Jv9kPpm~s?uie4u0 z6gm`XTk)$Z|LEh|JL@QA^TRl=qJv#QW1DnPoWdll{vjLl;_myr2$xRC5s*oG`1q3d z!q#!zz~V}!byk)vHSG>O7vyZmrjXMefWY8z_Aqilwuzv!Fy)}iDvBBPGI%CJ;grN;63Ngl;1cU(Bti#ZdVzR}Ey1vQ64eo> zvN;GZ1kcqm75=0k2p3WigxAQir2vWy1&vhD3XNc^o~}KHMj~`ILaB%|4#7*2l%Su7 zdE=3A9zqZ!^wJSs^YP_AaD)G?=XdwLL_r;c_`-R`%1!i9ZD$$}E=PE5k!SZXz8Wey zeDOA21Bd{jWh(p=Nm{OxFd!aM65gZ-KI148N|(u_os?8&EHFj3--Wpnqsbr)kjOS3 zjwG((7%%UA=b5TszCa0IC=1Xwjoi6d^;fI!d{PY=(K;`wDZ_xSqXWlq>afJrqMh_( zILlXicu%^ITJ0UJRA2S9SFTi@dV2E!Q*}kin;60mPSkmChSX2hd0tsq4Ij7;G?j3c zJQ_fn>r^ObC8Kj_rtMpc{9R@ zf=$DN%L9Z&AX%1kQ}QO@14N{pO2+1R@tEocAp6DeQyg`h*TwLg8S2c_J`wC+tt()} zHGa@qWqxbpuAv4ScVnDNcw5jA)-!$xQnu+~49Las2I|ee^tKU%Ih_*A>7fbsfV``^ zsEOa+Qum(gqDHo{Rp!MCRo`+@5hoF}BCbqlpYIz<%X(h;fxx%u8-Zw|^F_<`z*Qvb zKwL!?XiQ7MY7%F{sbT`z>@ib?yqR6p=r+LHU8p9s1>Wecs%Hx02a)dx+5sp4m#5x# zBk4Z?oE|2c1iqWA8TNX1u@s;hvHGFrpjlCxBo*FkUDdJR*6!WZM3Bn`-PDm?;wTB2 zR<7sRymiCWlq(p_WXdIyhsHvNigg#FfJV}E;VgeuQ-u>EF${3Zg6I7^=6I9o#Yd>I z-i+buDtj?}pR++YK)-URs5|wNPlOnD$ai)XbVkJM;zg`J3{sEyc#pa zDG;YEKL;?`-F}TpH-SxOD@a6ZZ+uvGoL4zojg8A-_-hrh zFGAkSrKm4xD#%Jap zPHPDdniqJhj#9@Jw=vdS)R78q)8VBZ_C3z|#EZY0-b2oKx5wbpfqMi8T%zL?D_$}; zvD)zAk*5PP0m5(5407K+{P29pnEygk-eyM~6|^NLFpmw4cTZY)avH4Qf%OcqBHZ_F z0oDr(2Ya;>R3Uy`=7kBW2Y%RQ&ji&y^I3JzI$HTZ2J?8v55agnkHK{RfBbcw0V?H2 zhw%q}{`Y@l2VFTMkC0#4xk!2EPEnn5YCy7s46Nwfrojd7q}!|(I9fYJP0j)*;*8=m z-j`EUSvoS|1ofjVXlp#Hd!u*n391`@Nq{;ND}Tu6${?rV1jQ53Z9i$B<%KR(c#EI! z+V7746^)H>HoXTrzui0kBy|dGi;X9N%|7vVo}`}Yycro{NHo@>WU47z+M*+_fb_ephrmJpY?-T;Kk?YhlRv{fbxKj(u^W?lPLD9N&Q8*2q#*CsNzi6kR zXj4!WE;sz&mr)k}VQIEwP_`m~&A|&`P8DN51UULDMe~EA)#;*9C+gH@6vcjn6m1_A zt}9v}Hs5$I6j6yD zv`!)kMA6|v7Le({lc#0SEA6ZX@455TSYNA!&sRUt>rQYe*o~t}uVvoyu0CJ&qXss; zVKY==@BO=j5_{g(IPlAo!J$D>Qh6okt06&?wdo3iN#*D!VF*n6shZYBYqV_Mv&t0J z-U~lfrE2`r3$W6C#<|;_wr7;K;fvNcgY3n&_9il)qNh1uT!<5Vj+DC z);v%c{NB)C`e!q|3ocXx3jbIKUnSlL=TgG)f>>VUj@!Ct4A~b&*IG zA|D~r6{erlUY-{B4{QILWji9f=S8YW%0?jyor~ZWct#Ez7A_Hck`5FsATtgddcV0y z4N|}IKE6mD&9jj-NFY3vwa9ZWRws0jYP9qGV~;zY=CQ{K#Uul?1>Y8ATJxz#I<`Lb zzPeZ?I#a~qP#CTLoebAM4T@O0dE_Mk3bw&%m#Xq{J_FSS^cILy7z3IBeKA-Ol+f;R zp56S^J9w!&t>b6#<%%64jy%~m@GiPc_3zLidoJRNQes@S7gFlGV|zeK^}=RcQ~NXm zNDm^Ho?cCMYkgx^!EkOtcCsGbgj}#*w{rM`8oV3JRX1FPL2I<+;0N)yF#ZQEy@!^f zXaaWZ%E{Ek(=RJD4D#2iPUaoo;aj<$%3}mC-#(LAk zInq1jDph1If6g0n1!ntm@02Ulki*0)=ue3L1-fR)ZC^9mP&1g?XQr#7euDg=K&T%5 zXgyIS_>`188u^&~-+FINQ$^mF(^Pw}^OfpCKzGBHaNRX{4_v8+9{F6IQDWdBc$(U{ zYOodY%wccJjAPhqGvh0t^Q^0+srYo*;4-RW)nZU1IVf!}tH56NCq9NFcY(f7C-qJb zuh+jZJa5?5YMCBTFYm*vF#`==Gblyoyyr6!JOHq0V1T052!5j_EP~;G3xuzxt3AD* z*Mt~MMN6J(KrZ+o`&u;+KhlCz&iI4hWNBsvpD?|t*TR?D;N{OyW4^n^UAo09W~jpw zXa_%l+1yw&&G<OSy*6cv8z`AU$4+|X<^-yXQ@(4B{2#LXNYNLjWs)iVk;1uVzt|9<;QL-N)H96o&wBf>S1Tw(!Vcau zPb#|rH&E|qlrNX#M?t-{zfeb%R3HVn$oG1{@K_)!}OIts7NmWPEa?`kBt) z4bwcJ@48u7Q`UIT&rU0Ko1C)! zZaTCCmNAP)#}z4+82YVp7%9tTrOV;>CgHZj*#Kc#@9C7fJWJQQ!5dbg#z-W~y1|=X z0SoFO@4ma#ApNsWe9S*;$0z2M;+HRh_)`2T3r+%fAK#*Sc*V0-Hb^Eu$lG^|vg3V8 z0eUQ}yd&>c6TI$oRm@v>x9ab`I9qk-t)ZT2$MgEr5+jKU9%04>qn){Qjw(>Iyl?JS z!(&2HxOzc#$R_3uWtO*T z4wU37@69=?j6~IAuKGbK*0z|`F(`%)eB4|F#;d=mQI>;VrnL@j8lL^h%b>0>sG;#@Fx^AmWlPkMjspeN z{8^u%fmPm`C2E37dH-0V&Il^a^iH}{4b0+0?*zPfzUnh3W7hC^FHfT2M`BBKdnNic zUnKO?31C4W2h|DsFXxNdFngvN?By*`?J$hu1xkJkJnS?{9~u?A%>4=hypRZH);3l&@@UI?ePd&xxAWI(r;?&N9>TMd55 z6_A`=sV>zZ@D**QG*+rJ(ZXSi;9Zp#$VvFAH}C32s;ty!c*=rAjQg+(1cGHS_w2D5 z*&-XnDyOJG@b4{BXZP^gF5WI?7xJEvOkhyw2JgJv;Bb1srOroe)M9l%KCdrUC3>{mQIS$J?+*CmYP`O81Z0eTY@vnqcgWl+ zP-ruLd@{bO1qF`~an_Q6N3@5W5_v+jV&f=-c+d393+-}FXW!Y9YID<6+fx&1&otHY zN3_r~e!VBm69fY3+jpj^wmmo*KkFOjkpp3f*-HaX<}oo0SU6dJCmp{uk0cOXl}b`g z{C=tWxgIHYB1CbV;t2{?dTl6<<9&htj5lnVnvjnCa+$Dq&9asfe{^;gsUo|j$d?BL zaFxmz`ALzPZ{LMkZ1CFO4Gw7~){hvY8=*vRcSwnj(c?hFfe_#O(y}AZ5&=IRs2+ch z>IJGe{~pzmR&pT8yK70_y$wlTEKuEdPisj&)El!LtXSinvmEwDjd$a6_0!8~|3LZ| z)9FZcp`YGIN>Lm+CU^*v2fx)Mx((kJWx9T=R$)dhOsmxDto1}Z-}}c3b#^EA*kK}+ zBs>e($kh&5VV+2^zpqf|eOLaXdsPttfB0TC5H}{dFNxETIIjW%BVM>ONz3JxZ;U{r$Umk|=1B_|GbDy`o8WN$wd$n4fZMDe6&(C_!{b~|^TNcHu!+Kfmd;i4< z%=F#B@$`zf;eJTB-+Sjipi1dIihCd5uL{k&-+Na-h<&5&52+qZj!ANd>fcjc+AwtR z!PPqKpw&I3`m#i>E-}CD5_u?rL*}y2xXtheJfwv8?S9@L2tLCAQrf+N_TaGX0YX*zp`oKzetm|8~jQ4}z0XQtZ8;WS=&g zWI+NA!;5%3@RAo^rA9Hu)IjdW{%i}B{lY8lv7OGX-^6ky0cvSX7Q##C zUB3$2>{D;eDm7IvK8Z42m=l0H+{wf`-1n{YSgneBiGg#dg4$u@oxK`ocZ^kyc zlg*NRG%cgeryIMVOkNvBy(?-|u@Bq|_UsR}hT$#z<3q~?Yb}59uSLuASR}WNhD}kG zcJsJCCz!D|OO}A$Gr|3kMYA1ki)9YX8~QMy)w!8x0AvIITX+DpBrYEY3=ARON#o{x z9UF-^pDe)a9`Czx|@X2p~b8p zL=xIWIei+Sr(ttDv&1|85qNwzc;`K$o{eg=+$&k5eiwwlT%#^a{aHxeNyc%j&U6;| z(XRO6C`3PeL+2L9@q;*~^9Mg##NUT7osE99XB@v$U^ zesmNyoax-+M^pWTteuy4>e8cyb{#JrC4oBc|4HW#)`II5KUye6<~-|1+Y2Q*zw)DT zDhJcK$B!0iQB#qQiabedcuhC`vO(QoI-g*_4ZQD+lPPkxzUs|gr^e*}8HqfVi4Tt2 z;V0R>->rjkUG06kPMsLvg*hp9*1m;#n78@l_3BF1Ju``0DRr3%-W!jqoh@p4PuHr= zEmLN1P_L;)o6mSm6_{#;_sS;K(W}@5wJqTSZ{sGIq!Jz$Bz1W_NGkA-%Lw1_IAC4j zt$bV^76lyG+1R`TVf^U2Znnb~^>7e=d5g;K%jZC#`gi>kYWR`qMIl;^I$Mb-Zs*_- zI!;e8CWq^o*U%zQVmEm`eyxW0dXp1l!^OHuPZ2^$;GR1?qg#**57o85R!?G}L!QJ! zZN=sro>Ye^L_dBSa$7!y-p5(xIaz4fnCy}XZ}!g_3lhwylOE~&%%XNC7*9ZZH5-mW@T3#2dFhP6YTw|blEgT&u$ z!x1nUKrgTKS!jh7-WktI@x{-=>+q@f>a!T(z24&Az|mIct^bYcQKYA2C$^UKj%~;( za3nU{^#1l6YzEy+gmm(X>s3;%@s6s;F^U!5x_ULzyRBa63E^|h70Ug`v?8zMIhAj& zQSQsrNNGQQPLaAQpHp{W_qgZt>cr0P`jh8WHwoGAe}^4!p7Xq_2}c;7;|+O9o&2qG zn^K9Q4D@^aH26gv^x`+C|uqNpRhm@Qhx_}?sAH)K1=A{cq zAug9NCL4L&B3_w}@#e!O9rK?2ow}ko0hj$og<2K6{aQ{9(w)Pc9n8MnJK^_g&Tzog zVteyVM2l^_dWhyokC48gNWH(gk6nDT^kr3Au)&lwdJxPwen;S)`JZxg>$onTvR)YV zTJ3E;f@&Q;3wpyd5-8(5{h2)6k-z_wx|Um5-chSmVXtawj8@@%2?a)sgJB_2%$QW8 z8hC2D9Qvk2Ygs&9*yPn>Y>|ufb2g=G0aVtK0h`X-9DvvO04RC2*X0#8er&p+U!sX6 zC_gcNdUSDSh!$1=lWYWvVbbK?_6iKfZ`Jpnd`010wD;Fn)X2kd9zKgLef|_0rRx>Mij>FH=~Hyw>CE)e@q{UjKy$b z=rQk+KY%?OHaGr3m2vwIM}yAI#nb==JOSnXatHWmy?56RRph*`Y+SO}M>y~<7Tza; z`1IdS!{W_i`bv=%Dw>4mG+&Kdff>5341y_|WC>X2dlAxh-^Wz3=_# zRn;f|eY|WNGz2oS-t-o}s(PfF#C$DhsmRU zf=rGchoAKL;8p_i*1xU>AKS7JH*4u>5FpEe5urF-Y|4|L=f>4uYZo>IaPKk!9#2F< zWo8+s@=Y)KhPtNsjWm@2Z9LtOK_*`98*s0^>AmoVN_I$-1MdD&`|R1^eTD4fKp9cY z!3)YPOVb7~uW@r9h~tI0-2lz0kh{c;z9=Fg)J!0_f6uX<^JmD84c?7^R;6ch6r5O$ zf)}we|4ZLO=1F4;&JptcK#~%Gnvw@Gr0Elavx}7GdIr!gkVe9mG?Ela&eT&PD?8y0f4-=<^rM0z+cB#gJM2ed!mk8>XsjRR zJ`tCP8Toc?IGGzf(uf^2w&B0R=zXzEbsM081#H_vzX>A*TC+aH-YoB8V&u37$xR5z z)_IS4N4=>!7k;34kki_Wy$oJb6YSvanho9+Z>kT^dnV}LLy+nwK$FJWcz7O7hsYzM~5L)fHBR+i8DYE z;5w)LxFWbL!L;r0;&6KrqTf;mX~9Uiw;8yno6RQZ zdrs|aUQ~8=AVq#(#%W+Emz}ecT(fiXS%HsS$qZpjMJx;ZdBLZ611psK7w*kS8oR;tqH1HGP3~ff%A1ERVMt z((j4dB2qPBf}rKLE{M(vP3I-Xh{*}%8>K#k26#E{EpAc+$CK_Ud9_H4KzR955q?Jg z$P8qaOdnR1dYX7?To{s*@&%r*#5f?ELGvI0^l9e`_I;K`EP?Bex&x9(3$jTXY#VO@ za{ft2NfC@f4st++?}F(kM151j3}!#jQVE04b`eJ62C}=Y=_l~ghZX`H0sBb9MfL@) z1sturY{k@Qf`UUX&1-StE5jdS?Wn6}VR#S*Q4+q~*5(_mLOB%PFv^h+Iss{lpyYF} zFQ$uQMIQc^yuAEfA(w^ks=*q~5CQW^*Wd6i;`dPNZV;t-n^%j-0Y8i1bh%3ARNxOg;x}Dv2_y6U9DdWqmNQc2=kS{@wvv%$ z%)t{Y5=fV;PG=!!Eh9`}uQi#GO^h&wIklOQt&A{*Ia@L#^^7ouIdwXc(y<1{n8d8@ znUNigFoijdnUP(LFoiigGb6hhVG48hGScKn_)X{RMLxYK$Oqvcwlx6-;$gj$l~ixTpZ_q5t-LvVe++={`N)6&tmeon-LI{$M) zmTF<1z&H`#sU3>##L1Er&G5#xF>P{cs}i+~ad>9v%$6tuw` za$wcSf356Rs>P(_8iw2^_u zAnXCy>Iu5#nLG6ZELz_5?)X5RmIpCTIy1!%^*;FkC)ytKhU`_vSG*_x+-+61}jZ8ibSLS z4Wi*a2uv^lrZt~QG$VxFIfmIEZqJcNPM?b_~#0%bYAAT3PqcIu_88qUv z4)MWcDf62h;iLHP^yo{Y7>FPd=IRGX1$n<(T2rnq;_KUCj~G|A%($f2v4 zjsbG$TbUfK3tOb_9qu!VU6D*;v9GW_42QO0iwi#Y7e@S&~PZlzpIYu=v z!M!^_f@5xj_vlCJo?bUm!&w+cTQ7xF+{{PuyesypVQpNYesrHYeCii`d9 z%c)|OrQ)0AbkGsn+%gEL014aY1)ZWqcJpf?aL*p_Mt-a&3_VZ>GUJuoWjch`=c9GG zl-}yGIV{7iZQiPn)!F4=0v3}`6C2JPhA~63Uy87G8*e3+j5T^XjRculJ+XC%FtR`# z{1G)Q{9%4V@H=zo0;z@^w3eZLIR|SZeZJgq{xxTtclke6kG^au3k}(TQ}vD*(XVOoQ$0?9~a@UEZ7jQg-TVBu9f9CPClCq!;;zUK)Vbh%h!_6Yv(9a;4R# zpG1cIDb6>)Zv=ILH7VP=H~1;n6H}>U26v)FUJ`&Nk}eL75mby!rc8 zuUKDftPmx*9E$NCVN5We}|ko( zX~fe(hD1Shus0~MH72k=7wysh}%I(OH+LcJGpPHfNoZ6GzE z&{}ZkKg1*#F2YXUGs-+NO1iK<^FpTCkgE}&G@QSB zubbxJegIJGi7E*dVzAA$xgBY8dFMs9XY>a16Xo6$9q%`{`5z(k5|#TIX%0`3;X2H@ z5%bJGgpc=)aa|mYx)TjJBal#ncSvqUcoY6uOT9NE=7|{6fT&rdTYw>k7N$ncGt@%w z;ix&Z!$K6in_?5ESn4I>eGoN|D<=K~mpB|q{N*VeRU_*;O^dv#S?1*aD2$^mJNTif z1i7)k^Lmhg2AdGJ)_U8r%%ftr5d(1)tf=&2*?115! z(|L<>%)aUyZ&o{VbWm#d5<=ag)XVL@RchXyhbXmqWv=>bXl9df$hyv(aq3Tc+B99_GUM4 zZhLb)h<#go;n7#yn`im4Udveu2BqOt;8mJ5Q)fmuUt*b_Qa5|ws@BPDP_5I!oNnv$mu*bdnqkk6N$QF-_P zkCOfLEe4m1Ft9xD^Fp%-*`2zY7w6wjsHhz9Ax0N?m0iv51w?y3`X`kk8Dq5O zdQWvVPsPm}tDD*V|8;hy!BJgTy8B2nG?JiYkc1Yb*1n((Ni15BXf1#QvH*b*JB{=t zwU%zVyCqqU9f>sv2M}I35JQX|Y-2l)A;In>6(=OoWSrC_uDEawu7nvg!8J^b%l1q% zv0bKSzVlwc=BbPPNmqS3_q*rZ<=y4n`))tIHt*-6L|SA%&bz^)kBGO&a~AS%Hb?kK zBBf{Ei)Q`7fMlsRHrW)Cx^YSD!>HFj@{IQ3p!Dl|(IxTFMCf zIb4!FzM;N~0Ka8`Qd*NKAJ&f~<6&M*u?6%BF7?d?^aMmxirOx&6e^o5jS*&*)=~Qq zGj@_Mr(jeB-EDp<^{egs(IlTqrNz*^n@WY|$&)r30vWc^^B6-3X_N|4p@}WH8v}bJ z4NrNV;4^8I12LtE+i5gE>IsyaY<~*BB!tHn@XHdV(ATF^21IwdYJD8Pj0Sc&oz_B_ zGgOwHL5*Pj8B_*wE`!F+-{G`O`i=QK-_E2ih_)ziCJ+*~rV)WnfA+M+4z&_spm- zThBvm_3+!L?p^5VMU-Oy7Ft(*_y8Tw-VO5CQoJU8k{6Y!i}9K=>WaeszziHqS@7d($M~%> zqke8VbtM}0coVHH3jYPJJ|uaJpDagD>bd!Elw;&sURPh96lT5XZ(KruGDpZDd4UU; z(e6O-iDguR#}$6LjCvpnDkwerMc9l>^~3CkU*c^QnA$J#NCj<3y#U{cZ8+|@)!#&u zC(**~|B7vvmV|Fr&#i&KZ}?$+rRfbtw&pd3S6+}k+B~Oc;tVpri*if9V0J^ zzbb4WKewDFqSTJTi**rmfS1%z-{0FoP1V2+oZ#GAb%Hh5(iX7uwd&0Ims-l5CppQ$ zvfy6=dhI!QjsUM7nz@4Ry(cRUNWf$bH(>*$p%P^|i%qlfLZb?H4-q@D(0Do$HzjFc^PaH}tJRUMYd7g?#JvIw{; z-0q#Nqvj;>T4qDda3`ZJ64;JVJ)F~P{*rn+Ptm`A%{&7u*!UGZ0v^XV8mVCY43qXT zL(Bv$z%0NR9|;}>L<6&dIe-gfJ696Vo`+}~AX&zm@K5uU;7?vf73SDD z#7Ji0Ks+!XNZ>2msVdr-Pa;>hQWbx^no9Y06V2s+ZlWwsZ6ZsQGBD^Ht*mSm!7)wL z$p5~B=CDUXV!*qaD2=0G(`2}lMO_dw>V0#Es zT2M-r78Rrbde*NYTo2ef-7W=EPj?0Bq^!+uPoJ&BJuuj>#QBuY0^6QZrSV~E*u$%FPSt zcR@;i-H>t}s@+KsrSj$$nrHrs`&+1c!Tgz4(++4q0mLc;$ONQ~Gx^gNDvr)VP%@IJ zY%bYC+oOCv9>vjF;vD)QX}c?Xbjrt?=2mfGe4!AwQZ;jL6g zKeDjBom}Rde4&+gMdw2!!%vD{$n(}wnY{o(8L$!s=V#hJ%W7(Y`~v-BgDe8{jEfO2 z3B-xLU=bf)2VZiMFRr7-(WQvd3n=5k7OLl3A0^YdNVarPP2Rakt4YR`h%S*sh4f;hP`a$qSgI+lD8w+OWLxlJhy@2DIL6AQg!cTfx2jNQ*My_KZsWP)ARYtabW){mMq?fC9~0ho@T)w+%S@``eTb zkKz-Jd(71xWNkfekI&wz#=E-JfEv~2=+}&4s|D5QbtAf|7E&WyhkS!Wx^O2$ z^Z~nojX*PC2g-o#`!lSjL5g%kxbZ=IEQ&^~6A&lg8Q_Bm7Z|uFgpYzRQuTae3zcOBk{t*} zYuO$Ix8O^e@50So3YRTPGH=>S6EShx(r^-bS?g+_!|0;>S&5^1p2 zKoiicZDYh-KFHH_cN;U0RwwY59dt5Q^pZ@l23QNU@C7dwM>Hf_P5Ii+$Ga1I*+hPN zC#6~tE5qWGM1E^0C0UZJ>be4YV<+V#2k2r*sgW`J2ZGB}41Y9Ckz<`OlC{YN$eN+^ zFjQ7L+sHEwJRJHw1AiA>T()k1ErkC8Tt=?0zoF^Jf)O`E4E`LF!N(!`{|V9mZ;1Y@ z5IxQ+rd1$kaAS)Imo-S&%OYpg3(rOQ zL4!g>$f~9%C<8YZU73S0Yb;P#X>_QY+VVi{2J4!jwU&BUkn?BVloOF@#c)yU89AV?yx19U&t!WK z6@F4AVD7>mKrwoNHm-K! zbTW%iI4M3BiKG!)hZRp(zk8(8W-{H*;$8OTb;vceK?pg)>lSYgLBx~snm^bRXlE^ZWDBR)s68F@^~NhMH{0w^XGk3 zR%ncB52*#3Y?`m!!tMQ(8xT0pA9m0Zsvz^ZlbP8VNHO@@EgBy9znYLv5BKZCFhe z@?#$Irh)E3CYgZvjkg2*F@$Btyj{dGUUX+MFY;0!#91$nvWoeAFYPy%@D3kUjg@GV z_cY99Z&MxMZz60na6iJ8AzU^Oy8TxO%W7ogGNN>T2jL|lJPmwIH<*jbCD)+yc_BP9 zghzvmYt!w8OHb)MD#U(H2*;N`QXZciqPT=bR@K4jY4wGmx`h8}h>BxMHFYMWRI#v> zBZjFg4|E}DlkV3>eTohIQN)WEHJCew@ijxK|BGQdK4YxhYH9$&fvGa9=>X6GOjQ8O zfTh3^U@-t22eQ)LsdRP+V2tYo-;J{fo4d=FP^AsW0vlE;gk_}7hs3o8W#Vp|+hf~( zH=+RsGEe4LaoQNU+d;*hUqzwfE4zU30J)+^n_S+Z!9m=CDV@{WU$)@&LtdYIK=r@VbdUIL`)MQL{hC7u(YAIzdk_xE z&espZebjOEA*xNTv#OI&7IV42uK{{}ALVlgDUQE>h-wmGCUf@!WI3dCf{cU6MQ2i^gG0sIhn6?hgn20RM5fOcRlUDXUE%4~TzkZd=?&-@*m z&k--#$;LykR`P1i)ktyrteZsm1n>l4lh4;?70fDtuoV??(l=>-v{>t1^dzsq54V|D zv*Vlew@hT01f|^4$r@=idW6>yYBwKUm4vkI_T~|J)Q=#t$8* z`8dAq?MVDV0o%*Ybrd>Vp zg2|IEz1#`~9=F%naXT2y%?$?evF$Magu`LmvaA69!$)ih+c`OQ&=#?*LMvhg!hwLz zT>n2SXxS)$Vl6G(3V37f(o`^*W8*(msz0GXI42km2ct#NXfSMr0B)mHFu+{=7eu>( z)^->O$FVFGoxSrR=8N-)S|pcl+% zDA%%bBovZ1ZFOqUYY`|*)JwgD0%8@0+XYhMR#!J#(Uj%ZKk}UZHaz0}I4~qtBY78I zH0iR-esRI1=@(fyORGySpMKG_izi)h(Znk+n)b^}e{uQ5!PdmQi4!lJG=0*`sGCdJ9igI=t@*ca+ckBy`0(Q7P(bwWv<*Nw@aPOlRLzd`EsXp zyIZ>U=~1@M?$y2LDYNY#{Wy8TF{#lLPTDG?#~e5IKhov2Q%9Wqr3~*fV)R*;Px<*J z$y0t&HTAM9y3CRrQShp1y?*uU3r`;Y%juKPzu@BYE}e8y@*YX9wjY;dmv!=l41ZC& z^mvICUX`b1qjde9JSoE)BIcOtFx9~384ZacwBN8(%7NN%y9aQnOo^5B{& zdBu{u(QfbLH~}Z(ZOlJ5r&_9(6th= zSSaem+?pAUmK%*fXfkU~|TvR!7MeFH!W4EcT@Jhxq$Z>n^CgRhzPe zX%i%h_}E_EXGSW&ovD_$X(S7L0yk*|sOZvCaai_|0z#(~HjIO1cBHtT(C7IY;;{j+NpLlK)^-A4EG@rc<`R}#5Sp_@Z`=eU0&Yvsf_cMBLPUm^^StkAZEr2r6^(-N==R!YFWy7^Xh4$1ef(Opj&W z*FD>L*Y_-qZ4rQt%Fl7~Q0W&mAz$)DL-J{LKO5QM%_q z%`*nG5HP!BU_TJ9e&A5>#LEK{Ap55SZ;_>Is*n1+9Eku=Rm_!V*Nho7SQ4KTli)P; zU_UvfsKOpYc`T>H6194QbXCK~NNew;Aw^Ky6Nk*p`xL6) zfkuz-^ZqlWGcf5mv@MEO3_T7qbInjn&Z42MK=j9l4o3K&LpfEf9#$6NIHB0R-dn@Y zZp-luLJ5>vEiiGgN*ltl&zms3JrwDb;R&NiDRj9YOa1VXT|iDFa%n|cD+wl1+^Ae6 zNtOG}@J9^a?+2Ng@Z<=ptGr`;DclC=7$`dWm{UqMW4kgvkqeFK+O9Zx?gsLF2clD=2+^d87JR>zw=HhijfeF zg4)Bt)ESqA;2t;bB$L?%oJqyygh!!W=sV#|8_rf{WUS}My`bTp5&(cbFs(Zv&D-g?Rf_E&Sf{^M7+fLRh`H*@`Y>7(%;1a!s(`5^-Oz^S9`72+)#-OdY~ zcDg+1{p_^yu#X-(?G}+$-qAmvkI0rEceau9&(qJ6$Gnq%TGQrXiM60IqfrrX=iZ1h z3&tPwcK`HzdDt6!#z_Fa>x{9o+I#Peb70FR-bj8 zcka*Hgiv2W)SG&CiP!tAT<_kW<=T&l*YE7k-XDMVtO<7W)|~YrTEGA7L4MwvFVCJL z^6;8V&OJt2Jwi(P2nC%O=DY{J^%EO`&DG~^X7v*FCjG1xz<)OBb1BRQ4}hF2*PMSr zC#if?XyK&0wRD!2SR{h}>BRe)m=i~0roDiBj}PfRcVPv(yZ^%O^3a;(MR${e8!ny) zI-GLJ5@hVVq!(%QjYOD~rsm7T2(J}I}Y3fqFRv%3ej$)G@!IF`HWChvkNQ$YF`r;L*a z*L1k-@5Cs0xdKKDFK+-wBYpuZbIql{h|qMNc10N!tGc3>^F||Ti#y`3eTkuBgz$*~ zPr+0N@%`%+oeOmqfpnI*Z+dN~_K+ps$f=XQOAU9MZ(Gq@izO%3*@A5`B^fA#dF&Qf zC4=!5X}ueauU_-z)Dr~Ecib;mN`L5hwhWERv7wlK`jjplijKdw;s_=aAN6*C$~$oO}IUEgrR_G0U+q9vHd1 zL^W2*sQ&wE8ZkB`-5iV%WVOtS1}urTHjuy?0#t=Ev`3OWx z=)dQsx*=SXy0W{`9T@f?3X?Q`VFyWZom6C!yl&NlQRckr4dE`>_5K+zZytb9~{01fx@8>ZkK0h>|z96TQ#ElfuQlx#pTxE56<*{*lfj3V@7 z!3@)zVsFok;ksYNG2jo>4RYSNnI%ZRbmoA;Mml0d5V+g0snY1%cd#xamM z)$w&XH=4y9-lW;CY+UoeY;b;q_u)w6w*2C>_Q0X1T4YkU)Wb8aY|`vh~b+(cDD09U7@;Id3rIceZqnH!4#h|ALE>~K2!6=uVTU|rPH z;(k_30c6`m$;T{W;325!*&de3jSukRw~ammQM!5$-ImveRk?Y(a#Rh$LG@d2^S0d9 zz2Bi(wB)zm25^ZFAReY=*ezOi;+ni&yfL@;OKzj$+YNKeiq|tpBU4O}i$ObHzviCX zTS-)V0bp5KuoKqT)y6R30hcQ=D}I+ZVcr;Hpg}oVzJb;&L2U)&0K8eAv{CHId1o2} zt(f&L^*Y=^1MTN`=rv2gZGatQL&M*7M;{2m@9#JTrcRM}3P3LKDqs`cc-GaEoR&129a=GI*v9i-RAN2r;G9y)Ke>OtiSkDPG@fIY>e_C;9nD{ayK#3a8sid zXWm1%i`_OAxB;_WQ&`V-aXs2~@Nf8|-GHD!+N%)6Xlr%|=~0^>Otv8f>b=^#d#JB( zmK@dh2K?!_TB0dUsIY6FK<(r1Kw;R#p{niyYfyj#zgef$gfl60VC@bK3T%Vj&Tw^j zP@oava(jO$p(%YJlxV?tT{w}?@BDD06(Q@xi4xY%8q4j)!DL$}kivWzj3XKTrl6aD z0;CZn2vLt>y&rIAnINoUx7q~b2p-T=U7|ID`%SPVYuFb|6d-AHs45B6%k8znWHG<% zgK^FF^mBmk#SJDvp5E5$fkX;`y{#Pq81(rPYflD3>-byU++()Pma?dVR*{lLr!-ae zay0{UW*fXPBdhUWd{AIBJu-C$DI(|YgS8jeg12`FDuU!mekZ`}27YiM>V8u7Y5Hyk zt(y>Ht$XtX9lUu9N>Uo(-5Nbq93RNu?hYk|OBXv<%-mN>KZG(sSl?*p zRc~ugNXt0u3B}F&2bFOBL#F6!eS{A5w*G~QV*0cMRz#q5h|9L}l)X2UfP>Vp!cLHc zde)LD1(A4OZX_oh3StSZ#S&fwP4*#dt+zE8G#{1U4m#}{nd*LNoseIQ<~5?wPa$9Z z9L0ucETPqYbV%wdx+g5V(ysI#UKou8QBT4SRI0>kDLv6tm&|i}5&1m#D{C}F-DVs4 z;^t!g7EV~Pt~7g*6s&aP%}Ei{I&>ZVoSpCO+k&uNh(1&u(HH=o>R zod#~ioELWgIv1)SS5Fr3{(z5)F-l>S+`wtUj`xp6KylQS=XJO*naY4;4h(Rbsw4Bs zP-}iD7LJ1PZNTeKXH%>Q*Z=}!@4m^VBJm<(zB@z~(wzeGIZ=3Z!%iV|p{t3P=G8+b zAf=f#Rz^%&rH@XgO3iTPHmVGwB28Jt^oLet>gkMnoV*HqAv)oJ|Lge;SJ?CUwb?n? zqi71kg?SV%l2n=~RKc0DvM~~%S5587lZ+~30mDJMjKs|FYJf!H^jOK zoT6!%RXZxD)RBBSsJzIvqU0~yZxjrSkvFWNU8*(v&IbJfZ4=We-$m#m6!{K0|F)QG z)v{bGo|-JZ*npIjR@Ipaq+SC-VWv~4D)$Bl1vFoD+F!0bsE5s?s`;(N;GdiiT2t0 z`hfS$n$B%jWo51QvsMMXMXTEk^$UZ9C~TAxln(3LXQodQ7EH(a6{+MUL(n?!?7Cz?llW+prSqAzE6VIPHvvh=G&tg!J^bRA$D& zsc{WJYlzN3jkGz@y%b z;v-9)q5qBXt3f4Xg2=Lp0Ke|CF8{km2i6w^IWs!@VfJ&MVDfUOOTL?f4Y0!u0riZ# z*N0rQyk{zHndl@l1bb)#HX#8+u-m2}X&HFeHZss;bHp)m)7toNOVHv>njuWw@a6!F!m^EqzAnhAMTY3 zVv>fRJr5OgX~{e)l0~+$JR1ydVYdKso};w@pmPDI)hIO~b`!Oh!2%^h#9+N@bIcg8 z#vIYy22BYyAEZWvr^0MCrk2nw!oCZ90oX(^#zqeE*V5Jy7+^F9P%L6fUcn_^CJu1kp30u!}FuOU3 zRL&uG4S45Zt}_Ev=Z~o#@BggqnjUZ3uQh%i$NOe~ylZU8KTI&f14MTLU4&-`CN4;K z5F6lR#9`SWy@4Xlx#2e1d}7_|(nnktZAL@eiBvw+=i0 z7EJlWjz73cv{8!6AYP%-bdw&$LvT76rlX@OU5BPRxy2tnJ)_d*^O>&=H^f?jnaF`q z)Q7ie(-SgV*rO*s>z!1n!U9>S+;@ZqS${*wfdRdXU-Y_(=wS0Dpx1}~3L(Iu0L=nM zBzNh_xvwtU+j<`c>hx*GQYC+7&H0C0Vx|sRV}9HA)RRaxSR-wo&CqJ6w^dEn(83D^ zQxtWhFmcFsqx0i2>b8S1qUj9IJrwsMBG0*{C8@&mGMv>OU6nBxxMP@Jo$iBPap}QA zO*k*Z8ReT*|1EQYn>Z|f=4vw`-Ld+A_k_gVZW8v%$DA&CZjg)9Z%;`2gvMqcGPou) z1dTe$%sHDl1ax3x2pY{0{CLfOYY0}M5)Q#5Ys?V5zvh4U5H$FNEqL5HJJ$_BUms=& z;*^4V1F7fTyT#aH^`b3rdg5t$!zRFVUI4j)+V`!xI$i8OukP`p6bP$}-|QE!(Zzi; z4lSn_Nv66ZEs;2F=$&spw^y41)Ai2q>#a6uh0UC-al>ljEAJQU^CrVnrTyY*T&^}f zxk`5=Lgf96Pocb@qq4Nmpnj@Y%l&w$9R1^mokAuul$|p<&wmpm{HVanEL@(VWnKkQeydGqiTf>CN_~-h)q-XI6P& zQ|;D?FM`bK>glOAtA5|5>{mvU()jk^>!;m8+~{?O=}PNFb1YB3OrKT(zdx1Ek-M2< zTiLb=r*~M85O|;WO--5tY-}H$e`skhzwjmP;a4g^4`2cRyZbn{<6ZbOD0y*w&F+Qv zB)ZFWFKe>AVkx@C0^CMO`@r1)X|I@e_Zko1wr}kpj0`k^y$^PZIRzlQ*&O4RR<0YG z4)qtqE_=cXRD!<2Dew^?hnvpWD8pV@D&D-~6-5q?g@S&1gRB*T+SGJ+2dk18Tz`uu zy^Db%!Y&4kM7JSKQtW7U2f8be(!vbzas;C$xQcMyv9n~hq1Gb`$0By4G9=uLq!N?6 z3BgvTTqA<{Cb+knM^6rL%r@yDht*x7gL*_!|2EWL4?~bR(d}4)T`V)^>9N;iJ|DH_ zrcAYU2**sY7Qwg)Vu#GpyTaJBLa?Pt-GLx>DN!w%wxGhU)@^kMEwF=zu#3f^-sl1& zY5A)US0(gr7rrg9<5y=-Ne0U-t}wjE?@nUB&fOLUiBYM`O%|~O!B99S!lRGf?I4_N zL5!i^da4c%LbE|GkxKCa5;1(%&mvVKOc-kQ$Rxxac*zC@93*)5Fe%3uhHj!2P}qhe zHW7n@lfnTskg41*N^&1VPxz3e7T_IhsC@HH&e(kH=Oe~55lP7BiHPST9>xuaYDwpY z0Uel*Ji?VGb68cL5lZ?ckr+>g+#mr6YEMt*U7nPcPF`x|4M{4-3FJ&yAI(VQIaY7W zNkEi&Krf%ABZ)Xa!310upcJ+R;UVm8C5KwaAe2AU8i7xAs5KlP$oXJ=u+lpUA1Kg% z_=GC#Uie_|p&TEKaTz`s)bkvCF^;A9v_Hl!!m>V>bd9(RZZ&j`xL9omk>Fw11slF3 zGgjd4Y-gAyCtLLP*1g50VfE2H1GxR!NA|D8&bq!cHCOR>bpM z>_v!ln~YDyoad>qFVm5uh!frr>cHBsP5+KC$;^`m`il>8>Q_`WqnY4bH zPSkT6+ayzaN&8#5ghd*T=?*C^q>F)ekdH>EZLPk%c z`yd6z8=Pzn8KEHz+*mP!@c_1qaZYte(xSp*kk^YG%irmTR<%aX(3}2b5O!#mxW#@6 z_#`bV;UXWt(HaEBfuvz_NVyc)6SsoSslaIxQ%wzp9cRRflls(2l=A)!v}u8Z!{5HZ zL&rfhHCzk^NMD%EbaGJxwdJPibFodwJkFm#kF6CHcH?9+{ct5tk zSQ5a9XBeZ1LFDW*4U(`&Io2pmV$NSlD<7^LIKV8N zU7;z#w$WvbKib#r#?NL_gCs4j$FY)=DQo~=dS`WB+||v@0&3`66spvLDk}pJbrb&d zwj%KNVswXEAT&_L7MwlQ%Hf=v{s%NrACEyM^6ZqK?5=(2IZhv%+BrBZ5Pw!Mzo5cg z>d$;vewm2!rVmrFViZhB$tVlRXl%5jM+c{9TPb=-t>`|gB@NtaOuU$Z@>}ao<2=qB zKo_SU!D8{Vy?6JuP3hT;yK*#+#nEKsK%k@G5Zkp*K{s^A(N!K7Jv$3ZlMc`%9V&{D za(Uo?P$!SnA;~h-0Uo3${M=bYNcmJ?&w&;Dt=j`R!OB#Z5qH_rM$7G~TX(lJ+_bFG z9At7x8_?MXrZ5Y#E6%|tUWN`pg+yilLDWnqfqno8dS86nJ@ri^I1h8YyYJr&6(fX? z>9bp3{hSs53X*B*BU{3Lf-7)lmK%v+&+o!^TLxQQWhqMTTApqL3LKV3<^byDS zVphwCT}R6cqvWR0tmR&ZG<_yD8Jz;=x2MBs2m6w~Asc>dh;yEM-Dv1f5*|tmt7}+6 zlm=j9&`OWDgCQwq(ZivI8wV(ti;8G-CEGzmkZIbH=9W{4vnp`B11}BJ-T)P%Nx&3p zm?JX1#sh;5S{vzP2a`B9p?MWw&8zWoIBtjY%?a?U?&Cyo2l^^ndtjK+jQkSAs#O^W zg4)cjuWKYHn%SoQ4n&sYk3Lh!>oGhra@|yzkNLE=fW9MDQ_Ske``16(c<=lpCuOl| zEQV;Dv*~1>KXnuwnSu3?qfa=WL79S*0z063JqF)WU^No2QmO}H{XmZ*Dkx#KyH)4cWtI8 zSoBdZwFIftA$X23If02l0HY7Ex`E*cp#npYWsC)aWtcxrXsC`b3gOVOjiR%m{7eW! zMk`!R{k618xiM|w1yE7ISaX4qGt*XJz|BJ$Uk@}$61Q?Jjx9ep#KnmloxyqyQj4bI z=Ok>mOxK5=040K4JF01CNS zeV{#R4;Pyp4D#4N79tD=?Gy>HSV#zWxlV-su~Y6sGxH}S$caGMkgC(%84l2P!E^1Q zfK!+j^rEobXr3~Bux@csnce^Z&&F>8!Eg{*i~_3{kTpU{3}J{|uJI*)3sAx(2y_h} zOi|jvp_vV25q4ocI$;;BecDrEj)zpa-egU@XKx?~U9v>Aq%*Mh=TqJ~Wj{-*6UgfZZ(Nj@9V4CHD z2unhkP*sS>Rzuu80hu|@uy4Bu>Y#HSW2A=5EW6VD0~|zKPZ6SRv!u6_P{%G8u=g$Vb>?2!3>-{!ekE|(gS7T*a^c-i2oZpkuDKLfe&~K zWFS^>5rJ7~O=4~c&_W7(`6so-KD^Ns<`OKr9sf+DW+n6oLj(Hi-a$T}?0-iBos#BWIOqMw9osv_NmUc##zyk*!r9P!DD8eW1D-B*6 za!NTNa6EvqO=80n7vHA}Map`7)`&qnl2KcSTy50i-jS^)iVR5o2^Z?g3Z`SAq}C=v zZK98;hU0)RR{)K|0Ts1fg)gQIjPLOnLP%RupJ6aeDL_m+`GQUmL{38Rb+vG0acv>Z zLxM$Q{Ewm*T`Xpu5-f_mUK-L$ocwtN3a` zil3) zs$)5@Kn?N5kZ<+BoA}*zFG3G@awd=@8}m3jiE8UNs$X~2JX4KDmW+t zl`$@cwTcF(P@d3Okn4uM#0f2e!ol=~6^$oMR^AE+qUrl8(3S>$8+T~6yM${I2~;|k z`|_<|bPxqALkuOlgZiW}N7GB+W=GN{Gbp;x)TQmAOU7;vEgN^! z>|=pP!%b;{tFA`0)ZGc}j3tZR5V-F!fUu1yXF!l2?tb8d{Soip#!g2=f$L6yRjE9v z4l!f&W50M^1fLkU4l!eDx0e}V@8ibO)LdB7aKPzSt83G|q`3r}YfgIiDhOW>*EBJV zGUgY~33wIK`<)yw69l3fQO>P29(g}8h=<*xPh|7>Ai+c;cJZ2OeKq9EmdpC zI^7nHNUid9J(`o#uz(ws3anxiWLkfVR%0G_h;1Y7x%|;s4pD|Ed%WjvWDA9MNb^we zA|-BK8qqdv0(fvRCHp*-F9HGCa4wbv6gGq?=&1-&3_RXZA#uv>AN%;iIw_A~nFhiK zD>*@>cw&Zzjb=!eq#=e+uZ*Z;aD7q7;L@*~)&|(()AJ+SPwNFRX-c;(7^%o~u;GE6 zsR$NNpT>kM-RiFcI)3G}X*}cSs|OsuX{nI_*8_=>T)H%1c~55=OqW&Q;=YzO3q=}o-`<}TdXVjh{22FYHN~Q&_G{d~xQC>@*zb#n|I3!TJqN$z8 z_5FBA7>sRK$VNt7a7pYS@qw`&OJ$1~=E|5^JRAAKn8$!wrUD=tLo?~P17U+4uMY9d7z+fMT1i}8R~g6cQ38%L(mz*p0x z-NtN88u&{zU{eHXEa5Nu3gwv0j0Kbm<-P%9!9MBqEWvkS&-i^Bh)K2u%3_pTnDv+z z{uW?6q+-r(feKhRl^Ir?Jagg2XBOioFy4Miu`HhfFqhP*>=EIa3>487AqmeWU><0G zHUW3@IH~EykycsgK)vojMloW^37({nmfD7pTH^g8&~-^N{Z>h_9bJk~K_xj;G#gBy zGZi4!AA>Nf0+nXPz`YiVw?34>ZK3Jd_=kn>%GeTwxcm(2P?L2TyscsP)rVfm)7#Qf zhz1w4P%K=`!rNuL0Mbr&kSBXVYjOCnprs23e?icAUt`bMsDu`cwn%7W!q(OP4^BN) zS(@H1_vNnQ^(2xW%REg7e{Bn`fj;D>*e|G6>R<>PAJIBkyv+RFEL>*t)^ROcMmr%M zgx=BQARm{4Cg>IBH=|UL-91prW_0MhL3+&>7;2@?z}6sC&;;`#UC`+=f4`6_hPx5K z3~Zps3A!CtZFUrWb~>zAZG4tro~qu>zf~<`0A_Kdr?%AF2Dt!KHI}1TuQ)1sA{iq;-N2?s|_|y z`jHdl?cxI`y8Wgwx(xqnfVaf)7bm`a6$lhGZaDCjNnw*XLff3eb4_))oq;>HyJs|7 zZck(b33vWXL^k7(SuAE=1i-;07`Di3xT&$P$$X;7&P&;R5ugF*gX}VkF9O*50XO|3 zfUOU%<3#{(_n+4C%?BGZCx&dPx9rd7<6)4z7ZZHN5G&ug8`;yBZZ2ja>Q1+SrigI9KzdbhrKym|2hlPKeFyvTRI^0p;nx+D}Tl9zacww(vn zR=@3hzJ;}IFhGuaNk4;VQ|F@2!Bz1^-t?DljWzID8yr*sl6QI0zg%ShZH_nXFL$*f zPoUM^T554B5Z0ep^72Cl9(qp0zx493Vjpk}m<=yyv6KsgI=;dy+x{~=V3gYa6Z2Y< zX_q%kQ0-+&^c%1K`0pi6Mq%)^cVPS4gB#fJN`-#;5Bt7w?E~WLSAKNl7B7AED)joj zS3Ao*FZ|k1+9*xw!ElzA+r!ZWK9#6r>T4I5XTSYm^Zra`q|HF*LeQYAHhJH?R?-LN zXAU=I>FdNXqxfrrUB4m|uyGtgrvzOnM+UtyI|g3#8YY=3PGD?_4~6c%j}b?eZwj6T z*d=r*X8%LZ+xm_zyd2}W3Uc?Y)SKXRj$)=wM{pS=zEdz21>NG2`~&99 zIlvP9!yGKy@y|YyIr@~c?i-zkI4U<5-e{1UJqwlS&^z#(089V#2i|3M_pJ2fjUwQe zFwn@T1Ut+O!7}ILrS5KngTqG^fI@!2uJj3?ZXe@|2GJZG!5E7~ zhHANjl%~#$&XbWkYHZ0ec!}BUlXiP${4Rif!9WXHG3%o~n4r_T(D)c|zOFgi2NEiniU?h3xzSY({?X6>4 zY8P3#S2uSc!Ttc z|8&h6@7yL?5E_#-1T2F1Pd)qH3u1SoR|$9PLiB5wWA zrgz9Tr1R1Ve(7!R4ojKRI}e4}b7;bW<^=5cxkKCy3y1+5V$IEkWR^9VKxl>g0;FP@3HqL#BM{&rS1xoQ1I6hJiylDuLJXb>J&PL zTHYmpE%&=*ie=TlFoTir^UEYScqYf)n(l$_&(2JYHqM@O%xyBA-;~}FO{2cJIbnjq zvN^?XZfyp{PiThld%BR#WD~?Bc<1iA%-$kiiw`?vdfB_HJ07!*MlTWJCJ4?v!3@Bp zxBd>V@85>D!+0VRta2Mn2u!@yL$&j~nSUE0fASjtHfoa5wA_=aMbM?|(5*9xm}VF< zYDnj5tBEGDK1HM5{4U&PT&K_4hw<3?Icn#022Ox^4H+#Ac&k2W3si6Tdw;wKzv}M} z!Y}=OOmiQOeScv4fWZ@roi?6r>~-zf_iEqoYX4EZD?aGvz4`ta6fWD{1r?pN+i9+% zZg=V7G{wfkHD+H6%v0`(^jo{N!T@jM*vP9hz zlD-2E%}sEb0p;J@vf$B7T5jXwM&DK5i|Ov##p*yvx}bbAEL~-TIx#GbvSD3bjktk?}=D$%^lBa5DbhNvyN(4OuB^bCgi$;eCZ_e6V<0c zp2KHvf!u=6wJl_5#ZTz>YT&*>i;QwRkQQ#RjJOM_PHzM~bgY)KYV~0YX%8gBahWX} z*VV@H9KM{PRu{>db$wgO3_r33dDpd;w?jj|Yc%87HJ)n5bnR~r8Pf;!n3gV~>D>=V zeoL2ZT?}0^q1O)r&E-=5LcmQp$DFoLS$9i(fO zf4)w8}BG^-R z#T<>?q>)vB>?o&0rjngx6b5y2Cpo5VjL4U|iytEL>ahwLJCea{(V4IF(6N9e(JcX6 zZs3VsDAEM2v885XlsJ%i>8Z5?)Q9HW}Uovv+20)nT0Mq;t#(cI7KSc}T z^8`Z-thH6;5b1vg39rXN6TW#IzD;;e0EZ{MCQ63z24D5ka5DBqlUoT0g211ToVFf#o(@^IN$L~knL{3_?X!fAHoh*Gmep=xmscJg?RP$FzHwL zwCSL2<`LT+raBFmPHmdiYRn7~Xg}Lln~sqQox$bbL!B@?-Ol+wKy}5jQtEs!WmW*{ z2T(eoDP6Yy`&xx`{?Coc$l)@e5R6ZPXc|%ghN#)YrR!m72sPGNDWglkR{#VrHNS`) zp`=KBx=OgxtJ6xzYJ&}{s}ft;WtJ<6fL%$4tcAN}J8n^zxl%4SsrX1KlUvloBT;mY zdefDo)O;7Fj!7Ck2j}3SQ}mWE+5@|2tH8!yg&%@Cih*$)n!Uh>HU)f7YVJts&|L4< zk#fRGTfqHjp7y10a)Rm1PYt-$k2LZDPzx?GcRj=N9|iu}Kja@Y!-Wc696h{p-8sj} z5E@?Ucsb{Aq{ss-0ac4pnDAB`77Z8{4Ydz-gM?Aax(FxMwptp!ykCE|MA5I+7Royy9ZZG7CQg8`=C4vFlb-WdQQ1JiT?{V~$ z>%H9m{AH5=&%erX3K~BCsA2lIIW7`);RI<7dR;R?dL2YB{IbTF94G)dYo595RH;md z)d{D{PjWEz;L*uz)k~*Js}gv|xsd{g5tS>QMQ&{t06fBne;T^X0LQEKyK}fKNAgUYHOSC5(Y6(UEOoarVdlD3 zKbA@1)4<+t!rl8glW1a7I?V$Wc6uMI_DR6>aW~)-=h+P$q-~GefbQN*#j8v$jk;oW z!C7)qnBy?qHEbYnsRX(#a+c19WanjeV!yRKEG`mv@rvUld=^!01mYf@^@mz(=zjxj4fe4tR>;oM%c-0ka)3S<&(hB&@Ek%o2S=nG`_ zMAo29k2A?}gFe0RrgZz(!#urk(;k8@}Zt85%+b@dlN9vHZv^bRoSEH})p8 z?s`l8>SE~@gtca?mwqk9W&4`a5WC+rH1J_5{Kl>m)%#-Uo33(IrhulTxTZ=t5>CEE zrnEJaUW8AIWGi;{=S!qQhO5wItgW9`T_#J{gMTV0&-_$S9!?3MOZXgxUR^d>j`$qC zI_)%p+f2VluO?qAJzKxn2!9Nobwhb^l^;{fFO_a7M))W_j(%s}ddL2(d4+xrbNSm- zP=1-*%p3Ll|BT!g`n5RU)%_IVTM?e@;=dg4zgll}-!?*oODWk&|0$D>Q-@e23EZr?f-q$J@y#Xy;Ie z5;hC`DUc_bV6t#MjpNFU!4PwDa1_SfO7)22&}hru!SJT1z%=vM4Y^Dbv_8)Ixl|4J zg>M5HF-z38!RRmvz6z~QLl}=1H$(O*xm-?frRQYeXwD{Rb4OKOF5M$r^tK;{cERP+ zIl3v$dz)6NcdwRKAtXTL-o0E(I{Rk7WY!xQ9tP@bkqf|1zmW5LZ4t~q`t&hoEbV*K zPEL4gFp+^1coYEM8iT|SuKGh%orCiD!6i{+zZ9opd85JhTPq;0f86cJ)kmAsw+PZL zHeRm>yYUJz{ub4Ah0GZT(C+5Il?|K7-IpClReQ4IyD|~3r!iIFa2YnwvGNXbgyS34 z+NrR5x2U(K>IS}=3QilLdR{3d_QL1Xm@6@^pR1}XrEd>jHbh;=pFedA z`_!Y;(j(9hz-Gla7$Jx}w`R&SBk<8Q{M_UgRsBo&5Vxphzm$H*JlANITULcdV;;LT z8xYU#?b_@(db=V!zW6!Sdb+Nv@XF?X>^i6)N3jRyB*C})0gldQI!v2x8B>0Ek1Bp8 z^`=Li)hEA#3A#l!<5DWW%_eD2ppxOULrMC^!Ki2q$~9MiH%)=_OST$*4OTL9e=X;9 z{%y06FqHY_9ql38id+an{#DYe6x_;pCms9@LNni|+3+V4Z=+AEFRqt+ z@vC64G4Z~1Qk){3s=1$0z9|i-p;~=|43itwKW~tBJsX&@9~lMl8@O)X??3v8z5m|U zfq*`UY_b=tfhidSd;dCooHVe054wA-Jcr#JDNk?ZfYS(q@^C#WxN=JJt(=Db{ zmueY^D$lHzV{@^_=%dwHo&8*CuU05&bld_hQk@B`%pt~ z>ulY9ePFuWJ|meA+I=%qer0gN@i~Vn)i+}Cxm0btQS`6Z;XECvnIB)GVzcDLq`%6t z@mrhxt-k;d7}zeS_IhT)#!$bWC5e9DfwMy~7WVQJZJUW&XPDYBg-O z4AGIC_|@v#*)WkFP|wbm-uh?_wyE&Ywi6qbUxDAT+oHaiEqx*PeQ%OJAi%jd$w;|g zExJiY4KWy979-9!|cG%I{AkB-TGWD{8XvvIX$lI0v)WV)gzUsZiQZfEoy)fjhnBXAq-G$T;In(RV!<7ELZE%Y919eQd+|xwBvrTGCAD05Ksc~ zS#T1=2!c1v-lU3DDLGMrI&y0X63S7<_=e6tJymZ_Viyo=_fdhkJ-lNJWh zLmZ?-5(EOTj^hxP+Iq8GXLyMZi8JNLw_uBGsakf6=pRZo^bLTQPO6uYs@tuw4!5YM z>Se54rxx8R19Rx&4r0tJ?}i*bpjy<*z!o5Guk_f!eXLHc)g%1H-Ev0cQ&Zp?b>=Q_~9d%l|-Xms|PI!*AEb#N6lsK3-fsV!9n^Q6MmyxhlS z!aQu}E>)MzlgTE7FBs!Djntd-4=q;1=flids!pFTV~X_;4Y%b>%C^z2xKe`PGWEoK>2Fea2EDEMO-J?ld`R{( z)$LB1g&J1e37%+BO?S#9#75pFi}2ZXSDHO>7(K(DTVWECz(@kkH;ZP^{wmF$JQ&Wg zf0DkQr7Bi`820?dL7X`tGKWMsm^J&h>TDPa(wk=OZ1y};tFT~Pb0=k~_8#dnBuky( z$$u&laAqe{QKt;6b~FhcSu;;~6WxE@lV(-wrrHHkZpOLJ^jtMA&|LcZ0{OMcz&4jw z>1Qw0{d{!cVO09Ds>i(&)tJJ2riR}uBQufN_i6!MbML{bd2pnT#E5*SZcb|5_mBIe zZxAxrQZ?3!qek2h0n66W1J$$lOG~Y&BXKI~g6~(<`DtqB$F-s!poTYSxgFCWokwPo z7be8Fv~>rgt?}C$%~`&-E;U)D>bW`4ABQOHu4>dG$mLR1wMhGHZ(bzl>)8l1Kq-BR ztPU2A`g)PH9f=;}_fY&K7&-uImjz@}in&2(Lkcne_+3{$i{NKGXm`X4)qj2?XSb%2 z)DllUje?7Dntp_cGO2ad7r&8nzAJy>1DY8ge?WS*2Rhi+jPOV1Xo`{PxUq?r)RzxH zPc2eC7R&MJ?(p|})3~b{i-j(TC5vT52-Sq5%1ucRRk%bZn58(*M?4B^>w)zl@@ zEv{WO++;QC=U%mZ3G~7i_3jcm``}E8-=)Sal@sv0jsR~6npLd7si3XBZ2tD$yZ zOXbYMEi{j@b-`(l`xeKjZOf!9+%u;vgT=c=wOu9^^#4TFsmr9eWy7KHLo_@g@(e`H z;UV$?kxPF&c2OHGHTWSZ&EsAP_k5aOP*avkJ9XD`Ozun6v&*rK_rf7~HMf&v+NnQ0 zL?5(+@v*s4!{eI>_4224G_?7!wZ>2eL#S~ZLe$DyZu&OlZOb9?fQ0eW4B4gd@PO#X z{pg}RudZK?p7nTGIvOt;sc7$dUTt_t1~Em{sjo@BONiJOhO}<6lx>cQ0G^d$^q8_59;w%Y^tt{4uM8YMw=qyu(y%>v_^??$;MY zGkRFaa`I0W=tl&NxW+un?wA_!h?Mp+x!DH_^j`kA=m2bks`3#jPBpSftocv^+!{wL zLbE;#m*u9l?15W_Bn}7kW;SH4X(Su6-avNOx-zTMU1Won2aWLoB*h<8qaMWy=u!3a zN9DKvFIcOiSIM8!;mB&aH1!%8vfNGL#eERxWdlW9uP-U zpJEG)1R1VJ#NF_cs(Va^6uyB(ea4P22jEq;m(&}NX>}J^BjaK_FakKy`Ua>zbKTi% z;1%tVokX{4V|Idif355|sFeESbTNbEmo|OLh#GjHP)%YaL zOh5cdCY;GW{i){cnx}x~0=4=n=@AAB*h^UVF2eZjV-hZ8E}kQ&~aIXr###Zq!l+(=-D(eeU6TKTMx?9u^Uy-XJtU=*Eu$h6YzhR zx*Q=Sa5Ede$MwjiH|SY;8Xb0?m(FTpBRjvYrcrtb(!Ty3RI>gQtFNEK+98uP=C?5K zGO-7L3ripqi~cS<_Va^cFCG-@zez4@F89(V-CD)(fk@-;qyRYxkHBa8@3Ej+pjQ1J z*1!Vw!S7{N$wHxrD8gR^!58aWtev2PVWhz4`v(|d3)CBb!1*%WvE%W%=y_fEzUSc) z*r(om9-UsO?%Rw>YomI4vveG0#%%}od9)iJG%9j+jGI{};@B}8vUICSdx{(I?ttzjHcZH2EdQ)OUKe^&B_3W z9dYL~ruW{stGhT83nRAH#MI`$$j{5z0dpD;rK+3!Qtoo3yFJ|P%$}>xd|74=08R(( zNbW?GTavp`9U0j|IK3sgmrcOiyIm@Z@T=lHM}`5zd2eFx)_j6De1PwDy5U!I6uSwV3%qdHSt2rIpKi+)E&OdGUgdL6IEYBlq z-D{A+E$iNTO)9x_h9B;pm0=DaQ)&q3>6Ktd_I()pE^bI3C_-c+? z;5rX}+6OAuzw-q>>fZ;WjOuG(*eWssUS-iiWxpYV%gu!_%fAqo3{?4WRe0Rcza<2m z;_s{T-;gea?+etqUlBMU{-&ybLpruIH^i{e;GH9a`=39k7vB(PEbjgYoXNOhmM-iB zs(6_UX90Nsi3AS#Wt;$h(b$9o{?#SD&5El5hfc_+Wd<@7Sz2 zrEd;kg6^)B>Zv#30eeV=cS-_7!rO1@&StKfkv_?#Awxq!p|TRBB=^-6)uNw<`aR6LGMX>`F+fg=6AL zYkGVK#MQB;Ph}@b5b}Rhx)ok(&>hyTs5jn{lAnPzX;Qj3IQFk`hYjilE;;sypItap z4=xW(2Z`|e;n^JohL(G{{@E#FI{t0U6)V-{Z%dy}XeNCp4k5j=3z!bT@dMbW0W|tx zAnfj1G<7u^Rq-YUQ6w42*FP=68x?QB?T(l963}OfP@vMT1jL)F?>jQBbVp{`K^MFT zmp$(4nRnn2cvHRljwDl=@zpo1GrW_u#-aO|GNz25ik<(=)xQu19~3u2<>*P1c_0?< zPk}m^W~=opm5grI@*ZfWk*z7?Gp(%J%6gD+>zdZD^H7=KN*dsoJ!Op%OA(7j6vYva98Dtz8q)b)a- z4Cyp-6vz)fp*c>k*|aDa7@j!5o4SA|x8e^50d#;dNvimT;O30t$HF6tn7%p67j1*d zy!0(nY-O>IgRY5E%iw=~fz%KpeU%mXZU##ytUx6Y`%s(+FSmjk5iO}ytm#{*)+p2w z89NOulM^ig^ap~$wBrB3b_Fj@YZBV1SY7j;bPVIl6pE_*-jfn}SUvTglnux#fZqp+ zrg2E*`Z(B?z#>;yq~9iuf2iVr#hLLB@wl5m7ReS<+_qDoW-zdH6~2a!O>y*tIlcqfn6MM=Pqh=zH=CvQUzBIt^%qjLr_qTEITjMc2O{ysBr=uH>V<6N>D$#lZdUwxweWA!Ck$|Es%?Lhj=XtnVL54r zK@*(vm=;Qip}r9fDqH40GIW)e9f*OYTf+mhq_{7|h$Zm!o0CC7!g?-o|XNPnf)OtoD*+d2} zN;LQjLY@MOFm7~{hX^|A(5gTaMXL~Bqhu3>`oX6NE=*HcHMdaP!_r3g!5d<w(u9 zeRBpJOZ1?7RY7`A^?Bs#_w`Iu|GxA|X*xp%)R39K;j4Gw!=k&up?cCK=pIHmVKTyR zCTAZbyZsz~Ghhc8+3V+|7|6iQT7k%ZKa1ZCTrG2|@rMoZn*p28NR6MvZw723BXxcb zzZtN_jMOs+Pk8A-2CgBKg`5?PFomry&yK8RgelBfl^xl@2veA|K0C6B5vDMw(L_=v zwv{m^F>7;nWIH2FVa~Sf$WBI>!kiu1kzI^1g*kf|Y4RidW^(o+l5%(ZS^Q?;4luIU z&*3)%Hj6C2-_PMU16IqNYW!iV{AR%BGg9N{@S6c!$Vt|%^RxKPz%6E^-p}DT1Ga*Z z20w@24A@#mmisyUX23QuvdYil*9S{sy~EggKa1ZC+*U>!{TzNXVA~nl?C0>C0o%#Q zHa~~o4A_qB9AEK-j!tWy=E=q=Du1#%SgR$ezMyo}^bgHk_1{ulJSAe(qi+$7!|U!p zOp|3RvY#Ggvhc}z{mg41x+92(DXHy~mt0V;v z0rXWqd!_SOy{=RjW1`Ctx@N-=U-S_ULq4z8eI$L(X4YXlW14TCkJD9ZVns=$^h69i zH*2aLYELWopIZN)_fOf0wd06?$wLnSWem_Sh>W#cvqv0gFG( z`xpv5a*TNcx##S~-1errf3KXL51kDf(6_{UN@`F)J8F%|T4CGtId z0Yk++_nzU4GzIC_(dI|s1X%JUr&%E3gD(G7HGT|p)bK>w2#J3pZL54H&_H}N#P1&G zY&~pb1T*@Geg`A)o&g3;Gx*^c0pdCD6S#;?y|9AGt=d0;eIoS9uFUW*md5HYpL`eZ zqEnpxvp6WL%RE7K7jXd{u*+rN#uz*f;?e{!UIM~hHFJ_&6 z?>^1_8}`Y9&NDb$#X;V~{jf?kykBrAUh}E+Kg=EK4WG)<6FzIS+@2^7Q@GazB%i{q{97hQ(>U38D5H)E=LQ ziVyk068%z)TJxElo%*~H>lnV2V7W6H4x;baey%|{Udv1G1K7~ zeyQls`a|p_F7z-=M=duLSqXZwi)ma&>@f*(rT(!WC*uBt`J%Mqyu6TLSRYr zBY%ytG)xp3>dr5ub7ziF`dteSnZElx%>q00)9m2ZKcwFLLOK=hZ`3Rb{~tZ!f_EFD z|G{evNCs~n{U7O+GEHUwY?DT8v7gSbe(fY*>)b;b2*|E7kXTbOp!hq`cC7e%N)QMk$ zXg)2ng-TOJ^FYHFnk2V>DOdWgX87Ufs1^t0T`9&HLSdLq7TmS+pFH5C$`=e=&=;>B-1)j)^+Vv) z#bOVV->CbT#`9w@a6Q(ZfJhS~Obd~UVv+4vL& z?5_9>4%lV*oD;Aw=rdc3N}&aD=b#t6FH#R^1}HUp0PcURb>Sk!``7B90eg(hRfB@| zO#3rY&mAWl>`%mdXI8P zCT!1@f2*xw`}(Dnr8+fi66sKf6uY|bOVZJo~Y9yY&;op)Qq=+c=v@z_;s%PGGbpMdHUXuev?#PmS>;Yg;>Hz#Vg$q!X2o^9f*YTD!29~ zgxBIve7^ceo;?oR&G6i4c8uTy4oWj;3;)3!SYWuvaZc1e11I&Lh}!*H&OzyV>PgH2 zn{-6&kJ=~tI+iw6mX764nF}3zPRt(D9l$uQvYj95MldDIyRWAcP+=3o@rTr(WA?Gp zTSyz;nyRi*#rb%Z{@-eKzTH>;qu$N8+qUJSK2Td)pg?rYd-Q}3&+@5YD z1XbJ09%L@q;l(Z8S{&U%g%Nx@s(T8+QD3R&3hcpYs9kl$=^&_`t-b{{ zYu*u{)~#+~zbLY3-Hbx}9g!L}sg>RRkS5k2zVIOa5L*|FRMzW4)!-%?I$)YT51Jre zhKm*;;b@Q@Odo$-4Jm?%J+7t}*=M(g=z{%uydXD7O?qFGH)8lyh~}$3H?O;{*d8unj0#ke+StxsCU>m6xV?Rk z9j2(iT&uzz>8$U-Z z|7LCGhuuw9m3y;No$QXL;`4CS02QBsPmTIRC;N;6xA>4-37K8W5AVi9@pNK#1CGepFFmKy-bb(etSusov?cVdQQTw!y^mDN&6vC>32!{4t!4U ztci7PXM12PQYfG)qz4v4TdSVyY@Y=%UmFi9voF&`|FBj)SY{uMoOjCX-uUEqv44fn zja}^DK)rVDYInkCwE0}z73z4dn$y)z;PYTtyBj_);nM}|R^>mK&gay3SvOq2jO)VB zZUZW%?tHv_hyw{7y4eFzVnVn7)7iBEH+7xqs~;N>esImp7z|v$kd2M)#O7ri8`%Oo zIM_S{A(V_QtZNY1l96PLdDM^)Fo~&2vHA08LYmMCp$&y5jXG^QZ4#!N>29`3md+-V zw40q|XERN2z`X<2-XIy+74VvbXSD#{GAs+0w+?%jx43 z%=+3YDs_y-c306(N6xU(mH3wubg>n_f$&0pubOhR#-+{0H89iBV znSW?YD%m_3&r-6%|A3-)cu>bzWQ5SIl}cTjrDx{ zO6pF>fdYTeg->#(sU!T$33_c6bOu@Ao+in>oc%_r(<^P-C|!JZw5cjHm7^6j-0_djF5X6D0xtf%i}e+!LM=Kh_C z>kjvoCm>&$q(0Br8fdW#P3kUoUuTF59fK?==GG!D-I{gkNq%!J=IIZ4_B!`mgWXVo2510?+#s=Eaq>fGePaCNq>uy9z zZLX)P%5=!PdCDeg&H6fmsleKUdRKo`-w@${-$VmLzn-ibnZ6Dwb$=OB>ii;P8sz0T zKMN_>^B|;Tb1beu067i(JMs8;Atj#=Af@$8z45rvv_DMtMWcFeUsQ{RG@swE4FvdK zHe;1J!hhRLyB9n>MOE%Wnoj{qn-3HMaURgi7`jRm4Brf?c(jU0$kiFSco1 z2z#fh$}Y$+flM2}jIdO=7)azKdS)-&(klLYFNGX_uH8x<86{B60;ISl{LEIWa+e~g z#-qw0-*c+U2FO2S+-Q*SFo}H25ysMJ#7P!{N}j)sT$9H!^8S#*JwD3gz&4tmaT|12 zQMb#LHS(7MS^(F{xqGQT55MtHcECpR!%0cm7z#u}LHx2K6gJD`quXdbkKRRj86Uy6 z12#Iaz|8A!chQ2O?dhtr6LC^+4Y2bZ8<%=Z<6C+uQwFca>kyU>viJ`WmNv2Yi%Hyp zw!uhsB@74=GPHENCDp_?Aj{Jra5m7|Q^tB8|O@jnKm&6}R;wO{%a1y^Si9Z6Kqg350@W~{D zOW@)NtO{KPmpSR@iXD`F`;AOhL5%Wi$VrfI$K|_m`P;a(>~3Vn4(`A~ny#qaw-b9X zg^%7t$A>mdSCvvA7kEtl|KT*!MS)JB9cTawfT_SAk?#k<>p%>+0Gt920X@^zX-a99 zsuTjbyr_e!9W(eJycDE^Gx&N3Ey<|HrCF0|8ULjNUUfO5tU0|x#{Evd&`GoKG!kVW zQ~{s}@W*){!ZH;s9!}ze;4&@!Gx@Vlsw#>nJCTSsv%MeOiTm@HFnF(}$YPR&+-zRog(KE;e7uWFN}6D4HI)b9wZJ++e8046GtdIuVXjwVE-#d! z80%F#wPdr}hD*h|<>ZI_w12i3Nm{{rpcS~2e{zT_Qay83I8duHnLMUr^`Fa^bXw$u zYC0@Goy%|NG~bz{8vYIRGo4(yak>mr>SixvL&8nY;J+TFv>`u?#771J@mUt1glexy z;)OPz0)2^%zXdKX!%F{l5`Pz5T#lvxS5rTfi1;wc;CD$G{6~`hKa=$Tm8Ab7Nsrrl z6Dp93zFq{Em8if}MA&PXX&BtnxCDi{Di?$ zM2J_l5>$cP3vh$WXtnena9OtPTt>IWo1vH4VDatXvdgh}H~4aUjSeEh-U9c6+bi$@ zxXem_4!^dCx=M0Y#cRv&aj5O}6Q65l$KC)n6vs!J%x&3C+z~wB>k0U^t=@Gj+ra>Dl3tqQd5;Y$f>wk zY5Yo!tAo_)gu2$G!$I0o0_wI|*C(va)Ex=VDIuIS^0~|u-Vjwd^Hsyk?ab$q5Gs(* z-wRO##3#ZEIK7YN7Z<2T-);@=3x)<{kE6>rr=u(6*X{FvGq?AVcPXr;vYxiUVMFXLrW?V>()&iXjk)}`(wTnPw)iM(54|h$t$}O-nudQ)#2d>QC0y1K) zl=k?oi0AWR+LK|A-NtDVs#{Hq9+PN)Y?BvI0wF4dS}%`UEt(m)BQECZ(?rQ0|zpMey||2*Ur z$RE4-jVMM;F{}NQJ-b*nre&iq+O@}QU1fVQ*Y%UD1S;vxG)SrJGpO`M;M>3xz+=F} zzzfB(k$xJO;l_5vs_lG}VQW zQpKf}JohM7m4TLmS}u9lU{u$@k04$=_$_m6leq(DEFL>b1CGjA`qyc6%Fykq;sH{C z>$j=O3BUtfUjZx!mI2j36#$z~WNB@rdKlwa!}+9vH}^GYrikGM z!XzEg{bDCCDKlV%CZ^rXe>sWIkZRa_3ckCBkDQ_|XN_v?pI)fpk4{nJCdot63uI&6 zt4AWf-MUc+t1U3-mDWJe-yRXSJ+X{l=wy#3^IGa0;={wV(oxGV3{#b}*1Xez$06Pv zhEuI$^)zlA)v@<96%5sx9`__tNuQsH^LjMpLK|NVE;~4TDShBlbE}5?5e@_5ZKM_v zAPU%R`oRyx;~)b0)?lQ+uP+pi>i!8$e-OH+{zx>`Yq}h?%^kFLJ~z*U`l3XQ{@S&~V2n<$NtN80-=kt0>2s zRGg`?)*;R9kZt`v#-e2}@m|E+`F-HxJm9P4Cd&lf34Zk~{=(YBFFi!f_jpuAgYmqz z=1xQ$vVu5y)geymX~{lcFwnJ6_iMhW=5m#3{1jxbvITJ_NPY z{{=|t?O#C3?0GAmtP|nKzQX2n#7lOv0kW!o|Ij{#1y9aO+2r z(`hQCJ&SYTW576%j$!-SY+4Rs+{;vcshM9J!^CLe&&Q~#q{Y1OM#y|C|&CD`{1H{5;L) zNATtt;~$=<@~rjdz0XQW$>j63{MmUb%>m5>4MIvQgdwF!s8=%8=7FYxUW8l>`AbNd zx^F>>|AyHZQVn2oVqiW From b31170cc8cbb2d582342a59df0c58aac797a0798 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 25 Apr 2023 10:33:13 +0200 Subject: [PATCH 0222/2372] Test set_debug_handler/unset_debug_handler --- packages/vm/src/instance.rs | 39 +++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index b01ee51ae4..92679422a2 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -405,6 +405,7 @@ where mod tests { use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; + use std::time::SystemTime; use super::*; use crate::backend::Storage; @@ -424,6 +425,44 @@ mod tests { const MIB: usize = 1024 * 1024; const DEFAULT_QUERY_GAS_LIMIT: u64 = 300_000; static CONTRACT: &[u8] = include_bytes!("../testdata/hackatom.wasm"); + static CYBERPUNK: &[u8] = include_bytes!("../testdata/cyberpunk.wasm"); + + #[test] + fn set_debug_handler_and_unset_debug_handler_work() { + const LIMIT: u64 = 70_000_000_000_000; + let mut instance = mock_instance_with_gas_limit(CYBERPUNK, LIMIT); + + // init contract + let info = mock_info("creator", &coins(1000, "earth")); + call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, br#"{}"#) + .unwrap() + .unwrap(); + + let info = mock_info("caller", &[]); + call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, br#"{"debug":{}}"#) + .unwrap() + .unwrap(); + + let start = SystemTime::now(); + instance.set_debug_handler(move |msg, info| { + let gas = info.gas_remaining; + let runtime = SystemTime::now().duration_since(start).unwrap().as_micros(); + eprintln!("{msg} (gas: {gas}, runtime: {runtime}µs)"); + }); + + let info = mock_info("caller", &[]); + call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, br#"{"debug":{}}"#) + .unwrap() + .unwrap(); + + eprintln!("Unsetting debug handler. From here nothing is printed anymore."); + instance.unset_debug_handler(); + + let info = mock_info("caller", &[]); + call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, br#"{"debug":{}}"#) + .unwrap() + .unwrap(); + } #[test] fn required_capabilities_works() { From f5c9843b917935ee7f0db0635c0c18ede9940ce1 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 25 Apr 2023 10:39:53 +0200 Subject: [PATCH 0223/2372] Add CHANGELOG entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 42b8872fb6..eff24ae6e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,8 @@ and this project adheres to `MODULE_SERIALIZATION_VERSION` to "v5". ([#1664]) - cosmwasm-vm: When enabling `print_debug` the debug logs are now printed to STDERR instead of STDOUT by default ([#1667]). +- cosmwasm-vm: Add `Instance::set_debug_handler`/`unset_debug_handler` to allow + customizing the handling of debug messages emitted by the contract ([#1667]). [#1511]: https://github.com/CosmWasm/cosmwasm/issues/1511 [#1629]: https://github.com/CosmWasm/cosmwasm/pull/1629 From 08e5f88f16dc1d5d3e064ee564d3a438c82622bd Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 2 May 2023 09:45:54 +0200 Subject: [PATCH 0224/2372] Deprecate PartialEq between Addr and String --- CHANGELOG.md | 9 +++++++++ packages/std/src/addresses.rs | 22 +++++++++++++++------- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5bc4fb32ce..12ffb6bf2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,15 @@ and this project adheres to ## [Unreleased] +### Deprecated + +- cosmwasm-std: The PartialEq implementations between `Addr` and `&str`/`String` + are deprecated because they are not considered to be safe. In almost all cases + you want to convert both sides of the equation to `Addr` first. If you really + want to do a string comparison, use `Addr::as_str()` explicitly. ([#1671]) + +[#1671]: https://github.com/CosmWasm/cosmwasm/pull/1671 + ## [1.2.4] - 2023-04-17 ### Fixed diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index 39a4719291..046ab52fff 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -86,6 +86,9 @@ impl AsRef for Addr { } /// Implement `Addr == &str` +/// +/// Deprecated. This comparison unsafe. Convert both sides to Addr first. +/// Will be removed soon: https://github.com/CosmWasm/cosmwasm/issues/1669 impl PartialEq<&str> for Addr { fn eq(&self, rhs: &&str) -> bool { self.0 == *rhs @@ -93,6 +96,9 @@ impl PartialEq<&str> for Addr { } /// Implement `&str == Addr` +/// +/// Deprecated. This comparison unsafe. Convert both sides to Addr first. +/// Will be removed soon: https://github.com/CosmWasm/cosmwasm/issues/1669 impl PartialEq for &str { fn eq(&self, rhs: &Addr) -> bool { *self == rhs.0 @@ -100,6 +106,9 @@ impl PartialEq for &str { } /// Implement `Addr == String` +/// +/// Deprecated. This comparison unsafe. Convert both sides to Addr first. +/// Will be removed soon: https://github.com/CosmWasm/cosmwasm/issues/1669 impl PartialEq for Addr { fn eq(&self, rhs: &String) -> bool { &self.0 == rhs @@ -107,6 +116,9 @@ impl PartialEq for Addr { } /// Implement `String == Addr` +/// +/// Deprecated. This comparison unsafe. Convert both sides to Addr first. +/// Will be removed soon: https://github.com/CosmWasm/cosmwasm/issues/1669 impl PartialEq for String { fn eq(&self, rhs: &Addr) -> bool { self == &rhs.0 @@ -426,20 +438,16 @@ mod tests { assert_eq!(addr.as_ref(), "literal-string"); } + // Please note that this will be removed soon + // https://github.com/CosmWasm/cosmwasm/issues/1669 #[test] - fn addr_implements_partial_eq_with_str() { + fn addr_implements_partial_eq_with_str_and_string() { let addr = Addr::unchecked("cos934gh9034hg04g0h134"); // `Addr == &str` assert_eq!(addr, "cos934gh9034hg04g0h134"); // `&str == Addr` assert_eq!("cos934gh9034hg04g0h134", addr); - } - - #[test] - fn addr_implements_partial_eq_with_string() { - let addr = Addr::unchecked("cos934gh9034hg04g0h134"); - // `Addr == String` assert_eq!(addr, String::from("cos934gh9034hg04g0h134")); // `String == Addr` From 51ca1dff90671abddf1389018194e1c93de1aebd Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 2 May 2023 10:18:01 +0200 Subject: [PATCH 0225/2372] Implement PartialEq between Addr and &Addr --- CHANGELOG.md | 7 +++++++ packages/std/src/addresses.rs | 18 +++++++++++++++++- packages/std/src/forward_ref.rs | 25 +++++++++++++++++++++++++ packages/std/src/lib.rs | 1 + 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 packages/std/src/forward_ref.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 12ffb6bf2e..5cf86b48f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,13 @@ and this project adheres to ## [Unreleased] +### Added + +- cosmwasm-std: Implement `PartialEq` for `Addr == &Addr` and + `&Addr == Addr`([#1672]). + +[#1672]: https://github.com/CosmWasm/cosmwasm/pull/1672 + ### Deprecated - cosmwasm-std: The PartialEq implementations between `Addr` and `&str`/`String` diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index 046ab52fff..e8b2ca9b7e 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -9,7 +9,7 @@ use std::fmt; use std::ops::Deref; use thiserror::Error; -use crate::{binary::Binary, HexBinary}; +use crate::{binary::Binary, forward_ref_partial_eq, HexBinary}; /// A human readable address. /// @@ -32,6 +32,8 @@ use crate::{binary::Binary, HexBinary}; )] pub struct Addr(String); +forward_ref_partial_eq!(Addr, Addr); + impl Addr { /// Creates a new `Addr` instance from the given input without checking the validity /// of the input. Since `Addr` must always contain valid addresses, the caller is @@ -454,6 +456,20 @@ mod tests { assert_eq!(String::from("cos934gh9034hg04g0h134"), addr); } + #[test] + fn addr_implements_partial_eq_addr_ref() { + let addr = Addr::unchecked("cos934gh9034hg04g0h134"); + let addr_ref = &addr; + let addr_ref2 = &addr; + + // `Addr == &Addr` + assert_eq!(addr, addr_ref); + // `&Addr == Addr` + assert_eq!(addr_ref, addr); + // `&Addr == &Addr` + assert_eq!(addr_ref, addr_ref2); + } + #[test] fn addr_implements_into_string() { // owned Addr diff --git a/packages/std/src/forward_ref.rs b/packages/std/src/forward_ref.rs new file mode 100644 index 0000000000..16385fbc97 --- /dev/null +++ b/packages/std/src/forward_ref.rs @@ -0,0 +1,25 @@ +/// Given an implementation of `T == U`, implements: +/// - `&T == U` +/// - `T == &U` +/// +/// We don't need to add `&T == &U` here because this is implemented automatically. +#[macro_export] +macro_rules! forward_ref_partial_eq { + ($t:ty, $u:ty) => { + // `&T == U` + impl<'a> PartialEq<$u> for &'a $t { + #[inline] + fn eq(&self, rhs: &$u) -> bool { + **self == *rhs // Implement via T == U + } + } + + // `T == &U` + impl PartialEq<&$u> for $t { + #[inline] + fn eq(&self, rhs: &&$u) -> bool { + *self == **rhs // Implement via T == U + } + } + }; +} diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 34a01301f5..7f26868498 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -10,6 +10,7 @@ mod coin; mod conversion; mod deps; mod errors; +mod forward_ref; mod hex_binary; mod ibc; mod import_helpers; From ff196881731aca6908b3013cecd7500ce6ed24f4 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 24 Apr 2023 16:39:28 +0200 Subject: [PATCH 0226/2372] Use forward_ref_partial_eq in more places --- packages/std/src/math/decimal.rs | 15 +++------------ packages/std/src/math/decimal256.rs | 16 +++------------- packages/std/src/math/uint128.rs | 18 +++++------------- packages/std/src/math/uint256.rs | 16 +++------------- packages/std/src/math/uint512.rs | 16 +++------------- packages/std/src/math/uint64.rs | 16 +++------------- packages/std/src/results/events.rs | 16 ++++------------ 7 files changed, 24 insertions(+), 89 deletions(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 5f1473dfd0..e39edc3e3e 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -11,6 +11,7 @@ use crate::errors::{ CheckedFromRatioError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, OverflowOperation, RoundUpOverflowError, StdError, }; +use crate::forward_ref_partial_eq; use super::Fraction; use super::Isqrt; @@ -22,6 +23,8 @@ use super::{Uint128, Uint256}; #[derive(Copy, Clone, Default, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] pub struct Decimal(#[schemars(with = "String")] Uint128); +forward_ref_partial_eq!(Decimal, Decimal); + #[derive(Error, Debug, PartialEq, Eq)] #[error("Decimal range exceeded")] pub struct DecimalRangeExceeded; @@ -705,18 +708,6 @@ impl<'de> de::Visitor<'de> for DecimalVisitor { } } -impl PartialEq<&Decimal> for Decimal { - fn eq(&self, rhs: &&Decimal) -> bool { - self == *rhs - } -} - -impl PartialEq for &Decimal { - fn eq(&self, rhs: &Decimal) -> bool { - *self == rhs - } -} - #[cfg(test)] mod tests { use super::*; diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 1092776c68..eaea9b39b3 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -11,7 +11,7 @@ use crate::errors::{ CheckedFromRatioError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, OverflowOperation, RoundUpOverflowError, StdError, }; -use crate::{Decimal, Uint512}; +use crate::{forward_ref_partial_eq, Decimal, Uint512}; use super::Fraction; use super::Isqrt; @@ -25,6 +25,8 @@ use super::Uint256; #[derive(Copy, Clone, Default, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] pub struct Decimal256(#[schemars(with = "String")] Uint256); +forward_ref_partial_eq!(Decimal256, Decimal256); + #[derive(Error, Debug, PartialEq, Eq)] #[error("Decimal256 range exceeded")] pub struct Decimal256RangeExceeded; @@ -730,18 +732,6 @@ impl<'de> de::Visitor<'de> for Decimal256Visitor { } } -impl PartialEq<&Decimal256> for Decimal256 { - fn eq(&self, rhs: &&Decimal256) -> bool { - self == *rhs - } -} - -impl PartialEq for &Decimal256 { - fn eq(&self, rhs: &Decimal256) -> bool { - *self == rhs - } -} - #[cfg(test)] mod tests { use super::*; diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 2296f40bff..713c7609a9 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -12,7 +12,9 @@ use crate::errors::{ CheckedMultiplyFractionError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, OverflowOperation, StdError, }; -use crate::{impl_mul_fraction, ConversionOverflowError, Fraction, Uint256, Uint64}; +use crate::{ + forward_ref_partial_eq, impl_mul_fraction, ConversionOverflowError, Fraction, Uint256, Uint64, +}; /// A thin wrapper around u128 that is using strings for JSON encoding/decoding, /// such that the full u128 range can be used for clients that convert JSON numbers to floats, @@ -36,6 +38,8 @@ use crate::{impl_mul_fraction, ConversionOverflowError, Fraction, Uint256, Uint6 #[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] pub struct Uint128(#[schemars(with = "String")] u128); +forward_ref_partial_eq!(Uint128, Uint128); + impl Uint128 { pub const MAX: Self = Self(u128::MAX); pub const MIN: Self = Self(u128::MIN); @@ -527,18 +531,6 @@ where } } -impl PartialEq<&Uint128> for Uint128 { - fn eq(&self, rhs: &&Uint128) -> bool { - self == *rhs - } -} - -impl PartialEq for &Uint128 { - fn eq(&self, rhs: &Uint128) -> bool { - *self == rhs - } -} - #[cfg(test)] mod tests { use crate::errors::CheckedMultiplyFractionError::{ConversionOverflow, DivideByZero}; diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index d613436730..2aa51db8d4 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -12,7 +12,7 @@ use crate::errors::{ CheckedMultiplyFractionError, CheckedMultiplyRatioError, ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, StdError, }; -use crate::{impl_mul_fraction, Fraction, Uint128, Uint512, Uint64}; +use crate::{forward_ref_partial_eq, impl_mul_fraction, Fraction, Uint128, Uint512, Uint64}; /// This module is purely a workaround that lets us ignore lints for all the code /// the `construct_uint!` macro generates. @@ -50,6 +50,8 @@ use uints::U256; #[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] pub struct Uint256(#[schemars(with = "String")] U256); +forward_ref_partial_eq!(Uint256, Uint256); + impl Uint256 { pub const MAX: Uint256 = Uint256(U256::MAX); pub const MIN: Uint256 = Uint256(U256::zero()); @@ -653,18 +655,6 @@ where } } -impl PartialEq<&Uint256> for Uint256 { - fn eq(&self, rhs: &&Uint256) -> bool { - self == *rhs - } -} - -impl PartialEq for &Uint256 { - fn eq(&self, rhs: &Uint256) -> bool { - *self == rhs - } -} - #[cfg(test)] mod tests { use super::*; diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index 99e3b87359..c75c83d5f8 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -10,7 +10,7 @@ use std::str::FromStr; use crate::errors::{ ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, StdError, }; -use crate::{Uint128, Uint256, Uint64}; +use crate::{forward_ref_partial_eq, Uint128, Uint256, Uint64}; /// This module is purely a workaround that lets us ignore lints for all the code /// the `construct_uint!` macro generates. @@ -52,6 +52,8 @@ use uints::U512; #[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] pub struct Uint512(#[schemars(with = "String")] U512); +forward_ref_partial_eq!(Uint512, Uint512); + impl Uint512 { pub const MAX: Uint512 = Uint512(U512::MAX); pub const MIN: Uint512 = Uint512(U512::zero()); @@ -606,18 +608,6 @@ where } } -impl PartialEq<&Uint512> for Uint512 { - fn eq(&self, rhs: &&Uint512) -> bool { - self == *rhs - } -} - -impl PartialEq for &Uint512 { - fn eq(&self, rhs: &Uint512) -> bool { - *self == rhs - } -} - #[cfg(test)] mod tests { use super::*; diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index d6fc5fca95..e7f500ae3c 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -10,7 +10,7 @@ use crate::errors::{ CheckedMultiplyFractionError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, OverflowOperation, StdError, }; -use crate::{impl_mul_fraction, Fraction, Uint128}; +use crate::{forward_ref_partial_eq, impl_mul_fraction, Fraction, Uint128}; /// A thin wrapper around u64 that is using strings for JSON encoding/decoding, /// such that the full u64 range can be used for clients that convert JSON numbers to floats, @@ -31,6 +31,8 @@ use crate::{impl_mul_fraction, Fraction, Uint128}; #[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] pub struct Uint64(#[schemars(with = "String")] u64); +forward_ref_partial_eq!(Uint64, Uint64); + impl Uint64 { pub const MAX: Self = Self(u64::MAX); pub const MIN: Self = Self(u64::MIN); @@ -480,18 +482,6 @@ where } } -impl PartialEq<&Uint64> for Uint64 { - fn eq(&self, rhs: &&Uint64) -> bool { - self == *rhs - } -} - -impl PartialEq for &Uint64 { - fn eq(&self, rhs: &Uint64) -> bool { - *self == rhs - } -} - #[cfg(test)] mod tests { use super::*; diff --git a/packages/std/src/results/events.rs b/packages/std/src/results/events.rs index 5cf0e8d2a2..2ce19030da 100644 --- a/packages/std/src/results/events.rs +++ b/packages/std/src/results/events.rs @@ -1,6 +1,8 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +use crate::forward_ref_partial_eq; + /// A full [*Cosmos SDK* event]. /// /// This version uses string attributes (similar to [*Cosmos SDK* StringEvent]), @@ -61,6 +63,8 @@ pub struct Attribute { pub value: String, } +forward_ref_partial_eq!(Attribute, Attribute); + impl Attribute { /// Creates a new Attribute. `attr` is just an alias for this. pub fn new(key: impl Into, value: impl Into) -> Self { @@ -111,18 +115,6 @@ impl, V: AsRef> PartialEq<&Attribute> for (K, V) { } } -impl PartialEq for &Attribute { - fn eq(&self, rhs: &Attribute) -> bool { - *self == rhs - } -} - -impl PartialEq<&Attribute> for Attribute { - fn eq(&self, rhs: &&Attribute) -> bool { - self == *rhs - } -} - /// Creates a new Attribute. `Attribute::new` is an alias for this. #[inline] pub fn attr(key: impl Into, value: impl Into) -> Attribute { From 20227d0262da3c9f0678d3f524737931cc25377d Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 2 May 2023 10:18:52 +0200 Subject: [PATCH 0227/2372] Implement PartialEq for `Event == &Event` and `&Event == Event` --- CHANGELOG.md | 4 ++-- packages/std/src/results/events.rs | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5cf86b48f7..841e0376ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,8 +8,8 @@ and this project adheres to ### Added -- cosmwasm-std: Implement `PartialEq` for `Addr == &Addr` and - `&Addr == Addr`([#1672]). +- cosmwasm-std: Implement `PartialEq` for `Addr == &Addr` and `&Addr == Addr` as + well as `Event == &Event` and `&Event == Event` ([#1672]). [#1672]: https://github.com/CosmWasm/cosmwasm/pull/1672 diff --git a/packages/std/src/results/events.rs b/packages/std/src/results/events.rs index 2ce19030da..79749b00c9 100644 --- a/packages/std/src/results/events.rs +++ b/packages/std/src/results/events.rs @@ -25,6 +25,8 @@ pub struct Event { pub attributes: Vec, } +forward_ref_partial_eq!(Event, Event); + impl Event { /// Create a new event with the given type and an empty list of attributes. pub fn new(ty: impl Into) -> Self { From e8ea071fe7662b4d7f3cbd97f6f41f292c4cddc0 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 2 May 2023 13:49:45 +0200 Subject: [PATCH 0228/2372] Add #[must_use] to applicable math operations --- packages/std/src/math/decimal.rs | 17 ++++++++++++- packages/std/src/math/decimal256.rs | 17 ++++++++++++- packages/std/src/math/fraction.rs | 5 ++++ packages/std/src/math/isqrt.rs | 1 + packages/std/src/math/uint128.rs | 35 ++++++++++++++++++-------- packages/std/src/math/uint256.rs | 39 +++++++++++++++++++++-------- packages/std/src/math/uint512.rs | 18 ++++++++++++- packages/std/src/math/uint64.rs | 35 ++++++++++++++++++-------- 8 files changed, 134 insertions(+), 33 deletions(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index e39edc3e3e..3c3842128c 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -158,6 +158,7 @@ impl Decimal { } } + #[must_use] pub const fn is_zero(&self) -> bool { self.0.is_zero() } @@ -180,6 +181,7 @@ impl Decimal { /// assert_eq!(b.decimal_places(), 18); /// assert_eq!(b.atomics(), Uint128::new(1)); /// ``` + #[must_use] #[inline] pub const fn atomics(&self) -> Uint128 { self.0 @@ -189,17 +191,20 @@ impl Decimal { /// but this could potentially change as the type evolves. /// /// See also [`Decimal::atomics()`]. + #[must_use] #[inline] pub const fn decimal_places(&self) -> u32 { Self::DECIMAL_PLACES } /// Rounds value down after decimal places. + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn floor(&self) -> Self { Self((self.0 / Self::DECIMAL_FRACTIONAL) * Self::DECIMAL_FRACTIONAL) } /// Rounds value up after decimal places. Panics on overflow. + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn ceil(&self) -> Self { match self.checked_ceil() { Ok(value) => value, @@ -248,6 +253,7 @@ impl Decimal { } /// Raises a value to the power of `exp`, panics if an overflow occurred. + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn pow(self, exp: u32) -> Self { match self.checked_pow(exp) { Ok(value) => value, @@ -302,6 +308,7 @@ impl Decimal { /// Returns the approximate square root as a Decimal. /// /// This should not overflow or panic. + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn sqrt(&self) -> Self { // Algorithm described in https://hackmd.io/@webmaster128/SJThlukj_ // We start with the highest precision possible and lower it until @@ -321,6 +328,7 @@ impl Decimal { /// Precision *must* be a number between 0 and 9 (inclusive). /// /// Returns `None` if the internal multiplication overflows. + #[must_use = "this returns the result of the operation, without modifying the original"] fn sqrt_with_precision(&self, precision: u32) -> Option { let inner_mul = 100u128.pow(precision); self.0.checked_mul(inner_mul.into()).ok().map(|inner| { @@ -329,10 +337,12 @@ impl Decimal { }) } + #[must_use = "this returns the result of the operation, without modifying the original"] pub const fn abs_diff(self, other: Self) -> Self { Self(self.0.abs_diff(other.0)) } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_add(self, other: Self) -> Self { match self.checked_add(other) { Ok(value) => value, @@ -340,6 +350,7 @@ impl Decimal { } } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_sub(self, other: Self) -> Self { match self.checked_sub(other) { Ok(value) => value, @@ -347,6 +358,7 @@ impl Decimal { } } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_mul(self, other: Self) -> Self { match self.checked_mul(other) { Ok(value) => value, @@ -354,6 +366,7 @@ impl Decimal { } } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_pow(self, exp: u32) -> Self { match self.checked_pow(exp) { Ok(value) => value, @@ -379,6 +392,7 @@ impl Decimal { /// let d = Decimal::from_str("75.0").unwrap(); /// assert_eq!(d.to_uint_floor(), Uint128::new(75)); /// ``` + #[must_use] pub fn to_uint_floor(self) -> Uint128 { self.0 / Self::DECIMAL_FRACTIONAL } @@ -401,6 +415,7 @@ impl Decimal { /// let d = Decimal::from_str("75.0").unwrap(); /// assert_eq!(d.to_uint_ceil(), Uint128::new(75)); /// ``` + #[must_use] pub fn to_uint_ceil(self) -> Uint128 { // Using `q = 1 + ((x - 1) / y); // if x != 0` with unsigned integers x, y, q // from https://stackoverflow.com/a/2745086/2013738. We know `x + y` CAN overflow. @@ -1976,7 +1991,7 @@ mod tests { #[test] #[should_panic] fn decimal_pow_overflow_panics() { - Decimal::MAX.pow(2u32); + _ = Decimal::MAX.pow(2u32); } #[test] diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index eaea9b39b3..bd6109718a 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -170,6 +170,7 @@ impl Decimal256 { } } + #[must_use] pub const fn is_zero(&self) -> bool { self.0.is_zero() } @@ -192,6 +193,7 @@ impl Decimal256 { /// assert_eq!(b.decimal_places(), 18); /// assert_eq!(b.atomics(), Uint256::from(1u128)); /// ``` + #[must_use] #[inline] pub const fn atomics(&self) -> Uint256 { self.0 @@ -201,17 +203,20 @@ impl Decimal256 { /// but this could potentially change as the type evolves. /// /// See also [`Decimal256::atomics()`]. + #[must_use] #[inline] pub const fn decimal_places(&self) -> u32 { Self::DECIMAL_PLACES } /// Rounds value down after decimal places. + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn floor(&self) -> Self { Self((self.0 / Self::DECIMAL_FRACTIONAL) * Self::DECIMAL_FRACTIONAL) } /// Rounds value up after decimal places. Panics on overflow. + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn ceil(&self) -> Self { match self.checked_ceil() { Ok(value) => value, @@ -260,6 +265,7 @@ impl Decimal256 { } /// Raises a value to the power of `exp`, panics if an overflow occurred. + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn pow(self, exp: u32) -> Self { match self.checked_pow(exp) { Ok(value) => value, @@ -314,6 +320,7 @@ impl Decimal256 { /// Returns the approximate square root as a Decimal256. /// /// This should not overflow or panic. + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn sqrt(&self) -> Self { // Algorithm described in https://hackmd.io/@webmaster128/SJThlukj_ // We start with the highest precision possible and lower it until @@ -333,6 +340,7 @@ impl Decimal256 { /// Precision *must* be a number between 0 and 9 (inclusive). /// /// Returns `None` if the internal multiplication overflows. + #[must_use = "this returns the result of the operation, without modifying the original"] fn sqrt_with_precision(&self, precision: u32) -> Option { let inner_mul = Uint256::from(100u128).pow(precision); self.0.checked_mul(inner_mul).ok().map(|inner| { @@ -341,6 +349,7 @@ impl Decimal256 { }) } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn abs_diff(self, other: Self) -> Self { if self < other { other - self @@ -349,6 +358,7 @@ impl Decimal256 { } } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_add(self, other: Self) -> Self { match self.checked_add(other) { Ok(value) => value, @@ -356,6 +366,7 @@ impl Decimal256 { } } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_sub(self, other: Self) -> Self { match self.checked_sub(other) { Ok(value) => value, @@ -363,6 +374,7 @@ impl Decimal256 { } } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_mul(self, other: Self) -> Self { match self.checked_mul(other) { Ok(value) => value, @@ -370,6 +382,7 @@ impl Decimal256 { } } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_pow(self, exp: u32) -> Self { match self.checked_pow(exp) { Ok(value) => value, @@ -395,6 +408,7 @@ impl Decimal256 { /// let d = Decimal256::from_str("75.0").unwrap(); /// assert_eq!(d.to_uint_floor(), Uint256::from(75u64)); /// ``` + #[must_use] pub fn to_uint_floor(self) -> Uint256 { self.0 / Self::DECIMAL_FRACTIONAL } @@ -417,6 +431,7 @@ impl Decimal256 { /// let d = Decimal256::from_str("75.0").unwrap(); /// assert_eq!(d.to_uint_ceil(), Uint256::from(75u64)); /// ``` + #[must_use] pub fn to_uint_ceil(self) -> Uint256 { // Using `q = 1 + ((x - 1) / y); // if x != 0` with unsigned integers x, y, q // from https://stackoverflow.com/a/2745086/2013738. We know `x + y` CAN overflow. @@ -2125,7 +2140,7 @@ mod tests { #[test] #[should_panic] fn decimal256_pow_overflow_panics() { - Decimal256::MAX.pow(2u32); + _ = Decimal256::MAX.pow(2u32); } #[test] diff --git a/packages/std/src/math/fraction.rs b/packages/std/src/math/fraction.rs index 0056f4a0a0..c13c746182 100644 --- a/packages/std/src/math/fraction.rs +++ b/packages/std/src/math/fraction.rs @@ -10,6 +10,7 @@ pub trait Fraction: Sized { /// Returns the multiplicative inverse `q/p` for fraction `p/q`. /// /// If `p` is zero, None is returned. + #[must_use = "this returns the result of the operation, without modifying the original"] fn inv(&self) -> Option; } @@ -58,6 +59,7 @@ macro_rules! impl_mul_fraction { } /// Same operation as `checked_mul_floor` except unwrapped + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn mul_floor, T: Into<$Uint>>(self, rhs: F) -> Self { self.checked_mul_floor(rhs).unwrap() } @@ -89,6 +91,7 @@ macro_rules! impl_mul_fraction { } /// Same operation as `checked_mul_ceil` except unwrapped + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn mul_ceil, T: Into<$Uint>>(self, rhs: F) -> Self { self.checked_mul_ceil(rhs).unwrap() } @@ -119,6 +122,7 @@ macro_rules! impl_mul_fraction { } /// Same operation as `checked_div_floor` except unwrapped + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn div_floor, T: Into<$Uint>>(self, rhs: F) -> Self where Self: Sized, @@ -156,6 +160,7 @@ macro_rules! impl_mul_fraction { } /// Same operation as `checked_div_ceil` except unwrapped + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn div_ceil, T: Into<$Uint>>(self, rhs: F) -> Self where Self: Sized, diff --git a/packages/std/src/math/isqrt.rs b/packages/std/src/math/isqrt.rs index 6bf4b01f64..6e44ce1695 100644 --- a/packages/std/src/math/isqrt.rs +++ b/packages/std/src/math/isqrt.rs @@ -6,6 +6,7 @@ use crate::{Uint128, Uint256, Uint512, Uint64}; /// [integer square root](https://en.wikipedia.org/wiki/Integer_square_root). pub trait Isqrt { /// The [integer square root](https://en.wikipedia.org/wiki/Integer_square_root). + #[must_use = "this returns the result of the operation, without modifying the original"] fn isqrt(self) -> Self; } diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 713c7609a9..319ea92525 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -69,19 +69,23 @@ impl Uint128 { } /// Returns a copy of the number as big endian bytes. + #[must_use = "this returns the result of the operation, without modifying the original"] pub const fn to_be_bytes(self) -> [u8; 16] { self.0.to_be_bytes() } /// Returns a copy of the number as little endian bytes. + #[must_use = "this returns the result of the operation, without modifying the original"] pub const fn to_le_bytes(self) -> [u8; 16] { self.0.to_le_bytes() } + #[must_use] pub const fn is_zero(&self) -> bool { self.0 == 0 } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn pow(self, exp: u32) -> Self { self.0.pow(exp).into() } @@ -90,6 +94,7 @@ impl Uint128 { /// /// Due to the nature of the integer division involved, the result is always floored. /// E.g. 5 * 99/100 = 4. + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn multiply_ratio, B: Into>( &self, numerator: A, @@ -136,6 +141,7 @@ impl Uint128 { /// let result = a.full_mul(2u32); /// assert_eq!(result.to_string(), "680564733841876926926749214863536422910"); /// ``` + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn full_mul(self, rhs: impl Into) -> Uint256 { Uint256::from(self.u128()) .checked_mul(Uint256::from(rhs.into())) @@ -191,42 +197,51 @@ impl Uint128 { .ok_or_else(|| DivideByZeroError::new(self)) } + #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_add(self, other: Self) -> Self { Self(self.0.wrapping_add(other.0)) } + #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_sub(self, other: Self) -> Self { Self(self.0.wrapping_sub(other.0)) } + #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_mul(self, other: Self) -> Self { Self(self.0.wrapping_mul(other.0)) } + #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_pow(self, other: u32) -> Self { Self(self.0.wrapping_pow(other)) } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_add(self, other: Self) -> Self { Self(self.0.saturating_add(other.0)) } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_sub(self, other: Self) -> Self { Self(self.0.saturating_sub(other.0)) } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_mul(self, other: Self) -> Self { Self(self.0.saturating_mul(other.0)) } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_pow(self, exp: u32) -> Self { Self(self.0.saturating_pow(exp)) } + #[must_use = "this returns the result of the operation, without modifying the original"] pub const fn abs_diff(self, other: Self) -> Self { Self(if self.0 < other.0 { other.0 - self.0 @@ -813,7 +828,7 @@ mod tests { #[test] #[should_panic] fn uint128_pow_overflow_panics() { - Uint128::MAX.pow(2u32); + _ = Uint128::MAX.pow(2u32); } #[test] @@ -859,7 +874,7 @@ mod tests { #[test] #[should_panic(expected = "Denominator must not be zero")] fn uint128_multiply_ratio_panics_for_zero_denominator() { - Uint128(500).multiply_ratio(1u128, 0u128); + _ = Uint128(500).multiply_ratio(1u128, 0u128); } #[test] @@ -1087,7 +1102,7 @@ mod tests { #[should_panic(expected = "ConversionOverflowError")] fn mul_floor_panics_on_overflow() { let fraction = (21u128, 8u128); - Uint128::MAX.mul_floor(fraction); + _ = Uint128::MAX.mul_floor(fraction); } #[test] @@ -1107,7 +1122,7 @@ mod tests { #[should_panic(expected = "DivideByZeroError")] fn mul_floor_panics_on_zero_div() { let fraction = (21u128, 0u128); - Uint128::new(123456).mul_floor(fraction); + _ = Uint128::new(123456).mul_floor(fraction); } #[test] @@ -1170,7 +1185,7 @@ mod tests { #[should_panic(expected = "ConversionOverflowError")] fn mul_ceil_panics_on_overflow() { let fraction = (21u128, 8u128); - Uint128::MAX.mul_ceil(fraction); + _ = Uint128::MAX.mul_ceil(fraction); } #[test] @@ -1190,7 +1205,7 @@ mod tests { #[should_panic(expected = "DivideByZeroError")] fn mul_ceil_panics_on_zero_div() { let fraction = (21u128, 0u128); - Uint128::new(123456).mul_ceil(fraction); + _ = Uint128::new(123456).mul_ceil(fraction); } #[test] @@ -1208,7 +1223,7 @@ mod tests { #[should_panic(expected = "DivideByZeroError")] fn div_floor_raises_with_zero() { let fraction = (Uint128::zero(), Uint128::new(21)); - Uint128::new(123456).div_floor(fraction); + _ = Uint128::new(123456).div_floor(fraction); } #[test] @@ -1259,7 +1274,7 @@ mod tests { #[should_panic(expected = "ConversionOverflowError")] fn div_floor_panics_on_overflow() { let fraction = (8u128, 21u128); - Uint128::MAX.div_floor(fraction); + _ = Uint128::MAX.div_floor(fraction); } #[test] @@ -1279,7 +1294,7 @@ mod tests { #[should_panic(expected = "DivideByZeroError")] fn div_ceil_raises_with_zero() { let fraction = (Uint128::zero(), Uint128::new(21)); - Uint128::new(123456).div_ceil(fraction); + _ = Uint128::new(123456).div_ceil(fraction); } #[test] @@ -1330,7 +1345,7 @@ mod tests { #[should_panic(expected = "ConversionOverflowError")] fn div_ceil_panics_on_overflow() { let fraction = (8u128, 21u128); - Uint128::MAX.div_ceil(fraction); + _ = Uint128::MAX.div_ceil(fraction); } #[test] diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 2aa51db8d4..201342e387 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -79,6 +79,7 @@ impl Uint256 { ]) } + #[must_use] pub const fn from_be_bytes(data: [u8; 32]) -> Self { let words: [u64; 4] = [ u64::from_le_bytes([ @@ -97,6 +98,7 @@ impl Uint256 { Self(U256(words)) } + #[must_use] pub const fn from_le_bytes(data: [u8; 32]) -> Self { let words: [u64; 4] = [ u64::from_le_bytes([ @@ -117,6 +119,7 @@ impl Uint256 { /// A conversion from `u128` that, unlike the one provided by the `From` trait, /// can be used in a `const` context. + #[must_use] pub const fn from_u128(num: u128) -> Self { let bytes = num.to_le_bytes(); @@ -129,11 +132,13 @@ impl Uint256 { /// A conversion from `Uint128` that, unlike the one provided by the `From` trait, /// can be used in a `const` context. + #[must_use] pub const fn from_uint128(num: Uint128) -> Self { Self::from_u128(num.u128()) } /// Returns a copy of the number as big endian bytes. + #[must_use = "this returns the result of the operation, without modifying the original"] pub const fn to_be_bytes(self) -> [u8; 32] { let words = [ (self.0).0[3].to_be_bytes(), @@ -145,6 +150,7 @@ impl Uint256 { } /// Returns a copy of the number as little endian bytes. + #[must_use = "this returns the result of the operation, without modifying the original"] pub const fn to_le_bytes(self) -> [u8; 32] { let words = [ (self.0).0[0].to_le_bytes(), @@ -155,11 +161,13 @@ impl Uint256 { unsafe { std::mem::transmute::<[[u8; 8]; 4], [u8; 32]>(words) } } + #[must_use] pub const fn is_zero(&self) -> bool { let words = (self.0).0; words[0] == 0 && words[1] == 0 && words[2] == 0 && words[3] == 0 } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn pow(self, exp: u32) -> Self { let res = self.0.pow(exp.into()); Self(res) @@ -169,6 +177,7 @@ impl Uint256 { /// /// Due to the nature of the integer division involved, the result is always floored. /// E.g. 5 * 99/100 = 4. + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn multiply_ratio, B: Into>( &self, numerator: A, @@ -218,6 +227,7 @@ impl Uint256 { /// "231584178474632390847141970017375815706539969331281128078915168015826259279870", /// ); /// ``` + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn full_mul(self, rhs: impl Into) -> Uint512 { Uint512::from(self) .checked_mul(Uint512::from(rhs.into())) @@ -286,42 +296,50 @@ impl Uint256 { Ok(Self(self.0.shl(other))) } + #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_add(self, other: Self) -> Self { let (value, _did_overflow) = self.0.overflowing_add(other.0); Self(value) } + #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_sub(self, other: Self) -> Self { let (value, _did_overflow) = self.0.overflowing_sub(other.0); Self(value) } + #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_mul(self, other: Self) -> Self { let (value, _did_overflow) = self.0.overflowing_mul(other.0); Self(value) } + #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_pow(self, other: u32) -> Self { let (value, _did_overflow) = self.0.overflowing_pow(other.into()); Self(value) } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_add(self, other: Self) -> Self { Self(self.0.saturating_add(other.0)) } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_sub(self, other: Self) -> Self { Self(self.0.saturating_sub(other.0)) } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_mul(self, other: Self) -> Self { Self(self.0.saturating_mul(other.0)) } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_pow(self, exp: u32) -> Self { match self.checked_pow(exp) { Ok(value) => value, @@ -329,6 +347,7 @@ impl Uint256 { } } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn abs_diff(self, other: Self) -> Self { if self < other { other - self @@ -1389,7 +1408,7 @@ mod tests { #[test] #[should_panic] fn uint256_pow_overflow_panics() { - Uint256::MAX.pow(2u32); + _ = Uint256::MAX.pow(2u32); } #[test] @@ -1441,7 +1460,7 @@ mod tests { #[test] #[should_panic(expected = "Denominator must not be zero")] fn uint256_multiply_ratio_panics_for_zero_denominator() { - Uint256::from(500u32).multiply_ratio(1u128, 0u128); + _ = Uint256::from(500u32).multiply_ratio(1u128, 0u128); } #[test] @@ -1717,7 +1736,7 @@ mod tests { #[should_panic(expected = "ConversionOverflowError")] fn mul_floor_panics_on_overflow() { let fraction = (21u128, 8u128); - Uint256::MAX.mul_floor(fraction); + _ = Uint256::MAX.mul_floor(fraction); } #[test] @@ -1739,7 +1758,7 @@ mod tests { #[should_panic(expected = "DivideByZeroError")] fn mul_floor_panics_on_zero_div() { let fraction = (21u128, 0u128); - Uint256::from(123456u32).mul_floor(fraction); + _ = Uint256::from(123456u32).mul_floor(fraction); } #[test] @@ -1812,7 +1831,7 @@ mod tests { #[should_panic(expected = "ConversionOverflowError")] fn mul_ceil_panics_on_overflow() { let fraction = (21u128, 8u128); - Uint256::MAX.mul_ceil(fraction); + _ = Uint256::MAX.mul_ceil(fraction); } #[test] @@ -1834,7 +1853,7 @@ mod tests { #[should_panic(expected = "DivideByZeroError")] fn mul_ceil_panics_on_zero_div() { let fraction = (21u128, 0u128); - Uint256::from(123456u32).mul_ceil(fraction); + _ = Uint256::from(123456u32).mul_ceil(fraction); } #[test] @@ -1852,7 +1871,7 @@ mod tests { #[should_panic(expected = "DivideByZeroError")] fn div_floor_raises_with_zero() { let fraction = (Uint256::zero(), Uint256::from(21u32)); - Uint256::from(123456u128).div_floor(fraction); + _ = Uint256::from(123456u128).div_floor(fraction); } #[test] @@ -1906,7 +1925,7 @@ mod tests { #[should_panic(expected = "ConversionOverflowError")] fn div_floor_panics_on_overflow() { let fraction = (8u128, 21u128); - Uint256::MAX.div_floor(fraction); + _ = Uint256::MAX.div_floor(fraction); } #[test] @@ -1928,7 +1947,7 @@ mod tests { #[should_panic(expected = "DivideByZeroError")] fn div_ceil_raises_with_zero() { let fraction = (Uint256::zero(), Uint256::from(21u128)); - Uint256::from(123456u128).div_ceil(fraction); + _ = Uint256::from(123456u128).div_ceil(fraction); } #[test] @@ -1982,7 +2001,7 @@ mod tests { #[should_panic(expected = "ConversionOverflowError")] fn div_ceil_panics_on_overflow() { let fraction = (8u128, 21u128); - Uint256::MAX.div_ceil(fraction); + _ = Uint256::MAX.div_ceil(fraction); } #[test] diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index c75c83d5f8..73a0512f26 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -80,6 +80,7 @@ impl Uint512 { ]) } + #[must_use] pub const fn from_be_bytes(data: [u8; 64]) -> Self { let words: [u64; 8] = [ u64::from_le_bytes([ @@ -110,6 +111,7 @@ impl Uint512 { Self(U512(words)) } + #[must_use] pub const fn from_le_bytes(data: [u8; 64]) -> Self { let words: [u64; 8] = [ u64::from_le_bytes([ @@ -142,6 +144,7 @@ impl Uint512 { /// A conversion from `Uint256` that, unlike the one provided by the `From` trait, /// can be used in a `const` context. + #[must_use] pub const fn from_uint256(num: Uint256) -> Self { let bytes = num.to_le_bytes(); Self::from_le_bytes([ @@ -155,6 +158,7 @@ impl Uint512 { } /// Returns a copy of the number as big endian bytes. + #[must_use = "this returns the result of the operation, without modifying the original"] pub const fn to_be_bytes(self) -> [u8; 64] { let words = [ (self.0).0[7].to_be_bytes(), @@ -170,6 +174,7 @@ impl Uint512 { } /// Returns a copy of the number as little endian bytes. + #[must_use = "this returns the result of the operation, without modifying the original"] pub const fn to_le_bytes(self) -> [u8; 64] { let words = [ (self.0).0[0].to_le_bytes(), @@ -184,6 +189,7 @@ impl Uint512 { unsafe { std::mem::transmute::<[[u8; 8]; 8], [u8; 64]>(words) } } + #[must_use] pub const fn is_zero(&self) -> bool { let words = (self.0).0; words[0] == 0 @@ -196,6 +202,7 @@ impl Uint512 { && words[7] == 0 } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn pow(self, exp: u32) -> Self { let res = self.0.pow(exp.into()); Self(res) @@ -255,42 +262,50 @@ impl Uint512 { Ok(Self(self.0.shr(other))) } + #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_add(self, other: Self) -> Self { let (value, _did_overflow) = self.0.overflowing_add(other.0); Self(value) } + #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_sub(self, other: Self) -> Self { let (value, _did_overflow) = self.0.overflowing_sub(other.0); Self(value) } + #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_mul(self, other: Self) -> Self { let (value, _did_overflow) = self.0.overflowing_mul(other.0); Self(value) } + #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_pow(self, other: u32) -> Self { let (value, _did_overflow) = self.0.overflowing_pow(other.into()); Self(value) } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_add(self, other: Self) -> Self { Self(self.0.saturating_add(other.0)) } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_sub(self, other: Self) -> Self { Self(self.0.saturating_sub(other.0)) } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_mul(self, other: Self) -> Self { Self(self.0.saturating_mul(other.0)) } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_pow(self, exp: u32) -> Self { match self.checked_pow(exp) { Ok(value) => value, @@ -298,6 +313,7 @@ impl Uint512 { } } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn abs_diff(self, other: Self) -> Self { if self < other { other - self @@ -1075,7 +1091,7 @@ mod tests { #[test] #[should_panic] fn uint512_pow_overflow_panics() { - Uint512::MAX.pow(2u32); + _ = Uint512::MAX.pow(2u32); } #[test] diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index e7f500ae3c..e7a50339c0 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -62,19 +62,23 @@ impl Uint64 { } /// Returns a copy of the number as big endian bytes. + #[must_use = "this returns the result of the operation, without modifying the original"] pub const fn to_be_bytes(self) -> [u8; 8] { self.0.to_be_bytes() } /// Returns a copy of the number as little endian bytes. + #[must_use = "this returns the result of the operation, without modifying the original"] pub const fn to_le_bytes(self) -> [u8; 8] { self.0.to_le_bytes() } + #[must_use] pub const fn is_zero(&self) -> bool { self.0 == 0 } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn pow(self, exp: u32) -> Self { self.0.pow(exp).into() } @@ -83,6 +87,7 @@ impl Uint64 { /// /// Due to the nature of the integer division involved, the result is always floored. /// E.g. 5 * 99/100 = 4. + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn multiply_ratio, B: Into>( &self, numerator: A, @@ -129,6 +134,7 @@ impl Uint64 { /// let result = a.full_mul(2u32); /// assert_eq!(result.to_string(), "36893488147419103230"); /// ``` + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn full_mul(self, rhs: impl Into) -> Uint128 { Uint128::from(self.u64()) .checked_mul(Uint128::from(rhs.into())) @@ -184,42 +190,51 @@ impl Uint64 { .ok_or_else(|| DivideByZeroError::new(self)) } + #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_add(self, other: Self) -> Self { Self(self.0.wrapping_add(other.0)) } + #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_sub(self, other: Self) -> Self { Self(self.0.wrapping_sub(other.0)) } + #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_mul(self, other: Self) -> Self { Self(self.0.wrapping_mul(other.0)) } + #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_pow(self, other: u32) -> Self { Self(self.0.wrapping_pow(other)) } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_add(self, other: Self) -> Self { Self(self.0.saturating_add(other.0)) } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_sub(self, other: Self) -> Self { Self(self.0.saturating_sub(other.0)) } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_mul(self, other: Self) -> Self { Self(self.0.saturating_mul(other.0)) } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_pow(self, exp: u32) -> Self { Self(self.0.saturating_pow(exp)) } + #[must_use = "this returns the result of the operation, without modifying the original"] pub const fn abs_diff(self, other: Self) -> Self { Self(if self.0 < other.0 { other.0 - self.0 @@ -716,7 +731,7 @@ mod tests { #[test] #[should_panic] fn uint64_pow_overflow_panics() { - Uint64::MAX.pow(2u32); + _ = Uint64::MAX.pow(2u32); } #[test] @@ -770,7 +785,7 @@ mod tests { #[test] #[should_panic(expected = "Denominator must not be zero")] fn uint64_multiply_ratio_panics_for_zero_denominator() { - Uint64(500).multiply_ratio(1u64, 0u64); + _ = Uint64(500).multiply_ratio(1u64, 0u64); } #[test] @@ -989,7 +1004,7 @@ mod tests { #[should_panic(expected = "ConversionOverflowError")] fn mul_floor_panics_on_overflow() { let fraction = (21u64, 8u64); - Uint64::MAX.mul_floor(fraction); + _ = Uint64::MAX.mul_floor(fraction); } #[test] @@ -1009,7 +1024,7 @@ mod tests { #[should_panic(expected = "DivideByZeroError")] fn mul_floor_panics_on_zero_div() { let fraction = (21u64, 0u64); - Uint64::new(123456).mul_floor(fraction); + _ = Uint64::new(123456).mul_floor(fraction); } #[test] @@ -1062,7 +1077,7 @@ mod tests { #[should_panic(expected = "ConversionOverflowError")] fn mul_ceil_panics_on_overflow() { let fraction = (21u64, 8u64); - Uint64::MAX.mul_ceil(fraction); + _ = Uint64::MAX.mul_ceil(fraction); } #[test] @@ -1082,7 +1097,7 @@ mod tests { #[should_panic(expected = "DivideByZeroError")] fn mul_ceil_panics_on_zero_div() { let fraction = (21u64, 0u64); - Uint64::new(123456).mul_ceil(fraction); + _ = Uint64::new(123456).mul_ceil(fraction); } #[test] @@ -1100,7 +1115,7 @@ mod tests { #[should_panic(expected = "DivideByZeroError")] fn div_floor_raises_with_zero() { let fraction = (Uint64::zero(), Uint64::new(21)); - Uint64::new(123456).div_floor(fraction); + _ = Uint64::new(123456).div_floor(fraction); } #[test] @@ -1135,7 +1150,7 @@ mod tests { #[should_panic(expected = "ConversionOverflowError")] fn div_floor_panics_on_overflow() { let fraction = (8u64, 21u64); - Uint64::MAX.div_floor(fraction); + _ = Uint64::MAX.div_floor(fraction); } #[test] @@ -1155,7 +1170,7 @@ mod tests { #[should_panic(expected = "DivideByZeroError")] fn div_ceil_raises_with_zero() { let fraction = (Uint64::zero(), Uint64::new(21)); - Uint64::new(123456).div_ceil(fraction); + _ = Uint64::new(123456).div_ceil(fraction); } #[test] @@ -1190,7 +1205,7 @@ mod tests { #[should_panic(expected = "ConversionOverflowError")] fn div_ceil_panics_on_overflow() { let fraction = (8u64, 21u64); - Uint64::MAX.div_ceil(fraction); + _ = Uint64::MAX.div_ceil(fraction); } #[test] From fbba7f6068a381c3e159f6653bef311606c33caf Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 2 May 2023 15:24:53 +0200 Subject: [PATCH 0229/2372] Add note about must_use to changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 841e0376ef..02e633ea32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,8 +10,11 @@ and this project adheres to - cosmwasm-std: Implement `PartialEq` for `Addr == &Addr` and `&Addr == Addr` as well as `Event == &Event` and `&Event == Event` ([#1672]). +- cosmwasm-std: Add `#[must_use]` annotations to `Uint64`, `Uint128`, `Uint256`, + `Uint512`, `Decimal` and `Decimal256` math operations ([#1678]) [#1672]: https://github.com/CosmWasm/cosmwasm/pull/1672 +[#1678]: https://github.com/CosmWasm/cosmwasm/pull/1678 ### Deprecated From 54e3a80b402362fed14c0dbc648ce11c40074919 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 2 May 2023 16:42:30 +0200 Subject: [PATCH 0230/2372] Set version: 1.2.5 --- CHANGELOG.md | 2 ++ Cargo.lock | 16 ++++++++-------- contracts/burner/Cargo.lock | 12 ++++++------ contracts/crypto-verify/Cargo.lock | 14 +++++++------- contracts/cyberpunk/Cargo.lock | 14 +++++++------- contracts/floaty/Cargo.lock | 14 +++++++------- contracts/hackatom/Cargo.lock | 14 +++++++------- contracts/ibc-reflect-send/Cargo.lock | 14 +++++++------- contracts/ibc-reflect/Cargo.lock | 14 +++++++------- contracts/queue/Cargo.lock | 12 ++++++------ contracts/reflect/Cargo.lock | 14 +++++++------- contracts/staking/Cargo.lock | 14 +++++++------- contracts/virus/Cargo.lock | 12 ++++++------ packages/check/Cargo.toml | 6 +++--- packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema-derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 6 +++--- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 21 files changed, 101 insertions(+), 99 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 02e633ea32..ad756789db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ and this project adheres to ## [Unreleased] +## [1.2.5] - 2023-05-02 + ### Added - cosmwasm-std: Implement `PartialEq` for `Addr == &Addr` and `&Addr == Addr` as diff --git a/Cargo.lock b/Cargo.lock index 3eacb1a185..6c606750c3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -285,7 +285,7 @@ dependencies = [ [[package]] name = "cosmwasm-check" -version = "1.2.4" +version = "1.2.5" dependencies = [ "anyhow", "clap 2.34.0", @@ -296,7 +296,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.4" +version = "1.2.5" dependencies = [ "base64", "criterion", @@ -315,7 +315,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.4" +version = "1.2.5" dependencies = [ "cosmwasm-std", "syn", @@ -323,7 +323,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "1.2.4" +version = "1.2.5" dependencies = [ "anyhow", "cosmwasm-schema-derive", @@ -338,7 +338,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.4" +version = "1.2.5" dependencies = [ "proc-macro2", "quote", @@ -347,7 +347,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.4" +version = "1.2.5" dependencies = [ "base64", "chrono", @@ -369,7 +369,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.4" +version = "1.2.5" dependencies = [ "cosmwasm-std", "serde", @@ -377,7 +377,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.4" +version = "1.2.5" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 5d93e7a370..e917f2e4e8 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -174,7 +174,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.4" +version = "1.2.5" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -185,14 +185,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.4" +version = "1.2.5" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.4" +version = "1.2.5" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -203,7 +203,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.4" +version = "1.2.5" dependencies = [ "proc-macro2", "quote", @@ -212,7 +212,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.4" +version = "1.2.5" dependencies = [ "base64", "cosmwasm-crypto", @@ -230,7 +230,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.4" +version = "1.2.5" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index e30f40df49..7cc1a4fdcb 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.4" +version = "1.2.5" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.4" +version = "1.2.5" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.4" +version = "1.2.5" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.4" +version = "1.2.5" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.4" +version = "1.2.5" dependencies = [ "base64", "cosmwasm-crypto", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.4" +version = "1.2.5" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.4" +version = "1.2.5" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index f220e6b9d9..1e9ed90732 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.4" +version = "1.2.5" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -203,14 +203,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.4" +version = "1.2.5" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.4" +version = "1.2.5" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -221,7 +221,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.4" +version = "1.2.5" dependencies = [ "proc-macro2", "quote", @@ -230,7 +230,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.4" +version = "1.2.5" dependencies = [ "base64", "cosmwasm-crypto", @@ -248,7 +248,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.4" +version = "1.2.5" dependencies = [ "cosmwasm-std", "serde", @@ -256,7 +256,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.4" +version = "1.2.5" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 7ab3d6df08..e1e9d89c35 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.4" +version = "1.2.5" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.4" +version = "1.2.5" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.4" +version = "1.2.5" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.4" +version = "1.2.5" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.4" +version = "1.2.5" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.4" +version = "1.2.5" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.4" +version = "1.2.5" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 7397d116cc..e8707552a1 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.4" +version = "1.2.5" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.4" +version = "1.2.5" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.4" +version = "1.2.5" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.4" +version = "1.2.5" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.4" +version = "1.2.5" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.4" +version = "1.2.5" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.4" +version = "1.2.5" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 5bdb650b8a..9e708b2477 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.4" +version = "1.2.5" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.4" +version = "1.2.5" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.4" +version = "1.2.5" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.4" +version = "1.2.5" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.4" +version = "1.2.5" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.4" +version = "1.2.5" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.4" +version = "1.2.5" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index eb882f8e61..50ebaa8cb5 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.4" +version = "1.2.5" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.4" +version = "1.2.5" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.4" +version = "1.2.5" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.4" +version = "1.2.5" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.4" +version = "1.2.5" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.4" +version = "1.2.5" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.4" +version = "1.2.5" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index bdb29f47b7..03e20b46bb 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.4" +version = "1.2.5" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.4" +version = "1.2.5" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.4" +version = "1.2.5" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.4" +version = "1.2.5" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.4" +version = "1.2.5" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.4" +version = "1.2.5" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index a7575cf815..905fe4f613 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.4" +version = "1.2.5" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.4" +version = "1.2.5" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.4" +version = "1.2.5" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.4" +version = "1.2.5" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.4" +version = "1.2.5" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.4" +version = "1.2.5" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.4" +version = "1.2.5" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index b9c3db5597..b444477167 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.4" +version = "1.2.5" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.4" +version = "1.2.5" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.4" +version = "1.2.5" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.4" +version = "1.2.5" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.4" +version = "1.2.5" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.4" +version = "1.2.5" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.4" +version = "1.2.5" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 0bb9672903..a63e69743b 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.4" +version = "1.2.5" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.4" +version = "1.2.5" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.4" +version = "1.2.5" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.4" +version = "1.2.5" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.4" +version = "1.2.5" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.4" +version = "1.2.5" dependencies = [ "bitflags", "bytecheck", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index 825ed222e5..c046e1b39b 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-check" -version = "1.2.4" +version = "1.2.5" authors = ["Mauro Lacy "] edition = "2021" description = "A CLI tool for verifying CosmWasm smart contracts" @@ -11,5 +11,5 @@ license = "Apache-2.0" anyhow = "1.0.57" clap = "2" colored = "2" -cosmwasm-vm = { path = "../vm", version = "1.2.4" } -cosmwasm-std = { path = "../std", version = "1.2.4" } +cosmwasm-vm = { path = "../vm", version = "1.2.5" } +cosmwasm-std = { path = "../std", version = "1.2.5" } diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 594696fe1b..7d79ed54ff 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "1.2.4" +version = "1.2.5" authors = ["Mauro Lacy "] edition = "2021" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index 4993cb1acf..b0909ec357 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "1.2.4" +version = "1.2.5" authors = ["Simon Warta "] edition = "2021" description = "A package for auto-generated code used for CosmWasm contract development. This is shipped as part of cosmwasm-std. Do not use directly." diff --git a/packages/schema-derive/Cargo.toml b/packages/schema-derive/Cargo.toml index 94bb8df670..7f3b53933e 100644 --- a/packages/schema-derive/Cargo.toml +++ b/packages/schema-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema-derive" -version = "1.2.4" +version = "1.2.5" authors = ["Tomasz Kurcz "] edition = "2021" description = "Derive macros for cosmwasm-schema" diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index 82a8203265..91ced79a03 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "1.2.4" +version = "1.2.5" authors = ["Simon Warta ", "Ethan Frey "] edition = "2021" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." @@ -8,7 +8,7 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/schema" license = "Apache-2.0" [dependencies] -cosmwasm-schema-derive = { version = "=1.2.4", path = "../schema-derive" } +cosmwasm-schema-derive = { version = "=1.2.5", path = "../schema-derive" } schemars = "0.8.3" serde = "1.0" serde_json = "1.0.40" @@ -16,6 +16,6 @@ thiserror = "1.0.26" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = { version = "1.2.4", path = "../std" } +cosmwasm-std = { version = "1.2.5", path = "../std" } semver = "1" tempfile = "3" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 036b8e8809..2629690783 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "1.2.4" +version = "1.2.5" authors = ["Ethan Frey "] edition = "2021" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -42,7 +42,7 @@ cosmwasm_1_2 = ["cosmwasm_1_1"] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "1.2.4" } +cosmwasm-derive = { path = "../derive", version = "1.2.5" } derivative = "2" forward_ref = "1" hex = "0.4" @@ -54,7 +54,7 @@ thiserror = "1.0.26" uint = "0.9.3" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "1.2.4" } +cosmwasm-crypto = { path = "../crypto", version = "1.2.5" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index ce9ba8d8cc..78ba760f7b 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "1.2.4" +version = "1.2.5" authors = ["Ethan Frey "] edition = "2021" description = "CosmWasm library with useful helpers for Storage patterns" @@ -16,5 +16,5 @@ iterator = ["cosmwasm-std/iterator"] [dependencies] # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.2.4", default-features = false } +cosmwasm-std = { path = "../std", version = "1.2.5", default-features = false } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 7be9e965cd..fbedf06b69 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "1.2.4" +version = "1.2.5" authors = ["Ethan Frey "] edition = "2021" description = "VM bindings to run cosmwams contracts" @@ -41,8 +41,8 @@ required-features = ["iterator"] [dependencies] clru = "0.4.0" # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.2.4", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "1.2.4" } +cosmwasm-std = { path = "../std", version = "1.2.5", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "1.2.5" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.3" From 4318c67ad5c9ff42e4d2fb9018fbd43ef3c4884d Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 2 May 2023 17:10:07 +0200 Subject: [PATCH 0231/2372] Fix changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad756789db..14215138d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1685,7 +1685,8 @@ Some main points: All future Changelog entries will reference this base -[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.4...HEAD +[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.5...HEAD +[1.2.5]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.4...v1.2.5 [1.2.4]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.3...v1.2.4 [1.2.3]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.2...v1.2.3 [1.2.2]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.1...v1.2.2 From 6c415f9869901f652bafd7a247b0e25c2729289f Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 28 Apr 2023 14:50:36 +0200 Subject: [PATCH 0232/2372] Add storage keys docs and pull in some functions --- docs/STORAGE_KEYS.md | 83 ++++++++ packages/std/src/lib.rs | 1 + .../std/src/storage_keys/length_prefixed.rs | 195 ++++++++++++++++++ packages/std/src/storage_keys/mod.rs | 3 + 4 files changed, 282 insertions(+) create mode 100644 docs/STORAGE_KEYS.md create mode 100644 packages/std/src/storage_keys/length_prefixed.rs create mode 100644 packages/std/src/storage_keys/mod.rs diff --git a/docs/STORAGE_KEYS.md b/docs/STORAGE_KEYS.md new file mode 100644 index 0000000000..52f7b5f44e --- /dev/null +++ b/docs/STORAGE_KEYS.md @@ -0,0 +1,83 @@ +# Storage keys + +CosmWasm provides a generic key value store to contract developers via the +`Storage` trait. This is powerful but the nature of low level byte operations +makes it hard to use for high level storage types. In this document we discuss +the foundations of storage key composition all the way up to cw-storage-plus. + +In a simple world, all you need is a `&[u8]` key which you can get e.g. using +`&17u64.to_be_bytes()`. This is an 8 bytes key with an encoded integer. But if +you have multiple data types in your contract, you want to prefix those keys in +order to avoid collisions. A simple concatenation is not sufficient because you +want to avoid collisions when part of the prefixes and part of the key overlap. +E.g. `b"keya" | b"x"` and `b"key" | b"ax"` (`|` denotes concatenation) must not +have the same binary representation. + +In the early days, multiple approaches of key namespacing were discussed and +were documented here: https://github.com/webmaster128/key-namespacing. The "0x00 +separated ASCIIHEX" approach was never used but "Length-prefixed keys" is used. + +To recap, Length-prefixed keys have the following layout: + +``` +len(namespace_1) | namespace_1 + | len(namespace_2) | namespace_2 + | len(namespace_3) | namespace_3 + | ... + | len(namespace_m) | namespace_m + | key +``` + +In this repo (package `cosmwasm-storage`), the following functions were +implemented: + +```rust +pub fn to_length_prefixed(namespace: &[u8]) -> Vec + +pub fn to_length_prefixed_nested(namespaces: &[&[u8]]) -> Vec + +fn concat(namespace: &[u8], key: &[u8]) -> Vec +``` + +With the emerging cw-storage-plus we see two additions to that approach: + +1. Manually creating the namespace and concatenating it with `concat` makes no + sense anymore. Instead `namespace` and `key` are always provided and a + composed database key is created. +2. Using a multi component namespace becomes the norm. + +This led to the following addition in cw-storage-plus: + +```rust +/// This is equivalent concat(to_length_prefixed_nested(namespaces), key) +/// But more efficient when the intermediate namespaces often must be recalculated +pub(crate) fn namespaces_with_key(namespaces: &[&[u8]], key: &[u8]) -> Vec { +``` + +In contrast to `concat(to_length_prefixed_nested(namespaces), key)` this direct +implementation saves once vector allocation since the final length can be +pre-computed and reserved. Also it's shorter to use. + +Also since `to_length_prefixed` returns the same result as +`to_length_prefixed_nested` when called with one namespace element, there is no +good reason to preserve the single component version. + +## 2023 updates + +With the deprecation if cosmwasm-storage and the adoption of the system in +cw-storage-plus, it is time to do a few changes to the Length-prefixed keys +standard, without breaking existing users. + +1. Remove the single component `to_length_prefixed` implementation and fully + commit to the multi-component version. This shifts focus from the recursive + implementation to the compatible iterative implementation. +2. Rename "namespaces" to just "namespace" and let one namespace have multiple + components. +3. Adopt the combined namespace + key encoder `namespaces_with_key` from + cw-storage-plus. +4. Add a decomposition implementation + +Given the importance of Length-prefixed keys for the entire CosmWasm ecosystem, +those implementations should be maintained in cosmwasm-std. The generic approach +allows building all sorts of storage solutions on top of it and it allows +indexers to parse storage keys for all of them. diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 7f26868498..3a52e28452 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -24,6 +24,7 @@ mod results; mod sections; mod serde; mod storage; +mod storage_keys; mod timestamp; mod traits; mod types; diff --git a/packages/std/src/storage_keys/length_prefixed.rs b/packages/std/src/storage_keys/length_prefixed.rs new file mode 100644 index 0000000000..7c11b10449 --- /dev/null +++ b/packages/std/src/storage_keys/length_prefixed.rs @@ -0,0 +1,195 @@ +//! This module is an implemention of a namespacing scheme described +//! in https://github.com/webmaster128/key-namespacing#length-prefixed-keys +//! +//! Everything in this file is only responsible for building such keys +//! and is in no way specific to any kind of storage. + +/// Calculates the raw key prefix for a given namespace as documented +/// in https://github.com/webmaster128/key-namespacing#length-prefixed-keys +#[allow(unused)] +pub fn to_length_prefixed(namespace: &[u8]) -> Vec { + let mut out = Vec::with_capacity(namespace.len() + 2); + out.extend_from_slice(&encode_length(namespace)); + out.extend_from_slice(namespace); + out +} + +/// Calculates the raw key prefix for a given nested namespace +/// as documented in https://github.com/webmaster128/key-namespacing#nesting +#[allow(unused)] +pub fn to_length_prefixed_nested(namespaces: &[&[u8]]) -> Vec { + let mut size = 0; + for &namespace in namespaces { + size += namespace.len() + 2; + } + + let mut out = Vec::with_capacity(size); + for &namespace in namespaces { + out.extend_from_slice(&encode_length(namespace)); + out.extend_from_slice(namespace); + } + out +} + +/// Encodes the length of a given namespace as a 2 byte big endian encoded integer +fn encode_length(namespace: &[u8]) -> [u8; 2] { + if namespace.len() > 0xFFFF { + panic!("only supports namespaces up to length 0xFFFF") + } + let length_bytes = (namespace.len() as u32).to_be_bytes(); + [length_bytes[2], length_bytes[3]] +} + +#[inline] +#[allow(unused)] +fn concat(namespace: &[u8], key: &[u8]) -> Vec { + let mut k = namespace.to_vec(); + k.extend_from_slice(key); + k +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn to_length_prefixed_works() { + assert_eq!(to_length_prefixed(b""), b"\x00\x00"); + assert_eq!(to_length_prefixed(b"a"), b"\x00\x01a"); + assert_eq!(to_length_prefixed(b"ab"), b"\x00\x02ab"); + assert_eq!(to_length_prefixed(b"abc"), b"\x00\x03abc"); + } + + #[test] + fn to_length_prefixed_works_for_long_prefix() { + let long_namespace1 = vec![0; 256]; + let prefix1 = to_length_prefixed(&long_namespace1); + assert_eq!(prefix1.len(), 256 + 2); + assert_eq!(&prefix1[0..2], b"\x01\x00"); + + let long_namespace2 = vec![0; 30000]; + let prefix2 = to_length_prefixed(&long_namespace2); + assert_eq!(prefix2.len(), 30000 + 2); + assert_eq!(&prefix2[0..2], b"\x75\x30"); + + let long_namespace3 = vec![0; 0xFFFF]; + let prefix3 = to_length_prefixed(&long_namespace3); + assert_eq!(prefix3.len(), 0xFFFF + 2); + assert_eq!(&prefix3[0..2], b"\xFF\xFF"); + } + + #[test] + #[should_panic(expected = "only supports namespaces up to length 0xFFFF")] + fn to_length_prefixed_panics_for_too_long_prefix() { + let limit = 0xFFFF; + let long_namespace = vec![0; limit + 1]; + to_length_prefixed(&long_namespace); + } + + #[test] + fn to_length_prefixed_calculates_capacity_correctly() { + // Those tests cannot guarantee the required capacity was calculated correctly before + // the vector allocation but increase the likelyhood of a proper implementation. + + let key = to_length_prefixed(b""); + assert_eq!(key.capacity(), key.len()); + + let key = to_length_prefixed(b"h"); + assert_eq!(key.capacity(), key.len()); + + let key = to_length_prefixed(b"hij"); + assert_eq!(key.capacity(), key.len()); + } + + #[test] + fn to_length_prefixed_nested_works() { + assert_eq!(to_length_prefixed_nested(&[]), b""); + assert_eq!(to_length_prefixed_nested(&[b""]), b"\x00\x00"); + assert_eq!(to_length_prefixed_nested(&[b"", b""]), b"\x00\x00\x00\x00"); + + assert_eq!(to_length_prefixed_nested(&[b"a"]), b"\x00\x01a"); + assert_eq!( + to_length_prefixed_nested(&[b"a", b"ab"]), + b"\x00\x01a\x00\x02ab" + ); + assert_eq!( + to_length_prefixed_nested(&[b"a", b"ab", b"abc"]), + b"\x00\x01a\x00\x02ab\x00\x03abc" + ); + } + + #[test] + fn to_length_prefixed_nested_returns_the_same_as_to_length_prefixed_for_one_element() { + let tests = [b"" as &[u8], b"x" as &[u8], b"abababab" as &[u8]]; + + for test in tests { + assert_eq!(to_length_prefixed_nested(&[test]), to_length_prefixed(test)); + } + } + + #[test] + fn to_length_prefixed_nested_allows_many_long_namespaces() { + // The 0xFFFF limit is for each namespace, not for the combination of them + + let long_namespace1 = vec![0xaa; 0xFFFD]; + let long_namespace2 = vec![0xbb; 0xFFFE]; + let long_namespace3 = vec![0xcc; 0xFFFF]; + + let prefix = + to_length_prefixed_nested(&[&long_namespace1, &long_namespace2, &long_namespace3]); + assert_eq!(&prefix[0..2], b"\xFF\xFD"); + assert_eq!(&prefix[2..(2 + 0xFFFD)], long_namespace1.as_slice()); + assert_eq!(&prefix[(2 + 0xFFFD)..(2 + 0xFFFD + 2)], b"\xFF\xFe"); + assert_eq!( + &prefix[(2 + 0xFFFD + 2)..(2 + 0xFFFD + 2 + 0xFFFE)], + long_namespace2.as_slice() + ); + assert_eq!( + &prefix[(2 + 0xFFFD + 2 + 0xFFFE)..(2 + 0xFFFD + 2 + 0xFFFE + 2)], + b"\xFF\xFf" + ); + assert_eq!( + &prefix[(2 + 0xFFFD + 2 + 0xFFFE + 2)..(2 + 0xFFFD + 2 + 0xFFFE + 2 + 0xFFFF)], + long_namespace3.as_slice() + ); + } + + #[test] + fn to_length_prefixed_nested_calculates_capacity_correctly() { + // Those tests cannot guarantee the required capacity was calculated correctly before + // the vector allocation but increase the likelyhood of a proper implementation. + + let key = to_length_prefixed_nested(&[]); + assert_eq!(key.capacity(), key.len()); + + let key = to_length_prefixed_nested(&[b""]); + assert_eq!(key.capacity(), key.len()); + + let key = to_length_prefixed_nested(&[b"a"]); + assert_eq!(key.capacity(), key.len()); + + let key = to_length_prefixed_nested(&[b"a", b"bc"]); + assert_eq!(key.capacity(), key.len()); + + let key = to_length_prefixed_nested(&[b"a", b"bc", b"def"]); + assert_eq!(key.capacity(), key.len()); + } + + #[test] + fn encode_length_works() { + assert_eq!(encode_length(b""), *b"\x00\x00"); + assert_eq!(encode_length(b"a"), *b"\x00\x01"); + assert_eq!(encode_length(b"aa"), *b"\x00\x02"); + assert_eq!(encode_length(b"aaa"), *b"\x00\x03"); + assert_eq!(encode_length(&vec![1; 255]), *b"\x00\xff"); + assert_eq!(encode_length(&vec![1; 256]), *b"\x01\x00"); + assert_eq!(encode_length(&vec![1; 12345]), *b"\x30\x39"); + assert_eq!(encode_length(&vec![1; 65535]), *b"\xff\xff"); + } + + #[test] + #[should_panic(expected = "only supports namespaces up to length 0xFFFF")] + fn encode_length_panics_for_large_values() { + encode_length(&vec![1; 65536]); + } +} diff --git a/packages/std/src/storage_keys/mod.rs b/packages/std/src/storage_keys/mod.rs new file mode 100644 index 0000000000..a9410c3f2a --- /dev/null +++ b/packages/std/src/storage_keys/mod.rs @@ -0,0 +1,3 @@ +mod length_prefixed; + +pub use length_prefixed::{to_length_prefixed, to_length_prefixed_nested}; From 712e1784aa26577ca55da5f8fda6f0700813cc48 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 28 Apr 2023 14:54:49 +0200 Subject: [PATCH 0233/2372] Use to_length_prefixed, to_length_prefixed_nested from cosmwasm-std --- packages/std/src/lib.rs | 6 +- .../std/src/storage_keys/length_prefixed.rs | 2 - packages/storage/src/bucket.rs | 6 +- packages/storage/src/length_prefixed.rs | 176 ------------------ packages/storage/src/lib.rs | 6 +- packages/storage/src/namespace_helpers.rs | 3 +- packages/storage/src/prefixed_storage.rs | 6 +- packages/storage/src/singleton.rs | 3 +- 8 files changed, 19 insertions(+), 189 deletions(-) delete mode 100644 packages/storage/src/length_prefixed.rs diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 3a52e28452..8561e3f871 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -24,11 +24,15 @@ mod results; mod sections; mod serde; mod storage; -mod storage_keys; mod timestamp; mod traits; mod types; +// This modules is very advanced and will not be used directly by the vast majority of users. +// We want to offer it to ensure a a stable storage key composition system but don't encourage +// contract devs to use it directly. +pub mod storage_keys; + pub use crate::addresses::{instantiate2_address, Addr, CanonicalAddr, Instantiate2AddressError}; pub use crate::binary::Binary; pub use crate::coin::{coin, coins, has_coins, Coin}; diff --git a/packages/std/src/storage_keys/length_prefixed.rs b/packages/std/src/storage_keys/length_prefixed.rs index 7c11b10449..721ea6ce59 100644 --- a/packages/std/src/storage_keys/length_prefixed.rs +++ b/packages/std/src/storage_keys/length_prefixed.rs @@ -6,7 +6,6 @@ /// Calculates the raw key prefix for a given namespace as documented /// in https://github.com/webmaster128/key-namespacing#length-prefixed-keys -#[allow(unused)] pub fn to_length_prefixed(namespace: &[u8]) -> Vec { let mut out = Vec::with_capacity(namespace.len() + 2); out.extend_from_slice(&encode_length(namespace)); @@ -16,7 +15,6 @@ pub fn to_length_prefixed(namespace: &[u8]) -> Vec { /// Calculates the raw key prefix for a given nested namespace /// as documented in https://github.com/webmaster128/key-namespacing#nesting -#[allow(unused)] pub fn to_length_prefixed_nested(namespaces: &[&[u8]]) -> Vec { let mut size = 0; for &namespace in namespaces { diff --git a/packages/storage/src/bucket.rs b/packages/storage/src/bucket.rs index dd9e482f3e..5f68abafa7 100644 --- a/packages/storage/src/bucket.rs +++ b/packages/storage/src/bucket.rs @@ -1,11 +1,13 @@ use serde::{de::DeserializeOwned, ser::Serialize}; use std::marker::PhantomData; -use cosmwasm_std::{to_vec, StdError, StdResult, Storage}; +use cosmwasm_std::{ + storage_keys::{to_length_prefixed, to_length_prefixed_nested}, + to_vec, StdError, StdResult, Storage, +}; #[cfg(feature = "iterator")] use cosmwasm_std::{Order, Record}; -use crate::length_prefixed::{to_length_prefixed, to_length_prefixed_nested}; #[cfg(feature = "iterator")] use crate::namespace_helpers::range_with_prefix; use crate::namespace_helpers::{get_with_prefix, remove_with_prefix, set_with_prefix}; diff --git a/packages/storage/src/length_prefixed.rs b/packages/storage/src/length_prefixed.rs deleted file mode 100644 index 5d97b3b419..0000000000 --- a/packages/storage/src/length_prefixed.rs +++ /dev/null @@ -1,176 +0,0 @@ -//! This module is an implemention of a namespacing scheme described -//! in https://github.com/webmaster128/key-namespacing#length-prefixed-keys -//! -//! Everything in this file is only responsible for building such keys -//! and is in no way specific to any kind of storage. - -/// Calculates the raw key prefix for a given namespace as documented -/// in https://github.com/webmaster128/key-namespacing#length-prefixed-keys -pub fn to_length_prefixed(namespace: &[u8]) -> Vec { - let mut out = Vec::with_capacity(namespace.len() + 2); - out.extend_from_slice(&encode_length(namespace)); - out.extend_from_slice(namespace); - out -} - -/// Calculates the raw key prefix for a given nested namespace -/// as documented in https://github.com/webmaster128/key-namespacing#nesting -pub fn to_length_prefixed_nested(namespaces: &[&[u8]]) -> Vec { - let mut size = 0; - for &namespace in namespaces { - size += namespace.len() + 2; - } - - let mut out = Vec::with_capacity(size); - for &namespace in namespaces { - out.extend_from_slice(&encode_length(namespace)); - out.extend_from_slice(namespace); - } - out -} - -/// Encodes the length of a given namespace as a 2 byte big endian encoded integer -fn encode_length(namespace: &[u8]) -> [u8; 2] { - if namespace.len() > 0xFFFF { - panic!("only supports namespaces up to length 0xFFFF") - } - let length_bytes = (namespace.len() as u32).to_be_bytes(); - [length_bytes[2], length_bytes[3]] -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn to_length_prefixed_works() { - assert_eq!(to_length_prefixed(b""), b"\x00\x00"); - assert_eq!(to_length_prefixed(b"a"), b"\x00\x01a"); - assert_eq!(to_length_prefixed(b"ab"), b"\x00\x02ab"); - assert_eq!(to_length_prefixed(b"abc"), b"\x00\x03abc"); - } - - #[test] - fn to_length_prefixed_works_for_long_prefix() { - let long_namespace1 = vec![0; 256]; - let prefix1 = to_length_prefixed(&long_namespace1); - assert_eq!(prefix1.len(), 256 + 2); - assert_eq!(&prefix1[0..2], b"\x01\x00"); - - let long_namespace2 = vec![0; 30000]; - let prefix2 = to_length_prefixed(&long_namespace2); - assert_eq!(prefix2.len(), 30000 + 2); - assert_eq!(&prefix2[0..2], b"\x75\x30"); - - let long_namespace3 = vec![0; 0xFFFF]; - let prefix3 = to_length_prefixed(&long_namespace3); - assert_eq!(prefix3.len(), 0xFFFF + 2); - assert_eq!(&prefix3[0..2], b"\xFF\xFF"); - } - - #[test] - #[should_panic(expected = "only supports namespaces up to length 0xFFFF")] - fn to_length_prefixed_panics_for_too_long_prefix() { - let limit = 0xFFFF; - let long_namespace = vec![0; limit + 1]; - to_length_prefixed(&long_namespace); - } - - #[test] - fn to_length_prefixed_calculates_capacity_correctly() { - // Those tests cannot guarantee the required capacity was calculated correctly before - // the vector allocation but increase the likelyhood of a proper implementation. - - let key = to_length_prefixed(b""); - assert_eq!(key.capacity(), key.len()); - - let key = to_length_prefixed(b"h"); - assert_eq!(key.capacity(), key.len()); - - let key = to_length_prefixed(b"hij"); - assert_eq!(key.capacity(), key.len()); - } - - #[test] - fn to_length_prefixed_nested_works() { - assert_eq!(to_length_prefixed_nested(&[]), b""); - assert_eq!(to_length_prefixed_nested(&[b""]), b"\x00\x00"); - assert_eq!(to_length_prefixed_nested(&[b"", b""]), b"\x00\x00\x00\x00"); - - assert_eq!(to_length_prefixed_nested(&[b"a"]), b"\x00\x01a"); - assert_eq!( - to_length_prefixed_nested(&[b"a", b"ab"]), - b"\x00\x01a\x00\x02ab" - ); - assert_eq!( - to_length_prefixed_nested(&[b"a", b"ab", b"abc"]), - b"\x00\x01a\x00\x02ab\x00\x03abc" - ); - } - - #[test] - fn to_length_prefixed_nested_allows_many_long_namespaces() { - // The 0xFFFF limit is for each namespace, not for the combination of them - - let long_namespace1 = vec![0xaa; 0xFFFD]; - let long_namespace2 = vec![0xbb; 0xFFFE]; - let long_namespace3 = vec![0xcc; 0xFFFF]; - - let prefix = - to_length_prefixed_nested(&[&long_namespace1, &long_namespace2, &long_namespace3]); - assert_eq!(&prefix[0..2], b"\xFF\xFD"); - assert_eq!(&prefix[2..(2 + 0xFFFD)], long_namespace1.as_slice()); - assert_eq!(&prefix[(2 + 0xFFFD)..(2 + 0xFFFD + 2)], b"\xFF\xFe"); - assert_eq!( - &prefix[(2 + 0xFFFD + 2)..(2 + 0xFFFD + 2 + 0xFFFE)], - long_namespace2.as_slice() - ); - assert_eq!( - &prefix[(2 + 0xFFFD + 2 + 0xFFFE)..(2 + 0xFFFD + 2 + 0xFFFE + 2)], - b"\xFF\xFf" - ); - assert_eq!( - &prefix[(2 + 0xFFFD + 2 + 0xFFFE + 2)..(2 + 0xFFFD + 2 + 0xFFFE + 2 + 0xFFFF)], - long_namespace3.as_slice() - ); - } - - #[test] - fn to_length_prefixed_nested_calculates_capacity_correctly() { - // Those tests cannot guarantee the required capacity was calculated correctly before - // the vector allocation but increase the likelyhood of a proper implementation. - - let key = to_length_prefixed_nested(&[]); - assert_eq!(key.capacity(), key.len()); - - let key = to_length_prefixed_nested(&[b""]); - assert_eq!(key.capacity(), key.len()); - - let key = to_length_prefixed_nested(&[b"a"]); - assert_eq!(key.capacity(), key.len()); - - let key = to_length_prefixed_nested(&[b"a", b"bc"]); - assert_eq!(key.capacity(), key.len()); - - let key = to_length_prefixed_nested(&[b"a", b"bc", b"def"]); - assert_eq!(key.capacity(), key.len()); - } - - #[test] - fn encode_length_works() { - assert_eq!(encode_length(b""), *b"\x00\x00"); - assert_eq!(encode_length(b"a"), *b"\x00\x01"); - assert_eq!(encode_length(b"aa"), *b"\x00\x02"); - assert_eq!(encode_length(b"aaa"), *b"\x00\x03"); - assert_eq!(encode_length(&vec![1; 255]), *b"\x00\xff"); - assert_eq!(encode_length(&vec![1; 256]), *b"\x01\x00"); - assert_eq!(encode_length(&vec![1; 12345]), *b"\x30\x39"); - assert_eq!(encode_length(&vec![1; 65535]), *b"\xff\xff"); - } - - #[test] - #[should_panic(expected = "only supports namespaces up to length 0xFFFF")] - fn encode_length_panics_for_large_values() { - encode_length(&vec![1; 65536]); - } -} diff --git a/packages/storage/src/lib.rs b/packages/storage/src/lib.rs index 486d070796..5e5b72d764 100644 --- a/packages/storage/src/lib.rs +++ b/packages/storage/src/lib.rs @@ -1,5 +1,4 @@ mod bucket; -mod length_prefixed; mod namespace_helpers; mod prefixed_storage; mod sequence; @@ -7,7 +6,10 @@ mod singleton; mod type_helpers; pub use bucket::{bucket, bucket_read, Bucket, ReadonlyBucket}; -pub use length_prefixed::{to_length_prefixed, to_length_prefixed_nested}; pub use prefixed_storage::{prefixed, prefixed_read, PrefixedStorage, ReadonlyPrefixedStorage}; pub use sequence::{currval, nextval, sequence}; pub use singleton::{singleton, singleton_read, ReadonlySingleton, Singleton}; + +// Re-exported for backwads compatibility. +// See https://github.com/CosmWasm/cosmwasm/pull/1676. +pub use cosmwasm_std::storage_keys::{to_length_prefixed, to_length_prefixed_nested}; diff --git a/packages/storage/src/namespace_helpers.rs b/packages/storage/src/namespace_helpers.rs index 1c2650b911..6a24829856 100644 --- a/packages/storage/src/namespace_helpers.rs +++ b/packages/storage/src/namespace_helpers.rs @@ -85,8 +85,7 @@ fn namespace_upper_bound(input: &[u8]) -> Vec { #[cfg(test)] mod tests { use super::*; - use crate::length_prefixed::to_length_prefixed; - use cosmwasm_std::testing::MockStorage; + use cosmwasm_std::{storage_keys::to_length_prefixed, testing::MockStorage}; #[test] fn prefix_get_set() { diff --git a/packages/storage/src/prefixed_storage.rs b/packages/storage/src/prefixed_storage.rs index 6d7779541a..cbe853b7e7 100644 --- a/packages/storage/src/prefixed_storage.rs +++ b/packages/storage/src/prefixed_storage.rs @@ -1,8 +1,10 @@ -use cosmwasm_std::Storage; +use cosmwasm_std::{ + storage_keys::{to_length_prefixed, to_length_prefixed_nested}, + Storage, +}; #[cfg(feature = "iterator")] use cosmwasm_std::{Order, Record}; -use crate::length_prefixed::{to_length_prefixed, to_length_prefixed_nested}; #[cfg(feature = "iterator")] use crate::namespace_helpers::range_with_prefix; use crate::namespace_helpers::{get_with_prefix, remove_with_prefix, set_with_prefix}; diff --git a/packages/storage/src/singleton.rs b/packages/storage/src/singleton.rs index 782002b976..d89848576d 100644 --- a/packages/storage/src/singleton.rs +++ b/packages/storage/src/singleton.rs @@ -1,9 +1,8 @@ use serde::{de::DeserializeOwned, ser::Serialize}; use std::marker::PhantomData; -use cosmwasm_std::{to_vec, StdError, StdResult, Storage}; +use cosmwasm_std::{storage_keys::to_length_prefixed, to_vec, StdError, StdResult, Storage}; -use crate::length_prefixed::to_length_prefixed; use crate::type_helpers::{may_deserialize, must_deserialize}; /// An alias of Singleton::new for less verbose usage From f5dad7090826323369a0ddbb3e71c2022a4f90f0 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 2 May 2023 17:45:33 +0200 Subject: [PATCH 0234/2372] Create namespace_with_key --- .../std/src/storage_keys/length_prefixed.rs | 82 +++++++++++++------ packages/std/src/storage_keys/mod.rs | 4 +- 2 files changed, 62 insertions(+), 24 deletions(-) diff --git a/packages/std/src/storage_keys/length_prefixed.rs b/packages/std/src/storage_keys/length_prefixed.rs index 721ea6ce59..9e95f17f04 100644 --- a/packages/std/src/storage_keys/length_prefixed.rs +++ b/packages/std/src/storage_keys/length_prefixed.rs @@ -6,44 +6,59 @@ /// Calculates the raw key prefix for a given namespace as documented /// in https://github.com/webmaster128/key-namespacing#length-prefixed-keys -pub fn to_length_prefixed(namespace: &[u8]) -> Vec { - let mut out = Vec::with_capacity(namespace.len() + 2); - out.extend_from_slice(&encode_length(namespace)); - out.extend_from_slice(namespace); +pub fn to_length_prefixed(namespace_component: &[u8]) -> Vec { + let mut out = Vec::with_capacity(namespace_component.len() + 2); + out.extend_from_slice(&encode_length(namespace_component)); + out.extend_from_slice(namespace_component); out } /// Calculates the raw key prefix for a given nested namespace /// as documented in https://github.com/webmaster128/key-namespacing#nesting -pub fn to_length_prefixed_nested(namespaces: &[&[u8]]) -> Vec { +pub fn to_length_prefixed_nested(namespace: &[&[u8]]) -> Vec { let mut size = 0; - for &namespace in namespaces { - size += namespace.len() + 2; + for component in namespace { + size += component.len() + 2; } let mut out = Vec::with_capacity(size); - for &namespace in namespaces { - out.extend_from_slice(&encode_length(namespace)); - out.extend_from_slice(namespace); + for component in namespace { + out.extend_from_slice(&encode_length(component)); + out.extend_from_slice(component); } out } -/// Encodes the length of a given namespace as a 2 byte big endian encoded integer -fn encode_length(namespace: &[u8]) -> [u8; 2] { - if namespace.len() > 0xFFFF { - panic!("only supports namespaces up to length 0xFFFF") +/// Encodes the length of a given namespace component +/// as a 2 byte big endian encoded integer +fn encode_length(namespace_component: &[u8]) -> [u8; 2] { + if namespace_component.len() > 0xFFFF { + panic!("only supports namespace components up to length 0xFFFF") } - let length_bytes = (namespace.len() as u32).to_be_bytes(); + let length_bytes = (namespace_component.len() as u32).to_be_bytes(); [length_bytes[2], length_bytes[3]] } -#[inline] -#[allow(unused)] -fn concat(namespace: &[u8], key: &[u8]) -> Vec { - let mut k = namespace.to_vec(); - k.extend_from_slice(key); - k +/// Encodes a namespace + key to a raw storage key. +/// +/// This is equivalent concat(to_length_prefixed_nested(namespace), key) +/// but more efficient when the namespace serialization is not persisted because +/// here we only need one vector allocation. +pub fn namespace_with_key(namespace: &[&[u8]], key: &[u8]) -> Vec { + // As documented in docs/STORAGE_KEYS.md, we know the final size of the key, + // which allows us to avoid reallocations of vectors. + let mut size = key.len(); + for component in namespace { + size += 2 /* encoded component length */ + component.len() /* the actual component data */; + } + + let mut out = Vec::with_capacity(size); + for component in namespace { + out.extend_from_slice(&encode_length(component)); + out.extend_from_slice(component); + } + out.extend_from_slice(key); + out } #[cfg(test)] @@ -77,7 +92,7 @@ mod tests { } #[test] - #[should_panic(expected = "only supports namespaces up to length 0xFFFF")] + #[should_panic(expected = "only supports namespace components up to length 0xFFFF")] fn to_length_prefixed_panics_for_too_long_prefix() { let limit = 0xFFFF; let long_namespace = vec![0; limit + 1]; @@ -186,8 +201,29 @@ mod tests { } #[test] - #[should_panic(expected = "only supports namespaces up to length 0xFFFF")] + #[should_panic(expected = "only supports namespace components up to length 0xFFFF")] fn encode_length_panics_for_large_values() { encode_length(&vec![1; 65536]); } + + #[test] + fn namespace_with_key_works() { + // Empty namespace + let enc = namespace_with_key(&[], b"foo"); + assert_eq!(enc, b"foo"); + let enc = namespace_with_key(&[], b""); + assert_eq!(enc, b""); + + // One component namespace + let enc = namespace_with_key(&[b"bar"], b"foo"); + assert_eq!(enc, b"\x00\x03barfoo"); + let enc = namespace_with_key(&[b"bar"], b""); + assert_eq!(enc, b"\x00\x03bar"); + + // Multi component namespace + let enc = namespace_with_key(&[b"bar", b"cool"], b"foo"); + assert_eq!(enc, b"\x00\x03bar\x00\x04coolfoo"); + let enc = namespace_with_key(&[b"bar", b"cool"], b""); + assert_eq!(enc, b"\x00\x03bar\x00\x04cool"); + } } diff --git a/packages/std/src/storage_keys/mod.rs b/packages/std/src/storage_keys/mod.rs index a9410c3f2a..630feaa18f 100644 --- a/packages/std/src/storage_keys/mod.rs +++ b/packages/std/src/storage_keys/mod.rs @@ -1,3 +1,5 @@ mod length_prefixed; -pub use length_prefixed::{to_length_prefixed, to_length_prefixed_nested}; +// Please note that the entire storage_keys module is public. So be careful +// when adding elements here. +pub use length_prefixed::{namespace_with_key, to_length_prefixed, to_length_prefixed_nested}; From 46b4830afee0843cf7f0d86f6f5021283585a311 Mon Sep 17 00:00:00 2001 From: Simon Warta <2603011+webmaster128@users.noreply.github.com> Date: Wed, 3 May 2023 09:24:54 +0200 Subject: [PATCH 0235/2372] Update packages/std/src/lib.rs Co-authored-by: Mauro Lacy --- packages/std/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 8561e3f871..dca5b3ba83 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -29,7 +29,7 @@ mod traits; mod types; // This modules is very advanced and will not be used directly by the vast majority of users. -// We want to offer it to ensure a a stable storage key composition system but don't encourage +// We want to offer it to ensure a stable storage key composition system but don't encourage // contract devs to use it directly. pub mod storage_keys; From 18625054e9ec0b27459bc56336663702e911e13a Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 3 May 2023 12:18:29 +0200 Subject: [PATCH 0236/2372] Deprecate all cosmwasm-storage types --- CHANGELOG.md | 7 +++++++ packages/storage/src/bucket.rs | 12 ++++++++++++ packages/storage/src/lib.rs | 2 ++ packages/storage/src/prefixed_storage.rs | 12 ++++++++++++ packages/storage/src/sequence.rs | 9 +++++++++ packages/storage/src/singleton.rs | 12 ++++++++++++ 6 files changed, 54 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a512a2112c..75136e9c10 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,13 @@ and this project adheres to [#1664]: https://github.com/CosmWasm/cosmwasm/pull/1664 [#1667]: https://github.com/CosmWasm/cosmwasm/pull/1667 +### Deprecated + +- cosmwasm-storage: All exports are deprecated because this crate will be + removed with CosmWasm 2.0 ([#1596]). + +[#1596]: https://github.com/CosmWasm/cosmwasm/issues/1596 + ## [1.2.5] - 2023-05-02 ### Added diff --git a/packages/storage/src/bucket.rs b/packages/storage/src/bucket.rs index 5f68abafa7..c349f1edd5 100644 --- a/packages/storage/src/bucket.rs +++ b/packages/storage/src/bucket.rs @@ -16,6 +16,9 @@ use crate::type_helpers::deserialize_kv; use crate::type_helpers::{may_deserialize, must_deserialize}; /// An alias of Bucket::new for less verbose usage +#[deprecated( + note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." +)] pub fn bucket<'a, T>(storage: &'a mut dyn Storage, namespace: &[u8]) -> Bucket<'a, T> where T: Serialize + DeserializeOwned, @@ -24,6 +27,9 @@ where } /// An alias of ReadonlyBucket::new for less verbose usage +#[deprecated( + note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." +)] pub fn bucket_read<'a, T>(storage: &'a dyn Storage, namespace: &[u8]) -> ReadonlyBucket<'a, T> where T: Serialize + DeserializeOwned, @@ -31,6 +37,9 @@ where ReadonlyBucket::new(storage, namespace) } +#[deprecated( + note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." +)] pub struct Bucket<'a, T> where T: Serialize + DeserializeOwned, @@ -112,6 +121,9 @@ where } } +#[deprecated( + note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." +)] pub struct ReadonlyBucket<'a, T> where T: Serialize + DeserializeOwned, diff --git a/packages/storage/src/lib.rs b/packages/storage/src/lib.rs index 5e5b72d764..3fd3a37946 100644 --- a/packages/storage/src/lib.rs +++ b/packages/storage/src/lib.rs @@ -1,3 +1,5 @@ +#![allow(deprecated)] + mod bucket; mod namespace_helpers; mod prefixed_storage; diff --git a/packages/storage/src/prefixed_storage.rs b/packages/storage/src/prefixed_storage.rs index cbe853b7e7..97f5bb63a5 100644 --- a/packages/storage/src/prefixed_storage.rs +++ b/packages/storage/src/prefixed_storage.rs @@ -10,11 +10,17 @@ use crate::namespace_helpers::range_with_prefix; use crate::namespace_helpers::{get_with_prefix, remove_with_prefix, set_with_prefix}; /// An alias of PrefixedStorage::new for less verbose usage +#[deprecated( + note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." +)] pub fn prefixed<'a>(storage: &'a mut dyn Storage, namespace: &[u8]) -> PrefixedStorage<'a> { PrefixedStorage::new(storage, namespace) } /// An alias of ReadonlyPrefixedStorage::new for less verbose usage +#[deprecated( + note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." +)] pub fn prefixed_read<'a>( storage: &'a dyn Storage, namespace: &[u8], @@ -22,6 +28,9 @@ pub fn prefixed_read<'a>( ReadonlyPrefixedStorage::new(storage, namespace) } +#[deprecated( + note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." +)] pub struct PrefixedStorage<'a> { storage: &'a mut dyn Storage, prefix: Vec, @@ -71,6 +80,9 @@ impl<'a> Storage for PrefixedStorage<'a> { } } +#[deprecated( + note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." +)] pub struct ReadonlyPrefixedStorage<'a> { storage: &'a dyn Storage, prefix: Vec, diff --git a/packages/storage/src/sequence.rs b/packages/storage/src/sequence.rs index 30f9491cb2..6d953f79c5 100644 --- a/packages/storage/src/sequence.rs +++ b/packages/storage/src/sequence.rs @@ -3,18 +3,27 @@ use cosmwasm_std::{StdResult, Storage}; use crate::Singleton; /// Sequence creates a custom Singleton to hold an empty sequence +#[deprecated( + note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." +)] pub fn sequence<'a>(storage: &'a mut dyn Storage, key: &[u8]) -> Singleton<'a, u64> { Singleton::new(storage, key) } /// currval returns the last value returned by nextval. If the sequence has never been used, /// then it will return 0. +#[deprecated( + note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." +)] pub fn currval(seq: &Singleton) -> StdResult { Ok(seq.may_load()?.unwrap_or_default()) } /// nextval increments the counter by 1 and returns the new value. /// On the first time it is called (no sequence info in db) it will return 1. +#[deprecated( + note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." +)] pub fn nextval(seq: &mut Singleton) -> StdResult { let val = currval(seq)? + 1; seq.save(&val)?; diff --git a/packages/storage/src/singleton.rs b/packages/storage/src/singleton.rs index d89848576d..c274a41dc8 100644 --- a/packages/storage/src/singleton.rs +++ b/packages/storage/src/singleton.rs @@ -6,6 +6,9 @@ use cosmwasm_std::{storage_keys::to_length_prefixed, to_vec, StdError, StdResult use crate::type_helpers::{may_deserialize, must_deserialize}; /// An alias of Singleton::new for less verbose usage +#[deprecated( + note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." +)] pub fn singleton<'a, T>(storage: &'a mut dyn Storage, key: &[u8]) -> Singleton<'a, T> where T: Serialize + DeserializeOwned, @@ -14,6 +17,9 @@ where } /// An alias of ReadonlySingleton::new for less verbose usage +#[deprecated( + note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." +)] pub fn singleton_read<'a, T>(storage: &'a dyn Storage, key: &[u8]) -> ReadonlySingleton<'a, T> where T: Serialize + DeserializeOwned, @@ -25,6 +31,9 @@ where /// work on a single storage key. It performs the to_length_prefixed transformation /// on the given name to ensure no collisions, and then provides the standard /// TypedStorage accessors, without requiring a key (which is defined in the constructor) +#[deprecated( + note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." +)] pub struct Singleton<'a, T> where T: Serialize + DeserializeOwned, @@ -88,6 +97,9 @@ where /// ReadonlySingleton only requires a Storage and exposes only the /// methods of Singleton that don't modify state. +#[deprecated( + note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." +)] pub struct ReadonlySingleton<'a, T> where T: Serialize + DeserializeOwned, From 93bd6da006cd9d2ed94c06b733e091f321e27983 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 3 May 2023 16:21:01 +0200 Subject: [PATCH 0237/2372] Remove unused cosmwasm-storage dependencies --- contracts/crypto-verify/Cargo.toml | 1 - contracts/cyberpunk/Cargo.toml | 1 - contracts/floaty/Cargo.toml | 1 - contracts/hackatom/Cargo.toml | 1 - 4 files changed, 4 deletions(-) diff --git a/contracts/crypto-verify/Cargo.toml b/contracts/crypto-verify/Cargo.toml index 0661d6c484..e31fe6242b 100644 --- a/contracts/crypto-verify/Cargo.toml +++ b/contracts/crypto-verify/Cargo.toml @@ -34,7 +34,6 @@ backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } cosmwasm-std = { path = "../../packages/std", features = ["iterator"] } -cosmwasm-storage = { path = "../../packages/storage", features = ["iterator"] } hex = "0.4" rlp = "0.5" schemars = "0.8.3" diff --git a/contracts/cyberpunk/Cargo.toml b/contracts/cyberpunk/Cargo.toml index 32f43bf413..f7a5c43575 100644 --- a/contracts/cyberpunk/Cargo.toml +++ b/contracts/cyberpunk/Cargo.toml @@ -35,5 +35,4 @@ rust-argon2 = "0.8" thiserror = "1.0.26" [dev-dependencies] -cosmwasm-storage = { path = "../../packages/storage", default-features = false } cosmwasm-vm = { path = "../../packages/vm", default-features = false } diff --git a/contracts/floaty/Cargo.toml b/contracts/floaty/Cargo.toml index b16a2c282b..0aee91625c 100644 --- a/contracts/floaty/Cargo.toml +++ b/contracts/floaty/Cargo.toml @@ -38,5 +38,4 @@ serde = { version = "1.0.103", default-features = false, features = ["derive"] } thiserror = "1.0.26" [dev-dependencies] -cosmwasm-storage = { path = "../../packages/storage" } cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator"] } diff --git a/contracts/hackatom/Cargo.toml b/contracts/hackatom/Cargo.toml index fa1b8ccf7d..240bdb1476 100644 --- a/contracts/hackatom/Cargo.toml +++ b/contracts/hackatom/Cargo.toml @@ -39,5 +39,4 @@ sha2 = "0.10" thiserror = "1.0.26" [dev-dependencies] -cosmwasm-storage = { path = "../../packages/storage", default-features = false } cosmwasm-vm = { path = "../../packages/vm", default-features = false } From 097593e413ad6ebd38815aab3a9ec16c7a26e9fa Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 3 May 2023 16:22:35 +0200 Subject: [PATCH 0238/2372] Handle storage manually for reflect contracts --- contracts/ibc-reflect-send/src/contract.rs | 32 +++++------ contracts/ibc-reflect-send/src/ibc.rs | 57 +++++++++--------- contracts/ibc-reflect-send/src/state.rs | 63 +++++++++++++++----- contracts/ibc-reflect/src/contract.rs | 46 ++++++++------- contracts/ibc-reflect/src/state.rs | 67 ++++++++++++++++------ contracts/reflect/src/contract.rs | 39 +++++++------ contracts/reflect/src/state.rs | 37 ++++++++---- 7 files changed, 211 insertions(+), 130 deletions(-) diff --git a/contracts/ibc-reflect-send/src/contract.rs b/contracts/ibc-reflect-send/src/contract.rs index 3784fc57cd..50d074f3a8 100644 --- a/contracts/ibc-reflect-send/src/contract.rs +++ b/contracts/ibc-reflect-send/src/contract.rs @@ -1,6 +1,6 @@ use cosmwasm_std::{ - entry_point, to_binary, CosmosMsg, Deps, DepsMut, Env, IbcMsg, MessageInfo, Order, - QueryResponse, Response, StdError, StdResult, + entry_point, to_binary, CosmosMsg, Deps, DepsMut, Env, IbcMsg, MessageInfo, QueryResponse, + Response, StdError, StdResult, }; use crate::ibc::PACKET_LIFETIME; @@ -9,7 +9,7 @@ use crate::msg::{ AccountInfo, AccountResponse, AdminResponse, ExecuteMsg, InstantiateMsg, ListAccountsResponse, QueryMsg, }; -use crate::state::{accounts, accounts_read, config, config_read, Config}; +use crate::state::{load_account, load_config, range_accounts, save_config, Config}; #[entry_point] pub fn instantiate( @@ -20,7 +20,7 @@ pub fn instantiate( ) -> StdResult { // we store the reflect_id for creating accounts later let cfg = Config { admin: info.sender }; - config(deps.storage).save(&cfg)?; + save_config(deps.storage, &cfg)?; Ok(Response::new().add_attribute("action", "instantiate")) } @@ -48,12 +48,12 @@ pub fn handle_update_admin( new_admin: String, ) -> StdResult { // auth check - let mut cfg = config(deps.storage).load()?; + let mut cfg = load_config(deps.storage)?; if info.sender != cfg.admin { return Err(StdError::generic_err("Only admin may set new admin")); } cfg.admin = deps.api.addr_validate(&new_admin)?; - config(deps.storage).save(&cfg)?; + save_config(deps.storage, &cfg)?; Ok(Response::new() .add_attribute("action", "handle_update_admin") @@ -68,12 +68,12 @@ pub fn handle_send_msgs( msgs: Vec, ) -> StdResult { // auth check - let cfg = config(deps.storage).load()?; + let cfg = load_config(deps.storage)?; if info.sender != cfg.admin { return Err(StdError::generic_err("Only admin may send messages")); } // ensure the channel exists (not found if not registered) - accounts(deps.storage).load(channel_id.as_bytes())?; + load_account(deps.storage, &channel_id)?; // construct a packet to send let packet = PacketMsg::Dispatch { msgs }; @@ -96,12 +96,12 @@ pub fn handle_check_remote_balance( channel_id: String, ) -> StdResult { // auth check - let cfg = config(deps.storage).load()?; + let cfg = load_config(deps.storage)?; if info.sender != cfg.admin { return Err(StdError::generic_err("Only admin may send messages")); } // ensure the channel exists (not found if not registered) - accounts(deps.storage).load(channel_id.as_bytes())?; + load_account(deps.storage, &channel_id)?; // construct a packet to send let packet = PacketMsg::Balances {}; @@ -141,7 +141,7 @@ pub fn handle_send_funds( } // load remote account - let data = accounts(deps.storage).load(reflect_channel_id.as_bytes())?; + let data = load_account(deps.storage, &reflect_channel_id)?; let remote_addr = match data.remote_addr { Some(addr) => addr, None => { @@ -175,16 +175,14 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { } fn query_account(deps: Deps, channel_id: String) -> StdResult { - let account = accounts_read(deps.storage).load(channel_id.as_bytes())?; + let account = load_account(deps.storage, &channel_id)?; Ok(account.into()) } fn query_list_accounts(deps: Deps) -> StdResult { - let accounts: StdResult> = accounts_read(deps.storage) - .range(None, None, Order::Ascending) + let accounts: StdResult> = range_accounts(deps.storage) .map(|r| { - let (k, account) = r?; - let channel_id = String::from_utf8(k)?; + let (channel_id, account) = r?; Ok(AccountInfo::convert(channel_id, account)) }) .collect(); @@ -194,7 +192,7 @@ fn query_list_accounts(deps: Deps) -> StdResult { } fn query_admin(deps: Deps) -> StdResult { - let Config { admin } = config_read(deps.storage).load()?; + let Config { admin } = load_config(deps.storage)?; Ok(AdminResponse { admin: admin.into(), }) diff --git a/contracts/ibc-reflect-send/src/ibc.rs b/contracts/ibc-reflect-send/src/ibc.rs index 2284c48457..76939acea8 100644 --- a/contracts/ibc-reflect-send/src/ibc.rs +++ b/contracts/ibc-reflect-send/src/ibc.rs @@ -7,7 +7,7 @@ use cosmwasm_std::{ use crate::ibc_msg::{ AcknowledgementMsg, BalancesResponse, DispatchResponse, PacketMsg, WhoAmIResponse, }; -use crate::state::{accounts, AccountData}; +use crate::state::{may_load_account, remove_account, save_account, AccountData}; pub const IBC_APP_VERSION: &str = "ibc-reflect-v1"; @@ -55,7 +55,7 @@ pub fn ibc_channel_connect( // create an account holder the channel exists (not found if not registered) let data = AccountData::default(); - accounts(deps.storage).save(channel_id.as_bytes(), &data)?; + save_account(deps.storage, channel_id, &data)?; // construct a packet to send let packet = PacketMsg::WhoAmI {}; @@ -82,7 +82,7 @@ pub fn ibc_channel_close( // remove the channel let channel_id = &channel.endpoint.channel_id; - accounts(deps.storage).remove(channel_id.as_bytes()); + remove_account(deps.storage, channel_id); Ok(IbcBasicResponse::new() .add_attribute("action", "ibc_close") @@ -154,19 +154,16 @@ fn acknowledge_who_am_i( .add_attribute("error", e)) } }; - - accounts(deps.storage).update(caller.as_bytes(), |acct| -> StdResult<_> { - match acct { - Some(mut acct) => { - // set the account the first time - if acct.remote_addr.is_none() { - acct.remote_addr = Some(account); - } - Ok(acct) + match may_load_account(deps.storage, &caller)? { + Some(mut acct) => { + // set the account the first time + if acct.remote_addr.is_none() { + acct.remote_addr = Some(account); } - None => Err(StdError::generic_err("no account to update")), + save_account(deps.storage, &caller, &acct)?; } - })?; + None => return Err(StdError::generic_err("no account to update")), + } Ok(IbcBasicResponse::new().add_attribute("action", "acknowledge_who_am_i")) } @@ -188,26 +185,28 @@ fn acknowledge_balances( } }; - accounts(deps.storage).update(caller.as_bytes(), |acct| -> StdResult<_> { - match acct { - Some(acct) => { - if let Some(old_addr) = acct.remote_addr { - if old_addr != account { - return Err(StdError::generic_err(format!( - "remote account changed from {} to {}", - old_addr, account - ))); - } + match may_load_account(deps.storage, &caller)? { + Some(acct) => { + if let Some(old_addr) = acct.remote_addr { + if old_addr != account { + return Err(StdError::generic_err(format!( + "remote account changed from {} to {}", + old_addr, account + ))); } - Ok(AccountData { + } + save_account( + deps.storage, + &caller, + &AccountData { last_update_time: env.block.time, remote_addr: Some(account), remote_balance: balances, - }) - } - None => Err(StdError::generic_err("no account to update")), + }, + )?; } - })?; + None => return Err(StdError::generic_err("no account to update")), + } Ok(IbcBasicResponse::new().add_attribute("action", "acknowledge_balances")) } diff --git a/contracts/ibc-reflect-send/src/state.rs b/contracts/ibc-reflect-send/src/state.rs index a44d66b1d5..ab7960463d 100644 --- a/contracts/ibc-reflect-send/src/state.rs +++ b/contracts/ibc-reflect-send/src/state.rs @@ -1,13 +1,15 @@ use serde::{Deserialize, Serialize}; -use cosmwasm_std::{Addr, Coin, Storage, Timestamp}; -use cosmwasm_storage::{ - bucket, bucket_read, singleton, singleton_read, Bucket, ReadonlyBucket, ReadonlySingleton, - Singleton, +use cosmwasm_std::{ + from_slice, storage_keys::namespace_with_key, to_vec, Addr, Coin, Order, StdError, StdResult, + Storage, Timestamp, }; pub const KEY_CONFIG: &[u8] = b"config"; +/// accounts is lookup of channel_id to reflect contract pub const PREFIX_ACCOUNTS: &[u8] = b"accounts"; +/// Upper bound for ranging over accounts +const PREFIX_ACCOUNTS_UPPER_BOUND: &[u8] = b"accountt"; #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] pub struct Config { @@ -27,19 +29,54 @@ pub struct AccountData { pub remote_balance: Vec, } -/// accounts is lookup of channel_id to reflect contract -pub fn accounts(storage: &mut dyn Storage) -> Bucket { - bucket(storage, PREFIX_ACCOUNTS) +pub fn may_load_account(storage: &dyn Storage, id: &str) -> StdResult> { + storage + .get(&namespace_with_key(&[PREFIX_ACCOUNTS], id.as_bytes())) + .map(|v| from_slice(&v)) + .transpose() +} + +pub fn load_account(storage: &dyn Storage, id: &str) -> StdResult { + may_load_account(storage, id)?.ok_or_else(|| StdError::not_found(format!("account {}", id))) +} + +pub fn save_account(storage: &mut dyn Storage, id: &str, account: &AccountData) -> StdResult<()> { + storage.set( + &namespace_with_key(&[PREFIX_ACCOUNTS], id.as_bytes()), + &to_vec(account)?, + ); + Ok(()) +} + +pub fn remove_account(storage: &mut dyn Storage, id: &str) { + storage.remove(&namespace_with_key(&[PREFIX_ACCOUNTS], id.as_bytes())); } -pub fn accounts_read(storage: &dyn Storage) -> ReadonlyBucket { - bucket_read(storage, PREFIX_ACCOUNTS) +pub fn range_accounts( + storage: &dyn Storage, +) -> impl Iterator> + '_ { + storage + .range( + Some(PREFIX_ACCOUNTS), + Some(PREFIX_ACCOUNTS_UPPER_BOUND), + Order::Ascending, + ) + .map(|(key, val)| { + Ok(( + String::from_utf8(key[PREFIX_ACCOUNTS.len()..].to_vec())?, + from_slice(&val)?, + )) + }) } -pub fn config(storage: &mut dyn Storage) -> Singleton { - singleton(storage, KEY_CONFIG) +pub fn load_config(storage: &dyn Storage) -> StdResult { + storage + .get(KEY_CONFIG) + .ok_or_else(|| StdError::not_found("config")) + .and_then(|v| from_slice(&v)) } -pub fn config_read(storage: &dyn Storage) -> ReadonlySingleton { - singleton_read(storage, KEY_CONFIG) +pub fn save_config(storage: &mut dyn Storage, item: &Config) -> StdResult<()> { + storage.set(KEY_CONFIG, &to_vec(item)?); + Ok(()) } diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 04750f00ec..0e3e3673b7 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -2,7 +2,7 @@ use cosmwasm_std::{ entry_point, from_slice, to_binary, wasm_execute, BankMsg, Binary, CosmosMsg, Deps, DepsMut, Empty, Env, Event, Ibc3ChannelOpenResponse, IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcChannelOpenResponse, IbcOrder, IbcPacketAckMsg, - IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, MessageInfo, Never, Order, + IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, MessageInfo, Never, QueryResponse, Reply, Response, StdError, StdResult, SubMsg, SubMsgResponse, SubMsgResult, WasmMsg, }; @@ -11,7 +11,10 @@ use crate::msg::{ AccountInfo, AccountResponse, AcknowledgementMsg, BalancesResponse, DispatchResponse, InstantiateMsg, ListAccountsResponse, PacketMsg, QueryMsg, ReflectExecuteMsg, WhoAmIResponse, }; -use crate::state::{accounts, accounts_read, config, pending_channel, Config}; +use crate::state::{ + load_account, load_item, may_load_account, range_accounts, remove_account, save_account, + save_item, Config, KEY_CONFIG, KEY_PENDING_CHANNEL, +}; pub const IBC_APP_VERSION: &str = "ibc-reflect-v1"; pub const RECEIVE_DISPATCH_ID: u64 = 1234; @@ -28,7 +31,7 @@ pub fn instantiate( let cfg = Config { reflect_code_id: msg.reflect_code_id, }; - config(deps.storage).save(&cfg)?; + save_item(deps.storage, KEY_CONFIG, &cfg)?; Ok(Response::new().add_attribute("action", "instantiate")) } @@ -59,8 +62,8 @@ fn parse_contract_from_event(events: Vec) -> Option { pub fn handle_init_callback(deps: DepsMut, response: SubMsgResponse) -> StdResult { // we use storage to pass info from the caller to the reply - let id = pending_channel(deps.storage).load()?; - pending_channel(deps.storage).remove(); + let id: String = load_item(deps.storage, KEY_PENDING_CHANNEL)?; + deps.storage.remove(KEY_PENDING_CHANNEL); // parse contract info from events let contract_addr = match parse_contract_from_event(response.events) { @@ -72,14 +75,14 @@ pub fn handle_init_callback(deps: DepsMut, response: SubMsgResponse) -> StdResul // store id -> contract_addr if it is empty // id comes from: `let chan_id = msg.endpoint.channel_id;` in `ibc_channel_connect` - accounts(deps.storage).update(id.as_bytes(), |val| -> StdResult<_> { - match val { - Some(_) => Err(StdError::generic_err( + match may_load_account(deps.storage, &id)? { + Some(_) => { + return Err(StdError::generic_err( "Cannot register over an existing channel", - )), - None => Ok(contract_addr), + )) } - })?; + None => save_account(deps.storage, &id, &contract_addr)?, + } Ok(Response::new().add_attribute("action", "execute_init_callback")) } @@ -93,20 +96,19 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { } pub fn query_account(deps: Deps, channel_id: String) -> StdResult { - let account = accounts_read(deps.storage).load(channel_id.as_bytes())?; + let account = load_account(deps.storage, &channel_id)?; Ok(AccountResponse { account: Some(account.into()), }) } pub fn query_list_accounts(deps: Deps) -> StdResult { - let accounts: StdResult> = accounts_read(deps.storage) - .range(None, None, Order::Ascending) + let accounts: StdResult> = range_accounts(deps.storage) .map(|item| { let (key, account) = item?; Ok(AccountInfo { account: account.into(), - channel_id: String::from_utf8(key)?, + channel_id: key, }) }) .collect(); @@ -153,7 +155,7 @@ pub fn ibc_channel_connect( msg: IbcChannelConnectMsg, ) -> StdResult { let channel = msg.channel(); - let cfg = config(deps.storage).load()?; + let cfg: Config = load_item(deps.storage, KEY_CONFIG)?; let chan_id = &channel.endpoint.channel_id; let msg = WasmMsg::Instantiate { @@ -166,7 +168,7 @@ pub fn ibc_channel_connect( let msg = SubMsg::reply_on_success(msg, INIT_CALLBACK_ID); // store the channel id for the reply handler - pending_channel(deps.storage).save(chan_id)?; + save_item(deps.storage, KEY_PENDING_CHANNEL, chan_id)?; Ok(IbcBasicResponse::new() .add_submessage(msg) @@ -186,8 +188,8 @@ pub fn ibc_channel_close( let channel = msg.channel(); // get contract address and remove lookup let channel_id = channel.endpoint.channel_id.as_str(); - let reflect_addr = accounts(deps.storage).load(channel_id.as_bytes())?; - accounts(deps.storage).remove(channel_id.as_bytes()); + let reflect_addr = load_account(deps.storage, channel_id)?; + remove_account(deps.storage, channel_id); // transfer current balance if any (steal the money) let amount = deps.querier.query_all_balances(&reflect_addr)?; @@ -258,7 +260,7 @@ pub fn ibc_packet_receive( // processes PacketMsg::WhoAmI variant fn receive_who_am_i(deps: DepsMut, caller: String) -> StdResult { - let account = accounts(deps.storage).load(caller.as_bytes())?; + let account = load_account(deps.storage, &caller)?; let response = WhoAmIResponse { account: account.into(), }; @@ -271,7 +273,7 @@ fn receive_who_am_i(deps: DepsMut, caller: String) -> StdResult StdResult { - let account = accounts(deps.storage).load(caller.as_bytes())?; + let account = load_account(deps.storage, &caller)?; let balances = deps.querier.query_all_balances(&account)?; let response = BalancesResponse { account: account.into(), @@ -291,7 +293,7 @@ fn receive_dispatch( msgs: Vec, ) -> StdResult { // what is the reflect contract here - let reflect_addr = accounts(deps.storage).load(caller.as_bytes())?; + let reflect_addr = load_account(deps.storage, &caller)?; // let them know we're fine let acknowledgement = to_binary(&AcknowledgementMsg::::Ok(()))?; diff --git a/contracts/ibc-reflect/src/state.rs b/contracts/ibc-reflect/src/state.rs index 9b0bbfe524..71d22827a7 100644 --- a/contracts/ibc-reflect/src/state.rs +++ b/contracts/ibc-reflect/src/state.rs @@ -1,39 +1,70 @@ -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; +use std::any::type_name; -use cosmwasm_std::{Addr, Storage}; -use cosmwasm_storage::{ - bucket, bucket_read, singleton, singleton_read, Bucket, ReadonlyBucket, ReadonlySingleton, - Singleton, +use cosmwasm_std::{ + from_slice, storage_keys::namespace_with_key, to_vec, Addr, Order, StdError, StdResult, Storage, }; +use schemars::JsonSchema; +use serde::{de::DeserializeOwned, Deserialize, Serialize}; pub const KEY_CONFIG: &[u8] = b"config"; pub const KEY_PENDING_CHANNEL: &[u8] = b"pending"; pub const PREFIX_ACCOUNTS: &[u8] = b"accounts"; +/// Upper bound for ranging over accounts +const PREFIX_ACCOUNTS_UPPER_BOUND: &[u8] = b"accountt"; #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] pub struct Config { pub reflect_code_id: u64, } -/// accounts is lookup of channel_id to reflect contract -pub fn accounts(storage: &mut dyn Storage) -> Bucket { - bucket(storage, PREFIX_ACCOUNTS) +pub fn may_load_account(storage: &dyn Storage, id: &str) -> StdResult> { + storage + .get(&namespace_with_key(&[PREFIX_ACCOUNTS], id.as_bytes())) + .map(|v| from_slice(&v)) + .transpose() +} + +pub fn load_account(storage: &dyn Storage, id: &str) -> StdResult { + may_load_account(storage, id)?.ok_or_else(|| StdError::not_found(format!("account {}", id))) +} + +pub fn save_account(storage: &mut dyn Storage, id: &str, account: &Addr) -> StdResult<()> { + storage.set( + &namespace_with_key(&[PREFIX_ACCOUNTS], id.as_bytes()), + &to_vec(account)?, + ); + Ok(()) } -pub fn accounts_read(storage: &dyn Storage) -> ReadonlyBucket { - bucket_read(storage, PREFIX_ACCOUNTS) +pub fn remove_account(storage: &mut dyn Storage, id: &str) { + storage.remove(&namespace_with_key(&[PREFIX_ACCOUNTS], id.as_bytes())); } -pub fn config(storage: &mut dyn Storage) -> Singleton { - singleton(storage, KEY_CONFIG) +pub fn range_accounts( + storage: &dyn Storage, +) -> impl Iterator> + '_ { + storage + .range( + Some(PREFIX_ACCOUNTS), + Some(PREFIX_ACCOUNTS_UPPER_BOUND), + Order::Ascending, + ) + .map(|(key, val)| { + Ok(( + String::from_utf8(key[PREFIX_ACCOUNTS.len()..].to_vec())?, + from_slice(&val)?, + )) + }) } -pub fn config_read(storage: &dyn Storage) -> ReadonlySingleton { - singleton_read(storage, KEY_CONFIG) +pub fn load_item(storage: &dyn Storage, key: &[u8]) -> StdResult { + storage + .get(key) + .ok_or_else(|| StdError::not_found(type_name::())) + .and_then(|v| from_slice(&v)) } -/// pending_channel is used to pass info from ibc_channel_connect to the reply handler -pub fn pending_channel(storage: &mut dyn Storage) -> Singleton { - singleton(storage, KEY_PENDING_CHANNEL) +pub fn save_item(storage: &mut dyn Storage, key: &[u8], item: &T) -> StdResult<()> { + storage.set(key, &to_vec(item)?); + Ok(()) } diff --git a/contracts/reflect/src/contract.rs b/contracts/reflect/src/contract.rs index f760a9a271..5334dbcbc1 100644 --- a/contracts/reflect/src/contract.rs +++ b/contracts/reflect/src/contract.rs @@ -9,7 +9,7 @@ use crate::msg::{ CapitalizedResponse, ChainResponse, CustomMsg, ExecuteMsg, InstantiateMsg, OwnerResponse, QueryMsg, RawResponse, SpecialQuery, SpecialResponse, }; -use crate::state::{config, config_read, replies, replies_read, State}; +use crate::state::{load_config, load_reply, save_config, save_reply, State}; #[entry_point] pub fn instantiate( @@ -19,7 +19,7 @@ pub fn instantiate( _msg: InstantiateMsg, ) -> StdResult> { let state = State { owner: info.sender }; - config(deps.storage).save(&state)?; + save_config(deps.storage, &state)?; Ok(Response::default()) } @@ -43,7 +43,7 @@ pub fn try_reflect( info: MessageInfo, msgs: Vec>, ) -> Result, ReflectError> { - let state = config(deps.storage).load()?; + let state = load_config(deps.storage)?; if info.sender != state.owner { return Err(ReflectError::NotCurrentOwner { @@ -67,7 +67,7 @@ pub fn try_reflect_subcall( info: MessageInfo, msgs: Vec>, ) -> Result, ReflectError> { - let state = config(deps.storage).load()?; + let state = load_config(deps.storage)?; if info.sender != state.owner { return Err(ReflectError::NotCurrentOwner { expected: state.owner.into(), @@ -91,16 +91,19 @@ pub fn try_change_owner( new_owner: String, ) -> Result, ReflectError> { let api = deps.api; - config(deps.storage).update(|mut state| { - if info.sender != state.owner { - return Err(ReflectError::NotCurrentOwner { - expected: state.owner.into(), - actual: info.sender.into(), - }); - } - state.owner = api.addr_validate(&new_owner)?; - Ok(state) - })?; + + let mut state = load_config(deps.storage)?; + + if info.sender != state.owner { + return Err(ReflectError::NotCurrentOwner { + expected: state.owner.into(), + actual: info.sender.into(), + }); + } + state.owner = api.addr_validate(&new_owner)?; + + save_config(deps.storage, &state)?; + Ok(Response::new() .add_attribute("action", "change_owner") .add_attribute("owner", new_owner)) @@ -109,8 +112,7 @@ pub fn try_change_owner( /// This just stores the result for future query #[entry_point] pub fn reply(deps: DepsMut, _env: Env, msg: Reply) -> Result { - let key = msg.id.to_be_bytes(); - replies(deps.storage).save(&key, &msg)?; + save_reply(deps.storage, msg.id, &msg)?; Ok(Response::default()) } @@ -126,7 +128,7 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult) -> StdResult { - let state = config_read(deps.storage).load()?; + let state = load_config(deps.storage)?; let resp = OwnerResponse { owner: state.owner.into(), }; @@ -134,8 +136,7 @@ fn query_owner(deps: Deps) -> StdResult { } fn query_subcall(deps: Deps, id: u64) -> StdResult { - let key = id.to_be_bytes(); - replies_read(deps.storage).load(&key) + load_reply(deps.storage, id) } fn query_capitalized(deps: Deps, text: String) -> StdResult { diff --git a/contracts/reflect/src/state.rs b/contracts/reflect/src/state.rs index b1d52aa3e6..df39f4ed58 100644 --- a/contracts/reflect/src/state.rs +++ b/contracts/reflect/src/state.rs @@ -1,10 +1,8 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use cosmwasm_std::{Addr, Reply, Storage}; -use cosmwasm_storage::{ - bucket, bucket_read, singleton, singleton_read, Bucket, ReadonlyBucket, ReadonlySingleton, - Singleton, +use cosmwasm_std::{ + from_slice, storage_keys::namespace_with_key, to_vec, Addr, Reply, StdError, StdResult, Storage, }; const CONFIG_KEY: &[u8] = b"config"; @@ -15,18 +13,33 @@ pub struct State { pub owner: Addr, } -pub fn config(storage: &mut dyn Storage) -> Singleton { - singleton(storage, CONFIG_KEY) +pub fn load_reply(storage: &dyn Storage, id: u64) -> StdResult { + storage + .get(&namespace_with_key(&[RESULT_PREFIX], &id.to_be_bytes())) + .ok_or_else(|| StdError::not_found(format!("reply {}", id))) + .and_then(|v| from_slice(&v)) } -pub fn config_read(storage: &dyn Storage) -> ReadonlySingleton { - singleton_read(storage, CONFIG_KEY) +pub fn save_reply(storage: &mut dyn Storage, id: u64, reply: &Reply) -> StdResult<()> { + storage.set( + &namespace_with_key(&[RESULT_PREFIX], &id.to_be_bytes()), + &to_vec(reply)?, + ); + Ok(()) } -pub fn replies(storage: &mut dyn Storage) -> Bucket { - bucket(storage, RESULT_PREFIX) +pub fn remove_reply(storage: &mut dyn Storage, id: u64) { + storage.remove(&namespace_with_key(&[RESULT_PREFIX], &id.to_be_bytes())); } -pub fn replies_read(storage: &dyn Storage) -> ReadonlyBucket { - bucket_read(storage, RESULT_PREFIX) +pub fn load_config(storage: &dyn Storage) -> StdResult { + storage + .get(CONFIG_KEY) + .ok_or_else(|| StdError::not_found("config")) + .and_then(|v| from_slice(&v)) +} + +pub fn save_config(storage: &mut dyn Storage, item: &State) -> StdResult<()> { + storage.set(CONFIG_KEY, &to_vec(item)?); + Ok(()) } From 9612d2c1d26ac5da0fcc46dca2a610912c1f9f37 Mon Sep 17 00:00:00 2001 From: Andrei Petrovich Date: Wed, 3 May 2023 20:52:16 +0200 Subject: [PATCH 0239/2372] Bump min rust version to 1.64.0 --- .circleci/config.yml | 144 +++++++++++++++++++-------------------- .github/workflows/ci.yml | 2 +- 2 files changed, 73 insertions(+), 73 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 05d72ae197..a3b30467f5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -72,7 +72,7 @@ workflows: matrix: parameters: # Run with MSRV and some modern stable Rust - rust-version: ["1.60.0", "1.68.2"] + rust-version: ["1.64.0", "1.68.2"] - benchmarking: requires: - package_vm @@ -117,7 +117,7 @@ jobs: command: | wget https://static.rust-lang.org/rustup/dist/aarch64-unknown-linux-gnu/rustup-init chmod +x rustup-init - ./rustup-init -y --default-toolchain 1.60.0 --profile minimal + ./rustup-init -y --default-toolchain 1.64.0 --profile minimal - run: name: Version information command: rustc --version; cargo --version; rustup --version; rustup target list --installed @@ -126,12 +126,12 @@ jobs: command: rustup target add wasm32-unknown-unknown && rustup target list --installed - restore_cache: keys: - - v4-arm64-workspace-rust:1.60.0-{{ checksum "Cargo.lock" }} - - v4-arm64-workspace-rust:1.60.0- + - v4-arm64-workspace-rust:1.64.0-{{ checksum "Cargo.lock" }} + - v4-arm64-workspace-rust:1.64.0- - restore_cache: keys: - - v4-arm64-contracts-rust:1.60.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} - - v4-arm64-contracts-rust:1.60.0- + - v4-arm64-contracts-rust:1.64.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} + - v4-arm64-contracts-rust:1.64.0- # Test a few contracts that do something potentially interesting in the VM # to test contract execution on ARM64. # No need to add all contracts here. @@ -169,14 +169,14 @@ jobs: # use all features command: cargo test --locked --features iterator,staking,stargate - save_cache: - key: v4-arm64-workspace-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: v4-arm64-workspace-rust:1.64.0-{{ checksum "Cargo.lock" }} paths: - ~/.cargo/registry - target/debug/.fingerprint - target/debug/build - target/debug/deps - save_cache: - key: v4-arm64-contracts-rust:1.60.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} + key: v4-arm64-contracts-rust:1.64.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} paths: - ~/.cargo/registry # crypto-verify @@ -217,7 +217,7 @@ jobs: package_crypto: docker: - - image: rust:1.60.0 + - image: rust:1.64.0 steps: - checkout - run: @@ -225,7 +225,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_crypto-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_crypto-rust:1.64.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/crypto @@ -240,11 +240,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_crypto-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_crypto-rust:1.64.0-{{ checksum "Cargo.lock" }} package_check: docker: - - image: rust:1.60.0 + - image: rust:1.64.0 steps: - checkout - run: @@ -252,7 +252,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_check-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_check-rust:1.64.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/check @@ -267,11 +267,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_check-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_check-rust:1.64.0-{{ checksum "Cargo.lock" }} package_schema: docker: - - image: rust:1.60.0 + - image: rust:1.64.0 steps: - checkout - run: @@ -279,7 +279,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_schema-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_schema-rust:1.64.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/schema @@ -294,11 +294,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_schema-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_schema-rust:1.64.0-{{ checksum "Cargo.lock" }} package_schema_derive: docker: - - image: rust:1.60.0 + - image: rust:1.64.0 steps: - checkout - run: @@ -306,7 +306,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_schema_derive-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_schema_derive-rust:1.64.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/schema-derive @@ -321,11 +321,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_schema_derive-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_schema_derive-rust:1.64.0-{{ checksum "Cargo.lock" }} package_std: docker: - - image: rust:1.60.0 + - image: rust:1.64.0 environment: # Limit the number of parallel jobs to avoid OOM crashes during doc testing RUST_TEST_THREADS: 8 @@ -336,7 +336,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_std-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_std-rust:1.64.0-{{ checksum "Cargo.lock" }} - run: name: Add wasm32 target command: rustup target add wasm32-unknown-unknown && rustup target list --installed @@ -370,11 +370,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_std-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_std-rust:1.64.0-{{ checksum "Cargo.lock" }} package_storage: docker: - - image: rust:1.60.0 + - image: rust:1.64.0 steps: - checkout - run: @@ -382,7 +382,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_storage-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_storage-rust:1.64.0-{{ checksum "Cargo.lock" }} - run: name: Build library for native target working_directory: ~/project/packages/storage @@ -401,11 +401,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_storage-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_storage-rust:1.64.0-{{ checksum "Cargo.lock" }} package_vm: docker: - - image: rust:1.60.0 + - image: rust:1.64.0 steps: - checkout - run: @@ -413,7 +413,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_vm-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_vm-rust:1.64.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/vm @@ -442,7 +442,7 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_vm-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_vm-rust:1.64.0-{{ checksum "Cargo.lock" }} package_vm_windows: executor: @@ -490,7 +490,7 @@ jobs: contract_burner: docker: - - image: rust:1.60.0 + - image: rust:1.64.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/burner @@ -502,7 +502,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_burner-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_burner-rust:1.64.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -513,11 +513,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_burner-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_burner-rust:1.64.0-{{ checksum "Cargo.lock" }} contract_crypto_verify: docker: - - image: rust:1.60.0 + - image: rust:1.64.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/crypto-verify @@ -529,7 +529,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_crypto_verify-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_crypto_verify-rust:1.64.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -540,11 +540,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_crypto_verify-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_crypto_verify-rust:1.64.0-{{ checksum "Cargo.lock" }} contract_cyberpunk: docker: - - image: rust:1.60.0 + - image: rust:1.64.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/cyberpunk @@ -556,7 +556,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_cyberpunk-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_cyberpunk-rust:1.64.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -567,11 +567,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_cyberpunk-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_cyberpunk-rust:1.64.0-{{ checksum "Cargo.lock" }} contract_hackatom: docker: - - image: rust:1.60.0 + - image: rust:1.64.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/hackatom @@ -583,7 +583,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_hackatom-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_hackatom-rust:1.64.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -594,11 +594,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_hackatom-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_hackatom-rust:1.64.0-{{ checksum "Cargo.lock" }} contract_ibc_reflect: docker: - - image: rust:1.60.0 + - image: rust:1.64.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/ibc-reflect @@ -610,7 +610,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_ibc_reflect-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_ibc_reflect-rust:1.64.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -621,11 +621,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_ibc_reflect-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_ibc_reflect-rust:1.64.0-{{ checksum "Cargo.lock" }} contract_ibc_reflect_send: docker: - - image: rust:1.60.0 + - image: rust:1.64.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/ibc-reflect-send @@ -637,7 +637,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_ibc_reflect_send-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_ibc_reflect_send-rust:1.64.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -648,11 +648,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_ibc_reflect_send-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_ibc_reflect_send-rust:1.64.0-{{ checksum "Cargo.lock" }} contract_floaty: docker: - - image: rust:1.60.0 + - image: rust:1.64.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/floaty @@ -664,7 +664,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_floaty-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_floaty-rust:1.64.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -675,11 +675,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_floaty-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_floaty-rust:1.64.0-{{ checksum "Cargo.lock" }} contract_queue: docker: - - image: rust:1.60.0 + - image: rust:1.64.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/queue @@ -691,7 +691,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_queue-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_queue-rust:1.64.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -702,11 +702,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_queue-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_queue-rust:1.64.0-{{ checksum "Cargo.lock" }} contract_reflect: docker: - - image: rust:1.60.0 + - image: rust:1.64.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/reflect @@ -718,7 +718,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_reflect-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_reflect-rust:1.64.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -729,11 +729,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_reflect-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_reflect-rust:1.64.0-{{ checksum "Cargo.lock" }} contract_staking: docker: - - image: rust:1.60.0 + - image: rust:1.64.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/staking @@ -745,7 +745,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_staking-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_staking-rust:1.64.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -756,11 +756,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_staking-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_staking-rust:1.64.0-{{ checksum "Cargo.lock" }} contract_virus: docker: - - image: rust:1.60.0 + - image: rust:1.64.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/virus @@ -772,7 +772,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_virus-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_virus-rust:1.64.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -783,11 +783,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_virus-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_virus-rust:1.64.0-{{ checksum "Cargo.lock" }} fmt: docker: - - image: rust:1.60.0 + - image: rust:1.64.0 steps: - checkout - run: @@ -795,7 +795,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-fmt-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-fmt-rust:1.64.0-{{ checksum "Cargo.lock" }} - run: name: Add rustfmt component command: rustup component add rustfmt @@ -808,7 +808,7 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-fmt-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-fmt-rust:1.64.0-{{ checksum "Cargo.lock" }} fmt_extra: docker: @@ -830,7 +830,7 @@ jobs: deadlinks: docker: - - image: rust:1.60.0 + - image: rust:1.64.0 steps: - checkout - run: @@ -838,7 +838,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-deadlinks-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-deadlinks-rust:1.64.0-{{ checksum "Cargo.lock" }} - run: name: Generate docs command: cargo doc @@ -858,7 +858,7 @@ jobs: - target/debug/build - target/debug/deps - /root/.cache/pip - key: cargocache-v2-deadlinks-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-deadlinks-rust:1.64.0-{{ checksum "Cargo.lock" }} clippy: parameters: @@ -934,7 +934,7 @@ jobs: benchmarking: docker: - - image: rust:1.60.0 + - image: rust:1.64.0 environment: RUST_BACKTRACE: 1 steps: @@ -944,7 +944,7 @@ jobs: command: rustc --version && cargo --version - restore_cache: keys: - - cargocache-v2-benchmarking-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-benchmarking-rust:1.64.0-{{ checksum "Cargo.lock" }} - run: name: Run vm benchmarks (Singlepass) working_directory: ~/project/packages/vm @@ -962,7 +962,7 @@ jobs: - target/release/.fingerprint - target/release/build - target/release/deps - key: cargocache-v2-benchmarking-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-benchmarking-rust:1.64.0-{{ checksum "Cargo.lock" }} coverage: # https://circleci.com/developer/images?imageType=machine @@ -1034,7 +1034,7 @@ jobs: name: Check development contracts command: | echo "Checking all contracts under ./artifacts" - docker run --volumes-from with_code rust:1.60.0 \ + docker run --volumes-from with_code rust:1.64.0 \ /bin/bash -e -c 'export GLOBIGNORE="artifacts/floaty.wasm"; cd ./code; cargo run --bin cosmwasm-check artifacts/*.wasm' docker cp with_code:/code/artifacts . - run: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1d50ccbda5..3235e56020 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,7 +33,7 @@ jobs: - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: 1.60.0 + toolchain: 1.64.0 target: wasm32-unknown-unknown profile: minimal override: true From 980f81ecae2379ea237083f4436eeb607427e273 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 25 Apr 2023 11:43:55 +0200 Subject: [PATCH 0240/2372] Install Wasmer 3.2.1 --- Cargo.lock | 605 ++++++++++++++++++++++++----------------- packages/vm/Cargo.toml | 8 +- 2 files changed, 365 insertions(+), 248 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dda8806a5f..dea02a16f6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -49,6 +49,12 @@ version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08f9b8508dccb7687a1d6c4ce66b2b0ecef467c94667de27d8d7fe1f8d2a9cdc" +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + [[package]] name = "atty" version = "0.2.14" @@ -131,19 +137,20 @@ checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecheck" -version = "0.6.8" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a31f923c2db9513e4298b72df143e6e655a759b3d6a0966df18f81223fff54f" +checksum = "13fe11640a23eb24562225322cd3e452b93a3d4091d62fab69c70542fcd17d1f" dependencies = [ "bytecheck_derive", "ptr_meta", + "simdutf8", ] [[package]] name = "bytecheck_derive" -version = "0.6.8" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edb17c862a905d912174daa27ae002326fff56dc8b8ada50a0a5f0976cb174f0" +checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ "proc-macro2", "quote", @@ -156,6 +163,12 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + [[package]] name = "cast" version = "0.3.0" @@ -280,7 +293,7 @@ dependencies = [ "cfg-if", "libc", "scopeguard", - "windows-sys", + "windows-sys 0.33.0", ] [[package]] @@ -419,56 +432,74 @@ dependencies = [ [[package]] name = "cranelift-bforest" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38faa2a16616c8e78a18d37b4726b98bfd2de192f2fdc8a39ddf568a408a0f75" +checksum = "2a2ab4512dfd3a6f4be184403a195f76e81a8a9f9e6c898e19d2dc3ce20e0115" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26f192472a3ba23860afd07d2b0217dc628f21fcc72617aa1336d98e1671f33b" +checksum = "98b022ed2a5913a38839dfbafe6cf135342661293b08049843362df4301261dc" dependencies = [ + "arrayvec", + "bumpalo", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", + "cranelift-egraph", "cranelift-entity", + "cranelift-isle", "gimli", "log", - "regalloc", + "regalloc2", "smallvec", "target-lexicon", ] [[package]] name = "cranelift-codegen-meta" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32ddb89e9b89d3d9b36a5b7d7ea3261c98235a76ac95ba46826b8ec40b1a24" +checksum = "639307b45434ad112a98f8300c0f0ab085cbefcd767efcdef9ef19d4c0756e74" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.82.3" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278e52e29c53fcf32431ef08406c295699a70306d05a0715c5b1bf50e33a9ab7" + +[[package]] +name = "cranelift-egraph" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01fd0d9f288cc1b42d9333b7a776b17e278fc888c28e6a0f09b5573d45a150bc" +checksum = "624b54323b06e675293939311943ba82d323bb340468ce1889be5da7932c8d73" +dependencies = [ + "cranelift-entity", + "fxhash", + "hashbrown", + "indexmap", + "log", + "smallvec", +] [[package]] name = "cranelift-entity" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3bfe172b83167604601faf9dc60453e0d0a93415b57a9c4d1a7ae6849185cf" +checksum = "9a59bcbca89c3f1b70b93ab3cbba5e5e0cbf3e63dadb23c7525cb142e21a9d4c" [[package]] name = "cranelift-frontend" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a006e3e32d80ce0e4ba7f1f9ddf66066d052a8c884a110b91d05404d6ce26dce" +checksum = "0d70abacb8cfef3dc8ff7e8836e9c1d70f7967dfdac824a4cd5e30223415aca6" dependencies = [ "cranelift-codegen", "log", @@ -476,6 +507,12 @@ dependencies = [ "target-lexicon", ] +[[package]] +name = "cranelift-isle" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "393bc73c451830ff8dbb3a07f61843d6cb41a084f9996319917c0b291ed785bb" + [[package]] name = "crc32fast" version = "1.3.2" @@ -552,7 +589,7 @@ dependencies = [ "cfg-if", "crossbeam-utils", "lazy_static", - "memoffset", + "memoffset 0.6.5", "scopeguard", ] @@ -641,6 +678,19 @@ dependencies = [ "syn", ] +[[package]] +name = "dashmap" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" +dependencies = [ + "cfg-if", + "hashbrown", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "der" version = "0.6.0" @@ -845,12 +895,30 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + [[package]] name = "forward_ref" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generic-array" version = "0.14.5" @@ -919,18 +987,9 @@ checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" [[package]] name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db0d4cf898abf0081f964436dc980e96670a0f36863e4b83aaacdb65c9d7ccc3" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ "ahash", ] @@ -971,15 +1030,24 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "indexmap" -version = "1.8.1" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown 0.11.2", - "serde", + "hashbrown", ] [[package]] @@ -1008,9 +1076,9 @@ checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" [[package]] name = "js-sys" -version = "0.3.57" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671a26f820db17c2a2750743f1dd03bafd15b98c9f30c7c2628c024c05d73397" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" dependencies = [ "wasm-bindgen", ] @@ -1046,13 +1114,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b" [[package]] -name = "libloading" -version = "0.7.3" +name = "lock_api" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ - "cfg-if", - "winapi", + "autocfg", + "scopeguard", ] [[package]] @@ -1070,7 +1138,6 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" dependencies = [ - "indexmap", "loupe-derive", "rustversion", ] @@ -1118,6 +1185,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + [[package]] name = "miniz_oxide" version = "0.5.1" @@ -1168,17 +1244,14 @@ version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40bec70ba014595f99f7aa110b84331ffe1ee9aece7fe6f387cc7e3ecda4d456" dependencies = [ - "crc32fast", - "hashbrown 0.11.2", - "indexmap", "memchr", ] [[package]] name = "once_cell" -version = "1.10.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "oorandom" @@ -1204,6 +1277,25 @@ version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" +[[package]] +name = "parking_lot_core" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys 0.45.0", +] + +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + [[package]] name = "pin-project-lite" version = "0.2.9" @@ -1389,13 +1481,14 @@ dependencies = [ ] [[package]] -name = "regalloc" -version = "0.0.34" +name = "regalloc2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62446b1d3ebf980bdc68837700af1d77b37bc430e524bf95319c6eada2a4cc02" +checksum = "300d4fbfb40c1c66a78ba3ddd41c1110247cf52f97b87d0f2fc9209bd49b030c" dependencies = [ + "fxhash", "log", - "rustc-hash", + "slice-group-by", "smallvec", ] @@ -1437,9 +1530,9 @@ dependencies = [ [[package]] name = "rend" -version = "0.3.6" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79af64b4b6362ffba04eef3a4e10829718a4896dac19daa741851c86781edf95" +checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" dependencies = [ "bytecheck", ] @@ -1457,12 +1550,13 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.7.38" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "517a3034eb2b1499714e9d1e49b2367ad567e07639b69776d35e259d9c27cca6" +checksum = "21499ed91807f07ae081880aabb2ccc0235e9d88011867d984525e9a4c3cfa3e" dependencies = [ "bytecheck", - "hashbrown 0.12.1", + "hashbrown", + "indexmap", "ptr_meta", "rend", "rkyv_derive", @@ -1471,9 +1565,9 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.7.38" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "505c209ee04111a006431abf39696e640838364d67a107c559ababaf6fd8c9dd" +checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" dependencies = [ "proc-macro2", "quote", @@ -1486,12 +1580,6 @@ version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustversion" version = "1.0.6" @@ -1588,12 +1676,14 @@ dependencies = [ ] [[package]] -name = "serde_bytes" -version = "0.11.6" +name = "serde-wasm-bindgen" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212e73464ebcde48d723aa02eb270ba62eff38a9b732df31f33f1b4e145f3a54" +checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" dependencies = [ + "js-sys", "serde", + "wasm-bindgen", ] [[package]] @@ -1663,6 +1753,18 @@ dependencies = [ "rand_core 0.6.3", ] +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + +[[package]] +name = "slice-group-by" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" + [[package]] name = "smallvec" version = "1.8.0" @@ -1779,6 +1881,21 @@ dependencies = [ "serde_json", ] +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tracing" version = "0.1.34" @@ -1786,7 +1903,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d0ecdcb44a79f0fe9844f0c4f33a342cbcbb5117de8001e6ba0dc2351327d09" dependencies = [ "cfg-if", - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1830,6 +1946,21 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-width" version = "0.1.9" @@ -1842,6 +1973,17 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + [[package]] name = "vec_map" version = "0.8.2" @@ -1879,9 +2021,9 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm-bindgen" -version = "0.2.80" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1889,24 +2031,47 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.80" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", "syn", "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-downcast" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" +dependencies = [ + "js-sys", + "once_cell", + "wasm-bindgen", + "wasm-bindgen-downcast-macros", +] + +[[package]] +name = "wasm-bindgen-downcast-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "wasm-bindgen-macro" -version = "0.2.80" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1914,9 +2079,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.80" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", @@ -1927,79 +2092,71 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.80" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea8d8361c9d006ea3d7797de7bd6b1492ffd0f91a22430cfda6c1658ad57bedf" +checksum = "8472807bd8d5062aef0a35681e1b6fbaed8fea88d97910870741100c03b8fef3" dependencies = [ + "bytes", "cfg-if", + "derivative", "indexmap", "js-sys", - "loupe", "more-asserts", + "serde", + "serde-wasm-bindgen", "target-lexicon", "thiserror", "wasm-bindgen", - "wasmer-artifact", + "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", "wasmer-derive", - "wasmer-engine", - "wasmer-engine-dylib", - "wasmer-engine-universal", "wasmer-types", "wasmer-vm", "winapi", ] -[[package]] -name = "wasmer-artifact" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aaf9428c29c1d8ad2ac0e45889ba8a568a835e33fd058964e5e500f2f7ce325" -dependencies = [ - "enumset", - "loupe", - "thiserror", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-compiler" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67a6cd866aed456656db2cfea96c18baabbd33f676578482b85c51e1ee19d2c" +checksum = "2e322cdfb8ed189d92cbb5c34acb319c0f04fb9799ed68e127717f255f8b246a" dependencies = [ + "backtrace", + "cfg-if", + "enum-iterator", "enumset", - "loupe", - "rkyv", - "serde", - "serde_bytes", + "lazy_static", + "leb128", + "memmap2", + "more-asserts", + "region", + "rustc-demangle", "smallvec", - "target-lexicon", "thiserror", "wasmer-types", + "wasmer-vm", "wasmparser", + "winapi", ] [[package]] name = "wasmer-compiler-cranelift" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48be2f9f6495f08649e4f8b946a2cbbe119faf5a654aa1457f9504a99d23dae0" +checksum = "c5240177aca0d8322c890d17d4b1b87f23ccb45340f616f384655aaba18f51bd" dependencies = [ "cranelift-codegen", "cranelift-entity", "cranelift-frontend", "gimli", - "loupe", "more-asserts", "rayon", "smallvec", @@ -2011,16 +2168,16 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ca2a35204d8befa85062bc7aac259a8db8070b801b8a783770ba58231d729e" +checksum = "f9f824f2e345c288e4394ee0410478dea799747f9ebb319e1d8ad33e33a03545" dependencies = [ "byteorder", "dynasm", "dynasmrt", + "enumset", "gimli", "lazy_static", - "loupe", "more-asserts", "rayon", "smallvec", @@ -2030,9 +2187,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e50405cc2a2f74ff574584710a5f2c1d5c93744acce2ca0866084739284b51" +checksum = "fb6858f330764b1041e68d3c824970064d2fbd8e27704180289fd248ff892c48" dependencies = [ "proc-macro-error", "proc-macro2", @@ -2040,164 +2197,69 @@ dependencies = [ "syn", ] -[[package]] -name = "wasmer-engine" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f98f010978c244db431b392aeab0661df7ea0822343334f8f2a920763548e45" -dependencies = [ - "backtrace", - "enumset", - "lazy_static", - "loupe", - "memmap2", - "more-asserts", - "rustc-demangle", - "serde", - "serde_bytes", - "target-lexicon", - "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", - "wasmer-vm", -] - -[[package]] -name = "wasmer-engine-dylib" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0358af9c154724587731175553805648d9acb8f6657880d165e378672b7e53" -dependencies = [ - "cfg-if", - "enum-iterator", - "enumset", - "leb128", - "libloading", - "loupe", - "object", - "rkyv", - "serde", - "tempfile", - "tracing", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-engine", - "wasmer-object", - "wasmer-types", - "wasmer-vm", - "which", -] - -[[package]] -name = "wasmer-engine-universal" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "440dc3d93c9ca47865a4f4edd037ea81bf983b5796b59b3d712d844b32dbef15" -dependencies = [ - "cfg-if", - "enumset", - "leb128", - "loupe", - "region", - "rkyv", - "wasmer-compiler", - "wasmer-engine", - "wasmer-engine-universal-artifact", - "wasmer-types", - "wasmer-vm", - "winapi", -] - -[[package]] -name = "wasmer-engine-universal-artifact" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f1db3f54152657eb6e86c44b66525ff7801dad8328fe677da48dd06af9ad41" -dependencies = [ - "enum-iterator", - "enumset", - "loupe", - "rkyv", - "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-middlewares" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7812438ed2f37203a37007cdb5332b8475cb2b16e15d51299b2647894e9ed3a" +checksum = "f3c5919c0fbbdb0ac8f6d432e7baa796ea49b1381d726bc319c0451f26da11fd" dependencies = [ - "loupe", "wasmer", "wasmer-types", "wasmer-vm", ] -[[package]] -name = "wasmer-object" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d831335ff3a44ecf451303f6f891175c642488036b92ceceb24ac8623a8fa8b" -dependencies = [ - "object", - "thiserror", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-types" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39df01ea05dc0a9bab67e054c7cb01521e53b35a7bb90bd02eca564ed0b2667f" +checksum = "d83345e3335fb9b21be6c394bc3d712522447bc8750db8a40ac9170627e3de35" dependencies = [ - "backtrace", + "bytecheck", "enum-iterator", + "enumset", "indexmap", - "loupe", "more-asserts", "rkyv", - "serde", + "target-lexicon", "thiserror", ] [[package]] name = "wasmer-vm" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d965fa61f4dc4cdb35a54daaf7ecec3563fbb94154a6c35433f879466247dd" +checksum = "2ca3cf9a2bb5919ae048231972440767efad7a693afaeb41332ab0796be1c884" dependencies = [ "backtrace", "cc", "cfg-if", "corosensei", + "dashmap", + "derivative", "enum-iterator", + "fnv", "indexmap", "lazy_static", "libc", - "loupe", "mach", - "memoffset", + "memoffset 0.8.0", "more-asserts", "region", - "rkyv", "scopeguard", - "serde", "thiserror", - "wasmer-artifact", "wasmer-types", "winapi", ] [[package]] name = "wasmparser" -version = "0.83.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a" +checksum = "f2ea896273ea99b15132414be1da01ab0d8836415083298ecaffbe308eaac87a" +dependencies = [ + "indexmap", + "url", +] [[package]] name = "wast" @@ -2229,17 +2291,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "which" -version = "4.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c4fb54e6113b6a8772ee41c3404fb0301ac79604489467e0a9ce1f3e97c24ae" -dependencies = [ - "either", - "lazy_static", - "libc", -] - [[package]] name = "winapi" version = "0.3.9" @@ -2277,43 +2328,109 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43dbb096663629518eb1dfa72d80243ca5a6aca764cae62a2df70af760a9be75" dependencies = [ - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_msvc", + "windows_aarch64_msvc 0.33.0", + "windows_i686_gnu 0.33.0", + "windows_i686_msvc 0.33.0", + "windows_x86_64_gnu 0.33.0", + "windows_x86_64_msvc 0.33.0", ] +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_i686_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_x86_64_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "zeroize" version = "1.5.5" diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 5d334f1982..325066539f 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -48,8 +48,8 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " serde_json = "1.0.40" sha2 = "0.10.3" thiserror = "1.0.26" -wasmer = { version = "=2.3.0", default-features = false, features = ["cranelift", "universal", "singlepass"] } -wasmer-middlewares = "=2.3.0" +wasmer = { version = "=3.2.1", default-features = false, features = ["cranelift", "singlepass"] } +wasmer-middlewares = "=3.2.1" loupe = "0.1.3" # Dependencies that we do not use ourself. We add those entries @@ -59,9 +59,9 @@ enumset = "1.0.2" # Fixes https://github.com/Lymia/enumset/issues/17 (https://gi bitflags = "1.1.0" # https://github.com/CensoredUsername/dynasm-rs/pull/74 # Wasmer git/local (used for quick local debugging or patching) -# wasmer = { git = "https://github.com/wasmerio/wasmer", rev = "877ce1f7c44fad853c", default-features = false, features = ["cranelift", "universal", "singlepass"] } +# wasmer = { git = "https://github.com/wasmerio/wasmer", rev = "877ce1f7c44fad853c", default-features = false, features = ["cranelift", "singlepass"] } # wasmer-middlewares = { git = "https://github.com/wasmerio/wasmer", rev = "877ce1f7c44fad853c" } -# wasmer = { path = "../../../wasmer/lib/api", default-features = false, features = ["cranelift", "universal", "singlepass"] } +# wasmer = { path = "../../../wasmer/lib/api", default-features = false, features = ["cranelift", "singlepass"] } # wasmer-middlewares = { path = "../../../wasmer/lib/middlewares" } [dev-dependencies] From b548cfe5730983fd7ff74ae54f59ba4c437f9c8f Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 25 Apr 2023 11:47:00 +0200 Subject: [PATCH 0241/2372] Update LimitingTunables --- .../vm/src/wasm_backend/limiting_tunables.rs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/packages/vm/src/wasm_backend/limiting_tunables.rs b/packages/vm/src/wasm_backend/limiting_tunables.rs index 007bc34a47..553de60b63 100644 --- a/packages/vm/src/wasm_backend/limiting_tunables.rs +++ b/packages/vm/src/wasm_backend/limiting_tunables.rs @@ -1,9 +1,11 @@ use std::ptr::NonNull; -use std::sync::Arc; use loupe::MemoryUsage; use wasmer::{ - vm::{self, MemoryError, MemoryStyle, TableStyle, VMMemoryDefinition, VMTableDefinition}, + vm::{ + MemoryError, MemoryStyle, TableStyle, VMMemory, VMMemoryDefinition, VMTable, + VMTableDefinition, + }, MemoryType, Pages, TableType, Tunables, }; @@ -84,7 +86,7 @@ impl Tunables for LimitingTunables { &self, ty: &MemoryType, style: &MemoryStyle, - ) -> Result, MemoryError> { + ) -> Result { let adjusted = self.adjust_memory(ty); self.validate_memory(&adjusted)?; self.base.create_host_memory(&adjusted, style) @@ -98,7 +100,7 @@ impl Tunables for LimitingTunables { ty: &MemoryType, style: &MemoryStyle, vm_definition_location: NonNull, - ) -> Result, MemoryError> { + ) -> Result { let adjusted = self.adjust_memory(ty); self.validate_memory(&adjusted)?; self.base @@ -108,11 +110,7 @@ impl Tunables for LimitingTunables { /// Create a table owned by the host given a [`TableType`] and a [`TableStyle`]. /// /// Delegated to base. - fn create_host_table( - &self, - ty: &TableType, - style: &TableStyle, - ) -> Result, String> { + fn create_host_table(&self, ty: &TableType, style: &TableStyle) -> Result { self.base.create_host_table(ty, style) } @@ -124,7 +122,7 @@ impl Tunables for LimitingTunables { ty: &TableType, style: &TableStyle, vm_definition_location: NonNull, - ) -> Result, String> { + ) -> Result { self.base.create_vm_table(ty, style, vm_definition_location) } } From 63759a4474b92e13b01ab3463199048c814f86c2 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 25 Apr 2023 11:56:33 +0200 Subject: [PATCH 0242/2372] Update store.rs --- packages/vm/src/wasm_backend/store.rs | 64 +++++++++++++-------------- 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/packages/vm/src/wasm_backend/store.rs b/packages/vm/src/wasm_backend/store.rs index 1f98f6bd1c..d837a7fb2a 100644 --- a/packages/vm/src/wasm_backend/store.rs +++ b/packages/vm/src/wasm_backend/store.rs @@ -5,7 +5,7 @@ use wasmer::Cranelift; use wasmer::Singlepass; use wasmer::{ wasmparser::Operator, BaseTunables, CompilerConfig, Engine, ModuleMiddleware, Pages, Store, - Target, Universal, WASM_PAGE_SIZE, + Target, WASM_PAGE_SIZE, }; use wasmer_middlewares::Metering; @@ -42,39 +42,37 @@ pub fn make_compile_time_store( #[cfg(feature = "cranelift")] { - let mut config = Cranelift::default(); + let mut compiler = Cranelift::default(); for middleware in middlewares { - config.push_middleware(middleware.clone()); + compiler.push_middleware(middleware.clone()); } - config.push_middleware(deterministic); - config.push_middleware(metering); - let engine = Universal::new(config).engine(); - make_store_with_engine(&engine, memory_limit) + compiler.push_middleware(deterministic); + compiler.push_middleware(metering); + make_store_with_engine(compiler.into(), memory_limit) } #[cfg(not(feature = "cranelift"))] { - let mut config = Singlepass::default(); + let mut compiler = Singlepass::default(); for middleware in middlewares { - config.push_middleware(middleware.clone()); + compiler.push_middleware(middleware.clone()); } - config.push_middleware(deterministic); - config.push_middleware(metering); - let engine = Universal::new(config).engine(); - make_store_with_engine(&engine, memory_limit) + compiler.push_middleware(deterministic); + compiler.push_middleware(metering); + make_store_with_engine(compiler.into(), memory_limit) } } /// Created a store with no compiler and the given memory limit (in bytes) /// If memory_limit is None, no limit is applied. pub fn make_runtime_store(memory_limit: Option) -> Store { - let engine = Universal::headless().engine(); - make_store_with_engine(&engine, memory_limit) + let engine = Engine::headless(); + make_store_with_engine(engine, memory_limit) } /// Creates a store from an engine and an optional memory limit. /// If no limit is set, the no custom tunables will be used. -fn make_store_with_engine(engine: &dyn Engine, memory_limit: Option) -> Store { +fn make_store_with_engine(engine: Engine, memory_limit: Option) -> Store { match memory_limit { Some(limit) => { let base = BaseTunables::for_target(&Target::default()); @@ -102,7 +100,7 @@ fn limit_to_pages(limit: Size) -> Pages { #[cfg(test)] mod tests { use super::*; - use wasmer::{ImportObject, Instance, Memory, Module}; + use wasmer::{Imports, Instance, Memory, Module}; /// A Wasm module with an exported memory (min: 4 pages, max: none) const EXPORTED_MEMORY_WAT: &str = r#"(module @@ -131,12 +129,12 @@ mod tests { let wasm = wat::parse_str(EXPORTED_MEMORY_WAT).unwrap(); // No limit - let store = make_compile_time_store(None, &[]); + let mut store = make_compile_time_store(None, &[]); let module = Module::new(&store, &wasm).unwrap(); let module_memory = module.info().memories.last().unwrap(); assert_eq!(module_memory.minimum, Pages(4)); assert_eq!(module_memory.maximum, None); - let instance = Instance::new(&module, &ImportObject::new()).unwrap(); + let instance = Instance::new(&mut store, &module, &Imports::new()).unwrap(); let instance_memory: Memory = instance .exports .iter() @@ -144,16 +142,16 @@ mod tests { .map(|pair| pair.1.clone()) .next() .unwrap(); - assert_eq!(instance_memory.ty().minimum, Pages(4)); - assert_eq!(instance_memory.ty().maximum, None); + assert_eq!(instance_memory.ty(&mut store).minimum, Pages(4)); + assert_eq!(instance_memory.ty(&mut store).maximum, None); // Set limit - let store = make_compile_time_store(Some(Size::kibi(23 * 64)), &[]); + let mut store = make_compile_time_store(Some(Size::kibi(23 * 64)), &[]); let module = Module::new(&store, &wasm).unwrap(); let module_memory = module.info().memories.last().unwrap(); assert_eq!(module_memory.minimum, Pages(4)); assert_eq!(module_memory.maximum, None); - let instance = Instance::new(&module, &ImportObject::new()).unwrap(); + let instance = Instance::new(&mut store, &module, &Imports::new()).unwrap(); let instance_memory: Memory = instance .exports .iter() @@ -161,8 +159,8 @@ mod tests { .map(|pair| pair.1.clone()) .next() .unwrap(); - assert_eq!(instance_memory.ty().minimum, Pages(4)); - assert_eq!(instance_memory.ty().maximum, Some(Pages(23))); + assert_eq!(instance_memory.ty(&mut store).minimum, Pages(4)); + assert_eq!(instance_memory.ty(&mut store).maximum, Some(Pages(23))); } #[test] @@ -176,12 +174,12 @@ mod tests { }; // No limit - let store = make_runtime_store(None); + let mut store = make_runtime_store(None); let module = unsafe { Module::deserialize(&store, &serialized) }.unwrap(); let module_memory = module.info().memories.last().unwrap(); assert_eq!(module_memory.minimum, Pages(4)); assert_eq!(module_memory.maximum, None); - let instance = Instance::new(&module, &ImportObject::new()).unwrap(); + let instance = Instance::new(&mut store, &module, &Imports::new()).unwrap(); let instance_memory: Memory = instance .exports .iter() @@ -189,16 +187,16 @@ mod tests { .map(|pair| pair.1.clone()) .next() .unwrap(); - assert_eq!(instance_memory.ty().minimum, Pages(4)); - assert_eq!(instance_memory.ty().maximum, None); + assert_eq!(instance_memory.ty(&mut store).minimum, Pages(4)); + assert_eq!(instance_memory.ty(&mut store).maximum, None); // Instantiate with limit - let store = make_runtime_store(Some(Size::kibi(23 * 64))); + let mut store = make_runtime_store(Some(Size::kibi(23 * 64))); let module = unsafe { Module::deserialize(&store, &serialized) }.unwrap(); let module_memory = module.info().memories.last().unwrap(); assert_eq!(module_memory.minimum, Pages(4)); assert_eq!(module_memory.maximum, None); - let instance = Instance::new(&module, &ImportObject::new()).unwrap(); + let instance = Instance::new(&mut store, &module, &Imports::new()).unwrap(); let instance_memory: Memory = instance .exports .iter() @@ -206,7 +204,7 @@ mod tests { .map(|pair| pair.1.clone()) .next() .unwrap(); - assert_eq!(instance_memory.ty().minimum, Pages(4)); - assert_eq!(instance_memory.ty().maximum, Some(Pages(23))); + assert_eq!(instance_memory.ty(&mut store).minimum, Pages(4)); + assert_eq!(instance_memory.ty(&mut store).maximum, Some(Pages(23))); } } From f0969c1bc62cfd71179148cff31c0d7396699b9a Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 25 Apr 2023 14:02:39 +0200 Subject: [PATCH 0243/2372] Update calls.rs --- packages/vm/src/calls.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 32c7eff3eb..2da5e3ea39 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -1,5 +1,5 @@ use serde::de::DeserializeOwned; -use wasmer::Val; +use wasmer::Value; use cosmwasm_std::{ContractResult, CustomMsg, Env, MessageInfo, QueryResponse, Reply, Response}; #[cfg(feature = "stargate")] @@ -574,7 +574,7 @@ where S: Storage + 'static, Q: Querier + 'static, { - let mut arg_region_ptrs = Vec::::with_capacity(args.len()); + let mut arg_region_ptrs = Vec::::with_capacity(args.len()); for arg in args { let region_ptr = instance.allocate(arg.len())?; instance.write_memory(region_ptr, arg)?; From d9567ef8ec82c9638b013a52dfd325fe41f06c09 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 25 Apr 2023 14:05:04 +0200 Subject: [PATCH 0244/2372] Update gatekeeper.rs --- packages/vm/src/wasm_backend/gatekeeper.rs | 23 ++++++++++------------ 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/packages/vm/src/wasm_backend/gatekeeper.rs b/packages/vm/src/wasm_backend/gatekeeper.rs index 897a500beb..c9a27c6c15 100644 --- a/packages/vm/src/wasm_backend/gatekeeper.rs +++ b/packages/vm/src/wasm_backend/gatekeeper.rs @@ -691,7 +691,7 @@ impl FunctionMiddleware for FunctionGatekeeper { mod tests { use super::*; use std::sync::Arc; - use wasmer::{CompilerConfig, Cranelift, Module, Store, Universal}; + use wasmer::{CompilerConfig, Cranelift, Module}; #[test] fn valid_wasm_instance_sanity() { @@ -708,10 +708,9 @@ mod tests { .unwrap(); let deterministic = Arc::new(Gatekeeper::default()); - let mut compiler_config = Cranelift::default(); - compiler_config.push_middleware(deterministic); - let store = Store::new(&Universal::new(compiler_config).engine()); - let result = Module::new(&store, wasm); + let mut compiler = Cranelift::default(); + compiler.push_middleware(deterministic); + let result = Module::new(&compiler, wasm); assert!(result.is_ok()); } @@ -729,10 +728,9 @@ mod tests { .unwrap(); let deterministic = Arc::new(Gatekeeper::default()); - let mut compiler_config = Cranelift::default(); - compiler_config.push_middleware(deterministic); - let store = Store::new(&Universal::new(compiler_config).engine()); - let result = Module::new(&store, wasm); + let mut compiler = Cranelift::default(); + compiler.push_middleware(deterministic); + let result = Module::new(&compiler, wasm); assert!(result .unwrap_err() .to_string() @@ -756,10 +754,9 @@ mod tests { .unwrap(); let deterministic = Arc::new(Gatekeeper::default()); - let mut compiler_config = Cranelift::default(); - compiler_config.push_middleware(deterministic); - let store = Store::new(&Universal::new(compiler_config).engine()); - let result = Module::new(&store, wasm); + let mut compiler = Cranelift::default(); + compiler.push_middleware(deterministic); + let result = Module::new(&compiler, wasm); assert!(result .unwrap_err() .to_string() From 1b6a55572959770f9f3af2804788f09db4524b4d Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 25 Apr 2023 14:11:24 +0200 Subject: [PATCH 0245/2372] Update static_analysis.rs --- packages/vm/src/static_analysis.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/vm/src/static_analysis.rs b/packages/vm/src/static_analysis.rs index 9db720db9a..8352ad9d71 100644 --- a/packages/vm/src/static_analysis.rs +++ b/packages/vm/src/static_analysis.rs @@ -86,7 +86,7 @@ pub fn has_ibc_entry_points(module: &impl ExportInfo) -> bool { mod tests { use super::*; use parity_wasm::elements::Internal; - use wasmer::{Cranelift, Store, Universal}; + use wasmer::Cranelift; static CONTRACT: &[u8] = include_bytes!("../testdata/hackatom.wasm"); static CORRUPTED: &[u8] = include_bytes!("../testdata/corrupted.wasm"); @@ -181,8 +181,8 @@ mod tests { #[test] fn exported_function_names_works_for_wasmer_with_no_prefix() { let wasm = wat::parse_str(r#"(module)"#).unwrap(); - let store = Store::new(&Universal::new(Cranelift::default()).engine()); - let module = wasmer::Module::new(&store, wasm).unwrap(); + let compiler = Cranelift::default(); + let module = wasmer::Module::new(&compiler, wasm).unwrap(); let exports = module.exported_function_names(None); assert_eq!(exports, HashSet::new()); @@ -198,8 +198,8 @@ mod tests { )"#, ) .unwrap(); - let store = Store::new(&Universal::new(Cranelift::default()).engine()); - let module = wasmer::Module::new(&store, wasm).unwrap(); + let compiler = Cranelift::default(); + let module = wasmer::Module::new(&compiler, wasm).unwrap(); let exports = module.exported_function_names(None); assert_eq!( exports, @@ -210,8 +210,8 @@ mod tests { #[test] fn exported_function_names_works_for_wasmer_with_prefix() { let wasm = wat::parse_str(r#"(module)"#).unwrap(); - let store = Store::new(&Universal::new(Cranelift::default()).engine()); - let module = wasmer::Module::new(&store, wasm).unwrap(); + let compiler = Cranelift::default(); + let module = wasmer::Module::new(&compiler, wasm).unwrap(); let exports = module.exported_function_names(Some("b")); assert_eq!(exports, HashSet::new()); @@ -228,8 +228,8 @@ mod tests { )"#, ) .unwrap(); - let store = Store::new(&Universal::new(Cranelift::default()).engine()); - let module = wasmer::Module::new(&store, wasm).unwrap(); + let compiler = Cranelift::default(); + let module = wasmer::Module::new(&compiler, wasm).unwrap(); let exports = module.exported_function_names(Some("b")); assert_eq!( exports, From 01e512c90e2c8dcb1cb4a62193e43b74e2990a38 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 25 Apr 2023 18:36:13 +0200 Subject: [PATCH 0246/2372] Work --- packages/vm/src/cache.rs | 21 +- packages/vm/src/environment.rs | 289 ++-- packages/vm/src/imports.rs | 1228 ++++++++++------- packages/vm/src/instance.rs | 229 +-- packages/vm/src/memory.rs | 134 +- packages/vm/src/modules/file_system_cache.rs | 14 +- packages/vm/src/modules/in_memory_cache.rs | 26 +- .../vm/src/modules/pinned_memory_cache.rs | 22 +- packages/vm/src/modules/versioning.rs | 4 +- packages/vm/src/static_analysis.rs | 14 +- packages/vm/src/wasm_backend/compile.rs | 6 +- packages/vm/src/wasm_backend/gatekeeper.rs | 40 +- .../vm/src/wasm_backend/limiting_tunables.rs | 2 - packages/vm/src/wasm_backend/store.rs | 18 +- 14 files changed, 1203 insertions(+), 844 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index dcedd488cc..0919021e26 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -180,7 +180,7 @@ where /// When a Wasm blob is stored which was previously checked (e.g. as part of state sync), /// use this function. pub fn save_wasm_unchecked(&self, wasm: &[u8]) -> VmResult { - let module = compile(wasm, None, &[])?; + let (_store, module) = compile(wasm, None, &[])?; let mut cache = self.inner.lock().unwrap(); let checksum = save_wasm_to_disk(&cache.wasm_path, wasm)?; @@ -271,7 +271,7 @@ where // Re-compile from original Wasm bytecode let code = self.load_wasm_with_path(&cache.wasm_path, checksum)?; - let module = compile(&code, Some(cache.instance_memory_limit), &[])?; + let (_store, module) = compile(&code, Some(cache.instance_memory_limit), &[])?; // Store into the fs cache too let module_size = cache.fs_cache.store(checksum, &module)?; cache @@ -300,8 +300,9 @@ where backend: Backend, options: InstanceOptions, ) -> VmResult> { - let module = self.get_module(checksum)?; + let (store, module) = self.get_module(checksum)?; let instance = Instance::from_module( + store, &module, backend, options.gas_limit, @@ -315,19 +316,21 @@ where /// Returns a module tied to a previously saved Wasm. /// Depending on availability, this is either generated from a memory cache, file system cache or Wasm code. /// This is part of `get_instance` but pulled out to reduce the locking time. - fn get_module(&self, checksum: &Checksum) -> VmResult { + fn get_module(&self, checksum: &Checksum) -> VmResult<(wasmer::Store, wasmer::Module)> { let mut cache = self.inner.lock().unwrap(); // Try to get module from the pinned memory cache if let Some(module) = cache.pinned_memory_cache.load(checksum)? { cache.stats.hits_pinned_memory_cache = cache.stats.hits_pinned_memory_cache.saturating_add(1); - return Ok(module); + let store = make_runtime_store(Some(cache.instance_memory_limit)); + return Ok((store, module)); } // Get module from memory cache if let Some(module) = cache.memory_cache.load(checksum)? { cache.stats.hits_memory_cache = cache.stats.hits_memory_cache.saturating_add(1); - return Ok(module.module); + let store = make_runtime_store(Some(cache.instance_memory_limit)); + return Ok((store, module.module)); } // Get module from file system cache @@ -338,7 +341,7 @@ where cache .memory_cache .store(checksum, module.clone(), module_size)?; - return Ok(module); + return Ok((store, module)); } // Re-compile module from wasm @@ -348,13 +351,13 @@ where // stored the old module format. let wasm = self.load_wasm_with_path(&cache.wasm_path, checksum)?; cache.stats.misses = cache.stats.misses.saturating_add(1); - let module = compile(&wasm, Some(cache.instance_memory_limit), &[])?; + let (store, module) = compile(&wasm, Some(cache.instance_memory_limit), &[])?; let module_size = cache.fs_cache.store(checksum, &module)?; cache .memory_cache .store(checksum, module.clone(), module_size)?; - Ok(module) + Ok((store, module)) } } diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index e9be792609..4e1bf71d6f 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -6,7 +6,7 @@ use std::rc::Rc; use std::sync::{Arc, RwLock}; use derivative::Derivative; -use wasmer::{HostEnvInitError, Instance as WasmerInstance, Memory, Val, WasmerEnv}; +use wasmer::{AsStoreMut, Instance as WasmerInstance, Memory, MemoryView, Value}; use wasmer_middlewares::metering::{get_remaining_points, set_remaining_points, MeteringPoints}; use crate::backend::{BackendApi, GasInfo, Querier, Storage}; @@ -109,6 +109,7 @@ pub type DebugHandlerFn = dyn for<'a> Fn(/* msg */ &'a str, DebugInfo<'a>); /// A environment that provides access to the ContextData. /// The environment is clonable but clones access the same underlying data. pub struct Environment { + pub memory: Option, pub api: A, pub gas_config: GasConfig, data: Arc>>, @@ -121,6 +122,7 @@ unsafe impl Sync for Environment impl Clone for Environment { fn clone(&self) -> Self { Environment { + memory: None, api: self.api, gas_config: self.gas_config.clone(), data: self.data.clone(), @@ -128,15 +130,16 @@ impl Clone for Environment { } } -impl WasmerEnv for Environment { - fn init_with_instance(&mut self, _instance: &WasmerInstance) -> Result<(), HostEnvInitError> { - Ok(()) - } -} +// impl WasmerEnv for Environment { +// fn init_with_instance(&mut self, _instance: &WasmerInstance) -> Result<(), HostEnvInitError> { +// Ok(()) +// } +// } impl Environment { pub fn new(api: A, gas_limit: u64) -> Self { Environment { + memory: None, api, gas_config: GasConfig::default(), data: Arc::new(RwLock::new(ContextData::new(gas_limit))), @@ -205,16 +208,21 @@ impl Environment { /// The number of return values is variable and controlled by the guest. /// Usually we expect 0 or 1 return values. Use [`Self::call_function0`] /// or [`Self::call_function1`] to ensure the number of return values is checked. - fn call_function(&self, name: &str, args: &[Val]) -> VmResult> { + fn call_function( + &self, + store: &mut impl AsStoreMut, + name: &str, + args: &[Value], + ) -> VmResult> { // Clone function before calling it to avoid dead locks let func = self.with_wasmer_instance(|instance| { let func = instance.exports.get_function(name)?; Ok(func.clone()) })?; self.increment_call_depth()?; - let res = func.call(args).map_err(|runtime_err| -> VmError { + let res = func.call(store, args).map_err(|runtime_err| -> VmError { self.with_wasmer_instance::<_, Never>(|instance| { - let err: VmError = match get_remaining_points(instance) { + let err: VmError = match get_remaining_points(store, instance) { MeteringPoints::Remaining(_) => VmError::from(runtime_err), MeteringPoints::Exhausted => VmError::gas_depletion(), }; @@ -226,8 +234,13 @@ impl Environment { res } - pub fn call_function0(&self, name: &str, args: &[Val]) -> VmResult<()> { - let result = self.call_function(name, args)?; + pub fn call_function0( + &self, + store: &mut impl AsStoreMut, + name: &str, + args: &[Value], + ) -> VmResult<()> { + let result = self.call_function(store, name, args)?; let expected = 0; let actual = result.len(); if actual != expected { @@ -236,8 +249,13 @@ impl Environment { Ok(()) } - pub fn call_function1(&self, name: &str, args: &[Val]) -> VmResult { - let result = self.call_function(name, args)?; + pub fn call_function1( + &self, + store: &mut impl AsStoreMut, + name: &str, + args: &[Value], + ) -> VmResult { + let result = self.call_function(store, name, args)?; let expected = 1; let actual = result.len(); if actual != expected { @@ -309,9 +327,9 @@ impl Environment { }) } - pub fn get_gas_left(&self) -> u64 { + pub fn get_gas_left(&self, store: &mut impl AsStoreMut) -> u64 { self.with_wasmer_instance(|instance| { - Ok(match get_remaining_points(instance) { + Ok(match get_remaining_points(store, instance) { MeteringPoints::Remaining(count) => count, MeteringPoints::Exhausted => 0, }) @@ -319,9 +337,9 @@ impl Environment { .expect("Wasmer instance is not set. This is a bug in the lifecycle.") } - pub fn set_gas_left(&self, new_value: u64) { + pub fn set_gas_left(&self, store: &mut impl AsStoreMut, new_value: u64) { self.with_wasmer_instance(|instance| { - set_remaining_points(instance, new_value); + set_remaining_points(store, instance, new_value); Ok(()) }) .expect("Wasmer instance is not set. This is a bug in the lifecycle.") @@ -331,39 +349,29 @@ impl Environment { /// If the amount exceeds the available gas, the remaining gas is set to 0 and /// an VmError::GasDepletion error is returned. #[allow(unused)] // used in tests - pub fn decrease_gas_left(&self, amount: u64) -> VmResult<()> { + pub fn decrease_gas_left(&self, store: &mut impl AsStoreMut, amount: u64) -> VmResult<()> { self.with_wasmer_instance(|instance| { - let remaining = match get_remaining_points(instance) { + let remaining = match get_remaining_points(store, instance) { MeteringPoints::Remaining(count) => count, MeteringPoints::Exhausted => 0, }; if amount > remaining { - set_remaining_points(instance, 0); + set_remaining_points(store, instance, 0); Err(VmError::gas_depletion()) } else { - set_remaining_points(instance, remaining - amount); + set_remaining_points(store, instance, remaining - amount); Ok(()) } }) } - pub fn memory(&self) -> Memory { - self.with_wasmer_instance(|instance| { - let first: Option = instance - .exports - .iter() - .memories() - .next() - .map(|pair| pair.1.clone()); - // Every contract in CosmWasm must have exactly one exported memory. - // This is ensured by `check_wasm`/`check_wasm_memories`, which is called for every - // contract added to the Cache as well as in integration tests. - // It is possible to bypass this check when using `Instance::from_code` but then you - // learn the hard way when this panics, or when trying to upload the contract to chain. - let memory = first.expect("A contract must have exactly one exported memory."); - Ok(memory) - }) - .expect("Wasmer instance is not set. This is a bug in the lifecycle.") + // Creates a MemoryView. + // This mut be short living and not be used after the memory was grown. + pub fn memory<'a>(&self, store: &'a mut impl AsStoreMut) -> MemoryView<'a> { + self.memory + .as_ref() + .expect("Memory is not set. This is a bug in the lifecycle.") + .view(store) } /// Moves owned instances of storage and querier into the env. @@ -411,9 +419,10 @@ impl ContextData { pub fn process_gas_info( env: &Environment, + store: &mut impl AsStoreMut, info: GasInfo, ) -> VmResult<()> { - let gas_left = env.get_gas_left(); + let gas_left = env.get_gas_left(store); let new_limit = env.with_gas_state_mut(|gas_state| { gas_state.externally_used_gas += info.externally_used; @@ -425,7 +434,7 @@ pub fn process_gas_info( }); // This tells wasmer how much more gas it can consume from this point in time. - env.set_gas_left(new_limit); + env.set_gas_left(store, new_limit); if info.externally_used + info.cost > gas_left { Err(VmError::gas_depletion()) @@ -446,7 +455,7 @@ mod tests { use cosmwasm_std::{ coins, from_binary, to_vec, AllBalanceResponse, BankQuery, Empty, QueryRequest, }; - use wasmer::{imports, Function, Instance as WasmerInstance}; + use wasmer::{imports, Function, Instance as WasmerInstance, Store}; static CONTRACT: &[u8] = include_bytes!("../testdata/hackatom.wasm"); @@ -466,39 +475,40 @@ mod tests { gas_limit: u64, ) -> ( Environment, + Store, Box, ) { let env = Environment::new(MockApi::default(), gas_limit); - let module = compile(CONTRACT, TESTING_MEMORY_LIMIT, &[]).unwrap(); - let store = module.store(); + let (mut store, module) = compile(CONTRACT, TESTING_MEMORY_LIMIT, &[]).unwrap(); + // we need stubs for all required imports let import_obj = imports! { "env" => { - "db_read" => Function::new_native(store, |_a: u32| -> u32 { 0 }), - "db_write" => Function::new_native(store, |_a: u32, _b: u32| {}), - "db_remove" => Function::new_native(store, |_a: u32| {}), - "db_scan" => Function::new_native(store, |_a: u32, _b: u32, _c: i32| -> u32 { 0 }), - "db_next" => Function::new_native(store, |_a: u32| -> u32 { 0 }), - "query_chain" => Function::new_native(store, |_a: u32| -> u32 { 0 }), - "addr_validate" => Function::new_native(store, |_a: u32| -> u32 { 0 }), - "addr_canonicalize" => Function::new_native(store, |_a: u32, _b: u32| -> u32 { 0 }), - "addr_humanize" => Function::new_native(store, |_a: u32, _b: u32| -> u32 { 0 }), - "secp256k1_verify" => Function::new_native(store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), - "secp256k1_recover_pubkey" => Function::new_native(store, |_a: u32, _b: u32, _c: u32| -> u64 { 0 }), - "ed25519_verify" => Function::new_native(store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), - "ed25519_batch_verify" => Function::new_native(store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), - "debug" => Function::new_native(store, |_a: u32| {}), - "abort" => Function::new_native(store, |_a: u32| {}), + "db_read" => Function::new_typed(&mut store, |_a: u32| -> u32 { 0 }), + "db_write" => Function::new_typed(&mut store, |_a: u32, _b: u32| {}), + "db_remove" => Function::new_typed(&mut store, |_a: u32| {}), + "db_scan" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: i32| -> u32 { 0 }), + "db_next" => Function::new_typed(&mut store, |_a: u32| -> u32 { 0 }), + "query_chain" => Function::new_typed(&mut store, |_a: u32| -> u32 { 0 }), + "addr_validate" => Function::new_typed(&mut store, |_a: u32| -> u32 { 0 }), + "addr_canonicalize" => Function::new_typed(&mut store, |_a: u32, _b: u32| -> u32 { 0 }), + "addr_humanize" => Function::new_typed(&mut store, |_a: u32, _b: u32| -> u32 { 0 }), + "secp256k1_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), + "secp256k1_recover_pubkey" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u64 { 0 }), + "ed25519_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), + "ed25519_batch_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), + "debug" => Function::new_typed(&mut store, |_a: u32| {}), + "abort" => Function::new_typed(&mut store, |_a: u32| {}), }, }; - let instance = Box::from(WasmerInstance::new(&module, &import_obj).unwrap()); + let instance = Box::from(WasmerInstance::new(&mut store, &module, &import_obj).unwrap()); let instance_ptr = NonNull::from(instance.as_ref()); env.set_wasmer_instance(Some(instance_ptr)); - env.set_gas_left(gas_limit); + env.set_gas_left(&mut store, gas_limit); - (env, instance) + (env, store, instance) } fn leave_default_data(env: &Environment) { @@ -515,7 +525,7 @@ mod tests { #[test] fn move_out_works() { - let (env, _instance) = make_instance(TESTING_GAS_LIMIT); + let (env, store, _instance) = make_instance(TESTING_GAS_LIMIT); // empty data on start let (inits, initq) = env.move_out(); @@ -540,21 +550,21 @@ mod tests { #[test] fn process_gas_info_works_for_cost() { - let (env, _instance) = make_instance(100); - assert_eq!(env.get_gas_left(), 100); + let (env, mut store, _instance) = make_instance(100); + assert_eq!(env.get_gas_left(&mut store), 100); // Consume all the Gas that we allocated - process_gas_info(&env, GasInfo::with_cost(70)).unwrap(); - assert_eq!(env.get_gas_left(), 30); - process_gas_info(&env, GasInfo::with_cost(4)).unwrap(); - assert_eq!(env.get_gas_left(), 26); - process_gas_info(&env, GasInfo::with_cost(6)).unwrap(); - assert_eq!(env.get_gas_left(), 20); - process_gas_info(&env, GasInfo::with_cost(20)).unwrap(); - assert_eq!(env.get_gas_left(), 0); + process_gas_info(&env, &mut store, GasInfo::with_cost(70)).unwrap(); + assert_eq!(env.get_gas_left(&mut store), 30); + process_gas_info(&env, &mut store, GasInfo::with_cost(4)).unwrap(); + assert_eq!(env.get_gas_left(&mut store), 26); + process_gas_info(&env, &mut store, GasInfo::with_cost(6)).unwrap(); + assert_eq!(env.get_gas_left(&mut store), 20); + process_gas_info(&env, &mut store, GasInfo::with_cost(20)).unwrap(); + assert_eq!(env.get_gas_left(&mut store), 0); // Using one more unit of gas triggers a failure - match process_gas_info(&env, GasInfo::with_cost(1)).unwrap_err() { + match process_gas_info(&env, &mut store, GasInfo::with_cost(1)).unwrap_err() { VmError::GasDepletion { .. } => {} err => panic!("unexpected error: {:?}", err), } @@ -562,21 +572,21 @@ mod tests { #[test] fn process_gas_info_works_for_externally_used() { - let (env, _instance) = make_instance(100); - assert_eq!(env.get_gas_left(), 100); + let (env, mut store, _instance) = make_instance(100); + assert_eq!(env.get_gas_left(&mut store), 100); // Consume all the Gas that we allocated - process_gas_info(&env, GasInfo::with_externally_used(70)).unwrap(); - assert_eq!(env.get_gas_left(), 30); - process_gas_info(&env, GasInfo::with_externally_used(4)).unwrap(); - assert_eq!(env.get_gas_left(), 26); - process_gas_info(&env, GasInfo::with_externally_used(6)).unwrap(); - assert_eq!(env.get_gas_left(), 20); - process_gas_info(&env, GasInfo::with_externally_used(20)).unwrap(); - assert_eq!(env.get_gas_left(), 0); + process_gas_info(&env, &mut store, GasInfo::with_externally_used(70)).unwrap(); + assert_eq!(env.get_gas_left(&mut store), 30); + process_gas_info(&env, &mut store, GasInfo::with_externally_used(4)).unwrap(); + assert_eq!(env.get_gas_left(&mut store), 26); + process_gas_info(&env, &mut store, GasInfo::with_externally_used(6)).unwrap(); + assert_eq!(env.get_gas_left(&mut store), 20); + process_gas_info(&env, &mut store, GasInfo::with_externally_used(20)).unwrap(); + assert_eq!(env.get_gas_left(&mut store), 0); // Using one more unit of gas triggers a failure - match process_gas_info(&env, GasInfo::with_externally_used(1)).unwrap_err() { + match process_gas_info(&env, &mut store, GasInfo::with_externally_used(1)).unwrap_err() { VmError::GasDepletion { .. } => {} err => panic!("unexpected error: {:?}", err), } @@ -584,46 +594,46 @@ mod tests { #[test] fn process_gas_info_works_for_cost_and_externally_used() { - let (env, _instance) = make_instance(100); - assert_eq!(env.get_gas_left(), 100); + let (env, mut store, _instance) = make_instance(100); + assert_eq!(env.get_gas_left(&mut store), 100); let gas_state = env.with_gas_state(|gas_state| gas_state.clone()); assert_eq!(gas_state.gas_limit, 100); assert_eq!(gas_state.externally_used_gas, 0); - process_gas_info(&env, GasInfo::new(17, 4)).unwrap(); - assert_eq!(env.get_gas_left(), 79); + process_gas_info(&env, &mut store, GasInfo::new(17, 4)).unwrap(); + assert_eq!(env.get_gas_left(&mut store), 79); let gas_state = env.with_gas_state(|gas_state| gas_state.clone()); assert_eq!(gas_state.gas_limit, 100); assert_eq!(gas_state.externally_used_gas, 4); - process_gas_info(&env, GasInfo::new(9, 0)).unwrap(); - assert_eq!(env.get_gas_left(), 70); + process_gas_info(&env, &mut store, GasInfo::new(9, 0)).unwrap(); + assert_eq!(env.get_gas_left(&mut store), 70); let gas_state = env.with_gas_state(|gas_state| gas_state.clone()); assert_eq!(gas_state.gas_limit, 100); assert_eq!(gas_state.externally_used_gas, 4); - process_gas_info(&env, GasInfo::new(0, 70)).unwrap(); - assert_eq!(env.get_gas_left(), 0); + process_gas_info(&env, &mut store, GasInfo::new(0, 70)).unwrap(); + assert_eq!(env.get_gas_left(&mut store), 0); let gas_state = env.with_gas_state(|gas_state| gas_state.clone()); assert_eq!(gas_state.gas_limit, 100); assert_eq!(gas_state.externally_used_gas, 74); // More cost fail but do not change stats - match process_gas_info(&env, GasInfo::new(1, 0)).unwrap_err() { + match process_gas_info(&env, &mut store, GasInfo::new(1, 0)).unwrap_err() { VmError::GasDepletion { .. } => {} err => panic!("unexpected error: {:?}", err), } - assert_eq!(env.get_gas_left(), 0); + assert_eq!(env.get_gas_left(&mut store), 0); let gas_state = env.with_gas_state(|gas_state| gas_state.clone()); assert_eq!(gas_state.gas_limit, 100); assert_eq!(gas_state.externally_used_gas, 74); // More externally used fails and changes stats - match process_gas_info(&env, GasInfo::new(0, 1)).unwrap_err() { + match process_gas_info(&env, &mut store, GasInfo::new(0, 1)).unwrap_err() { VmError::GasDepletion { .. } => {} err => panic!("unexpected error: {:?}", err), } - assert_eq!(env.get_gas_left(), 0); + assert_eq!(env.get_gas_left(&mut store), 0); let gas_state = env.with_gas_state(|gas_state| gas_state.clone()); assert_eq!(gas_state.gas_limit, 100); assert_eq!(gas_state.externally_used_gas, 75); @@ -633,13 +643,13 @@ mod tests { fn process_gas_info_zeros_gas_left_when_exceeded() { // with_externally_used { - let (env, _instance) = make_instance(100); - let result = process_gas_info(&env, GasInfo::with_externally_used(120)); + let (env, mut store, _instance) = make_instance(100); + let result = process_gas_info(&env, &mut store, GasInfo::with_externally_used(120)); match result.unwrap_err() { VmError::GasDepletion { .. } => {} err => panic!("unexpected error: {:?}", err), } - assert_eq!(env.get_gas_left(), 0); + assert_eq!(env.get_gas_left(&mut store), 0); let gas_state = env.with_gas_state(|gas_state| gas_state.clone()); assert_eq!(gas_state.gas_limit, 100); assert_eq!(gas_state.externally_used_gas, 120); @@ -647,13 +657,13 @@ mod tests { // with_cost { - let (env, _instance) = make_instance(100); - let result = process_gas_info(&env, GasInfo::with_cost(120)); + let (env, mut store, _instance) = make_instance(100); + let result = process_gas_info(&env, &mut store, GasInfo::with_cost(120)); match result.unwrap_err() { VmError::GasDepletion { .. } => {} err => panic!("unexpected error: {:?}", err), } - assert_eq!(env.get_gas_left(), 0); + assert_eq!(env.get_gas_left(&mut store), 0); let gas_state = env.with_gas_state(|gas_state| gas_state.clone()); assert_eq!(gas_state.gas_limit, 100); assert_eq!(gas_state.externally_used_gas, 0); @@ -662,26 +672,26 @@ mod tests { #[test] fn process_gas_info_works_correctly_with_gas_consumption_in_wasmer() { - let (env, _instance) = make_instance(100); - assert_eq!(env.get_gas_left(), 100); + let (env, mut store, _instance) = make_instance(100); + assert_eq!(env.get_gas_left(&mut store), 100); // Some gas was consumed externally - process_gas_info(&env, GasInfo::with_externally_used(50)).unwrap(); - assert_eq!(env.get_gas_left(), 50); - process_gas_info(&env, GasInfo::with_externally_used(4)).unwrap(); - assert_eq!(env.get_gas_left(), 46); + process_gas_info(&env, &mut store, GasInfo::with_externally_used(50)).unwrap(); + assert_eq!(env.get_gas_left(&mut store), 50); + process_gas_info(&env, &mut store, GasInfo::with_externally_used(4)).unwrap(); + assert_eq!(env.get_gas_left(&mut store), 46); // Consume 20 gas directly in wasmer - env.decrease_gas_left(20).unwrap(); - assert_eq!(env.get_gas_left(), 26); + env.decrease_gas_left(&mut store, 20).unwrap(); + assert_eq!(env.get_gas_left(&mut store), 26); - process_gas_info(&env, GasInfo::with_externally_used(6)).unwrap(); - assert_eq!(env.get_gas_left(), 20); - process_gas_info(&env, GasInfo::with_externally_used(20)).unwrap(); - assert_eq!(env.get_gas_left(), 0); + process_gas_info(&env, &mut store, GasInfo::with_externally_used(6)).unwrap(); + assert_eq!(env.get_gas_left(&mut store), 20); + process_gas_info(&env, &mut store, GasInfo::with_externally_used(20)).unwrap(); + assert_eq!(env.get_gas_left(&mut store), 0); // Using one more unit of gas triggers a failure - match process_gas_info(&env, GasInfo::with_externally_used(1)).unwrap_err() { + match process_gas_info(&env, &mut store, GasInfo::with_externally_used(1)).unwrap_err() { VmError::GasDepletion { .. } => {} err => panic!("unexpected error: {:?}", err), } @@ -689,7 +699,7 @@ mod tests { #[test] fn is_storage_readonly_defaults_to_true() { - let (env, _instance) = make_instance(TESTING_GAS_LIMIT); + let (env, store, _instance) = make_instance(TESTING_GAS_LIMIT); leave_default_data(&env); assert!(env.is_storage_readonly()); @@ -697,7 +707,7 @@ mod tests { #[test] fn set_storage_readonly_can_change_flag() { - let (env, _instance) = make_instance(TESTING_GAS_LIMIT); + let (env, store, _instance) = make_instance(TESTING_GAS_LIMIT); leave_default_data(&env); // change @@ -715,23 +725,25 @@ mod tests { #[test] fn call_function_works() { - let (env, _instance) = make_instance(TESTING_GAS_LIMIT); + let (env, mut store, _instance) = make_instance(TESTING_GAS_LIMIT); leave_default_data(&env); - let result = env.call_function("allocate", &[10u32.into()]).unwrap(); + let result = env + .call_function(&mut store, "allocate", &[10u32.into()]) + .unwrap(); let ptr = ref_to_u32(&result[0]).unwrap(); assert!(ptr > 0); } #[test] fn call_function_fails_for_missing_instance() { - let (env, _instance) = make_instance(TESTING_GAS_LIMIT); + let (env, mut store, _instance) = make_instance(TESTING_GAS_LIMIT); leave_default_data(&env); // Clear context's wasmer_instance env.set_wasmer_instance(None); - let res = env.call_function("allocate", &[]); + let res = env.call_function(&mut store, "allocate", &[]); match res.unwrap_err() { VmError::UninitializedContextData { kind, .. } => assert_eq!(kind, "wasmer_instance"), err => panic!("Unexpected error: {:?}", err), @@ -740,10 +752,10 @@ mod tests { #[test] fn call_function_fails_for_missing_function() { - let (env, _instance) = make_instance(TESTING_GAS_LIMIT); + let (env, mut store, _instance) = make_instance(TESTING_GAS_LIMIT); leave_default_data(&env); - let res = env.call_function("doesnt_exist", &[]); + let res = env.call_function(&mut store, "doesnt_exist", &[]); match res.unwrap_err() { VmError::ResolveErr { msg, .. } => { assert_eq!(msg, "Could not get export: Missing export doesnt_exist"); @@ -754,18 +766,19 @@ mod tests { #[test] fn call_function0_works() { - let (env, _instance) = make_instance(TESTING_GAS_LIMIT); + let (env, mut store, _instance) = make_instance(TESTING_GAS_LIMIT); leave_default_data(&env); - env.call_function0("interface_version_8", &[]).unwrap(); + env.call_function0(&mut store, "interface_version_8", &[]) + .unwrap(); } #[test] fn call_function0_errors_for_wrong_result_count() { - let (env, _instance) = make_instance(TESTING_GAS_LIMIT); + let (env, mut store, _instance) = make_instance(TESTING_GAS_LIMIT); leave_default_data(&env); - let result = env.call_function0("allocate", &[10u32.into()]); + let result = env.call_function0(&mut store, "allocate", &[10u32.into()]); match result.unwrap_err() { VmError::ResultMismatch { function_name, @@ -783,24 +796,28 @@ mod tests { #[test] fn call_function1_works() { - let (env, _instance) = make_instance(TESTING_GAS_LIMIT); + let (env, mut store, _instance) = make_instance(TESTING_GAS_LIMIT); leave_default_data(&env); - let result = env.call_function1("allocate", &[10u32.into()]).unwrap(); + let result = env + .call_function1(&mut store, "allocate", &[10u32.into()]) + .unwrap(); let ptr = ref_to_u32(&result).unwrap(); assert!(ptr > 0); } #[test] fn call_function1_errors_for_wrong_result_count() { - let (env, _instance) = make_instance(TESTING_GAS_LIMIT); + let (env, mut store, _instance) = make_instance(TESTING_GAS_LIMIT); leave_default_data(&env); - let result = env.call_function1("allocate", &[10u32.into()]).unwrap(); + let result = env + .call_function1(&mut store, "allocate", &[10u32.into()]) + .unwrap(); let ptr = ref_to_u32(&result).unwrap(); assert!(ptr > 0); - let result = env.call_function1("deallocate", &[ptr.into()]); + let result = env.call_function1(&mut store, "deallocate", &[ptr.into()]); match result.unwrap_err() { VmError::ResultMismatch { function_name, @@ -818,7 +835,7 @@ mod tests { #[test] fn with_storage_from_context_set_get() { - let (env, _instance) = make_instance(TESTING_GAS_LIMIT); + let (env, store, _instance) = make_instance(TESTING_GAS_LIMIT); leave_default_data(&env); let val = env @@ -851,7 +868,7 @@ mod tests { #[test] #[should_panic(expected = "A panic occurred in the callback.")] fn with_storage_from_context_handles_panics() { - let (env, _instance) = make_instance(TESTING_GAS_LIMIT); + let (env, store, _instance) = make_instance(TESTING_GAS_LIMIT); leave_default_data(&env); env.with_storage_from_context::<_, ()>(|_store| { @@ -862,7 +879,7 @@ mod tests { #[test] fn with_querier_from_context_works() { - let (env, _instance) = make_instance(TESTING_GAS_LIMIT); + let (env, store, _instance) = make_instance(TESTING_GAS_LIMIT); leave_default_data(&env); let res = env @@ -885,7 +902,7 @@ mod tests { #[test] #[should_panic(expected = "A panic occurred in the callback.")] fn with_querier_from_context_handles_panics() { - let (env, _instance) = make_instance(TESTING_GAS_LIMIT); + let (env, store, _instance) = make_instance(TESTING_GAS_LIMIT); leave_default_data(&env); env.with_querier_from_context::<_, ()>(|_querier| { diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 91e35f59b8..0bd03076df 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -12,6 +12,7 @@ use cosmwasm_crypto::{ #[cfg(feature = "iterator")] use cosmwasm_std::Order; +use wasmer::{AsStoreMut, FunctionEnvMut}; use crate::backend::{BackendApi, BackendError, Querier, Storage}; use crate::conversion::{ref_to_u32, to_u32}; @@ -66,149 +67,185 @@ const MAX_LENGTH_ABORT: usize = 2 * MI; // through the env. /// Reads a storage entry from the VM's storage into Wasm memory -pub fn do_db_read( - env: &Environment, +pub fn do_db_read( + mut env: FunctionEnvMut>, key_ptr: u32, ) -> VmResult { - let key = read_region(&env.memory(), key_ptr, MAX_LENGTH_DB_KEY)?; + let (data, mut store) = env.data_and_store_mut(); - let (result, gas_info) = env.with_storage_from_context::<_, _>(|store| Ok(store.get(&key)))?; - process_gas_info::(env, gas_info)?; + let key = read_region(&data.memory(&mut store), key_ptr, MAX_LENGTH_DB_KEY)?; + + let (result, gas_info) = data.with_storage_from_context::<_, _>(|store| Ok(store.get(&key)))?; + process_gas_info(data, &mut store, gas_info)?; let value = result?; let out_data = match value { Some(data) => data, None => return Ok(0), }; - write_to_contract::(env, &out_data) + write_to_contract::(data, &mut store, &out_data) } /// Writes a storage entry from Wasm memory into the VM's storage -pub fn do_db_write( - env: &Environment, +pub fn do_db_write( + mut env: FunctionEnvMut>, key_ptr: u32, value_ptr: u32, ) -> VmResult<()> { - if env.is_storage_readonly() { + let (data, mut store) = env.data_and_store_mut(); + + if data.is_storage_readonly() { return Err(VmError::write_access_denied()); } - let key = read_region(&env.memory(), key_ptr, MAX_LENGTH_DB_KEY)?; - let value = read_region(&env.memory(), value_ptr, MAX_LENGTH_DB_VALUE)?; + let key = read_region(&data.memory(&mut store), key_ptr, MAX_LENGTH_DB_KEY)?; + let value = read_region(&data.memory(&mut store), value_ptr, MAX_LENGTH_DB_VALUE)?; let (result, gas_info) = - env.with_storage_from_context::<_, _>(|store| Ok(store.set(&key, &value)))?; - process_gas_info::(env, gas_info)?; + data.with_storage_from_context::<_, _>(|store| Ok(store.set(&key, &value)))?; + process_gas_info(data, &mut store, gas_info)?; result?; Ok(()) } -pub fn do_db_remove( - env: &Environment, +pub fn do_db_remove( + mut env: FunctionEnvMut>, key_ptr: u32, ) -> VmResult<()> { - if env.is_storage_readonly() { + let (data, mut store) = env.data_and_store_mut(); + + if data.is_storage_readonly() { return Err(VmError::write_access_denied()); } - let key = read_region(&env.memory(), key_ptr, MAX_LENGTH_DB_KEY)?; + let key = read_region(&data.memory(&mut store), key_ptr, MAX_LENGTH_DB_KEY)?; let (result, gas_info) = - env.with_storage_from_context::<_, _>(|store| Ok(store.remove(&key)))?; - process_gas_info(env, gas_info)?; + data.with_storage_from_context::<_, _>(|store| Ok(store.remove(&key)))?; + process_gas_info(data, &mut store, gas_info)?; result?; Ok(()) } -pub fn do_addr_validate( - env: &Environment, +pub fn do_addr_validate( + mut env: FunctionEnvMut>, source_ptr: u32, ) -> VmResult { - let source_data = read_region(&env.memory(), source_ptr, MAX_LENGTH_HUMAN_ADDRESS)?; + let (data, mut store) = env.data_and_store_mut(); + + let source_data = read_region( + &data.memory(&mut store), + source_ptr, + MAX_LENGTH_HUMAN_ADDRESS, + )?; if source_data.is_empty() { - return write_to_contract::(env, b"Input is empty"); + return write_to_contract::(data, &mut store, b"Input is empty"); } let source_string = match String::from_utf8(source_data) { Ok(s) => s, - Err(_) => return write_to_contract::(env, b"Input is not valid UTF-8"), + Err(_) => { + return write_to_contract::(data, &mut store, b"Input is not valid UTF-8") + } }; - let (result, gas_info) = env.api.canonical_address(&source_string); - process_gas_info::(env, gas_info)?; + let (result, gas_info) = data.api.canonical_address(&source_string); + process_gas_info(data, &mut store, gas_info)?; let canonical = match result { Ok(data) => data, Err(BackendError::UserErr { msg, .. }) => { - return write_to_contract::(env, msg.as_bytes()) + return write_to_contract::(data, &mut store, msg.as_bytes()) } Err(err) => return Err(VmError::from(err)), }; - let (result, gas_info) = env.api.human_address(&canonical); - process_gas_info::(env, gas_info)?; + let (result, gas_info) = data.api.human_address(&canonical); + process_gas_info(data, &mut store, gas_info)?; let normalized = match result { Ok(addr) => addr, Err(BackendError::UserErr { msg, .. }) => { - return write_to_contract::(env, msg.as_bytes()) + return write_to_contract::(data, &mut store, msg.as_bytes()) } Err(err) => return Err(VmError::from(err)), }; if normalized != source_string { - return write_to_contract::(env, b"Address is not normalized"); + return write_to_contract::(data, &mut store, b"Address is not normalized"); } Ok(0) } -pub fn do_addr_canonicalize( - env: &Environment, +pub fn do_addr_canonicalize( + mut env: FunctionEnvMut>, source_ptr: u32, destination_ptr: u32, ) -> VmResult { - let source_data = read_region(&env.memory(), source_ptr, MAX_LENGTH_HUMAN_ADDRESS)?; + let (data, mut store) = env.data_and_store_mut(); + + let source_data = read_region( + &data.memory(&mut store), + source_ptr, + MAX_LENGTH_HUMAN_ADDRESS, + )?; if source_data.is_empty() { - return write_to_contract::(env, b"Input is empty"); + return write_to_contract::(data, &mut store, b"Input is empty"); } let source_string = match String::from_utf8(source_data) { Ok(s) => s, - Err(_) => return write_to_contract::(env, b"Input is not valid UTF-8"), + Err(_) => { + return write_to_contract::(data, &mut store, b"Input is not valid UTF-8") + } }; - let (result, gas_info) = env.api.canonical_address(&source_string); - process_gas_info::(env, gas_info)?; + let (result, gas_info) = data.api.canonical_address(&source_string); + process_gas_info(data, &mut store, gas_info)?; match result { Ok(canonical) => { - write_region(&env.memory(), destination_ptr, canonical.as_slice())?; + write_region( + &data.memory(&mut store), + destination_ptr, + canonical.as_slice(), + )?; Ok(0) } - Err(BackendError::UserErr { msg, .. }) => { - Ok(write_to_contract::(env, msg.as_bytes())?) - } + Err(BackendError::UserErr { msg, .. }) => Ok(write_to_contract::( + data, + &mut store, + msg.as_bytes(), + )?), Err(err) => Err(VmError::from(err)), } } -pub fn do_addr_humanize( - env: &Environment, +pub fn do_addr_humanize( + mut env: FunctionEnvMut>, source_ptr: u32, destination_ptr: u32, ) -> VmResult { - let canonical = read_region(&env.memory(), source_ptr, MAX_LENGTH_CANONICAL_ADDRESS)?; + let (data, mut store) = env.data_and_store_mut(); + + let canonical = read_region( + &data.memory(&mut store), + source_ptr, + MAX_LENGTH_CANONICAL_ADDRESS, + )?; - let (result, gas_info) = env.api.human_address(&canonical); - process_gas_info::(env, gas_info)?; + let (result, gas_info) = data.api.human_address(&canonical); + process_gas_info(data, &mut store, gas_info)?; match result { Ok(human) => { - write_region(&env.memory(), destination_ptr, human.as_bytes())?; + write_region(&data.memory(&mut store), destination_ptr, human.as_bytes())?; Ok(0) } - Err(BackendError::UserErr { msg, .. }) => { - Ok(write_to_contract::(env, msg.as_bytes())?) - } + Err(BackendError::UserErr { msg, .. }) => Ok(write_to_contract::( + data, + &mut store, + msg.as_bytes(), + )?), Err(err) => Err(VmError::from(err)), } } @@ -219,18 +256,20 @@ const SECP256K1_VERIFY_CODE_VALID: u32 = 0; /// Return code (error code) for an invalid signature const SECP256K1_VERIFY_CODE_INVALID: u32 = 1; -pub fn do_secp256k1_verify( - env: &Environment, +pub fn do_secp256k1_verify( + mut env: FunctionEnvMut>, hash_ptr: u32, signature_ptr: u32, pubkey_ptr: u32, ) -> VmResult { - let hash = read_region(&env.memory(), hash_ptr, MESSAGE_HASH_MAX_LEN)?; - let signature = read_region(&env.memory(), signature_ptr, ECDSA_SIGNATURE_LEN)?; - let pubkey = read_region(&env.memory(), pubkey_ptr, ECDSA_PUBKEY_MAX_LEN)?; + let (data, mut store) = env.data_and_store_mut(); - let gas_info = GasInfo::with_cost(env.gas_config.secp256k1_verify_cost); - process_gas_info::(env, gas_info)?; + let hash = read_region(&data.memory(&mut store), hash_ptr, MESSAGE_HASH_MAX_LEN)?; + let signature = read_region(&data.memory(&mut store), signature_ptr, ECDSA_SIGNATURE_LEN)?; + let pubkey = read_region(&data.memory(&mut store), pubkey_ptr, ECDSA_PUBKEY_MAX_LEN)?; + + let gas_info = GasInfo::with_cost(data.gas_config.secp256k1_verify_cost); + process_gas_info(data, &mut store, gas_info)?; let result = secp256k1_verify(&hash, &signature, &pubkey); let code = match result { Ok(valid) => { @@ -253,25 +292,31 @@ pub fn do_secp256k1_verify( Ok(code) } -pub fn do_secp256k1_recover_pubkey( - env: &Environment, +pub fn do_secp256k1_recover_pubkey< + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, +>( + mut env: FunctionEnvMut>, hash_ptr: u32, signature_ptr: u32, recover_param: u32, ) -> VmResult { - let hash = read_region(&env.memory(), hash_ptr, MESSAGE_HASH_MAX_LEN)?; - let signature = read_region(&env.memory(), signature_ptr, ECDSA_SIGNATURE_LEN)?; + let (data, mut store) = env.data_and_store_mut(); + + let hash = read_region(&data.memory(&mut store), hash_ptr, MESSAGE_HASH_MAX_LEN)?; + let signature = read_region(&data.memory(&mut store), signature_ptr, ECDSA_SIGNATURE_LEN)?; let recover_param: u8 = match recover_param.try_into() { Ok(rp) => rp, Err(_) => return Ok((CryptoError::invalid_recovery_param().code() as u64) << 32), }; - let gas_info = GasInfo::with_cost(env.gas_config.secp256k1_recover_pubkey_cost); - process_gas_info::(env, gas_info)?; + let gas_info = GasInfo::with_cost(data.gas_config.secp256k1_recover_pubkey_cost); + process_gas_info(data, &mut store, gas_info)?; let result = secp256k1_recover_pubkey(&hash, &signature, recover_param); match result { Ok(pubkey) => { - let pubkey_ptr = write_to_contract::(env, pubkey.as_ref())?; + let pubkey_ptr = write_to_contract::(data, &mut store, pubkey.as_ref())?; Ok(to_low_half(pubkey_ptr)) } Err(err) => match err { @@ -292,18 +337,28 @@ const ED25519_VERIFY_CODE_VALID: u32 = 0; /// Return code (error code) for an invalid signature const ED25519_VERIFY_CODE_INVALID: u32 = 1; -pub fn do_ed25519_verify( - env: &Environment, +pub fn do_ed25519_verify( + mut env: FunctionEnvMut>, message_ptr: u32, signature_ptr: u32, pubkey_ptr: u32, ) -> VmResult { - let message = read_region(&env.memory(), message_ptr, MAX_LENGTH_ED25519_MESSAGE)?; - let signature = read_region(&env.memory(), signature_ptr, MAX_LENGTH_ED25519_SIGNATURE)?; - let pubkey = read_region(&env.memory(), pubkey_ptr, EDDSA_PUBKEY_LEN)?; + let (data, mut store) = env.data_and_store_mut(); + + let message = read_region( + &data.memory(&mut store), + message_ptr, + MAX_LENGTH_ED25519_MESSAGE, + )?; + let signature = read_region( + &data.memory(&mut store), + signature_ptr, + MAX_LENGTH_ED25519_SIGNATURE, + )?; + let pubkey = read_region(&data.memory(&mut store), pubkey_ptr, EDDSA_PUBKEY_LEN)?; - let gas_info = GasInfo::with_cost(env.gas_config.ed25519_verify_cost); - process_gas_info::(env, gas_info)?; + let gas_info = GasInfo::with_cost(data.gas_config.ed25519_verify_cost); + process_gas_info(data, &mut store, gas_info)?; let result = ed25519_verify(&message, &signature, &pubkey); let code = match result { Ok(valid) => { @@ -327,24 +382,30 @@ pub fn do_ed25519_verify( Ok(code) } -pub fn do_ed25519_batch_verify( - env: &Environment, +pub fn do_ed25519_batch_verify< + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, +>( + mut env: FunctionEnvMut>, messages_ptr: u32, signatures_ptr: u32, public_keys_ptr: u32, ) -> VmResult { + let (data, mut store) = env.data_and_store_mut(); + let messages = read_region( - &env.memory(), + &data.memory(&mut store), messages_ptr, (MAX_LENGTH_ED25519_MESSAGE + 4) * MAX_COUNT_ED25519_BATCH, )?; let signatures = read_region( - &env.memory(), + &data.memory(&mut store), signatures_ptr, (MAX_LENGTH_ED25519_SIGNATURE + 4) * MAX_COUNT_ED25519_BATCH, )?; let public_keys = read_region( - &env.memory(), + &data.memory(&mut store), public_keys_ptr, (EDDSA_PUBKEY_LEN + 4) * MAX_COUNT_ED25519_BATCH, )?; @@ -354,12 +415,12 @@ pub fn do_ed25519_batch_verify( let public_keys = decode_sections(&public_keys); let gas_cost = if public_keys.len() == 1 { - env.gas_config.ed25519_batch_verify_one_pubkey_cost + data.gas_config.ed25519_batch_verify_one_pubkey_cost } else { - env.gas_config.ed25519_batch_verify_cost + data.gas_config.ed25519_batch_verify_cost } * signatures.len() as u64; - let gas_info = GasInfo::with_cost(max(gas_cost, env.gas_config.ed25519_verify_cost)); - process_gas_info::(env, gas_info)?; + let gas_info = GasInfo::with_cost(max(gas_cost, data.gas_config.ed25519_verify_cost)); + process_gas_info(data, &mut store, gas_info)?; let result = ed25519_batch_verify(&messages, &signatures, &public_keys); let code = match result { Ok(valid) => { @@ -384,14 +445,16 @@ pub fn do_ed25519_batch_verify( /// Prints a debug message to console. /// This does not charge gas, so debug printing should be disabled when used in a blockchain module. -pub fn do_debug( - env: &Environment, +pub fn do_debug( + mut env: FunctionEnvMut>, message_ptr: u32, ) -> VmResult<()> { - if let Some(debug_handler) = env.debug_handler() { - let message_data = read_region(&env.memory(), message_ptr, MAX_LENGTH_DEBUG)?; + let (data, mut store) = env.data_and_store_mut(); + + if let Some(debug_handler) = data.debug_handler() { + let message_data = read_region(&data.memory(&mut store), message_ptr, MAX_LENGTH_DEBUG)?; let msg = String::from_utf8_lossy(&message_data); - let gas_remaining = env.get_gas_left(); + let gas_remaining = data.get_gas_left(&mut store); (*debug_handler)( &msg, DebugInfo { @@ -404,80 +467,94 @@ pub fn do_debug( } /// Aborts the contract and shows the given error message -pub fn do_abort( - env: &Environment, +pub fn do_abort( + mut env: FunctionEnvMut>, message_ptr: u32, ) -> VmResult<()> { - let message_data = read_region(&env.memory(), message_ptr, MAX_LENGTH_ABORT)?; + let (data, mut store) = env.data_and_store_mut(); + + let message_data = read_region(&data.memory(&mut store), message_ptr, MAX_LENGTH_ABORT)?; let msg = String::from_utf8_lossy(&message_data); Err(VmError::aborted(msg)) } -/// Creates a Region in the contract, writes the given data to it and returns the memory location -fn write_to_contract( - env: &Environment, - input: &[u8], -) -> VmResult { - let out_size = to_u32(input.len())?; - let result = env.call_function1("allocate", &[out_size.into()])?; - let target_ptr = ref_to_u32(&result)?; - if target_ptr == 0 { - return Err(CommunicationError::zero_address().into()); - } - write_region(&env.memory(), target_ptr, input)?; - Ok(target_ptr) -} - -pub fn do_query_chain( - env: &Environment, +pub fn do_query_chain( + mut env: FunctionEnvMut>, request_ptr: u32, ) -> VmResult { - let request = read_region(&env.memory(), request_ptr, MAX_LENGTH_QUERY_CHAIN_REQUEST)?; + let (data, mut store) = env.data_and_store_mut(); - let gas_remaining = env.get_gas_left(); - let (result, gas_info) = env.with_querier_from_context::<_, _>(|querier| { + let request = read_region( + &data.memory(&mut store), + request_ptr, + MAX_LENGTH_QUERY_CHAIN_REQUEST, + )?; + + let gas_remaining = data.get_gas_left(&mut store); + let (result, gas_info) = data.with_querier_from_context::<_, _>(|querier| { Ok(querier.query_raw(&request, gas_remaining)) })?; - process_gas_info::(env, gas_info)?; + process_gas_info(data, &mut store, gas_info)?; let serialized = to_vec(&result?)?; - write_to_contract::(env, &serialized) + write_to_contract::(data, &mut store, &serialized) } #[cfg(feature = "iterator")] -pub fn do_db_scan( - env: &Environment, +pub fn do_db_scan( + mut env: FunctionEnvMut>, start_ptr: u32, end_ptr: u32, order: i32, ) -> VmResult { - let start = maybe_read_region(&env.memory(), start_ptr, MAX_LENGTH_DB_KEY)?; - let end = maybe_read_region(&env.memory(), end_ptr, MAX_LENGTH_DB_KEY)?; + let (data, mut store) = env.data_and_store_mut(); + + let start = maybe_read_region(&data.memory(&mut store), start_ptr, MAX_LENGTH_DB_KEY)?; + let end = maybe_read_region(&data.memory(&mut store), end_ptr, MAX_LENGTH_DB_KEY)?; let order: Order = order .try_into() .map_err(|_| CommunicationError::invalid_order(order))?; - let (result, gas_info) = env.with_storage_from_context::<_, _>(|store| { + let (result, gas_info) = data.with_storage_from_context::<_, _>(|store| { Ok(store.scan(start.as_deref(), end.as_deref(), order)) })?; - process_gas_info::(env, gas_info)?; + process_gas_info(data, &mut store, gas_info)?; let iterator_id = result?; Ok(iterator_id) } #[cfg(feature = "iterator")] -pub fn do_db_next( - env: &Environment, +pub fn do_db_next( + mut env: FunctionEnvMut>, iterator_id: u32, ) -> VmResult { + let (data, mut store) = env.data_and_store_mut(); + let (result, gas_info) = - env.with_storage_from_context::<_, _>(|store| Ok(store.next(iterator_id)))?; - process_gas_info::(env, gas_info)?; + data.with_storage_from_context::<_, _>(|store| Ok(store.next(iterator_id)))?; + + process_gas_info(data, &mut store, gas_info)?; // Empty key will later be treated as _no more element_. let (key, value) = result?.unwrap_or_else(|| (Vec::::new(), Vec::::new())); let out_data = encode_sections(&[key, value])?; - write_to_contract::(env, &out_data) + write_to_contract::(data, &mut store, &out_data) +} + +/// Creates a Region in the contract, writes the given data to it and returns the memory location +fn write_to_contract( + data: &Environment, + store: &mut impl AsStoreMut, + input: &[u8], +) -> VmResult { + let out_size = to_u32(input.len())?; + let result = data.call_function1(store, "allocate", &[out_size.into()])?; + let target_ptr = ref_to_u32(&result)?; + if target_ptr == 0 { + return Err(CommunicationError::zero_address().into()); + } + write_region(&data.memory(store), target_ptr, input)?; + Ok(target_ptr) } /// Returns the data shifted by 32 bits towards the most significant bit. @@ -509,7 +586,7 @@ mod tests { }; use hex_literal::hex; use std::ptr::NonNull; - use wasmer::{imports, Function, Instance as WasmerInstance}; + use wasmer::{imports, Function, FunctionEnv, Instance as WasmerInstance, Store}; use crate::backend::{BackendError, Storage}; use crate::size::Size; @@ -544,42 +621,59 @@ mod tests { fn make_instance( api: MockApi, ) -> ( - Environment, + FunctionEnv>, + Store, Box, ) { let gas_limit = TESTING_GAS_LIMIT; let env = Environment::new(api, gas_limit); - let module = compile(CONTRACT, TESTING_MEMORY_LIMIT, &[]).unwrap(); - let store = module.store(); + let (mut store, module) = compile(CONTRACT, TESTING_MEMORY_LIMIT, &[]).unwrap(); + + let fe = FunctionEnv::new(&mut store, env); + // we need stubs for all required imports let import_obj = imports! { "env" => { - "db_read" => Function::new_native(store, |_a: u32| -> u32 { 0 }), - "db_write" => Function::new_native(store, |_a: u32, _b: u32| {}), - "db_remove" => Function::new_native(store, |_a: u32| {}), - "db_scan" => Function::new_native(store, |_a: u32, _b: u32, _c: i32| -> u32 { 0 }), - "db_next" => Function::new_native(store, |_a: u32| -> u32 { 0 }), - "query_chain" => Function::new_native(store, |_a: u32| -> u32 { 0 }), - "addr_validate" => Function::new_native(store, |_a: u32| -> u32 { 0 }), - "addr_canonicalize" => Function::new_native(store, |_a: u32, _b: u32| -> u32 { 0 }), - "addr_humanize" => Function::new_native(store, |_a: u32, _b: u32| -> u32 { 0 }), - "secp256k1_verify" => Function::new_native(store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), - "secp256k1_recover_pubkey" => Function::new_native(store, |_a: u32, _b: u32, _c: u32| -> u64 { 0 }), - "ed25519_verify" => Function::new_native(store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), - "ed25519_batch_verify" => Function::new_native(store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), - "debug" => Function::new_native(store, |_a: u32| {}), - "abort" => Function::new_native(store, |_a: u32| {}), + "db_read" => Function::new_typed(&mut store, |_a: u32| -> u32 { 0 }), + "db_write" => Function::new_typed(&mut store, |_a: u32, _b: u32| {}), + "db_remove" => Function::new_typed(&mut store, |_a: u32| {}), + "db_scan" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: i32| -> u32 { 0 }), + "db_next" => Function::new_typed(&mut store, |_a: u32| -> u32 { 0 }), + "query_chain" => Function::new_typed(&mut store, |_a: u32| -> u32 { 0 }), + "addr_validate" => Function::new_typed(&mut store, |_a: u32| -> u32 { 0 }), + "addr_canonicalize" => Function::new_typed(&mut store, |_a: u32, _b: u32| -> u32 { 0 }), + "addr_humanize" => Function::new_typed(&mut store, |_a: u32, _b: u32| -> u32 { 0 }), + "secp256k1_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), + "secp256k1_recover_pubkey" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u64 { 0 }), + "ed25519_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), + "ed25519_batch_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), + "debug" => Function::new_typed(&mut store, |_a: u32| {}), + "abort" => Function::new_typed(&mut store, |_a: u32| {}), }, }; - let instance = Box::from(WasmerInstance::new(&module, &import_obj).unwrap()); + let wasmer_instance = + Box::from(WasmerInstance::new(&mut store, &module, &import_obj).unwrap()); + let memory = wasmer_instance + .exports + .get_memory("memory") + .unwrap() + .clone(); - let instance_ptr = NonNull::from(instance.as_ref()); - env.set_wasmer_instance(Some(instance_ptr)); - env.set_gas_left(gas_limit); - env.set_storage_readonly(false); + fe.as_mut(&mut store).memory = Some(memory); + + let instance_ptr = NonNull::from(wasmer_instance.as_ref()); + + { + let mut fe_mut = fe.clone().into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); + + env.set_wasmer_instance(Some(instance_ptr)); + env.set_gas_left(&mut store, gas_limit); + env.set_storage_readonly(false); + } - (env, instance) + (fe, store, wasmer_instance) } fn leave_default_data(env: &Environment) { @@ -592,22 +686,30 @@ mod tests { env.move_in(storage, querier); } - fn write_data(env: &Environment, data: &[u8]) -> u32 { + fn write_data( + env: &Environment, + store: &mut impl AsStoreMut, + data: &[u8], + ) -> u32 { let result = env - .call_function1("allocate", &[(data.len() as u32).into()]) + .call_function1(store, "allocate", &[(data.len() as u32).into()]) .unwrap(); let region_ptr = ref_to_u32(&result).unwrap(); - write_region(&env.memory(), region_ptr, data).expect("error writing"); + write_region(&env.memory(store), region_ptr, data).expect("error writing"); region_ptr } - fn create_empty(wasmer_instance: &mut WasmerInstance, capacity: u32) -> u32 { + fn create_empty( + wasmer_instance: &mut WasmerInstance, + store: &mut impl AsStoreMut, + capacity: u32, + ) -> u32 { let allocate = wasmer_instance .exports .get_function("allocate") .expect("error getting function"); let result = allocate - .call(&[capacity.into()]) + .call(store, &[capacity.into()]) .expect("error calling allocate"); ref_to_u32(&result[0]).expect("error converting result") } @@ -615,43 +717,50 @@ mod tests { /// A Region reader that is just good enough for the tests in this file fn force_read( env: &Environment, + store: &mut impl AsStoreMut, region_ptr: u32, ) -> Vec { - read_region(&env.memory(), region_ptr, 5000).unwrap() + read_region(&env.memory(store), region_ptr, 5000).unwrap() } #[test] fn do_db_read_works() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); - leave_default_data(&env); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); + leave_default_data(env); - let key_ptr = write_data(&env, KEY1); - let result = do_db_read(&env, key_ptr); + let key_ptr = write_data(env, &mut store, KEY1); + let result = do_db_read(fe_mut, key_ptr); let value_ptr = result.unwrap(); assert!(value_ptr > 0); - assert_eq!(force_read(&env, value_ptr), VALUE1); + assert_eq!(force_read(&fe_mut.data(), &mut store, value_ptr), VALUE1); } #[test] fn do_db_read_works_for_non_existent_key() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); - leave_default_data(&env); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); + leave_default_data(env); - let key_ptr = write_data(&env, b"I do not exist in storage"); - let result = do_db_read(&env, key_ptr); + let key_ptr = write_data(&env, &mut store, b"I do not exist in storage"); + let result = do_db_read(fe_mut, key_ptr); assert_eq!(result.unwrap(), 0); } #[test] fn do_db_read_fails_for_large_key() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); - leave_default_data(&env); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); + leave_default_data(env); - let key_ptr = write_data(&env, &vec![7u8; 300 * 1024]); - let result = do_db_read(&env, key_ptr); + let key_ptr = write_data(env, &mut store, &vec![7u8; 300 * 1024]); + let result = do_db_read(fe_mut, key_ptr); match result.unwrap_err() { VmError::CommunicationErr { source: CommunicationError::RegionLengthTooBig { length, .. }, @@ -664,14 +773,16 @@ mod tests { #[test] fn do_db_write_works() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); - let key_ptr = write_data(&env, b"new storage key"); - let value_ptr = write_data(&env, b"new value"); + let key_ptr = write_data(env, &mut store, b"new storage key"); + let value_ptr = write_data(env, &mut store, b"new value"); - leave_default_data(&env); + leave_default_data(env); - do_db_write(&env, key_ptr, value_ptr).unwrap(); + do_db_write(fe_mut, key_ptr, value_ptr).unwrap(); let val = env .with_storage_from_context::<_, _>(|store| { @@ -687,16 +798,19 @@ mod tests { #[test] fn do_db_write_can_override() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); - let key_ptr = write_data(&env, KEY1); - let value_ptr = write_data(&env, VALUE2); + let key_ptr = write_data(env, &mut store, KEY1); + let value_ptr = write_data(env, &mut store, VALUE2); - leave_default_data(&env); + leave_default_data(env); - do_db_write(&env, key_ptr, value_ptr).unwrap(); + do_db_write(fe_mut, key_ptr, value_ptr).unwrap(); - let val = env + let val = fe_mut + .data() .with_storage_from_context::<_, _>(|store| { Ok(store.get(KEY1).0.expect("error getting value")) }) @@ -707,16 +821,19 @@ mod tests { #[test] fn do_db_write_works_for_empty_value() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); - let key_ptr = write_data(&env, b"new storage key"); - let value_ptr = write_data(&env, b""); + let key_ptr = write_data(env, &mut store, b"new storage key"); + let value_ptr = write_data(env, &mut store, b""); - leave_default_data(&env); + leave_default_data(env); - do_db_write(&env, key_ptr, value_ptr).unwrap(); + do_db_write(fe_mut, key_ptr, value_ptr).unwrap(); - let val = env + let val = fe_mut + .data() .with_storage_from_context::<_, _>(|store| { Ok(store .get(b"new storage key") @@ -730,14 +847,16 @@ mod tests { #[test] fn do_db_write_fails_for_large_key() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); - let key_ptr = write_data(&env, &vec![4u8; 300 * 1024]); - let value_ptr = write_data(&env, b"new value"); + let key_ptr = write_data(env, &mut store, &vec![4u8; 300 * 1024]); + let value_ptr = write_data(env, &mut store, b"new value"); - leave_default_data(&env); + leave_default_data(env); - let result = do_db_write(&env, key_ptr, value_ptr); + let result = do_db_write(fe_mut, key_ptr, value_ptr); match result.unwrap_err() { VmError::CommunicationErr { source: @@ -756,14 +875,16 @@ mod tests { #[test] fn do_db_write_fails_for_large_value() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); - let key_ptr = write_data(&env, b"new storage key"); - let value_ptr = write_data(&env, &vec![5u8; 300 * 1024]); + let key_ptr = write_data(env, &mut store, b"new storage key"); + let value_ptr = write_data(env, &mut store, &vec![5u8; 300 * 1024]); - leave_default_data(&env); + leave_default_data(env); - let result = do_db_write(&env, key_ptr, value_ptr); + let result = do_db_write(fe_mut, key_ptr, value_ptr); match result.unwrap_err() { VmError::CommunicationErr { source: @@ -782,15 +903,17 @@ mod tests { #[test] fn do_db_write_is_prohibited_in_readonly_contexts() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); - let key_ptr = write_data(&env, b"new storage key"); - let value_ptr = write_data(&env, b"new value"); + let key_ptr = write_data(env, &mut store, b"new storage key"); + let value_ptr = write_data(env, &mut store, b"new value"); - leave_default_data(&env); - env.set_storage_readonly(true); + leave_default_data(env); + fe_mut.data().set_storage_readonly(true); - let result = do_db_write(&env, key_ptr, value_ptr); + let result = do_db_write(fe_mut, key_ptr, value_ptr); match result.unwrap_err() { VmError::WriteAccessDenied { .. } => {} e => panic!("Unexpected error: {:?}", e), @@ -800,28 +923,35 @@ mod tests { #[test] fn do_db_remove_works() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let existing_key = KEY1; - let key_ptr = write_data(&env, existing_key); + let key_ptr = write_data(env, &mut store, existing_key); - leave_default_data(&env); + leave_default_data(env); - env.with_storage_from_context::<_, _>(|store| { - println!("{:?}", store); - Ok(()) - }) - .unwrap(); + fe_mut + .data() + .with_storage_from_context::<_, _>(|store| { + println!("{:?}", store); + Ok(()) + }) + .unwrap(); - do_db_remove(&env, key_ptr).unwrap(); + do_db_remove(fe_mut, key_ptr).unwrap(); - env.with_storage_from_context::<_, _>(|store| { - println!("{:?}", store); - Ok(()) - }) - .unwrap(); + fe_mut + .data() + .with_storage_from_context::<_, _>(|store| { + println!("{:?}", store); + Ok(()) + }) + .unwrap(); - let value = env + let value = fe_mut + .data() .with_storage_from_context::<_, _>(|store| { Ok(store.get(existing_key).0.expect("error getting value")) }) @@ -832,17 +962,20 @@ mod tests { #[test] fn do_db_remove_works_for_non_existent_key() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let non_existent_key = b"I do not exist"; - let key_ptr = write_data(&env, non_existent_key); + let key_ptr = write_data(env, &mut store, non_existent_key); - leave_default_data(&env); + leave_default_data(env); // Note: right now we cannot differnetiate between an existent and a non-existent key - do_db_remove(&env, key_ptr).unwrap(); + do_db_remove(fe_mut, key_ptr).unwrap(); - let value = env + let value = fe_mut + .data() .with_storage_from_context::<_, _>(|store| { Ok(store.get(non_existent_key).0.expect("error getting value")) }) @@ -853,13 +986,15 @@ mod tests { #[test] fn do_db_remove_fails_for_large_key() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); - let key_ptr = write_data(&env, &vec![26u8; 300 * 1024]); + let key_ptr = write_data(&env, &mut store, &vec![26u8; 300 * 1024]); - leave_default_data(&env); + leave_default_data(env); - let result = do_db_remove(&env, key_ptr); + let result = do_db_remove(fe_mut, key_ptr); match result.unwrap_err() { VmError::CommunicationErr { source: @@ -878,14 +1013,16 @@ mod tests { #[test] fn do_db_remove_is_prohibited_in_readonly_contexts() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); - let key_ptr = write_data(&env, b"a storage key"); + let key_ptr = write_data(env, &mut store, b"a storage key"); - leave_default_data(&env); - env.set_storage_readonly(true); + leave_default_data(env); + fe_mut.data().set_storage_readonly(true); - let result = do_db_remove(&env, key_ptr); + let result = do_db_remove(fe_mut, key_ptr); match result.unwrap_err() { VmError::WriteAccessDenied { .. } => {} e => panic!("Unexpected error: {:?}", e), @@ -895,61 +1032,71 @@ mod tests { #[test] fn do_addr_validate_works() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); - - let source_ptr1 = write_data(&env, b"foo"); - let source_ptr2 = write_data(&env, b"eth1n48g2mjh9ezz7zjtya37wtgg5r5emr0drkwlgw"); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); + + let source_ptr1 = write_data(env, &mut store, b"foo"); + let source_ptr2 = write_data( + fe_mut.data(), + &mut store, + b"eth1n48g2mjh9ezz7zjtya37wtgg5r5emr0drkwlgw", + ); - let res = do_addr_validate(&env, source_ptr1).unwrap(); + let res = do_addr_validate(fe_mut, source_ptr1).unwrap(); assert_eq!(res, 0); - let res = do_addr_validate(&env, source_ptr2).unwrap(); + let res = do_addr_validate(fe_mut, source_ptr2).unwrap(); assert_eq!(res, 0); } #[test] fn do_addr_validate_reports_invalid_input_back_to_contract() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); - let source_ptr1 = write_data(&env, b"fo\x80o"); // invalid UTF-8 (fo�o) - let source_ptr2 = write_data(&env, b""); // empty - let source_ptr3 = write_data(&env, b"addressexceedingaddressspacesuperlongreallylongiamensuringthatitislongerthaneverything"); // too long - let source_ptr4 = write_data(&env, b"fooBar"); // Not normalized. The definition of normalized is chain-dependent but the MockApi requires lower case. + let source_ptr1 = write_data(env, &mut store, b"fo\x80o"); // invalid UTF-8 (fo�o) + let source_ptr2 = write_data(env, &mut store, b""); // empty + let source_ptr3 = write_data(env, &mut store, b"addressexceedingaddressspacesuperlongreallylongiamensuringthatitislongerthaneverything"); // too long + let source_ptr4 = write_data(env, &mut store, b"fooBar"); // Not normalized. The definition of normalized is chain-dependent but the MockApi requires lower case. - let res = do_addr_validate(&env, source_ptr1).unwrap(); + let res = do_addr_validate(fe_mut, source_ptr1).unwrap(); assert_ne!(res, 0); - let err = String::from_utf8(force_read(&env, res)).unwrap(); + let err = String::from_utf8(force_read(env, &mut store, res)).unwrap(); assert_eq!(err, "Input is not valid UTF-8"); - let res = do_addr_validate(&env, source_ptr2).unwrap(); + let res = do_addr_validate(fe_mut, source_ptr2).unwrap(); assert_ne!(res, 0); - let err = String::from_utf8(force_read(&env, res)).unwrap(); + let err = String::from_utf8(force_read(env, &mut store, res)).unwrap(); assert_eq!(err, "Input is empty"); - let res = do_addr_validate(&env, source_ptr3).unwrap(); + let res = do_addr_validate(fe_mut, source_ptr3).unwrap(); assert_ne!(res, 0); - let err = String::from_utf8(force_read(&env, res)).unwrap(); + let err = String::from_utf8(force_read(env, &mut store, res)).unwrap(); assert_eq!( err, "Invalid input: human address too long for this mock implementation (must be <= 64)." ); - let res = do_addr_validate(&env, source_ptr4).unwrap(); + let res = do_addr_validate(fe_mut, source_ptr4).unwrap(); assert_ne!(res, 0); - let err = String::from_utf8(force_read(&env, res)).unwrap(); + let err = String::from_utf8(force_read(env, &mut store, res)).unwrap(); assert_eq!(err, "Address is not normalized"); } #[test] fn do_addr_validate_fails_for_broken_backend() { let api = MockApi::new_failing("Temporarily unavailable"); - let (env, _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); - let source_ptr = write_data(&env, b"foo"); + let source_ptr = write_data(env, &mut store, b"foo"); - leave_default_data(&env); + leave_default_data(env); - let result = do_addr_validate(&env, source_ptr); + let result = do_addr_validate(fe_mut, source_ptr); match result.unwrap_err() { VmError::BackendErr { source: BackendError::Unknown { msg, .. }, @@ -962,13 +1109,15 @@ mod tests { #[test] fn do_addr_validate_fails_for_large_inputs() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); - let source_ptr = write_data(&env, &[61; 333]); + let source_ptr = write_data(env, &mut store, &[61; 333]); - leave_default_data(&env); + leave_default_data(env); - let result = do_addr_validate(&env, source_ptr); + let result = do_addr_validate(fe_mut, source_ptr); match result.unwrap_err() { VmError::CommunicationErr { source: @@ -987,46 +1136,50 @@ mod tests { #[test] fn do_addr_canonicalize_works() { let api = MockApi::default(); - let (env, mut instance) = make_instance(api); + let (fe, mut store, mut instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let api = MockApi::default(); - let source_ptr = write_data(&env, b"foo"); - let dest_ptr = create_empty(&mut instance, api.canonical_length() as u32); + let source_ptr = write_data(env, &mut store, b"foo"); + let dest_ptr = create_empty(&mut instance, &mut store, api.canonical_length() as u32); - leave_default_data(&env); + leave_default_data(env); let api = MockApi::default(); - let res = do_addr_canonicalize(&env, source_ptr, dest_ptr).unwrap(); + let res = do_addr_canonicalize(fe_mut, source_ptr, dest_ptr).unwrap(); assert_eq!(res, 0); - let data = force_read(&env, dest_ptr); + let data = force_read(env, &mut store, dest_ptr); assert_eq!(data.len(), api.canonical_length()); } #[test] fn do_addr_canonicalize_reports_invalid_input_back_to_contract() { let api = MockApi::default(); - let (env, mut instance) = make_instance(api); + let (fe, mut store, mut instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); - let source_ptr1 = write_data(&env, b"fo\x80o"); // invalid UTF-8 (fo�o) - let source_ptr2 = write_data(&env, b""); // empty - let source_ptr3 = write_data(&env, b"addressexceedingaddressspacesuperlongreallylongiamensuringthatitislongerthaneverything"); // too long - let dest_ptr = create_empty(&mut instance, 70); + let source_ptr1 = write_data(env, &mut store, b"fo\x80o"); // invalid UTF-8 (fo�o) + let source_ptr2 = write_data(env, &mut store, b""); // empty + let source_ptr3 = write_data(env, &mut store, b"addressexceedingaddressspacesuperlongreallylongiamensuringthatitislongerthaneverything"); // too long + let dest_ptr = create_empty(&mut instance, &mut store, 70); - leave_default_data(&env); + leave_default_data(env); - let res = do_addr_canonicalize(&env, source_ptr1, dest_ptr).unwrap(); + let res = do_addr_canonicalize(fe_mut, source_ptr1, dest_ptr).unwrap(); assert_ne!(res, 0); - let err = String::from_utf8(force_read(&env, res)).unwrap(); + let err = String::from_utf8(force_read(env, &mut store, res)).unwrap(); assert_eq!(err, "Input is not valid UTF-8"); - let res = do_addr_canonicalize(&env, source_ptr2, dest_ptr).unwrap(); + let res = do_addr_canonicalize(fe_mut, source_ptr2, dest_ptr).unwrap(); assert_ne!(res, 0); - let err = String::from_utf8(force_read(&env, res)).unwrap(); + let err = String::from_utf8(force_read(env, &mut store, res)).unwrap(); assert_eq!(err, "Input is empty"); - let res = do_addr_canonicalize(&env, source_ptr3, dest_ptr).unwrap(); + let res = do_addr_canonicalize(fe_mut, source_ptr3, dest_ptr).unwrap(); assert_ne!(res, 0); - let err = String::from_utf8(force_read(&env, res)).unwrap(); + let err = String::from_utf8(force_read(env, &mut store, res)).unwrap(); assert_eq!( err, "Invalid input: human address too long for this mock implementation (must be <= 64)." @@ -1036,14 +1189,16 @@ mod tests { #[test] fn do_addr_canonicalize_fails_for_broken_backend() { let api = MockApi::new_failing("Temporarily unavailable"); - let (env, mut instance) = make_instance(api); + let (fe, mut store, mut instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); - let source_ptr = write_data(&env, b"foo"); - let dest_ptr = create_empty(&mut instance, 7); + let source_ptr = write_data(env, &mut store, b"foo"); + let dest_ptr = create_empty(&mut instance, &mut store, 7); - leave_default_data(&env); + leave_default_data(env); - let result = do_addr_canonicalize(&env, source_ptr, dest_ptr); + let result = do_addr_canonicalize(fe_mut, source_ptr, dest_ptr); match result.unwrap_err() { VmError::BackendErr { source: BackendError::Unknown { msg, .. }, @@ -1056,14 +1211,16 @@ mod tests { #[test] fn do_addr_canonicalize_fails_for_large_inputs() { let api = MockApi::default(); - let (env, mut instance) = make_instance(api); + let (fe, mut store, mut instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); - let source_ptr = write_data(&env, &[61; 333]); - let dest_ptr = create_empty(&mut instance, 8); + let source_ptr = write_data(env, &mut store, &[61; 333]); + let dest_ptr = create_empty(&mut instance, &mut store, 8); - leave_default_data(&env); + leave_default_data(env); - let result = do_addr_canonicalize(&env, source_ptr, dest_ptr); + let result = do_addr_canonicalize(fe_mut, source_ptr, dest_ptr); match result.unwrap_err() { VmError::CommunicationErr { source: @@ -1082,14 +1239,16 @@ mod tests { #[test] fn do_addr_canonicalize_fails_for_small_destination_region() { let api = MockApi::default(); - let (env, mut instance) = make_instance(api); + let (fe, mut store, mut instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); - let source_ptr = write_data(&env, b"foo"); - let dest_ptr = create_empty(&mut instance, 7); + let source_ptr = write_data(env, &mut store, b"foo"); + let dest_ptr = create_empty(&mut instance, &mut store, 7); - leave_default_data(&env); + leave_default_data(env); - let result = do_addr_canonicalize(&env, source_ptr, dest_ptr); + let result = do_addr_canonicalize(fe_mut, source_ptr, dest_ptr); match result.unwrap_err() { VmError::CommunicationErr { source: CommunicationError::RegionTooSmall { size, required, .. }, @@ -1105,47 +1264,53 @@ mod tests { #[test] fn do_addr_humanize_works() { let api = MockApi::default(); - let (env, mut instance) = make_instance(api); + let (fe, mut store, mut instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let api = MockApi::default(); let source_data = vec![0x22; api.canonical_length()]; - let source_ptr = write_data(&env, &source_data); - let dest_ptr = create_empty(&mut instance, 70); + let source_ptr = write_data(env, &mut store, &source_data); + let dest_ptr = create_empty(&mut instance, &mut store, 70); - leave_default_data(&env); + leave_default_data(env); - let error_ptr = do_addr_humanize(&env, source_ptr, dest_ptr).unwrap(); + let error_ptr = do_addr_humanize(fe_mut, source_ptr, dest_ptr).unwrap(); assert_eq!(error_ptr, 0); - assert_eq!(force_read(&env, dest_ptr), source_data); + assert_eq!(force_read(env, &mut store, dest_ptr), source_data); } #[test] fn do_addr_humanize_reports_invalid_input_back_to_contract() { let api = MockApi::default(); - let (env, mut instance) = make_instance(api); + let (fe, mut store, mut instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); - let source_ptr = write_data(&env, b"foo"); // too short - let dest_ptr = create_empty(&mut instance, 70); + let source_ptr = write_data(env, &mut store, b"foo"); // too short + let dest_ptr = create_empty(&mut instance, &mut store, 70); - leave_default_data(&env); + leave_default_data(env); - let res = do_addr_humanize(&env, source_ptr, dest_ptr).unwrap(); + let res = do_addr_humanize(fe_mut, source_ptr, dest_ptr).unwrap(); assert_ne!(res, 0); - let err = String::from_utf8(force_read(&env, res)).unwrap(); + let err = String::from_utf8(force_read(env, &mut store, res)).unwrap(); assert_eq!(err, "Invalid input: canonical address length not correct"); } #[test] fn do_addr_humanize_fails_for_broken_backend() { let api = MockApi::new_failing("Temporarily unavailable"); - let (env, mut instance) = make_instance(api); + let (fe, mut store, mut instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); - let source_ptr = write_data(&env, b"foo\0\0\0\0\0"); - let dest_ptr = create_empty(&mut instance, 70); + let source_ptr = write_data(env, &mut store, b"foo\0\0\0\0\0"); + let dest_ptr = create_empty(&mut instance, &mut store, 70); - leave_default_data(&env); + leave_default_data(env); - let result = do_addr_humanize(&env, source_ptr, dest_ptr); + let result = do_addr_humanize(fe_mut, source_ptr, dest_ptr); match result.unwrap_err() { VmError::BackendErr { source: BackendError::Unknown { msg, .. }, @@ -1158,14 +1323,16 @@ mod tests { #[test] fn do_addr_humanize_fails_for_input_too_long() { let api = MockApi::default(); - let (env, mut instance) = make_instance(api); + let (fe, mut store, mut instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); - let source_ptr = write_data(&env, &[61; 65]); - let dest_ptr = create_empty(&mut instance, 70); + let source_ptr = write_data(env, &mut store, &[61; 65]); + let dest_ptr = create_empty(&mut instance, &mut store, 70); - leave_default_data(&env); + leave_default_data(env); - let result = do_addr_humanize(&env, source_ptr, dest_ptr); + let result = do_addr_humanize(fe_mut, source_ptr, dest_ptr); match result.unwrap_err() { VmError::CommunicationErr { source: @@ -1184,16 +1351,18 @@ mod tests { #[test] fn do_addr_humanize_fails_for_destination_region_too_small() { let api = MockApi::default(); - let (env, mut instance) = make_instance(api); + let (fe, mut store, mut instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let api = MockApi::default(); let source_data = vec![0x22; api.canonical_length()]; - let source_ptr = write_data(&env, &source_data); - let dest_ptr = create_empty(&mut instance, 2); + let source_ptr = write_data(env, &mut store, &source_data); + let dest_ptr = create_empty(&mut instance, &mut store, 2); - leave_default_data(&env); + leave_default_data(env); - let result = do_addr_humanize(&env, source_ptr, dest_ptr); + let result = do_addr_humanize(fe_mut, source_ptr, dest_ptr); match result.unwrap_err() { VmError::CommunicationErr { source: CommunicationError::RegionTooSmall { size, required, .. }, @@ -1209,17 +1378,19 @@ mod tests { #[test] fn do_secp256k1_verify_works() { let api = MockApi::default(); - let (env, mut _instance) = make_instance(api); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); - let hash_ptr = write_data(&env, &hash); + let hash_ptr = write_data(env, &mut store, &hash); let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(&env, &sig); + let sig_ptr = write_data(env, &mut store, &sig); let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(&env, &pubkey); + let pubkey_ptr = write_data(env, &mut store, &pubkey); assert_eq!( - do_secp256k1_verify(&env, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), 0 ); } @@ -1227,19 +1398,21 @@ mod tests { #[test] fn do_secp256k1_verify_wrong_hash_verify_fails() { let api = MockApi::default(); - let (env, mut _instance) = make_instance(api); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let mut hash = hex::decode(ECDSA_HASH_HEX).unwrap(); // alter hash hash[0] ^= 0x01; - let hash_ptr = write_data(&env, &hash); + let hash_ptr = write_data(env, &mut store, &hash); let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(&env, &sig); + let sig_ptr = write_data(env, &mut store, &sig); let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(&env, &pubkey); + let pubkey_ptr = write_data(env, &mut store, &pubkey); assert_eq!( - do_secp256k1_verify(&env, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), 1 ); } @@ -1247,18 +1420,20 @@ mod tests { #[test] fn do_secp256k1_verify_larger_hash_fails() { let api = MockApi::default(); - let (env, mut _instance) = make_instance(api); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let mut hash = hex::decode(ECDSA_HASH_HEX).unwrap(); // extend / break hash hash.push(0x00); - let hash_ptr = write_data(&env, &hash); + let hash_ptr = write_data(env, &mut store, &hash); let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(&env, &sig); + let sig_ptr = write_data(env, &mut store, &sig); let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(&env, &pubkey); + let pubkey_ptr = write_data(env, &mut store, &pubkey); - let result = do_secp256k1_verify(&env, hash_ptr, sig_ptr, pubkey_ptr); + let result = do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr); match result.unwrap_err() { VmError::CommunicationErr { source: CommunicationError::RegionLengthTooBig { length, .. }, @@ -1271,19 +1446,21 @@ mod tests { #[test] fn do_secp256k1_verify_shorter_hash_fails() { let api = MockApi::default(); - let (env, mut _instance) = make_instance(api); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let mut hash = hex::decode(ECDSA_HASH_HEX).unwrap(); // reduce / break hash hash.pop(); - let hash_ptr = write_data(&env, &hash); + let hash_ptr = write_data(env, &mut store, &hash); let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(&env, &sig); + let sig_ptr = write_data(env, &mut store, &sig); let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(&env, &pubkey); + let pubkey_ptr = write_data(env, &mut store, &pubkey); assert_eq!( - do_secp256k1_verify(&env, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), 3 // mapped InvalidHashFormat ); } @@ -1291,19 +1468,21 @@ mod tests { #[test] fn do_secp256k1_verify_wrong_sig_verify_fails() { let api = MockApi::default(); - let (env, mut _instance) = make_instance(api); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); - let hash_ptr = write_data(&env, &hash); + let hash_ptr = write_data(env, &mut store, &hash); let mut sig = hex::decode(ECDSA_SIG_HEX).unwrap(); // alter sig sig[0] ^= 0x01; - let sig_ptr = write_data(&env, &sig); + let sig_ptr = write_data(env, &mut store, &sig); let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(&env, &pubkey); + let pubkey_ptr = write_data(env, &mut store, &pubkey); assert_eq!( - do_secp256k1_verify(&env, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), 1 ); } @@ -1311,18 +1490,20 @@ mod tests { #[test] fn do_secp256k1_verify_larger_sig_fails() { let api = MockApi::default(); - let (env, mut _instance) = make_instance(api); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); - let hash_ptr = write_data(&env, &hash); + let hash_ptr = write_data(env, &mut store, &hash); let mut sig = hex::decode(ECDSA_SIG_HEX).unwrap(); // extend / break sig sig.push(0x00); - let sig_ptr = write_data(&env, &sig); + let sig_ptr = write_data(env, &mut store, &sig); let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(&env, &pubkey); + let pubkey_ptr = write_data(env, &mut store, &pubkey); - let result = do_secp256k1_verify(&env, hash_ptr, sig_ptr, pubkey_ptr); + let result = do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr); match result.unwrap_err() { VmError::CommunicationErr { source: CommunicationError::RegionLengthTooBig { length, .. }, @@ -1335,19 +1516,21 @@ mod tests { #[test] fn do_secp256k1_verify_shorter_sig_fails() { let api = MockApi::default(); - let (env, mut _instance) = make_instance(api); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); - let hash_ptr = write_data(&env, &hash); + let hash_ptr = write_data(env, &mut store, &hash); let mut sig = hex::decode(ECDSA_SIG_HEX).unwrap(); // reduce / break sig sig.pop(); - let sig_ptr = write_data(&env, &sig); + let sig_ptr = write_data(env, &mut store, &sig); let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(&env, &pubkey); + let pubkey_ptr = write_data(env, &mut store, &pubkey); assert_eq!( - do_secp256k1_verify(&env, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), 4 // mapped InvalidSignatureFormat ) } @@ -1355,19 +1538,21 @@ mod tests { #[test] fn do_secp256k1_verify_wrong_pubkey_format_fails() { let api = MockApi::default(); - let (env, mut _instance) = make_instance(api); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); - let hash_ptr = write_data(&env, &hash); + let hash_ptr = write_data(env, &mut store, &hash); let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(&env, &sig); + let sig_ptr = write_data(env, &mut store, &sig); let mut pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); // alter pubkey format pubkey[0] ^= 0x01; - let pubkey_ptr = write_data(&env, &pubkey); + let pubkey_ptr = write_data(env, &mut store, &pubkey); assert_eq!( - do_secp256k1_verify(&env, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), 5 // mapped InvalidPubkeyFormat ) } @@ -1375,19 +1560,21 @@ mod tests { #[test] fn do_secp256k1_verify_wrong_pubkey_fails() { let api = MockApi::default(); - let (env, mut _instance) = make_instance(api); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); - let hash_ptr = write_data(&env, &hash); + let hash_ptr = write_data(env, &mut store, &hash); let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(&env, &sig); + let sig_ptr = write_data(env, &mut store, &sig); let mut pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); // alter pubkey pubkey[1] ^= 0x01; - let pubkey_ptr = write_data(&env, &pubkey); + let pubkey_ptr = write_data(env, &mut store, &pubkey); assert_eq!( - do_secp256k1_verify(&env, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), 10 // mapped GenericErr ) } @@ -1395,18 +1582,20 @@ mod tests { #[test] fn do_secp256k1_verify_larger_pubkey_fails() { let api = MockApi::default(); - let (env, mut _instance) = make_instance(api); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); - let hash_ptr = write_data(&env, &hash); + let hash_ptr = write_data(env, &mut store, &hash); let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(&env, &sig); + let sig_ptr = write_data(env, &mut store, &sig); let mut pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); // extend / break pubkey pubkey.push(0x00); - let pubkey_ptr = write_data(&env, &pubkey); + let pubkey_ptr = write_data(env, &mut store, &pubkey); - let result = do_secp256k1_verify(&env, hash_ptr, sig_ptr, pubkey_ptr); + let result = do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr); match result.unwrap_err() { VmError::CommunicationErr { source: CommunicationError::RegionLengthTooBig { length, .. }, @@ -1419,19 +1608,21 @@ mod tests { #[test] fn do_secp256k1_verify_shorter_pubkey_fails() { let api = MockApi::default(); - let (env, mut _instance) = make_instance(api); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); - let hash_ptr = write_data(&env, &hash); + let hash_ptr = write_data(env, &mut store, &hash); let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(&env, &sig); + let sig_ptr = write_data(env, &mut store, &sig); let mut pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); // reduce / break pubkey pubkey.pop(); - let pubkey_ptr = write_data(&env, &pubkey); + let pubkey_ptr = write_data(env, &mut store, &pubkey); assert_eq!( - do_secp256k1_verify(&env, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), 5 // mapped InvalidPubkeyFormat ) } @@ -1439,17 +1630,19 @@ mod tests { #[test] fn do_secp256k1_verify_empty_pubkey_fails() { let api = MockApi::default(); - let (env, mut _instance) = make_instance(api); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); - let hash_ptr = write_data(&env, &hash); + let hash_ptr = write_data(env, &mut store, &hash); let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(&env, &sig); + let sig_ptr = write_data(env, &mut store, &sig); let pubkey = vec![]; - let pubkey_ptr = write_data(&env, &pubkey); + let pubkey_ptr = write_data(env, &mut store, &pubkey); assert_eq!( - do_secp256k1_verify(&env, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), 5 // mapped InvalidPubkeyFormat ) } @@ -1457,17 +1650,19 @@ mod tests { #[test] fn do_secp256k1_verify_wrong_data_fails() { let api = MockApi::default(); - let (env, mut _instance) = make_instance(api); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let hash = vec![0x22; MESSAGE_HASH_MAX_LEN]; - let hash_ptr = write_data(&env, &hash); + let hash_ptr = write_data(env, &mut store, &hash); let sig = vec![0x22; ECDSA_SIGNATURE_LEN]; - let sig_ptr = write_data(&env, &sig); + let sig_ptr = write_data(env, &mut store, &sig); let pubkey = vec![0x04; ECDSA_PUBKEY_MAX_LEN]; - let pubkey_ptr = write_data(&env, &pubkey); + let pubkey_ptr = write_data(env, &mut store, &pubkey); assert_eq!( - do_secp256k1_verify(&env, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), 10 // mapped GenericErr ) } @@ -1475,7 +1670,9 @@ mod tests { #[test] fn do_secp256k1_recover_pubkey_works() { let api = MockApi::default(); - let (env, mut _instance) = make_instance(api); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); // https://gist.github.com/webmaster128/130b628d83621a33579751846699ed15 let hash = hex!("5ae8317d34d1e595e3fa7247db80c0af4320cce1116de187f8f7e2e099c0d8d0"); @@ -1483,29 +1680,32 @@ mod tests { let recovery_param = 1; let expected = hex!("044a071e8a6e10aada2b8cf39fa3b5fb3400b04e99ea8ae64ceea1a977dbeaf5d5f8c8fbd10b71ab14cd561f7df8eb6da50f8a8d81ba564342244d26d1d4211595"); - let hash_ptr = write_data(&env, &hash); - let sig_ptr = write_data(&env, &sig); - let result = do_secp256k1_recover_pubkey(&env, hash_ptr, sig_ptr, recovery_param).unwrap(); + let hash_ptr = write_data(env, &mut store, &hash); + let sig_ptr = write_data(env, &mut store, &sig); + let result = + do_secp256k1_recover_pubkey(fe_mut, hash_ptr, sig_ptr, recovery_param).unwrap(); let error = result >> 32; let pubkey_ptr: u32 = (result & 0xFFFFFFFF).try_into().unwrap(); assert_eq!(error, 0); - assert_eq!(force_read(&env, pubkey_ptr), expected); + assert_eq!(force_read(env, &mut store, pubkey_ptr), expected); } #[test] fn do_ed25519_verify_works() { let api = MockApi::default(); - let (env, mut _instance) = make_instance(api); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let msg = hex::decode(EDDSA_MSG_HEX).unwrap(); - let msg_ptr = write_data(&env, &msg); + let msg_ptr = write_data(env, &mut store, &msg); let sig = hex::decode(EDDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(&env, &sig); + let sig_ptr = write_data(env, &mut store, &sig); let pubkey = hex::decode(EDDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(&env, &pubkey); + let pubkey_ptr = write_data(env, &mut store, &pubkey); assert_eq!( - do_ed25519_verify(&env, msg_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_ed25519_verify(fe_mut, msg_ptr, sig_ptr, pubkey_ptr).unwrap(), 0 ); } @@ -1513,19 +1713,21 @@ mod tests { #[test] fn do_ed25519_verify_wrong_msg_verify_fails() { let api = MockApi::default(); - let (env, mut _instance) = make_instance(api); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let mut msg = hex::decode(EDDSA_MSG_HEX).unwrap(); // alter msg msg.push(0x01); - let msg_ptr = write_data(&env, &msg); + let msg_ptr = write_data(env, &mut store, &msg); let sig = hex::decode(EDDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(&env, &sig); + let sig_ptr = write_data(env, &mut store, &sig); let pubkey = hex::decode(EDDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(&env, &pubkey); + let pubkey_ptr = write_data(env, &mut store, &pubkey); assert_eq!( - do_ed25519_verify(&env, msg_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_ed25519_verify(fe_mut, msg_ptr, sig_ptr, pubkey_ptr).unwrap(), 1 ); } @@ -1533,18 +1735,20 @@ mod tests { #[test] fn do_ed25519_verify_larger_msg_fails() { let api = MockApi::default(); - let (env, mut _instance) = make_instance(api); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let mut msg = hex::decode(EDDSA_MSG_HEX).unwrap(); // extend / break msg msg.extend_from_slice(&[0x00; MAX_LENGTH_ED25519_MESSAGE + 1]); - let msg_ptr = write_data(&env, &msg); + let msg_ptr = write_data(env, &mut store, &msg); let sig = hex::decode(EDDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(&env, &sig); + let sig_ptr = write_data(env, &mut store, &sig); let pubkey = hex::decode(EDDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(&env, &pubkey); + let pubkey_ptr = write_data(env, &mut store, &pubkey); - let result = do_ed25519_verify(&env, msg_ptr, sig_ptr, pubkey_ptr); + let result = do_ed25519_verify(fe_mut, msg_ptr, sig_ptr, pubkey_ptr); match result.unwrap_err() { VmError::CommunicationErr { source: CommunicationError::RegionLengthTooBig { length, .. }, @@ -1557,19 +1761,21 @@ mod tests { #[test] fn do_ed25519_verify_wrong_sig_verify_fails() { let api = MockApi::default(); - let (env, mut _instance) = make_instance(api); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let msg = hex::decode(EDDSA_MSG_HEX).unwrap(); - let msg_ptr = write_data(&env, &msg); + let msg_ptr = write_data(env, &mut store, &msg); let mut sig = hex::decode(EDDSA_SIG_HEX).unwrap(); // alter sig sig[0] ^= 0x01; - let sig_ptr = write_data(&env, &sig); + let sig_ptr = write_data(env, &mut store, &sig); let pubkey = hex::decode(EDDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(&env, &pubkey); + let pubkey_ptr = write_data(env, &mut store, &pubkey); assert_eq!( - do_ed25519_verify(&env, msg_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_ed25519_verify(fe_mut, msg_ptr, sig_ptr, pubkey_ptr).unwrap(), 1 ); } @@ -1577,18 +1783,20 @@ mod tests { #[test] fn do_ed25519_verify_larger_sig_fails() { let api = MockApi::default(); - let (env, mut _instance) = make_instance(api); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let msg = hex::decode(EDDSA_MSG_HEX).unwrap(); - let msg_ptr = write_data(&env, &msg); + let msg_ptr = write_data(env, &mut store, &msg); let mut sig = hex::decode(EDDSA_SIG_HEX).unwrap(); // extend / break sig sig.push(0x00); - let sig_ptr = write_data(&env, &sig); + let sig_ptr = write_data(env, &mut store, &sig); let pubkey = hex::decode(EDDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(&env, &pubkey); + let pubkey_ptr = write_data(env, &mut store, &pubkey); - let result = do_ed25519_verify(&env, msg_ptr, sig_ptr, pubkey_ptr); + let result = do_ed25519_verify(fe_mut, msg_ptr, sig_ptr, pubkey_ptr); match result.unwrap_err() { VmError::CommunicationErr { source: CommunicationError::RegionLengthTooBig { length, .. }, @@ -1601,19 +1809,21 @@ mod tests { #[test] fn do_ed25519_verify_shorter_sig_fails() { let api = MockApi::default(); - let (env, mut _instance) = make_instance(api); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let msg = hex::decode(EDDSA_MSG_HEX).unwrap(); - let msg_ptr = write_data(&env, &msg); + let msg_ptr = write_data(env, &mut store, &msg); let mut sig = hex::decode(EDDSA_SIG_HEX).unwrap(); // reduce / break sig sig.pop(); - let sig_ptr = write_data(&env, &sig); + let sig_ptr = write_data(env, &mut store, &sig); let pubkey = hex::decode(EDDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(&env, &pubkey); + let pubkey_ptr = write_data(env, &mut store, &pubkey); assert_eq!( - do_ed25519_verify(&env, msg_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_ed25519_verify(fe_mut, msg_ptr, sig_ptr, pubkey_ptr).unwrap(), 4 // mapped InvalidSignatureFormat ) } @@ -1621,19 +1831,21 @@ mod tests { #[test] fn do_ed25519_verify_wrong_pubkey_verify_fails() { let api = MockApi::default(); - let (env, mut _instance) = make_instance(api); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let msg = hex::decode(EDDSA_MSG_HEX).unwrap(); - let msg_ptr = write_data(&env, &msg); + let msg_ptr = write_data(env, &mut store, &msg); let sig = hex::decode(EDDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(&env, &sig); + let sig_ptr = write_data(env, &mut store, &sig); let mut pubkey = hex::decode(EDDSA_PUBKEY_HEX).unwrap(); // alter pubkey pubkey[1] ^= 0x01; - let pubkey_ptr = write_data(&env, &pubkey); + let pubkey_ptr = write_data(env, &mut store, &pubkey); assert_eq!( - do_ed25519_verify(&env, msg_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_ed25519_verify(fe_mut, msg_ptr, sig_ptr, pubkey_ptr).unwrap(), 1 ); } @@ -1641,18 +1853,20 @@ mod tests { #[test] fn do_ed25519_verify_larger_pubkey_fails() { let api = MockApi::default(); - let (env, mut _instance) = make_instance(api); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let msg = hex::decode(EDDSA_MSG_HEX).unwrap(); - let msg_ptr = write_data(&env, &msg); + let msg_ptr = write_data(env, &mut store, &msg); let sig = hex::decode(EDDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(&env, &sig); + let sig_ptr = write_data(env, &mut store, &sig); let mut pubkey = hex::decode(EDDSA_PUBKEY_HEX).unwrap(); // extend / break pubkey pubkey.push(0x00); - let pubkey_ptr = write_data(&env, &pubkey); + let pubkey_ptr = write_data(env, &mut store, &pubkey); - let result = do_ed25519_verify(&env, msg_ptr, sig_ptr, pubkey_ptr); + let result = do_ed25519_verify(fe_mut, msg_ptr, sig_ptr, pubkey_ptr); match result.unwrap_err() { VmError::CommunicationErr { source: CommunicationError::RegionLengthTooBig { length, .. }, @@ -1665,19 +1879,21 @@ mod tests { #[test] fn do_ed25519_verify_shorter_pubkey_fails() { let api = MockApi::default(); - let (env, mut _instance) = make_instance(api); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let msg = hex::decode(EDDSA_MSG_HEX).unwrap(); - let msg_ptr = write_data(&env, &msg); + let msg_ptr = write_data(env, &mut store, &msg); let sig = hex::decode(EDDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(&env, &sig); + let sig_ptr = write_data(env, &mut store, &sig); let mut pubkey = hex::decode(EDDSA_PUBKEY_HEX).unwrap(); // reduce / break pubkey pubkey.pop(); - let pubkey_ptr = write_data(&env, &pubkey); + let pubkey_ptr = write_data(env, &mut store, &pubkey); assert_eq!( - do_ed25519_verify(&env, msg_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_ed25519_verify(fe_mut, msg_ptr, sig_ptr, pubkey_ptr).unwrap(), 5 // mapped InvalidPubkeyFormat ) } @@ -1685,17 +1901,19 @@ mod tests { #[test] fn do_ed25519_verify_empty_pubkey_fails() { let api = MockApi::default(); - let (env, mut _instance) = make_instance(api); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let msg = hex::decode(EDDSA_MSG_HEX).unwrap(); - let msg_ptr = write_data(&env, &msg); + let msg_ptr = write_data(env, &mut store, &msg); let sig = hex::decode(EDDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(&env, &sig); + let sig_ptr = write_data(env, &mut store, &sig); let pubkey = vec![]; - let pubkey_ptr = write_data(&env, &pubkey); + let pubkey_ptr = write_data(env, &mut store, &pubkey); assert_eq!( - do_ed25519_verify(&env, msg_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_ed25519_verify(fe_mut, msg_ptr, sig_ptr, pubkey_ptr).unwrap(), 5 // mapped InvalidPubkeyFormat ) } @@ -1703,17 +1921,19 @@ mod tests { #[test] fn do_ed25519_verify_wrong_data_fails() { let api = MockApi::default(); - let (env, mut _instance) = make_instance(api); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let msg = vec![0x22; MESSAGE_HASH_MAX_LEN]; - let msg_ptr = write_data(&env, &msg); + let msg_ptr = write_data(env, &mut store, &msg); let sig = vec![0x22; MAX_LENGTH_ED25519_SIGNATURE]; - let sig_ptr = write_data(&env, &sig); + let sig_ptr = write_data(env, &mut store, &sig); let pubkey = vec![0x04; EDDSA_PUBKEY_LEN]; - let pubkey_ptr = write_data(&env, &pubkey); + let pubkey_ptr = write_data(env, &mut store, &pubkey); assert_eq!( - do_ed25519_verify(&env, msg_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_ed25519_verify(fe_mut, msg_ptr, sig_ptr, pubkey_ptr).unwrap(), 1 // verification failure ) } @@ -1721,18 +1941,20 @@ mod tests { #[test] fn do_query_chain_works() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let request: QueryRequest = QueryRequest::Bank(BankQuery::AllBalances { address: INIT_ADDR.to_string(), }); let request_data = cosmwasm_std::to_vec(&request).unwrap(); - let request_ptr = write_data(&env, &request_data); + let request_ptr = write_data(env, &mut store, &request_data); - leave_default_data(&env); + leave_default_data(env); - let response_ptr = do_query_chain(&env, request_ptr).unwrap(); - let response = force_read(&env, response_ptr); + let response_ptr = do_query_chain(fe_mut, request_ptr).unwrap(); + let response = force_read(env, &mut store, response_ptr); let query_result: cosmwasm_std::QuerierResult = cosmwasm_std::from_slice(&response).unwrap(); @@ -1745,15 +1967,17 @@ mod tests { #[test] fn do_query_chain_fails_for_broken_request() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let request = b"Not valid JSON for sure"; - let request_ptr = write_data(&env, request); + let request_ptr = write_data(env, &mut store, request); - leave_default_data(&env); + leave_default_data(env); - let response_ptr = do_query_chain(&env, request_ptr).unwrap(); - let response = force_read(&env, response_ptr); + let response_ptr = do_query_chain(fe_mut, request_ptr).unwrap(); + let response = force_read(env, &mut store, response_ptr); let query_result: cosmwasm_std::QuerierResult = cosmwasm_std::from_slice(&response).unwrap(); @@ -1769,19 +1993,21 @@ mod tests { #[test] fn do_query_chain_fails_for_missing_contract() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); let request: QueryRequest = QueryRequest::Wasm(WasmQuery::Smart { contract_addr: String::from("non-existent"), msg: Binary::from(b"{}" as &[u8]), }); let request_data = cosmwasm_std::to_vec(&request).unwrap(); - let request_ptr = write_data(&env, &request_data); + let request_ptr = write_data(env, &mut store, &request_data); - leave_default_data(&env); + leave_default_data(env); - let response_ptr = do_query_chain(&env, request_ptr).unwrap(); - let response = force_read(&env, response_ptr); + let response_ptr = do_query_chain(fe_mut, request_ptr).unwrap(); + let response = force_read(env, &mut store, response_ptr); let query_result: cosmwasm_std::QuerierResult = cosmwasm_std::from_slice(&response).unwrap(); @@ -1798,11 +2024,13 @@ mod tests { #[cfg(feature = "iterator")] fn do_db_scan_unbound_works() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); - leave_default_data(&env); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); + leave_default_data(env); // set up iterator over all space - let id = do_db_scan(&env, 0, 0, Order::Ascending.into()).unwrap(); + let id = do_db_scan(fe_mut, 0, 0, Order::Ascending.into()).unwrap(); assert_eq!(1, id); let item = env @@ -1825,11 +2053,13 @@ mod tests { #[cfg(feature = "iterator")] fn do_db_scan_unbound_descending_works() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); - leave_default_data(&env); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); + leave_default_data(env); // set up iterator over all space - let id = do_db_scan(&env, 0, 0, Order::Descending.into()).unwrap(); + let id = do_db_scan(fe_mut, 0, 0, Order::Descending.into()).unwrap(); assert_eq!(1, id); let item = env @@ -1852,14 +2082,16 @@ mod tests { #[cfg(feature = "iterator")] fn do_db_scan_bound_works() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); - let start = write_data(&env, b"anna"); - let end = write_data(&env, b"bert"); + let start = write_data(env, &mut store, b"anna"); + let end = write_data(env, &mut store, b"bert"); - leave_default_data(&env); + leave_default_data(env); - let id = do_db_scan(&env, start, end, Order::Ascending.into()).unwrap(); + let id = do_db_scan(fe_mut, start, end, Order::Ascending.into()).unwrap(); let item = env .with_storage_from_context::<_, _>(|store| Ok(store.next(id))) @@ -1876,41 +2108,48 @@ mod tests { #[cfg(feature = "iterator")] fn do_db_scan_multiple_iterators() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); - leave_default_data(&env); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); + leave_default_data(env); // unbounded, ascending and descending - let id1 = do_db_scan(&env, 0, 0, Order::Ascending.into()).unwrap(); - let id2 = do_db_scan(&env, 0, 0, Order::Descending.into()).unwrap(); + let id1 = do_db_scan(fe_mut, 0, 0, Order::Ascending.into()).unwrap(); + let id2 = do_db_scan(fe_mut, 0, 0, Order::Descending.into()).unwrap(); assert_eq!(id1, 1); assert_eq!(id2, 2); // first item, first iterator - let item = env + let item = fe_mut + .data() .with_storage_from_context::<_, _>(|store| Ok(store.next(id1))) .unwrap(); assert_eq!(item.0.unwrap().unwrap(), (KEY1.to_vec(), VALUE1.to_vec())); // second item, first iterator - let item = env + let item = fe_mut + .data() .with_storage_from_context::<_, _>(|store| Ok(store.next(id1))) .unwrap(); assert_eq!(item.0.unwrap().unwrap(), (KEY2.to_vec(), VALUE2.to_vec())); // first item, second iterator - let item = env + let item = fe_mut + .data() .with_storage_from_context::<_, _>(|store| Ok(store.next(id2))) .unwrap(); assert_eq!(item.0.unwrap().unwrap(), (KEY2.to_vec(), VALUE2.to_vec())); // end, first iterator - let item = env + let item = fe_mut + .data() .with_storage_from_context::<_, _>(|store| Ok(store.next(id1))) .unwrap(); assert!(item.0.unwrap().is_none()); // second item, second iterator - let item = env + let item = fe_mut + .data() .with_storage_from_context::<_, _>(|store| Ok(store.next(id2))) .unwrap(); assert_eq!(item.0.unwrap().unwrap(), (KEY1.to_vec(), VALUE1.to_vec())); @@ -1920,11 +2159,13 @@ mod tests { #[cfg(feature = "iterator")] fn do_db_scan_errors_for_invalid_order_value() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); - leave_default_data(&env); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); + leave_default_data(env); // set up iterator over all space - let result = do_db_scan(&env, 0, 0, 42); + let result = do_db_scan(fe_mut, 0, 0, 42); match result.unwrap_err() { VmError::CommunicationErr { source: CommunicationError::InvalidOrder { .. }, @@ -1938,29 +2179,34 @@ mod tests { #[cfg(feature = "iterator")] fn do_db_next_works() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); - leave_default_data(&env); + leave_default_data(env); - let id = do_db_scan(&env, 0, 0, Order::Ascending.into()).unwrap(); + let id = do_db_scan(fe_mut, 0, 0, Order::Ascending.into()).unwrap(); // Entry 1 - let kv_region_ptr = do_db_next(&env, id).unwrap(); + let kv_region_ptr = do_db_next(fe_mut, id).unwrap(); assert_eq!( - force_read(&env, kv_region_ptr), + force_read(env, &mut store, kv_region_ptr), [KEY1, b"\0\0\0\x03", VALUE1, b"\0\0\0\x06"].concat() ); // Entry 2 - let kv_region_ptr = do_db_next(&env, id).unwrap(); + let kv_region_ptr = do_db_next(fe_mut, id).unwrap(); assert_eq!( - force_read(&env, kv_region_ptr), + force_read(env, &mut store, kv_region_ptr), [KEY2, b"\0\0\0\x04", VALUE2, b"\0\0\0\x05"].concat() ); // End - let kv_region_ptr = do_db_next(&env, id).unwrap(); - assert_eq!(force_read(&env, kv_region_ptr), b"\0\0\0\0\0\0\0\0"); + let kv_region_ptr = do_db_next(fe_mut, id).unwrap(); + assert_eq!( + force_read(env, &mut store, kv_region_ptr), + b"\0\0\0\0\0\0\0\0" + ); // API makes no guarantees for value_ptr in this case } @@ -1968,12 +2214,14 @@ mod tests { #[cfg(feature = "iterator")] fn do_db_next_fails_for_non_existent_id() { let api = MockApi::default(); - let (env, _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); - leave_default_data(&env); + leave_default_data(env); let non_existent_id = 42u32; - let result = do_db_next(&env, non_existent_id); + let result = do_db_next(fe_mut, non_existent_id); match result.unwrap_err() { VmError::BackendErr { source: BackendError::IteratorDoesNotExist { id, .. }, diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 92679422a2..55f2714e59 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -3,7 +3,9 @@ use std::ptr::NonNull; use std::rc::Rc; use std::sync::Mutex; -use wasmer::{Exports, Function, ImportObject, Instance as WasmerInstance, Module, Val}; +use wasmer::{ + Exports, Function, FunctionEnv, Imports, Instance as WasmerInstance, Module, Store, Value, +}; use crate::backend::{Backend, BackendApi, Querier, Storage}; use crate::capabilities::required_capabilities_from_module; @@ -50,7 +52,8 @@ pub struct Instance { /// /// This instance should only be accessed via the Environment, which provides safe access. _inner: Box, - env: Environment, + fe: FunctionEnv>, + store: Store, } impl Instance @@ -67,8 +70,9 @@ where options: InstanceOptions, memory_limit: Option, ) -> VmResult { - let module = compile(code, memory_limit, &[])?; + let (store, module) = compile(code, memory_limit, &[])?; Instance::from_module( + store, &module, backend, options.gas_limit, @@ -79,6 +83,7 @@ where } pub(crate) fn from_module( + mut store: Store, module: &Module, backend: Backend, gas_limit: u64, @@ -86,16 +91,17 @@ where extra_imports: Option>, instantiation_lock: Option<&Mutex<()>>, ) -> VmResult { - let store = module.store(); - - let env = Environment::new(backend.api, gas_limit); - if print_debug { - env.set_debug_handler(Some(Rc::new(|msg: &str, _gas_remaining| { - eprintln!("{msg}"); - }))) - } + let fe = FunctionEnv::new(&mut store, { + let e = Environment::new(backend.api, gas_limit); + if print_debug { + e.set_debug_handler(Some(Rc::new(|msg: &str, _gas_remaining| { + eprintln!("{msg}"); + }))) + } + e + }); - let mut import_obj = ImportObject::new(); + let mut import_obj = Imports::new(); let mut env_imports = Exports::new(); // Reads the database entry at the given key into the the value. @@ -104,14 +110,14 @@ where // Ownership of the value pointer is transferred to the contract. env_imports.insert( "db_read", - Function::new_native_with_env(store, env.clone(), do_db_read), + Function::new_typed_with_env(&mut store, &fe, do_db_read), ); // Writes the given value into the database entry at the given key. // Ownership of both input and output pointer is not transferred to the host. env_imports.insert( "db_write", - Function::new_native_with_env(store, env.clone(), do_db_write), + Function::new_typed_with_env(&mut store, &fe, do_db_write), ); // Removes the value at the given key. Different than writing &[] as future @@ -120,7 +126,7 @@ where // Ownership of both key pointer is not transferred to the host. env_imports.insert( "db_remove", - Function::new_native_with_env(store, env.clone(), do_db_remove), + Function::new_typed_with_env(&mut store, &fe, do_db_remove), ); // Reads human address from source_ptr and checks if it is valid. @@ -128,7 +134,7 @@ where // Ownership of the input pointer is not transferred to the host. env_imports.insert( "addr_validate", - Function::new_native_with_env(store, env.clone(), do_addr_validate), + Function::new_typed_with_env(&mut store, &fe, do_addr_validate), ); // Reads human address from source_ptr and writes canonicalized representation to destination_ptr. @@ -137,7 +143,7 @@ where // Ownership of both input and output pointer is not transferred to the host. env_imports.insert( "addr_canonicalize", - Function::new_native_with_env(store, env.clone(), do_addr_canonicalize), + Function::new_typed_with_env(&mut store, &fe, do_addr_canonicalize), ); // Reads canonical address from source_ptr and writes humanized representation to destination_ptr. @@ -146,7 +152,7 @@ where // Ownership of both input and output pointer is not transferred to the host. env_imports.insert( "addr_humanize", - Function::new_native_with_env(store, env.clone(), do_addr_humanize), + Function::new_typed_with_env(&mut store, &fe, do_addr_humanize), ); // Verifies message hashes against a signature with a public key, using the secp256k1 ECDSA parametrization. @@ -154,12 +160,12 @@ where // Ownership of input pointers is not transferred to the host. env_imports.insert( "secp256k1_verify", - Function::new_native_with_env(store, env.clone(), do_secp256k1_verify), + Function::new_typed_with_env(&mut store, &fe, do_secp256k1_verify), ); env_imports.insert( "secp256k1_recover_pubkey", - Function::new_native_with_env(store, env.clone(), do_secp256k1_recover_pubkey), + Function::new_typed_with_env(&mut store, &fe, do_secp256k1_recover_pubkey), ); // Verifies a message against a signature with a public key, using the ed25519 EdDSA scheme. @@ -167,7 +173,7 @@ where // Ownership of input pointers is not transferred to the host. env_imports.insert( "ed25519_verify", - Function::new_native_with_env(store, env.clone(), do_ed25519_verify), + Function::new_typed_with_env(&mut store, &fe, do_ed25519_verify), ); // Verifies a batch of messages against a batch of signatures with a batch of public keys, @@ -177,7 +183,7 @@ where // Ownership of input pointers is not transferred to the host. env_imports.insert( "ed25519_batch_verify", - Function::new_native_with_env(store, env.clone(), do_ed25519_batch_verify), + Function::new_typed_with_env(&mut store, &fe, do_ed25519_batch_verify), ); // Allows the contract to emit debug logs that the host can either process or ignore. @@ -186,7 +192,7 @@ where // Ownership of both input and output pointer is not transferred to the host. env_imports.insert( "debug", - Function::new_native_with_env(store, env.clone(), do_debug), + Function::new_typed_with_env(&mut store, &fe, do_debug), ); // Aborts the contract execution with an error message provided by the contract. @@ -194,12 +200,12 @@ where // Ownership of both input and output pointer is not transferred to the host. env_imports.insert( "abort", - Function::new_native_with_env(store, env.clone(), do_abort), + Function::new_typed_with_env(&mut store, &fe, do_abort), ); env_imports.insert( "query_chain", - Function::new_native_with_env(store, env.clone(), do_query_chain), + Function::new_typed_with_env(&mut store, &fe, do_query_chain), ); // Creates an iterator that will go from start to end. @@ -211,7 +217,7 @@ where #[cfg(feature = "iterator")] env_imports.insert( "db_scan", - Function::new_native_with_env(store, env.clone(), do_db_scan), + Function::new_typed_with_env(&mut store, &fe, do_db_scan), ); // Get next element of iterator with ID `iterator_id`. @@ -222,47 +228,63 @@ where #[cfg(feature = "iterator")] env_imports.insert( "db_next", - Function::new_native_with_env(store, env.clone(), do_db_next), + Function::new_typed_with_env(&mut store, &fe, do_db_next), ); - import_obj.register("env", env_imports); + import_obj.register_namespace("env", env_imports); if let Some(extra_imports) = extra_imports { for (namespace, exports_obj) in extra_imports { - import_obj.register(namespace, exports_obj); + import_obj.register_namespace(namespace, exports_obj); } } let wasmer_instance = Box::from( { let _lock = instantiation_lock.map(|l| l.lock().unwrap()); - WasmerInstance::new(module, &import_obj) + WasmerInstance::new(&mut store, module, &import_obj) } .map_err(|original| { VmError::instantiation_err(format!("Error instantiating module: {original}")) })?, ); + let memory = wasmer_instance + .exports + .get_memory("memory") + .unwrap() + .clone(); // TODO: handle error + + fe.as_mut(&mut store).memory = Some(memory); + let instance_ptr = NonNull::from(wasmer_instance.as_ref()); - env.set_wasmer_instance(Some(instance_ptr)); - env.set_gas_left(gas_limit); - env.move_in(backend.storage, backend.querier); - let instance = Instance { + + { + let mut fe_mut = fe.clone().into_mut(&mut store); + let (env, mut store) = fe_mut.data_and_store_mut(); + + env.set_wasmer_instance(Some(instance_ptr)); + env.set_gas_left(&mut store, gas_limit); + env.move_in(backend.storage, backend.querier); + } + + Ok(Instance { _inner: wasmer_instance, - env, - }; - Ok(instance) + fe, + store, + }) } pub fn api(&self) -> &A { - &self.env.api + &self.fe.as_ref(&self.store).api } /// Decomposes this instance into its components. /// External dependencies are returned for reuse, the rest is dropped. pub fn recycle(self) -> Option> { - if let (Some(storage), Some(querier)) = self.env.move_out() { - let api = self.env.api; + let env = self.fe.as_ref(&self.store); + if let (Some(storage), Some(querier)) = env.move_out() { + let api = env.api; Some(Backend { api, storage, @@ -277,11 +299,13 @@ where where H: for<'a> Fn(/* msg */ &'a str, DebugInfo<'a>) + 'static, { - self.env.set_debug_handler(Some(Rc::new(debug_handler))); + self.fe + .as_ref(&self.store) + .set_debug_handler(Some(Rc::new(debug_handler))); } pub fn unset_debug_handler(&mut self) { - self.env.set_debug_handler(None); + self.fe.as_ref(&self.store).set_debug_handler(None); } /// Returns the features required by this contract. @@ -297,21 +321,30 @@ where /// This provides a rough idea of the peak memory consumption. Note that /// Wasm memory always grows in 64 KiB steps (pages) and can never shrink /// (https://github.com/WebAssembly/design/issues/1300#issuecomment-573867836). - pub fn memory_pages(&self) -> usize { - self.env.memory().size().0 as _ + pub fn memory_pages(&mut self) -> usize { + let mut fe_mut = self.fe.clone().into_mut(&mut self.store); + let (env, mut store) = fe_mut.data_and_store_mut(); + + env.memory(&mut store).size().0 as _ } /// Returns the currently remaining gas. - pub fn get_gas_left(&self) -> u64 { - self.env.get_gas_left() + pub fn get_gas_left(&mut self) -> u64 { + let mut fe_mut = self.fe.clone().into_mut(&mut self.store); + let (env, mut store) = fe_mut.data_and_store_mut(); + + env.get_gas_left(&mut store) } /// Creates and returns a gas report. /// This is a snapshot and multiple reports can be created during the lifetime of /// an instance. - pub fn create_gas_report(&self) -> GasReport { - let state = self.env.with_gas_state(|gas_state| gas_state.clone()); - let gas_left = self.env.get_gas_left(); + pub fn create_gas_report(&mut self) -> GasReport { + let mut fe_mut = self.fe.clone().into_mut(&mut self.store); + let (env, mut store) = fe_mut.data_and_store_mut(); + + let state = env.with_gas_state(|gas_state| gas_state.clone()); + let gas_left = env.get_gas_left(&mut store); GasReport { limit: state.gas_limit, remaining: gas_left, @@ -326,19 +359,33 @@ where } } + pub fn is_storage_readonly(&mut self) -> bool { + let mut fe_mut = self.fe.clone().into_mut(&mut self.store); + let (env, _) = fe_mut.data_and_store_mut(); + + env.is_storage_readonly() + } + /// Sets the readonly storage flag on this instance. Since one instance can be used /// for multiple calls in integration tests, this should be set to the desired value /// right before every call. pub fn set_storage_readonly(&mut self, new_value: bool) { - self.env.set_storage_readonly(new_value); + let mut fe_mut = self.fe.clone().into_mut(&mut self.store); + let (env, _) = fe_mut.data_and_store_mut(); + + env.set_storage_readonly(new_value); } pub fn with_storage VmResult, T>(&mut self, func: F) -> VmResult { - self.env.with_storage_from_context::(func) + self.fe + .as_ref(&self.store) + .with_storage_from_context::(func) } pub fn with_querier VmResult, T>(&mut self, func: F) -> VmResult { - self.env.with_querier_from_context::(func) + self.fe + .as_ref(&self.store) + .with_querier_from_context::(func) } /// Requests memory allocation by the instance and returns a pointer @@ -361,32 +408,45 @@ where } /// Copies all data described by the Region at the given pointer from Wasm to the caller. - pub(crate) fn read_memory(&self, region_ptr: u32, max_length: usize) -> VmResult> { - read_region(&self.env.memory(), region_ptr, max_length) + pub(crate) fn read_memory(&mut self, region_ptr: u32, max_length: usize) -> VmResult> { + let mut fe_mut = self.fe.clone().into_mut(&mut self.store); + let (env, mut store) = fe_mut.data_and_store_mut(); + + read_region(&env.memory(&mut store), region_ptr, max_length) } /// Copies data to the memory region that was created before using allocate. pub(crate) fn write_memory(&mut self, region_ptr: u32, data: &[u8]) -> VmResult<()> { - write_region(&self.env.memory(), region_ptr, data)?; + let mut fe_mut = self.fe.clone().into_mut(&mut self.store); + let (env, mut store) = fe_mut.data_and_store_mut(); + + write_region(&env.memory(&mut store), region_ptr, data)?; Ok(()) } /// Calls a function exported by the instance. /// The function is expected to return no value. Otherwise this calls errors. - pub(crate) fn call_function0(&self, name: &str, args: &[Val]) -> VmResult<()> { - self.env.call_function0(name, args) + pub(crate) fn call_function0(&mut self, name: &str, args: &[Value]) -> VmResult<()> { + let mut fe_mut = self.fe.clone().into_mut(&mut self.store); + let (env, mut store) = fe_mut.data_and_store_mut(); + + env.call_function0(&mut store, name, args) } /// Calls a function exported by the instance. /// The function is expected to return one value. Otherwise this calls errors. - pub(crate) fn call_function1(&self, name: &str, args: &[Val]) -> VmResult { - self.env.call_function1(name, args) + pub(crate) fn call_function1(&mut self, name: &str, args: &[Value]) -> VmResult { + let mut fe_mut = self.fe.clone().into_mut(&mut self.store); + let (env, mut store) = fe_mut.data_and_store_mut(); + + env.call_function1(&mut store, name, args) } } /// This exists only to be exported through `internals` for use by crates that are /// part of Cosmwasm. pub fn instance_from_module( + store: Store, module: &Module, backend: Backend, gas_limit: u64, @@ -398,7 +458,15 @@ where S: Storage + 'static, // 'static is needed here to allow using this in an Environment that is cloned into closures Q: Querier + 'static, { - Instance::from_module(module, backend, gas_limit, print_debug, extra_imports, None) + Instance::from_module( + store, + module, + backend, + gas_limit, + print_debug, + extra_imports, + None, + ) } #[cfg(test)] @@ -420,6 +488,7 @@ mod tests { coin, coins, from_binary, AllBalanceResponse, BalanceResponse, BankQuery, Empty, QueryRequest, }; + use wasmer::{FunctionEnv, FunctionEnvMut}; const KIB: usize = 1024; const MIB: usize = 1024 * 1024; @@ -510,9 +579,9 @@ mod tests { let backend = mock_backend(&[]); let (instance_options, memory_limit) = mock_instance_options(); - let module = compile(&wasm, memory_limit, &[]).unwrap(); + let (mut store, module) = compile(&wasm, memory_limit, &[]).unwrap(); - #[derive(wasmer::WasmerEnv, Clone)] + #[derive(Clone)] struct MyEnv { // This can be mutated across threads safely. We initialize it as `false` // and let our imported fn switch it to `true` to confirm it works. @@ -523,14 +592,18 @@ mod tests { called: Arc::new(AtomicBool::new(false)), }; - let fun = Function::new_native_with_env(module.store(), my_env.clone(), |env: &MyEnv| { - env.called.store(true, Ordering::Relaxed); - }); + let fe = FunctionEnv::new(&mut store, my_env); + + let fun = + Function::new_typed_with_env(&mut store, &fe, move |fe_mut: FunctionEnvMut| { + fe_mut.data().called.store(true, Ordering::Relaxed); + }); let mut exports = Exports::new(); exports.insert("bar", fun); let mut extra_imports = HashMap::new(); extra_imports.insert("foo", exports); - let instance = Instance::from_module( + let mut instance = Instance::from_module( + store, &module, backend, instance_options.gas_limit, @@ -540,15 +613,15 @@ mod tests { ) .unwrap(); - let main = instance._inner.exports.get_function("main").unwrap(); - main.call(&[]).unwrap(); + instance.call_function0("main", &[]).unwrap(); - assert!(my_env.called.load(Ordering::Relaxed)); + // TODO: allow inspecting env + // assert!(fe.as_ref(&store).called.load(Ordering::Relaxed)); } #[test] fn call_function0_works() { - let instance = mock_instance(CONTRACT, &[]); + let mut instance = mock_instance(CONTRACT, &[]); instance .call_function0("interface_version_8", &[]) @@ -557,7 +630,7 @@ mod tests { #[test] fn call_function1_works() { - let instance = mock_instance(CONTRACT, &[]); + let mut instance = mock_instance(CONTRACT, &[]); // can call function few times let result = instance @@ -701,7 +774,7 @@ mod tests { )"#, ) .unwrap(); - let instance = mock_instance(&wasm, &[]); + let mut instance = mock_instance(&wasm, &[]); assert_eq!(instance.memory_pages(), 0); // min: 3 pages, max: none @@ -719,7 +792,7 @@ mod tests { )"#, ) .unwrap(); - let instance = mock_instance(&wasm, &[]); + let mut instance = mock_instance(&wasm, &[]); assert_eq!(instance.memory_pages(), 3); } @@ -741,7 +814,7 @@ mod tests { #[test] fn get_gas_left_works() { - let instance = mock_instance_with_gas_limit(CONTRACT, 123321); + let mut instance = mock_instance_with_gas_limit(CONTRACT, 123321); let orig_gas = instance.get_gas_left(); assert_eq!(orig_gas, 123321); } @@ -778,16 +851,16 @@ mod tests { fn set_storage_readonly_works() { let mut instance = mock_instance(CONTRACT, &[]); - assert!(instance.env.is_storage_readonly()); + assert!(instance.is_storage_readonly()); instance.set_storage_readonly(false); - assert!(!instance.env.is_storage_readonly()); + assert!(!instance.is_storage_readonly()); instance.set_storage_readonly(false); - assert!(!instance.env.is_storage_readonly()); + assert!(!instance.is_storage_readonly()); instance.set_storage_readonly(true); - assert!(instance.env.is_storage_readonly()); + assert!(instance.is_storage_readonly()); } #[test] diff --git a/packages/vm/src/memory.rs b/packages/vm/src/memory.rs index d5048d26ca..a85de99bf9 100644 --- a/packages/vm/src/memory.rs +++ b/packages/vm/src/memory.rs @@ -1,4 +1,6 @@ -use wasmer::{Array, ValueType, WasmPtr}; +use std::mem::MaybeUninit; + +use wasmer::{ValueType, WasmPtr}; use crate::conversion::to_u32; use crate::errors::{ @@ -24,12 +26,16 @@ struct Region { pub length: u32, } -unsafe impl ValueType for Region {} +unsafe impl ValueType for Region { + fn zero_padding_bytes(&self, bytes: &mut [MaybeUninit]) { + // TODO: do we need to do something here? + } +} /// Expects a (fixed size) Region struct at ptr, which is read. This links to the /// memory region, which is copied in the second step. /// Errors if the length of the region exceeds `max_length`. -pub fn read_region(memory: &wasmer::Memory, ptr: u32, max_length: usize) -> VmResult> { +pub fn read_region(memory: &wasmer::MemoryView, ptr: u32, max_length: usize) -> VmResult> { let region = get_region(memory, ptr)?; if region.length > to_u32(max_length)? { @@ -38,30 +44,38 @@ pub fn read_region(memory: &wasmer::Memory, ptr: u32, max_length: usize) -> VmRe ); } - match WasmPtr::::new(region.offset).deref(memory, 0, region.length) { - Some(cells) => { - // In case you want to do some premature optimization, this shows how to cast a `&'mut [Cell]` to `&mut [u8]`: - // https://github.com/wasmerio/wasmer/blob/0.13.1/lib/wasi/src/syscalls/mod.rs#L79-L81 - let len = region.length as usize; - let mut result = vec![0u8; len]; - for i in 0..len { - result[i] = cells[i].get(); - } - Ok(result) - } - None => Err(CommunicationError::deref_err(region.offset, format!( - "Tried to access memory of region {:?} in wasm memory of size {} bytes. This typically happens when the given Region pointer does not point to a proper Region struct.", - region, - memory.size().bytes().0 - )).into()), - } + let mut result = vec![0u8; region.length as usize]; + memory.read(region.offset as u64, &mut result).map_err(|err| CommunicationError::deref_err(region.offset, format!( + "Tried to access memory of region {:?} in wasm memory of size {} bytes. This typically happens when the given Region pointer does not point to a proper Region struct.", + region, + memory.size().bytes().0 + )))?; + Ok(result) + + // match WasmPtr::::new(region.offset).deref(memory, 0, region.length) { + // Some(cells) => { + // // In case you want to do some premature optimization, this shows how to cast a `&'mut [Cell]` to `&mut [u8]`: + // // https://github.com/wasmerio/wasmer/blob/0.13.1/lib/wasi/src/syscalls/mod.rs#L79-L81 + // let len = region.length as usize; + // let mut result = vec![0u8; len]; + // for i in 0..len { + // result[i] = cells[i].get(); + // } + // Ok(result) + // } + // None => Err(CommunicationError::deref_err(region.offset, format!( + // "Tried to access memory of region {:?} in wasm memory of size {} bytes. This typically happens when the given Region pointer does not point to a proper Region struct.", + // region, + // memory.size().bytes().0 + // )).into()), + // } } /// maybe_read_region is like read_region, but gracefully handles null pointer (0) by returning None /// meant to be used where the argument is optional (like scan) #[cfg(feature = "iterator")] pub fn maybe_read_region( - memory: &wasmer::Memory, + memory: &wasmer::MemoryView, ptr: u32, max_length: usize, ) -> VmResult>> { @@ -75,46 +89,48 @@ pub fn maybe_read_region( /// A prepared and sufficiently large memory Region is expected at ptr that points to pre-allocated memory. /// /// Returns number of bytes written on success. -pub fn write_region(memory: &wasmer::Memory, ptr: u32, data: &[u8]) -> VmResult<()> { +pub fn write_region(memory: &wasmer::MemoryView, ptr: u32, data: &[u8]) -> VmResult<()> { let mut region = get_region(memory, ptr)?; let region_capacity = region.capacity as usize; if data.len() > region_capacity { return Err(CommunicationError::region_too_small(region_capacity, data.len()).into()); } - match WasmPtr::::new(region.offset).deref(memory, 0, region.capacity) { - Some(cells) => { - // In case you want to do some premature optimization, this shows how to cast a `&'mut [Cell]` to `&mut [u8]`: - // https://github.com/wasmerio/wasmer/blob/0.13.1/lib/wasi/src/syscalls/mod.rs#L79-L81 - for i in 0..data.len() { - cells[i].set(data[i]) - } - region.length = data.len() as u32; - set_region(memory, ptr, region)?; - Ok(()) - }, - None => Err(CommunicationError::deref_err(region.offset, format!( - "Tried to access memory of region {:?} in wasm memory of size {} bytes. This typically happens when the given Region pointer does not point to a proper Region struct.", - region, - memory.size().bytes().0 - )).into()), - } + + memory.write(region.offset as u64, data).map_err(|err| CommunicationError::deref_err(region.offset, format!( + "Tried to access memory of region {:?} in wasm memory of size {} bytes. This typically happens when the given Region pointer does not point to a proper Region struct.", + region, + memory.size().bytes().0 + )))?; + Ok(()) + + // match WasmPtr::::new(region.offset).deref(memory, 0, region.capacity) { + // Some(cells) => { + // // In case you want to do some premature optimization, this shows how to cast a `&'mut [Cell]` to `&mut [u8]`: + // // https://github.com/wasmerio/wasmer/blob/0.13.1/lib/wasi/src/syscalls/mod.rs#L79-L81 + // for i in 0..data.len() { + // cells[i].set(data[i]) + // } + // region.length = data.len() as u32; + // set_region(memory, ptr, region)?; + // Ok(()) + // }, + // None => Err(CommunicationError::deref_err(region.offset, format!( + // "Tried to access memory of region {:?} in wasm memory of size {} bytes. This typically happens when the given Region pointer does not point to a proper Region struct.", + // region, + // memory.size().bytes().0 + // )).into()), + // } } /// Reads in a Region at ptr in wasm memory and returns a copy of it -fn get_region(memory: &wasmer::Memory, ptr: u32) -> CommunicationResult { +fn get_region(memory: &wasmer::MemoryView, ptr: u32) -> CommunicationResult { let wptr = WasmPtr::::new(ptr); - match wptr.deref(memory) { - Some(cell) => { - let region = cell.get(); - validate_region(®ion)?; - Ok(region) - } - None => Err(CommunicationError::deref_err( - ptr, - "Could not dereference this pointer to a Region", - )), - } + let region = wptr.deref(memory).read().map_err(|err| { + CommunicationError::deref_err(ptr, "Could not dereference this pointer to a Region") + })?; + validate_region(®ion)?; + Ok(region) } /// Performs plausibility checks in the given Region. Regions are always created by the @@ -139,19 +155,13 @@ fn validate_region(region: &Region) -> RegionValidationResult<()> { } /// Overrides a Region at ptr in wasm memory with data -fn set_region(memory: &wasmer::Memory, ptr: u32, data: Region) -> CommunicationResult<()> { +fn set_region(memory: &wasmer::MemoryView, ptr: u32, data: Region) -> CommunicationResult<()> { let wptr = WasmPtr::::new(ptr); - match wptr.deref(memory) { - Some(cell) => { - cell.set(data); - Ok(()) - } - None => Err(CommunicationError::deref_err( - ptr, - "Could not dereference this pointer to a Region", - )), - } + wptr.deref(memory).write(data).map_err(|err| { + CommunicationError::deref_err(ptr, "Could not dereference this pointer to a Region") + })?; + Ok(()) } #[cfg(test)] diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index f8b3cceebd..94f199387d 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -224,11 +224,11 @@ mod tests { assert!(cached.is_none()); // Store module - let module = compile(&wasm, None, &[]).unwrap(); + let (_store, module) = compile(&wasm, None, &[]).unwrap(); cache.store(&checksum, &module).unwrap(); // Load module - let store = make_runtime_store(TESTING_MEMORY_LIMIT); + let mut store = make_runtime_store(TESTING_MEMORY_LIMIT); let cached = cache.load(&checksum, &store).unwrap(); assert!(cached.is_some()); @@ -238,10 +238,10 @@ mod tests { let (cached_module, module_size) = cached.unwrap(); assert_eq!(module_size, module.serialize().unwrap().len()); let import_object = imports! {}; - let instance = WasmerInstance::new(&cached_module, &import_object).unwrap(); - set_remaining_points(&instance, TESTING_GAS_LIMIT); + let instance = WasmerInstance::new(&mut store, &cached_module, &import_object).unwrap(); + set_remaining_points(&mut store, &instance, TESTING_GAS_LIMIT); let add_one = instance.exports.get_function("add_one").unwrap(); - let result = add_one.call(&[42.into()]).unwrap(); + let result = add_one.call(&mut store, &[42.into()]).unwrap(); assert_eq!(result[0].unwrap_i32(), 43); } } @@ -256,7 +256,7 @@ mod tests { let checksum = Checksum::generate(&wasm); // Store module - let module = compile(&wasm, None, &[]).unwrap(); + let (_store, module) = compile(&wasm, None, &[]).unwrap(); cache.store(&checksum, &module).unwrap(); let mut globber = glob::glob(&format!( @@ -279,7 +279,7 @@ mod tests { let checksum = Checksum::generate(&wasm); // Store module - let module = compile(&wasm, None, &[]).unwrap(); + let (_store, module) = compile(&wasm, None, &[]).unwrap(); cache.store(&checksum, &module).unwrap(); // It's there diff --git a/packages/vm/src/modules/in_memory_cache.rs b/packages/vm/src/modules/in_memory_cache.rs index 9a14ac9960..96a0000ad5 100644 --- a/packages/vm/src/modules/in_memory_cache.rs +++ b/packages/vm/src/modules/in_memory_cache.rs @@ -142,14 +142,14 @@ mod tests { assert!(cache_entry.is_none()); // Compile module - let original = compile(&wasm, None, &[]).unwrap(); + let (mut store, original) = compile(&wasm, None, &[]).unwrap(); // Ensure original module can be executed { - let instance = WasmerInstance::new(&original, &imports! {}).unwrap(); - set_remaining_points(&instance, TESTING_GAS_LIMIT); + let instance = WasmerInstance::new(&mut store, &original, &imports! {}).unwrap(); + set_remaining_points(&mut store, &instance, TESTING_GAS_LIMIT); let add_one = instance.exports.get_function("add_one").unwrap(); - let result = add_one.call(&[42.into()]).unwrap(); + let result = add_one.call(&mut store, &[42.into()]).unwrap(); assert_eq!(result[0].unwrap_i32(), 43); } @@ -162,10 +162,10 @@ mod tests { // Ensure cached module can be executed { - let instance = WasmerInstance::new(&cached.module, &imports! {}).unwrap(); - set_remaining_points(&instance, TESTING_GAS_LIMIT); + let instance = WasmerInstance::new(&mut store, &cached.module, &imports! {}).unwrap(); + set_remaining_points(&mut store, &instance, TESTING_GAS_LIMIT); let add_one = instance.exports.get_function("add_one").unwrap(); - let result = add_one.call(&[42.into()]).unwrap(); + let result = add_one.call(&mut store, &[42.into()]).unwrap(); assert_eq!(result[0].unwrap_i32(), 43); } } @@ -213,19 +213,19 @@ mod tests { // Add 1 cache - .store(&checksum1, compile(&wasm1, None, &[]).unwrap(), 900_000) + .store(&checksum1, compile(&wasm1, None, &[]).unwrap().1, 900_000) .unwrap(); assert_eq!(cache.len(), 1); // Add 2 cache - .store(&checksum2, compile(&wasm2, None, &[]).unwrap(), 900_000) + .store(&checksum2, compile(&wasm2, None, &[]).unwrap().1, 900_000) .unwrap(); assert_eq!(cache.len(), 2); // Add 3 (pushes out the previous two) cache - .store(&checksum3, compile(&wasm3, None, &[]).unwrap(), 1_500_000) + .store(&checksum3, compile(&wasm3, None, &[]).unwrap().1, 1_500_000) .unwrap(); assert_eq!(cache.len(), 1); } @@ -273,19 +273,19 @@ mod tests { // Add 1 cache - .store(&checksum1, compile(&wasm1, None, &[]).unwrap(), 900_000) + .store(&checksum1, compile(&wasm1, None, &[]).unwrap().1, 900_000) .unwrap(); assert_eq!(cache.size(), 900_000); // Add 2 cache - .store(&checksum2, compile(&wasm2, None, &[]).unwrap(), 800_000) + .store(&checksum2, compile(&wasm2, None, &[]).unwrap().1, 800_000) .unwrap(); assert_eq!(cache.size(), 1_700_000); // Add 3 (pushes out the previous two) cache - .store(&checksum3, compile(&wasm3, None, &[]).unwrap(), 1_500_000) + .store(&checksum3, compile(&wasm3, None, &[]).unwrap().1, 1_500_000) .unwrap(); assert_eq!(cache.size(), 1_500_000); } diff --git a/packages/vm/src/modules/pinned_memory_cache.rs b/packages/vm/src/modules/pinned_memory_cache.rs index 2f1a976d82..a2a44a27bf 100644 --- a/packages/vm/src/modules/pinned_memory_cache.rs +++ b/packages/vm/src/modules/pinned_memory_cache.rs @@ -87,14 +87,14 @@ mod tests { assert!(cache_entry.is_none()); // Compile module - let original = compile(&wasm, None, &[]).unwrap(); + let (mut store, original) = compile(&wasm, None, &[]).unwrap(); // Ensure original module can be executed { - let instance = WasmerInstance::new(&original, &imports! {}).unwrap(); - set_remaining_points(&instance, TESTING_GAS_LIMIT); + let instance = WasmerInstance::new(&mut store, &original, &imports! {}).unwrap(); + set_remaining_points(&mut store, &instance, TESTING_GAS_LIMIT); let add_one = instance.exports.get_function("add_one").unwrap(); - let result = add_one.call(&[42.into()]).unwrap(); + let result = add_one.call(&mut store, &[42.into()]).unwrap(); assert_eq!(result[0].unwrap_i32(), 43); } @@ -106,10 +106,10 @@ mod tests { // Ensure cached module can be executed { - let instance = WasmerInstance::new(&cached, &imports! {}).unwrap(); - set_remaining_points(&instance, TESTING_GAS_LIMIT); + let instance = WasmerInstance::new(&mut store, &cached, &imports! {}).unwrap(); + set_remaining_points(&mut store, &instance, TESTING_GAS_LIMIT); let add_one = instance.exports.get_function("add_one").unwrap(); - let result = add_one.call(&[42.into()]).unwrap(); + let result = add_one.call(&mut store, &[42.into()]).unwrap(); assert_eq!(result[0].unwrap_i32(), 43); } } @@ -134,7 +134,7 @@ mod tests { assert!(!cache.has(&checksum)); // Add - let original = compile(&wasm, None, &[]).unwrap(); + let (_store, original) = compile(&wasm, None, &[]).unwrap(); cache.store(&checksum, original, 0).unwrap(); assert!(cache.has(&checksum)); @@ -165,7 +165,7 @@ mod tests { assert_eq!(cache.len(), 0); // Add - let original = compile(&wasm, None, &[]).unwrap(); + let (_store, original) = compile(&wasm, None, &[]).unwrap(); cache.store(&checksum, original, 0).unwrap(); assert_eq!(cache.len(), 1); @@ -207,12 +207,12 @@ mod tests { assert_eq!(cache.size(), 0); // Add 1 - let original = compile(&wasm1, None, &[]).unwrap(); + let (_store, original) = compile(&wasm1, None, &[]).unwrap(); cache.store(&checksum1, original, 500).unwrap(); assert_eq!(cache.size(), 500); // Add 2 - let original = compile(&wasm2, None, &[]).unwrap(); + let (_store, original) = compile(&wasm2, None, &[]).unwrap(); cache.store(&checksum2, original, 300).unwrap(); assert_eq!(cache.size(), 800); diff --git a/packages/vm/src/modules/versioning.rs b/packages/vm/src/modules/versioning.rs index 86ce486f8b..0c370d6fc9 100644 --- a/packages/vm/src/modules/versioning.rs +++ b/packages/vm/src/modules/versioning.rs @@ -12,11 +12,11 @@ const METADATA_HEADER_LEN: usize = 16; // https://github.com/wasmerio/wasmer/blo fn current_wasmer_module_header() -> Vec { // echo "(module)" > my.wat && wat2wasm my.wat && hexdump -C my.wasm const WASM: &[u8] = b"\x00\x61\x73\x6d\x01\x00\x00\x00"; - let module = compile(WASM, None, &[]).unwrap(); + let (_, module) = compile(WASM, None, &[]).unwrap(); let mut bytes = module.serialize().unwrap_or_default(); bytes.truncate(ENGINE_TYPE_LEN + METADATA_HEADER_LEN); - bytes + bytes.into() } /// Obtains the module version from Wasmer that is currently used. diff --git a/packages/vm/src/static_analysis.rs b/packages/vm/src/static_analysis.rs index 8352ad9d71..cb577f9135 100644 --- a/packages/vm/src/static_analysis.rs +++ b/packages/vm/src/static_analysis.rs @@ -86,7 +86,7 @@ pub fn has_ibc_entry_points(module: &impl ExportInfo) -> bool { mod tests { use super::*; use parity_wasm::elements::Internal; - use wasmer::Cranelift; + use wasmer::{Cranelift, Store}; static CONTRACT: &[u8] = include_bytes!("../testdata/hackatom.wasm"); static CORRUPTED: &[u8] = include_bytes!("../testdata/corrupted.wasm"); @@ -182,7 +182,8 @@ mod tests { fn exported_function_names_works_for_wasmer_with_no_prefix() { let wasm = wat::parse_str(r#"(module)"#).unwrap(); let compiler = Cranelift::default(); - let module = wasmer::Module::new(&compiler, wasm).unwrap(); + let store = Store::new(compiler); + let module = wasmer::Module::new(&store, wasm).unwrap(); let exports = module.exported_function_names(None); assert_eq!(exports, HashSet::new()); @@ -199,7 +200,8 @@ mod tests { ) .unwrap(); let compiler = Cranelift::default(); - let module = wasmer::Module::new(&compiler, wasm).unwrap(); + let store = Store::new(compiler); + let module = wasmer::Module::new(&store, wasm).unwrap(); let exports = module.exported_function_names(None); assert_eq!( exports, @@ -211,7 +213,8 @@ mod tests { fn exported_function_names_works_for_wasmer_with_prefix() { let wasm = wat::parse_str(r#"(module)"#).unwrap(); let compiler = Cranelift::default(); - let module = wasmer::Module::new(&compiler, wasm).unwrap(); + let store = Store::new(compiler); + let module = wasmer::Module::new(&store, wasm).unwrap(); let exports = module.exported_function_names(Some("b")); assert_eq!(exports, HashSet::new()); @@ -229,7 +232,8 @@ mod tests { ) .unwrap(); let compiler = Cranelift::default(); - let module = wasmer::Module::new(&compiler, wasm).unwrap(); + let store = Store::new(compiler); + let module = wasmer::Module::new(&store, wasm).unwrap(); let exports = module.exported_function_names(Some("b")); assert_eq!( exports, diff --git a/packages/vm/src/wasm_backend/compile.rs b/packages/vm/src/wasm_backend/compile.rs index a750997674..4a26490f2f 100644 --- a/packages/vm/src/wasm_backend/compile.rs +++ b/packages/vm/src/wasm_backend/compile.rs @@ -1,6 +1,6 @@ use std::sync::Arc; -use wasmer::{Module, ModuleMiddleware}; +use wasmer::{Module, ModuleMiddleware, Store}; use crate::errors::VmResult; use crate::size::Size; @@ -15,10 +15,10 @@ pub fn compile( code: &[u8], memory_limit: Option, middlewares: &[Arc], -) -> VmResult { +) -> VmResult<(Store, Module)> { let store = make_compile_time_store(memory_limit, middlewares); let module = Module::new(&store, code)?; - Ok(module) + Ok((store, module)) } #[cfg(test)] diff --git a/packages/vm/src/wasm_backend/gatekeeper.rs b/packages/vm/src/wasm_backend/gatekeeper.rs index c9a27c6c15..5dab19fafe 100644 --- a/packages/vm/src/wasm_backend/gatekeeper.rs +++ b/packages/vm/src/wasm_backend/gatekeeper.rs @@ -439,8 +439,6 @@ impl FunctionMiddleware for FunctionGatekeeper { | Operator::V128Load16x4U { .. } | Operator::V128Load32x2S { .. } | Operator::V128Load32x2U { .. } - | Operator::I8x16RoundingAverageU - | Operator::I16x8RoundingAverageU | Operator::V128Load8Lane { .. } | Operator::V128Load16Lane { .. } | Operator::V128Load32Lane { .. } @@ -490,11 +488,7 @@ impl FunctionMiddleware for FunctionGatekeeper { | Operator::I32x4RelaxedTruncSatF32x4S | Operator::I32x4RelaxedTruncSatF32x4U | Operator::I32x4RelaxedTruncSatF64x2SZero - | Operator::I32x4RelaxedTruncSatF64x2UZero - | Operator::I8x16LaneSelect - | Operator::I16x8LaneSelect - | Operator::I32x4LaneSelect - | Operator::I64x2LaneSelect => { + | Operator::I32x4RelaxedTruncSatF64x2UZero => { if self.config.allow_feature_simd { state.push_operator(operator); Ok(()) @@ -637,11 +631,7 @@ impl FunctionMiddleware for FunctionGatekeeper { | Operator::F32x4RelaxedMin | Operator::F32x4RelaxedMax | Operator::F64x2RelaxedMin - | Operator::F64x2RelaxedMax - | Operator::F32x4Fma - | Operator::F32x4Fms - | Operator::F64x2Fma - | Operator::F64x2Fms => { + | Operator::F64x2RelaxedMax => { if self.config.allow_floats { state.push_operator(operator); Ok(()) @@ -683,6 +673,21 @@ impl FunctionMiddleware for FunctionGatekeeper { Err(MiddlewareError::new(MIDDLEWARE_NAME, msg)) } } + // TODO: do + Operator::I8x16AvgrU => todo!(), + Operator::I16x8AvgrU => todo!(), + Operator::F32x4RelaxedFma => todo!(), + Operator::F32x4RelaxedFnma => todo!(), + Operator::F64x2RelaxedFma => todo!(), + Operator::F64x2RelaxedFnma => todo!(), + Operator::I8x16RelaxedLaneselect => todo!(), + Operator::I16x8RelaxedLaneselect => todo!(), + Operator::I32x4RelaxedLaneselect => todo!(), + Operator::I64x2RelaxedLaneselect => todo!(), + Operator::I16x8RelaxedQ15mulrS => todo!(), + Operator::I16x8DotI8x16I7x16S => todo!(), + Operator::I32x4DotI8x16I7x16AddS => todo!(), + Operator::F32x4RelaxedDotBf16x8AddF32x4 => todo!(), } } } @@ -691,7 +696,7 @@ impl FunctionMiddleware for FunctionGatekeeper { mod tests { use super::*; use std::sync::Arc; - use wasmer::{CompilerConfig, Cranelift, Module}; + use wasmer::{CompilerConfig, Cranelift, Module, Store}; #[test] fn valid_wasm_instance_sanity() { @@ -710,7 +715,8 @@ mod tests { let deterministic = Arc::new(Gatekeeper::default()); let mut compiler = Cranelift::default(); compiler.push_middleware(deterministic); - let result = Module::new(&compiler, wasm); + let store = Store::new(compiler); + let result = Module::new(&store, wasm); assert!(result.is_ok()); } @@ -730,7 +736,8 @@ mod tests { let deterministic = Arc::new(Gatekeeper::default()); let mut compiler = Cranelift::default(); compiler.push_middleware(deterministic); - let result = Module::new(&compiler, wasm); + let store = Store::new(compiler); + let result = Module::new(&store, wasm); assert!(result .unwrap_err() .to_string() @@ -756,7 +763,8 @@ mod tests { let deterministic = Arc::new(Gatekeeper::default()); let mut compiler = Cranelift::default(); compiler.push_middleware(deterministic); - let result = Module::new(&compiler, wasm); + let store = Store::new(compiler); + let result = Module::new(&store, wasm); assert!(result .unwrap_err() .to_string() diff --git a/packages/vm/src/wasm_backend/limiting_tunables.rs b/packages/vm/src/wasm_backend/limiting_tunables.rs index 553de60b63..d0b5c8a999 100644 --- a/packages/vm/src/wasm_backend/limiting_tunables.rs +++ b/packages/vm/src/wasm_backend/limiting_tunables.rs @@ -1,6 +1,5 @@ use std::ptr::NonNull; -use loupe::MemoryUsage; use wasmer::{ vm::{ MemoryError, MemoryStyle, TableStyle, VMMemory, VMMemoryDefinition, VMTable, @@ -13,7 +12,6 @@ use wasmer::{ /// /// After adjusting the memory limits, it delegates all other logic /// to the base tunables. -#[derive(MemoryUsage)] pub struct LimitingTunables { /// The maxium a linear memory is allowed to be (in Wasm pages, 65 KiB each). /// Since Wasmer ensures there is only none or one memory, this is practically diff --git a/packages/vm/src/wasm_backend/store.rs b/packages/vm/src/wasm_backend/store.rs index d837a7fb2a..23b510ede8 100644 --- a/packages/vm/src/wasm_backend/store.rs +++ b/packages/vm/src/wasm_backend/store.rs @@ -72,15 +72,13 @@ pub fn make_runtime_store(memory_limit: Option) -> Store { /// Creates a store from an engine and an optional memory limit. /// If no limit is set, the no custom tunables will be used. -fn make_store_with_engine(engine: Engine, memory_limit: Option) -> Store { - match memory_limit { - Some(limit) => { - let base = BaseTunables::for_target(&Target::default()); - let tunables = LimitingTunables::new(base, limit_to_pages(limit)); - Store::new_with_tunables(engine, tunables) - } - None => Store::new(engine), +fn make_store_with_engine(mut engine: Engine, memory_limit: Option) -> Store { + if let Some(limit) = memory_limit { + let base = BaseTunables::for_target(&Target::default()); + let tunables = LimitingTunables::new(base, limit_to_pages(limit)); + engine.set_tunables(tunables); } + Store::new(engine) } fn limit_to_pages(limit: Size) -> Pages { @@ -175,7 +173,7 @@ mod tests { // No limit let mut store = make_runtime_store(None); - let module = unsafe { Module::deserialize(&store, &serialized) }.unwrap(); + let module = unsafe { Module::deserialize(&store, serialized.clone()) }.unwrap(); let module_memory = module.info().memories.last().unwrap(); assert_eq!(module_memory.minimum, Pages(4)); assert_eq!(module_memory.maximum, None); @@ -192,7 +190,7 @@ mod tests { // Instantiate with limit let mut store = make_runtime_store(Some(Size::kibi(23 * 64))); - let module = unsafe { Module::deserialize(&store, &serialized) }.unwrap(); + let module = unsafe { Module::deserialize(&store, serialized) }.unwrap(); let module_memory = module.info().memories.last().unwrap(); assert_eq!(module_memory.minimum, Pages(4)); assert_eq!(module_memory.maximum, None); From 9313cae691a736347f1b7430ede74b931b001971 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 26 Apr 2023 12:20:43 +0200 Subject: [PATCH 0247/2372] Make it compile --- packages/vm/examples/module_size.rs | 11 +- packages/vm/src/cache.rs | 2 +- packages/vm/src/environment.rs | 6 +- packages/vm/src/imports.rs | 555 +++++++++++++--------------- 4 files changed, 258 insertions(+), 316 deletions(-) diff --git a/packages/vm/examples/module_size.rs b/packages/vm/examples/module_size.rs index ac62a6b694..5e5c8a308e 100644 --- a/packages/vm/examples/module_size.rs +++ b/packages/vm/examples/module_size.rs @@ -41,10 +41,6 @@ pub fn main() { let module = module_compile(&wasm, memory_limit); mem::drop(wasm); - // Report loupe size - let loupe_size = loupe::size_of_val(&module); - println!("module size (loupe): {} bytes", loupe_size); - let serialized = module.serialize().unwrap(); mem::drop(module); @@ -57,10 +53,6 @@ pub fn main() { mem::drop(module); let ser_size = serialized.len(); println!("module size (serialized): {} bytes", ser_size); - println!( - "(loupe) module size ratio: {:.2}", - loupe_size as f32 / wasm_size as f32 - ); println!( "(serialized) module size ratio: {:.2}", ser_size as f32 / wasm_size as f32 @@ -69,7 +61,8 @@ pub fn main() { #[inline(never)] fn module_compile(wasm: &[u8], memory_limit: Option) -> Module { - compile(wasm, memory_limit, &[]).unwrap() + let (_store, module) = compile(wasm, memory_limit, &[]).unwrap(); + module } #[inline(never)] diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 0919021e26..8f996ad7fc 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -998,7 +998,7 @@ mod tests { assert!(instance1.get_gas_left() < original_gas); // Init from memory cache - let instance2 = cache + let mut instance2 = cache .get_instance(&checksum, backend2, TESTING_OPTIONS) .unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 0); diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index 4e1bf71d6f..a84af689ed 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -108,7 +108,7 @@ pub type DebugHandlerFn = dyn for<'a> Fn(/* msg */ &'a str, DebugInfo<'a>); /// A environment that provides access to the ContextData. /// The environment is clonable but clones access the same underlying data. -pub struct Environment { +pub struct Environment { pub memory: Option, pub api: A, pub gas_config: GasConfig, @@ -392,7 +392,7 @@ impl Environment { } } -pub struct ContextData { +pub struct ContextData { gas_state: GasState, storage: Option, storage_readonly: bool, @@ -525,7 +525,7 @@ mod tests { #[test] fn move_out_works() { - let (env, store, _instance) = make_instance(TESTING_GAS_LIMIT); + let (env, _store, _instance) = make_instance(TESTING_GAS_LIMIT); // empty data on start let (inits, initq) = env.move_out(); diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 0bd03076df..821212c647 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -676,7 +676,11 @@ mod tests { (fe, store, wasmer_instance) } - fn leave_default_data(env: &Environment) { + fn leave_default_data( + fe_mut: &mut FunctionEnvMut>, + ) { + let (env, mut _store) = fe_mut.data_and_store_mut(); + // create some mock data let mut storage = MockStorage::new(); storage.set(KEY1, VALUE1).0.expect("error setting"); @@ -687,40 +691,43 @@ mod tests { } fn write_data( - env: &Environment, - store: &mut impl AsStoreMut, + fe_mut: &mut FunctionEnvMut>, data: &[u8], ) -> u32 { + let (env, mut store) = fe_mut.data_and_store_mut(); + let result = env - .call_function1(store, "allocate", &[(data.len() as u32).into()]) + .call_function1(&mut store, "allocate", &[(data.len() as u32).into()]) .unwrap(); let region_ptr = ref_to_u32(&result).unwrap(); - write_region(&env.memory(store), region_ptr, data).expect("error writing"); + write_region(&env.memory(&mut store), region_ptr, data).expect("error writing"); region_ptr } fn create_empty( wasmer_instance: &mut WasmerInstance, - store: &mut impl AsStoreMut, + fe_mut: &mut FunctionEnvMut>, capacity: u32, ) -> u32 { + let (_, mut store) = fe_mut.data_and_store_mut(); let allocate = wasmer_instance .exports .get_function("allocate") .expect("error getting function"); let result = allocate - .call(store, &[capacity.into()]) + .call(&mut store, &[capacity.into()]) .expect("error calling allocate"); ref_to_u32(&result[0]).expect("error converting result") } /// A Region reader that is just good enough for the tests in this file fn force_read( - env: &Environment, - store: &mut impl AsStoreMut, + fe_mut: &mut FunctionEnvMut>, region_ptr: u32, ) -> Vec { - read_region(&env.memory(store), region_ptr, 5000).unwrap() + let (env, mut store) = fe_mut.data_and_store_mut(); + + read_region(&env.memory(&mut store), region_ptr, 5000).unwrap() } #[test] @@ -728,14 +735,14 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - leave_default_data(env); + leave_default_data(&mut fe_mut); - let key_ptr = write_data(env, &mut store, KEY1); - let result = do_db_read(fe_mut, key_ptr); + let key_ptr = write_data(&mut fe_mut, KEY1); + let result = do_db_read(fe_mut.as_mut(), key_ptr); let value_ptr = result.unwrap(); assert!(value_ptr > 0); - assert_eq!(force_read(&fe_mut.data(), &mut store, value_ptr), VALUE1); + leave_default_data(&mut fe_mut); + assert_eq!(force_read(&mut fe_mut, value_ptr), VALUE1); } #[test] @@ -743,10 +750,9 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - leave_default_data(env); + leave_default_data(&mut fe_mut); - let key_ptr = write_data(&env, &mut store, b"I do not exist in storage"); + let key_ptr = write_data(&mut fe_mut, b"I do not exist in storage"); let result = do_db_read(fe_mut, key_ptr); assert_eq!(result.unwrap(), 0); } @@ -756,10 +762,9 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - leave_default_data(env); + leave_default_data(&mut fe_mut); - let key_ptr = write_data(env, &mut store, &vec![7u8; 300 * 1024]); + let key_ptr = write_data(&mut fe_mut, &vec![7u8; 300 * 1024]); let result = do_db_read(fe_mut, key_ptr); match result.unwrap_err() { VmError::CommunicationErr { @@ -775,16 +780,16 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - let key_ptr = write_data(env, &mut store, b"new storage key"); - let value_ptr = write_data(env, &mut store, b"new value"); + let key_ptr = write_data(&mut fe_mut, b"new storage key"); + let value_ptr = write_data(&mut fe_mut, b"new value"); - leave_default_data(env); + leave_default_data(&mut fe_mut); - do_db_write(fe_mut, key_ptr, value_ptr).unwrap(); + do_db_write(fe_mut.as_mut(), key_ptr, value_ptr).unwrap(); - let val = env + let val = fe_mut + .data() .with_storage_from_context::<_, _>(|store| { Ok(store .get(b"new storage key") @@ -800,14 +805,13 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - let key_ptr = write_data(env, &mut store, KEY1); - let value_ptr = write_data(env, &mut store, VALUE2); + let key_ptr = write_data(&mut fe_mut, KEY1); + let value_ptr = write_data(&mut fe_mut, VALUE2); - leave_default_data(env); + leave_default_data(&mut fe_mut); - do_db_write(fe_mut, key_ptr, value_ptr).unwrap(); + do_db_write(fe_mut.as_mut(), key_ptr, value_ptr).unwrap(); let val = fe_mut .data() @@ -823,14 +827,13 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - let key_ptr = write_data(env, &mut store, b"new storage key"); - let value_ptr = write_data(env, &mut store, b""); + let key_ptr = write_data(&mut fe_mut, b"new storage key"); + let value_ptr = write_data(&mut fe_mut, b""); - leave_default_data(env); + leave_default_data(&mut fe_mut); - do_db_write(fe_mut, key_ptr, value_ptr).unwrap(); + do_db_write(fe_mut.as_mut(), key_ptr, value_ptr).unwrap(); let val = fe_mut .data() @@ -849,12 +852,11 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - let key_ptr = write_data(env, &mut store, &vec![4u8; 300 * 1024]); - let value_ptr = write_data(env, &mut store, b"new value"); + let key_ptr = write_data(&mut fe_mut, &vec![4u8; 300 * 1024]); + let value_ptr = write_data(&mut fe_mut, b"new value"); - leave_default_data(env); + leave_default_data(&mut fe_mut); let result = do_db_write(fe_mut, key_ptr, value_ptr); match result.unwrap_err() { @@ -877,12 +879,11 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - let key_ptr = write_data(env, &mut store, b"new storage key"); - let value_ptr = write_data(env, &mut store, &vec![5u8; 300 * 1024]); + let key_ptr = write_data(&mut fe_mut, b"new storage key"); + let value_ptr = write_data(&mut fe_mut, &vec![5u8; 300 * 1024]); - leave_default_data(env); + leave_default_data(&mut fe_mut); let result = do_db_write(fe_mut, key_ptr, value_ptr); match result.unwrap_err() { @@ -905,12 +906,11 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - let key_ptr = write_data(env, &mut store, b"new storage key"); - let value_ptr = write_data(env, &mut store, b"new value"); + let key_ptr = write_data(&mut fe_mut, b"new storage key"); + let value_ptr = write_data(&mut fe_mut, b"new value"); - leave_default_data(env); + leave_default_data(&mut fe_mut); fe_mut.data().set_storage_readonly(true); let result = do_db_write(fe_mut, key_ptr, value_ptr); @@ -925,12 +925,11 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let existing_key = KEY1; - let key_ptr = write_data(env, &mut store, existing_key); + let key_ptr = write_data(&mut fe_mut, existing_key); - leave_default_data(env); + leave_default_data(&mut fe_mut); fe_mut .data() @@ -940,7 +939,7 @@ mod tests { }) .unwrap(); - do_db_remove(fe_mut, key_ptr).unwrap(); + do_db_remove(fe_mut.as_mut(), key_ptr).unwrap(); fe_mut .data() @@ -964,15 +963,14 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let non_existent_key = b"I do not exist"; - let key_ptr = write_data(env, &mut store, non_existent_key); + let key_ptr = write_data(&mut fe_mut, non_existent_key); - leave_default_data(env); + leave_default_data(&mut fe_mut); // Note: right now we cannot differnetiate between an existent and a non-existent key - do_db_remove(fe_mut, key_ptr).unwrap(); + do_db_remove(fe_mut.as_mut(), key_ptr).unwrap(); let value = fe_mut .data() @@ -988,11 +986,10 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - let key_ptr = write_data(&env, &mut store, &vec![26u8; 300 * 1024]); + let key_ptr = write_data(&mut fe_mut, &vec![26u8; 300 * 1024]); - leave_default_data(env); + leave_default_data(&mut fe_mut); let result = do_db_remove(fe_mut, key_ptr); match result.unwrap_err() { @@ -1015,11 +1012,10 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - let key_ptr = write_data(env, &mut store, b"a storage key"); + let key_ptr = write_data(&mut fe_mut, b"a storage key"); - leave_default_data(env); + leave_default_data(&mut fe_mut); fe_mut.data().set_storage_readonly(true); let result = do_db_remove(fe_mut, key_ptr); @@ -1034,18 +1030,13 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - let source_ptr1 = write_data(env, &mut store, b"foo"); - let source_ptr2 = write_data( - fe_mut.data(), - &mut store, - b"eth1n48g2mjh9ezz7zjtya37wtgg5r5emr0drkwlgw", - ); + let source_ptr1 = write_data(&mut fe_mut, b"foo"); + let source_ptr2 = write_data(&mut fe_mut, b"eth1n48g2mjh9ezz7zjtya37wtgg5r5emr0drkwlgw"); - let res = do_addr_validate(fe_mut, source_ptr1).unwrap(); + let res = do_addr_validate(fe_mut.as_mut(), source_ptr1).unwrap(); assert_eq!(res, 0); - let res = do_addr_validate(fe_mut, source_ptr2).unwrap(); + let res = do_addr_validate(fe_mut.as_mut(), source_ptr2).unwrap(); assert_eq!(res, 0); } @@ -1054,34 +1045,33 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - let source_ptr1 = write_data(env, &mut store, b"fo\x80o"); // invalid UTF-8 (fo�o) - let source_ptr2 = write_data(env, &mut store, b""); // empty - let source_ptr3 = write_data(env, &mut store, b"addressexceedingaddressspacesuperlongreallylongiamensuringthatitislongerthaneverything"); // too long - let source_ptr4 = write_data(env, &mut store, b"fooBar"); // Not normalized. The definition of normalized is chain-dependent but the MockApi requires lower case. + let source_ptr1 = write_data(&mut fe_mut, b"fo\x80o"); // invalid UTF-8 (fo�o) + let source_ptr2 = write_data(&mut fe_mut, b""); // empty + let source_ptr3 = write_data(&mut fe_mut, b"addressexceedingaddressspacesuperlongreallylongiamensuringthatitislongerthaneverything"); // too long + let source_ptr4 = write_data(&mut fe_mut, b"fooBar"); // Not normalized. The definition of normalized is chain-dependent but the MockApi requires lower case. - let res = do_addr_validate(fe_mut, source_ptr1).unwrap(); + let res = do_addr_validate(fe_mut.as_mut(), source_ptr1).unwrap(); assert_ne!(res, 0); - let err = String::from_utf8(force_read(env, &mut store, res)).unwrap(); + let err = String::from_utf8(force_read(&mut fe_mut, res)).unwrap(); assert_eq!(err, "Input is not valid UTF-8"); - let res = do_addr_validate(fe_mut, source_ptr2).unwrap(); + let res = do_addr_validate(fe_mut.as_mut(), source_ptr2).unwrap(); assert_ne!(res, 0); - let err = String::from_utf8(force_read(env, &mut store, res)).unwrap(); + let err = String::from_utf8(force_read(&mut fe_mut, res)).unwrap(); assert_eq!(err, "Input is empty"); - let res = do_addr_validate(fe_mut, source_ptr3).unwrap(); + let res = do_addr_validate(fe_mut.as_mut(), source_ptr3).unwrap(); assert_ne!(res, 0); - let err = String::from_utf8(force_read(env, &mut store, res)).unwrap(); + let err = String::from_utf8(force_read(&mut fe_mut, res)).unwrap(); assert_eq!( err, "Invalid input: human address too long for this mock implementation (must be <= 64)." ); - let res = do_addr_validate(fe_mut, source_ptr4).unwrap(); + let res = do_addr_validate(fe_mut.as_mut(), source_ptr4).unwrap(); assert_ne!(res, 0); - let err = String::from_utf8(force_read(env, &mut store, res)).unwrap(); + let err = String::from_utf8(force_read(&mut fe_mut, res)).unwrap(); assert_eq!(err, "Address is not normalized"); } @@ -1090,11 +1080,10 @@ mod tests { let api = MockApi::new_failing("Temporarily unavailable"); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - let source_ptr = write_data(env, &mut store, b"foo"); + let source_ptr = write_data(&mut fe_mut, b"foo"); - leave_default_data(env); + leave_default_data(&mut fe_mut); let result = do_addr_validate(fe_mut, source_ptr); match result.unwrap_err() { @@ -1111,11 +1100,10 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - let source_ptr = write_data(env, &mut store, &[61; 333]); + let source_ptr = write_data(&mut fe_mut, &[61; 333]); - leave_default_data(env); + leave_default_data(&mut fe_mut); let result = do_addr_validate(fe_mut, source_ptr); match result.unwrap_err() { @@ -1138,18 +1126,17 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let api = MockApi::default(); - let source_ptr = write_data(env, &mut store, b"foo"); - let dest_ptr = create_empty(&mut instance, &mut store, api.canonical_length() as u32); + let source_ptr = write_data(&mut fe_mut, b"foo"); + let dest_ptr = create_empty(&mut instance, &mut fe_mut, api.canonical_length() as u32); - leave_default_data(env); + leave_default_data(&mut fe_mut); let api = MockApi::default(); - let res = do_addr_canonicalize(fe_mut, source_ptr, dest_ptr).unwrap(); + let res = do_addr_canonicalize(fe_mut.as_mut(), source_ptr, dest_ptr).unwrap(); assert_eq!(res, 0); - let data = force_read(env, &mut store, dest_ptr); + let data = force_read(&mut fe_mut, dest_ptr); assert_eq!(data.len(), api.canonical_length()); } @@ -1158,28 +1145,27 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - let source_ptr1 = write_data(env, &mut store, b"fo\x80o"); // invalid UTF-8 (fo�o) - let source_ptr2 = write_data(env, &mut store, b""); // empty - let source_ptr3 = write_data(env, &mut store, b"addressexceedingaddressspacesuperlongreallylongiamensuringthatitislongerthaneverything"); // too long - let dest_ptr = create_empty(&mut instance, &mut store, 70); + let source_ptr1 = write_data(&mut fe_mut, b"fo\x80o"); // invalid UTF-8 (fo�o) + let source_ptr2 = write_data(&mut fe_mut, b""); // empty + let source_ptr3 = write_data(&mut fe_mut, b"addressexceedingaddressspacesuperlongreallylongiamensuringthatitislongerthaneverything"); // too long + let dest_ptr = create_empty(&mut instance, &mut fe_mut, 70); - leave_default_data(env); + leave_default_data(&mut fe_mut); - let res = do_addr_canonicalize(fe_mut, source_ptr1, dest_ptr).unwrap(); + let res = do_addr_canonicalize(fe_mut.as_mut(), source_ptr1, dest_ptr).unwrap(); assert_ne!(res, 0); - let err = String::from_utf8(force_read(env, &mut store, res)).unwrap(); + let err = String::from_utf8(force_read(&mut fe_mut, res)).unwrap(); assert_eq!(err, "Input is not valid UTF-8"); - let res = do_addr_canonicalize(fe_mut, source_ptr2, dest_ptr).unwrap(); + let res = do_addr_canonicalize(fe_mut.as_mut(), source_ptr2, dest_ptr).unwrap(); assert_ne!(res, 0); - let err = String::from_utf8(force_read(env, &mut store, res)).unwrap(); + let err = String::from_utf8(force_read(&mut fe_mut, res)).unwrap(); assert_eq!(err, "Input is empty"); - let res = do_addr_canonicalize(fe_mut, source_ptr3, dest_ptr).unwrap(); + let res = do_addr_canonicalize(fe_mut.as_mut(), source_ptr3, dest_ptr).unwrap(); assert_ne!(res, 0); - let err = String::from_utf8(force_read(env, &mut store, res)).unwrap(); + let err = String::from_utf8(force_read(&mut fe_mut, res)).unwrap(); assert_eq!( err, "Invalid input: human address too long for this mock implementation (must be <= 64)." @@ -1191,14 +1177,13 @@ mod tests { let api = MockApi::new_failing("Temporarily unavailable"); let (fe, mut store, mut instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - let source_ptr = write_data(env, &mut store, b"foo"); - let dest_ptr = create_empty(&mut instance, &mut store, 7); + let source_ptr = write_data(&mut fe_mut, b"foo"); + let dest_ptr = create_empty(&mut instance, &mut fe_mut, 7); - leave_default_data(env); + leave_default_data(&mut fe_mut); - let result = do_addr_canonicalize(fe_mut, source_ptr, dest_ptr); + let result = do_addr_canonicalize(fe_mut.as_mut(), source_ptr, dest_ptr); match result.unwrap_err() { VmError::BackendErr { source: BackendError::Unknown { msg, .. }, @@ -1213,14 +1198,13 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - let source_ptr = write_data(env, &mut store, &[61; 333]); - let dest_ptr = create_empty(&mut instance, &mut store, 8); + let source_ptr = write_data(&mut fe_mut, &[61; 333]); + let dest_ptr = create_empty(&mut instance, &mut fe_mut, 8); - leave_default_data(env); + leave_default_data(&mut fe_mut); - let result = do_addr_canonicalize(fe_mut, source_ptr, dest_ptr); + let result = do_addr_canonicalize(fe_mut.as_mut(), source_ptr, dest_ptr); match result.unwrap_err() { VmError::CommunicationErr { source: @@ -1241,12 +1225,11 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - let source_ptr = write_data(env, &mut store, b"foo"); - let dest_ptr = create_empty(&mut instance, &mut store, 7); + let source_ptr = write_data(&mut fe_mut, b"foo"); + let dest_ptr = create_empty(&mut instance, &mut fe_mut, 7); - leave_default_data(env); + leave_default_data(&mut fe_mut); let result = do_addr_canonicalize(fe_mut, source_ptr, dest_ptr); match result.unwrap_err() { @@ -1266,18 +1249,17 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let api = MockApi::default(); let source_data = vec![0x22; api.canonical_length()]; - let source_ptr = write_data(env, &mut store, &source_data); - let dest_ptr = create_empty(&mut instance, &mut store, 70); + let source_ptr = write_data(&mut fe_mut, &source_data); + let dest_ptr = create_empty(&mut instance, &mut fe_mut, 70); - leave_default_data(env); + leave_default_data(&mut fe_mut); - let error_ptr = do_addr_humanize(fe_mut, source_ptr, dest_ptr).unwrap(); + let error_ptr = do_addr_humanize(fe_mut.as_mut(), source_ptr, dest_ptr).unwrap(); assert_eq!(error_ptr, 0); - assert_eq!(force_read(env, &mut store, dest_ptr), source_data); + assert_eq!(force_read(&mut fe_mut, dest_ptr), source_data); } #[test] @@ -1285,16 +1267,15 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - let source_ptr = write_data(env, &mut store, b"foo"); // too short - let dest_ptr = create_empty(&mut instance, &mut store, 70); + let source_ptr = write_data(&mut fe_mut, b"foo"); // too short + let dest_ptr = create_empty(&mut instance, &mut fe_mut, 70); - leave_default_data(env); + leave_default_data(&mut fe_mut); - let res = do_addr_humanize(fe_mut, source_ptr, dest_ptr).unwrap(); + let res = do_addr_humanize(fe_mut.as_mut(), source_ptr, dest_ptr).unwrap(); assert_ne!(res, 0); - let err = String::from_utf8(force_read(env, &mut store, res)).unwrap(); + let err = String::from_utf8(force_read(&mut fe_mut, res)).unwrap(); assert_eq!(err, "Invalid input: canonical address length not correct"); } @@ -1303,12 +1284,11 @@ mod tests { let api = MockApi::new_failing("Temporarily unavailable"); let (fe, mut store, mut instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - let source_ptr = write_data(env, &mut store, b"foo\0\0\0\0\0"); - let dest_ptr = create_empty(&mut instance, &mut store, 70); + let source_ptr = write_data(&mut fe_mut, b"foo\0\0\0\0\0"); + let dest_ptr = create_empty(&mut instance, &mut fe_mut, 70); - leave_default_data(env); + leave_default_data(&mut fe_mut); let result = do_addr_humanize(fe_mut, source_ptr, dest_ptr); match result.unwrap_err() { @@ -1325,12 +1305,11 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - let source_ptr = write_data(env, &mut store, &[61; 65]); - let dest_ptr = create_empty(&mut instance, &mut store, 70); + let source_ptr = write_data(&mut fe_mut, &[61; 65]); + let dest_ptr = create_empty(&mut instance, &mut fe_mut, 70); - leave_default_data(env); + leave_default_data(&mut fe_mut); let result = do_addr_humanize(fe_mut, source_ptr, dest_ptr); match result.unwrap_err() { @@ -1353,14 +1332,13 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let api = MockApi::default(); let source_data = vec![0x22; api.canonical_length()]; - let source_ptr = write_data(env, &mut store, &source_data); - let dest_ptr = create_empty(&mut instance, &mut store, 2); + let source_ptr = write_data(&mut fe_mut, &source_data); + let dest_ptr = create_empty(&mut instance, &mut fe_mut, 2); - leave_default_data(env); + leave_default_data(&mut fe_mut); let result = do_addr_humanize(fe_mut, source_ptr, dest_ptr); match result.unwrap_err() { @@ -1380,14 +1358,13 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); - let hash_ptr = write_data(env, &mut store, &hash); + let hash_ptr = write_data(&mut fe_mut, &hash); let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(env, &mut store, &sig); + let sig_ptr = write_data(&mut fe_mut, &sig); let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(env, &mut store, &pubkey); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), @@ -1400,16 +1377,15 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let mut hash = hex::decode(ECDSA_HASH_HEX).unwrap(); // alter hash hash[0] ^= 0x01; - let hash_ptr = write_data(env, &mut store, &hash); + let hash_ptr = write_data(&mut fe_mut, &hash); let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(env, &mut store, &sig); + let sig_ptr = write_data(&mut fe_mut, &sig); let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(env, &mut store, &pubkey); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), @@ -1422,16 +1398,15 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let mut hash = hex::decode(ECDSA_HASH_HEX).unwrap(); // extend / break hash hash.push(0x00); - let hash_ptr = write_data(env, &mut store, &hash); + let hash_ptr = write_data(&mut fe_mut, &hash); let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(env, &mut store, &sig); + let sig_ptr = write_data(&mut fe_mut, &sig); let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(env, &mut store, &pubkey); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); let result = do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr); match result.unwrap_err() { @@ -1448,16 +1423,15 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let mut hash = hex::decode(ECDSA_HASH_HEX).unwrap(); // reduce / break hash hash.pop(); - let hash_ptr = write_data(env, &mut store, &hash); + let hash_ptr = write_data(&mut fe_mut, &hash); let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(env, &mut store, &sig); + let sig_ptr = write_data(&mut fe_mut, &sig); let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(env, &mut store, &pubkey); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), @@ -1470,16 +1444,15 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); - let hash_ptr = write_data(env, &mut store, &hash); + let hash_ptr = write_data(&mut fe_mut, &hash); let mut sig = hex::decode(ECDSA_SIG_HEX).unwrap(); // alter sig sig[0] ^= 0x01; - let sig_ptr = write_data(env, &mut store, &sig); + let sig_ptr = write_data(&mut fe_mut, &sig); let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(env, &mut store, &pubkey); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), @@ -1492,16 +1465,15 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); - let hash_ptr = write_data(env, &mut store, &hash); + let hash_ptr = write_data(&mut fe_mut, &hash); let mut sig = hex::decode(ECDSA_SIG_HEX).unwrap(); // extend / break sig sig.push(0x00); - let sig_ptr = write_data(env, &mut store, &sig); + let sig_ptr = write_data(&mut fe_mut, &sig); let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(env, &mut store, &pubkey); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); let result = do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr); match result.unwrap_err() { @@ -1518,16 +1490,15 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); - let hash_ptr = write_data(env, &mut store, &hash); + let hash_ptr = write_data(&mut fe_mut, &hash); let mut sig = hex::decode(ECDSA_SIG_HEX).unwrap(); // reduce / break sig sig.pop(); - let sig_ptr = write_data(env, &mut store, &sig); + let sig_ptr = write_data(&mut fe_mut, &sig); let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(env, &mut store, &pubkey); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), @@ -1540,16 +1511,15 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); - let hash_ptr = write_data(env, &mut store, &hash); + let hash_ptr = write_data(&mut fe_mut, &hash); let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(env, &mut store, &sig); + let sig_ptr = write_data(&mut fe_mut, &sig); let mut pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); // alter pubkey format pubkey[0] ^= 0x01; - let pubkey_ptr = write_data(env, &mut store, &pubkey); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), @@ -1562,16 +1532,15 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); - let hash_ptr = write_data(env, &mut store, &hash); + let hash_ptr = write_data(&mut fe_mut, &hash); let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(env, &mut store, &sig); + let sig_ptr = write_data(&mut fe_mut, &sig); let mut pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); // alter pubkey pubkey[1] ^= 0x01; - let pubkey_ptr = write_data(env, &mut store, &pubkey); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), @@ -1584,16 +1553,15 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); - let hash_ptr = write_data(env, &mut store, &hash); + let hash_ptr = write_data(&mut fe_mut, &hash); let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(env, &mut store, &sig); + let sig_ptr = write_data(&mut fe_mut, &sig); let mut pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); // extend / break pubkey pubkey.push(0x00); - let pubkey_ptr = write_data(env, &mut store, &pubkey); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); let result = do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr); match result.unwrap_err() { @@ -1610,16 +1578,15 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); - let hash_ptr = write_data(env, &mut store, &hash); + let hash_ptr = write_data(&mut fe_mut, &hash); let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(env, &mut store, &sig); + let sig_ptr = write_data(&mut fe_mut, &sig); let mut pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); // reduce / break pubkey pubkey.pop(); - let pubkey_ptr = write_data(env, &mut store, &pubkey); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), @@ -1632,14 +1599,13 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); - let hash_ptr = write_data(env, &mut store, &hash); + let hash_ptr = write_data(&mut fe_mut, &hash); let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(env, &mut store, &sig); + let sig_ptr = write_data(&mut fe_mut, &sig); let pubkey = vec![]; - let pubkey_ptr = write_data(env, &mut store, &pubkey); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), @@ -1652,14 +1618,13 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let hash = vec![0x22; MESSAGE_HASH_MAX_LEN]; - let hash_ptr = write_data(env, &mut store, &hash); + let hash_ptr = write_data(&mut fe_mut, &hash); let sig = vec![0x22; ECDSA_SIGNATURE_LEN]; - let sig_ptr = write_data(env, &mut store, &sig); + let sig_ptr = write_data(&mut fe_mut, &sig); let pubkey = vec![0x04; ECDSA_PUBKEY_MAX_LEN]; - let pubkey_ptr = write_data(env, &mut store, &pubkey); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), @@ -1672,7 +1637,6 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); // https://gist.github.com/webmaster128/130b628d83621a33579751846699ed15 let hash = hex!("5ae8317d34d1e595e3fa7247db80c0af4320cce1116de187f8f7e2e099c0d8d0"); @@ -1680,14 +1644,15 @@ mod tests { let recovery_param = 1; let expected = hex!("044a071e8a6e10aada2b8cf39fa3b5fb3400b04e99ea8ae64ceea1a977dbeaf5d5f8c8fbd10b71ab14cd561f7df8eb6da50f8a8d81ba564342244d26d1d4211595"); - let hash_ptr = write_data(env, &mut store, &hash); - let sig_ptr = write_data(env, &mut store, &sig); + let hash_ptr = write_data(&mut fe_mut, &hash); + let sig_ptr = write_data(&mut fe_mut, &sig); let result = - do_secp256k1_recover_pubkey(fe_mut, hash_ptr, sig_ptr, recovery_param).unwrap(); + do_secp256k1_recover_pubkey(fe_mut.as_mut(), hash_ptr, sig_ptr, recovery_param) + .unwrap(); let error = result >> 32; let pubkey_ptr: u32 = (result & 0xFFFFFFFF).try_into().unwrap(); assert_eq!(error, 0); - assert_eq!(force_read(env, &mut store, pubkey_ptr), expected); + assert_eq!(force_read(&mut fe_mut, pubkey_ptr), expected); } #[test] @@ -1695,14 +1660,13 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let msg = hex::decode(EDDSA_MSG_HEX).unwrap(); - let msg_ptr = write_data(env, &mut store, &msg); + let msg_ptr = write_data(&mut fe_mut, &msg); let sig = hex::decode(EDDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(env, &mut store, &sig); + let sig_ptr = write_data(&mut fe_mut, &sig); let pubkey = hex::decode(EDDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(env, &mut store, &pubkey); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( do_ed25519_verify(fe_mut, msg_ptr, sig_ptr, pubkey_ptr).unwrap(), @@ -1715,16 +1679,15 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let mut msg = hex::decode(EDDSA_MSG_HEX).unwrap(); // alter msg msg.push(0x01); - let msg_ptr = write_data(env, &mut store, &msg); + let msg_ptr = write_data(&mut fe_mut, &msg); let sig = hex::decode(EDDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(env, &mut store, &sig); + let sig_ptr = write_data(&mut fe_mut, &sig); let pubkey = hex::decode(EDDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(env, &mut store, &pubkey); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( do_ed25519_verify(fe_mut, msg_ptr, sig_ptr, pubkey_ptr).unwrap(), @@ -1737,16 +1700,15 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let mut msg = hex::decode(EDDSA_MSG_HEX).unwrap(); // extend / break msg msg.extend_from_slice(&[0x00; MAX_LENGTH_ED25519_MESSAGE + 1]); - let msg_ptr = write_data(env, &mut store, &msg); + let msg_ptr = write_data(&mut fe_mut, &msg); let sig = hex::decode(EDDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(env, &mut store, &sig); + let sig_ptr = write_data(&mut fe_mut, &sig); let pubkey = hex::decode(EDDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(env, &mut store, &pubkey); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); let result = do_ed25519_verify(fe_mut, msg_ptr, sig_ptr, pubkey_ptr); match result.unwrap_err() { @@ -1763,16 +1725,15 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let msg = hex::decode(EDDSA_MSG_HEX).unwrap(); - let msg_ptr = write_data(env, &mut store, &msg); + let msg_ptr = write_data(&mut fe_mut, &msg); let mut sig = hex::decode(EDDSA_SIG_HEX).unwrap(); // alter sig sig[0] ^= 0x01; - let sig_ptr = write_data(env, &mut store, &sig); + let sig_ptr = write_data(&mut fe_mut, &sig); let pubkey = hex::decode(EDDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(env, &mut store, &pubkey); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( do_ed25519_verify(fe_mut, msg_ptr, sig_ptr, pubkey_ptr).unwrap(), @@ -1785,16 +1746,15 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let msg = hex::decode(EDDSA_MSG_HEX).unwrap(); - let msg_ptr = write_data(env, &mut store, &msg); + let msg_ptr = write_data(&mut fe_mut, &msg); let mut sig = hex::decode(EDDSA_SIG_HEX).unwrap(); // extend / break sig sig.push(0x00); - let sig_ptr = write_data(env, &mut store, &sig); + let sig_ptr = write_data(&mut fe_mut, &sig); let pubkey = hex::decode(EDDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(env, &mut store, &pubkey); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); let result = do_ed25519_verify(fe_mut, msg_ptr, sig_ptr, pubkey_ptr); match result.unwrap_err() { @@ -1811,16 +1771,15 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let msg = hex::decode(EDDSA_MSG_HEX).unwrap(); - let msg_ptr = write_data(env, &mut store, &msg); + let msg_ptr = write_data(&mut fe_mut, &msg); let mut sig = hex::decode(EDDSA_SIG_HEX).unwrap(); // reduce / break sig sig.pop(); - let sig_ptr = write_data(env, &mut store, &sig); + let sig_ptr = write_data(&mut fe_mut, &sig); let pubkey = hex::decode(EDDSA_PUBKEY_HEX).unwrap(); - let pubkey_ptr = write_data(env, &mut store, &pubkey); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( do_ed25519_verify(fe_mut, msg_ptr, sig_ptr, pubkey_ptr).unwrap(), @@ -1833,16 +1792,15 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let msg = hex::decode(EDDSA_MSG_HEX).unwrap(); - let msg_ptr = write_data(env, &mut store, &msg); + let msg_ptr = write_data(&mut fe_mut, &msg); let sig = hex::decode(EDDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(env, &mut store, &sig); + let sig_ptr = write_data(&mut fe_mut, &sig); let mut pubkey = hex::decode(EDDSA_PUBKEY_HEX).unwrap(); // alter pubkey pubkey[1] ^= 0x01; - let pubkey_ptr = write_data(env, &mut store, &pubkey); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( do_ed25519_verify(fe_mut, msg_ptr, sig_ptr, pubkey_ptr).unwrap(), @@ -1855,16 +1813,15 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let msg = hex::decode(EDDSA_MSG_HEX).unwrap(); - let msg_ptr = write_data(env, &mut store, &msg); + let msg_ptr = write_data(&mut fe_mut, &msg); let sig = hex::decode(EDDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(env, &mut store, &sig); + let sig_ptr = write_data(&mut fe_mut, &sig); let mut pubkey = hex::decode(EDDSA_PUBKEY_HEX).unwrap(); // extend / break pubkey pubkey.push(0x00); - let pubkey_ptr = write_data(env, &mut store, &pubkey); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); let result = do_ed25519_verify(fe_mut, msg_ptr, sig_ptr, pubkey_ptr); match result.unwrap_err() { @@ -1881,16 +1838,15 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let msg = hex::decode(EDDSA_MSG_HEX).unwrap(); - let msg_ptr = write_data(env, &mut store, &msg); + let msg_ptr = write_data(&mut fe_mut, &msg); let sig = hex::decode(EDDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(env, &mut store, &sig); + let sig_ptr = write_data(&mut fe_mut, &sig); let mut pubkey = hex::decode(EDDSA_PUBKEY_HEX).unwrap(); // reduce / break pubkey pubkey.pop(); - let pubkey_ptr = write_data(env, &mut store, &pubkey); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( do_ed25519_verify(fe_mut, msg_ptr, sig_ptr, pubkey_ptr).unwrap(), @@ -1903,14 +1859,13 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let msg = hex::decode(EDDSA_MSG_HEX).unwrap(); - let msg_ptr = write_data(env, &mut store, &msg); + let msg_ptr = write_data(&mut fe_mut, &msg); let sig = hex::decode(EDDSA_SIG_HEX).unwrap(); - let sig_ptr = write_data(env, &mut store, &sig); + let sig_ptr = write_data(&mut fe_mut, &sig); let pubkey = vec![]; - let pubkey_ptr = write_data(env, &mut store, &pubkey); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( do_ed25519_verify(fe_mut, msg_ptr, sig_ptr, pubkey_ptr).unwrap(), @@ -1923,14 +1878,13 @@ mod tests { let api = MockApi::default(); let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let msg = vec![0x22; MESSAGE_HASH_MAX_LEN]; - let msg_ptr = write_data(env, &mut store, &msg); + let msg_ptr = write_data(&mut fe_mut, &msg); let sig = vec![0x22; MAX_LENGTH_ED25519_SIGNATURE]; - let sig_ptr = write_data(env, &mut store, &sig); + let sig_ptr = write_data(&mut fe_mut, &sig); let pubkey = vec![0x04; EDDSA_PUBKEY_LEN]; - let pubkey_ptr = write_data(env, &mut store, &pubkey); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( do_ed25519_verify(fe_mut, msg_ptr, sig_ptr, pubkey_ptr).unwrap(), @@ -1943,18 +1897,17 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let request: QueryRequest = QueryRequest::Bank(BankQuery::AllBalances { address: INIT_ADDR.to_string(), }); let request_data = cosmwasm_std::to_vec(&request).unwrap(); - let request_ptr = write_data(env, &mut store, &request_data); + let request_ptr = write_data(&mut fe_mut, &request_data); - leave_default_data(env); + leave_default_data(&mut fe_mut); - let response_ptr = do_query_chain(fe_mut, request_ptr).unwrap(); - let response = force_read(env, &mut store, response_ptr); + let response_ptr = do_query_chain(fe_mut.as_mut(), request_ptr).unwrap(); + let response = force_read(&mut fe_mut, response_ptr); let query_result: cosmwasm_std::QuerierResult = cosmwasm_std::from_slice(&response).unwrap(); @@ -1969,15 +1922,14 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let request = b"Not valid JSON for sure"; - let request_ptr = write_data(env, &mut store, request); + let request_ptr = write_data(&mut fe_mut, request); - leave_default_data(env); + leave_default_data(&mut fe_mut); - let response_ptr = do_query_chain(fe_mut, request_ptr).unwrap(); - let response = force_read(env, &mut store, response_ptr); + let response_ptr = do_query_chain(fe_mut.as_mut(), request_ptr).unwrap(); + let response = force_read(&mut fe_mut, response_ptr); let query_result: cosmwasm_std::QuerierResult = cosmwasm_std::from_slice(&response).unwrap(); @@ -1995,19 +1947,18 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); let request: QueryRequest = QueryRequest::Wasm(WasmQuery::Smart { contract_addr: String::from("non-existent"), msg: Binary::from(b"{}" as &[u8]), }); let request_data = cosmwasm_std::to_vec(&request).unwrap(); - let request_ptr = write_data(env, &mut store, &request_data); + let request_ptr = write_data(&mut fe_mut, &request_data); - leave_default_data(env); + leave_default_data(&mut fe_mut); - let response_ptr = do_query_chain(fe_mut, request_ptr).unwrap(); - let response = force_read(env, &mut store, response_ptr); + let response_ptr = do_query_chain(fe_mut.as_mut(), request_ptr).unwrap(); + let response = force_read(&mut fe_mut, response_ptr); let query_result: cosmwasm_std::QuerierResult = cosmwasm_std::from_slice(&response).unwrap(); @@ -2026,24 +1977,26 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - leave_default_data(env); + leave_default_data(&mut fe_mut); // set up iterator over all space - let id = do_db_scan(fe_mut, 0, 0, Order::Ascending.into()).unwrap(); + let id = do_db_scan(fe_mut.as_mut(), 0, 0, Order::Ascending.into()).unwrap(); assert_eq!(1, id); - let item = env + let item = fe_mut + .data() .with_storage_from_context::<_, _>(|store| Ok(store.next(id))) .unwrap(); assert_eq!(item.0.unwrap().unwrap(), (KEY1.to_vec(), VALUE1.to_vec())); - let item = env + let item = fe_mut + .data() .with_storage_from_context::<_, _>(|store| Ok(store.next(id))) .unwrap(); assert_eq!(item.0.unwrap().unwrap(), (KEY2.to_vec(), VALUE2.to_vec())); - let item = env + let item = fe_mut + .data() .with_storage_from_context::<_, _>(|store| Ok(store.next(id))) .unwrap(); assert!(item.0.unwrap().is_none()); @@ -2055,24 +2008,26 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - leave_default_data(env); + leave_default_data(&mut fe_mut); // set up iterator over all space - let id = do_db_scan(fe_mut, 0, 0, Order::Descending.into()).unwrap(); + let id = do_db_scan(fe_mut.as_mut(), 0, 0, Order::Descending.into()).unwrap(); assert_eq!(1, id); - let item = env + let item = fe_mut + .data() .with_storage_from_context::<_, _>(|store| Ok(store.next(id))) .unwrap(); assert_eq!(item.0.unwrap().unwrap(), (KEY2.to_vec(), VALUE2.to_vec())); - let item = env + let item = fe_mut + .data() .with_storage_from_context::<_, _>(|store| Ok(store.next(id))) .unwrap(); assert_eq!(item.0.unwrap().unwrap(), (KEY1.to_vec(), VALUE1.to_vec())); - let item = env + let item = fe_mut + .data() .with_storage_from_context::<_, _>(|store| Ok(store.next(id))) .unwrap(); assert!(item.0.unwrap().is_none()); @@ -2084,21 +2039,22 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - let start = write_data(env, &mut store, b"anna"); - let end = write_data(env, &mut store, b"bert"); + let start = write_data(&mut fe_mut, b"anna"); + let end = write_data(&mut fe_mut, b"bert"); - leave_default_data(env); + leave_default_data(&mut fe_mut); - let id = do_db_scan(fe_mut, start, end, Order::Ascending.into()).unwrap(); + let id = do_db_scan(fe_mut.as_mut(), start, end, Order::Ascending.into()).unwrap(); - let item = env + let item = fe_mut + .data() .with_storage_from_context::<_, _>(|store| Ok(store.next(id))) .unwrap(); assert_eq!(item.0.unwrap().unwrap(), (KEY1.to_vec(), VALUE1.to_vec())); - let item = env + let item = fe_mut + .data() .with_storage_from_context::<_, _>(|store| Ok(store.next(id))) .unwrap(); assert!(item.0.unwrap().is_none()); @@ -2110,12 +2066,11 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - leave_default_data(env); + leave_default_data(&mut fe_mut); // unbounded, ascending and descending - let id1 = do_db_scan(fe_mut, 0, 0, Order::Ascending.into()).unwrap(); - let id2 = do_db_scan(fe_mut, 0, 0, Order::Descending.into()).unwrap(); + let id1 = do_db_scan(fe_mut.as_mut(), 0, 0, Order::Ascending.into()).unwrap(); + let id2 = do_db_scan(fe_mut.as_mut(), 0, 0, Order::Descending.into()).unwrap(); assert_eq!(id1, 1); assert_eq!(id2, 2); @@ -2161,8 +2116,7 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - leave_default_data(env); + leave_default_data(&mut fe_mut); // set up iterator over all space let result = do_db_scan(fe_mut, 0, 0, 42); @@ -2181,32 +2135,28 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - leave_default_data(env); + leave_default_data(&mut fe_mut); - let id = do_db_scan(fe_mut, 0, 0, Order::Ascending.into()).unwrap(); + let id = do_db_scan(fe_mut.as_mut(), 0, 0, Order::Ascending.into()).unwrap(); // Entry 1 - let kv_region_ptr = do_db_next(fe_mut, id).unwrap(); + let kv_region_ptr = do_db_next(fe_mut.as_mut(), id).unwrap(); assert_eq!( - force_read(env, &mut store, kv_region_ptr), + force_read(&mut fe_mut, kv_region_ptr), [KEY1, b"\0\0\0\x03", VALUE1, b"\0\0\0\x06"].concat() ); // Entry 2 - let kv_region_ptr = do_db_next(fe_mut, id).unwrap(); + let kv_region_ptr = do_db_next(fe_mut.as_mut(), id).unwrap(); assert_eq!( - force_read(env, &mut store, kv_region_ptr), + force_read(&mut fe_mut, kv_region_ptr), [KEY2, b"\0\0\0\x04", VALUE2, b"\0\0\0\x05"].concat() ); // End - let kv_region_ptr = do_db_next(fe_mut, id).unwrap(); - assert_eq!( - force_read(env, &mut store, kv_region_ptr), - b"\0\0\0\0\0\0\0\0" - ); + let kv_region_ptr = do_db_next(fe_mut.as_mut(), id).unwrap(); + assert_eq!(force_read(&mut fe_mut, kv_region_ptr), b"\0\0\0\0\0\0\0\0"); // API makes no guarantees for value_ptr in this case } @@ -2216,12 +2166,11 @@ mod tests { let api = MockApi::default(); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let (env, mut store) = fe_mut.data_and_store_mut(); - leave_default_data(env); + leave_default_data(&mut fe_mut); let non_existent_id = 42u32; - let result = do_db_next(fe_mut, non_existent_id); + let result = do_db_next(fe_mut.as_mut(), non_existent_id); match result.unwrap_err() { VmError::BackendErr { source: BackendError::IteratorDoesNotExist { id, .. }, From b909c6e33a8d46f63549933c2251d332bfbe2313 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 26 Apr 2023 12:39:20 +0200 Subject: [PATCH 0248/2372] Fix memory handling --- packages/vm/src/instance.rs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 55f2714e59..f419374651 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -252,10 +252,10 @@ where let memory = wasmer_instance .exports .get_memory("memory") - .unwrap() - .clone(); // TODO: handle error - - fe.as_mut(&mut store).memory = Some(memory); + .map_err(|original| { + VmError::instantiation_err(format!("Could not get memory 'memory': {original}")) + })? + .clone(); let instance_ptr = NonNull::from(wasmer_instance.as_ref()); @@ -263,6 +263,7 @@ where let mut fe_mut = fe.clone().into_mut(&mut store); let (env, mut store) = fe_mut.data_and_store_mut(); + env.memory = Some(memory); env.set_wasmer_instance(Some(instance_ptr)); env.set_gas_left(&mut store, gas_limit); env.move_in(backend.storage, backend.querier); @@ -496,6 +497,14 @@ mod tests { static CONTRACT: &[u8] = include_bytes!("../testdata/hackatom.wasm"); static CYBERPUNK: &[u8] = include_bytes!("../testdata/cyberpunk.wasm"); + #[test] + fn from_code_works() { + let backend = mock_backend(&[]); + let (instance_options, memory_limit) = mock_instance_options(); + let instance = + Instance::from_code(CONTRACT, backend, instance_options, memory_limit).unwrap(); + } + #[test] fn set_debug_handler_and_unset_debug_handler_work() { const LIMIT: u64 = 70_000_000_000_000; @@ -546,6 +555,9 @@ mod tests { fn required_capabilities_works_for_many_exports() { let wasm = wat::parse_str( r#"(module + (memory 3) + (export "memory" (memory 0)) + (type (func)) (func (type 0) nop) (export "requires_water" (func 0)) From b01b751ec53a1473d7eda8d691cbc1e82a11bc92 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 26 Apr 2023 12:50:13 +0200 Subject: [PATCH 0249/2372] Update module version tests --- packages/vm/src/modules/file_system_cache.rs | 2 +- packages/vm/src/modules/versioning.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 94f199387d..0d41a1f704 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -260,7 +260,7 @@ mod tests { cache.store(&checksum, &module).unwrap(); let mut globber = glob::glob(&format!( - "{}/v5-wasmer1/**/{}", + "{}/v5-wasmer4/**/{}", tmp_dir.path().to_string_lossy(), checksum )) diff --git a/packages/vm/src/modules/versioning.rs b/packages/vm/src/modules/versioning.rs index 0c370d6fc9..4fa850aae0 100644 --- a/packages/vm/src/modules/versioning.rs +++ b/packages/vm/src/modules/versioning.rs @@ -49,6 +49,6 @@ mod tests { #[test] fn current_wasmer_module_version_works() { let version = current_wasmer_module_version(); - assert_eq!(version, 1); + assert_eq!(version, 4); } } From d2f9b33d8dc9cc03eb26c0ef1989dff42565c5da Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 26 Apr 2023 12:50:33 +0200 Subject: [PATCH 0250/2372] Update module size tests --- packages/vm/src/modules/in_memory_cache.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/vm/src/modules/in_memory_cache.rs b/packages/vm/src/modules/in_memory_cache.rs index 96a0000ad5..f47b94d300 100644 --- a/packages/vm/src/modules/in_memory_cache.rs +++ b/packages/vm/src/modules/in_memory_cache.rs @@ -108,12 +108,8 @@ mod tests { let key_size = mem::size_of::(); assert_eq!(key_size, 32); - // A Module consists of a Store (3 Arcs) and an Arc to the Engine. - // This is 3 * 64bit of data, but we don't get any guarantee how the Rust structs - // Module and Store are aligned (https://doc.rust-lang.org/reference/type-layout.html#the-default-representation). - // So we get this value by trial and error. It can change over time and across platforms. let value_size = mem::size_of::(); - assert_eq!(value_size, 56); + assert_eq!(value_size, 8); // Just in case we want to go that route let boxed_value_size = mem::size_of::>(); From 48b9409cedbec7dc3c860710e8c226c80a4dca4b Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 26 Apr 2023 13:44:21 +0200 Subject: [PATCH 0251/2372] Fix write_region --- packages/vm/src/memory.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/vm/src/memory.rs b/packages/vm/src/memory.rs index a85de99bf9..d6220193f5 100644 --- a/packages/vm/src/memory.rs +++ b/packages/vm/src/memory.rs @@ -102,6 +102,10 @@ pub fn write_region(memory: &wasmer::MemoryView, ptr: u32, data: &[u8]) -> VmRes region, memory.size().bytes().0 )))?; + + region.length = data.len() as u32; + set_region(memory, ptr, region)?; + Ok(()) // match WasmPtr::::new(region.offset).deref(memory, 0, region.capacity) { From 847d5b0efe88e2ab74e2fbf5d1f3666d055b826e Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 26 Apr 2023 16:45:02 +0200 Subject: [PATCH 0252/2372] Fix store in caching --- packages/vm/src/cache.rs | 84 ++++++++++++------- packages/vm/src/instance.rs | 8 +- packages/vm/src/modules/in_memory_cache.rs | 45 ++++++---- .../vm/src/modules/pinned_memory_cache.rs | 53 +++++++----- packages/vm/src/modules/sized_module.rs | 5 +- 5 files changed, 125 insertions(+), 70 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 8f996ad7fc..74569984a0 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -5,6 +5,8 @@ use std::marker::PhantomData; use std::path::{Path, PathBuf}; use std::sync::Mutex; +use wasmer::{Module, Store}; + use crate::backend::{Backend, BackendApi, Querier, Storage}; use crate::capabilities::required_capabilities_from_module; use crate::checksum::Checksum; @@ -252,13 +254,9 @@ where return Ok(()); } - // Try to get module from the memory cache - if let Some(module) = cache.memory_cache.load(checksum)? { - cache.stats.hits_memory_cache = cache.stats.hits_memory_cache.saturating_add(1); - return cache - .pinned_memory_cache - .store(checksum, module.module, module.size); - } + // We don't load from the memory cache because we had to create new store here and + // serialize/deserialize the artifact to get a full clone. Could be done but adds some code + // for a no-so-relevant use case. // Try to get module from file system cache let store = make_runtime_store(Some(cache.instance_memory_limit)); @@ -266,17 +264,17 @@ where cache.stats.hits_fs_cache = cache.stats.hits_fs_cache.saturating_add(1); return cache .pinned_memory_cache - .store(checksum, module, module_size); + .store(checksum, (store, module), module_size); } // Re-compile from original Wasm bytecode let code = self.load_wasm_with_path(&cache.wasm_path, checksum)?; - let (_store, module) = compile(&code, Some(cache.instance_memory_limit), &[])?; + let (store, module) = compile(&code, Some(cache.instance_memory_limit), &[])?; // Store into the fs cache too let module_size = cache.fs_cache.store(checksum, &module)?; cache .pinned_memory_cache - .store(checksum, module, module_size) + .store(checksum, (store, module), module_size) } /// Unpins a Module, i.e. removes it from the pinned memory cache. @@ -313,34 +311,39 @@ where Ok(instance) } + fn return_instance(&self, checksum: &Checksum, element: (Store, Module)) -> VmResult<()> { + let mut cache = self.inner.lock().unwrap(); + + cache.memory_cache.store(checksum, element, 123) + } + /// Returns a module tied to a previously saved Wasm. /// Depending on availability, this is either generated from a memory cache, file system cache or Wasm code. /// This is part of `get_instance` but pulled out to reduce the locking time. fn get_module(&self, checksum: &Checksum) -> VmResult<(wasmer::Store, wasmer::Module)> { let mut cache = self.inner.lock().unwrap(); // Try to get module from the pinned memory cache - if let Some(module) = cache.pinned_memory_cache.load(checksum)? { + if let Some(element) = cache.pinned_memory_cache.load(checksum)? { cache.stats.hits_pinned_memory_cache = cache.stats.hits_pinned_memory_cache.saturating_add(1); - let store = make_runtime_store(Some(cache.instance_memory_limit)); - return Ok((store, module)); + return Ok((element.store, element.module)); } // Get module from memory cache - if let Some(module) = cache.memory_cache.load(checksum)? { + if let Some(element) = cache.memory_cache.load(checksum)? { cache.stats.hits_memory_cache = cache.stats.hits_memory_cache.saturating_add(1); - let store = make_runtime_store(Some(cache.instance_memory_limit)); - return Ok((store, module.module)); + return Ok((element.store, element.module)); } // Get module from file system cache let store = make_runtime_store(Some(cache.instance_memory_limit)); - if let Some((module, module_size)) = cache.fs_cache.load(checksum, &store)? { + if let Some((module, _module_size)) = cache.fs_cache.load(checksum, &store)? { cache.stats.hits_fs_cache = cache.stats.hits_fs_cache.saturating_add(1); - cache - .memory_cache - .store(checksum, module.clone(), module_size)?; + // Can't clone store :( + // cache + // .memory_cache + // .store(checksum, (store, module.clone()), module_size)?; return Ok((store, module)); } @@ -352,11 +355,12 @@ where let wasm = self.load_wasm_with_path(&cache.wasm_path, checksum)?; cache.stats.misses = cache.stats.misses.saturating_add(1); let (store, module) = compile(&wasm, Some(cache.instance_memory_limit), &[])?; - let module_size = cache.fs_cache.store(checksum, &module)?; + let _module_size = cache.fs_cache.store(checksum, &module)?; - cache - .memory_cache - .store(checksum, module.clone(), module_size)?; + // Can't clone store :( + // cache + // .memory_cache + // .store(checksum, (store, module.clone()), module_size)?; Ok((store, module)) } } @@ -782,6 +786,9 @@ mod tests { call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); + + let (store, module, ..) = instance.recycle(); + cache.return_instance(&checksum, (store, module)).unwrap(); } // from memory @@ -801,6 +808,9 @@ mod tests { call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); + + let (store, module, ..) = instance.recycle(); + cache.return_instance(&checksum, (store, module)).unwrap(); } // from pinned memory @@ -811,8 +821,8 @@ mod tests { .get_instance(&checksum, mock_backend(&[]), TESTING_OPTIONS) .unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 1); - assert_eq!(cache.stats().hits_memory_cache, 2); - assert_eq!(cache.stats().hits_fs_cache, 1); + assert_eq!(cache.stats().hits_memory_cache, 1); + assert_eq!(cache.stats().hits_fs_cache, 2); assert_eq!(cache.stats().misses, 0); // init @@ -822,6 +832,9 @@ mod tests { call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); + + let (store, module, ..) = instance.recycle(); + cache.return_instance(&checksum, (store, module)).unwrap(); } } @@ -856,6 +869,9 @@ mod tests { .unwrap() .unwrap(); assert_eq!(response.messages.len(), 1); + + let (store, module, ..) = instance.recycle(); + cache.return_instance(&checksum, (store, module)).unwrap(); } // from memory @@ -884,6 +900,9 @@ mod tests { .unwrap() .unwrap(); assert_eq!(response.messages.len(), 1); + + let (store, module, ..) = instance.recycle(); + cache.return_instance(&checksum, (store, module)).unwrap(); } // from pinned memory @@ -894,8 +913,8 @@ mod tests { .get_instance(&checksum, mock_backend(&[]), TESTING_OPTIONS) .unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 1); - assert_eq!(cache.stats().hits_memory_cache, 2); - assert_eq!(cache.stats().hits_fs_cache, 1); + assert_eq!(cache.stats().hits_memory_cache, 1); + assert_eq!(cache.stats().hits_fs_cache, 2); assert_eq!(cache.stats().misses, 0); // init @@ -914,6 +933,9 @@ mod tests { .unwrap() .unwrap(); assert_eq!(response.messages.len(), 1); + + let (store, module, ..) = instance.recycle(); + cache.return_instance(&checksum, (store, module)).unwrap(); } } @@ -936,7 +958,8 @@ mod tests { call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); - let backend1 = instance.recycle().unwrap(); + let (store, module, backend1) = instance.recycle(); + let backend1 = backend1.unwrap(); // init instance 2 let mut instance = cache @@ -948,7 +971,8 @@ mod tests { call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); - let backend2 = instance.recycle().unwrap(); + let (store, module, backend2) = instance.recycle(); + let backend2 = backend2.unwrap(); // run contract 2 - just sanity check - results validate in contract unit tests let mut instance = cache diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index f419374651..54373b2990 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -282,9 +282,9 @@ where /// Decomposes this instance into its components. /// External dependencies are returned for reuse, the rest is dropped. - pub fn recycle(self) -> Option> { + pub fn recycle(self) -> (Store, Module, Option>) { let env = self.fe.as_ref(&self.store); - if let (Some(storage), Some(querier)) = env.move_out() { + let backend = if let (Some(storage), Some(querier)) = env.move_out() { let api = env.api; Some(Backend { api, @@ -293,7 +293,9 @@ where }) } else { None - } + }; + + (self.store, self._inner.module().clone(), backend) } pub fn set_debug_handler(&mut self, debug_handler: H) diff --git a/packages/vm/src/modules/in_memory_cache.rs b/packages/vm/src/modules/in_memory_cache.rs index f47b94d300..e7216d1560 100644 --- a/packages/vm/src/modules/in_memory_cache.rs +++ b/packages/vm/src/modules/in_memory_cache.rs @@ -1,7 +1,7 @@ use clru::{CLruCache, CLruCacheConfig, WeightScale}; use std::collections::hash_map::RandomState; use std::num::NonZeroUsize; -use wasmer::Module; +use wasmer::{Module, Store}; use super::sized_module::SizedModule; use crate::{Checksum, Size, VmError, VmResult}; @@ -49,10 +49,22 @@ impl InMemoryCache { } } - pub fn store(&mut self, checksum: &Checksum, module: Module, size: usize) -> VmResult<()> { + pub fn store( + &mut self, + checksum: &Checksum, + entry: (Store, Module), + size: usize, + ) -> VmResult<()> { if let Some(modules) = &mut self.modules { modules - .put_with_weight(*checksum, SizedModule { module, size }) + .put_with_weight( + *checksum, + SizedModule { + store: entry.0, + module: entry.1, + size, + }, + ) .map_err(|e| VmError::cache_err(format!("{:?}", e)))?; } Ok(()) @@ -61,8 +73,8 @@ impl InMemoryCache { /// Looks up a module in the cache and creates a new module pub fn load(&mut self, checksum: &Checksum) -> VmResult> { if let Some(modules) = &mut self.modules { - match modules.get(checksum) { - Some(module) => Ok(Some(module.clone())), + match modules.pop(checksum) { + Some(module) => Ok(Some(module)), None => Ok(None), } } else { @@ -151,17 +163,18 @@ mod tests { // Store module let size = wasm.len() * TESTING_WASM_SIZE_FACTOR; - cache.store(&checksum, original, size).unwrap(); + cache.store(&checksum, (store, original), size).unwrap(); // Load module - let cached = cache.load(&checksum).unwrap().unwrap(); + let mut cached = cache.load(&checksum).unwrap().unwrap(); // Ensure cached module can be executed { - let instance = WasmerInstance::new(&mut store, &cached.module, &imports! {}).unwrap(); - set_remaining_points(&mut store, &instance, TESTING_GAS_LIMIT); + let instance = + WasmerInstance::new(&mut cached.store, &cached.module, &imports! {}).unwrap(); + set_remaining_points(&mut cached.store, &instance, TESTING_GAS_LIMIT); let add_one = instance.exports.get_function("add_one").unwrap(); - let result = add_one.call(&mut store, &[42.into()]).unwrap(); + let result = add_one.call(&mut cached.store, &[42.into()]).unwrap(); assert_eq!(result[0].unwrap_i32(), 43); } } @@ -209,19 +222,19 @@ mod tests { // Add 1 cache - .store(&checksum1, compile(&wasm1, None, &[]).unwrap().1, 900_000) + .store(&checksum1, compile(&wasm1, None, &[]).unwrap(), 900_000) .unwrap(); assert_eq!(cache.len(), 1); // Add 2 cache - .store(&checksum2, compile(&wasm2, None, &[]).unwrap().1, 900_000) + .store(&checksum2, compile(&wasm2, None, &[]).unwrap(), 900_000) .unwrap(); assert_eq!(cache.len(), 2); // Add 3 (pushes out the previous two) cache - .store(&checksum3, compile(&wasm3, None, &[]).unwrap().1, 1_500_000) + .store(&checksum3, compile(&wasm3, None, &[]).unwrap(), 1_500_000) .unwrap(); assert_eq!(cache.len(), 1); } @@ -269,19 +282,19 @@ mod tests { // Add 1 cache - .store(&checksum1, compile(&wasm1, None, &[]).unwrap().1, 900_000) + .store(&checksum1, compile(&wasm1, None, &[]).unwrap(), 900_000) .unwrap(); assert_eq!(cache.size(), 900_000); // Add 2 cache - .store(&checksum2, compile(&wasm2, None, &[]).unwrap().1, 800_000) + .store(&checksum2, compile(&wasm2, None, &[]).unwrap(), 800_000) .unwrap(); assert_eq!(cache.size(), 1_700_000); // Add 3 (pushes out the previous two) cache - .store(&checksum3, compile(&wasm3, None, &[]).unwrap().1, 1_500_000) + .store(&checksum3, compile(&wasm3, None, &[]).unwrap(), 1_500_000) .unwrap(); assert_eq!(cache.size(), 1_500_000); } diff --git a/packages/vm/src/modules/pinned_memory_cache.rs b/packages/vm/src/modules/pinned_memory_cache.rs index a2a44a27bf..e94295378e 100644 --- a/packages/vm/src/modules/pinned_memory_cache.rs +++ b/packages/vm/src/modules/pinned_memory_cache.rs @@ -1,5 +1,5 @@ use std::collections::HashMap; -use wasmer::Module; +use wasmer::{Module, Store}; use super::sized_module::SizedModule; use crate::{Checksum, VmResult}; @@ -17,8 +17,20 @@ impl PinnedMemoryCache { } } - pub fn store(&mut self, checksum: &Checksum, module: Module, size: usize) -> VmResult<()> { - self.modules.insert(*checksum, SizedModule { module, size }); + pub fn store( + &mut self, + checksum: &Checksum, + element: (Store, Module), + size: usize, + ) -> VmResult<()> { + self.modules.insert( + *checksum, + SizedModule { + store: element.0, + module: element.1, + size, + }, + ); Ok(()) } @@ -30,9 +42,9 @@ impl PinnedMemoryCache { } /// Looks up a module in the cache and creates a new module - pub fn load(&mut self, checksum: &Checksum) -> VmResult> { - match self.modules.get(checksum) { - Some(module) => Ok(Some(module.module.clone())), + pub fn load(&mut self, checksum: &Checksum) -> VmResult> { + match self.modules.remove(checksum) { + Some(module) => Ok(Some(module)), None => Ok(None), } } @@ -99,17 +111,18 @@ mod tests { } // Store module - cache.store(&checksum, original, 0).unwrap(); + cache.store(&checksum, (store, original), 0).unwrap(); // Load module - let cached = cache.load(&checksum).unwrap().unwrap(); + let mut cached = cache.load(&checksum).unwrap().unwrap(); // Ensure cached module can be executed { - let instance = WasmerInstance::new(&mut store, &cached, &imports! {}).unwrap(); - set_remaining_points(&mut store, &instance, TESTING_GAS_LIMIT); + let instance = + WasmerInstance::new(&mut cached.store, &cached.module, &imports! {}).unwrap(); + set_remaining_points(&mut cached.store, &instance, TESTING_GAS_LIMIT); let add_one = instance.exports.get_function("add_one").unwrap(); - let result = add_one.call(&mut store, &[42.into()]).unwrap(); + let result = add_one.call(&mut cached.store, &[42.into()]).unwrap(); assert_eq!(result[0].unwrap_i32(), 43); } } @@ -134,8 +147,8 @@ mod tests { assert!(!cache.has(&checksum)); // Add - let (_store, original) = compile(&wasm, None, &[]).unwrap(); - cache.store(&checksum, original, 0).unwrap(); + let (store, original) = compile(&wasm, None, &[]).unwrap(); + cache.store(&checksum, (store, original), 0).unwrap(); assert!(cache.has(&checksum)); @@ -165,8 +178,8 @@ mod tests { assert_eq!(cache.len(), 0); // Add - let (_store, original) = compile(&wasm, None, &[]).unwrap(); - cache.store(&checksum, original, 0).unwrap(); + let (store, original) = compile(&wasm, None, &[]).unwrap(); + cache.store(&checksum, (store, original), 0).unwrap(); assert_eq!(cache.len(), 1); @@ -207,13 +220,15 @@ mod tests { assert_eq!(cache.size(), 0); // Add 1 - let (_store, original) = compile(&wasm1, None, &[]).unwrap(); - cache.store(&checksum1, original, 500).unwrap(); + cache + .store(&checksum1, compile(&wasm1, None, &[]).unwrap(), 500) + .unwrap(); assert_eq!(cache.size(), 500); // Add 2 - let (_store, original) = compile(&wasm2, None, &[]).unwrap(); - cache.store(&checksum2, original, 300).unwrap(); + cache + .store(&checksum2, compile(&wasm2, None, &[]).unwrap(), 300) + .unwrap(); assert_eq!(cache.size(), 800); // Remove 1 diff --git a/packages/vm/src/modules/sized_module.rs b/packages/vm/src/modules/sized_module.rs index 3ca9da7392..967b7e8460 100644 --- a/packages/vm/src/modules/sized_module.rs +++ b/packages/vm/src/modules/sized_module.rs @@ -1,7 +1,8 @@ -use wasmer::Module; +use wasmer::{Module, Store}; -#[derive(Debug, Clone)] +#[derive(Debug)] pub struct SizedModule { + pub store: Store, pub module: Module, pub size: usize, } From f25f919b5f53a03d51a4c374aedabc36f30ede11 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 26 Apr 2023 16:52:16 +0200 Subject: [PATCH 0253/2372] Fix pin_unpin_works --- packages/vm/src/cache.rs | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 74569984a0..5cefb32219 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -1175,7 +1175,7 @@ mod tests { // check not pinned let backend = mock_backend(&[]); - let _instance = cache + let instance = cache .get_instance(&checksum, backend, TESTING_OPTIONS) .unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 0); @@ -1183,41 +1183,47 @@ mod tests { assert_eq!(cache.stats().hits_fs_cache, 1); assert_eq!(cache.stats().misses, 0); - // first pin hits memory cache + // first pin hits file system cache cache.pin(&checksum).unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 0); - assert_eq!(cache.stats().hits_memory_cache, 1); - assert_eq!(cache.stats().hits_fs_cache, 1); + assert_eq!(cache.stats().hits_memory_cache, 0); + assert_eq!(cache.stats().hits_fs_cache, 2); assert_eq!(cache.stats().misses, 0); // consecutive pins are no-ops cache.pin(&checksum).unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 0); - assert_eq!(cache.stats().hits_memory_cache, 1); - assert_eq!(cache.stats().hits_fs_cache, 1); + assert_eq!(cache.stats().hits_memory_cache, 0); + assert_eq!(cache.stats().hits_fs_cache, 2); assert_eq!(cache.stats().misses, 0); + let (store, module, ..) = instance.recycle(); + cache.return_instance(&checksum, (store, module)).unwrap(); + // check pinned let backend = mock_backend(&[]); - let _instance = cache + let instance = cache .get_instance(&checksum, backend, TESTING_OPTIONS) .unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 1); - assert_eq!(cache.stats().hits_memory_cache, 1); - assert_eq!(cache.stats().hits_fs_cache, 1); + assert_eq!(cache.stats().hits_memory_cache, 0); + assert_eq!(cache.stats().hits_fs_cache, 2); assert_eq!(cache.stats().misses, 0); // unpin cache.unpin(&checksum).unwrap(); + let (store, module, ..) = instance.recycle(); + cache.return_instance(&checksum, (store, module)).unwrap(); + // verify unpinned let backend = mock_backend(&[]); - let _instance = cache + let instance = cache .get_instance(&checksum, backend, TESTING_OPTIONS) .unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 1); - assert_eq!(cache.stats().hits_memory_cache, 2); - assert_eq!(cache.stats().hits_fs_cache, 1); + assert_eq!(cache.stats().hits_memory_cache, 1); + assert_eq!(cache.stats().hits_fs_cache, 2); assert_eq!(cache.stats().misses, 0); // unpin again has no effect @@ -1226,5 +1232,8 @@ mod tests { // unpin non existent id has no effect let non_id = Checksum::generate(b"non_existent"); cache.unpin(&non_id).unwrap(); + + let (store, module, ..) = instance.recycle(); + cache.return_instance(&checksum, (store, module)).unwrap(); } } From 754a396a622329a02f02b3a06a01d64625376136 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 27 Apr 2023 11:28:10 +0200 Subject: [PATCH 0254/2372] Fix cache handling --- packages/vm/src/cache.rs | 104 +++++++++++------- packages/vm/src/instance.rs | 32 +++++- packages/vm/src/modules/in_memory_cache.rs | 17 ++- packages/vm/src/modules/mod.rs | 1 + .../vm/src/modules/pinned_memory_cache.rs | 13 +-- packages/vm/src/modules/sized_module.rs | 3 +- 6 files changed, 109 insertions(+), 61 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 5cefb32219..f558bb7fc7 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -14,7 +14,7 @@ use crate::compatibility::check_wasm; use crate::errors::{VmError, VmResult}; use crate::filesystem::mkdir_p; use crate::instance::{Instance, InstanceOptions}; -use crate::modules::{FileSystemCache, InMemoryCache, PinnedMemoryCache}; +use crate::modules::{CachedModule, FileSystemCache, InMemoryCache, PinnedMemoryCache}; use crate::size::Size; use crate::static_analysis::{deserialize_wasm, has_ibc_entry_points}; use crate::wasm_backend::{compile, make_runtime_store}; @@ -298,10 +298,11 @@ where backend: Backend, options: InstanceOptions, ) -> VmResult> { - let (store, module) = self.get_module(checksum)?; + let (store, module, from_pinned) = self.get_module(checksum)?; let instance = Instance::from_module( store, &module, + from_pinned, backend, options.gas_limit, options.print_debug, @@ -311,28 +312,41 @@ where Ok(instance) } - fn return_instance(&self, checksum: &Checksum, element: (Store, Module)) -> VmResult<()> { + pub fn return_instance( + &self, + checksum: &Checksum, + element: CachedModule, + pinned: bool, + ) -> VmResult<()> { let mut cache = self.inner.lock().unwrap(); - cache.memory_cache.store(checksum, element, 123) + if pinned { + cache + .pinned_memory_cache + .store(checksum, (element.store, element.module), element.size) + } else { + cache + .memory_cache + .store(checksum, (element.store, element.module), element.size) + } } /// Returns a module tied to a previously saved Wasm. /// Depending on availability, this is either generated from a memory cache, file system cache or Wasm code. /// This is part of `get_instance` but pulled out to reduce the locking time. - fn get_module(&self, checksum: &Checksum) -> VmResult<(wasmer::Store, wasmer::Module)> { + fn get_module(&self, checksum: &Checksum) -> VmResult<(wasmer::Store, wasmer::Module, bool)> { let mut cache = self.inner.lock().unwrap(); // Try to get module from the pinned memory cache if let Some(element) = cache.pinned_memory_cache.load(checksum)? { cache.stats.hits_pinned_memory_cache = cache.stats.hits_pinned_memory_cache.saturating_add(1); - return Ok((element.store, element.module)); + return Ok((element.store, element.module, true)); } // Get module from memory cache if let Some(element) = cache.memory_cache.load(checksum)? { cache.stats.hits_memory_cache = cache.stats.hits_memory_cache.saturating_add(1); - return Ok((element.store, element.module)); + return Ok((element.store, element.module, false)); } // Get module from file system cache @@ -344,7 +358,7 @@ where // cache // .memory_cache // .store(checksum, (store, module.clone()), module_size)?; - return Ok((store, module)); + return Ok((store, module, false)); } // Re-compile module from wasm @@ -361,7 +375,7 @@ where // cache // .memory_cache // .store(checksum, (store, module.clone()), module_size)?; - Ok((store, module)) + Ok((store, module, false)) } } @@ -712,7 +726,7 @@ mod tests { let backend5 = mock_backend(&[]); // from file system - let _instance1 = cache + let instance1: Instance = cache .get_instance(&checksum, backend1, TESTING_OPTIONS) .unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 0); @@ -720,8 +734,11 @@ mod tests { assert_eq!(cache.stats().hits_fs_cache, 1); assert_eq!(cache.stats().misses, 0); + let (cached, pinned, ..) = instance1.recycle(); + cache.return_instance(&checksum, cached, pinned).unwrap(); + // from memory - let _instance2 = cache + let instance2 = cache .get_instance(&checksum, backend2, TESTING_OPTIONS) .unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 0); @@ -729,8 +746,11 @@ mod tests { assert_eq!(cache.stats().hits_fs_cache, 1); assert_eq!(cache.stats().misses, 0); + let (cached, pinned, ..) = instance2.recycle(); + cache.return_instance(&checksum, cached, pinned).unwrap(); + // from memory again - let _instance3 = cache + let instance3 = cache .get_instance(&checksum, backend3, TESTING_OPTIONS) .unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 0); @@ -738,29 +758,35 @@ mod tests { assert_eq!(cache.stats().hits_fs_cache, 1); assert_eq!(cache.stats().misses, 0); - // pinning hits the memory cache + // pinning hits the file system cache cache.pin(&checksum).unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 0); - assert_eq!(cache.stats().hits_memory_cache, 3); - assert_eq!(cache.stats().hits_fs_cache, 1); + assert_eq!(cache.stats().hits_memory_cache, 2); + assert_eq!(cache.stats().hits_fs_cache, 2); assert_eq!(cache.stats().misses, 0); + let (cached, pinned, ..) = instance3.recycle(); + cache.return_instance(&checksum, cached, pinned).unwrap(); + // from pinned memory cache - let _instance4 = cache + let instance4 = cache .get_instance(&checksum, backend4, TESTING_OPTIONS) .unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 1); - assert_eq!(cache.stats().hits_memory_cache, 3); - assert_eq!(cache.stats().hits_fs_cache, 1); + assert_eq!(cache.stats().hits_memory_cache, 2); + assert_eq!(cache.stats().hits_fs_cache, 2); assert_eq!(cache.stats().misses, 0); + let (cached, pinned, ..) = instance4.recycle(); + cache.return_instance(&checksum, cached, pinned).unwrap(); + // from pinned memory cache again let _instance5 = cache .get_instance(&checksum, backend5, TESTING_OPTIONS) .unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 2); - assert_eq!(cache.stats().hits_memory_cache, 3); - assert_eq!(cache.stats().hits_fs_cache, 1); + assert_eq!(cache.stats().hits_memory_cache, 2); + assert_eq!(cache.stats().hits_fs_cache, 2); assert_eq!(cache.stats().misses, 0); } @@ -787,8 +813,8 @@ mod tests { let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); - let (store, module, ..) = instance.recycle(); - cache.return_instance(&checksum, (store, module)).unwrap(); + let (cached, pinned, ..) = instance.recycle(); + cache.return_instance(&checksum, cached, pinned).unwrap(); } // from memory @@ -809,8 +835,8 @@ mod tests { let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); - let (store, module, ..) = instance.recycle(); - cache.return_instance(&checksum, (store, module)).unwrap(); + let (cached, pinned, ..) = instance.recycle(); + cache.return_instance(&checksum, cached, pinned).unwrap(); } // from pinned memory @@ -833,8 +859,8 @@ mod tests { let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); - let (store, module, ..) = instance.recycle(); - cache.return_instance(&checksum, (store, module)).unwrap(); + let (cached, pinned, ..) = instance.recycle(); + cache.return_instance(&checksum, cached, pinned).unwrap(); } } @@ -870,8 +896,8 @@ mod tests { .unwrap(); assert_eq!(response.messages.len(), 1); - let (store, module, ..) = instance.recycle(); - cache.return_instance(&checksum, (store, module)).unwrap(); + let (cached, pinned, ..) = instance.recycle(); + cache.return_instance(&checksum, cached, pinned).unwrap(); } // from memory @@ -901,8 +927,8 @@ mod tests { .unwrap(); assert_eq!(response.messages.len(), 1); - let (store, module, ..) = instance.recycle(); - cache.return_instance(&checksum, (store, module)).unwrap(); + let (cached, pinned, ..) = instance.recycle(); + cache.return_instance(&checksum, cached, pinned).unwrap(); } // from pinned memory @@ -934,8 +960,8 @@ mod tests { .unwrap(); assert_eq!(response.messages.len(), 1); - let (store, module, ..) = instance.recycle(); - cache.return_instance(&checksum, (store, module)).unwrap(); + let (cached, pinned, ..) = instance.recycle(); + cache.return_instance(&checksum, cached, pinned).unwrap(); } } @@ -1197,8 +1223,8 @@ mod tests { assert_eq!(cache.stats().hits_fs_cache, 2); assert_eq!(cache.stats().misses, 0); - let (store, module, ..) = instance.recycle(); - cache.return_instance(&checksum, (store, module)).unwrap(); + let (cached, pinned, ..) = instance.recycle(); + cache.return_instance(&checksum, cached, pinned).unwrap(); // check pinned let backend = mock_backend(&[]); @@ -1210,12 +1236,12 @@ mod tests { assert_eq!(cache.stats().hits_fs_cache, 2); assert_eq!(cache.stats().misses, 0); + let (cached, pinned, ..) = instance.recycle(); + cache.return_instance(&checksum, cached, pinned).unwrap(); + // unpin cache.unpin(&checksum).unwrap(); - let (store, module, ..) = instance.recycle(); - cache.return_instance(&checksum, (store, module)).unwrap(); - // verify unpinned let backend = mock_backend(&[]); let instance = cache @@ -1233,7 +1259,7 @@ mod tests { let non_id = Checksum::generate(b"non_existent"); cache.unpin(&non_id).unwrap(); - let (store, module, ..) = instance.recycle(); - cache.return_instance(&checksum, (store, module)).unwrap(); + let (cached, pinned, ..) = instance.recycle(); + cache.return_instance(&checksum, cached, pinned).unwrap(); } } diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 54373b2990..856b42e136 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -20,6 +20,7 @@ use crate::imports::{ #[cfg(feature = "iterator")] use crate::imports::{do_db_next, do_db_scan}; use crate::memory::{read_region, write_region}; +use crate::modules::CachedModule; use crate::size::Size; use crate::wasm_backend::compile; @@ -54,6 +55,7 @@ pub struct Instance { _inner: Box, fe: FunctionEnv>, store: Store, + pub from_pinned_cache: bool, } impl Instance @@ -74,6 +76,7 @@ where Instance::from_module( store, &module, + false, backend, options.gas_limit, options.print_debug, @@ -85,6 +88,7 @@ where pub(crate) fn from_module( mut store: Store, module: &Module, + from_pinned_cache: bool, backend: Backend, gas_limit: u64, print_debug: bool, @@ -273,6 +277,7 @@ where _inner: wasmer_instance, fe, store, + from_pinned_cache, }) } @@ -282,8 +287,16 @@ where /// Decomposes this instance into its components. /// External dependencies are returned for reuse, the rest is dropped. - pub fn recycle(self) -> (Store, Module, Option>) { - let env = self.fe.as_ref(&self.store); + pub fn recycle(self) -> (CachedModule, bool, Option>) { + let Instance { + _inner, + fe, + store, + from_pinned_cache, + .. + } = self; + + let env = fe.as_ref(&store); let backend = if let (Some(storage), Some(querier)) = env.move_out() { let api = env.api; Some(Backend { @@ -295,7 +308,15 @@ where None }; - (self.store, self._inner.module().clone(), backend) + ( + CachedModule { + store, + module: _inner.module().clone(), + size: 234, + }, + from_pinned_cache, + backend, + ) } pub fn set_debug_handler(&mut self, debug_handler: H) @@ -451,6 +472,7 @@ where pub fn instance_from_module( store: Store, module: &Module, + from_pinned_cache: bool, backend: Backend, gas_limit: u64, print_debug: bool, @@ -464,6 +486,7 @@ where Instance::from_module( store, module, + from_pinned_cache, backend, gas_limit, print_debug, @@ -586,6 +609,8 @@ mod tests { let wasm = wat::parse_str( r#"(module (import "foo" "bar" (func $bar)) + (memory 3) + (export "memory" (memory 0)) (func (export "main") (call $bar)) )"#, ) @@ -619,6 +644,7 @@ mod tests { let mut instance = Instance::from_module( store, &module, + false, backend, instance_options.gas_limit, false, diff --git a/packages/vm/src/modules/in_memory_cache.rs b/packages/vm/src/modules/in_memory_cache.rs index e7216d1560..5e3ff6c210 100644 --- a/packages/vm/src/modules/in_memory_cache.rs +++ b/packages/vm/src/modules/in_memory_cache.rs @@ -3,7 +3,7 @@ use std::collections::hash_map::RandomState; use std::num::NonZeroUsize; use wasmer::{Module, Store}; -use super::sized_module::SizedModule; +use super::sized_module::CachedModule; use crate::{Checksum, Size, VmError, VmResult}; // Minimum module size. @@ -18,16 +18,16 @@ const MINIMUM_MODULE_SIZE: Size = Size::kibi(250); #[derive(Debug)] struct SizeScale; -impl WeightScale for SizeScale { +impl WeightScale for SizeScale { #[inline] - fn weight(&self, _key: &Checksum, value: &SizedModule) -> usize { + fn weight(&self, _key: &Checksum, value: &CachedModule) -> usize { value.size } } /// An in-memory module cache pub struct InMemoryCache { - modules: Option>, + modules: Option>, } impl InMemoryCache { @@ -59,7 +59,7 @@ impl InMemoryCache { modules .put_with_weight( *checksum, - SizedModule { + CachedModule { store: entry.0, module: entry.1, size, @@ -71,12 +71,9 @@ impl InMemoryCache { } /// Looks up a module in the cache and creates a new module - pub fn load(&mut self, checksum: &Checksum) -> VmResult> { + pub fn load(&mut self, checksum: &Checksum) -> VmResult> { if let Some(modules) = &mut self.modules { - match modules.pop(checksum) { - Some(module) => Ok(Some(module)), - None => Ok(None), - } + Ok(modules.pop(checksum)) } else { Ok(None) } diff --git a/packages/vm/src/modules/mod.rs b/packages/vm/src/modules/mod.rs index daa0adef11..b91f72cadc 100644 --- a/packages/vm/src/modules/mod.rs +++ b/packages/vm/src/modules/mod.rs @@ -7,4 +7,5 @@ mod versioning; pub use file_system_cache::{FileSystemCache, NewFileSystemCacheError}; pub use in_memory_cache::InMemoryCache; pub use pinned_memory_cache::PinnedMemoryCache; +pub use sized_module::CachedModule; pub use versioning::current_wasmer_module_version; diff --git a/packages/vm/src/modules/pinned_memory_cache.rs b/packages/vm/src/modules/pinned_memory_cache.rs index e94295378e..de826da085 100644 --- a/packages/vm/src/modules/pinned_memory_cache.rs +++ b/packages/vm/src/modules/pinned_memory_cache.rs @@ -1,12 +1,12 @@ use std::collections::HashMap; use wasmer::{Module, Store}; -use super::sized_module::SizedModule; +use super::sized_module::CachedModule; use crate::{Checksum, VmResult}; /// An pinned in memory module cache pub struct PinnedMemoryCache { - modules: HashMap, + modules: HashMap, } impl PinnedMemoryCache { @@ -25,7 +25,7 @@ impl PinnedMemoryCache { ) -> VmResult<()> { self.modules.insert( *checksum, - SizedModule { + CachedModule { store: element.0, module: element.1, size, @@ -42,11 +42,8 @@ impl PinnedMemoryCache { } /// Looks up a module in the cache and creates a new module - pub fn load(&mut self, checksum: &Checksum) -> VmResult> { - match self.modules.remove(checksum) { - Some(module) => Ok(Some(module)), - None => Ok(None), - } + pub fn load(&mut self, checksum: &Checksum) -> VmResult> { + Ok(self.modules.remove(checksum)) } /// Returns true if and only if this cache has an entry identified by the given checksum diff --git a/packages/vm/src/modules/sized_module.rs b/packages/vm/src/modules/sized_module.rs index 967b7e8460..a5ec46b59d 100644 --- a/packages/vm/src/modules/sized_module.rs +++ b/packages/vm/src/modules/sized_module.rs @@ -1,8 +1,9 @@ use wasmer::{Module, Store}; #[derive(Debug)] -pub struct SizedModule { +pub struct CachedModule { pub store: Store, pub module: Module, + /// The estimated size of this element in memory pub size: usize, } From ef4aa09afcfe904bf9c4d5558dcd6e8df8915938 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 27 Apr 2023 11:32:53 +0200 Subject: [PATCH 0255/2372] Make remaining tests pass --- packages/vm/src/cache.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index f558bb7fc7..ef27e2272c 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -1047,6 +1047,9 @@ mod tests { .unwrap(); assert!(instance1.get_gas_left() < original_gas); + let (cached, pinned, ..) = instance1.recycle(); + cache.return_instance(&checksum, cached, pinned).unwrap(); + // Init from memory cache let mut instance2 = cache .get_instance(&checksum, backend2, TESTING_OPTIONS) @@ -1086,6 +1089,9 @@ mod tests { } assert_eq!(instance1.get_gas_left(), 0); + let (cached, pinned, ..) = instance1.recycle(); + cache.return_instance(&checksum, cached, pinned).unwrap(); + // Init from memory cache let options = InstanceOptions { gas_limit: TESTING_GAS_LIMIT, From ad619fa98c0ac34a7c3e36af3490f29f695dc1af Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 27 Apr 2023 11:37:22 +0200 Subject: [PATCH 0256/2372] Let get_module return CachedModule --- packages/vm/src/cache.rs | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index ef27e2272c..df4c09f525 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -5,8 +5,6 @@ use std::marker::PhantomData; use std::path::{Path, PathBuf}; use std::sync::Mutex; -use wasmer::{Module, Store}; - use crate::backend::{Backend, BackendApi, Querier, Storage}; use crate::capabilities::required_capabilities_from_module; use crate::checksum::Checksum; @@ -298,10 +296,10 @@ where backend: Backend, options: InstanceOptions, ) -> VmResult> { - let (store, module, from_pinned) = self.get_module(checksum)?; + let (cached, from_pinned) = self.get_module(checksum)?; let instance = Instance::from_module( - store, - &module, + cached.store, + &cached.module, from_pinned, backend, options.gas_limit, @@ -334,31 +332,36 @@ where /// Returns a module tied to a previously saved Wasm. /// Depending on availability, this is either generated from a memory cache, file system cache or Wasm code. /// This is part of `get_instance` but pulled out to reduce the locking time. - fn get_module(&self, checksum: &Checksum) -> VmResult<(wasmer::Store, wasmer::Module, bool)> { + fn get_module(&self, checksum: &Checksum) -> VmResult<(CachedModule, bool)> { let mut cache = self.inner.lock().unwrap(); // Try to get module from the pinned memory cache if let Some(element) = cache.pinned_memory_cache.load(checksum)? { cache.stats.hits_pinned_memory_cache = cache.stats.hits_pinned_memory_cache.saturating_add(1); - return Ok((element.store, element.module, true)); + return Ok((element, true)); } // Get module from memory cache if let Some(element) = cache.memory_cache.load(checksum)? { cache.stats.hits_memory_cache = cache.stats.hits_memory_cache.saturating_add(1); - return Ok((element.store, element.module, false)); + return Ok((element, false)); } // Get module from file system cache let store = make_runtime_store(Some(cache.instance_memory_limit)); - if let Some((module, _module_size)) = cache.fs_cache.load(checksum, &store)? { + if let Some((module, module_size)) = cache.fs_cache.load(checksum, &store)? { cache.stats.hits_fs_cache = cache.stats.hits_fs_cache.saturating_add(1); // Can't clone store :( // cache // .memory_cache // .store(checksum, (store, module.clone()), module_size)?; - return Ok((store, module, false)); + let cached = CachedModule { + store, + module, + size: module_size, + }; + return Ok((cached, false)); } // Re-compile module from wasm @@ -369,13 +372,18 @@ where let wasm = self.load_wasm_with_path(&cache.wasm_path, checksum)?; cache.stats.misses = cache.stats.misses.saturating_add(1); let (store, module) = compile(&wasm, Some(cache.instance_memory_limit), &[])?; - let _module_size = cache.fs_cache.store(checksum, &module)?; + let module_size = cache.fs_cache.store(checksum, &module)?; // Can't clone store :( // cache // .memory_cache // .store(checksum, (store, module.clone()), module_size)?; - Ok((store, module, false)) + let cached = CachedModule { + store, + module, + size: module_size, + }; + Ok((cached, false)) } } @@ -984,7 +992,7 @@ mod tests { call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); - let (store, module, backend1) = instance.recycle(); + let (_cached, _pinned, backend1) = instance.recycle(); let backend1 = backend1.unwrap(); // init instance 2 @@ -997,7 +1005,7 @@ mod tests { call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); - let (store, module, backend2) = instance.recycle(); + let (_cached, _pinned, backend2) = instance.recycle(); let backend2 = backend2.unwrap(); // run contract 2 - just sanity check - results validate in contract unit tests From b74b223b0c1f7b671046ca86c09160997e3b6abf Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 27 Apr 2023 11:39:15 +0200 Subject: [PATCH 0257/2372] Fix unused warnings --- packages/vm/src/instance.rs | 2 +- packages/vm/src/memory.rs | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 856b42e136..13cea870a5 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -526,7 +526,7 @@ mod tests { fn from_code_works() { let backend = mock_backend(&[]); let (instance_options, memory_limit) = mock_instance_options(); - let instance = + let _instance = Instance::from_code(CONTRACT, backend, instance_options, memory_limit).unwrap(); } diff --git a/packages/vm/src/memory.rs b/packages/vm/src/memory.rs index d6220193f5..48fdedf472 100644 --- a/packages/vm/src/memory.rs +++ b/packages/vm/src/memory.rs @@ -27,7 +27,7 @@ struct Region { } unsafe impl ValueType for Region { - fn zero_padding_bytes(&self, bytes: &mut [MaybeUninit]) { + fn zero_padding_bytes(&self, _bytes: &mut [MaybeUninit]) { // TODO: do we need to do something here? } } @@ -45,7 +45,8 @@ pub fn read_region(memory: &wasmer::MemoryView, ptr: u32, max_length: usize) -> } let mut result = vec![0u8; region.length as usize]; - memory.read(region.offset as u64, &mut result).map_err(|err| CommunicationError::deref_err(region.offset, format!( + // TODO: double check error handling + memory.read(region.offset as u64, &mut result).map_err(|_err| CommunicationError::deref_err(region.offset, format!( "Tried to access memory of region {:?} in wasm memory of size {} bytes. This typically happens when the given Region pointer does not point to a proper Region struct.", region, memory.size().bytes().0 @@ -97,7 +98,8 @@ pub fn write_region(memory: &wasmer::MemoryView, ptr: u32, data: &[u8]) -> VmRes return Err(CommunicationError::region_too_small(region_capacity, data.len()).into()); } - memory.write(region.offset as u64, data).map_err(|err| CommunicationError::deref_err(region.offset, format!( + // TODO: double check error handling + memory.write(region.offset as u64, data).map_err(|_err| CommunicationError::deref_err(region.offset, format!( "Tried to access memory of region {:?} in wasm memory of size {} bytes. This typically happens when the given Region pointer does not point to a proper Region struct.", region, memory.size().bytes().0 @@ -130,7 +132,8 @@ pub fn write_region(memory: &wasmer::MemoryView, ptr: u32, data: &[u8]) -> VmRes /// Reads in a Region at ptr in wasm memory and returns a copy of it fn get_region(memory: &wasmer::MemoryView, ptr: u32) -> CommunicationResult { let wptr = WasmPtr::::new(ptr); - let region = wptr.deref(memory).read().map_err(|err| { + // TODO: double check error handling + let region = wptr.deref(memory).read().map_err(|_err| { CommunicationError::deref_err(ptr, "Could not dereference this pointer to a Region") })?; validate_region(®ion)?; @@ -162,7 +165,8 @@ fn validate_region(region: &Region) -> RegionValidationResult<()> { fn set_region(memory: &wasmer::MemoryView, ptr: u32, data: Region) -> CommunicationResult<()> { let wptr = WasmPtr::::new(ptr); - wptr.deref(memory).write(data).map_err(|err| { + // TODO: double check error handling + wptr.deref(memory).write(data).map_err(|_err| { CommunicationError::deref_err(ptr, "Could not dereference this pointer to a Region") })?; Ok(()) From 173ac3d60ac3da1e3cce4b8c009f41ee69c3f924 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 27 Apr 2023 12:01:20 +0200 Subject: [PATCH 0258/2372] Finalize zero_padding_bytes implementation --- packages/vm/src/memory.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/vm/src/memory.rs b/packages/vm/src/memory.rs index 48fdedf472..b586999f7d 100644 --- a/packages/vm/src/memory.rs +++ b/packages/vm/src/memory.rs @@ -28,7 +28,9 @@ struct Region { unsafe impl ValueType for Region { fn zero_padding_bytes(&self, _bytes: &mut [MaybeUninit]) { - // TODO: do we need to do something here? + // The size of Region is exactly 3x4 bytes with no padding + // The `size_of::()` test nelow ensures that. + // So we do not need to zero any bytes here. } } @@ -174,8 +176,16 @@ fn set_region(memory: &wasmer::MemoryView, ptr: u32, data: Region) -> Communicat #[cfg(test)] mod tests { + use std::mem; + use super::*; + #[test] + fn region_has_known_size() { + // 3x4 bytes with no padding + assert_eq!(mem::size_of::(), 12); + } + #[test] fn validate_region_passes_for_valid_region() { // empty From 5810f6a6d6ac38d8726bc5cc5d0f1fc2936bd968 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 27 Apr 2023 12:01:30 +0200 Subject: [PATCH 0259/2372] Fix some more unused warnings --- packages/vm/src/environment.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index a84af689ed..015c66ff05 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -699,7 +699,7 @@ mod tests { #[test] fn is_storage_readonly_defaults_to_true() { - let (env, store, _instance) = make_instance(TESTING_GAS_LIMIT); + let (env, _store, _instance) = make_instance(TESTING_GAS_LIMIT); leave_default_data(&env); assert!(env.is_storage_readonly()); @@ -707,7 +707,7 @@ mod tests { #[test] fn set_storage_readonly_can_change_flag() { - let (env, store, _instance) = make_instance(TESTING_GAS_LIMIT); + let (env, _store, _instance) = make_instance(TESTING_GAS_LIMIT); leave_default_data(&env); // change @@ -835,7 +835,7 @@ mod tests { #[test] fn with_storage_from_context_set_get() { - let (env, store, _instance) = make_instance(TESTING_GAS_LIMIT); + let (env, _store, _instance) = make_instance(TESTING_GAS_LIMIT); leave_default_data(&env); let val = env @@ -868,7 +868,7 @@ mod tests { #[test] #[should_panic(expected = "A panic occurred in the callback.")] fn with_storage_from_context_handles_panics() { - let (env, store, _instance) = make_instance(TESTING_GAS_LIMIT); + let (env, _store, _instance) = make_instance(TESTING_GAS_LIMIT); leave_default_data(&env); env.with_storage_from_context::<_, ()>(|_store| { @@ -879,7 +879,7 @@ mod tests { #[test] fn with_querier_from_context_works() { - let (env, store, _instance) = make_instance(TESTING_GAS_LIMIT); + let (env, _store, _instance) = make_instance(TESTING_GAS_LIMIT); leave_default_data(&env); let res = env @@ -902,7 +902,7 @@ mod tests { #[test] #[should_panic(expected = "A panic occurred in the callback.")] fn with_querier_from_context_handles_panics() { - let (env, store, _instance) = make_instance(TESTING_GAS_LIMIT); + let (env, _store, _instance) = make_instance(TESTING_GAS_LIMIT); leave_default_data(&env); env.with_querier_from_context::<_, ()>(|_querier| { From 016df4f6375fe058314ea16e3059d8352b4433bf Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 27 Apr 2023 12:57:35 +0200 Subject: [PATCH 0260/2372] Bump min bytes version and update contracts --- Cargo.lock | 1 + contracts/burner/Cargo.lock | 694 +++++++++++++------------ contracts/crypto-verify/Cargo.lock | 692 +++++++++++++------------ contracts/cyberpunk/Cargo.lock | 696 ++++++++++++++------------ contracts/floaty/Cargo.lock | 694 +++++++++++++------------ contracts/hackatom/Cargo.lock | 694 +++++++++++++------------ contracts/ibc-reflect-send/Cargo.lock | 694 +++++++++++++------------ contracts/ibc-reflect/Cargo.lock | 694 +++++++++++++------------ contracts/queue/Cargo.lock | 694 +++++++++++++------------ contracts/reflect/Cargo.lock | 694 +++++++++++++------------ contracts/staking/Cargo.lock | 694 +++++++++++++------------ contracts/virus/Cargo.lock | 694 +++++++++++++------------ packages/vm/Cargo.toml | 1 + 13 files changed, 4091 insertions(+), 3545 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dea02a16f6..30a9174ebd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -394,6 +394,7 @@ version = "1.2.5" dependencies = [ "bitflags", "bytecheck", + "bytes", "clap 2.34.0", "clru", "cosmwasm-crypto", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 2d6369f112..4e4077c65a 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -28,6 +28,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + [[package]] name = "autocfg" version = "1.1.0" @@ -45,7 +51,7 @@ dependencies = [ "cfg-if", "libc", "miniz_oxide", - "object 0.25.3", + "object", "rustc-demangle", ] @@ -110,19 +116,20 @@ dependencies = [ [[package]] name = "bytecheck" -version = "0.6.7" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "314889ea31cda264cb7c3d6e6e5c9415a987ecb0e72c17c00d36fbb881d34abe" +checksum = "13fe11640a23eb24562225322cd3e452b93a3d4091d62fab69c70542fcd17d1f" dependencies = [ "bytecheck_derive", "ptr_meta", + "simdutf8", ] [[package]] name = "bytecheck_derive" -version = "0.6.7" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a2b3b92c135dae665a6f760205b89187638e83bed17ef3e44e83c712cf30600" +checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ "proc-macro2", "quote", @@ -135,6 +142,12 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + [[package]] name = "cc" version = "1.0.69" @@ -169,7 +182,7 @@ dependencies = [ "cfg-if", "libc", "scopeguard", - "windows-sys", + "windows-sys 0.33.0", ] [[package]] @@ -234,6 +247,7 @@ version = "1.2.5" dependencies = [ "bitflags", "bytecheck", + "bytes", "clru", "cosmwasm-crypto", "cosmwasm-std", @@ -272,56 +286,74 @@ dependencies = [ [[package]] name = "cranelift-bforest" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38faa2a16616c8e78a18d37b4726b98bfd2de192f2fdc8a39ddf568a408a0f75" +checksum = "2a2ab4512dfd3a6f4be184403a195f76e81a8a9f9e6c898e19d2dc3ce20e0115" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26f192472a3ba23860afd07d2b0217dc628f21fcc72617aa1336d98e1671f33b" +checksum = "98b022ed2a5913a38839dfbafe6cf135342661293b08049843362df4301261dc" dependencies = [ + "arrayvec", + "bumpalo", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", + "cranelift-egraph", "cranelift-entity", + "cranelift-isle", "gimli 0.26.1", "log", - "regalloc", + "regalloc2", "smallvec", "target-lexicon", ] [[package]] name = "cranelift-codegen-meta" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32ddb89e9b89d3d9b36a5b7d7ea3261c98235a76ac95ba46826b8ec40b1a24" +checksum = "639307b45434ad112a98f8300c0f0ab085cbefcd767efcdef9ef19d4c0756e74" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.82.3" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278e52e29c53fcf32431ef08406c295699a70306d05a0715c5b1bf50e33a9ab7" + +[[package]] +name = "cranelift-egraph" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01fd0d9f288cc1b42d9333b7a776b17e278fc888c28e6a0f09b5573d45a150bc" +checksum = "624b54323b06e675293939311943ba82d323bb340468ce1889be5da7932c8d73" +dependencies = [ + "cranelift-entity", + "fxhash", + "hashbrown", + "indexmap", + "log", + "smallvec", +] [[package]] name = "cranelift-entity" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3bfe172b83167604601faf9dc60453e0d0a93415b57a9c4d1a7ae6849185cf" +checksum = "9a59bcbca89c3f1b70b93ab3cbba5e5e0cbf3e63dadb23c7525cb142e21a9d4c" [[package]] name = "cranelift-frontend" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a006e3e32d80ce0e4ba7f1f9ddf66066d052a8c884a110b91d05404d6ce26dce" +checksum = "0d70abacb8cfef3dc8ff7e8836e9c1d70f7967dfdac824a4cd5e30223415aca6" dependencies = [ "cranelift-codegen", "log", @@ -329,6 +361,12 @@ dependencies = [ "target-lexicon", ] +[[package]] +name = "cranelift-isle" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "393bc73c451830ff8dbb3a07f61843d6cb41a084f9996319917c0b291ed785bb" + [[package]] name = "crc32fast" version = "1.3.2" @@ -368,7 +406,7 @@ dependencies = [ "cfg-if", "crossbeam-utils", "lazy_static", - "memoffset", + "memoffset 0.6.4", "scopeguard", ] @@ -458,6 +496,19 @@ dependencies = [ "syn", ] +[[package]] +name = "dashmap" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" +dependencies = [ + "cfg-if", + "hashbrown", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "der" version = "0.6.0" @@ -647,12 +698,30 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + [[package]] name = "forward_ref" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generic-array" version = "0.14.4" @@ -715,18 +784,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c21d40587b92fa6a6c6e3c1bdbf87d75511db5672f9c93175574b3a00df1758" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ "ahash", ] @@ -761,15 +821,24 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "indexmap" -version = "1.7.0" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown 0.11.2", - "serde", + "hashbrown", ] [[package]] @@ -780,9 +849,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "js-sys" -version = "0.3.55" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" dependencies = [ "wasm-bindgen", ] @@ -818,13 +887,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] -name = "libloading" -version = "0.7.0" +name = "lock_api" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ - "cfg-if", - "winapi", + "autocfg", + "scopeguard", ] [[package]] @@ -842,7 +911,6 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" dependencies = [ - "indexmap", "loupe-derive", "rustversion", ] @@ -890,6 +958,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + [[package]] name = "miniz_oxide" version = "0.4.4" @@ -925,23 +1002,11 @@ dependencies = [ "memchr", ] -[[package]] -name = "object" -version = "0.28.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40bec70ba014595f99f7aa110b84331ffe1ee9aece7fe6f387cc7e3ecda4d456" -dependencies = [ - "crc32fast", - "hashbrown 0.11.2", - "indexmap", - "memchr", -] - [[package]] name = "once_cell" -version = "1.8.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "opaque-debug" @@ -955,6 +1020,25 @@ version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" +[[package]] +name = "parking_lot_core" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys 0.45.0", +] + +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + [[package]] name = "pin-project-lite" version = "0.2.7" @@ -971,12 +1055,6 @@ dependencies = [ "spki", ] -[[package]] -name = "ppv-lite86" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1003,11 +1081,11 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.27" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -1039,28 +1117,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" -dependencies = [ - "libc", - "rand_chacha", - "rand_core 0.6.3", - "rand_hc", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.3", -] - [[package]] name = "rand_core" version = "0.5.1" @@ -1079,15 +1135,6 @@ dependencies = [ "getrandom 0.2.3", ] -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core 0.6.3", -] - [[package]] name = "rayon" version = "1.5.1" @@ -1123,13 +1170,14 @@ dependencies = [ ] [[package]] -name = "regalloc" -version = "0.0.34" +name = "regalloc2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62446b1d3ebf980bdc68837700af1d77b37bc430e524bf95319c6eada2a4cc02" +checksum = "300d4fbfb40c1c66a78ba3ddd41c1110247cf52f97b87d0f2fc9209bd49b030c" dependencies = [ + "fxhash", "log", - "rustc-hash", + "slice-group-by", "smallvec", ] @@ -1145,20 +1193,11 @@ dependencies = [ "winapi", ] -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - [[package]] name = "rend" -version = "0.3.6" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79af64b4b6362ffba04eef3a4e10829718a4896dac19daa741851c86781edf95" +checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" dependencies = [ "bytecheck", ] @@ -1176,12 +1215,13 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.7.36" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5230ae2981a885590b0dc84e0b24c0ed23ad24f7adc0eb824b26cafa961f7c36" +checksum = "21499ed91807f07ae081880aabb2ccc0235e9d88011867d984525e9a4c3cfa3e" dependencies = [ "bytecheck", - "hashbrown 0.12.0", + "hashbrown", + "indexmap", "ptr_meta", "rend", "rkyv_derive", @@ -1190,9 +1230,9 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.7.36" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc752d5925dbcb324522f3a4c93193d17f107b2e11810913aa3ad352fa01480" +checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" dependencies = [ "proc-macro2", "quote", @@ -1205,12 +1245,6 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustversion" version = "1.0.5" @@ -1292,12 +1326,14 @@ dependencies = [ ] [[package]] -name = "serde_bytes" -version = "0.11.5" +name = "serde-wasm-bindgen" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" +checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" dependencies = [ + "js-sys", "serde", + "wasm-bindgen", ] [[package]] @@ -1367,6 +1403,18 @@ dependencies = [ "rand_core 0.6.3", ] +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + +[[package]] +name = "slice-group-by" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" + [[package]] name = "smallvec" version = "1.6.1" @@ -1409,34 +1457,20 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.73" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] name = "target-lexicon" -version = "0.12.2" +version = "0.12.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9bffcddbc2458fa3e6058414599e3c838a022abae82e5c67b4f7f80298d5bff" - -[[package]] -name = "tempfile" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" -dependencies = [ - "cfg-if", - "libc", - "rand", - "redox_syscall", - "remove_dir_all", - "winapi", -] +checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5" [[package]] name = "thiserror" @@ -1458,6 +1492,21 @@ dependencies = [ "syn", ] +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tracing" version = "0.1.26" @@ -1465,7 +1514,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ "cfg-if", - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1510,10 +1558,36 @@ dependencies = [ ] [[package]] -name = "unicode-xid" -version = "0.2.2" +name = "unicode-bidi" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] [[package]] name = "version_check" @@ -1535,9 +1609,9 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm-bindgen" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1545,24 +1619,47 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", "syn", "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-downcast" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" +dependencies = [ + "js-sys", + "once_cell", + "wasm-bindgen", + "wasm-bindgen-downcast-macros", +] + +[[package]] +name = "wasm-bindgen-downcast-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "wasm-bindgen-macro" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1570,9 +1667,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", @@ -1583,79 +1680,71 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea8d8361c9d006ea3d7797de7bd6b1492ffd0f91a22430cfda6c1658ad57bedf" +checksum = "8472807bd8d5062aef0a35681e1b6fbaed8fea88d97910870741100c03b8fef3" dependencies = [ + "bytes", "cfg-if", + "derivative", "indexmap", "js-sys", - "loupe", "more-asserts", + "serde", + "serde-wasm-bindgen", "target-lexicon", "thiserror", "wasm-bindgen", - "wasmer-artifact", + "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", "wasmer-derive", - "wasmer-engine", - "wasmer-engine-dylib", - "wasmer-engine-universal", "wasmer-types", "wasmer-vm", "winapi", ] -[[package]] -name = "wasmer-artifact" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aaf9428c29c1d8ad2ac0e45889ba8a568a835e33fd058964e5e500f2f7ce325" -dependencies = [ - "enumset", - "loupe", - "thiserror", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-compiler" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67a6cd866aed456656db2cfea96c18baabbd33f676578482b85c51e1ee19d2c" +checksum = "2e322cdfb8ed189d92cbb5c34acb319c0f04fb9799ed68e127717f255f8b246a" dependencies = [ + "backtrace", + "cfg-if", + "enum-iterator", "enumset", - "loupe", - "rkyv", - "serde", - "serde_bytes", + "lazy_static", + "leb128", + "memmap2", + "more-asserts", + "region", + "rustc-demangle", "smallvec", - "target-lexicon", "thiserror", "wasmer-types", + "wasmer-vm", "wasmparser", + "winapi", ] [[package]] name = "wasmer-compiler-cranelift" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48be2f9f6495f08649e4f8b946a2cbbe119faf5a654aa1457f9504a99d23dae0" +checksum = "c5240177aca0d8322c890d17d4b1b87f23ccb45340f616f384655aaba18f51bd" dependencies = [ "cranelift-codegen", "cranelift-entity", "cranelift-frontend", "gimli 0.26.1", - "loupe", "more-asserts", "rayon", "smallvec", @@ -1667,16 +1756,16 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ca2a35204d8befa85062bc7aac259a8db8070b801b8a783770ba58231d729e" +checksum = "f9f824f2e345c288e4394ee0410478dea799747f9ebb319e1d8ad33e33a03545" dependencies = [ "byteorder", "dynasm", "dynasmrt", + "enumset", "gimli 0.26.1", "lazy_static", - "loupe", "more-asserts", "rayon", "smallvec", @@ -1686,9 +1775,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e50405cc2a2f74ff574584710a5f2c1d5c93744acce2ca0866084739284b51" +checksum = "fb6858f330764b1041e68d3c824970064d2fbd8e27704180289fd248ff892c48" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1696,173 +1785,68 @@ dependencies = [ "syn", ] -[[package]] -name = "wasmer-engine" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f98f010978c244db431b392aeab0661df7ea0822343334f8f2a920763548e45" -dependencies = [ - "backtrace", - "enumset", - "lazy_static", - "loupe", - "memmap2", - "more-asserts", - "rustc-demangle", - "serde", - "serde_bytes", - "target-lexicon", - "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", - "wasmer-vm", -] - -[[package]] -name = "wasmer-engine-dylib" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0358af9c154724587731175553805648d9acb8f6657880d165e378672b7e53" -dependencies = [ - "cfg-if", - "enum-iterator", - "enumset", - "leb128", - "libloading", - "loupe", - "object 0.28.3", - "rkyv", - "serde", - "tempfile", - "tracing", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-engine", - "wasmer-object", - "wasmer-types", - "wasmer-vm", - "which", -] - -[[package]] -name = "wasmer-engine-universal" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "440dc3d93c9ca47865a4f4edd037ea81bf983b5796b59b3d712d844b32dbef15" -dependencies = [ - "cfg-if", - "enumset", - "leb128", - "loupe", - "region", - "rkyv", - "wasmer-compiler", - "wasmer-engine", - "wasmer-engine-universal-artifact", - "wasmer-types", - "wasmer-vm", - "winapi", -] - -[[package]] -name = "wasmer-engine-universal-artifact" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f1db3f54152657eb6e86c44b66525ff7801dad8328fe677da48dd06af9ad41" -dependencies = [ - "enum-iterator", - "enumset", - "loupe", - "rkyv", - "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-middlewares" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7812438ed2f37203a37007cdb5332b8475cb2b16e15d51299b2647894e9ed3a" +checksum = "f3c5919c0fbbdb0ac8f6d432e7baa796ea49b1381d726bc319c0451f26da11fd" dependencies = [ - "loupe", "wasmer", "wasmer-types", "wasmer-vm", ] -[[package]] -name = "wasmer-object" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d831335ff3a44ecf451303f6f891175c642488036b92ceceb24ac8623a8fa8b" -dependencies = [ - "object 0.28.3", - "thiserror", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-types" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39df01ea05dc0a9bab67e054c7cb01521e53b35a7bb90bd02eca564ed0b2667f" +checksum = "d83345e3335fb9b21be6c394bc3d712522447bc8750db8a40ac9170627e3de35" dependencies = [ - "backtrace", + "bytecheck", "enum-iterator", + "enumset", "indexmap", - "loupe", "more-asserts", "rkyv", - "serde", + "target-lexicon", "thiserror", ] [[package]] name = "wasmer-vm" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d965fa61f4dc4cdb35a54daaf7ecec3563fbb94154a6c35433f879466247dd" +checksum = "2ca3cf9a2bb5919ae048231972440767efad7a693afaeb41332ab0796be1c884" dependencies = [ "backtrace", "cc", "cfg-if", "corosensei", + "dashmap", + "derivative", "enum-iterator", + "fnv", "indexmap", "lazy_static", "libc", - "loupe", "mach", - "memoffset", + "memoffset 0.8.0", "more-asserts", "region", - "rkyv", "scopeguard", - "serde", "thiserror", - "wasmer-artifact", "wasmer-types", "winapi", ] [[package]] name = "wasmparser" -version = "0.83.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a" - -[[package]] -name = "which" -version = "4.1.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55551e42cbdf2ce2bedd2203d0cc08dba002c27510f86dab6d0ce304cba3dfe" +checksum = "f2ea896273ea99b15132414be1da01ab0d8836415083298ecaffbe308eaac87a" dependencies = [ - "either", - "libc", + "indexmap", + "url", ] [[package]] @@ -1893,43 +1877,109 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43dbb096663629518eb1dfa72d80243ca5a6aca764cae62a2df70af760a9be75" dependencies = [ - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_msvc", + "windows_aarch64_msvc 0.33.0", + "windows_i686_gnu 0.33.0", + "windows_i686_msvc 0.33.0", + "windows_x86_64_gnu 0.33.0", + "windows_x86_64_msvc 0.33.0", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc 0.42.2", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_i686_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_x86_64_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "zeroize" version = "1.5.7" diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index efe0607322..3f8424a892 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -28,6 +28,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + [[package]] name = "autocfg" version = "1.1.0" @@ -45,7 +51,7 @@ dependencies = [ "cfg-if", "libc", "miniz_oxide", - "object 0.25.3", + "object", "rustc-demangle", ] @@ -99,19 +105,20 @@ checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecheck" -version = "0.6.7" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "314889ea31cda264cb7c3d6e6e5c9415a987ecb0e72c17c00d36fbb881d34abe" +checksum = "13fe11640a23eb24562225322cd3e452b93a3d4091d62fab69c70542fcd17d1f" dependencies = [ "bytecheck_derive", "ptr_meta", + "simdutf8", ] [[package]] name = "bytecheck_derive" -version = "0.6.7" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a2b3b92c135dae665a6f760205b89187638e83bed17ef3e44e83c712cf30600" +checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ "proc-macro2", "quote", @@ -126,9 +133,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.0.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" [[package]] name = "cc" @@ -164,7 +171,7 @@ dependencies = [ "cfg-if", "libc", "scopeguard", - "windows-sys", + "windows-sys 0.33.0", ] [[package]] @@ -237,6 +244,7 @@ version = "1.2.5" dependencies = [ "bitflags", "bytecheck", + "bytes", "clru", "cosmwasm-crypto", "cosmwasm-std", @@ -275,56 +283,74 @@ dependencies = [ [[package]] name = "cranelift-bforest" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38faa2a16616c8e78a18d37b4726b98bfd2de192f2fdc8a39ddf568a408a0f75" +checksum = "2a2ab4512dfd3a6f4be184403a195f76e81a8a9f9e6c898e19d2dc3ce20e0115" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26f192472a3ba23860afd07d2b0217dc628f21fcc72617aa1336d98e1671f33b" +checksum = "98b022ed2a5913a38839dfbafe6cf135342661293b08049843362df4301261dc" dependencies = [ + "arrayvec", + "bumpalo", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", + "cranelift-egraph", "cranelift-entity", + "cranelift-isle", "gimli 0.26.1", "log", - "regalloc", + "regalloc2", "smallvec", "target-lexicon", ] [[package]] name = "cranelift-codegen-meta" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32ddb89e9b89d3d9b36a5b7d7ea3261c98235a76ac95ba46826b8ec40b1a24" +checksum = "639307b45434ad112a98f8300c0f0ab085cbefcd767efcdef9ef19d4c0756e74" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01fd0d9f288cc1b42d9333b7a776b17e278fc888c28e6a0f09b5573d45a150bc" +checksum = "278e52e29c53fcf32431ef08406c295699a70306d05a0715c5b1bf50e33a9ab7" + +[[package]] +name = "cranelift-egraph" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624b54323b06e675293939311943ba82d323bb340468ce1889be5da7932c8d73" +dependencies = [ + "cranelift-entity", + "fxhash", + "hashbrown", + "indexmap", + "log", + "smallvec", +] [[package]] name = "cranelift-entity" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3bfe172b83167604601faf9dc60453e0d0a93415b57a9c4d1a7ae6849185cf" +checksum = "9a59bcbca89c3f1b70b93ab3cbba5e5e0cbf3e63dadb23c7525cb142e21a9d4c" [[package]] name = "cranelift-frontend" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a006e3e32d80ce0e4ba7f1f9ddf66066d052a8c884a110b91d05404d6ce26dce" +checksum = "0d70abacb8cfef3dc8ff7e8836e9c1d70f7967dfdac824a4cd5e30223415aca6" dependencies = [ "cranelift-codegen", "log", @@ -332,6 +358,12 @@ dependencies = [ "target-lexicon", ] +[[package]] +name = "cranelift-isle" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "393bc73c451830ff8dbb3a07f61843d6cb41a084f9996319917c0b291ed785bb" + [[package]] name = "crc32fast" version = "1.3.2" @@ -371,7 +403,7 @@ dependencies = [ "cfg-if", "crossbeam-utils", "lazy_static", - "memoffset", + "memoffset 0.6.4", "scopeguard", ] @@ -478,6 +510,19 @@ dependencies = [ "syn", ] +[[package]] +name = "dashmap" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" +dependencies = [ + "cfg-if", + "hashbrown", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "der" version = "0.6.0" @@ -667,12 +712,30 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + [[package]] name = "forward_ref" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generic-array" version = "0.14.4" @@ -735,18 +798,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c21d40587b92fa6a6c6e3c1bdbf87d75511db5672f9c93175574b3a00df1758" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ "ahash", ] @@ -787,15 +841,24 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "indexmap" -version = "1.7.0" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown 0.11.2", - "serde", + "hashbrown", ] [[package]] @@ -806,9 +869,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "js-sys" -version = "0.3.55" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" dependencies = [ "wasm-bindgen", ] @@ -850,13 +913,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] -name = "libloading" -version = "0.7.0" +name = "lock_api" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ - "cfg-if", - "winapi", + "autocfg", + "scopeguard", ] [[package]] @@ -874,7 +937,6 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" dependencies = [ - "indexmap", "loupe-derive", "rustversion", ] @@ -922,6 +984,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + [[package]] name = "miniz_oxide" version = "0.4.4" @@ -957,23 +1028,11 @@ dependencies = [ "memchr", ] -[[package]] -name = "object" -version = "0.28.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40bec70ba014595f99f7aa110b84331ffe1ee9aece7fe6f387cc7e3ecda4d456" -dependencies = [ - "crc32fast", - "hashbrown 0.11.2", - "indexmap", - "memchr", -] - [[package]] name = "once_cell" -version = "1.8.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "opaque-debug" @@ -987,6 +1046,25 @@ version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" +[[package]] +name = "parking_lot_core" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys 0.45.0", +] + +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + [[package]] name = "pin-project-lite" version = "0.2.7" @@ -1003,12 +1081,6 @@ dependencies = [ "spki", ] -[[package]] -name = "ppv-lite86" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1035,11 +1107,11 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.27" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -1071,28 +1143,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" -dependencies = [ - "libc", - "rand_chacha", - "rand_core 0.6.3", - "rand_hc", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.3", -] - [[package]] name = "rand_core" version = "0.5.1" @@ -1111,15 +1161,6 @@ dependencies = [ "getrandom 0.2.3", ] -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core 0.6.3", -] - [[package]] name = "rayon" version = "1.5.1" @@ -1155,13 +1196,14 @@ dependencies = [ ] [[package]] -name = "regalloc" -version = "0.0.34" +name = "regalloc2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62446b1d3ebf980bdc68837700af1d77b37bc430e524bf95319c6eada2a4cc02" +checksum = "300d4fbfb40c1c66a78ba3ddd41c1110247cf52f97b87d0f2fc9209bd49b030c" dependencies = [ + "fxhash", "log", - "rustc-hash", + "slice-group-by", "smallvec", ] @@ -1177,20 +1219,11 @@ dependencies = [ "winapi", ] -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - [[package]] name = "rend" -version = "0.3.6" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79af64b4b6362ffba04eef3a4e10829718a4896dac19daa741851c86781edf95" +checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" dependencies = [ "bytecheck", ] @@ -1208,12 +1241,13 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.7.36" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5230ae2981a885590b0dc84e0b24c0ed23ad24f7adc0eb824b26cafa961f7c36" +checksum = "21499ed91807f07ae081880aabb2ccc0235e9d88011867d984525e9a4c3cfa3e" dependencies = [ "bytecheck", - "hashbrown 0.12.0", + "hashbrown", + "indexmap", "ptr_meta", "rend", "rkyv_derive", @@ -1222,9 +1256,9 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.7.36" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc752d5925dbcb324522f3a4c93193d17f107b2e11810913aa3ad352fa01480" +checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" dependencies = [ "proc-macro2", "quote", @@ -1247,12 +1281,6 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustc-hex" version = "2.1.0" @@ -1340,12 +1368,14 @@ dependencies = [ ] [[package]] -name = "serde_bytes" -version = "0.11.5" +name = "serde-wasm-bindgen" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" +checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" dependencies = [ + "js-sys", "serde", + "wasm-bindgen", ] [[package]] @@ -1425,6 +1455,18 @@ dependencies = [ "rand_core 0.6.3", ] +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + +[[package]] +name = "slice-group-by" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" + [[package]] name = "smallvec" version = "1.6.1" @@ -1467,34 +1509,20 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.73" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] name = "target-lexicon" -version = "0.12.2" +version = "0.12.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9bffcddbc2458fa3e6058414599e3c838a022abae82e5c67b4f7f80298d5bff" - -[[package]] -name = "tempfile" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" -dependencies = [ - "cfg-if", - "libc", - "rand", - "redox_syscall", - "remove_dir_all", - "winapi", -] +checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5" [[package]] name = "thiserror" @@ -1516,6 +1544,21 @@ dependencies = [ "syn", ] +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tracing" version = "0.1.26" @@ -1523,7 +1566,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ "cfg-if", - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1568,10 +1610,36 @@ dependencies = [ ] [[package]] -name = "unicode-xid" -version = "0.2.2" +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] [[package]] name = "version_check" @@ -1593,9 +1661,9 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm-bindgen" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1603,24 +1671,47 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", "syn", "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-downcast" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" +dependencies = [ + "js-sys", + "once_cell", + "wasm-bindgen", + "wasm-bindgen-downcast-macros", +] + +[[package]] +name = "wasm-bindgen-downcast-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "wasm-bindgen-macro" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1628,9 +1719,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", @@ -1641,79 +1732,71 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea8d8361c9d006ea3d7797de7bd6b1492ffd0f91a22430cfda6c1658ad57bedf" +checksum = "8472807bd8d5062aef0a35681e1b6fbaed8fea88d97910870741100c03b8fef3" dependencies = [ + "bytes", "cfg-if", + "derivative", "indexmap", "js-sys", - "loupe", "more-asserts", + "serde", + "serde-wasm-bindgen", "target-lexicon", "thiserror", "wasm-bindgen", - "wasmer-artifact", + "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", "wasmer-derive", - "wasmer-engine", - "wasmer-engine-dylib", - "wasmer-engine-universal", "wasmer-types", "wasmer-vm", "winapi", ] -[[package]] -name = "wasmer-artifact" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aaf9428c29c1d8ad2ac0e45889ba8a568a835e33fd058964e5e500f2f7ce325" -dependencies = [ - "enumset", - "loupe", - "thiserror", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-compiler" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67a6cd866aed456656db2cfea96c18baabbd33f676578482b85c51e1ee19d2c" +checksum = "2e322cdfb8ed189d92cbb5c34acb319c0f04fb9799ed68e127717f255f8b246a" dependencies = [ + "backtrace", + "cfg-if", + "enum-iterator", "enumset", - "loupe", - "rkyv", - "serde", - "serde_bytes", + "lazy_static", + "leb128", + "memmap2", + "more-asserts", + "region", + "rustc-demangle", "smallvec", - "target-lexicon", "thiserror", "wasmer-types", + "wasmer-vm", "wasmparser", + "winapi", ] [[package]] name = "wasmer-compiler-cranelift" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48be2f9f6495f08649e4f8b946a2cbbe119faf5a654aa1457f9504a99d23dae0" +checksum = "c5240177aca0d8322c890d17d4b1b87f23ccb45340f616f384655aaba18f51bd" dependencies = [ "cranelift-codegen", "cranelift-entity", "cranelift-frontend", "gimli 0.26.1", - "loupe", "more-asserts", "rayon", "smallvec", @@ -1725,16 +1808,16 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ca2a35204d8befa85062bc7aac259a8db8070b801b8a783770ba58231d729e" +checksum = "f9f824f2e345c288e4394ee0410478dea799747f9ebb319e1d8ad33e33a03545" dependencies = [ "byteorder", "dynasm", "dynasmrt", + "enumset", "gimli 0.26.1", "lazy_static", - "loupe", "more-asserts", "rayon", "smallvec", @@ -1744,9 +1827,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e50405cc2a2f74ff574584710a5f2c1d5c93744acce2ca0866084739284b51" +checksum = "fb6858f330764b1041e68d3c824970064d2fbd8e27704180289fd248ff892c48" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1754,173 +1837,68 @@ dependencies = [ "syn", ] -[[package]] -name = "wasmer-engine" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f98f010978c244db431b392aeab0661df7ea0822343334f8f2a920763548e45" -dependencies = [ - "backtrace", - "enumset", - "lazy_static", - "loupe", - "memmap2", - "more-asserts", - "rustc-demangle", - "serde", - "serde_bytes", - "target-lexicon", - "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", - "wasmer-vm", -] - -[[package]] -name = "wasmer-engine-dylib" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0358af9c154724587731175553805648d9acb8f6657880d165e378672b7e53" -dependencies = [ - "cfg-if", - "enum-iterator", - "enumset", - "leb128", - "libloading", - "loupe", - "object 0.28.3", - "rkyv", - "serde", - "tempfile", - "tracing", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-engine", - "wasmer-object", - "wasmer-types", - "wasmer-vm", - "which", -] - -[[package]] -name = "wasmer-engine-universal" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "440dc3d93c9ca47865a4f4edd037ea81bf983b5796b59b3d712d844b32dbef15" -dependencies = [ - "cfg-if", - "enumset", - "leb128", - "loupe", - "region", - "rkyv", - "wasmer-compiler", - "wasmer-engine", - "wasmer-engine-universal-artifact", - "wasmer-types", - "wasmer-vm", - "winapi", -] - -[[package]] -name = "wasmer-engine-universal-artifact" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f1db3f54152657eb6e86c44b66525ff7801dad8328fe677da48dd06af9ad41" -dependencies = [ - "enum-iterator", - "enumset", - "loupe", - "rkyv", - "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-middlewares" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7812438ed2f37203a37007cdb5332b8475cb2b16e15d51299b2647894e9ed3a" +checksum = "f3c5919c0fbbdb0ac8f6d432e7baa796ea49b1381d726bc319c0451f26da11fd" dependencies = [ - "loupe", "wasmer", "wasmer-types", "wasmer-vm", ] -[[package]] -name = "wasmer-object" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d831335ff3a44ecf451303f6f891175c642488036b92ceceb24ac8623a8fa8b" -dependencies = [ - "object 0.28.3", - "thiserror", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-types" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39df01ea05dc0a9bab67e054c7cb01521e53b35a7bb90bd02eca564ed0b2667f" +checksum = "d83345e3335fb9b21be6c394bc3d712522447bc8750db8a40ac9170627e3de35" dependencies = [ - "backtrace", + "bytecheck", "enum-iterator", + "enumset", "indexmap", - "loupe", "more-asserts", "rkyv", - "serde", + "target-lexicon", "thiserror", ] [[package]] name = "wasmer-vm" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d965fa61f4dc4cdb35a54daaf7ecec3563fbb94154a6c35433f879466247dd" +checksum = "2ca3cf9a2bb5919ae048231972440767efad7a693afaeb41332ab0796be1c884" dependencies = [ "backtrace", "cc", "cfg-if", "corosensei", + "dashmap", + "derivative", "enum-iterator", + "fnv", "indexmap", "lazy_static", "libc", - "loupe", "mach", - "memoffset", + "memoffset 0.8.0", "more-asserts", "region", - "rkyv", "scopeguard", - "serde", "thiserror", - "wasmer-artifact", "wasmer-types", "winapi", ] [[package]] name = "wasmparser" -version = "0.83.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a" - -[[package]] -name = "which" -version = "4.1.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55551e42cbdf2ce2bedd2203d0cc08dba002c27510f86dab6d0ce304cba3dfe" +checksum = "f2ea896273ea99b15132414be1da01ab0d8836415083298ecaffbe308eaac87a" dependencies = [ - "either", - "libc", + "indexmap", + "url", ] [[package]] @@ -1951,43 +1929,109 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43dbb096663629518eb1dfa72d80243ca5a6aca764cae62a2df70af760a9be75" dependencies = [ - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_msvc", + "windows_aarch64_msvc 0.33.0", + "windows_i686_gnu 0.33.0", + "windows_i686_msvc 0.33.0", + "windows_x86_64_gnu 0.33.0", + "windows_x86_64_msvc 0.33.0", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc 0.42.2", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_i686_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_x86_64_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "zeroize" version = "1.5.7" diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 0e97b8bcff..a84750ad07 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -40,6 +40,12 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + [[package]] name = "autocfg" version = "1.1.0" @@ -57,7 +63,7 @@ dependencies = [ "cfg-if", "libc", "miniz_oxide", - "object 0.25.3", + "object", "rustc-demangle", ] @@ -92,7 +98,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" dependencies = [ "arrayref", - "arrayvec", + "arrayvec 0.5.2", "constant_time_eq", ] @@ -122,19 +128,20 @@ checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecheck" -version = "0.6.7" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "314889ea31cda264cb7c3d6e6e5c9415a987ecb0e72c17c00d36fbb881d34abe" +checksum = "13fe11640a23eb24562225322cd3e452b93a3d4091d62fab69c70542fcd17d1f" dependencies = [ "bytecheck_derive", "ptr_meta", + "simdutf8", ] [[package]] name = "bytecheck_derive" -version = "0.6.7" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a2b3b92c135dae665a6f760205b89187638e83bed17ef3e44e83c712cf30600" +checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ "proc-macro2", "quote", @@ -147,6 +154,12 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + [[package]] name = "cc" version = "1.0.69" @@ -187,7 +200,7 @@ dependencies = [ "cfg-if", "libc", "scopeguard", - "windows-sys", + "windows-sys 0.33.0", ] [[package]] @@ -260,6 +273,7 @@ version = "1.2.5" dependencies = [ "bitflags", "bytecheck", + "bytes", "clru", "cosmwasm-crypto", "cosmwasm-std", @@ -298,56 +312,74 @@ dependencies = [ [[package]] name = "cranelift-bforest" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38faa2a16616c8e78a18d37b4726b98bfd2de192f2fdc8a39ddf568a408a0f75" +checksum = "2a2ab4512dfd3a6f4be184403a195f76e81a8a9f9e6c898e19d2dc3ce20e0115" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26f192472a3ba23860afd07d2b0217dc628f21fcc72617aa1336d98e1671f33b" +checksum = "98b022ed2a5913a38839dfbafe6cf135342661293b08049843362df4301261dc" dependencies = [ + "arrayvec 0.7.2", + "bumpalo", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", + "cranelift-egraph", "cranelift-entity", + "cranelift-isle", "gimli 0.26.1", "log", - "regalloc", + "regalloc2", "smallvec", "target-lexicon", ] [[package]] name = "cranelift-codegen-meta" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32ddb89e9b89d3d9b36a5b7d7ea3261c98235a76ac95ba46826b8ec40b1a24" +checksum = "639307b45434ad112a98f8300c0f0ab085cbefcd767efcdef9ef19d4c0756e74" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.82.3" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278e52e29c53fcf32431ef08406c295699a70306d05a0715c5b1bf50e33a9ab7" + +[[package]] +name = "cranelift-egraph" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01fd0d9f288cc1b42d9333b7a776b17e278fc888c28e6a0f09b5573d45a150bc" +checksum = "624b54323b06e675293939311943ba82d323bb340468ce1889be5da7932c8d73" +dependencies = [ + "cranelift-entity", + "fxhash", + "hashbrown", + "indexmap", + "log", + "smallvec", +] [[package]] name = "cranelift-entity" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3bfe172b83167604601faf9dc60453e0d0a93415b57a9c4d1a7ae6849185cf" +checksum = "9a59bcbca89c3f1b70b93ab3cbba5e5e0cbf3e63dadb23c7525cb142e21a9d4c" [[package]] name = "cranelift-frontend" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a006e3e32d80ce0e4ba7f1f9ddf66066d052a8c884a110b91d05404d6ce26dce" +checksum = "0d70abacb8cfef3dc8ff7e8836e9c1d70f7967dfdac824a4cd5e30223415aca6" dependencies = [ "cranelift-codegen", "log", @@ -355,6 +387,12 @@ dependencies = [ "target-lexicon", ] +[[package]] +name = "cranelift-isle" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "393bc73c451830ff8dbb3a07f61843d6cb41a084f9996319917c0b291ed785bb" + [[package]] name = "crc32fast" version = "1.3.2" @@ -394,7 +432,7 @@ dependencies = [ "cfg-if", "crossbeam-utils", "lazy_static", - "memoffset", + "memoffset 0.6.4", "scopeguard", ] @@ -496,6 +534,19 @@ dependencies = [ "syn", ] +[[package]] +name = "dashmap" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" +dependencies = [ + "cfg-if", + "hashbrown", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "der" version = "0.6.0" @@ -685,12 +736,30 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + [[package]] name = "forward_ref" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generic-array" version = "0.14.4" @@ -753,18 +822,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c21d40587b92fa6a6c6e3c1bdbf87d75511db5672f9c93175574b3a00df1758" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ "ahash", ] @@ -799,15 +859,24 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "indexmap" -version = "1.7.0" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown 0.11.2", - "serde", + "hashbrown", ] [[package]] @@ -818,9 +887,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "js-sys" -version = "0.3.55" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" dependencies = [ "wasm-bindgen", ] @@ -856,13 +925,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] -name = "libloading" -version = "0.7.0" +name = "lock_api" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ - "cfg-if", - "winapi", + "autocfg", + "scopeguard", ] [[package]] @@ -880,7 +949,6 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" dependencies = [ - "indexmap", "loupe-derive", "rustversion", ] @@ -928,6 +996,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + [[package]] name = "miniz_oxide" version = "0.4.4" @@ -963,23 +1040,11 @@ dependencies = [ "memchr", ] -[[package]] -name = "object" -version = "0.28.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40bec70ba014595f99f7aa110b84331ffe1ee9aece7fe6f387cc7e3ecda4d456" -dependencies = [ - "crc32fast", - "hashbrown 0.11.2", - "indexmap", - "memchr", -] - [[package]] name = "once_cell" -version = "1.8.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "opaque-debug" @@ -993,6 +1058,25 @@ version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" +[[package]] +name = "parking_lot_core" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys 0.45.0", +] + +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + [[package]] name = "pin-project-lite" version = "0.2.7" @@ -1009,12 +1093,6 @@ dependencies = [ "spki", ] -[[package]] -name = "ppv-lite86" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1041,11 +1119,11 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.27" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -1077,28 +1155,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" -dependencies = [ - "libc", - "rand_chacha", - "rand_core 0.6.3", - "rand_hc", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.3", -] - [[package]] name = "rand_core" version = "0.5.1" @@ -1117,15 +1173,6 @@ dependencies = [ "getrandom 0.2.3", ] -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core 0.6.3", -] - [[package]] name = "rayon" version = "1.5.1" @@ -1161,13 +1208,14 @@ dependencies = [ ] [[package]] -name = "regalloc" -version = "0.0.34" +name = "regalloc2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62446b1d3ebf980bdc68837700af1d77b37bc430e524bf95319c6eada2a4cc02" +checksum = "300d4fbfb40c1c66a78ba3ddd41c1110247cf52f97b87d0f2fc9209bd49b030c" dependencies = [ + "fxhash", "log", - "rustc-hash", + "slice-group-by", "smallvec", ] @@ -1183,20 +1231,11 @@ dependencies = [ "winapi", ] -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - [[package]] name = "rend" -version = "0.3.6" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79af64b4b6362ffba04eef3a4e10829718a4896dac19daa741851c86781edf95" +checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" dependencies = [ "bytecheck", ] @@ -1214,12 +1253,13 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.7.36" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5230ae2981a885590b0dc84e0b24c0ed23ad24f7adc0eb824b26cafa961f7c36" +checksum = "21499ed91807f07ae081880aabb2ccc0235e9d88011867d984525e9a4c3cfa3e" dependencies = [ "bytecheck", - "hashbrown 0.12.0", + "hashbrown", + "indexmap", "ptr_meta", "rend", "rkyv_derive", @@ -1228,9 +1268,9 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.7.36" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc752d5925dbcb324522f3a4c93193d17f107b2e11810913aa3ad352fa01480" +checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" dependencies = [ "proc-macro2", "quote", @@ -1255,12 +1295,6 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustversion" version = "1.0.5" @@ -1342,12 +1376,14 @@ dependencies = [ ] [[package]] -name = "serde_bytes" -version = "0.11.5" +name = "serde-wasm-bindgen" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" +checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" dependencies = [ + "js-sys", "serde", + "wasm-bindgen", ] [[package]] @@ -1417,6 +1453,18 @@ dependencies = [ "rand_core 0.6.3", ] +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + +[[package]] +name = "slice-group-by" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" + [[package]] name = "smallvec" version = "1.6.1" @@ -1459,34 +1507,20 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.73" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] name = "target-lexicon" -version = "0.12.2" +version = "0.12.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9bffcddbc2458fa3e6058414599e3c838a022abae82e5c67b4f7f80298d5bff" - -[[package]] -name = "tempfile" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" -dependencies = [ - "cfg-if", - "libc", - "rand", - "redox_syscall", - "remove_dir_all", - "winapi", -] +checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5" [[package]] name = "thiserror" @@ -1508,6 +1542,21 @@ dependencies = [ "syn", ] +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tracing" version = "0.1.26" @@ -1515,7 +1564,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ "cfg-if", - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1560,10 +1608,36 @@ dependencies = [ ] [[package]] -name = "unicode-xid" -version = "0.2.2" +name = "unicode-bidi" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] [[package]] name = "version_check" @@ -1585,9 +1659,9 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm-bindgen" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1595,24 +1669,47 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", "syn", "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-downcast" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" +dependencies = [ + "js-sys", + "once_cell", + "wasm-bindgen", + "wasm-bindgen-downcast-macros", +] + +[[package]] +name = "wasm-bindgen-downcast-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "wasm-bindgen-macro" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1620,9 +1717,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", @@ -1633,79 +1730,71 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea8d8361c9d006ea3d7797de7bd6b1492ffd0f91a22430cfda6c1658ad57bedf" +checksum = "8472807bd8d5062aef0a35681e1b6fbaed8fea88d97910870741100c03b8fef3" dependencies = [ + "bytes", "cfg-if", + "derivative", "indexmap", "js-sys", - "loupe", "more-asserts", + "serde", + "serde-wasm-bindgen", "target-lexicon", "thiserror", "wasm-bindgen", - "wasmer-artifact", + "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", "wasmer-derive", - "wasmer-engine", - "wasmer-engine-dylib", - "wasmer-engine-universal", "wasmer-types", "wasmer-vm", "winapi", ] -[[package]] -name = "wasmer-artifact" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aaf9428c29c1d8ad2ac0e45889ba8a568a835e33fd058964e5e500f2f7ce325" -dependencies = [ - "enumset", - "loupe", - "thiserror", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-compiler" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67a6cd866aed456656db2cfea96c18baabbd33f676578482b85c51e1ee19d2c" +checksum = "2e322cdfb8ed189d92cbb5c34acb319c0f04fb9799ed68e127717f255f8b246a" dependencies = [ + "backtrace", + "cfg-if", + "enum-iterator", "enumset", - "loupe", - "rkyv", - "serde", - "serde_bytes", + "lazy_static", + "leb128", + "memmap2", + "more-asserts", + "region", + "rustc-demangle", "smallvec", - "target-lexicon", "thiserror", "wasmer-types", + "wasmer-vm", "wasmparser", + "winapi", ] [[package]] name = "wasmer-compiler-cranelift" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48be2f9f6495f08649e4f8b946a2cbbe119faf5a654aa1457f9504a99d23dae0" +checksum = "c5240177aca0d8322c890d17d4b1b87f23ccb45340f616f384655aaba18f51bd" dependencies = [ "cranelift-codegen", "cranelift-entity", "cranelift-frontend", "gimli 0.26.1", - "loupe", "more-asserts", "rayon", "smallvec", @@ -1717,16 +1806,16 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ca2a35204d8befa85062bc7aac259a8db8070b801b8a783770ba58231d729e" +checksum = "f9f824f2e345c288e4394ee0410478dea799747f9ebb319e1d8ad33e33a03545" dependencies = [ "byteorder", "dynasm", "dynasmrt", + "enumset", "gimli 0.26.1", "lazy_static", - "loupe", "more-asserts", "rayon", "smallvec", @@ -1736,9 +1825,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e50405cc2a2f74ff574584710a5f2c1d5c93744acce2ca0866084739284b51" +checksum = "fb6858f330764b1041e68d3c824970064d2fbd8e27704180289fd248ff892c48" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1746,173 +1835,68 @@ dependencies = [ "syn", ] -[[package]] -name = "wasmer-engine" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f98f010978c244db431b392aeab0661df7ea0822343334f8f2a920763548e45" -dependencies = [ - "backtrace", - "enumset", - "lazy_static", - "loupe", - "memmap2", - "more-asserts", - "rustc-demangle", - "serde", - "serde_bytes", - "target-lexicon", - "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", - "wasmer-vm", -] - -[[package]] -name = "wasmer-engine-dylib" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0358af9c154724587731175553805648d9acb8f6657880d165e378672b7e53" -dependencies = [ - "cfg-if", - "enum-iterator", - "enumset", - "leb128", - "libloading", - "loupe", - "object 0.28.3", - "rkyv", - "serde", - "tempfile", - "tracing", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-engine", - "wasmer-object", - "wasmer-types", - "wasmer-vm", - "which", -] - -[[package]] -name = "wasmer-engine-universal" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "440dc3d93c9ca47865a4f4edd037ea81bf983b5796b59b3d712d844b32dbef15" -dependencies = [ - "cfg-if", - "enumset", - "leb128", - "loupe", - "region", - "rkyv", - "wasmer-compiler", - "wasmer-engine", - "wasmer-engine-universal-artifact", - "wasmer-types", - "wasmer-vm", - "winapi", -] - -[[package]] -name = "wasmer-engine-universal-artifact" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f1db3f54152657eb6e86c44b66525ff7801dad8328fe677da48dd06af9ad41" -dependencies = [ - "enum-iterator", - "enumset", - "loupe", - "rkyv", - "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-middlewares" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7812438ed2f37203a37007cdb5332b8475cb2b16e15d51299b2647894e9ed3a" +checksum = "f3c5919c0fbbdb0ac8f6d432e7baa796ea49b1381d726bc319c0451f26da11fd" dependencies = [ - "loupe", "wasmer", "wasmer-types", "wasmer-vm", ] -[[package]] -name = "wasmer-object" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d831335ff3a44ecf451303f6f891175c642488036b92ceceb24ac8623a8fa8b" -dependencies = [ - "object 0.28.3", - "thiserror", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-types" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39df01ea05dc0a9bab67e054c7cb01521e53b35a7bb90bd02eca564ed0b2667f" +checksum = "d83345e3335fb9b21be6c394bc3d712522447bc8750db8a40ac9170627e3de35" dependencies = [ - "backtrace", + "bytecheck", "enum-iterator", + "enumset", "indexmap", - "loupe", "more-asserts", "rkyv", - "serde", + "target-lexicon", "thiserror", ] [[package]] name = "wasmer-vm" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d965fa61f4dc4cdb35a54daaf7ecec3563fbb94154a6c35433f879466247dd" +checksum = "2ca3cf9a2bb5919ae048231972440767efad7a693afaeb41332ab0796be1c884" dependencies = [ "backtrace", "cc", "cfg-if", "corosensei", + "dashmap", + "derivative", "enum-iterator", + "fnv", "indexmap", "lazy_static", "libc", - "loupe", "mach", - "memoffset", + "memoffset 0.8.0", "more-asserts", "region", - "rkyv", "scopeguard", - "serde", "thiserror", - "wasmer-artifact", "wasmer-types", "winapi", ] [[package]] name = "wasmparser" -version = "0.83.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a" - -[[package]] -name = "which" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55551e42cbdf2ce2bedd2203d0cc08dba002c27510f86dab6d0ce304cba3dfe" +checksum = "f2ea896273ea99b15132414be1da01ab0d8836415083298ecaffbe308eaac87a" dependencies = [ - "either", - "libc", + "indexmap", + "url", ] [[package]] @@ -1943,43 +1927,109 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43dbb096663629518eb1dfa72d80243ca5a6aca764cae62a2df70af760a9be75" dependencies = [ - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_msvc", + "windows_aarch64_msvc 0.33.0", + "windows_i686_gnu 0.33.0", + "windows_i686_msvc 0.33.0", + "windows_x86_64_gnu 0.33.0", + "windows_x86_64_msvc 0.33.0", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc 0.42.2", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_i686_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_x86_64_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "zeroize" version = "1.5.7" diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 0ad6b6a8ee..15f8831f18 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -28,6 +28,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + [[package]] name = "autocfg" version = "1.1.0" @@ -45,7 +51,7 @@ dependencies = [ "cfg-if", "libc", "miniz_oxide", - "object 0.25.3", + "object", "rustc-demangle", ] @@ -99,19 +105,20 @@ checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecheck" -version = "0.6.7" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "314889ea31cda264cb7c3d6e6e5c9415a987ecb0e72c17c00d36fbb881d34abe" +checksum = "13fe11640a23eb24562225322cd3e452b93a3d4091d62fab69c70542fcd17d1f" dependencies = [ "bytecheck_derive", "ptr_meta", + "simdutf8", ] [[package]] name = "bytecheck_derive" -version = "0.6.7" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a2b3b92c135dae665a6f760205b89187638e83bed17ef3e44e83c712cf30600" +checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ "proc-macro2", "quote", @@ -124,6 +131,12 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + [[package]] name = "cc" version = "1.0.69" @@ -158,7 +171,7 @@ dependencies = [ "cfg-if", "libc", "scopeguard", - "windows-sys", + "windows-sys 0.33.0", ] [[package]] @@ -231,6 +244,7 @@ version = "1.2.5" dependencies = [ "bitflags", "bytecheck", + "bytes", "clru", "cosmwasm-crypto", "cosmwasm-std", @@ -269,56 +283,74 @@ dependencies = [ [[package]] name = "cranelift-bforest" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38faa2a16616c8e78a18d37b4726b98bfd2de192f2fdc8a39ddf568a408a0f75" +checksum = "2a2ab4512dfd3a6f4be184403a195f76e81a8a9f9e6c898e19d2dc3ce20e0115" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26f192472a3ba23860afd07d2b0217dc628f21fcc72617aa1336d98e1671f33b" +checksum = "98b022ed2a5913a38839dfbafe6cf135342661293b08049843362df4301261dc" dependencies = [ + "arrayvec", + "bumpalo", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", + "cranelift-egraph", "cranelift-entity", + "cranelift-isle", "gimli 0.26.1", "log", - "regalloc", + "regalloc2", "smallvec", "target-lexicon", ] [[package]] name = "cranelift-codegen-meta" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32ddb89e9b89d3d9b36a5b7d7ea3261c98235a76ac95ba46826b8ec40b1a24" +checksum = "639307b45434ad112a98f8300c0f0ab085cbefcd767efcdef9ef19d4c0756e74" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.82.3" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278e52e29c53fcf32431ef08406c295699a70306d05a0715c5b1bf50e33a9ab7" + +[[package]] +name = "cranelift-egraph" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01fd0d9f288cc1b42d9333b7a776b17e278fc888c28e6a0f09b5573d45a150bc" +checksum = "624b54323b06e675293939311943ba82d323bb340468ce1889be5da7932c8d73" +dependencies = [ + "cranelift-entity", + "fxhash", + "hashbrown", + "indexmap", + "log", + "smallvec", +] [[package]] name = "cranelift-entity" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3bfe172b83167604601faf9dc60453e0d0a93415b57a9c4d1a7ae6849185cf" +checksum = "9a59bcbca89c3f1b70b93ab3cbba5e5e0cbf3e63dadb23c7525cb142e21a9d4c" [[package]] name = "cranelift-frontend" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a006e3e32d80ce0e4ba7f1f9ddf66066d052a8c884a110b91d05404d6ce26dce" +checksum = "0d70abacb8cfef3dc8ff7e8836e9c1d70f7967dfdac824a4cd5e30223415aca6" dependencies = [ "cranelift-codegen", "log", @@ -326,6 +358,12 @@ dependencies = [ "target-lexicon", ] +[[package]] +name = "cranelift-isle" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "393bc73c451830ff8dbb3a07f61843d6cb41a084f9996319917c0b291ed785bb" + [[package]] name = "crc32fast" version = "1.3.2" @@ -365,7 +403,7 @@ dependencies = [ "cfg-if", "crossbeam-utils", "lazy_static", - "memoffset", + "memoffset 0.6.4", "scopeguard", ] @@ -455,6 +493,19 @@ dependencies = [ "syn", ] +[[package]] +name = "dashmap" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" +dependencies = [ + "cfg-if", + "hashbrown", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "der" version = "0.6.0" @@ -657,12 +708,30 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + [[package]] name = "forward_ref" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generic-array" version = "0.14.4" @@ -725,18 +794,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c21d40587b92fa6a6c6e3c1bdbf87d75511db5672f9c93175574b3a00df1758" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ "ahash", ] @@ -771,15 +831,24 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "indexmap" -version = "1.7.0" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown 0.11.2", - "serde", + "hashbrown", ] [[package]] @@ -790,9 +859,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "js-sys" -version = "0.3.55" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" dependencies = [ "wasm-bindgen", ] @@ -828,13 +897,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] -name = "libloading" -version = "0.7.0" +name = "lock_api" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ - "cfg-if", - "winapi", + "autocfg", + "scopeguard", ] [[package]] @@ -852,7 +921,6 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" dependencies = [ - "indexmap", "loupe-derive", "rustversion", ] @@ -900,6 +968,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + [[package]] name = "miniz_oxide" version = "0.4.4" @@ -935,23 +1012,11 @@ dependencies = [ "memchr", ] -[[package]] -name = "object" -version = "0.28.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40bec70ba014595f99f7aa110b84331ffe1ee9aece7fe6f387cc7e3ecda4d456" -dependencies = [ - "crc32fast", - "hashbrown 0.11.2", - "indexmap", - "memchr", -] - [[package]] name = "once_cell" -version = "1.8.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "opaque-debug" @@ -965,6 +1030,25 @@ version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" +[[package]] +name = "parking_lot_core" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys 0.45.0", +] + +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + [[package]] name = "pin-project-lite" version = "0.2.7" @@ -981,12 +1065,6 @@ dependencies = [ "spki", ] -[[package]] -name = "ppv-lite86" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1013,11 +1091,11 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.27" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -1049,28 +1127,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" -dependencies = [ - "libc", - "rand_chacha", - "rand_core 0.6.3", - "rand_hc", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.3", -] - [[package]] name = "rand_core" version = "0.5.1" @@ -1089,15 +1145,6 @@ dependencies = [ "getrandom 0.2.3", ] -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core 0.6.3", -] - [[package]] name = "rayon" version = "1.5.1" @@ -1133,13 +1180,14 @@ dependencies = [ ] [[package]] -name = "regalloc" -version = "0.0.34" +name = "regalloc2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62446b1d3ebf980bdc68837700af1d77b37bc430e524bf95319c6eada2a4cc02" +checksum = "300d4fbfb40c1c66a78ba3ddd41c1110247cf52f97b87d0f2fc9209bd49b030c" dependencies = [ + "fxhash", "log", - "rustc-hash", + "slice-group-by", "smallvec", ] @@ -1155,20 +1203,11 @@ dependencies = [ "winapi", ] -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - [[package]] name = "rend" -version = "0.3.6" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79af64b4b6362ffba04eef3a4e10829718a4896dac19daa741851c86781edf95" +checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" dependencies = [ "bytecheck", ] @@ -1186,12 +1225,13 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.7.36" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5230ae2981a885590b0dc84e0b24c0ed23ad24f7adc0eb824b26cafa961f7c36" +checksum = "21499ed91807f07ae081880aabb2ccc0235e9d88011867d984525e9a4c3cfa3e" dependencies = [ "bytecheck", - "hashbrown 0.12.0", + "hashbrown", + "indexmap", "ptr_meta", "rend", "rkyv_derive", @@ -1200,9 +1240,9 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.7.36" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc752d5925dbcb324522f3a4c93193d17f107b2e11810913aa3ad352fa01480" +checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" dependencies = [ "proc-macro2", "quote", @@ -1215,12 +1255,6 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustversion" version = "1.0.5" @@ -1302,12 +1336,14 @@ dependencies = [ ] [[package]] -name = "serde_bytes" -version = "0.11.5" +name = "serde-wasm-bindgen" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" +checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" dependencies = [ + "js-sys", "serde", + "wasm-bindgen", ] [[package]] @@ -1377,6 +1413,18 @@ dependencies = [ "rand_core 0.6.3", ] +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + +[[package]] +name = "slice-group-by" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" + [[package]] name = "smallvec" version = "1.6.1" @@ -1419,34 +1467,20 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.73" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] name = "target-lexicon" -version = "0.12.2" +version = "0.12.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9bffcddbc2458fa3e6058414599e3c838a022abae82e5c67b4f7f80298d5bff" - -[[package]] -name = "tempfile" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" -dependencies = [ - "cfg-if", - "libc", - "rand", - "redox_syscall", - "remove_dir_all", - "winapi", -] +checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5" [[package]] name = "thiserror" @@ -1468,6 +1502,21 @@ dependencies = [ "syn", ] +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tracing" version = "0.1.26" @@ -1475,7 +1524,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ "cfg-if", - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1520,10 +1568,36 @@ dependencies = [ ] [[package]] -name = "unicode-xid" -version = "0.2.2" +name = "unicode-bidi" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] [[package]] name = "version_check" @@ -1545,9 +1619,9 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm-bindgen" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1555,24 +1629,47 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", "syn", "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-downcast" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" +dependencies = [ + "js-sys", + "once_cell", + "wasm-bindgen", + "wasm-bindgen-downcast-macros", +] + +[[package]] +name = "wasm-bindgen-downcast-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "wasm-bindgen-macro" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1580,9 +1677,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", @@ -1593,79 +1690,71 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea8d8361c9d006ea3d7797de7bd6b1492ffd0f91a22430cfda6c1658ad57bedf" +checksum = "8472807bd8d5062aef0a35681e1b6fbaed8fea88d97910870741100c03b8fef3" dependencies = [ + "bytes", "cfg-if", + "derivative", "indexmap", "js-sys", - "loupe", "more-asserts", + "serde", + "serde-wasm-bindgen", "target-lexicon", "thiserror", "wasm-bindgen", - "wasmer-artifact", + "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", "wasmer-derive", - "wasmer-engine", - "wasmer-engine-dylib", - "wasmer-engine-universal", "wasmer-types", "wasmer-vm", "winapi", ] -[[package]] -name = "wasmer-artifact" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aaf9428c29c1d8ad2ac0e45889ba8a568a835e33fd058964e5e500f2f7ce325" -dependencies = [ - "enumset", - "loupe", - "thiserror", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-compiler" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67a6cd866aed456656db2cfea96c18baabbd33f676578482b85c51e1ee19d2c" +checksum = "2e322cdfb8ed189d92cbb5c34acb319c0f04fb9799ed68e127717f255f8b246a" dependencies = [ + "backtrace", + "cfg-if", + "enum-iterator", "enumset", - "loupe", - "rkyv", - "serde", - "serde_bytes", + "lazy_static", + "leb128", + "memmap2", + "more-asserts", + "region", + "rustc-demangle", "smallvec", - "target-lexicon", "thiserror", "wasmer-types", + "wasmer-vm", "wasmparser", + "winapi", ] [[package]] name = "wasmer-compiler-cranelift" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48be2f9f6495f08649e4f8b946a2cbbe119faf5a654aa1457f9504a99d23dae0" +checksum = "c5240177aca0d8322c890d17d4b1b87f23ccb45340f616f384655aaba18f51bd" dependencies = [ "cranelift-codegen", "cranelift-entity", "cranelift-frontend", "gimli 0.26.1", - "loupe", "more-asserts", "rayon", "smallvec", @@ -1677,16 +1766,16 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ca2a35204d8befa85062bc7aac259a8db8070b801b8a783770ba58231d729e" +checksum = "f9f824f2e345c288e4394ee0410478dea799747f9ebb319e1d8ad33e33a03545" dependencies = [ "byteorder", "dynasm", "dynasmrt", + "enumset", "gimli 0.26.1", "lazy_static", - "loupe", "more-asserts", "rayon", "smallvec", @@ -1696,9 +1785,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e50405cc2a2f74ff574584710a5f2c1d5c93744acce2ca0866084739284b51" +checksum = "fb6858f330764b1041e68d3c824970064d2fbd8e27704180289fd248ff892c48" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1706,173 +1795,68 @@ dependencies = [ "syn", ] -[[package]] -name = "wasmer-engine" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f98f010978c244db431b392aeab0661df7ea0822343334f8f2a920763548e45" -dependencies = [ - "backtrace", - "enumset", - "lazy_static", - "loupe", - "memmap2", - "more-asserts", - "rustc-demangle", - "serde", - "serde_bytes", - "target-lexicon", - "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", - "wasmer-vm", -] - -[[package]] -name = "wasmer-engine-dylib" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0358af9c154724587731175553805648d9acb8f6657880d165e378672b7e53" -dependencies = [ - "cfg-if", - "enum-iterator", - "enumset", - "leb128", - "libloading", - "loupe", - "object 0.28.3", - "rkyv", - "serde", - "tempfile", - "tracing", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-engine", - "wasmer-object", - "wasmer-types", - "wasmer-vm", - "which", -] - -[[package]] -name = "wasmer-engine-universal" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "440dc3d93c9ca47865a4f4edd037ea81bf983b5796b59b3d712d844b32dbef15" -dependencies = [ - "cfg-if", - "enumset", - "leb128", - "loupe", - "region", - "rkyv", - "wasmer-compiler", - "wasmer-engine", - "wasmer-engine-universal-artifact", - "wasmer-types", - "wasmer-vm", - "winapi", -] - -[[package]] -name = "wasmer-engine-universal-artifact" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f1db3f54152657eb6e86c44b66525ff7801dad8328fe677da48dd06af9ad41" -dependencies = [ - "enum-iterator", - "enumset", - "loupe", - "rkyv", - "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-middlewares" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7812438ed2f37203a37007cdb5332b8475cb2b16e15d51299b2647894e9ed3a" +checksum = "f3c5919c0fbbdb0ac8f6d432e7baa796ea49b1381d726bc319c0451f26da11fd" dependencies = [ - "loupe", "wasmer", "wasmer-types", "wasmer-vm", ] -[[package]] -name = "wasmer-object" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d831335ff3a44ecf451303f6f891175c642488036b92ceceb24ac8623a8fa8b" -dependencies = [ - "object 0.28.3", - "thiserror", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-types" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39df01ea05dc0a9bab67e054c7cb01521e53b35a7bb90bd02eca564ed0b2667f" +checksum = "d83345e3335fb9b21be6c394bc3d712522447bc8750db8a40ac9170627e3de35" dependencies = [ - "backtrace", + "bytecheck", "enum-iterator", + "enumset", "indexmap", - "loupe", "more-asserts", "rkyv", - "serde", + "target-lexicon", "thiserror", ] [[package]] name = "wasmer-vm" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d965fa61f4dc4cdb35a54daaf7ecec3563fbb94154a6c35433f879466247dd" +checksum = "2ca3cf9a2bb5919ae048231972440767efad7a693afaeb41332ab0796be1c884" dependencies = [ "backtrace", "cc", "cfg-if", "corosensei", + "dashmap", + "derivative", "enum-iterator", + "fnv", "indexmap", "lazy_static", "libc", - "loupe", "mach", - "memoffset", + "memoffset 0.8.0", "more-asserts", "region", - "rkyv", "scopeguard", - "serde", "thiserror", - "wasmer-artifact", "wasmer-types", "winapi", ] [[package]] name = "wasmparser" -version = "0.83.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a" - -[[package]] -name = "which" -version = "4.1.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55551e42cbdf2ce2bedd2203d0cc08dba002c27510f86dab6d0ce304cba3dfe" +checksum = "f2ea896273ea99b15132414be1da01ab0d8836415083298ecaffbe308eaac87a" dependencies = [ - "either", - "libc", + "indexmap", + "url", ] [[package]] @@ -1903,43 +1887,109 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43dbb096663629518eb1dfa72d80243ca5a6aca764cae62a2df70af760a9be75" dependencies = [ - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_msvc", + "windows_aarch64_msvc 0.33.0", + "windows_i686_gnu 0.33.0", + "windows_i686_msvc 0.33.0", + "windows_x86_64_gnu 0.33.0", + "windows_x86_64_msvc 0.33.0", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc 0.42.2", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_i686_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_x86_64_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "zeroize" version = "1.5.7" diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 97027614d8..c3b8854d71 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -28,6 +28,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + [[package]] name = "autocfg" version = "1.1.0" @@ -45,7 +51,7 @@ dependencies = [ "cfg-if", "libc", "miniz_oxide", - "object 0.25.3", + "object", "rustc-demangle", ] @@ -99,19 +105,20 @@ checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecheck" -version = "0.6.7" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "314889ea31cda264cb7c3d6e6e5c9415a987ecb0e72c17c00d36fbb881d34abe" +checksum = "13fe11640a23eb24562225322cd3e452b93a3d4091d62fab69c70542fcd17d1f" dependencies = [ "bytecheck_derive", "ptr_meta", + "simdutf8", ] [[package]] name = "bytecheck_derive" -version = "0.6.7" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a2b3b92c135dae665a6f760205b89187638e83bed17ef3e44e83c712cf30600" +checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ "proc-macro2", "quote", @@ -124,6 +131,12 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + [[package]] name = "cc" version = "1.0.69" @@ -158,7 +171,7 @@ dependencies = [ "cfg-if", "libc", "scopeguard", - "windows-sys", + "windows-sys 0.33.0", ] [[package]] @@ -231,6 +244,7 @@ version = "1.2.5" dependencies = [ "bitflags", "bytecheck", + "bytes", "clru", "cosmwasm-crypto", "cosmwasm-std", @@ -269,56 +283,74 @@ dependencies = [ [[package]] name = "cranelift-bforest" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38faa2a16616c8e78a18d37b4726b98bfd2de192f2fdc8a39ddf568a408a0f75" +checksum = "2a2ab4512dfd3a6f4be184403a195f76e81a8a9f9e6c898e19d2dc3ce20e0115" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26f192472a3ba23860afd07d2b0217dc628f21fcc72617aa1336d98e1671f33b" +checksum = "98b022ed2a5913a38839dfbafe6cf135342661293b08049843362df4301261dc" dependencies = [ + "arrayvec", + "bumpalo", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", + "cranelift-egraph", "cranelift-entity", + "cranelift-isle", "gimli 0.26.1", "log", - "regalloc", + "regalloc2", "smallvec", "target-lexicon", ] [[package]] name = "cranelift-codegen-meta" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32ddb89e9b89d3d9b36a5b7d7ea3261c98235a76ac95ba46826b8ec40b1a24" +checksum = "639307b45434ad112a98f8300c0f0ab085cbefcd767efcdef9ef19d4c0756e74" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.82.3" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278e52e29c53fcf32431ef08406c295699a70306d05a0715c5b1bf50e33a9ab7" + +[[package]] +name = "cranelift-egraph" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01fd0d9f288cc1b42d9333b7a776b17e278fc888c28e6a0f09b5573d45a150bc" +checksum = "624b54323b06e675293939311943ba82d323bb340468ce1889be5da7932c8d73" +dependencies = [ + "cranelift-entity", + "fxhash", + "hashbrown", + "indexmap", + "log", + "smallvec", +] [[package]] name = "cranelift-entity" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3bfe172b83167604601faf9dc60453e0d0a93415b57a9c4d1a7ae6849185cf" +checksum = "9a59bcbca89c3f1b70b93ab3cbba5e5e0cbf3e63dadb23c7525cb142e21a9d4c" [[package]] name = "cranelift-frontend" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a006e3e32d80ce0e4ba7f1f9ddf66066d052a8c884a110b91d05404d6ce26dce" +checksum = "0d70abacb8cfef3dc8ff7e8836e9c1d70f7967dfdac824a4cd5e30223415aca6" dependencies = [ "cranelift-codegen", "log", @@ -326,6 +358,12 @@ dependencies = [ "target-lexicon", ] +[[package]] +name = "cranelift-isle" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "393bc73c451830ff8dbb3a07f61843d6cb41a084f9996319917c0b291ed785bb" + [[package]] name = "crc32fast" version = "1.3.2" @@ -365,7 +403,7 @@ dependencies = [ "cfg-if", "crossbeam-utils", "lazy_static", - "memoffset", + "memoffset 0.6.4", "scopeguard", ] @@ -455,6 +493,19 @@ dependencies = [ "syn", ] +[[package]] +name = "dashmap" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" +dependencies = [ + "cfg-if", + "hashbrown", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "der" version = "0.6.0" @@ -644,12 +695,30 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + [[package]] name = "forward_ref" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generic-array" version = "0.14.4" @@ -726,18 +795,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c21d40587b92fa6a6c6e3c1bdbf87d75511db5672f9c93175574b3a00df1758" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ "ahash", ] @@ -772,15 +832,24 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "indexmap" -version = "1.7.0" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown 0.11.2", - "serde", + "hashbrown", ] [[package]] @@ -791,9 +860,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "js-sys" -version = "0.3.55" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" dependencies = [ "wasm-bindgen", ] @@ -829,13 +898,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] -name = "libloading" -version = "0.7.0" +name = "lock_api" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ - "cfg-if", - "winapi", + "autocfg", + "scopeguard", ] [[package]] @@ -853,7 +922,6 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" dependencies = [ - "indexmap", "loupe-derive", "rustversion", ] @@ -901,6 +969,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + [[package]] name = "miniz_oxide" version = "0.4.4" @@ -936,23 +1013,11 @@ dependencies = [ "memchr", ] -[[package]] -name = "object" -version = "0.28.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40bec70ba014595f99f7aa110b84331ffe1ee9aece7fe6f387cc7e3ecda4d456" -dependencies = [ - "crc32fast", - "hashbrown 0.11.2", - "indexmap", - "memchr", -] - [[package]] name = "once_cell" -version = "1.8.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "opaque-debug" @@ -966,6 +1031,25 @@ version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" +[[package]] +name = "parking_lot_core" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys 0.45.0", +] + +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + [[package]] name = "pin-project-lite" version = "0.2.7" @@ -982,12 +1066,6 @@ dependencies = [ "spki", ] -[[package]] -name = "ppv-lite86" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1014,11 +1092,11 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.27" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -1050,28 +1128,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" -dependencies = [ - "libc", - "rand_chacha", - "rand_core 0.6.3", - "rand_hc", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.3", -] - [[package]] name = "rand_core" version = "0.5.1" @@ -1090,15 +1146,6 @@ dependencies = [ "getrandom 0.2.3", ] -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core 0.6.3", -] - [[package]] name = "rayon" version = "1.5.1" @@ -1134,13 +1181,14 @@ dependencies = [ ] [[package]] -name = "regalloc" -version = "0.0.34" +name = "regalloc2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62446b1d3ebf980bdc68837700af1d77b37bc430e524bf95319c6eada2a4cc02" +checksum = "300d4fbfb40c1c66a78ba3ddd41c1110247cf52f97b87d0f2fc9209bd49b030c" dependencies = [ + "fxhash", "log", - "rustc-hash", + "slice-group-by", "smallvec", ] @@ -1156,20 +1204,11 @@ dependencies = [ "winapi", ] -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - [[package]] name = "rend" -version = "0.3.6" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79af64b4b6362ffba04eef3a4e10829718a4896dac19daa741851c86781edf95" +checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" dependencies = [ "bytecheck", ] @@ -1187,12 +1226,13 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.7.36" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5230ae2981a885590b0dc84e0b24c0ed23ad24f7adc0eb824b26cafa961f7c36" +checksum = "21499ed91807f07ae081880aabb2ccc0235e9d88011867d984525e9a4c3cfa3e" dependencies = [ "bytecheck", - "hashbrown 0.12.0", + "hashbrown", + "indexmap", "ptr_meta", "rend", "rkyv_derive", @@ -1201,9 +1241,9 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.7.36" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc752d5925dbcb324522f3a4c93193d17f107b2e11810913aa3ad352fa01480" +checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" dependencies = [ "proc-macro2", "quote", @@ -1216,12 +1256,6 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustversion" version = "1.0.5" @@ -1303,12 +1337,14 @@ dependencies = [ ] [[package]] -name = "serde_bytes" -version = "0.11.5" +name = "serde-wasm-bindgen" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" +checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" dependencies = [ + "js-sys", "serde", + "wasm-bindgen", ] [[package]] @@ -1378,6 +1414,18 @@ dependencies = [ "rand_core 0.6.3", ] +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + +[[package]] +name = "slice-group-by" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" + [[package]] name = "smallvec" version = "1.6.1" @@ -1420,34 +1468,20 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.73" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] name = "target-lexicon" -version = "0.12.2" +version = "0.12.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9bffcddbc2458fa3e6058414599e3c838a022abae82e5c67b4f7f80298d5bff" - -[[package]] -name = "tempfile" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" -dependencies = [ - "cfg-if", - "libc", - "rand", - "redox_syscall", - "remove_dir_all", - "winapi", -] +checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5" [[package]] name = "thiserror" @@ -1469,6 +1503,21 @@ dependencies = [ "syn", ] +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tracing" version = "0.1.26" @@ -1476,7 +1525,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ "cfg-if", - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1521,10 +1569,36 @@ dependencies = [ ] [[package]] -name = "unicode-xid" -version = "0.2.2" +name = "unicode-bidi" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] [[package]] name = "version_check" @@ -1546,9 +1620,9 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm-bindgen" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1556,24 +1630,47 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", "syn", "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-downcast" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" +dependencies = [ + "js-sys", + "once_cell", + "wasm-bindgen", + "wasm-bindgen-downcast-macros", +] + +[[package]] +name = "wasm-bindgen-downcast-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "wasm-bindgen-macro" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1581,9 +1678,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", @@ -1594,79 +1691,71 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea8d8361c9d006ea3d7797de7bd6b1492ffd0f91a22430cfda6c1658ad57bedf" +checksum = "8472807bd8d5062aef0a35681e1b6fbaed8fea88d97910870741100c03b8fef3" dependencies = [ + "bytes", "cfg-if", + "derivative", "indexmap", "js-sys", - "loupe", "more-asserts", + "serde", + "serde-wasm-bindgen", "target-lexicon", "thiserror", "wasm-bindgen", - "wasmer-artifact", + "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", "wasmer-derive", - "wasmer-engine", - "wasmer-engine-dylib", - "wasmer-engine-universal", "wasmer-types", "wasmer-vm", "winapi", ] -[[package]] -name = "wasmer-artifact" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aaf9428c29c1d8ad2ac0e45889ba8a568a835e33fd058964e5e500f2f7ce325" -dependencies = [ - "enumset", - "loupe", - "thiserror", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-compiler" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67a6cd866aed456656db2cfea96c18baabbd33f676578482b85c51e1ee19d2c" +checksum = "2e322cdfb8ed189d92cbb5c34acb319c0f04fb9799ed68e127717f255f8b246a" dependencies = [ + "backtrace", + "cfg-if", + "enum-iterator", "enumset", - "loupe", - "rkyv", - "serde", - "serde_bytes", + "lazy_static", + "leb128", + "memmap2", + "more-asserts", + "region", + "rustc-demangle", "smallvec", - "target-lexicon", "thiserror", "wasmer-types", + "wasmer-vm", "wasmparser", + "winapi", ] [[package]] name = "wasmer-compiler-cranelift" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48be2f9f6495f08649e4f8b946a2cbbe119faf5a654aa1457f9504a99d23dae0" +checksum = "c5240177aca0d8322c890d17d4b1b87f23ccb45340f616f384655aaba18f51bd" dependencies = [ "cranelift-codegen", "cranelift-entity", "cranelift-frontend", "gimli 0.26.1", - "loupe", "more-asserts", "rayon", "smallvec", @@ -1678,16 +1767,16 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ca2a35204d8befa85062bc7aac259a8db8070b801b8a783770ba58231d729e" +checksum = "f9f824f2e345c288e4394ee0410478dea799747f9ebb319e1d8ad33e33a03545" dependencies = [ "byteorder", "dynasm", "dynasmrt", + "enumset", "gimli 0.26.1", "lazy_static", - "loupe", "more-asserts", "rayon", "smallvec", @@ -1697,9 +1786,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e50405cc2a2f74ff574584710a5f2c1d5c93744acce2ca0866084739284b51" +checksum = "fb6858f330764b1041e68d3c824970064d2fbd8e27704180289fd248ff892c48" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1707,173 +1796,68 @@ dependencies = [ "syn", ] -[[package]] -name = "wasmer-engine" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f98f010978c244db431b392aeab0661df7ea0822343334f8f2a920763548e45" -dependencies = [ - "backtrace", - "enumset", - "lazy_static", - "loupe", - "memmap2", - "more-asserts", - "rustc-demangle", - "serde", - "serde_bytes", - "target-lexicon", - "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", - "wasmer-vm", -] - -[[package]] -name = "wasmer-engine-dylib" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0358af9c154724587731175553805648d9acb8f6657880d165e378672b7e53" -dependencies = [ - "cfg-if", - "enum-iterator", - "enumset", - "leb128", - "libloading", - "loupe", - "object 0.28.3", - "rkyv", - "serde", - "tempfile", - "tracing", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-engine", - "wasmer-object", - "wasmer-types", - "wasmer-vm", - "which", -] - -[[package]] -name = "wasmer-engine-universal" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "440dc3d93c9ca47865a4f4edd037ea81bf983b5796b59b3d712d844b32dbef15" -dependencies = [ - "cfg-if", - "enumset", - "leb128", - "loupe", - "region", - "rkyv", - "wasmer-compiler", - "wasmer-engine", - "wasmer-engine-universal-artifact", - "wasmer-types", - "wasmer-vm", - "winapi", -] - -[[package]] -name = "wasmer-engine-universal-artifact" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f1db3f54152657eb6e86c44b66525ff7801dad8328fe677da48dd06af9ad41" -dependencies = [ - "enum-iterator", - "enumset", - "loupe", - "rkyv", - "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-middlewares" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7812438ed2f37203a37007cdb5332b8475cb2b16e15d51299b2647894e9ed3a" +checksum = "f3c5919c0fbbdb0ac8f6d432e7baa796ea49b1381d726bc319c0451f26da11fd" dependencies = [ - "loupe", "wasmer", "wasmer-types", "wasmer-vm", ] -[[package]] -name = "wasmer-object" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d831335ff3a44ecf451303f6f891175c642488036b92ceceb24ac8623a8fa8b" -dependencies = [ - "object 0.28.3", - "thiserror", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-types" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39df01ea05dc0a9bab67e054c7cb01521e53b35a7bb90bd02eca564ed0b2667f" +checksum = "d83345e3335fb9b21be6c394bc3d712522447bc8750db8a40ac9170627e3de35" dependencies = [ - "backtrace", + "bytecheck", "enum-iterator", + "enumset", "indexmap", - "loupe", "more-asserts", "rkyv", - "serde", + "target-lexicon", "thiserror", ] [[package]] name = "wasmer-vm" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d965fa61f4dc4cdb35a54daaf7ecec3563fbb94154a6c35433f879466247dd" +checksum = "2ca3cf9a2bb5919ae048231972440767efad7a693afaeb41332ab0796be1c884" dependencies = [ "backtrace", "cc", "cfg-if", "corosensei", + "dashmap", + "derivative", "enum-iterator", + "fnv", "indexmap", "lazy_static", "libc", - "loupe", "mach", - "memoffset", + "memoffset 0.8.0", "more-asserts", "region", - "rkyv", "scopeguard", - "serde", "thiserror", - "wasmer-artifact", "wasmer-types", "winapi", ] [[package]] name = "wasmparser" -version = "0.83.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a" - -[[package]] -name = "which" -version = "4.1.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55551e42cbdf2ce2bedd2203d0cc08dba002c27510f86dab6d0ce304cba3dfe" +checksum = "f2ea896273ea99b15132414be1da01ab0d8836415083298ecaffbe308eaac87a" dependencies = [ - "either", - "libc", + "indexmap", + "url", ] [[package]] @@ -1904,43 +1888,109 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43dbb096663629518eb1dfa72d80243ca5a6aca764cae62a2df70af760a9be75" dependencies = [ - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_msvc", + "windows_aarch64_msvc 0.33.0", + "windows_i686_gnu 0.33.0", + "windows_i686_msvc 0.33.0", + "windows_x86_64_gnu 0.33.0", + "windows_x86_64_msvc 0.33.0", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc 0.42.2", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_i686_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_x86_64_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "zeroize" version = "1.5.7" diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 80f7103e6a..7d66bb0785 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -28,6 +28,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + [[package]] name = "autocfg" version = "1.1.0" @@ -45,7 +51,7 @@ dependencies = [ "cfg-if", "libc", "miniz_oxide", - "object 0.25.3", + "object", "rustc-demangle", ] @@ -99,19 +105,20 @@ checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecheck" -version = "0.6.7" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "314889ea31cda264cb7c3d6e6e5c9415a987ecb0e72c17c00d36fbb881d34abe" +checksum = "13fe11640a23eb24562225322cd3e452b93a3d4091d62fab69c70542fcd17d1f" dependencies = [ "bytecheck_derive", "ptr_meta", + "simdutf8", ] [[package]] name = "bytecheck_derive" -version = "0.6.7" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a2b3b92c135dae665a6f760205b89187638e83bed17ef3e44e83c712cf30600" +checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ "proc-macro2", "quote", @@ -124,6 +131,12 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + [[package]] name = "cc" version = "1.0.69" @@ -158,7 +171,7 @@ dependencies = [ "cfg-if", "libc", "scopeguard", - "windows-sys", + "windows-sys 0.33.0", ] [[package]] @@ -231,6 +244,7 @@ version = "1.2.5" dependencies = [ "bitflags", "bytecheck", + "bytes", "clru", "cosmwasm-crypto", "cosmwasm-std", @@ -269,56 +283,74 @@ dependencies = [ [[package]] name = "cranelift-bforest" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38faa2a16616c8e78a18d37b4726b98bfd2de192f2fdc8a39ddf568a408a0f75" +checksum = "2a2ab4512dfd3a6f4be184403a195f76e81a8a9f9e6c898e19d2dc3ce20e0115" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26f192472a3ba23860afd07d2b0217dc628f21fcc72617aa1336d98e1671f33b" +checksum = "98b022ed2a5913a38839dfbafe6cf135342661293b08049843362df4301261dc" dependencies = [ + "arrayvec", + "bumpalo", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", + "cranelift-egraph", "cranelift-entity", + "cranelift-isle", "gimli 0.26.1", "log", - "regalloc", + "regalloc2", "smallvec", "target-lexicon", ] [[package]] name = "cranelift-codegen-meta" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32ddb89e9b89d3d9b36a5b7d7ea3261c98235a76ac95ba46826b8ec40b1a24" +checksum = "639307b45434ad112a98f8300c0f0ab085cbefcd767efcdef9ef19d4c0756e74" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.82.3" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278e52e29c53fcf32431ef08406c295699a70306d05a0715c5b1bf50e33a9ab7" + +[[package]] +name = "cranelift-egraph" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01fd0d9f288cc1b42d9333b7a776b17e278fc888c28e6a0f09b5573d45a150bc" +checksum = "624b54323b06e675293939311943ba82d323bb340468ce1889be5da7932c8d73" +dependencies = [ + "cranelift-entity", + "fxhash", + "hashbrown", + "indexmap", + "log", + "smallvec", +] [[package]] name = "cranelift-entity" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3bfe172b83167604601faf9dc60453e0d0a93415b57a9c4d1a7ae6849185cf" +checksum = "9a59bcbca89c3f1b70b93ab3cbba5e5e0cbf3e63dadb23c7525cb142e21a9d4c" [[package]] name = "cranelift-frontend" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a006e3e32d80ce0e4ba7f1f9ddf66066d052a8c884a110b91d05404d6ce26dce" +checksum = "0d70abacb8cfef3dc8ff7e8836e9c1d70f7967dfdac824a4cd5e30223415aca6" dependencies = [ "cranelift-codegen", "log", @@ -326,6 +358,12 @@ dependencies = [ "target-lexicon", ] +[[package]] +name = "cranelift-isle" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "393bc73c451830ff8dbb3a07f61843d6cb41a084f9996319917c0b291ed785bb" + [[package]] name = "crc32fast" version = "1.3.2" @@ -365,7 +403,7 @@ dependencies = [ "cfg-if", "crossbeam-utils", "lazy_static", - "memoffset", + "memoffset 0.6.4", "scopeguard", ] @@ -455,6 +493,19 @@ dependencies = [ "syn", ] +[[package]] +name = "dashmap" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" +dependencies = [ + "cfg-if", + "hashbrown", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "der" version = "0.6.0" @@ -644,12 +695,30 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + [[package]] name = "forward_ref" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generic-array" version = "0.14.4" @@ -712,18 +781,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c21d40587b92fa6a6c6e3c1bdbf87d75511db5672f9c93175574b3a00df1758" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ "ahash", ] @@ -770,15 +830,24 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "indexmap" -version = "1.7.0" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown 0.11.2", - "serde", + "hashbrown", ] [[package]] @@ -789,9 +858,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "js-sys" -version = "0.3.55" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" dependencies = [ "wasm-bindgen", ] @@ -827,13 +896,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] -name = "libloading" -version = "0.7.0" +name = "lock_api" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ - "cfg-if", - "winapi", + "autocfg", + "scopeguard", ] [[package]] @@ -851,7 +920,6 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" dependencies = [ - "indexmap", "loupe-derive", "rustversion", ] @@ -899,6 +967,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + [[package]] name = "miniz_oxide" version = "0.4.4" @@ -934,23 +1011,11 @@ dependencies = [ "memchr", ] -[[package]] -name = "object" -version = "0.28.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40bec70ba014595f99f7aa110b84331ffe1ee9aece7fe6f387cc7e3ecda4d456" -dependencies = [ - "crc32fast", - "hashbrown 0.11.2", - "indexmap", - "memchr", -] - [[package]] name = "once_cell" -version = "1.8.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "opaque-debug" @@ -964,6 +1029,25 @@ version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" +[[package]] +name = "parking_lot_core" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys 0.45.0", +] + +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + [[package]] name = "pin-project-lite" version = "0.2.7" @@ -980,12 +1064,6 @@ dependencies = [ "spki", ] -[[package]] -name = "ppv-lite86" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1012,11 +1090,11 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.27" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -1048,28 +1126,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" -dependencies = [ - "libc", - "rand_chacha", - "rand_core 0.6.3", - "rand_hc", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.3", -] - [[package]] name = "rand_core" version = "0.5.1" @@ -1088,15 +1144,6 @@ dependencies = [ "getrandom 0.2.3", ] -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core 0.6.3", -] - [[package]] name = "rayon" version = "1.5.1" @@ -1132,13 +1179,14 @@ dependencies = [ ] [[package]] -name = "regalloc" -version = "0.0.34" +name = "regalloc2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62446b1d3ebf980bdc68837700af1d77b37bc430e524bf95319c6eada2a4cc02" +checksum = "300d4fbfb40c1c66a78ba3ddd41c1110247cf52f97b87d0f2fc9209bd49b030c" dependencies = [ + "fxhash", "log", - "rustc-hash", + "slice-group-by", "smallvec", ] @@ -1154,20 +1202,11 @@ dependencies = [ "winapi", ] -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - [[package]] name = "rend" -version = "0.3.6" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79af64b4b6362ffba04eef3a4e10829718a4896dac19daa741851c86781edf95" +checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" dependencies = [ "bytecheck", ] @@ -1185,12 +1224,13 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.7.36" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5230ae2981a885590b0dc84e0b24c0ed23ad24f7adc0eb824b26cafa961f7c36" +checksum = "21499ed91807f07ae081880aabb2ccc0235e9d88011867d984525e9a4c3cfa3e" dependencies = [ "bytecheck", - "hashbrown 0.12.0", + "hashbrown", + "indexmap", "ptr_meta", "rend", "rkyv_derive", @@ -1199,9 +1239,9 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.7.36" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc752d5925dbcb324522f3a4c93193d17f107b2e11810913aa3ad352fa01480" +checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" dependencies = [ "proc-macro2", "quote", @@ -1214,12 +1254,6 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustversion" version = "1.0.5" @@ -1301,12 +1335,14 @@ dependencies = [ ] [[package]] -name = "serde_bytes" -version = "0.11.5" +name = "serde-wasm-bindgen" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" +checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" dependencies = [ + "js-sys", "serde", + "wasm-bindgen", ] [[package]] @@ -1376,6 +1412,18 @@ dependencies = [ "rand_core 0.6.3", ] +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + +[[package]] +name = "slice-group-by" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" + [[package]] name = "smallvec" version = "1.6.1" @@ -1418,34 +1466,20 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.73" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] name = "target-lexicon" -version = "0.12.2" +version = "0.12.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9bffcddbc2458fa3e6058414599e3c838a022abae82e5c67b4f7f80298d5bff" - -[[package]] -name = "tempfile" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" -dependencies = [ - "cfg-if", - "libc", - "rand", - "redox_syscall", - "remove_dir_all", - "winapi", -] +checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5" [[package]] name = "thiserror" @@ -1467,6 +1501,21 @@ dependencies = [ "syn", ] +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tracing" version = "0.1.26" @@ -1474,7 +1523,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ "cfg-if", - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1519,10 +1567,36 @@ dependencies = [ ] [[package]] -name = "unicode-xid" -version = "0.2.2" +name = "unicode-bidi" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] [[package]] name = "version_check" @@ -1544,9 +1618,9 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm-bindgen" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1554,24 +1628,47 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", "syn", "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-downcast" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" +dependencies = [ + "js-sys", + "once_cell", + "wasm-bindgen", + "wasm-bindgen-downcast-macros", +] + +[[package]] +name = "wasm-bindgen-downcast-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "wasm-bindgen-macro" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1579,9 +1676,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", @@ -1592,79 +1689,71 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea8d8361c9d006ea3d7797de7bd6b1492ffd0f91a22430cfda6c1658ad57bedf" +checksum = "8472807bd8d5062aef0a35681e1b6fbaed8fea88d97910870741100c03b8fef3" dependencies = [ + "bytes", "cfg-if", + "derivative", "indexmap", "js-sys", - "loupe", "more-asserts", + "serde", + "serde-wasm-bindgen", "target-lexicon", "thiserror", "wasm-bindgen", - "wasmer-artifact", + "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", "wasmer-derive", - "wasmer-engine", - "wasmer-engine-dylib", - "wasmer-engine-universal", "wasmer-types", "wasmer-vm", "winapi", ] -[[package]] -name = "wasmer-artifact" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aaf9428c29c1d8ad2ac0e45889ba8a568a835e33fd058964e5e500f2f7ce325" -dependencies = [ - "enumset", - "loupe", - "thiserror", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-compiler" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67a6cd866aed456656db2cfea96c18baabbd33f676578482b85c51e1ee19d2c" +checksum = "2e322cdfb8ed189d92cbb5c34acb319c0f04fb9799ed68e127717f255f8b246a" dependencies = [ + "backtrace", + "cfg-if", + "enum-iterator", "enumset", - "loupe", - "rkyv", - "serde", - "serde_bytes", + "lazy_static", + "leb128", + "memmap2", + "more-asserts", + "region", + "rustc-demangle", "smallvec", - "target-lexicon", "thiserror", "wasmer-types", + "wasmer-vm", "wasmparser", + "winapi", ] [[package]] name = "wasmer-compiler-cranelift" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48be2f9f6495f08649e4f8b946a2cbbe119faf5a654aa1457f9504a99d23dae0" +checksum = "c5240177aca0d8322c890d17d4b1b87f23ccb45340f616f384655aaba18f51bd" dependencies = [ "cranelift-codegen", "cranelift-entity", "cranelift-frontend", "gimli 0.26.1", - "loupe", "more-asserts", "rayon", "smallvec", @@ -1676,16 +1765,16 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ca2a35204d8befa85062bc7aac259a8db8070b801b8a783770ba58231d729e" +checksum = "f9f824f2e345c288e4394ee0410478dea799747f9ebb319e1d8ad33e33a03545" dependencies = [ "byteorder", "dynasm", "dynasmrt", + "enumset", "gimli 0.26.1", "lazy_static", - "loupe", "more-asserts", "rayon", "smallvec", @@ -1695,9 +1784,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e50405cc2a2f74ff574584710a5f2c1d5c93744acce2ca0866084739284b51" +checksum = "fb6858f330764b1041e68d3c824970064d2fbd8e27704180289fd248ff892c48" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1705,173 +1794,68 @@ dependencies = [ "syn", ] -[[package]] -name = "wasmer-engine" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f98f010978c244db431b392aeab0661df7ea0822343334f8f2a920763548e45" -dependencies = [ - "backtrace", - "enumset", - "lazy_static", - "loupe", - "memmap2", - "more-asserts", - "rustc-demangle", - "serde", - "serde_bytes", - "target-lexicon", - "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", - "wasmer-vm", -] - -[[package]] -name = "wasmer-engine-dylib" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0358af9c154724587731175553805648d9acb8f6657880d165e378672b7e53" -dependencies = [ - "cfg-if", - "enum-iterator", - "enumset", - "leb128", - "libloading", - "loupe", - "object 0.28.3", - "rkyv", - "serde", - "tempfile", - "tracing", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-engine", - "wasmer-object", - "wasmer-types", - "wasmer-vm", - "which", -] - -[[package]] -name = "wasmer-engine-universal" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "440dc3d93c9ca47865a4f4edd037ea81bf983b5796b59b3d712d844b32dbef15" -dependencies = [ - "cfg-if", - "enumset", - "leb128", - "loupe", - "region", - "rkyv", - "wasmer-compiler", - "wasmer-engine", - "wasmer-engine-universal-artifact", - "wasmer-types", - "wasmer-vm", - "winapi", -] - -[[package]] -name = "wasmer-engine-universal-artifact" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f1db3f54152657eb6e86c44b66525ff7801dad8328fe677da48dd06af9ad41" -dependencies = [ - "enum-iterator", - "enumset", - "loupe", - "rkyv", - "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-middlewares" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7812438ed2f37203a37007cdb5332b8475cb2b16e15d51299b2647894e9ed3a" +checksum = "f3c5919c0fbbdb0ac8f6d432e7baa796ea49b1381d726bc319c0451f26da11fd" dependencies = [ - "loupe", "wasmer", "wasmer-types", "wasmer-vm", ] -[[package]] -name = "wasmer-object" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d831335ff3a44ecf451303f6f891175c642488036b92ceceb24ac8623a8fa8b" -dependencies = [ - "object 0.28.3", - "thiserror", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-types" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39df01ea05dc0a9bab67e054c7cb01521e53b35a7bb90bd02eca564ed0b2667f" +checksum = "d83345e3335fb9b21be6c394bc3d712522447bc8750db8a40ac9170627e3de35" dependencies = [ - "backtrace", + "bytecheck", "enum-iterator", + "enumset", "indexmap", - "loupe", "more-asserts", "rkyv", - "serde", + "target-lexicon", "thiserror", ] [[package]] name = "wasmer-vm" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d965fa61f4dc4cdb35a54daaf7ecec3563fbb94154a6c35433f879466247dd" +checksum = "2ca3cf9a2bb5919ae048231972440767efad7a693afaeb41332ab0796be1c884" dependencies = [ "backtrace", "cc", "cfg-if", "corosensei", + "dashmap", + "derivative", "enum-iterator", + "fnv", "indexmap", "lazy_static", "libc", - "loupe", "mach", - "memoffset", + "memoffset 0.8.0", "more-asserts", "region", - "rkyv", "scopeguard", - "serde", "thiserror", - "wasmer-artifact", "wasmer-types", "winapi", ] [[package]] name = "wasmparser" -version = "0.83.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a" - -[[package]] -name = "which" -version = "4.1.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55551e42cbdf2ce2bedd2203d0cc08dba002c27510f86dab6d0ce304cba3dfe" +checksum = "f2ea896273ea99b15132414be1da01ab0d8836415083298ecaffbe308eaac87a" dependencies = [ - "either", - "libc", + "indexmap", + "url", ] [[package]] @@ -1902,43 +1886,109 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43dbb096663629518eb1dfa72d80243ca5a6aca764cae62a2df70af760a9be75" dependencies = [ - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_msvc", + "windows_aarch64_msvc 0.33.0", + "windows_i686_gnu 0.33.0", + "windows_i686_msvc 0.33.0", + "windows_x86_64_gnu 0.33.0", + "windows_x86_64_msvc 0.33.0", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc 0.42.2", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_i686_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_x86_64_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "zeroize" version = "1.5.7" diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index cdd2e868d0..6371d9fd96 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -28,6 +28,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + [[package]] name = "autocfg" version = "1.1.0" @@ -45,7 +51,7 @@ dependencies = [ "cfg-if", "libc", "miniz_oxide", - "object 0.25.3", + "object", "rustc-demangle", ] @@ -99,19 +105,20 @@ checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecheck" -version = "0.6.7" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "314889ea31cda264cb7c3d6e6e5c9415a987ecb0e72c17c00d36fbb881d34abe" +checksum = "13fe11640a23eb24562225322cd3e452b93a3d4091d62fab69c70542fcd17d1f" dependencies = [ "bytecheck_derive", "ptr_meta", + "simdutf8", ] [[package]] name = "bytecheck_derive" -version = "0.6.7" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a2b3b92c135dae665a6f760205b89187638e83bed17ef3e44e83c712cf30600" +checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ "proc-macro2", "quote", @@ -124,6 +131,12 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + [[package]] name = "cc" version = "1.0.69" @@ -158,7 +171,7 @@ dependencies = [ "cfg-if", "libc", "scopeguard", - "windows-sys", + "windows-sys 0.33.0", ] [[package]] @@ -231,6 +244,7 @@ version = "1.2.5" dependencies = [ "bitflags", "bytecheck", + "bytes", "clru", "cosmwasm-crypto", "cosmwasm-std", @@ -269,56 +283,74 @@ dependencies = [ [[package]] name = "cranelift-bforest" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38faa2a16616c8e78a18d37b4726b98bfd2de192f2fdc8a39ddf568a408a0f75" +checksum = "2a2ab4512dfd3a6f4be184403a195f76e81a8a9f9e6c898e19d2dc3ce20e0115" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26f192472a3ba23860afd07d2b0217dc628f21fcc72617aa1336d98e1671f33b" +checksum = "98b022ed2a5913a38839dfbafe6cf135342661293b08049843362df4301261dc" dependencies = [ + "arrayvec", + "bumpalo", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", + "cranelift-egraph", "cranelift-entity", + "cranelift-isle", "gimli 0.26.1", "log", - "regalloc", + "regalloc2", "smallvec", "target-lexicon", ] [[package]] name = "cranelift-codegen-meta" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32ddb89e9b89d3d9b36a5b7d7ea3261c98235a76ac95ba46826b8ec40b1a24" +checksum = "639307b45434ad112a98f8300c0f0ab085cbefcd767efcdef9ef19d4c0756e74" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.82.3" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278e52e29c53fcf32431ef08406c295699a70306d05a0715c5b1bf50e33a9ab7" + +[[package]] +name = "cranelift-egraph" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01fd0d9f288cc1b42d9333b7a776b17e278fc888c28e6a0f09b5573d45a150bc" +checksum = "624b54323b06e675293939311943ba82d323bb340468ce1889be5da7932c8d73" +dependencies = [ + "cranelift-entity", + "fxhash", + "hashbrown", + "indexmap", + "log", + "smallvec", +] [[package]] name = "cranelift-entity" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3bfe172b83167604601faf9dc60453e0d0a93415b57a9c4d1a7ae6849185cf" +checksum = "9a59bcbca89c3f1b70b93ab3cbba5e5e0cbf3e63dadb23c7525cb142e21a9d4c" [[package]] name = "cranelift-frontend" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a006e3e32d80ce0e4ba7f1f9ddf66066d052a8c884a110b91d05404d6ce26dce" +checksum = "0d70abacb8cfef3dc8ff7e8836e9c1d70f7967dfdac824a4cd5e30223415aca6" dependencies = [ "cranelift-codegen", "log", @@ -326,6 +358,12 @@ dependencies = [ "target-lexicon", ] +[[package]] +name = "cranelift-isle" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "393bc73c451830ff8dbb3a07f61843d6cb41a084f9996319917c0b291ed785bb" + [[package]] name = "crc32fast" version = "1.3.2" @@ -365,7 +403,7 @@ dependencies = [ "cfg-if", "crossbeam-utils", "lazy_static", - "memoffset", + "memoffset 0.6.4", "scopeguard", ] @@ -455,6 +493,19 @@ dependencies = [ "syn", ] +[[package]] +name = "dashmap" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" +dependencies = [ + "cfg-if", + "hashbrown", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "der" version = "0.6.0" @@ -644,12 +695,30 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + [[package]] name = "forward_ref" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generic-array" version = "0.14.4" @@ -712,18 +781,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c21d40587b92fa6a6c6e3c1bdbf87d75511db5672f9c93175574b3a00df1758" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ "ahash", ] @@ -770,15 +830,24 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "indexmap" -version = "1.7.0" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown 0.11.2", - "serde", + "hashbrown", ] [[package]] @@ -789,9 +858,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "js-sys" -version = "0.3.55" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" dependencies = [ "wasm-bindgen", ] @@ -827,13 +896,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] -name = "libloading" -version = "0.7.0" +name = "lock_api" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ - "cfg-if", - "winapi", + "autocfg", + "scopeguard", ] [[package]] @@ -851,7 +920,6 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" dependencies = [ - "indexmap", "loupe-derive", "rustversion", ] @@ -899,6 +967,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + [[package]] name = "miniz_oxide" version = "0.4.4" @@ -934,23 +1011,11 @@ dependencies = [ "memchr", ] -[[package]] -name = "object" -version = "0.28.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40bec70ba014595f99f7aa110b84331ffe1ee9aece7fe6f387cc7e3ecda4d456" -dependencies = [ - "crc32fast", - "hashbrown 0.11.2", - "indexmap", - "memchr", -] - [[package]] name = "once_cell" -version = "1.8.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "opaque-debug" @@ -964,6 +1029,25 @@ version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" +[[package]] +name = "parking_lot_core" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys 0.45.0", +] + +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + [[package]] name = "pin-project-lite" version = "0.2.7" @@ -980,12 +1064,6 @@ dependencies = [ "spki", ] -[[package]] -name = "ppv-lite86" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1012,11 +1090,11 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.27" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -1048,28 +1126,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" -dependencies = [ - "libc", - "rand_chacha", - "rand_core 0.6.3", - "rand_hc", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.3", -] - [[package]] name = "rand_core" version = "0.5.1" @@ -1088,15 +1144,6 @@ dependencies = [ "getrandom 0.2.3", ] -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core 0.6.3", -] - [[package]] name = "rayon" version = "1.5.1" @@ -1132,13 +1179,14 @@ dependencies = [ ] [[package]] -name = "regalloc" -version = "0.0.34" +name = "regalloc2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62446b1d3ebf980bdc68837700af1d77b37bc430e524bf95319c6eada2a4cc02" +checksum = "300d4fbfb40c1c66a78ba3ddd41c1110247cf52f97b87d0f2fc9209bd49b030c" dependencies = [ + "fxhash", "log", - "rustc-hash", + "slice-group-by", "smallvec", ] @@ -1154,20 +1202,11 @@ dependencies = [ "winapi", ] -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - [[package]] name = "rend" -version = "0.3.6" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79af64b4b6362ffba04eef3a4e10829718a4896dac19daa741851c86781edf95" +checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" dependencies = [ "bytecheck", ] @@ -1185,12 +1224,13 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.7.36" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5230ae2981a885590b0dc84e0b24c0ed23ad24f7adc0eb824b26cafa961f7c36" +checksum = "21499ed91807f07ae081880aabb2ccc0235e9d88011867d984525e9a4c3cfa3e" dependencies = [ "bytecheck", - "hashbrown 0.12.0", + "hashbrown", + "indexmap", "ptr_meta", "rend", "rkyv_derive", @@ -1199,9 +1239,9 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.7.36" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc752d5925dbcb324522f3a4c93193d17f107b2e11810913aa3ad352fa01480" +checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" dependencies = [ "proc-macro2", "quote", @@ -1214,12 +1254,6 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustversion" version = "1.0.5" @@ -1301,12 +1335,14 @@ dependencies = [ ] [[package]] -name = "serde_bytes" -version = "0.11.5" +name = "serde-wasm-bindgen" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" +checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" dependencies = [ + "js-sys", "serde", + "wasm-bindgen", ] [[package]] @@ -1376,6 +1412,18 @@ dependencies = [ "rand_core 0.6.3", ] +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + +[[package]] +name = "slice-group-by" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" + [[package]] name = "smallvec" version = "1.6.1" @@ -1418,34 +1466,20 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.73" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] name = "target-lexicon" -version = "0.12.2" +version = "0.12.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9bffcddbc2458fa3e6058414599e3c838a022abae82e5c67b4f7f80298d5bff" - -[[package]] -name = "tempfile" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" -dependencies = [ - "cfg-if", - "libc", - "rand", - "redox_syscall", - "remove_dir_all", - "winapi", -] +checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5" [[package]] name = "thiserror" @@ -1467,6 +1501,21 @@ dependencies = [ "syn", ] +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tracing" version = "0.1.26" @@ -1474,7 +1523,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ "cfg-if", - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1519,10 +1567,36 @@ dependencies = [ ] [[package]] -name = "unicode-xid" -version = "0.2.2" +name = "unicode-bidi" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] [[package]] name = "version_check" @@ -1544,9 +1618,9 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm-bindgen" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1554,24 +1628,47 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", "syn", "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-downcast" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" +dependencies = [ + "js-sys", + "once_cell", + "wasm-bindgen", + "wasm-bindgen-downcast-macros", +] + +[[package]] +name = "wasm-bindgen-downcast-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "wasm-bindgen-macro" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1579,9 +1676,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", @@ -1592,79 +1689,71 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea8d8361c9d006ea3d7797de7bd6b1492ffd0f91a22430cfda6c1658ad57bedf" +checksum = "8472807bd8d5062aef0a35681e1b6fbaed8fea88d97910870741100c03b8fef3" dependencies = [ + "bytes", "cfg-if", + "derivative", "indexmap", "js-sys", - "loupe", "more-asserts", + "serde", + "serde-wasm-bindgen", "target-lexicon", "thiserror", "wasm-bindgen", - "wasmer-artifact", + "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", "wasmer-derive", - "wasmer-engine", - "wasmer-engine-dylib", - "wasmer-engine-universal", "wasmer-types", "wasmer-vm", "winapi", ] -[[package]] -name = "wasmer-artifact" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aaf9428c29c1d8ad2ac0e45889ba8a568a835e33fd058964e5e500f2f7ce325" -dependencies = [ - "enumset", - "loupe", - "thiserror", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-compiler" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67a6cd866aed456656db2cfea96c18baabbd33f676578482b85c51e1ee19d2c" +checksum = "2e322cdfb8ed189d92cbb5c34acb319c0f04fb9799ed68e127717f255f8b246a" dependencies = [ + "backtrace", + "cfg-if", + "enum-iterator", "enumset", - "loupe", - "rkyv", - "serde", - "serde_bytes", + "lazy_static", + "leb128", + "memmap2", + "more-asserts", + "region", + "rustc-demangle", "smallvec", - "target-lexicon", "thiserror", "wasmer-types", + "wasmer-vm", "wasmparser", + "winapi", ] [[package]] name = "wasmer-compiler-cranelift" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48be2f9f6495f08649e4f8b946a2cbbe119faf5a654aa1457f9504a99d23dae0" +checksum = "c5240177aca0d8322c890d17d4b1b87f23ccb45340f616f384655aaba18f51bd" dependencies = [ "cranelift-codegen", "cranelift-entity", "cranelift-frontend", "gimli 0.26.1", - "loupe", "more-asserts", "rayon", "smallvec", @@ -1676,16 +1765,16 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ca2a35204d8befa85062bc7aac259a8db8070b801b8a783770ba58231d729e" +checksum = "f9f824f2e345c288e4394ee0410478dea799747f9ebb319e1d8ad33e33a03545" dependencies = [ "byteorder", "dynasm", "dynasmrt", + "enumset", "gimli 0.26.1", "lazy_static", - "loupe", "more-asserts", "rayon", "smallvec", @@ -1695,9 +1784,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e50405cc2a2f74ff574584710a5f2c1d5c93744acce2ca0866084739284b51" +checksum = "fb6858f330764b1041e68d3c824970064d2fbd8e27704180289fd248ff892c48" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1705,173 +1794,68 @@ dependencies = [ "syn", ] -[[package]] -name = "wasmer-engine" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f98f010978c244db431b392aeab0661df7ea0822343334f8f2a920763548e45" -dependencies = [ - "backtrace", - "enumset", - "lazy_static", - "loupe", - "memmap2", - "more-asserts", - "rustc-demangle", - "serde", - "serde_bytes", - "target-lexicon", - "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", - "wasmer-vm", -] - -[[package]] -name = "wasmer-engine-dylib" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0358af9c154724587731175553805648d9acb8f6657880d165e378672b7e53" -dependencies = [ - "cfg-if", - "enum-iterator", - "enumset", - "leb128", - "libloading", - "loupe", - "object 0.28.3", - "rkyv", - "serde", - "tempfile", - "tracing", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-engine", - "wasmer-object", - "wasmer-types", - "wasmer-vm", - "which", -] - -[[package]] -name = "wasmer-engine-universal" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "440dc3d93c9ca47865a4f4edd037ea81bf983b5796b59b3d712d844b32dbef15" -dependencies = [ - "cfg-if", - "enumset", - "leb128", - "loupe", - "region", - "rkyv", - "wasmer-compiler", - "wasmer-engine", - "wasmer-engine-universal-artifact", - "wasmer-types", - "wasmer-vm", - "winapi", -] - -[[package]] -name = "wasmer-engine-universal-artifact" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f1db3f54152657eb6e86c44b66525ff7801dad8328fe677da48dd06af9ad41" -dependencies = [ - "enum-iterator", - "enumset", - "loupe", - "rkyv", - "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-middlewares" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7812438ed2f37203a37007cdb5332b8475cb2b16e15d51299b2647894e9ed3a" +checksum = "f3c5919c0fbbdb0ac8f6d432e7baa796ea49b1381d726bc319c0451f26da11fd" dependencies = [ - "loupe", "wasmer", "wasmer-types", "wasmer-vm", ] -[[package]] -name = "wasmer-object" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d831335ff3a44ecf451303f6f891175c642488036b92ceceb24ac8623a8fa8b" -dependencies = [ - "object 0.28.3", - "thiserror", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-types" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39df01ea05dc0a9bab67e054c7cb01521e53b35a7bb90bd02eca564ed0b2667f" +checksum = "d83345e3335fb9b21be6c394bc3d712522447bc8750db8a40ac9170627e3de35" dependencies = [ - "backtrace", + "bytecheck", "enum-iterator", + "enumset", "indexmap", - "loupe", "more-asserts", "rkyv", - "serde", + "target-lexicon", "thiserror", ] [[package]] name = "wasmer-vm" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d965fa61f4dc4cdb35a54daaf7ecec3563fbb94154a6c35433f879466247dd" +checksum = "2ca3cf9a2bb5919ae048231972440767efad7a693afaeb41332ab0796be1c884" dependencies = [ "backtrace", "cc", "cfg-if", "corosensei", + "dashmap", + "derivative", "enum-iterator", + "fnv", "indexmap", "lazy_static", "libc", - "loupe", "mach", - "memoffset", + "memoffset 0.8.0", "more-asserts", "region", - "rkyv", "scopeguard", - "serde", "thiserror", - "wasmer-artifact", "wasmer-types", "winapi", ] [[package]] name = "wasmparser" -version = "0.83.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a" - -[[package]] -name = "which" -version = "4.1.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55551e42cbdf2ce2bedd2203d0cc08dba002c27510f86dab6d0ce304cba3dfe" +checksum = "f2ea896273ea99b15132414be1da01ab0d8836415083298ecaffbe308eaac87a" dependencies = [ - "either", - "libc", + "indexmap", + "url", ] [[package]] @@ -1902,43 +1886,109 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43dbb096663629518eb1dfa72d80243ca5a6aca764cae62a2df70af760a9be75" dependencies = [ - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_msvc", + "windows_aarch64_msvc 0.33.0", + "windows_i686_gnu 0.33.0", + "windows_i686_msvc 0.33.0", + "windows_x86_64_gnu 0.33.0", + "windows_x86_64_msvc 0.33.0", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc 0.42.2", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_i686_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_x86_64_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "zeroize" version = "1.5.7" diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 59d7f2939d..a34cbc9b97 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -28,6 +28,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + [[package]] name = "autocfg" version = "1.1.0" @@ -45,7 +51,7 @@ dependencies = [ "cfg-if", "libc", "miniz_oxide", - "object 0.25.3", + "object", "rustc-demangle", ] @@ -99,19 +105,20 @@ checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecheck" -version = "0.6.7" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "314889ea31cda264cb7c3d6e6e5c9415a987ecb0e72c17c00d36fbb881d34abe" +checksum = "13fe11640a23eb24562225322cd3e452b93a3d4091d62fab69c70542fcd17d1f" dependencies = [ "bytecheck_derive", "ptr_meta", + "simdutf8", ] [[package]] name = "bytecheck_derive" -version = "0.6.7" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a2b3b92c135dae665a6f760205b89187638e83bed17ef3e44e83c712cf30600" +checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ "proc-macro2", "quote", @@ -124,6 +131,12 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + [[package]] name = "cc" version = "1.0.69" @@ -158,7 +171,7 @@ dependencies = [ "cfg-if", "libc", "scopeguard", - "windows-sys", + "windows-sys 0.33.0", ] [[package]] @@ -223,6 +236,7 @@ version = "1.2.5" dependencies = [ "bitflags", "bytecheck", + "bytes", "clru", "cosmwasm-crypto", "cosmwasm-std", @@ -261,56 +275,74 @@ dependencies = [ [[package]] name = "cranelift-bforest" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38faa2a16616c8e78a18d37b4726b98bfd2de192f2fdc8a39ddf568a408a0f75" +checksum = "2a2ab4512dfd3a6f4be184403a195f76e81a8a9f9e6c898e19d2dc3ce20e0115" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26f192472a3ba23860afd07d2b0217dc628f21fcc72617aa1336d98e1671f33b" +checksum = "98b022ed2a5913a38839dfbafe6cf135342661293b08049843362df4301261dc" dependencies = [ + "arrayvec", + "bumpalo", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", + "cranelift-egraph", "cranelift-entity", + "cranelift-isle", "gimli 0.26.1", "log", - "regalloc", + "regalloc2", "smallvec", "target-lexicon", ] [[package]] name = "cranelift-codegen-meta" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32ddb89e9b89d3d9b36a5b7d7ea3261c98235a76ac95ba46826b8ec40b1a24" +checksum = "639307b45434ad112a98f8300c0f0ab085cbefcd767efcdef9ef19d4c0756e74" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.82.3" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278e52e29c53fcf32431ef08406c295699a70306d05a0715c5b1bf50e33a9ab7" + +[[package]] +name = "cranelift-egraph" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01fd0d9f288cc1b42d9333b7a776b17e278fc888c28e6a0f09b5573d45a150bc" +checksum = "624b54323b06e675293939311943ba82d323bb340468ce1889be5da7932c8d73" +dependencies = [ + "cranelift-entity", + "fxhash", + "hashbrown", + "indexmap", + "log", + "smallvec", +] [[package]] name = "cranelift-entity" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3bfe172b83167604601faf9dc60453e0d0a93415b57a9c4d1a7ae6849185cf" +checksum = "9a59bcbca89c3f1b70b93ab3cbba5e5e0cbf3e63dadb23c7525cb142e21a9d4c" [[package]] name = "cranelift-frontend" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a006e3e32d80ce0e4ba7f1f9ddf66066d052a8c884a110b91d05404d6ce26dce" +checksum = "0d70abacb8cfef3dc8ff7e8836e9c1d70f7967dfdac824a4cd5e30223415aca6" dependencies = [ "cranelift-codegen", "log", @@ -318,6 +350,12 @@ dependencies = [ "target-lexicon", ] +[[package]] +name = "cranelift-isle" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "393bc73c451830ff8dbb3a07f61843d6cb41a084f9996319917c0b291ed785bb" + [[package]] name = "crc32fast" version = "1.3.2" @@ -357,7 +395,7 @@ dependencies = [ "cfg-if", "crossbeam-utils", "lazy_static", - "memoffset", + "memoffset 0.6.4", "scopeguard", ] @@ -447,6 +485,19 @@ dependencies = [ "syn", ] +[[package]] +name = "dashmap" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" +dependencies = [ + "cfg-if", + "hashbrown", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "der" version = "0.6.0" @@ -636,12 +687,30 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + [[package]] name = "forward_ref" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generic-array" version = "0.14.4" @@ -704,18 +773,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c21d40587b92fa6a6c6e3c1bdbf87d75511db5672f9c93175574b3a00df1758" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ "ahash", ] @@ -750,15 +810,24 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "indexmap" -version = "1.7.0" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown 0.11.2", - "serde", + "hashbrown", ] [[package]] @@ -769,9 +838,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "js-sys" -version = "0.3.55" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" dependencies = [ "wasm-bindgen", ] @@ -807,13 +876,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] -name = "libloading" -version = "0.7.0" +name = "lock_api" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ - "cfg-if", - "winapi", + "autocfg", + "scopeguard", ] [[package]] @@ -831,7 +900,6 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" dependencies = [ - "indexmap", "loupe-derive", "rustversion", ] @@ -879,6 +947,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + [[package]] name = "miniz_oxide" version = "0.4.4" @@ -914,23 +991,11 @@ dependencies = [ "memchr", ] -[[package]] -name = "object" -version = "0.28.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40bec70ba014595f99f7aa110b84331ffe1ee9aece7fe6f387cc7e3ecda4d456" -dependencies = [ - "crc32fast", - "hashbrown 0.11.2", - "indexmap", - "memchr", -] - [[package]] name = "once_cell" -version = "1.8.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "opaque-debug" @@ -944,6 +1009,25 @@ version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" +[[package]] +name = "parking_lot_core" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys 0.45.0", +] + +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + [[package]] name = "pin-project-lite" version = "0.2.7" @@ -960,12 +1044,6 @@ dependencies = [ "spki", ] -[[package]] -name = "ppv-lite86" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -992,11 +1070,11 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.27" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -1039,28 +1117,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" -dependencies = [ - "libc", - "rand_chacha", - "rand_core 0.6.3", - "rand_hc", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.3", -] - [[package]] name = "rand_core" version = "0.5.1" @@ -1079,15 +1135,6 @@ dependencies = [ "getrandom 0.2.3", ] -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core 0.6.3", -] - [[package]] name = "rayon" version = "1.5.1" @@ -1123,13 +1170,14 @@ dependencies = [ ] [[package]] -name = "regalloc" -version = "0.0.34" +name = "regalloc2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62446b1d3ebf980bdc68837700af1d77b37bc430e524bf95319c6eada2a4cc02" +checksum = "300d4fbfb40c1c66a78ba3ddd41c1110247cf52f97b87d0f2fc9209bd49b030c" dependencies = [ + "fxhash", "log", - "rustc-hash", + "slice-group-by", "smallvec", ] @@ -1145,20 +1193,11 @@ dependencies = [ "winapi", ] -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - [[package]] name = "rend" -version = "0.3.6" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79af64b4b6362ffba04eef3a4e10829718a4896dac19daa741851c86781edf95" +checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" dependencies = [ "bytecheck", ] @@ -1176,12 +1215,13 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.7.36" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5230ae2981a885590b0dc84e0b24c0ed23ad24f7adc0eb824b26cafa961f7c36" +checksum = "21499ed91807f07ae081880aabb2ccc0235e9d88011867d984525e9a4c3cfa3e" dependencies = [ "bytecheck", - "hashbrown 0.12.0", + "hashbrown", + "indexmap", "ptr_meta", "rend", "rkyv_derive", @@ -1190,9 +1230,9 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.7.36" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc752d5925dbcb324522f3a4c93193d17f107b2e11810913aa3ad352fa01480" +checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" dependencies = [ "proc-macro2", "quote", @@ -1205,12 +1245,6 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustversion" version = "1.0.5" @@ -1292,12 +1326,14 @@ dependencies = [ ] [[package]] -name = "serde_bytes" -version = "0.11.5" +name = "serde-wasm-bindgen" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" +checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" dependencies = [ + "js-sys", "serde", + "wasm-bindgen", ] [[package]] @@ -1367,6 +1403,18 @@ dependencies = [ "rand_core 0.6.3", ] +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + +[[package]] +name = "slice-group-by" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" + [[package]] name = "smallvec" version = "1.6.1" @@ -1409,34 +1457,20 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.73" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] name = "target-lexicon" -version = "0.12.2" +version = "0.12.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9bffcddbc2458fa3e6058414599e3c838a022abae82e5c67b4f7f80298d5bff" - -[[package]] -name = "tempfile" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" -dependencies = [ - "cfg-if", - "libc", - "rand", - "redox_syscall", - "remove_dir_all", - "winapi", -] +checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5" [[package]] name = "thiserror" @@ -1458,6 +1492,21 @@ dependencies = [ "syn", ] +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tracing" version = "0.1.26" @@ -1465,7 +1514,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ "cfg-if", - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1510,10 +1558,36 @@ dependencies = [ ] [[package]] -name = "unicode-xid" -version = "0.2.2" +name = "unicode-bidi" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] [[package]] name = "version_check" @@ -1535,9 +1609,9 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm-bindgen" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1545,24 +1619,47 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", "syn", "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-downcast" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" +dependencies = [ + "js-sys", + "once_cell", + "wasm-bindgen", + "wasm-bindgen-downcast-macros", +] + +[[package]] +name = "wasm-bindgen-downcast-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "wasm-bindgen-macro" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1570,9 +1667,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", @@ -1583,79 +1680,71 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea8d8361c9d006ea3d7797de7bd6b1492ffd0f91a22430cfda6c1658ad57bedf" +checksum = "8472807bd8d5062aef0a35681e1b6fbaed8fea88d97910870741100c03b8fef3" dependencies = [ + "bytes", "cfg-if", + "derivative", "indexmap", "js-sys", - "loupe", "more-asserts", + "serde", + "serde-wasm-bindgen", "target-lexicon", "thiserror", "wasm-bindgen", - "wasmer-artifact", + "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", "wasmer-derive", - "wasmer-engine", - "wasmer-engine-dylib", - "wasmer-engine-universal", "wasmer-types", "wasmer-vm", "winapi", ] -[[package]] -name = "wasmer-artifact" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aaf9428c29c1d8ad2ac0e45889ba8a568a835e33fd058964e5e500f2f7ce325" -dependencies = [ - "enumset", - "loupe", - "thiserror", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-compiler" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67a6cd866aed456656db2cfea96c18baabbd33f676578482b85c51e1ee19d2c" +checksum = "2e322cdfb8ed189d92cbb5c34acb319c0f04fb9799ed68e127717f255f8b246a" dependencies = [ + "backtrace", + "cfg-if", + "enum-iterator", "enumset", - "loupe", - "rkyv", - "serde", - "serde_bytes", + "lazy_static", + "leb128", + "memmap2", + "more-asserts", + "region", + "rustc-demangle", "smallvec", - "target-lexicon", "thiserror", "wasmer-types", + "wasmer-vm", "wasmparser", + "winapi", ] [[package]] name = "wasmer-compiler-cranelift" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48be2f9f6495f08649e4f8b946a2cbbe119faf5a654aa1457f9504a99d23dae0" +checksum = "c5240177aca0d8322c890d17d4b1b87f23ccb45340f616f384655aaba18f51bd" dependencies = [ "cranelift-codegen", "cranelift-entity", "cranelift-frontend", "gimli 0.26.1", - "loupe", "more-asserts", "rayon", "smallvec", @@ -1667,16 +1756,16 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ca2a35204d8befa85062bc7aac259a8db8070b801b8a783770ba58231d729e" +checksum = "f9f824f2e345c288e4394ee0410478dea799747f9ebb319e1d8ad33e33a03545" dependencies = [ "byteorder", "dynasm", "dynasmrt", + "enumset", "gimli 0.26.1", "lazy_static", - "loupe", "more-asserts", "rayon", "smallvec", @@ -1686,9 +1775,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e50405cc2a2f74ff574584710a5f2c1d5c93744acce2ca0866084739284b51" +checksum = "fb6858f330764b1041e68d3c824970064d2fbd8e27704180289fd248ff892c48" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1696,173 +1785,68 @@ dependencies = [ "syn", ] -[[package]] -name = "wasmer-engine" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f98f010978c244db431b392aeab0661df7ea0822343334f8f2a920763548e45" -dependencies = [ - "backtrace", - "enumset", - "lazy_static", - "loupe", - "memmap2", - "more-asserts", - "rustc-demangle", - "serde", - "serde_bytes", - "target-lexicon", - "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", - "wasmer-vm", -] - -[[package]] -name = "wasmer-engine-dylib" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0358af9c154724587731175553805648d9acb8f6657880d165e378672b7e53" -dependencies = [ - "cfg-if", - "enum-iterator", - "enumset", - "leb128", - "libloading", - "loupe", - "object 0.28.3", - "rkyv", - "serde", - "tempfile", - "tracing", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-engine", - "wasmer-object", - "wasmer-types", - "wasmer-vm", - "which", -] - -[[package]] -name = "wasmer-engine-universal" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "440dc3d93c9ca47865a4f4edd037ea81bf983b5796b59b3d712d844b32dbef15" -dependencies = [ - "cfg-if", - "enumset", - "leb128", - "loupe", - "region", - "rkyv", - "wasmer-compiler", - "wasmer-engine", - "wasmer-engine-universal-artifact", - "wasmer-types", - "wasmer-vm", - "winapi", -] - -[[package]] -name = "wasmer-engine-universal-artifact" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f1db3f54152657eb6e86c44b66525ff7801dad8328fe677da48dd06af9ad41" -dependencies = [ - "enum-iterator", - "enumset", - "loupe", - "rkyv", - "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-middlewares" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7812438ed2f37203a37007cdb5332b8475cb2b16e15d51299b2647894e9ed3a" +checksum = "f3c5919c0fbbdb0ac8f6d432e7baa796ea49b1381d726bc319c0451f26da11fd" dependencies = [ - "loupe", "wasmer", "wasmer-types", "wasmer-vm", ] -[[package]] -name = "wasmer-object" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d831335ff3a44ecf451303f6f891175c642488036b92ceceb24ac8623a8fa8b" -dependencies = [ - "object 0.28.3", - "thiserror", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-types" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39df01ea05dc0a9bab67e054c7cb01521e53b35a7bb90bd02eca564ed0b2667f" +checksum = "d83345e3335fb9b21be6c394bc3d712522447bc8750db8a40ac9170627e3de35" dependencies = [ - "backtrace", + "bytecheck", "enum-iterator", + "enumset", "indexmap", - "loupe", "more-asserts", "rkyv", - "serde", + "target-lexicon", "thiserror", ] [[package]] name = "wasmer-vm" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d965fa61f4dc4cdb35a54daaf7ecec3563fbb94154a6c35433f879466247dd" +checksum = "2ca3cf9a2bb5919ae048231972440767efad7a693afaeb41332ab0796be1c884" dependencies = [ "backtrace", "cc", "cfg-if", "corosensei", + "dashmap", + "derivative", "enum-iterator", + "fnv", "indexmap", "lazy_static", "libc", - "loupe", "mach", - "memoffset", + "memoffset 0.8.0", "more-asserts", "region", - "rkyv", "scopeguard", - "serde", "thiserror", - "wasmer-artifact", "wasmer-types", "winapi", ] [[package]] name = "wasmparser" -version = "0.83.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a" - -[[package]] -name = "which" -version = "4.1.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55551e42cbdf2ce2bedd2203d0cc08dba002c27510f86dab6d0ce304cba3dfe" +checksum = "f2ea896273ea99b15132414be1da01ab0d8836415083298ecaffbe308eaac87a" dependencies = [ - "either", - "libc", + "indexmap", + "url", ] [[package]] @@ -1893,43 +1877,109 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43dbb096663629518eb1dfa72d80243ca5a6aca764cae62a2df70af760a9be75" dependencies = [ - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_msvc", + "windows_aarch64_msvc 0.33.0", + "windows_i686_gnu 0.33.0", + "windows_i686_msvc 0.33.0", + "windows_x86_64_gnu 0.33.0", + "windows_x86_64_msvc 0.33.0", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc 0.42.2", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_i686_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_x86_64_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "zeroize" version = "1.5.7" diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 6a84dfb35d..b1382cc71e 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -28,6 +28,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + [[package]] name = "autocfg" version = "1.1.0" @@ -45,7 +51,7 @@ dependencies = [ "cfg-if", "libc", "miniz_oxide", - "object 0.25.3", + "object", "rustc-demangle", ] @@ -99,19 +105,20 @@ checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecheck" -version = "0.6.7" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "314889ea31cda264cb7c3d6e6e5c9415a987ecb0e72c17c00d36fbb881d34abe" +checksum = "13fe11640a23eb24562225322cd3e452b93a3d4091d62fab69c70542fcd17d1f" dependencies = [ "bytecheck_derive", "ptr_meta", + "simdutf8", ] [[package]] name = "bytecheck_derive" -version = "0.6.7" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a2b3b92c135dae665a6f760205b89187638e83bed17ef3e44e83c712cf30600" +checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ "proc-macro2", "quote", @@ -124,6 +131,12 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + [[package]] name = "cc" version = "1.0.69" @@ -158,7 +171,7 @@ dependencies = [ "cfg-if", "libc", "scopeguard", - "windows-sys", + "windows-sys 0.33.0", ] [[package]] @@ -231,6 +244,7 @@ version = "1.2.5" dependencies = [ "bitflags", "bytecheck", + "bytes", "clru", "cosmwasm-crypto", "cosmwasm-std", @@ -269,56 +283,74 @@ dependencies = [ [[package]] name = "cranelift-bforest" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38faa2a16616c8e78a18d37b4726b98bfd2de192f2fdc8a39ddf568a408a0f75" +checksum = "2a2ab4512dfd3a6f4be184403a195f76e81a8a9f9e6c898e19d2dc3ce20e0115" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26f192472a3ba23860afd07d2b0217dc628f21fcc72617aa1336d98e1671f33b" +checksum = "98b022ed2a5913a38839dfbafe6cf135342661293b08049843362df4301261dc" dependencies = [ + "arrayvec", + "bumpalo", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", + "cranelift-egraph", "cranelift-entity", + "cranelift-isle", "gimli 0.26.1", "log", - "regalloc", + "regalloc2", "smallvec", "target-lexicon", ] [[package]] name = "cranelift-codegen-meta" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32ddb89e9b89d3d9b36a5b7d7ea3261c98235a76ac95ba46826b8ec40b1a24" +checksum = "639307b45434ad112a98f8300c0f0ab085cbefcd767efcdef9ef19d4c0756e74" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.82.3" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278e52e29c53fcf32431ef08406c295699a70306d05a0715c5b1bf50e33a9ab7" + +[[package]] +name = "cranelift-egraph" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01fd0d9f288cc1b42d9333b7a776b17e278fc888c28e6a0f09b5573d45a150bc" +checksum = "624b54323b06e675293939311943ba82d323bb340468ce1889be5da7932c8d73" +dependencies = [ + "cranelift-entity", + "fxhash", + "hashbrown", + "indexmap", + "log", + "smallvec", +] [[package]] name = "cranelift-entity" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3bfe172b83167604601faf9dc60453e0d0a93415b57a9c4d1a7ae6849185cf" +checksum = "9a59bcbca89c3f1b70b93ab3cbba5e5e0cbf3e63dadb23c7525cb142e21a9d4c" [[package]] name = "cranelift-frontend" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a006e3e32d80ce0e4ba7f1f9ddf66066d052a8c884a110b91d05404d6ce26dce" +checksum = "0d70abacb8cfef3dc8ff7e8836e9c1d70f7967dfdac824a4cd5e30223415aca6" dependencies = [ "cranelift-codegen", "log", @@ -326,6 +358,12 @@ dependencies = [ "target-lexicon", ] +[[package]] +name = "cranelift-isle" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "393bc73c451830ff8dbb3a07f61843d6cb41a084f9996319917c0b291ed785bb" + [[package]] name = "crc32fast" version = "1.3.2" @@ -365,7 +403,7 @@ dependencies = [ "cfg-if", "crossbeam-utils", "lazy_static", - "memoffset", + "memoffset 0.6.4", "scopeguard", ] @@ -455,6 +493,19 @@ dependencies = [ "syn", ] +[[package]] +name = "dashmap" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" +dependencies = [ + "cfg-if", + "hashbrown", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "der" version = "0.6.0" @@ -644,12 +695,30 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + [[package]] name = "forward_ref" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generic-array" version = "0.14.4" @@ -712,18 +781,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c21d40587b92fa6a6c6e3c1bdbf87d75511db5672f9c93175574b3a00df1758" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ "ahash", ] @@ -758,15 +818,24 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "indexmap" -version = "1.7.0" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown 0.11.2", - "serde", + "hashbrown", ] [[package]] @@ -777,9 +846,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "js-sys" -version = "0.3.55" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" dependencies = [ "wasm-bindgen", ] @@ -815,13 +884,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] -name = "libloading" -version = "0.7.0" +name = "lock_api" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ - "cfg-if", - "winapi", + "autocfg", + "scopeguard", ] [[package]] @@ -839,7 +908,6 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" dependencies = [ - "indexmap", "loupe-derive", "rustversion", ] @@ -887,6 +955,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + [[package]] name = "miniz_oxide" version = "0.4.4" @@ -922,23 +999,11 @@ dependencies = [ "memchr", ] -[[package]] -name = "object" -version = "0.28.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40bec70ba014595f99f7aa110b84331ffe1ee9aece7fe6f387cc7e3ecda4d456" -dependencies = [ - "crc32fast", - "hashbrown 0.11.2", - "indexmap", - "memchr", -] - [[package]] name = "once_cell" -version = "1.8.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "opaque-debug" @@ -952,6 +1017,25 @@ version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" +[[package]] +name = "parking_lot_core" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys 0.45.0", +] + +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + [[package]] name = "pin-project-lite" version = "0.2.7" @@ -968,12 +1052,6 @@ dependencies = [ "spki", ] -[[package]] -name = "ppv-lite86" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1000,11 +1078,11 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.27" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -1036,28 +1114,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" -dependencies = [ - "libc", - "rand_chacha", - "rand_core 0.6.3", - "rand_hc", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.3", -] - [[package]] name = "rand_core" version = "0.5.1" @@ -1076,15 +1132,6 @@ dependencies = [ "getrandom 0.2.3", ] -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core 0.6.3", -] - [[package]] name = "rayon" version = "1.5.1" @@ -1133,13 +1180,14 @@ dependencies = [ ] [[package]] -name = "regalloc" -version = "0.0.34" +name = "regalloc2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62446b1d3ebf980bdc68837700af1d77b37bc430e524bf95319c6eada2a4cc02" +checksum = "300d4fbfb40c1c66a78ba3ddd41c1110247cf52f97b87d0f2fc9209bd49b030c" dependencies = [ + "fxhash", "log", - "rustc-hash", + "slice-group-by", "smallvec", ] @@ -1155,20 +1203,11 @@ dependencies = [ "winapi", ] -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - [[package]] name = "rend" -version = "0.3.6" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79af64b4b6362ffba04eef3a4e10829718a4896dac19daa741851c86781edf95" +checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" dependencies = [ "bytecheck", ] @@ -1186,12 +1225,13 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.7.36" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5230ae2981a885590b0dc84e0b24c0ed23ad24f7adc0eb824b26cafa961f7c36" +checksum = "21499ed91807f07ae081880aabb2ccc0235e9d88011867d984525e9a4c3cfa3e" dependencies = [ "bytecheck", - "hashbrown 0.12.0", + "hashbrown", + "indexmap", "ptr_meta", "rend", "rkyv_derive", @@ -1200,9 +1240,9 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.7.36" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc752d5925dbcb324522f3a4c93193d17f107b2e11810913aa3ad352fa01480" +checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" dependencies = [ "proc-macro2", "quote", @@ -1215,12 +1255,6 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustversion" version = "1.0.5" @@ -1302,12 +1336,14 @@ dependencies = [ ] [[package]] -name = "serde_bytes" -version = "0.11.5" +name = "serde-wasm-bindgen" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" +checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" dependencies = [ + "js-sys", "serde", + "wasm-bindgen", ] [[package]] @@ -1377,6 +1413,18 @@ dependencies = [ "rand_core 0.6.3", ] +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + +[[package]] +name = "slice-group-by" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" + [[package]] name = "smallvec" version = "1.6.1" @@ -1419,34 +1467,20 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.73" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] name = "target-lexicon" -version = "0.12.2" +version = "0.12.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9bffcddbc2458fa3e6058414599e3c838a022abae82e5c67b4f7f80298d5bff" - -[[package]] -name = "tempfile" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" -dependencies = [ - "cfg-if", - "libc", - "rand", - "redox_syscall", - "remove_dir_all", - "winapi", -] +checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5" [[package]] name = "thiserror" @@ -1468,6 +1502,21 @@ dependencies = [ "syn", ] +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tracing" version = "0.1.26" @@ -1475,7 +1524,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ "cfg-if", - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1520,10 +1568,36 @@ dependencies = [ ] [[package]] -name = "unicode-xid" -version = "0.2.2" +name = "unicode-bidi" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] [[package]] name = "version_check" @@ -1545,9 +1619,9 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm-bindgen" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1555,24 +1629,47 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", "syn", "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-downcast" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" +dependencies = [ + "js-sys", + "once_cell", + "wasm-bindgen", + "wasm-bindgen-downcast-macros", +] + +[[package]] +name = "wasm-bindgen-downcast-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "wasm-bindgen-macro" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1580,9 +1677,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", @@ -1593,79 +1690,71 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea8d8361c9d006ea3d7797de7bd6b1492ffd0f91a22430cfda6c1658ad57bedf" +checksum = "8472807bd8d5062aef0a35681e1b6fbaed8fea88d97910870741100c03b8fef3" dependencies = [ + "bytes", "cfg-if", + "derivative", "indexmap", "js-sys", - "loupe", "more-asserts", + "serde", + "serde-wasm-bindgen", "target-lexicon", "thiserror", "wasm-bindgen", - "wasmer-artifact", + "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", "wasmer-derive", - "wasmer-engine", - "wasmer-engine-dylib", - "wasmer-engine-universal", "wasmer-types", "wasmer-vm", "winapi", ] -[[package]] -name = "wasmer-artifact" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aaf9428c29c1d8ad2ac0e45889ba8a568a835e33fd058964e5e500f2f7ce325" -dependencies = [ - "enumset", - "loupe", - "thiserror", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-compiler" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67a6cd866aed456656db2cfea96c18baabbd33f676578482b85c51e1ee19d2c" +checksum = "2e322cdfb8ed189d92cbb5c34acb319c0f04fb9799ed68e127717f255f8b246a" dependencies = [ + "backtrace", + "cfg-if", + "enum-iterator", "enumset", - "loupe", - "rkyv", - "serde", - "serde_bytes", + "lazy_static", + "leb128", + "memmap2", + "more-asserts", + "region", + "rustc-demangle", "smallvec", - "target-lexicon", "thiserror", "wasmer-types", + "wasmer-vm", "wasmparser", + "winapi", ] [[package]] name = "wasmer-compiler-cranelift" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48be2f9f6495f08649e4f8b946a2cbbe119faf5a654aa1457f9504a99d23dae0" +checksum = "c5240177aca0d8322c890d17d4b1b87f23ccb45340f616f384655aaba18f51bd" dependencies = [ "cranelift-codegen", "cranelift-entity", "cranelift-frontend", "gimli 0.26.1", - "loupe", "more-asserts", "rayon", "smallvec", @@ -1677,16 +1766,16 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ca2a35204d8befa85062bc7aac259a8db8070b801b8a783770ba58231d729e" +checksum = "f9f824f2e345c288e4394ee0410478dea799747f9ebb319e1d8ad33e33a03545" dependencies = [ "byteorder", "dynasm", "dynasmrt", + "enumset", "gimli 0.26.1", "lazy_static", - "loupe", "more-asserts", "rayon", "smallvec", @@ -1696,9 +1785,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e50405cc2a2f74ff574584710a5f2c1d5c93744acce2ca0866084739284b51" +checksum = "fb6858f330764b1041e68d3c824970064d2fbd8e27704180289fd248ff892c48" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1706,173 +1795,68 @@ dependencies = [ "syn", ] -[[package]] -name = "wasmer-engine" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f98f010978c244db431b392aeab0661df7ea0822343334f8f2a920763548e45" -dependencies = [ - "backtrace", - "enumset", - "lazy_static", - "loupe", - "memmap2", - "more-asserts", - "rustc-demangle", - "serde", - "serde_bytes", - "target-lexicon", - "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", - "wasmer-vm", -] - -[[package]] -name = "wasmer-engine-dylib" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0358af9c154724587731175553805648d9acb8f6657880d165e378672b7e53" -dependencies = [ - "cfg-if", - "enum-iterator", - "enumset", - "leb128", - "libloading", - "loupe", - "object 0.28.3", - "rkyv", - "serde", - "tempfile", - "tracing", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-engine", - "wasmer-object", - "wasmer-types", - "wasmer-vm", - "which", -] - -[[package]] -name = "wasmer-engine-universal" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "440dc3d93c9ca47865a4f4edd037ea81bf983b5796b59b3d712d844b32dbef15" -dependencies = [ - "cfg-if", - "enumset", - "leb128", - "loupe", - "region", - "rkyv", - "wasmer-compiler", - "wasmer-engine", - "wasmer-engine-universal-artifact", - "wasmer-types", - "wasmer-vm", - "winapi", -] - -[[package]] -name = "wasmer-engine-universal-artifact" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f1db3f54152657eb6e86c44b66525ff7801dad8328fe677da48dd06af9ad41" -dependencies = [ - "enum-iterator", - "enumset", - "loupe", - "rkyv", - "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-middlewares" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7812438ed2f37203a37007cdb5332b8475cb2b16e15d51299b2647894e9ed3a" +checksum = "f3c5919c0fbbdb0ac8f6d432e7baa796ea49b1381d726bc319c0451f26da11fd" dependencies = [ - "loupe", "wasmer", "wasmer-types", "wasmer-vm", ] -[[package]] -name = "wasmer-object" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d831335ff3a44ecf451303f6f891175c642488036b92ceceb24ac8623a8fa8b" -dependencies = [ - "object 0.28.3", - "thiserror", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-types" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39df01ea05dc0a9bab67e054c7cb01521e53b35a7bb90bd02eca564ed0b2667f" +checksum = "d83345e3335fb9b21be6c394bc3d712522447bc8750db8a40ac9170627e3de35" dependencies = [ - "backtrace", + "bytecheck", "enum-iterator", + "enumset", "indexmap", - "loupe", "more-asserts", "rkyv", - "serde", + "target-lexicon", "thiserror", ] [[package]] name = "wasmer-vm" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d965fa61f4dc4cdb35a54daaf7ecec3563fbb94154a6c35433f879466247dd" +checksum = "2ca3cf9a2bb5919ae048231972440767efad7a693afaeb41332ab0796be1c884" dependencies = [ "backtrace", "cc", "cfg-if", "corosensei", + "dashmap", + "derivative", "enum-iterator", + "fnv", "indexmap", "lazy_static", "libc", - "loupe", "mach", - "memoffset", + "memoffset 0.8.0", "more-asserts", "region", - "rkyv", "scopeguard", - "serde", "thiserror", - "wasmer-artifact", "wasmer-types", "winapi", ] [[package]] name = "wasmparser" -version = "0.83.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a" - -[[package]] -name = "which" -version = "4.1.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55551e42cbdf2ce2bedd2203d0cc08dba002c27510f86dab6d0ce304cba3dfe" +checksum = "f2ea896273ea99b15132414be1da01ab0d8836415083298ecaffbe308eaac87a" dependencies = [ - "either", - "libc", + "indexmap", + "url", ] [[package]] @@ -1903,43 +1887,109 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43dbb096663629518eb1dfa72d80243ca5a6aca764cae62a2df70af760a9be75" dependencies = [ - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_msvc", + "windows_aarch64_msvc 0.33.0", + "windows_i686_gnu 0.33.0", + "windows_i686_msvc 0.33.0", + "windows_x86_64_gnu 0.33.0", + "windows_x86_64_msvc 0.33.0", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc 0.42.2", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_i686_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_x86_64_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "zeroize" version = "1.5.7" diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 1da584a358..d82a869441 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -28,6 +28,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + [[package]] name = "autocfg" version = "1.1.0" @@ -45,7 +51,7 @@ dependencies = [ "cfg-if", "libc", "miniz_oxide", - "object 0.25.3", + "object", "rustc-demangle", ] @@ -99,19 +105,20 @@ checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecheck" -version = "0.6.7" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "314889ea31cda264cb7c3d6e6e5c9415a987ecb0e72c17c00d36fbb881d34abe" +checksum = "13fe11640a23eb24562225322cd3e452b93a3d4091d62fab69c70542fcd17d1f" dependencies = [ "bytecheck_derive", "ptr_meta", + "simdutf8", ] [[package]] name = "bytecheck_derive" -version = "0.6.7" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a2b3b92c135dae665a6f760205b89187638e83bed17ef3e44e83c712cf30600" +checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ "proc-macro2", "quote", @@ -124,6 +131,12 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + [[package]] name = "cc" version = "1.0.69" @@ -158,7 +171,7 @@ dependencies = [ "cfg-if", "libc", "scopeguard", - "windows-sys", + "windows-sys 0.33.0", ] [[package]] @@ -231,6 +244,7 @@ version = "1.2.5" dependencies = [ "bitflags", "bytecheck", + "bytes", "clru", "cosmwasm-crypto", "cosmwasm-std", @@ -269,56 +283,74 @@ dependencies = [ [[package]] name = "cranelift-bforest" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38faa2a16616c8e78a18d37b4726b98bfd2de192f2fdc8a39ddf568a408a0f75" +checksum = "2a2ab4512dfd3a6f4be184403a195f76e81a8a9f9e6c898e19d2dc3ce20e0115" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26f192472a3ba23860afd07d2b0217dc628f21fcc72617aa1336d98e1671f33b" +checksum = "98b022ed2a5913a38839dfbafe6cf135342661293b08049843362df4301261dc" dependencies = [ + "arrayvec", + "bumpalo", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", + "cranelift-egraph", "cranelift-entity", + "cranelift-isle", "gimli 0.26.1", "log", - "regalloc", + "regalloc2", "smallvec", "target-lexicon", ] [[package]] name = "cranelift-codegen-meta" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32ddb89e9b89d3d9b36a5b7d7ea3261c98235a76ac95ba46826b8ec40b1a24" +checksum = "639307b45434ad112a98f8300c0f0ab085cbefcd767efcdef9ef19d4c0756e74" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.82.3" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278e52e29c53fcf32431ef08406c295699a70306d05a0715c5b1bf50e33a9ab7" + +[[package]] +name = "cranelift-egraph" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01fd0d9f288cc1b42d9333b7a776b17e278fc888c28e6a0f09b5573d45a150bc" +checksum = "624b54323b06e675293939311943ba82d323bb340468ce1889be5da7932c8d73" +dependencies = [ + "cranelift-entity", + "fxhash", + "hashbrown", + "indexmap", + "log", + "smallvec", +] [[package]] name = "cranelift-entity" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3bfe172b83167604601faf9dc60453e0d0a93415b57a9c4d1a7ae6849185cf" +checksum = "9a59bcbca89c3f1b70b93ab3cbba5e5e0cbf3e63dadb23c7525cb142e21a9d4c" [[package]] name = "cranelift-frontend" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a006e3e32d80ce0e4ba7f1f9ddf66066d052a8c884a110b91d05404d6ce26dce" +checksum = "0d70abacb8cfef3dc8ff7e8836e9c1d70f7967dfdac824a4cd5e30223415aca6" dependencies = [ "cranelift-codegen", "log", @@ -326,6 +358,12 @@ dependencies = [ "target-lexicon", ] +[[package]] +name = "cranelift-isle" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "393bc73c451830ff8dbb3a07f61843d6cb41a084f9996319917c0b291ed785bb" + [[package]] name = "crc32fast" version = "1.3.2" @@ -365,7 +403,7 @@ dependencies = [ "cfg-if", "crossbeam-utils", "lazy_static", - "memoffset", + "memoffset 0.6.4", "scopeguard", ] @@ -455,6 +493,19 @@ dependencies = [ "syn", ] +[[package]] +name = "dashmap" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" +dependencies = [ + "cfg-if", + "hashbrown", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "der" version = "0.6.0" @@ -650,12 +701,30 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + [[package]] name = "forward_ref" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generic-array" version = "0.14.4" @@ -718,18 +787,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c21d40587b92fa6a6c6e3c1bdbf87d75511db5672f9c93175574b3a00df1758" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ "ahash", ] @@ -764,15 +824,24 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "indexmap" -version = "1.7.0" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown 0.11.2", - "serde", + "hashbrown", ] [[package]] @@ -783,9 +852,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "js-sys" -version = "0.3.55" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" dependencies = [ "wasm-bindgen", ] @@ -821,13 +890,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] -name = "libloading" -version = "0.7.0" +name = "lock_api" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ - "cfg-if", - "winapi", + "autocfg", + "scopeguard", ] [[package]] @@ -845,7 +914,6 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" dependencies = [ - "indexmap", "loupe-derive", "rustversion", ] @@ -893,6 +961,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + [[package]] name = "miniz_oxide" version = "0.4.4" @@ -928,23 +1005,11 @@ dependencies = [ "memchr", ] -[[package]] -name = "object" -version = "0.28.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40bec70ba014595f99f7aa110b84331ffe1ee9aece7fe6f387cc7e3ecda4d456" -dependencies = [ - "crc32fast", - "hashbrown 0.11.2", - "indexmap", - "memchr", -] - [[package]] name = "once_cell" -version = "1.8.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "opaque-debug" @@ -958,6 +1023,25 @@ version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" +[[package]] +name = "parking_lot_core" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys 0.45.0", +] + +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + [[package]] name = "pin-project-lite" version = "0.2.7" @@ -974,12 +1058,6 @@ dependencies = [ "spki", ] -[[package]] -name = "ppv-lite86" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1006,11 +1084,11 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.27" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -1042,28 +1120,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" -dependencies = [ - "libc", - "rand_chacha", - "rand_core 0.6.3", - "rand_hc", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.3", -] - [[package]] name = "rand_core" version = "0.5.1" @@ -1082,15 +1138,6 @@ dependencies = [ "getrandom 0.2.3", ] -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core 0.6.3", -] - [[package]] name = "rayon" version = "1.5.1" @@ -1126,13 +1173,14 @@ dependencies = [ ] [[package]] -name = "regalloc" -version = "0.0.34" +name = "regalloc2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62446b1d3ebf980bdc68837700af1d77b37bc430e524bf95319c6eada2a4cc02" +checksum = "300d4fbfb40c1c66a78ba3ddd41c1110247cf52f97b87d0f2fc9209bd49b030c" dependencies = [ + "fxhash", "log", - "rustc-hash", + "slice-group-by", "smallvec", ] @@ -1148,20 +1196,11 @@ dependencies = [ "winapi", ] -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - [[package]] name = "rend" -version = "0.3.6" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79af64b4b6362ffba04eef3a4e10829718a4896dac19daa741851c86781edf95" +checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" dependencies = [ "bytecheck", ] @@ -1179,12 +1218,13 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.7.36" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5230ae2981a885590b0dc84e0b24c0ed23ad24f7adc0eb824b26cafa961f7c36" +checksum = "21499ed91807f07ae081880aabb2ccc0235e9d88011867d984525e9a4c3cfa3e" dependencies = [ "bytecheck", - "hashbrown 0.12.0", + "hashbrown", + "indexmap", "ptr_meta", "rend", "rkyv_derive", @@ -1193,9 +1233,9 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.7.36" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc752d5925dbcb324522f3a4c93193d17f107b2e11810913aa3ad352fa01480" +checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" dependencies = [ "proc-macro2", "quote", @@ -1208,12 +1248,6 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustversion" version = "1.0.5" @@ -1295,12 +1329,14 @@ dependencies = [ ] [[package]] -name = "serde_bytes" -version = "0.11.5" +name = "serde-wasm-bindgen" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" +checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" dependencies = [ + "js-sys", "serde", + "wasm-bindgen", ] [[package]] @@ -1370,6 +1406,18 @@ dependencies = [ "rand_core 0.6.3", ] +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + +[[package]] +name = "slice-group-by" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" + [[package]] name = "smallvec" version = "1.6.1" @@ -1446,34 +1494,20 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.73" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] name = "target-lexicon" -version = "0.12.2" +version = "0.12.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9bffcddbc2458fa3e6058414599e3c838a022abae82e5c67b4f7f80298d5bff" - -[[package]] -name = "tempfile" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" -dependencies = [ - "cfg-if", - "libc", - "rand", - "redox_syscall", - "remove_dir_all", - "winapi", -] +checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5" [[package]] name = "thiserror" @@ -1495,6 +1529,21 @@ dependencies = [ "syn", ] +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tracing" version = "0.1.26" @@ -1502,7 +1551,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ "cfg-if", - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1547,10 +1595,36 @@ dependencies = [ ] [[package]] -name = "unicode-xid" -version = "0.2.2" +name = "unicode-bidi" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] [[package]] name = "version_check" @@ -1572,9 +1646,9 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm-bindgen" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1582,24 +1656,47 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", "syn", "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-downcast" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" +dependencies = [ + "js-sys", + "once_cell", + "wasm-bindgen", + "wasm-bindgen-downcast-macros", +] + +[[package]] +name = "wasm-bindgen-downcast-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "wasm-bindgen-macro" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1607,9 +1704,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", @@ -1620,79 +1717,71 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea8d8361c9d006ea3d7797de7bd6b1492ffd0f91a22430cfda6c1658ad57bedf" +checksum = "8472807bd8d5062aef0a35681e1b6fbaed8fea88d97910870741100c03b8fef3" dependencies = [ + "bytes", "cfg-if", + "derivative", "indexmap", "js-sys", - "loupe", "more-asserts", + "serde", + "serde-wasm-bindgen", "target-lexicon", "thiserror", "wasm-bindgen", - "wasmer-artifact", + "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", "wasmer-derive", - "wasmer-engine", - "wasmer-engine-dylib", - "wasmer-engine-universal", "wasmer-types", "wasmer-vm", "winapi", ] -[[package]] -name = "wasmer-artifact" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aaf9428c29c1d8ad2ac0e45889ba8a568a835e33fd058964e5e500f2f7ce325" -dependencies = [ - "enumset", - "loupe", - "thiserror", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-compiler" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67a6cd866aed456656db2cfea96c18baabbd33f676578482b85c51e1ee19d2c" +checksum = "2e322cdfb8ed189d92cbb5c34acb319c0f04fb9799ed68e127717f255f8b246a" dependencies = [ + "backtrace", + "cfg-if", + "enum-iterator", "enumset", - "loupe", - "rkyv", - "serde", - "serde_bytes", + "lazy_static", + "leb128", + "memmap2", + "more-asserts", + "region", + "rustc-demangle", "smallvec", - "target-lexicon", "thiserror", "wasmer-types", + "wasmer-vm", "wasmparser", + "winapi", ] [[package]] name = "wasmer-compiler-cranelift" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48be2f9f6495f08649e4f8b946a2cbbe119faf5a654aa1457f9504a99d23dae0" +checksum = "c5240177aca0d8322c890d17d4b1b87f23ccb45340f616f384655aaba18f51bd" dependencies = [ "cranelift-codegen", "cranelift-entity", "cranelift-frontend", "gimli 0.26.1", - "loupe", "more-asserts", "rayon", "smallvec", @@ -1704,16 +1793,16 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ca2a35204d8befa85062bc7aac259a8db8070b801b8a783770ba58231d729e" +checksum = "f9f824f2e345c288e4394ee0410478dea799747f9ebb319e1d8ad33e33a03545" dependencies = [ "byteorder", "dynasm", "dynasmrt", + "enumset", "gimli 0.26.1", "lazy_static", - "loupe", "more-asserts", "rayon", "smallvec", @@ -1723,9 +1812,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e50405cc2a2f74ff574584710a5f2c1d5c93744acce2ca0866084739284b51" +checksum = "fb6858f330764b1041e68d3c824970064d2fbd8e27704180289fd248ff892c48" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1733,173 +1822,68 @@ dependencies = [ "syn", ] -[[package]] -name = "wasmer-engine" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f98f010978c244db431b392aeab0661df7ea0822343334f8f2a920763548e45" -dependencies = [ - "backtrace", - "enumset", - "lazy_static", - "loupe", - "memmap2", - "more-asserts", - "rustc-demangle", - "serde", - "serde_bytes", - "target-lexicon", - "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", - "wasmer-vm", -] - -[[package]] -name = "wasmer-engine-dylib" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0358af9c154724587731175553805648d9acb8f6657880d165e378672b7e53" -dependencies = [ - "cfg-if", - "enum-iterator", - "enumset", - "leb128", - "libloading", - "loupe", - "object 0.28.3", - "rkyv", - "serde", - "tempfile", - "tracing", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-engine", - "wasmer-object", - "wasmer-types", - "wasmer-vm", - "which", -] - -[[package]] -name = "wasmer-engine-universal" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "440dc3d93c9ca47865a4f4edd037ea81bf983b5796b59b3d712d844b32dbef15" -dependencies = [ - "cfg-if", - "enumset", - "leb128", - "loupe", - "region", - "rkyv", - "wasmer-compiler", - "wasmer-engine", - "wasmer-engine-universal-artifact", - "wasmer-types", - "wasmer-vm", - "winapi", -] - -[[package]] -name = "wasmer-engine-universal-artifact" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f1db3f54152657eb6e86c44b66525ff7801dad8328fe677da48dd06af9ad41" -dependencies = [ - "enum-iterator", - "enumset", - "loupe", - "rkyv", - "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-middlewares" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7812438ed2f37203a37007cdb5332b8475cb2b16e15d51299b2647894e9ed3a" +checksum = "f3c5919c0fbbdb0ac8f6d432e7baa796ea49b1381d726bc319c0451f26da11fd" dependencies = [ - "loupe", "wasmer", "wasmer-types", "wasmer-vm", ] -[[package]] -name = "wasmer-object" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d831335ff3a44ecf451303f6f891175c642488036b92ceceb24ac8623a8fa8b" -dependencies = [ - "object 0.28.3", - "thiserror", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-types" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39df01ea05dc0a9bab67e054c7cb01521e53b35a7bb90bd02eca564ed0b2667f" +checksum = "d83345e3335fb9b21be6c394bc3d712522447bc8750db8a40ac9170627e3de35" dependencies = [ - "backtrace", + "bytecheck", "enum-iterator", + "enumset", "indexmap", - "loupe", "more-asserts", "rkyv", - "serde", + "target-lexicon", "thiserror", ] [[package]] name = "wasmer-vm" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d965fa61f4dc4cdb35a54daaf7ecec3563fbb94154a6c35433f879466247dd" +checksum = "2ca3cf9a2bb5919ae048231972440767efad7a693afaeb41332ab0796be1c884" dependencies = [ "backtrace", "cc", "cfg-if", "corosensei", + "dashmap", + "derivative", "enum-iterator", + "fnv", "indexmap", "lazy_static", "libc", - "loupe", "mach", - "memoffset", + "memoffset 0.8.0", "more-asserts", "region", - "rkyv", "scopeguard", - "serde", "thiserror", - "wasmer-artifact", "wasmer-types", "winapi", ] [[package]] name = "wasmparser" -version = "0.83.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a" - -[[package]] -name = "which" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55551e42cbdf2ce2bedd2203d0cc08dba002c27510f86dab6d0ce304cba3dfe" +checksum = "f2ea896273ea99b15132414be1da01ab0d8836415083298ecaffbe308eaac87a" dependencies = [ - "either", - "libc", + "indexmap", + "url", ] [[package]] @@ -1930,43 +1914,109 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43dbb096663629518eb1dfa72d80243ca5a6aca764cae62a2df70af760a9be75" dependencies = [ - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_msvc", + "windows_aarch64_msvc 0.33.0", + "windows_i686_gnu 0.33.0", + "windows_i686_msvc 0.33.0", + "windows_x86_64_gnu 0.33.0", + "windows_x86_64_msvc 0.33.0", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc 0.42.2", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_i686_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_x86_64_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "zeroize" version = "1.5.7" diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 45500536b0..dc7da0bb7f 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -28,6 +28,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + [[package]] name = "autocfg" version = "1.1.0" @@ -45,7 +51,7 @@ dependencies = [ "cfg-if", "libc", "miniz_oxide", - "object 0.25.3", + "object", "rustc-demangle", ] @@ -99,19 +105,20 @@ checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecheck" -version = "0.6.7" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "314889ea31cda264cb7c3d6e6e5c9415a987ecb0e72c17c00d36fbb881d34abe" +checksum = "13fe11640a23eb24562225322cd3e452b93a3d4091d62fab69c70542fcd17d1f" dependencies = [ "bytecheck_derive", "ptr_meta", + "simdutf8", ] [[package]] name = "bytecheck_derive" -version = "0.6.7" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a2b3b92c135dae665a6f760205b89187638e83bed17ef3e44e83c712cf30600" +checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ "proc-macro2", "quote", @@ -124,6 +131,12 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + [[package]] name = "cc" version = "1.0.69" @@ -158,7 +171,7 @@ dependencies = [ "cfg-if", "libc", "scopeguard", - "windows-sys", + "windows-sys 0.33.0", ] [[package]] @@ -223,6 +236,7 @@ version = "1.2.5" dependencies = [ "bitflags", "bytecheck", + "bytes", "clru", "cosmwasm-crypto", "cosmwasm-std", @@ -261,56 +275,74 @@ dependencies = [ [[package]] name = "cranelift-bforest" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38faa2a16616c8e78a18d37b4726b98bfd2de192f2fdc8a39ddf568a408a0f75" +checksum = "2a2ab4512dfd3a6f4be184403a195f76e81a8a9f9e6c898e19d2dc3ce20e0115" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26f192472a3ba23860afd07d2b0217dc628f21fcc72617aa1336d98e1671f33b" +checksum = "98b022ed2a5913a38839dfbafe6cf135342661293b08049843362df4301261dc" dependencies = [ + "arrayvec", + "bumpalo", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", + "cranelift-egraph", "cranelift-entity", + "cranelift-isle", "gimli 0.26.1", "log", - "regalloc", + "regalloc2", "smallvec", "target-lexicon", ] [[package]] name = "cranelift-codegen-meta" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32ddb89e9b89d3d9b36a5b7d7ea3261c98235a76ac95ba46826b8ec40b1a24" +checksum = "639307b45434ad112a98f8300c0f0ab085cbefcd767efcdef9ef19d4c0756e74" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.82.3" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278e52e29c53fcf32431ef08406c295699a70306d05a0715c5b1bf50e33a9ab7" + +[[package]] +name = "cranelift-egraph" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01fd0d9f288cc1b42d9333b7a776b17e278fc888c28e6a0f09b5573d45a150bc" +checksum = "624b54323b06e675293939311943ba82d323bb340468ce1889be5da7932c8d73" +dependencies = [ + "cranelift-entity", + "fxhash", + "hashbrown", + "indexmap", + "log", + "smallvec", +] [[package]] name = "cranelift-entity" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3bfe172b83167604601faf9dc60453e0d0a93415b57a9c4d1a7ae6849185cf" +checksum = "9a59bcbca89c3f1b70b93ab3cbba5e5e0cbf3e63dadb23c7525cb142e21a9d4c" [[package]] name = "cranelift-frontend" -version = "0.82.3" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a006e3e32d80ce0e4ba7f1f9ddf66066d052a8c884a110b91d05404d6ce26dce" +checksum = "0d70abacb8cfef3dc8ff7e8836e9c1d70f7967dfdac824a4cd5e30223415aca6" dependencies = [ "cranelift-codegen", "log", @@ -318,6 +350,12 @@ dependencies = [ "target-lexicon", ] +[[package]] +name = "cranelift-isle" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "393bc73c451830ff8dbb3a07f61843d6cb41a084f9996319917c0b291ed785bb" + [[package]] name = "crc32fast" version = "1.3.2" @@ -357,7 +395,7 @@ dependencies = [ "cfg-if", "crossbeam-utils", "lazy_static", - "memoffset", + "memoffset 0.6.4", "scopeguard", ] @@ -447,6 +485,19 @@ dependencies = [ "syn", ] +[[package]] +name = "dashmap" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" +dependencies = [ + "cfg-if", + "hashbrown", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "der" version = "0.6.0" @@ -636,12 +687,30 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + [[package]] name = "forward_ref" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generic-array" version = "0.14.4" @@ -704,18 +773,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c21d40587b92fa6a6c6e3c1bdbf87d75511db5672f9c93175574b3a00df1758" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ "ahash", ] @@ -750,15 +810,24 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "indexmap" -version = "1.7.0" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown 0.11.2", - "serde", + "hashbrown", ] [[package]] @@ -769,9 +838,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "js-sys" -version = "0.3.55" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" dependencies = [ "wasm-bindgen", ] @@ -807,13 +876,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] -name = "libloading" -version = "0.7.0" +name = "lock_api" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ - "cfg-if", - "winapi", + "autocfg", + "scopeguard", ] [[package]] @@ -831,7 +900,6 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" dependencies = [ - "indexmap", "loupe-derive", "rustversion", ] @@ -879,6 +947,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + [[package]] name = "miniz_oxide" version = "0.4.4" @@ -914,23 +991,11 @@ dependencies = [ "memchr", ] -[[package]] -name = "object" -version = "0.28.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40bec70ba014595f99f7aa110b84331ffe1ee9aece7fe6f387cc7e3ecda4d456" -dependencies = [ - "crc32fast", - "hashbrown 0.11.2", - "indexmap", - "memchr", -] - [[package]] name = "once_cell" -version = "1.8.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "opaque-debug" @@ -944,6 +1009,25 @@ version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" +[[package]] +name = "parking_lot_core" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys 0.45.0", +] + +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + [[package]] name = "pin-project-lite" version = "0.2.7" @@ -960,12 +1044,6 @@ dependencies = [ "spki", ] -[[package]] -name = "ppv-lite86" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -992,11 +1070,11 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.27" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -1028,28 +1106,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" -dependencies = [ - "libc", - "rand_chacha", - "rand_core 0.6.3", - "rand_hc", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.3", -] - [[package]] name = "rand_core" version = "0.5.1" @@ -1068,15 +1124,6 @@ dependencies = [ "getrandom 0.2.3", ] -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core 0.6.3", -] - [[package]] name = "rayon" version = "1.5.1" @@ -1112,13 +1159,14 @@ dependencies = [ ] [[package]] -name = "regalloc" -version = "0.0.34" +name = "regalloc2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62446b1d3ebf980bdc68837700af1d77b37bc430e524bf95319c6eada2a4cc02" +checksum = "300d4fbfb40c1c66a78ba3ddd41c1110247cf52f97b87d0f2fc9209bd49b030c" dependencies = [ + "fxhash", "log", - "rustc-hash", + "slice-group-by", "smallvec", ] @@ -1134,20 +1182,11 @@ dependencies = [ "winapi", ] -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - [[package]] name = "rend" -version = "0.3.6" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79af64b4b6362ffba04eef3a4e10829718a4896dac19daa741851c86781edf95" +checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" dependencies = [ "bytecheck", ] @@ -1165,12 +1204,13 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.7.36" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5230ae2981a885590b0dc84e0b24c0ed23ad24f7adc0eb824b26cafa961f7c36" +checksum = "21499ed91807f07ae081880aabb2ccc0235e9d88011867d984525e9a4c3cfa3e" dependencies = [ "bytecheck", - "hashbrown 0.12.0", + "hashbrown", + "indexmap", "ptr_meta", "rend", "rkyv_derive", @@ -1179,9 +1219,9 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.7.36" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc752d5925dbcb324522f3a4c93193d17f107b2e11810913aa3ad352fa01480" +checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" dependencies = [ "proc-macro2", "quote", @@ -1194,12 +1234,6 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustversion" version = "1.0.5" @@ -1281,12 +1315,14 @@ dependencies = [ ] [[package]] -name = "serde_bytes" -version = "0.11.5" +name = "serde-wasm-bindgen" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" +checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" dependencies = [ + "js-sys", "serde", + "wasm-bindgen", ] [[package]] @@ -1356,6 +1392,18 @@ dependencies = [ "rand_core 0.6.3", ] +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + +[[package]] +name = "slice-group-by" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" + [[package]] name = "smallvec" version = "1.6.1" @@ -1398,34 +1446,20 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.73" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] name = "target-lexicon" -version = "0.12.2" +version = "0.12.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9bffcddbc2458fa3e6058414599e3c838a022abae82e5c67b4f7f80298d5bff" - -[[package]] -name = "tempfile" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" -dependencies = [ - "cfg-if", - "libc", - "rand", - "redox_syscall", - "remove_dir_all", - "winapi", -] +checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5" [[package]] name = "thiserror" @@ -1447,6 +1481,21 @@ dependencies = [ "syn", ] +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tracing" version = "0.1.26" @@ -1454,7 +1503,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ "cfg-if", - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1499,10 +1547,36 @@ dependencies = [ ] [[package]] -name = "unicode-xid" -version = "0.2.2" +name = "unicode-bidi" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] [[package]] name = "version_check" @@ -1536,9 +1610,9 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm-bindgen" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1546,24 +1620,47 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", "syn", "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-downcast" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" +dependencies = [ + "js-sys", + "once_cell", + "wasm-bindgen", + "wasm-bindgen-downcast-macros", +] + +[[package]] +name = "wasm-bindgen-downcast-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "wasm-bindgen-macro" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1571,9 +1668,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", @@ -1584,79 +1681,71 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.78" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea8d8361c9d006ea3d7797de7bd6b1492ffd0f91a22430cfda6c1658ad57bedf" +checksum = "8472807bd8d5062aef0a35681e1b6fbaed8fea88d97910870741100c03b8fef3" dependencies = [ + "bytes", "cfg-if", + "derivative", "indexmap", "js-sys", - "loupe", "more-asserts", + "serde", + "serde-wasm-bindgen", "target-lexicon", "thiserror", "wasm-bindgen", - "wasmer-artifact", + "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", "wasmer-derive", - "wasmer-engine", - "wasmer-engine-dylib", - "wasmer-engine-universal", "wasmer-types", "wasmer-vm", "winapi", ] -[[package]] -name = "wasmer-artifact" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aaf9428c29c1d8ad2ac0e45889ba8a568a835e33fd058964e5e500f2f7ce325" -dependencies = [ - "enumset", - "loupe", - "thiserror", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-compiler" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67a6cd866aed456656db2cfea96c18baabbd33f676578482b85c51e1ee19d2c" +checksum = "2e322cdfb8ed189d92cbb5c34acb319c0f04fb9799ed68e127717f255f8b246a" dependencies = [ + "backtrace", + "cfg-if", + "enum-iterator", "enumset", - "loupe", - "rkyv", - "serde", - "serde_bytes", + "lazy_static", + "leb128", + "memmap2", + "more-asserts", + "region", + "rustc-demangle", "smallvec", - "target-lexicon", "thiserror", "wasmer-types", + "wasmer-vm", "wasmparser", + "winapi", ] [[package]] name = "wasmer-compiler-cranelift" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48be2f9f6495f08649e4f8b946a2cbbe119faf5a654aa1457f9504a99d23dae0" +checksum = "c5240177aca0d8322c890d17d4b1b87f23ccb45340f616f384655aaba18f51bd" dependencies = [ "cranelift-codegen", "cranelift-entity", "cranelift-frontend", "gimli 0.26.1", - "loupe", "more-asserts", "rayon", "smallvec", @@ -1668,16 +1757,16 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ca2a35204d8befa85062bc7aac259a8db8070b801b8a783770ba58231d729e" +checksum = "f9f824f2e345c288e4394ee0410478dea799747f9ebb319e1d8ad33e33a03545" dependencies = [ "byteorder", "dynasm", "dynasmrt", + "enumset", "gimli 0.26.1", "lazy_static", - "loupe", "more-asserts", "rayon", "smallvec", @@ -1687,9 +1776,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e50405cc2a2f74ff574584710a5f2c1d5c93744acce2ca0866084739284b51" +checksum = "fb6858f330764b1041e68d3c824970064d2fbd8e27704180289fd248ff892c48" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1697,173 +1786,68 @@ dependencies = [ "syn", ] -[[package]] -name = "wasmer-engine" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f98f010978c244db431b392aeab0661df7ea0822343334f8f2a920763548e45" -dependencies = [ - "backtrace", - "enumset", - "lazy_static", - "loupe", - "memmap2", - "more-asserts", - "rustc-demangle", - "serde", - "serde_bytes", - "target-lexicon", - "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", - "wasmer-vm", -] - -[[package]] -name = "wasmer-engine-dylib" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0358af9c154724587731175553805648d9acb8f6657880d165e378672b7e53" -dependencies = [ - "cfg-if", - "enum-iterator", - "enumset", - "leb128", - "libloading", - "loupe", - "object 0.28.3", - "rkyv", - "serde", - "tempfile", - "tracing", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-engine", - "wasmer-object", - "wasmer-types", - "wasmer-vm", - "which", -] - -[[package]] -name = "wasmer-engine-universal" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "440dc3d93c9ca47865a4f4edd037ea81bf983b5796b59b3d712d844b32dbef15" -dependencies = [ - "cfg-if", - "enumset", - "leb128", - "loupe", - "region", - "rkyv", - "wasmer-compiler", - "wasmer-engine", - "wasmer-engine-universal-artifact", - "wasmer-types", - "wasmer-vm", - "winapi", -] - -[[package]] -name = "wasmer-engine-universal-artifact" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f1db3f54152657eb6e86c44b66525ff7801dad8328fe677da48dd06af9ad41" -dependencies = [ - "enum-iterator", - "enumset", - "loupe", - "rkyv", - "thiserror", - "wasmer-artifact", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-middlewares" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7812438ed2f37203a37007cdb5332b8475cb2b16e15d51299b2647894e9ed3a" +checksum = "f3c5919c0fbbdb0ac8f6d432e7baa796ea49b1381d726bc319c0451f26da11fd" dependencies = [ - "loupe", "wasmer", "wasmer-types", "wasmer-vm", ] -[[package]] -name = "wasmer-object" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d831335ff3a44ecf451303f6f891175c642488036b92ceceb24ac8623a8fa8b" -dependencies = [ - "object 0.28.3", - "thiserror", - "wasmer-compiler", - "wasmer-types", -] - [[package]] name = "wasmer-types" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39df01ea05dc0a9bab67e054c7cb01521e53b35a7bb90bd02eca564ed0b2667f" +checksum = "d83345e3335fb9b21be6c394bc3d712522447bc8750db8a40ac9170627e3de35" dependencies = [ - "backtrace", + "bytecheck", "enum-iterator", + "enumset", "indexmap", - "loupe", "more-asserts", "rkyv", - "serde", + "target-lexicon", "thiserror", ] [[package]] name = "wasmer-vm" -version = "2.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d965fa61f4dc4cdb35a54daaf7ecec3563fbb94154a6c35433f879466247dd" +checksum = "2ca3cf9a2bb5919ae048231972440767efad7a693afaeb41332ab0796be1c884" dependencies = [ "backtrace", "cc", "cfg-if", "corosensei", + "dashmap", + "derivative", "enum-iterator", + "fnv", "indexmap", "lazy_static", "libc", - "loupe", "mach", - "memoffset", + "memoffset 0.8.0", "more-asserts", "region", - "rkyv", "scopeguard", - "serde", "thiserror", - "wasmer-artifact", "wasmer-types", "winapi", ] [[package]] name = "wasmparser" -version = "0.83.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a" - -[[package]] -name = "which" -version = "4.1.0" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55551e42cbdf2ce2bedd2203d0cc08dba002c27510f86dab6d0ce304cba3dfe" +checksum = "f2ea896273ea99b15132414be1da01ab0d8836415083298ecaffbe308eaac87a" dependencies = [ - "either", - "libc", + "indexmap", + "url", ] [[package]] @@ -1894,43 +1878,109 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43dbb096663629518eb1dfa72d80243ca5a6aca764cae62a2df70af760a9be75" dependencies = [ - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_msvc", + "windows_aarch64_msvc 0.33.0", + "windows_i686_gnu 0.33.0", + "windows_i686_msvc 0.33.0", + "windows_x86_64_gnu 0.33.0", + "windows_x86_64_msvc 0.33.0", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc 0.42.2", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_i686_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_x86_64_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "zeroize" version = "1.5.7" diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 325066539f..893f3dd1e7 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -35,6 +35,7 @@ allow_interface_version_7 = [] bench = false [dependencies] +bytes = "1.4.0" # need a higher version than the one required by Wasmer for the Bytes -> Vec implementation clru = "0.4.0" crc32fast = "1.3.2" # Uses the path when built locally; uses the given version from crates.io when published From 6d8f88d0b6b9857eb694dbd964f0c6f639ac587d Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 27 Apr 2023 13:01:01 +0200 Subject: [PATCH 0261/2372] Remove loupe --- Cargo.lock | 27 ---------------------- contracts/burner/Cargo.lock | 27 ---------------------- contracts/crypto-verify/Cargo.lock | 27 ---------------------- contracts/cyberpunk/Cargo.lock | 27 ---------------------- contracts/floaty/Cargo.lock | 27 ---------------------- contracts/hackatom/Cargo.lock | 27 ---------------------- contracts/ibc-reflect-send/Cargo.lock | 27 ---------------------- contracts/ibc-reflect/Cargo.lock | 27 ---------------------- contracts/queue/Cargo.lock | 27 ---------------------- contracts/reflect/Cargo.lock | 27 ---------------------- contracts/staking/Cargo.lock | 27 ---------------------- contracts/virus/Cargo.lock | 27 ---------------------- packages/vm/Cargo.toml | 1 - packages/vm/examples/module_size.sh | 1 - packages/vm/src/wasm_backend/gatekeeper.rs | 5 ++-- 15 files changed, 2 insertions(+), 329 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 30a9174ebd..79dc29ebae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -407,7 +407,6 @@ dependencies = [ "hex", "hex-literal", "leb128", - "loupe", "parity-wasm", "rand", "schemars", @@ -1133,26 +1132,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "loupe" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" -dependencies = [ - "loupe-derive", - "rustversion", -] - -[[package]] -name = "loupe-derive" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fbfc88337168279f2e9ae06e157cfed4efd3316e14dc96ed074d4f2e6c5952" -dependencies = [ - "quote", - "syn", -] - [[package]] name = "mach" version = "0.3.2" @@ -1581,12 +1560,6 @@ version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" -[[package]] -name = "rustversion" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f" - [[package]] name = "ryu" version = "1.0.9" diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 4e4077c65a..189bd2bb75 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -255,7 +255,6 @@ dependencies = [ "derivative", "enumset", "hex", - "loupe", "parity-wasm", "schemars", "serde", @@ -905,26 +904,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "loupe" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" -dependencies = [ - "loupe-derive", - "rustversion", -] - -[[package]] -name = "loupe-derive" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fbfc88337168279f2e9ae06e157cfed4efd3316e14dc96ed074d4f2e6c5952" -dependencies = [ - "quote", - "syn", -] - [[package]] name = "mach" version = "0.3.2" @@ -1245,12 +1224,6 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" -[[package]] -name = "rustversion" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" - [[package]] name = "ryu" version = "1.0.5" diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 3f8424a892..b476d30f71 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -252,7 +252,6 @@ dependencies = [ "derivative", "enumset", "hex", - "loupe", "parity-wasm", "schemars", "serde", @@ -931,26 +930,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "loupe" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" -dependencies = [ - "loupe-derive", - "rustversion", -] - -[[package]] -name = "loupe-derive" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fbfc88337168279f2e9ae06e157cfed4efd3316e14dc96ed074d4f2e6c5952" -dependencies = [ - "quote", - "syn", -] - [[package]] name = "mach" version = "0.3.2" @@ -1287,12 +1266,6 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" -[[package]] -name = "rustversion" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" - [[package]] name = "ryu" version = "1.0.5" diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index a84750ad07..0aef98730a 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -281,7 +281,6 @@ dependencies = [ "derivative", "enumset", "hex", - "loupe", "parity-wasm", "schemars", "serde", @@ -943,26 +942,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "loupe" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" -dependencies = [ - "loupe-derive", - "rustversion", -] - -[[package]] -name = "loupe-derive" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fbfc88337168279f2e9ae06e157cfed4efd3316e14dc96ed074d4f2e6c5952" -dependencies = [ - "quote", - "syn", -] - [[package]] name = "mach" version = "0.3.2" @@ -1295,12 +1274,6 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" -[[package]] -name = "rustversion" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" - [[package]] name = "ryu" version = "1.0.5" diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 15f8831f18..8d7cc679a7 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -252,7 +252,6 @@ dependencies = [ "derivative", "enumset", "hex", - "loupe", "parity-wasm", "schemars", "serde", @@ -915,26 +914,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "loupe" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" -dependencies = [ - "loupe-derive", - "rustversion", -] - -[[package]] -name = "loupe-derive" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fbfc88337168279f2e9ae06e157cfed4efd3316e14dc96ed074d4f2e6c5952" -dependencies = [ - "quote", - "syn", -] - [[package]] name = "mach" version = "0.3.2" @@ -1255,12 +1234,6 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" -[[package]] -name = "rustversion" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" - [[package]] name = "ryu" version = "1.0.5" diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index c3b8854d71..2f3fa1ce0f 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -252,7 +252,6 @@ dependencies = [ "derivative", "enumset", "hex", - "loupe", "parity-wasm", "schemars", "serde", @@ -916,26 +915,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "loupe" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" -dependencies = [ - "loupe-derive", - "rustversion", -] - -[[package]] -name = "loupe-derive" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fbfc88337168279f2e9ae06e157cfed4efd3316e14dc96ed074d4f2e6c5952" -dependencies = [ - "quote", - "syn", -] - [[package]] name = "mach" version = "0.3.2" @@ -1256,12 +1235,6 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" -[[package]] -name = "rustversion" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" - [[package]] name = "ryu" version = "1.0.5" diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 7d66bb0785..316a4b32a6 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -252,7 +252,6 @@ dependencies = [ "derivative", "enumset", "hex", - "loupe", "parity-wasm", "schemars", "serde", @@ -914,26 +913,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "loupe" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" -dependencies = [ - "loupe-derive", - "rustversion", -] - -[[package]] -name = "loupe-derive" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fbfc88337168279f2e9ae06e157cfed4efd3316e14dc96ed074d4f2e6c5952" -dependencies = [ - "quote", - "syn", -] - [[package]] name = "mach" version = "0.3.2" @@ -1254,12 +1233,6 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" -[[package]] -name = "rustversion" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" - [[package]] name = "ryu" version = "1.0.5" diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 6371d9fd96..d01ad76416 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -252,7 +252,6 @@ dependencies = [ "derivative", "enumset", "hex", - "loupe", "parity-wasm", "schemars", "serde", @@ -914,26 +913,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "loupe" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" -dependencies = [ - "loupe-derive", - "rustversion", -] - -[[package]] -name = "loupe-derive" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fbfc88337168279f2e9ae06e157cfed4efd3316e14dc96ed074d4f2e6c5952" -dependencies = [ - "quote", - "syn", -] - [[package]] name = "mach" version = "0.3.2" @@ -1254,12 +1233,6 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" -[[package]] -name = "rustversion" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" - [[package]] name = "ryu" version = "1.0.5" diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index a34cbc9b97..c13978bf2f 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -244,7 +244,6 @@ dependencies = [ "derivative", "enumset", "hex", - "loupe", "parity-wasm", "schemars", "serde", @@ -894,26 +893,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "loupe" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" -dependencies = [ - "loupe-derive", - "rustversion", -] - -[[package]] -name = "loupe-derive" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fbfc88337168279f2e9ae06e157cfed4efd3316e14dc96ed074d4f2e6c5952" -dependencies = [ - "quote", - "syn", -] - [[package]] name = "mach" version = "0.3.2" @@ -1245,12 +1224,6 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" -[[package]] -name = "rustversion" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" - [[package]] name = "ryu" version = "1.0.5" diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index b1382cc71e..50a19aea55 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -252,7 +252,6 @@ dependencies = [ "derivative", "enumset", "hex", - "loupe", "parity-wasm", "schemars", "serde", @@ -902,26 +901,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "loupe" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" -dependencies = [ - "loupe-derive", - "rustversion", -] - -[[package]] -name = "loupe-derive" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fbfc88337168279f2e9ae06e157cfed4efd3316e14dc96ed074d4f2e6c5952" -dependencies = [ - "quote", - "syn", -] - [[package]] name = "mach" version = "0.3.2" @@ -1255,12 +1234,6 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" -[[package]] -name = "rustversion" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" - [[package]] name = "ryu" version = "1.0.5" diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index d82a869441..2ad3fb3285 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -252,7 +252,6 @@ dependencies = [ "derivative", "enumset", "hex", - "loupe", "parity-wasm", "schemars", "serde", @@ -908,26 +907,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "loupe" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" -dependencies = [ - "loupe-derive", - "rustversion", -] - -[[package]] -name = "loupe-derive" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fbfc88337168279f2e9ae06e157cfed4efd3316e14dc96ed074d4f2e6c5952" -dependencies = [ - "quote", - "syn", -] - [[package]] name = "mach" version = "0.3.2" @@ -1248,12 +1227,6 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" -[[package]] -name = "rustversion" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" - [[package]] name = "ryu" version = "1.0.5" diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index dc7da0bb7f..d64906e0b3 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -244,7 +244,6 @@ dependencies = [ "derivative", "enumset", "hex", - "loupe", "parity-wasm", "schemars", "serde", @@ -894,26 +893,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "loupe" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" -dependencies = [ - "loupe-derive", - "rustversion", -] - -[[package]] -name = "loupe-derive" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fbfc88337168279f2e9ae06e157cfed4efd3316e14dc96ed074d4f2e6c5952" -dependencies = [ - "quote", - "syn", -] - [[package]] name = "mach" version = "0.3.2" @@ -1234,12 +1213,6 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" -[[package]] -name = "rustversion" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" - [[package]] name = "ryu" version = "1.0.5" diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 893f3dd1e7..759fd6abbd 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -51,7 +51,6 @@ sha2 = "0.10.3" thiserror = "1.0.26" wasmer = { version = "=3.2.1", default-features = false, features = ["cranelift", "singlepass"] } wasmer-middlewares = "=3.2.1" -loupe = "0.1.3" # Dependencies that we do not use ourself. We add those entries # to bump the min version of them. diff --git a/packages/vm/examples/module_size.sh b/packages/vm/examples/module_size.sh index 80ed757a42..acbab51a69 100755 --- a/packages/vm/examples/module_size.sh +++ b/packages/vm/examples/module_size.sh @@ -2,7 +2,6 @@ # Uses valgrind's massif tool to compute heap memory consumption of compiled modules. # For a wasmer `Modulej , it has been determined that this method underestimates the size # of the module significanty. -# Use loupe::size_of_val instead, to get a better estimation. set -e MAX_SNAPSHOTS=1000 diff --git a/packages/vm/src/wasm_backend/gatekeeper.rs b/packages/vm/src/wasm_backend/gatekeeper.rs index 5dab19fafe..abdd98d184 100644 --- a/packages/vm/src/wasm_backend/gatekeeper.rs +++ b/packages/vm/src/wasm_backend/gatekeeper.rs @@ -1,11 +1,10 @@ -use loupe::MemoryUsage; use wasmer::wasmparser::Operator; use wasmer::{ FunctionMiddleware, LocalFunctionIndex, MiddlewareError, MiddlewareReaderState, ModuleMiddleware, }; -#[derive(Debug, MemoryUsage, Clone, Copy)] +#[derive(Debug, Clone, Copy)] struct GatekeeperConfig { /// True iff float operations are allowed. /// @@ -39,7 +38,7 @@ struct GatekeeperConfig { /// A middleware that ensures only deterministic operations are used (i.e. no floats). /// It also disallows the use of Wasm features that are not explicitly enabled. -#[derive(Debug, MemoryUsage)] +#[derive(Debug)] #[non_exhaustive] pub struct Gatekeeper { config: GatekeeperConfig, From bea904fef5e3ceabe73da7405f9de93a8068e2fb Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 27 Apr 2023 13:14:22 +0200 Subject: [PATCH 0262/2372] Improve min Rust version from 1.60.0 to 1.62.0 in CI --- .circleci/config.yml | 144 +++++++++++++++++++-------------------- .github/workflows/ci.yml | 2 +- 2 files changed, 73 insertions(+), 73 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 05d72ae197..1c05bc9e8a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -72,7 +72,7 @@ workflows: matrix: parameters: # Run with MSRV and some modern stable Rust - rust-version: ["1.60.0", "1.68.2"] + rust-version: ["1.62.0", "1.68.2"] - benchmarking: requires: - package_vm @@ -117,7 +117,7 @@ jobs: command: | wget https://static.rust-lang.org/rustup/dist/aarch64-unknown-linux-gnu/rustup-init chmod +x rustup-init - ./rustup-init -y --default-toolchain 1.60.0 --profile minimal + ./rustup-init -y --default-toolchain 1.62.0 --profile minimal - run: name: Version information command: rustc --version; cargo --version; rustup --version; rustup target list --installed @@ -126,12 +126,12 @@ jobs: command: rustup target add wasm32-unknown-unknown && rustup target list --installed - restore_cache: keys: - - v4-arm64-workspace-rust:1.60.0-{{ checksum "Cargo.lock" }} - - v4-arm64-workspace-rust:1.60.0- + - v4-arm64-workspace-rust:1.62.0-{{ checksum "Cargo.lock" }} + - v4-arm64-workspace-rust:1.62.0- - restore_cache: keys: - - v4-arm64-contracts-rust:1.60.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} - - v4-arm64-contracts-rust:1.60.0- + - v4-arm64-contracts-rust:1.62.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} + - v4-arm64-contracts-rust:1.62.0- # Test a few contracts that do something potentially interesting in the VM # to test contract execution on ARM64. # No need to add all contracts here. @@ -169,14 +169,14 @@ jobs: # use all features command: cargo test --locked --features iterator,staking,stargate - save_cache: - key: v4-arm64-workspace-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: v4-arm64-workspace-rust:1.62.0-{{ checksum "Cargo.lock" }} paths: - ~/.cargo/registry - target/debug/.fingerprint - target/debug/build - target/debug/deps - save_cache: - key: v4-arm64-contracts-rust:1.60.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} + key: v4-arm64-contracts-rust:1.62.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} paths: - ~/.cargo/registry # crypto-verify @@ -217,7 +217,7 @@ jobs: package_crypto: docker: - - image: rust:1.60.0 + - image: rust:1.62.0 steps: - checkout - run: @@ -225,7 +225,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_crypto-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_crypto-rust:1.62.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/crypto @@ -240,11 +240,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_crypto-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_crypto-rust:1.62.0-{{ checksum "Cargo.lock" }} package_check: docker: - - image: rust:1.60.0 + - image: rust:1.62.0 steps: - checkout - run: @@ -252,7 +252,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_check-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_check-rust:1.62.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/check @@ -267,11 +267,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_check-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_check-rust:1.62.0-{{ checksum "Cargo.lock" }} package_schema: docker: - - image: rust:1.60.0 + - image: rust:1.62.0 steps: - checkout - run: @@ -279,7 +279,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_schema-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_schema-rust:1.62.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/schema @@ -294,11 +294,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_schema-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_schema-rust:1.62.0-{{ checksum "Cargo.lock" }} package_schema_derive: docker: - - image: rust:1.60.0 + - image: rust:1.62.0 steps: - checkout - run: @@ -306,7 +306,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_schema_derive-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_schema_derive-rust:1.62.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/schema-derive @@ -321,11 +321,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_schema_derive-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_schema_derive-rust:1.62.0-{{ checksum "Cargo.lock" }} package_std: docker: - - image: rust:1.60.0 + - image: rust:1.62.0 environment: # Limit the number of parallel jobs to avoid OOM crashes during doc testing RUST_TEST_THREADS: 8 @@ -336,7 +336,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_std-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_std-rust:1.62.0-{{ checksum "Cargo.lock" }} - run: name: Add wasm32 target command: rustup target add wasm32-unknown-unknown && rustup target list --installed @@ -370,11 +370,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_std-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_std-rust:1.62.0-{{ checksum "Cargo.lock" }} package_storage: docker: - - image: rust:1.60.0 + - image: rust:1.62.0 steps: - checkout - run: @@ -382,7 +382,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_storage-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_storage-rust:1.62.0-{{ checksum "Cargo.lock" }} - run: name: Build library for native target working_directory: ~/project/packages/storage @@ -401,11 +401,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_storage-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_storage-rust:1.62.0-{{ checksum "Cargo.lock" }} package_vm: docker: - - image: rust:1.60.0 + - image: rust:1.62.0 steps: - checkout - run: @@ -413,7 +413,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_vm-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_vm-rust:1.62.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/vm @@ -442,7 +442,7 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_vm-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_vm-rust:1.62.0-{{ checksum "Cargo.lock" }} package_vm_windows: executor: @@ -490,7 +490,7 @@ jobs: contract_burner: docker: - - image: rust:1.60.0 + - image: rust:1.62.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/burner @@ -502,7 +502,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_burner-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_burner-rust:1.62.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -513,11 +513,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_burner-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_burner-rust:1.62.0-{{ checksum "Cargo.lock" }} contract_crypto_verify: docker: - - image: rust:1.60.0 + - image: rust:1.62.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/crypto-verify @@ -529,7 +529,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_crypto_verify-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_crypto_verify-rust:1.62.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -540,11 +540,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_crypto_verify-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_crypto_verify-rust:1.62.0-{{ checksum "Cargo.lock" }} contract_cyberpunk: docker: - - image: rust:1.60.0 + - image: rust:1.62.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/cyberpunk @@ -556,7 +556,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_cyberpunk-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_cyberpunk-rust:1.62.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -567,11 +567,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_cyberpunk-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_cyberpunk-rust:1.62.0-{{ checksum "Cargo.lock" }} contract_hackatom: docker: - - image: rust:1.60.0 + - image: rust:1.62.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/hackatom @@ -583,7 +583,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_hackatom-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_hackatom-rust:1.62.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -594,11 +594,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_hackatom-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_hackatom-rust:1.62.0-{{ checksum "Cargo.lock" }} contract_ibc_reflect: docker: - - image: rust:1.60.0 + - image: rust:1.62.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/ibc-reflect @@ -610,7 +610,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_ibc_reflect-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_ibc_reflect-rust:1.62.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -621,11 +621,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_ibc_reflect-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_ibc_reflect-rust:1.62.0-{{ checksum "Cargo.lock" }} contract_ibc_reflect_send: docker: - - image: rust:1.60.0 + - image: rust:1.62.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/ibc-reflect-send @@ -637,7 +637,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_ibc_reflect_send-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_ibc_reflect_send-rust:1.62.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -648,11 +648,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_ibc_reflect_send-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_ibc_reflect_send-rust:1.62.0-{{ checksum "Cargo.lock" }} contract_floaty: docker: - - image: rust:1.60.0 + - image: rust:1.62.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/floaty @@ -664,7 +664,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_floaty-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_floaty-rust:1.62.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -675,11 +675,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_floaty-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_floaty-rust:1.62.0-{{ checksum "Cargo.lock" }} contract_queue: docker: - - image: rust:1.60.0 + - image: rust:1.62.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/queue @@ -691,7 +691,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_queue-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_queue-rust:1.62.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -702,11 +702,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_queue-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_queue-rust:1.62.0-{{ checksum "Cargo.lock" }} contract_reflect: docker: - - image: rust:1.60.0 + - image: rust:1.62.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/reflect @@ -718,7 +718,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_reflect-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_reflect-rust:1.62.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -729,11 +729,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_reflect-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_reflect-rust:1.62.0-{{ checksum "Cargo.lock" }} contract_staking: docker: - - image: rust:1.60.0 + - image: rust:1.62.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/staking @@ -745,7 +745,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_staking-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_staking-rust:1.62.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -756,11 +756,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_staking-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_staking-rust:1.62.0-{{ checksum "Cargo.lock" }} contract_virus: docker: - - image: rust:1.60.0 + - image: rust:1.62.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/virus @@ -772,7 +772,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_virus-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_virus-rust:1.62.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -783,11 +783,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_virus-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_virus-rust:1.62.0-{{ checksum "Cargo.lock" }} fmt: docker: - - image: rust:1.60.0 + - image: rust:1.62.0 steps: - checkout - run: @@ -795,7 +795,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-fmt-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-fmt-rust:1.62.0-{{ checksum "Cargo.lock" }} - run: name: Add rustfmt component command: rustup component add rustfmt @@ -808,7 +808,7 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-fmt-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-fmt-rust:1.62.0-{{ checksum "Cargo.lock" }} fmt_extra: docker: @@ -830,7 +830,7 @@ jobs: deadlinks: docker: - - image: rust:1.60.0 + - image: rust:1.62.0 steps: - checkout - run: @@ -838,7 +838,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-deadlinks-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-deadlinks-rust:1.62.0-{{ checksum "Cargo.lock" }} - run: name: Generate docs command: cargo doc @@ -858,7 +858,7 @@ jobs: - target/debug/build - target/debug/deps - /root/.cache/pip - key: cargocache-v2-deadlinks-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-deadlinks-rust:1.62.0-{{ checksum "Cargo.lock" }} clippy: parameters: @@ -934,7 +934,7 @@ jobs: benchmarking: docker: - - image: rust:1.60.0 + - image: rust:1.62.0 environment: RUST_BACKTRACE: 1 steps: @@ -944,7 +944,7 @@ jobs: command: rustc --version && cargo --version - restore_cache: keys: - - cargocache-v2-benchmarking-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-benchmarking-rust:1.62.0-{{ checksum "Cargo.lock" }} - run: name: Run vm benchmarks (Singlepass) working_directory: ~/project/packages/vm @@ -962,7 +962,7 @@ jobs: - target/release/.fingerprint - target/release/build - target/release/deps - key: cargocache-v2-benchmarking-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-benchmarking-rust:1.62.0-{{ checksum "Cargo.lock" }} coverage: # https://circleci.com/developer/images?imageType=machine @@ -1034,7 +1034,7 @@ jobs: name: Check development contracts command: | echo "Checking all contracts under ./artifacts" - docker run --volumes-from with_code rust:1.60.0 \ + docker run --volumes-from with_code rust:1.62.0 \ /bin/bash -e -c 'export GLOBIGNORE="artifacts/floaty.wasm"; cd ./code; cargo run --bin cosmwasm-check artifacts/*.wasm' docker cp with_code:/code/artifacts . - run: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1d50ccbda5..95b5550302 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,7 +33,7 @@ jobs: - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: 1.60.0 + toolchain: 1.62.0 target: wasm32-unknown-unknown profile: minimal override: true From 2d3a2488a9df63628080cb6d4aa82d4f3b76956c Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 27 Apr 2023 13:32:51 +0200 Subject: [PATCH 0263/2372] Remove explicit generic arguments from write_to_contract --- packages/vm/src/imports.rs | 42 +++++++++++++++----------------------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 821212c647..8485bc8715 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -83,7 +83,7 @@ pub fn do_db_read data, None => return Ok(0), }; - write_to_contract::(data, &mut store, &out_data) + write_to_contract(data, &mut store, &out_data) } /// Writes a storage entry from Wasm memory into the VM's storage @@ -141,14 +141,12 @@ pub fn do_addr_validate(data, &mut store, b"Input is empty"); + return write_to_contract(data, &mut store, b"Input is empty"); } let source_string = match String::from_utf8(source_data) { Ok(s) => s, - Err(_) => { - return write_to_contract::(data, &mut store, b"Input is not valid UTF-8") - } + Err(_) => return write_to_contract(data, &mut store, b"Input is not valid UTF-8"), }; let (result, gas_info) = data.api.canonical_address(&source_string); @@ -156,7 +154,7 @@ pub fn do_addr_validate data, Err(BackendError::UserErr { msg, .. }) => { - return write_to_contract::(data, &mut store, msg.as_bytes()) + return write_to_contract(data, &mut store, msg.as_bytes()) } Err(err) => return Err(VmError::from(err)), }; @@ -166,13 +164,13 @@ pub fn do_addr_validate addr, Err(BackendError::UserErr { msg, .. }) => { - return write_to_contract::(data, &mut store, msg.as_bytes()) + return write_to_contract(data, &mut store, msg.as_bytes()) } Err(err) => return Err(VmError::from(err)), }; if normalized != source_string { - return write_to_contract::(data, &mut store, b"Address is not normalized"); + return write_to_contract(data, &mut store, b"Address is not normalized"); } Ok(0) @@ -191,14 +189,12 @@ pub fn do_addr_canonicalize(data, &mut store, b"Input is empty"); + return write_to_contract(data, &mut store, b"Input is empty"); } let source_string = match String::from_utf8(source_data) { Ok(s) => s, - Err(_) => { - return write_to_contract::(data, &mut store, b"Input is not valid UTF-8") - } + Err(_) => return write_to_contract(data, &mut store, b"Input is not valid UTF-8"), }; let (result, gas_info) = data.api.canonical_address(&source_string); @@ -212,11 +208,9 @@ pub fn do_addr_canonicalize Ok(write_to_contract::( - data, - &mut store, - msg.as_bytes(), - )?), + Err(BackendError::UserErr { msg, .. }) => { + Ok(write_to_contract(data, &mut store, msg.as_bytes())?) + } Err(err) => Err(VmError::from(err)), } } @@ -241,11 +235,9 @@ pub fn do_addr_humanize Ok(write_to_contract::( - data, - &mut store, - msg.as_bytes(), - )?), + Err(BackendError::UserErr { msg, .. }) => { + Ok(write_to_contract(data, &mut store, msg.as_bytes())?) + } Err(err) => Err(VmError::from(err)), } } @@ -316,7 +308,7 @@ pub fn do_secp256k1_recover_pubkey< let result = secp256k1_recover_pubkey(&hash, &signature, recover_param); match result { Ok(pubkey) => { - let pubkey_ptr = write_to_contract::(data, &mut store, pubkey.as_ref())?; + let pubkey_ptr = write_to_contract(data, &mut store, pubkey.as_ref())?; Ok(to_low_half(pubkey_ptr)) } Err(err) => match err { @@ -496,7 +488,7 @@ pub fn do_query_chain(data, &mut store, &serialized) + write_to_contract(data, &mut store, &serialized) } #[cfg(feature = "iterator")] @@ -538,7 +530,7 @@ pub fn do_db_next::new(), Vec::::new())); let out_data = encode_sections(&[key, value])?; - write_to_contract::(data, &mut store, &out_data) + write_to_contract(data, &mut store, &out_data) } /// Creates a Region in the contract, writes the given data to it and returns the memory location From e65df15b98bda84907cd2bad101129dc3535fca7 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 27 Apr 2023 13:40:09 +0200 Subject: [PATCH 0264/2372] Fix clippy warnings --- packages/vm/src/instance.rs | 1 + packages/vm/src/wasm_backend/store.rs | 16 ++++++++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 13cea870a5..40785a8682 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -85,6 +85,7 @@ where ) } + #[allow(clippy::too_many_arguments)] pub(crate) fn from_module( mut store: Store, module: &Module, diff --git a/packages/vm/src/wasm_backend/store.rs b/packages/vm/src/wasm_backend/store.rs index 23b510ede8..c54831bf93 100644 --- a/packages/vm/src/wasm_backend/store.rs +++ b/packages/vm/src/wasm_backend/store.rs @@ -140,8 +140,8 @@ mod tests { .map(|pair| pair.1.clone()) .next() .unwrap(); - assert_eq!(instance_memory.ty(&mut store).minimum, Pages(4)); - assert_eq!(instance_memory.ty(&mut store).maximum, None); + assert_eq!(instance_memory.ty(&store).minimum, Pages(4)); + assert_eq!(instance_memory.ty(&store).maximum, None); // Set limit let mut store = make_compile_time_store(Some(Size::kibi(23 * 64)), &[]); @@ -157,8 +157,8 @@ mod tests { .map(|pair| pair.1.clone()) .next() .unwrap(); - assert_eq!(instance_memory.ty(&mut store).minimum, Pages(4)); - assert_eq!(instance_memory.ty(&mut store).maximum, Some(Pages(23))); + assert_eq!(instance_memory.ty(&store).minimum, Pages(4)); + assert_eq!(instance_memory.ty(&store).maximum, Some(Pages(23))); } #[test] @@ -185,8 +185,8 @@ mod tests { .map(|pair| pair.1.clone()) .next() .unwrap(); - assert_eq!(instance_memory.ty(&mut store).minimum, Pages(4)); - assert_eq!(instance_memory.ty(&mut store).maximum, None); + assert_eq!(instance_memory.ty(&store).minimum, Pages(4)); + assert_eq!(instance_memory.ty(&store).maximum, None); // Instantiate with limit let mut store = make_runtime_store(Some(Size::kibi(23 * 64))); @@ -202,7 +202,7 @@ mod tests { .map(|pair| pair.1.clone()) .next() .unwrap(); - assert_eq!(instance_memory.ty(&mut store).minimum, Pages(4)); - assert_eq!(instance_memory.ty(&mut store).maximum, Some(Pages(23))); + assert_eq!(instance_memory.ty(&store).minimum, Pages(4)); + assert_eq!(instance_memory.ty(&store).maximum, Some(Pages(23))); } } From 63614903c9c504cb199aeea7c4a334143f6f3a52 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 27 Apr 2023 13:40:37 +0200 Subject: [PATCH 0265/2372] Make from_pinned_cache private --- packages/vm/src/instance.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 40785a8682..a8007d5177 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -55,7 +55,7 @@ pub struct Instance { _inner: Box, fe: FunctionEnv>, store: Store, - pub from_pinned_cache: bool, + from_pinned_cache: bool, } impl Instance From 4a0d28990a01f74c3b619db6a508336360db781a Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 27 Apr 2023 13:53:43 +0200 Subject: [PATCH 0266/2372] Return instances in multithread test --- packages/vm/examples/multi_threaded_cache.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/vm/examples/multi_threaded_cache.rs b/packages/vm/examples/multi_threaded_cache.rs index 16053ee920..4c9c1914c4 100644 --- a/packages/vm/examples/multi_threaded_cache.rs +++ b/packages/vm/examples/multi_threaded_cache.rs @@ -68,6 +68,9 @@ pub fn main() { let contract_result = call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); assert!(contract_result.into_result().is_ok()); + + let (cached, pinned, ..) = instance.recycle(); + cache.return_instance(&checksum, cached, pinned).unwrap(); })); } From 647b7be86b73e1990ba4c51aca398a5b74f93739 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 4 May 2023 12:24:42 +0200 Subject: [PATCH 0267/2372] Fix manual range implementation --- contracts/ibc-reflect-send/src/state.rs | 11 +++++------ contracts/ibc-reflect/src/contract.rs | 2 +- contracts/ibc-reflect/src/state.rs | 11 +++++------ contracts/ibc-reflect/tests/integration.rs | 2 +- 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/contracts/ibc-reflect-send/src/state.rs b/contracts/ibc-reflect-send/src/state.rs index ab7960463d..92110c697a 100644 --- a/contracts/ibc-reflect-send/src/state.rs +++ b/contracts/ibc-reflect-send/src/state.rs @@ -1,3 +1,4 @@ +use cosmwasm_storage::to_length_prefixed; use serde::{Deserialize, Serialize}; use cosmwasm_std::{ @@ -55,15 +56,13 @@ pub fn remove_account(storage: &mut dyn Storage, id: &str) { pub fn range_accounts( storage: &dyn Storage, ) -> impl Iterator> + '_ { + let prefix = to_length_prefixed(PREFIX_ACCOUNTS); + let upper_bound = to_length_prefixed(PREFIX_ACCOUNTS_UPPER_BOUND); storage - .range( - Some(PREFIX_ACCOUNTS), - Some(PREFIX_ACCOUNTS_UPPER_BOUND), - Order::Ascending, - ) + .range(Some(&prefix), Some(&upper_bound), Order::Ascending) .map(|(key, val)| { Ok(( - String::from_utf8(key[PREFIX_ACCOUNTS.len()..].to_vec())?, + String::from_utf8(key[PREFIX_ACCOUNTS.len() + 2..].to_vec())?, from_slice(&val)?, )) }) diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 0e3e3673b7..a2c9117c55 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -529,7 +529,7 @@ mod tests { let ack: AcknowledgementMsg = from_slice(&res.acknowledgement).unwrap(); assert_eq!( ack.unwrap_err(), - "invalid packet: cosmwasm_std::addresses::Addr not found" + "invalid packet: account channel-123 not found" ); // register the channel diff --git a/contracts/ibc-reflect/src/state.rs b/contracts/ibc-reflect/src/state.rs index 71d22827a7..86802d7a4e 100644 --- a/contracts/ibc-reflect/src/state.rs +++ b/contracts/ibc-reflect/src/state.rs @@ -3,6 +3,7 @@ use std::any::type_name; use cosmwasm_std::{ from_slice, storage_keys::namespace_with_key, to_vec, Addr, Order, StdError, StdResult, Storage, }; +use cosmwasm_storage::to_length_prefixed; use schemars::JsonSchema; use serde::{de::DeserializeOwned, Deserialize, Serialize}; @@ -43,15 +44,13 @@ pub fn remove_account(storage: &mut dyn Storage, id: &str) { pub fn range_accounts( storage: &dyn Storage, ) -> impl Iterator> + '_ { + let prefix = to_length_prefixed(PREFIX_ACCOUNTS); + let upper_bound = to_length_prefixed(PREFIX_ACCOUNTS_UPPER_BOUND); storage - .range( - Some(PREFIX_ACCOUNTS), - Some(PREFIX_ACCOUNTS_UPPER_BOUND), - Order::Ascending, - ) + .range(Some(&prefix), Some(&upper_bound), Order::Ascending) .map(|(key, val)| { Ok(( - String::from_utf8(key[PREFIX_ACCOUNTS.len()..].to_vec())?, + String::from_utf8(key[PREFIX_ACCOUNTS.len() + 2..].to_vec())?, from_slice(&val)?, )) }) diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index d28e3369a4..edeb91e989 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -236,7 +236,7 @@ fn handle_dispatch_packet() { from_slice(&res.acknowledgement, DESERIALIZATION_LIMIT).unwrap(); assert_eq!( ack.unwrap_err(), - "invalid packet: cosmwasm_std::addresses::Addr not found" + "invalid packet: account channel-123 not found" ); // register the channel From 7ed67400de819d67363f803f5cd8f4f2d88376b5 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 4 May 2023 13:48:57 +0200 Subject: [PATCH 0268/2372] Use length-prefixing for contract keys --- contracts/ibc-reflect-send/src/state.rs | 4 ++-- contracts/ibc-reflect/src/state.rs | 4 ++-- contracts/reflect/src/state.rs | 8 +++++--- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/contracts/ibc-reflect-send/src/state.rs b/contracts/ibc-reflect-send/src/state.rs index 92110c697a..a04e815dc9 100644 --- a/contracts/ibc-reflect-send/src/state.rs +++ b/contracts/ibc-reflect-send/src/state.rs @@ -70,12 +70,12 @@ pub fn range_accounts( pub fn load_config(storage: &dyn Storage) -> StdResult { storage - .get(KEY_CONFIG) + .get(&to_length_prefixed(KEY_CONFIG)) .ok_or_else(|| StdError::not_found("config")) .and_then(|v| from_slice(&v)) } pub fn save_config(storage: &mut dyn Storage, item: &Config) -> StdResult<()> { - storage.set(KEY_CONFIG, &to_vec(item)?); + storage.set(&to_length_prefixed(KEY_CONFIG), &to_vec(item)?); Ok(()) } diff --git a/contracts/ibc-reflect/src/state.rs b/contracts/ibc-reflect/src/state.rs index 86802d7a4e..491ac1c638 100644 --- a/contracts/ibc-reflect/src/state.rs +++ b/contracts/ibc-reflect/src/state.rs @@ -58,12 +58,12 @@ pub fn range_accounts( pub fn load_item(storage: &dyn Storage, key: &[u8]) -> StdResult { storage - .get(key) + .get(&to_length_prefixed(key)) .ok_or_else(|| StdError::not_found(type_name::())) .and_then(|v| from_slice(&v)) } pub fn save_item(storage: &mut dyn Storage, key: &[u8], item: &T) -> StdResult<()> { - storage.set(key, &to_vec(item)?); + storage.set(&to_length_prefixed(key), &to_vec(item)?); Ok(()) } diff --git a/contracts/reflect/src/state.rs b/contracts/reflect/src/state.rs index df39f4ed58..428a451df9 100644 --- a/contracts/reflect/src/state.rs +++ b/contracts/reflect/src/state.rs @@ -2,7 +2,9 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use cosmwasm_std::{ - from_slice, storage_keys::namespace_with_key, to_vec, Addr, Reply, StdError, StdResult, Storage, + from_slice, + storage_keys::{namespace_with_key, to_length_prefixed}, + to_vec, Addr, Reply, StdError, StdResult, Storage, }; const CONFIG_KEY: &[u8] = b"config"; @@ -34,12 +36,12 @@ pub fn remove_reply(storage: &mut dyn Storage, id: u64) { pub fn load_config(storage: &dyn Storage) -> StdResult { storage - .get(CONFIG_KEY) + .get(&to_length_prefixed(CONFIG_KEY)) .ok_or_else(|| StdError::not_found("config")) .and_then(|v| from_slice(&v)) } pub fn save_config(storage: &mut dyn Storage, item: &State) -> StdResult<()> { - storage.set(CONFIG_KEY, &to_vec(item)?); + storage.set(&to_length_prefixed(CONFIG_KEY), &to_vec(item)?); Ok(()) } From 336ce91197738c0fb3bed12fa8345abc1667681c Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 4 May 2023 13:49:25 +0200 Subject: [PATCH 0269/2372] Handle storage manually for staking contract --- contracts/staking/src/contract.rs | 110 +++++++++++++++--------------- contracts/staking/src/state.rs | 80 ++++++++++++---------- 2 files changed, 99 insertions(+), 91 deletions(-) diff --git a/contracts/staking/src/contract.rs b/contracts/staking/src/contract.rs index 5582652090..456fdb6c9d 100644 --- a/contracts/staking/src/contract.rs +++ b/contracts/staking/src/contract.rs @@ -10,8 +10,8 @@ use crate::msg::{ TokenInfoResponse, }; use crate::state::{ - balances, balances_read, claims, claims_read, invest_info, invest_info_read, token_info, - token_info_read, total_supply, total_supply_read, InvestmentInfo, Supply, TokenInfo, + load_item, may_load_map, save_item, save_map, update_item, InvestmentInfo, Supply, TokenInfo, + KEY_INVESTMENT, KEY_TOKEN_INFO, KEY_TOTAL_SUPPLY, PREFIX_BALANCE, PREFIX_CLAIMS, }; const FALLBACK_RATIO: Decimal = Decimal::one(); @@ -37,7 +37,7 @@ pub fn instantiate( symbol: msg.symbol, decimals: msg.decimals, }; - token_info(deps.storage).save(&token)?; + save_item(deps.storage, KEY_TOKEN_INFO, &token)?; let denom = deps.querier.query_bonded_denom()?; let invest = InvestmentInfo { @@ -47,11 +47,11 @@ pub fn instantiate( validator: msg.validator, min_withdrawal: msg.min_withdrawal, }; - invest_info(deps.storage).save(&invest)?; + save_item(deps.storage, KEY_INVESTMENT, &invest)?; // set supply to 0 let supply = Supply::default(); - total_supply(deps.storage).save(&supply)?; + save_item(deps.storage, KEY_TOTAL_SUPPLY, &supply)?; Ok(Response::default()) } @@ -85,13 +85,15 @@ pub fn transfer( let rcpt_raw = deps.api.addr_canonicalize(&recipient)?; let sender_raw = deps.api.addr_canonicalize(info.sender.as_str())?; - let mut accounts = balances(deps.storage); - accounts.update(&sender_raw, |balance: Option| -> StdResult<_> { - Ok(balance.unwrap_or_default().checked_sub(send)?) - })?; - accounts.update(&rcpt_raw, |balance: Option| -> StdResult<_> { - Ok(balance.unwrap_or_default() + send) - })?; + let balance = may_load_map(deps.storage, PREFIX_BALANCE, &sender_raw)?.unwrap_or_default(); + save_map( + deps.storage, + PREFIX_BALANCE, + &sender_raw, + balance.checked_sub(send)?, + )?; + let balance = may_load_map(deps.storage, PREFIX_BALANCE, &rcpt_raw)?.unwrap_or_default(); + save_map(deps.storage, PREFIX_BALANCE, &rcpt_raw, balance + send)?; let res = Response::new() .add_attribute("action", "transfer") @@ -137,7 +139,7 @@ pub fn bond(deps: DepsMut, env: Env, info: MessageInfo) -> StdResult { let sender_raw = deps.api.addr_canonicalize(info.sender.as_str())?; // ensure we have the proper denom - let invest = invest_info_read(deps.storage).load()?; + let invest: InvestmentInfo = load_item(deps.storage, KEY_INVESTMENT)?; // payment finds the proper coin (or throws an error) let payment = info .funds @@ -149,8 +151,7 @@ pub fn bond(deps: DepsMut, env: Env, info: MessageInfo) -> StdResult { let bonded = get_bonded(&deps.querier, env.contract.address)?; // calculate to_mint and update total supply - let mut totals = total_supply(deps.storage); - let mut supply = totals.load()?; + let mut supply: Supply = load_item(deps.storage, KEY_TOTAL_SUPPLY)?; // TODO: this is just temporary check - we should use dynamic query or have a way to recover assert_bonds(&supply, bonded)?; let to_mint = if supply.issued.is_zero() || bonded.is_zero() { @@ -160,12 +161,11 @@ pub fn bond(deps: DepsMut, env: Env, info: MessageInfo) -> StdResult { }; supply.bonded = bonded + payment.amount; supply.issued += to_mint; - totals.save(&supply)?; + save_item(deps.storage, KEY_TOTAL_SUPPLY, &supply)?; // update the balance of the sender - balances(deps.storage).update(&sender_raw, |balance| -> StdResult<_> { - Ok(balance.unwrap_or_default() + to_mint) - })?; + let balance = may_load_map(deps.storage, PREFIX_BALANCE, &sender_raw)?.unwrap_or_default(); + save_map(deps.storage, PREFIX_BALANCE, &sender_raw, balance + to_mint)?; // bond them to the validator let res = Response::new() @@ -181,7 +181,7 @@ pub fn bond(deps: DepsMut, env: Env, info: MessageInfo) -> StdResult { } pub fn unbond(deps: DepsMut, env: Env, info: MessageInfo, amount: Uint128) -> StdResult { - let invest = invest_info_read(deps.storage).load()?; + let invest: InvestmentInfo = load_item(deps.storage, KEY_INVESTMENT)?; // ensure it is big enough to care if amount < invest.min_withdrawal { return Err(StdError::generic_err(format!( @@ -197,15 +197,17 @@ pub fn unbond(deps: DepsMut, env: Env, info: MessageInfo, amount: Uint128) -> St let tax = amount * invest.exit_tax; // deduct all from the account - let mut accounts = balances(deps.storage); - accounts.update(&sender_raw, |balance| -> StdResult<_> { - Ok(balance.unwrap_or_default().checked_sub(amount)?) - })?; + let balance = may_load_map(deps.storage, PREFIX_BALANCE, &sender_raw)?.unwrap_or_default(); + save_map( + deps.storage, + PREFIX_BALANCE, + &sender_raw, + balance.checked_sub(amount)?, + )?; if tax > Uint128::new(0) { // add tax to the owner - accounts.update(&owner_raw, |balance: Option| -> StdResult<_> { - Ok(balance.unwrap_or_default() + tax) - })?; + let balance = may_load_map(deps.storage, PREFIX_BALANCE, &owner_raw)?.unwrap_or_default(); + save_map(deps.storage, PREFIX_BALANCE, &owner_raw, balance + tax)?; } // re-calculate bonded to ensure we have real values @@ -214,20 +216,18 @@ pub fn unbond(deps: DepsMut, env: Env, info: MessageInfo, amount: Uint128) -> St // calculate how many native tokens this is worth and update supply let remainder = amount.checked_sub(tax)?; - let mut totals = total_supply(deps.storage); - let mut supply = totals.load()?; + let mut supply: Supply = load_item(deps.storage, KEY_TOTAL_SUPPLY)?; // TODO: this is just temporary check - we should use dynamic query or have a way to recover assert_bonds(&supply, bonded)?; let unbond = remainder.multiply_ratio(bonded, supply.issued); supply.bonded = bonded.checked_sub(unbond)?; supply.issued = supply.issued.checked_sub(remainder)?; supply.claims += unbond; - totals.save(&supply)?; + save_item(deps.storage, KEY_TOTAL_SUPPLY, &supply)?; // add a claim to this user to get their tokens after the unbonding period - claims(deps.storage).update(&sender_raw, |claim| -> StdResult<_> { - Ok(claim.unwrap_or_default() + unbond) - })?; + let claim = may_load_map(deps.storage, PREFIX_CLAIMS, &sender_raw)?.unwrap_or_default(); + save_map(deps.storage, PREFIX_CLAIMS, &sender_raw, claim + unbond)?; // unbond them let res = Response::new() @@ -244,7 +244,7 @@ pub fn unbond(deps: DepsMut, env: Env, info: MessageInfo, amount: Uint128) -> St pub fn claim(deps: DepsMut, env: Env, info: MessageInfo) -> StdResult { // find how many tokens the contract has - let invest = invest_info_read(deps.storage).load()?; + let invest: InvestmentInfo = load_item(deps.storage, KEY_INVESTMENT)?; let mut balance = deps .querier .query_balance(env.contract.address, invest.bond_denom)?; @@ -256,18 +256,20 @@ pub fn claim(deps: DepsMut, env: Env, info: MessageInfo) -> StdResult // check how much to send - min(balance, claims[sender]), and reduce the claim let sender_raw = deps.api.addr_canonicalize(info.sender.as_str())?; - let mut to_send = balance.amount; - claims(deps.storage).update(sender_raw.as_slice(), |claim| -> StdResult<_> { - let claim = claim.ok_or_else(|| StdError::generic_err("no claim for this address"))?; - to_send = to_send.min(claim); - Ok(claim.checked_sub(to_send)?) - })?; + let claim = may_load_map(deps.storage, PREFIX_CLAIMS, &sender_raw)? + .ok_or_else(|| StdError::generic_err("no claim for this address"))?; + let to_send = balance.amount.min(claim); + save_map( + deps.storage, + PREFIX_CLAIMS, + &sender_raw, + claim.checked_sub(to_send)?, + )?; // update total supply (lower claim) - total_supply(deps.storage).update(|mut supply| -> StdResult<_> { - supply.claims = supply.claims.checked_sub(to_send)?; - Ok(supply) - })?; + let mut supply: Supply = load_item(deps.storage, KEY_TOTAL_SUPPLY)?; + supply.claims = supply.claims.checked_sub(to_send)?; + save_item(deps.storage, KEY_TOTAL_SUPPLY, &supply)?; // transfer tokens to the sender balance.amount = to_send; @@ -287,7 +289,7 @@ pub fn claim(deps: DepsMut, env: Env, info: MessageInfo) -> StdResult /// to reinvest the new earnings (and anything else that accumulated) pub fn reinvest(deps: DepsMut, env: Env, _info: MessageInfo) -> StdResult { let contract_addr = env.contract.address; - let invest = invest_info_read(deps.storage).load()?; + let invest: InvestmentInfo = load_item(deps.storage, KEY_INVESTMENT)?; let msg = to_binary(&ExecuteMsg::_BondAllTokens {})?; // and bond them to the validator @@ -314,14 +316,14 @@ pub fn _bond_all_tokens( } // find how many tokens we have to bond - let invest = invest_info_read(deps.storage).load()?; + let invest: InvestmentInfo = load_item(deps.storage, KEY_INVESTMENT)?; let mut balance = deps .querier .query_balance(env.contract.address, &invest.bond_denom)?; // we deduct pending claims from our account balance before reinvesting. // if there is not enough funds, we just return a no-op - match total_supply(deps.storage).update(|mut supply| { + match update_item(deps.storage, KEY_TOTAL_SUPPLY, |mut supply: Supply| { balance.amount = balance.amount.checked_sub(supply.claims)?; // this just triggers the "no op" case if we don't have min_withdrawal left to reinvest balance.amount.checked_sub(invest.min_withdrawal)?; @@ -360,7 +362,7 @@ pub fn query_token_info(deps: Deps) -> StdResult { name, symbol, decimals, - } = token_info_read(deps.storage).load()?; + } = load_item(deps.storage, KEY_TOKEN_INFO)?; Ok(TokenInfoResponse { name, @@ -371,23 +373,19 @@ pub fn query_token_info(deps: Deps) -> StdResult { pub fn query_balance(deps: Deps, address: &str) -> StdResult { let address_raw = deps.api.addr_canonicalize(address)?; - let balance = balances_read(deps.storage) - .may_load(address_raw.as_slice())? - .unwrap_or_default(); + let balance = may_load_map(deps.storage, PREFIX_BALANCE, &address_raw)?.unwrap_or_default(); Ok(BalanceResponse { balance }) } pub fn query_claims(deps: Deps, address: &str) -> StdResult { let address_raw = deps.api.addr_canonicalize(address)?; - let claims = claims_read(deps.storage) - .may_load(address_raw.as_slice())? - .unwrap_or_default(); + let claims = may_load_map(deps.storage, PREFIX_CLAIMS, &address_raw)?.unwrap_or_default(); Ok(ClaimsResponse { claims }) } pub fn query_investment(deps: Deps) -> StdResult { - let invest = invest_info_read(deps.storage).load()?; - let supply = total_supply_read(deps.storage).load()?; + let invest: InvestmentInfo = load_item(deps.storage, KEY_INVESTMENT)?; + let supply: Supply = load_item(deps.storage, KEY_TOTAL_SUPPLY)?; let res = InvestmentResponse { owner: invest.owner.into(), diff --git a/contracts/staking/src/state.rs b/contracts/staking/src/state.rs index 99a9f3b9dc..0b99fe75c6 100644 --- a/contracts/staking/src/state.rs +++ b/contracts/staking/src/state.rs @@ -1,10 +1,12 @@ +use std::any::type_name; + use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; +use serde::{de::DeserializeOwned, Deserialize, Serialize}; -use cosmwasm_std::{Addr, Decimal, Storage, Uint128}; -use cosmwasm_storage::{ - bucket, bucket_read, singleton, singleton_read, Bucket, ReadonlyBucket, ReadonlySingleton, - Singleton, +use cosmwasm_std::{ + from_slice, + storage_keys::{namespace_with_key, to_length_prefixed}, + to_vec, Addr, CanonicalAddr, Decimal, StdError, StdResult, Storage, Uint128, }; pub const KEY_INVESTMENT: &[u8] = b"invest"; @@ -14,22 +16,30 @@ pub const KEY_TOTAL_SUPPLY: &[u8] = b"total_supply"; pub const PREFIX_BALANCE: &[u8] = b"balance"; pub const PREFIX_CLAIMS: &[u8] = b"claim"; -/// balances are state of the erc20 tokens -pub fn balances(storage: &mut dyn Storage) -> Bucket { - bucket(storage, PREFIX_BALANCE) -} - -pub fn balances_read(storage: &dyn Storage) -> ReadonlyBucket { - bucket_read(storage, PREFIX_BALANCE) +pub fn may_load_map( + storage: &dyn Storage, + prefix: &[u8], + key: &CanonicalAddr, +) -> StdResult> { + storage + .get(&namespace_with_key(&[prefix], key)) + .map(|v| from_slice(&v)) + .transpose() } -/// claims are the claims to money being unbonded -pub fn claims(storage: &mut dyn Storage) -> Bucket { - bucket(storage, PREFIX_CLAIMS) +pub fn save_map( + storage: &mut dyn Storage, + prefix: &[u8], + key: &CanonicalAddr, + value: Uint128, +) -> StdResult<()> { + storage.set(&namespace_with_key(&[prefix], key), &to_vec(&value)?); + Ok(()) } -pub fn claims_read(storage: &dyn Storage) -> ReadonlyBucket { - bucket_read(storage, PREFIX_CLAIMS) +pub fn load_map(storage: &dyn Storage, prefix: &[u8], key: &CanonicalAddr) -> StdResult { + may_load_map(storage, prefix, key)? + .ok_or_else(|| StdError::not_found(format!("map value for {}", key))) } /// Investment info is fixed at initialization, and is used to control the function of the contract @@ -71,26 +81,26 @@ pub struct Supply { pub claims: Uint128, } -pub fn invest_info(storage: &mut dyn Storage) -> Singleton { - singleton(storage, KEY_INVESTMENT) -} - -pub fn invest_info_read(storage: &dyn Storage) -> ReadonlySingleton { - singleton_read(storage, KEY_INVESTMENT) -} - -pub fn token_info(storage: &mut dyn Storage) -> Singleton { - singleton(storage, KEY_TOKEN_INFO) -} - -pub fn token_info_read(storage: &dyn Storage) -> ReadonlySingleton { - singleton_read(storage, KEY_TOKEN_INFO) +pub fn load_item(storage: &dyn Storage, key: &[u8]) -> StdResult { + storage + .get(&to_length_prefixed(key)) + .ok_or_else(|| StdError::not_found(type_name::())) + .and_then(|v| from_slice(&v)) } -pub fn total_supply(storage: &mut dyn Storage) -> Singleton { - singleton(storage, KEY_TOTAL_SUPPLY) +pub fn save_item(storage: &mut dyn Storage, key: &[u8], item: &T) -> StdResult<()> { + storage.set(&to_length_prefixed(key), &to_vec(item)?); + Ok(()) } -pub fn total_supply_read(storage: &dyn Storage) -> ReadonlySingleton { - singleton_read(storage, KEY_TOTAL_SUPPLY) +pub fn update_item(storage: &mut dyn Storage, key: &[u8], action: A) -> Result +where + T: Serialize + DeserializeOwned, + A: FnOnce(T) -> Result, + E: From, +{ + let input = load_item(storage, key)?; + let output = action(input)?; + save_item(storage, key, &output)?; + Ok(output) } From bdcd5287dc0dac3ffe7a6c96e7858ddc450c6ab5 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 4 May 2023 14:23:23 +0200 Subject: [PATCH 0270/2372] Remove all cosmwasm-storage contract dependencies --- contracts/crypto-verify/Cargo.lock | 9 --------- contracts/cyberpunk/Cargo.lock | 9 --------- contracts/floaty/Cargo.lock | 9 --------- contracts/hackatom/Cargo.lock | 9 --------- contracts/ibc-reflect-send/Cargo.lock | 9 --------- contracts/ibc-reflect-send/Cargo.toml | 1 - contracts/ibc-reflect-send/src/state.rs | 6 +++--- contracts/ibc-reflect/Cargo.lock | 9 --------- contracts/ibc-reflect/Cargo.toml | 1 - contracts/ibc-reflect/src/state.rs | 5 +++-- contracts/reflect/Cargo.lock | 9 --------- contracts/reflect/Cargo.toml | 1 - contracts/staking/Cargo.lock | 9 --------- contracts/staking/Cargo.toml | 1 - 14 files changed, 6 insertions(+), 81 deletions(-) diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index efe0607322..202c2ea136 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -223,14 +223,6 @@ dependencies = [ "uint", ] -[[package]] -name = "cosmwasm-storage" -version = "1.2.5" -dependencies = [ - "cosmwasm-std", - "serde", -] - [[package]] name = "cosmwasm-vm" version = "1.2.5" @@ -419,7 +411,6 @@ version = "0.0.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cosmwasm-storage", "cosmwasm-vm", "hex", "hex-literal", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 0e97b8bcff..b8dced8ea1 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -246,14 +246,6 @@ dependencies = [ "uint", ] -[[package]] -name = "cosmwasm-storage" -version = "1.2.5" -dependencies = [ - "cosmwasm-std", - "serde", -] - [[package]] name = "cosmwasm-vm" version = "1.2.5" @@ -455,7 +447,6 @@ version = "0.0.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cosmwasm-storage", "cosmwasm-vm", "rust-argon2", "thiserror", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 0ad6b6a8ee..53dce5aef0 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -217,14 +217,6 @@ dependencies = [ "uint", ] -[[package]] -name = "cosmwasm-storage" -version = "1.2.5" -dependencies = [ - "cosmwasm-std", - "serde", -] - [[package]] name = "cosmwasm-vm" version = "1.2.5" @@ -644,7 +636,6 @@ version = "0.0.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cosmwasm-storage", "cosmwasm-vm", "schemars", "serde", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 97027614d8..ecac374554 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -217,14 +217,6 @@ dependencies = [ "uint", ] -[[package]] -name = "cosmwasm-storage" -version = "1.2.5" -dependencies = [ - "cosmwasm-std", - "serde", -] - [[package]] name = "cosmwasm-vm" version = "1.2.5" @@ -716,7 +708,6 @@ version = "0.0.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cosmwasm-storage", "cosmwasm-vm", "schemars", "serde", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 80f7103e6a..e7ae1bdfbc 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -217,14 +217,6 @@ dependencies = [ "uint", ] -[[package]] -name = "cosmwasm-storage" -version = "1.2.5" -dependencies = [ - "cosmwasm-std", - "serde", -] - [[package]] name = "cosmwasm-vm" version = "1.2.5" @@ -758,7 +750,6 @@ version = "0.0.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cosmwasm-storage", "cosmwasm-vm", "schemars", "serde", diff --git a/contracts/ibc-reflect-send/Cargo.toml b/contracts/ibc-reflect-send/Cargo.toml index 396f36b019..dcbde4a4fe 100644 --- a/contracts/ibc-reflect-send/Cargo.toml +++ b/contracts/ibc-reflect-send/Cargo.toml @@ -34,7 +34,6 @@ backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } cosmwasm-std = { path = "../../packages/std", features = ["iterator", "staking", "stargate"] } -cosmwasm-storage = { path = "../../packages/storage", features = ["iterator"] } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } diff --git a/contracts/ibc-reflect-send/src/state.rs b/contracts/ibc-reflect-send/src/state.rs index a04e815dc9..3da062710d 100644 --- a/contracts/ibc-reflect-send/src/state.rs +++ b/contracts/ibc-reflect-send/src/state.rs @@ -1,9 +1,9 @@ -use cosmwasm_storage::to_length_prefixed; use serde::{Deserialize, Serialize}; use cosmwasm_std::{ - from_slice, storage_keys::namespace_with_key, to_vec, Addr, Coin, Order, StdError, StdResult, - Storage, Timestamp, + from_slice, + storage_keys::{namespace_with_key, to_length_prefixed}, + to_vec, Addr, Coin, Order, StdError, StdResult, Storage, Timestamp, }; pub const KEY_CONFIG: &[u8] = b"config"; diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index cdd2e868d0..d738d521d8 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -217,14 +217,6 @@ dependencies = [ "uint", ] -[[package]] -name = "cosmwasm-storage" -version = "1.2.5" -dependencies = [ - "cosmwasm-std", - "serde", -] - [[package]] name = "cosmwasm-vm" version = "1.2.5" @@ -758,7 +750,6 @@ version = "0.0.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cosmwasm-storage", "cosmwasm-vm", "schemars", "serde", diff --git a/contracts/ibc-reflect/Cargo.toml b/contracts/ibc-reflect/Cargo.toml index ca0b44bd38..ead27d3725 100644 --- a/contracts/ibc-reflect/Cargo.toml +++ b/contracts/ibc-reflect/Cargo.toml @@ -34,7 +34,6 @@ backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } cosmwasm-std = { path = "../../packages/std", features = ["iterator", "ibc3"] } -cosmwasm-storage = { path = "../../packages/storage", features = ["iterator"] } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } diff --git a/contracts/ibc-reflect/src/state.rs b/contracts/ibc-reflect/src/state.rs index 491ac1c638..bd9a342247 100644 --- a/contracts/ibc-reflect/src/state.rs +++ b/contracts/ibc-reflect/src/state.rs @@ -1,9 +1,10 @@ use std::any::type_name; use cosmwasm_std::{ - from_slice, storage_keys::namespace_with_key, to_vec, Addr, Order, StdError, StdResult, Storage, + from_slice, + storage_keys::{namespace_with_key, to_length_prefixed}, + to_vec, Addr, Order, StdError, StdResult, Storage, }; -use cosmwasm_storage::to_length_prefixed; use schemars::JsonSchema; use serde::{de::DeserializeOwned, Deserialize, Serialize}; diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 6a84dfb35d..28ba22cf0f 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -217,14 +217,6 @@ dependencies = [ "uint", ] -[[package]] -name = "cosmwasm-storage" -version = "1.2.5" -dependencies = [ - "cosmwasm-std", - "serde", -] - [[package]] name = "cosmwasm-vm" version = "1.2.5" @@ -1125,7 +1117,6 @@ version = "0.0.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cosmwasm-storage", "cosmwasm-vm", "schemars", "serde", diff --git a/contracts/reflect/Cargo.toml b/contracts/reflect/Cargo.toml index c331845ac1..0bdd45558e 100644 --- a/contracts/reflect/Cargo.toml +++ b/contracts/reflect/Cargo.toml @@ -35,7 +35,6 @@ backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } cosmwasm-std = { path = "../../packages/std", default-features = false, features = ["staking", "stargate", "cosmwasm_1_1"] } -cosmwasm-storage = { path = "../../packages/storage", default-features = false } schemars = "0.8.3" serde = { version = "=1.0.103", default-features = false, features = ["derive"] } thiserror = "1.0.26" diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 1da584a358..50a97ee382 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -217,14 +217,6 @@ dependencies = [ "uint", ] -[[package]] -name = "cosmwasm-storage" -version = "1.2.5" -dependencies = [ - "cosmwasm-std", - "serde", -] - [[package]] name = "cosmwasm-vm" version = "1.2.5" @@ -1419,7 +1411,6 @@ version = "0.0.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cosmwasm-storage", "cosmwasm-vm", "schemars", "serde", diff --git a/contracts/staking/Cargo.toml b/contracts/staking/Cargo.toml index 2cb5e43fa8..ff7e7f796d 100644 --- a/contracts/staking/Cargo.toml +++ b/contracts/staking/Cargo.toml @@ -34,7 +34,6 @@ backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } cosmwasm-std = { path = "../../packages/std", default-features = false, features = ["staking"] } -cosmwasm-storage = { path = "../../packages/storage", default-features = false } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } snafu = "0.6.6" From cf70538073c834d3e50265266e4b9b113d934c17 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 4 May 2023 15:35:51 +0200 Subject: [PATCH 0271/2372] Add FromStr implementation for Coin, closes #1575 --- packages/std/src/coin.rs | 58 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/packages/std/src/coin.rs b/packages/std/src/coin.rs index 289911deef..cfaf748fda 100644 --- a/packages/std/src/coin.rs +++ b/packages/std/src/coin.rs @@ -1,8 +1,8 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use std::fmt; +use std::{fmt, str::FromStr}; -use crate::math::Uint128; +use crate::{math::Uint128, StdError}; #[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] pub struct Coin { @@ -19,6 +19,25 @@ impl Coin { } } +impl FromStr for Coin { + type Err = StdError; + + fn from_str(s: &str) -> Result { + let pos = s + .find(|c: char| !c.is_ascii_digit()) + .ok_or_else(|| StdError::generic_err("Parsing Coin: missing denominator"))?; + let (amount, denom) = s.split_at(pos); + + match amount.parse::() { + Ok(amount) => Ok(Coin { + amount: amount.into(), + denom: denom.to_string(), + }), + Err(e) => Err(StdError::generic_err(format!("Parsing Coin: {}", e))), + } + } +} + impl fmt::Display for Coin { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { // We use the formatting without a space between amount and denom, @@ -166,4 +185,39 @@ mod tests { // less than same type assert!(has_coins(&wallet, &coin(777, "ETH"))); } + + #[test] + fn parse_coin() { + let expected = Coin::new(123, "ucosm"); + assert_eq!(expected, "123ucosm".parse().unwrap()); + // leading zeroes should be ignored + assert_eq!(expected, "00123ucosm".parse().unwrap()); + // 0 amount parses correctly + assert_eq!(Coin::new(0, "ucosm"), "0ucosm".parse().unwrap()); + // ibc denom should work + let ibc_str = "11111ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2"; + let ibc_coin = Coin::new( + 11111, + "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2", + ); + assert_eq!(ibc_coin, ibc_str.parse().unwrap()); + + // error cases + assert_eq!( + StdError::generic_err("Parsing Coin: missing denominator"), + Coin::from_str("123").unwrap_err() + ); + assert_eq!( + StdError::generic_err("Parsing Coin: cannot parse integer from empty string"), + Coin::from_str("ucosm").unwrap_err() + ); + assert_eq!( + StdError::generic_err("Parsing Coin: cannot parse integer from empty string"), + Coin::from_str("-123ucosm").unwrap_err() + ); + assert_eq!( + StdError::generic_err("Parsing Coin: number too large to fit in target type"), + Coin::from_str("340282366920938463463374607431768211456ucosm").unwrap_err() + ); + } } From eb341dc6106b04b4b7ad2c125ba7d23aae9b7efb Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 4 May 2023 16:12:11 +0200 Subject: [PATCH 0272/2372] Swap expected and actual value in assertions --- packages/std/src/coin.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/std/src/coin.rs b/packages/std/src/coin.rs index cfaf748fda..baabe24110 100644 --- a/packages/std/src/coin.rs +++ b/packages/std/src/coin.rs @@ -189,35 +189,35 @@ mod tests { #[test] fn parse_coin() { let expected = Coin::new(123, "ucosm"); - assert_eq!(expected, "123ucosm".parse().unwrap()); + assert_eq!("123ucosm".parse::().unwrap(), expected); // leading zeroes should be ignored - assert_eq!(expected, "00123ucosm".parse().unwrap()); + assert_eq!("00123ucosm".parse::().unwrap(), expected); // 0 amount parses correctly - assert_eq!(Coin::new(0, "ucosm"), "0ucosm".parse().unwrap()); + assert_eq!("0ucosm".parse::().unwrap(), Coin::new(0, "ucosm")); // ibc denom should work let ibc_str = "11111ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2"; let ibc_coin = Coin::new( 11111, "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2", ); - assert_eq!(ibc_coin, ibc_str.parse().unwrap()); + assert_eq!(ibc_str.parse::().unwrap(), ibc_coin); // error cases assert_eq!( - StdError::generic_err("Parsing Coin: missing denominator"), - Coin::from_str("123").unwrap_err() + Coin::from_str("123").unwrap_err(), + StdError::generic_err("Parsing Coin: missing denominator") ); assert_eq!( - StdError::generic_err("Parsing Coin: cannot parse integer from empty string"), - Coin::from_str("ucosm").unwrap_err() + Coin::from_str("ucosm").unwrap_err(), + StdError::generic_err("Parsing Coin: cannot parse integer from empty string") ); assert_eq!( - StdError::generic_err("Parsing Coin: cannot parse integer from empty string"), - Coin::from_str("-123ucosm").unwrap_err() + Coin::from_str("-123ucosm").unwrap_err(), + StdError::generic_err("Parsing Coin: cannot parse integer from empty string") ); assert_eq!( - StdError::generic_err("Parsing Coin: number too large to fit in target type"), - Coin::from_str("340282366920938463463374607431768211456ucosm").unwrap_err() + Coin::from_str("340282366920938463463374607431768211456ucosm").unwrap_err(), + StdError::generic_err("Parsing Coin: number too large to fit in target type") ); } } From b81d90da82496e6b2d22b34e7ff40dee059484c5 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 4 May 2023 17:17:09 +0200 Subject: [PATCH 0273/2372] Add special error type for Coin's FromStr --- packages/std/src/coin.rs | 33 ++++++++++++++-------------- packages/std/src/errors/mod.rs | 2 +- packages/std/src/errors/std_error.rs | 20 +++++++++++++++++ 3 files changed, 37 insertions(+), 18 deletions(-) diff --git a/packages/std/src/coin.rs b/packages/std/src/coin.rs index baabe24110..7df95c87bc 100644 --- a/packages/std/src/coin.rs +++ b/packages/std/src/coin.rs @@ -2,7 +2,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use std::{fmt, str::FromStr}; -use crate::{math::Uint128, StdError}; +use crate::{errors::CoinFromStrError, math::Uint128, StdError}; #[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] pub struct Coin { @@ -20,21 +20,18 @@ impl Coin { } impl FromStr for Coin { - type Err = StdError; + type Err = CoinFromStrError; fn from_str(s: &str) -> Result { let pos = s .find(|c: char| !c.is_ascii_digit()) - .ok_or_else(|| StdError::generic_err("Parsing Coin: missing denominator"))?; + .ok_or(CoinFromStrError::MissingDenom)?; let (amount, denom) = s.split_at(pos); - match amount.parse::() { - Ok(amount) => Ok(Coin { - amount: amount.into(), - denom: denom.to_string(), - }), - Err(e) => Err(StdError::generic_err(format!("Parsing Coin: {}", e))), - } + Ok(Coin { + amount: amount.parse::()?.into(), + denom: denom.to_string(), + }) } } @@ -205,19 +202,21 @@ mod tests { // error cases assert_eq!( Coin::from_str("123").unwrap_err(), - StdError::generic_err("Parsing Coin: missing denominator") + CoinFromStrError::MissingDenom ); assert_eq!( - Coin::from_str("ucosm").unwrap_err(), - StdError::generic_err("Parsing Coin: cannot parse integer from empty string") + Coin::from_str("ucosm").unwrap_err().to_string(), + "Invalid amount: cannot parse integer from empty string" ); assert_eq!( - Coin::from_str("-123ucosm").unwrap_err(), - StdError::generic_err("Parsing Coin: cannot parse integer from empty string") + Coin::from_str("-123ucosm").unwrap_err().to_string(), + "Invalid amount: cannot parse integer from empty string" ); assert_eq!( - Coin::from_str("340282366920938463463374607431768211456ucosm").unwrap_err(), - StdError::generic_err("Parsing Coin: number too large to fit in target type") + Coin::from_str("340282366920938463463374607431768211456ucosm") + .unwrap_err() + .to_string(), + "Invalid amount: number too large to fit in target type" ); } } diff --git a/packages/std/src/errors/mod.rs b/packages/std/src/errors/mod.rs index 705382b732..5535479bdf 100644 --- a/packages/std/src/errors/mod.rs +++ b/packages/std/src/errors/mod.rs @@ -6,7 +6,7 @@ mod verification_error; pub use recover_pubkey_error::RecoverPubkeyError; pub use std_error::{ CheckedFromRatioError, CheckedMultiplyFractionError, CheckedMultiplyRatioError, - ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, + CoinFromStrError, ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, RoundUpOverflowError, StdError, StdResult, }; pub use system_error::SystemError; diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index 79b6a82f27..7093167590 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -590,6 +590,26 @@ pub enum CheckedFromRatioError { #[error("Round up operation failed because of overflow")] pub struct RoundUpOverflowError; +#[derive(Error, Debug, PartialEq, Eq)] +pub enum CoinFromStrError { + #[error("Missing denominator")] + MissingDenom, + #[error("Invalid amount: {0}")] + InvalidAmount(std::num::ParseIntError), +} + +impl From for CoinFromStrError { + fn from(value: std::num::ParseIntError) -> Self { + Self::InvalidAmount(value) + } +} + +impl From for StdError { + fn from(value: CoinFromStrError) -> Self { + Self::generic_err(format!("Parsing Coin: {}", value)) + } +} + #[cfg(test)] mod tests { use super::*; From 8297a7a8af519ea1faf2ba9dde177cc7b5d62eb9 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 4 May 2023 17:26:32 +0200 Subject: [PATCH 0274/2372] Fix lint --- packages/std/src/coin.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/coin.rs b/packages/std/src/coin.rs index 7df95c87bc..9c8798a005 100644 --- a/packages/std/src/coin.rs +++ b/packages/std/src/coin.rs @@ -2,7 +2,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use std::{fmt, str::FromStr}; -use crate::{errors::CoinFromStrError, math::Uint128, StdError}; +use crate::{errors::CoinFromStrError, math::Uint128}; #[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] pub struct Coin { From 0d1be8634d870063000fb5d1dec163909132bb42 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Thu, 4 May 2023 17:52:16 +0200 Subject: [PATCH 0275/2372] contact: support more test scenarios --- contracts/ibc-reflect/src/contract.rs | 11 +++++++++++ contracts/ibc-reflect/src/msg.rs | 2 ++ 2 files changed, 13 insertions(+) diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 04750f00ec..1c46da8265 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -244,6 +244,8 @@ pub fn ibc_packet_receive( PacketMsg::Dispatch { msgs } => receive_dispatch(deps, caller, msgs), PacketMsg::WhoAmI {} => receive_who_am_i(deps, caller), PacketMsg::Balances {} => receive_balances(deps, caller), + PacketMsg::Panic {} => execute_panic(), + PacketMsg::ReturnErr {text} => execute_error(text), } })() .or_else(|e| { @@ -308,6 +310,15 @@ fn receive_dispatch( .add_attribute("action", "receive_dispatch")) } +fn execute_panic() -> StdResult { + panic!("This page intentionally faulted"); +} + +fn execute_error(text: String) -> StdResult { + return Err(StdError::generic_err(text).into()); +} + + #[entry_point] /// never should be called as we do not send packets pub fn ibc_packet_ack( diff --git a/contracts/ibc-reflect/src/msg.rs b/contracts/ibc-reflect/src/msg.rs index 9e9551be00..4c65aba127 100644 --- a/contracts/ibc-reflect/src/msg.rs +++ b/contracts/ibc-reflect/src/msg.rs @@ -46,6 +46,8 @@ pub enum PacketMsg { Dispatch { msgs: Vec }, WhoAmI {}, Balances {}, + Panic {}, + ReturnErr {text: String}, } /// All acknowledgements are wrapped in `ContractResult`. From df7ca1611f7b12a6c67b2db2b612338665fd2e15 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Fri, 5 May 2023 08:33:43 +0200 Subject: [PATCH 0276/2372] Formatting only --- contracts/ibc-reflect/src/contract.rs | 3 +-- contracts/ibc-reflect/src/msg.rs | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 1c46da8265..c161bd7cc5 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -245,7 +245,7 @@ pub fn ibc_packet_receive( PacketMsg::WhoAmI {} => receive_who_am_i(deps, caller), PacketMsg::Balances {} => receive_balances(deps, caller), PacketMsg::Panic {} => execute_panic(), - PacketMsg::ReturnErr {text} => execute_error(text), + PacketMsg::ReturnErr { text } => execute_error(text), } })() .or_else(|e| { @@ -318,7 +318,6 @@ fn execute_error(text: String) -> StdResult { return Err(StdError::generic_err(text).into()); } - #[entry_point] /// never should be called as we do not send packets pub fn ibc_packet_ack( diff --git a/contracts/ibc-reflect/src/msg.rs b/contracts/ibc-reflect/src/msg.rs index 4c65aba127..723b21478b 100644 --- a/contracts/ibc-reflect/src/msg.rs +++ b/contracts/ibc-reflect/src/msg.rs @@ -47,7 +47,7 @@ pub enum PacketMsg { WhoAmI {}, Balances {}, Panic {}, - ReturnErr {text: String}, + ReturnErr { text: String }, } /// All acknowledgements are wrapped in `ContractResult`. From bba7a9627d5176f35c0d517315a6133fd3250816 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 5 May 2023 09:38:41 +0200 Subject: [PATCH 0277/2372] Add changelog entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a512a2112c..c71c5ecbc2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,8 +11,10 @@ and this project adheres to - cosmwasm-vm: Add `Cache::save_wasm_unchecked` to save Wasm blobs that have been checked before. This is useful for state-sync where we know the Wasm code was checked when it was first uploaded. ([#1635]) +- cosmwasm-std: Add `FromStr` impl for `Coin`. ([#1684]) [#1635]: https://github.com/CosmWasm/cosmwasm/pull/1635 +[#1684]: https://github.com/CosmWasm/cosmwasm/pull/1684 ### Changed From 80caa65f757807ca1e1b50f44e1356ced33a530c Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 5 May 2023 10:19:31 +0200 Subject: [PATCH 0278/2372] Add .wasm file extension to wasm files, fixes #1665 --- packages/vm/src/cache.rs | 55 +++++++++++++++++++++++++++++++++++----- 1 file changed, 49 insertions(+), 6 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index dcedd488cc..d95e060b91 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -381,7 +381,7 @@ fn save_wasm_to_disk(dir: impl Into, wasm: &[u8]) -> VmResult // calculate filename let checksum = Checksum::generate(wasm); let filename = checksum.to_hex(); - let filepath = dir.into().join(filename); + let filepath = dir.into().join(filename).with_extension("wasm"); // write data to file // Since the same filename (a collision resistent hash) cannot be generated from two different byte codes @@ -399,9 +399,12 @@ fn save_wasm_to_disk(dir: impl Into, wasm: &[u8]) -> VmResult fn load_wasm_from_disk(dir: impl Into, checksum: &Checksum) -> VmResult> { // this requires the directory and file to exist + // The files previously had no extension, so to allow for a smooth transition, + // we also try to load the file without the wasm extension. let path = dir.into().join(checksum.to_hex()); - let mut file = - File::open(path).map_err(|_e| VmError::cache_err("Error opening Wasm file for reading"))?; + let mut file = File::open(path.with_extension("wasm")) + .or_else(|_| File::open(path)) + .map_err(|_e| VmError::cache_err("Error opening Wasm file for reading"))?; let mut wasm = Vec::::new(); file.read_to_end(&mut wasm) @@ -415,13 +418,25 @@ fn load_wasm_from_disk(dir: impl Into, checksum: &Checksum) -> VmResult /// code is required. So a non-existent file leads to an error as it /// indicates a bug. fn remove_wasm_from_disk(dir: impl Into, checksum: &Checksum) -> VmResult<()> { + // the files previously had no extension, so to allow for a smooth transition, we delete both let path = dir.into().join(checksum.to_hex()); + let wasm_path = path.with_extension("wasm"); - if !path.exists() { + let path_exists = path.exists(); + let wasm_path_exists = wasm_path.exists(); + if !path_exists && !wasm_path_exists { return Err(VmError::cache_err("Wasm file does not exist")); } - fs::remove_file(path).map_err(|_e| VmError::cache_err("Error removing Wasm file from disk"))?; + if path_exists { + fs::remove_file(path) + .map_err(|_e| VmError::cache_err("Error removing Wasm file from disk"))?; + } + + if wasm_path_exists { + fs::remove_file(wasm_path) + .map_err(|_e| VmError::cache_err("Error removing Wasm file from disk"))?; + } Ok(()) } @@ -637,7 +652,8 @@ mod tests { .path() .join(STATE_DIR) .join(WASM_DIR) - .join(checksum.to_hex()); + .join(checksum.to_hex()) + .with_extension("wasm"); let mut file = OpenOptions::new().write(true).open(filepath).unwrap(); file.write_all(b"broken data").unwrap(); @@ -1200,4 +1216,31 @@ mod tests { let non_id = Checksum::generate(b"non_existent"); cache.unpin(&non_id).unwrap(); } + + #[test] + fn loading_without_extension_works() { + let tmp_dir = TempDir::new().unwrap(); + let options = CacheOptions { + base_dir: tmp_dir.path().to_path_buf(), + available_capabilities: default_capabilities(), + memory_cache_size: TESTING_MEMORY_CACHE_SIZE, + instance_memory_limit: TESTING_MEMORY_LIMIT, + }; + let cache: Cache = + unsafe { Cache::new(options).unwrap() }; + let checksum = cache.save_wasm(CONTRACT).unwrap(); + + // Move the saved wasm to the old path (without extension) + let old_path = tmp_dir + .path() + .join(STATE_DIR) + .join(WASM_DIR) + .join(checksum.to_hex()); + let new_path = old_path.with_extension("wasm"); + fs::rename(new_path, old_path).unwrap(); + + // loading wasm from before the wasm extension was added should still work + let restored = cache.load_wasm(&checksum).unwrap(); + assert_eq!(restored, CONTRACT); + } } From 0696b2a7015e5712a408cd08d24b8680ca2ff69f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 5 May 2023 10:28:04 +0200 Subject: [PATCH 0279/2372] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75136e9c10..494fd3e046 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,12 +29,14 @@ and this project adheres to STDERR instead of STDOUT by default ([#1667]). - cosmwasm-vm: Add `Instance::set_debug_handler`/`unset_debug_handler` to allow customizing the handling of debug messages emitted by the contract ([#1667]). +- cosmwasm-vm: Add `.wasm` extension to stored wasm files ([#1686]). [#1511]: https://github.com/CosmWasm/cosmwasm/issues/1511 [#1629]: https://github.com/CosmWasm/cosmwasm/pull/1629 [#1631]: https://github.com/CosmWasm/cosmwasm/pull/1631 [#1664]: https://github.com/CosmWasm/cosmwasm/pull/1664 [#1667]: https://github.com/CosmWasm/cosmwasm/pull/1667 +[#1686]: https://github.com/CosmWasm/cosmwasm/pull/1686 ### Deprecated From b0bb92824fa4420d584a2644247d8a8f32f62133 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Mon, 8 May 2023 14:42:30 +0200 Subject: [PATCH 0280/2372] Add new test method to ibc-reflect --- contracts/ibc-reflect/src/contract.rs | 14 ++++++++++++++ contracts/ibc-reflect/src/msg.rs | 1 + 2 files changed, 15 insertions(+) diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index c161bd7cc5..c99ae67d89 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -246,6 +246,8 @@ pub fn ibc_packet_receive( PacketMsg::Balances {} => receive_balances(deps, caller), PacketMsg::Panic {} => execute_panic(), PacketMsg::ReturnErr { text } => execute_error(text), + PacketMsg::ReturnMsgs { msgs } => execute_return_msgs(msgs), + } })() .or_else(|e| { @@ -318,6 +320,18 @@ fn execute_error(text: String) -> StdResult { return Err(StdError::generic_err(text).into()); } +fn execute_return_msgs( + msgs: Vec, +) -> StdResult { + let acknowledgement = to_binary(&AcknowledgementMsg::::Ok(()))?; + + Ok(IbcReceiveResponse::new() + .set_ack(acknowledgement) + .add_messages(msgs) + .add_attribute("action", "receive_dispatch")) +} + + #[entry_point] /// never should be called as we do not send packets pub fn ibc_packet_ack( diff --git a/contracts/ibc-reflect/src/msg.rs b/contracts/ibc-reflect/src/msg.rs index 723b21478b..d50ffa5c48 100644 --- a/contracts/ibc-reflect/src/msg.rs +++ b/contracts/ibc-reflect/src/msg.rs @@ -48,6 +48,7 @@ pub enum PacketMsg { Balances {}, Panic {}, ReturnErr { text: String }, + ReturnMsgs { msgs: Vec }, } /// All acknowledgements are wrapped in `ContractResult`. From 66d026bcda634f7d81892670531e6d1d5047eb73 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 15 May 2023 13:04:01 +0200 Subject: [PATCH 0281/2372] Check for missing amount when parsing Coin --- packages/std/src/coin.rs | 24 ++++++++++++++++++++---- packages/std/src/errors/std_error.rs | 2 ++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/packages/std/src/coin.rs b/packages/std/src/coin.rs index 9c8798a005..b88a6da3ee 100644 --- a/packages/std/src/coin.rs +++ b/packages/std/src/coin.rs @@ -28,6 +28,10 @@ impl FromStr for Coin { .ok_or(CoinFromStrError::MissingDenom)?; let (amount, denom) = s.split_at(pos); + if amount.is_empty() { + return Err(CoinFromStrError::MissingAmount); + } + Ok(Coin { amount: amount.parse::()?.into(), denom: denom.to_string(), @@ -205,12 +209,24 @@ mod tests { CoinFromStrError::MissingDenom ); assert_eq!( - Coin::from_str("ucosm").unwrap_err().to_string(), - "Invalid amount: cannot parse integer from empty string" + Coin::from_str("ucosm").unwrap_err(), // no amount + CoinFromStrError::MissingAmount + ); + assert_eq!( + Coin::from_str("-123ucosm").unwrap_err(), // negative amount + CoinFromStrError::MissingAmount + ); + assert_eq!( + Coin::from_str("").unwrap_err(), // empty input + CoinFromStrError::MissingDenom + ); + assert_eq!( + Coin::from_str(" 1ucosm").unwrap_err(), // unsupported whitespace + CoinFromStrError::MissingAmount ); assert_eq!( - Coin::from_str("-123ucosm").unwrap_err().to_string(), - "Invalid amount: cannot parse integer from empty string" + Coin::from_str("�1ucosm").unwrap_err(), // other broken data + CoinFromStrError::MissingAmount ); assert_eq!( Coin::from_str("340282366920938463463374607431768211456ucosm") diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index 7093167590..d90171c74c 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -594,6 +594,8 @@ pub struct RoundUpOverflowError; pub enum CoinFromStrError { #[error("Missing denominator")] MissingDenom, + #[error("Missing amount or non-digit characters in amount")] + MissingAmount, #[error("Invalid amount: {0}")] InvalidAmount(std::num::ParseIntError), } From 8ae0b27085d55872024ac95d6771cb2131f8ae03 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Tue, 16 May 2023 08:58:43 +0200 Subject: [PATCH 0282/2372] Cache module and new store --- packages/vm/src/cache.rs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index df4c09f525..d6da27fa23 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -352,10 +352,11 @@ where if let Some((module, module_size)) = cache.fs_cache.load(checksum, &store)? { cache.stats.hits_fs_cache = cache.stats.hits_fs_cache.saturating_add(1); - // Can't clone store :( - // cache - // .memory_cache - // .store(checksum, (store, module.clone()), module_size)?; + // Can't clone store + let store2 = make_runtime_store(Some(cache.instance_memory_limit)); + cache + .memory_cache + .store(checksum, (store2, module.clone()), module_size)?; let cached = CachedModule { store, module, @@ -374,10 +375,11 @@ where let (store, module) = compile(&wasm, Some(cache.instance_memory_limit), &[])?; let module_size = cache.fs_cache.store(checksum, &module)?; - // Can't clone store :( - // cache - // .memory_cache - // .store(checksum, (store, module.clone()), module_size)?; + // Can't clone store + let store2 = make_runtime_store(Some(cache.instance_memory_limit)); + cache + .memory_cache + .store(checksum, (store2, module.clone()), module_size)?; let cached = CachedModule { store, module, From 6c662943d65616c9b666e59e4841eddd91de6dfe Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Tue, 16 May 2023 17:25:53 +0200 Subject: [PATCH 0283/2372] Add make_engine helper --- packages/vm/src/wasm_backend/mod.rs | 1 + packages/vm/src/wasm_backend/store.rs | 29 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/packages/vm/src/wasm_backend/mod.rs b/packages/vm/src/wasm_backend/mod.rs index 3e503c1da1..af4a6ba227 100644 --- a/packages/vm/src/wasm_backend/mod.rs +++ b/packages/vm/src/wasm_backend/mod.rs @@ -5,4 +5,5 @@ mod store; pub use compile::compile; pub use limiting_tunables::LimitingTunables; +pub use store::make_engine; pub use store::make_runtime_store; diff --git a/packages/vm/src/wasm_backend/store.rs b/packages/vm/src/wasm_backend/store.rs index c54831bf93..77790c59e8 100644 --- a/packages/vm/src/wasm_backend/store.rs +++ b/packages/vm/src/wasm_backend/store.rs @@ -63,6 +63,35 @@ pub fn make_compile_time_store( } } +/// Creates an engine with the default compiler. +pub fn make_engine(middlewares: &[Arc]) -> Engine { + let gas_limit = 0; + let deterministic = Arc::new(Gatekeeper::default()); + let metering = Arc::new(Metering::new(gas_limit, cost)); + + #[cfg(feature = "cranelift")] + { + let mut compiler = Cranelift::default(); + for middleware in middlewares { + compiler.push_middleware(middleware.clone()); + } + compiler.push_middleware(deterministic); + compiler.push_middleware(metering); + compiler.into() + } + + #[cfg(not(feature = "cranelift"))] + { + let mut compiler = Singlepass::default(); + for middleware in middlewares { + compiler.push_middleware(middleware.clone()); + } + compiler.push_middleware(deterministic); + compiler.push_middleware(metering); + compiler.into() + } +} + /// Created a store with no compiler and the given memory limit (in bytes) /// If memory_limit is None, no limit is applied. pub fn make_runtime_store(memory_limit: Option) -> Store { From ccbb221fe711b91d88bc9dd08f6e36924132e7bd Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Tue, 16 May 2023 18:22:39 +0200 Subject: [PATCH 0284/2372] Cache Engine not Store --- packages/vm/src/cache.rs | 130 +++++------------- packages/vm/src/environment.rs | 38 +---- packages/vm/src/imports.rs | 5 +- packages/vm/src/instance.rs | 50 +------ packages/vm/src/modules/file_system_cache.rs | 16 ++- packages/vm/src/modules/in_memory_cache.rs | 41 +++--- .../vm/src/modules/pinned_memory_cache.rs | 35 ++--- packages/vm/src/modules/sized_module.rs | 6 +- packages/vm/src/modules/versioning.rs | 2 +- packages/vm/src/wasm_backend/compile.rs | 20 +-- packages/vm/src/wasm_backend/mod.rs | 1 + packages/vm/src/wasm_backend/store.rs | 4 +- 12 files changed, 109 insertions(+), 239 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index d6da27fa23..ad3d5cdc12 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -4,6 +4,7 @@ use std::io::{Read, Write}; use std::marker::PhantomData; use std::path::{Path, PathBuf}; use std::sync::Mutex; +use wasmer::Engine; use crate::backend::{Backend, BackendApi, Querier, Storage}; use crate::capabilities::required_capabilities_from_module; @@ -15,7 +16,7 @@ use crate::instance::{Instance, InstanceOptions}; use crate::modules::{CachedModule, FileSystemCache, InMemoryCache, PinnedMemoryCache}; use crate::size::Size; use crate::static_analysis::{deserialize_wasm, has_ibc_entry_points}; -use crate::wasm_backend::{compile, make_runtime_store}; +use crate::wasm_backend::{compile, make_engine, make_store_with_engine}; const STATE_DIR: &str = "state"; // Things related to the state of the blockchain. @@ -180,7 +181,7 @@ where /// When a Wasm blob is stored which was previously checked (e.g. as part of state sync), /// use this function. pub fn save_wasm_unchecked(&self, wasm: &[u8]) -> VmResult { - let (_store, module) = compile(wasm, None, &[])?; + let (_engine, module) = compile(wasm, &[])?; let mut cache = self.inner.lock().unwrap(); let checksum = save_wasm_to_disk(&cache.wasm_path, wasm)?; @@ -257,22 +258,22 @@ where // for a no-so-relevant use case. // Try to get module from file system cache - let store = make_runtime_store(Some(cache.instance_memory_limit)); - if let Some((module, module_size)) = cache.fs_cache.load(checksum, &store)? { + let engine = Engine::headless(); + if let Some((module, module_size)) = cache.fs_cache.load(checksum, &engine)? { cache.stats.hits_fs_cache = cache.stats.hits_fs_cache.saturating_add(1); return cache .pinned_memory_cache - .store(checksum, (store, module), module_size); + .store(checksum, (engine, module), module_size); } // Re-compile from original Wasm bytecode let code = self.load_wasm_with_path(&cache.wasm_path, checksum)?; - let (store, module) = compile(&code, Some(cache.instance_memory_limit), &[])?; + let (engine, module) = compile(&code, &[])?; // Store into the fs cache too let module_size = cache.fs_cache.store(checksum, &module)?; cache .pinned_memory_cache - .store(checksum, (store, module), module_size) + .store(checksum, (engine, module), module_size) } /// Unpins a Module, i.e. removes it from the pinned memory cache. @@ -296,11 +297,13 @@ where backend: Backend, options: InstanceOptions, ) -> VmResult> { - let (cached, from_pinned) = self.get_module(checksum)?; + let (cached, _from_pinned) = self.get_module(checksum)?; + // FIXME: memory limit + // let store = make_store_with_engine(Some(memory_limit)); + let store = make_store_with_engine(cached.engine, None); let instance = Instance::from_module( - cached.store, + store, &cached.module, - from_pinned, backend, options.gas_limit, options.print_debug, @@ -310,25 +313,6 @@ where Ok(instance) } - pub fn return_instance( - &self, - checksum: &Checksum, - element: CachedModule, - pinned: bool, - ) -> VmResult<()> { - let mut cache = self.inner.lock().unwrap(); - - if pinned { - cache - .pinned_memory_cache - .store(checksum, (element.store, element.module), element.size) - } else { - cache - .memory_cache - .store(checksum, (element.store, element.module), element.size) - } - } - /// Returns a module tied to a previously saved Wasm. /// Depending on availability, this is either generated from a memory cache, file system cache or Wasm code. /// This is part of `get_instance` but pulled out to reduce the locking time. @@ -348,17 +332,16 @@ where } // Get module from file system cache - let store = make_runtime_store(Some(cache.instance_memory_limit)); - if let Some((module, module_size)) = cache.fs_cache.load(checksum, &store)? { + // let store = make_runtime_store(Some(cache.instance_memory_limit)); + let engine = make_engine(&[]); + if let Some((module, module_size)) = cache.fs_cache.load(checksum, &engine)? { cache.stats.hits_fs_cache = cache.stats.hits_fs_cache.saturating_add(1); - // Can't clone store - let store2 = make_runtime_store(Some(cache.instance_memory_limit)); cache .memory_cache - .store(checksum, (store2, module.clone()), module_size)?; + .store(checksum, (engine.clone(), module.clone()), module_size)?; let cached = CachedModule { - store, + engine, module, size: module_size, }; @@ -372,16 +355,14 @@ where // stored the old module format. let wasm = self.load_wasm_with_path(&cache.wasm_path, checksum)?; cache.stats.misses = cache.stats.misses.saturating_add(1); - let (store, module) = compile(&wasm, Some(cache.instance_memory_limit), &[])?; + let (engine, module) = compile(&wasm, &[])?; let module_size = cache.fs_cache.store(checksum, &module)?; - // Can't clone store - let store2 = make_runtime_store(Some(cache.instance_memory_limit)); cache .memory_cache - .store(checksum, (store2, module.clone()), module_size)?; + .store(checksum, (engine.clone(), module.clone()), module_size)?; let cached = CachedModule { - store, + engine, module, size: module_size, }; @@ -736,7 +717,7 @@ mod tests { let backend5 = mock_backend(&[]); // from file system - let instance1: Instance = cache + let _instance1: Instance = cache .get_instance(&checksum, backend1, TESTING_OPTIONS) .unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 0); @@ -744,11 +725,8 @@ mod tests { assert_eq!(cache.stats().hits_fs_cache, 1); assert_eq!(cache.stats().misses, 0); - let (cached, pinned, ..) = instance1.recycle(); - cache.return_instance(&checksum, cached, pinned).unwrap(); - // from memory - let instance2 = cache + let _instance2 = cache .get_instance(&checksum, backend2, TESTING_OPTIONS) .unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 0); @@ -756,11 +734,8 @@ mod tests { assert_eq!(cache.stats().hits_fs_cache, 1); assert_eq!(cache.stats().misses, 0); - let (cached, pinned, ..) = instance2.recycle(); - cache.return_instance(&checksum, cached, pinned).unwrap(); - // from memory again - let instance3 = cache + let _instance3 = cache .get_instance(&checksum, backend3, TESTING_OPTIONS) .unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 0); @@ -775,11 +750,8 @@ mod tests { assert_eq!(cache.stats().hits_fs_cache, 2); assert_eq!(cache.stats().misses, 0); - let (cached, pinned, ..) = instance3.recycle(); - cache.return_instance(&checksum, cached, pinned).unwrap(); - // from pinned memory cache - let instance4 = cache + let _instance4 = cache .get_instance(&checksum, backend4, TESTING_OPTIONS) .unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 1); @@ -787,9 +759,6 @@ mod tests { assert_eq!(cache.stats().hits_fs_cache, 2); assert_eq!(cache.stats().misses, 0); - let (cached, pinned, ..) = instance4.recycle(); - cache.return_instance(&checksum, cached, pinned).unwrap(); - // from pinned memory cache again let _instance5 = cache .get_instance(&checksum, backend5, TESTING_OPTIONS) @@ -822,9 +791,6 @@ mod tests { call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); - - let (cached, pinned, ..) = instance.recycle(); - cache.return_instance(&checksum, cached, pinned).unwrap(); } // from memory @@ -844,9 +810,6 @@ mod tests { call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); - - let (cached, pinned, ..) = instance.recycle(); - cache.return_instance(&checksum, cached, pinned).unwrap(); } // from pinned memory @@ -868,9 +831,6 @@ mod tests { call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); - - let (cached, pinned, ..) = instance.recycle(); - cache.return_instance(&checksum, cached, pinned).unwrap(); } } @@ -905,9 +865,6 @@ mod tests { .unwrap() .unwrap(); assert_eq!(response.messages.len(), 1); - - let (cached, pinned, ..) = instance.recycle(); - cache.return_instance(&checksum, cached, pinned).unwrap(); } // from memory @@ -936,9 +893,6 @@ mod tests { .unwrap() .unwrap(); assert_eq!(response.messages.len(), 1); - - let (cached, pinned, ..) = instance.recycle(); - cache.return_instance(&checksum, cached, pinned).unwrap(); } // from pinned memory @@ -969,9 +923,6 @@ mod tests { .unwrap() .unwrap(); assert_eq!(response.messages.len(), 1); - - let (cached, pinned, ..) = instance.recycle(); - cache.return_instance(&checksum, cached, pinned).unwrap(); } } @@ -983,6 +934,8 @@ mod tests { // these differentiate the two instances of the same contract let backend1 = mock_backend(&[]); let backend2 = mock_backend(&[]); + let backend3 = mock_backend(&[]); + let backend4 = mock_backend(&[]); // init instance 1 let mut instance = cache @@ -994,8 +947,6 @@ mod tests { call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); - let (_cached, _pinned, backend1) = instance.recycle(); - let backend1 = backend1.unwrap(); // init instance 2 let mut instance = cache @@ -1007,12 +958,10 @@ mod tests { call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); - let (_cached, _pinned, backend2) = instance.recycle(); - let backend2 = backend2.unwrap(); // run contract 2 - just sanity check - results validate in contract unit tests let mut instance = cache - .get_instance(&checksum, backend2, TESTING_OPTIONS) + .get_instance(&checksum, backend3, TESTING_OPTIONS) .unwrap(); let info = mock_info("bob", &coins(15, "earth")); let msg = br#"{"release":{}}"#; @@ -1022,7 +971,7 @@ mod tests { // run contract 1 - just sanity check - results validate in contract unit tests let mut instance = cache - .get_instance(&checksum, backend1, TESTING_OPTIONS) + .get_instance(&checksum, backend4, TESTING_OPTIONS) .unwrap(); let info = mock_info("sue", &coins(15, "earth")); let msg = br#"{"release":{}}"#; @@ -1057,9 +1006,6 @@ mod tests { .unwrap(); assert!(instance1.get_gas_left() < original_gas); - let (cached, pinned, ..) = instance1.recycle(); - cache.return_instance(&checksum, cached, pinned).unwrap(); - // Init from memory cache let mut instance2 = cache .get_instance(&checksum, backend2, TESTING_OPTIONS) @@ -1099,9 +1045,6 @@ mod tests { } assert_eq!(instance1.get_gas_left(), 0); - let (cached, pinned, ..) = instance1.recycle(); - cache.return_instance(&checksum, cached, pinned).unwrap(); - // Init from memory cache let options = InstanceOptions { gas_limit: TESTING_GAS_LIMIT, @@ -1217,7 +1160,7 @@ mod tests { // check not pinned let backend = mock_backend(&[]); - let instance = cache + let _instance = cache .get_instance(&checksum, backend, TESTING_OPTIONS) .unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 0); @@ -1239,12 +1182,9 @@ mod tests { assert_eq!(cache.stats().hits_fs_cache, 2); assert_eq!(cache.stats().misses, 0); - let (cached, pinned, ..) = instance.recycle(); - cache.return_instance(&checksum, cached, pinned).unwrap(); - // check pinned let backend = mock_backend(&[]); - let instance = cache + let _instance = cache .get_instance(&checksum, backend, TESTING_OPTIONS) .unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 1); @@ -1252,15 +1192,12 @@ mod tests { assert_eq!(cache.stats().hits_fs_cache, 2); assert_eq!(cache.stats().misses, 0); - let (cached, pinned, ..) = instance.recycle(); - cache.return_instance(&checksum, cached, pinned).unwrap(); - // unpin cache.unpin(&checksum).unwrap(); // verify unpinned let backend = mock_backend(&[]); - let instance = cache + let _instance = cache .get_instance(&checksum, backend, TESTING_OPTIONS) .unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 1); @@ -1274,8 +1211,5 @@ mod tests { // unpin non existent id has no effect let non_id = Checksum::generate(b"non_existent"); cache.unpin(&non_id).unwrap(); - - let (cached, pinned, ..) = instance.recycle(); - cache.return_instance(&checksum, cached, pinned).unwrap(); } } diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index 015c66ff05..daa7f2fc1b 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -382,14 +382,6 @@ impl Environment { context_data.querier = Some(querier); }); } - - /// Returns the original storage and querier as owned instances, and closes any remaining - /// iterators. This is meant to be called when recycling the instance. - pub fn move_out(&self) -> (Option, Option) { - self.with_context_data_mut(|context_data| { - (context_data.storage.take(), context_data.querier.take()) - }) - } } pub struct ContextData { @@ -451,7 +443,7 @@ mod tests { use crate::errors::VmError; use crate::size::Size; use crate::testing::{MockApi, MockQuerier, MockStorage}; - use crate::wasm_backend::compile; + use crate::wasm_backend::{compile, make_store_with_engine}; use cosmwasm_std::{ coins, from_binary, to_vec, AllBalanceResponse, BankQuery, Empty, QueryRequest, }; @@ -480,7 +472,8 @@ mod tests { ) { let env = Environment::new(MockApi::default(), gas_limit); - let (mut store, module) = compile(CONTRACT, TESTING_MEMORY_LIMIT, &[]).unwrap(); + let (engine, module) = compile(CONTRACT, &[]).unwrap(); + let mut store = make_store_with_engine(engine, TESTING_MEMORY_LIMIT); // we need stubs for all required imports let import_obj = imports! { @@ -523,31 +516,6 @@ mod tests { env.move_in(storage, querier); } - #[test] - fn move_out_works() { - let (env, _store, _instance) = make_instance(TESTING_GAS_LIMIT); - - // empty data on start - let (inits, initq) = env.move_out(); - assert!(inits.is_none()); - assert!(initq.is_none()); - - // store it on the instance - leave_default_data(&env); - let (s, q) = env.move_out(); - assert!(s.is_some()); - assert!(q.is_some()); - assert_eq!( - s.unwrap().get(INIT_KEY).0.unwrap(), - Some(INIT_VALUE.to_vec()) - ); - - // now is empty again - let (ends, endq) = env.move_out(); - assert!(ends.is_none()); - assert!(endq.is_none()); - } - #[test] fn process_gas_info_works_for_cost() { let (env, mut store, _instance) = make_instance(100); diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 8485bc8715..c59141e156 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -583,7 +583,7 @@ mod tests { use crate::backend::{BackendError, Storage}; use crate::size::Size; use crate::testing::{MockApi, MockQuerier, MockStorage}; - use crate::wasm_backend::compile; + use crate::wasm_backend::{compile, make_store_with_engine}; static CONTRACT: &[u8] = include_bytes!("../testdata/hackatom.wasm"); @@ -620,7 +620,8 @@ mod tests { let gas_limit = TESTING_GAS_LIMIT; let env = Environment::new(api, gas_limit); - let (mut store, module) = compile(CONTRACT, TESTING_MEMORY_LIMIT, &[]).unwrap(); + let (engine, module) = compile(CONTRACT, &[]).unwrap(); + let mut store = make_store_with_engine(engine, TESTING_MEMORY_LIMIT); let fe = FunctionEnv::new(&mut store, env); diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index a8007d5177..2d60c1296b 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -20,9 +20,8 @@ use crate::imports::{ #[cfg(feature = "iterator")] use crate::imports::{do_db_next, do_db_scan}; use crate::memory::{read_region, write_region}; -use crate::modules::CachedModule; use crate::size::Size; -use crate::wasm_backend::compile; +use crate::wasm_backend::{compile, make_store_with_engine}; pub use crate::environment::DebugInfo; // Re-exported as public via to be usable for set_debug_handler @@ -55,7 +54,6 @@ pub struct Instance { _inner: Box, fe: FunctionEnv>, store: Store, - from_pinned_cache: bool, } impl Instance @@ -72,11 +70,11 @@ where options: InstanceOptions, memory_limit: Option, ) -> VmResult { - let (store, module) = compile(code, memory_limit, &[])?; + let (engine, module) = compile(code, &[])?; + let store = make_store_with_engine(engine, memory_limit); Instance::from_module( store, &module, - false, backend, options.gas_limit, options.print_debug, @@ -89,7 +87,6 @@ where pub(crate) fn from_module( mut store: Store, module: &Module, - from_pinned_cache: bool, backend: Backend, gas_limit: u64, print_debug: bool, @@ -278,7 +275,6 @@ where _inner: wasmer_instance, fe, store, - from_pinned_cache, }) } @@ -286,40 +282,6 @@ where &self.fe.as_ref(&self.store).api } - /// Decomposes this instance into its components. - /// External dependencies are returned for reuse, the rest is dropped. - pub fn recycle(self) -> (CachedModule, bool, Option>) { - let Instance { - _inner, - fe, - store, - from_pinned_cache, - .. - } = self; - - let env = fe.as_ref(&store); - let backend = if let (Some(storage), Some(querier)) = env.move_out() { - let api = env.api; - Some(Backend { - api, - storage, - querier, - }) - } else { - None - }; - - ( - CachedModule { - store, - module: _inner.module().clone(), - size: 234, - }, - from_pinned_cache, - backend, - ) - } - pub fn set_debug_handler(&mut self, debug_handler: H) where H: for<'a> Fn(/* msg */ &'a str, DebugInfo<'a>) + 'static, @@ -473,7 +435,6 @@ where pub fn instance_from_module( store: Store, module: &Module, - from_pinned_cache: bool, backend: Backend, gas_limit: u64, print_debug: bool, @@ -487,7 +448,6 @@ where Instance::from_module( store, module, - from_pinned_cache, backend, gas_limit, print_debug, @@ -619,7 +579,8 @@ mod tests { let backend = mock_backend(&[]); let (instance_options, memory_limit) = mock_instance_options(); - let (mut store, module) = compile(&wasm, memory_limit, &[]).unwrap(); + let (engine, module) = compile(&wasm, &[]).unwrap(); + let mut store = make_store_with_engine(engine, memory_limit); #[derive(Clone)] struct MyEnv { @@ -645,7 +606,6 @@ mod tests { let mut instance = Instance::from_module( store, &module, - false, backend, instance_options.gas_limit, false, diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 0d41a1f704..c723df0865 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -5,7 +5,7 @@ use std::path::Path; use std::path::PathBuf; use thiserror::Error; -use wasmer::{DeserializeError, Module, Store, Target}; +use wasmer::{AsEngineRef, DeserializeError, Module, Target}; use crate::checksum::Checksum; use crate::errors::{VmError, VmResult}; @@ -100,11 +100,15 @@ impl FileSystemCache { /// Loads a serialized module from the file system and returns a module (i.e. artifact + store), /// along with the size of the serialized module. - pub fn load(&self, checksum: &Checksum, store: &Store) -> VmResult> { + pub fn load( + &self, + checksum: &Checksum, + engine: &impl AsEngineRef, + ) -> VmResult> { let filename = checksum.to_hex(); let file_path = self.modules_path.join(filename); - let result = unsafe { Module::deserialize_from_file(store, &file_path) }; + let result = unsafe { Module::deserialize_from_file(engine, &file_path) }; match result { Ok(module) => { let module_size = module_size(&file_path)?; @@ -224,7 +228,7 @@ mod tests { assert!(cached.is_none()); // Store module - let (_store, module) = compile(&wasm, None, &[]).unwrap(); + let (_engine, module) = compile(&wasm, &[]).unwrap(); cache.store(&checksum, &module).unwrap(); // Load module @@ -256,7 +260,7 @@ mod tests { let checksum = Checksum::generate(&wasm); // Store module - let (_store, module) = compile(&wasm, None, &[]).unwrap(); + let (_engine, module) = compile(&wasm, &[]).unwrap(); cache.store(&checksum, &module).unwrap(); let mut globber = glob::glob(&format!( @@ -279,7 +283,7 @@ mod tests { let checksum = Checksum::generate(&wasm); // Store module - let (_store, module) = compile(&wasm, None, &[]).unwrap(); + let (_engine, module) = compile(&wasm, &[]).unwrap(); cache.store(&checksum, &module).unwrap(); // It's there diff --git a/packages/vm/src/modules/in_memory_cache.rs b/packages/vm/src/modules/in_memory_cache.rs index 5e3ff6c210..82be922f17 100644 --- a/packages/vm/src/modules/in_memory_cache.rs +++ b/packages/vm/src/modules/in_memory_cache.rs @@ -1,7 +1,7 @@ use clru::{CLruCache, CLruCacheConfig, WeightScale}; use std::collections::hash_map::RandomState; use std::num::NonZeroUsize; -use wasmer::{Module, Store}; +use wasmer::{Engine, Module}; use super::sized_module::CachedModule; use crate::{Checksum, Size, VmError, VmResult}; @@ -52,7 +52,7 @@ impl InMemoryCache { pub fn store( &mut self, checksum: &Checksum, - entry: (Store, Module), + entry: (Engine, Module), size: usize, ) -> VmResult<()> { if let Some(modules) = &mut self.modules { @@ -60,7 +60,7 @@ impl InMemoryCache { .put_with_weight( *checksum, CachedModule { - store: entry.0, + engine: entry.0, module: entry.1, size, }, @@ -73,7 +73,10 @@ impl InMemoryCache { /// Looks up a module in the cache and creates a new module pub fn load(&mut self, checksum: &Checksum) -> VmResult> { if let Some(modules) = &mut self.modules { - Ok(modules.pop(checksum)) + match modules.get(checksum) { + Some(module) => Ok(Some(module.clone())), + None => Ok(None), + } } else { Ok(None) } @@ -103,7 +106,7 @@ impl InMemoryCache { mod tests { use super::*; use crate::size::Size; - use crate::wasm_backend::compile; + use crate::wasm_backend::{compile, make_store_with_engine}; use std::mem; use wasmer::{imports, Instance as WasmerInstance}; use wasmer_middlewares::metering::set_remaining_points; @@ -147,7 +150,8 @@ mod tests { assert!(cache_entry.is_none()); // Compile module - let (mut store, original) = compile(&wasm, None, &[]).unwrap(); + let (engine, original) = compile(&wasm, &[]).unwrap(); + let mut store = make_store_with_engine(engine.clone(), None); // Ensure original module can be executed { @@ -160,18 +164,19 @@ mod tests { // Store module let size = wasm.len() * TESTING_WASM_SIZE_FACTOR; - cache.store(&checksum, (store, original), size).unwrap(); + cache + .store(&checksum, (engine.clone(), original), size) + .unwrap(); // Load module - let mut cached = cache.load(&checksum).unwrap().unwrap(); + let cached = cache.load(&checksum).unwrap().unwrap(); // Ensure cached module can be executed { - let instance = - WasmerInstance::new(&mut cached.store, &cached.module, &imports! {}).unwrap(); - set_remaining_points(&mut cached.store, &instance, TESTING_GAS_LIMIT); + let instance = WasmerInstance::new(&mut store, &cached.module, &imports! {}).unwrap(); + set_remaining_points(&mut store, &instance, TESTING_GAS_LIMIT); let add_one = instance.exports.get_function("add_one").unwrap(); - let result = add_one.call(&mut cached.store, &[42.into()]).unwrap(); + let result = add_one.call(&mut store, &[42.into()]).unwrap(); assert_eq!(result[0].unwrap_i32(), 43); } } @@ -219,19 +224,19 @@ mod tests { // Add 1 cache - .store(&checksum1, compile(&wasm1, None, &[]).unwrap(), 900_000) + .store(&checksum1, compile(&wasm1, &[]).unwrap(), 900_000) .unwrap(); assert_eq!(cache.len(), 1); // Add 2 cache - .store(&checksum2, compile(&wasm2, None, &[]).unwrap(), 900_000) + .store(&checksum2, compile(&wasm2, &[]).unwrap(), 900_000) .unwrap(); assert_eq!(cache.len(), 2); // Add 3 (pushes out the previous two) cache - .store(&checksum3, compile(&wasm3, None, &[]).unwrap(), 1_500_000) + .store(&checksum3, compile(&wasm3, &[]).unwrap(), 1_500_000) .unwrap(); assert_eq!(cache.len(), 1); } @@ -279,19 +284,19 @@ mod tests { // Add 1 cache - .store(&checksum1, compile(&wasm1, None, &[]).unwrap(), 900_000) + .store(&checksum1, compile(&wasm1, &[]).unwrap(), 900_000) .unwrap(); assert_eq!(cache.size(), 900_000); // Add 2 cache - .store(&checksum2, compile(&wasm2, None, &[]).unwrap(), 800_000) + .store(&checksum2, compile(&wasm2, &[]).unwrap(), 800_000) .unwrap(); assert_eq!(cache.size(), 1_700_000); // Add 3 (pushes out the previous two) cache - .store(&checksum3, compile(&wasm3, None, &[]).unwrap(), 1_500_000) + .store(&checksum3, compile(&wasm3, &[]).unwrap(), 1_500_000) .unwrap(); assert_eq!(cache.size(), 1_500_000); } diff --git a/packages/vm/src/modules/pinned_memory_cache.rs b/packages/vm/src/modules/pinned_memory_cache.rs index de826da085..09d094d0dd 100644 --- a/packages/vm/src/modules/pinned_memory_cache.rs +++ b/packages/vm/src/modules/pinned_memory_cache.rs @@ -1,5 +1,5 @@ use std::collections::HashMap; -use wasmer::{Module, Store}; +use wasmer::{Engine, Module}; use super::sized_module::CachedModule; use crate::{Checksum, VmResult}; @@ -20,13 +20,13 @@ impl PinnedMemoryCache { pub fn store( &mut self, checksum: &Checksum, - element: (Store, Module), + element: (Engine, Module), size: usize, ) -> VmResult<()> { self.modules.insert( *checksum, CachedModule { - store: element.0, + engine: element.0, module: element.1, size, }, @@ -68,7 +68,7 @@ impl PinnedMemoryCache { #[cfg(test)] mod tests { use super::*; - use crate::wasm_backend::compile; + use crate::wasm_backend::{compile, make_store_with_engine}; use wasmer::{imports, Instance as WasmerInstance}; use wasmer_middlewares::metering::set_remaining_points; @@ -96,7 +96,8 @@ mod tests { assert!(cache_entry.is_none()); // Compile module - let (mut store, original) = compile(&wasm, None, &[]).unwrap(); + let (engine, original) = compile(&wasm, &[]).unwrap(); + let mut store = make_store_with_engine(engine.clone(), None); // Ensure original module can be executed { @@ -108,18 +109,18 @@ mod tests { } // Store module - cache.store(&checksum, (store, original), 0).unwrap(); + cache.store(&checksum, (engine, original), 0).unwrap(); // Load module - let mut cached = cache.load(&checksum).unwrap().unwrap(); + let cached = cache.load(&checksum).unwrap().unwrap(); + let mut store = make_store_with_engine(cached.engine, None); // Ensure cached module can be executed { - let instance = - WasmerInstance::new(&mut cached.store, &cached.module, &imports! {}).unwrap(); - set_remaining_points(&mut cached.store, &instance, TESTING_GAS_LIMIT); + let instance = WasmerInstance::new(&mut store, &cached.module, &imports! {}).unwrap(); + set_remaining_points(&mut store, &instance, TESTING_GAS_LIMIT); let add_one = instance.exports.get_function("add_one").unwrap(); - let result = add_one.call(&mut cached.store, &[42.into()]).unwrap(); + let result = add_one.call(&mut store, &[42.into()]).unwrap(); assert_eq!(result[0].unwrap_i32(), 43); } } @@ -144,8 +145,8 @@ mod tests { assert!(!cache.has(&checksum)); // Add - let (store, original) = compile(&wasm, None, &[]).unwrap(); - cache.store(&checksum, (store, original), 0).unwrap(); + let (engine, original) = compile(&wasm, &[]).unwrap(); + cache.store(&checksum, (engine, original), 0).unwrap(); assert!(cache.has(&checksum)); @@ -175,8 +176,8 @@ mod tests { assert_eq!(cache.len(), 0); // Add - let (store, original) = compile(&wasm, None, &[]).unwrap(); - cache.store(&checksum, (store, original), 0).unwrap(); + let (engine, original) = compile(&wasm, &[]).unwrap(); + cache.store(&checksum, (engine, original), 0).unwrap(); assert_eq!(cache.len(), 1); @@ -218,13 +219,13 @@ mod tests { // Add 1 cache - .store(&checksum1, compile(&wasm1, None, &[]).unwrap(), 500) + .store(&checksum1, compile(&wasm1, &[]).unwrap(), 500) .unwrap(); assert_eq!(cache.size(), 500); // Add 2 cache - .store(&checksum2, compile(&wasm2, None, &[]).unwrap(), 300) + .store(&checksum2, compile(&wasm2, &[]).unwrap(), 300) .unwrap(); assert_eq!(cache.size(), 800); diff --git a/packages/vm/src/modules/sized_module.rs b/packages/vm/src/modules/sized_module.rs index a5ec46b59d..027242a588 100644 --- a/packages/vm/src/modules/sized_module.rs +++ b/packages/vm/src/modules/sized_module.rs @@ -1,8 +1,8 @@ -use wasmer::{Module, Store}; +use wasmer::{Engine, Module}; -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct CachedModule { - pub store: Store, + pub engine: Engine, pub module: Module, /// The estimated size of this element in memory pub size: usize, diff --git a/packages/vm/src/modules/versioning.rs b/packages/vm/src/modules/versioning.rs index 4fa850aae0..6b1984c89d 100644 --- a/packages/vm/src/modules/versioning.rs +++ b/packages/vm/src/modules/versioning.rs @@ -12,7 +12,7 @@ const METADATA_HEADER_LEN: usize = 16; // https://github.com/wasmerio/wasmer/blo fn current_wasmer_module_header() -> Vec { // echo "(module)" > my.wat && wat2wasm my.wat && hexdump -C my.wasm const WASM: &[u8] = b"\x00\x61\x73\x6d\x01\x00\x00\x00"; - let (_, module) = compile(WASM, None, &[]).unwrap(); + let (_, module) = compile(WASM, &[]).unwrap(); let mut bytes = module.serialize().unwrap_or_default(); bytes.truncate(ENGINE_TYPE_LEN + METADATA_HEADER_LEN); diff --git a/packages/vm/src/wasm_backend/compile.rs b/packages/vm/src/wasm_backend/compile.rs index 4a26490f2f..64296849fe 100644 --- a/packages/vm/src/wasm_backend/compile.rs +++ b/packages/vm/src/wasm_backend/compile.rs @@ -1,24 +1,18 @@ use std::sync::Arc; -use wasmer::{Module, ModuleMiddleware, Store}; +use wasmer::{Engine, Module, ModuleMiddleware}; use crate::errors::VmResult; -use crate::size::Size; - -use super::store::make_compile_time_store; +use crate::wasm_backend::make_engine; /// Compiles a given Wasm bytecode into a module. -/// The given memory limit (in bytes) is used when memories are created. -/// If no memory limit is passed, the resulting compiled module should -/// not be used for execution. pub fn compile( code: &[u8], - memory_limit: Option, middlewares: &[Arc], -) -> VmResult<(Store, Module)> { - let store = make_compile_time_store(memory_limit, middlewares); - let module = Module::new(&store, code)?; - Ok((store, module)) +) -> VmResult<(Engine, Module)> { + let engine = make_engine(middlewares); + let module = Module::new(&engine, code)?; + Ok((engine, module)) } #[cfg(test)] @@ -29,7 +23,7 @@ mod tests { #[test] fn contract_with_floats_fails_check() { - let err = compile(CONTRACT, None, &[]).unwrap_err(); + let err = compile(CONTRACT, &[]).unwrap_err(); assert!(err.to_string().contains("Float operator detected:")); } } diff --git a/packages/vm/src/wasm_backend/mod.rs b/packages/vm/src/wasm_backend/mod.rs index af4a6ba227..397ae19a60 100644 --- a/packages/vm/src/wasm_backend/mod.rs +++ b/packages/vm/src/wasm_backend/mod.rs @@ -7,3 +7,4 @@ pub use compile::compile; pub use limiting_tunables::LimitingTunables; pub use store::make_engine; pub use store::make_runtime_store; +pub use store::make_store_with_engine; diff --git a/packages/vm/src/wasm_backend/store.rs b/packages/vm/src/wasm_backend/store.rs index 77790c59e8..609bea6eb7 100644 --- a/packages/vm/src/wasm_backend/store.rs +++ b/packages/vm/src/wasm_backend/store.rs @@ -32,6 +32,7 @@ fn cost(_operator: &Operator) -> u64 { /// Created a store with the default compiler and the given memory limit (in bytes). /// If memory_limit is None, no limit is applied. +#[allow(dead_code)] pub fn make_compile_time_store( memory_limit: Option, middlewares: &[Arc], @@ -51,6 +52,7 @@ pub fn make_compile_time_store( make_store_with_engine(compiler.into(), memory_limit) } + // TODO #[cfg(not(feature = "cranelift"))] { let mut compiler = Singlepass::default(); @@ -101,7 +103,7 @@ pub fn make_runtime_store(memory_limit: Option) -> Store { /// Creates a store from an engine and an optional memory limit. /// If no limit is set, the no custom tunables will be used. -fn make_store_with_engine(mut engine: Engine, memory_limit: Option) -> Store { +pub fn make_store_with_engine(mut engine: Engine, memory_limit: Option) -> Store { if let Some(limit) = memory_limit { let base = BaseTunables::for_target(&Target::default()); let tunables = LimitingTunables::new(base, limit_to_pages(limit)); From 77d0c5d377d8f4473084809b0f28b31265108716 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 17 May 2023 06:02:23 +0200 Subject: [PATCH 0285/2372] Store memory limit in cache --- packages/vm/src/cache.rs | 35 +++++++++++++------ packages/vm/src/modules/in_memory_cache.rs | 16 +++++---- .../vm/src/modules/pinned_memory_cache.rs | 14 ++++---- packages/vm/src/modules/sized_module.rs | 2 ++ 4 files changed, 44 insertions(+), 23 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index ad3d5cdc12..1d0f472861 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -261,9 +261,13 @@ where let engine = Engine::headless(); if let Some((module, module_size)) = cache.fs_cache.load(checksum, &engine)? { cache.stats.hits_fs_cache = cache.stats.hits_fs_cache.saturating_add(1); - return cache - .pinned_memory_cache - .store(checksum, (engine, module), module_size); + let memory_limit = Some(cache.instance_memory_limit); + return cache.pinned_memory_cache.store( + checksum, + (engine, module), + memory_limit, + module_size, + ); } // Re-compile from original Wasm bytecode @@ -271,9 +275,10 @@ where let (engine, module) = compile(&code, &[])?; // Store into the fs cache too let module_size = cache.fs_cache.store(checksum, &module)?; + let memory_limit = Some(cache.instance_memory_limit); cache .pinned_memory_cache - .store(checksum, (engine, module), module_size) + .store(checksum, (engine, module), memory_limit, module_size) } /// Unpins a Module, i.e. removes it from the pinned memory cache. @@ -337,12 +342,17 @@ where if let Some((module, module_size)) = cache.fs_cache.load(checksum, &engine)? { cache.stats.hits_fs_cache = cache.stats.hits_fs_cache.saturating_add(1); - cache - .memory_cache - .store(checksum, (engine.clone(), module.clone()), module_size)?; + let memory_limit = Some(cache.instance_memory_limit); + cache.memory_cache.store( + checksum, + (engine.clone(), module.clone()), + memory_limit, + module_size, + )?; let cached = CachedModule { engine, module, + store_memory_limit: memory_limit, size: module_size, }; return Ok((cached, false)); @@ -358,12 +368,17 @@ where let (engine, module) = compile(&wasm, &[])?; let module_size = cache.fs_cache.store(checksum, &module)?; - cache - .memory_cache - .store(checksum, (engine.clone(), module.clone()), module_size)?; + let memory_limit = Some(cache.instance_memory_limit); + cache.memory_cache.store( + checksum, + (engine.clone(), module.clone()), + memory_limit, + module_size, + )?; let cached = CachedModule { engine, module, + store_memory_limit: memory_limit, size: module_size, }; Ok((cached, false)) diff --git a/packages/vm/src/modules/in_memory_cache.rs b/packages/vm/src/modules/in_memory_cache.rs index 82be922f17..bc705def8e 100644 --- a/packages/vm/src/modules/in_memory_cache.rs +++ b/packages/vm/src/modules/in_memory_cache.rs @@ -53,6 +53,7 @@ impl InMemoryCache { &mut self, checksum: &Checksum, entry: (Engine, Module), + memory_limit: Option, size: usize, ) -> VmResult<()> { if let Some(modules) = &mut self.modules { @@ -62,6 +63,7 @@ impl InMemoryCache { CachedModule { engine: entry.0, module: entry.1, + store_memory_limit: memory_limit, size, }, ) @@ -165,7 +167,7 @@ mod tests { // Store module let size = wasm.len() * TESTING_WASM_SIZE_FACTOR; cache - .store(&checksum, (engine.clone(), original), size) + .store(&checksum, (engine.clone(), original), None, size) .unwrap(); // Load module @@ -224,19 +226,19 @@ mod tests { // Add 1 cache - .store(&checksum1, compile(&wasm1, &[]).unwrap(), 900_000) + .store(&checksum1, compile(&wasm1, &[]).unwrap(), None, 900_000) .unwrap(); assert_eq!(cache.len(), 1); // Add 2 cache - .store(&checksum2, compile(&wasm2, &[]).unwrap(), 900_000) + .store(&checksum2, compile(&wasm2, &[]).unwrap(), None, 900_000) .unwrap(); assert_eq!(cache.len(), 2); // Add 3 (pushes out the previous two) cache - .store(&checksum3, compile(&wasm3, &[]).unwrap(), 1_500_000) + .store(&checksum3, compile(&wasm3, &[]).unwrap(), None, 1_500_000) .unwrap(); assert_eq!(cache.len(), 1); } @@ -284,19 +286,19 @@ mod tests { // Add 1 cache - .store(&checksum1, compile(&wasm1, &[]).unwrap(), 900_000) + .store(&checksum1, compile(&wasm1, &[]).unwrap(), None, 900_000) .unwrap(); assert_eq!(cache.size(), 900_000); // Add 2 cache - .store(&checksum2, compile(&wasm2, &[]).unwrap(), 800_000) + .store(&checksum2, compile(&wasm2, &[]).unwrap(), None, 800_000) .unwrap(); assert_eq!(cache.size(), 1_700_000); // Add 3 (pushes out the previous two) cache - .store(&checksum3, compile(&wasm3, &[]).unwrap(), 1_500_000) + .store(&checksum3, compile(&wasm3, &[]).unwrap(), None, 1_500_000) .unwrap(); assert_eq!(cache.size(), 1_500_000); } diff --git a/packages/vm/src/modules/pinned_memory_cache.rs b/packages/vm/src/modules/pinned_memory_cache.rs index 09d094d0dd..12cf3cea99 100644 --- a/packages/vm/src/modules/pinned_memory_cache.rs +++ b/packages/vm/src/modules/pinned_memory_cache.rs @@ -2,7 +2,7 @@ use std::collections::HashMap; use wasmer::{Engine, Module}; use super::sized_module::CachedModule; -use crate::{Checksum, VmResult}; +use crate::{Checksum, Size, VmResult}; /// An pinned in memory module cache pub struct PinnedMemoryCache { @@ -21,6 +21,7 @@ impl PinnedMemoryCache { &mut self, checksum: &Checksum, element: (Engine, Module), + memory_limit: Option, size: usize, ) -> VmResult<()> { self.modules.insert( @@ -28,6 +29,7 @@ impl PinnedMemoryCache { CachedModule { engine: element.0, module: element.1, + store_memory_limit: memory_limit, size, }, ); @@ -109,7 +111,7 @@ mod tests { } // Store module - cache.store(&checksum, (engine, original), 0).unwrap(); + cache.store(&checksum, (engine, original), None, 0).unwrap(); // Load module let cached = cache.load(&checksum).unwrap().unwrap(); @@ -146,7 +148,7 @@ mod tests { // Add let (engine, original) = compile(&wasm, &[]).unwrap(); - cache.store(&checksum, (engine, original), 0).unwrap(); + cache.store(&checksum, (engine, original), None, 0).unwrap(); assert!(cache.has(&checksum)); @@ -177,7 +179,7 @@ mod tests { // Add let (engine, original) = compile(&wasm, &[]).unwrap(); - cache.store(&checksum, (engine, original), 0).unwrap(); + cache.store(&checksum, (engine, original), None, 0).unwrap(); assert_eq!(cache.len(), 1); @@ -219,13 +221,13 @@ mod tests { // Add 1 cache - .store(&checksum1, compile(&wasm1, &[]).unwrap(), 500) + .store(&checksum1, compile(&wasm1, &[]).unwrap(), None, 500) .unwrap(); assert_eq!(cache.size(), 500); // Add 2 cache - .store(&checksum2, compile(&wasm2, &[]).unwrap(), 300) + .store(&checksum2, compile(&wasm2, &[]).unwrap(), None, 300) .unwrap(); assert_eq!(cache.size(), 800); diff --git a/packages/vm/src/modules/sized_module.rs b/packages/vm/src/modules/sized_module.rs index 027242a588..b593c427ab 100644 --- a/packages/vm/src/modules/sized_module.rs +++ b/packages/vm/src/modules/sized_module.rs @@ -1,9 +1,11 @@ +use crate::Size; use wasmer::{Engine, Module}; #[derive(Debug, Clone)] pub struct CachedModule { pub engine: Engine, pub module: Module, + pub store_memory_limit: Option, /// The estimated size of this element in memory pub size: usize, } From 97b77e77eac1588735e7691eb10e6e6bf8c40927 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 17 May 2023 06:05:27 +0200 Subject: [PATCH 0286/2372] Use cached memory limit when building store --- packages/vm/src/cache.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 1d0f472861..70ff470f9f 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -303,9 +303,7 @@ where options: InstanceOptions, ) -> VmResult> { let (cached, _from_pinned) = self.get_module(checksum)?; - // FIXME: memory limit - // let store = make_store_with_engine(Some(memory_limit)); - let store = make_store_with_engine(cached.engine, None); + let store = make_store_with_engine(cached.engine, cached.store_memory_limit); let instance = Instance::from_module( store, &cached.module, From d14f3bba661a5f9dc1a1d95faa513390e1e4b7b7 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 17 May 2023 06:06:39 +0200 Subject: [PATCH 0287/2372] Adapt module_size --- packages/vm/examples/module_size.rs | 25 +++++++++++-------------- packages/vm/src/lib.rs | 2 +- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/packages/vm/examples/module_size.rs b/packages/vm/examples/module_size.rs index 5e5c8a308e..7013304a66 100644 --- a/packages/vm/examples/module_size.rs +++ b/packages/vm/examples/module_size.rs @@ -5,14 +5,13 @@ use std::mem; use clap::{App, Arg}; use cosmwasm_vm::internals::compile; -use cosmwasm_vm::internals::make_runtime_store; -use cosmwasm_vm::Size; +use cosmwasm_vm::internals::make_engine; use wasmer::Module; pub fn main() { let matches = App::new("Module size estimation") - .version("0.0.3") - .author("Mauro Lacy ") + .version("0.0.4") + .author("Mauro Lacy ") .arg( Arg::with_name("WASM") .help("Wasm file to read and compile") @@ -35,17 +34,15 @@ pub fn main() { let wasm_size = wasm.len(); println!("wasm size: {} bytes", wasm_size); - let memory_limit = Some(Size::mebi(10)); - // Compile module - let module = module_compile(&wasm, memory_limit); + let module = module_compile(&wasm); mem::drop(wasm); let serialized = module.serialize().unwrap(); mem::drop(module); // Deserialize module - let module = module_deserialize(&serialized, memory_limit); + let module = module_deserialize(&serialized); mem::drop(serialized); // Report (serialized) module size @@ -60,14 +57,14 @@ pub fn main() { } #[inline(never)] -fn module_compile(wasm: &[u8], memory_limit: Option) -> Module { - let (_store, module) = compile(wasm, memory_limit, &[]).unwrap(); +fn module_compile(wasm: &[u8]) -> Module { + let (_engine, module) = compile(wasm, &[]).unwrap(); module } #[inline(never)] -fn module_deserialize(serialized: &[u8], memory_limit: Option) -> Module { - // Deserialize using make_runtime_store() - let store = make_runtime_store(memory_limit); - unsafe { Module::deserialize(&store, serialized) }.unwrap() +fn module_deserialize(serialized: &[u8]) -> Module { + // Deserialize using make_engine() + let engine = make_engine(&[]); + unsafe { Module::deserialize(&engine, serialized) }.unwrap() } diff --git a/packages/vm/src/lib.rs b/packages/vm/src/lib.rs index 1e5ba03837..0c1b541c9c 100644 --- a/packages/vm/src/lib.rs +++ b/packages/vm/src/lib.rs @@ -58,5 +58,5 @@ pub mod internals { pub use crate::compatibility::check_wasm; pub use crate::instance::instance_from_module; - pub use crate::wasm_backend::{compile, make_runtime_store}; + pub use crate::wasm_backend::{compile, make_engine, make_runtime_store}; } From d10b69b4304ea39b623851b36b1c4ec07313e56a Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 17 May 2023 06:07:16 +0200 Subject: [PATCH 0288/2372] Adapt multi_threaded_cache --- packages/vm/examples/multi_threaded_cache.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/vm/examples/multi_threaded_cache.rs b/packages/vm/examples/multi_threaded_cache.rs index 4c9c1914c4..71a7ba944f 100644 --- a/packages/vm/examples/multi_threaded_cache.rs +++ b/packages/vm/examples/multi_threaded_cache.rs @@ -47,7 +47,7 @@ pub fn main() { println!("Done saving Wasm {}", checksum); })); } - for _ in 0..INSTANTIATION_THREADS { + for i in 0..INSTANTIATION_THREADS { let cache = Arc::clone(&cache); threads.push(thread::spawn(move || { @@ -55,7 +55,7 @@ pub fn main() { let mut instance = cache .get_instance(&checksum, mock_backend(&[]), DEFAULT_INSTANCE_OPTIONS) .unwrap(); - println!("Done instantiating contract"); + println!("Done instantiating contract {i}"); let info = mock_info("creator", &coins(1000, "earth")); let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; @@ -68,16 +68,13 @@ pub fn main() { let contract_result = call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); assert!(contract_result.into_result().is_ok()); - - let (cached, pinned, ..) = instance.recycle(); - cache.return_instance(&checksum, cached, pinned).unwrap(); })); } threads.into_iter().for_each(|thread| { thread .join() - .expect("The thread creating or execution failed !") + .expect("The threaded instantiation or execution failed !") }); assert_eq!(cache.stats().misses, 0); From 6b97286d426d8d75e37cc4b8f16a435e11859de3 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 17 May 2023 06:22:45 +0200 Subject: [PATCH 0289/2372] Fix: pinned memory cache --- packages/vm/src/modules/pinned_memory_cache.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/vm/src/modules/pinned_memory_cache.rs b/packages/vm/src/modules/pinned_memory_cache.rs index 12cf3cea99..dd90113414 100644 --- a/packages/vm/src/modules/pinned_memory_cache.rs +++ b/packages/vm/src/modules/pinned_memory_cache.rs @@ -45,7 +45,10 @@ impl PinnedMemoryCache { /// Looks up a module in the cache and creates a new module pub fn load(&mut self, checksum: &Checksum) -> VmResult> { - Ok(self.modules.remove(checksum)) + match self.modules.get(checksum) { + Some(cached) => Ok(Some(cached.clone())), + None => Ok(None), + } } /// Returns true if and only if this cache has an entry identified by the given checksum From a8849c6af99ca9786b81d83492f7c2a101fbac58 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 17 May 2023 06:38:01 +0200 Subject: [PATCH 0290/2372] Fix: multiple cached instances test --- packages/vm/src/cache.rs | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 70ff470f9f..8a08bfcabb 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -947,48 +947,40 @@ mod tests { // these differentiate the two instances of the same contract let backend1 = mock_backend(&[]); let backend2 = mock_backend(&[]); - let backend3 = mock_backend(&[]); - let backend4 = mock_backend(&[]); // init instance 1 - let mut instance = cache + let mut instance1 = cache .get_instance(&checksum, backend1, TESTING_OPTIONS) .unwrap(); let info = mock_info("owner1", &coins(1000, "earth")); let msg = br#"{"verifier": "sue", "beneficiary": "mary"}"#; let res = - call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); + call_instantiate::<_, _, _, Empty>(&mut instance1, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); // init instance 2 - let mut instance = cache + let mut instance2 = cache .get_instance(&checksum, backend2, TESTING_OPTIONS) .unwrap(); let info = mock_info("owner2", &coins(500, "earth")); let msg = br#"{"verifier": "bob", "beneficiary": "john"}"#; let res = - call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); + call_instantiate::<_, _, _, Empty>(&mut instance2, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); // run contract 2 - just sanity check - results validate in contract unit tests - let mut instance = cache - .get_instance(&checksum, backend3, TESTING_OPTIONS) - .unwrap(); let info = mock_info("bob", &coins(15, "earth")); let msg = br#"{"release":{}}"#; - let res = call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); + let res = call_execute::<_, _, _, Empty>(&mut instance2, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; assert_eq!(1, msgs.len()); // run contract 1 - just sanity check - results validate in contract unit tests - let mut instance = cache - .get_instance(&checksum, backend4, TESTING_OPTIONS) - .unwrap(); let info = mock_info("sue", &coins(15, "earth")); let msg = br#"{"release":{}}"#; - let res = call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); + let res = call_execute::<_, _, _, Empty>(&mut instance1, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; assert_eq!(1, msgs.len()); } From 65ca1b3b0b2f1e2b66e55f827133d65e1e21c8d1 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 17 May 2023 06:59:26 +0200 Subject: [PATCH 0291/2372] Restore instance recycle --- packages/vm/src/cache.rs | 22 +++++++++++++++------ packages/vm/src/environment.rs | 8 ++++++++ packages/vm/src/instance.rs | 36 ++++++++++++++++++++++++++++++++-- 3 files changed, 58 insertions(+), 8 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 8a08bfcabb..bd84743b13 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -949,38 +949,48 @@ mod tests { let backend2 = mock_backend(&[]); // init instance 1 - let mut instance1 = cache + let mut instance = cache .get_instance(&checksum, backend1, TESTING_OPTIONS) .unwrap(); let info = mock_info("owner1", &coins(1000, "earth")); let msg = br#"{"verifier": "sue", "beneficiary": "mary"}"#; let res = - call_instantiate::<_, _, _, Empty>(&mut instance1, &mock_env(), &info, msg).unwrap(); + call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); + let (_cached, backend1) = instance.recycle(); + let backend1 = backend1.unwrap(); // init instance 2 - let mut instance2 = cache + let mut instance = cache .get_instance(&checksum, backend2, TESTING_OPTIONS) .unwrap(); let info = mock_info("owner2", &coins(500, "earth")); let msg = br#"{"verifier": "bob", "beneficiary": "john"}"#; let res = - call_instantiate::<_, _, _, Empty>(&mut instance2, &mock_env(), &info, msg).unwrap(); + call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); + let (_cached, backend2) = instance.recycle(); + let backend2 = backend2.unwrap(); // run contract 2 - just sanity check - results validate in contract unit tests + let mut instance = cache + .get_instance(&checksum, backend2, TESTING_OPTIONS) + .unwrap(); let info = mock_info("bob", &coins(15, "earth")); let msg = br#"{"release":{}}"#; - let res = call_execute::<_, _, _, Empty>(&mut instance2, &mock_env(), &info, msg).unwrap(); + let res = call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; assert_eq!(1, msgs.len()); // run contract 1 - just sanity check - results validate in contract unit tests + let mut instance = cache + .get_instance(&checksum, backend1, TESTING_OPTIONS) + .unwrap(); let info = mock_info("sue", &coins(15, "earth")); let msg = br#"{"release":{}}"#; - let res = call_execute::<_, _, _, Empty>(&mut instance1, &mock_env(), &info, msg).unwrap(); + let res = call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; assert_eq!(1, msgs.len()); } diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index daa7f2fc1b..c85510710f 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -382,6 +382,14 @@ impl Environment { context_data.querier = Some(querier); }); } + + /// Returns the original storage and querier as owned instances, and closes any remaining + /// iterators. This is meant to be called when recycling the instance. + pub fn move_out(&self) -> (Option, Option) { + self.with_context_data_mut(|context_data| { + (context_data.storage.take(), context_data.querier.take()) + }) + } } pub struct ContextData { diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 2d60c1296b..a0ba48ae1f 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -4,7 +4,8 @@ use std::rc::Rc; use std::sync::Mutex; use wasmer::{ - Exports, Function, FunctionEnv, Imports, Instance as WasmerInstance, Module, Store, Value, + AsEngineRef, Exports, Function, FunctionEnv, Imports, Instance as WasmerInstance, Module, + Store, Value, }; use crate::backend::{Backend, BackendApi, Querier, Storage}; @@ -23,7 +24,8 @@ use crate::memory::{read_region, write_region}; use crate::size::Size; use crate::wasm_backend::{compile, make_store_with_engine}; -pub use crate::environment::DebugInfo; // Re-exported as public via to be usable for set_debug_handler +pub use crate::environment::DebugInfo; +use crate::modules::CachedModule; // Re-exported as public via to be usable for set_debug_handler #[derive(Copy, Clone, Debug)] pub struct GasReport { @@ -282,6 +284,36 @@ where &self.fe.as_ref(&self.store).api } + /// Decomposes this instance into its components. + /// External dependencies are returned for reuse, the rest is dropped. + pub fn recycle(self) -> (CachedModule, Option>) { + let Instance { + _inner, fe, store, .. + } = self; + + let env = fe.as_ref(&store); + let backend = if let (Some(storage), Some(querier)) = env.move_out() { + let api = env.api; + Some(Backend { + api, + storage, + querier, + }) + } else { + None + }; + + ( + CachedModule { + engine: store.as_engine_ref().engine().clone(), + module: _inner.module().clone(), + store_memory_limit: None, // FIXME: Restore memory limit! + size: 234, + }, + backend, + ) + } + pub fn set_debug_handler(&mut self, debug_handler: H) where H: for<'a> Fn(/* msg */ &'a str, DebugInfo<'a>) + 'static, From b009efb778e3d516d3b81d7605b5efb3f638d922 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 17 May 2023 07:05:46 +0200 Subject: [PATCH 0292/2372] Restore recycle original signature --- packages/vm/src/cache.rs | 6 ++---- packages/vm/src/instance.rs | 20 ++++---------------- 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index bd84743b13..95cd851c3f 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -958,8 +958,7 @@ mod tests { call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); - let (_cached, backend1) = instance.recycle(); - let backend1 = backend1.unwrap(); + let backend1 = instance.recycle().unwrap(); // init instance 2 let mut instance = cache @@ -971,8 +970,7 @@ mod tests { call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); - let (_cached, backend2) = instance.recycle(); - let backend2 = backend2.unwrap(); + let backend2 = instance.recycle().unwrap(); // run contract 2 - just sanity check - results validate in contract unit tests let mut instance = cache diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index a0ba48ae1f..6c6620b89c 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -4,8 +4,7 @@ use std::rc::Rc; use std::sync::Mutex; use wasmer::{ - AsEngineRef, Exports, Function, FunctionEnv, Imports, Instance as WasmerInstance, Module, - Store, Value, + Exports, Function, FunctionEnv, Imports, Instance as WasmerInstance, Module, Store, Value, }; use crate::backend::{Backend, BackendApi, Querier, Storage}; @@ -25,7 +24,6 @@ use crate::size::Size; use crate::wasm_backend::{compile, make_store_with_engine}; pub use crate::environment::DebugInfo; -use crate::modules::CachedModule; // Re-exported as public via to be usable for set_debug_handler #[derive(Copy, Clone, Debug)] pub struct GasReport { @@ -286,13 +284,13 @@ where /// Decomposes this instance into its components. /// External dependencies are returned for reuse, the rest is dropped. - pub fn recycle(self) -> (CachedModule, Option>) { + pub fn recycle(self) -> Option> { let Instance { _inner, fe, store, .. } = self; let env = fe.as_ref(&store); - let backend = if let (Some(storage), Some(querier)) = env.move_out() { + if let (Some(storage), Some(querier)) = env.move_out() { let api = env.api; Some(Backend { api, @@ -301,17 +299,7 @@ where }) } else { None - }; - - ( - CachedModule { - engine: store.as_engine_ref().engine().clone(), - module: _inner.module().clone(), - store_memory_limit: None, // FIXME: Restore memory limit! - size: 234, - }, - backend, - ) + } } pub fn set_debug_handler(&mut self, debug_handler: H) From 6141876e392019ecc2b6272c388b94438b588bc6 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 17 May 2023 07:07:42 +0200 Subject: [PATCH 0293/2372] Fix clippy warning --- packages/vm/src/modules/in_memory_cache.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vm/src/modules/in_memory_cache.rs b/packages/vm/src/modules/in_memory_cache.rs index bc705def8e..cebb9ce882 100644 --- a/packages/vm/src/modules/in_memory_cache.rs +++ b/packages/vm/src/modules/in_memory_cache.rs @@ -167,7 +167,7 @@ mod tests { // Store module let size = wasm.len() * TESTING_WASM_SIZE_FACTOR; cache - .store(&checksum, (engine.clone(), original), None, size) + .store(&checksum, (engine, original), None, size) .unwrap(); // Load module From 0a1fd8415799f33f946538b328d8acaa8b5c2934 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 17 May 2023 07:43:43 +0200 Subject: [PATCH 0294/2372] Adapt cosmwasm-check --- packages/check/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/check/src/main.rs b/packages/check/src/main.rs index c1f7da1784..894c1dd252 100644 --- a/packages/check/src/main.rs +++ b/packages/check/src/main.rs @@ -93,7 +93,7 @@ fn check_contract( check_wasm(&wasm, available_capabilities)?; // Compile module - compile(&wasm, None, &[])?; + compile(&wasm, &[])?; Ok(()) } From a41226f0f95fdde99f1c38d0443d9531c591ba19 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 17 May 2023 08:02:08 +0200 Subject: [PATCH 0295/2372] Update to wasmer 3.3.x --- Cargo.lock | 34 +++++++++++++++++----------------- packages/vm/Cargo.toml | 4 ++-- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 79dc29ebae..0104d7f434 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2072,9 +2072,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8472807bd8d5062aef0a35681e1b6fbaed8fea88d97910870741100c03b8fef3" +checksum = "78caedecd8cb71ed47ccca03b68d69414a3d278bb031e6f93f15759344efdd52" dependencies = [ "bytes", "cfg-if", @@ -2082,6 +2082,7 @@ dependencies = [ "indexmap", "js-sys", "more-asserts", + "rustc-demangle", "serde", "serde-wasm-bindgen", "target-lexicon", @@ -2099,9 +2100,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e322cdfb8ed189d92cbb5c34acb319c0f04fb9799ed68e127717f255f8b246a" +checksum = "726a8450541af4a57c34af7b6973fdbfc79f896cc7e733429577dfd1d1687180" dependencies = [ "backtrace", "cfg-if", @@ -2112,7 +2113,6 @@ dependencies = [ "memmap2", "more-asserts", "region", - "rustc-demangle", "smallvec", "thiserror", "wasmer-types", @@ -2123,9 +2123,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5240177aca0d8322c890d17d4b1b87f23ccb45340f616f384655aaba18f51bd" +checksum = "a1e5633f90f372563ebbdf3f9799c7b29ba11c90e56cf9b54017112d2e656c95" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -2142,9 +2142,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f824f2e345c288e4394ee0410478dea799747f9ebb319e1d8ad33e33a03545" +checksum = "d4d38957de6f452115c0af3ff08cec268ee248d665b54d4bbf7da60b7453cb97" dependencies = [ "byteorder", "dynasm", @@ -2161,9 +2161,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb6858f330764b1041e68d3c824970064d2fbd8e27704180289fd248ff892c48" +checksum = "97901fdbaae383dbb90ea162cc3a76a9fa58ac39aec7948b4c0b9bbef9307738" dependencies = [ "proc-macro-error", "proc-macro2", @@ -2173,9 +2173,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c5919c0fbbdb0ac8f6d432e7baa796ea49b1381d726bc319c0451f26da11fd" +checksum = "9e028013811035111beb768074b6ccc09eabd77811b1e01fd099b5471924ca16" dependencies = [ "wasmer", "wasmer-types", @@ -2184,9 +2184,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83345e3335fb9b21be6c394bc3d712522447bc8750db8a40ac9170627e3de35" +checksum = "67f1f2839f4f61509550e4ddcd0e658e19f3af862b51c79fda15549d735d659b" dependencies = [ "bytecheck", "enum-iterator", @@ -2200,9 +2200,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ca3cf9a2bb5919ae048231972440767efad7a693afaeb41332ab0796be1c884" +checksum = "043118ec4f16d1714fed3aab758b502b864bd865e1d5188626c9ad290100563f" dependencies = [ "backtrace", "cc", diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 759fd6abbd..d5dc131ab5 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -49,8 +49,8 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " serde_json = "1.0.40" sha2 = "0.10.3" thiserror = "1.0.26" -wasmer = { version = "=3.2.1", default-features = false, features = ["cranelift", "singlepass"] } -wasmer-middlewares = "=3.2.1" +wasmer = { version = "3.3.0", default-features = false, features = ["cranelift", "singlepass"] } +wasmer-middlewares = "3.3.0" # Dependencies that we do not use ourself. We add those entries # to bump the min version of them. From 83397456db6fbee84f821ff7b02c43e78abc5d94 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 17 May 2023 08:14:31 +0200 Subject: [PATCH 0296/2372] Update lock files --- contracts/burner/Cargo.lock | 34 +++++++++++++-------------- contracts/crypto-verify/Cargo.lock | 34 +++++++++++++-------------- contracts/cyberpunk/Cargo.lock | 34 +++++++++++++-------------- contracts/floaty/Cargo.lock | 34 +++++++++++++-------------- contracts/hackatom/Cargo.lock | 34 +++++++++++++-------------- contracts/ibc-reflect-send/Cargo.lock | 34 +++++++++++++-------------- contracts/ibc-reflect/Cargo.lock | 34 +++++++++++++-------------- contracts/queue/Cargo.lock | 34 +++++++++++++-------------- contracts/reflect/Cargo.lock | 34 +++++++++++++-------------- contracts/staking/Cargo.lock | 34 +++++++++++++-------------- contracts/virus/Cargo.lock | 34 +++++++++++++-------------- 11 files changed, 187 insertions(+), 187 deletions(-) diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 189bd2bb75..058da123c4 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -1659,9 +1659,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8472807bd8d5062aef0a35681e1b6fbaed8fea88d97910870741100c03b8fef3" +checksum = "78caedecd8cb71ed47ccca03b68d69414a3d278bb031e6f93f15759344efdd52" dependencies = [ "bytes", "cfg-if", @@ -1669,6 +1669,7 @@ dependencies = [ "indexmap", "js-sys", "more-asserts", + "rustc-demangle", "serde", "serde-wasm-bindgen", "target-lexicon", @@ -1686,9 +1687,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e322cdfb8ed189d92cbb5c34acb319c0f04fb9799ed68e127717f255f8b246a" +checksum = "726a8450541af4a57c34af7b6973fdbfc79f896cc7e733429577dfd1d1687180" dependencies = [ "backtrace", "cfg-if", @@ -1699,7 +1700,6 @@ dependencies = [ "memmap2", "more-asserts", "region", - "rustc-demangle", "smallvec", "thiserror", "wasmer-types", @@ -1710,9 +1710,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5240177aca0d8322c890d17d4b1b87f23ccb45340f616f384655aaba18f51bd" +checksum = "a1e5633f90f372563ebbdf3f9799c7b29ba11c90e56cf9b54017112d2e656c95" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1729,9 +1729,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f824f2e345c288e4394ee0410478dea799747f9ebb319e1d8ad33e33a03545" +checksum = "d4d38957de6f452115c0af3ff08cec268ee248d665b54d4bbf7da60b7453cb97" dependencies = [ "byteorder", "dynasm", @@ -1748,9 +1748,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb6858f330764b1041e68d3c824970064d2fbd8e27704180289fd248ff892c48" +checksum = "97901fdbaae383dbb90ea162cc3a76a9fa58ac39aec7948b4c0b9bbef9307738" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1760,9 +1760,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c5919c0fbbdb0ac8f6d432e7baa796ea49b1381d726bc319c0451f26da11fd" +checksum = "9e028013811035111beb768074b6ccc09eabd77811b1e01fd099b5471924ca16" dependencies = [ "wasmer", "wasmer-types", @@ -1771,9 +1771,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83345e3335fb9b21be6c394bc3d712522447bc8750db8a40ac9170627e3de35" +checksum = "67f1f2839f4f61509550e4ddcd0e658e19f3af862b51c79fda15549d735d659b" dependencies = [ "bytecheck", "enum-iterator", @@ -1787,9 +1787,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ca3cf9a2bb5919ae048231972440767efad7a693afaeb41332ab0796be1c884" +checksum = "043118ec4f16d1714fed3aab758b502b864bd865e1d5188626c9ad290100563f" dependencies = [ "backtrace", "cc", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index b476d30f71..ce6310104b 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -1711,9 +1711,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8472807bd8d5062aef0a35681e1b6fbaed8fea88d97910870741100c03b8fef3" +checksum = "78caedecd8cb71ed47ccca03b68d69414a3d278bb031e6f93f15759344efdd52" dependencies = [ "bytes", "cfg-if", @@ -1721,6 +1721,7 @@ dependencies = [ "indexmap", "js-sys", "more-asserts", + "rustc-demangle", "serde", "serde-wasm-bindgen", "target-lexicon", @@ -1738,9 +1739,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e322cdfb8ed189d92cbb5c34acb319c0f04fb9799ed68e127717f255f8b246a" +checksum = "726a8450541af4a57c34af7b6973fdbfc79f896cc7e733429577dfd1d1687180" dependencies = [ "backtrace", "cfg-if", @@ -1751,7 +1752,6 @@ dependencies = [ "memmap2", "more-asserts", "region", - "rustc-demangle", "smallvec", "thiserror", "wasmer-types", @@ -1762,9 +1762,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5240177aca0d8322c890d17d4b1b87f23ccb45340f616f384655aaba18f51bd" +checksum = "a1e5633f90f372563ebbdf3f9799c7b29ba11c90e56cf9b54017112d2e656c95" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1781,9 +1781,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f824f2e345c288e4394ee0410478dea799747f9ebb319e1d8ad33e33a03545" +checksum = "d4d38957de6f452115c0af3ff08cec268ee248d665b54d4bbf7da60b7453cb97" dependencies = [ "byteorder", "dynasm", @@ -1800,9 +1800,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb6858f330764b1041e68d3c824970064d2fbd8e27704180289fd248ff892c48" +checksum = "97901fdbaae383dbb90ea162cc3a76a9fa58ac39aec7948b4c0b9bbef9307738" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1812,9 +1812,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c5919c0fbbdb0ac8f6d432e7baa796ea49b1381d726bc319c0451f26da11fd" +checksum = "9e028013811035111beb768074b6ccc09eabd77811b1e01fd099b5471924ca16" dependencies = [ "wasmer", "wasmer-types", @@ -1823,9 +1823,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83345e3335fb9b21be6c394bc3d712522447bc8750db8a40ac9170627e3de35" +checksum = "67f1f2839f4f61509550e4ddcd0e658e19f3af862b51c79fda15549d735d659b" dependencies = [ "bytecheck", "enum-iterator", @@ -1839,9 +1839,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ca3cf9a2bb5919ae048231972440767efad7a693afaeb41332ab0796be1c884" +checksum = "043118ec4f16d1714fed3aab758b502b864bd865e1d5188626c9ad290100563f" dependencies = [ "backtrace", "cc", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 0aef98730a..6d8a81a76f 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -1709,9 +1709,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8472807bd8d5062aef0a35681e1b6fbaed8fea88d97910870741100c03b8fef3" +checksum = "78caedecd8cb71ed47ccca03b68d69414a3d278bb031e6f93f15759344efdd52" dependencies = [ "bytes", "cfg-if", @@ -1719,6 +1719,7 @@ dependencies = [ "indexmap", "js-sys", "more-asserts", + "rustc-demangle", "serde", "serde-wasm-bindgen", "target-lexicon", @@ -1736,9 +1737,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e322cdfb8ed189d92cbb5c34acb319c0f04fb9799ed68e127717f255f8b246a" +checksum = "726a8450541af4a57c34af7b6973fdbfc79f896cc7e733429577dfd1d1687180" dependencies = [ "backtrace", "cfg-if", @@ -1749,7 +1750,6 @@ dependencies = [ "memmap2", "more-asserts", "region", - "rustc-demangle", "smallvec", "thiserror", "wasmer-types", @@ -1760,9 +1760,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5240177aca0d8322c890d17d4b1b87f23ccb45340f616f384655aaba18f51bd" +checksum = "a1e5633f90f372563ebbdf3f9799c7b29ba11c90e56cf9b54017112d2e656c95" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1779,9 +1779,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f824f2e345c288e4394ee0410478dea799747f9ebb319e1d8ad33e33a03545" +checksum = "d4d38957de6f452115c0af3ff08cec268ee248d665b54d4bbf7da60b7453cb97" dependencies = [ "byteorder", "dynasm", @@ -1798,9 +1798,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb6858f330764b1041e68d3c824970064d2fbd8e27704180289fd248ff892c48" +checksum = "97901fdbaae383dbb90ea162cc3a76a9fa58ac39aec7948b4c0b9bbef9307738" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1810,9 +1810,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c5919c0fbbdb0ac8f6d432e7baa796ea49b1381d726bc319c0451f26da11fd" +checksum = "9e028013811035111beb768074b6ccc09eabd77811b1e01fd099b5471924ca16" dependencies = [ "wasmer", "wasmer-types", @@ -1821,9 +1821,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83345e3335fb9b21be6c394bc3d712522447bc8750db8a40ac9170627e3de35" +checksum = "67f1f2839f4f61509550e4ddcd0e658e19f3af862b51c79fda15549d735d659b" dependencies = [ "bytecheck", "enum-iterator", @@ -1837,9 +1837,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ca3cf9a2bb5919ae048231972440767efad7a693afaeb41332ab0796be1c884" +checksum = "043118ec4f16d1714fed3aab758b502b864bd865e1d5188626c9ad290100563f" dependencies = [ "backtrace", "cc", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 8d7cc679a7..082bcd5d50 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -1669,9 +1669,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8472807bd8d5062aef0a35681e1b6fbaed8fea88d97910870741100c03b8fef3" +checksum = "78caedecd8cb71ed47ccca03b68d69414a3d278bb031e6f93f15759344efdd52" dependencies = [ "bytes", "cfg-if", @@ -1679,6 +1679,7 @@ dependencies = [ "indexmap", "js-sys", "more-asserts", + "rustc-demangle", "serde", "serde-wasm-bindgen", "target-lexicon", @@ -1696,9 +1697,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e322cdfb8ed189d92cbb5c34acb319c0f04fb9799ed68e127717f255f8b246a" +checksum = "726a8450541af4a57c34af7b6973fdbfc79f896cc7e733429577dfd1d1687180" dependencies = [ "backtrace", "cfg-if", @@ -1709,7 +1710,6 @@ dependencies = [ "memmap2", "more-asserts", "region", - "rustc-demangle", "smallvec", "thiserror", "wasmer-types", @@ -1720,9 +1720,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5240177aca0d8322c890d17d4b1b87f23ccb45340f616f384655aaba18f51bd" +checksum = "a1e5633f90f372563ebbdf3f9799c7b29ba11c90e56cf9b54017112d2e656c95" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1739,9 +1739,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f824f2e345c288e4394ee0410478dea799747f9ebb319e1d8ad33e33a03545" +checksum = "d4d38957de6f452115c0af3ff08cec268ee248d665b54d4bbf7da60b7453cb97" dependencies = [ "byteorder", "dynasm", @@ -1758,9 +1758,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb6858f330764b1041e68d3c824970064d2fbd8e27704180289fd248ff892c48" +checksum = "97901fdbaae383dbb90ea162cc3a76a9fa58ac39aec7948b4c0b9bbef9307738" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1770,9 +1770,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c5919c0fbbdb0ac8f6d432e7baa796ea49b1381d726bc319c0451f26da11fd" +checksum = "9e028013811035111beb768074b6ccc09eabd77811b1e01fd099b5471924ca16" dependencies = [ "wasmer", "wasmer-types", @@ -1781,9 +1781,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83345e3335fb9b21be6c394bc3d712522447bc8750db8a40ac9170627e3de35" +checksum = "67f1f2839f4f61509550e4ddcd0e658e19f3af862b51c79fda15549d735d659b" dependencies = [ "bytecheck", "enum-iterator", @@ -1797,9 +1797,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ca3cf9a2bb5919ae048231972440767efad7a693afaeb41332ab0796be1c884" +checksum = "043118ec4f16d1714fed3aab758b502b864bd865e1d5188626c9ad290100563f" dependencies = [ "backtrace", "cc", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 2f3fa1ce0f..1694032b0c 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -1670,9 +1670,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8472807bd8d5062aef0a35681e1b6fbaed8fea88d97910870741100c03b8fef3" +checksum = "78caedecd8cb71ed47ccca03b68d69414a3d278bb031e6f93f15759344efdd52" dependencies = [ "bytes", "cfg-if", @@ -1680,6 +1680,7 @@ dependencies = [ "indexmap", "js-sys", "more-asserts", + "rustc-demangle", "serde", "serde-wasm-bindgen", "target-lexicon", @@ -1697,9 +1698,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e322cdfb8ed189d92cbb5c34acb319c0f04fb9799ed68e127717f255f8b246a" +checksum = "726a8450541af4a57c34af7b6973fdbfc79f896cc7e733429577dfd1d1687180" dependencies = [ "backtrace", "cfg-if", @@ -1710,7 +1711,6 @@ dependencies = [ "memmap2", "more-asserts", "region", - "rustc-demangle", "smallvec", "thiserror", "wasmer-types", @@ -1721,9 +1721,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5240177aca0d8322c890d17d4b1b87f23ccb45340f616f384655aaba18f51bd" +checksum = "a1e5633f90f372563ebbdf3f9799c7b29ba11c90e56cf9b54017112d2e656c95" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1740,9 +1740,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f824f2e345c288e4394ee0410478dea799747f9ebb319e1d8ad33e33a03545" +checksum = "d4d38957de6f452115c0af3ff08cec268ee248d665b54d4bbf7da60b7453cb97" dependencies = [ "byteorder", "dynasm", @@ -1759,9 +1759,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb6858f330764b1041e68d3c824970064d2fbd8e27704180289fd248ff892c48" +checksum = "97901fdbaae383dbb90ea162cc3a76a9fa58ac39aec7948b4c0b9bbef9307738" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1771,9 +1771,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c5919c0fbbdb0ac8f6d432e7baa796ea49b1381d726bc319c0451f26da11fd" +checksum = "9e028013811035111beb768074b6ccc09eabd77811b1e01fd099b5471924ca16" dependencies = [ "wasmer", "wasmer-types", @@ -1782,9 +1782,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83345e3335fb9b21be6c394bc3d712522447bc8750db8a40ac9170627e3de35" +checksum = "67f1f2839f4f61509550e4ddcd0e658e19f3af862b51c79fda15549d735d659b" dependencies = [ "bytecheck", "enum-iterator", @@ -1798,9 +1798,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ca3cf9a2bb5919ae048231972440767efad7a693afaeb41332ab0796be1c884" +checksum = "043118ec4f16d1714fed3aab758b502b864bd865e1d5188626c9ad290100563f" dependencies = [ "backtrace", "cc", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 316a4b32a6..12262f45be 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -1668,9 +1668,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8472807bd8d5062aef0a35681e1b6fbaed8fea88d97910870741100c03b8fef3" +checksum = "78caedecd8cb71ed47ccca03b68d69414a3d278bb031e6f93f15759344efdd52" dependencies = [ "bytes", "cfg-if", @@ -1678,6 +1678,7 @@ dependencies = [ "indexmap", "js-sys", "more-asserts", + "rustc-demangle", "serde", "serde-wasm-bindgen", "target-lexicon", @@ -1695,9 +1696,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e322cdfb8ed189d92cbb5c34acb319c0f04fb9799ed68e127717f255f8b246a" +checksum = "726a8450541af4a57c34af7b6973fdbfc79f896cc7e733429577dfd1d1687180" dependencies = [ "backtrace", "cfg-if", @@ -1708,7 +1709,6 @@ dependencies = [ "memmap2", "more-asserts", "region", - "rustc-demangle", "smallvec", "thiserror", "wasmer-types", @@ -1719,9 +1719,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5240177aca0d8322c890d17d4b1b87f23ccb45340f616f384655aaba18f51bd" +checksum = "a1e5633f90f372563ebbdf3f9799c7b29ba11c90e56cf9b54017112d2e656c95" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1738,9 +1738,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f824f2e345c288e4394ee0410478dea799747f9ebb319e1d8ad33e33a03545" +checksum = "d4d38957de6f452115c0af3ff08cec268ee248d665b54d4bbf7da60b7453cb97" dependencies = [ "byteorder", "dynasm", @@ -1757,9 +1757,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb6858f330764b1041e68d3c824970064d2fbd8e27704180289fd248ff892c48" +checksum = "97901fdbaae383dbb90ea162cc3a76a9fa58ac39aec7948b4c0b9bbef9307738" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1769,9 +1769,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c5919c0fbbdb0ac8f6d432e7baa796ea49b1381d726bc319c0451f26da11fd" +checksum = "9e028013811035111beb768074b6ccc09eabd77811b1e01fd099b5471924ca16" dependencies = [ "wasmer", "wasmer-types", @@ -1780,9 +1780,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83345e3335fb9b21be6c394bc3d712522447bc8750db8a40ac9170627e3de35" +checksum = "67f1f2839f4f61509550e4ddcd0e658e19f3af862b51c79fda15549d735d659b" dependencies = [ "bytecheck", "enum-iterator", @@ -1796,9 +1796,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ca3cf9a2bb5919ae048231972440767efad7a693afaeb41332ab0796be1c884" +checksum = "043118ec4f16d1714fed3aab758b502b864bd865e1d5188626c9ad290100563f" dependencies = [ "backtrace", "cc", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index d01ad76416..9e11c4bb0b 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -1668,9 +1668,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8472807bd8d5062aef0a35681e1b6fbaed8fea88d97910870741100c03b8fef3" +checksum = "78caedecd8cb71ed47ccca03b68d69414a3d278bb031e6f93f15759344efdd52" dependencies = [ "bytes", "cfg-if", @@ -1678,6 +1678,7 @@ dependencies = [ "indexmap", "js-sys", "more-asserts", + "rustc-demangle", "serde", "serde-wasm-bindgen", "target-lexicon", @@ -1695,9 +1696,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e322cdfb8ed189d92cbb5c34acb319c0f04fb9799ed68e127717f255f8b246a" +checksum = "726a8450541af4a57c34af7b6973fdbfc79f896cc7e733429577dfd1d1687180" dependencies = [ "backtrace", "cfg-if", @@ -1708,7 +1709,6 @@ dependencies = [ "memmap2", "more-asserts", "region", - "rustc-demangle", "smallvec", "thiserror", "wasmer-types", @@ -1719,9 +1719,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5240177aca0d8322c890d17d4b1b87f23ccb45340f616f384655aaba18f51bd" +checksum = "a1e5633f90f372563ebbdf3f9799c7b29ba11c90e56cf9b54017112d2e656c95" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1738,9 +1738,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f824f2e345c288e4394ee0410478dea799747f9ebb319e1d8ad33e33a03545" +checksum = "d4d38957de6f452115c0af3ff08cec268ee248d665b54d4bbf7da60b7453cb97" dependencies = [ "byteorder", "dynasm", @@ -1757,9 +1757,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb6858f330764b1041e68d3c824970064d2fbd8e27704180289fd248ff892c48" +checksum = "97901fdbaae383dbb90ea162cc3a76a9fa58ac39aec7948b4c0b9bbef9307738" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1769,9 +1769,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c5919c0fbbdb0ac8f6d432e7baa796ea49b1381d726bc319c0451f26da11fd" +checksum = "9e028013811035111beb768074b6ccc09eabd77811b1e01fd099b5471924ca16" dependencies = [ "wasmer", "wasmer-types", @@ -1780,9 +1780,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83345e3335fb9b21be6c394bc3d712522447bc8750db8a40ac9170627e3de35" +checksum = "67f1f2839f4f61509550e4ddcd0e658e19f3af862b51c79fda15549d735d659b" dependencies = [ "bytecheck", "enum-iterator", @@ -1796,9 +1796,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ca3cf9a2bb5919ae048231972440767efad7a693afaeb41332ab0796be1c884" +checksum = "043118ec4f16d1714fed3aab758b502b864bd865e1d5188626c9ad290100563f" dependencies = [ "backtrace", "cc", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index c13978bf2f..77b62434b4 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -1659,9 +1659,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8472807bd8d5062aef0a35681e1b6fbaed8fea88d97910870741100c03b8fef3" +checksum = "78caedecd8cb71ed47ccca03b68d69414a3d278bb031e6f93f15759344efdd52" dependencies = [ "bytes", "cfg-if", @@ -1669,6 +1669,7 @@ dependencies = [ "indexmap", "js-sys", "more-asserts", + "rustc-demangle", "serde", "serde-wasm-bindgen", "target-lexicon", @@ -1686,9 +1687,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e322cdfb8ed189d92cbb5c34acb319c0f04fb9799ed68e127717f255f8b246a" +checksum = "726a8450541af4a57c34af7b6973fdbfc79f896cc7e733429577dfd1d1687180" dependencies = [ "backtrace", "cfg-if", @@ -1699,7 +1700,6 @@ dependencies = [ "memmap2", "more-asserts", "region", - "rustc-demangle", "smallvec", "thiserror", "wasmer-types", @@ -1710,9 +1710,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5240177aca0d8322c890d17d4b1b87f23ccb45340f616f384655aaba18f51bd" +checksum = "a1e5633f90f372563ebbdf3f9799c7b29ba11c90e56cf9b54017112d2e656c95" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1729,9 +1729,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f824f2e345c288e4394ee0410478dea799747f9ebb319e1d8ad33e33a03545" +checksum = "d4d38957de6f452115c0af3ff08cec268ee248d665b54d4bbf7da60b7453cb97" dependencies = [ "byteorder", "dynasm", @@ -1748,9 +1748,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb6858f330764b1041e68d3c824970064d2fbd8e27704180289fd248ff892c48" +checksum = "97901fdbaae383dbb90ea162cc3a76a9fa58ac39aec7948b4c0b9bbef9307738" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1760,9 +1760,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c5919c0fbbdb0ac8f6d432e7baa796ea49b1381d726bc319c0451f26da11fd" +checksum = "9e028013811035111beb768074b6ccc09eabd77811b1e01fd099b5471924ca16" dependencies = [ "wasmer", "wasmer-types", @@ -1771,9 +1771,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83345e3335fb9b21be6c394bc3d712522447bc8750db8a40ac9170627e3de35" +checksum = "67f1f2839f4f61509550e4ddcd0e658e19f3af862b51c79fda15549d735d659b" dependencies = [ "bytecheck", "enum-iterator", @@ -1787,9 +1787,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ca3cf9a2bb5919ae048231972440767efad7a693afaeb41332ab0796be1c884" +checksum = "043118ec4f16d1714fed3aab758b502b864bd865e1d5188626c9ad290100563f" dependencies = [ "backtrace", "cc", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 50a19aea55..fd0dc1989e 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -1669,9 +1669,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8472807bd8d5062aef0a35681e1b6fbaed8fea88d97910870741100c03b8fef3" +checksum = "78caedecd8cb71ed47ccca03b68d69414a3d278bb031e6f93f15759344efdd52" dependencies = [ "bytes", "cfg-if", @@ -1679,6 +1679,7 @@ dependencies = [ "indexmap", "js-sys", "more-asserts", + "rustc-demangle", "serde", "serde-wasm-bindgen", "target-lexicon", @@ -1696,9 +1697,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e322cdfb8ed189d92cbb5c34acb319c0f04fb9799ed68e127717f255f8b246a" +checksum = "726a8450541af4a57c34af7b6973fdbfc79f896cc7e733429577dfd1d1687180" dependencies = [ "backtrace", "cfg-if", @@ -1709,7 +1710,6 @@ dependencies = [ "memmap2", "more-asserts", "region", - "rustc-demangle", "smallvec", "thiserror", "wasmer-types", @@ -1720,9 +1720,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5240177aca0d8322c890d17d4b1b87f23ccb45340f616f384655aaba18f51bd" +checksum = "a1e5633f90f372563ebbdf3f9799c7b29ba11c90e56cf9b54017112d2e656c95" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1739,9 +1739,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f824f2e345c288e4394ee0410478dea799747f9ebb319e1d8ad33e33a03545" +checksum = "d4d38957de6f452115c0af3ff08cec268ee248d665b54d4bbf7da60b7453cb97" dependencies = [ "byteorder", "dynasm", @@ -1758,9 +1758,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb6858f330764b1041e68d3c824970064d2fbd8e27704180289fd248ff892c48" +checksum = "97901fdbaae383dbb90ea162cc3a76a9fa58ac39aec7948b4c0b9bbef9307738" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1770,9 +1770,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c5919c0fbbdb0ac8f6d432e7baa796ea49b1381d726bc319c0451f26da11fd" +checksum = "9e028013811035111beb768074b6ccc09eabd77811b1e01fd099b5471924ca16" dependencies = [ "wasmer", "wasmer-types", @@ -1781,9 +1781,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83345e3335fb9b21be6c394bc3d712522447bc8750db8a40ac9170627e3de35" +checksum = "67f1f2839f4f61509550e4ddcd0e658e19f3af862b51c79fda15549d735d659b" dependencies = [ "bytecheck", "enum-iterator", @@ -1797,9 +1797,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ca3cf9a2bb5919ae048231972440767efad7a693afaeb41332ab0796be1c884" +checksum = "043118ec4f16d1714fed3aab758b502b864bd865e1d5188626c9ad290100563f" dependencies = [ "backtrace", "cc", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 2ad3fb3285..bacffcc935 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -1696,9 +1696,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8472807bd8d5062aef0a35681e1b6fbaed8fea88d97910870741100c03b8fef3" +checksum = "78caedecd8cb71ed47ccca03b68d69414a3d278bb031e6f93f15759344efdd52" dependencies = [ "bytes", "cfg-if", @@ -1706,6 +1706,7 @@ dependencies = [ "indexmap", "js-sys", "more-asserts", + "rustc-demangle", "serde", "serde-wasm-bindgen", "target-lexicon", @@ -1723,9 +1724,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e322cdfb8ed189d92cbb5c34acb319c0f04fb9799ed68e127717f255f8b246a" +checksum = "726a8450541af4a57c34af7b6973fdbfc79f896cc7e733429577dfd1d1687180" dependencies = [ "backtrace", "cfg-if", @@ -1736,7 +1737,6 @@ dependencies = [ "memmap2", "more-asserts", "region", - "rustc-demangle", "smallvec", "thiserror", "wasmer-types", @@ -1747,9 +1747,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5240177aca0d8322c890d17d4b1b87f23ccb45340f616f384655aaba18f51bd" +checksum = "a1e5633f90f372563ebbdf3f9799c7b29ba11c90e56cf9b54017112d2e656c95" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1766,9 +1766,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f824f2e345c288e4394ee0410478dea799747f9ebb319e1d8ad33e33a03545" +checksum = "d4d38957de6f452115c0af3ff08cec268ee248d665b54d4bbf7da60b7453cb97" dependencies = [ "byteorder", "dynasm", @@ -1785,9 +1785,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb6858f330764b1041e68d3c824970064d2fbd8e27704180289fd248ff892c48" +checksum = "97901fdbaae383dbb90ea162cc3a76a9fa58ac39aec7948b4c0b9bbef9307738" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1797,9 +1797,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c5919c0fbbdb0ac8f6d432e7baa796ea49b1381d726bc319c0451f26da11fd" +checksum = "9e028013811035111beb768074b6ccc09eabd77811b1e01fd099b5471924ca16" dependencies = [ "wasmer", "wasmer-types", @@ -1808,9 +1808,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83345e3335fb9b21be6c394bc3d712522447bc8750db8a40ac9170627e3de35" +checksum = "67f1f2839f4f61509550e4ddcd0e658e19f3af862b51c79fda15549d735d659b" dependencies = [ "bytecheck", "enum-iterator", @@ -1824,9 +1824,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ca3cf9a2bb5919ae048231972440767efad7a693afaeb41332ab0796be1c884" +checksum = "043118ec4f16d1714fed3aab758b502b864bd865e1d5188626c9ad290100563f" dependencies = [ "backtrace", "cc", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index d64906e0b3..960644f4bd 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -1660,9 +1660,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8472807bd8d5062aef0a35681e1b6fbaed8fea88d97910870741100c03b8fef3" +checksum = "78caedecd8cb71ed47ccca03b68d69414a3d278bb031e6f93f15759344efdd52" dependencies = [ "bytes", "cfg-if", @@ -1670,6 +1670,7 @@ dependencies = [ "indexmap", "js-sys", "more-asserts", + "rustc-demangle", "serde", "serde-wasm-bindgen", "target-lexicon", @@ -1687,9 +1688,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e322cdfb8ed189d92cbb5c34acb319c0f04fb9799ed68e127717f255f8b246a" +checksum = "726a8450541af4a57c34af7b6973fdbfc79f896cc7e733429577dfd1d1687180" dependencies = [ "backtrace", "cfg-if", @@ -1700,7 +1701,6 @@ dependencies = [ "memmap2", "more-asserts", "region", - "rustc-demangle", "smallvec", "thiserror", "wasmer-types", @@ -1711,9 +1711,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5240177aca0d8322c890d17d4b1b87f23ccb45340f616f384655aaba18f51bd" +checksum = "a1e5633f90f372563ebbdf3f9799c7b29ba11c90e56cf9b54017112d2e656c95" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1730,9 +1730,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f824f2e345c288e4394ee0410478dea799747f9ebb319e1d8ad33e33a03545" +checksum = "d4d38957de6f452115c0af3ff08cec268ee248d665b54d4bbf7da60b7453cb97" dependencies = [ "byteorder", "dynasm", @@ -1749,9 +1749,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb6858f330764b1041e68d3c824970064d2fbd8e27704180289fd248ff892c48" +checksum = "97901fdbaae383dbb90ea162cc3a76a9fa58ac39aec7948b4c0b9bbef9307738" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1761,9 +1761,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c5919c0fbbdb0ac8f6d432e7baa796ea49b1381d726bc319c0451f26da11fd" +checksum = "9e028013811035111beb768074b6ccc09eabd77811b1e01fd099b5471924ca16" dependencies = [ "wasmer", "wasmer-types", @@ -1772,9 +1772,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83345e3335fb9b21be6c394bc3d712522447bc8750db8a40ac9170627e3de35" +checksum = "67f1f2839f4f61509550e4ddcd0e658e19f3af862b51c79fda15549d735d659b" dependencies = [ "bytecheck", "enum-iterator", @@ -1788,9 +1788,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ca3cf9a2bb5919ae048231972440767efad7a693afaeb41332ab0796be1c884" +checksum = "043118ec4f16d1714fed3aab758b502b864bd865e1d5188626c9ad290100563f" dependencies = [ "backtrace", "cc", From 97ab52628c7d836bef10b1b929dab8a91e713d23 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 17 May 2023 08:15:16 +0200 Subject: [PATCH 0297/2372] cargo update --- Cargo.lock | 787 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 480 insertions(+), 307 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0104d7f434..63d146506a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,11 +4,11 @@ version = 3 [[package]] name = "addr2line" -version = "0.17.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" +checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" dependencies = [ - "gimli", + "gimli 0.27.2", ] [[package]] @@ -23,7 +23,7 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ - "getrandom 0.2.6", + "getrandom", "once_cell", "version_check", ] @@ -45,9 +45,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.57" +version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f9b8508dccb7687a1d6c4ce66b2b0ecef467c94667de27d8d7fe1f8d2a9cdc" +checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" [[package]] name = "arrayvec" @@ -61,7 +61,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", "winapi", ] @@ -74,9 +74,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "backtrace" -version = "0.3.65" +version = "0.3.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11a17d453482a265fd5f8479f2a3f405566e6ca627837aaddb85af8b1ab8ef61" +checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" dependencies = [ "addr2line", "cc", @@ -95,15 +95,15 @@ checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" [[package]] name = "base64" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64ct" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea908e7347a8c64e378c17e30ef880ad73e3b4498346b055c2c00ea342f3179" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bitflags" @@ -111,6 +111,18 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + [[package]] name = "block-buffer" version = "0.9.0" @@ -122,24 +134,24 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.10.2" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] [[package]] name = "bumpalo" -version = "3.12.0" +version = "3.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" +checksum = "3c6ed94e98ecff0c12dd1b04c15ec0d7d9458ca8fe806cea6f12954efe74c63b" [[package]] name = "bytecheck" -version = "0.6.10" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13fe11640a23eb24562225322cd3e452b93a3d4091d62fab69c70542fcd17d1f" +checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627" dependencies = [ "bytecheck_derive", "ptr_meta", @@ -148,13 +160,13 @@ dependencies = [ [[package]] name = "bytecheck_derive" -version = "0.6.10" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" +checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -177,9 +189,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.73" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" [[package]] name = "cfg-if" @@ -189,9 +201,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.19" +version = "0.4.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" dependencies = [ "num-integer", "num-traits", @@ -199,9 +211,9 @@ dependencies = [ [[package]] name = "ciborium" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c137568cc60b904a7724001b35ce2630fd00d5d84805fbb608ab89509d788f" +checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" dependencies = [ "ciborium-io", "ciborium-ll", @@ -210,15 +222,15 @@ dependencies = [ [[package]] name = "ciborium-io" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "346de753af073cc87b52b2083a506b38ac176a44cfb05497b622e27be899b369" +checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" [[package]] name = "ciborium-ll" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213030a2b5a4e0c0892b6652260cf6ccac84827b83a85a534e178e3906c4cf1b" +checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" dependencies = [ "ciborium-io", "half", @@ -241,9 +253,9 @@ dependencies = [ [[package]] name = "clap" -version = "3.2.23" +version = "3.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" dependencies = [ "bitflags", "clap_lex", @@ -279,9 +291,9 @@ dependencies = [ [[package]] name = "const-oid" -version = "0.9.0" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "722e23542a15cea1f65d4a1419c4cfd7a26706c70871a13a04238ca3f40f1661" +checksum = "520fbf3c07483f94e3e3ca9d0cfd913d7718ef2483d2cfd91c0d9e91474ab913" [[package]] name = "corosensei" @@ -313,16 +325,16 @@ version = "1.2.5" dependencies = [ "base64", "criterion", - "digest 0.10.3", + "digest 0.10.6", "ed25519-zebra", "english-numbers", "hex", "hex-literal", "k256", - "rand_core 0.6.3", + "rand_core 0.6.4", "serde", "serde_json", - "sha2 0.10.3", + "sha2 0.10.6", "thiserror", ] @@ -331,7 +343,7 @@ name = "cosmwasm-derive" version = "1.2.5" dependencies = [ "cosmwasm-std", - "syn", + "syn 1.0.109", ] [[package]] @@ -355,7 +367,7 @@ version = "1.2.5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -375,7 +387,7 @@ dependencies = [ "serde", "serde-json-wasm", "serde_json", - "sha2 0.10.3", + "sha2 0.10.6", "thiserror", "uint", ] @@ -412,7 +424,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2 0.10.3", + "sha2 0.10.6", "target-lexicon", "tempfile", "thiserror", @@ -423,9 +435,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.2" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" dependencies = [ "libc", ] @@ -453,7 +465,7 @@ dependencies = [ "cranelift-egraph", "cranelift-entity", "cranelift-isle", - "gimli", + "gimli 0.26.2", "log", "regalloc2", "smallvec", @@ -532,7 +544,7 @@ dependencies = [ "atty", "cast", "ciborium", - "clap 3.2.23", + "clap 3.2.25", "criterion-plot", "itertools", "lazy_static", @@ -560,9 +572,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.4" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaa7bd5fb665c6864b5f963dd9097905c54125909c7aa94c9e18507cdbe6c53" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" dependencies = [ "cfg-if", "crossbeam-utils", @@ -570,9 +582,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" dependencies = [ "cfg-if", "crossbeam-epoch", @@ -581,26 +593,24 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.8" +version = "0.9.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1145cf131a2c6ba0615079ab6a638f7e1973ac9c2634fcbeaaad6114246efe8c" +checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" dependencies = [ "autocfg", "cfg-if", "crossbeam-utils", - "lazy_static", - "memoffset 0.6.5", + "memoffset", "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.8" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" +checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" dependencies = [ "cfg-if", - "lazy_static", ] [[package]] @@ -611,12 +621,12 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-bigint" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f2b443d17d49dad5ef0ede301c3179cc923b8822f3393b4d2c28c269dd4a122" +checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" dependencies = [ "generic-array", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", "zeroize", ] @@ -646,9 +656,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.13.4" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +checksum = "0558d22a7b463ed0241e993f76f09f30b126687447751a8638587b864e4b3944" dependencies = [ "darling_core", "darling_macro", @@ -656,26 +666,26 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.13.4" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +checksum = "ab8bfa2e259f8ee1ce5e97824a3c55ec4404a0d772ca7fa96bf19f0752a046eb" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "syn", + "syn 2.0.16", ] [[package]] name = "darling_macro" -version = "0.13.4" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +checksum = "29a358ff9f12ec09c3e61fef9b5a9902623a695a46a917b07f269bff1445611a" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.16", ] [[package]] @@ -693,9 +703,9 @@ dependencies = [ [[package]] name = "der" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dd2ae565c0a381dde7fade45fce95984c568bdcb4700a4fdbe3175e0380b2f" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" dependencies = [ "const-oid", "zeroize", @@ -709,7 +719,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -723,20 +733,20 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.3" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" dependencies = [ - "block-buffer 0.10.2", + "block-buffer 0.10.4", "crypto-common", "subtle", ] [[package]] name = "dyn-clone" -version = "1.0.5" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21e50f3adc76d6a43f5ed73b698a87d0760ca74617f60f7c3b879003536fdd28" +checksum = "68b0cf012f1230e43cd00ebb729c6bb58707ecfa8ad08b52ef3a4ccd2697fc30" [[package]] name = "dynasm" @@ -750,7 +760,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -766,9 +776,9 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.14.3" +version = "0.14.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd46e0c364655e5baf2f5e99b603e7a09905da9966d7928d7470af393b28670" +checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" dependencies = [ "der", "elliptic-curve", @@ -778,40 +788,40 @@ dependencies = [ [[package]] name = "ed25519-zebra" -version = "3.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403ef3e961ab98f0ba902771d29f842058578bb1ce7e3c59dad5a6a93e784c69" +checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" dependencies = [ "curve25519-dalek", + "hashbrown", "hex", - "rand_core 0.6.3", + "rand_core 0.6.4", "serde", "sha2 0.9.9", - "thiserror", "zeroize", ] [[package]] name = "either" -version = "1.6.1" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] name = "elliptic-curve" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c47abd0a791d2ac0c7aa1118715f85b83689e4522c4e3a244e159d4fc9848a8d" +checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" dependencies = [ "base16ct", "crypto-bigint", "der", - "digest 0.10.3", + "digest 0.10.6", "ff", "generic-array", "group", "pkcs8", - "rand_core 0.6.3", + "rand_core 0.6.4", "sec1", "subtle", "zeroize", @@ -840,28 +850,49 @@ checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "enumset" -version = "1.0.11" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4799cdb24d48f1f8a7a98d06b7fde65a85a2d1e42b25a889f5406aa1fbefe074" +checksum = "e875f1719c16de097dee81ed675e2d9bb63096823ed3f0ca827b7dea3028bbbb" dependencies = [ "enumset_derive", ] [[package]] name = "enumset_derive" -version = "0.6.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea83a3fbdc1d999ccfbcbee717eab36f8edf2d71693a23ce0d7cca19e085304c" +checksum = "e08b6c6ab82d70f08844964ba10c7babb716de2ecaeab9be5717918a5177d3af" dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.16", +] + +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", ] [[package]] @@ -872,20 +903,20 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "fastrand" -version = "1.7.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" dependencies = [ "instant", ] [[package]] name = "ff" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df689201f395c6b90dfe87127685f8dbfc083a5e779e613575d8bd7314300c3e" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" dependencies = [ - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -910,6 +941,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "fxhash" version = "0.2.1" @@ -921,9 +958,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.5" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -931,37 +968,32 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.2.6" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" +checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" dependencies = [ "cfg-if", "libc", - "wasi 0.10.2+wasi-snapshot-preview1", + "wasi", ] [[package]] name = "gimli" -version = "0.26.1" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" +checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" dependencies = [ "fallible-iterator", "indexmap", "stable_deref_trait", ] +[[package]] +name = "gimli" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" + [[package]] name = "glob" version = "0.3.1" @@ -970,12 +1002,12 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "group" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7391856def869c1c81063a03457c676fbcd419709c3dfb33d8d319de484b154d" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" dependencies = [ "ff", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -1003,6 +1035,21 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + [[package]] name = "hex" version = "0.4.3" @@ -1021,7 +1068,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.3", + "digest 0.10.6", ] [[package]] @@ -1059,40 +1106,51 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "io-lifetimes" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" +dependencies = [ + "hermit-abi 0.3.1", + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "itertools" -version = "0.10.3" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.1" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" [[package]] name = "js-sys" -version = "0.3.61" +version = "0.3.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790" dependencies = [ "wasm-bindgen", ] [[package]] name = "k256" -version = "0.11.3" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8a5a96d92d849c4499d99461da81c9cdc1467418a8ed2aaeb407e8d85940ed" +checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2 0.10.3", + "sha2 0.10.6", ] [[package]] @@ -1109,9 +1167,15 @@ checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "libc" -version = "0.2.125" +version = "0.2.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b" +checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" + +[[package]] +name = "linux-raw-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f" [[package]] name = "lock_api" @@ -1149,22 +1213,13 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memmap2" -version = "0.5.3" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057a3db23999c867821a7a59feb06a578fcb03685e983dff90daf9e7d24ac08f" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" dependencies = [ "libc", ] -[[package]] -name = "memoffset" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg", -] - [[package]] name = "memoffset" version = "0.8.0" @@ -1176,9 +1231,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.5.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082" +checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" dependencies = [ "adler", ] @@ -1210,19 +1265,19 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.13.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" dependencies = [ - "hermit-abi", + "hermit-abi 0.2.6", "libc", ] [[package]] name = "object" -version = "0.28.3" +version = "0.30.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40bec70ba014595f99f7aa110b84331ffe1ee9aece7fe6f387cc7e3ecda4d456" +checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" dependencies = [ "memchr", ] @@ -1265,7 +1320,7 @@ checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.2.16", "smallvec", "windows-sys 0.45.0", ] @@ -1294,9 +1349,9 @@ dependencies = [ [[package]] name = "plotters" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a3fd9ec30b9749ce28cd91f255d569591cdf937fe280c312143e3c4bad6f2a" +checksum = "2538b639e642295546c50fcd545198c9d64ee2a38620a628724a3b266d5fbf97" dependencies = [ "num-traits", "plotters-backend", @@ -1307,24 +1362,24 @@ dependencies = [ [[package]] name = "plotters-backend" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d88417318da0eaf0fdcdb51a0ee6c3bed624333bff8f946733049380be67ac1c" +checksum = "193228616381fecdc1224c62e96946dfbc73ff4384fba576e052ff8c1bea8142" [[package]] name = "plotters-svg" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521fa9638fa597e1dc53e9412a4f9cefb01187ee1f7413076f9e6749e2885ba9" +checksum = "f9a81d2759aae1dae668f783c308bc5c8ebd191ff4184aaa1b37f65a6ae5a56f" dependencies = [ "plotters-backend", ] [[package]] name = "ppv-lite86" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro-error" @@ -1335,7 +1390,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -1352,11 +1407,11 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.37" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec757218438d5fda206afc041538b2f6d889286160d649a86a24d37e1235afd1" +checksum = "c4ec6d5fe0b140acb27c9a0444118cf55bfbb4e0b259739429abb4521dd67c16" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -1376,18 +1431,24 @@ checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "quote" -version = "1.0.18" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" +checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand" version = "0.8.5" @@ -1396,7 +1457,7 @@ checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", - "rand_core 0.6.3", + "rand_core 0.6.4", ] [[package]] @@ -1406,7 +1467,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.3", + "rand_core 0.6.4", ] [[package]] @@ -1414,36 +1475,31 @@ name = "rand_core" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] [[package]] name = "rand_core" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.6", + "getrandom", ] [[package]] name = "rayon" -version = "1.5.2" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd249e82c21598a9a426a4e00dd7adc1d640b22445ec8545feef801d1a74c221" +checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" dependencies = [ - "autocfg", - "crossbeam-deque", "either", "rayon-core", ] [[package]] name = "rayon-core" -version = "1.9.2" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f51245e1e62e1f1629cbfec37b5793bbabcaeb90f30e94d2ba03564687353e4" +checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" dependencies = [ "crossbeam-channel", "crossbeam-deque", @@ -1453,9 +1509,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.13" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ "bitflags", ] @@ -1474,18 +1539,18 @@ dependencies = [ [[package]] name = "regex" -version = "1.5.5" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" +checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" dependencies = [ "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.6.25" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" [[package]] name = "region" @@ -1499,15 +1564,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - [[package]] name = "rend" version = "0.4.0" @@ -1519,9 +1575,9 @@ dependencies = [ [[package]] name = "rfc6979" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88c86280f057430a52f4861551b092a01b419b8eacefc7c995eacb9dc132fe32" +checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" dependencies = [ "crypto-bigint", "hmac", @@ -1530,10 +1586,11 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.7.41" +version = "0.7.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21499ed91807f07ae081880aabb2ccc0235e9d88011867d984525e9a4c3cfa3e" +checksum = "0200c8230b013893c0b2d6213d6ec64ed2b9be2e0e016682b7224ff82cff5c58" dependencies = [ + "bitvec", "bytecheck", "hashbrown", "indexmap", @@ -1541,30 +1598,46 @@ dependencies = [ "rend", "rkyv_derive", "seahash", + "tinyvec", + "uuid", ] [[package]] name = "rkyv_derive" -version = "0.7.41" +version = "0.7.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" +checksum = "b2e06b915b5c230a17d7a736d1e2e63ee753c256a8614ef3f5147b13a4f5541d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "rustc-demangle" -version = "0.1.21" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustix" +version = "0.37.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" +checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", +] [[package]] name = "ryu" -version = "1.0.9" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" [[package]] name = "same-file" @@ -1596,7 +1669,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn", + "syn 1.0.109", ] [[package]] @@ -1627,24 +1700,24 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.9" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cb243bdfdb5936c8dc3c45762a19d12ab4550cdc753bc247637d4ec35a040fd" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" [[package]] name = "serde" -version = "1.0.137" +version = "1.0.163" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" +checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" dependencies = [ "serde_derive", ] [[package]] name = "serde-json-wasm" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" +checksum = "16a62a1fad1e1828b24acac8f2b468971dade7b8c3c2e672bcadefefb1f8c137" dependencies = [ "serde", ] @@ -1662,13 +1735,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.137" +version = "1.0.163" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" +checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.16", ] [[package]] @@ -1679,14 +1752,14 @@ checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "serde_json" -version = "1.0.81" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" dependencies = [ "itoa", "ryu", @@ -1708,23 +1781,23 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.3" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899bf02746a2c92bf1053d9327dadb252b01af1f81f90cdb902411f518bc7215" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.3", + "digest 0.10.6", ] [[package]] name = "signature" -version = "1.5.0" +version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f054c6c1a6e95179d6f23ed974060dcefb2d9388bb7256900badad682c499de4" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" dependencies = [ - "digest 0.10.3", - "rand_core 0.6.3", + "digest 0.10.6", + "rand_core 0.6.4", ] [[package]] @@ -1735,15 +1808,15 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "slice-group-by" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" +checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" [[package]] name = "smallvec" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] name = "spki" @@ -1781,33 +1854,49 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.92" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff7c592601f11445996a06f8ad0c27f094a58857c2f89e97974ab9235b92c52" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6f671d4b5ffdb8eadec19c0ae67fe2639df8684bd7bc4b83d986b8db549cf01" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "target-lexicon" -version = "0.12.3" +version = "0.12.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fa7e55043acb85fca6b3c01485a2eeb6b69c5d21002e273c79e465f43b7ac1" +checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5" [[package]] name = "tempfile" -version = "3.3.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" dependencies = [ "cfg-if", "fastrand", - "libc", - "redox_syscall", - "remove_dir_all", - "winapi", + "redox_syscall 0.3.5", + "rustix", + "windows-sys 0.45.0", ] [[package]] @@ -1827,22 +1916,22 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" -version = "1.0.38" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.38" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.16", ] [[package]] @@ -1872,9 +1961,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tracing" -version = "0.1.34" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0ecdcb44a79f0fe9844f0c4f33a342cbcbb5117de8001e6ba0dc2351327d09" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if", "pin-project-lite", @@ -1884,35 +1973,35 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.21" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c" +checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.16", ] [[package]] name = "tracing-core" -version = "0.1.26" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f54c8ca710e81886d498c2fd3331b56c93aa248d49de2222ad2742247c60072f" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ - "lazy_static", + "once_cell", ] [[package]] name = "typenum" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "uint" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f03af7ccf01dd611cc450a0d10dbc9b745770d096473e2faf0ca6e2d66d1e0" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" dependencies = [ "byteorder", "crunchy", @@ -1926,6 +2015,12 @@ version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + [[package]] name = "unicode-normalization" version = "0.1.22" @@ -1937,15 +2032,9 @@ dependencies = [ [[package]] name = "unicode-width" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" - -[[package]] -name = "unicode-xid" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" [[package]] name = "url" @@ -1958,6 +2047,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "uuid" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "345444e32442451b267fc254ae85a209c64be56d2890e601a0c37ff0c3c5ecd2" + [[package]] name = "vec_map" version = "0.8.2" @@ -1972,32 +2067,25 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "walkdir" -version = "2.3.2" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" dependencies = [ "same-file", - "winapi", "winapi-util", ] [[package]] name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.84" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2005,16 +2093,16 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.84" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn", + "syn 2.0.16", "wasm-bindgen-shared", ] @@ -2038,14 +2126,14 @@ checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.84" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2053,22 +2141,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.84" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.16", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.84" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" + +[[package]] +name = "wasm-encoder" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e77053dc709db790691d3732cfc458adc5acc881dec524965c608effdcd9c581" +dependencies = [ + "leb128", +] [[package]] name = "wasmer" @@ -2130,7 +2227,7 @@ dependencies = [ "cranelift-codegen", "cranelift-entity", "cranelift-frontend", - "gimli", + "gimli 0.26.2", "more-asserts", "rayon", "smallvec", @@ -2150,7 +2247,7 @@ dependencies = [ "dynasm", "dynasmrt", "enumset", - "gimli", + "gimli 0.26.2", "lazy_static", "more-asserts", "rayon", @@ -2168,7 +2265,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -2216,7 +2313,7 @@ dependencies = [ "lazy_static", "libc", "mach", - "memoffset 0.8.0", + "memoffset", "more-asserts", "region", "scopeguard", @@ -2237,29 +2334,30 @@ dependencies = [ [[package]] name = "wast" -version = "40.0.0" +version = "58.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb4f48a8b083dbc50e291e430afb8f524092bb00428957bcc63f49f856c64ac" +checksum = "372eecae2d10a5091c2005b32377d7ecd6feecdf2c05838056d02d8b4f07c429" dependencies = [ "leb128", "memchr", "unicode-width", + "wasm-encoder", ] [[package]] name = "wat" -version = "1.0.42" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0401b6395ce0db91629a75b29597ccb66ea29950af9fc859f1bb3a736609c76e" +checksum = "6d47446190e112ab1579ab40b3ad7e319d859d74e5134683f04e9f0747bf4173" dependencies = [ "wast", ] [[package]] name = "web-sys" -version = "0.3.57" +version = "0.3.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283" +checksum = "3bdd9ef4e984da1187bf8110c5cf5b845fbc87a23602cdf912386a76fcd3a7c2" dependencies = [ "js-sys", "wasm-bindgen", @@ -2315,7 +2413,16 @@ version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "windows-targets", + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.0", ] [[package]] @@ -2324,21 +2431,42 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" dependencies = [ - "windows_aarch64_gnullvm", + "windows_aarch64_gnullvm 0.42.2", "windows_aarch64_msvc 0.42.2", "windows_i686_gnu 0.42.2", "windows_i686_msvc 0.42.2", "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm", + "windows_x86_64_gnullvm 0.42.2", "windows_x86_64_msvc 0.42.2", ] +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + [[package]] name = "windows_aarch64_msvc" version = "0.33.0" @@ -2351,6 +2479,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + [[package]] name = "windows_i686_gnu" version = "0.33.0" @@ -2363,6 +2497,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + [[package]] name = "windows_i686_msvc" version = "0.33.0" @@ -2375,6 +2515,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + [[package]] name = "windows_x86_64_gnu" version = "0.33.0" @@ -2387,12 +2533,24 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + [[package]] name = "windows_x86_64_msvc" version = "0.33.0" @@ -2405,8 +2563,23 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "zeroize" -version = "1.5.5" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94693807d016b2f2d2e14420eb3bfcca689311ff775dcf113d74ea624b7cdf07" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" From cc42aa3c48ab8b47f70d5807ff3de7e7e0dd1312 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 17 May 2023 08:25:35 +0200 Subject: [PATCH 0298/2372] Adapt fs cache tests to new hash --- packages/vm/src/modules/file_system_cache.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index c723df0865..3545aac599 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -314,11 +314,11 @@ mod tests { }; let target = Target::new(triple.clone(), wasmer::CpuFeature::POPCNT.into()); let id = target_id(&target); - assert_eq!(id, "x86_64-nintendo-fuchsia-gnu-coff-4721E3F4"); + assert_eq!(id, "x86_64-nintendo-fuchsia-gnu-coff-01E9F9FE"); // Changing CPU features changes the hash part let target = Target::new(triple, wasmer::CpuFeature::AVX512DQ.into()); let id = target_id(&target); - assert_eq!(id, "x86_64-nintendo-fuchsia-gnu-coff-D5C8034F"); + assert_eq!(id, "x86_64-nintendo-fuchsia-gnu-coff-93001945"); // Works for durrect target (hashing is deterministic); let target = Target::default(); @@ -342,9 +342,9 @@ mod tests { assert_eq!( p.as_os_str(), if cfg!(windows) { - "modules\\v5-wasmer17\\x86_64-nintendo-fuchsia-gnu-coff-4721E3F4" + "modules\\v5-wasmer17\\x86_64-nintendo-fuchsia-gnu-coff-01E9F9FE" } else { - "modules/v5-wasmer17/x86_64-nintendo-fuchsia-gnu-coff-4721E3F4" + "modules/v5-wasmer17/x86_64-nintendo-fuchsia-gnu-coff-01E9F9FE" } ); } From 2b2b88644dd27a65bf26023be8933963269cae7b Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 17 May 2023 13:35:14 +0200 Subject: [PATCH 0299/2372] Restore removed move_out test --- packages/vm/src/environment.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index c85510710f..c3161ac223 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -524,6 +524,31 @@ mod tests { env.move_in(storage, querier); } + #[test] + fn move_out_works() { + let (env, _store, _instance) = make_instance(TESTING_GAS_LIMIT); + + // empty data on start + let (inits, initq) = env.move_out(); + assert!(inits.is_none()); + assert!(initq.is_none()); + + // store it on the instance + leave_default_data(&env); + let (s, q) = env.move_out(); + assert!(s.is_some()); + assert!(q.is_some()); + assert_eq!( + s.unwrap().get(INIT_KEY).0.unwrap(), + Some(INIT_VALUE.to_vec()) + ); + + // now is empty again + let (ends, endq) = env.move_out(); + assert!(ends.is_none()); + assert!(endq.is_none()); + } + #[test] fn process_gas_info_works_for_cost() { let (env, mut store, _instance) = make_instance(100); From fe292aa740c406b177f86441b689795eea4ba55d Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 17 May 2023 13:37:00 +0200 Subject: [PATCH 0300/2372] Restore removed comment --- packages/vm/src/instance.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 6c6620b89c..b8bf87da9f 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -23,7 +23,7 @@ use crate::memory::{read_region, write_region}; use crate::size::Size; use crate::wasm_backend::{compile, make_store_with_engine}; -pub use crate::environment::DebugInfo; +pub use crate::environment::DebugInfo; // Re-exported as public via to be usable for set_debug_handler #[derive(Copy, Clone, Debug)] pub struct GasReport { From 756d1b24adb65c5bdd41e90db279aae7d6344dec Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 17 May 2023 13:42:30 +0200 Subject: [PATCH 0301/2372] Use make_engine helper for consistency --- packages/vm/src/cache.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 95cd851c3f..16dcf8c9a1 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -4,7 +4,6 @@ use std::io::{Read, Write}; use std::marker::PhantomData; use std::path::{Path, PathBuf}; use std::sync::Mutex; -use wasmer::Engine; use crate::backend::{Backend, BackendApi, Querier, Storage}; use crate::capabilities::required_capabilities_from_module; @@ -258,7 +257,7 @@ where // for a no-so-relevant use case. // Try to get module from file system cache - let engine = Engine::headless(); + let engine = make_engine(&[]); if let Some((module, module_size)) = cache.fs_cache.load(checksum, &engine)? { cache.stats.hits_fs_cache = cache.stats.hits_fs_cache.saturating_add(1); let memory_limit = Some(cache.instance_memory_limit); @@ -335,7 +334,6 @@ where } // Get module from file system cache - // let store = make_runtime_store(Some(cache.instance_memory_limit)); let engine = make_engine(&[]); if let Some((module, module_size)) = cache.fs_cache.load(checksum, &engine)? { cache.stats.hits_fs_cache = cache.stats.hits_fs_cache.saturating_add(1); From e62d2446259ad9b545675c7b90ea0412db7fb81e Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 17 May 2023 13:48:34 +0200 Subject: [PATCH 0302/2372] Fix naming / details --- packages/vm/src/modules/in_memory_cache.rs | 2 +- packages/vm/src/wasm_backend/store.rs | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/vm/src/modules/in_memory_cache.rs b/packages/vm/src/modules/in_memory_cache.rs index cebb9ce882..3284880dc4 100644 --- a/packages/vm/src/modules/in_memory_cache.rs +++ b/packages/vm/src/modules/in_memory_cache.rs @@ -76,7 +76,7 @@ impl InMemoryCache { pub fn load(&mut self, checksum: &Checksum) -> VmResult> { if let Some(modules) = &mut self.modules { match modules.get(checksum) { - Some(module) => Ok(Some(module.clone())), + Some(cached) => Ok(Some(cached.clone())), None => Ok(None), } } else { diff --git a/packages/vm/src/wasm_backend/store.rs b/packages/vm/src/wasm_backend/store.rs index 609bea6eb7..5cb2a1e725 100644 --- a/packages/vm/src/wasm_backend/store.rs +++ b/packages/vm/src/wasm_backend/store.rs @@ -52,7 +52,6 @@ pub fn make_compile_time_store( make_store_with_engine(compiler.into(), memory_limit) } - // TODO #[cfg(not(feature = "cranelift"))] { let mut compiler = Singlepass::default(); From 057e16e1db6f2f21d8314985a9ea4ba372f2ec3a Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 17 May 2023 14:15:26 +0200 Subject: [PATCH 0303/2372] Use headless engine for simplicity --- packages/vm/src/cache.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 16dcf8c9a1..51295079cd 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -4,6 +4,7 @@ use std::io::{Read, Write}; use std::marker::PhantomData; use std::path::{Path, PathBuf}; use std::sync::Mutex; +use wasmer::Engine; use crate::backend::{Backend, BackendApi, Querier, Storage}; use crate::capabilities::required_capabilities_from_module; @@ -15,7 +16,7 @@ use crate::instance::{Instance, InstanceOptions}; use crate::modules::{CachedModule, FileSystemCache, InMemoryCache, PinnedMemoryCache}; use crate::size::Size; use crate::static_analysis::{deserialize_wasm, has_ibc_entry_points}; -use crate::wasm_backend::{compile, make_engine, make_store_with_engine}; +use crate::wasm_backend::{compile, make_store_with_engine}; const STATE_DIR: &str = "state"; // Things related to the state of the blockchain. @@ -257,7 +258,7 @@ where // for a no-so-relevant use case. // Try to get module from file system cache - let engine = make_engine(&[]); + let engine = Engine::headless(); if let Some((module, module_size)) = cache.fs_cache.load(checksum, &engine)? { cache.stats.hits_fs_cache = cache.stats.hits_fs_cache.saturating_add(1); let memory_limit = Some(cache.instance_memory_limit); @@ -334,7 +335,7 @@ where } // Get module from file system cache - let engine = make_engine(&[]); + let engine = Engine::headless(); if let Some((module, module_size)) = cache.fs_cache.load(checksum, &engine)? { cache.stats.hits_fs_cache = cache.stats.hits_fs_cache.saturating_add(1); From 751442d869e2897cd1dba2caa12e595a448e7a9b Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Mon, 22 May 2023 11:59:42 +0200 Subject: [PATCH 0304/2372] Simplify use declaration Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/vm/src/wasm_backend/mod.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/vm/src/wasm_backend/mod.rs b/packages/vm/src/wasm_backend/mod.rs index 397ae19a60..2b327f70e1 100644 --- a/packages/vm/src/wasm_backend/mod.rs +++ b/packages/vm/src/wasm_backend/mod.rs @@ -5,6 +5,4 @@ mod store; pub use compile::compile; pub use limiting_tunables::LimitingTunables; -pub use store::make_engine; -pub use store::make_runtime_store; -pub use store::make_store_with_engine; +pub use store::{make_engine, make_runtime_store, make_store_with_engine}; From 6dd71704af50a32a9402b0ab66f25c779acb033f Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Mon, 22 May 2023 12:21:51 +0200 Subject: [PATCH 0305/2372] Set wasmer version to fixed --- packages/vm/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index d5dc131ab5..10937ec0c7 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -49,8 +49,8 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " serde_json = "1.0.40" sha2 = "0.10.3" thiserror = "1.0.26" -wasmer = { version = "3.3.0", default-features = false, features = ["cranelift", "singlepass"] } -wasmer-middlewares = "3.3.0" +wasmer = { version = "=3.3.0", default-features = false, features = ["cranelift", "singlepass"] } +wasmer-middlewares = "=3.3.0" # Dependencies that we do not use ourself. We add those entries # to bump the min version of them. From 9d5f7354dab55d6359b195542af602b078a122cd Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Mon, 22 May 2023 14:53:43 +0200 Subject: [PATCH 0306/2372] Remove memory_limit from CachedModule --- packages/vm/src/cache.rs | 49 +++++++------------ packages/vm/src/modules/in_memory_cache.rs | 18 +++---- .../vm/src/modules/pinned_memory_cache.rs | 14 +++--- packages/vm/src/modules/sized_module.rs | 2 - 4 files changed, 30 insertions(+), 53 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 51295079cd..dd90be64c9 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -261,13 +261,9 @@ where let engine = Engine::headless(); if let Some((module, module_size)) = cache.fs_cache.load(checksum, &engine)? { cache.stats.hits_fs_cache = cache.stats.hits_fs_cache.saturating_add(1); - let memory_limit = Some(cache.instance_memory_limit); - return cache.pinned_memory_cache.store( - checksum, - (engine, module), - memory_limit, - module_size, - ); + return cache + .pinned_memory_cache + .store(checksum, (engine, module), module_size); } // Re-compile from original Wasm bytecode @@ -275,10 +271,9 @@ where let (engine, module) = compile(&code, &[])?; // Store into the fs cache too let module_size = cache.fs_cache.store(checksum, &module)?; - let memory_limit = Some(cache.instance_memory_limit); cache .pinned_memory_cache - .store(checksum, (engine, module), memory_limit, module_size) + .store(checksum, (engine, module), module_size) } /// Unpins a Module, i.e. removes it from the pinned memory cache. @@ -302,8 +297,8 @@ where backend: Backend, options: InstanceOptions, ) -> VmResult> { - let (cached, _from_pinned) = self.get_module(checksum)?; - let store = make_store_with_engine(cached.engine, cached.store_memory_limit); + let (cached, memory_limit, _from_pinned) = self.get_module(checksum)?; + let store = make_store_with_engine(cached.engine, Some(memory_limit)); let instance = Instance::from_module( store, &cached.module, @@ -319,19 +314,19 @@ where /// Returns a module tied to a previously saved Wasm. /// Depending on availability, this is either generated from a memory cache, file system cache or Wasm code. /// This is part of `get_instance` but pulled out to reduce the locking time. - fn get_module(&self, checksum: &Checksum) -> VmResult<(CachedModule, bool)> { + fn get_module(&self, checksum: &Checksum) -> VmResult<(CachedModule, Size, bool)> { let mut cache = self.inner.lock().unwrap(); // Try to get module from the pinned memory cache if let Some(element) = cache.pinned_memory_cache.load(checksum)? { cache.stats.hits_pinned_memory_cache = cache.stats.hits_pinned_memory_cache.saturating_add(1); - return Ok((element, true)); + return Ok((element, cache.instance_memory_limit, true)); } // Get module from memory cache if let Some(element) = cache.memory_cache.load(checksum)? { cache.stats.hits_memory_cache = cache.stats.hits_memory_cache.saturating_add(1); - return Ok((element, false)); + return Ok((element, cache.instance_memory_limit, false)); } // Get module from file system cache @@ -339,20 +334,15 @@ where if let Some((module, module_size)) = cache.fs_cache.load(checksum, &engine)? { cache.stats.hits_fs_cache = cache.stats.hits_fs_cache.saturating_add(1); - let memory_limit = Some(cache.instance_memory_limit); - cache.memory_cache.store( - checksum, - (engine.clone(), module.clone()), - memory_limit, - module_size, - )?; + cache + .memory_cache + .store(checksum, (engine.clone(), module.clone()), module_size)?; let cached = CachedModule { engine, module, - store_memory_limit: memory_limit, size: module_size, }; - return Ok((cached, false)); + return Ok((cached, cache.instance_memory_limit, false)); } // Re-compile module from wasm @@ -365,20 +355,15 @@ where let (engine, module) = compile(&wasm, &[])?; let module_size = cache.fs_cache.store(checksum, &module)?; - let memory_limit = Some(cache.instance_memory_limit); - cache.memory_cache.store( - checksum, - (engine.clone(), module.clone()), - memory_limit, - module_size, - )?; + cache + .memory_cache + .store(checksum, (engine.clone(), module.clone()), module_size)?; let cached = CachedModule { engine, module, - store_memory_limit: memory_limit, size: module_size, }; - Ok((cached, false)) + Ok((cached, cache.instance_memory_limit, false)) } } diff --git a/packages/vm/src/modules/in_memory_cache.rs b/packages/vm/src/modules/in_memory_cache.rs index 3284880dc4..ce43eeea5f 100644 --- a/packages/vm/src/modules/in_memory_cache.rs +++ b/packages/vm/src/modules/in_memory_cache.rs @@ -53,7 +53,6 @@ impl InMemoryCache { &mut self, checksum: &Checksum, entry: (Engine, Module), - memory_limit: Option, size: usize, ) -> VmResult<()> { if let Some(modules) = &mut self.modules { @@ -63,7 +62,6 @@ impl InMemoryCache { CachedModule { engine: entry.0, module: entry.1, - store_memory_limit: memory_limit, size, }, ) @@ -166,9 +164,7 @@ mod tests { // Store module let size = wasm.len() * TESTING_WASM_SIZE_FACTOR; - cache - .store(&checksum, (engine, original), None, size) - .unwrap(); + cache.store(&checksum, (engine, original), size).unwrap(); // Load module let cached = cache.load(&checksum).unwrap().unwrap(); @@ -226,19 +222,19 @@ mod tests { // Add 1 cache - .store(&checksum1, compile(&wasm1, &[]).unwrap(), None, 900_000) + .store(&checksum1, compile(&wasm1, &[]).unwrap(), 900_000) .unwrap(); assert_eq!(cache.len(), 1); // Add 2 cache - .store(&checksum2, compile(&wasm2, &[]).unwrap(), None, 900_000) + .store(&checksum2, compile(&wasm2, &[]).unwrap(), 900_000) .unwrap(); assert_eq!(cache.len(), 2); // Add 3 (pushes out the previous two) cache - .store(&checksum3, compile(&wasm3, &[]).unwrap(), None, 1_500_000) + .store(&checksum3, compile(&wasm3, &[]).unwrap(), 1_500_000) .unwrap(); assert_eq!(cache.len(), 1); } @@ -286,19 +282,19 @@ mod tests { // Add 1 cache - .store(&checksum1, compile(&wasm1, &[]).unwrap(), None, 900_000) + .store(&checksum1, compile(&wasm1, &[]).unwrap(), 900_000) .unwrap(); assert_eq!(cache.size(), 900_000); // Add 2 cache - .store(&checksum2, compile(&wasm2, &[]).unwrap(), None, 800_000) + .store(&checksum2, compile(&wasm2, &[]).unwrap(), 800_000) .unwrap(); assert_eq!(cache.size(), 1_700_000); // Add 3 (pushes out the previous two) cache - .store(&checksum3, compile(&wasm3, &[]).unwrap(), None, 1_500_000) + .store(&checksum3, compile(&wasm3, &[]).unwrap(), 1_500_000) .unwrap(); assert_eq!(cache.size(), 1_500_000); } diff --git a/packages/vm/src/modules/pinned_memory_cache.rs b/packages/vm/src/modules/pinned_memory_cache.rs index dd90113414..61ae460e1e 100644 --- a/packages/vm/src/modules/pinned_memory_cache.rs +++ b/packages/vm/src/modules/pinned_memory_cache.rs @@ -2,7 +2,7 @@ use std::collections::HashMap; use wasmer::{Engine, Module}; use super::sized_module::CachedModule; -use crate::{Checksum, Size, VmResult}; +use crate::{Checksum, VmResult}; /// An pinned in memory module cache pub struct PinnedMemoryCache { @@ -21,7 +21,6 @@ impl PinnedMemoryCache { &mut self, checksum: &Checksum, element: (Engine, Module), - memory_limit: Option, size: usize, ) -> VmResult<()> { self.modules.insert( @@ -29,7 +28,6 @@ impl PinnedMemoryCache { CachedModule { engine: element.0, module: element.1, - store_memory_limit: memory_limit, size, }, ); @@ -114,7 +112,7 @@ mod tests { } // Store module - cache.store(&checksum, (engine, original), None, 0).unwrap(); + cache.store(&checksum, (engine, original), 0).unwrap(); // Load module let cached = cache.load(&checksum).unwrap().unwrap(); @@ -151,7 +149,7 @@ mod tests { // Add let (engine, original) = compile(&wasm, &[]).unwrap(); - cache.store(&checksum, (engine, original), None, 0).unwrap(); + cache.store(&checksum, (engine, original), 0).unwrap(); assert!(cache.has(&checksum)); @@ -182,7 +180,7 @@ mod tests { // Add let (engine, original) = compile(&wasm, &[]).unwrap(); - cache.store(&checksum, (engine, original), None, 0).unwrap(); + cache.store(&checksum, (engine, original), 0).unwrap(); assert_eq!(cache.len(), 1); @@ -224,13 +222,13 @@ mod tests { // Add 1 cache - .store(&checksum1, compile(&wasm1, &[]).unwrap(), None, 500) + .store(&checksum1, compile(&wasm1, &[]).unwrap(), 500) .unwrap(); assert_eq!(cache.size(), 500); // Add 2 cache - .store(&checksum2, compile(&wasm2, &[]).unwrap(), None, 300) + .store(&checksum2, compile(&wasm2, &[]).unwrap(), 300) .unwrap(); assert_eq!(cache.size(), 800); diff --git a/packages/vm/src/modules/sized_module.rs b/packages/vm/src/modules/sized_module.rs index b593c427ab..027242a588 100644 --- a/packages/vm/src/modules/sized_module.rs +++ b/packages/vm/src/modules/sized_module.rs @@ -1,11 +1,9 @@ -use crate::Size; use wasmer::{Engine, Module}; #[derive(Debug, Clone)] pub struct CachedModule { pub engine: Engine, pub module: Module, - pub store_memory_limit: Option, /// The estimated size of this element in memory pub size: usize, } From 80cba9ad862d668f69517dc60e26dfa24be0c1fd Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 22 May 2023 16:26:52 +0200 Subject: [PATCH 0307/2372] Add ReturnMsgResponse to ibc-reflect contract --- contracts/ibc-reflect/src/contract.rs | 11 ++++------- contracts/ibc-reflect/src/msg.rs | 4 ++++ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index c99ae67d89..8130473bdf 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -9,7 +9,8 @@ use cosmwasm_std::{ use crate::msg::{ AccountInfo, AccountResponse, AcknowledgementMsg, BalancesResponse, DispatchResponse, - InstantiateMsg, ListAccountsResponse, PacketMsg, QueryMsg, ReflectExecuteMsg, WhoAmIResponse, + InstantiateMsg, ListAccountsResponse, PacketMsg, QueryMsg, ReflectExecuteMsg, + ReturnMsgsResponse, WhoAmIResponse, }; use crate::state::{accounts, accounts_read, config, pending_channel, Config}; @@ -247,7 +248,6 @@ pub fn ibc_packet_receive( PacketMsg::Panic {} => execute_panic(), PacketMsg::ReturnErr { text } => execute_error(text), PacketMsg::ReturnMsgs { msgs } => execute_return_msgs(msgs), - } })() .or_else(|e| { @@ -320,10 +320,8 @@ fn execute_error(text: String) -> StdResult { return Err(StdError::generic_err(text).into()); } -fn execute_return_msgs( - msgs: Vec, -) -> StdResult { - let acknowledgement = to_binary(&AcknowledgementMsg::::Ok(()))?; +fn execute_return_msgs(msgs: Vec) -> StdResult { + let acknowledgement = to_binary(&AcknowledgementMsg::::Ok(()))?; Ok(IbcReceiveResponse::new() .set_ack(acknowledgement) @@ -331,7 +329,6 @@ fn execute_return_msgs( .add_attribute("action", "receive_dispatch")) } - #[entry_point] /// never should be called as we do not send packets pub fn ibc_packet_ack( diff --git a/contracts/ibc-reflect/src/msg.rs b/contracts/ibc-reflect/src/msg.rs index d50ffa5c48..acd49baf63 100644 --- a/contracts/ibc-reflect/src/msg.rs +++ b/contracts/ibc-reflect/src/msg.rs @@ -73,3 +73,7 @@ pub struct BalancesResponse { pub account: String, pub balances: Vec, } + +/// This is the success response we send on ack for PacketMsg::ReturnMsgs. +/// Just acknowledge success or error +pub type ReturnMsgsResponse = (); From 81fe3a08559a9212503ea7064ab184dff50e1cb1 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 22 May 2023 16:32:50 +0200 Subject: [PATCH 0308/2372] Fix clippy lints --- contracts/ibc-reflect/src/contract.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 8130473bdf..3b31aab4f4 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -317,7 +317,7 @@ fn execute_panic() -> StdResult { } fn execute_error(text: String) -> StdResult { - return Err(StdError::generic_err(text).into()); + Err(StdError::generic_err(text)) } fn execute_return_msgs(msgs: Vec) -> StdResult { From fe6e8b3fb6d19f7339add7f9f1bcf608d4e2e590 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 22 May 2023 16:49:59 +0200 Subject: [PATCH 0309/2372] Fix test --- contracts/ibc-reflect/src/contract.rs | 2 +- contracts/ibc-reflect/tests/integration.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 3b31aab4f4..11e9049ebf 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -597,7 +597,7 @@ mod tests { assert_eq!(0, res.messages.len()); // acknowledgement is an error let ack: AcknowledgementMsg = from_slice(&res.acknowledgement).unwrap(); - assert_eq!(ack.unwrap_err(), "invalid packet: Error parsing into type ibc_reflect::msg::PacketMsg: unknown variant `reflect_code_id`, expected one of `dispatch`, `who_am_i`, `balances`"); + assert_eq!(ack.unwrap_err(), "invalid packet: Error parsing into type ibc_reflect::msg::PacketMsg: unknown variant `reflect_code_id`, expected one of `dispatch`, `who_am_i`, `balances`, `panic`, `return_err`, `return_msgs`"); } #[test] diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index d28e3369a4..66dc430026 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -287,5 +287,5 @@ fn handle_dispatch_packet() { // acknowledgement is an error let ack: AcknowledgementMsg = from_slice(&res.acknowledgement, DESERIALIZATION_LIMIT).unwrap(); - assert_eq!(ack.unwrap_err(), "invalid packet: Error parsing into type ibc_reflect::msg::PacketMsg: unknown variant `reflect_code_id`, expected one of `dispatch`, `who_am_i`, `balances`"); + assert_eq!(ack.unwrap_err(), "invalid packet: Error parsing into type ibc_reflect::msg::PacketMsg: unknown variant `reflect_code_id`, expected one of `dispatch`, `who_am_i`, `balances`, `panic`, `return_err`, `return_msgs`"); } From 9412b136e53dcf0b774b0e1660ecdd694f65ea04 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 22 May 2023 17:03:51 +0200 Subject: [PATCH 0310/2372] Update schema --- contracts/ibc-reflect/schema/packet_msg.json | 58 ++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/contracts/ibc-reflect/schema/packet_msg.json b/contracts/ibc-reflect/schema/packet_msg.json index bd940ab4f0..547c6fe054 100644 --- a/contracts/ibc-reflect/schema/packet_msg.json +++ b/contracts/ibc-reflect/schema/packet_msg.json @@ -51,6 +51,64 @@ } }, "additionalProperties": false + }, + { + "type": "object", + "required": [ + "panic" + ], + "properties": { + "panic": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "return_err" + ], + "properties": { + "return_err": { + "type": "object", + "required": [ + "text" + ], + "properties": { + "text": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "return_msgs" + ], + "properties": { + "return_msgs": { + "type": "object", + "required": [ + "msgs" + ], + "properties": { + "msgs": { + "type": "array", + "items": { + "$ref": "#/definitions/CosmosMsg_for_Empty" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false } ], "definitions": { From 4e6d923cc5ff3d7e03f41488567631bfb5692b3e Mon Sep 17 00:00:00 2001 From: Andrei Petrovich Date: Thu, 4 May 2023 07:37:49 +0200 Subject: [PATCH 0311/2372] 1518 cosmwasm-check: update Clap to version 4 --- CHANGELOG.md | 1 + Cargo.lock | 1076 +++++++++++++----- packages/check/Cargo.toml | 6 +- packages/check/src/main.rs | 21 +- packages/check/tests/cosmwasm_check_tests.rs | 74 ++ packages/vm/src/modules/file_system_cache.rs | 8 +- 6 files changed, 859 insertions(+), 327 deletions(-) create mode 100644 packages/check/tests/cosmwasm_check_tests.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index bbbd9f12f3..e6bd33b3bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,7 @@ and this project adheres to - cosmwasm-vm: Add `Instance::set_debug_handler`/`unset_debug_handler` to allow customizing the handling of debug messages emitted by the contract ([#1667]). - cosmwasm-vm: Add `.wasm` extension to stored wasm files ([#1686]). +- cosmwasm-check: Update clap dependency to version 4 [#1511]: https://github.com/CosmWasm/cosmwasm/issues/1511 [#1629]: https://github.com/CosmWasm/cosmwasm/pull/1629 diff --git a/Cargo.lock b/Cargo.lock index dda8806a5f..b82f6bab75 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,11 +4,11 @@ version = 3 [[package]] name = "addr2line" -version = "0.17.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" +checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" dependencies = [ - "gimli", + "gimli 0.27.2", ] [[package]] @@ -23,11 +23,20 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ - "getrandom 0.2.6", + "getrandom", "once_cell", "version_check", ] +[[package]] +name = "aho-corasick" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" +dependencies = [ + "memchr", +] + [[package]] name = "anes" version = "0.1.6" @@ -43,11 +52,81 @@ dependencies = [ "winapi", ] +[[package]] +name = "anstream" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +dependencies = [ + "anstyle 1.0.0", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is-terminal", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23ea9e81bd02e310c216d080f6223c179012256e5151c41db88d12c88a1684d2" + +[[package]] +name = "anstyle" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" + +[[package]] +name = "anstyle-parse" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "anstyle-wincon" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +dependencies = [ + "anstyle 1.0.0", + "windows-sys 0.48.0", +] + [[package]] name = "anyhow" -version = "1.0.57" +version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f9b8508dccb7687a1d6c4ce66b2b0ecef467c94667de27d8d7fe1f8d2a9cdc" +checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" + +[[package]] +name = "assert_cmd" +version = "2.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0dcbed38184f9219183fcf38beb4cdbf5df7163a6d7cd227c6ac89b7966d6fe" +dependencies = [ + "anstyle 0.3.5", + "bstr", + "doc-comment", + "predicates", + "predicates-core", + "predicates-tree", + "wait-timeout", +] [[package]] name = "atty" @@ -55,7 +134,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", "winapi", ] @@ -68,16 +147,16 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "backtrace" -version = "0.3.65" +version = "0.3.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11a17d453482a265fd5f8479f2a3f405566e6ca627837aaddb85af8b1ab8ef61" +checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" dependencies = [ "addr2line", "cc", "cfg-if", "libc", "miniz_oxide", - "object", + "object 0.30.3", "rustc-demangle", ] @@ -89,15 +168,15 @@ checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" [[package]] name = "base64" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64ct" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea908e7347a8c64e378c17e30ef880ad73e3b4498346b055c2c00ea342f3179" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bitflags" @@ -116,38 +195,51 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.10.2" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] +[[package]] +name = "bstr" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d4260bcc2e8fc9df1eac4919a720effeb63a3f0952f5bf4944adfa18897f09" +dependencies = [ + "memchr", + "once_cell", + "regex-automata", + "serde", +] + [[package]] name = "bumpalo" -version = "3.12.0" +version = "3.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" +checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8" [[package]] name = "bytecheck" -version = "0.6.8" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a31f923c2db9513e4298b72df143e6e655a759b3d6a0966df18f81223fff54f" +checksum = "13fe11640a23eb24562225322cd3e452b93a3d4091d62fab69c70542fcd17d1f" dependencies = [ "bytecheck_derive", "ptr_meta", + "simdutf8", ] [[package]] name = "bytecheck_derive" -version = "0.6.8" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edb17c862a905d912174daa27ae002326fff56dc8b8ada50a0a5f0976cb174f0" +checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -164,9 +256,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.73" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" [[package]] name = "cfg-if" @@ -176,9 +268,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.19" +version = "0.4.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" dependencies = [ "num-integer", "num-traits", @@ -220,7 +312,7 @@ dependencies = [ "ansi_term", "atty", "bitflags", - "strsim", + "strsim 0.8.0", "textwrap 0.11.0", "unicode-width", "vec_map", @@ -228,16 +320,38 @@ dependencies = [ [[package]] name = "clap" -version = "3.2.23" +version = "3.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" dependencies = [ "bitflags", - "clap_lex", + "clap_lex 0.2.4", "indexmap", "textwrap 0.16.0", ] +[[package]] +name = "clap" +version = "4.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34d21f9bf1b425d2968943631ec91202fe5e837264063503708b83013f8fc938" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "914c8c79fb560f238ef6429439a30023c862f7a28e688c58f7203f12b29970bd" +dependencies = [ + "anstream", + "anstyle 1.0.0", + "bitflags", + "clap_lex 0.4.1", + "strsim 0.10.0", +] + [[package]] name = "clap_lex" version = "0.2.4" @@ -247,12 +361,24 @@ dependencies = [ "os_str_bytes", ] +[[package]] +name = "clap_lex" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a2dd5a6fe8c6e3502f568a6353e5273bbb15193ad9a89e457b9970798efbea1" + [[package]] name = "clru" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + [[package]] name = "colored" version = "2.0.0" @@ -266,9 +392,9 @@ dependencies = [ [[package]] name = "const-oid" -version = "0.9.0" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "722e23542a15cea1f65d4a1419c4cfd7a26706c70871a13a04238ca3f40f1661" +checksum = "520fbf3c07483f94e3e3ca9d0cfd913d7718ef2483d2cfd91c0d9e91474ab913" [[package]] name = "corosensei" @@ -280,7 +406,7 @@ dependencies = [ "cfg-if", "libc", "scopeguard", - "windows-sys", + "windows-sys 0.33.0", ] [[package]] @@ -288,10 +414,12 @@ name = "cosmwasm-check" version = "1.2.5" dependencies = [ "anyhow", - "clap 2.34.0", + "assert_cmd", + "clap 4.2.7", "colored", "cosmwasm-std", "cosmwasm-vm", + "predicates", ] [[package]] @@ -300,16 +428,16 @@ version = "1.2.5" dependencies = [ "base64", "criterion", - "digest 0.10.3", + "digest 0.10.6", "ed25519-zebra", "english-numbers", "hex", "hex-literal", "k256", - "rand_core 0.6.3", + "rand_core 0.6.4", "serde", "serde_json", - "sha2 0.10.3", + "sha2 0.10.6", "thiserror", ] @@ -318,7 +446,7 @@ name = "cosmwasm-derive" version = "1.2.5" dependencies = [ "cosmwasm-std", - "syn", + "syn 1.0.109", ] [[package]] @@ -342,7 +470,7 @@ version = "1.2.5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -362,7 +490,7 @@ dependencies = [ "serde", "serde-json-wasm", "serde_json", - "sha2 0.10.3", + "sha2 0.10.6", "thiserror", "uint", ] @@ -399,7 +527,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2 0.10.3", + "sha2 0.10.6", "target-lexicon", "tempfile", "thiserror", @@ -410,9 +538,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.2" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" dependencies = [ "libc", ] @@ -436,7 +564,7 @@ dependencies = [ "cranelift-codegen-meta", "cranelift-codegen-shared", "cranelift-entity", - "gimli", + "gimli 0.26.2", "log", "regalloc", "smallvec", @@ -495,7 +623,7 @@ dependencies = [ "atty", "cast", "ciborium", - "clap 3.2.23", + "clap 3.2.25", "criterion-plot", "itertools", "lazy_static", @@ -523,9 +651,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.4" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaa7bd5fb665c6864b5f963dd9097905c54125909c7aa94c9e18507cdbe6c53" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" dependencies = [ "cfg-if", "crossbeam-utils", @@ -533,9 +661,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" dependencies = [ "cfg-if", "crossbeam-epoch", @@ -544,26 +672,24 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.8" +version = "0.9.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1145cf131a2c6ba0615079ab6a638f7e1973ac9c2634fcbeaaad6114246efe8c" +checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" dependencies = [ "autocfg", "cfg-if", "crossbeam-utils", - "lazy_static", - "memoffset", + "memoffset 0.8.0", "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.8" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" +checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" dependencies = [ "cfg-if", - "lazy_static", ] [[package]] @@ -574,12 +700,12 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-bigint" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f2b443d17d49dad5ef0ede301c3179cc923b8822f3393b4d2c28c269dd4a122" +checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" dependencies = [ "generic-array", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", "zeroize", ] @@ -609,9 +735,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.13.4" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +checksum = "0558d22a7b463ed0241e993f76f09f30b126687447751a8638587b864e4b3944" dependencies = [ "darling_core", "darling_macro", @@ -619,33 +745,33 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.13.4" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +checksum = "ab8bfa2e259f8ee1ce5e97824a3c55ec4404a0d772ca7fa96bf19f0752a046eb" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "syn", + "syn 2.0.15", ] [[package]] name = "darling_macro" -version = "0.13.4" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +checksum = "29a358ff9f12ec09c3e61fef9b5a9902623a695a46a917b07f269bff1445611a" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.15", ] [[package]] name = "der" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dd2ae565c0a381dde7fade45fce95984c568bdcb4700a4fdbe3175e0380b2f" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" dependencies = [ "const-oid", "zeroize", @@ -659,9 +785,15 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + [[package]] name = "digest" version = "0.9.0" @@ -673,20 +805,26 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.3" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" dependencies = [ - "block-buffer 0.10.2", + "block-buffer 0.10.4", "crypto-common", "subtle", ] +[[package]] +name = "doc-comment" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" + [[package]] name = "dyn-clone" -version = "1.0.5" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21e50f3adc76d6a43f5ed73b698a87d0760ca74617f60f7c3b879003536fdd28" +checksum = "68b0cf012f1230e43cd00ebb729c6bb58707ecfa8ad08b52ef3a4ccd2697fc30" [[package]] name = "dynasm" @@ -700,7 +838,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -716,9 +854,9 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.14.3" +version = "0.14.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd46e0c364655e5baf2f5e99b603e7a09905da9966d7928d7470af393b28670" +checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" dependencies = [ "der", "elliptic-curve", @@ -728,40 +866,40 @@ dependencies = [ [[package]] name = "ed25519-zebra" -version = "3.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403ef3e961ab98f0ba902771d29f842058578bb1ce7e3c59dad5a6a93e784c69" +checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" dependencies = [ "curve25519-dalek", + "hashbrown 0.12.3", "hex", - "rand_core 0.6.3", + "rand_core 0.6.4", "serde", "sha2 0.9.9", - "thiserror", "zeroize", ] [[package]] name = "either" -version = "1.6.1" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] name = "elliptic-curve" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c47abd0a791d2ac0c7aa1118715f85b83689e4522c4e3a244e159d4fc9848a8d" +checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" dependencies = [ "base16ct", "crypto-bigint", "der", - "digest 0.10.3", + "digest 0.10.6", "ff", "generic-array", "group", "pkcs8", - "rand_core 0.6.3", + "rand_core 0.6.4", "sec1", "subtle", "zeroize", @@ -790,28 +928,49 @@ checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "enumset" -version = "1.0.11" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4799cdb24d48f1f8a7a98d06b7fde65a85a2d1e42b25a889f5406aa1fbefe074" +checksum = "59b025475ad197bd8b4a9bdce339216b6cf3bd568bf2e107c286b51613f0b3cf" dependencies = [ "enumset_derive", ] [[package]] name = "enumset_derive" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea83a3fbdc1d999ccfbcbee717eab36f8edf2d71693a23ce0d7cca19e085304c" +checksum = "14c2852ff17a4c9a2bb2abbca3074737919cb05dc24b0a8ca9498081a7033dd6" dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.15", +] + +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", ] [[package]] @@ -822,23 +981,32 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "fastrand" -version = "1.7.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" dependencies = [ "instant", ] [[package]] name = "ff" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df689201f395c6b90dfe87127685f8dbfc083a5e779e613575d8bd7314300c3e" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" dependencies = [ - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +dependencies = [ + "num-traits", +] + [[package]] name = "fnv" version = "1.0.7" @@ -853,9 +1021,9 @@ checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" [[package]] name = "generic-array" -version = "0.14.5" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -863,37 +1031,32 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.2.6" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" +checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" dependencies = [ "cfg-if", "libc", - "wasi 0.10.2+wasi-snapshot-preview1", + "wasi", ] [[package]] name = "gimli" -version = "0.26.1" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" +checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" dependencies = [ "fallible-iterator", "indexmap", "stable_deref_trait", ] +[[package]] +name = "gimli" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" + [[package]] name = "glob" version = "0.3.1" @@ -902,12 +1065,12 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "group" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7391856def869c1c81063a03457c676fbcd419709c3dfb33d8d319de484b154d" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" dependencies = [ "ff", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -928,9 +1091,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db0d4cf898abf0081f964436dc980e96670a0f36863e4b83aaacdb65c9d7ccc3" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ "ahash", ] @@ -944,6 +1107,21 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + [[package]] name = "hex" version = "0.4.3" @@ -962,7 +1140,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.3", + "digest 0.10.6", ] [[package]] @@ -973,12 +1151,12 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "indexmap" -version = "1.8.1" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown 0.11.2", + "hashbrown 0.12.3", "serde", ] @@ -991,40 +1169,63 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "io-lifetimes" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" +dependencies = [ + "hermit-abi 0.3.1", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "is-terminal" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" +dependencies = [ + "hermit-abi 0.3.1", + "io-lifetimes", + "rustix", + "windows-sys 0.48.0", +] + [[package]] name = "itertools" -version = "0.10.3" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.1" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" [[package]] name = "js-sys" -version = "0.3.57" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671a26f820db17c2a2750743f1dd03bafd15b98c9f30c7c2628c024c05d73397" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" dependencies = [ "wasm-bindgen", ] [[package]] name = "k256" -version = "0.11.3" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8a5a96d92d849c4499d99461da81c9cdc1467418a8ed2aaeb407e8d85940ed" +checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2 0.10.3", + "sha2 0.10.6", ] [[package]] @@ -1041,20 +1242,26 @@ checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "libc" -version = "0.2.125" +version = "0.2.142" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b" +checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" [[package]] name = "libloading" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" dependencies = [ "cfg-if", "winapi", ] +[[package]] +name = "linux-raw-sys" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b64f40e5e03e0d54f03845c8197d0291253cdbedfb1cb46b13c2c117554a9f4c" + [[package]] name = "log" version = "0.4.17" @@ -1082,7 +1289,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0fbfc88337168279f2e9ae06e157cfed4efd3316e14dc96ed074d4f2e6c5952" dependencies = [ "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1102,9 +1309,9 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memmap2" -version = "0.5.3" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057a3db23999c867821a7a59feb06a578fcb03685e983dff90daf9e7d24ac08f" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" dependencies = [ "libc", ] @@ -1118,11 +1325,20 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + [[package]] name = "miniz_oxide" -version = "0.5.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082" +checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" dependencies = [ "adler", ] @@ -1133,6 +1349,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" +[[package]] +name = "normalize-line-endings" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" + [[package]] name = "num-integer" version = "0.1.45" @@ -1154,19 +1376,19 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.13.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" dependencies = [ - "hermit-abi", + "hermit-abi 0.2.6", "libc", ] [[package]] name = "object" -version = "0.28.3" +version = "0.28.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40bec70ba014595f99f7aa110b84331ffe1ee9aece7fe6f387cc7e3ecda4d456" +checksum = "e42c982f2d955fac81dd7e1d0e1426a7d702acd9c98d19ab01083a6a0328c424" dependencies = [ "crc32fast", "hashbrown 0.11.2", @@ -1174,11 +1396,20 @@ dependencies = [ "memchr", ] +[[package]] +name = "object" +version = "0.30.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" -version = "1.10.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "oorandom" @@ -1222,9 +1453,9 @@ dependencies = [ [[package]] name = "plotters" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a3fd9ec30b9749ce28cd91f255d569591cdf937fe280c312143e3c4bad6f2a" +checksum = "2538b639e642295546c50fcd545198c9d64ee2a38620a628724a3b266d5fbf97" dependencies = [ "num-traits", "plotters-backend", @@ -1235,24 +1466,55 @@ dependencies = [ [[package]] name = "plotters-backend" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d88417318da0eaf0fdcdb51a0ee6c3bed624333bff8f946733049380be67ac1c" +checksum = "193228616381fecdc1224c62e96946dfbc73ff4384fba576e052ff8c1bea8142" [[package]] name = "plotters-svg" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521fa9638fa597e1dc53e9412a4f9cefb01187ee1f7413076f9e6749e2885ba9" +checksum = "f9a81d2759aae1dae668f783c308bc5c8ebd191ff4184aaa1b37f65a6ae5a56f" dependencies = [ "plotters-backend", ] [[package]] name = "ppv-lite86" -version = "0.2.16" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "predicates" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" +checksum = "09963355b9f467184c04017ced4a2ba2d75cbcb4e7462690d388233253d4b1a9" +dependencies = [ + "anstyle 1.0.0", + "difflib", + "float-cmp", + "itertools", + "normalize-line-endings", + "predicates-core", + "regex", +] + +[[package]] +name = "predicates-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" + +[[package]] +name = "predicates-tree" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf" +dependencies = [ + "predicates-core", + "termtree", +] [[package]] name = "proc-macro-error" @@ -1263,7 +1525,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -1280,11 +1542,11 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.37" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec757218438d5fda206afc041538b2f6d889286160d649a86a24d37e1235afd1" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -1304,14 +1566,14 @@ checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "quote" -version = "1.0.18" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" +checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" dependencies = [ "proc-macro2", ] @@ -1324,7 +1586,7 @@ checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", - "rand_core 0.6.3", + "rand_core 0.6.4", ] [[package]] @@ -1334,7 +1596,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.3", + "rand_core 0.6.4", ] [[package]] @@ -1342,36 +1604,31 @@ name = "rand_core" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] [[package]] name = "rand_core" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.6", + "getrandom", ] [[package]] name = "rayon" -version = "1.5.2" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd249e82c21598a9a426a4e00dd7adc1d640b22445ec8545feef801d1a74c221" +checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" dependencies = [ - "autocfg", - "crossbeam-deque", "either", "rayon-core", ] [[package]] name = "rayon-core" -version = "1.9.2" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f51245e1e62e1f1629cbfec37b5793bbabcaeb90f30e94d2ba03564687353e4" +checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" dependencies = [ "crossbeam-channel", "crossbeam-deque", @@ -1381,9 +1638,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.13" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ "bitflags", ] @@ -1401,18 +1658,26 @@ dependencies = [ [[package]] name = "regex" -version = "1.5.5" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" +checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" dependencies = [ + "aho-corasick", + "memchr", "regex-syntax", ] +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" + [[package]] name = "regex-syntax" -version = "0.6.25" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" [[package]] name = "region" @@ -1426,29 +1691,20 @@ dependencies = [ "winapi", ] -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - [[package]] name = "rend" -version = "0.3.6" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79af64b4b6362ffba04eef3a4e10829718a4896dac19daa741851c86781edf95" +checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" dependencies = [ "bytecheck", ] [[package]] name = "rfc6979" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88c86280f057430a52f4861551b092a01b419b8eacefc7c995eacb9dc132fe32" +checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" dependencies = [ "crypto-bigint", "hmac", @@ -1457,12 +1713,12 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.7.38" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "517a3034eb2b1499714e9d1e49b2367ad567e07639b69776d35e259d9c27cca6" +checksum = "21499ed91807f07ae081880aabb2ccc0235e9d88011867d984525e9a4c3cfa3e" dependencies = [ "bytecheck", - "hashbrown 0.12.1", + "hashbrown 0.12.3", "ptr_meta", "rend", "rkyv_derive", @@ -1471,20 +1727,20 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.7.38" +version = "0.7.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "505c209ee04111a006431abf39696e640838364d67a107c559ababaf6fd8c9dd" +checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "rustc-demangle" -version = "0.1.21" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustc-hash" @@ -1492,17 +1748,31 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustix" +version = "0.37.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bbfc1d1c7c40c01715f47d71444744a81669ca84e8b63e25a55e169b1f86433" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", +] + [[package]] name = "rustversion" -version = "1.0.6" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f" +checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" [[package]] name = "ryu" -version = "1.0.9" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" [[package]] name = "same-file" @@ -1534,7 +1804,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn", + "syn 1.0.109", ] [[package]] @@ -1565,46 +1835,46 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.9" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cb243bdfdb5936c8dc3c45762a19d12ab4550cdc753bc247637d4ec35a040fd" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" [[package]] name = "serde" -version = "1.0.137" +version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" +checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" dependencies = [ "serde_derive", ] [[package]] name = "serde-json-wasm" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" +checksum = "16a62a1fad1e1828b24acac8f2b468971dade7b8c3c2e672bcadefefb1f8c137" dependencies = [ "serde", ] [[package]] name = "serde_bytes" -version = "0.11.6" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212e73464ebcde48d723aa02eb270ba62eff38a9b732df31f33f1b4e145f3a54" +checksum = "416bda436f9aab92e02c8e10d49a15ddd339cea90b6e340fe51ed97abb548294" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.137" +version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" +checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.15", ] [[package]] @@ -1615,14 +1885,14 @@ checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "serde_json" -version = "1.0.81" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" dependencies = [ "itoa", "ryu", @@ -1644,30 +1914,36 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.3" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899bf02746a2c92bf1053d9327dadb252b01af1f81f90cdb902411f518bc7215" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.3", + "digest 0.10.6", ] [[package]] name = "signature" -version = "1.5.0" +version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f054c6c1a6e95179d6f23ed974060dcefb2d9388bb7256900badad682c499de4" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" dependencies = [ - "digest 0.10.3", - "rand_core 0.6.3", + "digest 0.10.6", + "rand_core 0.6.4", ] +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + [[package]] name = "smallvec" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] name = "spki" @@ -1697,6 +1973,12 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "subtle" version = "2.4.1" @@ -1705,35 +1987,51 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.92" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff7c592601f11445996a06f8ad0c27f094a58857c2f89e97974ab9235b92c52" +checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] name = "target-lexicon" -version = "0.12.3" +version = "0.12.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fa7e55043acb85fca6b3c01485a2eeb6b69c5d21002e273c79e465f43b7ac1" +checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5" [[package]] name = "tempfile" -version = "3.3.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" dependencies = [ "cfg-if", "fastrand", - "libc", "redox_syscall", - "remove_dir_all", - "winapi", + "rustix", + "windows-sys 0.45.0", ] +[[package]] +name = "termtree" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" + [[package]] name = "textwrap" version = "0.11.0" @@ -1751,22 +2049,22 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" -version = "1.0.38" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.38" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.15", ] [[package]] @@ -1781,9 +2079,9 @@ dependencies = [ [[package]] name = "tracing" -version = "0.1.34" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0ecdcb44a79f0fe9844f0c4f33a342cbcbb5117de8001e6ba0dc2351327d09" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if", "log", @@ -1794,35 +2092,35 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.21" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c" +checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.15", ] [[package]] name = "tracing-core" -version = "0.1.26" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f54c8ca710e81886d498c2fd3331b56c93aa248d49de2222ad2742247c60072f" +checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" dependencies = [ - "lazy_static", + "once_cell", ] [[package]] name = "typenum" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "uint" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f03af7ccf01dd611cc450a0d10dbc9b745770d096473e2faf0ca6e2d66d1e0" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" dependencies = [ "byteorder", "crunchy", @@ -1830,17 +2128,23 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + [[package]] name = "unicode-width" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" [[package]] -name = "unicode-xid" -version = "0.2.3" +name = "utf8parse" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "vec_map" @@ -1855,33 +2159,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] -name = "walkdir" -version = "2.3.2" +name = "wait-timeout" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" dependencies = [ - "same-file", - "winapi", - "winapi-util", + "libc", ] [[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" +name = "walkdir" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" +checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +dependencies = [ + "same-file", + "winapi-util", +] [[package]] name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.80" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1889,24 +2195,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.80" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.80" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1914,22 +2220,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.80" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.80" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" + +[[package]] +name = "wasm-encoder" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744" +checksum = "d05d0b6fcd0aeb98adf16e7975331b3c17222aa815148f5b976370ce589d80ef" +dependencies = [ + "leb128", +] [[package]] name = "wasmer" @@ -1998,7 +2313,7 @@ dependencies = [ "cranelift-codegen", "cranelift-entity", "cranelift-frontend", - "gimli", + "gimli 0.26.2", "loupe", "more-asserts", "rayon", @@ -2018,7 +2333,7 @@ dependencies = [ "byteorder", "dynasm", "dynasmrt", - "gimli", + "gimli 0.26.2", "lazy_static", "loupe", "more-asserts", @@ -2037,7 +2352,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -2075,7 +2390,7 @@ dependencies = [ "leb128", "libloading", "loupe", - "object", + "object 0.28.4", "rkyv", "serde", "tempfile", @@ -2143,7 +2458,7 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d831335ff3a44ecf451303f6f891175c642488036b92ceceb24ac8623a8fa8b" dependencies = [ - "object", + "object 0.28.4", "thiserror", "wasmer-compiler", "wasmer-types", @@ -2181,7 +2496,7 @@ dependencies = [ "libc", "loupe", "mach", - "memoffset", + "memoffset 0.6.5", "more-asserts", "region", "rkyv", @@ -2201,29 +2516,30 @@ checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a" [[package]] name = "wast" -version = "40.0.0" +version = "57.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb4f48a8b083dbc50e291e430afb8f524092bb00428957bcc63f49f856c64ac" +checksum = "6eb0f5ed17ac4421193c7477da05892c2edafd67f9639e3c11a82086416662dc" dependencies = [ "leb128", "memchr", "unicode-width", + "wasm-encoder", ] [[package]] name = "wat" -version = "1.0.42" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0401b6395ce0db91629a75b29597ccb66ea29950af9fc859f1bb3a736609c76e" +checksum = "ab9ab0d87337c3be2bb6fc5cd331c4ba9fd6bcb4ee85048a0dd59ed9ecf92e53" dependencies = [ "wast", ] [[package]] name = "web-sys" -version = "0.3.57" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283" +checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" dependencies = [ "js-sys", "wasm-bindgen", @@ -2231,13 +2547,13 @@ dependencies = [ [[package]] name = "which" -version = "4.2.5" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c4fb54e6113b6a8772ee41c3404fb0301ac79604489467e0a9ce1f3e97c24ae" +checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" dependencies = [ "either", - "lazy_static", "libc", + "once_cell", ] [[package]] @@ -2277,45 +2593,177 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43dbb096663629518eb1dfa72d80243ca5a6aca764cae62a2df70af760a9be75" dependencies = [ - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_msvc", + "windows_aarch64_msvc 0.33.0", + "windows_i686_gnu 0.33.0", + "windows_i686_msvc 0.33.0", + "windows_x86_64_gnu 0.33.0", + "windows_x86_64_msvc 0.33.0", ] +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.0", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + [[package]] name = "windows_aarch64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + [[package]] name = "windows_i686_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + [[package]] name = "windows_i686_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + [[package]] name = "windows_x86_64_gnu" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + [[package]] name = "windows_x86_64_msvc" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + [[package]] name = "zeroize" -version = "1.5.5" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94693807d016b2f2d2e14420eb3bfcca689311ff775dcf113d74ea624b7cdf07" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index c046e1b39b..5f96586c95 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -9,7 +9,11 @@ license = "Apache-2.0" [dependencies] anyhow = "1.0.57" -clap = "2" +clap = "4" colored = "2" cosmwasm-vm = { path = "../vm", version = "1.2.5" } cosmwasm-std = { path = "../std", version = "1.2.5" } + +[dev-dependencies] +assert_cmd = "2" +predicates = "3" diff --git a/packages/check/src/main.rs b/packages/check/src/main.rs index c1f7da1784..b73ff4f07c 100644 --- a/packages/check/src/main.rs +++ b/packages/check/src/main.rs @@ -4,7 +4,7 @@ use std::io::Read; use std::path::Path; use std::process::exit; -use clap::{App, Arg}; +use clap::{Arg, ArgAction, Command}; use colored::Colorize; use cosmwasm_vm::capabilities_from_csv; @@ -13,38 +13,43 @@ use cosmwasm_vm::internals::{check_wasm, compile}; const DEFAULT_AVAILABLE_CAPABILITIES: &str = "iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2"; pub fn main() { - let matches = App::new("Contract checking") + let matches = Command::new("Contract checking") .version(env!("CARGO_PKG_VERSION")) .long_about("Checks the given wasm file (memories, exports, imports, available capabilities, and non-determinism).") .author("Mauro Lacy ") .arg( - Arg::with_name("CAPABILITIES") + Arg::new("CAPABILITIES") // `long` setting required to turn the position argument into an option 🤷 .long("available-capabilities") .aliases(&["FEATURES", "supported-features"]) // Old names .value_name("CAPABILITIES") .help("Sets the available capabilities that the desired target chain has") - .takes_value(true) + .num_args(1) + .action(ArgAction::Set), ) .arg( - Arg::with_name("WASM") + Arg::new("WASM") .help("Wasm file to read and compile") .required(true) .index(1) - .multiple(true), + .num_args(0..) + .action(ArgAction::Append), ) .get_matches(); // Available capabilities let available_capabilities_csv = matches - .value_of("CAPABILITIES") + .get_one::("CAPABILITIES") + .map(|s| s.as_str()) .unwrap_or(DEFAULT_AVAILABLE_CAPABILITIES); let available_capabilities = capabilities_from_csv(available_capabilities_csv); println!("Available capabilities: {:?}", available_capabilities); println!(); // File - let paths = matches.values_of("WASM").expect("Error parsing file names"); + let paths = matches + .get_many::("WASM") + .expect("Error parsing file names"); let (passes, failures): (Vec<_>, _) = paths .map(|p| { diff --git a/packages/check/tests/cosmwasm_check_tests.rs b/packages/check/tests/cosmwasm_check_tests.rs new file mode 100644 index 0000000000..0c4301d683 --- /dev/null +++ b/packages/check/tests/cosmwasm_check_tests.rs @@ -0,0 +1,74 @@ +use assert_cmd::prelude::*; +use predicates::prelude::*; +use std::process::Command; + +#[test] +fn valid_contract_check() -> Result<(), Box> { + let mut cmd = Command::cargo_bin("cosmwasm-check")?; + + cmd.arg("../vm/testdata/hackatom.wasm"); + cmd.assert() + .success() + .stdout(predicate::str::contains("pass")); + + Ok(()) +} + +#[test] +fn invalid_contract_check() -> Result<(), Box> { + let mut cmd = Command::cargo_bin("cosmwasm-check")?; + + cmd.arg("../vm/testdata/corrupted.wasm"); + cmd.assert() + .failure() + .stdout(predicate::str::contains("Deserialization error")); + + Ok(()) +} + +#[test] +fn invalid_contract_check_float_operator() -> Result<(), Box> { + let mut cmd = Command::cargo_bin("cosmwasm-check")?; + + cmd.arg("../vm/testdata/floaty.wasm"); + cmd.assert() + .failure() + .stdout(predicate::str::contains("Float operator detected")) + .stdout(predicate::str::contains( + "The use of floats is not supported", + )); + + Ok(()) +} + +#[test] +fn several_contracts_check() -> Result<(), Box> { + let mut cmd = Command::cargo_bin("cosmwasm-check")?; + + cmd.arg("../vm/testdata/hackatom.wasm") + .arg("../vm/testdata/corrupted.wasm"); + cmd.assert() + .failure() + .stdout(predicate::str::contains("failure")) + .stdout(predicate::str::contains("Deserialization error")) + .stdout(predicate::str::contains("Passes: 1, failures: 1")); + + Ok(()) +} + +#[test] +fn custom_capabilities_check() -> Result<(), Box> { + let mut cmd = Command::cargo_bin("cosmwasm-check")?; + + cmd.arg("--available-capabilities") + .arg("iterator,osmosis,friendship") + .arg("../vm/testdata/hackatom.wasm"); + cmd.assert() + .success() + .stdout(predicate::str::contains("Available capabilities:")) + .stdout(predicate::str::contains("iterator")) + .stdout(predicate::str::contains("osmosis")) + .stdout(predicate::str::contains("friendship")); + + Ok(()) +} diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index f8b3cceebd..41a4d80167 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -310,11 +310,11 @@ mod tests { }; let target = Target::new(triple.clone(), wasmer::CpuFeature::POPCNT.into()); let id = target_id(&target); - assert_eq!(id, "x86_64-nintendo-fuchsia-gnu-coff-4721E3F4"); + assert_eq!(id, "x86_64-nintendo-fuchsia-gnu-coff-01E9F9FE"); // Changing CPU features changes the hash part let target = Target::new(triple, wasmer::CpuFeature::AVX512DQ.into()); let id = target_id(&target); - assert_eq!(id, "x86_64-nintendo-fuchsia-gnu-coff-D5C8034F"); + assert_eq!(id, "x86_64-nintendo-fuchsia-gnu-coff-93001945"); // Works for durrect target (hashing is deterministic); let target = Target::default(); @@ -338,9 +338,9 @@ mod tests { assert_eq!( p.as_os_str(), if cfg!(windows) { - "modules\\v5-wasmer17\\x86_64-nintendo-fuchsia-gnu-coff-4721E3F4" + "modules\\v5-wasmer17\\x86_64-nintendo-fuchsia-gnu-coff-01E9F9FE" } else { - "modules/v5-wasmer17/x86_64-nintendo-fuchsia-gnu-coff-4721E3F4" + "modules/v5-wasmer17/x86_64-nintendo-fuchsia-gnu-coff-01E9F9FE" } ); } From 433f57058c28dc07d3073d1980292fa2b3389167 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 23 May 2023 16:53:18 +0200 Subject: [PATCH 0312/2372] Add PR link to changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6bd33b3bd..389e6290f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,13 +32,14 @@ and this project adheres to - cosmwasm-vm: Add `Instance::set_debug_handler`/`unset_debug_handler` to allow customizing the handling of debug messages emitted by the contract ([#1667]). - cosmwasm-vm: Add `.wasm` extension to stored wasm files ([#1686]). -- cosmwasm-check: Update clap dependency to version 4 +- cosmwasm-check: Update clap dependency to version 4 ([#1677]) [#1511]: https://github.com/CosmWasm/cosmwasm/issues/1511 [#1629]: https://github.com/CosmWasm/cosmwasm/pull/1629 [#1631]: https://github.com/CosmWasm/cosmwasm/pull/1631 [#1664]: https://github.com/CosmWasm/cosmwasm/pull/1664 [#1667]: https://github.com/CosmWasm/cosmwasm/pull/1667 +[#1677]: https://github.com/CosmWasm/cosmwasm/pull/1677 [#1686]: https://github.com/CosmWasm/cosmwasm/pull/1686 ### Deprecated From 1d01f9375b848fa9240d57d7de51edd236dc76d7 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 23 May 2023 17:52:36 +0200 Subject: [PATCH 0313/2372] Fix clippy issue --- packages/check/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/check/src/main.rs b/packages/check/src/main.rs index b73ff4f07c..933e33547a 100644 --- a/packages/check/src/main.rs +++ b/packages/check/src/main.rs @@ -21,7 +21,7 @@ pub fn main() { Arg::new("CAPABILITIES") // `long` setting required to turn the position argument into an option 🤷 .long("available-capabilities") - .aliases(&["FEATURES", "supported-features"]) // Old names + .aliases(["FEATURES", "supported-features"]) // Old names .value_name("CAPABILITIES") .help("Sets the available capabilities that the desired target chain has") .num_args(1) From bc7c05a4d3f6a50fff53230f52b4099704936623 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 23 May 2023 17:52:27 +0200 Subject: [PATCH 0314/2372] Upgrade and pin assert_cmd to 2.0.10 --- Cargo.lock | 4 ++-- packages/check/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b82f6bab75..499102fee2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -115,9 +115,9 @@ checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" [[package]] name = "assert_cmd" -version = "2.0.9" +version = "2.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0dcbed38184f9219183fcf38beb4cdbf5df7163a6d7cd227c6ac89b7966d6fe" +checksum = "ec0b2340f55d9661d76793b2bfc2eb0e62689bd79d067a95707ea762afd5e9dd" dependencies = [ "anstyle 0.3.5", "bstr", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index 5f96586c95..6fd6bbff3c 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -15,5 +15,5 @@ cosmwasm-vm = { path = "../vm", version = "1.2.5" } cosmwasm-std = { path = "../std", version = "1.2.5" } [dev-dependencies] -assert_cmd = "2" +assert_cmd = "=2.0.10" # 2.0.11+ requires Rust 1.65.0 which we currently don't want to make the minimum if possible predicates = "3" From d53b62a7ccd3e7b3223847d2b85d0461a59fa79f Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 23 May 2023 17:41:10 +0200 Subject: [PATCH 0315/2372] Benchmark Wasmer 3 branch --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index a3b30467f5..0335b7ae71 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -85,6 +85,7 @@ workflows: - /^[0-9]+\.[0-9]+$/ # Add your branch here if benchmarking matters to your work - fix-benchmarking + - w3 - coverage deploy: jobs: From a0eed1500ff402ce01c4305c30022031c9fa6889 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 23 May 2023 21:30:58 +0200 Subject: [PATCH 0316/2372] Fix some text --- packages/vm/src/memory.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vm/src/memory.rs b/packages/vm/src/memory.rs index b586999f7d..1e753bbfa6 100644 --- a/packages/vm/src/memory.rs +++ b/packages/vm/src/memory.rs @@ -28,8 +28,8 @@ struct Region { unsafe impl ValueType for Region { fn zero_padding_bytes(&self, _bytes: &mut [MaybeUninit]) { - // The size of Region is exactly 3x4 bytes with no padding - // The `size_of::()` test nelow ensures that. + // The size of Region is exactly 3x4=12 bytes with no padding. + // The `size_of::()` test below ensures that. // So we do not need to zero any bytes here. } } From c8f3e4e44486a6c990cb991f9aab7ac632aeeee7 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 24 May 2023 12:35:26 +0200 Subject: [PATCH 0317/2372] Remove unused code --- packages/vm/src/environment.rs | 6 ------ packages/vm/src/memory.rs | 36 ---------------------------------- 2 files changed, 42 deletions(-) diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index c3161ac223..ae72ebf594 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -130,12 +130,6 @@ impl Clone for Environment { } } -// impl WasmerEnv for Environment { -// fn init_with_instance(&mut self, _instance: &WasmerInstance) -> Result<(), HostEnvInitError> { -// Ok(()) -// } -// } - impl Environment { pub fn new(api: A, gas_limit: u64) -> Self { Environment { diff --git a/packages/vm/src/memory.rs b/packages/vm/src/memory.rs index 1e753bbfa6..16a25b8792 100644 --- a/packages/vm/src/memory.rs +++ b/packages/vm/src/memory.rs @@ -54,24 +54,6 @@ pub fn read_region(memory: &wasmer::MemoryView, ptr: u32, max_length: usize) -> memory.size().bytes().0 )))?; Ok(result) - - // match WasmPtr::::new(region.offset).deref(memory, 0, region.length) { - // Some(cells) => { - // // In case you want to do some premature optimization, this shows how to cast a `&'mut [Cell]` to `&mut [u8]`: - // // https://github.com/wasmerio/wasmer/blob/0.13.1/lib/wasi/src/syscalls/mod.rs#L79-L81 - // let len = region.length as usize; - // let mut result = vec![0u8; len]; - // for i in 0..len { - // result[i] = cells[i].get(); - // } - // Ok(result) - // } - // None => Err(CommunicationError::deref_err(region.offset, format!( - // "Tried to access memory of region {:?} in wasm memory of size {} bytes. This typically happens when the given Region pointer does not point to a proper Region struct.", - // region, - // memory.size().bytes().0 - // )).into()), - // } } /// maybe_read_region is like read_region, but gracefully handles null pointer (0) by returning None @@ -111,24 +93,6 @@ pub fn write_region(memory: &wasmer::MemoryView, ptr: u32, data: &[u8]) -> VmRes set_region(memory, ptr, region)?; Ok(()) - - // match WasmPtr::::new(region.offset).deref(memory, 0, region.capacity) { - // Some(cells) => { - // // In case you want to do some premature optimization, this shows how to cast a `&'mut [Cell]` to `&mut [u8]`: - // // https://github.com/wasmerio/wasmer/blob/0.13.1/lib/wasi/src/syscalls/mod.rs#L79-L81 - // for i in 0..data.len() { - // cells[i].set(data[i]) - // } - // region.length = data.len() as u32; - // set_region(memory, ptr, region)?; - // Ok(()) - // }, - // None => Err(CommunicationError::deref_err(region.offset, format!( - // "Tried to access memory of region {:?} in wasm memory of size {} bytes. This typically happens when the given Region pointer does not point to a proper Region struct.", - // region, - // memory.size().bytes().0 - // )).into()), - // } } /// Reads in a Region at ptr in wasm memory and returns a copy of it From e9cc7be3d93430ae536988bbaf96c4fb439222bc Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 24 May 2023 12:35:47 +0200 Subject: [PATCH 0318/2372] Improve memory doc comment --- packages/vm/src/environment.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index ae72ebf594..3b5073e840 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -359,8 +359,8 @@ impl Environment { }) } - // Creates a MemoryView. - // This mut be short living and not be used after the memory was grown. + /// Creates a MemoryView. + /// This must be short living and not be used after the memory was grown. pub fn memory<'a>(&self, store: &'a mut impl AsStoreMut) -> MemoryView<'a> { self.memory .as_ref() From 07fcba8471280a44c238f44ef4dafcbbf63f0d57 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 24 May 2023 12:36:03 +0200 Subject: [PATCH 0319/2372] Fix Modulej comment --- packages/vm/examples/module_size.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vm/examples/module_size.sh b/packages/vm/examples/module_size.sh index acbab51a69..59bc4aa5fa 100755 --- a/packages/vm/examples/module_size.sh +++ b/packages/vm/examples/module_size.sh @@ -1,6 +1,6 @@ #!/bin/bash # Uses valgrind's massif tool to compute heap memory consumption of compiled modules. -# For a wasmer `Modulej , it has been determined that this method underestimates the size +# For a wasmer `Module`, it has been determined that this method underestimates the size # of the module significanty. set -e From 4b5e5e39dfffa742238530cf616266e3fdabdf0a Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 24 May 2023 14:01:22 +0200 Subject: [PATCH 0320/2372] Remove unused make_compile_time_store --- packages/vm/src/wasm_backend/store.rs | 75 +-------------------------- 1 file changed, 1 insertion(+), 74 deletions(-) diff --git a/packages/vm/src/wasm_backend/store.rs b/packages/vm/src/wasm_backend/store.rs index 5cb2a1e725..05f3e5e408 100644 --- a/packages/vm/src/wasm_backend/store.rs +++ b/packages/vm/src/wasm_backend/store.rs @@ -30,40 +30,6 @@ fn cost(_operator: &Operator) -> u64 { 150_000 } -/// Created a store with the default compiler and the given memory limit (in bytes). -/// If memory_limit is None, no limit is applied. -#[allow(dead_code)] -pub fn make_compile_time_store( - memory_limit: Option, - middlewares: &[Arc], -) -> Store { - let gas_limit = 0; - let deterministic = Arc::new(Gatekeeper::default()); - let metering = Arc::new(Metering::new(gas_limit, cost)); - - #[cfg(feature = "cranelift")] - { - let mut compiler = Cranelift::default(); - for middleware in middlewares { - compiler.push_middleware(middleware.clone()); - } - compiler.push_middleware(deterministic); - compiler.push_middleware(metering); - make_store_with_engine(compiler.into(), memory_limit) - } - - #[cfg(not(feature = "cranelift"))] - { - let mut compiler = Singlepass::default(); - for middleware in middlewares { - compiler.push_middleware(middleware.clone()); - } - compiler.push_middleware(deterministic); - compiler.push_middleware(metering); - make_store_with_engine(compiler.into(), memory_limit) - } -} - /// Creates an engine with the default compiler. pub fn make_engine(middlewares: &[Arc]) -> Engine { let gas_limit = 0; @@ -152,51 +118,12 @@ mod tests { assert_eq!(limit_to_pages(Size(usize::MAX)), Pages(65536)); } - #[test] - fn make_compile_time_store_applies_memory_limit() { - let wasm = wat::parse_str(EXPORTED_MEMORY_WAT).unwrap(); - - // No limit - let mut store = make_compile_time_store(None, &[]); - let module = Module::new(&store, &wasm).unwrap(); - let module_memory = module.info().memories.last().unwrap(); - assert_eq!(module_memory.minimum, Pages(4)); - assert_eq!(module_memory.maximum, None); - let instance = Instance::new(&mut store, &module, &Imports::new()).unwrap(); - let instance_memory: Memory = instance - .exports - .iter() - .memories() - .map(|pair| pair.1.clone()) - .next() - .unwrap(); - assert_eq!(instance_memory.ty(&store).minimum, Pages(4)); - assert_eq!(instance_memory.ty(&store).maximum, None); - - // Set limit - let mut store = make_compile_time_store(Some(Size::kibi(23 * 64)), &[]); - let module = Module::new(&store, &wasm).unwrap(); - let module_memory = module.info().memories.last().unwrap(); - assert_eq!(module_memory.minimum, Pages(4)); - assert_eq!(module_memory.maximum, None); - let instance = Instance::new(&mut store, &module, &Imports::new()).unwrap(); - let instance_memory: Memory = instance - .exports - .iter() - .memories() - .map(|pair| pair.1.clone()) - .next() - .unwrap(); - assert_eq!(instance_memory.ty(&store).minimum, Pages(4)); - assert_eq!(instance_memory.ty(&store).maximum, Some(Pages(23))); - } - #[test] fn make_runtime_store_applies_memory_limit() { // Compile let serialized = { let wasm = wat::parse_str(EXPORTED_MEMORY_WAT).unwrap(); - let store = make_compile_time_store(None, &[]); + let store = make_engine(&[]); let module = Module::new(&store, wasm).unwrap(); module.serialize().unwrap() }; From fe24771b6b62f069597b3449de9df680b9d84c3b Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 24 May 2023 14:14:35 +0200 Subject: [PATCH 0321/2372] Organize operators --- packages/vm/src/wasm_backend/gatekeeper.rs | 56 ++++++++++++---------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/packages/vm/src/wasm_backend/gatekeeper.rs b/packages/vm/src/wasm_backend/gatekeeper.rs index abdd98d184..dc0f443883 100644 --- a/packages/vm/src/wasm_backend/gatekeeper.rs +++ b/packages/vm/src/wasm_backend/gatekeeper.rs @@ -453,6 +453,7 @@ impl FunctionMiddleware for FunctionGatekeeper { | Operator::I64x2LeS | Operator::I64x2GeS | Operator::I8x16Popcnt + | Operator::I16x8AvgrU | Operator::I16x8ExtAddPairwiseI8x16S | Operator::I16x8ExtAddPairwiseI8x16U | Operator::I16x8Q15MulrSatS @@ -483,11 +484,7 @@ impl FunctionMiddleware for FunctionGatekeeper { | Operator::F64x2ConvertLowI32x4U | Operator::F32x4DemoteF64x2Zero | Operator::F64x2PromoteLowF32x4 - | Operator::I8x16RelaxedSwizzle - | Operator::I32x4RelaxedTruncSatF32x4S - | Operator::I32x4RelaxedTruncSatF32x4U - | Operator::I32x4RelaxedTruncSatF64x2SZero - | Operator::I32x4RelaxedTruncSatF64x2UZero => { + | Operator::I8x16AvgrU => { if self.config.allow_feature_simd { state.push_operator(operator); Ok(()) @@ -499,6 +496,34 @@ impl FunctionMiddleware for FunctionGatekeeper { Err(MiddlewareError::new(MIDDLEWARE_NAME, msg)) } } + // Relaxed SIMD operators + Operator::I8x16RelaxedSwizzle + | Operator::I32x4RelaxedTruncSatF32x4S + | Operator::I32x4RelaxedTruncSatF32x4U + | Operator::I32x4RelaxedTruncSatF64x2SZero + | Operator::I32x4RelaxedTruncSatF64x2UZero + | Operator::F32x4RelaxedFma + | Operator::F32x4RelaxedFnma + | Operator::F64x2RelaxedFma + | Operator::F64x2RelaxedFnma + | Operator::I8x16RelaxedLaneselect + | Operator::I16x8RelaxedLaneselect + | Operator::I32x4RelaxedLaneselect + | Operator::I64x2RelaxedLaneselect + | Operator::F32x4RelaxedMin + | Operator::F32x4RelaxedMax + | Operator::F64x2RelaxedMin + | Operator::F64x2RelaxedMax + | Operator::I16x8RelaxedQ15mulrS + | Operator::I16x8DotI8x16I7x16S + | Operator::I32x4DotI8x16I7x16AddS + | Operator::F32x4RelaxedDotBf16x8AddF32x4 => { + let msg = format!( + "Relaxed SIMD operator detected: {:?}. The Wasm Relaxed SIMD extension is not supported.", + operator + ); + Err(MiddlewareError::new(MIDDLEWARE_NAME, msg)) + } Operator::F32Load { .. } | Operator::F64Load { .. } | Operator::F32Store { .. } @@ -626,11 +651,7 @@ impl FunctionMiddleware for FunctionGatekeeper { | Operator::I32x4TruncSatF32x4S | Operator::I32x4TruncSatF32x4U | Operator::F32x4ConvertI32x4S - | Operator::F32x4ConvertI32x4U - | Operator::F32x4RelaxedMin - | Operator::F32x4RelaxedMax - | Operator::F64x2RelaxedMin - | Operator::F64x2RelaxedMax => { + | Operator::F32x4ConvertI32x4U => { if self.config.allow_floats { state.push_operator(operator); Ok(()) @@ -672,21 +693,6 @@ impl FunctionMiddleware for FunctionGatekeeper { Err(MiddlewareError::new(MIDDLEWARE_NAME, msg)) } } - // TODO: do - Operator::I8x16AvgrU => todo!(), - Operator::I16x8AvgrU => todo!(), - Operator::F32x4RelaxedFma => todo!(), - Operator::F32x4RelaxedFnma => todo!(), - Operator::F64x2RelaxedFma => todo!(), - Operator::F64x2RelaxedFnma => todo!(), - Operator::I8x16RelaxedLaneselect => todo!(), - Operator::I16x8RelaxedLaneselect => todo!(), - Operator::I32x4RelaxedLaneselect => todo!(), - Operator::I64x2RelaxedLaneselect => todo!(), - Operator::I16x8RelaxedQ15mulrS => todo!(), - Operator::I16x8DotI8x16I7x16S => todo!(), - Operator::I32x4DotI8x16I7x16AddS => todo!(), - Operator::F32x4RelaxedDotBf16x8AddF32x4 => todo!(), } } } From 6c0a20d7b83d240c76746406f32973b70f65231e Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 24 May 2023 16:49:38 +0200 Subject: [PATCH 0322/2372] Fix pin comments --- packages/vm/src/cache.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 2e53663063..19ca83a1e6 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -243,10 +243,12 @@ where /// Pins a Module that was previously stored via save_wasm. /// - /// The module is lookup first in the memory cache, and then in the file system cache. - /// If not found, the code is loaded from the file system, compiled, and stored into the + /// The module is lookup first in the file system cache. If not found, + /// the code is loaded from the file system, compiled, and stored into the /// pinned cache. - /// If the given ID is not found, or the content does not match the hash (=ID), an error is returned. + /// + /// If the given contract for the given checksum is not found, or the content + /// does not match the checksum, an error is returned. pub fn pin(&self, checksum: &Checksum) -> VmResult<()> { let mut cache = self.inner.lock().unwrap(); if cache.pinned_memory_cache.has(checksum) { @@ -255,7 +257,7 @@ where // We don't load from the memory cache because we had to create new store here and // serialize/deserialize the artifact to get a full clone. Could be done but adds some code - // for a no-so-relevant use case. + // for a not-so-relevant use case. // Try to get module from file system cache let engine = Engine::headless(); From a5db6dabdfe60a45618f9f61a19b2a7365722262 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 24 May 2023 16:49:49 +0200 Subject: [PATCH 0323/2372] Remove unnecessary type --- packages/vm/src/cache.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 19ca83a1e6..1206dbe5e6 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -732,7 +732,7 @@ mod tests { let backend5 = mock_backend(&[]); // from file system - let _instance1: Instance = cache + let _instance1 = cache .get_instance(&checksum, backend1, TESTING_OPTIONS) .unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 0); From 83c3254551e8f5f13046ce900a4e11125eb7ab6d Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 24 May 2023 16:50:07 +0200 Subject: [PATCH 0324/2372] Rename module to cached_module --- packages/vm/src/modules/{sized_module.rs => cached_module.rs} | 0 packages/vm/src/modules/in_memory_cache.rs | 2 +- packages/vm/src/modules/mod.rs | 4 ++-- packages/vm/src/modules/pinned_memory_cache.rs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename packages/vm/src/modules/{sized_module.rs => cached_module.rs} (100%) diff --git a/packages/vm/src/modules/sized_module.rs b/packages/vm/src/modules/cached_module.rs similarity index 100% rename from packages/vm/src/modules/sized_module.rs rename to packages/vm/src/modules/cached_module.rs diff --git a/packages/vm/src/modules/in_memory_cache.rs b/packages/vm/src/modules/in_memory_cache.rs index ce43eeea5f..ca8bc6a579 100644 --- a/packages/vm/src/modules/in_memory_cache.rs +++ b/packages/vm/src/modules/in_memory_cache.rs @@ -3,7 +3,7 @@ use std::collections::hash_map::RandomState; use std::num::NonZeroUsize; use wasmer::{Engine, Module}; -use super::sized_module::CachedModule; +use super::cached_module::CachedModule; use crate::{Checksum, Size, VmError, VmResult}; // Minimum module size. diff --git a/packages/vm/src/modules/mod.rs b/packages/vm/src/modules/mod.rs index b91f72cadc..c871963e87 100644 --- a/packages/vm/src/modules/mod.rs +++ b/packages/vm/src/modules/mod.rs @@ -1,11 +1,11 @@ +mod cached_module; mod file_system_cache; mod in_memory_cache; mod pinned_memory_cache; -mod sized_module; mod versioning; +pub use cached_module::CachedModule; pub use file_system_cache::{FileSystemCache, NewFileSystemCacheError}; pub use in_memory_cache::InMemoryCache; pub use pinned_memory_cache::PinnedMemoryCache; -pub use sized_module::CachedModule; pub use versioning::current_wasmer_module_version; diff --git a/packages/vm/src/modules/pinned_memory_cache.rs b/packages/vm/src/modules/pinned_memory_cache.rs index 61ae460e1e..bb4b72c04e 100644 --- a/packages/vm/src/modules/pinned_memory_cache.rs +++ b/packages/vm/src/modules/pinned_memory_cache.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; use wasmer::{Engine, Module}; -use super::sized_module::CachedModule; +use super::cached_module::CachedModule; use crate::{Checksum, VmResult}; /// An pinned in memory module cache From 1de705aedb65ab339a630814a86e87635c46163f Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 24 May 2023 16:52:11 +0200 Subject: [PATCH 0325/2372] Dedupe code in make_engine --- packages/vm/src/wasm_backend/store.rs | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/packages/vm/src/wasm_backend/store.rs b/packages/vm/src/wasm_backend/store.rs index 05f3e5e408..5c9fad45d9 100644 --- a/packages/vm/src/wasm_backend/store.rs +++ b/packages/vm/src/wasm_backend/store.rs @@ -37,26 +37,17 @@ pub fn make_engine(middlewares: &[Arc]) -> Engine { let metering = Arc::new(Metering::new(gas_limit, cost)); #[cfg(feature = "cranelift")] - { - let mut compiler = Cranelift::default(); - for middleware in middlewares { - compiler.push_middleware(middleware.clone()); - } - compiler.push_middleware(deterministic); - compiler.push_middleware(metering); - compiler.into() - } + let mut compiler = Cranelift::default(); #[cfg(not(feature = "cranelift"))] - { - let mut compiler = Singlepass::default(); - for middleware in middlewares { - compiler.push_middleware(middleware.clone()); - } - compiler.push_middleware(deterministic); - compiler.push_middleware(metering); - compiler.into() + let mut compiler = Singlepass::default(); + + for middleware in middlewares { + compiler.push_middleware(middleware.clone()); } + compiler.push_middleware(deterministic); + compiler.push_middleware(metering); + compiler.into() } /// Created a store with no compiler and the given memory limit (in bytes) From 95a9c321cbdf46593a996490d6ad3ad4f9a0734e Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 24 May 2023 16:53:10 +0200 Subject: [PATCH 0326/2372] Add CHANGELOG entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 389e6290f6..7380f7fb7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,7 @@ and this project adheres to - cosmwasm-vm: Add `Instance::set_debug_handler`/`unset_debug_handler` to allow customizing the handling of debug messages emitted by the contract ([#1667]). - cosmwasm-vm: Add `.wasm` extension to stored wasm files ([#1686]). +- cosmwasm-vm: Upgrade Wasmer to version 3.3.0. - cosmwasm-check: Update clap dependency to version 4 ([#1677]) [#1511]: https://github.com/CosmWasm/cosmwasm/issues/1511 From adcfdb0bae2b194610b3e205738f507119556fba Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 25 May 2023 10:22:39 +0200 Subject: [PATCH 0327/2372] Polish get_region/set_region code --- packages/vm/src/memory.rs | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/packages/vm/src/memory.rs b/packages/vm/src/memory.rs index 16a25b8792..3b1c97fcfe 100644 --- a/packages/vm/src/memory.rs +++ b/packages/vm/src/memory.rs @@ -95,12 +95,11 @@ pub fn write_region(memory: &wasmer::MemoryView, ptr: u32, data: &[u8]) -> VmRes Ok(()) } -/// Reads in a Region at ptr in wasm memory and returns a copy of it -fn get_region(memory: &wasmer::MemoryView, ptr: u32) -> CommunicationResult { - let wptr = WasmPtr::::new(ptr); - // TODO: double check error handling +/// Reads in a Region at offset in Wasm memory and returns a copy of it +fn get_region(memory: &wasmer::MemoryView, offset: u32) -> CommunicationResult { + let wptr = WasmPtr::::new(offset); let region = wptr.deref(memory).read().map_err(|_err| { - CommunicationError::deref_err(ptr, "Could not dereference this pointer to a Region") + CommunicationError::deref_err(offset, "Could not dereference this pointer to a Region") })?; validate_region(®ion)?; Ok(region) @@ -127,13 +126,11 @@ fn validate_region(region: &Region) -> RegionValidationResult<()> { Ok(()) } -/// Overrides a Region at ptr in wasm memory with data -fn set_region(memory: &wasmer::MemoryView, ptr: u32, data: Region) -> CommunicationResult<()> { - let wptr = WasmPtr::::new(ptr); - - // TODO: double check error handling +/// Overrides a Region at offset in Wasm memory +fn set_region(memory: &wasmer::MemoryView, offset: u32, data: Region) -> CommunicationResult<()> { + let wptr = WasmPtr::::new(offset); wptr.deref(memory).write(data).map_err(|_err| { - CommunicationError::deref_err(ptr, "Could not dereference this pointer to a Region") + CommunicationError::deref_err(offset, "Could not dereference this pointer to a Region") })?; Ok(()) } From 2f1ac40e18f14ddf95f8b8dea4fdcdb8f7361885 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 25 May 2023 10:24:16 +0200 Subject: [PATCH 0328/2372] Add RegionAccessErr --- packages/vm/src/errors/communication_error.rs | 14 +++++++++++++ packages/vm/src/memory.rs | 20 +++++++------------ 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/packages/vm/src/errors/communication_error.rs b/packages/vm/src/errors/communication_error.rs index a5fb88e0ee..263980efba 100644 --- a/packages/vm/src/errors/communication_error.rs +++ b/packages/vm/src/errors/communication_error.rs @@ -2,6 +2,7 @@ use std::fmt::Debug; use thiserror::Error; use super::region_validation_error::RegionValidationError; +use crate::memory::Region; /// An error in the communcation between contract and host. Those happen around imports and exports. #[derive(Error, Debug)] @@ -32,6 +33,12 @@ pub enum CommunicationError { RegionLengthTooBig { length: usize, max_length: usize }, #[error("Region too small. Got {}, required {}", size, required)] RegionTooSmall { size: usize, required: usize }, + #[error("Tried to access memory of region {:?} in Wasm memory of size {} bytes. This typically happens when the given Region pointer does not point to a proper Region struct.", region, memory_size)] + RegionAccessErr { + region: Region, + /// Current size of the linear memory in bytes + memory_size: usize, + }, #[error("Got a zero Wasm address")] ZeroAddress {}, } @@ -64,6 +71,13 @@ impl CommunicationError { CommunicationError::RegionTooSmall { size, required } } + pub(crate) fn region_access_err(region: Region, memory_size: usize) -> Self { + CommunicationError::RegionAccessErr { + region, + memory_size, + } + } + pub(crate) fn zero_address() -> Self { CommunicationError::ZeroAddress {} } diff --git a/packages/vm/src/memory.rs b/packages/vm/src/memory.rs index 3b1c97fcfe..04aa6f054e 100644 --- a/packages/vm/src/memory.rs +++ b/packages/vm/src/memory.rs @@ -17,7 +17,7 @@ use crate::errors::{ /// but defined here to allow Wasmer specific implementation. #[repr(C)] #[derive(Default, Clone, Copy, Debug)] -struct Region { +pub struct Region { /// The beginning of the region expressed as bytes from the beginning of the linear memory pub offset: u32, /// The number of bytes available in this region @@ -47,12 +47,9 @@ pub fn read_region(memory: &wasmer::MemoryView, ptr: u32, max_length: usize) -> } let mut result = vec![0u8; region.length as usize]; - // TODO: double check error handling - memory.read(region.offset as u64, &mut result).map_err(|_err| CommunicationError::deref_err(region.offset, format!( - "Tried to access memory of region {:?} in wasm memory of size {} bytes. This typically happens when the given Region pointer does not point to a proper Region struct.", - region, - memory.size().bytes().0 - )))?; + memory + .read(region.offset as u64, &mut result) + .map_err(|_err| CommunicationError::region_access_err(region, memory.size().bytes().0))?; Ok(result) } @@ -82,12 +79,9 @@ pub fn write_region(memory: &wasmer::MemoryView, ptr: u32, data: &[u8]) -> VmRes return Err(CommunicationError::region_too_small(region_capacity, data.len()).into()); } - // TODO: double check error handling - memory.write(region.offset as u64, data).map_err(|_err| CommunicationError::deref_err(region.offset, format!( - "Tried to access memory of region {:?} in wasm memory of size {} bytes. This typically happens when the given Region pointer does not point to a proper Region struct.", - region, - memory.size().bytes().0 - )))?; + memory + .write(region.offset as u64, data) + .map_err(|_err| CommunicationError::region_access_err(region, memory.size().bytes().0))?; region.length = data.len() as u32; set_region(memory, ptr, region)?; From 39a83d969f03e142d2107b3e96104f4b24a19480 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 25 May 2023 10:36:49 +0200 Subject: [PATCH 0329/2372] Test calling extra imports --- packages/vm/src/instance.rs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index b8bf87da9f..0b176a387c 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -602,6 +602,8 @@ mod tests { let (engine, module) = compile(&wasm, &[]).unwrap(); let mut store = make_store_with_engine(engine, memory_limit); + let called = Arc::new(AtomicBool::new(false)); + #[derive(Clone)] struct MyEnv { // This can be mutated across threads safely. We initialize it as `false` @@ -609,11 +611,12 @@ mod tests { called: Arc, } - let my_env = MyEnv { - called: Arc::new(AtomicBool::new(false)), - }; - - let fe = FunctionEnv::new(&mut store, my_env); + let fe = FunctionEnv::new( + &mut store, + MyEnv { + called: called.clone(), + }, + ); let fun = Function::new_typed_with_env(&mut store, &fe, move |fe_mut: FunctionEnvMut| { @@ -636,8 +639,7 @@ mod tests { instance.call_function0("main", &[]).unwrap(); - // TODO: allow inspecting env - // assert!(fe.as_ref(&store).called.load(Ordering::Relaxed)); + assert!(called.load(Ordering::Relaxed)); } #[test] From 631107ce8ad29e50458b320a29e4a1eb7004b0ee Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 25 May 2023 11:22:14 +0200 Subject: [PATCH 0330/2372] Update module_size example's clap dependency --- Cargo.lock | 51 ++--------------------------- packages/vm/Cargo.toml | 2 +- packages/vm/examples/module_size.rs | 8 ++--- 3 files changed, 8 insertions(+), 53 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b0c2670db2..957d399272 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -43,15 +43,6 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" -[[package]] -name = "ansi_term" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -dependencies = [ - "winapi", -] - [[package]] name = "anstream" version = "0.3.2" @@ -327,21 +318,6 @@ dependencies = [ "half", ] -[[package]] -name = "clap" -version = "2.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" -dependencies = [ - "ansi_term", - "atty", - "bitflags", - "strsim 0.8.0", - "textwrap 0.11.0", - "unicode-width", - "vec_map", -] - [[package]] name = "clap" version = "3.2.25" @@ -351,7 +327,7 @@ dependencies = [ "bitflags", "clap_lex 0.2.4", "indexmap", - "textwrap 0.16.0", + "textwrap", ] [[package]] @@ -373,7 +349,7 @@ dependencies = [ "anstyle 1.0.0", "bitflags", "clap_lex 0.5.0", - "strsim 0.10.0", + "strsim", ] [[package]] @@ -534,7 +510,7 @@ dependencies = [ "bitflags", "bytecheck", "bytes", - "clap 2.34.0", + "clap 4.3.0", "clru", "cosmwasm-crypto", "cosmwasm-std", @@ -2045,12 +2021,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - [[package]] name = "strsim" version = "0.10.0" @@ -2116,15 +2086,6 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" -[[package]] -name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] - [[package]] name = "textwrap" version = "0.16.0" @@ -2276,12 +2237,6 @@ version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "345444e32442451b267fc254ae85a209c64be56d2890e601a0c37ff0c3c5ecd2" -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - [[package]] name = "version_check" version = "0.9.4" diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 10937ec0c7..34eb20617e 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -70,7 +70,7 @@ glob = "0.3.1" hex-literal = "0.3.1" tempfile = "3.1.0" wat = "1.0" -clap = "2.33.3" +clap = "4" rand = "0.8" leb128 = "0.2" target-lexicon = "0.12" diff --git a/packages/vm/examples/module_size.rs b/packages/vm/examples/module_size.rs index 7013304a66..162149fd5a 100644 --- a/packages/vm/examples/module_size.rs +++ b/packages/vm/examples/module_size.rs @@ -2,18 +2,18 @@ use std::fs::File; use std::io::Read; use std::mem; -use clap::{App, Arg}; +use clap::{Arg, Command}; use cosmwasm_vm::internals::compile; use cosmwasm_vm::internals::make_engine; use wasmer::Module; pub fn main() { - let matches = App::new("Module size estimation") + let matches = Command::new("Module size estimation") .version("0.0.4") .author("Mauro Lacy ") .arg( - Arg::with_name("WASM") + Arg::new("WASM") .help("Wasm file to read and compile") .required(true) .index(1), @@ -21,7 +21,7 @@ pub fn main() { .get_matches(); // File - let path = matches.value_of("WASM").expect("Error parsing file name"); + let path: &String = matches.get_one("WASM").expect("Error parsing file name"); let mut file = File::open(path).unwrap(); mem::drop(matches); From fa5c7ed5c818f6e5ef448263cb1931f0d12bae65 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 26 May 2023 09:54:16 +0200 Subject: [PATCH 0331/2372] Make debug handler FnMut --- packages/vm/src/environment.rs | 30 ++++++++++-------------------- packages/vm/src/imports.rs | 9 +-------- packages/vm/src/instance.rs | 9 +++++---- 3 files changed, 16 insertions(+), 32 deletions(-) diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index 3b5073e840..c66c3ff0e9 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -1,11 +1,10 @@ //! Internal details to be used by instance.rs only use std::borrow::{Borrow, BorrowMut}; -use std::marker::PhantomData; +use std::cell::RefCell; use std::ptr::NonNull; use std::rc::Rc; use std::sync::{Arc, RwLock}; -use derivative::Derivative; use wasmer::{AsStoreMut, Instance as WasmerInstance, Memory, MemoryView, Value}; use wasmer_middlewares::metering::{get_remaining_points, set_remaining_points, MeteringPoints}; @@ -83,28 +82,19 @@ impl GasState { } /// Additional environmental information in a debug call. -/// -/// The currently unused lifetime parameter 'a allows accessing referenced data in the debug implementation -/// without cloning it. -#[derive(Derivative)] -#[derivative(Debug)] +#[derive(Debug)] #[non_exhaustive] -pub struct DebugInfo<'a> { +pub struct DebugInfo { pub gas_remaining: u64, - // This field is just to allow us to add the unused lifetime parameter. It can be removed - // at any time. - #[doc(hidden)] - #[derivative(Debug = "ignore")] - pub(crate) __lifetime: PhantomData<&'a ()>, } // Unfortunately we cannot create an alias for the trait (https://github.com/rust-lang/rust/issues/41517). // So we need to copy it in a few places. // -// /- BEGIN TRAIT END TRAIT \ -// | | -// v v -pub type DebugHandlerFn = dyn for<'a> Fn(/* msg */ &'a str, DebugInfo<'a>); +// /- BEGIN TRAIT END TRAIT \ +// | | +// v v +pub type DebugHandlerFn = dyn for<'a> FnMut(/* msg */ &'a str, DebugInfo); /// A environment that provides access to the ContextData. /// The environment is clonable but clones access the same underlying data. @@ -140,13 +130,13 @@ impl Environment { } } - pub fn set_debug_handler(&self, debug_handler: Option>) { + pub fn set_debug_handler(&self, debug_handler: Option>>) { self.with_context_data_mut(|context_data| { context_data.debug_handler = debug_handler; }) } - pub fn debug_handler(&self) -> Option> { + pub fn debug_handler(&self) -> Option>> { self.with_context_data(|context_data| { // This clone here requires us to wrap the function in Rc instead of Box context_data.debug_handler.clone() @@ -392,7 +382,7 @@ pub struct ContextData { storage_readonly: bool, call_depth: usize, querier: Option, - debug_handler: Option>, + debug_handler: Option>>, /// A non-owning link to the wasmer instance wasmer_instance: Option>, } diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index c59141e156..a868c1e41f 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -1,7 +1,6 @@ //! Import implementations use std::cmp::max; -use std::marker::PhantomData; use cosmwasm_crypto::{ ed25519_batch_verify, ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, CryptoError, @@ -447,13 +446,7 @@ pub fn do_debug(&mut self, debug_handler: H) where - H: for<'a> Fn(/* msg */ &'a str, DebugInfo<'a>) + 'static, + H: for<'a> FnMut(/* msg */ &'a str, DebugInfo) + 'static, { self.fe .as_ref(&self.store) - .set_debug_handler(Some(Rc::new(debug_handler))); + .set_debug_handler(Some(Rc::new(RefCell::new(debug_handler)))); } pub fn unset_debug_handler(&mut self) { From 15b87f1b225dbbc0f924b5cbe28d15ae773da4b5 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 26 May 2023 11:20:45 +0200 Subject: [PATCH 0332/2372] Add tests showcasing FnMut debug handler --- contracts/cyberpunk/Cargo.lock | 179 ++++++++++++++++++++++- contracts/cyberpunk/Cargo.toml | 1 + contracts/cyberpunk/tests/integration.rs | 52 +++++++ 3 files changed, 225 insertions(+), 7 deletions(-) diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 9cf6bdadad..01429ad9c3 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -486,6 +486,7 @@ dependencies = [ "cosmwasm-std", "cosmwasm-vm", "rust-argon2", + "tempfile", "thiserror", ] @@ -704,12 +705,42 @@ dependencies = [ "syn", ] +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "fallible-iterator" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + [[package]] name = "ff" version = "0.12.0" @@ -828,6 +859,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + [[package]] name = "hex" version = "0.4.3" @@ -869,6 +906,26 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.1", + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "itoa" version = "0.4.7" @@ -910,9 +967,15 @@ checksum = "3576a87f2ba00f6f106fdfcd16db1d698d648a26ad8e0573cad8537c3c362d2a" [[package]] name = "libc" -version = "0.2.126" +version = "0.2.144" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" + +[[package]] +name = "linux-raw-sys" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "lock_api" @@ -997,7 +1060,7 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", ] @@ -1036,7 +1099,7 @@ checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.2.9", "smallvec", "windows-sys 0.45.0", ] @@ -1177,6 +1240,15 @@ dependencies = [ "bitflags", ] +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags", +] + [[package]] name = "regalloc2" version = "0.5.1" @@ -1265,6 +1337,20 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" +[[package]] +name = "rustix" +version = "0.37.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f79bef90eb6d984c72722595b5b1348ab39275a5e5123faca6863bf07d75a4e0" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", +] + [[package]] name = "ryu" version = "1.0.5" @@ -1486,6 +1572,19 @@ version = "0.12.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5" +[[package]] +name = "tempfile" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +dependencies = [ + "cfg-if", + "fastrand", + "redox_syscall 0.3.5", + "rustix", + "windows-sys 0.45.0", +] + [[package]] name = "thiserror" version = "1.0.38" @@ -1904,7 +2003,16 @@ version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "windows-targets", + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.0", ] [[package]] @@ -1913,21 +2021,42 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" dependencies = [ - "windows_aarch64_gnullvm", + "windows_aarch64_gnullvm 0.42.2", "windows_aarch64_msvc 0.42.2", "windows_i686_gnu 0.42.2", "windows_i686_msvc 0.42.2", "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm", + "windows_x86_64_gnullvm 0.42.2", "windows_x86_64_msvc 0.42.2", ] +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + [[package]] name = "windows_aarch64_msvc" version = "0.33.0" @@ -1940,6 +2069,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + [[package]] name = "windows_i686_gnu" version = "0.33.0" @@ -1952,6 +2087,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + [[package]] name = "windows_i686_msvc" version = "0.33.0" @@ -1964,6 +2105,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + [[package]] name = "windows_x86_64_gnu" version = "0.33.0" @@ -1976,12 +2123,24 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + [[package]] name = "windows_x86_64_msvc" version = "0.33.0" @@ -1994,6 +2153,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + [[package]] name = "zeroize" version = "1.5.7" diff --git a/contracts/cyberpunk/Cargo.toml b/contracts/cyberpunk/Cargo.toml index f7a5c43575..67efa29d00 100644 --- a/contracts/cyberpunk/Cargo.toml +++ b/contracts/cyberpunk/Cargo.toml @@ -36,3 +36,4 @@ thiserror = "1.0.26" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false } +tempfile = "3.1.0" diff --git a/contracts/cyberpunk/tests/integration.rs b/contracts/cyberpunk/tests/integration.rs index c05e061dea..ecd7306995 100644 --- a/contracts/cyberpunk/tests/integration.rs +++ b/contracts/cyberpunk/tests/integration.rs @@ -21,7 +21,9 @@ use cosmwasm_std::{from_binary, Empty, Env, Response}; use cosmwasm_vm::testing::{ execute, instantiate, mock_env, mock_info, mock_instance, mock_instance_with_gas_limit, query, }; +use std::io::Write; use std::time::SystemTime; +use tempfile::NamedTempFile; use cyberpunk::msg::{ExecuteMsg, QueryMsg}; @@ -83,6 +85,56 @@ fn debug_works() { let _res: Response = execute(&mut deps, mock_env(), mock_info("caller", &[]), msg).unwrap(); } +// Test with +// cargo integration-test debug_timing -- --nocapture +#[test] +fn debug_timing() { + let mut deps = mock_instance_with_gas_limit(WASM, 100_000_000_000_000); + + let _res: Response = + instantiate(&mut deps, mock_env(), mock_info("admin", &[]), Empty {}).unwrap(); + + let mut last_time = None; + deps.set_debug_handler(move |msg, _info| { + if let Some(last_time) = last_time { + let diff = SystemTime::now() + .duration_since(last_time) + .unwrap_or_default() + .as_micros(); + eprintln!("{msg} (time since last debug: {diff}µs)"); + } else { + eprintln!("{msg}"); + } + + last_time = Some(SystemTime::now()); + }); + + let msg = ExecuteMsg::Debug {}; + let _res: Response = execute(&mut deps, mock_env(), mock_info("caller", &[]), msg).unwrap(); +} + +#[test] +fn debug_file() { + let mut deps = mock_instance_with_gas_limit(WASM, 100_000_000_000_000); + + let _res: Response = + instantiate(&mut deps, mock_env(), mock_info("admin", &[]), Empty {}).unwrap(); + + let temp_file = NamedTempFile::new().unwrap(); + let (mut temp_file, temp_path) = temp_file.into_parts(); + + deps.set_debug_handler(move |msg, _info| { + writeln!(temp_file, "{msg}").unwrap(); + }); + + let msg = ExecuteMsg::Debug {}; + let _res: Response = execute(&mut deps, mock_env(), mock_info("caller", &[]), msg).unwrap(); + + // check if file contains the expected output + let file_content = std::fs::read_to_string(temp_path).unwrap(); + assert!(file_content.contains("Round 9 done")); +} + #[test] fn test_env() { let mut deps = mock_instance(WASM, &[]); From 9a94730590cf95040ab29a509c19e310827c9752 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 30 May 2023 11:07:45 +0200 Subject: [PATCH 0333/2372] Bring back lifetime --- packages/vm/src/environment.rs | 23 +++++++++++++++++------ packages/vm/src/imports.rs | 9 ++++++++- packages/vm/src/instance.rs | 10 ++++++---- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index c66c3ff0e9..43dc652384 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -1,10 +1,12 @@ //! Internal details to be used by instance.rs only use std::borrow::{Borrow, BorrowMut}; use std::cell::RefCell; +use std::marker::PhantomData; use std::ptr::NonNull; use std::rc::Rc; use std::sync::{Arc, RwLock}; +use derivative::Derivative; use wasmer::{AsStoreMut, Instance as WasmerInstance, Memory, MemoryView, Value}; use wasmer_middlewares::metering::{get_remaining_points, set_remaining_points, MeteringPoints}; @@ -82,19 +84,28 @@ impl GasState { } /// Additional environmental information in a debug call. -#[derive(Debug)] +/// +/// The currently unused lifetime parameter 'a allows accessing referenced data in the debug implementation +/// without cloning it. +#[derive(Derivative)] +#[derivative(Debug)] #[non_exhaustive] -pub struct DebugInfo { +pub struct DebugInfo<'a> { pub gas_remaining: u64, + // This field is just to allow us to add the unused lifetime parameter. It can be removed + // at any time. + #[doc(hidden)] + #[derivative(Debug = "ignore")] + pub(crate) __lifetime: PhantomData<&'a ()>, } // Unfortunately we cannot create an alias for the trait (https://github.com/rust-lang/rust/issues/41517). // So we need to copy it in a few places. // -// /- BEGIN TRAIT END TRAIT \ -// | | -// v v -pub type DebugHandlerFn = dyn for<'a> FnMut(/* msg */ &'a str, DebugInfo); +// /- BEGIN TRAIT END TRAIT \ +// | | +// v v +pub type DebugHandlerFn = dyn for<'a, 'b> FnMut(/* msg */ &'a str, DebugInfo<'b>); /// A environment that provides access to the ContextData. /// The environment is clonable but clones access the same underlying data. diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index a868c1e41f..0fab00a1b5 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -1,6 +1,7 @@ //! Import implementations use std::cmp::max; +use std::marker::PhantomData; use cosmwasm_crypto::{ ed25519_batch_verify, ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, CryptoError, @@ -446,7 +447,13 @@ pub fn do_debug| { + eprintln!("{msg}"); + }, + )))) } e }); @@ -305,7 +307,7 @@ where pub fn set_debug_handler(&mut self, debug_handler: H) where - H: for<'a> FnMut(/* msg */ &'a str, DebugInfo) + 'static, + H: for<'a, 'b> FnMut(/* msg */ &'a str, DebugInfo<'b>) + 'static, { self.fe .as_ref(&self.store) From 4bac1e3cb3769570c91f2cd44bf1232111424ab4 Mon Sep 17 00:00:00 2001 From: Nikhil Suri Date: Fri, 24 Mar 2023 21:24:18 +0000 Subject: [PATCH 0334/2372] std: Add BankQuery::AllDenomMetadata gated by cosmwasm_1_3 feature flag --- .circleci/config.yml | 10 +++++----- CHANGELOG.md | 6 ++++++ MIGRATING.md | 4 ++-- docs/CAPABILITIES-BUILT-IN.md | 2 ++ docs/USING_COSMWASM_STD.md | 1 + packages/check/src/main.rs | 3 ++- packages/std/Cargo.toml | 3 +++ packages/std/src/exports.rs | 4 ++++ packages/std/src/lib.rs | 2 ++ packages/std/src/metadata.rs | 23 +++++++++++++++++++++++ packages/std/src/query/bank.rs | 19 +++++++++++++++++++ packages/std/src/query/mod.rs | 2 ++ packages/std/src/testing/mock.rs | 18 +++++++++++++++++- packages/std/src/traits.rs | 11 +++++++++++ packages/vm/src/testing/instance.rs | 3 ++- 15 files changed, 101 insertions(+), 10 deletions(-) create mode 100644 packages/std/src/metadata.rs diff --git a/.circleci/config.yml b/.circleci/config.yml index 0335b7ae71..60bd628780 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -356,15 +356,15 @@ jobs: - run: name: Build library for native target (all features) working_directory: ~/project/packages/std - command: cargo build --locked --features abort,iterator,staking,stargate,cosmwasm_1_2 + command: cargo build --locked --features abort,iterator,staking,stargate,cosmwasm_1_3 - run: name: Build library for wasm target (all features) working_directory: ~/project/packages/std - command: cargo wasm --locked --features abort,iterator,staking,stargate,cosmwasm_1_2 + command: cargo wasm --locked --features abort,iterator,staking,stargate,cosmwasm_1_3 - run: name: Run unit tests (all features) working_directory: ~/project/packages/std - command: cargo test --locked --features abort,iterator,staking,stargate,cosmwasm_1_2 + command: cargo test --locked --features abort,iterator,staking,stargate,cosmwasm_1_3 - save_cache: paths: - /usr/local/cargo/registry @@ -907,7 +907,7 @@ jobs: - run: name: Clippy linting on std (all feature flags) working_directory: ~/project/packages/std - command: cargo clippy --all-targets --features abort,iterator,staking,stargate,cosmwasm_1_2 -- -D warnings + command: cargo clippy --all-targets --features abort,iterator,staking,stargate,cosmwasm_1_3 -- -D warnings - run: name: Clippy linting on storage (no feature flags) working_directory: ~/project/packages/storage @@ -984,7 +984,7 @@ jobs: CRYPTO=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/crypto --packages cosmwasm-crypto" DERIVE=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/derive --packages cosmwasm-derive" SCHEMA=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/schema --packages cosmwasm-schema" - STD=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/std --packages cosmwasm-std --features abort,iterator,staking,stargate,cosmwasm_1_2" + STD=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/std --packages cosmwasm-std --features abort,iterator,staking,stargate,cosmwasm_1_3" STORAGE="cargo tarpaulin --skip-clean --out Xml --output-dir reports/storage --packages cosmwasm-storage" docker run --security-opt seccomp=unconfined -v "${PWD}:/volume" xd009642/tarpaulin:0.21.0 \ sh -c "$CRYPTO && $DERIVE && $SCHEMA && $STD && $STORAGE" diff --git a/CHANGELOG.md b/CHANGELOG.md index 7380f7fb7a..b267b500aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,12 +8,18 @@ and this project adheres to ### Added +- cosmwasm-std: Implement `BankQuery::AllDenomMetadata` to allow querying all + the denom metadata. In order to use this query in a contract, the + `cosmwasm_1_3` feature needs to be enabled for the `cosmwasm_std` dependency. + This makes the contract incompatible with chains running anything lower than + CosmWasm `1.3.0`. ([#1647]) - cosmwasm-vm: Add `Cache::save_wasm_unchecked` to save Wasm blobs that have been checked before. This is useful for state-sync where we know the Wasm code was checked when it was first uploaded. ([#1635]) - cosmwasm-std: Add `FromStr` impl for `Coin`. ([#1684]) [#1635]: https://github.com/CosmWasm/cosmwasm/pull/1635 +[#1647]: https://github.com/CosmWasm/cosmwasm/pull/1647 [#1684]: https://github.com/CosmWasm/cosmwasm/pull/1684 ### Changed diff --git a/MIGRATING.md b/MIGRATING.md index 0000f999fc..c65a29de5c 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -28,8 +28,8 @@ major releases of `cosmwasm`. Note that you can also view the +cosmwasm-std = { version = "1.1.0", features = ["stargate", "cosmwasm_1_2"] } ``` - Please note that `cosmwasm_1_2` implies `cosmwasm_1_1`, so there is no need to - set both. + Please note that `cosmwasm_1_2` implies `cosmwasm_1_1`, and `cosmwasm_1_3` + implies `cosmwasm_1_2`, and so on, so there is no need to set multiple. - If you use mixed type multiplication between `Uint{64,128,256}` and `Decimal{,256}`, check out diff --git a/docs/CAPABILITIES-BUILT-IN.md b/docs/CAPABILITIES-BUILT-IN.md index 8fdd679fe1..190c9f825d 100644 --- a/docs/CAPABILITIES-BUILT-IN.md +++ b/docs/CAPABILITIES-BUILT-IN.md @@ -15,3 +15,5 @@ might define others. CosmWasm `1.1.0` or higher support this. - `cosmwasm_1_2` enables the `GovMsg::VoteWeighted` and `WasmMsg::Instantiate2` messages. Only chains running CosmWasm `1.2.0` or higher support this. +- `cosmwasm_1_3` enables the `BankQuery::AllDenomMetadata` query. Only chains + running CosmWasm `1.3.0` or higher support this. diff --git a/docs/USING_COSMWASM_STD.md b/docs/USING_COSMWASM_STD.md index 7da8fa6e92..36730f9945 100644 --- a/docs/USING_COSMWASM_STD.md +++ b/docs/USING_COSMWASM_STD.md @@ -44,6 +44,7 @@ The libarary comes with the following features: | backtraces | | Add backtraces to errors (for unit testing) | | cosmwasm_1_1 | | Features that require CosmWasm 1.1+ on the chain | | cosmwasm_1_2 | | Features that require CosmWasm 1.2+ on the chain | +| cosmwasm_1_3 | | Features that require CosmWasm 1.3+ on the chain | ## The cosmwasm-std dependency for contract developers diff --git a/packages/check/src/main.rs b/packages/check/src/main.rs index 201aaa8b92..561992bb28 100644 --- a/packages/check/src/main.rs +++ b/packages/check/src/main.rs @@ -10,7 +10,8 @@ use colored::Colorize; use cosmwasm_vm::capabilities_from_csv; use cosmwasm_vm::internals::{check_wasm, compile}; -const DEFAULT_AVAILABLE_CAPABILITIES: &str = "iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2"; +const DEFAULT_AVAILABLE_CAPABILITIES: &str = + "iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2,cosmwasm_1_3"; pub fn main() { let matches = Command::new("Contract checking") diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 2629690783..51bdcda343 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -39,6 +39,9 @@ cosmwasm_1_1 = [] # This feature makes `GovMsg::VoteWeighted` available for the contract to call, but requires # the host blockchain to run CosmWasm `1.2.0` or higher. cosmwasm_1_2 = ["cosmwasm_1_1"] +# This feature makes `BankQuery::DenomMetadata` available for the contract to call, but requires +# the host blockchain to run CosmWasm `1.3.0` or higher. +cosmwasm_1_3 = ["cosmwasm_1_2"] [dependencies] base64 = "0.13.0" diff --git a/packages/std/src/exports.rs b/packages/std/src/exports.rs index 5b4b30925c..27c46768dc 100644 --- a/packages/std/src/exports.rs +++ b/packages/std/src/exports.rs @@ -49,6 +49,10 @@ extern "C" fn requires_cosmwasm_1_1() -> () {} #[no_mangle] extern "C" fn requires_cosmwasm_1_2() -> () {} +#[cfg(feature = "cosmwasm_1_3")] +#[no_mangle] +extern "C" fn requires_cosmwasm_1_3() -> () {} + /// interface_version_* exports mark which Wasm VM interface level this contract is compiled for. /// They can be checked by cosmwasm_vm. /// Update this whenever the Wasm VM interface breaks. diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index dca5b3ba83..dc75ad8323 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -17,6 +17,7 @@ mod import_helpers; #[cfg(feature = "iterator")] mod iterator; mod math; +mod metadata; mod never; mod panic; mod query; @@ -56,6 +57,7 @@ pub use crate::math::{ Decimal, Decimal256, Decimal256RangeExceeded, DecimalRangeExceeded, Fraction, Isqrt, Uint128, Uint256, Uint512, Uint64, }; +pub use crate::metadata::{DenomMetadata, DenomUnit}; pub use crate::never::Never; #[cfg(feature = "cosmwasm_1_2")] pub use crate::query::CodeInfoResponse; diff --git a/packages/std/src/metadata.rs b/packages/std/src/metadata.rs new file mode 100644 index 0000000000..d3400a49a5 --- /dev/null +++ b/packages/std/src/metadata.rs @@ -0,0 +1,23 @@ +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +use crate::math::Uint128; + +#[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] +pub struct DenomMetadata { + pub description: String, + pub denom_units: Vec, + pub base: String, + pub display: String, + pub name: String, + pub symbol: String, + pub uri: String, + pub uri_hash: String, +} + +#[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] +pub struct DenomUnit { + pub denom: String, + pub exponent: Uint128, + pub aliases: Vec, +} diff --git a/packages/std/src/query/bank.rs b/packages/std/src/query/bank.rs index b3a43e11d5..222fc86e17 100644 --- a/packages/std/src/query/bank.rs +++ b/packages/std/src/query/bank.rs @@ -3,6 +3,9 @@ use serde::{Deserialize, Serialize}; use crate::Coin; +#[cfg(feature = "cosmwasm_1_3")] +use crate::DenomMetadata; + use super::query_response::QueryResponseType; #[non_exhaustive] @@ -21,6 +24,10 @@ pub enum BankQuery { /// Note that this may be much more expensive than Balance and should be avoided if possible. /// Return value is AllBalanceResponse. AllBalances { address: String }, + /// This calls into the native bank module for querying metadata for all bank tokens. + /// Return value is AllDenomMetadataResponse + #[cfg(feature = "cosmwasm_1_3")] + AllDenomMetadata {}, } #[cfg(feature = "cosmwasm_1_1")] @@ -54,3 +61,15 @@ pub struct AllBalanceResponse { } impl QueryResponseType for AllBalanceResponse {} + +#[cfg(feature = "cosmwasm_1_3")] +#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq, JsonSchema)] +#[serde(rename_all = "snake_case")] +#[non_exhaustive] +pub struct AllDenomMetadataResponse { + /// Always returns metadata for all token denoms on the base chain. + pub metadata: Vec, +} + +#[cfg(feature = "cosmwasm_1_3")] +impl QueryResponseType for AllDenomMetadataResponse {} diff --git a/packages/std/src/query/mod.rs b/packages/std/src/query/mod.rs index 50061df091..e79417bc99 100644 --- a/packages/std/src/query/mod.rs +++ b/packages/std/src/query/mod.rs @@ -11,6 +11,8 @@ mod query_response; mod staking; mod wasm; +#[cfg(feature = "cosmwasm_1_3")] +pub use bank::AllDenomMetadataResponse; #[cfg(feature = "cosmwasm_1_1")] pub use bank::SupplyResponse; pub use bank::{AllBalanceResponse, BalanceResponse, BankQuery}; diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index d219236578..c8bcf67f00 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -16,6 +16,8 @@ use crate::ibc::{ IbcTimeoutBlock, }; use crate::math::Uint128; +#[cfg(feature = "cosmwasm_1_3")] +use crate::query::AllDenomMetadataResponse; #[cfg(feature = "cosmwasm_1_1")] use crate::query::SupplyResponse; use crate::query::{ @@ -32,7 +34,7 @@ use crate::storage::MemoryStorage; use crate::timestamp::Timestamp; use crate::traits::{Api, Querier, QuerierResult}; use crate::types::{BlockInfo, ContractInfo, Env, MessageInfo, TransactionInfo}; -use crate::Attribute; +use crate::{Attribute, DenomMetadata}; #[cfg(feature = "stargate")] use crate::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; @@ -599,6 +601,8 @@ pub struct BankQuerier { supplies: HashMap, /// HashMap balances: HashMap>, + /// Vec + denom_metadata: Vec, } impl BankQuerier { @@ -611,6 +615,7 @@ impl BankQuerier { BankQuerier { supplies: Self::calculate_supplies(&balances), balances, + denom_metadata: Vec::new(), } } @@ -625,6 +630,10 @@ impl BankQuerier { result } + pub fn set_denom_metadata(&mut self, denom_metadata: &[DenomMetadata]) { + self.denom_metadata = denom_metadata.to_vec(); + } + fn calculate_supplies(balances: &HashMap>) -> HashMap { let mut supplies = HashMap::new(); @@ -678,6 +687,13 @@ impl BankQuerier { }; to_binary(&bank_res).into() } + #[cfg(feature = "cosmwasm_1_3")] + BankQuery::AllDenomMetadata {} => { + let metadata_res = AllDenomMetadataResponse { + metadata: self.denom_metadata.clone(), + }; + to_binary(&metadata_res).into() + } }; // system result is always ok in the mock implementation SystemResult::Ok(contract_result) diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index e3ba067b6e..79db30f6f5 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -8,6 +8,8 @@ use crate::coin::Coin; use crate::errors::{RecoverPubkeyError, StdError, StdResult, VerificationError}; #[cfg(feature = "iterator")] use crate::iterator::{Order, Record}; +#[cfg(feature = "cosmwasm_1_3")] +use crate::query::AllDenomMetadataResponse; #[cfg(feature = "cosmwasm_1_2")] use crate::query::CodeInfoResponse; #[cfg(feature = "cosmwasm_1_1")] @@ -23,6 +25,8 @@ use crate::query::{ use crate::results::{ContractResult, Empty, SystemResult}; use crate::serde::{from_binary, to_binary, to_vec}; use crate::ContractInfoResponse; +#[cfg(feature = "cosmwasm_1_3")] +use crate::DenomMetadata; /// Storage provides read and write access to a persistent storage. /// If you only want to provide read access, provide `&Storage` @@ -239,6 +243,13 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { Ok(res.amount) } + #[cfg(feature = "cosmwasm_1_3")] + pub fn query_all_denom_metadata(&self) -> StdResult> { + let request = BankQuery::AllDenomMetadata {}.into(); + let res: AllDenomMetadataResponse = self.query(&request)?; + Ok(res.metadata) + } + // this queries another wasm contract. You should know a priori the proper types for T and U // (response and request) based on the contract API pub fn query_wasm_smart( diff --git a/packages/vm/src/testing/instance.rs b/packages/vm/src/testing/instance.rs index 14b85cf7c9..6a4f11a37f 100644 --- a/packages/vm/src/testing/instance.rs +++ b/packages/vm/src/testing/instance.rs @@ -98,7 +98,8 @@ pub struct MockInstanceOptions<'a> { impl MockInstanceOptions<'_> { fn default_capabilities() -> HashSet { #[allow(unused_mut)] - let mut out = capabilities_from_csv("iterator,staking,cosmwasm_1_1,cosmwasm_1_2"); + let mut out = + capabilities_from_csv("iterator,staking,cosmwasm_1_1,cosmwasm_1_2,cosmwasm_1_3"); #[cfg(feature = "stargate")] out.insert("stargate".to_string()); out From 71c5a074cc5f5857a2e4c84b2cf7dd752517f757 Mon Sep 17 00:00:00 2001 From: Nikhil Suri Date: Wed, 29 Mar 2023 22:59:54 +0000 Subject: [PATCH 0335/2372] std: Update BankQuery::AllDenomMetadata query with pagination and add BankQuery::DenomMetadata also gated by cosmwasm_1_3 feature flag --- MIGRATING.md | 31 +++++++++++++++++++++++++++++-- packages/std/src/lib.rs | 2 ++ packages/std/src/metadata.rs | 6 +++--- packages/std/src/pagination.rs | 14 ++++++++++++++ packages/std/src/query/bank.rs | 23 +++++++++++++++++++++-- packages/std/src/query/mod.rs | 4 ++-- packages/std/src/testing/mock.rs | 19 ++++++++++++++++--- packages/std/src/traits.rs | 23 +++++++++++++++++++---- 8 files changed, 106 insertions(+), 16 deletions(-) create mode 100644 packages/std/src/pagination.rs diff --git a/MIGRATING.md b/MIGRATING.md index c65a29de5c..33b1af3036 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -4,6 +4,33 @@ This guide explains what is needed to upgrade contracts when migrating over major releases of `cosmwasm`. Note that you can also view the [complete CHANGELOG](./CHANGELOG.md) to understand the differences. +## 1.2.x -> 1.3.0 + +- Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): + + ``` + [dependencies] + cosmwasm-std = "1.3.0" + cosmwasm-storage = "1.3.0" + # ... + + [dev-dependencies] + cosmwasm-schema = "1.3.0" + cosmwasm-vm = "1.3.0" + # ... + ``` + +- If you want to use a fewture that os only available on CosmWasm 1.3+ chains, + use this feature: + + ```diff + -cosmwasm-std = { version = "1.1.0", features = ["stargate"] } + +cosmwasm-std = { version = "1.1.0", features = ["stargate", "cosmwasm_1_3"] } + ``` + + Please note that `cosmwasm_1_2` implies `cosmwasm_1_1`, and `cosmwasm_1_3` + implies `cosmwasm_1_2`, and so on, so there is no need to set multiple. + ## 1.1.x -> 1.2.0 - Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): @@ -28,8 +55,8 @@ major releases of `cosmwasm`. Note that you can also view the +cosmwasm-std = { version = "1.1.0", features = ["stargate", "cosmwasm_1_2"] } ``` - Please note that `cosmwasm_1_2` implies `cosmwasm_1_1`, and `cosmwasm_1_3` - implies `cosmwasm_1_2`, and so on, so there is no need to set multiple. + Please note that `cosmwasm_1_2` implies `cosmwasm_1_1`, so there is no need to + set both. - If you use mixed type multiplication between `Uint{64,128,256}` and `Decimal{,256}`, check out diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index dc75ad8323..d2e1568836 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -19,6 +19,7 @@ mod iterator; mod math; mod metadata; mod never; +mod pagination; mod panic; mod query; mod results; @@ -59,6 +60,7 @@ pub use crate::math::{ }; pub use crate::metadata::{DenomMetadata, DenomUnit}; pub use crate::never::Never; +pub use crate::pagination::PageRequest; #[cfg(feature = "cosmwasm_1_2")] pub use crate::query::CodeInfoResponse; #[cfg(feature = "cosmwasm_1_1")] diff --git a/packages/std/src/metadata.rs b/packages/std/src/metadata.rs index d3400a49a5..c0827ce722 100644 --- a/packages/std/src/metadata.rs +++ b/packages/std/src/metadata.rs @@ -1,8 +1,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use crate::math::Uint128; - +/// Replicates the cosmos-sdk bank module Metadata type #[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] pub struct DenomMetadata { pub description: String, @@ -15,9 +14,10 @@ pub struct DenomMetadata { pub uri_hash: String, } +/// Replicates the cosmos-sdk bank module DenomUnit type #[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] pub struct DenomUnit { pub denom: String, - pub exponent: Uint128, + pub exponent: u32, pub aliases: Vec, } diff --git a/packages/std/src/pagination.rs b/packages/std/src/pagination.rs new file mode 100644 index 0000000000..3c98de73b6 --- /dev/null +++ b/packages/std/src/pagination.rs @@ -0,0 +1,14 @@ +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +use crate::{Binary, Uint64}; + +/// Replicates the PageRequest type for pagination from the cosmos-sdk +#[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] +pub struct PageRequest { + pub key: Binary, + pub offset: Uint64, + pub limit: Uint64, + pub count_total: bool, + pub reverse: bool, +} diff --git a/packages/std/src/query/bank.rs b/packages/std/src/query/bank.rs index 222fc86e17..61bfcbf2ae 100644 --- a/packages/std/src/query/bank.rs +++ b/packages/std/src/query/bank.rs @@ -6,6 +6,9 @@ use crate::Coin; #[cfg(feature = "cosmwasm_1_3")] use crate::DenomMetadata; +#[cfg(feature = "cosmwasm_1_3")] +use crate::PageRequest; + use super::query_response::QueryResponseType; #[non_exhaustive] @@ -24,10 +27,14 @@ pub enum BankQuery { /// Note that this may be much more expensive than Balance and should be avoided if possible. /// Return value is AllBalanceResponse. AllBalances { address: String }, - /// This calls into the native bank module for querying metadata for all bank tokens. + /// This calls into the native bank module for querying metadata for a specific bank token. + /// Return value is DenomMetadataResponse + #[cfg(feature = "cosmwasm_1_3")] + DenomMetadata { denom: String }, + /// This calls into the native bank module for querying metadata for all bank tokens that have a metadata entry. /// Return value is AllDenomMetadataResponse #[cfg(feature = "cosmwasm_1_3")] - AllDenomMetadata {}, + AllDenomMetadata { pagination: Option }, } #[cfg(feature = "cosmwasm_1_1")] @@ -62,6 +69,18 @@ pub struct AllBalanceResponse { impl QueryResponseType for AllBalanceResponse {} +#[cfg(feature = "cosmwasm_1_3")] +#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq, JsonSchema)] +#[serde(rename_all = "snake_case")] +#[non_exhaustive] +pub struct DenomMetadataResponse { + /// Always returns metadata for all token denoms on the base chain. + pub metadata: DenomMetadata, +} + +#[cfg(feature = "cosmwasm_1_3")] +impl QueryResponseType for DenomMetadataResponse {} + #[cfg(feature = "cosmwasm_1_3")] #[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] diff --git a/packages/std/src/query/mod.rs b/packages/std/src/query/mod.rs index e79417bc99..c88e209b8f 100644 --- a/packages/std/src/query/mod.rs +++ b/packages/std/src/query/mod.rs @@ -11,11 +11,11 @@ mod query_response; mod staking; mod wasm; -#[cfg(feature = "cosmwasm_1_3")] -pub use bank::AllDenomMetadataResponse; #[cfg(feature = "cosmwasm_1_1")] pub use bank::SupplyResponse; pub use bank::{AllBalanceResponse, BalanceResponse, BankQuery}; +#[cfg(feature = "cosmwasm_1_3")] +pub use bank::{AllDenomMetadataResponse, DenomMetadataResponse}; #[cfg(feature = "stargate")] pub use ibc::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; #[cfg(feature = "staking")] diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index c8bcf67f00..1156268643 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -16,8 +16,6 @@ use crate::ibc::{ IbcTimeoutBlock, }; use crate::math::Uint128; -#[cfg(feature = "cosmwasm_1_3")] -use crate::query::AllDenomMetadataResponse; #[cfg(feature = "cosmwasm_1_1")] use crate::query::SupplyResponse; use crate::query::{ @@ -28,6 +26,8 @@ use crate::query::{ AllDelegationsResponse, AllValidatorsResponse, BondedDenomResponse, DelegationResponse, FullDelegation, StakingQuery, Validator, ValidatorResponse, }; +#[cfg(feature = "cosmwasm_1_3")] +use crate::query::{AllDenomMetadataResponse, DenomMetadataResponse}; use crate::results::{ContractResult, Empty, SystemResult}; use crate::serde::{from_slice, to_binary}; use crate::storage::MemoryStorage; @@ -688,7 +688,20 @@ impl BankQuerier { to_binary(&bank_res).into() } #[cfg(feature = "cosmwasm_1_3")] - BankQuery::AllDenomMetadata {} => { + BankQuery::DenomMetadata { denom } => { + let denom_metadata = self.denom_metadata.iter().find(|m| &m.base == denom); + match denom_metadata { + Some(m) => { + let metadata_res = DenomMetadataResponse { + metadata: m.clone(), + }; + to_binary(&metadata_res).into() + } + None => return SystemResult::Err(SystemError::Unknown {}), + } + } + #[cfg(feature = "cosmwasm_1_3")] + BankQuery::AllDenomMetadata { pagination: _ } => { let metadata_res = AllDenomMetadataResponse { metadata: self.denom_metadata.clone(), }; diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 79db30f6f5..2c153bf8d6 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -8,8 +8,6 @@ use crate::coin::Coin; use crate::errors::{RecoverPubkeyError, StdError, StdResult, VerificationError}; #[cfg(feature = "iterator")] use crate::iterator::{Order, Record}; -#[cfg(feature = "cosmwasm_1_3")] -use crate::query::AllDenomMetadataResponse; #[cfg(feature = "cosmwasm_1_2")] use crate::query::CodeInfoResponse; #[cfg(feature = "cosmwasm_1_1")] @@ -22,11 +20,15 @@ use crate::query::{ AllDelegationsResponse, AllValidatorsResponse, BondedDenomResponse, Delegation, DelegationResponse, FullDelegation, StakingQuery, Validator, ValidatorResponse, }; +#[cfg(feature = "cosmwasm_1_3")] +use crate::query::{AllDenomMetadataResponse, DenomMetadataResponse}; use crate::results::{ContractResult, Empty, SystemResult}; use crate::serde::{from_binary, to_binary, to_vec}; use crate::ContractInfoResponse; #[cfg(feature = "cosmwasm_1_3")] use crate::DenomMetadata; +#[cfg(feature = "cosmwasm_1_3")] +use crate::PageRequest; /// Storage provides read and write access to a persistent storage. /// If you only want to provide read access, provide `&Storage` @@ -244,8 +246,21 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { } #[cfg(feature = "cosmwasm_1_3")] - pub fn query_all_denom_metadata(&self) -> StdResult> { - let request = BankQuery::AllDenomMetadata {}.into(); + pub fn query_denom_metadata(&self, denom: impl Into) -> StdResult { + let request = BankQuery::DenomMetadata { + denom: denom.into(), + } + .into(); + let res: DenomMetadataResponse = self.query(&request)?; + Ok(res.metadata) + } + + #[cfg(feature = "cosmwasm_1_3")] + pub fn query_all_denom_metadata( + &self, + pagination: Option, + ) -> StdResult> { + let request = BankQuery::AllDenomMetadata { pagination }.into(); let res: AllDenomMetadataResponse = self.query(&request)?; Ok(res.metadata) } From 83baec3dcbd2701bfdc6b5a89dde69b3df9f0e4b Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 31 May 2023 12:20:03 +0200 Subject: [PATCH 0336/2372] DenomMetadata testing --- packages/std/src/iterator.rs | 2 +- packages/std/src/pagination.rs | 6 ++---- packages/std/src/query/bank.rs | 6 ++---- packages/std/src/testing/mock.rs | 1 + packages/std/src/traits.rs | 16 ++++++++-------- 5 files changed, 14 insertions(+), 17 deletions(-) diff --git a/packages/std/src/iterator.rs b/packages/std/src/iterator.rs index e747581606..00190aa5ca 100644 --- a/packages/std/src/iterator.rs +++ b/packages/std/src/iterator.rs @@ -6,7 +6,7 @@ use crate::errors::StdError; /// allows contracts to reuse the type when deserializing database records. pub type Record> = (Vec, V); -#[derive(Copy, Clone)] +#[derive(Copy, Clone, PartialEq, Eq)] // We assign these to integers to provide a stable API for passing over FFI (to wasm and Go) pub enum Order { Ascending = 1, diff --git a/packages/std/src/pagination.rs b/packages/std/src/pagination.rs index 3c98de73b6..e15d63eeaa 100644 --- a/packages/std/src/pagination.rs +++ b/packages/std/src/pagination.rs @@ -3,12 +3,10 @@ use serde::{Deserialize, Serialize}; use crate::{Binary, Uint64}; -/// Replicates the PageRequest type for pagination from the cosmos-sdk +/// Simplified version of the PageRequest type for pagination from the cosmos-sdk #[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] pub struct PageRequest { - pub key: Binary, - pub offset: Uint64, + pub key: Option, pub limit: Uint64, - pub count_total: bool, pub reverse: bool, } diff --git a/packages/std/src/query/bank.rs b/packages/std/src/query/bank.rs index 61bfcbf2ae..150e0e4b44 100644 --- a/packages/std/src/query/bank.rs +++ b/packages/std/src/query/bank.rs @@ -4,10 +4,7 @@ use serde::{Deserialize, Serialize}; use crate::Coin; #[cfg(feature = "cosmwasm_1_3")] -use crate::DenomMetadata; - -#[cfg(feature = "cosmwasm_1_3")] -use crate::PageRequest; +use crate::{Binary, DenomMetadata, PageRequest}; use super::query_response::QueryResponseType; @@ -88,6 +85,7 @@ impl QueryResponseType for DenomMetadataResponse {} pub struct AllDenomMetadataResponse { /// Always returns metadata for all token denoms on the base chain. pub metadata: Vec, + pub next_key: Option, } #[cfg(feature = "cosmwasm_1_3")] diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 1156268643..58f86c7cc9 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -703,6 +703,7 @@ impl BankQuerier { #[cfg(feature = "cosmwasm_1_3")] BankQuery::AllDenomMetadata { pagination: _ } => { let metadata_res = AllDenomMetadataResponse { + next_key: None, metadata: self.denom_metadata.clone(), }; to_binary(&metadata_res).into() diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 2c153bf8d6..7181036cb8 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -26,9 +26,7 @@ use crate::results::{ContractResult, Empty, SystemResult}; use crate::serde::{from_binary, to_binary, to_vec}; use crate::ContractInfoResponse; #[cfg(feature = "cosmwasm_1_3")] -use crate::DenomMetadata; -#[cfg(feature = "cosmwasm_1_3")] -use crate::PageRequest; +use crate::{DenomMetadata, PageRequest}; /// Storage provides read and write access to a persistent storage. /// If you only want to provide read access, provide `&Storage` @@ -258,11 +256,13 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { #[cfg(feature = "cosmwasm_1_3")] pub fn query_all_denom_metadata( &self, - pagination: Option, - ) -> StdResult> { - let request = BankQuery::AllDenomMetadata { pagination }.into(); - let res: AllDenomMetadataResponse = self.query(&request)?; - Ok(res.metadata) + pagination: PageRequest, + ) -> StdResult { + let request = BankQuery::AllDenomMetadata { + pagination: Some(pagination), + } + .into(); + self.query(&request) } // this queries another wasm contract. You should know a priori the proper types for T and U From 74e4bd690c4bb845ce0334e62edbb2831af431c8 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 31 May 2023 15:48:06 +0200 Subject: [PATCH 0337/2372] Add paginated mock for AllDenomMetadata query --- packages/std/src/testing/mock.rs | 115 +++++++++++++++++++++++++++++-- 1 file changed, 109 insertions(+), 6 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 58f86c7cc9..14ab622999 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -26,14 +26,17 @@ use crate::query::{ AllDelegationsResponse, AllValidatorsResponse, BondedDenomResponse, DelegationResponse, FullDelegation, StakingQuery, Validator, ValidatorResponse, }; -#[cfg(feature = "cosmwasm_1_3")] -use crate::query::{AllDenomMetadataResponse, DenomMetadataResponse}; use crate::results::{ContractResult, Empty, SystemResult}; use crate::serde::{from_slice, to_binary}; use crate::storage::MemoryStorage; use crate::timestamp::Timestamp; use crate::traits::{Api, Querier, QuerierResult}; use crate::types::{BlockInfo, ContractInfo, Env, MessageInfo, TransactionInfo}; +#[cfg(feature = "cosmwasm_1_3")] +use crate::{ + query::{AllDenomMetadataResponse, DenomMetadataResponse}, + PageRequest, Uint64, +}; use crate::{Attribute, DenomMetadata}; #[cfg(feature = "stargate")] use crate::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; @@ -701,11 +704,38 @@ impl BankQuerier { } } #[cfg(feature = "cosmwasm_1_3")] - BankQuery::AllDenomMetadata { pagination: _ } => { - let metadata_res = AllDenomMetadataResponse { - next_key: None, - metadata: self.denom_metadata.clone(), + BankQuery::AllDenomMetadata { pagination } => { + let default_pagination = PageRequest { + key: None, + limit: Uint64::new(100), + reverse: false, + }; + let pagination = pagination.as_ref().unwrap_or(&default_pagination); + // using dynamic dispatch here to reduce code duplication and since this is only testing code + let iter: Box> = if pagination.reverse { + Box::new(self.denom_metadata.iter().rev().cloned()) + } else { + Box::new(self.denom_metadata.iter().cloned()) }; + let mut metadata: Vec<_> = iter + // skip until we find the key + .skip_while(|m| match &pagination.key { + Some(key) => m.symbol.as_bytes() < key, + None => false, + }) + // take the requested amount + 1 to get the next key + .take((pagination.limit.u64().saturating_add(1)) as usize) + .collect(); + + // if we took more than requested, remove the last element (the next key), + // otherwise this is the last batch + let next_key = if metadata.len() > pagination.limit.u64() as usize { + metadata.pop().map(|m| Binary::from(m.name.as_bytes())) + } else { + None + }; + + let metadata_res = AllDenomMetadataResponse { metadata, next_key }; to_binary(&metadata_res).into() } }; @@ -865,6 +895,8 @@ pub fn mock_wasmd_attr(key: impl Into, value: impl Into) -> Attr #[cfg(test)] mod tests { use super::*; + #[cfg(feature = "cosmwasm_1_3")] + use crate::DenomUnit; use crate::{coin, coins, from_binary, to_binary, ContractInfoResponse, Response}; #[cfg(feature = "staking")] use crate::{Decimal, Delegation}; @@ -1292,6 +1324,77 @@ mod tests { assert_eq!(res.amount, coin(0, "ELF")); } + #[cfg(feature = "cosmwasm_1_3")] + #[test] + fn bank_querier_metadata_works() { + let mut bank = BankQuerier::new(&[]); + bank.set_denom_metadata( + &(0..100) + .map(|i| DenomMetadata { + symbol: format!("FOO{i}"), + name: "Foo".to_string(), + description: "Foo coin".to_string(), + denom_units: vec![DenomUnit { + denom: "ufoo".to_string(), + exponent: 8, + aliases: vec!["microfoo".to_string(), "foobar".to_string()], + }], + display: "FOO".to_string(), + base: "ufoo".to_string(), + uri: "https://foo.bar".to_string(), + uri_hash: "foo".to_string(), + }) + .collect::>(), + ); + + // querying first 10 should work + let res = bank + .query(&BankQuery::AllDenomMetadata { + pagination: Some(PageRequest { + key: None, + limit: Uint64::new(10), + reverse: false, + }), + }) + .unwrap() + .unwrap(); + let res: AllDenomMetadataResponse = from_binary(&res).unwrap(); + assert_eq!(res.metadata.len(), 10); + assert!(res.next_key.is_some()); + + // querying all 100 should work + let res = bank + .query(&BankQuery::AllDenomMetadata { + pagination: Some(PageRequest { + key: None, + limit: Uint64::new(100), + reverse: true, + }), + }) + .unwrap() + .unwrap(); + let res: AllDenomMetadataResponse = from_binary(&res).unwrap(); + assert_eq!(res.metadata.len(), 100); + assert!(res.next_key.is_none(), "no more data should be available"); + assert_eq!(res.metadata[0].symbol, "FOO99", "should have been reversed"); + + let more_res = bank + .query(&BankQuery::AllDenomMetadata { + pagination: Some(PageRequest { + key: res.next_key, + limit: Uint64::MAX, + reverse: true, + }), + }) + .unwrap() + .unwrap(); + let more_res: AllDenomMetadataResponse = from_binary(&more_res).unwrap(); + assert_eq!( + more_res.metadata, res.metadata, + "should be same as previous query" + ); + } + #[cfg(feature = "stargate")] #[test] fn ibc_querier_channel_existing() { From 751173db1f8e5532efd9c77207de82c78921a819 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 31 May 2023 15:49:29 +0200 Subject: [PATCH 0338/2372] Set cosmwasm_1_3 feature for docs.rs --- packages/std/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 51bdcda343..cb40abdb5d 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -9,7 +9,7 @@ license = "Apache-2.0" readme = "README.md" [package.metadata.docs.rs] -features = ["abort", "stargate", "staking", "ibc3", "cosmwasm_1_2"] +features = ["abort", "stargate", "staking", "ibc3", "cosmwasm_1_3"] [features] default = ["iterator", "abort"] From 5e146b0bcd350635a3b161e9aeb47d842b46fca1 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 31 May 2023 15:53:53 +0200 Subject: [PATCH 0339/2372] Add cosmwasm_1_3 to rust analyzer --- .vscode/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 4fc9b25774..3105948a84 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,3 @@ { - "rust-analyzer.cargo.features": ["abort", "stargate", "staking", "cosmwasm_1_2"] + "rust-analyzer.cargo.features": ["abort", "stargate", "staking", "cosmwasm_1_3"] } From ea6d82c609b442b03f546a2f9d5aa36dbb47da14 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 31 May 2023 16:33:15 +0200 Subject: [PATCH 0340/2372] Fix all denoms metadata mock --- packages/std/src/testing/mock.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 14ab622999..66ef04c68b 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -730,7 +730,7 @@ impl BankQuerier { // if we took more than requested, remove the last element (the next key), // otherwise this is the last batch let next_key = if metadata.len() > pagination.limit.u64() as usize { - metadata.pop().map(|m| Binary::from(m.name.as_bytes())) + metadata.pop().map(|m| Binary::from(m.symbol.as_bytes())) } else { None }; @@ -1362,6 +1362,21 @@ mod tests { assert_eq!(res.metadata.len(), 10); assert!(res.next_key.is_some()); + // querying next 10 should also work + let res2 = bank + .query(&BankQuery::AllDenomMetadata { + pagination: Some(PageRequest { + key: res.next_key, + limit: Uint64::new(10), + reverse: false, + }), + }) + .unwrap() + .unwrap(); + let res2: AllDenomMetadataResponse = from_binary(&res2).unwrap(); + assert_eq!(res2.metadata.len(), 10); + assert_ne!(res.metadata.last(), res2.metadata.first()); + // querying all 100 should work let res = bank .query(&BankQuery::AllDenomMetadata { From c1fbb90c459d975c4fd345fb685d0da4e2311d4c Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 2 Jun 2023 12:16:55 +0200 Subject: [PATCH 0341/2372] Add Timestamp type to docs --- docs/MESSAGE_TYPES.md | 45 +++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/docs/MESSAGE_TYPES.md b/docs/MESSAGE_TYPES.md index 05ff61a0c3..c69876283c 100644 --- a/docs/MESSAGE_TYPES.md +++ b/docs/MESSAGE_TYPES.md @@ -9,27 +9,28 @@ this reason, the CosmWasm standard library `cosmwasm-std` ships types that ensure good user experience in JSON. The following table shows both standard Rust types as well as `cosmwasm_std` types and how they are encoded in JSON. -| Rust type | JSON type[^1] | Example | Note | -| ------------------- | -------------------------------- | ------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| bool | `true` or `false` | `true` | | -| u32/i32 | number | `123` | | -| u64/i64 | number | `123456` | Supported in Rust and Go. Other implementations (`jq`, `JavaScript`) do not support the full uint64/int64 range. | -| u128/i128 | string | `"340282366920938463463374607431768211455", "-2766523308300312711084346401884294402"` | 🚫 Strongly discouraged because the JSON type in serde-json-wasm is wrong and will change. See [Dev Note #4: u128/i128 serialization][dev-note-4]. | -| usize/isize | number | `123456` | 🚫 Don't use this type because it has a different size in unit tests (64 bit) and Wasm (32 bit). Also it tends to issue float instructions such that the contracts cannot be uploaded. | -| String | string | `"foo"` | -| &str | string | `"foo"` | 🚫 Unsuppored since message types must be owned (DeserializeOwned) | -| Option\ | `null` or JSON type of `T` | `null`, `{"foo":12}` | | -| Vec\ | array of JSON type of `T` | `["one", "two", "three"]` (Vec\), `[true, false]` (Vec\) | -| Vec\ | array of numbers from 0 to 255 | `[187, 61, 11, 250]` | ⚠️ Discouraged as this encoding is not as compact as it can be. See `Binary`. | -| struct MyType { … } | object | `{"foo":12}` | | -| [Uint64] | string containing number | `"1234321"` | Used to support full uint64 range in all implementations | -| [Uint128] | string containing number | `"1234321"` | | -| [Uint256] | string containing number | `"1234321"` | | -| [Uint512] | string containing number | `"1234321"` | | -| [Decimal] | string containing decimal number | `"55.6584"` | | -| [Decimal256] | string containing decimal number | `"55.6584"` | | -| [Binary] | string containing base64 data | `"MTIzCg=="` | | -| [HexBinary] | string containing hex data | `"b5d7d24e428c"` | | +| Rust type | JSON type[^1] | Example | Note | +| ------------------- | ----------------------------------------- | ------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| bool | `true` or `false` | `true` | | +| u32/i32 | number | `123` | | +| u64/i64 | number | `123456` | Supported in Rust and Go. Other implementations (`jq`, `JavaScript`) do not support the full uint64/int64 range. | +| u128/i128 | string | `"340282366920938463463374607431768211455", "-2766523308300312711084346401884294402"` | 🚫 Strongly discouraged because the JSON type in serde-json-wasm is wrong and will change. See [Dev Note #4: u128/i128 serialization][dev-note-4]. | +| usize/isize | number | `123456` | 🚫 Don't use this type because it has a different size in unit tests (64 bit) and Wasm (32 bit). Also it tends to issue float instructions such that the contracts cannot be uploaded. | +| String | string | `"foo"` | +| &str | string | `"foo"` | 🚫 Unsuppored since message types must be owned (DeserializeOwned) | +| Option\ | `null` or JSON type of `T` | `null`, `{"foo":12}` | | +| Vec\ | array of JSON type of `T` | `["one", "two", "three"]` (Vec\), `[true, false]` (Vec\) | +| Vec\ | array of numbers from 0 to 255 | `[187, 61, 11, 250]` | ⚠️ Discouraged as this encoding is not as compact as it can be. See `Binary`. | +| struct MyType { … } | object | `{"foo":12}` | | +| [Uint64] | string containing number | `"1234321"` | Used to support full uint64 range in all implementations | +| [Uint128] | string containing number | `"1234321"` | | +| [Uint256] | string containing number | `"1234321"` | | +| [Uint512] | string containing number | `"1234321"` | | +| [Decimal] | string containing decimal number | `"55.6584"` | | +| [Decimal256] | string containing decimal number | `"55.6584"` | | +| [Binary] | string containing base64 data | `"MTIzCg=="` | | +| [HexBinary] | string containing hex data | `"b5d7d24e428c"` | | +| [Timestamp] | string containing nanoseconds since epoch | `"1677687687000000000"` | | [uint64]: https://docs.rs/cosmwasm-std/1.1.1/cosmwasm_std/struct.Uint64.html [uint128]: https://docs.rs/cosmwasm-std/1.1.1/cosmwasm_std/struct.Uint128.html @@ -41,6 +42,8 @@ Rust types as well as `cosmwasm_std` types and how they are encoded in JSON. [binary]: https://docs.rs/cosmwasm-std/1.1.1/cosmwasm_std/struct.Binary.html [hexbinary]: https://docs.rs/cosmwasm-std/1.1.1/cosmwasm_std/struct.HexBinary.html +[timestamp]: + https://docs.rs/cosmwasm-std/1.1.1/cosmwasm_std/struct.Timestamp.html [dev-note-4]: https://medium.com/cosmwasm/dev-note-4-u128-i128-serialization-in-cosmwasm-90cb76784d44 From b53f39edbf5989e5d7a86e69fa9e88bca5c90971 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 2 Jun 2023 12:17:35 +0200 Subject: [PATCH 0342/2372] Update docs links --- docs/MESSAGE_TYPES.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/MESSAGE_TYPES.md b/docs/MESSAGE_TYPES.md index c69876283c..30d4ce91f7 100644 --- a/docs/MESSAGE_TYPES.md +++ b/docs/MESSAGE_TYPES.md @@ -32,18 +32,18 @@ Rust types as well as `cosmwasm_std` types and how they are encoded in JSON. | [HexBinary] | string containing hex data | `"b5d7d24e428c"` | | | [Timestamp] | string containing nanoseconds since epoch | `"1677687687000000000"` | | -[uint64]: https://docs.rs/cosmwasm-std/1.1.1/cosmwasm_std/struct.Uint64.html -[uint128]: https://docs.rs/cosmwasm-std/1.1.1/cosmwasm_std/struct.Uint128.html -[uint256]: https://docs.rs/cosmwasm-std/1.1.1/cosmwasm_std/struct.Uint256.html -[uint512]: https://docs.rs/cosmwasm-std/1.1.1/cosmwasm_std/struct.Uint512.html -[decimal]: https://docs.rs/cosmwasm-std/1.1.1/cosmwasm_std/struct.Decimal.html +[uint64]: https://docs.rs/cosmwasm-std/1.2.5/cosmwasm_std/struct.Uint64.html +[uint128]: https://docs.rs/cosmwasm-std/1.2.5/cosmwasm_std/struct.Uint128.html +[uint256]: https://docs.rs/cosmwasm-std/1.2.5/cosmwasm_std/struct.Uint256.html +[uint512]: https://docs.rs/cosmwasm-std/1.2.5/cosmwasm_std/struct.Uint512.html +[decimal]: https://docs.rs/cosmwasm-std/1.2.5/cosmwasm_std/struct.Decimal.html [decimal256]: - https://docs.rs/cosmwasm-std/1.1.1/cosmwasm_std/struct.Decimal256.html -[binary]: https://docs.rs/cosmwasm-std/1.1.1/cosmwasm_std/struct.Binary.html + https://docs.rs/cosmwasm-std/1.2.5/cosmwasm_std/struct.Decimal256.html +[binary]: https://docs.rs/cosmwasm-std/1.2.5/cosmwasm_std/struct.Binary.html [hexbinary]: - https://docs.rs/cosmwasm-std/1.1.1/cosmwasm_std/struct.HexBinary.html + https://docs.rs/cosmwasm-std/1.2.5/cosmwasm_std/struct.HexBinary.html [timestamp]: - https://docs.rs/cosmwasm-std/1.1.1/cosmwasm_std/struct.Timestamp.html + https://docs.rs/cosmwasm-std/1.2.5/cosmwasm_std/struct.Timestamp.html [dev-note-4]: https://medium.com/cosmwasm/dev-note-4-u128-i128-serialization-in-cosmwasm-90cb76784d44 From 3eb94fbff82c59bd2ccf040e279108a411f2c79a Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 5 Jun 2023 15:03:21 +0200 Subject: [PATCH 0343/2372] Bump module serialization version --- packages/vm/src/modules/file_system_cache.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 95b1a3e288..6fcdbc1af4 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -39,7 +39,11 @@ use crate::modules::current_wasmer_module_version; /// the module header version (). In cosmwasm-vm 1.1.0-1.1.1 /// the old value "v3" is still used along with Wasmer 2.3.0 (bug). From cosmwasm 1.1.2 onwards, this is /// fixed by bumping to "v4". -const MODULE_SERIALIZATION_VERSION: &str = "v4"; +/// - **v5**:
+/// A change in memory layout of some types in Rust [std] caused +/// [issues with module deserialization](https://github.com/CosmWasm/wasmvm/issues/426). +/// To work around this, the version was bumped to "v5" here to invalidate these corrupt caches. +const MODULE_SERIALIZATION_VERSION: &str = "v5"; /// Representation of a directory that contains compiled Wasm artifacts. pub struct FileSystemCache { From 0f909291ede7d82926c0bb24199ad623c0a06e51 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 5 Jun 2023 15:08:11 +0200 Subject: [PATCH 0344/2372] Update changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 14215138d7..833c135b3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ and this project adheres to ## [Unreleased] +- cosmwasm-vm: Bumped serialization version number to invalidate corrupt caches + caused by Rust update ([#1708]) + +[#1708]: https://github.com/CosmWasm/cosmwasm/pull/1708 + ## [1.2.5] - 2023-05-02 ### Added From 539909673901c423572eab9c904a27f903a618f8 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 5 Jun 2023 15:15:11 +0200 Subject: [PATCH 0345/2372] Fix test --- packages/vm/src/modules/file_system_cache.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 6fcdbc1af4..e5041a9900 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -240,7 +240,7 @@ mod tests { cache.store(&checksum, &module).unwrap(); let file_path = format!( - "{}/v4-wasmer1/{}", + "{}/v5-wasmer1/{}", tmp_dir.path().to_string_lossy(), checksum ); From 90084792ba2ea199fcc30ccab4793e2ffbffe201 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 5 Jun 2023 15:38:10 +0200 Subject: [PATCH 0346/2372] Improve CHANGELOG text --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 833c135b3e..ddf9998211 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,9 @@ and this project adheres to ## [Unreleased] -- cosmwasm-vm: Bumped serialization version number to invalidate corrupt caches - caused by Rust update ([#1708]) +- cosmwasm-vm: Bumped module serialization version from v4 to v5 to invalidate + potentially corrupted caches caused by Rust update. See + https://github.com/CosmWasm/wasmvm/issues/426 for more information. ([#1708]) [#1708]: https://github.com/CosmWasm/cosmwasm/pull/1708 From ebec623576e6dca551265be3c15f0e28891b47e6 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 5 Jun 2023 15:46:16 +0200 Subject: [PATCH 0347/2372] Apply suggestions from code review Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- MIGRATING.md | 6 +++--- packages/std/src/query/bank.rs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/MIGRATING.md b/MIGRATING.md index 33b1af3036..ac9d8dd347 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -20,12 +20,12 @@ major releases of `cosmwasm`. Note that you can also view the # ... ``` -- If you want to use a fewture that os only available on CosmWasm 1.3+ chains, +- If you want to use a feature that is only available on CosmWasm 1.3+ chains, use this feature: ```diff - -cosmwasm-std = { version = "1.1.0", features = ["stargate"] } - +cosmwasm-std = { version = "1.1.0", features = ["stargate", "cosmwasm_1_3"] } + -cosmwasm-std = { version = "1.3.0", features = ["stargate"] } + +cosmwasm-std = { version = "1.3.0", features = ["stargate", "cosmwasm_1_3"] } ``` Please note that `cosmwasm_1_2` implies `cosmwasm_1_1`, and `cosmwasm_1_3` diff --git a/packages/std/src/query/bank.rs b/packages/std/src/query/bank.rs index 150e0e4b44..74d8b2b9d7 100644 --- a/packages/std/src/query/bank.rs +++ b/packages/std/src/query/bank.rs @@ -71,7 +71,7 @@ impl QueryResponseType for AllBalanceResponse {} #[serde(rename_all = "snake_case")] #[non_exhaustive] pub struct DenomMetadataResponse { - /// Always returns metadata for all token denoms on the base chain. + /// The metadata for the queried denom. pub metadata: DenomMetadata, } From 603dd1f0e3e7438e69c5a582aaa79388f2417c5f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 5 Jun 2023 16:00:23 +0200 Subject: [PATCH 0348/2372] Add DenomMetadata query to changelog --- CHANGELOG.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b267b500aa..155f6f08f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,10 +9,11 @@ and this project adheres to ### Added - cosmwasm-std: Implement `BankQuery::AllDenomMetadata` to allow querying all - the denom metadata. In order to use this query in a contract, the - `cosmwasm_1_3` feature needs to be enabled for the `cosmwasm_std` dependency. - This makes the contract incompatible with chains running anything lower than - CosmWasm `1.3.0`. ([#1647]) + the denom metadata and `BankQuery::DenomMetadata` to query a specific one. In + order to use this query in a contract, the `cosmwasm_1_3` feature needs to be + enabled for the `cosmwasm_std` dependency. This makes the contract + incompatible with chains running anything lower than CosmWasm `1.3.0`. + ([#1647]) - cosmwasm-vm: Add `Cache::save_wasm_unchecked` to save Wasm blobs that have been checked before. This is useful for state-sync where we know the Wasm code was checked when it was first uploaded. ([#1635]) From ef2541944de87f377b06f4fb6ef904f8a8ce4418 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 5 Jun 2023 16:03:58 +0200 Subject: [PATCH 0349/2372] Add DenomMetadata to capability docs --- docs/CAPABILITIES-BUILT-IN.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/CAPABILITIES-BUILT-IN.md b/docs/CAPABILITIES-BUILT-IN.md index 190c9f825d..d822971807 100644 --- a/docs/CAPABILITIES-BUILT-IN.md +++ b/docs/CAPABILITIES-BUILT-IN.md @@ -15,5 +15,6 @@ might define others. CosmWasm `1.1.0` or higher support this. - `cosmwasm_1_2` enables the `GovMsg::VoteWeighted` and `WasmMsg::Instantiate2` messages. Only chains running CosmWasm `1.2.0` or higher support this. -- `cosmwasm_1_3` enables the `BankQuery::AllDenomMetadata` query. Only chains - running CosmWasm `1.3.0` or higher support this. +- `cosmwasm_1_3` enables the `BankQuery::AllDenomMetadata` and + `BankQuery::DenomMetadata` queries. Only chains running CosmWasm `1.3.0` or + higher support this. From 054e599a9bd93bfbecc66e8dd83fa1e7925b6004 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 5 Jun 2023 16:09:03 +0200 Subject: [PATCH 0350/2372] Set version: 1.2.6 --- Cargo.lock | 16 ++++++++-------- contracts/burner/Cargo.lock | 12 ++++++------ contracts/crypto-verify/Cargo.lock | 14 +++++++------- contracts/cyberpunk/Cargo.lock | 14 +++++++------- contracts/floaty/Cargo.lock | 14 +++++++------- contracts/hackatom/Cargo.lock | 14 +++++++------- contracts/ibc-reflect-send/Cargo.lock | 14 +++++++------- contracts/ibc-reflect/Cargo.lock | 14 +++++++------- contracts/queue/Cargo.lock | 12 ++++++------ contracts/reflect/Cargo.lock | 14 +++++++------- contracts/staking/Cargo.lock | 14 +++++++------- contracts/virus/Cargo.lock | 12 ++++++------ packages/check/Cargo.toml | 6 +++--- packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema-derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 6 +++--- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 20 files changed, 99 insertions(+), 99 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6c606750c3..82127650ac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -285,7 +285,7 @@ dependencies = [ [[package]] name = "cosmwasm-check" -version = "1.2.5" +version = "1.2.6" dependencies = [ "anyhow", "clap 2.34.0", @@ -296,7 +296,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.5" +version = "1.2.6" dependencies = [ "base64", "criterion", @@ -315,7 +315,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.5" +version = "1.2.6" dependencies = [ "cosmwasm-std", "syn", @@ -323,7 +323,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "1.2.5" +version = "1.2.6" dependencies = [ "anyhow", "cosmwasm-schema-derive", @@ -338,7 +338,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.5" +version = "1.2.6" dependencies = [ "proc-macro2", "quote", @@ -347,7 +347,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.5" +version = "1.2.6" dependencies = [ "base64", "chrono", @@ -369,7 +369,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.5" +version = "1.2.6" dependencies = [ "cosmwasm-std", "serde", @@ -377,7 +377,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.5" +version = "1.2.6" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index e917f2e4e8..f63e26daa0 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -174,7 +174,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.5" +version = "1.2.6" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -185,14 +185,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.5" +version = "1.2.6" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.5" +version = "1.2.6" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -203,7 +203,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.5" +version = "1.2.6" dependencies = [ "proc-macro2", "quote", @@ -212,7 +212,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.5" +version = "1.2.6" dependencies = [ "base64", "cosmwasm-crypto", @@ -230,7 +230,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.5" +version = "1.2.6" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 7cc1a4fdcb..b8c9d3d4ed 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.5" +version = "1.2.6" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.5" +version = "1.2.6" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.5" +version = "1.2.6" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.5" +version = "1.2.6" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.5" +version = "1.2.6" dependencies = [ "base64", "cosmwasm-crypto", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.5" +version = "1.2.6" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.5" +version = "1.2.6" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 1e9ed90732..8bb18ba5aa 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.5" +version = "1.2.6" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -203,14 +203,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.5" +version = "1.2.6" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.5" +version = "1.2.6" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -221,7 +221,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.5" +version = "1.2.6" dependencies = [ "proc-macro2", "quote", @@ -230,7 +230,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.5" +version = "1.2.6" dependencies = [ "base64", "cosmwasm-crypto", @@ -248,7 +248,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.5" +version = "1.2.6" dependencies = [ "cosmwasm-std", "serde", @@ -256,7 +256,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.5" +version = "1.2.6" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index e1e9d89c35..36eb594473 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.5" +version = "1.2.6" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.5" +version = "1.2.6" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.5" +version = "1.2.6" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.5" +version = "1.2.6" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.5" +version = "1.2.6" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.5" +version = "1.2.6" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.5" +version = "1.2.6" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index e8707552a1..226ce03e09 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.5" +version = "1.2.6" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.5" +version = "1.2.6" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.5" +version = "1.2.6" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.5" +version = "1.2.6" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.5" +version = "1.2.6" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.5" +version = "1.2.6" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.5" +version = "1.2.6" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 9e708b2477..bbce14b49d 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.5" +version = "1.2.6" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.5" +version = "1.2.6" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.5" +version = "1.2.6" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.5" +version = "1.2.6" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.5" +version = "1.2.6" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.5" +version = "1.2.6" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.5" +version = "1.2.6" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 50ebaa8cb5..4029d0861a 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.5" +version = "1.2.6" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.5" +version = "1.2.6" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.5" +version = "1.2.6" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.5" +version = "1.2.6" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.5" +version = "1.2.6" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.5" +version = "1.2.6" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.5" +version = "1.2.6" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 03e20b46bb..0a40946789 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.5" +version = "1.2.6" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.5" +version = "1.2.6" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.5" +version = "1.2.6" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.5" +version = "1.2.6" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.5" +version = "1.2.6" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.5" +version = "1.2.6" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 905fe4f613..b1249758bd 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.5" +version = "1.2.6" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.5" +version = "1.2.6" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.5" +version = "1.2.6" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.5" +version = "1.2.6" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.5" +version = "1.2.6" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.5" +version = "1.2.6" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.5" +version = "1.2.6" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index b444477167..8480b75873 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.5" +version = "1.2.6" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.5" +version = "1.2.6" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.5" +version = "1.2.6" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.5" +version = "1.2.6" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.5" +version = "1.2.6" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.5" +version = "1.2.6" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.5" +version = "1.2.6" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index a63e69743b..5100789584 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.5" +version = "1.2.6" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.5" +version = "1.2.6" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.5" +version = "1.2.6" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.5" +version = "1.2.6" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.5" +version = "1.2.6" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.5" +version = "1.2.6" dependencies = [ "bitflags", "bytecheck", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index c046e1b39b..bcdb3cfb43 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-check" -version = "1.2.5" +version = "1.2.6" authors = ["Mauro Lacy "] edition = "2021" description = "A CLI tool for verifying CosmWasm smart contracts" @@ -11,5 +11,5 @@ license = "Apache-2.0" anyhow = "1.0.57" clap = "2" colored = "2" -cosmwasm-vm = { path = "../vm", version = "1.2.5" } -cosmwasm-std = { path = "../std", version = "1.2.5" } +cosmwasm-vm = { path = "../vm", version = "1.2.6" } +cosmwasm-std = { path = "../std", version = "1.2.6" } diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 7d79ed54ff..8b59fbd523 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "1.2.5" +version = "1.2.6" authors = ["Mauro Lacy "] edition = "2021" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index b0909ec357..163b1b6f72 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "1.2.5" +version = "1.2.6" authors = ["Simon Warta "] edition = "2021" description = "A package for auto-generated code used for CosmWasm contract development. This is shipped as part of cosmwasm-std. Do not use directly." diff --git a/packages/schema-derive/Cargo.toml b/packages/schema-derive/Cargo.toml index 7f3b53933e..0bfff7580e 100644 --- a/packages/schema-derive/Cargo.toml +++ b/packages/schema-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema-derive" -version = "1.2.5" +version = "1.2.6" authors = ["Tomasz Kurcz "] edition = "2021" description = "Derive macros for cosmwasm-schema" diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index 91ced79a03..59d708ce58 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "1.2.5" +version = "1.2.6" authors = ["Simon Warta ", "Ethan Frey "] edition = "2021" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." @@ -8,7 +8,7 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/schema" license = "Apache-2.0" [dependencies] -cosmwasm-schema-derive = { version = "=1.2.5", path = "../schema-derive" } +cosmwasm-schema-derive = { version = "=1.2.6", path = "../schema-derive" } schemars = "0.8.3" serde = "1.0" serde_json = "1.0.40" @@ -16,6 +16,6 @@ thiserror = "1.0.26" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = { version = "1.2.5", path = "../std" } +cosmwasm-std = { version = "1.2.6", path = "../std" } semver = "1" tempfile = "3" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 2629690783..8aa895b4d8 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "1.2.5" +version = "1.2.6" authors = ["Ethan Frey "] edition = "2021" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -42,7 +42,7 @@ cosmwasm_1_2 = ["cosmwasm_1_1"] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "1.2.5" } +cosmwasm-derive = { path = "../derive", version = "1.2.6" } derivative = "2" forward_ref = "1" hex = "0.4" @@ -54,7 +54,7 @@ thiserror = "1.0.26" uint = "0.9.3" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "1.2.5" } +cosmwasm-crypto = { path = "../crypto", version = "1.2.6" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 78ba760f7b..4c09e83214 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "1.2.5" +version = "1.2.6" authors = ["Ethan Frey "] edition = "2021" description = "CosmWasm library with useful helpers for Storage patterns" @@ -16,5 +16,5 @@ iterator = ["cosmwasm-std/iterator"] [dependencies] # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.2.5", default-features = false } +cosmwasm-std = { path = "../std", version = "1.2.6", default-features = false } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index fbedf06b69..73f1c30b0c 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "1.2.5" +version = "1.2.6" authors = ["Ethan Frey "] edition = "2021" description = "VM bindings to run cosmwams contracts" @@ -41,8 +41,8 @@ required-features = ["iterator"] [dependencies] clru = "0.4.0" # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.2.5", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "1.2.5" } +cosmwasm-std = { path = "../std", version = "1.2.6", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "1.2.6" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.3" From 3016c2d9cba4b18ac24b27b0e1245e47dd26ff3a Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 5 Jun 2023 16:11:35 +0200 Subject: [PATCH 0351/2372] Update changelog --- CHANGELOG.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ddf9998211..c7d36929d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ and this project adheres to ## [Unreleased] +## [1.2.6] - 2023-06-05 + +## Changed + - cosmwasm-vm: Bumped module serialization version from v4 to v5 to invalidate potentially corrupted caches caused by Rust update. See https://github.com/CosmWasm/wasmvm/issues/426 for more information. ([#1708]) @@ -1691,7 +1695,8 @@ Some main points: All future Changelog entries will reference this base -[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.5...HEAD +[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.6...HEAD +[1.2.6]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.5...v1.2.6 [1.2.5]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.4...v1.2.5 [1.2.4]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.3...v1.2.4 [1.2.3]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.2...v1.2.3 From bd00224f992a7354072ca18e75698a78048430e5 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 31 May 2023 17:13:40 +0200 Subject: [PATCH 0352/2372] Coin uses same output for Debug as Display --- packages/std/src/coin.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/std/src/coin.rs b/packages/std/src/coin.rs index b88a6da3ee..3744e8ed1e 100644 --- a/packages/std/src/coin.rs +++ b/packages/std/src/coin.rs @@ -4,7 +4,7 @@ use std::{fmt, str::FromStr}; use crate::{errors::CoinFromStrError, math::Uint128}; -#[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] +#[derive(Serialize, Deserialize, Clone, Default, PartialEq, Eq, JsonSchema)] pub struct Coin { pub denom: String, pub amount: Uint128, @@ -19,6 +19,12 @@ impl Coin { } } +impl fmt::Debug for Coin { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}{}", self.amount, self.denom) + } +} + impl FromStr for Coin { type Err = CoinFromStrError; @@ -235,4 +241,10 @@ mod tests { "Invalid amount: number too large to fit in target type" ); } + + #[test] + fn debug_coin() { + let coin = Coin::new(123, "ucosm"); + assert_eq!(format!("{:?}", coin), "123ucosm"); + } } From 4d424ef49c40c282997ed5311d64fa5843177b60 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 31 May 2023 17:17:55 +0200 Subject: [PATCH 0353/2372] Add CHANGELOG entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7380f7fb7a..abdd813673 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,8 @@ and this project adheres to - cosmwasm-vm: Add `.wasm` extension to stored wasm files ([#1686]). - cosmwasm-vm: Upgrade Wasmer to version 3.3.0. - cosmwasm-check: Update clap dependency to version 4 ([#1677]) +- cosmwasm-std: Coin uses `123ucosm` format for Debug as well as Display + ([#1704]) [#1511]: https://github.com/CosmWasm/cosmwasm/issues/1511 [#1629]: https://github.com/CosmWasm/cosmwasm/pull/1629 @@ -42,6 +44,7 @@ and this project adheres to [#1667]: https://github.com/CosmWasm/cosmwasm/pull/1667 [#1677]: https://github.com/CosmWasm/cosmwasm/pull/1677 [#1686]: https://github.com/CosmWasm/cosmwasm/pull/1686 +[#1704]: https://github.com/CosmWasm/cosmwasm/pull/1704 ### Deprecated From 52ccdadf2615bc3b2b6b43587aa1402f73d7ce14 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Tue, 6 Jun 2023 19:32:56 +0200 Subject: [PATCH 0354/2372] Changed format as per PR review --- CHANGELOG.md | 2 +- packages/std/src/coin.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index abdd813673..25ac5ad6ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,7 +34,7 @@ and this project adheres to - cosmwasm-vm: Add `.wasm` extension to stored wasm files ([#1686]). - cosmwasm-vm: Upgrade Wasmer to version 3.3.0. - cosmwasm-check: Update clap dependency to version 4 ([#1677]) -- cosmwasm-std: Coin uses `123ucosm` format for Debug as well as Display +- cosmwasm-std: Coin uses `Coin { 123 "ucosm" }` format for Debug as well as Display ([#1704]) [#1511]: https://github.com/CosmWasm/cosmwasm/issues/1511 diff --git a/packages/std/src/coin.rs b/packages/std/src/coin.rs index 3744e8ed1e..0838958efa 100644 --- a/packages/std/src/coin.rs +++ b/packages/std/src/coin.rs @@ -21,7 +21,7 @@ impl Coin { impl fmt::Debug for Coin { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}{}", self.amount, self.denom) + write!(f, "Coin {{ {} \"{}\" }}", self.amount, self.denom) } } @@ -245,6 +245,6 @@ mod tests { #[test] fn debug_coin() { let coin = Coin::new(123, "ucosm"); - assert_eq!(format!("{:?}", coin), "123ucosm"); + assert_eq!(format!("{:?}", coin), r#"Coin { 123 "ucosm" }"#); } } From 44bc46065090518e1efbb55666e077d8aac8c1c3 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Tue, 6 Jun 2023 19:35:45 +0200 Subject: [PATCH 0355/2372] Fix CHANGELOG formatting --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 25ac5ad6ec..a93f88179d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,7 +34,7 @@ and this project adheres to - cosmwasm-vm: Add `.wasm` extension to stored wasm files ([#1686]). - cosmwasm-vm: Upgrade Wasmer to version 3.3.0. - cosmwasm-check: Update clap dependency to version 4 ([#1677]) -- cosmwasm-std: Coin uses `Coin { 123 "ucosm" }` format for Debug as well as Display +- cosmwasm-std: Coin uses shorter `Coin { 123 "ucosm" }` format for Debug ([#1704]) [#1511]: https://github.com/CosmWasm/cosmwasm/issues/1511 From 5bf3619248e0ced41eedea34fe2c4b4ef743c8b7 Mon Sep 17 00:00:00 2001 From: Shane Vitarana Date: Wed, 7 Jun 2023 12:58:04 -0400 Subject: [PATCH 0356/2372] Add bps conversion to Decimal and Decimal256 --- packages/std/src/math/decimal.rs | 11 +++++++++++ packages/std/src/math/decimal256.rs | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 3c3842128c..113be3258a 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -76,6 +76,11 @@ impl Decimal { Self(((x as u128) * 1_000_000_000_000_000).into()) } + /// Convert bps (basis points) into Decimal + pub fn bps(x: u64) -> Self { + Self(((x as u128) * 100_000_000_000_000).into()) + } + /// Creates a decimal from a number of atomic units and the number /// of decimal places. The inputs will be converted internally to form /// a decimal with 18 decimal places. So the input 123 and 2 will create @@ -768,6 +773,12 @@ mod tests { assert_eq!(value.0, Decimal::DECIMAL_FRACTIONAL / Uint128::from(8u8)); } + #[test] + fn decimal_bps() { + let value = Decimal::bps(125); + assert_eq!(value.0, Decimal::DECIMAL_FRACTIONAL / Uint128::from(80u8)); + } + #[test] fn decimal_from_atomics_works() { let one = Decimal::one(); diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index bd6109718a..37371a6c00 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -85,6 +85,11 @@ impl Decimal256 { Self(Uint256::from(x) * Uint256::from(1_000_000_000_000_000u128)) } + /// Convert bps (basis points) into Decimal256 + pub fn bps(x: u64) -> Self { + Self(Uint256::from(x) * Uint256::from(100_000_000_000_000u128)) + } + /// Creates a decimal from a number of atomic units and the number /// of decimal places. The inputs will be converted internally to form /// a decimal with 18 decimal places. So the input 123 and 2 will create @@ -794,6 +799,12 @@ mod tests { assert_eq!(value.0, Decimal256::DECIMAL_FRACTIONAL / Uint256::from(8u8)); } + #[test] + fn decimal256_bps() { + let value = Decimal256::bps(125); + assert_eq!(value.0, Decimal256::DECIMAL_FRACTIONAL / Uint256::from(80u8)); + } + #[test] fn decimal256_from_atomics_works() { let one = Decimal256::one(); From a5addb8d901ed06eb51dc256c9367d778457ddc9 Mon Sep 17 00:00:00 2001 From: Shane Vitarana Date: Wed, 7 Jun 2023 13:08:10 -0400 Subject: [PATCH 0357/2372] Fix formatting --- packages/std/src/math/decimal256.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 37371a6c00..89338ec2dd 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -802,7 +802,10 @@ mod tests { #[test] fn decimal256_bps() { let value = Decimal256::bps(125); - assert_eq!(value.0, Decimal256::DECIMAL_FRACTIONAL / Uint256::from(80u8)); + assert_eq!( + value.0, + Decimal256::DECIMAL_FRACTIONAL / Uint256::from(80u8) + ); } #[test] From 97a1048755c179f7c467a32197f56f3dbaca97f6 Mon Sep 17 00:00:00 2001 From: "shane.stars" Date: Wed, 7 Jun 2023 16:53:41 -0400 Subject: [PATCH 0358/2372] Update packages/std/src/math/decimal.rs Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/std/src/math/decimal.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 113be3258a..9e4e3424aa 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -76,7 +76,7 @@ impl Decimal { Self(((x as u128) * 1_000_000_000_000_000).into()) } - /// Convert bps (basis points) into Decimal + /// Convert basis points (x/10000) into Decimal pub fn bps(x: u64) -> Self { Self(((x as u128) * 100_000_000_000_000).into()) } From bd5245c984b04dd52fe9571acd8e1d45a03c55c0 Mon Sep 17 00:00:00 2001 From: "shane.stars" Date: Wed, 7 Jun 2023 16:53:48 -0400 Subject: [PATCH 0359/2372] Update packages/std/src/math/decimal256.rs Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/std/src/math/decimal256.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 89338ec2dd..157e7397b7 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -85,7 +85,7 @@ impl Decimal256 { Self(Uint256::from(x) * Uint256::from(1_000_000_000_000_000u128)) } - /// Convert bps (basis points) into Decimal256 + /// Convert basis points (x/10000) into Decimal256 pub fn bps(x: u64) -> Self { Self(Uint256::from(x) * Uint256::from(100_000_000_000_000u128)) } From cc67609090f92c2fa3858ebaaf50138103e0ba37 Mon Sep 17 00:00:00 2001 From: Shane Vitarana Date: Wed, 7 Jun 2023 17:31:23 -0400 Subject: [PATCH 0360/2372] Update CHANGELOG --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a93f88179d..b1682da85b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,9 +12,12 @@ and this project adheres to been checked before. This is useful for state-sync where we know the Wasm code was checked when it was first uploaded. ([#1635]) - cosmwasm-std: Add `FromStr` impl for `Coin`. ([#1684]) +- cosmwasm-std: Add `Decimal::bps` and `Decimal256::bps` to create a decimal + from a basis point value ([#1715]). [#1635]: https://github.com/CosmWasm/cosmwasm/pull/1635 [#1684]: https://github.com/CosmWasm/cosmwasm/pull/1684 +[#1715]: https://github.com/CosmWasm/cosmwasm/pull/1715 ### Changed From 0a9b745cd4132772f1ad682c0af0319ca7d12237 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 9 Jun 2023 10:35:02 +0200 Subject: [PATCH 0361/2372] Use u32 for pagination limit --- packages/std/src/pagination.rs | 4 ++-- packages/std/src/testing/mock.rs | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/std/src/pagination.rs b/packages/std/src/pagination.rs index e15d63eeaa..d9d1d8ef96 100644 --- a/packages/std/src/pagination.rs +++ b/packages/std/src/pagination.rs @@ -1,12 +1,12 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use crate::{Binary, Uint64}; +use crate::Binary; /// Simplified version of the PageRequest type for pagination from the cosmos-sdk #[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] pub struct PageRequest { pub key: Option, - pub limit: Uint64, + pub limit: u32, pub reverse: bool, } diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 66ef04c68b..3bdcb5ea95 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -35,7 +35,7 @@ use crate::types::{BlockInfo, ContractInfo, Env, MessageInfo, TransactionInfo}; #[cfg(feature = "cosmwasm_1_3")] use crate::{ query::{AllDenomMetadataResponse, DenomMetadataResponse}, - PageRequest, Uint64, + PageRequest, }; use crate::{Attribute, DenomMetadata}; #[cfg(feature = "stargate")] @@ -707,7 +707,7 @@ impl BankQuerier { BankQuery::AllDenomMetadata { pagination } => { let default_pagination = PageRequest { key: None, - limit: Uint64::new(100), + limit: 100, reverse: false, }; let pagination = pagination.as_ref().unwrap_or(&default_pagination); @@ -724,12 +724,12 @@ impl BankQuerier { None => false, }) // take the requested amount + 1 to get the next key - .take((pagination.limit.u64().saturating_add(1)) as usize) + .take((pagination.limit.saturating_add(1)) as usize) .collect(); // if we took more than requested, remove the last element (the next key), // otherwise this is the last batch - let next_key = if metadata.len() > pagination.limit.u64() as usize { + let next_key = if metadata.len() > pagination.limit as usize { metadata.pop().map(|m| Binary::from(m.symbol.as_bytes())) } else { None @@ -1352,7 +1352,7 @@ mod tests { .query(&BankQuery::AllDenomMetadata { pagination: Some(PageRequest { key: None, - limit: Uint64::new(10), + limit: 10, reverse: false, }), }) @@ -1367,7 +1367,7 @@ mod tests { .query(&BankQuery::AllDenomMetadata { pagination: Some(PageRequest { key: res.next_key, - limit: Uint64::new(10), + limit: 10, reverse: false, }), }) @@ -1382,7 +1382,7 @@ mod tests { .query(&BankQuery::AllDenomMetadata { pagination: Some(PageRequest { key: None, - limit: Uint64::new(100), + limit: 100, reverse: true, }), }) @@ -1397,7 +1397,7 @@ mod tests { .query(&BankQuery::AllDenomMetadata { pagination: Some(PageRequest { key: res.next_key, - limit: Uint64::MAX, + limit: u32::MAX, reverse: true, }), }) From ffd83bedfe288c56ebc74ea474910ca17ae56c1c Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 14 Jun 2023 14:05:56 +0200 Subject: [PATCH 0362/2372] Avoid Vec allocation --- packages/std/src/math/uint512.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index 73a0512f26..73f33d2fae 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -325,9 +325,10 @@ impl Uint512 { impl From for Uint512 { fn from(val: Uint256) -> Self { - let bytes = [[0u8; 32], val.to_be_bytes()].concat(); + let mut bytes = [0u8; 64]; + bytes[32..].copy_from_slice(&val.to_be_bytes()); - Self::from_be_bytes(bytes.try_into().unwrap()) + Self::from_be_bytes(bytes) } } From 189b45fe1f680b92fad974cd073c06afcc5e3286 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 14 Jun 2023 17:06:32 +0200 Subject: [PATCH 0363/2372] Implement left shift for all ints --- packages/std/src/math/uint128.rs | 51 +++++++++++++++++++++++++++++++- packages/std/src/math/uint256.rs | 24 ++++++++++----- packages/std/src/math/uint512.rs | 40 ++++++++++++++++++++++++- packages/std/src/math/uint64.rs | 35 +++++++++++++++++++++- 4 files changed, 139 insertions(+), 11 deletions(-) diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 319ea92525..68061fd998 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -1,6 +1,7 @@ use std::fmt::{self}; use std::ops::{ - Add, AddAssign, Div, DivAssign, Mul, MulAssign, Rem, RemAssign, Shr, ShrAssign, Sub, SubAssign, + Add, AddAssign, Div, DivAssign, Mul, MulAssign, Rem, RemAssign, Shl, ShlAssign, Shr, ShrAssign, + Sub, SubAssign, }; use std::str::FromStr; @@ -197,6 +198,22 @@ impl Uint128 { .ok_or_else(|| DivideByZeroError::new(self)) } + pub fn checked_shr(self, other: u32) -> Result { + if other >= 512 { + return Err(OverflowError::new(OverflowOperation::Shr, self, other)); + } + + Ok(Self(self.0.shr(other))) + } + + pub fn checked_shl(self, other: u32) -> Result { + if other >= 512 { + return Err(OverflowError::new(OverflowOperation::Shl, self, other)); + } + + Ok(Self(self.0.shl(other))) + } + #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_add(self, other: Self) -> Self { @@ -441,6 +458,26 @@ impl<'a> Shr<&'a u32> for Uint128 { } } +impl Shl for Uint128 { + type Output = Self; + + fn shl(self, rhs: u32) -> Self::Output { + Self( + self.u128() + .checked_shl(rhs) + .expect("attempt to shift left with overflow"), + ) + } +} + +impl<'a> Shl<&'a u32> for Uint128 { + type Output = Self; + + fn shl(self, rhs: &'a u32) -> Self::Output { + self.shl(*rhs) + } +} + impl AddAssign for Uint128 { fn add_assign(&mut self, rhs: Uint128) { *self = *self + rhs; @@ -497,6 +534,18 @@ impl<'a> ShrAssign<&'a u32> for Uint128 { } } +impl ShlAssign for Uint128 { + fn shl_assign(&mut self, rhs: u32) { + *self = Shl::::shl(*self, rhs); + } +} + +impl<'a> ShlAssign<&'a u32> for Uint128 { + fn shl_assign(&mut self, rhs: &'a u32) { + *self = Shl::::shl(*self, *rhs); + } +} + impl Serialize for Uint128 { /// Serializes as an integer string using base 10 fn serialize(&self, serializer: S) -> Result diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 201342e387..ef140bbc84 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -3,8 +3,8 @@ use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; use std::fmt; use std::ops::{ - Add, AddAssign, Div, DivAssign, Mul, MulAssign, Rem, RemAssign, Shl, Shr, ShrAssign, Sub, - SubAssign, + Add, AddAssign, Div, DivAssign, Mul, MulAssign, Rem, RemAssign, Shl, ShlAssign, Shr, ShrAssign, + Sub, SubAssign, }; use std::str::FromStr; @@ -575,12 +575,8 @@ impl Shl for Uint256 { type Output = Self; fn shl(self, rhs: u32) -> Self::Output { - self.checked_shl(rhs).unwrap_or_else(|_| { - panic!( - "left shift error: {} is larger or equal than the number of bits in Uint256", - rhs, - ) - }) + self.checked_shl(rhs) + .expect("attempt to shift left with overflow") } } @@ -628,6 +624,18 @@ impl<'a> ShrAssign<&'a u32> for Uint256 { } } +impl ShlAssign for Uint256 { + fn shl_assign(&mut self, rhs: u32) { + *self = self.shl(rhs); + } +} + +impl<'a> ShlAssign<&'a u32> for Uint256 { + fn shl_assign(&mut self, rhs: &'a u32) { + *self = self.shl(*rhs); + } +} + impl Serialize for Uint256 { /// Serializes as an integer string using base 10 fn serialize(&self, serializer: S) -> Result diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index 73a0512f26..36523c9900 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -3,7 +3,8 @@ use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; use std::fmt; use std::ops::{ - Add, AddAssign, Div, DivAssign, Mul, MulAssign, Rem, RemAssign, Shr, ShrAssign, Sub, SubAssign, + Add, AddAssign, Div, DivAssign, Mul, MulAssign, Rem, RemAssign, Shl, ShlAssign, Shr, ShrAssign, + Sub, SubAssign, }; use std::str::FromStr; @@ -262,6 +263,14 @@ impl Uint512 { Ok(Self(self.0.shr(other))) } + pub fn checked_shl(self, other: u32) -> Result { + if other >= 512 { + return Err(OverflowError::new(OverflowOperation::Shl, self, other)); + } + + Ok(Self(self.0.shl(other))) + } + #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_add(self, other: Self) -> Self { @@ -542,6 +551,23 @@ impl<'a> Shr<&'a u32> for Uint512 { } } +impl Shl for Uint512 { + type Output = Self; + + fn shl(self, rhs: u32) -> Self::Output { + self.checked_shl(rhs) + .expect("attempt to shift left with overflow") + } +} + +impl<'a> Shl<&'a u32> for Uint512 { + type Output = Self; + + fn shl(self, rhs: &'a u32) -> Self::Output { + self.shl(*rhs) + } +} + impl AddAssign for Uint512 { fn add_assign(&mut self, rhs: Uint512) { self.0 = self.0.checked_add(rhs.0).unwrap(); @@ -578,6 +604,18 @@ impl<'a> ShrAssign<&'a u32> for Uint512 { } } +impl ShlAssign for Uint512 { + fn shl_assign(&mut self, rhs: u32) { + *self = self.shl(rhs); + } +} + +impl<'a> ShlAssign<&'a u32> for Uint512 { + fn shl_assign(&mut self, rhs: &'a u32) { + *self = self.shl(*rhs); + } +} + impl Serialize for Uint512 { /// Serializes as an integer string using base 10 fn serialize(&self, serializer: S) -> Result diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index e7a50339c0..37b7dcb9c4 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -3,7 +3,8 @@ use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; use std::fmt::{self}; use std::ops::{ - Add, AddAssign, Div, DivAssign, Mul, MulAssign, Rem, RemAssign, Shr, ShrAssign, Sub, SubAssign, + Add, AddAssign, Div, DivAssign, Mul, MulAssign, Rem, RemAssign, Shl, ShlAssign, Shr, ShrAssign, + Sub, SubAssign, }; use crate::errors::{ @@ -412,6 +413,26 @@ impl<'a> Shr<&'a u32> for Uint64 { } } +impl Shl for Uint64 { + type Output = Self; + + fn shl(self, rhs: u32) -> Self::Output { + Self( + self.u64() + .checked_shl(rhs) + .expect("attempt to shift left with overflow"), + ) + } +} + +impl<'a> Shl<&'a u32> for Uint64 { + type Output = Self; + + fn shl(self, rhs: &'a u32) -> Self::Output { + self.shl(*rhs) + } +} + impl AddAssign for Uint64 { fn add_assign(&mut self, rhs: Uint64) { self.0 = self.0.checked_add(rhs.u64()).unwrap(); @@ -448,6 +469,18 @@ impl<'a> ShrAssign<&'a u32> for Uint64 { } } +impl ShlAssign for Uint64 { + fn shl_assign(&mut self, rhs: u32) { + *self = self.shl(rhs); + } +} + +impl<'a> ShlAssign<&'a u32> for Uint64 { + fn shl_assign(&mut self, rhs: &'a u32) { + *self = self.shl(*rhs); + } +} + impl Serialize for Uint64 { /// Serializes as an integer string using base 10 fn serialize(&self, serializer: S) -> Result From 27eead2741bc0f43104cdb3b79a370211e945bbd Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 15 Jun 2023 10:10:58 +0200 Subject: [PATCH 0364/2372] Add backport to mergify config --- .mergify.yml | 44 +++++++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/.mergify.yml b/.mergify.yml index 5be4218397..81c5575894 100644 --- a/.mergify.yml +++ b/.mergify.yml @@ -6,27 +6,49 @@ pull_request_rules: - "#approved-reviews-by>=1" - base=main - label=automerge + - draft=false - label!=WIP - # We need to list them all individually. Here is why: https://doc.mergify.io/conditions.html#validating-all-status-check - - "status-success=ci/circleci: package_crypto" - - "status-success=ci/circleci: package_schema" - - "status-success=ci/circleci: package_std" - - "status-success=ci/circleci: package_storage" - - "status-success=ci/circleci: package_vm" + # We need to list them all individually. Here is why: https://docs.mergify.com/conditions/#validating-all-status-checks + # Also make sure to update this when the CI names change + - "status-success=macOS" + - "status-success=Windows" + - "status-success=ci/circleci: arm64" + - "status-success=ci/circleci: clippy-1.60.0" + - "status-success=ci/circleci: clippy-1.68.2" - "status-success=ci/circleci: contract_burner" - "status-success=ci/circleci: contract_crypto_verify" + - "status-success=ci/circleci: contract_cyberpunk" + - "status-success=ci/circleci: contract_floaty" + - "status-success=ci/circleci: contract_hackatom" - "status-success=ci/circleci: contract_hackatom" - "status-success=ci/circleci: contract_ibc_reflect" - "status-success=ci/circleci: contract_ibc_reflect_send" - - "status-success=ci/circleci: contract_floaty" - "status-success=ci/circleci: contract_queue" - "status-success=ci/circleci: contract_reflect" - "status-success=ci/circleci: contract_staking" + - "status-success=ci/circleci: contract_virus" + - "status-success=ci/circleci: coverage" - "status-success=ci/circleci: fmt" - - "status-success=ci/circleci: clippy-1.54.0" - - "status-success=ci/circleci: clippy-1.58.1" - - "status-success=Windows" - - "status-success=macOS" + - "status-success=ci/circleci: fmt_extra" + - "status-success=ci/circleci: package_check" + - "status-success=ci/circleci: package_crypto" + - "status-success=ci/circleci: package_schema" + - "status-success=ci/circleci: package_schema_derive" + - "status-success=ci/circleci: package_std" + - "status-success=ci/circleci: package_storage" + - "status-success=ci/circleci: package_vm" + - "status-success=ci/circleci: package_vm_windows" actions: merge: method: merge +- name: backport PRs to minor version branch + conditions: + - base=main + - label=backport + actions: + backport: + branches: + # Update this when going to a new minor version + - "1.2" + assignees: + - "{{ author }}" \ No newline at end of file From 07d00f5e5616e2328caa16b3d7145affb16f9eed Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 15 Jun 2023 12:18:15 +0200 Subject: [PATCH 0365/2372] Fix mergify config --- .mergify.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.mergify.yml b/.mergify.yml index 81c5575894..a1d0596643 100644 --- a/.mergify.yml +++ b/.mergify.yml @@ -6,7 +6,7 @@ pull_request_rules: - "#approved-reviews-by>=1" - base=main - label=automerge - - draft=false + - -draft - label!=WIP # We need to list them all individually. Here is why: https://docs.mergify.com/conditions/#validating-all-status-checks # Also make sure to update this when the CI names change @@ -41,7 +41,7 @@ pull_request_rules: actions: merge: method: merge -- name: backport PRs to minor version branch + - name: backport PRs to minor version branch conditions: - base=main - label=backport @@ -51,4 +51,4 @@ pull_request_rules: # Update this when going to a new minor version - "1.2" assignees: - - "{{ author }}" \ No newline at end of file + - "{{ author }}" From b730f4b237a9ebdd076ca0537a2e3c24683f3984 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 15 Jun 2023 12:46:36 +0200 Subject: [PATCH 0366/2372] Add check trait for shift operations --- packages/std/src/math/mod.rs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/std/src/math/mod.rs b/packages/std/src/math/mod.rs index 706d23005d..72e55d9f1d 100644 --- a/packages/std/src/math/mod.rs +++ b/packages/std/src/math/mod.rs @@ -21,7 +21,7 @@ mod tests { use super::*; use std::ops::*; - /// An trait that ensures other traits are implemented for our number types + /// A trait that ensures other traits are implemented for our number types trait AllImpl<'a>: Add + Add<&'a Self> @@ -50,10 +50,28 @@ mod tests { { } + /// A trait that ensures other traits are implemented for our integer types + trait IntImpl<'a>: + AllImpl<'a> + + Shl + + Shl<&'a u32> + + ShlAssign + + ShlAssign<&'a u32> + + Shr + + Shr<&'a u32> + + ShrAssign + + ShrAssign<&'a u32> + { + } + impl AllImpl<'_> for Uint64 {} impl AllImpl<'_> for Uint128 {} impl AllImpl<'_> for Uint256 {} impl AllImpl<'_> for Uint512 {} + impl IntImpl<'_> for Uint64 {} + impl IntImpl<'_> for Uint128 {} + impl IntImpl<'_> for Uint256 {} + impl IntImpl<'_> for Uint512 {} impl AllImpl<'_> for Decimal {} impl AllImpl<'_> for Decimal256 {} } From 5635657f8b7bb16fa6da283b9025dd7cc813e448 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 15 Jun 2023 13:26:41 +0200 Subject: [PATCH 0367/2372] Add test for left and right shifts --- packages/std/src/math/uint128.rs | 38 ++++++++++++++++++++++++++++++++ packages/std/src/math/uint256.rs | 21 ++++++++++++++++++ packages/std/src/math/uint512.rs | 25 +++++++++++++++++++++ packages/std/src/math/uint64.rs | 34 ++++++++++++++++++++++++++++ 4 files changed, 118 insertions(+) diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 68061fd998..207f689173 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -938,6 +938,44 @@ mod tests { ); } + #[test] + fn uint128_shr_works() { + let original = Uint128::new(u128::from_be_bytes([ + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 2u8, 0u8, 4u8, 2u8, + ])); + + let shifted = Uint128::new(u128::from_be_bytes([ + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 128u8, 1u8, 0u8, + ])); + + assert_eq!(original >> 2u32, shifted); + } + + #[test] + #[should_panic] + fn uint128_shr_overflow_panics() { + let _ = Uint128::from(1u32) >> 128u32; + } + + #[test] + fn uint128_shl_works() { + let original = Uint128::new(u128::from_be_bytes([ + 64u8, 128u8, 1u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + ])); + + let shifted = Uint128::new(u128::from_be_bytes([ + 2u8, 0u8, 4u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + ])); + + assert_eq!(original << 2u32, shifted); + } + + #[test] + #[should_panic] + fn uint128_shl_overflow_panics() { + let _ = Uint128::from(1u32) << 128u32; + } + #[test] fn sum_works() { let nums = vec![Uint128(17), Uint128(123), Uint128(540), Uint128(82)]; diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index ef140bbc84..e074be4a45 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -1504,6 +1504,27 @@ mod tests { let _ = Uint256::from(1u32) >> 256u32; } + #[test] + fn uint256_shl_works() { + let original = Uint256::new([ + 64u8, 128u8, 1u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + ]); + + let shifted = Uint256::new([ + 2u8, 0u8, 4u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + ]); + + assert_eq!(original << 2u32, shifted); + } + + #[test] + #[should_panic] + fn uint256_shl_overflow_panics() { + let _ = Uint256::from(1u32) << 256u32; + } + #[test] fn sum_works() { let nums = vec![ diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index 36523c9900..16298531ac 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -1157,6 +1157,31 @@ mod tests { let _ = Uint512::from(1u32) >> 512u32; } + #[test] + fn uint512_shl_works() { + let original = Uint512::new([ + 64u8, 128u8, 1u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + ]); + + let shifted = Uint512::new([ + 2u8, 0u8, 4u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + ]); + + assert_eq!(original << 2u32, shifted); + } + + #[test] + #[should_panic] + fn uint512_shl_overflow_panics() { + let _ = Uint512::from(1u32) << 512u32; + } + #[test] fn sum_works() { let nums = vec![ diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index 37b7dcb9c4..a8bfba170d 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -833,6 +833,40 @@ mod tests { ); } + #[test] + fn uint64_shr_works() { + let original = Uint64::new(u64::from_be_bytes([0u8, 0u8, 0u8, 0u8, 2u8, 0u8, 4u8, 2u8])); + + let shifted = Uint64::new(u64::from_be_bytes([ + 0u8, 0u8, 0u8, 0u8, 0u8, 128u8, 1u8, 0u8, + ])); + + assert_eq!(original >> 2u32, shifted); + } + + #[test] + #[should_panic] + fn uint64_shr_overflow_panics() { + let _ = Uint64::from(1u32) >> 64u32; + } + + #[test] + fn uint64_shl_works() { + let original = Uint64::new(u64::from_be_bytes([ + 64u8, 128u8, 1u8, 0u8, 0u8, 0u8, 0u8, 0u8, + ])); + + let shifted = Uint64::new(u64::from_be_bytes([2u8, 0u8, 4u8, 0u8, 0u8, 0u8, 0u8, 0u8])); + + assert_eq!(original << 2u32, shifted); + } + + #[test] + #[should_panic] + fn uint64_shl_overflow_panics() { + let _ = Uint64::from(1u32) << 64u32; + } + #[test] fn sum_works() { let nums = vec![Uint64(17), Uint64(123), Uint64(540), Uint64(82)]; From a1c24f97c48aaff8fc1dd47b4c2e2f164ed8795c Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 15 Jun 2023 15:37:44 +0200 Subject: [PATCH 0368/2372] Fix checked_shr and checked_shl for Uint128 Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/std/src/math/uint128.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 207f689173..9c58c2cc3b 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -199,7 +199,7 @@ impl Uint128 { } pub fn checked_shr(self, other: u32) -> Result { - if other >= 512 { + if other >= 128 { return Err(OverflowError::new(OverflowOperation::Shr, self, other)); } @@ -207,7 +207,7 @@ impl Uint128 { } pub fn checked_shl(self, other: u32) -> Result { - if other >= 512 { + if other >= 128 { return Err(OverflowError::new(OverflowOperation::Shl, self, other)); } From e42306dd68f43d2f9120cbdf1ee39d53a144cdd0 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 15 Jun 2023 15:50:08 +0200 Subject: [PATCH 0369/2372] Add checked_shl and checked_shr to Uint64 --- packages/std/src/math/uint64.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index a8bfba170d..9afd119647 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -191,6 +191,22 @@ impl Uint64 { .ok_or_else(|| DivideByZeroError::new(self)) } + pub fn checked_shr(self, other: u32) -> Result { + if other >= 64 { + return Err(OverflowError::new(OverflowOperation::Shr, self, other)); + } + + Ok(Self(self.0.shr(other))) + } + + pub fn checked_shl(self, other: u32) -> Result { + if other >= 64 { + return Err(OverflowError::new(OverflowOperation::Shl, self, other)); + } + + Ok(Self(self.0.shl(other))) + } + #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_add(self, other: Self) -> Self { From d237c58e4bdad448407276c13d76758b2b1ad1db Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 15 Jun 2023 16:56:55 +0200 Subject: [PATCH 0370/2372] Add changelog entry --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c7d36929d7..d461d0fbe8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,13 @@ and this project adheres to ## [Unreleased] +## Added + +- cosmwasm-std: Add `<<` and `<<=` implementation for `Uint{64,128,256,512}` + types. ([#1723]) + +[#1723]: https://github.com/CosmWasm/cosmwasm/pull/1723 + ## [1.2.6] - 2023-06-05 ## Changed From 894a8fe71a75613599532e74a629436163b088a4 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 31 May 2023 17:13:40 +0200 Subject: [PATCH 0371/2372] Coin uses same output for Debug as Display --- packages/std/src/coin.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/std/src/coin.rs b/packages/std/src/coin.rs index 289911deef..dcbcd69c8d 100644 --- a/packages/std/src/coin.rs +++ b/packages/std/src/coin.rs @@ -4,7 +4,7 @@ use std::fmt; use crate::math::Uint128; -#[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] +#[derive(Serialize, Deserialize, Clone, Default, PartialEq, Eq, JsonSchema)] pub struct Coin { pub denom: String, pub amount: Uint128, @@ -19,6 +19,12 @@ impl Coin { } } +impl fmt::Debug for Coin { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}{}", self.amount, self.denom) + } +} + impl fmt::Display for Coin { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { // We use the formatting without a space between amount and denom, @@ -166,4 +172,10 @@ mod tests { // less than same type assert!(has_coins(&wallet, &coin(777, "ETH"))); } + + #[test] + fn debug_coin() { + let coin = Coin::new(123, "ucosm"); + assert_eq!(format!("{:?}", coin), "123ucosm"); + } } From 65789e6f365a6c6d22ce749a384dae7e025a05f9 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 31 May 2023 17:17:55 +0200 Subject: [PATCH 0372/2372] Add CHANGELOG entry --- CHANGELOG.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d461d0fbe8..d75a2454bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,9 +13,16 @@ and this project adheres to [#1723]: https://github.com/CosmWasm/cosmwasm/pull/1723 +### Changed + +- cosmwasm-std: Coin uses `123ucosm` format for Debug as well as Display + ([#1704]) + +[#1704]: https://github.com/CosmWasm/cosmwasm/pull/1704 + ## [1.2.6] - 2023-06-05 -## Changed +### Changed - cosmwasm-vm: Bumped module serialization version from v4 to v5 to invalidate potentially corrupted caches caused by Rust update. See From d1aed08f14be092c0736086e40797b53681f6681 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Tue, 6 Jun 2023 19:32:56 +0200 Subject: [PATCH 0373/2372] Changed format as per PR review --- CHANGELOG.md | 2 +- packages/std/src/coin.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d75a2454bb..dea29e226a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,7 @@ and this project adheres to ### Changed -- cosmwasm-std: Coin uses `123ucosm` format for Debug as well as Display +- cosmwasm-std: Coin uses `Coin { 123 "ucosm" }` format for Debug as well as Display ([#1704]) [#1704]: https://github.com/CosmWasm/cosmwasm/pull/1704 diff --git a/packages/std/src/coin.rs b/packages/std/src/coin.rs index dcbcd69c8d..af14644ae5 100644 --- a/packages/std/src/coin.rs +++ b/packages/std/src/coin.rs @@ -21,7 +21,7 @@ impl Coin { impl fmt::Debug for Coin { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}{}", self.amount, self.denom) + write!(f, "Coin {{ {} \"{}\" }}", self.amount, self.denom) } } @@ -176,6 +176,6 @@ mod tests { #[test] fn debug_coin() { let coin = Coin::new(123, "ucosm"); - assert_eq!(format!("{:?}", coin), "123ucosm"); + assert_eq!(format!("{:?}", coin), r#"Coin { 123 "ucosm" }"#); } } From 5895db02eefd70745dd5c054972d123e3162649c Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Tue, 6 Jun 2023 19:35:45 +0200 Subject: [PATCH 0374/2372] Fix CHANGELOG formatting --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dea29e226a..c802eef194 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,7 @@ and this project adheres to ### Changed -- cosmwasm-std: Coin uses `Coin { 123 "ucosm" }` format for Debug as well as Display +- cosmwasm-std: Coin uses shorter `Coin { 123 "ucosm" }` format for Debug ([#1704]) [#1704]: https://github.com/CosmWasm/cosmwasm/pull/1704 From f475bfb1b521d1d43373c020dfc45ea296be0ef0 Mon Sep 17 00:00:00 2001 From: Shane Vitarana Date: Wed, 7 Jun 2023 12:58:04 -0400 Subject: [PATCH 0375/2372] Add bps conversion to Decimal and Decimal256 --- packages/std/src/math/decimal.rs | 11 +++++++++++ packages/std/src/math/decimal256.rs | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 3c3842128c..113be3258a 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -76,6 +76,11 @@ impl Decimal { Self(((x as u128) * 1_000_000_000_000_000).into()) } + /// Convert bps (basis points) into Decimal + pub fn bps(x: u64) -> Self { + Self(((x as u128) * 100_000_000_000_000).into()) + } + /// Creates a decimal from a number of atomic units and the number /// of decimal places. The inputs will be converted internally to form /// a decimal with 18 decimal places. So the input 123 and 2 will create @@ -768,6 +773,12 @@ mod tests { assert_eq!(value.0, Decimal::DECIMAL_FRACTIONAL / Uint128::from(8u8)); } + #[test] + fn decimal_bps() { + let value = Decimal::bps(125); + assert_eq!(value.0, Decimal::DECIMAL_FRACTIONAL / Uint128::from(80u8)); + } + #[test] fn decimal_from_atomics_works() { let one = Decimal::one(); diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index bd6109718a..37371a6c00 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -85,6 +85,11 @@ impl Decimal256 { Self(Uint256::from(x) * Uint256::from(1_000_000_000_000_000u128)) } + /// Convert bps (basis points) into Decimal256 + pub fn bps(x: u64) -> Self { + Self(Uint256::from(x) * Uint256::from(100_000_000_000_000u128)) + } + /// Creates a decimal from a number of atomic units and the number /// of decimal places. The inputs will be converted internally to form /// a decimal with 18 decimal places. So the input 123 and 2 will create @@ -794,6 +799,12 @@ mod tests { assert_eq!(value.0, Decimal256::DECIMAL_FRACTIONAL / Uint256::from(8u8)); } + #[test] + fn decimal256_bps() { + let value = Decimal256::bps(125); + assert_eq!(value.0, Decimal256::DECIMAL_FRACTIONAL / Uint256::from(80u8)); + } + #[test] fn decimal256_from_atomics_works() { let one = Decimal256::one(); From b5a722eb6f757b0debc627389354ea773f681ddd Mon Sep 17 00:00:00 2001 From: Shane Vitarana Date: Wed, 7 Jun 2023 13:08:10 -0400 Subject: [PATCH 0376/2372] Fix formatting --- packages/std/src/math/decimal256.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 37371a6c00..89338ec2dd 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -802,7 +802,10 @@ mod tests { #[test] fn decimal256_bps() { let value = Decimal256::bps(125); - assert_eq!(value.0, Decimal256::DECIMAL_FRACTIONAL / Uint256::from(80u8)); + assert_eq!( + value.0, + Decimal256::DECIMAL_FRACTIONAL / Uint256::from(80u8) + ); } #[test] From 5705a0ace92b8910ea978239a3d678ddf3796117 Mon Sep 17 00:00:00 2001 From: "shane.stars" Date: Wed, 7 Jun 2023 16:53:41 -0400 Subject: [PATCH 0377/2372] Update packages/std/src/math/decimal.rs Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/std/src/math/decimal.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 113be3258a..9e4e3424aa 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -76,7 +76,7 @@ impl Decimal { Self(((x as u128) * 1_000_000_000_000_000).into()) } - /// Convert bps (basis points) into Decimal + /// Convert basis points (x/10000) into Decimal pub fn bps(x: u64) -> Self { Self(((x as u128) * 100_000_000_000_000).into()) } From 77557857e3c5f9f470647166cbd345ab8599ab09 Mon Sep 17 00:00:00 2001 From: "shane.stars" Date: Wed, 7 Jun 2023 16:53:48 -0400 Subject: [PATCH 0378/2372] Update packages/std/src/math/decimal256.rs Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/std/src/math/decimal256.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 89338ec2dd..157e7397b7 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -85,7 +85,7 @@ impl Decimal256 { Self(Uint256::from(x) * Uint256::from(1_000_000_000_000_000u128)) } - /// Convert bps (basis points) into Decimal256 + /// Convert basis points (x/10000) into Decimal256 pub fn bps(x: u64) -> Self { Self(Uint256::from(x) * Uint256::from(100_000_000_000_000u128)) } From 2774732be1a1ea9bb05cef46b08897c802831dd0 Mon Sep 17 00:00:00 2001 From: Shane Vitarana Date: Wed, 7 Jun 2023 17:31:23 -0400 Subject: [PATCH 0379/2372] Update CHANGELOG --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c802eef194..81552226bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,12 +6,15 @@ and this project adheres to ## [Unreleased] -## Added +### Added - cosmwasm-std: Add `<<` and `<<=` implementation for `Uint{64,128,256,512}` types. ([#1723]) +- cosmwasm-std: Add `Decimal::bps` and `Decimal256::bps` to create a decimal + from a basis point value ([#1715]). [#1723]: https://github.com/CosmWasm/cosmwasm/pull/1723 +[#1715]: https://github.com/CosmWasm/cosmwasm/pull/1715 ### Changed From 93c9d08902c4855e59435846d529db235ba1ae31 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 16 Jun 2023 14:28:23 +0200 Subject: [PATCH 0380/2372] Add Timestamp::{plus,minus}_{minutes, hours, days} --- packages/std/src/timestamp.rs | 86 +++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/packages/std/src/timestamp.rs b/packages/std/src/timestamp.rs index a8e4ea8585..61c363e5d7 100644 --- a/packages/std/src/timestamp.rs +++ b/packages/std/src/timestamp.rs @@ -38,6 +38,24 @@ impl Timestamp { Timestamp(Uint64::new(seconds_since_epoch * 1_000_000_000)) } + #[must_use = "this returns the result of the operation, without modifying the original"] + #[inline] + pub const fn plus_days(&self, addition: u64) -> Timestamp { + self.plus_hours(addition * 24) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + #[inline] + pub const fn plus_hours(&self, addition: u64) -> Timestamp { + self.plus_minutes(addition * 60) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + #[inline] + pub const fn plus_minutes(&self, addition: u64) -> Timestamp { + self.plus_seconds(addition * 60) + } + #[must_use = "this returns the result of the operation, without modifying the original"] pub const fn plus_seconds(&self, addition: u64) -> Timestamp { self.plus_nanos(addition * 1_000_000_000) @@ -49,6 +67,24 @@ impl Timestamp { Timestamp(nanos) } + #[must_use = "this returns the result of the operation, without modifying the original"] + #[inline] + pub const fn minus_days(&self, subtrahend: u64) -> Timestamp { + self.minus_hours(subtrahend * 24) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + #[inline] + pub const fn minus_hours(&self, subtrahend: u64) -> Timestamp { + self.minus_minutes(subtrahend * 60) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + #[inline] + pub const fn minus_minutes(&self, subtrahend: u64) -> Timestamp { + self.minus_seconds(subtrahend * 60) + } + #[must_use = "this returns the result of the operation, without modifying the original"] pub const fn minus_seconds(&self, subtrahend: u64) -> Timestamp { self.minus_nanos(subtrahend * 1_000_000_000) @@ -156,6 +192,56 @@ mod tests { let _earlier = Timestamp::from_nanos(100).minus_nanos(101); } + #[test] + fn timestamp_plus_days() { + let ts = Timestamp::from_seconds(123).plus_days(0); + assert_eq!(ts.0.u64(), 123_000_000_000); + let ts = Timestamp::from_seconds(123).plus_days(10); + assert_eq!(ts.0.u64(), 864_123_000_000_000); + } + + #[test] + fn timestamp_minus_days() { + let ts = Timestamp::from_seconds(123).minus_days(0); + assert_eq!(ts.0.u64(), 123_000_000_000); + let ts = Timestamp::from_seconds(2 * 86400 + 123).minus_days(1); + assert_eq!(ts.0.u64(), 86_523_000_000_000); + let ts = Timestamp::from_seconds(86400).minus_days(1); + assert_eq!(ts.0.u64(), 0); + } + + #[test] + fn timestamp_plus_hours() { + let ts = Timestamp::from_seconds(123).plus_hours(0); + assert_eq!(ts.0.u64(), 123_000_000_000); + let ts = Timestamp::from_seconds(123).plus_hours(2); + assert_eq!(ts.0.u64(), 123_000_000_000 + 60 * 60 * 2 * 1_000_000_000); + } + + #[test] + fn timestamp_minus_hours() { + let ts = Timestamp::from_seconds(2 * 60 * 60).minus_hours(0); + assert_eq!(ts.0.u64(), 2 * 60 * 60 * 1_000_000_000); + let ts = Timestamp::from_seconds(2 * 60 * 60 + 123).minus_hours(1); + assert_eq!(ts.0.u64(), 60 * 60 * 1_000_000_000 + 123_000_000_000); + } + + #[test] + fn timestamp_plus_minutes() { + let ts = Timestamp::from_seconds(123).plus_minutes(0); + assert_eq!(ts.0.u64(), 123_000_000_000); + let ts = Timestamp::from_seconds(123).plus_minutes(2); + assert_eq!(ts.0.u64(), 123_000_000_000 + 60 * 2 * 1_000_000_000); + } + + #[test] + fn timestamp_minus_minutes() { + let ts = Timestamp::from_seconds(5 * 60).minus_minutes(0); + assert_eq!(ts.0.u64(), 5 * 60 * 1_000_000_000); + let ts = Timestamp::from_seconds(5 * 60 + 123).minus_minutes(1); + assert_eq!(ts.0.u64(), 4 * 60 * 1_000_000_000 + 123_000_000_000); + } + #[test] fn timestamp_nanos() { let sum = Timestamp::from_nanos(123); From 075194533405e7787740c95f92f29d8a3c763bb8 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 16 Jun 2023 14:36:51 +0200 Subject: [PATCH 0381/2372] Add changelog entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81552226bf..cc3ab23b83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,10 +10,12 @@ and this project adheres to - cosmwasm-std: Add `<<` and `<<=` implementation for `Uint{64,128,256,512}` types. ([#1723]) +- cosmwasm-std: Add `Timestamp::{plus,minus}_{minutes, hours, days}`. ([#1729]) - cosmwasm-std: Add `Decimal::bps` and `Decimal256::bps` to create a decimal from a basis point value ([#1715]). [#1723]: https://github.com/CosmWasm/cosmwasm/pull/1723 +[#1729]: https://github.com/CosmWasm/cosmwasm/pull/1729 [#1715]: https://github.com/CosmWasm/cosmwasm/pull/1715 ### Changed From fec7ca97e5fbcf10d2091786359c331d9c7451ae Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 19 Jun 2023 08:45:30 +0200 Subject: [PATCH 0382/2372] Set version: 1.2.7 --- Cargo.lock | 16 ++++++++-------- contracts/burner/Cargo.lock | 12 ++++++------ contracts/crypto-verify/Cargo.lock | 14 +++++++------- contracts/cyberpunk/Cargo.lock | 14 +++++++------- contracts/floaty/Cargo.lock | 14 +++++++------- contracts/hackatom/Cargo.lock | 14 +++++++------- contracts/ibc-reflect-send/Cargo.lock | 14 +++++++------- contracts/ibc-reflect/Cargo.lock | 14 +++++++------- contracts/queue/Cargo.lock | 12 ++++++------ contracts/reflect/Cargo.lock | 14 +++++++------- contracts/staking/Cargo.lock | 14 +++++++------- contracts/virus/Cargo.lock | 12 ++++++------ packages/check/Cargo.toml | 6 +++--- packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema-derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 6 +++--- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 20 files changed, 99 insertions(+), 99 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 82127650ac..c028d0028e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -285,7 +285,7 @@ dependencies = [ [[package]] name = "cosmwasm-check" -version = "1.2.6" +version = "1.2.7" dependencies = [ "anyhow", "clap 2.34.0", @@ -296,7 +296,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.6" +version = "1.2.7" dependencies = [ "base64", "criterion", @@ -315,7 +315,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.6" +version = "1.2.7" dependencies = [ "cosmwasm-std", "syn", @@ -323,7 +323,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "1.2.6" +version = "1.2.7" dependencies = [ "anyhow", "cosmwasm-schema-derive", @@ -338,7 +338,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.6" +version = "1.2.7" dependencies = [ "proc-macro2", "quote", @@ -347,7 +347,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.6" +version = "1.2.7" dependencies = [ "base64", "chrono", @@ -369,7 +369,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.6" +version = "1.2.7" dependencies = [ "cosmwasm-std", "serde", @@ -377,7 +377,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.6" +version = "1.2.7" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index f63e26daa0..9d00c76f9a 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -174,7 +174,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.6" +version = "1.2.7" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -185,14 +185,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.6" +version = "1.2.7" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.6" +version = "1.2.7" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -203,7 +203,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.6" +version = "1.2.7" dependencies = [ "proc-macro2", "quote", @@ -212,7 +212,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.6" +version = "1.2.7" dependencies = [ "base64", "cosmwasm-crypto", @@ -230,7 +230,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.6" +version = "1.2.7" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index b8c9d3d4ed..70de208acd 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.6" +version = "1.2.7" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.6" +version = "1.2.7" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.6" +version = "1.2.7" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.6" +version = "1.2.7" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.6" +version = "1.2.7" dependencies = [ "base64", "cosmwasm-crypto", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.6" +version = "1.2.7" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.6" +version = "1.2.7" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 8bb18ba5aa..530f7005ea 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.6" +version = "1.2.7" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -203,14 +203,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.6" +version = "1.2.7" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.6" +version = "1.2.7" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -221,7 +221,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.6" +version = "1.2.7" dependencies = [ "proc-macro2", "quote", @@ -230,7 +230,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.6" +version = "1.2.7" dependencies = [ "base64", "cosmwasm-crypto", @@ -248,7 +248,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.6" +version = "1.2.7" dependencies = [ "cosmwasm-std", "serde", @@ -256,7 +256,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.6" +version = "1.2.7" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 36eb594473..32c1428dc9 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.6" +version = "1.2.7" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.6" +version = "1.2.7" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.6" +version = "1.2.7" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.6" +version = "1.2.7" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.6" +version = "1.2.7" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.6" +version = "1.2.7" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.6" +version = "1.2.7" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 226ce03e09..dd9f21a4da 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.6" +version = "1.2.7" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.6" +version = "1.2.7" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.6" +version = "1.2.7" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.6" +version = "1.2.7" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.6" +version = "1.2.7" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.6" +version = "1.2.7" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.6" +version = "1.2.7" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index bbce14b49d..c428c1e7a9 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.6" +version = "1.2.7" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.6" +version = "1.2.7" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.6" +version = "1.2.7" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.6" +version = "1.2.7" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.6" +version = "1.2.7" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.6" +version = "1.2.7" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.6" +version = "1.2.7" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 4029d0861a..bf6645c38d 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.6" +version = "1.2.7" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.6" +version = "1.2.7" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.6" +version = "1.2.7" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.6" +version = "1.2.7" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.6" +version = "1.2.7" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.6" +version = "1.2.7" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.6" +version = "1.2.7" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 0a40946789..82597f4ea7 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.6" +version = "1.2.7" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.6" +version = "1.2.7" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.6" +version = "1.2.7" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.6" +version = "1.2.7" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.6" +version = "1.2.7" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.6" +version = "1.2.7" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index b1249758bd..d462e18fdd 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.6" +version = "1.2.7" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.6" +version = "1.2.7" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.6" +version = "1.2.7" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.6" +version = "1.2.7" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.6" +version = "1.2.7" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.6" +version = "1.2.7" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.6" +version = "1.2.7" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 8480b75873..f63bd2552a 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.6" +version = "1.2.7" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.6" +version = "1.2.7" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.6" +version = "1.2.7" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.6" +version = "1.2.7" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.6" +version = "1.2.7" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.6" +version = "1.2.7" dependencies = [ "cosmwasm-std", "serde", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.6" +version = "1.2.7" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 5100789584..ff161c069d 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.6" +version = "1.2.7" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -174,14 +174,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.6" +version = "1.2.7" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.6" +version = "1.2.7" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.6" +version = "1.2.7" dependencies = [ "proc-macro2", "quote", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.6" +version = "1.2.7" dependencies = [ "base64", "cosmwasm-crypto", @@ -219,7 +219,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.6" +version = "1.2.7" dependencies = [ "bitflags", "bytecheck", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index bcdb3cfb43..9cd05860a7 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-check" -version = "1.2.6" +version = "1.2.7" authors = ["Mauro Lacy "] edition = "2021" description = "A CLI tool for verifying CosmWasm smart contracts" @@ -11,5 +11,5 @@ license = "Apache-2.0" anyhow = "1.0.57" clap = "2" colored = "2" -cosmwasm-vm = { path = "../vm", version = "1.2.6" } -cosmwasm-std = { path = "../std", version = "1.2.6" } +cosmwasm-vm = { path = "../vm", version = "1.2.7" } +cosmwasm-std = { path = "../std", version = "1.2.7" } diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 8b59fbd523..e5e16090a3 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "1.2.6" +version = "1.2.7" authors = ["Mauro Lacy "] edition = "2021" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index 163b1b6f72..c6ab3d563e 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "1.2.6" +version = "1.2.7" authors = ["Simon Warta "] edition = "2021" description = "A package for auto-generated code used for CosmWasm contract development. This is shipped as part of cosmwasm-std. Do not use directly." diff --git a/packages/schema-derive/Cargo.toml b/packages/schema-derive/Cargo.toml index 0bfff7580e..07b76b970d 100644 --- a/packages/schema-derive/Cargo.toml +++ b/packages/schema-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema-derive" -version = "1.2.6" +version = "1.2.7" authors = ["Tomasz Kurcz "] edition = "2021" description = "Derive macros for cosmwasm-schema" diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index 59d708ce58..153beae691 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "1.2.6" +version = "1.2.7" authors = ["Simon Warta ", "Ethan Frey "] edition = "2021" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." @@ -8,7 +8,7 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/schema" license = "Apache-2.0" [dependencies] -cosmwasm-schema-derive = { version = "=1.2.6", path = "../schema-derive" } +cosmwasm-schema-derive = { version = "=1.2.7", path = "../schema-derive" } schemars = "0.8.3" serde = "1.0" serde_json = "1.0.40" @@ -16,6 +16,6 @@ thiserror = "1.0.26" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = { version = "1.2.6", path = "../std" } +cosmwasm-std = { version = "1.2.7", path = "../std" } semver = "1" tempfile = "3" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 8aa895b4d8..d5929f0ee6 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "1.2.6" +version = "1.2.7" authors = ["Ethan Frey "] edition = "2021" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -42,7 +42,7 @@ cosmwasm_1_2 = ["cosmwasm_1_1"] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "1.2.6" } +cosmwasm-derive = { path = "../derive", version = "1.2.7" } derivative = "2" forward_ref = "1" hex = "0.4" @@ -54,7 +54,7 @@ thiserror = "1.0.26" uint = "0.9.3" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "1.2.6" } +cosmwasm-crypto = { path = "../crypto", version = "1.2.7" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 4c09e83214..b5dbbab45a 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "1.2.6" +version = "1.2.7" authors = ["Ethan Frey "] edition = "2021" description = "CosmWasm library with useful helpers for Storage patterns" @@ -16,5 +16,5 @@ iterator = ["cosmwasm-std/iterator"] [dependencies] # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.2.6", default-features = false } +cosmwasm-std = { path = "../std", version = "1.2.7", default-features = false } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 73f1c30b0c..27bef52a5e 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "1.2.6" +version = "1.2.7" authors = ["Ethan Frey "] edition = "2021" description = "VM bindings to run cosmwams contracts" @@ -41,8 +41,8 @@ required-features = ["iterator"] [dependencies] clru = "0.4.0" # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.2.6", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "1.2.6" } +cosmwasm-std = { path = "../std", version = "1.2.7", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "1.2.7" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.3" From c986b26ca7c2569e47e8ddbc3ecd0d0439ebbc08 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 19 Jun 2023 08:46:07 +0200 Subject: [PATCH 0383/2372] Update changelog --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc3ab23b83..d409f023f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ and this project adheres to ## [Unreleased] +## [1.2.7] - 2023-06-19 + ### Added - cosmwasm-std: Add `<<` and `<<=` implementation for `Uint{64,128,256,512}` @@ -1714,7 +1716,8 @@ Some main points: All future Changelog entries will reference this base -[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.6...HEAD +[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.7...HEAD +[1.2.7]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.6...v1.2.7 [1.2.6]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.5...v1.2.6 [1.2.5]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.4...v1.2.5 [1.2.4]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.3...v1.2.4 From 4857fd2bf46b6af79e837f764905535496ce2a1b Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 19 Jun 2023 11:24:33 +0200 Subject: [PATCH 0384/2372] Highlight Sign-extension operations in Gatekeeper --- packages/vm/src/wasm_backend/gatekeeper.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/vm/src/wasm_backend/gatekeeper.rs b/packages/vm/src/wasm_backend/gatekeeper.rs index 897a500beb..0fad6d301c 100644 --- a/packages/vm/src/wasm_backend/gatekeeper.rs +++ b/packages/vm/src/wasm_backend/gatekeeper.rs @@ -199,13 +199,17 @@ impl FunctionMiddleware for FunctionGatekeeper { | Operator::I64Rotl | Operator::I64Rotr | Operator::I32WrapI64 + // Those are part of the MVP + // https://github.com/bytecodealliance/wasm-tools/blob/wasmparser-0.107.0/crates/wasmparser/src/lib.rs#L287-L288 + | Operator::I64ExtendI32S + | Operator::I64ExtendI32U + // Sign-extension + // https://github.com/bytecodealliance/wasm-tools/blob/wasmparser-0.107.0/crates/wasmparser/src/lib.rs#L307-L311 | Operator::I32Extend8S | Operator::I32Extend16S | Operator::I64Extend8S | Operator::I64Extend16S - | Operator::I64ExtendI32S - | Operator::I64Extend32S - | Operator::I64ExtendI32U => { + | Operator::I64Extend32S => { state.push_operator(operator); Ok(()) } From c51affcbc18a18a06b7d99f3a9edcd895374550f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 4 May 2023 15:35:51 +0200 Subject: [PATCH 0385/2372] Add FromStr implementation for Coin, closes #1575 --- packages/std/src/coin.rs | 58 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/packages/std/src/coin.rs b/packages/std/src/coin.rs index af14644ae5..737c8a1c1e 100644 --- a/packages/std/src/coin.rs +++ b/packages/std/src/coin.rs @@ -1,8 +1,8 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use std::fmt; +use std::{fmt, str::FromStr}; -use crate::math::Uint128; +use crate::{math::Uint128, StdError}; #[derive(Serialize, Deserialize, Clone, Default, PartialEq, Eq, JsonSchema)] pub struct Coin { @@ -25,6 +25,25 @@ impl fmt::Debug for Coin { } } +impl FromStr for Coin { + type Err = StdError; + + fn from_str(s: &str) -> Result { + let pos = s + .find(|c: char| !c.is_ascii_digit()) + .ok_or_else(|| StdError::generic_err("Parsing Coin: missing denominator"))?; + let (amount, denom) = s.split_at(pos); + + match amount.parse::() { + Ok(amount) => Ok(Coin { + amount: amount.into(), + denom: denom.to_string(), + }), + Err(e) => Err(StdError::generic_err(format!("Parsing Coin: {}", e))), + } + } +} + impl fmt::Display for Coin { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { // We use the formatting without a space between amount and denom, @@ -178,4 +197,39 @@ mod tests { let coin = Coin::new(123, "ucosm"); assert_eq!(format!("{:?}", coin), r#"Coin { 123 "ucosm" }"#); } + + #[test] + fn parse_coin() { + let expected = Coin::new(123, "ucosm"); + assert_eq!(expected, "123ucosm".parse().unwrap()); + // leading zeroes should be ignored + assert_eq!(expected, "00123ucosm".parse().unwrap()); + // 0 amount parses correctly + assert_eq!(Coin::new(0, "ucosm"), "0ucosm".parse().unwrap()); + // ibc denom should work + let ibc_str = "11111ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2"; + let ibc_coin = Coin::new( + 11111, + "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2", + ); + assert_eq!(ibc_coin, ibc_str.parse().unwrap()); + + // error cases + assert_eq!( + StdError::generic_err("Parsing Coin: missing denominator"), + Coin::from_str("123").unwrap_err() + ); + assert_eq!( + StdError::generic_err("Parsing Coin: cannot parse integer from empty string"), + Coin::from_str("ucosm").unwrap_err() + ); + assert_eq!( + StdError::generic_err("Parsing Coin: cannot parse integer from empty string"), + Coin::from_str("-123ucosm").unwrap_err() + ); + assert_eq!( + StdError::generic_err("Parsing Coin: number too large to fit in target type"), + Coin::from_str("340282366920938463463374607431768211456ucosm").unwrap_err() + ); + } } From 36353db4ca012e91cbef79683f9671b3931e7556 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 4 May 2023 16:12:11 +0200 Subject: [PATCH 0386/2372] Swap expected and actual value in assertions --- packages/std/src/coin.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/std/src/coin.rs b/packages/std/src/coin.rs index 737c8a1c1e..2a6fcf268c 100644 --- a/packages/std/src/coin.rs +++ b/packages/std/src/coin.rs @@ -201,35 +201,35 @@ mod tests { #[test] fn parse_coin() { let expected = Coin::new(123, "ucosm"); - assert_eq!(expected, "123ucosm".parse().unwrap()); + assert_eq!("123ucosm".parse::().unwrap(), expected); // leading zeroes should be ignored - assert_eq!(expected, "00123ucosm".parse().unwrap()); + assert_eq!("00123ucosm".parse::().unwrap(), expected); // 0 amount parses correctly - assert_eq!(Coin::new(0, "ucosm"), "0ucosm".parse().unwrap()); + assert_eq!("0ucosm".parse::().unwrap(), Coin::new(0, "ucosm")); // ibc denom should work let ibc_str = "11111ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2"; let ibc_coin = Coin::new( 11111, "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2", ); - assert_eq!(ibc_coin, ibc_str.parse().unwrap()); + assert_eq!(ibc_str.parse::().unwrap(), ibc_coin); // error cases assert_eq!( - StdError::generic_err("Parsing Coin: missing denominator"), - Coin::from_str("123").unwrap_err() + Coin::from_str("123").unwrap_err(), + StdError::generic_err("Parsing Coin: missing denominator") ); assert_eq!( - StdError::generic_err("Parsing Coin: cannot parse integer from empty string"), - Coin::from_str("ucosm").unwrap_err() + Coin::from_str("ucosm").unwrap_err(), + StdError::generic_err("Parsing Coin: cannot parse integer from empty string") ); assert_eq!( - StdError::generic_err("Parsing Coin: cannot parse integer from empty string"), - Coin::from_str("-123ucosm").unwrap_err() + Coin::from_str("-123ucosm").unwrap_err(), + StdError::generic_err("Parsing Coin: cannot parse integer from empty string") ); assert_eq!( - StdError::generic_err("Parsing Coin: number too large to fit in target type"), - Coin::from_str("340282366920938463463374607431768211456ucosm").unwrap_err() + Coin::from_str("340282366920938463463374607431768211456ucosm").unwrap_err(), + StdError::generic_err("Parsing Coin: number too large to fit in target type") ); } } From 168e0649c6354818c6927056b66042a327ce00f4 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 4 May 2023 17:17:09 +0200 Subject: [PATCH 0387/2372] Add special error type for Coin's FromStr --- packages/std/src/coin.rs | 33 ++++++++++++++-------------- packages/std/src/errors/mod.rs | 2 +- packages/std/src/errors/std_error.rs | 20 +++++++++++++++++ 3 files changed, 37 insertions(+), 18 deletions(-) diff --git a/packages/std/src/coin.rs b/packages/std/src/coin.rs index 2a6fcf268c..1422d65246 100644 --- a/packages/std/src/coin.rs +++ b/packages/std/src/coin.rs @@ -2,7 +2,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use std::{fmt, str::FromStr}; -use crate::{math::Uint128, StdError}; +use crate::{errors::CoinFromStrError, math::Uint128, StdError}; #[derive(Serialize, Deserialize, Clone, Default, PartialEq, Eq, JsonSchema)] pub struct Coin { @@ -26,21 +26,18 @@ impl fmt::Debug for Coin { } impl FromStr for Coin { - type Err = StdError; + type Err = CoinFromStrError; fn from_str(s: &str) -> Result { let pos = s .find(|c: char| !c.is_ascii_digit()) - .ok_or_else(|| StdError::generic_err("Parsing Coin: missing denominator"))?; + .ok_or(CoinFromStrError::MissingDenom)?; let (amount, denom) = s.split_at(pos); - match amount.parse::() { - Ok(amount) => Ok(Coin { - amount: amount.into(), - denom: denom.to_string(), - }), - Err(e) => Err(StdError::generic_err(format!("Parsing Coin: {}", e))), - } + Ok(Coin { + amount: amount.parse::()?.into(), + denom: denom.to_string(), + }) } } @@ -217,19 +214,21 @@ mod tests { // error cases assert_eq!( Coin::from_str("123").unwrap_err(), - StdError::generic_err("Parsing Coin: missing denominator") + CoinFromStrError::MissingDenom ); assert_eq!( - Coin::from_str("ucosm").unwrap_err(), - StdError::generic_err("Parsing Coin: cannot parse integer from empty string") + Coin::from_str("ucosm").unwrap_err().to_string(), + "Invalid amount: cannot parse integer from empty string" ); assert_eq!( - Coin::from_str("-123ucosm").unwrap_err(), - StdError::generic_err("Parsing Coin: cannot parse integer from empty string") + Coin::from_str("-123ucosm").unwrap_err().to_string(), + "Invalid amount: cannot parse integer from empty string" ); assert_eq!( - Coin::from_str("340282366920938463463374607431768211456ucosm").unwrap_err(), - StdError::generic_err("Parsing Coin: number too large to fit in target type") + Coin::from_str("340282366920938463463374607431768211456ucosm") + .unwrap_err() + .to_string(), + "Invalid amount: number too large to fit in target type" ); } } diff --git a/packages/std/src/errors/mod.rs b/packages/std/src/errors/mod.rs index 705382b732..5535479bdf 100644 --- a/packages/std/src/errors/mod.rs +++ b/packages/std/src/errors/mod.rs @@ -6,7 +6,7 @@ mod verification_error; pub use recover_pubkey_error::RecoverPubkeyError; pub use std_error::{ CheckedFromRatioError, CheckedMultiplyFractionError, CheckedMultiplyRatioError, - ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, + CoinFromStrError, ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, RoundUpOverflowError, StdError, StdResult, }; pub use system_error::SystemError; diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index 79b6a82f27..7093167590 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -590,6 +590,26 @@ pub enum CheckedFromRatioError { #[error("Round up operation failed because of overflow")] pub struct RoundUpOverflowError; +#[derive(Error, Debug, PartialEq, Eq)] +pub enum CoinFromStrError { + #[error("Missing denominator")] + MissingDenom, + #[error("Invalid amount: {0}")] + InvalidAmount(std::num::ParseIntError), +} + +impl From for CoinFromStrError { + fn from(value: std::num::ParseIntError) -> Self { + Self::InvalidAmount(value) + } +} + +impl From for StdError { + fn from(value: CoinFromStrError) -> Self { + Self::generic_err(format!("Parsing Coin: {}", value)) + } +} + #[cfg(test)] mod tests { use super::*; From 46cd18ddf426330a9c9169925af1b3fdb69fadd4 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 4 May 2023 17:26:32 +0200 Subject: [PATCH 0388/2372] Fix lint --- packages/std/src/coin.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/coin.rs b/packages/std/src/coin.rs index 1422d65246..f43308d851 100644 --- a/packages/std/src/coin.rs +++ b/packages/std/src/coin.rs @@ -2,7 +2,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use std::{fmt, str::FromStr}; -use crate::{errors::CoinFromStrError, math::Uint128, StdError}; +use crate::{errors::CoinFromStrError, math::Uint128}; #[derive(Serialize, Deserialize, Clone, Default, PartialEq, Eq, JsonSchema)] pub struct Coin { From f4724565eda257f2d7cfd19f6e916ca20f2b84a3 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 5 May 2023 09:38:41 +0200 Subject: [PATCH 0389/2372] Add changelog entry --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d409f023f1..7fc4233029 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ and this project adheres to ## [Unreleased] +### Added + +- cosmwasm-std: Add `FromStr` impl for `Coin`. ([#1684]) + +[#1684]: https://github.com/CosmWasm/cosmwasm/pull/1684 + ## [1.2.7] - 2023-06-19 ### Added From b20b5729f2b3fadedb79c332d058b655447d805e Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 15 May 2023 13:04:01 +0200 Subject: [PATCH 0390/2372] Check for missing amount when parsing Coin --- packages/std/src/coin.rs | 24 ++++++++++++++++++++---- packages/std/src/errors/std_error.rs | 2 ++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/packages/std/src/coin.rs b/packages/std/src/coin.rs index f43308d851..13a74e0f4b 100644 --- a/packages/std/src/coin.rs +++ b/packages/std/src/coin.rs @@ -34,6 +34,10 @@ impl FromStr for Coin { .ok_or(CoinFromStrError::MissingDenom)?; let (amount, denom) = s.split_at(pos); + if amount.is_empty() { + return Err(CoinFromStrError::MissingAmount); + } + Ok(Coin { amount: amount.parse::()?.into(), denom: denom.to_string(), @@ -217,12 +221,24 @@ mod tests { CoinFromStrError::MissingDenom ); assert_eq!( - Coin::from_str("ucosm").unwrap_err().to_string(), - "Invalid amount: cannot parse integer from empty string" + Coin::from_str("ucosm").unwrap_err(), // no amount + CoinFromStrError::MissingAmount + ); + assert_eq!( + Coin::from_str("-123ucosm").unwrap_err(), // negative amount + CoinFromStrError::MissingAmount + ); + assert_eq!( + Coin::from_str("").unwrap_err(), // empty input + CoinFromStrError::MissingDenom + ); + assert_eq!( + Coin::from_str(" 1ucosm").unwrap_err(), // unsupported whitespace + CoinFromStrError::MissingAmount ); assert_eq!( - Coin::from_str("-123ucosm").unwrap_err().to_string(), - "Invalid amount: cannot parse integer from empty string" + Coin::from_str("�1ucosm").unwrap_err(), // other broken data + CoinFromStrError::MissingAmount ); assert_eq!( Coin::from_str("340282366920938463463374607431768211456ucosm") diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index 7093167590..d90171c74c 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -594,6 +594,8 @@ pub struct RoundUpOverflowError; pub enum CoinFromStrError { #[error("Missing denominator")] MissingDenom, + #[error("Missing amount or non-digit characters in amount")] + MissingAmount, #[error("Invalid amount: {0}")] InvalidAmount(std::num::ParseIntError), } From 7c1a8e38ead9eba1fbe36ebc74fc48e0805d956b Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 27 Mar 2023 10:07:26 +0200 Subject: [PATCH 0391/2372] Check table section --- CHANGELOG.md | 6 +++ packages/vm/src/compatibility.rs | 81 +++++++++++++++++++++++++++++++- 2 files changed, 86 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7fc4233029..6531f27641 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,12 @@ and this project adheres to [#1684]: https://github.com/CosmWasm/cosmwasm/pull/1684 +### Changed + +- cosmwasm-vm: Add checks for table section of Wasm blob ([#1631]). + +[#1631]: https://github.com/CosmWasm/cosmwasm/pull/1631 + ## [1.2.7] - 2023-06-19 ### Added diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index c2c9826a9d..20680a450c 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -1,4 +1,4 @@ -use parity_wasm::elements::{External, ImportEntry, Module}; +use parity_wasm::elements::{External, ImportEntry, Module, TableType}; use std::collections::BTreeSet; use std::collections::HashSet; @@ -49,10 +49,25 @@ const SUPPORTED_INTERFACE_VERSIONS: &[&str] = &[ ]; const MEMORY_LIMIT: u32 = 512; // in pages +/// The upper limit for the `max` value of each table. CosmWasm contracts have +/// initial=max for 1 table. See +/// +/// ```plain +/// $ wasm-objdump --section=table -x packages/vm/testdata/hackatom.wasm +/// Section Details: +/// +/// Table[1]: +/// - table[0] type=funcref initial=161 max=161 +/// ``` +/// +/// As of March 2023, on Juno mainnet the largest value for production contracts +/// is 485. Most are between 100 and 300. +const TABLE_SIZE_LIMIT: u32 = 2500; // entries /// Checks if the data is valid wasm and compatibility with the CosmWasm API (imports and exports) pub fn check_wasm(wasm_code: &[u8], available_capabilities: &HashSet) -> VmResult<()> { let module = deserialize_wasm(wasm_code)?; + check_wasm_tables(&module)?; check_wasm_memories(&module)?; check_interface_version(&module)?; check_wasm_exports(&module)?; @@ -61,6 +76,38 @@ pub fn check_wasm(wasm_code: &[u8], available_capabilities: &HashSet) -> Ok(()) } +fn check_wasm_tables(module: &Module) -> VmResult<()> { + let sections: &[TableType] = module + .table_section() + .map_or(&[], |section| section.entries()); + match sections.len() { + 0 => Ok(()), + 1 => { + let limits = sections[0].limits(); + if let Some(maximum) = limits.maximum() { + if limits.initial() > maximum { + return Err(VmError::static_validation_err( + "Wasm contract's first table section has a initial limit > max limit", + )); + } + if maximum > TABLE_SIZE_LIMIT { + return Err(VmError::static_validation_err( + "Wasm contract's first table section has a too large max limit", + )); + } + Ok(()) + } else { + Err(VmError::static_validation_err( + "Wasm contract must not have unbound table section", + )) + } + } + _ => Err(VmError::static_validation_err( + "Wasm contract must not have more than 1 table section", + )), + } +} + fn check_wasm_memories(module: &Module) -> VmResult<()> { let section = match module.memory_section() { Some(section) => section, @@ -252,6 +299,38 @@ mod tests { }; } + #[test] + fn check_wasm_tables_works() { + // No tables is fine + let wasm = wat::parse_str("(module)").unwrap(); + check_wasm_tables(&deserialize_wasm(&wasm).unwrap()).unwrap(); + + // One table (bound) + let wasm = wat::parse_str("(module (table $name 123 123 funcref))").unwrap(); + check_wasm_tables(&deserialize_wasm(&wasm).unwrap()).unwrap(); + + // One table (bound, initial > max) + let wasm = wat::parse_str("(module (table $name 124 123 funcref))").unwrap(); + let err = check_wasm_tables(&deserialize_wasm(&wasm).unwrap()).unwrap_err(); + assert!(err + .to_string() + .contains("Wasm contract's first table section has a initial limit > max limit")); + + // One table (bound, max too large) + let wasm = wat::parse_str("(module (table $name 100 9999 funcref))").unwrap(); + let err = check_wasm_tables(&deserialize_wasm(&wasm).unwrap()).unwrap_err(); + assert!(err + .to_string() + .contains("Wasm contract's first table section has a too large max limit")); + + // One table (unbound) + let wasm = wat::parse_str("(module (table $name 100 funcref))").unwrap(); + let err = check_wasm_tables(&deserialize_wasm(&wasm).unwrap()).unwrap_err(); + assert!(err + .to_string() + .contains("Wasm contract must not have unbound table section")); + } + #[test] fn check_wasm_memories_ok() { let wasm = wat::parse_str("(module (memory 1))").unwrap(); From 9674e424b971808dd8ab05dcab253440ca2ca13d Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 13 Mar 2023 15:53:08 +0100 Subject: [PATCH 0392/2372] Remove unnecessary vector clone --- packages/vm/src/compatibility.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index 20680a450c..af797a3645 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -191,14 +191,14 @@ fn check_wasm_exports(module: &Module) -> VmResult<()> { /// When this is not the case, we either have an incompatibility between contract and VM /// or a error in the contract. fn check_wasm_imports(module: &Module, supported_imports: &[&str]) -> VmResult<()> { - let required_imports: Vec = module + let required_imports: &[ImportEntry] = module .import_section() - .map_or(vec![], |import_section| import_section.entries().to_vec()); + .map_or(&[], |import_section| import_section.entries()); let required_import_names: BTreeSet<_> = required_imports.iter().map(full_import_name).collect(); for required_import in required_imports { - let full_name = full_import_name(&required_import); + let full_name = full_import_name(required_import); if !supported_imports.contains(&full_name.as_str()) { return Err(VmError::static_validation_err(format!( "Wasm contract requires unsupported import: \"{}\". Required imports: {}. Available imports: {:?}.", From a2223f7dcda0e485a2602effa1ca75cce6c36a56 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 13 Mar 2023 16:24:16 +0100 Subject: [PATCH 0393/2372] Only create BTreeSet of names for the error message --- packages/vm/src/compatibility.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index af797a3645..59b3680833 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -194,12 +194,12 @@ fn check_wasm_imports(module: &Module, supported_imports: &[&str]) -> VmResult<( let required_imports: &[ImportEntry] = module .import_section() .map_or(&[], |import_section| import_section.entries()); - let required_import_names: BTreeSet<_> = - required_imports.iter().map(full_import_name).collect(); for required_import in required_imports { let full_name = full_import_name(required_import); if !supported_imports.contains(&full_name.as_str()) { + let required_import_names: BTreeSet<_> = + required_imports.iter().map(full_import_name).collect(); return Err(VmError::static_validation_err(format!( "Wasm contract requires unsupported import: \"{}\". Required imports: {}. Available imports: {:?}.", full_name, required_import_names.to_string_limited(200), supported_imports From cfaace4a5ee4d04fc758c97c697ec1bf8ac2fa23 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 27 Mar 2023 10:55:54 +0200 Subject: [PATCH 0394/2372] Limit number of imports during static validation --- CHANGELOG.md | 2 + packages/vm/src/compatibility.rs | 132 +++++++++++++++++++++++++++++++ 2 files changed, 134 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6531f27641..4c0194f793 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,9 @@ and this project adheres to ### Changed - cosmwasm-vm: Add checks for table section of Wasm blob ([#1631]). +- cosmwasm-vm: Limit number of imports during static validation ([#1629]). +[#1629]: https://github.com/CosmWasm/cosmwasm/pull/1629 [#1631]: https://github.com/CosmWasm/cosmwasm/pull/1631 ## [1.2.7] - 2023-06-19 diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index 59b3680833..428d51554f 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -64,6 +64,12 @@ const MEMORY_LIMIT: u32 = 512; // in pages /// is 485. Most are between 100 and 300. const TABLE_SIZE_LIMIT: u32 = 2500; // entries +/// If the contract has more than this amount of imports, it will be rejected +/// during static validation before even looking into the imports. We keep this +/// number high since failing early gives less detailed error messages. Especially +/// when a user accidentally includes wasm-bindgen, they get a bunch of unsupported imports. +const MAX_IMPORTS: usize = 100; + /// Checks if the data is valid wasm and compatibility with the CosmWasm API (imports and exports) pub fn check_wasm(wasm_code: &[u8], available_capabilities: &HashSet) -> VmResult<()> { let module = deserialize_wasm(wasm_code)?; @@ -195,6 +201,14 @@ fn check_wasm_imports(module: &Module, supported_imports: &[&str]) -> VmResult<( .import_section() .map_or(&[], |import_section| import_section.entries()); + if required_imports.len() > MAX_IMPORTS { + return Err(VmError::static_validation_err(format!( + "Import count exceeds limit. Imports: {}. Limit: {}.", + required_imports.len(), + MAX_IMPORTS + ))); + } + for required_import in required_imports { let full_name = full_import_name(required_import); if !supported_imports.contains(&full_name.as_str()) { @@ -640,6 +654,124 @@ mod tests { check_wasm_imports(&deserialize_wasm(&wasm).unwrap(), SUPPORTED_IMPORTS).unwrap(); } + #[test] + fn check_wasm_imports_exceeds_limit() { + let wasm = wat::parse_str( + r#"(module + (import "env" "db_write" (func (param i32 i32) (result i32))) + (import "env" "db_remove" (func (param i32) (result i32))) + (import "env" "addr_validate" (func (param i32) (result i32))) + (import "env" "addr_canonicalize" (func (param i32 i32) (result i32))) + (import "env" "addr_humanize" (func (param i32 i32) (result i32))) + (import "env" "secp256k1_verify" (func (param i32 i32 i32) (result i32))) + (import "env" "secp256k1_recover_pubkey" (func (param i32 i32 i32) (result i64))) + (import "env" "ed25519_verify" (func (param i32 i32 i32) (result i32))) + (import "env" "ed25519_batch_verify" (func (param i32 i32 i32) (result i32))) + (import "env" "spam01" (func (param i32 i32) (result i32))) + (import "env" "spam02" (func (param i32 i32) (result i32))) + (import "env" "spam03" (func (param i32 i32) (result i32))) + (import "env" "spam04" (func (param i32 i32) (result i32))) + (import "env" "spam05" (func (param i32 i32) (result i32))) + (import "env" "spam06" (func (param i32 i32) (result i32))) + (import "env" "spam07" (func (param i32 i32) (result i32))) + (import "env" "spam08" (func (param i32 i32) (result i32))) + (import "env" "spam09" (func (param i32 i32) (result i32))) + (import "env" "spam10" (func (param i32 i32) (result i32))) + (import "env" "spam11" (func (param i32 i32) (result i32))) + (import "env" "spam12" (func (param i32 i32) (result i32))) + (import "env" "spam13" (func (param i32 i32) (result i32))) + (import "env" "spam14" (func (param i32 i32) (result i32))) + (import "env" "spam15" (func (param i32 i32) (result i32))) + (import "env" "spam16" (func (param i32 i32) (result i32))) + (import "env" "spam17" (func (param i32 i32) (result i32))) + (import "env" "spam18" (func (param i32 i32) (result i32))) + (import "env" "spam19" (func (param i32 i32) (result i32))) + (import "env" "spam20" (func (param i32 i32) (result i32))) + (import "env" "spam21" (func (param i32 i32) (result i32))) + (import "env" "spam22" (func (param i32 i32) (result i32))) + (import "env" "spam23" (func (param i32 i32) (result i32))) + (import "env" "spam24" (func (param i32 i32) (result i32))) + (import "env" "spam25" (func (param i32 i32) (result i32))) + (import "env" "spam26" (func (param i32 i32) (result i32))) + (import "env" "spam27" (func (param i32 i32) (result i32))) + (import "env" "spam28" (func (param i32 i32) (result i32))) + (import "env" "spam29" (func (param i32 i32) (result i32))) + (import "env" "spam30" (func (param i32 i32) (result i32))) + (import "env" "spam31" (func (param i32 i32) (result i32))) + (import "env" "spam32" (func (param i32 i32) (result i32))) + (import "env" "spam33" (func (param i32 i32) (result i32))) + (import "env" "spam34" (func (param i32 i32) (result i32))) + (import "env" "spam35" (func (param i32 i32) (result i32))) + (import "env" "spam36" (func (param i32 i32) (result i32))) + (import "env" "spam37" (func (param i32 i32) (result i32))) + (import "env" "spam38" (func (param i32 i32) (result i32))) + (import "env" "spam39" (func (param i32 i32) (result i32))) + (import "env" "spam40" (func (param i32 i32) (result i32))) + (import "env" "spam41" (func (param i32 i32) (result i32))) + (import "env" "spam42" (func (param i32 i32) (result i32))) + (import "env" "spam43" (func (param i32 i32) (result i32))) + (import "env" "spam44" (func (param i32 i32) (result i32))) + (import "env" "spam45" (func (param i32 i32) (result i32))) + (import "env" "spam46" (func (param i32 i32) (result i32))) + (import "env" "spam47" (func (param i32 i32) (result i32))) + (import "env" "spam48" (func (param i32 i32) (result i32))) + (import "env" "spam49" (func (param i32 i32) (result i32))) + (import "env" "spam50" (func (param i32 i32) (result i32))) + (import "env" "spam51" (func (param i32 i32) (result i32))) + (import "env" "spam52" (func (param i32 i32) (result i32))) + (import "env" "spam53" (func (param i32 i32) (result i32))) + (import "env" "spam54" (func (param i32 i32) (result i32))) + (import "env" "spam55" (func (param i32 i32) (result i32))) + (import "env" "spam56" (func (param i32 i32) (result i32))) + (import "env" "spam57" (func (param i32 i32) (result i32))) + (import "env" "spam58" (func (param i32 i32) (result i32))) + (import "env" "spam59" (func (param i32 i32) (result i32))) + (import "env" "spam60" (func (param i32 i32) (result i32))) + (import "env" "spam61" (func (param i32 i32) (result i32))) + (import "env" "spam62" (func (param i32 i32) (result i32))) + (import "env" "spam63" (func (param i32 i32) (result i32))) + (import "env" "spam64" (func (param i32 i32) (result i32))) + (import "env" "spam65" (func (param i32 i32) (result i32))) + (import "env" "spam66" (func (param i32 i32) (result i32))) + (import "env" "spam67" (func (param i32 i32) (result i32))) + (import "env" "spam68" (func (param i32 i32) (result i32))) + (import "env" "spam69" (func (param i32 i32) (result i32))) + (import "env" "spam70" (func (param i32 i32) (result i32))) + (import "env" "spam71" (func (param i32 i32) (result i32))) + (import "env" "spam72" (func (param i32 i32) (result i32))) + (import "env" "spam73" (func (param i32 i32) (result i32))) + (import "env" "spam74" (func (param i32 i32) (result i32))) + (import "env" "spam75" (func (param i32 i32) (result i32))) + (import "env" "spam76" (func (param i32 i32) (result i32))) + (import "env" "spam77" (func (param i32 i32) (result i32))) + (import "env" "spam78" (func (param i32 i32) (result i32))) + (import "env" "spam79" (func (param i32 i32) (result i32))) + (import "env" "spam80" (func (param i32 i32) (result i32))) + (import "env" "spam81" (func (param i32 i32) (result i32))) + (import "env" "spam82" (func (param i32 i32) (result i32))) + (import "env" "spam83" (func (param i32 i32) (result i32))) + (import "env" "spam84" (func (param i32 i32) (result i32))) + (import "env" "spam85" (func (param i32 i32) (result i32))) + (import "env" "spam86" (func (param i32 i32) (result i32))) + (import "env" "spam87" (func (param i32 i32) (result i32))) + (import "env" "spam88" (func (param i32 i32) (result i32))) + (import "env" "spam89" (func (param i32 i32) (result i32))) + (import "env" "spam90" (func (param i32 i32) (result i32))) + (import "env" "spam91" (func (param i32 i32) (result i32))) + (import "env" "spam92" (func (param i32 i32) (result i32))) + )"#, + ) + .unwrap(); + let err = + check_wasm_imports(&deserialize_wasm(&wasm).unwrap(), SUPPORTED_IMPORTS).unwrap_err(); + match err { + VmError::StaticValidationErr { msg, .. } => { + assert_eq!(msg, "Import count exceeds limit. Imports: 101. Limit: 100."); + } + err => panic!("Unexpected error: {:?}", err), + } + } + #[test] fn check_wasm_imports_missing() { let wasm = wat::parse_str( From 3fcc93c7ea08b49aedb019b30c30ba2b0183c1cf Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 13 Mar 2023 17:12:25 +0100 Subject: [PATCH 0395/2372] Upgrade parity-wasm to 0.45 --- Cargo.lock | 4 ++-- contracts/burner/Cargo.lock | 4 ++-- contracts/crypto-verify/Cargo.lock | 4 ++-- contracts/cyberpunk/Cargo.lock | 4 ++-- contracts/floaty/Cargo.lock | 4 ++-- contracts/hackatom/Cargo.lock | 4 ++-- contracts/ibc-reflect-send/Cargo.lock | 4 ++-- contracts/ibc-reflect/Cargo.lock | 4 ++-- contracts/queue/Cargo.lock | 4 ++-- contracts/reflect/Cargo.lock | 4 ++-- contracts/staking/Cargo.lock | 4 ++-- contracts/virus/Cargo.lock | 4 ++-- packages/vm/Cargo.toml | 2 +- 13 files changed, 25 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c028d0028e..bbc3a1f345 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1190,9 +1190,9 @@ checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" [[package]] name = "parity-wasm" -version = "0.42.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "pin-project-lite" diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 9d00c76f9a..726d32115b 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -949,9 +949,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-wasm" -version = "0.42.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "pin-project-lite" diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 70de208acd..7ced541619 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -981,9 +981,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-wasm" -version = "0.42.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "pin-project-lite" diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 530f7005ea..c10bb0412f 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -987,9 +987,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-wasm" -version = "0.42.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "pin-project-lite" diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 32c1428dc9..2f5fe32196 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -959,9 +959,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-wasm" -version = "0.42.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "pin-project-lite" diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index dd9f21a4da..b1bee4142d 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -960,9 +960,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-wasm" -version = "0.42.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "pin-project-lite" diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index c428c1e7a9..a069555798 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -958,9 +958,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-wasm" -version = "0.42.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "pin-project-lite" diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index bf6645c38d..cfd912df70 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -958,9 +958,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-wasm" -version = "0.42.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "pin-project-lite" diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 82597f4ea7..8238a459c4 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -938,9 +938,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-wasm" -version = "0.42.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "pin-project-lite" diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index d462e18fdd..5e89494fe9 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -946,9 +946,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-wasm" -version = "0.42.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "pin-project-lite" diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index f63bd2552a..fa28642a97 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -952,9 +952,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-wasm" -version = "0.42.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "pin-project-lite" diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index ff161c069d..59c4ff9e65 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -938,9 +938,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-wasm" -version = "0.42.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "pin-project-lite" diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 27bef52a5e..bc603c67ef 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -44,7 +44,7 @@ clru = "0.4.0" cosmwasm-std = { path = "../std", version = "1.2.7", default-features = false } cosmwasm-crypto = { path = "../crypto", version = "1.2.7" } hex = "0.4" -parity-wasm = "0.42" +parity-wasm = "0.45" schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } serde_json = "1.0.40" From e59738ae6e20e2ea583624ad0b13a0799f911ac5 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 19 Apr 2023 14:25:41 +0200 Subject: [PATCH 0396/2372] Add target_id --- Cargo.lock | 2 + contracts/burner/Cargo.lock | 5 ++- contracts/crypto-verify/Cargo.lock | 5 ++- contracts/cyberpunk/Cargo.lock | 5 ++- contracts/floaty/Cargo.lock | 5 ++- contracts/hackatom/Cargo.lock | 5 ++- contracts/ibc-reflect-send/Cargo.lock | 5 ++- contracts/ibc-reflect/Cargo.lock | 5 ++- contracts/queue/Cargo.lock | 5 ++- contracts/reflect/Cargo.lock | 5 ++- contracts/staking/Cargo.lock | 5 ++- contracts/virus/Cargo.lock | 5 ++- packages/vm/Cargo.toml | 2 + packages/vm/src/modules/file_system_cache.rs | 39 +++++++++++++++++++- 14 files changed, 75 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bbc3a1f345..bcd5ec7a04 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -385,6 +385,7 @@ dependencies = [ "clru", "cosmwasm-crypto", "cosmwasm-std", + "crc32fast", "criterion", "enumset", "hex", @@ -397,6 +398,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.3", + "target-lexicon", "tempfile", "thiserror", "wasmer", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 726d32115b..ffc5bc3faf 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -237,6 +237,7 @@ dependencies = [ "clru", "cosmwasm-crypto", "cosmwasm-std", + "crc32fast", "enumset", "hex", "loupe", @@ -329,9 +330,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 7ced541619..525807cef8 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -240,6 +240,7 @@ dependencies = [ "clru", "cosmwasm-crypto", "cosmwasm-std", + "crc32fast", "enumset", "hex", "loupe", @@ -332,9 +333,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index c10bb0412f..b254a657ac 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -263,6 +263,7 @@ dependencies = [ "clru", "cosmwasm-crypto", "cosmwasm-std", + "crc32fast", "enumset", "hex", "loupe", @@ -355,9 +356,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 2f5fe32196..7903f0555d 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -234,6 +234,7 @@ dependencies = [ "clru", "cosmwasm-crypto", "cosmwasm-std", + "crc32fast", "enumset", "hex", "loupe", @@ -326,9 +327,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index b1bee4142d..77eb0d0e6d 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -234,6 +234,7 @@ dependencies = [ "clru", "cosmwasm-crypto", "cosmwasm-std", + "crc32fast", "enumset", "hex", "loupe", @@ -326,9 +327,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index a069555798..68f519d999 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -234,6 +234,7 @@ dependencies = [ "clru", "cosmwasm-crypto", "cosmwasm-std", + "crc32fast", "enumset", "hex", "loupe", @@ -326,9 +327,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index cfd912df70..06dcdd37bc 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -234,6 +234,7 @@ dependencies = [ "clru", "cosmwasm-crypto", "cosmwasm-std", + "crc32fast", "enumset", "hex", "loupe", @@ -326,9 +327,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 8238a459c4..ec0086d567 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -226,6 +226,7 @@ dependencies = [ "clru", "cosmwasm-crypto", "cosmwasm-std", + "crc32fast", "enumset", "hex", "loupe", @@ -318,9 +319,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 5e89494fe9..90a729bb0d 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -234,6 +234,7 @@ dependencies = [ "clru", "cosmwasm-crypto", "cosmwasm-std", + "crc32fast", "enumset", "hex", "loupe", @@ -326,9 +327,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index fa28642a97..7d8e834d27 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -234,6 +234,7 @@ dependencies = [ "clru", "cosmwasm-crypto", "cosmwasm-std", + "crc32fast", "enumset", "hex", "loupe", @@ -326,9 +327,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 59c4ff9e65..a55dc46412 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -226,6 +226,7 @@ dependencies = [ "clru", "cosmwasm-crypto", "cosmwasm-std", + "crc32fast", "enumset", "hex", "loupe", @@ -318,9 +319,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index bc603c67ef..2a478be0dd 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -40,6 +40,7 @@ required-features = ["iterator"] [dependencies] clru = "0.4.0" +crc32fast = "1.3.2" # Uses the path when built locally; uses the given version from crates.io when published cosmwasm-std = { path = "../std", version = "1.2.7", default-features = false } cosmwasm-crypto = { path = "../crypto", version = "1.2.7" } @@ -74,6 +75,7 @@ wat = "1.0" clap = "2.33.3" rand = "0.8" leb128 = "0.2" +target-lexicon = "0.12" [[bench]] name = "main" diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index e5041a9900..2333d0f04c 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -1,9 +1,10 @@ use std::fs; +use std::hash::Hash; use std::io; use std::path::PathBuf; use thiserror::Error; -use wasmer::{DeserializeError, Module, Store}; +use wasmer::{DeserializeError, Module, Store, Target}; use crate::checksum::Checksum; use crate::errors::{VmError, VmResult}; @@ -168,6 +169,18 @@ impl FileSystemCache { } } +/// Creates an identifier for the Wasmer `Target` that is used for +/// cache invalidation. The output is reasonable human friendly to be useable +/// in file path component. +#[allow(unused)] +fn target_id(target: &Target) -> String { + // Use a custom Hasher implementation to avoid randomization. + let mut deterministic_hasher = crc32fast::Hasher::new(); + target.hash(&mut deterministic_hasher); + let hash = deterministic_hasher.finalize(); + format!("{}-{:08X}", target.triple(), hash) // print 4 byte hash as 8 hex characters +} + #[cfg(test)] mod tests { use std::fs; @@ -276,4 +289,28 @@ mod tests { let existed = cache.remove(&checksum).unwrap(); assert!(!existed); } + + #[test] + fn target_id_works() { + let triple = wasmer::Triple { + architecture: wasmer::Architecture::X86_64, + vendor: target_lexicon::Vendor::Nintendo, + operating_system: target_lexicon::OperatingSystem::Fuchsia, + environment: target_lexicon::Environment::Gnu, + binary_format: target_lexicon::BinaryFormat::Coff, + }; + let target = Target::new(triple.clone(), wasmer::CpuFeature::POPCNT.into()); + let id = target_id(&target); + assert_eq!(id, "x86_64-nintendo-fuchsia-gnu-coff-4721E3F4"); + // Changing CPU features changes the hash part + let target = Target::new(triple, wasmer::CpuFeature::AVX512DQ.into()); + let id = target_id(&target); + assert_eq!(id, "x86_64-nintendo-fuchsia-gnu-coff-D5C8034F"); + + // Works for durrect target (hashing is deterministic); + let target = Target::default(); + let id1 = target_id(&target); + let id2 = target_id(&target); + assert_eq!(id1, id2); + } } From 64dbc734541d4a01d40128dad5c162eded3990aa Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 19 Apr 2023 14:53:45 +0200 Subject: [PATCH 0397/2372] Add target_id to modules path --- Cargo.lock | 7 ++ packages/vm/Cargo.toml | 1 + packages/vm/src/modules/file_system_cache.rs | 88 ++++++++++++-------- 3 files changed, 62 insertions(+), 34 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bcd5ec7a04..2a7dafafed 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -388,6 +388,7 @@ dependencies = [ "crc32fast", "criterion", "enumset", + "glob", "hex", "hex-literal", "leb128", @@ -892,6 +893,12 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + [[package]] name = "group" version = "0.12.0" diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 2a478be0dd..59817c55dd 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -69,6 +69,7 @@ bitflags = "1.1.0" # https://github.com/CensoredUsername/dynasm-rs/pull/74 [dev-dependencies] criterion = { version = "0.4", features = [ "html_reports" ] } +glob = "0.3.1" hex-literal = "0.3.1" tempfile = "3.1.0" wat = "1.0" diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 2333d0f04c..10d65dadd3 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -1,7 +1,7 @@ use std::fs; use std::hash::Hash; use std::io; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; use thiserror::Error; use wasmer::{DeserializeError, Module, Store, Target}; @@ -48,10 +48,7 @@ const MODULE_SERIALIZATION_VERSION: &str = "v5"; /// Representation of a directory that contains compiled Wasm artifacts. pub struct FileSystemCache { - /// The base path this cache operates in. Within this path, versioned directories are created. - /// A sophisticated version of this cache might be able to read multiple input versions in the future. - base_path: PathBuf, - wasmer_module_version: u32, + modules_path: PathBuf, } /// An error type that hides system specific error information @@ -76,19 +73,20 @@ impl FileSystemCache { /// /// This method is unsafe because there's no way to ensure the artifacts /// stored in this cache haven't been corrupted or tampered with. - pub unsafe fn new(path: impl Into) -> Result { - let wasmer_module_version = current_wasmer_module_version(); - - let path: PathBuf = path.into(); - if path.exists() { - let metadata = path + pub unsafe fn new(base_path: impl Into) -> Result { + let base_path: PathBuf = base_path.into(); + if base_path.exists() { + let metadata = base_path .metadata() .map_err(|_e| NewFileSystemCacheError::CouldntGetMetadata)?; if metadata.is_dir() { if !metadata.permissions().readonly() { Ok(Self { - base_path: path, - wasmer_module_version, + modules_path: modules_path( + &base_path, + current_wasmer_module_version(), + &Target::default(), + ), }) } else { Err(NewFileSystemCacheError::ReadonlyPath) @@ -98,10 +96,13 @@ impl FileSystemCache { } } else { // Create the directory and any parent directories if they don't yet exist. - mkdir_p(&path).map_err(|_e| NewFileSystemCacheError::CouldntCreatePath)?; + mkdir_p(&base_path).map_err(|_e| NewFileSystemCacheError::CouldntCreatePath)?; Ok(Self { - base_path: path, - wasmer_module_version, + modules_path: modules_path( + &base_path, + current_wasmer_module_version(), + &Target::default(), + ), }) } } @@ -110,7 +111,7 @@ impl FileSystemCache { /// along with the size of the serialized module. pub fn load(&self, checksum: &Checksum, store: &Store) -> VmResult> { let filename = checksum.to_hex(); - let file_path = self.latest_modules_path().join(filename); + let file_path = self.modules_path.join(filename); let result = unsafe { Module::deserialize_from_file(store, file_path) }; match result { @@ -131,12 +132,11 @@ impl FileSystemCache { /// Stores a serialized module to the file system. Returns the size of the serialized module. pub fn store(&mut self, checksum: &Checksum, module: &Module) -> VmResult<()> { - let modules_dir = self.latest_modules_path(); - mkdir_p(&modules_dir) + mkdir_p(&self.modules_path) .map_err(|_e| VmError::cache_err("Error creating modules directory"))?; let filename = checksum.to_hex(); - let path = modules_dir.join(filename); + let path = self.modules_path.join(filename); module .serialize_to_file(path) .map_err(|e| VmError::cache_err(format!("Error writing module to disk: {}", e)))?; @@ -148,7 +148,7 @@ impl FileSystemCache { /// Returns true if the file existed and false if the file did not exist. pub fn remove(&mut self, checksum: &Checksum) -> VmResult { let filename = checksum.to_hex(); - let file_path = self.latest_modules_path().join(filename); + let file_path = self.modules_path.join(filename); if file_path.exists() { fs::remove_file(file_path) @@ -158,21 +158,11 @@ impl FileSystemCache { Ok(false) } } - - /// The path to the latest version of the modules. - fn latest_modules_path(&self) -> PathBuf { - let version = format!( - "{}-wasmer{}", - MODULE_SERIALIZATION_VERSION, self.wasmer_module_version - ); - self.base_path.join(version) - } } /// Creates an identifier for the Wasmer `Target` that is used for /// cache invalidation. The output is reasonable human friendly to be useable /// in file path component. -#[allow(unused)] fn target_id(target: &Target) -> String { // Use a custom Hasher implementation to avoid randomization. let mut deterministic_hasher = crc32fast::Hasher::new(); @@ -181,6 +171,16 @@ fn target_id(target: &Target) -> String { format!("{}-{:08X}", target.triple(), hash) // print 4 byte hash as 8 hex characters } +/// The path to the latest version of the modules. +fn modules_path(base_path: &Path, wasmer_module_version: u32, target: &Target) -> PathBuf { + let version_dir = format!( + "{}-wasmer{}", + MODULE_SERIALIZATION_VERSION, wasmer_module_version + ); + let target_dir = target_id(target); + base_path.join(version_dir).join(target_dir) +} + #[cfg(test)] mod tests { use std::fs; @@ -252,11 +252,13 @@ mod tests { let module = compile(&wasm, None, &[]).unwrap(); cache.store(&checksum, &module).unwrap(); - let file_path = format!( - "{}/v5-wasmer1/{}", + let mut globber = glob::glob(&format!( + "{}/v5-wasmer1/**/{}", tmp_dir.path().to_string_lossy(), checksum - ); + )) + .expect("Failed to read glob pattern"); + let file_path = globber.next().unwrap().unwrap(); let _serialized_module = fs::read(file_path).unwrap(); } @@ -313,4 +315,22 @@ mod tests { let id2 = target_id(&target); assert_eq!(id1, id2); } + + #[test] + fn modules_path_works() { + let base = PathBuf::from("./modules/"); + let triple = wasmer::Triple { + architecture: wasmer::Architecture::X86_64, + vendor: target_lexicon::Vendor::Nintendo, + operating_system: target_lexicon::OperatingSystem::Fuchsia, + environment: target_lexicon::Environment::Gnu, + binary_format: target_lexicon::BinaryFormat::Coff, + }; + let target = Target::new(triple, wasmer::CpuFeature::POPCNT.into()); + let p = modules_path(&base, 17, &target); + assert_eq!( + p.as_os_str(), + "./modules/v5-wasmer17/x86_64-nintendo-fuchsia-gnu-coff-4721E3F4" + ); + } } From 7100cabb54db14bb6645b02b67c985be31299317 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 19 Apr 2023 15:19:14 +0200 Subject: [PATCH 0398/2372] Make modules_path_works test Windows complient --- packages/vm/src/modules/file_system_cache.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 10d65dadd3..0525244d59 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -318,7 +318,7 @@ mod tests { #[test] fn modules_path_works() { - let base = PathBuf::from("./modules/"); + let base = PathBuf::from("modules"); let triple = wasmer::Triple { architecture: wasmer::Architecture::X86_64, vendor: target_lexicon::Vendor::Nintendo, @@ -330,7 +330,11 @@ mod tests { let p = modules_path(&base, 17, &target); assert_eq!( p.as_os_str(), - "./modules/v5-wasmer17/x86_64-nintendo-fuchsia-gnu-coff-4721E3F4" + if cfg!(windows) { + "modules\\v5-wasmer17\\x86_64-nintendo-fuchsia-gnu-coff-4721E3F4" + } else { + "modules/v5-wasmer17/x86_64-nintendo-fuchsia-gnu-coff-4721E3F4" + } ); } } From 1e4ff27cd06725b2534c5d6b656ec9ae8ea4d276 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 20 Apr 2023 17:10:40 +0200 Subject: [PATCH 0399/2372] Refactor FileSystemCache::new to only have one ending --- packages/vm/src/modules/file_system_cache.rs | 34 ++++++++------------ 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 0525244d59..8f592b7ff0 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -79,32 +79,24 @@ impl FileSystemCache { let metadata = base_path .metadata() .map_err(|_e| NewFileSystemCacheError::CouldntGetMetadata)?; - if metadata.is_dir() { - if !metadata.permissions().readonly() { - Ok(Self { - modules_path: modules_path( - &base_path, - current_wasmer_module_version(), - &Target::default(), - ), - }) - } else { - Err(NewFileSystemCacheError::ReadonlyPath) - } - } else { - Err(NewFileSystemCacheError::ExistsButNoDirectory) + if !metadata.is_dir() { + return Err(NewFileSystemCacheError::ExistsButNoDirectory); + } + if metadata.permissions().readonly() { + return Err(NewFileSystemCacheError::ReadonlyPath); } } else { // Create the directory and any parent directories if they don't yet exist. mkdir_p(&base_path).map_err(|_e| NewFileSystemCacheError::CouldntCreatePath)?; - Ok(Self { - modules_path: modules_path( - &base_path, - current_wasmer_module_version(), - &Target::default(), - ), - }) } + + Ok(Self { + modules_path: modules_path( + &base_path, + current_wasmer_module_version(), + &Target::default(), + ), + }) } /// Loads a serialized module from the file system and returns a module (i.e. artifact + store), From fdae0a2e75b3b6b4fa1151f7762f031d5026844f Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 24 Apr 2023 17:19:22 +0200 Subject: [PATCH 0400/2372] Add CHANGELOG entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c0194f793..139f29681f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,9 +16,13 @@ and this project adheres to - cosmwasm-vm: Add checks for table section of Wasm blob ([#1631]). - cosmwasm-vm: Limit number of imports during static validation ([#1629]). +- cosmwasm-vm: Add target (triple + CPU features) into the module cache + directory to avoid using modules compiled for a different system. Bump + `MODULE_SERIALIZATION_VERSION` to "v5". ([#1664]) [#1629]: https://github.com/CosmWasm/cosmwasm/pull/1629 [#1631]: https://github.com/CosmWasm/cosmwasm/pull/1631 +[#1664]: https://github.com/CosmWasm/cosmwasm/pull/1664 ## [1.2.7] - 2023-06-19 From d3430657283463ccaf370e9728fa7e132ceef7f1 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 24 Apr 2023 17:41:30 +0200 Subject: [PATCH 0401/2372] Bump MODULE_SERIALIZATION_VERSION to v6 --- CHANGELOG.md | 2 +- packages/vm/src/modules/file_system_cache.rs | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 139f29681f..fa06ce961b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,7 @@ and this project adheres to - cosmwasm-vm: Limit number of imports during static validation ([#1629]). - cosmwasm-vm: Add target (triple + CPU features) into the module cache directory to avoid using modules compiled for a different system. Bump - `MODULE_SERIALIZATION_VERSION` to "v5". ([#1664]) + `MODULE_SERIALIZATION_VERSION` to "v6". ([#1664]) [#1629]: https://github.com/CosmWasm/cosmwasm/pull/1629 [#1631]: https://github.com/CosmWasm/cosmwasm/pull/1631 diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 8f592b7ff0..a78b5661a3 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -44,7 +44,9 @@ use crate::modules::current_wasmer_module_version; /// A change in memory layout of some types in Rust [std] caused /// [issues with module deserialization](https://github.com/CosmWasm/wasmvm/issues/426). /// To work around this, the version was bumped to "v5" here to invalidate these corrupt caches. -const MODULE_SERIALIZATION_VERSION: &str = "v5"; +/// - **v6**:
+/// Version for cosmwasm_vm 1.3+ which adds a sub-folder with the target identier for the modules. +const MODULE_SERIALIZATION_VERSION: &str = "v6"; /// Representation of a directory that contains compiled Wasm artifacts. pub struct FileSystemCache { @@ -245,7 +247,7 @@ mod tests { cache.store(&checksum, &module).unwrap(); let mut globber = glob::glob(&format!( - "{}/v5-wasmer1/**/{}", + "{}/v6-wasmer1/**/{}", tmp_dir.path().to_string_lossy(), checksum )) @@ -323,9 +325,9 @@ mod tests { assert_eq!( p.as_os_str(), if cfg!(windows) { - "modules\\v5-wasmer17\\x86_64-nintendo-fuchsia-gnu-coff-4721E3F4" + "modules\\v6-wasmer17\\x86_64-nintendo-fuchsia-gnu-coff-4721E3F4" } else { - "modules/v5-wasmer17/x86_64-nintendo-fuchsia-gnu-coff-4721E3F4" + "modules/v6-wasmer17/x86_64-nintendo-fuchsia-gnu-coff-4721E3F4" } ); } From 3abd3c4ee25ec81c29a620df6637d436fd696c65 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 5 May 2023 10:19:31 +0200 Subject: [PATCH 0402/2372] Add .wasm file extension to wasm files, fixes #1665 --- packages/vm/src/cache.rs | 55 +++++++++++++++++++++++++++++++++++----- 1 file changed, 49 insertions(+), 6 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 36c18a6ad1..43f580cdc5 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -364,7 +364,7 @@ fn save_wasm_to_disk(dir: impl Into, wasm: &[u8]) -> VmResult // calculate filename let checksum = Checksum::generate(wasm); let filename = checksum.to_hex(); - let filepath = dir.into().join(filename); + let filepath = dir.into().join(filename).with_extension("wasm"); // write data to file // Since the same filename (a collision resistent hash) cannot be generated from two different byte codes @@ -382,9 +382,12 @@ fn save_wasm_to_disk(dir: impl Into, wasm: &[u8]) -> VmResult fn load_wasm_from_disk(dir: impl Into, checksum: &Checksum) -> VmResult> { // this requires the directory and file to exist + // The files previously had no extension, so to allow for a smooth transition, + // we also try to load the file without the wasm extension. let path = dir.into().join(checksum.to_hex()); - let mut file = - File::open(path).map_err(|_e| VmError::cache_err("Error opening Wasm file for reading"))?; + let mut file = File::open(path.with_extension("wasm")) + .or_else(|_| File::open(path)) + .map_err(|_e| VmError::cache_err("Error opening Wasm file for reading"))?; let mut wasm = Vec::::new(); file.read_to_end(&mut wasm) @@ -398,13 +401,25 @@ fn load_wasm_from_disk(dir: impl Into, checksum: &Checksum) -> VmResult /// code is required. So a non-existent file leads to an error as it /// indicates a bug. fn remove_wasm_from_disk(dir: impl Into, checksum: &Checksum) -> VmResult<()> { + // the files previously had no extension, so to allow for a smooth transition, we delete both let path = dir.into().join(checksum.to_hex()); + let wasm_path = path.with_extension("wasm"); - if !path.exists() { + let path_exists = path.exists(); + let wasm_path_exists = wasm_path.exists(); + if !path_exists && !wasm_path_exists { return Err(VmError::cache_err("Wasm file does not exist")); } - fs::remove_file(path).map_err(|_e| VmError::cache_err("Error removing Wasm file from disk"))?; + if path_exists { + fs::remove_file(path) + .map_err(|_e| VmError::cache_err("Error removing Wasm file from disk"))?; + } + + if wasm_path_exists { + fs::remove_file(wasm_path) + .map_err(|_e| VmError::cache_err("Error removing Wasm file from disk"))?; + } Ok(()) } @@ -606,7 +621,8 @@ mod tests { .path() .join(STATE_DIR) .join(WASM_DIR) - .join(checksum.to_hex()); + .join(checksum.to_hex()) + .with_extension("wasm"); let mut file = OpenOptions::new().write(true).open(filepath).unwrap(); file.write_all(b"broken data").unwrap(); @@ -1169,4 +1185,31 @@ mod tests { let non_id = Checksum::generate(b"non_existent"); cache.unpin(&non_id).unwrap(); } + + #[test] + fn loading_without_extension_works() { + let tmp_dir = TempDir::new().unwrap(); + let options = CacheOptions { + base_dir: tmp_dir.path().to_path_buf(), + available_capabilities: default_capabilities(), + memory_cache_size: TESTING_MEMORY_CACHE_SIZE, + instance_memory_limit: TESTING_MEMORY_LIMIT, + }; + let cache: Cache = + unsafe { Cache::new(options).unwrap() }; + let checksum = cache.save_wasm(CONTRACT).unwrap(); + + // Move the saved wasm to the old path (without extension) + let old_path = tmp_dir + .path() + .join(STATE_DIR) + .join(WASM_DIR) + .join(checksum.to_hex()); + let new_path = old_path.with_extension("wasm"); + fs::rename(new_path, old_path).unwrap(); + + // loading wasm from before the wasm extension was added should still work + let restored = cache.load_wasm(&checksum).unwrap(); + assert_eq!(restored, CONTRACT); + } } From a7142a28fc0a534a7e3daf52680be111302c90c1 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 5 May 2023 10:28:04 +0200 Subject: [PATCH 0403/2372] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa06ce961b..0eb9f1ba98 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,10 +19,12 @@ and this project adheres to - cosmwasm-vm: Add target (triple + CPU features) into the module cache directory to avoid using modules compiled for a different system. Bump `MODULE_SERIALIZATION_VERSION` to "v6". ([#1664]) +- cosmwasm-vm: Add `.wasm` extension to stored wasm files ([#1686]). [#1629]: https://github.com/CosmWasm/cosmwasm/pull/1629 [#1631]: https://github.com/CosmWasm/cosmwasm/pull/1631 [#1664]: https://github.com/CosmWasm/cosmwasm/pull/1664 +[#1686]: https://github.com/CosmWasm/cosmwasm/pull/1686 ## [1.2.7] - 2023-06-19 From edd06a337f03e496ec6602c02a54f33bc13f7cc9 Mon Sep 17 00:00:00 2001 From: larry <26318510+larry0x@users.noreply.github.com> Date: Mon, 14 Nov 2022 15:50:18 +0000 Subject: [PATCH 0404/2372] add `Coins` struct --- packages/std/src/coins.rs | 246 ++++++++++++++++++++++++++++++++++++++ packages/std/src/lib.rs | 2 + 2 files changed, 248 insertions(+) create mode 100644 packages/std/src/coins.rs diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs new file mode 100644 index 0000000000..826982d7ab --- /dev/null +++ b/packages/std/src/coins.rs @@ -0,0 +1,246 @@ +use std::any::type_name; +use std::collections::BTreeMap; +use std::fmt; +use std::str::FromStr; + +use crate::{Coin, StdError, StdResult, Uint128}; + +/// A collection of coins, similar to Cosmos SDK's `sdk.Coins` struct. +/// +/// Differently from `sdk.Coins`, which is a vector of `sdk.Coin`, here we +/// implement Coins as a BTreeMap that maps from coin denoms to amounts. +/// This has a number of advantages: +/// +/// - coins are naturally sorted alphabetically by denom +/// - duplicate denoms are automatically removed +/// - cheaper for searching/inserting/deleting: O(log(n)) compared to O(n) +#[derive(Clone, Default, Debug, PartialEq, Eq)] +pub struct Coins(BTreeMap); + +// Casting a Vec to Coins. +// The Vec can be out of order, but must not contain duplicate denoms or zero amounts. +impl TryFrom> for Coins { + type Error = StdError; + + fn try_from(vec: Vec) -> StdResult { + let vec_len = vec.len(); + + let map = vec + .into_iter() + .filter(|coin| !coin.amount.is_zero()) + .map(|coin| (coin.denom, coin.amount)) + .collect::>(); + + // the map having a different length from the vec means the vec must either + // 1) contain duplicate denoms, or 2) contain zero amounts + if map.len() != vec_len { + return Err(StdError::parse_err( + type_name::(), + "duplicate denoms or zero amount", + )); + } + + Ok(Self(map)) + } +} + +impl TryFrom<&[Coin]> for Coins { + type Error = StdError; + + fn try_from(slice: &[Coin]) -> StdResult { + slice.to_vec().try_into() + } +} + +impl FromStr for Coins { + type Err = StdError; + + fn from_str(s: &str) -> StdResult { + // Parse a string into a `Coin`. + // + // Parsing the string with regex doesn't work, because the resulting + // wasm binary would be too big from including the `regex` library. + // + // We opt for the following solution: enumerate characters in the string, + // and break before the first non-number character. Split the string at + // that index. + // + // This assumes the denom never starts with a number, which is the case: + // https://github.com/cosmos/cosmos-sdk/blob/v0.46.0/types/coin.go#L854-L856 + let parse_coin_str = |s: &str| -> StdResult { + for (i, c) in s.chars().enumerate() { + if !c.is_ascii_digit() { + let amount = Uint128::from_str(&s[..i])?; + let denom = String::from(&s[i..]); + return Ok(Coin { amount, denom }); + } + } + + Err(StdError::parse_err( + type_name::(), + format!("invalid coin string: {s}"), + )) + }; + + s.split(',') + .into_iter() + .map(parse_coin_str) + .collect::>>()? + .try_into() + } +} + +impl fmt::Display for Coins { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let s = self + .0 + .iter() + .map(|(denom, amount)| format!("{amount}{denom}")) + .collect::>() + .join(","); + write!(f, "{s}") + } +} + +impl Coins { + /// Cast to Vec, while NOT consuming the original object + pub fn to_vec(&self) -> Vec { + self.0 + .iter() + .map(|(denom, amount)| Coin { + denom: denom.clone(), + amount: *amount, + }) + .collect() + } + + /// Cast to Vec, consuming the original object + pub fn into_vec(self) -> Vec { + self.0 + .into_iter() + .map(|(denom, amount)| Coin { denom, amount }) + .collect() + } + + pub fn len(&self) -> usize { + self.0.len() + } + + pub fn is_empty(&self) -> bool { + self.0.is_empty() + } + + /// Return the denoms as a vector of strings. + /// The vector is guaranteed to not contain duplicates and sorted alphabetically. + pub fn denoms(&self) -> Vec { + self.0.keys().cloned().collect() + } + + pub fn add(&mut self, coin: &Coin) -> StdResult<()> { + let amount = self + .0 + .entry(coin.denom.clone()) + .or_insert_with(Uint128::zero); + *amount = amount.checked_add(coin.amount)?; + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::coin; + + /// Sort a Vec by denom alphabetically + fn sort_by_denom(vec: &mut [Coin]) { + vec.sort_by(|a, b| a.denom.cmp(&b.denom)); + } + + /// Returns a mockup Vec. In this example, the coins are not in order + fn mock_vec() -> Vec { + vec![ + coin(12345, "uatom"), + coin(69420, "ibc/1234ABCD"), + coin(88888, "factory/osmo1234abcd/subdenom"), + ] + } + + /// Return a mockup Coins that contains the same coins as in `mock_vec` + fn mock_coins() -> Coins { + let mut coins = Coins::default(); + for coin in mock_vec() { + coins.add(&coin).unwrap(); + } + coins + } + + #[test] + fn casting_vec() { + let mut vec = mock_vec(); + let coins = mock_coins(); + + // &[Coin] --> Coins + assert_eq!(Coins::try_from(vec.as_slice()).unwrap(), coins); + // Vec --> Coins + assert_eq!(Coins::try_from(vec.clone()).unwrap(), coins); + + sort_by_denom(&mut vec); + + // &Coins --> Vec + // NOTE: the returned vec should be sorted + assert_eq!(coins.to_vec(), vec); + // Coins --> Vec + // NOTE: the returned vec should be sorted + assert_eq!(coins.into_vec(), vec); + } + + #[test] + fn casting_str() { + // not in order + let s1 = "88888factory/osmo1234abcd/subdenom,12345uatom,69420ibc/1234ABCD"; + // in order + let s2 = "88888factory/osmo1234abcd/subdenom,69420ibc/1234ABCD,12345uatom"; + + let coins = mock_coins(); + + // &str --> Coins + // NOTE: should generate the same Coins, regardless of input order + assert_eq!(Coins::from_str(s1).unwrap(), coins); + assert_eq!(Coins::from_str(s2).unwrap(), coins); + + // Coins --> String + // NOTE: the generated string should be sorted + assert_eq!(coins.to_string(), s2); + } + + #[test] + fn handling_duplicates() { + // create a Vec that contains duplicate denoms + let mut vec = mock_vec(); + vec.push(coin(67890, "uatom")); + + let err = Coins::try_from(vec).unwrap_err(); + assert!(err.to_string().contains("duplicate denoms")); + } + + #[test] + fn handling_zero_amount() { + // create a Vec that contains zero amounts + let mut vec = mock_vec(); + vec[0].amount = Uint128::zero(); + + let err = Coins::try_from(vec).unwrap_err(); + assert!(err.to_string().contains("zero amount")); + } + + #[test] + fn length() { + let coins = Coins::default(); + assert_eq!(coins.len(), 0); + assert!(coins.is_empty()); + + let coins = mock_coins(); + assert_eq!(coins.len(), 3); + assert!(!coins.is_empty()); + } +} diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 7f26868498..98e8e45f9b 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -7,6 +7,7 @@ mod addresses; mod assertions; mod binary; mod coin; +mod coins; mod conversion; mod deps; mod errors; @@ -31,6 +32,7 @@ mod types; pub use crate::addresses::{instantiate2_address, Addr, CanonicalAddr, Instantiate2AddressError}; pub use crate::binary::Binary; pub use crate::coin::{coin, coins, has_coins, Coin}; +pub use crate::coins::Coins; pub use crate::deps::{Deps, DepsMut, OwnedDeps}; pub use crate::errors::{ CheckedFromRatioError, CheckedMultiplyFractionError, CheckedMultiplyRatioError, From c5b82d33df7684a340e16825874be60706c10296 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 5 May 2023 13:33:48 +0200 Subject: [PATCH 0405/2372] Ignore zero amount when adding coin to coins --- packages/std/src/coins.rs | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index 826982d7ab..43489dd746 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -136,11 +136,19 @@ impl Coins { self.0.keys().cloned().collect() } - pub fn add(&mut self, coin: &Coin) -> StdResult<()> { - let amount = self - .0 - .entry(coin.denom.clone()) - .or_insert_with(Uint128::zero); + /// Returns the amount of the given denom or zero if the denom is not present. + pub fn amount_of(&self, denom: &str) -> Uint128 { + self.0.get(denom).copied().unwrap_or_else(Uint128::zero) + } + + /// Adds the given coin to the collection. + /// This errors in case of overflow. + pub fn add(&mut self, coin: Coin) -> StdResult<()> { + if coin.amount.is_zero() { + return Ok(()); + } + + let amount = self.0.entry(coin.denom).or_insert_with(Uint128::zero); *amount = amount.checked_add(coin.amount)?; Ok(()) } @@ -169,7 +177,7 @@ mod tests { fn mock_coins() -> Coins { let mut coins = Coins::default(); for coin in mock_vec() { - coins.add(&coin).unwrap(); + coins.add(coin).unwrap(); } coins } @@ -231,6 +239,11 @@ mod tests { let err = Coins::try_from(vec).unwrap_err(); assert!(err.to_string().contains("zero amount")); + + // adding a coin with zero amount should not be added + let mut coins = Coins::default(); + coins.add(coin(0, "uusd")).unwrap(); + assert!(coins.is_empty()); } #[test] @@ -243,4 +256,16 @@ mod tests { assert_eq!(coins.len(), 3); assert!(!coins.is_empty()); } + + #[test] + fn add_coin() { + let mut coins = mock_coins(); + coins.add(coin(12345, "uatom")).unwrap(); + + assert_eq!(coins.len(), 3); + assert_eq!(coins.amount_of("uatom").u128(), 24690); + + coins.add(coin(123, "uusd")).unwrap(); + assert_eq!(coins.len(), 4); + } } From 2da843212087fc734cdd654db21beea7d5f3c9b7 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 5 May 2023 15:13:37 +0200 Subject: [PATCH 0406/2372] Add extend method for Coins --- packages/std/src/coins.rs | 74 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 72 insertions(+), 2 deletions(-) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index 43489dd746..d2ab0f16a4 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -1,7 +1,7 @@ -use std::any::type_name; use std::collections::BTreeMap; use std::fmt; use std::str::FromStr; +use std::{any::type_name, collections::btree_map}; use crate::{Coin, StdError, StdResult, Uint128}; @@ -52,6 +52,16 @@ impl TryFrom<&[Coin]> for Coins { } } +impl TryFrom for Coins { + type Error = StdError; + + fn try_from(coin: Coin) -> StdResult { + let mut coins = Coins::default(); + coins.add(coin)?; + Ok(coins) + } +} + impl FromStr for Coins { type Err = StdError; @@ -130,7 +140,7 @@ impl Coins { self.0.is_empty() } - /// Return the denoms as a vector of strings. + /// Returns the denoms as a vector of strings. /// The vector is guaranteed to not contain duplicates and sorted alphabetically. pub fn denoms(&self) -> Vec { self.0.keys().cloned().collect() @@ -152,6 +162,51 @@ impl Coins { *amount = amount.checked_add(coin.amount)?; Ok(()) } + + /// Adds the given coins to the collection. + /// This takes anything that yields `(denom, amount)` tuples when iterated over. + /// + /// # Examples + /// + /// ```rust + /// use cosmwasm_std::{Coin, Coins, Uint128, coin}; + /// + /// let mut coins = Coins::default(); + /// let new_coins: Coins = coin(123u128, "ucosm").try_into()?; + /// coins.extend(new_coins.clone())?; + /// assert_eq!(coins, new_coins); + /// # cosmwasm_std::StdResult::Ok(()) + /// ``` + pub fn extend(&mut self, others: C) -> StdResult<()> + where + C: IntoIterator, + { + for (denom, amount) in others { + self.add(Coin { denom, amount })?; + } + Ok(()) + } +} + +impl IntoIterator for Coins { + type Item = (String, Uint128); + // TODO: do we want to wrap the iterator type with our own to avoid exposing BTreeMap? + // also: for the owned version we could return Coins instead of (String, Uint128), + // but not for the borrowed version, so it would feel inconsistent + type IntoIter = btree_map::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.0.into_iter() + } +} + +impl<'a> IntoIterator for &'a Coins { + type Item = (&'a String, &'a Uint128); + type IntoIter = btree_map::Iter<'a, String, Uint128>; + + fn into_iter(self) -> Self::IntoIter { + self.0.iter() + } } #[cfg(test)] @@ -268,4 +323,19 @@ mod tests { coins.add(coin(123, "uusd")).unwrap(); assert_eq!(coins.len(), 4); } + + #[test] + fn extend_coins() { + let mut coins: Coins = coin(12345, "uatom").try_into().unwrap(); + + coins.extend(mock_coins()).unwrap(); + assert_eq!(coins.len(), 3); + assert_eq!(coins.amount_of("uatom").u128(), 24690); + + coins + .extend([("uusd".to_string(), Uint128::new(123u128))]) + .unwrap(); + assert_eq!(coins.len(), 4); + assert_eq!(coins.amount_of("uusd").u128(), 123) + } } From ea2aab14a7d9d88e2b2abe18869290ac13ae4db7 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 5 May 2023 15:16:43 +0200 Subject: [PATCH 0407/2372] Fix lint --- packages/std/src/coins.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index d2ab0f16a4..1c8c263673 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -93,7 +93,6 @@ impl FromStr for Coins { }; s.split(',') - .into_iter() .map(parse_coin_str) .collect::>>()? .try_into() From b9635086f715c69292a768f0aa677b0e186dfb5b Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 5 May 2023 16:58:29 +0200 Subject: [PATCH 0408/2372] Add more trait impls for Coins --- packages/std/src/coins.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index 1c8c263673..87cda52a65 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -52,6 +52,14 @@ impl TryFrom<&[Coin]> for Coins { } } +impl TryFrom<[Coin; N]> for Coins { + type Error = StdError; + + fn try_from(slice: [Coin; N]) -> StdResult { + slice.to_vec().try_into() + } +} + impl TryFrom for Coins { type Error = StdError; @@ -62,6 +70,12 @@ impl TryFrom for Coins { } } +impl From for Vec { + fn from(value: Coins) -> Self { + value.into_vec() + } +} + impl FromStr for Coins { type Err = StdError; @@ -111,6 +125,12 @@ impl fmt::Display for Coins { } } +impl PartialEq for Coins { + fn eq(&self, other: &Coin) -> bool { + self.0.len() == 1 && self.amount_of(&other.denom) == other.amount + } +} + impl Coins { /// Cast to Vec, while NOT consuming the original object pub fn to_vec(&self) -> Vec { From 15c60acf87e6c71219aa6cac75cb35cb735dee99 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 5 May 2023 17:05:37 +0200 Subject: [PATCH 0409/2372] Add helper to Coins --- packages/std/src/coins.rs | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index 87cda52a65..6be7af358a 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -80,6 +80,8 @@ impl FromStr for Coins { type Err = StdError; fn from_str(s: &str) -> StdResult { + // TODO: use FromStr impl for Coin once it's merged + // Parse a string into a `Coin`. // // Parsing the string with regex doesn't work, because the resulting @@ -170,6 +172,33 @@ impl Coins { self.0.get(denom).copied().unwrap_or_else(Uint128::zero) } + /// Returns the amount of the given denom if and only if this collection contains only + /// the given denom. Otherwise `None` is returned. + /// + /// # Examples + /// + /// ```rust + /// use cosmwasm_std::{Coin, Coins, coin}; + /// + /// let coins: Coins = coin(100, "uatom").try_into().unwrap(); + /// assert_eq!(coins.contains_only("uatom").unwrap().u128(), 100); + /// assert_eq!(coins.contains_only("uluna"), None); + /// ``` + /// + /// ```rust + /// use cosmwasm_std::{Coin, Coins, coin}; + /// + /// let coins: Coins = [coin(100, "uatom"), coin(200, "uusd")].try_into().unwrap(); + /// assert_eq!(coins.contains_only("uatom"), None); + /// ``` + pub fn contains_only(&self, denom: &str) -> Option { + if self.len() == 1 { + self.0.get(denom).copied() + } else { + None + } + } + /// Adds the given coin to the collection. /// This errors in case of overflow. pub fn add(&mut self, coin: Coin) -> StdResult<()> { @@ -188,7 +217,7 @@ impl Coins { /// # Examples /// /// ```rust - /// use cosmwasm_std::{Coin, Coins, Uint128, coin}; + /// use cosmwasm_std::{Coin, Coins, coin}; /// /// let mut coins = Coins::default(); /// let new_coins: Coins = coin(123u128, "ucosm").try_into()?; @@ -357,4 +386,12 @@ mod tests { assert_eq!(coins.len(), 4); assert_eq!(coins.amount_of("uusd").u128(), 123) } + + #[test] + fn equality() { + let coin = coin(54321, "uatom"); + let coins = Coins::try_from(coin.clone()).unwrap(); + + assert_eq!(coins, coin); + } } From dab3146776119cc6cfca628e86eb862f671724a7 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 22 May 2023 10:26:28 +0200 Subject: [PATCH 0410/2372] Use Coin's FromStr impl in FromStr impl of Coins --- packages/std/src/coins.rs | 32 ++------------------------------ 1 file changed, 2 insertions(+), 30 deletions(-) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index 6be7af358a..27b3196009 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -80,37 +80,9 @@ impl FromStr for Coins { type Err = StdError; fn from_str(s: &str) -> StdResult { - // TODO: use FromStr impl for Coin once it's merged - - // Parse a string into a `Coin`. - // - // Parsing the string with regex doesn't work, because the resulting - // wasm binary would be too big from including the `regex` library. - // - // We opt for the following solution: enumerate characters in the string, - // and break before the first non-number character. Split the string at - // that index. - // - // This assumes the denom never starts with a number, which is the case: - // https://github.com/cosmos/cosmos-sdk/blob/v0.46.0/types/coin.go#L854-L856 - let parse_coin_str = |s: &str| -> StdResult { - for (i, c) in s.chars().enumerate() { - if !c.is_ascii_digit() { - let amount = Uint128::from_str(&s[..i])?; - let denom = String::from(&s[i..]); - return Ok(Coin { amount, denom }); - } - } - - Err(StdError::parse_err( - type_name::(), - format!("invalid coin string: {s}"), - )) - }; - s.split(',') - .map(parse_coin_str) - .collect::>>()? + .map(Coin::from_str) + .collect::, _>>()? .try_into() } } From 4e38bcfe494ccc58dc299551ecd284204bb4821f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 22 May 2023 17:12:07 +0200 Subject: [PATCH 0411/2372] Remove IntoIterator impls for now --- packages/std/src/coins.rs | 35 ++++++----------------------------- 1 file changed, 6 insertions(+), 29 deletions(-) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index 27b3196009..175a024e2a 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -1,7 +1,7 @@ +use std::any::type_name; use std::collections::BTreeMap; use std::fmt; use std::str::FromStr; -use std::{any::type_name, collections::btree_map}; use crate::{Coin, StdError, StdResult, Uint128}; @@ -199,36 +199,15 @@ impl Coins { /// ``` pub fn extend(&mut self, others: C) -> StdResult<()> where - C: IntoIterator, + C: IntoIterator, { - for (denom, amount) in others { - self.add(Coin { denom, amount })?; + for c in others { + self.add(c)?; } Ok(()) } } -impl IntoIterator for Coins { - type Item = (String, Uint128); - // TODO: do we want to wrap the iterator type with our own to avoid exposing BTreeMap? - // also: for the owned version we could return Coins instead of (String, Uint128), - // but not for the borrowed version, so it would feel inconsistent - type IntoIter = btree_map::IntoIter; - - fn into_iter(self) -> Self::IntoIter { - self.0.into_iter() - } -} - -impl<'a> IntoIterator for &'a Coins { - type Item = (&'a String, &'a Uint128); - type IntoIter = btree_map::Iter<'a, String, Uint128>; - - fn into_iter(self) -> Self::IntoIter { - self.0.iter() - } -} - #[cfg(test)] mod tests { use super::*; @@ -348,13 +327,11 @@ mod tests { fn extend_coins() { let mut coins: Coins = coin(12345, "uatom").try_into().unwrap(); - coins.extend(mock_coins()).unwrap(); + coins.extend(mock_coins().to_vec()).unwrap(); assert_eq!(coins.len(), 3); assert_eq!(coins.amount_of("uatom").u128(), 24690); - coins - .extend([("uusd".to_string(), Uint128::new(123u128))]) - .unwrap(); + coins.extend([coin(123, "uusd")]).unwrap(); assert_eq!(coins.len(), 4); assert_eq!(coins.amount_of("uusd").u128(), 123) } From 324289f99dbb21390de1af5bf3722e1d27a34f09 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 23 May 2023 08:51:54 +0200 Subject: [PATCH 0412/2372] Fix test --- packages/std/src/coins.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index 175a024e2a..b6ec3380d6 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -193,7 +193,7 @@ impl Coins { /// /// let mut coins = Coins::default(); /// let new_coins: Coins = coin(123u128, "ucosm").try_into()?; - /// coins.extend(new_coins.clone())?; + /// coins.extend(new_coins.to_vec())?; /// assert_eq!(coins, new_coins); /// # cosmwasm_std::StdResult::Ok(()) /// ``` From 24e4d7a48d4cf75d9bc11e5673e2d44adf1af1b9 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 23 May 2023 17:48:31 +0200 Subject: [PATCH 0413/2372] Apply suggestions from code review Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/std/src/coins.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index b6ec3380d6..abc9c11c02 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -106,7 +106,7 @@ impl PartialEq for Coins { } impl Coins { - /// Cast to Vec, while NOT consuming the original object + /// Conversion to Vec, while NOT consuming the original object pub fn to_vec(&self) -> Vec { self.0 .iter() @@ -117,7 +117,7 @@ impl Coins { .collect() } - /// Cast to Vec, consuming the original object + /// Conversion to Vec, consuming the original object pub fn into_vec(self) -> Vec { self.0 .into_iter() From 0e3bc7e5ab4582adf2424e8fba164f9a6a71fe4b Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 24 May 2023 10:08:57 +0200 Subject: [PATCH 0414/2372] Add custom error type for Coins conversion --- packages/std/src/coins.rs | 34 +++++++++++++++------------- packages/std/src/errors/mod.rs | 4 ++-- packages/std/src/errors/std_error.rs | 14 ++++++++++++ 3 files changed, 34 insertions(+), 18 deletions(-) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index abc9c11c02..c6fdee61c1 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -1,9 +1,8 @@ -use std::any::type_name; use std::collections::BTreeMap; use std::fmt; use std::str::FromStr; -use crate::{Coin, StdError, StdResult, Uint128}; +use crate::{errors::CoinsError, Coin, StdError, StdResult, Uint128}; /// A collection of coins, similar to Cosmos SDK's `sdk.Coins` struct. /// @@ -20,9 +19,15 @@ pub struct Coins(BTreeMap); // Casting a Vec to Coins. // The Vec can be out of order, but must not contain duplicate denoms or zero amounts. impl TryFrom> for Coins { - type Error = StdError; + type Error = CoinsError; + + fn try_from(vec: Vec) -> Result { + if let Some(coin) = vec.iter().find(|c| c.amount.is_zero()) { + return Err(CoinsError::ZeroAmount { + denom: coin.denom.clone(), + }); + } - fn try_from(vec: Vec) -> StdResult { let vec_len = vec.len(); let map = vec @@ -31,13 +36,10 @@ impl TryFrom> for Coins { .map(|coin| (coin.denom, coin.amount)) .collect::>(); - // the map having a different length from the vec means the vec must either - // 1) contain duplicate denoms, or 2) contain zero amounts + // the map having a different length from the vec means the vec must either contain + // duplicate denoms if map.len() != vec_len { - return Err(StdError::parse_err( - type_name::(), - "duplicate denoms or zero amount", - )); + return Err(CoinsError::DuplicateDenom); } Ok(Self(map)) @@ -45,17 +47,17 @@ impl TryFrom> for Coins { } impl TryFrom<&[Coin]> for Coins { - type Error = StdError; + type Error = CoinsError; - fn try_from(slice: &[Coin]) -> StdResult { + fn try_from(slice: &[Coin]) -> Result { slice.to_vec().try_into() } } impl TryFrom<[Coin; N]> for Coins { - type Error = StdError; + type Error = CoinsError; - fn try_from(slice: [Coin; N]) -> StdResult { + fn try_from(slice: [Coin; N]) -> Result { slice.to_vec().try_into() } } @@ -80,10 +82,10 @@ impl FromStr for Coins { type Err = StdError; fn from_str(s: &str) -> StdResult { - s.split(',') + Ok(s.split(',') .map(Coin::from_str) .collect::, _>>()? - .try_into() + .try_into()?) } } diff --git a/packages/std/src/errors/mod.rs b/packages/std/src/errors/mod.rs index 5535479bdf..8c41d36540 100644 --- a/packages/std/src/errors/mod.rs +++ b/packages/std/src/errors/mod.rs @@ -6,8 +6,8 @@ mod verification_error; pub use recover_pubkey_error::RecoverPubkeyError; pub use std_error::{ CheckedFromRatioError, CheckedMultiplyFractionError, CheckedMultiplyRatioError, - CoinFromStrError, ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, - RoundUpOverflowError, StdError, StdResult, + CoinFromStrError, CoinsError, ConversionOverflowError, DivideByZeroError, OverflowError, + OverflowOperation, RoundUpOverflowError, StdError, StdResult, }; pub use system_error::SystemError; pub use verification_error::VerificationError; diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index d90171c74c..119732eff7 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -590,6 +590,20 @@ pub enum CheckedFromRatioError { #[error("Round up operation failed because of overflow")] pub struct RoundUpOverflowError; +#[derive(Error, Debug, PartialEq, Eq)] +pub enum CoinsError { + #[error("Duplicate denom")] + DuplicateDenom, + #[error("Coin with zero amount: {denom}")] + ZeroAmount { denom: String }, +} + +impl From for StdError { + fn from(value: CoinsError) -> Self { + Self::generic_err(format!("Creating Coins: {}", value)) + } +} + #[derive(Error, Debug, PartialEq, Eq)] pub enum CoinFromStrError { #[error("Missing denominator")] From b202f79a3e147861ed7e52da4c6fad8a68136382 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 24 May 2023 10:10:10 +0200 Subject: [PATCH 0415/2372] Remove Coin to Coins conversion --- packages/std/src/coins.rs | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index c6fdee61c1..3dc1ce8186 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -62,16 +62,6 @@ impl TryFrom<[Coin; N]> for Coins { } } -impl TryFrom for Coins { - type Error = StdError; - - fn try_from(coin: Coin) -> StdResult { - let mut coins = Coins::default(); - coins.add(coin)?; - Ok(coins) - } -} - impl From for Vec { fn from(value: Coins) -> Self { value.into_vec() @@ -154,7 +144,7 @@ impl Coins { /// ```rust /// use cosmwasm_std::{Coin, Coins, coin}; /// - /// let coins: Coins = coin(100, "uatom").try_into().unwrap(); + /// let coins: Coins = [coin(100, "uatom")].try_into().unwrap(); /// assert_eq!(coins.contains_only("uatom").unwrap().u128(), 100); /// assert_eq!(coins.contains_only("uluna"), None); /// ``` @@ -194,7 +184,7 @@ impl Coins { /// use cosmwasm_std::{Coin, Coins, coin}; /// /// let mut coins = Coins::default(); - /// let new_coins: Coins = coin(123u128, "ucosm").try_into()?; + /// let new_coins: Coins = [coin(123u128, "ucosm")].try_into()?; /// coins.extend(new_coins.to_vec())?; /// assert_eq!(coins, new_coins); /// # cosmwasm_std::StdResult::Ok(()) @@ -284,7 +274,7 @@ mod tests { vec.push(coin(67890, "uatom")); let err = Coins::try_from(vec).unwrap_err(); - assert!(err.to_string().contains("duplicate denoms")); + assert_eq!(err, CoinsError::DuplicateDenom); } #[test] @@ -327,7 +317,7 @@ mod tests { #[test] fn extend_coins() { - let mut coins: Coins = coin(12345, "uatom").try_into().unwrap(); + let mut coins: Coins = [coin(12345, "uatom")].try_into().unwrap(); coins.extend(mock_coins().to_vec()).unwrap(); assert_eq!(coins.len(), 3); @@ -341,7 +331,7 @@ mod tests { #[test] fn equality() { let coin = coin(54321, "uatom"); - let coins = Coins::try_from(coin.clone()).unwrap(); + let coins = Coins::try_from([coin.clone()]).unwrap(); assert_eq!(coins, coin); } From 94f5748cbba0b9235426d9daa5f898ca538455c3 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 24 May 2023 10:21:54 +0200 Subject: [PATCH 0416/2372] Remove equality impl between Coin and Coins --- packages/std/src/coins.rs | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index 3dc1ce8186..43491edd17 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -91,12 +91,6 @@ impl fmt::Display for Coins { } } -impl PartialEq for Coins { - fn eq(&self, other: &Coin) -> bool { - self.0.len() == 1 && self.amount_of(&other.denom) == other.amount - } -} - impl Coins { /// Conversion to Vec, while NOT consuming the original object pub fn to_vec(&self) -> Vec { @@ -327,12 +321,4 @@ mod tests { assert_eq!(coins.len(), 4); assert_eq!(coins.amount_of("uusd").u128(), 123) } - - #[test] - fn equality() { - let coin = coin(54321, "uatom"); - let coins = Coins::try_from([coin.clone()]).unwrap(); - - assert_eq!(coins, coin); - } } From 23d5a45cf77250769d6b8b1fba92376ee5ccc20a Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 24 May 2023 10:50:34 +0200 Subject: [PATCH 0417/2372] Handle empty string when parsing Coins --- packages/std/src/coins.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index 43491edd17..b756bff329 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -72,6 +72,10 @@ impl FromStr for Coins { type Err = StdError; fn from_str(s: &str) -> StdResult { + if s.is_empty() { + return Ok(Self::default()); + } + Ok(s.split(',') .map(Coin::from_str) .collect::, _>>()? @@ -223,7 +227,7 @@ mod tests { } #[test] - fn casting_vec() { + fn converting_vec() { let mut vec = mock_vec(); let coins = mock_coins(); @@ -243,22 +247,30 @@ mod tests { } #[test] - fn casting_str() { + fn converting_str() { // not in order let s1 = "88888factory/osmo1234abcd/subdenom,12345uatom,69420ibc/1234ABCD"; // in order let s2 = "88888factory/osmo1234abcd/subdenom,69420ibc/1234ABCD,12345uatom"; + let invalid = "12345uatom,noamount"; + let coins = mock_coins(); // &str --> Coins // NOTE: should generate the same Coins, regardless of input order assert_eq!(Coins::from_str(s1).unwrap(), coins); assert_eq!(Coins::from_str(s2).unwrap(), coins); + assert_eq!(Coins::from_str("").unwrap(), Coins::default()); // Coins --> String // NOTE: the generated string should be sorted assert_eq!(coins.to_string(), s2); + assert_eq!(Coins::default().to_string(), ""); + assert_eq!( + Coins::from_str(invalid).unwrap_err().to_string(), + "Generic error: Parsing Coin: Missing amount or non-digit characters in amount" + ); } #[test] From e9772297bd25d28942c1e52027cd4c40ca013764 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 6 Jun 2023 10:28:41 +0200 Subject: [PATCH 0418/2372] Ignore zero values when creating Coins --- packages/std/src/coins.rs | 64 +++++++++++++++++----------- packages/std/src/errors/std_error.rs | 2 - 2 files changed, 40 insertions(+), 26 deletions(-) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index b756bff329..1f8356ddf6 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -16,30 +16,23 @@ use crate::{errors::CoinsError, Coin, StdError, StdResult, Uint128}; #[derive(Clone, Default, Debug, PartialEq, Eq)] pub struct Coins(BTreeMap); -// Casting a Vec to Coins. -// The Vec can be out of order, but must not contain duplicate denoms or zero amounts. +/// Casting a Vec to Coins. +/// The Vec can be out of order, but must not contain duplicate denoms. +/// If you want to sum up duplicates, create an empty instance using [Coins::default] and use `Coins::extend`. impl TryFrom> for Coins { type Error = CoinsError; fn try_from(vec: Vec) -> Result { - if let Some(coin) = vec.iter().find(|c| c.amount.is_zero()) { - return Err(CoinsError::ZeroAmount { - denom: coin.denom.clone(), - }); - } - - let vec_len = vec.len(); - - let map = vec - .into_iter() - .filter(|coin| !coin.amount.is_zero()) - .map(|coin| (coin.denom, coin.amount)) - .collect::>(); - - // the map having a different length from the vec means the vec must either contain - // duplicate denoms - if map.len() != vec_len { - return Err(CoinsError::DuplicateDenom); + let mut map = BTreeMap::new(); + for Coin { amount, denom } in vec { + if amount.is_zero() { + continue; + } + + // if the insertion returns a previous value, we have a duplicate denom + if map.insert(denom, amount).is_some() { + return Err(CoinsError::DuplicateDenom); + } } Ok(Self(map)) @@ -54,6 +47,15 @@ impl TryFrom<&[Coin]> for Coins { } } +impl From for Coins { + fn from(value: Coin) -> Self { + let mut coins = Coins::default(); + // this can never overflow (because there are no coins in there yet), so we can unwrap + coins.add(value).unwrap(); + coins + } +} + impl TryFrom<[Coin; N]> for Coins { type Error = CoinsError; @@ -173,7 +175,8 @@ impl Coins { Ok(()) } - /// Adds the given coins to the collection. + /// Adds the given coins to the collection, ignoring any zero coins and summing up + /// duplicate denoms. /// This takes anything that yields `(denom, amount)` tuples when iterated over. /// /// # Examples @@ -226,6 +229,10 @@ mod tests { coins } + fn mock_duplicate() -> Vec { + vec![coin(12345, "uatom"), coin(6789, "uatom")] + } + #[test] fn converting_vec() { let mut vec = mock_vec(); @@ -289,8 +296,13 @@ mod tests { let mut vec = mock_vec(); vec[0].amount = Uint128::zero(); - let err = Coins::try_from(vec).unwrap_err(); - assert!(err.to_string().contains("zero amount")); + let coins = Coins::try_from(vec).unwrap(); + assert_eq!(coins.len(), 2); + assert_ne!(coins.amount_of("ibc/1234ABCD"), Uint128::zero()); + assert_ne!( + coins.amount_of("factory/osmo1234abcd/subdenom"), + Uint128::zero() + ); // adding a coin with zero amount should not be added let mut coins = Coins::default(); @@ -331,6 +343,10 @@ mod tests { coins.extend([coin(123, "uusd")]).unwrap(); assert_eq!(coins.len(), 4); - assert_eq!(coins.amount_of("uusd").u128(), 123) + assert_eq!(coins.amount_of("uusd").u128(), 123); + + // duplicate handling + coins.extend(mock_duplicate()).unwrap(); + assert_eq!(coins.amount_of("uatom").u128(), 24690 + 12345 + 6789); } } diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index 119732eff7..d30fec6a71 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -594,8 +594,6 @@ pub struct RoundUpOverflowError; pub enum CoinsError { #[error("Duplicate denom")] DuplicateDenom, - #[error("Coin with zero amount: {denom}")] - ZeroAmount { denom: String }, } impl From for StdError { From f4ead00e547a82a8c06275c7b3082bac9fd806a2 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 6 Jun 2023 12:57:00 +0200 Subject: [PATCH 0419/2372] Add Coin subtraction --- packages/std/src/coins.rs | 76 ++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index 1f8356ddf6..8b383a70a0 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -3,6 +3,7 @@ use std::fmt; use std::str::FromStr; use crate::{errors::CoinsError, Coin, StdError, StdResult, Uint128}; +use crate::{OverflowError, OverflowOperation}; /// A collection of coins, similar to Cosmos SDK's `sdk.Coins` struct. /// @@ -18,7 +19,8 @@ pub struct Coins(BTreeMap); /// Casting a Vec to Coins. /// The Vec can be out of order, but must not contain duplicate denoms. -/// If you want to sum up duplicates, create an empty instance using [Coins::default] and use `Coins::extend`. +/// If you want to sum up duplicates, create an empty instance using `Coins::default` and +/// use `Coins::add` to add your coins. impl TryFrom> for Coins { type Error = CoinsError; @@ -175,28 +177,27 @@ impl Coins { Ok(()) } - /// Adds the given coins to the collection, ignoring any zero coins and summing up - /// duplicate denoms. - /// This takes anything that yields `(denom, amount)` tuples when iterated over. - /// - /// # Examples - /// - /// ```rust - /// use cosmwasm_std::{Coin, Coins, coin}; - /// - /// let mut coins = Coins::default(); - /// let new_coins: Coins = [coin(123u128, "ucosm")].try_into()?; - /// coins.extend(new_coins.to_vec())?; - /// assert_eq!(coins, new_coins); - /// # cosmwasm_std::StdResult::Ok(()) - /// ``` - pub fn extend(&mut self, others: C) -> StdResult<()> - where - C: IntoIterator, - { - for c in others { - self.add(c)?; + /// Subtracts the given coin or collection of coins from this `Coins` instance. + /// Errors in case of overflow or if one of the coins is not present. + pub fn sub(&mut self, coin: Coin) -> StdResult<()> { + match self.0.get_mut(&coin.denom) { + Some(v) => { + *v = v.checked_sub(coin.amount)?; + // make sure to remove zero coins + if v.is_zero() { + self.0.remove(&coin.denom); + } + } + None => { + return Err(OverflowError::new( + OverflowOperation::Sub, + Uint128::zero(), + coin.amount, + ) + .into()) + } } + Ok(()) } } @@ -229,10 +230,6 @@ mod tests { coins } - fn mock_duplicate() -> Vec { - vec![coin(12345, "uatom"), coin(6789, "uatom")] - } - #[test] fn converting_vec() { let mut vec = mock_vec(); @@ -334,19 +331,24 @@ mod tests { } #[test] - fn extend_coins() { - let mut coins: Coins = [coin(12345, "uatom")].try_into().unwrap(); + fn sub_coins() { + let mut coins: Coins = coin(12345, "uatom").into(); - coins.extend(mock_coins().to_vec()).unwrap(); - assert_eq!(coins.len(), 3); - assert_eq!(coins.amount_of("uatom").u128(), 24690); + // sub more than available + let err = coins.sub(coin(12346, "uatom")).unwrap_err(); + assert!(matches!(err, StdError::Overflow { .. })); - coins.extend([coin(123, "uusd")]).unwrap(); - assert_eq!(coins.len(), 4); - assert_eq!(coins.amount_of("uusd").u128(), 123); + // sub non-existent denom + let err = coins.sub(coin(12345, "uusd")).unwrap_err(); + assert!(matches!(err, StdError::Overflow { .. })); - // duplicate handling - coins.extend(mock_duplicate()).unwrap(); - assert_eq!(coins.amount_of("uatom").u128(), 24690 + 12345 + 6789); + // partial sub + coins.sub(coin(1, "uatom")).unwrap(); + assert_eq!(coins.len(), 1); + assert_eq!(coins.amount_of("uatom").u128(), 12344); + + // full sub + coins.sub(coin(12344, "uatom")).unwrap(); + assert!(coins.is_empty()); } } From c02a2f1cfbc71776659a07ae8a9902415b067c08 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 6 Jun 2023 14:35:12 +0200 Subject: [PATCH 0420/2372] Fix Coin subtraction --- packages/std/src/coins.rs | 40 ++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index 8b383a70a0..0c0877ddbe 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -119,10 +119,12 @@ impl Coins { .collect() } + /// Returns the number of different denoms in this collection. pub fn len(&self) -> usize { self.0.len() } + /// Returns `true` if this collection contains no coins. pub fn is_empty(&self) -> bool { self.0.is_empty() } @@ -165,8 +167,8 @@ impl Coins { } } - /// Adds the given coin to the collection. - /// This errors in case of overflow. + /// Adds the given coin to this `Coins` instance. + /// Errors in case of overflow. pub fn add(&mut self, coin: Coin) -> StdResult<()> { if coin.amount.is_zero() { return Ok(()); @@ -177,24 +179,28 @@ impl Coins { Ok(()) } - /// Subtracts the given coin or collection of coins from this `Coins` instance. - /// Errors in case of overflow or if one of the coins is not present. + /// Subtracts the given coin from this `Coins` instance. + /// Errors in case of overflow or if the denom is not present. pub fn sub(&mut self, coin: Coin) -> StdResult<()> { match self.0.get_mut(&coin.denom) { Some(v) => { *v = v.checked_sub(coin.amount)?; - // make sure to remove zero coins + // make sure to remove zero coin if v.is_zero() { self.0.remove(&coin.denom); } } None => { + // ignore zero subtraction + if coin.amount.is_zero() { + return Ok(()); + } return Err(OverflowError::new( OverflowOperation::Sub, Uint128::zero(), coin.amount, ) - .into()) + .into()); } } @@ -321,13 +327,23 @@ mod tests { #[test] fn add_coin() { let mut coins = mock_coins(); - coins.add(coin(12345, "uatom")).unwrap(); + // existing denom + coins.add(coin(12345, "uatom")).unwrap(); assert_eq!(coins.len(), 3); assert_eq!(coins.amount_of("uatom").u128(), 24690); + // new denom coins.add(coin(123, "uusd")).unwrap(); assert_eq!(coins.len(), 4); + + // zero amount + coins.add(coin(0, "uusd")).unwrap(); + assert_eq!(coins.amount_of("uusd").u128(), 123); + + // zero amount, new denom + coins.add(coin(0, "utest")).unwrap(); + assert_eq!(coins.len(), 4); } #[test] @@ -350,5 +366,15 @@ mod tests { // full sub coins.sub(coin(12344, "uatom")).unwrap(); assert!(coins.is_empty()); + + // sub zero, existing denom + coins.sub(coin(0, "uusd")).unwrap(); + assert!(coins.is_empty()); + let mut coins: Coins = coin(12345, "uatom").into(); + + // sub zero, non-existent denom + coins.sub(coin(0, "uatom")).unwrap(); + assert_eq!(coins.len(), 1); + assert_eq!(coins.amount_of("uatom").u128(), 12345); } } From 3f5ea72a6425021f4ac02648b3694025558a7ac4 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 7 Jun 2023 12:17:05 +0200 Subject: [PATCH 0421/2372] Add Coin to Coins conversion test --- packages/std/src/coins.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index 0c0877ddbe..1548cfffad 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -377,4 +377,16 @@ mod tests { assert_eq!(coins.len(), 1); assert_eq!(coins.amount_of("uatom").u128(), 12345); } + + #[test] + fn coin_to_coins() { + // zero coin results in empty collection + let coins: Coins = coin(0, "uusd").into(); + assert!(coins.is_empty()); + + // happy path + let coins = Coins::from(coin(12345, "uatom")); + assert_eq!(coins.len(), 1); + assert_eq!(coins.amount_of("uatom").u128(), 12345); + } } From df8ff96ff885f857d7f561e6f65480047127d85e Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 19 Jun 2023 14:25:46 +0200 Subject: [PATCH 0422/2372] Add Coins to changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0eb9f1ba98..7cf92978dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,8 +9,10 @@ and this project adheres to ### Added - cosmwasm-std: Add `FromStr` impl for `Coin`. ([#1684]) +- cosmwasm-std: Add `Coins` helper to handle multiple coins. ([#1687]) [#1684]: https://github.com/CosmWasm/cosmwasm/pull/1684 +[#1687]: https://github.com/CosmWasm/cosmwasm/pull/1687 ### Changed From c5717a790534fbfc6bd75782404d1bb595055918 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 22 Jun 2023 12:52:49 +0200 Subject: [PATCH 0423/2372] Fix bank mock querier --- packages/std/src/testing/mock.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 3bdcb5ea95..ff562c3375 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -478,6 +478,10 @@ impl MockQuerier { self.bank.update_balance(addr, balance) } + pub fn set_denom_metadata(&mut self, denom_metadata: &[DenomMetadata]) { + self.bank.set_denom_metadata(denom_metadata); + } + #[cfg(feature = "staking")] pub fn update_staking( &mut self, @@ -635,6 +639,8 @@ impl BankQuerier { pub fn set_denom_metadata(&mut self, denom_metadata: &[DenomMetadata]) { self.denom_metadata = denom_metadata.to_vec(); + self.denom_metadata + .sort_unstable_by(|a, b| a.symbol.cmp(&b.symbol)); } fn calculate_supplies(balances: &HashMap>) -> HashMap { @@ -1376,6 +1382,10 @@ mod tests { let res2: AllDenomMetadataResponse = from_binary(&res2).unwrap(); assert_eq!(res2.metadata.len(), 10); assert_ne!(res.metadata.last(), res2.metadata.first()); + // should have no overlap + for m in res.metadata { + assert!(!res2.metadata.contains(&m)); + } // querying all 100 should work let res = bank From 7e96644e08d08f0e9f2fc16eb3b6b75670c1f97a Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 22 Jun 2023 12:55:12 +0200 Subject: [PATCH 0424/2372] Add Denoms query to cyberpunk contract --- contracts/cyberpunk/Cargo.toml | 2 +- contracts/cyberpunk/src/contract.rs | 78 +++++++++++++++++++++++++++-- contracts/cyberpunk/src/msg.rs | 4 ++ 3 files changed, 79 insertions(+), 5 deletions(-) diff --git a/contracts/cyberpunk/Cargo.toml b/contracts/cyberpunk/Cargo.toml index 67efa29d00..c2db096f28 100644 --- a/contracts/cyberpunk/Cargo.toml +++ b/contracts/cyberpunk/Cargo.toml @@ -30,7 +30,7 @@ backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } -cosmwasm-std = { path = "../../packages/std", default-features = false, features = ["abort"] } +cosmwasm-std = { path = "../../packages/std", default-features = false, features = ["abort", "cosmwasm_1_3"] } rust-argon2 = "0.8" thiserror = "1.0.26" diff --git a/contracts/cyberpunk/src/contract.rs b/contracts/cyberpunk/src/contract.rs index 55acddaf6b..33a9223112 100644 --- a/contracts/cyberpunk/src/contract.rs +++ b/contracts/cyberpunk/src/contract.rs @@ -1,6 +1,6 @@ use cosmwasm_std::{ - entry_point, to_binary, Api, Deps, DepsMut, Empty, Env, MessageInfo, QueryResponse, Response, - StdError, StdResult, WasmMsg, + entry_point, to_binary, Api, Deps, DepsMut, Empty, Env, MessageInfo, PageRequest, + QueryResponse, Response, StdError, StdResult, WasmMsg, }; use crate::errors::ContractError; @@ -179,11 +179,12 @@ fn execute_debug(api: &dyn Api) -> Result { } #[entry_point] -pub fn query(_deps: Deps, env: Env, msg: QueryMsg) -> StdResult { +pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { use QueryMsg::*; match msg { MirrorEnv {} => to_binary(&query_mirror_env(env)), + Denoms {} => to_binary(&query_denoms(deps)?), } } @@ -191,13 +192,38 @@ fn query_mirror_env(env: Env) -> Env { env } +fn query_denoms(deps: Deps) -> StdResult<(String, Vec)> { + let metadata = deps.querier.query_denom_metadata("uatom")?; + + const PAGE_SIZE: u32 = 10; + let mut next_key = None; + let mut all_metadata = Vec::new(); + loop { + let page = deps.querier.query_all_denom_metadata(PageRequest { + key: next_key, + limit: PAGE_SIZE, + reverse: false, + })?; + + let len = page.metadata.len() as u32; + all_metadata.extend(page.metadata.into_iter().map(|m| m.symbol)); + next_key = page.next_key; + + if next_key.is_none() || len < PAGE_SIZE { + break; + } + } + + Ok((metadata.symbol, all_metadata)) +} + #[cfg(test)] mod tests { use super::*; use cosmwasm_std::testing::{ mock_dependencies, mock_env, mock_info, MockApi, MockQuerier, MockStorage, }; - use cosmwasm_std::OwnedDeps; + use cosmwasm_std::{from_binary, DenomMetadata, DenomUnit, OwnedDeps}; fn setup() -> OwnedDeps { let mut deps = mock_dependencies(); @@ -220,4 +246,48 @@ mod tests { let msg = ExecuteMsg::Debug {}; execute(deps.as_mut(), mock_env(), mock_info("caller", &[]), msg).unwrap(); } + + #[test] + fn query_denoms_works() { + let mut deps = setup(); + + deps.querier.set_denom_metadata( + &(0..98) + .map(|i| DenomMetadata { + symbol: format!("FOO{i}"), + name: "Foo".to_string(), + description: "Foo coin".to_string(), + denom_units: vec![DenomUnit { + denom: "ufoo".to_string(), + exponent: 8, + aliases: vec!["microfoo".to_string(), "foobar".to_string()], + }], + display: "FOO".to_string(), + base: "ufoo".to_string(), + uri: "https://foo.bar".to_string(), + uri_hash: "foo".to_string(), + }) + .chain(std::iter::once(DenomMetadata { + description: "Atom".to_string(), + denom_units: vec![DenomUnit { + denom: "uatom".to_string(), + exponent: 8, + aliases: vec!["microatom".to_string()], + }], + base: "uatom".to_string(), + display: "ATOM".to_string(), + name: "Cosmos Atom".to_string(), + symbol: "ATOM".to_string(), + uri: "https://cosmos.network".to_string(), + uri_hash: "hash".to_string(), + })) + .collect::>(), + ); + + let (atom, symbols): (String, Vec) = + from_binary(&query(deps.as_ref(), mock_env(), QueryMsg::Denoms {}).unwrap()).unwrap(); + + assert_eq!(atom, "ATOM"); + assert_eq!(symbols.len(), 99); + } } diff --git a/contracts/cyberpunk/src/msg.rs b/contracts/cyberpunk/src/msg.rs index 7abb882009..74104c0344 100644 --- a/contracts/cyberpunk/src/msg.rs +++ b/contracts/cyberpunk/src/msg.rs @@ -38,4 +38,8 @@ pub enum QueryMsg { /// Returns the env for testing #[returns(cosmwasm_std::Env)] MirrorEnv {}, + + /// Queries `DenomMetadata` and `AllDenomMetadata` from the bank module and returns the symbols + #[returns((String, Vec))] + Denoms {}, } From acdd4e7b2d7d4c7d37f6ccb1873d090cd878c6cf Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 22 Jun 2023 16:50:53 +0200 Subject: [PATCH 0425/2372] Use BTreeMap for denom metadata mock --- contracts/cyberpunk/src/contract.rs | 2 +- packages/std/src/testing/mock.rs | 42 +++++++++++++++++------------ 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/contracts/cyberpunk/src/contract.rs b/contracts/cyberpunk/src/contract.rs index 33a9223112..25d2d23584 100644 --- a/contracts/cyberpunk/src/contract.rs +++ b/contracts/cyberpunk/src/contract.rs @@ -263,7 +263,7 @@ mod tests { aliases: vec!["microfoo".to_string(), "foobar".to_string()], }], display: "FOO".to_string(), - base: "ufoo".to_string(), + base: format!("ufoo{i}"), uri: "https://foo.bar".to_string(), uri_hash: "foo".to_string(), }) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index ff562c3375..3b5ce6f253 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -1,8 +1,10 @@ use serde::de::DeserializeOwned; #[cfg(feature = "stargate")] use serde::Serialize; -use std::collections::HashMap; +use std::collections::{BTreeMap, HashMap}; use std::marker::PhantomData; +#[cfg(feature = "cosmwasm_1_3")] +use std::ops::Bound; use crate::addresses::{Addr, CanonicalAddr}; use crate::binary::Binary; @@ -609,7 +611,7 @@ pub struct BankQuerier { /// HashMap balances: HashMap>, /// Vec - denom_metadata: Vec, + denom_metadata: BTreeMap, DenomMetadata>, } impl BankQuerier { @@ -622,7 +624,7 @@ impl BankQuerier { BankQuerier { supplies: Self::calculate_supplies(&balances), balances, - denom_metadata: Vec::new(), + denom_metadata: BTreeMap::new(), } } @@ -638,9 +640,10 @@ impl BankQuerier { } pub fn set_denom_metadata(&mut self, denom_metadata: &[DenomMetadata]) { - self.denom_metadata = denom_metadata.to_vec(); - self.denom_metadata - .sort_unstable_by(|a, b| a.symbol.cmp(&b.symbol)); + self.denom_metadata = denom_metadata + .iter() + .map(|d| (d.base.as_bytes().to_vec(), d.clone())) + .collect(); } fn calculate_supplies(balances: &HashMap>) -> HashMap { @@ -698,7 +701,7 @@ impl BankQuerier { } #[cfg(feature = "cosmwasm_1_3")] BankQuery::DenomMetadata { denom } => { - let denom_metadata = self.denom_metadata.iter().find(|m| &m.base == denom); + let denom_metadata = self.denom_metadata.get(denom.as_bytes()); match denom_metadata { Some(m) => { let metadata_res = DenomMetadataResponse { @@ -717,26 +720,31 @@ impl BankQuerier { reverse: false, }; let pagination = pagination.as_ref().unwrap_or(&default_pagination); + + // range of all denoms after the given key (or until the key for reverse) + let range = match (pagination.reverse, &pagination.key) { + (_, None) => (Bound::Unbounded, Bound::Unbounded), + (true, Some(key)) => (Bound::Unbounded, Bound::Included(key.as_slice())), + (false, Some(key)) => (Bound::Included(key.as_slice()), Bound::Unbounded), + }; + let iter = self.denom_metadata.range::<[u8], _>(range); // using dynamic dispatch here to reduce code duplication and since this is only testing code - let iter: Box> = if pagination.reverse { - Box::new(self.denom_metadata.iter().rev().cloned()) + let iter: Box> = if pagination.reverse { + Box::new(iter.rev()) } else { - Box::new(self.denom_metadata.iter().cloned()) + Box::new(iter) }; + let mut metadata: Vec<_> = iter - // skip until we find the key - .skip_while(|m| match &pagination.key { - Some(key) => m.symbol.as_bytes() < key, - None => false, - }) // take the requested amount + 1 to get the next key .take((pagination.limit.saturating_add(1)) as usize) + .map(|(_, m)| m.clone()) .collect(); // if we took more than requested, remove the last element (the next key), // otherwise this is the last batch let next_key = if metadata.len() > pagination.limit as usize { - metadata.pop().map(|m| Binary::from(m.symbol.as_bytes())) + metadata.pop().map(|m| Binary::from(m.base.as_bytes())) } else { None }; @@ -1346,7 +1354,7 @@ mod tests { aliases: vec!["microfoo".to_string(), "foobar".to_string()], }], display: "FOO".to_string(), - base: "ufoo".to_string(), + base: format!("ufoo{i}"), uri: "https://foo.bar".to_string(), uri_hash: "foo".to_string(), }) From feab42e450f21f823efd1444015f0ba84e0d7d6a Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 22 Jun 2023 17:17:12 +0200 Subject: [PATCH 0426/2372] Split Denoms query up --- contracts/cyberpunk/src/contract.rs | 50 +++++++++++++++-------------- contracts/cyberpunk/src/msg.rs | 9 ++++-- 2 files changed, 33 insertions(+), 26 deletions(-) diff --git a/contracts/cyberpunk/src/contract.rs b/contracts/cyberpunk/src/contract.rs index 25d2d23584..7de7d80fd2 100644 --- a/contracts/cyberpunk/src/contract.rs +++ b/contracts/cyberpunk/src/contract.rs @@ -1,6 +1,6 @@ use cosmwasm_std::{ - entry_point, to_binary, Api, Deps, DepsMut, Empty, Env, MessageInfo, PageRequest, - QueryResponse, Response, StdError, StdResult, WasmMsg, + entry_point, to_binary, Api, DenomMetadata, Deps, DepsMut, Empty, Env, MessageInfo, + PageRequest, QueryResponse, Response, StdError, StdResult, WasmMsg, }; use crate::errors::ContractError; @@ -185,6 +185,7 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { match msg { MirrorEnv {} => to_binary(&query_mirror_env(env)), Denoms {} => to_binary(&query_denoms(deps)?), + Denom { denom } => to_binary(&query_denom(deps, denom)?), } } @@ -192,9 +193,7 @@ fn query_mirror_env(env: Env) -> Env { env } -fn query_denoms(deps: Deps) -> StdResult<(String, Vec)> { - let metadata = deps.querier.query_denom_metadata("uatom")?; - +fn query_denoms(deps: Deps) -> StdResult> { const PAGE_SIZE: u32 = 10; let mut next_key = None; let mut all_metadata = Vec::new(); @@ -206,7 +205,7 @@ fn query_denoms(deps: Deps) -> StdResult<(String, Vec)> { })?; let len = page.metadata.len() as u32; - all_metadata.extend(page.metadata.into_iter().map(|m| m.symbol)); + all_metadata.extend(page.metadata.into_iter()); next_key = page.next_key; if next_key.is_none() || len < PAGE_SIZE { @@ -214,7 +213,11 @@ fn query_denoms(deps: Deps) -> StdResult<(String, Vec)> { } } - Ok((metadata.symbol, all_metadata)) + Ok(all_metadata) +} + +fn query_denom(deps: Deps, denom: String) -> StdResult { + deps.querier.query_denom_metadata(denom) } #[cfg(test)] @@ -267,27 +270,26 @@ mod tests { uri: "https://foo.bar".to_string(), uri_hash: "foo".to_string(), }) - .chain(std::iter::once(DenomMetadata { - description: "Atom".to_string(), - denom_units: vec![DenomUnit { - denom: "uatom".to_string(), - exponent: 8, - aliases: vec!["microatom".to_string()], - }], - base: "uatom".to_string(), - display: "ATOM".to_string(), - name: "Cosmos Atom".to_string(), - symbol: "ATOM".to_string(), - uri: "https://cosmos.network".to_string(), - uri_hash: "hash".to_string(), - })) .collect::>(), ); - let (atom, symbols): (String, Vec) = + let symbols: Vec = from_binary(&query(deps.as_ref(), mock_env(), QueryMsg::Denoms {}).unwrap()).unwrap(); - assert_eq!(atom, "ATOM"); - assert_eq!(symbols.len(), 99); + assert_eq!(symbols.len(), 98); + + let denom: DenomMetadata = from_binary( + &query( + deps.as_ref(), + mock_env(), + QueryMsg::Denom { + denom: "ufoo0".to_string(), + }, + ) + .unwrap(), + ) + .unwrap(); + + assert_eq!(denom.symbol, "FOO0"); } } diff --git a/contracts/cyberpunk/src/msg.rs b/contracts/cyberpunk/src/msg.rs index 74104c0344..8e9ee80bf6 100644 --- a/contracts/cyberpunk/src/msg.rs +++ b/contracts/cyberpunk/src/msg.rs @@ -1,4 +1,5 @@ use cosmwasm_schema::{cw_serde, QueryResponses}; +use cosmwasm_std::DenomMetadata; #[cw_serde] pub enum ExecuteMsg { @@ -39,7 +40,11 @@ pub enum QueryMsg { #[returns(cosmwasm_std::Env)] MirrorEnv {}, - /// Queries `DenomMetadata` and `AllDenomMetadata` from the bank module and returns the symbols - #[returns((String, Vec))] + /// Queries `AllDenomMetadata` from the bank module repeatedly and returns all entries + #[returns(Vec)] Denoms {}, + + /// Queries `DenomMetadata` from the bank module and returns the result + #[returns(DenomMetadata)] + Denom { denom: String }, } From 0d0f8199fa50391a4ccd149f7116e63b2b0bfd4f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 22 Jun 2023 17:17:32 +0200 Subject: [PATCH 0427/2372] Update cyberpunk schemas --- contracts/cyberpunk/schema/cyberpunk.json | 186 ++++++++++++++++++ contracts/cyberpunk/schema/raw/query.json | 36 ++++ .../schema/raw/response_to_denom.json | 72 +++++++ .../schema/raw/response_to_denoms.json | 78 ++++++++ 4 files changed, 372 insertions(+) create mode 100644 contracts/cyberpunk/schema/raw/response_to_denom.json create mode 100644 contracts/cyberpunk/schema/raw/response_to_denoms.json diff --git a/contracts/cyberpunk/schema/cyberpunk.json b/contracts/cyberpunk/schema/cyberpunk.json index dcce96d609..ccb550b1ad 100644 --- a/contracts/cyberpunk/schema/cyberpunk.json +++ b/contracts/cyberpunk/schema/cyberpunk.json @@ -199,12 +199,198 @@ } }, "additionalProperties": false + }, + { + "description": "Queries `AllDenomMetadata` from the bank module repeatedly and returns all entries", + "type": "object", + "required": [ + "denoms" + ], + "properties": { + "denoms": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Queries `DenomMetadata` from the bank module and returns the result", + "type": "object", + "required": [ + "denom" + ], + "properties": { + "denom": { + "type": "object", + "required": [ + "denom" + ], + "properties": { + "denom": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false } ] }, "migrate": null, "sudo": null, "responses": { + "denom": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "DenomMetadata", + "description": "Replicates the cosmos-sdk bank module Metadata type", + "type": "object", + "required": [ + "base", + "denom_units", + "description", + "display", + "name", + "symbol", + "uri", + "uri_hash" + ], + "properties": { + "base": { + "type": "string" + }, + "denom_units": { + "type": "array", + "items": { + "$ref": "#/definitions/DenomUnit" + } + }, + "description": { + "type": "string" + }, + "display": { + "type": "string" + }, + "name": { + "type": "string" + }, + "symbol": { + "type": "string" + }, + "uri": { + "type": "string" + }, + "uri_hash": { + "type": "string" + } + }, + "definitions": { + "DenomUnit": { + "description": "Replicates the cosmos-sdk bank module DenomUnit type", + "type": "object", + "required": [ + "aliases", + "denom", + "exponent" + ], + "properties": { + "aliases": { + "type": "array", + "items": { + "type": "string" + } + }, + "denom": { + "type": "string" + }, + "exponent": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + } + } + } + }, + "denoms": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Array_of_DenomMetadata", + "type": "array", + "items": { + "$ref": "#/definitions/DenomMetadata" + }, + "definitions": { + "DenomMetadata": { + "description": "Replicates the cosmos-sdk bank module Metadata type", + "type": "object", + "required": [ + "base", + "denom_units", + "description", + "display", + "name", + "symbol", + "uri", + "uri_hash" + ], + "properties": { + "base": { + "type": "string" + }, + "denom_units": { + "type": "array", + "items": { + "$ref": "#/definitions/DenomUnit" + } + }, + "description": { + "type": "string" + }, + "display": { + "type": "string" + }, + "name": { + "type": "string" + }, + "symbol": { + "type": "string" + }, + "uri": { + "type": "string" + }, + "uri_hash": { + "type": "string" + } + } + }, + "DenomUnit": { + "description": "Replicates the cosmos-sdk bank module DenomUnit type", + "type": "object", + "required": [ + "aliases", + "denom", + "exponent" + ], + "properties": { + "aliases": { + "type": "array", + "items": { + "type": "string" + } + }, + "denom": { + "type": "string" + }, + "exponent": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + } + } + } + }, "mirror_env": { "$schema": "http://json-schema.org/draft-07/schema#", "title": "Env", diff --git a/contracts/cyberpunk/schema/raw/query.json b/contracts/cyberpunk/schema/raw/query.json index 18c07a5622..47b493442f 100644 --- a/contracts/cyberpunk/schema/raw/query.json +++ b/contracts/cyberpunk/schema/raw/query.json @@ -15,6 +15,42 @@ } }, "additionalProperties": false + }, + { + "description": "Queries `AllDenomMetadata` from the bank module repeatedly and returns all entries", + "type": "object", + "required": [ + "denoms" + ], + "properties": { + "denoms": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Queries `DenomMetadata` from the bank module and returns the result", + "type": "object", + "required": [ + "denom" + ], + "properties": { + "denom": { + "type": "object", + "required": [ + "denom" + ], + "properties": { + "denom": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false } ] } diff --git a/contracts/cyberpunk/schema/raw/response_to_denom.json b/contracts/cyberpunk/schema/raw/response_to_denom.json new file mode 100644 index 0000000000..b541da804b --- /dev/null +++ b/contracts/cyberpunk/schema/raw/response_to_denom.json @@ -0,0 +1,72 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "DenomMetadata", + "description": "Replicates the cosmos-sdk bank module Metadata type", + "type": "object", + "required": [ + "base", + "denom_units", + "description", + "display", + "name", + "symbol", + "uri", + "uri_hash" + ], + "properties": { + "base": { + "type": "string" + }, + "denom_units": { + "type": "array", + "items": { + "$ref": "#/definitions/DenomUnit" + } + }, + "description": { + "type": "string" + }, + "display": { + "type": "string" + }, + "name": { + "type": "string" + }, + "symbol": { + "type": "string" + }, + "uri": { + "type": "string" + }, + "uri_hash": { + "type": "string" + } + }, + "definitions": { + "DenomUnit": { + "description": "Replicates the cosmos-sdk bank module DenomUnit type", + "type": "object", + "required": [ + "aliases", + "denom", + "exponent" + ], + "properties": { + "aliases": { + "type": "array", + "items": { + "type": "string" + } + }, + "denom": { + "type": "string" + }, + "exponent": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + } + } + } +} diff --git a/contracts/cyberpunk/schema/raw/response_to_denoms.json b/contracts/cyberpunk/schema/raw/response_to_denoms.json new file mode 100644 index 0000000000..e8fcd9a16e --- /dev/null +++ b/contracts/cyberpunk/schema/raw/response_to_denoms.json @@ -0,0 +1,78 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Array_of_DenomMetadata", + "type": "array", + "items": { + "$ref": "#/definitions/DenomMetadata" + }, + "definitions": { + "DenomMetadata": { + "description": "Replicates the cosmos-sdk bank module Metadata type", + "type": "object", + "required": [ + "base", + "denom_units", + "description", + "display", + "name", + "symbol", + "uri", + "uri_hash" + ], + "properties": { + "base": { + "type": "string" + }, + "denom_units": { + "type": "array", + "items": { + "$ref": "#/definitions/DenomUnit" + } + }, + "description": { + "type": "string" + }, + "display": { + "type": "string" + }, + "name": { + "type": "string" + }, + "symbol": { + "type": "string" + }, + "uri": { + "type": "string" + }, + "uri_hash": { + "type": "string" + } + } + }, + "DenomUnit": { + "description": "Replicates the cosmos-sdk bank module DenomUnit type", + "type": "object", + "required": [ + "aliases", + "denom", + "exponent" + ], + "properties": { + "aliases": { + "type": "array", + "items": { + "type": "string" + } + }, + "denom": { + "type": "string" + }, + "exponent": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + } + } + } +} From 476a7b4c1826e99cf5edb5a934c3ec1e3ab294c2 Mon Sep 17 00:00:00 2001 From: Nikhil Suri Date: Fri, 24 Mar 2023 21:24:18 +0000 Subject: [PATCH 0428/2372] std: Add BankQuery::AllDenomMetadata gated by cosmwasm_1_3 feature flag (cherry picked from commit 4bac1e3cb3769570c91f2cd44bf1232111424ab4) # Conflicts: # CHANGELOG.md # docs/USING_COSMWASM_STD.md --- .circleci/config.yml | 10 +++++----- CHANGELOG.md | 16 ++++++++++++++++ MIGRATING.md | 4 ++-- docs/CAPABILITIES-BUILT-IN.md | 2 ++ docs/USING_COSMWASM_STD.md | 14 ++++++++++++++ packages/check/src/main.rs | 3 ++- packages/std/Cargo.toml | 3 +++ packages/std/src/exports.rs | 4 ++++ packages/std/src/lib.rs | 2 ++ packages/std/src/metadata.rs | 23 +++++++++++++++++++++++ packages/std/src/query/bank.rs | 19 +++++++++++++++++++ packages/std/src/query/mod.rs | 2 ++ packages/std/src/testing/mock.rs | 18 +++++++++++++++++- packages/std/src/traits.rs | 11 +++++++++++ packages/vm/src/testing/instance.rs | 3 ++- 15 files changed, 124 insertions(+), 10 deletions(-) create mode 100644 packages/std/src/metadata.rs diff --git a/.circleci/config.yml b/.circleci/config.yml index 05d72ae197..ff5bb17087 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -355,15 +355,15 @@ jobs: - run: name: Build library for native target (all features) working_directory: ~/project/packages/std - command: cargo build --locked --features abort,iterator,staking,stargate,cosmwasm_1_2 + command: cargo build --locked --features abort,iterator,staking,stargate,cosmwasm_1_3 - run: name: Build library for wasm target (all features) working_directory: ~/project/packages/std - command: cargo wasm --locked --features abort,iterator,staking,stargate,cosmwasm_1_2 + command: cargo wasm --locked --features abort,iterator,staking,stargate,cosmwasm_1_3 - run: name: Run unit tests (all features) working_directory: ~/project/packages/std - command: cargo test --locked --features abort,iterator,staking,stargate,cosmwasm_1_2 + command: cargo test --locked --features abort,iterator,staking,stargate,cosmwasm_1_3 - save_cache: paths: - /usr/local/cargo/registry @@ -906,7 +906,7 @@ jobs: - run: name: Clippy linting on std (all feature flags) working_directory: ~/project/packages/std - command: cargo clippy --all-targets --features abort,iterator,staking,stargate,cosmwasm_1_2 -- -D warnings + command: cargo clippy --all-targets --features abort,iterator,staking,stargate,cosmwasm_1_3 -- -D warnings - run: name: Clippy linting on storage (no feature flags) working_directory: ~/project/packages/storage @@ -983,7 +983,7 @@ jobs: CRYPTO=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/crypto --packages cosmwasm-crypto" DERIVE=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/derive --packages cosmwasm-derive" SCHEMA=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/schema --packages cosmwasm-schema" - STD=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/std --packages cosmwasm-std --features abort,iterator,staking,stargate,cosmwasm_1_2" + STD=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/std --packages cosmwasm-std --features abort,iterator,staking,stargate,cosmwasm_1_3" STORAGE="cargo tarpaulin --skip-clean --out Xml --output-dir reports/storage --packages cosmwasm-storage" docker run --security-opt seccomp=unconfined -v "${PWD}:/volume" xd009642/tarpaulin:0.21.0 \ sh -c "$CRYPTO && $DERIVE && $SCHEMA && $STD && $STORAGE" diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cf92978dc..b4158a9a3c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,9 +8,25 @@ and this project adheres to ### Added +<<<<<<< HEAD +======= +- cosmwasm-std: Implement `BankQuery::AllDenomMetadata` to allow querying all + the denom metadata. In order to use this query in a contract, the + `cosmwasm_1_3` feature needs to be enabled for the `cosmwasm_std` dependency. + This makes the contract incompatible with chains running anything lower than + CosmWasm `1.3.0`. ([#1647]) +- cosmwasm-vm: Add `Cache::save_wasm_unchecked` to save Wasm blobs that have + been checked before. This is useful for state-sync where we know the Wasm code + was checked when it was first uploaded. ([#1635]) +>>>>>>> 4bac1e3c (std: Add BankQuery::AllDenomMetadata gated by cosmwasm_1_3 feature flag) - cosmwasm-std: Add `FromStr` impl for `Coin`. ([#1684]) - cosmwasm-std: Add `Coins` helper to handle multiple coins. ([#1687]) +<<<<<<< HEAD +======= +[#1635]: https://github.com/CosmWasm/cosmwasm/pull/1635 +[#1647]: https://github.com/CosmWasm/cosmwasm/pull/1647 +>>>>>>> 4bac1e3c (std: Add BankQuery::AllDenomMetadata gated by cosmwasm_1_3 feature flag) [#1684]: https://github.com/CosmWasm/cosmwasm/pull/1684 [#1687]: https://github.com/CosmWasm/cosmwasm/pull/1687 diff --git a/MIGRATING.md b/MIGRATING.md index 0000f999fc..c65a29de5c 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -28,8 +28,8 @@ major releases of `cosmwasm`. Note that you can also view the +cosmwasm-std = { version = "1.1.0", features = ["stargate", "cosmwasm_1_2"] } ``` - Please note that `cosmwasm_1_2` implies `cosmwasm_1_1`, so there is no need to - set both. + Please note that `cosmwasm_1_2` implies `cosmwasm_1_1`, and `cosmwasm_1_3` + implies `cosmwasm_1_2`, and so on, so there is no need to set multiple. - If you use mixed type multiplication between `Uint{64,128,256}` and `Decimal{,256}`, check out diff --git a/docs/CAPABILITIES-BUILT-IN.md b/docs/CAPABILITIES-BUILT-IN.md index 8fdd679fe1..190c9f825d 100644 --- a/docs/CAPABILITIES-BUILT-IN.md +++ b/docs/CAPABILITIES-BUILT-IN.md @@ -15,3 +15,5 @@ might define others. CosmWasm `1.1.0` or higher support this. - `cosmwasm_1_2` enables the `GovMsg::VoteWeighted` and `WasmMsg::Instantiate2` messages. Only chains running CosmWasm `1.2.0` or higher support this. +- `cosmwasm_1_3` enables the `BankQuery::AllDenomMetadata` query. Only chains + running CosmWasm `1.3.0` or higher support this. diff --git a/docs/USING_COSMWASM_STD.md b/docs/USING_COSMWASM_STD.md index 45841e908b..28f91a51f6 100644 --- a/docs/USING_COSMWASM_STD.md +++ b/docs/USING_COSMWASM_STD.md @@ -34,6 +34,7 @@ in the dependency tree. Otherwise conflicting C exports are created. The libarary comes with the following features: +<<<<<<< HEAD | Feature | Enabled by default | Description | | ------------ | ------------------ | -------------------------------------------------------------------------- | | iterator | x | Storage iterators | @@ -44,6 +45,19 @@ The libarary comes with the following features: | baktraces | | Add backtraces to errors (for unit testing) | | cosmwasm_1_1 | | Features that require CosmWasm 1.1+ on the chain | | cosmwasm_1_2 | | Features that require CosmWasm 1.2+ on the chain | +======= +| Feature | Enabled by default | Description | +| ------------ | ------------------ | ------------------------------------------------------------------------- | +| iterator | x | Storage iterators | +| abort | x | A panic handler that aborts the contract execution with a helpful message | +| stargate | | Cosmos SDK 0.40+ features and IBC | +| ibc3 | | New fields added in IBC v3 | +| staking | | Access to the staking module | +| backtraces | | Add backtraces to errors (for unit testing) | +| cosmwasm_1_1 | | Features that require CosmWasm 1.1+ on the chain | +| cosmwasm_1_2 | | Features that require CosmWasm 1.2+ on the chain | +| cosmwasm_1_3 | | Features that require CosmWasm 1.3+ on the chain | +>>>>>>> 4bac1e3c (std: Add BankQuery::AllDenomMetadata gated by cosmwasm_1_3 feature flag) ## The cosmwasm-std dependency for contract developers diff --git a/packages/check/src/main.rs b/packages/check/src/main.rs index c1f7da1784..f3efc4355c 100644 --- a/packages/check/src/main.rs +++ b/packages/check/src/main.rs @@ -10,7 +10,8 @@ use colored::Colorize; use cosmwasm_vm::capabilities_from_csv; use cosmwasm_vm::internals::{check_wasm, compile}; -const DEFAULT_AVAILABLE_CAPABILITIES: &str = "iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2"; +const DEFAULT_AVAILABLE_CAPABILITIES: &str = + "iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2,cosmwasm_1_3"; pub fn main() { let matches = App::new("Contract checking") diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index d5929f0ee6..74764ddfa8 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -39,6 +39,9 @@ cosmwasm_1_1 = [] # This feature makes `GovMsg::VoteWeighted` available for the contract to call, but requires # the host blockchain to run CosmWasm `1.2.0` or higher. cosmwasm_1_2 = ["cosmwasm_1_1"] +# This feature makes `BankQuery::DenomMetadata` available for the contract to call, but requires +# the host blockchain to run CosmWasm `1.3.0` or higher. +cosmwasm_1_3 = ["cosmwasm_1_2"] [dependencies] base64 = "0.13.0" diff --git a/packages/std/src/exports.rs b/packages/std/src/exports.rs index 5b4b30925c..27c46768dc 100644 --- a/packages/std/src/exports.rs +++ b/packages/std/src/exports.rs @@ -49,6 +49,10 @@ extern "C" fn requires_cosmwasm_1_1() -> () {} #[no_mangle] extern "C" fn requires_cosmwasm_1_2() -> () {} +#[cfg(feature = "cosmwasm_1_3")] +#[no_mangle] +extern "C" fn requires_cosmwasm_1_3() -> () {} + /// interface_version_* exports mark which Wasm VM interface level this contract is compiled for. /// They can be checked by cosmwasm_vm. /// Update this whenever the Wasm VM interface breaks. diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 98e8e45f9b..b3494ea65b 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -18,6 +18,7 @@ mod import_helpers; #[cfg(feature = "iterator")] mod iterator; mod math; +mod metadata; mod never; mod panic; mod query; @@ -53,6 +54,7 @@ pub use crate::math::{ Decimal, Decimal256, Decimal256RangeExceeded, DecimalRangeExceeded, Fraction, Isqrt, Uint128, Uint256, Uint512, Uint64, }; +pub use crate::metadata::{DenomMetadata, DenomUnit}; pub use crate::never::Never; #[cfg(feature = "cosmwasm_1_2")] pub use crate::query::CodeInfoResponse; diff --git a/packages/std/src/metadata.rs b/packages/std/src/metadata.rs new file mode 100644 index 0000000000..d3400a49a5 --- /dev/null +++ b/packages/std/src/metadata.rs @@ -0,0 +1,23 @@ +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +use crate::math::Uint128; + +#[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] +pub struct DenomMetadata { + pub description: String, + pub denom_units: Vec, + pub base: String, + pub display: String, + pub name: String, + pub symbol: String, + pub uri: String, + pub uri_hash: String, +} + +#[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] +pub struct DenomUnit { + pub denom: String, + pub exponent: Uint128, + pub aliases: Vec, +} diff --git a/packages/std/src/query/bank.rs b/packages/std/src/query/bank.rs index b3a43e11d5..222fc86e17 100644 --- a/packages/std/src/query/bank.rs +++ b/packages/std/src/query/bank.rs @@ -3,6 +3,9 @@ use serde::{Deserialize, Serialize}; use crate::Coin; +#[cfg(feature = "cosmwasm_1_3")] +use crate::DenomMetadata; + use super::query_response::QueryResponseType; #[non_exhaustive] @@ -21,6 +24,10 @@ pub enum BankQuery { /// Note that this may be much more expensive than Balance and should be avoided if possible. /// Return value is AllBalanceResponse. AllBalances { address: String }, + /// This calls into the native bank module for querying metadata for all bank tokens. + /// Return value is AllDenomMetadataResponse + #[cfg(feature = "cosmwasm_1_3")] + AllDenomMetadata {}, } #[cfg(feature = "cosmwasm_1_1")] @@ -54,3 +61,15 @@ pub struct AllBalanceResponse { } impl QueryResponseType for AllBalanceResponse {} + +#[cfg(feature = "cosmwasm_1_3")] +#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq, JsonSchema)] +#[serde(rename_all = "snake_case")] +#[non_exhaustive] +pub struct AllDenomMetadataResponse { + /// Always returns metadata for all token denoms on the base chain. + pub metadata: Vec, +} + +#[cfg(feature = "cosmwasm_1_3")] +impl QueryResponseType for AllDenomMetadataResponse {} diff --git a/packages/std/src/query/mod.rs b/packages/std/src/query/mod.rs index 50061df091..e79417bc99 100644 --- a/packages/std/src/query/mod.rs +++ b/packages/std/src/query/mod.rs @@ -11,6 +11,8 @@ mod query_response; mod staking; mod wasm; +#[cfg(feature = "cosmwasm_1_3")] +pub use bank::AllDenomMetadataResponse; #[cfg(feature = "cosmwasm_1_1")] pub use bank::SupplyResponse; pub use bank::{AllBalanceResponse, BalanceResponse, BankQuery}; diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index d219236578..c8bcf67f00 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -16,6 +16,8 @@ use crate::ibc::{ IbcTimeoutBlock, }; use crate::math::Uint128; +#[cfg(feature = "cosmwasm_1_3")] +use crate::query::AllDenomMetadataResponse; #[cfg(feature = "cosmwasm_1_1")] use crate::query::SupplyResponse; use crate::query::{ @@ -32,7 +34,7 @@ use crate::storage::MemoryStorage; use crate::timestamp::Timestamp; use crate::traits::{Api, Querier, QuerierResult}; use crate::types::{BlockInfo, ContractInfo, Env, MessageInfo, TransactionInfo}; -use crate::Attribute; +use crate::{Attribute, DenomMetadata}; #[cfg(feature = "stargate")] use crate::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; @@ -599,6 +601,8 @@ pub struct BankQuerier { supplies: HashMap, /// HashMap balances: HashMap>, + /// Vec + denom_metadata: Vec, } impl BankQuerier { @@ -611,6 +615,7 @@ impl BankQuerier { BankQuerier { supplies: Self::calculate_supplies(&balances), balances, + denom_metadata: Vec::new(), } } @@ -625,6 +630,10 @@ impl BankQuerier { result } + pub fn set_denom_metadata(&mut self, denom_metadata: &[DenomMetadata]) { + self.denom_metadata = denom_metadata.to_vec(); + } + fn calculate_supplies(balances: &HashMap>) -> HashMap { let mut supplies = HashMap::new(); @@ -678,6 +687,13 @@ impl BankQuerier { }; to_binary(&bank_res).into() } + #[cfg(feature = "cosmwasm_1_3")] + BankQuery::AllDenomMetadata {} => { + let metadata_res = AllDenomMetadataResponse { + metadata: self.denom_metadata.clone(), + }; + to_binary(&metadata_res).into() + } }; // system result is always ok in the mock implementation SystemResult::Ok(contract_result) diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index e3ba067b6e..79db30f6f5 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -8,6 +8,8 @@ use crate::coin::Coin; use crate::errors::{RecoverPubkeyError, StdError, StdResult, VerificationError}; #[cfg(feature = "iterator")] use crate::iterator::{Order, Record}; +#[cfg(feature = "cosmwasm_1_3")] +use crate::query::AllDenomMetadataResponse; #[cfg(feature = "cosmwasm_1_2")] use crate::query::CodeInfoResponse; #[cfg(feature = "cosmwasm_1_1")] @@ -23,6 +25,8 @@ use crate::query::{ use crate::results::{ContractResult, Empty, SystemResult}; use crate::serde::{from_binary, to_binary, to_vec}; use crate::ContractInfoResponse; +#[cfg(feature = "cosmwasm_1_3")] +use crate::DenomMetadata; /// Storage provides read and write access to a persistent storage. /// If you only want to provide read access, provide `&Storage` @@ -239,6 +243,13 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { Ok(res.amount) } + #[cfg(feature = "cosmwasm_1_3")] + pub fn query_all_denom_metadata(&self) -> StdResult> { + let request = BankQuery::AllDenomMetadata {}.into(); + let res: AllDenomMetadataResponse = self.query(&request)?; + Ok(res.metadata) + } + // this queries another wasm contract. You should know a priori the proper types for T and U // (response and request) based on the contract API pub fn query_wasm_smart( diff --git a/packages/vm/src/testing/instance.rs b/packages/vm/src/testing/instance.rs index 14b85cf7c9..6a4f11a37f 100644 --- a/packages/vm/src/testing/instance.rs +++ b/packages/vm/src/testing/instance.rs @@ -98,7 +98,8 @@ pub struct MockInstanceOptions<'a> { impl MockInstanceOptions<'_> { fn default_capabilities() -> HashSet { #[allow(unused_mut)] - let mut out = capabilities_from_csv("iterator,staking,cosmwasm_1_1,cosmwasm_1_2"); + let mut out = + capabilities_from_csv("iterator,staking,cosmwasm_1_1,cosmwasm_1_2,cosmwasm_1_3"); #[cfg(feature = "stargate")] out.insert("stargate".to_string()); out From 79a4327dce633814e9049d3ff50f99fa933c1ed8 Mon Sep 17 00:00:00 2001 From: Nikhil Suri Date: Wed, 29 Mar 2023 22:59:54 +0000 Subject: [PATCH 0429/2372] std: Update BankQuery::AllDenomMetadata query with pagination and add BankQuery::DenomMetadata also gated by cosmwasm_1_3 feature flag (cherry picked from commit 71c5a074cc5f5857a2e4c84b2cf7dd752517f757) --- MIGRATING.md | 31 +++++++++++++++++++++++++++++-- packages/std/src/lib.rs | 2 ++ packages/std/src/metadata.rs | 6 +++--- packages/std/src/pagination.rs | 14 ++++++++++++++ packages/std/src/query/bank.rs | 23 +++++++++++++++++++++-- packages/std/src/query/mod.rs | 4 ++-- packages/std/src/testing/mock.rs | 19 ++++++++++++++++--- packages/std/src/traits.rs | 23 +++++++++++++++++++---- 8 files changed, 106 insertions(+), 16 deletions(-) create mode 100644 packages/std/src/pagination.rs diff --git a/MIGRATING.md b/MIGRATING.md index c65a29de5c..33b1af3036 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -4,6 +4,33 @@ This guide explains what is needed to upgrade contracts when migrating over major releases of `cosmwasm`. Note that you can also view the [complete CHANGELOG](./CHANGELOG.md) to understand the differences. +## 1.2.x -> 1.3.0 + +- Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): + + ``` + [dependencies] + cosmwasm-std = "1.3.0" + cosmwasm-storage = "1.3.0" + # ... + + [dev-dependencies] + cosmwasm-schema = "1.3.0" + cosmwasm-vm = "1.3.0" + # ... + ``` + +- If you want to use a fewture that os only available on CosmWasm 1.3+ chains, + use this feature: + + ```diff + -cosmwasm-std = { version = "1.1.0", features = ["stargate"] } + +cosmwasm-std = { version = "1.1.0", features = ["stargate", "cosmwasm_1_3"] } + ``` + + Please note that `cosmwasm_1_2` implies `cosmwasm_1_1`, and `cosmwasm_1_3` + implies `cosmwasm_1_2`, and so on, so there is no need to set multiple. + ## 1.1.x -> 1.2.0 - Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): @@ -28,8 +55,8 @@ major releases of `cosmwasm`. Note that you can also view the +cosmwasm-std = { version = "1.1.0", features = ["stargate", "cosmwasm_1_2"] } ``` - Please note that `cosmwasm_1_2` implies `cosmwasm_1_1`, and `cosmwasm_1_3` - implies `cosmwasm_1_2`, and so on, so there is no need to set multiple. + Please note that `cosmwasm_1_2` implies `cosmwasm_1_1`, so there is no need to + set both. - If you use mixed type multiplication between `Uint{64,128,256}` and `Decimal{,256}`, check out diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index b3494ea65b..28dfcc9ec1 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -20,6 +20,7 @@ mod iterator; mod math; mod metadata; mod never; +mod pagination; mod panic; mod query; mod results; @@ -56,6 +57,7 @@ pub use crate::math::{ }; pub use crate::metadata::{DenomMetadata, DenomUnit}; pub use crate::never::Never; +pub use crate::pagination::PageRequest; #[cfg(feature = "cosmwasm_1_2")] pub use crate::query::CodeInfoResponse; #[cfg(feature = "cosmwasm_1_1")] diff --git a/packages/std/src/metadata.rs b/packages/std/src/metadata.rs index d3400a49a5..c0827ce722 100644 --- a/packages/std/src/metadata.rs +++ b/packages/std/src/metadata.rs @@ -1,8 +1,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use crate::math::Uint128; - +/// Replicates the cosmos-sdk bank module Metadata type #[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] pub struct DenomMetadata { pub description: String, @@ -15,9 +14,10 @@ pub struct DenomMetadata { pub uri_hash: String, } +/// Replicates the cosmos-sdk bank module DenomUnit type #[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] pub struct DenomUnit { pub denom: String, - pub exponent: Uint128, + pub exponent: u32, pub aliases: Vec, } diff --git a/packages/std/src/pagination.rs b/packages/std/src/pagination.rs new file mode 100644 index 0000000000..3c98de73b6 --- /dev/null +++ b/packages/std/src/pagination.rs @@ -0,0 +1,14 @@ +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +use crate::{Binary, Uint64}; + +/// Replicates the PageRequest type for pagination from the cosmos-sdk +#[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] +pub struct PageRequest { + pub key: Binary, + pub offset: Uint64, + pub limit: Uint64, + pub count_total: bool, + pub reverse: bool, +} diff --git a/packages/std/src/query/bank.rs b/packages/std/src/query/bank.rs index 222fc86e17..61bfcbf2ae 100644 --- a/packages/std/src/query/bank.rs +++ b/packages/std/src/query/bank.rs @@ -6,6 +6,9 @@ use crate::Coin; #[cfg(feature = "cosmwasm_1_3")] use crate::DenomMetadata; +#[cfg(feature = "cosmwasm_1_3")] +use crate::PageRequest; + use super::query_response::QueryResponseType; #[non_exhaustive] @@ -24,10 +27,14 @@ pub enum BankQuery { /// Note that this may be much more expensive than Balance and should be avoided if possible. /// Return value is AllBalanceResponse. AllBalances { address: String }, - /// This calls into the native bank module for querying metadata for all bank tokens. + /// This calls into the native bank module for querying metadata for a specific bank token. + /// Return value is DenomMetadataResponse + #[cfg(feature = "cosmwasm_1_3")] + DenomMetadata { denom: String }, + /// This calls into the native bank module for querying metadata for all bank tokens that have a metadata entry. /// Return value is AllDenomMetadataResponse #[cfg(feature = "cosmwasm_1_3")] - AllDenomMetadata {}, + AllDenomMetadata { pagination: Option }, } #[cfg(feature = "cosmwasm_1_1")] @@ -62,6 +69,18 @@ pub struct AllBalanceResponse { impl QueryResponseType for AllBalanceResponse {} +#[cfg(feature = "cosmwasm_1_3")] +#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq, JsonSchema)] +#[serde(rename_all = "snake_case")] +#[non_exhaustive] +pub struct DenomMetadataResponse { + /// Always returns metadata for all token denoms on the base chain. + pub metadata: DenomMetadata, +} + +#[cfg(feature = "cosmwasm_1_3")] +impl QueryResponseType for DenomMetadataResponse {} + #[cfg(feature = "cosmwasm_1_3")] #[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] diff --git a/packages/std/src/query/mod.rs b/packages/std/src/query/mod.rs index e79417bc99..c88e209b8f 100644 --- a/packages/std/src/query/mod.rs +++ b/packages/std/src/query/mod.rs @@ -11,11 +11,11 @@ mod query_response; mod staking; mod wasm; -#[cfg(feature = "cosmwasm_1_3")] -pub use bank::AllDenomMetadataResponse; #[cfg(feature = "cosmwasm_1_1")] pub use bank::SupplyResponse; pub use bank::{AllBalanceResponse, BalanceResponse, BankQuery}; +#[cfg(feature = "cosmwasm_1_3")] +pub use bank::{AllDenomMetadataResponse, DenomMetadataResponse}; #[cfg(feature = "stargate")] pub use ibc::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; #[cfg(feature = "staking")] diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index c8bcf67f00..1156268643 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -16,8 +16,6 @@ use crate::ibc::{ IbcTimeoutBlock, }; use crate::math::Uint128; -#[cfg(feature = "cosmwasm_1_3")] -use crate::query::AllDenomMetadataResponse; #[cfg(feature = "cosmwasm_1_1")] use crate::query::SupplyResponse; use crate::query::{ @@ -28,6 +26,8 @@ use crate::query::{ AllDelegationsResponse, AllValidatorsResponse, BondedDenomResponse, DelegationResponse, FullDelegation, StakingQuery, Validator, ValidatorResponse, }; +#[cfg(feature = "cosmwasm_1_3")] +use crate::query::{AllDenomMetadataResponse, DenomMetadataResponse}; use crate::results::{ContractResult, Empty, SystemResult}; use crate::serde::{from_slice, to_binary}; use crate::storage::MemoryStorage; @@ -688,7 +688,20 @@ impl BankQuerier { to_binary(&bank_res).into() } #[cfg(feature = "cosmwasm_1_3")] - BankQuery::AllDenomMetadata {} => { + BankQuery::DenomMetadata { denom } => { + let denom_metadata = self.denom_metadata.iter().find(|m| &m.base == denom); + match denom_metadata { + Some(m) => { + let metadata_res = DenomMetadataResponse { + metadata: m.clone(), + }; + to_binary(&metadata_res).into() + } + None => return SystemResult::Err(SystemError::Unknown {}), + } + } + #[cfg(feature = "cosmwasm_1_3")] + BankQuery::AllDenomMetadata { pagination: _ } => { let metadata_res = AllDenomMetadataResponse { metadata: self.denom_metadata.clone(), }; diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 79db30f6f5..2c153bf8d6 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -8,8 +8,6 @@ use crate::coin::Coin; use crate::errors::{RecoverPubkeyError, StdError, StdResult, VerificationError}; #[cfg(feature = "iterator")] use crate::iterator::{Order, Record}; -#[cfg(feature = "cosmwasm_1_3")] -use crate::query::AllDenomMetadataResponse; #[cfg(feature = "cosmwasm_1_2")] use crate::query::CodeInfoResponse; #[cfg(feature = "cosmwasm_1_1")] @@ -22,11 +20,15 @@ use crate::query::{ AllDelegationsResponse, AllValidatorsResponse, BondedDenomResponse, Delegation, DelegationResponse, FullDelegation, StakingQuery, Validator, ValidatorResponse, }; +#[cfg(feature = "cosmwasm_1_3")] +use crate::query::{AllDenomMetadataResponse, DenomMetadataResponse}; use crate::results::{ContractResult, Empty, SystemResult}; use crate::serde::{from_binary, to_binary, to_vec}; use crate::ContractInfoResponse; #[cfg(feature = "cosmwasm_1_3")] use crate::DenomMetadata; +#[cfg(feature = "cosmwasm_1_3")] +use crate::PageRequest; /// Storage provides read and write access to a persistent storage. /// If you only want to provide read access, provide `&Storage` @@ -244,8 +246,21 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { } #[cfg(feature = "cosmwasm_1_3")] - pub fn query_all_denom_metadata(&self) -> StdResult> { - let request = BankQuery::AllDenomMetadata {}.into(); + pub fn query_denom_metadata(&self, denom: impl Into) -> StdResult { + let request = BankQuery::DenomMetadata { + denom: denom.into(), + } + .into(); + let res: DenomMetadataResponse = self.query(&request)?; + Ok(res.metadata) + } + + #[cfg(feature = "cosmwasm_1_3")] + pub fn query_all_denom_metadata( + &self, + pagination: Option, + ) -> StdResult> { + let request = BankQuery::AllDenomMetadata { pagination }.into(); let res: AllDenomMetadataResponse = self.query(&request)?; Ok(res.metadata) } From dc9313e2bc4febf51ce3256568d647dd781c460f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 31 May 2023 12:20:03 +0200 Subject: [PATCH 0430/2372] DenomMetadata testing (cherry picked from commit 83baec3dcbd2701bfdc6b5a89dde69b3df9f0e4b) --- packages/std/src/iterator.rs | 2 +- packages/std/src/pagination.rs | 6 ++---- packages/std/src/query/bank.rs | 6 ++---- packages/std/src/testing/mock.rs | 1 + packages/std/src/traits.rs | 16 ++++++++-------- 5 files changed, 14 insertions(+), 17 deletions(-) diff --git a/packages/std/src/iterator.rs b/packages/std/src/iterator.rs index e747581606..00190aa5ca 100644 --- a/packages/std/src/iterator.rs +++ b/packages/std/src/iterator.rs @@ -6,7 +6,7 @@ use crate::errors::StdError; /// allows contracts to reuse the type when deserializing database records. pub type Record> = (Vec, V); -#[derive(Copy, Clone)] +#[derive(Copy, Clone, PartialEq, Eq)] // We assign these to integers to provide a stable API for passing over FFI (to wasm and Go) pub enum Order { Ascending = 1, diff --git a/packages/std/src/pagination.rs b/packages/std/src/pagination.rs index 3c98de73b6..e15d63eeaa 100644 --- a/packages/std/src/pagination.rs +++ b/packages/std/src/pagination.rs @@ -3,12 +3,10 @@ use serde::{Deserialize, Serialize}; use crate::{Binary, Uint64}; -/// Replicates the PageRequest type for pagination from the cosmos-sdk +/// Simplified version of the PageRequest type for pagination from the cosmos-sdk #[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] pub struct PageRequest { - pub key: Binary, - pub offset: Uint64, + pub key: Option, pub limit: Uint64, - pub count_total: bool, pub reverse: bool, } diff --git a/packages/std/src/query/bank.rs b/packages/std/src/query/bank.rs index 61bfcbf2ae..150e0e4b44 100644 --- a/packages/std/src/query/bank.rs +++ b/packages/std/src/query/bank.rs @@ -4,10 +4,7 @@ use serde::{Deserialize, Serialize}; use crate::Coin; #[cfg(feature = "cosmwasm_1_3")] -use crate::DenomMetadata; - -#[cfg(feature = "cosmwasm_1_3")] -use crate::PageRequest; +use crate::{Binary, DenomMetadata, PageRequest}; use super::query_response::QueryResponseType; @@ -88,6 +85,7 @@ impl QueryResponseType for DenomMetadataResponse {} pub struct AllDenomMetadataResponse { /// Always returns metadata for all token denoms on the base chain. pub metadata: Vec, + pub next_key: Option, } #[cfg(feature = "cosmwasm_1_3")] diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 1156268643..58f86c7cc9 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -703,6 +703,7 @@ impl BankQuerier { #[cfg(feature = "cosmwasm_1_3")] BankQuery::AllDenomMetadata { pagination: _ } => { let metadata_res = AllDenomMetadataResponse { + next_key: None, metadata: self.denom_metadata.clone(), }; to_binary(&metadata_res).into() diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 2c153bf8d6..7181036cb8 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -26,9 +26,7 @@ use crate::results::{ContractResult, Empty, SystemResult}; use crate::serde::{from_binary, to_binary, to_vec}; use crate::ContractInfoResponse; #[cfg(feature = "cosmwasm_1_3")] -use crate::DenomMetadata; -#[cfg(feature = "cosmwasm_1_3")] -use crate::PageRequest; +use crate::{DenomMetadata, PageRequest}; /// Storage provides read and write access to a persistent storage. /// If you only want to provide read access, provide `&Storage` @@ -258,11 +256,13 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { #[cfg(feature = "cosmwasm_1_3")] pub fn query_all_denom_metadata( &self, - pagination: Option, - ) -> StdResult> { - let request = BankQuery::AllDenomMetadata { pagination }.into(); - let res: AllDenomMetadataResponse = self.query(&request)?; - Ok(res.metadata) + pagination: PageRequest, + ) -> StdResult { + let request = BankQuery::AllDenomMetadata { + pagination: Some(pagination), + } + .into(); + self.query(&request) } // this queries another wasm contract. You should know a priori the proper types for T and U From aeee0f3021116a31429e214b71b36e36093e0ef1 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 31 May 2023 15:48:06 +0200 Subject: [PATCH 0431/2372] Add paginated mock for AllDenomMetadata query (cherry picked from commit 74e4bd690c4bb845ce0334e62edbb2831af431c8) --- packages/std/src/testing/mock.rs | 115 +++++++++++++++++++++++++++++-- 1 file changed, 109 insertions(+), 6 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 58f86c7cc9..14ab622999 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -26,14 +26,17 @@ use crate::query::{ AllDelegationsResponse, AllValidatorsResponse, BondedDenomResponse, DelegationResponse, FullDelegation, StakingQuery, Validator, ValidatorResponse, }; -#[cfg(feature = "cosmwasm_1_3")] -use crate::query::{AllDenomMetadataResponse, DenomMetadataResponse}; use crate::results::{ContractResult, Empty, SystemResult}; use crate::serde::{from_slice, to_binary}; use crate::storage::MemoryStorage; use crate::timestamp::Timestamp; use crate::traits::{Api, Querier, QuerierResult}; use crate::types::{BlockInfo, ContractInfo, Env, MessageInfo, TransactionInfo}; +#[cfg(feature = "cosmwasm_1_3")] +use crate::{ + query::{AllDenomMetadataResponse, DenomMetadataResponse}, + PageRequest, Uint64, +}; use crate::{Attribute, DenomMetadata}; #[cfg(feature = "stargate")] use crate::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; @@ -701,11 +704,38 @@ impl BankQuerier { } } #[cfg(feature = "cosmwasm_1_3")] - BankQuery::AllDenomMetadata { pagination: _ } => { - let metadata_res = AllDenomMetadataResponse { - next_key: None, - metadata: self.denom_metadata.clone(), + BankQuery::AllDenomMetadata { pagination } => { + let default_pagination = PageRequest { + key: None, + limit: Uint64::new(100), + reverse: false, + }; + let pagination = pagination.as_ref().unwrap_or(&default_pagination); + // using dynamic dispatch here to reduce code duplication and since this is only testing code + let iter: Box> = if pagination.reverse { + Box::new(self.denom_metadata.iter().rev().cloned()) + } else { + Box::new(self.denom_metadata.iter().cloned()) }; + let mut metadata: Vec<_> = iter + // skip until we find the key + .skip_while(|m| match &pagination.key { + Some(key) => m.symbol.as_bytes() < key, + None => false, + }) + // take the requested amount + 1 to get the next key + .take((pagination.limit.u64().saturating_add(1)) as usize) + .collect(); + + // if we took more than requested, remove the last element (the next key), + // otherwise this is the last batch + let next_key = if metadata.len() > pagination.limit.u64() as usize { + metadata.pop().map(|m| Binary::from(m.name.as_bytes())) + } else { + None + }; + + let metadata_res = AllDenomMetadataResponse { metadata, next_key }; to_binary(&metadata_res).into() } }; @@ -865,6 +895,8 @@ pub fn mock_wasmd_attr(key: impl Into, value: impl Into) -> Attr #[cfg(test)] mod tests { use super::*; + #[cfg(feature = "cosmwasm_1_3")] + use crate::DenomUnit; use crate::{coin, coins, from_binary, to_binary, ContractInfoResponse, Response}; #[cfg(feature = "staking")] use crate::{Decimal, Delegation}; @@ -1292,6 +1324,77 @@ mod tests { assert_eq!(res.amount, coin(0, "ELF")); } + #[cfg(feature = "cosmwasm_1_3")] + #[test] + fn bank_querier_metadata_works() { + let mut bank = BankQuerier::new(&[]); + bank.set_denom_metadata( + &(0..100) + .map(|i| DenomMetadata { + symbol: format!("FOO{i}"), + name: "Foo".to_string(), + description: "Foo coin".to_string(), + denom_units: vec![DenomUnit { + denom: "ufoo".to_string(), + exponent: 8, + aliases: vec!["microfoo".to_string(), "foobar".to_string()], + }], + display: "FOO".to_string(), + base: "ufoo".to_string(), + uri: "https://foo.bar".to_string(), + uri_hash: "foo".to_string(), + }) + .collect::>(), + ); + + // querying first 10 should work + let res = bank + .query(&BankQuery::AllDenomMetadata { + pagination: Some(PageRequest { + key: None, + limit: Uint64::new(10), + reverse: false, + }), + }) + .unwrap() + .unwrap(); + let res: AllDenomMetadataResponse = from_binary(&res).unwrap(); + assert_eq!(res.metadata.len(), 10); + assert!(res.next_key.is_some()); + + // querying all 100 should work + let res = bank + .query(&BankQuery::AllDenomMetadata { + pagination: Some(PageRequest { + key: None, + limit: Uint64::new(100), + reverse: true, + }), + }) + .unwrap() + .unwrap(); + let res: AllDenomMetadataResponse = from_binary(&res).unwrap(); + assert_eq!(res.metadata.len(), 100); + assert!(res.next_key.is_none(), "no more data should be available"); + assert_eq!(res.metadata[0].symbol, "FOO99", "should have been reversed"); + + let more_res = bank + .query(&BankQuery::AllDenomMetadata { + pagination: Some(PageRequest { + key: res.next_key, + limit: Uint64::MAX, + reverse: true, + }), + }) + .unwrap() + .unwrap(); + let more_res: AllDenomMetadataResponse = from_binary(&more_res).unwrap(); + assert_eq!( + more_res.metadata, res.metadata, + "should be same as previous query" + ); + } + #[cfg(feature = "stargate")] #[test] fn ibc_querier_channel_existing() { From 175fbcd18291ae8232d1c1c7d17bee8c41f2bed1 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 31 May 2023 15:49:29 +0200 Subject: [PATCH 0432/2372] Set cosmwasm_1_3 feature for docs.rs (cherry picked from commit 751173db1f8e5532efd9c77207de82c78921a819) --- packages/std/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 74764ddfa8..af772d64e4 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -9,7 +9,7 @@ license = "Apache-2.0" readme = "README.md" [package.metadata.docs.rs] -features = ["abort", "stargate", "staking", "ibc3", "cosmwasm_1_2"] +features = ["abort", "stargate", "staking", "ibc3", "cosmwasm_1_3"] [features] default = ["iterator", "abort"] From 6c7f13b074f628fda52269bfdfed316331456eed Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 31 May 2023 15:53:53 +0200 Subject: [PATCH 0433/2372] Add cosmwasm_1_3 to rust analyzer (cherry picked from commit 5e146b0bcd350635a3b161e9aeb47d842b46fca1) --- .vscode/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 4fc9b25774..3105948a84 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,3 @@ { - "rust-analyzer.cargo.features": ["abort", "stargate", "staking", "cosmwasm_1_2"] + "rust-analyzer.cargo.features": ["abort", "stargate", "staking", "cosmwasm_1_3"] } From ef4fa7832cf53ee1d0a0a03151d935c14074ad03 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 31 May 2023 16:33:15 +0200 Subject: [PATCH 0434/2372] Fix all denoms metadata mock (cherry picked from commit ea6d82c609b442b03f546a2f9d5aa36dbb47da14) --- packages/std/src/testing/mock.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 14ab622999..66ef04c68b 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -730,7 +730,7 @@ impl BankQuerier { // if we took more than requested, remove the last element (the next key), // otherwise this is the last batch let next_key = if metadata.len() > pagination.limit.u64() as usize { - metadata.pop().map(|m| Binary::from(m.name.as_bytes())) + metadata.pop().map(|m| Binary::from(m.symbol.as_bytes())) } else { None }; @@ -1362,6 +1362,21 @@ mod tests { assert_eq!(res.metadata.len(), 10); assert!(res.next_key.is_some()); + // querying next 10 should also work + let res2 = bank + .query(&BankQuery::AllDenomMetadata { + pagination: Some(PageRequest { + key: res.next_key, + limit: Uint64::new(10), + reverse: false, + }), + }) + .unwrap() + .unwrap(); + let res2: AllDenomMetadataResponse = from_binary(&res2).unwrap(); + assert_eq!(res2.metadata.len(), 10); + assert_ne!(res.metadata.last(), res2.metadata.first()); + // querying all 100 should work let res = bank .query(&BankQuery::AllDenomMetadata { From fbbfa6c7e93d20a5924aa910f5a6bb3b6ce17c77 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 5 Jun 2023 15:46:16 +0200 Subject: [PATCH 0435/2372] Apply suggestions from code review Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> (cherry picked from commit ebec623576e6dca551265be3c15f0e28891b47e6) --- MIGRATING.md | 6 +++--- packages/std/src/query/bank.rs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/MIGRATING.md b/MIGRATING.md index 33b1af3036..ac9d8dd347 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -20,12 +20,12 @@ major releases of `cosmwasm`. Note that you can also view the # ... ``` -- If you want to use a fewture that os only available on CosmWasm 1.3+ chains, +- If you want to use a feature that is only available on CosmWasm 1.3+ chains, use this feature: ```diff - -cosmwasm-std = { version = "1.1.0", features = ["stargate"] } - +cosmwasm-std = { version = "1.1.0", features = ["stargate", "cosmwasm_1_3"] } + -cosmwasm-std = { version = "1.3.0", features = ["stargate"] } + +cosmwasm-std = { version = "1.3.0", features = ["stargate", "cosmwasm_1_3"] } ``` Please note that `cosmwasm_1_2` implies `cosmwasm_1_1`, and `cosmwasm_1_3` diff --git a/packages/std/src/query/bank.rs b/packages/std/src/query/bank.rs index 150e0e4b44..74d8b2b9d7 100644 --- a/packages/std/src/query/bank.rs +++ b/packages/std/src/query/bank.rs @@ -71,7 +71,7 @@ impl QueryResponseType for AllBalanceResponse {} #[serde(rename_all = "snake_case")] #[non_exhaustive] pub struct DenomMetadataResponse { - /// Always returns metadata for all token denoms on the base chain. + /// The metadata for the queried denom. pub metadata: DenomMetadata, } From 576897e8738cb16d455a744c8503cdcdae7e7055 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 5 Jun 2023 16:00:23 +0200 Subject: [PATCH 0436/2372] Add DenomMetadata query to changelog (cherry picked from commit 603dd1f0e3e7438e69c5a582aaa79388f2417c5f) --- CHANGELOG.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b4158a9a3c..70b1137515 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,10 +11,11 @@ and this project adheres to <<<<<<< HEAD ======= - cosmwasm-std: Implement `BankQuery::AllDenomMetadata` to allow querying all - the denom metadata. In order to use this query in a contract, the - `cosmwasm_1_3` feature needs to be enabled for the `cosmwasm_std` dependency. - This makes the contract incompatible with chains running anything lower than - CosmWasm `1.3.0`. ([#1647]) + the denom metadata and `BankQuery::DenomMetadata` to query a specific one. In + order to use this query in a contract, the `cosmwasm_1_3` feature needs to be + enabled for the `cosmwasm_std` dependency. This makes the contract + incompatible with chains running anything lower than CosmWasm `1.3.0`. + ([#1647]) - cosmwasm-vm: Add `Cache::save_wasm_unchecked` to save Wasm blobs that have been checked before. This is useful for state-sync where we know the Wasm code was checked when it was first uploaded. ([#1635]) From fa505233645d0aa78c848b35e92d1060d650119e Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 5 Jun 2023 16:03:58 +0200 Subject: [PATCH 0437/2372] Add DenomMetadata to capability docs (cherry picked from commit ef2541944de87f377b06f4fb6ef904f8a8ce4418) --- docs/CAPABILITIES-BUILT-IN.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/CAPABILITIES-BUILT-IN.md b/docs/CAPABILITIES-BUILT-IN.md index 190c9f825d..d822971807 100644 --- a/docs/CAPABILITIES-BUILT-IN.md +++ b/docs/CAPABILITIES-BUILT-IN.md @@ -15,5 +15,6 @@ might define others. CosmWasm `1.1.0` or higher support this. - `cosmwasm_1_2` enables the `GovMsg::VoteWeighted` and `WasmMsg::Instantiate2` messages. Only chains running CosmWasm `1.2.0` or higher support this. -- `cosmwasm_1_3` enables the `BankQuery::AllDenomMetadata` query. Only chains - running CosmWasm `1.3.0` or higher support this. +- `cosmwasm_1_3` enables the `BankQuery::AllDenomMetadata` and + `BankQuery::DenomMetadata` queries. Only chains running CosmWasm `1.3.0` or + higher support this. From 3f1432fefb7f4208cb36a0ba3b92fd4afcc5dbd7 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 9 Jun 2023 10:35:02 +0200 Subject: [PATCH 0438/2372] Use u32 for pagination limit (cherry picked from commit 0a9b745cd4132772f1ad682c0af0319ca7d12237) --- packages/std/src/pagination.rs | 4 ++-- packages/std/src/testing/mock.rs | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/std/src/pagination.rs b/packages/std/src/pagination.rs index e15d63eeaa..d9d1d8ef96 100644 --- a/packages/std/src/pagination.rs +++ b/packages/std/src/pagination.rs @@ -1,12 +1,12 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use crate::{Binary, Uint64}; +use crate::Binary; /// Simplified version of the PageRequest type for pagination from the cosmos-sdk #[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] pub struct PageRequest { pub key: Option, - pub limit: Uint64, + pub limit: u32, pub reverse: bool, } diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 66ef04c68b..3bdcb5ea95 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -35,7 +35,7 @@ use crate::types::{BlockInfo, ContractInfo, Env, MessageInfo, TransactionInfo}; #[cfg(feature = "cosmwasm_1_3")] use crate::{ query::{AllDenomMetadataResponse, DenomMetadataResponse}, - PageRequest, Uint64, + PageRequest, }; use crate::{Attribute, DenomMetadata}; #[cfg(feature = "stargate")] @@ -707,7 +707,7 @@ impl BankQuerier { BankQuery::AllDenomMetadata { pagination } => { let default_pagination = PageRequest { key: None, - limit: Uint64::new(100), + limit: 100, reverse: false, }; let pagination = pagination.as_ref().unwrap_or(&default_pagination); @@ -724,12 +724,12 @@ impl BankQuerier { None => false, }) // take the requested amount + 1 to get the next key - .take((pagination.limit.u64().saturating_add(1)) as usize) + .take((pagination.limit.saturating_add(1)) as usize) .collect(); // if we took more than requested, remove the last element (the next key), // otherwise this is the last batch - let next_key = if metadata.len() > pagination.limit.u64() as usize { + let next_key = if metadata.len() > pagination.limit as usize { metadata.pop().map(|m| Binary::from(m.symbol.as_bytes())) } else { None @@ -1352,7 +1352,7 @@ mod tests { .query(&BankQuery::AllDenomMetadata { pagination: Some(PageRequest { key: None, - limit: Uint64::new(10), + limit: 10, reverse: false, }), }) @@ -1367,7 +1367,7 @@ mod tests { .query(&BankQuery::AllDenomMetadata { pagination: Some(PageRequest { key: res.next_key, - limit: Uint64::new(10), + limit: 10, reverse: false, }), }) @@ -1382,7 +1382,7 @@ mod tests { .query(&BankQuery::AllDenomMetadata { pagination: Some(PageRequest { key: None, - limit: Uint64::new(100), + limit: 100, reverse: true, }), }) @@ -1397,7 +1397,7 @@ mod tests { .query(&BankQuery::AllDenomMetadata { pagination: Some(PageRequest { key: res.next_key, - limit: Uint64::MAX, + limit: u32::MAX, reverse: true, }), }) From a2781fca462ca3a23546f76d8a824d3b25f2f472 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 22 Jun 2023 12:52:49 +0200 Subject: [PATCH 0439/2372] Fix bank mock querier (cherry picked from commit c5717a790534fbfc6bd75782404d1bb595055918) --- packages/std/src/testing/mock.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 3bdcb5ea95..ff562c3375 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -478,6 +478,10 @@ impl MockQuerier { self.bank.update_balance(addr, balance) } + pub fn set_denom_metadata(&mut self, denom_metadata: &[DenomMetadata]) { + self.bank.set_denom_metadata(denom_metadata); + } + #[cfg(feature = "staking")] pub fn update_staking( &mut self, @@ -635,6 +639,8 @@ impl BankQuerier { pub fn set_denom_metadata(&mut self, denom_metadata: &[DenomMetadata]) { self.denom_metadata = denom_metadata.to_vec(); + self.denom_metadata + .sort_unstable_by(|a, b| a.symbol.cmp(&b.symbol)); } fn calculate_supplies(balances: &HashMap>) -> HashMap { @@ -1376,6 +1382,10 @@ mod tests { let res2: AllDenomMetadataResponse = from_binary(&res2).unwrap(); assert_eq!(res2.metadata.len(), 10); assert_ne!(res.metadata.last(), res2.metadata.first()); + // should have no overlap + for m in res.metadata { + assert!(!res2.metadata.contains(&m)); + } // querying all 100 should work let res = bank From 7deddfbeeb070f483750968c47c39b6a11a9da56 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 22 Jun 2023 12:55:12 +0200 Subject: [PATCH 0440/2372] Add Denoms query to cyberpunk contract (cherry picked from commit 7e96644e08d08f0e9f2fc16eb3b6b75670c1f97a) # Conflicts: # contracts/cyberpunk/src/contract.rs --- contracts/cyberpunk/Cargo.toml | 2 +- contracts/cyberpunk/src/contract.rs | 111 +++++++++++++++++++++++++++- contracts/cyberpunk/src/msg.rs | 4 + 3 files changed, 115 insertions(+), 2 deletions(-) diff --git a/contracts/cyberpunk/Cargo.toml b/contracts/cyberpunk/Cargo.toml index 32f43bf413..7bb0c3a514 100644 --- a/contracts/cyberpunk/Cargo.toml +++ b/contracts/cyberpunk/Cargo.toml @@ -30,7 +30,7 @@ backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } -cosmwasm-std = { path = "../../packages/std", default-features = false, features = ["abort"] } +cosmwasm-std = { path = "../../packages/std", default-features = false, features = ["abort", "cosmwasm_1_3"] } rust-argon2 = "0.8" thiserror = "1.0.26" diff --git a/contracts/cyberpunk/src/contract.rs b/contracts/cyberpunk/src/contract.rs index f5f1b98655..74d9d78f36 100644 --- a/contracts/cyberpunk/src/contract.rs +++ b/contracts/cyberpunk/src/contract.rs @@ -1,6 +1,11 @@ use cosmwasm_std::{ +<<<<<<< HEAD entry_point, to_binary, Deps, DepsMut, Empty, Env, MessageInfo, QueryResponse, Response, StdError, StdResult, WasmMsg, +======= + entry_point, to_binary, Api, Deps, DepsMut, Empty, Env, MessageInfo, PageRequest, + QueryResponse, Response, StdError, StdResult, WasmMsg, +>>>>>>> 7e96644e (Add Denoms query to cyberpunk contract) }; use crate::errors::ContractError; @@ -151,14 +156,118 @@ fn execute_mirror_env(env: Env) -> Result { } #[entry_point] -pub fn query(_deps: Deps, env: Env, msg: QueryMsg) -> StdResult { +pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { use QueryMsg::*; match msg { MirrorEnv {} => to_binary(&query_mirror_env(env)), + Denoms {} => to_binary(&query_denoms(deps)?), } } fn query_mirror_env(env: Env) -> Env { env } +<<<<<<< HEAD +======= + +fn query_denoms(deps: Deps) -> StdResult<(String, Vec)> { + let metadata = deps.querier.query_denom_metadata("uatom")?; + + const PAGE_SIZE: u32 = 10; + let mut next_key = None; + let mut all_metadata = Vec::new(); + loop { + let page = deps.querier.query_all_denom_metadata(PageRequest { + key: next_key, + limit: PAGE_SIZE, + reverse: false, + })?; + + let len = page.metadata.len() as u32; + all_metadata.extend(page.metadata.into_iter().map(|m| m.symbol)); + next_key = page.next_key; + + if next_key.is_none() || len < PAGE_SIZE { + break; + } + } + + Ok((metadata.symbol, all_metadata)) +} + +#[cfg(test)] +mod tests { + use super::*; + use cosmwasm_std::testing::{ + mock_dependencies, mock_env, mock_info, MockApi, MockQuerier, MockStorage, + }; + use cosmwasm_std::{from_binary, DenomMetadata, DenomUnit, OwnedDeps}; + + fn setup() -> OwnedDeps { + let mut deps = mock_dependencies(); + let msg = Empty {}; + let info = mock_info("creator", &[]); + let res = instantiate(deps.as_mut(), mock_env(), info, msg).unwrap(); + assert_eq!(0, res.messages.len()); + deps + } + + #[test] + fn instantiate_works() { + setup(); + } + + #[test] + fn debug_works() { + let mut deps = setup(); + + let msg = ExecuteMsg::Debug {}; + execute(deps.as_mut(), mock_env(), mock_info("caller", &[]), msg).unwrap(); + } + + #[test] + fn query_denoms_works() { + let mut deps = setup(); + + deps.querier.set_denom_metadata( + &(0..98) + .map(|i| DenomMetadata { + symbol: format!("FOO{i}"), + name: "Foo".to_string(), + description: "Foo coin".to_string(), + denom_units: vec![DenomUnit { + denom: "ufoo".to_string(), + exponent: 8, + aliases: vec!["microfoo".to_string(), "foobar".to_string()], + }], + display: "FOO".to_string(), + base: "ufoo".to_string(), + uri: "https://foo.bar".to_string(), + uri_hash: "foo".to_string(), + }) + .chain(std::iter::once(DenomMetadata { + description: "Atom".to_string(), + denom_units: vec![DenomUnit { + denom: "uatom".to_string(), + exponent: 8, + aliases: vec!["microatom".to_string()], + }], + base: "uatom".to_string(), + display: "ATOM".to_string(), + name: "Cosmos Atom".to_string(), + symbol: "ATOM".to_string(), + uri: "https://cosmos.network".to_string(), + uri_hash: "hash".to_string(), + })) + .collect::>(), + ); + + let (atom, symbols): (String, Vec) = + from_binary(&query(deps.as_ref(), mock_env(), QueryMsg::Denoms {}).unwrap()).unwrap(); + + assert_eq!(atom, "ATOM"); + assert_eq!(symbols.len(), 99); + } +} +>>>>>>> 7e96644e (Add Denoms query to cyberpunk contract) diff --git a/contracts/cyberpunk/src/msg.rs b/contracts/cyberpunk/src/msg.rs index 33d73a51b1..97c8cabb9c 100644 --- a/contracts/cyberpunk/src/msg.rs +++ b/contracts/cyberpunk/src/msg.rs @@ -36,4 +36,8 @@ pub enum QueryMsg { /// Returns the env for testing #[returns(cosmwasm_std::Env)] MirrorEnv {}, + + /// Queries `DenomMetadata` and `AllDenomMetadata` from the bank module and returns the symbols + #[returns((String, Vec))] + Denoms {}, } From c44c4952415f7a405fd2508dece09fe837b3b11b Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 22 Jun 2023 16:50:53 +0200 Subject: [PATCH 0441/2372] Use BTreeMap for denom metadata mock (cherry picked from commit acdd4e7b2d7d4c7d37f6ccb1873d090cd878c6cf) --- contracts/cyberpunk/src/contract.rs | 2 +- packages/std/src/testing/mock.rs | 42 +++++++++++++++++------------ 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/contracts/cyberpunk/src/contract.rs b/contracts/cyberpunk/src/contract.rs index 74d9d78f36..bf866abb73 100644 --- a/contracts/cyberpunk/src/contract.rs +++ b/contracts/cyberpunk/src/contract.rs @@ -242,7 +242,7 @@ mod tests { aliases: vec!["microfoo".to_string(), "foobar".to_string()], }], display: "FOO".to_string(), - base: "ufoo".to_string(), + base: format!("ufoo{i}"), uri: "https://foo.bar".to_string(), uri_hash: "foo".to_string(), }) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index ff562c3375..3b5ce6f253 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -1,8 +1,10 @@ use serde::de::DeserializeOwned; #[cfg(feature = "stargate")] use serde::Serialize; -use std::collections::HashMap; +use std::collections::{BTreeMap, HashMap}; use std::marker::PhantomData; +#[cfg(feature = "cosmwasm_1_3")] +use std::ops::Bound; use crate::addresses::{Addr, CanonicalAddr}; use crate::binary::Binary; @@ -609,7 +611,7 @@ pub struct BankQuerier { /// HashMap balances: HashMap>, /// Vec - denom_metadata: Vec, + denom_metadata: BTreeMap, DenomMetadata>, } impl BankQuerier { @@ -622,7 +624,7 @@ impl BankQuerier { BankQuerier { supplies: Self::calculate_supplies(&balances), balances, - denom_metadata: Vec::new(), + denom_metadata: BTreeMap::new(), } } @@ -638,9 +640,10 @@ impl BankQuerier { } pub fn set_denom_metadata(&mut self, denom_metadata: &[DenomMetadata]) { - self.denom_metadata = denom_metadata.to_vec(); - self.denom_metadata - .sort_unstable_by(|a, b| a.symbol.cmp(&b.symbol)); + self.denom_metadata = denom_metadata + .iter() + .map(|d| (d.base.as_bytes().to_vec(), d.clone())) + .collect(); } fn calculate_supplies(balances: &HashMap>) -> HashMap { @@ -698,7 +701,7 @@ impl BankQuerier { } #[cfg(feature = "cosmwasm_1_3")] BankQuery::DenomMetadata { denom } => { - let denom_metadata = self.denom_metadata.iter().find(|m| &m.base == denom); + let denom_metadata = self.denom_metadata.get(denom.as_bytes()); match denom_metadata { Some(m) => { let metadata_res = DenomMetadataResponse { @@ -717,26 +720,31 @@ impl BankQuerier { reverse: false, }; let pagination = pagination.as_ref().unwrap_or(&default_pagination); + + // range of all denoms after the given key (or until the key for reverse) + let range = match (pagination.reverse, &pagination.key) { + (_, None) => (Bound::Unbounded, Bound::Unbounded), + (true, Some(key)) => (Bound::Unbounded, Bound::Included(key.as_slice())), + (false, Some(key)) => (Bound::Included(key.as_slice()), Bound::Unbounded), + }; + let iter = self.denom_metadata.range::<[u8], _>(range); // using dynamic dispatch here to reduce code duplication and since this is only testing code - let iter: Box> = if pagination.reverse { - Box::new(self.denom_metadata.iter().rev().cloned()) + let iter: Box> = if pagination.reverse { + Box::new(iter.rev()) } else { - Box::new(self.denom_metadata.iter().cloned()) + Box::new(iter) }; + let mut metadata: Vec<_> = iter - // skip until we find the key - .skip_while(|m| match &pagination.key { - Some(key) => m.symbol.as_bytes() < key, - None => false, - }) // take the requested amount + 1 to get the next key .take((pagination.limit.saturating_add(1)) as usize) + .map(|(_, m)| m.clone()) .collect(); // if we took more than requested, remove the last element (the next key), // otherwise this is the last batch let next_key = if metadata.len() > pagination.limit as usize { - metadata.pop().map(|m| Binary::from(m.symbol.as_bytes())) + metadata.pop().map(|m| Binary::from(m.base.as_bytes())) } else { None }; @@ -1346,7 +1354,7 @@ mod tests { aliases: vec!["microfoo".to_string(), "foobar".to_string()], }], display: "FOO".to_string(), - base: "ufoo".to_string(), + base: format!("ufoo{i}"), uri: "https://foo.bar".to_string(), uri_hash: "foo".to_string(), }) From e5b6657b13db3c5ec3427806ddb660e17e90f682 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 22 Jun 2023 17:17:12 +0200 Subject: [PATCH 0442/2372] Split Denoms query up (cherry picked from commit feab42e450f21f823efd1444015f0ba84e0d7d6a) # Conflicts: # contracts/cyberpunk/src/contract.rs --- contracts/cyberpunk/src/contract.rs | 51 ++++++++++++++++------------- contracts/cyberpunk/src/msg.rs | 9 +++-- 2 files changed, 36 insertions(+), 24 deletions(-) diff --git a/contracts/cyberpunk/src/contract.rs b/contracts/cyberpunk/src/contract.rs index bf866abb73..f8802f6c09 100644 --- a/contracts/cyberpunk/src/contract.rs +++ b/contracts/cyberpunk/src/contract.rs @@ -1,4 +1,5 @@ use cosmwasm_std::{ +<<<<<<< HEAD <<<<<<< HEAD entry_point, to_binary, Deps, DepsMut, Empty, Env, MessageInfo, QueryResponse, Response, StdError, StdResult, WasmMsg, @@ -6,6 +7,10 @@ use cosmwasm_std::{ entry_point, to_binary, Api, Deps, DepsMut, Empty, Env, MessageInfo, PageRequest, QueryResponse, Response, StdError, StdResult, WasmMsg, >>>>>>> 7e96644e (Add Denoms query to cyberpunk contract) +======= + entry_point, to_binary, Api, DenomMetadata, Deps, DepsMut, Empty, Env, MessageInfo, + PageRequest, QueryResponse, Response, StdError, StdResult, WasmMsg, +>>>>>>> feab42e4 (Split Denoms query up) }; use crate::errors::ContractError; @@ -162,6 +167,7 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { match msg { MirrorEnv {} => to_binary(&query_mirror_env(env)), Denoms {} => to_binary(&query_denoms(deps)?), + Denom { denom } => to_binary(&query_denom(deps, denom)?), } } @@ -171,9 +177,7 @@ fn query_mirror_env(env: Env) -> Env { <<<<<<< HEAD ======= -fn query_denoms(deps: Deps) -> StdResult<(String, Vec)> { - let metadata = deps.querier.query_denom_metadata("uatom")?; - +fn query_denoms(deps: Deps) -> StdResult> { const PAGE_SIZE: u32 = 10; let mut next_key = None; let mut all_metadata = Vec::new(); @@ -185,7 +189,7 @@ fn query_denoms(deps: Deps) -> StdResult<(String, Vec)> { })?; let len = page.metadata.len() as u32; - all_metadata.extend(page.metadata.into_iter().map(|m| m.symbol)); + all_metadata.extend(page.metadata.into_iter()); next_key = page.next_key; if next_key.is_none() || len < PAGE_SIZE { @@ -193,7 +197,11 @@ fn query_denoms(deps: Deps) -> StdResult<(String, Vec)> { } } - Ok((metadata.symbol, all_metadata)) + Ok(all_metadata) +} + +fn query_denom(deps: Deps, denom: String) -> StdResult { + deps.querier.query_denom_metadata(denom) } #[cfg(test)] @@ -246,28 +254,27 @@ mod tests { uri: "https://foo.bar".to_string(), uri_hash: "foo".to_string(), }) - .chain(std::iter::once(DenomMetadata { - description: "Atom".to_string(), - denom_units: vec![DenomUnit { - denom: "uatom".to_string(), - exponent: 8, - aliases: vec!["microatom".to_string()], - }], - base: "uatom".to_string(), - display: "ATOM".to_string(), - name: "Cosmos Atom".to_string(), - symbol: "ATOM".to_string(), - uri: "https://cosmos.network".to_string(), - uri_hash: "hash".to_string(), - })) .collect::>(), ); - let (atom, symbols): (String, Vec) = + let symbols: Vec = from_binary(&query(deps.as_ref(), mock_env(), QueryMsg::Denoms {}).unwrap()).unwrap(); - assert_eq!(atom, "ATOM"); - assert_eq!(symbols.len(), 99); + assert_eq!(symbols.len(), 98); + + let denom: DenomMetadata = from_binary( + &query( + deps.as_ref(), + mock_env(), + QueryMsg::Denom { + denom: "ufoo0".to_string(), + }, + ) + .unwrap(), + ) + .unwrap(); + + assert_eq!(denom.symbol, "FOO0"); } } >>>>>>> 7e96644e (Add Denoms query to cyberpunk contract) diff --git a/contracts/cyberpunk/src/msg.rs b/contracts/cyberpunk/src/msg.rs index 97c8cabb9c..e3a9366d73 100644 --- a/contracts/cyberpunk/src/msg.rs +++ b/contracts/cyberpunk/src/msg.rs @@ -1,4 +1,5 @@ use cosmwasm_schema::{cw_serde, QueryResponses}; +use cosmwasm_std::DenomMetadata; #[cw_serde] pub enum ExecuteMsg { @@ -37,7 +38,11 @@ pub enum QueryMsg { #[returns(cosmwasm_std::Env)] MirrorEnv {}, - /// Queries `DenomMetadata` and `AllDenomMetadata` from the bank module and returns the symbols - #[returns((String, Vec))] + /// Queries `AllDenomMetadata` from the bank module repeatedly and returns all entries + #[returns(Vec)] Denoms {}, + + /// Queries `DenomMetadata` from the bank module and returns the result + #[returns(DenomMetadata)] + Denom { denom: String }, } From daf6de8056709b64e3facc9db95e5ca33198aa72 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 22 Jun 2023 17:17:32 +0200 Subject: [PATCH 0443/2372] Update cyberpunk schemas (cherry picked from commit 0d0f8199fa50391a4ccd149f7116e63b2b0bfd4f) --- contracts/cyberpunk/schema/cyberpunk.json | 186 ++++++++++++++++++ contracts/cyberpunk/schema/raw/query.json | 36 ++++ .../schema/raw/response_to_denom.json | 72 +++++++ .../schema/raw/response_to_denoms.json | 78 ++++++++ 4 files changed, 372 insertions(+) create mode 100644 contracts/cyberpunk/schema/raw/response_to_denom.json create mode 100644 contracts/cyberpunk/schema/raw/response_to_denoms.json diff --git a/contracts/cyberpunk/schema/cyberpunk.json b/contracts/cyberpunk/schema/cyberpunk.json index 1584ac900e..b639402f26 100644 --- a/contracts/cyberpunk/schema/cyberpunk.json +++ b/contracts/cyberpunk/schema/cyberpunk.json @@ -185,12 +185,198 @@ } }, "additionalProperties": false + }, + { + "description": "Queries `AllDenomMetadata` from the bank module repeatedly and returns all entries", + "type": "object", + "required": [ + "denoms" + ], + "properties": { + "denoms": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Queries `DenomMetadata` from the bank module and returns the result", + "type": "object", + "required": [ + "denom" + ], + "properties": { + "denom": { + "type": "object", + "required": [ + "denom" + ], + "properties": { + "denom": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false } ] }, "migrate": null, "sudo": null, "responses": { + "denom": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "DenomMetadata", + "description": "Replicates the cosmos-sdk bank module Metadata type", + "type": "object", + "required": [ + "base", + "denom_units", + "description", + "display", + "name", + "symbol", + "uri", + "uri_hash" + ], + "properties": { + "base": { + "type": "string" + }, + "denom_units": { + "type": "array", + "items": { + "$ref": "#/definitions/DenomUnit" + } + }, + "description": { + "type": "string" + }, + "display": { + "type": "string" + }, + "name": { + "type": "string" + }, + "symbol": { + "type": "string" + }, + "uri": { + "type": "string" + }, + "uri_hash": { + "type": "string" + } + }, + "definitions": { + "DenomUnit": { + "description": "Replicates the cosmos-sdk bank module DenomUnit type", + "type": "object", + "required": [ + "aliases", + "denom", + "exponent" + ], + "properties": { + "aliases": { + "type": "array", + "items": { + "type": "string" + } + }, + "denom": { + "type": "string" + }, + "exponent": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + } + } + } + }, + "denoms": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Array_of_DenomMetadata", + "type": "array", + "items": { + "$ref": "#/definitions/DenomMetadata" + }, + "definitions": { + "DenomMetadata": { + "description": "Replicates the cosmos-sdk bank module Metadata type", + "type": "object", + "required": [ + "base", + "denom_units", + "description", + "display", + "name", + "symbol", + "uri", + "uri_hash" + ], + "properties": { + "base": { + "type": "string" + }, + "denom_units": { + "type": "array", + "items": { + "$ref": "#/definitions/DenomUnit" + } + }, + "description": { + "type": "string" + }, + "display": { + "type": "string" + }, + "name": { + "type": "string" + }, + "symbol": { + "type": "string" + }, + "uri": { + "type": "string" + }, + "uri_hash": { + "type": "string" + } + } + }, + "DenomUnit": { + "description": "Replicates the cosmos-sdk bank module DenomUnit type", + "type": "object", + "required": [ + "aliases", + "denom", + "exponent" + ], + "properties": { + "aliases": { + "type": "array", + "items": { + "type": "string" + } + }, + "denom": { + "type": "string" + }, + "exponent": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + } + } + } + }, "mirror_env": { "$schema": "http://json-schema.org/draft-07/schema#", "title": "Env", diff --git a/contracts/cyberpunk/schema/raw/query.json b/contracts/cyberpunk/schema/raw/query.json index 18c07a5622..47b493442f 100644 --- a/contracts/cyberpunk/schema/raw/query.json +++ b/contracts/cyberpunk/schema/raw/query.json @@ -15,6 +15,42 @@ } }, "additionalProperties": false + }, + { + "description": "Queries `AllDenomMetadata` from the bank module repeatedly and returns all entries", + "type": "object", + "required": [ + "denoms" + ], + "properties": { + "denoms": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Queries `DenomMetadata` from the bank module and returns the result", + "type": "object", + "required": [ + "denom" + ], + "properties": { + "denom": { + "type": "object", + "required": [ + "denom" + ], + "properties": { + "denom": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false } ] } diff --git a/contracts/cyberpunk/schema/raw/response_to_denom.json b/contracts/cyberpunk/schema/raw/response_to_denom.json new file mode 100644 index 0000000000..b541da804b --- /dev/null +++ b/contracts/cyberpunk/schema/raw/response_to_denom.json @@ -0,0 +1,72 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "DenomMetadata", + "description": "Replicates the cosmos-sdk bank module Metadata type", + "type": "object", + "required": [ + "base", + "denom_units", + "description", + "display", + "name", + "symbol", + "uri", + "uri_hash" + ], + "properties": { + "base": { + "type": "string" + }, + "denom_units": { + "type": "array", + "items": { + "$ref": "#/definitions/DenomUnit" + } + }, + "description": { + "type": "string" + }, + "display": { + "type": "string" + }, + "name": { + "type": "string" + }, + "symbol": { + "type": "string" + }, + "uri": { + "type": "string" + }, + "uri_hash": { + "type": "string" + } + }, + "definitions": { + "DenomUnit": { + "description": "Replicates the cosmos-sdk bank module DenomUnit type", + "type": "object", + "required": [ + "aliases", + "denom", + "exponent" + ], + "properties": { + "aliases": { + "type": "array", + "items": { + "type": "string" + } + }, + "denom": { + "type": "string" + }, + "exponent": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + } + } + } +} diff --git a/contracts/cyberpunk/schema/raw/response_to_denoms.json b/contracts/cyberpunk/schema/raw/response_to_denoms.json new file mode 100644 index 0000000000..e8fcd9a16e --- /dev/null +++ b/contracts/cyberpunk/schema/raw/response_to_denoms.json @@ -0,0 +1,78 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Array_of_DenomMetadata", + "type": "array", + "items": { + "$ref": "#/definitions/DenomMetadata" + }, + "definitions": { + "DenomMetadata": { + "description": "Replicates the cosmos-sdk bank module Metadata type", + "type": "object", + "required": [ + "base", + "denom_units", + "description", + "display", + "name", + "symbol", + "uri", + "uri_hash" + ], + "properties": { + "base": { + "type": "string" + }, + "denom_units": { + "type": "array", + "items": { + "$ref": "#/definitions/DenomUnit" + } + }, + "description": { + "type": "string" + }, + "display": { + "type": "string" + }, + "name": { + "type": "string" + }, + "symbol": { + "type": "string" + }, + "uri": { + "type": "string" + }, + "uri_hash": { + "type": "string" + } + } + }, + "DenomUnit": { + "description": "Replicates the cosmos-sdk bank module DenomUnit type", + "type": "object", + "required": [ + "aliases", + "denom", + "exponent" + ], + "properties": { + "aliases": { + "type": "array", + "items": { + "type": "string" + } + }, + "denom": { + "type": "string" + }, + "exponent": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + } + } + } +} From 86f75e431bd506a68f9604466da5c8f74bac113b Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 22 Jun 2023 17:59:33 +0200 Subject: [PATCH 0444/2372] Resolve conflicts --- CHANGELOG.md | 10 ---------- contracts/cyberpunk/src/contract.rs | 23 +---------------------- docs/USING_COSMWASM_STD.md | 15 +-------------- 3 files changed, 2 insertions(+), 46 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 70b1137515..19c04c7611 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,26 +8,16 @@ and this project adheres to ### Added -<<<<<<< HEAD -======= - cosmwasm-std: Implement `BankQuery::AllDenomMetadata` to allow querying all the denom metadata and `BankQuery::DenomMetadata` to query a specific one. In order to use this query in a contract, the `cosmwasm_1_3` feature needs to be enabled for the `cosmwasm_std` dependency. This makes the contract incompatible with chains running anything lower than CosmWasm `1.3.0`. ([#1647]) -- cosmwasm-vm: Add `Cache::save_wasm_unchecked` to save Wasm blobs that have - been checked before. This is useful for state-sync where we know the Wasm code - was checked when it was first uploaded. ([#1635]) ->>>>>>> 4bac1e3c (std: Add BankQuery::AllDenomMetadata gated by cosmwasm_1_3 feature flag) - cosmwasm-std: Add `FromStr` impl for `Coin`. ([#1684]) - cosmwasm-std: Add `Coins` helper to handle multiple coins. ([#1687]) -<<<<<<< HEAD -======= -[#1635]: https://github.com/CosmWasm/cosmwasm/pull/1635 [#1647]: https://github.com/CosmWasm/cosmwasm/pull/1647 ->>>>>>> 4bac1e3c (std: Add BankQuery::AllDenomMetadata gated by cosmwasm_1_3 feature flag) [#1684]: https://github.com/CosmWasm/cosmwasm/pull/1684 [#1687]: https://github.com/CosmWasm/cosmwasm/pull/1687 diff --git a/contracts/cyberpunk/src/contract.rs b/contracts/cyberpunk/src/contract.rs index f8802f6c09..d5b0c9c2c5 100644 --- a/contracts/cyberpunk/src/contract.rs +++ b/contracts/cyberpunk/src/contract.rs @@ -1,16 +1,6 @@ use cosmwasm_std::{ -<<<<<<< HEAD -<<<<<<< HEAD - entry_point, to_binary, Deps, DepsMut, Empty, Env, MessageInfo, QueryResponse, Response, - StdError, StdResult, WasmMsg, -======= - entry_point, to_binary, Api, Deps, DepsMut, Empty, Env, MessageInfo, PageRequest, + entry_point, to_binary, DenomMetadata, Deps, DepsMut, Empty, Env, MessageInfo, PageRequest, QueryResponse, Response, StdError, StdResult, WasmMsg, ->>>>>>> 7e96644e (Add Denoms query to cyberpunk contract) -======= - entry_point, to_binary, Api, DenomMetadata, Deps, DepsMut, Empty, Env, MessageInfo, - PageRequest, QueryResponse, Response, StdError, StdResult, WasmMsg, ->>>>>>> feab42e4 (Split Denoms query up) }; use crate::errors::ContractError; @@ -174,8 +164,6 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { fn query_mirror_env(env: Env) -> Env { env } -<<<<<<< HEAD -======= fn query_denoms(deps: Deps) -> StdResult> { const PAGE_SIZE: u32 = 10; @@ -226,14 +214,6 @@ mod tests { setup(); } - #[test] - fn debug_works() { - let mut deps = setup(); - - let msg = ExecuteMsg::Debug {}; - execute(deps.as_mut(), mock_env(), mock_info("caller", &[]), msg).unwrap(); - } - #[test] fn query_denoms_works() { let mut deps = setup(); @@ -277,4 +257,3 @@ mod tests { assert_eq!(denom.symbol, "FOO0"); } } ->>>>>>> 7e96644e (Add Denoms query to cyberpunk contract) diff --git a/docs/USING_COSMWASM_STD.md b/docs/USING_COSMWASM_STD.md index 28f91a51f6..2519b9b8a5 100644 --- a/docs/USING_COSMWASM_STD.md +++ b/docs/USING_COSMWASM_STD.md @@ -34,7 +34,6 @@ in the dependency tree. Otherwise conflicting C exports are created. The libarary comes with the following features: -<<<<<<< HEAD | Feature | Enabled by default | Description | | ------------ | ------------------ | -------------------------------------------------------------------------- | | iterator | x | Storage iterators | @@ -45,19 +44,7 @@ The libarary comes with the following features: | baktraces | | Add backtraces to errors (for unit testing) | | cosmwasm_1_1 | | Features that require CosmWasm 1.1+ on the chain | | cosmwasm_1_2 | | Features that require CosmWasm 1.2+ on the chain | -======= -| Feature | Enabled by default | Description | -| ------------ | ------------------ | ------------------------------------------------------------------------- | -| iterator | x | Storage iterators | -| abort | x | A panic handler that aborts the contract execution with a helpful message | -| stargate | | Cosmos SDK 0.40+ features and IBC | -| ibc3 | | New fields added in IBC v3 | -| staking | | Access to the staking module | -| backtraces | | Add backtraces to errors (for unit testing) | -| cosmwasm_1_1 | | Features that require CosmWasm 1.1+ on the chain | -| cosmwasm_1_2 | | Features that require CosmWasm 1.2+ on the chain | -| cosmwasm_1_3 | | Features that require CosmWasm 1.3+ on the chain | ->>>>>>> 4bac1e3c (std: Add BankQuery::AllDenomMetadata gated by cosmwasm_1_3 feature flag) +| cosmwasm_1_3 | | Features that require CosmWasm 1.3+ on the chain | ## The cosmwasm-std dependency for contract developers From 40a8ba414d52718966c5cd3a65c5d0c23958bc08 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 22 Jun 2023 19:04:43 +0200 Subject: [PATCH 0445/2372] Add Cache::save_wasm_unchecked --- CHANGELOG.md | 4 +++ packages/vm/src/cache.rs | 55 ++++++++++++++++++++++++++++++++-------- 2 files changed, 48 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19c04c7611..cc73ece393 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,11 @@ and this project adheres to ([#1647]) - cosmwasm-std: Add `FromStr` impl for `Coin`. ([#1684]) - cosmwasm-std: Add `Coins` helper to handle multiple coins. ([#1687]) +- cosmwasm-vm: Add `Cache::save_wasm_unchecked` to save Wasm blobs that have + been checked before. This is useful for state-sync where we know the Wasm code + was checked when it was first uploaded. ([#1635]) +[#1635]: https://github.com/CosmWasm/cosmwasm/pull/1635 [#1647]: https://github.com/CosmWasm/cosmwasm/pull/1647 [#1684]: https://github.com/CosmWasm/cosmwasm/pull/1684 [#1687]: https://github.com/CosmWasm/cosmwasm/pull/1687 diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 43f580cdc5..85c145e15d 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -159,8 +159,27 @@ where } } + /// Takes a Wasm bytecode and stores it to the cache. + /// + /// This performs static checks, compiles the bytescode to a module and + /// stores the Wasm file on disk. + /// + /// This does the same as [`save_wasm_unchecked`] plus the static checks. + /// When a Wasm blob is stored the first time, use this function. pub fn save_wasm(&self, wasm: &[u8]) -> VmResult { check_wasm(wasm, &self.available_capabilities)?; + self.save_wasm_unchecked(wasm) + } + + /// Takes a Wasm bytecode and stores it to the cache. + /// + /// This compiles the bytescode to a module and + /// stores the Wasm file on disk. + /// + /// This does the same as [`save_wasm`] but without the static checks. + /// When a Wasm blob is stored which was previously checked (e.g. as part of state sync), + /// use this function. + pub fn save_wasm_unchecked(&self, wasm: &[u8]) -> VmResult { let module = compile(wasm, None, &[])?; let mut cache = self.inner.lock().unwrap(); @@ -446,6 +465,14 @@ mod tests { static CONTRACT: &[u8] = include_bytes!("../testdata/hackatom.wasm"); static IBC_CONTRACT: &[u8] = include_bytes!("../testdata/ibc_reflect.wasm"); + // Invalid because it doesn't contain required memory and exports + static INVALID_CONTRACT_WAT: &str = r#"(module + (type $t0 (func (param i32) (result i32))) + (func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32) + get_local $p0 + i32.const 1 + i32.add)) + "#; fn default_capabilities() -> HashSet { capabilities_from_csv("iterator,staking") @@ -504,17 +531,7 @@ mod tests { #[test] fn save_wasm_rejects_invalid_contract() { - // Invalid because it doesn't contain required memory and exports - let wasm = wat::parse_str( - r#"(module - (type $t0 (func (param i32) (result i32))) - (func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32) - get_local $p0 - i32.const 1 - i32.add)) - "#, - ) - .unwrap(); + let wasm = wat::parse_str(INVALID_CONTRACT_WAT).unwrap(); let cache: Cache = unsafe { Cache::new(make_testing_options()).unwrap() }; @@ -545,6 +562,22 @@ mod tests { assert_eq!(cache.stats().misses, 0); } + #[test] + fn save_wasm_unchecked_works() { + let cache: Cache = + unsafe { Cache::new(make_testing_options()).unwrap() }; + cache.save_wasm_unchecked(CONTRACT).unwrap(); + } + + #[test] + fn save_wasm_unchecked_accepts_invalid_contract() { + let wasm = wat::parse_str(INVALID_CONTRACT_WAT).unwrap(); + + let cache: Cache = + unsafe { Cache::new(make_testing_options()).unwrap() }; + cache.save_wasm_unchecked(&wasm).unwrap(); + } + #[test] fn load_wasm_works() { let cache: Cache = From a2fdd07bf96c8571c102b3d697a72f7dd4cf5ac6 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 22 Jun 2023 17:12:28 +0200 Subject: [PATCH 0446/2372] Test contract compiled with Rust 1.70.0 --- packages/vm/README.md | 11 +++++++++++ packages/vm/src/compatibility.rs | 7 +++++++ packages/vm/testdata/cyberpunk_rust170.wasm | Bin 0 -> 198039 bytes 3 files changed, 18 insertions(+) create mode 100755 packages/vm/testdata/cyberpunk_rust170.wasm diff --git a/packages/vm/README.md b/packages/vm/README.md index 7fc48e561f..a50ae52130 100644 --- a/packages/vm/README.md +++ b/packages/vm/README.md @@ -75,6 +75,17 @@ docker run --rm -v "$(pwd)":/code \ && cp artifacts/floaty.wasm packages/vm/testdata/floaty_1.2.wasm ``` +The `cyberpunk_rust170.wasm` for +https://github.com/CosmWasm/cosmwasm/issues/1727 is built as follows +(non-reproducible): + +```sh +cd contracts/cyberpunk +rm -r target +RUSTFLAGS='-C link-arg=-s' cargo build --release --lib --target wasm32-unknown-unknown --locked +cp target/wasm32-unknown-unknown/release/cyberpunk.wasm ../../packages/vm/testdata/cyberpunk_rust170.wasm +``` + ## Testing By default, this repository is built and tested with the singlepass backend. You diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index 428d51554f..2c500bdb30 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -263,6 +263,7 @@ mod tests { static CONTRACT_0_14: &[u8] = include_bytes!("../testdata/hackatom_0.14.wasm"); static CONTRACT_0_15: &[u8] = include_bytes!("../testdata/hackatom_0.15.wasm"); static CONTRACT: &[u8] = include_bytes!("../testdata/hackatom.wasm"); + static CONTRACT_RUST_170: &[u8] = include_bytes!("../testdata/cyberpunk_rust170.wasm"); fn default_capabilities() -> HashSet { ["staking".to_string()].into_iter().collect() @@ -274,6 +275,12 @@ mod tests { check_wasm(CONTRACT, &default_capabilities()).unwrap(); } + #[test] + fn check_wasm_allows_sign_ext() { + // See https://github.com/CosmWasm/cosmwasm/issues/1727 + check_wasm(CONTRACT_RUST_170, &default_capabilities()).unwrap(); + } + #[test] fn check_wasm_old_contract() { match check_wasm(CONTRACT_0_15, &default_capabilities()) { diff --git a/packages/vm/testdata/cyberpunk_rust170.wasm b/packages/vm/testdata/cyberpunk_rust170.wasm new file mode 100755 index 0000000000000000000000000000000000000000..3bd0b471c0d0692e2cf7fa421e65ec21e2b4bc36 GIT binary patch literal 198039 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 mG)yuAh_bUHJ(h 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%0Dsjv=+hngs2`QAQ#6c^us@cYoxCHsZjT3P6$0f3j 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 nmmA7?n)rng)~h)d literal 0 HcmV?d00001 From 54f32f476dbefd734da10944a1b21f7dfa706998 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 22 Jun 2023 17:13:57 +0200 Subject: [PATCH 0447/2372] Enable sign_ext in parity-wasm --- CHANGELOG.md | 3 +++ packages/vm/Cargo.toml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc73ece393..53e075edb1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,11 +19,14 @@ and this project adheres to - cosmwasm-vm: Add `Cache::save_wasm_unchecked` to save Wasm blobs that have been checked before. This is useful for state-sync where we know the Wasm code was checked when it was first uploaded. ([#1635]) +- cosmwasm-vm: Allow sign extension Wasm opcodes in static validation. This + allows contracts to be compiled with Rust 1.70.0 and above. ([#1727]) [#1635]: https://github.com/CosmWasm/cosmwasm/pull/1635 [#1647]: https://github.com/CosmWasm/cosmwasm/pull/1647 [#1684]: https://github.com/CosmWasm/cosmwasm/pull/1684 [#1687]: https://github.com/CosmWasm/cosmwasm/pull/1687 +[#1727]: https://github.com/CosmWasm/cosmwasm/issues/1727 ### Changed diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 59817c55dd..206716f8a7 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -45,7 +45,7 @@ crc32fast = "1.3.2" cosmwasm-std = { path = "../std", version = "1.2.7", default-features = false } cosmwasm-crypto = { path = "../crypto", version = "1.2.7" } hex = "0.4" -parity-wasm = "0.45" +parity-wasm = { version = "0.45", features = ["sign_ext"] } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } serde_json = "1.0.40" From 0e0b18da6343768c6e9eef1e932b4a7ece24cc8b Mon Sep 17 00:00:00 2001 From: ekez Date: Sun, 22 Jan 2023 18:05:03 -0800 Subject: [PATCH 0448/2372] Add distribution module query type. --- packages/std/src/query/distribution.rs | 17 +++++++++++++++++ packages/std/src/query/mod.rs | 3 +++ 2 files changed, 20 insertions(+) create mode 100644 packages/std/src/query/distribution.rs diff --git a/packages/std/src/query/distribution.rs b/packages/std/src/query/distribution.rs new file mode 100644 index 0000000000..28e81d4e2a --- /dev/null +++ b/packages/std/src/query/distribution.rs @@ -0,0 +1,17 @@ +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +#[non_exhaustive] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum DistributionQuery { + // https://github.com/cosmos/cosmos-sdk/blob/4f6f6c00021f4b5ee486bbb71ae2071a8ceb47c9/x/distribution/types/query.pb.go#L792-L795 + DelegatorWithdrawAddress { delegator_address: String }, +} + +// https://github.com/cosmos/cosmos-sdk/blob/4f6f6c00021f4b5ee486bbb71ae2071a8ceb47c9/x/distribution/types/query.pb.go#L832-L835 +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub struct DelegatorWithdrawAddressResponse { + withdraw_address: String, +} diff --git a/packages/std/src/query/mod.rs b/packages/std/src/query/mod.rs index c88e209b8f..11be28f0de 100644 --- a/packages/std/src/query/mod.rs +++ b/packages/std/src/query/mod.rs @@ -6,6 +6,7 @@ use crate::Binary; use crate::Empty; mod bank; +mod distribution; mod ibc; mod query_response; mod staking; @@ -16,6 +17,8 @@ pub use bank::SupplyResponse; pub use bank::{AllBalanceResponse, BalanceResponse, BankQuery}; #[cfg(feature = "cosmwasm_1_3")] pub use bank::{AllDenomMetadataResponse, DenomMetadataResponse}; +#[cfg(feature = "staking")] +pub use distribution::DistributionQuery; #[cfg(feature = "stargate")] pub use ibc::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; #[cfg(feature = "staking")] From e3fad3a6557d4bd0ad475c8f0b88386106bffc58 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 23 Jun 2023 13:57:21 +0200 Subject: [PATCH 0449/2372] Add withdraw address query to QuerierWrapper --- packages/std/src/query/distribution.rs | 2 +- packages/std/src/query/mod.rs | 13 ++++++++-- packages/std/src/testing/mock.rs | 34 ++++++++++++++++++++++++++ packages/std/src/traits.rs | 15 ++++++++++++ 4 files changed, 61 insertions(+), 3 deletions(-) diff --git a/packages/std/src/query/distribution.rs b/packages/std/src/query/distribution.rs index 28e81d4e2a..065bd7c8c7 100644 --- a/packages/std/src/query/distribution.rs +++ b/packages/std/src/query/distribution.rs @@ -13,5 +13,5 @@ pub enum DistributionQuery { #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] pub struct DelegatorWithdrawAddressResponse { - withdraw_address: String, + pub withdraw_address: String, } diff --git a/packages/std/src/query/mod.rs b/packages/std/src/query/mod.rs index 11be28f0de..f768faadad 100644 --- a/packages/std/src/query/mod.rs +++ b/packages/std/src/query/mod.rs @@ -17,8 +17,8 @@ pub use bank::SupplyResponse; pub use bank::{AllBalanceResponse, BalanceResponse, BankQuery}; #[cfg(feature = "cosmwasm_1_3")] pub use bank::{AllDenomMetadataResponse, DenomMetadataResponse}; -#[cfg(feature = "staking")] -pub use distribution::DistributionQuery; +#[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] +pub use distribution::{DelegatorWithdrawAddressResponse, DistributionQuery}; #[cfg(feature = "stargate")] pub use ibc::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; #[cfg(feature = "staking")] @@ -38,6 +38,8 @@ pub enum QueryRequest { Custom(C), #[cfg(feature = "staking")] Staking(StakingQuery), + #[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] + Distribution(DistributionQuery), /// A Stargate query is encoded the same way as abci_query, with path and protobuf encoded request data. /// The format is defined in [ADR-21](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-021-protobuf-query-encoding.md). /// The response is protobuf encoded data directly without a JSON response wrapper. @@ -111,3 +113,10 @@ impl From for QueryRequest { QueryRequest::Ibc(msg) } } + +#[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] +impl From for QueryRequest { + fn from(msg: DistributionQuery) -> Self { + QueryRequest::Distribution(msg) + } +} diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 3b5ce6f253..dfb75e9b0c 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -28,6 +28,8 @@ use crate::query::{ AllDelegationsResponse, AllValidatorsResponse, BondedDenomResponse, DelegationResponse, FullDelegation, StakingQuery, Validator, ValidatorResponse, }; +#[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] +use crate::query::{DelegatorWithdrawAddressResponse, DistributionQuery}; use crate::results::{ContractResult, Empty, SystemResult}; use crate::serde::{from_slice, to_binary}; use crate::storage::MemoryStorage; @@ -443,6 +445,8 @@ pub struct MockQuerier { bank: BankQuerier, #[cfg(feature = "staking")] staking: StakingQuerier, + #[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] + distribution: DistributionQuerier, wasm: WasmQuerier, #[cfg(feature = "stargate")] ibc: IbcQuerier, @@ -457,6 +461,8 @@ impl MockQuerier { pub fn new(balances: &[(&str, &[Coin])]) -> Self { MockQuerier { bank: BankQuerier::new(balances), + #[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] + distribution: DistributionQuerier::default(), #[cfg(feature = "staking")] staking: StakingQuerier::default(), wasm: WasmQuerier::default(), @@ -543,6 +549,10 @@ impl MockQuerier { QueryRequest::Custom(custom_query) => (*self.custom_handler)(custom_query), #[cfg(feature = "staking")] QueryRequest::Staking(staking_query) => self.staking.query(staking_query), + #[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] + QueryRequest::Distribution(distribution_query) => { + self.distribution.query(distribution_query) + } QueryRequest::Wasm(msg) => self.wasm.query(msg), #[cfg(feature = "stargate")] QueryRequest::Stargate { .. } => SystemResult::Err(SystemError::UnsupportedRequest { @@ -893,6 +903,30 @@ impl StakingQuerier { } } +#[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] +#[derive(Clone, Default)] +pub struct DistributionQuerier {} + +#[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] +impl DistributionQuerier { + pub fn new() -> Self { + DistributionQuerier {} + } + + pub fn query(&self, request: &DistributionQuery) -> QuerierResult { + let contract_result: ContractResult = match request { + DistributionQuery::DelegatorWithdrawAddress { delegator_address } => { + let res = DelegatorWithdrawAddressResponse { + withdraw_address: delegator_address.clone(), + }; + to_binary(&res).into() + } + }; + // system result is always ok in the mock implementation + SystemResult::Ok(contract_result) + } +} + pub fn digit_sum(input: &[u8]) -> usize { input.iter().fold(0, |sum, val| sum + (*val as usize)) } diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 7181036cb8..c6a12ef504 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -22,6 +22,8 @@ use crate::query::{ }; #[cfg(feature = "cosmwasm_1_3")] use crate::query::{AllDenomMetadataResponse, DenomMetadataResponse}; +#[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] +use crate::query::{DelegatorWithdrawAddressResponse, DistributionQuery}; use crate::results::{ContractResult, Empty, SystemResult}; use crate::serde::{from_binary, to_binary, to_vec}; use crate::ContractInfoResponse; @@ -243,6 +245,19 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { Ok(res.amount) } + #[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] + pub fn query_delegator_withdraw_address( + &self, + delegator: impl Into, + ) -> StdResult { + let request = DistributionQuery::DelegatorWithdrawAddress { + delegator_address: delegator.into(), + } + .into(); + let res: DelegatorWithdrawAddressResponse = self.query(&request)?; + Ok(res.withdraw_address) + } + #[cfg(feature = "cosmwasm_1_3")] pub fn query_denom_metadata(&self, denom: impl Into) -> StdResult { let request = BankQuery::DenomMetadata { From 8d91dd2235b8cdd0c4a966680d3e206ce927768f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 23 Jun 2023 14:48:57 +0200 Subject: [PATCH 0450/2372] Implement QueryResponseType for DelegatorWithdrawAddressResponse --- packages/std/src/query/distribution.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/std/src/query/distribution.rs b/packages/std/src/query/distribution.rs index 065bd7c8c7..ffe5772322 100644 --- a/packages/std/src/query/distribution.rs +++ b/packages/std/src/query/distribution.rs @@ -1,6 +1,8 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +use super::query_response::QueryResponseType; + #[non_exhaustive] #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] @@ -10,8 +12,11 @@ pub enum DistributionQuery { } // https://github.com/cosmos/cosmos-sdk/blob/4f6f6c00021f4b5ee486bbb71ae2071a8ceb47c9/x/distribution/types/query.pb.go#L832-L835 -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] +#[non_exhaustive] pub struct DelegatorWithdrawAddressResponse { pub withdraw_address: String, } + +impl QueryResponseType for DelegatorWithdrawAddressResponse {} From 6873497eb41fa21f2f40e8896d5a376856c472cf Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 26 Jun 2023 10:48:43 +0200 Subject: [PATCH 0451/2372] Allow mocking withdraw address --- packages/std/src/testing/mock.rs | 45 +++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index dfb75e9b0c..16099d1b29 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -905,19 +905,29 @@ impl StakingQuerier { #[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] #[derive(Clone, Default)] -pub struct DistributionQuerier {} +pub struct DistributionQuerier { + withdraw_addresses: HashMap, +} #[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] impl DistributionQuerier { - pub fn new() -> Self { - DistributionQuerier {} + pub fn new(withdraw_addresses: HashMap) -> Self { + DistributionQuerier { withdraw_addresses } + } + + pub fn set_withdraw_addresses(&mut self, withdraw_addresses: HashMap) { + self.withdraw_addresses = withdraw_addresses; } pub fn query(&self, request: &DistributionQuery) -> QuerierResult { let contract_result: ContractResult = match request { DistributionQuery::DelegatorWithdrawAddress { delegator_address } => { let res = DelegatorWithdrawAddressResponse { - withdraw_address: delegator_address.clone(), + withdraw_address: self + .withdraw_addresses + .get(delegator_address) + .unwrap_or(delegator_address) + .clone(), }; to_binary(&res).into() } @@ -1462,6 +1472,33 @@ mod tests { ); } + #[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] + #[test] + fn distribution_querier_delegator_withdraw_address() { + let mut distribution = DistributionQuerier::new(HashMap::new()); + distribution.set_withdraw_addresses( + [("addr0".to_string(), "withdraw0".to_string())] + .into_iter() + .collect(), + ); + + let query = DistributionQuery::DelegatorWithdrawAddress { + delegator_address: "addr0".to_string(), + }; + + let res = distribution.query(&query).unwrap().unwrap(); + let res: DelegatorWithdrawAddressResponse = from_binary(&res).unwrap(); + assert_eq!(res.withdraw_address, "withdraw0"); + + let query = DistributionQuery::DelegatorWithdrawAddress { + delegator_address: "addr1".to_string(), + }; + + let res = distribution.query(&query).unwrap().unwrap(); + let res: DelegatorWithdrawAddressResponse = from_binary(&res).unwrap(); + assert_eq!(res.withdraw_address, "addr1"); + } + #[cfg(feature = "stargate")] #[test] fn ibc_querier_channel_existing() { From cbb66304feb39f123db719782199385a0c7706a0 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 26 Jun 2023 13:46:09 +0200 Subject: [PATCH 0452/2372] Expose DistributionQuerier mock --- packages/std/src/testing/mock.rs | 5 +++++ packages/std/src/testing/mod.rs | 2 ++ 2 files changed, 7 insertions(+) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 16099d1b29..2542f87249 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -490,6 +490,11 @@ impl MockQuerier { self.bank.set_denom_metadata(denom_metadata); } + #[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] + pub fn set_withdraw_addresses(&mut self, withdraw_addresses: HashMap) { + self.distribution.set_withdraw_addresses(withdraw_addresses); + } + #[cfg(feature = "staking")] pub fn update_staking( &mut self, diff --git a/packages/std/src/testing/mod.rs b/packages/std/src/testing/mod.rs index 657aada5de..02487f8496 100644 --- a/packages/std/src/testing/mod.rs +++ b/packages/std/src/testing/mod.rs @@ -9,6 +9,8 @@ mod shuffle; pub use assertions::assert_approx_eq_impl; +#[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] +pub use mock::DistributionQuerier; #[cfg(feature = "staking")] pub use mock::StakingQuerier; pub use mock::{ From db9d654d65333804d4dbb02329fb997fde75ac7a Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 31 May 2023 09:07:38 +0200 Subject: [PATCH 0453/2372] Update to wasmer 4 --- Cargo.lock | 32 ++++++++++---------- packages/vm/Cargo.toml | 4 +-- packages/vm/src/cache.rs | 2 +- packages/vm/src/modules/file_system_cache.rs | 2 +- packages/vm/src/wasm_backend/store.rs | 1 + 5 files changed, 21 insertions(+), 20 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e2121d4bc4..29e803e520 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2356,9 +2356,9 @@ dependencies = [ [[package]] name = "wasmer" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78caedecd8cb71ed47ccca03b68d69414a3d278bb031e6f93f15759344efdd52" +checksum = "c3c8fbe9fc5a0f9edcdb625859382d9acddac7c9619a77dd5dff3b1f1f9d4609" dependencies = [ "bytes", "cfg-if", @@ -2384,9 +2384,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726a8450541af4a57c34af7b6973fdbfc79f896cc7e733429577dfd1d1687180" +checksum = "9438969e43529ba78fafdf0495df624e5eca9366881c7452e5ff5037a9d9ffde" dependencies = [ "backtrace", "cfg-if", @@ -2407,9 +2407,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e5633f90f372563ebbdf3f9799c7b29ba11c90e56cf9b54017112d2e656c95" +checksum = "5b3bec24e3fe4c2414481c999bac0330d1b1b3c3930c36d21e30b7874ad7a129" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -2426,9 +2426,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d38957de6f452115c0af3ff08cec268ee248d665b54d4bbf7da60b7453cb97" +checksum = "8eb98a7bc417b8fd12d40ba22352d3eef1e22b2a050885d853af5b8c73071223" dependencies = [ "byteorder", "dynasm", @@ -2445,9 +2445,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97901fdbaae383dbb90ea162cc3a76a9fa58ac39aec7948b4c0b9bbef9307738" +checksum = "5ffdb84ebb76c8f298537535aa4cef65e0ca0de69172bc0ca9b6746dc2c1c1d0" dependencies = [ "proc-macro-error", "proc-macro2", @@ -2457,9 +2457,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e028013811035111beb768074b6ccc09eabd77811b1e01fd099b5471924ca16" +checksum = "63565dd5d54ee0fa1d349d07e3cf183b27c978e2b73abd9517ab800fb4781a6c" dependencies = [ "wasmer", "wasmer-types", @@ -2468,9 +2468,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67f1f2839f4f61509550e4ddcd0e658e19f3af862b51c79fda15549d735d659b" +checksum = "b9b842f750f53bb118540169c52dad83f2ac00b4e52f49067f9e78d45b53b4ce" dependencies = [ "bytecheck", "enum-iterator", @@ -2484,9 +2484,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043118ec4f16d1714fed3aab758b502b864bd865e1d5188626c9ad290100563f" +checksum = "0847dca1391c1c6ac31c742f79ac115d0c02a0af421a56cc53c1ceb0430558db" dependencies = [ "backtrace", "cc", diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 1c78aafd0d..90a17b0907 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -49,8 +49,8 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " serde_json = "1.0.40" sha2 = "0.10.3" thiserror = "1.0.26" -wasmer = { version = "=3.3.0", default-features = false, features = ["cranelift", "singlepass"] } -wasmer-middlewares = "=3.3.0" +wasmer = { version = "=4.0.0-alpha.1", default-features = false, features = ["cranelift", "singlepass"] } +wasmer-middlewares = "=4.0.0-alpha.1" # Dependencies that we do not use ourself. We add those entries # to bump the min version of them. diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 1206dbe5e6..019e4e72a7 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -4,7 +4,7 @@ use std::io::{Read, Write}; use std::marker::PhantomData; use std::path::{Path, PathBuf}; use std::sync::Mutex; -use wasmer::Engine; +use wasmer::{Engine, NativeEngineExt}; use crate::backend::{Backend, BackendApi, Querier, Storage}; use crate::capabilities::required_capabilities_from_module; diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 0978187743..dd94b58341 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -110,7 +110,7 @@ impl FileSystemCache { let filename = checksum.to_hex(); let file_path = self.modules_path.join(filename); - let result = unsafe { Module::deserialize_from_file(engine, &file_path) }; + let result = unsafe { Module::deserialize_from_file_unchecked(engine, &file_path) }; match result { Ok(module) => { let module_size = module_size(&file_path)?; diff --git a/packages/vm/src/wasm_backend/store.rs b/packages/vm/src/wasm_backend/store.rs index 5c9fad45d9..bd44ccc4b9 100644 --- a/packages/vm/src/wasm_backend/store.rs +++ b/packages/vm/src/wasm_backend/store.rs @@ -1,6 +1,7 @@ use std::sync::Arc; #[cfg(feature = "cranelift")] use wasmer::Cranelift; +use wasmer::NativeEngineExt; #[cfg(not(feature = "cranelift"))] use wasmer::Singlepass; use wasmer::{ From f1fddb7c4376b564efccb29f7016c113083f64da Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 31 May 2023 10:28:41 +0200 Subject: [PATCH 0454/2372] Fix contract lock files --- contracts/burner/Cargo.lock | 32 +++++++++++++-------------- contracts/crypto-verify/Cargo.lock | 32 +++++++++++++-------------- contracts/cyberpunk/Cargo.lock | 32 +++++++++++++-------------- contracts/floaty/Cargo.lock | 32 +++++++++++++-------------- contracts/hackatom/Cargo.lock | 32 +++++++++++++-------------- contracts/ibc-reflect-send/Cargo.lock | 32 +++++++++++++-------------- contracts/ibc-reflect/Cargo.lock | 32 +++++++++++++-------------- contracts/queue/Cargo.lock | 32 +++++++++++++-------------- contracts/reflect/Cargo.lock | 32 +++++++++++++-------------- contracts/staking/Cargo.lock | 32 +++++++++++++-------------- contracts/virus/Cargo.lock | 32 +++++++++++++-------------- 11 files changed, 176 insertions(+), 176 deletions(-) diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 314a1cf112..55521aa7af 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -1659,9 +1659,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78caedecd8cb71ed47ccca03b68d69414a3d278bb031e6f93f15759344efdd52" +checksum = "c3c8fbe9fc5a0f9edcdb625859382d9acddac7c9619a77dd5dff3b1f1f9d4609" dependencies = [ "bytes", "cfg-if", @@ -1687,9 +1687,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726a8450541af4a57c34af7b6973fdbfc79f896cc7e733429577dfd1d1687180" +checksum = "9438969e43529ba78fafdf0495df624e5eca9366881c7452e5ff5037a9d9ffde" dependencies = [ "backtrace", "cfg-if", @@ -1710,9 +1710,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e5633f90f372563ebbdf3f9799c7b29ba11c90e56cf9b54017112d2e656c95" +checksum = "5b3bec24e3fe4c2414481c999bac0330d1b1b3c3930c36d21e30b7874ad7a129" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1729,9 +1729,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d38957de6f452115c0af3ff08cec268ee248d665b54d4bbf7da60b7453cb97" +checksum = "8eb98a7bc417b8fd12d40ba22352d3eef1e22b2a050885d853af5b8c73071223" dependencies = [ "byteorder", "dynasm", @@ -1748,9 +1748,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97901fdbaae383dbb90ea162cc3a76a9fa58ac39aec7948b4c0b9bbef9307738" +checksum = "5ffdb84ebb76c8f298537535aa4cef65e0ca0de69172bc0ca9b6746dc2c1c1d0" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1760,9 +1760,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e028013811035111beb768074b6ccc09eabd77811b1e01fd099b5471924ca16" +checksum = "63565dd5d54ee0fa1d349d07e3cf183b27c978e2b73abd9517ab800fb4781a6c" dependencies = [ "wasmer", "wasmer-types", @@ -1771,9 +1771,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67f1f2839f4f61509550e4ddcd0e658e19f3af862b51c79fda15549d735d659b" +checksum = "b9b842f750f53bb118540169c52dad83f2ac00b4e52f49067f9e78d45b53b4ce" dependencies = [ "bytecheck", "enum-iterator", @@ -1787,9 +1787,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043118ec4f16d1714fed3aab758b502b864bd865e1d5188626c9ad290100563f" +checksum = "0847dca1391c1c6ac31c742f79ac115d0c02a0af421a56cc53c1ceb0430558db" dependencies = [ "backtrace", "cc", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 4724f87c89..df789125a7 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -1702,9 +1702,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78caedecd8cb71ed47ccca03b68d69414a3d278bb031e6f93f15759344efdd52" +checksum = "c3c8fbe9fc5a0f9edcdb625859382d9acddac7c9619a77dd5dff3b1f1f9d4609" dependencies = [ "bytes", "cfg-if", @@ -1730,9 +1730,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726a8450541af4a57c34af7b6973fdbfc79f896cc7e733429577dfd1d1687180" +checksum = "9438969e43529ba78fafdf0495df624e5eca9366881c7452e5ff5037a9d9ffde" dependencies = [ "backtrace", "cfg-if", @@ -1753,9 +1753,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e5633f90f372563ebbdf3f9799c7b29ba11c90e56cf9b54017112d2e656c95" +checksum = "5b3bec24e3fe4c2414481c999bac0330d1b1b3c3930c36d21e30b7874ad7a129" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1772,9 +1772,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d38957de6f452115c0af3ff08cec268ee248d665b54d4bbf7da60b7453cb97" +checksum = "8eb98a7bc417b8fd12d40ba22352d3eef1e22b2a050885d853af5b8c73071223" dependencies = [ "byteorder", "dynasm", @@ -1791,9 +1791,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97901fdbaae383dbb90ea162cc3a76a9fa58ac39aec7948b4c0b9bbef9307738" +checksum = "5ffdb84ebb76c8f298537535aa4cef65e0ca0de69172bc0ca9b6746dc2c1c1d0" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1803,9 +1803,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e028013811035111beb768074b6ccc09eabd77811b1e01fd099b5471924ca16" +checksum = "63565dd5d54ee0fa1d349d07e3cf183b27c978e2b73abd9517ab800fb4781a6c" dependencies = [ "wasmer", "wasmer-types", @@ -1814,9 +1814,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67f1f2839f4f61509550e4ddcd0e658e19f3af862b51c79fda15549d735d659b" +checksum = "b9b842f750f53bb118540169c52dad83f2ac00b4e52f49067f9e78d45b53b4ce" dependencies = [ "bytecheck", "enum-iterator", @@ -1830,9 +1830,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043118ec4f16d1714fed3aab758b502b864bd865e1d5188626c9ad290100563f" +checksum = "0847dca1391c1c6ac31c742f79ac115d0c02a0af421a56cc53c1ceb0430558db" dependencies = [ "backtrace", "cc", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 37d9a76bcc..377691eeb5 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -1799,9 +1799,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78caedecd8cb71ed47ccca03b68d69414a3d278bb031e6f93f15759344efdd52" +checksum = "c3c8fbe9fc5a0f9edcdb625859382d9acddac7c9619a77dd5dff3b1f1f9d4609" dependencies = [ "bytes", "cfg-if", @@ -1827,9 +1827,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726a8450541af4a57c34af7b6973fdbfc79f896cc7e733429577dfd1d1687180" +checksum = "9438969e43529ba78fafdf0495df624e5eca9366881c7452e5ff5037a9d9ffde" dependencies = [ "backtrace", "cfg-if", @@ -1850,9 +1850,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e5633f90f372563ebbdf3f9799c7b29ba11c90e56cf9b54017112d2e656c95" +checksum = "5b3bec24e3fe4c2414481c999bac0330d1b1b3c3930c36d21e30b7874ad7a129" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1869,9 +1869,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d38957de6f452115c0af3ff08cec268ee248d665b54d4bbf7da60b7453cb97" +checksum = "8eb98a7bc417b8fd12d40ba22352d3eef1e22b2a050885d853af5b8c73071223" dependencies = [ "byteorder", "dynasm", @@ -1888,9 +1888,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97901fdbaae383dbb90ea162cc3a76a9fa58ac39aec7948b4c0b9bbef9307738" +checksum = "5ffdb84ebb76c8f298537535aa4cef65e0ca0de69172bc0ca9b6746dc2c1c1d0" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1900,9 +1900,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e028013811035111beb768074b6ccc09eabd77811b1e01fd099b5471924ca16" +checksum = "63565dd5d54ee0fa1d349d07e3cf183b27c978e2b73abd9517ab800fb4781a6c" dependencies = [ "wasmer", "wasmer-types", @@ -1911,9 +1911,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67f1f2839f4f61509550e4ddcd0e658e19f3af862b51c79fda15549d735d659b" +checksum = "b9b842f750f53bb118540169c52dad83f2ac00b4e52f49067f9e78d45b53b4ce" dependencies = [ "bytecheck", "enum-iterator", @@ -1927,9 +1927,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043118ec4f16d1714fed3aab758b502b864bd865e1d5188626c9ad290100563f" +checksum = "0847dca1391c1c6ac31c742f79ac115d0c02a0af421a56cc53c1ceb0430558db" dependencies = [ "backtrace", "cc", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 3601db398d..4340d4df12 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -1660,9 +1660,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78caedecd8cb71ed47ccca03b68d69414a3d278bb031e6f93f15759344efdd52" +checksum = "c3c8fbe9fc5a0f9edcdb625859382d9acddac7c9619a77dd5dff3b1f1f9d4609" dependencies = [ "bytes", "cfg-if", @@ -1688,9 +1688,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726a8450541af4a57c34af7b6973fdbfc79f896cc7e733429577dfd1d1687180" +checksum = "9438969e43529ba78fafdf0495df624e5eca9366881c7452e5ff5037a9d9ffde" dependencies = [ "backtrace", "cfg-if", @@ -1711,9 +1711,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e5633f90f372563ebbdf3f9799c7b29ba11c90e56cf9b54017112d2e656c95" +checksum = "5b3bec24e3fe4c2414481c999bac0330d1b1b3c3930c36d21e30b7874ad7a129" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1730,9 +1730,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d38957de6f452115c0af3ff08cec268ee248d665b54d4bbf7da60b7453cb97" +checksum = "8eb98a7bc417b8fd12d40ba22352d3eef1e22b2a050885d853af5b8c73071223" dependencies = [ "byteorder", "dynasm", @@ -1749,9 +1749,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97901fdbaae383dbb90ea162cc3a76a9fa58ac39aec7948b4c0b9bbef9307738" +checksum = "5ffdb84ebb76c8f298537535aa4cef65e0ca0de69172bc0ca9b6746dc2c1c1d0" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1761,9 +1761,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e028013811035111beb768074b6ccc09eabd77811b1e01fd099b5471924ca16" +checksum = "63565dd5d54ee0fa1d349d07e3cf183b27c978e2b73abd9517ab800fb4781a6c" dependencies = [ "wasmer", "wasmer-types", @@ -1772,9 +1772,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67f1f2839f4f61509550e4ddcd0e658e19f3af862b51c79fda15549d735d659b" +checksum = "b9b842f750f53bb118540169c52dad83f2ac00b4e52f49067f9e78d45b53b4ce" dependencies = [ "bytecheck", "enum-iterator", @@ -1788,9 +1788,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043118ec4f16d1714fed3aab758b502b864bd865e1d5188626c9ad290100563f" +checksum = "0847dca1391c1c6ac31c742f79ac115d0c02a0af421a56cc53c1ceb0430558db" dependencies = [ "backtrace", "cc", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 6bf57323fb..6ad4ef2f67 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -1661,9 +1661,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78caedecd8cb71ed47ccca03b68d69414a3d278bb031e6f93f15759344efdd52" +checksum = "c3c8fbe9fc5a0f9edcdb625859382d9acddac7c9619a77dd5dff3b1f1f9d4609" dependencies = [ "bytes", "cfg-if", @@ -1689,9 +1689,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726a8450541af4a57c34af7b6973fdbfc79f896cc7e733429577dfd1d1687180" +checksum = "9438969e43529ba78fafdf0495df624e5eca9366881c7452e5ff5037a9d9ffde" dependencies = [ "backtrace", "cfg-if", @@ -1712,9 +1712,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e5633f90f372563ebbdf3f9799c7b29ba11c90e56cf9b54017112d2e656c95" +checksum = "5b3bec24e3fe4c2414481c999bac0330d1b1b3c3930c36d21e30b7874ad7a129" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1731,9 +1731,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d38957de6f452115c0af3ff08cec268ee248d665b54d4bbf7da60b7453cb97" +checksum = "8eb98a7bc417b8fd12d40ba22352d3eef1e22b2a050885d853af5b8c73071223" dependencies = [ "byteorder", "dynasm", @@ -1750,9 +1750,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97901fdbaae383dbb90ea162cc3a76a9fa58ac39aec7948b4c0b9bbef9307738" +checksum = "5ffdb84ebb76c8f298537535aa4cef65e0ca0de69172bc0ca9b6746dc2c1c1d0" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1762,9 +1762,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e028013811035111beb768074b6ccc09eabd77811b1e01fd099b5471924ca16" +checksum = "63565dd5d54ee0fa1d349d07e3cf183b27c978e2b73abd9517ab800fb4781a6c" dependencies = [ "wasmer", "wasmer-types", @@ -1773,9 +1773,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67f1f2839f4f61509550e4ddcd0e658e19f3af862b51c79fda15549d735d659b" +checksum = "b9b842f750f53bb118540169c52dad83f2ac00b4e52f49067f9e78d45b53b4ce" dependencies = [ "bytecheck", "enum-iterator", @@ -1789,9 +1789,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043118ec4f16d1714fed3aab758b502b864bd865e1d5188626c9ad290100563f" +checksum = "0847dca1391c1c6ac31c742f79ac115d0c02a0af421a56cc53c1ceb0430558db" dependencies = [ "backtrace", "cc", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index cea2b67e8d..49144c7c5c 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -1659,9 +1659,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78caedecd8cb71ed47ccca03b68d69414a3d278bb031e6f93f15759344efdd52" +checksum = "c3c8fbe9fc5a0f9edcdb625859382d9acddac7c9619a77dd5dff3b1f1f9d4609" dependencies = [ "bytes", "cfg-if", @@ -1687,9 +1687,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726a8450541af4a57c34af7b6973fdbfc79f896cc7e733429577dfd1d1687180" +checksum = "9438969e43529ba78fafdf0495df624e5eca9366881c7452e5ff5037a9d9ffde" dependencies = [ "backtrace", "cfg-if", @@ -1710,9 +1710,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e5633f90f372563ebbdf3f9799c7b29ba11c90e56cf9b54017112d2e656c95" +checksum = "5b3bec24e3fe4c2414481c999bac0330d1b1b3c3930c36d21e30b7874ad7a129" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1729,9 +1729,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d38957de6f452115c0af3ff08cec268ee248d665b54d4bbf7da60b7453cb97" +checksum = "8eb98a7bc417b8fd12d40ba22352d3eef1e22b2a050885d853af5b8c73071223" dependencies = [ "byteorder", "dynasm", @@ -1748,9 +1748,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97901fdbaae383dbb90ea162cc3a76a9fa58ac39aec7948b4c0b9bbef9307738" +checksum = "5ffdb84ebb76c8f298537535aa4cef65e0ca0de69172bc0ca9b6746dc2c1c1d0" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1760,9 +1760,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e028013811035111beb768074b6ccc09eabd77811b1e01fd099b5471924ca16" +checksum = "63565dd5d54ee0fa1d349d07e3cf183b27c978e2b73abd9517ab800fb4781a6c" dependencies = [ "wasmer", "wasmer-types", @@ -1771,9 +1771,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67f1f2839f4f61509550e4ddcd0e658e19f3af862b51c79fda15549d735d659b" +checksum = "b9b842f750f53bb118540169c52dad83f2ac00b4e52f49067f9e78d45b53b4ce" dependencies = [ "bytecheck", "enum-iterator", @@ -1787,9 +1787,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043118ec4f16d1714fed3aab758b502b864bd865e1d5188626c9ad290100563f" +checksum = "0847dca1391c1c6ac31c742f79ac115d0c02a0af421a56cc53c1ceb0430558db" dependencies = [ "backtrace", "cc", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 9320bc6b6a..65c2688e4b 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -1659,9 +1659,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78caedecd8cb71ed47ccca03b68d69414a3d278bb031e6f93f15759344efdd52" +checksum = "c3c8fbe9fc5a0f9edcdb625859382d9acddac7c9619a77dd5dff3b1f1f9d4609" dependencies = [ "bytes", "cfg-if", @@ -1687,9 +1687,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726a8450541af4a57c34af7b6973fdbfc79f896cc7e733429577dfd1d1687180" +checksum = "9438969e43529ba78fafdf0495df624e5eca9366881c7452e5ff5037a9d9ffde" dependencies = [ "backtrace", "cfg-if", @@ -1710,9 +1710,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e5633f90f372563ebbdf3f9799c7b29ba11c90e56cf9b54017112d2e656c95" +checksum = "5b3bec24e3fe4c2414481c999bac0330d1b1b3c3930c36d21e30b7874ad7a129" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1729,9 +1729,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d38957de6f452115c0af3ff08cec268ee248d665b54d4bbf7da60b7453cb97" +checksum = "8eb98a7bc417b8fd12d40ba22352d3eef1e22b2a050885d853af5b8c73071223" dependencies = [ "byteorder", "dynasm", @@ -1748,9 +1748,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97901fdbaae383dbb90ea162cc3a76a9fa58ac39aec7948b4c0b9bbef9307738" +checksum = "5ffdb84ebb76c8f298537535aa4cef65e0ca0de69172bc0ca9b6746dc2c1c1d0" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1760,9 +1760,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e028013811035111beb768074b6ccc09eabd77811b1e01fd099b5471924ca16" +checksum = "63565dd5d54ee0fa1d349d07e3cf183b27c978e2b73abd9517ab800fb4781a6c" dependencies = [ "wasmer", "wasmer-types", @@ -1771,9 +1771,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67f1f2839f4f61509550e4ddcd0e658e19f3af862b51c79fda15549d735d659b" +checksum = "b9b842f750f53bb118540169c52dad83f2ac00b4e52f49067f9e78d45b53b4ce" dependencies = [ "bytecheck", "enum-iterator", @@ -1787,9 +1787,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043118ec4f16d1714fed3aab758b502b864bd865e1d5188626c9ad290100563f" +checksum = "0847dca1391c1c6ac31c742f79ac115d0c02a0af421a56cc53c1ceb0430558db" dependencies = [ "backtrace", "cc", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index f4ac8cbcdc..d64af50363 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -1659,9 +1659,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78caedecd8cb71ed47ccca03b68d69414a3d278bb031e6f93f15759344efdd52" +checksum = "c3c8fbe9fc5a0f9edcdb625859382d9acddac7c9619a77dd5dff3b1f1f9d4609" dependencies = [ "bytes", "cfg-if", @@ -1687,9 +1687,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726a8450541af4a57c34af7b6973fdbfc79f896cc7e733429577dfd1d1687180" +checksum = "9438969e43529ba78fafdf0495df624e5eca9366881c7452e5ff5037a9d9ffde" dependencies = [ "backtrace", "cfg-if", @@ -1710,9 +1710,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e5633f90f372563ebbdf3f9799c7b29ba11c90e56cf9b54017112d2e656c95" +checksum = "5b3bec24e3fe4c2414481c999bac0330d1b1b3c3930c36d21e30b7874ad7a129" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1729,9 +1729,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d38957de6f452115c0af3ff08cec268ee248d665b54d4bbf7da60b7453cb97" +checksum = "8eb98a7bc417b8fd12d40ba22352d3eef1e22b2a050885d853af5b8c73071223" dependencies = [ "byteorder", "dynasm", @@ -1748,9 +1748,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97901fdbaae383dbb90ea162cc3a76a9fa58ac39aec7948b4c0b9bbef9307738" +checksum = "5ffdb84ebb76c8f298537535aa4cef65e0ca0de69172bc0ca9b6746dc2c1c1d0" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1760,9 +1760,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e028013811035111beb768074b6ccc09eabd77811b1e01fd099b5471924ca16" +checksum = "63565dd5d54ee0fa1d349d07e3cf183b27c978e2b73abd9517ab800fb4781a6c" dependencies = [ "wasmer", "wasmer-types", @@ -1771,9 +1771,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67f1f2839f4f61509550e4ddcd0e658e19f3af862b51c79fda15549d735d659b" +checksum = "b9b842f750f53bb118540169c52dad83f2ac00b4e52f49067f9e78d45b53b4ce" dependencies = [ "bytecheck", "enum-iterator", @@ -1787,9 +1787,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043118ec4f16d1714fed3aab758b502b864bd865e1d5188626c9ad290100563f" +checksum = "0847dca1391c1c6ac31c742f79ac115d0c02a0af421a56cc53c1ceb0430558db" dependencies = [ "backtrace", "cc", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index ce9e6bbe72..908d3c2491 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -1660,9 +1660,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78caedecd8cb71ed47ccca03b68d69414a3d278bb031e6f93f15759344efdd52" +checksum = "c3c8fbe9fc5a0f9edcdb625859382d9acddac7c9619a77dd5dff3b1f1f9d4609" dependencies = [ "bytes", "cfg-if", @@ -1688,9 +1688,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726a8450541af4a57c34af7b6973fdbfc79f896cc7e733429577dfd1d1687180" +checksum = "9438969e43529ba78fafdf0495df624e5eca9366881c7452e5ff5037a9d9ffde" dependencies = [ "backtrace", "cfg-if", @@ -1711,9 +1711,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e5633f90f372563ebbdf3f9799c7b29ba11c90e56cf9b54017112d2e656c95" +checksum = "5b3bec24e3fe4c2414481c999bac0330d1b1b3c3930c36d21e30b7874ad7a129" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1730,9 +1730,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d38957de6f452115c0af3ff08cec268ee248d665b54d4bbf7da60b7453cb97" +checksum = "8eb98a7bc417b8fd12d40ba22352d3eef1e22b2a050885d853af5b8c73071223" dependencies = [ "byteorder", "dynasm", @@ -1749,9 +1749,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97901fdbaae383dbb90ea162cc3a76a9fa58ac39aec7948b4c0b9bbef9307738" +checksum = "5ffdb84ebb76c8f298537535aa4cef65e0ca0de69172bc0ca9b6746dc2c1c1d0" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1761,9 +1761,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e028013811035111beb768074b6ccc09eabd77811b1e01fd099b5471924ca16" +checksum = "63565dd5d54ee0fa1d349d07e3cf183b27c978e2b73abd9517ab800fb4781a6c" dependencies = [ "wasmer", "wasmer-types", @@ -1772,9 +1772,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67f1f2839f4f61509550e4ddcd0e658e19f3af862b51c79fda15549d735d659b" +checksum = "b9b842f750f53bb118540169c52dad83f2ac00b4e52f49067f9e78d45b53b4ce" dependencies = [ "bytecheck", "enum-iterator", @@ -1788,9 +1788,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043118ec4f16d1714fed3aab758b502b864bd865e1d5188626c9ad290100563f" +checksum = "0847dca1391c1c6ac31c742f79ac115d0c02a0af421a56cc53c1ceb0430558db" dependencies = [ "backtrace", "cc", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 8a6d2d9d2d..bce91ae969 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -1687,9 +1687,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78caedecd8cb71ed47ccca03b68d69414a3d278bb031e6f93f15759344efdd52" +checksum = "c3c8fbe9fc5a0f9edcdb625859382d9acddac7c9619a77dd5dff3b1f1f9d4609" dependencies = [ "bytes", "cfg-if", @@ -1715,9 +1715,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726a8450541af4a57c34af7b6973fdbfc79f896cc7e733429577dfd1d1687180" +checksum = "9438969e43529ba78fafdf0495df624e5eca9366881c7452e5ff5037a9d9ffde" dependencies = [ "backtrace", "cfg-if", @@ -1738,9 +1738,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e5633f90f372563ebbdf3f9799c7b29ba11c90e56cf9b54017112d2e656c95" +checksum = "5b3bec24e3fe4c2414481c999bac0330d1b1b3c3930c36d21e30b7874ad7a129" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1757,9 +1757,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d38957de6f452115c0af3ff08cec268ee248d665b54d4bbf7da60b7453cb97" +checksum = "8eb98a7bc417b8fd12d40ba22352d3eef1e22b2a050885d853af5b8c73071223" dependencies = [ "byteorder", "dynasm", @@ -1776,9 +1776,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97901fdbaae383dbb90ea162cc3a76a9fa58ac39aec7948b4c0b9bbef9307738" +checksum = "5ffdb84ebb76c8f298537535aa4cef65e0ca0de69172bc0ca9b6746dc2c1c1d0" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1788,9 +1788,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e028013811035111beb768074b6ccc09eabd77811b1e01fd099b5471924ca16" +checksum = "63565dd5d54ee0fa1d349d07e3cf183b27c978e2b73abd9517ab800fb4781a6c" dependencies = [ "wasmer", "wasmer-types", @@ -1799,9 +1799,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67f1f2839f4f61509550e4ddcd0e658e19f3af862b51c79fda15549d735d659b" +checksum = "b9b842f750f53bb118540169c52dad83f2ac00b4e52f49067f9e78d45b53b4ce" dependencies = [ "bytecheck", "enum-iterator", @@ -1815,9 +1815,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043118ec4f16d1714fed3aab758b502b864bd865e1d5188626c9ad290100563f" +checksum = "0847dca1391c1c6ac31c742f79ac115d0c02a0af421a56cc53c1ceb0430558db" dependencies = [ "backtrace", "cc", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index a8c9b9cc37..fa242a80da 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -1660,9 +1660,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78caedecd8cb71ed47ccca03b68d69414a3d278bb031e6f93f15759344efdd52" +checksum = "c3c8fbe9fc5a0f9edcdb625859382d9acddac7c9619a77dd5dff3b1f1f9d4609" dependencies = [ "bytes", "cfg-if", @@ -1688,9 +1688,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726a8450541af4a57c34af7b6973fdbfc79f896cc7e733429577dfd1d1687180" +checksum = "9438969e43529ba78fafdf0495df624e5eca9366881c7452e5ff5037a9d9ffde" dependencies = [ "backtrace", "cfg-if", @@ -1711,9 +1711,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e5633f90f372563ebbdf3f9799c7b29ba11c90e56cf9b54017112d2e656c95" +checksum = "5b3bec24e3fe4c2414481c999bac0330d1b1b3c3930c36d21e30b7874ad7a129" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1730,9 +1730,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d38957de6f452115c0af3ff08cec268ee248d665b54d4bbf7da60b7453cb97" +checksum = "8eb98a7bc417b8fd12d40ba22352d3eef1e22b2a050885d853af5b8c73071223" dependencies = [ "byteorder", "dynasm", @@ -1749,9 +1749,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97901fdbaae383dbb90ea162cc3a76a9fa58ac39aec7948b4c0b9bbef9307738" +checksum = "5ffdb84ebb76c8f298537535aa4cef65e0ca0de69172bc0ca9b6746dc2c1c1d0" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1761,9 +1761,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e028013811035111beb768074b6ccc09eabd77811b1e01fd099b5471924ca16" +checksum = "63565dd5d54ee0fa1d349d07e3cf183b27c978e2b73abd9517ab800fb4781a6c" dependencies = [ "wasmer", "wasmer-types", @@ -1772,9 +1772,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67f1f2839f4f61509550e4ddcd0e658e19f3af862b51c79fda15549d735d659b" +checksum = "b9b842f750f53bb118540169c52dad83f2ac00b4e52f49067f9e78d45b53b4ce" dependencies = [ "bytecheck", "enum-iterator", @@ -1788,9 +1788,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "3.3.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043118ec4f16d1714fed3aab758b502b864bd865e1d5188626c9ad290100563f" +checksum = "0847dca1391c1c6ac31c742f79ac115d0c02a0af421a56cc53c1ceb0430558db" dependencies = [ "backtrace", "cc", From 3a64f24256f6de74748a5176878f89b6ca1fec16 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 31 May 2023 11:41:17 +0200 Subject: [PATCH 0455/2372] Add unchecked_modules cache option and benchmark --- packages/vm/benches/main.rs | 41 ++++++++++++++++++++ packages/vm/src/cache.rs | 12 +++++- packages/vm/src/modules/file_system_cache.rs | 22 ++++++++--- 3 files changed, 69 insertions(+), 6 deletions(-) diff --git a/packages/vm/benches/main.rs b/packages/vm/benches/main.rs index f764394ba7..ce5cf35415 100644 --- a/packages/vm/benches/main.rs +++ b/packages/vm/benches/main.rs @@ -126,6 +126,7 @@ fn bench_cache(c: &mut Criterion) { available_capabilities: capabilities_from_csv("iterator,staking"), memory_cache_size: MEMORY_CACHE_SIZE, instance_memory_limit: DEFAULT_MEMORY_LIMIT, + unchecked_modules: false, }; group.bench_function("save wasm", |b| { @@ -149,6 +150,21 @@ fn bench_cache(c: &mut Criterion) { }); }); + group.bench_function("load wasm unchecked", |b| { + let options = CacheOptions { + unchecked_modules: true, + ..options.clone() + }; + let cache: Cache = + unsafe { Cache::new(options).unwrap() }; + let checksum = cache.save_wasm(CONTRACT).unwrap(); + + b.iter(|| { + let result = cache.load_wasm(&checksum); + assert!(result.is_ok()); + }); + }); + group.bench_function("analyze", |b| { let cache: Cache = unsafe { Cache::new(options.clone()).unwrap() }; @@ -166,6 +182,30 @@ fn bench_cache(c: &mut Criterion) { available_capabilities: capabilities_from_csv("iterator,staking"), memory_cache_size: Size(0), instance_memory_limit: DEFAULT_MEMORY_LIMIT, + unchecked_modules: false, + }; + let cache: Cache = + unsafe { Cache::new(non_memcache).unwrap() }; + let checksum = cache.save_wasm(CONTRACT).unwrap(); + + b.iter(|| { + let _ = cache + .get_instance(&checksum, mock_backend(&[]), DEFAULT_INSTANCE_OPTIONS) + .unwrap(); + assert_eq!(cache.stats().hits_pinned_memory_cache, 0); + assert_eq!(cache.stats().hits_memory_cache, 0); + assert!(cache.stats().hits_fs_cache >= 1); + assert_eq!(cache.stats().misses, 0); + }); + }); + + group.bench_function("instantiate from fs unchecked", |b| { + let non_memcache = CacheOptions { + base_dir: TempDir::new().unwrap().into_path(), + available_capabilities: capabilities_from_csv("iterator,staking"), + memory_cache_size: Size(0), + instance_memory_limit: DEFAULT_MEMORY_LIMIT, + unchecked_modules: true, }; let cache: Cache = unsafe { Cache::new(non_memcache).unwrap() }; @@ -232,6 +272,7 @@ pub fn bench_instance_threads(c: &mut Criterion) { available_capabilities: capabilities_from_csv("iterator,staking"), memory_cache_size: MEMORY_CACHE_SIZE, instance_memory_limit: DEFAULT_MEMORY_LIMIT, + unchecked_modules: false, }; let cache: Cache = diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 019e4e72a7..e76e92759d 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -59,6 +59,9 @@ pub struct CacheOptions { pub base_dir: PathBuf, pub available_capabilities: HashSet, pub memory_cache_size: Size, + /// If true, the filesystem cache will use the `*_unchecked` wasmer functions for loading + /// modules from disk. + pub unchecked_modules: bool, /// Memory limit for instances, in bytes. Use a value that is divisible by the Wasm page size 65536, /// e.g. full MiBs. pub instance_memory_limit: Size, @@ -114,6 +117,7 @@ where available_capabilities, memory_cache_size, instance_memory_limit, + unchecked_modules, } = options; let state_path = base_dir.join(STATE_DIR); @@ -126,7 +130,7 @@ where mkdir_p(&cache_path).map_err(|_e| VmError::cache_err("Error creating cache directory"))?; mkdir_p(&wasm_path).map_err(|_e| VmError::cache_err("Error creating wasm directory"))?; - let fs_cache = FileSystemCache::new(cache_path.join(MODULES_DIR)) + let fs_cache = FileSystemCache::new(cache_path.join(MODULES_DIR), unchecked_modules) .map_err(|e| VmError::cache_err(format!("Error file system cache: {}", e)))?; Ok(Cache { available_capabilities, @@ -493,6 +497,7 @@ mod tests { available_capabilities: default_capabilities(), memory_cache_size: TESTING_MEMORY_CACHE_SIZE, instance_memory_limit: TESTING_MEMORY_LIMIT, + unchecked_modules: false, } } @@ -504,6 +509,7 @@ mod tests { available_capabilities: capabilities, memory_cache_size: TESTING_MEMORY_CACHE_SIZE, instance_memory_limit: TESTING_MEMORY_LIMIT, + unchecked_modules: false, } } @@ -608,6 +614,7 @@ mod tests { available_capabilities: default_capabilities(), memory_cache_size: TESTING_MEMORY_CACHE_SIZE, instance_memory_limit: TESTING_MEMORY_LIMIT, + unchecked_modules: false, }; let cache1: Cache = unsafe { Cache::new(options1).unwrap() }; @@ -620,6 +627,7 @@ mod tests { available_capabilities: default_capabilities(), memory_cache_size: TESTING_MEMORY_CACHE_SIZE, instance_memory_limit: TESTING_MEMORY_LIMIT, + unchecked_modules: false, }; let cache2: Cache = unsafe { Cache::new(options2).unwrap() }; @@ -653,6 +661,7 @@ mod tests { available_capabilities: default_capabilities(), memory_cache_size: TESTING_MEMORY_CACHE_SIZE, instance_memory_limit: TESTING_MEMORY_LIMIT, + unchecked_modules: false, }; let cache: Cache = unsafe { Cache::new(options).unwrap() }; @@ -1236,6 +1245,7 @@ mod tests { available_capabilities: default_capabilities(), memory_cache_size: TESTING_MEMORY_CACHE_SIZE, instance_memory_limit: TESTING_MEMORY_LIMIT, + unchecked_modules: false, }; let cache: Cache = unsafe { Cache::new(options).unwrap() }; diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index dd94b58341..8773ca11f8 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -50,6 +50,8 @@ const MODULE_SERIALIZATION_VERSION: &str = "v5"; /// Representation of a directory that contains compiled Wasm artifacts. pub struct FileSystemCache { modules_path: PathBuf, + /// If true, the cache uses the `*_unchecked` wasmer functions for loading modules from disk. + unchecked_modules: bool, } /// An error type that hides system specific error information @@ -69,12 +71,17 @@ pub enum NewFileSystemCacheError { impl FileSystemCache { /// Construct a new `FileSystemCache` around the specified directory. /// The contents of the cache are stored in sub-versioned directories. + /// If `unchecked_modules` is set to true, it uses the `*_unchecked` + /// wasmer functions for loading modules from disk (no validity checks). /// /// # Safety /// /// This method is unsafe because there's no way to ensure the artifacts /// stored in this cache haven't been corrupted or tampered with. - pub unsafe fn new(base_path: impl Into) -> Result { + pub unsafe fn new( + base_path: impl Into, + unchecked_modules: bool, + ) -> Result { let base_path: PathBuf = base_path.into(); if base_path.exists() { let metadata = base_path @@ -97,6 +104,7 @@ impl FileSystemCache { current_wasmer_module_version(), &Target::default(), ), + unchecked_modules, }) } @@ -110,7 +118,11 @@ impl FileSystemCache { let filename = checksum.to_hex(); let file_path = self.modules_path.join(filename); - let result = unsafe { Module::deserialize_from_file_unchecked(engine, &file_path) }; + let result = if self.unchecked_modules { + unsafe { Module::deserialize_from_file_unchecked(engine, &file_path) } + } else { + unsafe { Module::deserialize_from_file(engine, &file_path) } + }; match result { Ok(module) => { let module_size = module_size(&file_path)?; @@ -218,7 +230,7 @@ mod tests { #[test] fn file_system_cache_run() { let tmp_dir = TempDir::new().unwrap(); - let mut cache = unsafe { FileSystemCache::new(tmp_dir.path()).unwrap() }; + let mut cache = unsafe { FileSystemCache::new(tmp_dir.path(), false).unwrap() }; // Create module let wasm = wat::parse_str(SOME_WAT).unwrap(); @@ -255,7 +267,7 @@ mod tests { #[test] fn file_system_cache_store_uses_expected_path() { let tmp_dir = TempDir::new().unwrap(); - let mut cache = unsafe { FileSystemCache::new(tmp_dir.path()).unwrap() }; + let mut cache = unsafe { FileSystemCache::new(tmp_dir.path(), false).unwrap() }; // Create module let wasm = wat::parse_str(SOME_WAT).unwrap(); @@ -278,7 +290,7 @@ mod tests { #[test] fn file_system_cache_remove_works() { let tmp_dir = TempDir::new().unwrap(); - let mut cache = unsafe { FileSystemCache::new(tmp_dir.path()).unwrap() }; + let mut cache = unsafe { FileSystemCache::new(tmp_dir.path(), false).unwrap() }; // Create module let wasm = wat::parse_str(SOME_WAT).unwrap(); From eef9ffe1ff5974fade42a6cd01f798cbb34a53a8 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 31 May 2023 11:58:17 +0200 Subject: [PATCH 0456/2372] Load modules checked from fs by default --- packages/vm/benches/main.rs | 41 ------------------------------------- packages/vm/src/cache.rs | 12 +---------- 2 files changed, 1 insertion(+), 52 deletions(-) diff --git a/packages/vm/benches/main.rs b/packages/vm/benches/main.rs index ce5cf35415..f764394ba7 100644 --- a/packages/vm/benches/main.rs +++ b/packages/vm/benches/main.rs @@ -126,7 +126,6 @@ fn bench_cache(c: &mut Criterion) { available_capabilities: capabilities_from_csv("iterator,staking"), memory_cache_size: MEMORY_CACHE_SIZE, instance_memory_limit: DEFAULT_MEMORY_LIMIT, - unchecked_modules: false, }; group.bench_function("save wasm", |b| { @@ -150,21 +149,6 @@ fn bench_cache(c: &mut Criterion) { }); }); - group.bench_function("load wasm unchecked", |b| { - let options = CacheOptions { - unchecked_modules: true, - ..options.clone() - }; - let cache: Cache = - unsafe { Cache::new(options).unwrap() }; - let checksum = cache.save_wasm(CONTRACT).unwrap(); - - b.iter(|| { - let result = cache.load_wasm(&checksum); - assert!(result.is_ok()); - }); - }); - group.bench_function("analyze", |b| { let cache: Cache = unsafe { Cache::new(options.clone()).unwrap() }; @@ -182,30 +166,6 @@ fn bench_cache(c: &mut Criterion) { available_capabilities: capabilities_from_csv("iterator,staking"), memory_cache_size: Size(0), instance_memory_limit: DEFAULT_MEMORY_LIMIT, - unchecked_modules: false, - }; - let cache: Cache = - unsafe { Cache::new(non_memcache).unwrap() }; - let checksum = cache.save_wasm(CONTRACT).unwrap(); - - b.iter(|| { - let _ = cache - .get_instance(&checksum, mock_backend(&[]), DEFAULT_INSTANCE_OPTIONS) - .unwrap(); - assert_eq!(cache.stats().hits_pinned_memory_cache, 0); - assert_eq!(cache.stats().hits_memory_cache, 0); - assert!(cache.stats().hits_fs_cache >= 1); - assert_eq!(cache.stats().misses, 0); - }); - }); - - group.bench_function("instantiate from fs unchecked", |b| { - let non_memcache = CacheOptions { - base_dir: TempDir::new().unwrap().into_path(), - available_capabilities: capabilities_from_csv("iterator,staking"), - memory_cache_size: Size(0), - instance_memory_limit: DEFAULT_MEMORY_LIMIT, - unchecked_modules: true, }; let cache: Cache = unsafe { Cache::new(non_memcache).unwrap() }; @@ -272,7 +232,6 @@ pub fn bench_instance_threads(c: &mut Criterion) { available_capabilities: capabilities_from_csv("iterator,staking"), memory_cache_size: MEMORY_CACHE_SIZE, instance_memory_limit: DEFAULT_MEMORY_LIMIT, - unchecked_modules: false, }; let cache: Cache = diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index e76e92759d..fbf2af6b23 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -59,9 +59,6 @@ pub struct CacheOptions { pub base_dir: PathBuf, pub available_capabilities: HashSet, pub memory_cache_size: Size, - /// If true, the filesystem cache will use the `*_unchecked` wasmer functions for loading - /// modules from disk. - pub unchecked_modules: bool, /// Memory limit for instances, in bytes. Use a value that is divisible by the Wasm page size 65536, /// e.g. full MiBs. pub instance_memory_limit: Size, @@ -117,7 +114,6 @@ where available_capabilities, memory_cache_size, instance_memory_limit, - unchecked_modules, } = options; let state_path = base_dir.join(STATE_DIR); @@ -130,7 +126,7 @@ where mkdir_p(&cache_path).map_err(|_e| VmError::cache_err("Error creating cache directory"))?; mkdir_p(&wasm_path).map_err(|_e| VmError::cache_err("Error creating wasm directory"))?; - let fs_cache = FileSystemCache::new(cache_path.join(MODULES_DIR), unchecked_modules) + let fs_cache = FileSystemCache::new(cache_path.join(MODULES_DIR), false) .map_err(|e| VmError::cache_err(format!("Error file system cache: {}", e)))?; Ok(Cache { available_capabilities, @@ -497,7 +493,6 @@ mod tests { available_capabilities: default_capabilities(), memory_cache_size: TESTING_MEMORY_CACHE_SIZE, instance_memory_limit: TESTING_MEMORY_LIMIT, - unchecked_modules: false, } } @@ -509,7 +504,6 @@ mod tests { available_capabilities: capabilities, memory_cache_size: TESTING_MEMORY_CACHE_SIZE, instance_memory_limit: TESTING_MEMORY_LIMIT, - unchecked_modules: false, } } @@ -614,7 +608,6 @@ mod tests { available_capabilities: default_capabilities(), memory_cache_size: TESTING_MEMORY_CACHE_SIZE, instance_memory_limit: TESTING_MEMORY_LIMIT, - unchecked_modules: false, }; let cache1: Cache = unsafe { Cache::new(options1).unwrap() }; @@ -627,7 +620,6 @@ mod tests { available_capabilities: default_capabilities(), memory_cache_size: TESTING_MEMORY_CACHE_SIZE, instance_memory_limit: TESTING_MEMORY_LIMIT, - unchecked_modules: false, }; let cache2: Cache = unsafe { Cache::new(options2).unwrap() }; @@ -661,7 +653,6 @@ mod tests { available_capabilities: default_capabilities(), memory_cache_size: TESTING_MEMORY_CACHE_SIZE, instance_memory_limit: TESTING_MEMORY_LIMIT, - unchecked_modules: false, }; let cache: Cache = unsafe { Cache::new(options).unwrap() }; @@ -1245,7 +1236,6 @@ mod tests { available_capabilities: default_capabilities(), memory_cache_size: TESTING_MEMORY_CACHE_SIZE, instance_memory_limit: TESTING_MEMORY_LIMIT, - unchecked_modules: false, }; let cache: Cache = unsafe { Cache::new(options).unwrap() }; From 73fa31ac4354d4d25f127445c377c15e6332d8a8 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 1 Jun 2023 10:22:06 +0200 Subject: [PATCH 0457/2372] Add fn to use unchecked loading from fs cache --- packages/vm/benches/main.rs | 36 ++++++++++++++++++++ packages/vm/src/cache.rs | 10 ++++++ packages/vm/src/modules/file_system_cache.rs | 6 ++++ 3 files changed, 52 insertions(+) diff --git a/packages/vm/benches/main.rs b/packages/vm/benches/main.rs index f764394ba7..59f46c6836 100644 --- a/packages/vm/benches/main.rs +++ b/packages/vm/benches/main.rs @@ -149,6 +149,19 @@ fn bench_cache(c: &mut Criterion) { }); }); + group.bench_function("load wasm unchecked", |b| { + let options = CacheOptions { ..options.clone() }; + let mut cache: Cache = + unsafe { Cache::new(options).unwrap() }; + cache.set_module_unchecked(true); + let checksum = cache.save_wasm(CONTRACT).unwrap(); + + b.iter(|| { + let result = cache.load_wasm(&checksum); + assert!(result.is_ok()); + }); + }); + group.bench_function("analyze", |b| { let cache: Cache = unsafe { Cache::new(options.clone()).unwrap() }; @@ -182,6 +195,29 @@ fn bench_cache(c: &mut Criterion) { }); }); + group.bench_function("instantiate from fs unchecked", |b| { + let non_memcache = CacheOptions { + base_dir: TempDir::new().unwrap().into_path(), + available_capabilities: capabilities_from_csv("iterator,staking"), + memory_cache_size: Size(0), + instance_memory_limit: DEFAULT_MEMORY_LIMIT, + }; + let mut cache: Cache = + unsafe { Cache::new(non_memcache).unwrap() }; + cache.set_module_unchecked(true); + let checksum = cache.save_wasm(CONTRACT).unwrap(); + + b.iter(|| { + let _ = cache + .get_instance(&checksum, mock_backend(&[]), DEFAULT_INSTANCE_OPTIONS) + .unwrap(); + assert_eq!(cache.stats().hits_pinned_memory_cache, 0); + assert_eq!(cache.stats().hits_memory_cache, 0); + assert!(cache.stats().hits_fs_cache >= 1); + assert_eq!(cache.stats().misses, 0); + }); + }); + group.bench_function("instantiate from memory", |b| { let checksum = Checksum::generate(CONTRACT); let cache: Cache = diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index fbf2af6b23..1a1117ffc9 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -145,6 +145,16 @@ where }) } + /// If `unchecked` is true, the filesystem cache will use the `*_unchecked` wasmer functions for + /// loading modules from disk. + pub fn set_module_unchecked(&mut self, unchecked: bool) { + self.inner + .lock() + .unwrap() + .fs_cache + .set_module_unchecked(unchecked); + } + pub fn stats(&self) -> Stats { self.inner.lock().unwrap().stats } diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 8773ca11f8..aef4be3ec8 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -108,6 +108,12 @@ impl FileSystemCache { }) } + /// If `unchecked` is true, the cache will use the `*_unchecked` wasmer functions for + /// loading modules from disk. + pub fn set_module_unchecked(&mut self, unchecked: bool) { + self.unchecked_modules = unchecked; + } + /// Loads a serialized module from the file system and returns a module (i.e. artifact + store), /// along with the size of the serialized module. pub fn load( From ecbaf9e2c10a4419e25f2b6ed3cd84bd80aa36d2 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 19 Jun 2023 14:00:25 +0200 Subject: [PATCH 0458/2372] Update wasmer version --- Cargo.lock | 32 +++++++++++++-------------- contracts/burner/Cargo.lock | 32 +++++++++++++-------------- contracts/crypto-verify/Cargo.lock | 32 +++++++++++++-------------- contracts/cyberpunk/Cargo.lock | 32 +++++++++++++-------------- contracts/floaty/Cargo.lock | 32 +++++++++++++-------------- contracts/hackatom/Cargo.lock | 32 +++++++++++++-------------- contracts/ibc-reflect-send/Cargo.lock | 32 +++++++++++++-------------- contracts/ibc-reflect/Cargo.lock | 32 +++++++++++++-------------- contracts/queue/Cargo.lock | 32 +++++++++++++-------------- contracts/reflect/Cargo.lock | 32 +++++++++++++-------------- contracts/staking/Cargo.lock | 32 +++++++++++++-------------- contracts/virus/Cargo.lock | 32 +++++++++++++-------------- packages/vm/Cargo.toml | 4 ++-- 13 files changed, 194 insertions(+), 194 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 29e803e520..ab264acdaa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2356,9 +2356,9 @@ dependencies = [ [[package]] name = "wasmer" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c8fbe9fc5a0f9edcdb625859382d9acddac7c9619a77dd5dff3b1f1f9d4609" +checksum = "d924829e1d14ca3b0ab2562ef7c958fd61ec3fdc6401fd09f20becf59c1f1d17" dependencies = [ "bytes", "cfg-if", @@ -2384,9 +2384,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9438969e43529ba78fafdf0495df624e5eca9366881c7452e5ff5037a9d9ffde" +checksum = "945e8cd172c68cf10fefcd40f9c97bd301ecc9bf0136972bf807474f1b5951de" dependencies = [ "backtrace", "cfg-if", @@ -2407,9 +2407,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b3bec24e3fe4c2414481c999bac0330d1b1b3c3930c36d21e30b7874ad7a129" +checksum = "cdce36e48ec8c70e34d150073d6214e52757474bb375c013f2ae0bac85800cce" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -2426,9 +2426,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb98a7bc417b8fd12d40ba22352d3eef1e22b2a050885d853af5b8c73071223" +checksum = "8d8415054716a3d79e0d74e6da24795875641247d36cc35c3e46c7bf8291e158" dependencies = [ "byteorder", "dynasm", @@ -2445,9 +2445,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffdb84ebb76c8f298537535aa4cef65e0ca0de69172bc0ca9b6746dc2c1c1d0" +checksum = "90277df86705920fefed23c2724ed652fa974af788f0983ca0493b51691a76bd" dependencies = [ "proc-macro-error", "proc-macro2", @@ -2457,9 +2457,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63565dd5d54ee0fa1d349d07e3cf183b27c978e2b73abd9517ab800fb4781a6c" +checksum = "271ed9590613a04310efa4c7dbb9c1c7891a059e081af857cbefe6351341a5c5" dependencies = [ "wasmer", "wasmer-types", @@ -2468,9 +2468,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b842f750f53bb118540169c52dad83f2ac00b4e52f49067f9e78d45b53b4ce" +checksum = "918344b93266cf4efe56e6cd23f35c7325275524f534678145f7ead4b2b8c762" dependencies = [ "bytecheck", "enum-iterator", @@ -2484,9 +2484,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0847dca1391c1c6ac31c742f79ac115d0c02a0af421a56cc53c1ceb0430558db" +checksum = "4e36cba570e0b2662ff52d40fe9a48fd368f6eb35183a84ce43f79bc51b9fd15" dependencies = [ "backtrace", "cc", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 55521aa7af..c12378344c 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -1659,9 +1659,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c8fbe9fc5a0f9edcdb625859382d9acddac7c9619a77dd5dff3b1f1f9d4609" +checksum = "d924829e1d14ca3b0ab2562ef7c958fd61ec3fdc6401fd09f20becf59c1f1d17" dependencies = [ "bytes", "cfg-if", @@ -1687,9 +1687,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9438969e43529ba78fafdf0495df624e5eca9366881c7452e5ff5037a9d9ffde" +checksum = "945e8cd172c68cf10fefcd40f9c97bd301ecc9bf0136972bf807474f1b5951de" dependencies = [ "backtrace", "cfg-if", @@ -1710,9 +1710,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b3bec24e3fe4c2414481c999bac0330d1b1b3c3930c36d21e30b7874ad7a129" +checksum = "cdce36e48ec8c70e34d150073d6214e52757474bb375c013f2ae0bac85800cce" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1729,9 +1729,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb98a7bc417b8fd12d40ba22352d3eef1e22b2a050885d853af5b8c73071223" +checksum = "8d8415054716a3d79e0d74e6da24795875641247d36cc35c3e46c7bf8291e158" dependencies = [ "byteorder", "dynasm", @@ -1748,9 +1748,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffdb84ebb76c8f298537535aa4cef65e0ca0de69172bc0ca9b6746dc2c1c1d0" +checksum = "90277df86705920fefed23c2724ed652fa974af788f0983ca0493b51691a76bd" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1760,9 +1760,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63565dd5d54ee0fa1d349d07e3cf183b27c978e2b73abd9517ab800fb4781a6c" +checksum = "271ed9590613a04310efa4c7dbb9c1c7891a059e081af857cbefe6351341a5c5" dependencies = [ "wasmer", "wasmer-types", @@ -1771,9 +1771,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b842f750f53bb118540169c52dad83f2ac00b4e52f49067f9e78d45b53b4ce" +checksum = "918344b93266cf4efe56e6cd23f35c7325275524f534678145f7ead4b2b8c762" dependencies = [ "bytecheck", "enum-iterator", @@ -1787,9 +1787,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0847dca1391c1c6ac31c742f79ac115d0c02a0af421a56cc53c1ceb0430558db" +checksum = "4e36cba570e0b2662ff52d40fe9a48fd368f6eb35183a84ce43f79bc51b9fd15" dependencies = [ "backtrace", "cc", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index df789125a7..3bf1fea3ec 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -1702,9 +1702,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c8fbe9fc5a0f9edcdb625859382d9acddac7c9619a77dd5dff3b1f1f9d4609" +checksum = "d924829e1d14ca3b0ab2562ef7c958fd61ec3fdc6401fd09f20becf59c1f1d17" dependencies = [ "bytes", "cfg-if", @@ -1730,9 +1730,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9438969e43529ba78fafdf0495df624e5eca9366881c7452e5ff5037a9d9ffde" +checksum = "945e8cd172c68cf10fefcd40f9c97bd301ecc9bf0136972bf807474f1b5951de" dependencies = [ "backtrace", "cfg-if", @@ -1753,9 +1753,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b3bec24e3fe4c2414481c999bac0330d1b1b3c3930c36d21e30b7874ad7a129" +checksum = "cdce36e48ec8c70e34d150073d6214e52757474bb375c013f2ae0bac85800cce" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1772,9 +1772,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb98a7bc417b8fd12d40ba22352d3eef1e22b2a050885d853af5b8c73071223" +checksum = "8d8415054716a3d79e0d74e6da24795875641247d36cc35c3e46c7bf8291e158" dependencies = [ "byteorder", "dynasm", @@ -1791,9 +1791,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffdb84ebb76c8f298537535aa4cef65e0ca0de69172bc0ca9b6746dc2c1c1d0" +checksum = "90277df86705920fefed23c2724ed652fa974af788f0983ca0493b51691a76bd" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1803,9 +1803,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63565dd5d54ee0fa1d349d07e3cf183b27c978e2b73abd9517ab800fb4781a6c" +checksum = "271ed9590613a04310efa4c7dbb9c1c7891a059e081af857cbefe6351341a5c5" dependencies = [ "wasmer", "wasmer-types", @@ -1814,9 +1814,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b842f750f53bb118540169c52dad83f2ac00b4e52f49067f9e78d45b53b4ce" +checksum = "918344b93266cf4efe56e6cd23f35c7325275524f534678145f7ead4b2b8c762" dependencies = [ "bytecheck", "enum-iterator", @@ -1830,9 +1830,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0847dca1391c1c6ac31c742f79ac115d0c02a0af421a56cc53c1ceb0430558db" +checksum = "4e36cba570e0b2662ff52d40fe9a48fd368f6eb35183a84ce43f79bc51b9fd15" dependencies = [ "backtrace", "cc", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 377691eeb5..42613edb50 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -1799,9 +1799,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c8fbe9fc5a0f9edcdb625859382d9acddac7c9619a77dd5dff3b1f1f9d4609" +checksum = "d924829e1d14ca3b0ab2562ef7c958fd61ec3fdc6401fd09f20becf59c1f1d17" dependencies = [ "bytes", "cfg-if", @@ -1827,9 +1827,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9438969e43529ba78fafdf0495df624e5eca9366881c7452e5ff5037a9d9ffde" +checksum = "945e8cd172c68cf10fefcd40f9c97bd301ecc9bf0136972bf807474f1b5951de" dependencies = [ "backtrace", "cfg-if", @@ -1850,9 +1850,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b3bec24e3fe4c2414481c999bac0330d1b1b3c3930c36d21e30b7874ad7a129" +checksum = "cdce36e48ec8c70e34d150073d6214e52757474bb375c013f2ae0bac85800cce" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1869,9 +1869,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb98a7bc417b8fd12d40ba22352d3eef1e22b2a050885d853af5b8c73071223" +checksum = "8d8415054716a3d79e0d74e6da24795875641247d36cc35c3e46c7bf8291e158" dependencies = [ "byteorder", "dynasm", @@ -1888,9 +1888,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffdb84ebb76c8f298537535aa4cef65e0ca0de69172bc0ca9b6746dc2c1c1d0" +checksum = "90277df86705920fefed23c2724ed652fa974af788f0983ca0493b51691a76bd" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1900,9 +1900,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63565dd5d54ee0fa1d349d07e3cf183b27c978e2b73abd9517ab800fb4781a6c" +checksum = "271ed9590613a04310efa4c7dbb9c1c7891a059e081af857cbefe6351341a5c5" dependencies = [ "wasmer", "wasmer-types", @@ -1911,9 +1911,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b842f750f53bb118540169c52dad83f2ac00b4e52f49067f9e78d45b53b4ce" +checksum = "918344b93266cf4efe56e6cd23f35c7325275524f534678145f7ead4b2b8c762" dependencies = [ "bytecheck", "enum-iterator", @@ -1927,9 +1927,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0847dca1391c1c6ac31c742f79ac115d0c02a0af421a56cc53c1ceb0430558db" +checksum = "4e36cba570e0b2662ff52d40fe9a48fd368f6eb35183a84ce43f79bc51b9fd15" dependencies = [ "backtrace", "cc", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 4340d4df12..74346659d2 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -1660,9 +1660,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c8fbe9fc5a0f9edcdb625859382d9acddac7c9619a77dd5dff3b1f1f9d4609" +checksum = "d924829e1d14ca3b0ab2562ef7c958fd61ec3fdc6401fd09f20becf59c1f1d17" dependencies = [ "bytes", "cfg-if", @@ -1688,9 +1688,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9438969e43529ba78fafdf0495df624e5eca9366881c7452e5ff5037a9d9ffde" +checksum = "945e8cd172c68cf10fefcd40f9c97bd301ecc9bf0136972bf807474f1b5951de" dependencies = [ "backtrace", "cfg-if", @@ -1711,9 +1711,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b3bec24e3fe4c2414481c999bac0330d1b1b3c3930c36d21e30b7874ad7a129" +checksum = "cdce36e48ec8c70e34d150073d6214e52757474bb375c013f2ae0bac85800cce" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1730,9 +1730,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb98a7bc417b8fd12d40ba22352d3eef1e22b2a050885d853af5b8c73071223" +checksum = "8d8415054716a3d79e0d74e6da24795875641247d36cc35c3e46c7bf8291e158" dependencies = [ "byteorder", "dynasm", @@ -1749,9 +1749,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffdb84ebb76c8f298537535aa4cef65e0ca0de69172bc0ca9b6746dc2c1c1d0" +checksum = "90277df86705920fefed23c2724ed652fa974af788f0983ca0493b51691a76bd" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1761,9 +1761,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63565dd5d54ee0fa1d349d07e3cf183b27c978e2b73abd9517ab800fb4781a6c" +checksum = "271ed9590613a04310efa4c7dbb9c1c7891a059e081af857cbefe6351341a5c5" dependencies = [ "wasmer", "wasmer-types", @@ -1772,9 +1772,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b842f750f53bb118540169c52dad83f2ac00b4e52f49067f9e78d45b53b4ce" +checksum = "918344b93266cf4efe56e6cd23f35c7325275524f534678145f7ead4b2b8c762" dependencies = [ "bytecheck", "enum-iterator", @@ -1788,9 +1788,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0847dca1391c1c6ac31c742f79ac115d0c02a0af421a56cc53c1ceb0430558db" +checksum = "4e36cba570e0b2662ff52d40fe9a48fd368f6eb35183a84ce43f79bc51b9fd15" dependencies = [ "backtrace", "cc", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 6ad4ef2f67..28d2ed6585 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -1661,9 +1661,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c8fbe9fc5a0f9edcdb625859382d9acddac7c9619a77dd5dff3b1f1f9d4609" +checksum = "d924829e1d14ca3b0ab2562ef7c958fd61ec3fdc6401fd09f20becf59c1f1d17" dependencies = [ "bytes", "cfg-if", @@ -1689,9 +1689,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9438969e43529ba78fafdf0495df624e5eca9366881c7452e5ff5037a9d9ffde" +checksum = "945e8cd172c68cf10fefcd40f9c97bd301ecc9bf0136972bf807474f1b5951de" dependencies = [ "backtrace", "cfg-if", @@ -1712,9 +1712,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b3bec24e3fe4c2414481c999bac0330d1b1b3c3930c36d21e30b7874ad7a129" +checksum = "cdce36e48ec8c70e34d150073d6214e52757474bb375c013f2ae0bac85800cce" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1731,9 +1731,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb98a7bc417b8fd12d40ba22352d3eef1e22b2a050885d853af5b8c73071223" +checksum = "8d8415054716a3d79e0d74e6da24795875641247d36cc35c3e46c7bf8291e158" dependencies = [ "byteorder", "dynasm", @@ -1750,9 +1750,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffdb84ebb76c8f298537535aa4cef65e0ca0de69172bc0ca9b6746dc2c1c1d0" +checksum = "90277df86705920fefed23c2724ed652fa974af788f0983ca0493b51691a76bd" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1762,9 +1762,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63565dd5d54ee0fa1d349d07e3cf183b27c978e2b73abd9517ab800fb4781a6c" +checksum = "271ed9590613a04310efa4c7dbb9c1c7891a059e081af857cbefe6351341a5c5" dependencies = [ "wasmer", "wasmer-types", @@ -1773,9 +1773,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b842f750f53bb118540169c52dad83f2ac00b4e52f49067f9e78d45b53b4ce" +checksum = "918344b93266cf4efe56e6cd23f35c7325275524f534678145f7ead4b2b8c762" dependencies = [ "bytecheck", "enum-iterator", @@ -1789,9 +1789,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0847dca1391c1c6ac31c742f79ac115d0c02a0af421a56cc53c1ceb0430558db" +checksum = "4e36cba570e0b2662ff52d40fe9a48fd368f6eb35183a84ce43f79bc51b9fd15" dependencies = [ "backtrace", "cc", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 49144c7c5c..c7c05a55a0 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -1659,9 +1659,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c8fbe9fc5a0f9edcdb625859382d9acddac7c9619a77dd5dff3b1f1f9d4609" +checksum = "d924829e1d14ca3b0ab2562ef7c958fd61ec3fdc6401fd09f20becf59c1f1d17" dependencies = [ "bytes", "cfg-if", @@ -1687,9 +1687,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9438969e43529ba78fafdf0495df624e5eca9366881c7452e5ff5037a9d9ffde" +checksum = "945e8cd172c68cf10fefcd40f9c97bd301ecc9bf0136972bf807474f1b5951de" dependencies = [ "backtrace", "cfg-if", @@ -1710,9 +1710,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b3bec24e3fe4c2414481c999bac0330d1b1b3c3930c36d21e30b7874ad7a129" +checksum = "cdce36e48ec8c70e34d150073d6214e52757474bb375c013f2ae0bac85800cce" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1729,9 +1729,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb98a7bc417b8fd12d40ba22352d3eef1e22b2a050885d853af5b8c73071223" +checksum = "8d8415054716a3d79e0d74e6da24795875641247d36cc35c3e46c7bf8291e158" dependencies = [ "byteorder", "dynasm", @@ -1748,9 +1748,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffdb84ebb76c8f298537535aa4cef65e0ca0de69172bc0ca9b6746dc2c1c1d0" +checksum = "90277df86705920fefed23c2724ed652fa974af788f0983ca0493b51691a76bd" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1760,9 +1760,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63565dd5d54ee0fa1d349d07e3cf183b27c978e2b73abd9517ab800fb4781a6c" +checksum = "271ed9590613a04310efa4c7dbb9c1c7891a059e081af857cbefe6351341a5c5" dependencies = [ "wasmer", "wasmer-types", @@ -1771,9 +1771,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b842f750f53bb118540169c52dad83f2ac00b4e52f49067f9e78d45b53b4ce" +checksum = "918344b93266cf4efe56e6cd23f35c7325275524f534678145f7ead4b2b8c762" dependencies = [ "bytecheck", "enum-iterator", @@ -1787,9 +1787,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0847dca1391c1c6ac31c742f79ac115d0c02a0af421a56cc53c1ceb0430558db" +checksum = "4e36cba570e0b2662ff52d40fe9a48fd368f6eb35183a84ce43f79bc51b9fd15" dependencies = [ "backtrace", "cc", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 65c2688e4b..8db592b491 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -1659,9 +1659,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c8fbe9fc5a0f9edcdb625859382d9acddac7c9619a77dd5dff3b1f1f9d4609" +checksum = "d924829e1d14ca3b0ab2562ef7c958fd61ec3fdc6401fd09f20becf59c1f1d17" dependencies = [ "bytes", "cfg-if", @@ -1687,9 +1687,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9438969e43529ba78fafdf0495df624e5eca9366881c7452e5ff5037a9d9ffde" +checksum = "945e8cd172c68cf10fefcd40f9c97bd301ecc9bf0136972bf807474f1b5951de" dependencies = [ "backtrace", "cfg-if", @@ -1710,9 +1710,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b3bec24e3fe4c2414481c999bac0330d1b1b3c3930c36d21e30b7874ad7a129" +checksum = "cdce36e48ec8c70e34d150073d6214e52757474bb375c013f2ae0bac85800cce" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1729,9 +1729,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb98a7bc417b8fd12d40ba22352d3eef1e22b2a050885d853af5b8c73071223" +checksum = "8d8415054716a3d79e0d74e6da24795875641247d36cc35c3e46c7bf8291e158" dependencies = [ "byteorder", "dynasm", @@ -1748,9 +1748,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffdb84ebb76c8f298537535aa4cef65e0ca0de69172bc0ca9b6746dc2c1c1d0" +checksum = "90277df86705920fefed23c2724ed652fa974af788f0983ca0493b51691a76bd" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1760,9 +1760,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63565dd5d54ee0fa1d349d07e3cf183b27c978e2b73abd9517ab800fb4781a6c" +checksum = "271ed9590613a04310efa4c7dbb9c1c7891a059e081af857cbefe6351341a5c5" dependencies = [ "wasmer", "wasmer-types", @@ -1771,9 +1771,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b842f750f53bb118540169c52dad83f2ac00b4e52f49067f9e78d45b53b4ce" +checksum = "918344b93266cf4efe56e6cd23f35c7325275524f534678145f7ead4b2b8c762" dependencies = [ "bytecheck", "enum-iterator", @@ -1787,9 +1787,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0847dca1391c1c6ac31c742f79ac115d0c02a0af421a56cc53c1ceb0430558db" +checksum = "4e36cba570e0b2662ff52d40fe9a48fd368f6eb35183a84ce43f79bc51b9fd15" dependencies = [ "backtrace", "cc", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index d64af50363..8723319a3a 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -1659,9 +1659,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c8fbe9fc5a0f9edcdb625859382d9acddac7c9619a77dd5dff3b1f1f9d4609" +checksum = "d924829e1d14ca3b0ab2562ef7c958fd61ec3fdc6401fd09f20becf59c1f1d17" dependencies = [ "bytes", "cfg-if", @@ -1687,9 +1687,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9438969e43529ba78fafdf0495df624e5eca9366881c7452e5ff5037a9d9ffde" +checksum = "945e8cd172c68cf10fefcd40f9c97bd301ecc9bf0136972bf807474f1b5951de" dependencies = [ "backtrace", "cfg-if", @@ -1710,9 +1710,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b3bec24e3fe4c2414481c999bac0330d1b1b3c3930c36d21e30b7874ad7a129" +checksum = "cdce36e48ec8c70e34d150073d6214e52757474bb375c013f2ae0bac85800cce" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1729,9 +1729,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb98a7bc417b8fd12d40ba22352d3eef1e22b2a050885d853af5b8c73071223" +checksum = "8d8415054716a3d79e0d74e6da24795875641247d36cc35c3e46c7bf8291e158" dependencies = [ "byteorder", "dynasm", @@ -1748,9 +1748,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffdb84ebb76c8f298537535aa4cef65e0ca0de69172bc0ca9b6746dc2c1c1d0" +checksum = "90277df86705920fefed23c2724ed652fa974af788f0983ca0493b51691a76bd" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1760,9 +1760,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63565dd5d54ee0fa1d349d07e3cf183b27c978e2b73abd9517ab800fb4781a6c" +checksum = "271ed9590613a04310efa4c7dbb9c1c7891a059e081af857cbefe6351341a5c5" dependencies = [ "wasmer", "wasmer-types", @@ -1771,9 +1771,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b842f750f53bb118540169c52dad83f2ac00b4e52f49067f9e78d45b53b4ce" +checksum = "918344b93266cf4efe56e6cd23f35c7325275524f534678145f7ead4b2b8c762" dependencies = [ "bytecheck", "enum-iterator", @@ -1787,9 +1787,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0847dca1391c1c6ac31c742f79ac115d0c02a0af421a56cc53c1ceb0430558db" +checksum = "4e36cba570e0b2662ff52d40fe9a48fd368f6eb35183a84ce43f79bc51b9fd15" dependencies = [ "backtrace", "cc", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 908d3c2491..1ba8b005c3 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -1660,9 +1660,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c8fbe9fc5a0f9edcdb625859382d9acddac7c9619a77dd5dff3b1f1f9d4609" +checksum = "d924829e1d14ca3b0ab2562ef7c958fd61ec3fdc6401fd09f20becf59c1f1d17" dependencies = [ "bytes", "cfg-if", @@ -1688,9 +1688,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9438969e43529ba78fafdf0495df624e5eca9366881c7452e5ff5037a9d9ffde" +checksum = "945e8cd172c68cf10fefcd40f9c97bd301ecc9bf0136972bf807474f1b5951de" dependencies = [ "backtrace", "cfg-if", @@ -1711,9 +1711,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b3bec24e3fe4c2414481c999bac0330d1b1b3c3930c36d21e30b7874ad7a129" +checksum = "cdce36e48ec8c70e34d150073d6214e52757474bb375c013f2ae0bac85800cce" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1730,9 +1730,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb98a7bc417b8fd12d40ba22352d3eef1e22b2a050885d853af5b8c73071223" +checksum = "8d8415054716a3d79e0d74e6da24795875641247d36cc35c3e46c7bf8291e158" dependencies = [ "byteorder", "dynasm", @@ -1749,9 +1749,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffdb84ebb76c8f298537535aa4cef65e0ca0de69172bc0ca9b6746dc2c1c1d0" +checksum = "90277df86705920fefed23c2724ed652fa974af788f0983ca0493b51691a76bd" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1761,9 +1761,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63565dd5d54ee0fa1d349d07e3cf183b27c978e2b73abd9517ab800fb4781a6c" +checksum = "271ed9590613a04310efa4c7dbb9c1c7891a059e081af857cbefe6351341a5c5" dependencies = [ "wasmer", "wasmer-types", @@ -1772,9 +1772,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b842f750f53bb118540169c52dad83f2ac00b4e52f49067f9e78d45b53b4ce" +checksum = "918344b93266cf4efe56e6cd23f35c7325275524f534678145f7ead4b2b8c762" dependencies = [ "bytecheck", "enum-iterator", @@ -1788,9 +1788,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0847dca1391c1c6ac31c742f79ac115d0c02a0af421a56cc53c1ceb0430558db" +checksum = "4e36cba570e0b2662ff52d40fe9a48fd368f6eb35183a84ce43f79bc51b9fd15" dependencies = [ "backtrace", "cc", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index bce91ae969..1cdad2b4b0 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -1687,9 +1687,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c8fbe9fc5a0f9edcdb625859382d9acddac7c9619a77dd5dff3b1f1f9d4609" +checksum = "d924829e1d14ca3b0ab2562ef7c958fd61ec3fdc6401fd09f20becf59c1f1d17" dependencies = [ "bytes", "cfg-if", @@ -1715,9 +1715,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9438969e43529ba78fafdf0495df624e5eca9366881c7452e5ff5037a9d9ffde" +checksum = "945e8cd172c68cf10fefcd40f9c97bd301ecc9bf0136972bf807474f1b5951de" dependencies = [ "backtrace", "cfg-if", @@ -1738,9 +1738,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b3bec24e3fe4c2414481c999bac0330d1b1b3c3930c36d21e30b7874ad7a129" +checksum = "cdce36e48ec8c70e34d150073d6214e52757474bb375c013f2ae0bac85800cce" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1757,9 +1757,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb98a7bc417b8fd12d40ba22352d3eef1e22b2a050885d853af5b8c73071223" +checksum = "8d8415054716a3d79e0d74e6da24795875641247d36cc35c3e46c7bf8291e158" dependencies = [ "byteorder", "dynasm", @@ -1776,9 +1776,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffdb84ebb76c8f298537535aa4cef65e0ca0de69172bc0ca9b6746dc2c1c1d0" +checksum = "90277df86705920fefed23c2724ed652fa974af788f0983ca0493b51691a76bd" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1788,9 +1788,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63565dd5d54ee0fa1d349d07e3cf183b27c978e2b73abd9517ab800fb4781a6c" +checksum = "271ed9590613a04310efa4c7dbb9c1c7891a059e081af857cbefe6351341a5c5" dependencies = [ "wasmer", "wasmer-types", @@ -1799,9 +1799,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b842f750f53bb118540169c52dad83f2ac00b4e52f49067f9e78d45b53b4ce" +checksum = "918344b93266cf4efe56e6cd23f35c7325275524f534678145f7ead4b2b8c762" dependencies = [ "bytecheck", "enum-iterator", @@ -1815,9 +1815,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0847dca1391c1c6ac31c742f79ac115d0c02a0af421a56cc53c1ceb0430558db" +checksum = "4e36cba570e0b2662ff52d40fe9a48fd368f6eb35183a84ce43f79bc51b9fd15" dependencies = [ "backtrace", "cc", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index fa242a80da..96ecd638d5 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -1660,9 +1660,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c8fbe9fc5a0f9edcdb625859382d9acddac7c9619a77dd5dff3b1f1f9d4609" +checksum = "d924829e1d14ca3b0ab2562ef7c958fd61ec3fdc6401fd09f20becf59c1f1d17" dependencies = [ "bytes", "cfg-if", @@ -1688,9 +1688,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9438969e43529ba78fafdf0495df624e5eca9366881c7452e5ff5037a9d9ffde" +checksum = "945e8cd172c68cf10fefcd40f9c97bd301ecc9bf0136972bf807474f1b5951de" dependencies = [ "backtrace", "cfg-if", @@ -1711,9 +1711,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b3bec24e3fe4c2414481c999bac0330d1b1b3c3930c36d21e30b7874ad7a129" +checksum = "cdce36e48ec8c70e34d150073d6214e52757474bb375c013f2ae0bac85800cce" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1730,9 +1730,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb98a7bc417b8fd12d40ba22352d3eef1e22b2a050885d853af5b8c73071223" +checksum = "8d8415054716a3d79e0d74e6da24795875641247d36cc35c3e46c7bf8291e158" dependencies = [ "byteorder", "dynasm", @@ -1749,9 +1749,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffdb84ebb76c8f298537535aa4cef65e0ca0de69172bc0ca9b6746dc2c1c1d0" +checksum = "90277df86705920fefed23c2724ed652fa974af788f0983ca0493b51691a76bd" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1761,9 +1761,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63565dd5d54ee0fa1d349d07e3cf183b27c978e2b73abd9517ab800fb4781a6c" +checksum = "271ed9590613a04310efa4c7dbb9c1c7891a059e081af857cbefe6351341a5c5" dependencies = [ "wasmer", "wasmer-types", @@ -1772,9 +1772,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b842f750f53bb118540169c52dad83f2ac00b4e52f49067f9e78d45b53b4ce" +checksum = "918344b93266cf4efe56e6cd23f35c7325275524f534678145f7ead4b2b8c762" dependencies = [ "bytecheck", "enum-iterator", @@ -1788,9 +1788,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0-alpha.1" +version = "4.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0847dca1391c1c6ac31c742f79ac115d0c02a0af421a56cc53c1ceb0430558db" +checksum = "4e36cba570e0b2662ff52d40fe9a48fd368f6eb35183a84ce43f79bc51b9fd15" dependencies = [ "backtrace", "cc", diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 90a17b0907..c1deb4f416 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -49,8 +49,8 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " serde_json = "1.0.40" sha2 = "0.10.3" thiserror = "1.0.26" -wasmer = { version = "=4.0.0-alpha.1", default-features = false, features = ["cranelift", "singlepass"] } -wasmer-middlewares = "=4.0.0-alpha.1" +wasmer = { version = "=4.0.0-beta.3", default-features = false, features = ["cranelift", "singlepass"] } +wasmer-middlewares = "=4.0.0-beta.3" # Dependencies that we do not use ourself. We add those entries # to bump the min version of them. From a42a5e04326893745c570bb87eb237e2438b2355 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 26 Jun 2023 15:23:48 +0200 Subject: [PATCH 0459/2372] Use stable wasmer 4 --- Cargo.lock | 32 +++++++++++++-------------- contracts/burner/Cargo.lock | 32 +++++++++++++-------------- contracts/crypto-verify/Cargo.lock | 32 +++++++++++++-------------- contracts/cyberpunk/Cargo.lock | 32 +++++++++++++-------------- contracts/floaty/Cargo.lock | 32 +++++++++++++-------------- contracts/hackatom/Cargo.lock | 32 +++++++++++++-------------- contracts/ibc-reflect-send/Cargo.lock | 32 +++++++++++++-------------- contracts/ibc-reflect/Cargo.lock | 32 +++++++++++++-------------- contracts/queue/Cargo.lock | 32 +++++++++++++-------------- contracts/reflect/Cargo.lock | 32 +++++++++++++-------------- contracts/staking/Cargo.lock | 32 +++++++++++++-------------- contracts/virus/Cargo.lock | 32 +++++++++++++-------------- packages/vm/Cargo.toml | 4 ++-- 13 files changed, 194 insertions(+), 194 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ab264acdaa..81191e1fff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2356,9 +2356,9 @@ dependencies = [ [[package]] name = "wasmer" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d924829e1d14ca3b0ab2562ef7c958fd61ec3fdc6401fd09f20becf59c1f1d17" +checksum = "ea790bcdfb4e6e9d1e5ddf75b4699aac62b078fcc9f27f44e1748165ceea67bf" dependencies = [ "bytes", "cfg-if", @@ -2384,9 +2384,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945e8cd172c68cf10fefcd40f9c97bd301ecc9bf0136972bf807474f1b5951de" +checksum = "f093937725e242e5529fed27e08ff836c011a9ecc22e6819fb818c2ac6ff5f88" dependencies = [ "backtrace", "cfg-if", @@ -2407,9 +2407,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdce36e48ec8c70e34d150073d6214e52757474bb375c013f2ae0bac85800cce" +checksum = "3b27b1670d27158789ebe14e4da3902c72132174884a1c6a3533ce4fd9dd83db" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -2426,9 +2426,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d8415054716a3d79e0d74e6da24795875641247d36cc35c3e46c7bf8291e158" +checksum = "02509aaab7e302fc551ff03512807514b379ba32136892e96fcaa5b62a3228de" dependencies = [ "byteorder", "dynasm", @@ -2445,9 +2445,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90277df86705920fefed23c2724ed652fa974af788f0983ca0493b51691a76bd" +checksum = "13ae8286cba2acb10065a4dac129c7c7f7bcd24acd6538555d96616eea16bc27" dependencies = [ "proc-macro-error", "proc-macro2", @@ -2457,9 +2457,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271ed9590613a04310efa4c7dbb9c1c7891a059e081af857cbefe6351341a5c5" +checksum = "3bc8cafe02112ecf21a7fc1d090ac0f0220a86a8d4f561c24e382a4c2ee4addc" dependencies = [ "wasmer", "wasmer-types", @@ -2468,9 +2468,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918344b93266cf4efe56e6cd23f35c7325275524f534678145f7ead4b2b8c762" +checksum = "918d2f0bb5eaa95a80c06be33f21dee92f40f12cd0982da34490d121a99d244b" dependencies = [ "bytecheck", "enum-iterator", @@ -2484,9 +2484,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e36cba570e0b2662ff52d40fe9a48fd368f6eb35183a84ce43f79bc51b9fd15" +checksum = "a1e000c2cbd4f9805427af5f3b3446574caf89ab3a1e66c2f3579fbde22b072b" dependencies = [ "backtrace", "cc", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index c12378344c..b4398eeab9 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -1659,9 +1659,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d924829e1d14ca3b0ab2562ef7c958fd61ec3fdc6401fd09f20becf59c1f1d17" +checksum = "ea790bcdfb4e6e9d1e5ddf75b4699aac62b078fcc9f27f44e1748165ceea67bf" dependencies = [ "bytes", "cfg-if", @@ -1687,9 +1687,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945e8cd172c68cf10fefcd40f9c97bd301ecc9bf0136972bf807474f1b5951de" +checksum = "f093937725e242e5529fed27e08ff836c011a9ecc22e6819fb818c2ac6ff5f88" dependencies = [ "backtrace", "cfg-if", @@ -1710,9 +1710,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdce36e48ec8c70e34d150073d6214e52757474bb375c013f2ae0bac85800cce" +checksum = "3b27b1670d27158789ebe14e4da3902c72132174884a1c6a3533ce4fd9dd83db" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1729,9 +1729,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d8415054716a3d79e0d74e6da24795875641247d36cc35c3e46c7bf8291e158" +checksum = "02509aaab7e302fc551ff03512807514b379ba32136892e96fcaa5b62a3228de" dependencies = [ "byteorder", "dynasm", @@ -1748,9 +1748,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90277df86705920fefed23c2724ed652fa974af788f0983ca0493b51691a76bd" +checksum = "13ae8286cba2acb10065a4dac129c7c7f7bcd24acd6538555d96616eea16bc27" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1760,9 +1760,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271ed9590613a04310efa4c7dbb9c1c7891a059e081af857cbefe6351341a5c5" +checksum = "3bc8cafe02112ecf21a7fc1d090ac0f0220a86a8d4f561c24e382a4c2ee4addc" dependencies = [ "wasmer", "wasmer-types", @@ -1771,9 +1771,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918344b93266cf4efe56e6cd23f35c7325275524f534678145f7ead4b2b8c762" +checksum = "918d2f0bb5eaa95a80c06be33f21dee92f40f12cd0982da34490d121a99d244b" dependencies = [ "bytecheck", "enum-iterator", @@ -1787,9 +1787,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e36cba570e0b2662ff52d40fe9a48fd368f6eb35183a84ce43f79bc51b9fd15" +checksum = "a1e000c2cbd4f9805427af5f3b3446574caf89ab3a1e66c2f3579fbde22b072b" dependencies = [ "backtrace", "cc", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 3bf1fea3ec..8830044d6c 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -1702,9 +1702,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d924829e1d14ca3b0ab2562ef7c958fd61ec3fdc6401fd09f20becf59c1f1d17" +checksum = "ea790bcdfb4e6e9d1e5ddf75b4699aac62b078fcc9f27f44e1748165ceea67bf" dependencies = [ "bytes", "cfg-if", @@ -1730,9 +1730,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945e8cd172c68cf10fefcd40f9c97bd301ecc9bf0136972bf807474f1b5951de" +checksum = "f093937725e242e5529fed27e08ff836c011a9ecc22e6819fb818c2ac6ff5f88" dependencies = [ "backtrace", "cfg-if", @@ -1753,9 +1753,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdce36e48ec8c70e34d150073d6214e52757474bb375c013f2ae0bac85800cce" +checksum = "3b27b1670d27158789ebe14e4da3902c72132174884a1c6a3533ce4fd9dd83db" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1772,9 +1772,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d8415054716a3d79e0d74e6da24795875641247d36cc35c3e46c7bf8291e158" +checksum = "02509aaab7e302fc551ff03512807514b379ba32136892e96fcaa5b62a3228de" dependencies = [ "byteorder", "dynasm", @@ -1791,9 +1791,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90277df86705920fefed23c2724ed652fa974af788f0983ca0493b51691a76bd" +checksum = "13ae8286cba2acb10065a4dac129c7c7f7bcd24acd6538555d96616eea16bc27" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1803,9 +1803,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271ed9590613a04310efa4c7dbb9c1c7891a059e081af857cbefe6351341a5c5" +checksum = "3bc8cafe02112ecf21a7fc1d090ac0f0220a86a8d4f561c24e382a4c2ee4addc" dependencies = [ "wasmer", "wasmer-types", @@ -1814,9 +1814,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918344b93266cf4efe56e6cd23f35c7325275524f534678145f7ead4b2b8c762" +checksum = "918d2f0bb5eaa95a80c06be33f21dee92f40f12cd0982da34490d121a99d244b" dependencies = [ "bytecheck", "enum-iterator", @@ -1830,9 +1830,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e36cba570e0b2662ff52d40fe9a48fd368f6eb35183a84ce43f79bc51b9fd15" +checksum = "a1e000c2cbd4f9805427af5f3b3446574caf89ab3a1e66c2f3579fbde22b072b" dependencies = [ "backtrace", "cc", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 42613edb50..acf7eb5ad8 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -1799,9 +1799,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d924829e1d14ca3b0ab2562ef7c958fd61ec3fdc6401fd09f20becf59c1f1d17" +checksum = "ea790bcdfb4e6e9d1e5ddf75b4699aac62b078fcc9f27f44e1748165ceea67bf" dependencies = [ "bytes", "cfg-if", @@ -1827,9 +1827,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945e8cd172c68cf10fefcd40f9c97bd301ecc9bf0136972bf807474f1b5951de" +checksum = "f093937725e242e5529fed27e08ff836c011a9ecc22e6819fb818c2ac6ff5f88" dependencies = [ "backtrace", "cfg-if", @@ -1850,9 +1850,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdce36e48ec8c70e34d150073d6214e52757474bb375c013f2ae0bac85800cce" +checksum = "3b27b1670d27158789ebe14e4da3902c72132174884a1c6a3533ce4fd9dd83db" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1869,9 +1869,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d8415054716a3d79e0d74e6da24795875641247d36cc35c3e46c7bf8291e158" +checksum = "02509aaab7e302fc551ff03512807514b379ba32136892e96fcaa5b62a3228de" dependencies = [ "byteorder", "dynasm", @@ -1888,9 +1888,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90277df86705920fefed23c2724ed652fa974af788f0983ca0493b51691a76bd" +checksum = "13ae8286cba2acb10065a4dac129c7c7f7bcd24acd6538555d96616eea16bc27" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1900,9 +1900,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271ed9590613a04310efa4c7dbb9c1c7891a059e081af857cbefe6351341a5c5" +checksum = "3bc8cafe02112ecf21a7fc1d090ac0f0220a86a8d4f561c24e382a4c2ee4addc" dependencies = [ "wasmer", "wasmer-types", @@ -1911,9 +1911,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918344b93266cf4efe56e6cd23f35c7325275524f534678145f7ead4b2b8c762" +checksum = "918d2f0bb5eaa95a80c06be33f21dee92f40f12cd0982da34490d121a99d244b" dependencies = [ "bytecheck", "enum-iterator", @@ -1927,9 +1927,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e36cba570e0b2662ff52d40fe9a48fd368f6eb35183a84ce43f79bc51b9fd15" +checksum = "a1e000c2cbd4f9805427af5f3b3446574caf89ab3a1e66c2f3579fbde22b072b" dependencies = [ "backtrace", "cc", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 74346659d2..00d8db842e 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -1660,9 +1660,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d924829e1d14ca3b0ab2562ef7c958fd61ec3fdc6401fd09f20becf59c1f1d17" +checksum = "ea790bcdfb4e6e9d1e5ddf75b4699aac62b078fcc9f27f44e1748165ceea67bf" dependencies = [ "bytes", "cfg-if", @@ -1688,9 +1688,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945e8cd172c68cf10fefcd40f9c97bd301ecc9bf0136972bf807474f1b5951de" +checksum = "f093937725e242e5529fed27e08ff836c011a9ecc22e6819fb818c2ac6ff5f88" dependencies = [ "backtrace", "cfg-if", @@ -1711,9 +1711,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdce36e48ec8c70e34d150073d6214e52757474bb375c013f2ae0bac85800cce" +checksum = "3b27b1670d27158789ebe14e4da3902c72132174884a1c6a3533ce4fd9dd83db" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1730,9 +1730,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d8415054716a3d79e0d74e6da24795875641247d36cc35c3e46c7bf8291e158" +checksum = "02509aaab7e302fc551ff03512807514b379ba32136892e96fcaa5b62a3228de" dependencies = [ "byteorder", "dynasm", @@ -1749,9 +1749,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90277df86705920fefed23c2724ed652fa974af788f0983ca0493b51691a76bd" +checksum = "13ae8286cba2acb10065a4dac129c7c7f7bcd24acd6538555d96616eea16bc27" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1761,9 +1761,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271ed9590613a04310efa4c7dbb9c1c7891a059e081af857cbefe6351341a5c5" +checksum = "3bc8cafe02112ecf21a7fc1d090ac0f0220a86a8d4f561c24e382a4c2ee4addc" dependencies = [ "wasmer", "wasmer-types", @@ -1772,9 +1772,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918344b93266cf4efe56e6cd23f35c7325275524f534678145f7ead4b2b8c762" +checksum = "918d2f0bb5eaa95a80c06be33f21dee92f40f12cd0982da34490d121a99d244b" dependencies = [ "bytecheck", "enum-iterator", @@ -1788,9 +1788,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e36cba570e0b2662ff52d40fe9a48fd368f6eb35183a84ce43f79bc51b9fd15" +checksum = "a1e000c2cbd4f9805427af5f3b3446574caf89ab3a1e66c2f3579fbde22b072b" dependencies = [ "backtrace", "cc", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 28d2ed6585..266b9315bd 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -1661,9 +1661,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d924829e1d14ca3b0ab2562ef7c958fd61ec3fdc6401fd09f20becf59c1f1d17" +checksum = "ea790bcdfb4e6e9d1e5ddf75b4699aac62b078fcc9f27f44e1748165ceea67bf" dependencies = [ "bytes", "cfg-if", @@ -1689,9 +1689,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945e8cd172c68cf10fefcd40f9c97bd301ecc9bf0136972bf807474f1b5951de" +checksum = "f093937725e242e5529fed27e08ff836c011a9ecc22e6819fb818c2ac6ff5f88" dependencies = [ "backtrace", "cfg-if", @@ -1712,9 +1712,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdce36e48ec8c70e34d150073d6214e52757474bb375c013f2ae0bac85800cce" +checksum = "3b27b1670d27158789ebe14e4da3902c72132174884a1c6a3533ce4fd9dd83db" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1731,9 +1731,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d8415054716a3d79e0d74e6da24795875641247d36cc35c3e46c7bf8291e158" +checksum = "02509aaab7e302fc551ff03512807514b379ba32136892e96fcaa5b62a3228de" dependencies = [ "byteorder", "dynasm", @@ -1750,9 +1750,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90277df86705920fefed23c2724ed652fa974af788f0983ca0493b51691a76bd" +checksum = "13ae8286cba2acb10065a4dac129c7c7f7bcd24acd6538555d96616eea16bc27" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1762,9 +1762,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271ed9590613a04310efa4c7dbb9c1c7891a059e081af857cbefe6351341a5c5" +checksum = "3bc8cafe02112ecf21a7fc1d090ac0f0220a86a8d4f561c24e382a4c2ee4addc" dependencies = [ "wasmer", "wasmer-types", @@ -1773,9 +1773,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918344b93266cf4efe56e6cd23f35c7325275524f534678145f7ead4b2b8c762" +checksum = "918d2f0bb5eaa95a80c06be33f21dee92f40f12cd0982da34490d121a99d244b" dependencies = [ "bytecheck", "enum-iterator", @@ -1789,9 +1789,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e36cba570e0b2662ff52d40fe9a48fd368f6eb35183a84ce43f79bc51b9fd15" +checksum = "a1e000c2cbd4f9805427af5f3b3446574caf89ab3a1e66c2f3579fbde22b072b" dependencies = [ "backtrace", "cc", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index c7c05a55a0..4c187f7720 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -1659,9 +1659,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d924829e1d14ca3b0ab2562ef7c958fd61ec3fdc6401fd09f20becf59c1f1d17" +checksum = "ea790bcdfb4e6e9d1e5ddf75b4699aac62b078fcc9f27f44e1748165ceea67bf" dependencies = [ "bytes", "cfg-if", @@ -1687,9 +1687,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945e8cd172c68cf10fefcd40f9c97bd301ecc9bf0136972bf807474f1b5951de" +checksum = "f093937725e242e5529fed27e08ff836c011a9ecc22e6819fb818c2ac6ff5f88" dependencies = [ "backtrace", "cfg-if", @@ -1710,9 +1710,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdce36e48ec8c70e34d150073d6214e52757474bb375c013f2ae0bac85800cce" +checksum = "3b27b1670d27158789ebe14e4da3902c72132174884a1c6a3533ce4fd9dd83db" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1729,9 +1729,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d8415054716a3d79e0d74e6da24795875641247d36cc35c3e46c7bf8291e158" +checksum = "02509aaab7e302fc551ff03512807514b379ba32136892e96fcaa5b62a3228de" dependencies = [ "byteorder", "dynasm", @@ -1748,9 +1748,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90277df86705920fefed23c2724ed652fa974af788f0983ca0493b51691a76bd" +checksum = "13ae8286cba2acb10065a4dac129c7c7f7bcd24acd6538555d96616eea16bc27" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1760,9 +1760,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271ed9590613a04310efa4c7dbb9c1c7891a059e081af857cbefe6351341a5c5" +checksum = "3bc8cafe02112ecf21a7fc1d090ac0f0220a86a8d4f561c24e382a4c2ee4addc" dependencies = [ "wasmer", "wasmer-types", @@ -1771,9 +1771,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918344b93266cf4efe56e6cd23f35c7325275524f534678145f7ead4b2b8c762" +checksum = "918d2f0bb5eaa95a80c06be33f21dee92f40f12cd0982da34490d121a99d244b" dependencies = [ "bytecheck", "enum-iterator", @@ -1787,9 +1787,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e36cba570e0b2662ff52d40fe9a48fd368f6eb35183a84ce43f79bc51b9fd15" +checksum = "a1e000c2cbd4f9805427af5f3b3446574caf89ab3a1e66c2f3579fbde22b072b" dependencies = [ "backtrace", "cc", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 8db592b491..97100109ea 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -1659,9 +1659,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d924829e1d14ca3b0ab2562ef7c958fd61ec3fdc6401fd09f20becf59c1f1d17" +checksum = "ea790bcdfb4e6e9d1e5ddf75b4699aac62b078fcc9f27f44e1748165ceea67bf" dependencies = [ "bytes", "cfg-if", @@ -1687,9 +1687,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945e8cd172c68cf10fefcd40f9c97bd301ecc9bf0136972bf807474f1b5951de" +checksum = "f093937725e242e5529fed27e08ff836c011a9ecc22e6819fb818c2ac6ff5f88" dependencies = [ "backtrace", "cfg-if", @@ -1710,9 +1710,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdce36e48ec8c70e34d150073d6214e52757474bb375c013f2ae0bac85800cce" +checksum = "3b27b1670d27158789ebe14e4da3902c72132174884a1c6a3533ce4fd9dd83db" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1729,9 +1729,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d8415054716a3d79e0d74e6da24795875641247d36cc35c3e46c7bf8291e158" +checksum = "02509aaab7e302fc551ff03512807514b379ba32136892e96fcaa5b62a3228de" dependencies = [ "byteorder", "dynasm", @@ -1748,9 +1748,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90277df86705920fefed23c2724ed652fa974af788f0983ca0493b51691a76bd" +checksum = "13ae8286cba2acb10065a4dac129c7c7f7bcd24acd6538555d96616eea16bc27" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1760,9 +1760,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271ed9590613a04310efa4c7dbb9c1c7891a059e081af857cbefe6351341a5c5" +checksum = "3bc8cafe02112ecf21a7fc1d090ac0f0220a86a8d4f561c24e382a4c2ee4addc" dependencies = [ "wasmer", "wasmer-types", @@ -1771,9 +1771,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918344b93266cf4efe56e6cd23f35c7325275524f534678145f7ead4b2b8c762" +checksum = "918d2f0bb5eaa95a80c06be33f21dee92f40f12cd0982da34490d121a99d244b" dependencies = [ "bytecheck", "enum-iterator", @@ -1787,9 +1787,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e36cba570e0b2662ff52d40fe9a48fd368f6eb35183a84ce43f79bc51b9fd15" +checksum = "a1e000c2cbd4f9805427af5f3b3446574caf89ab3a1e66c2f3579fbde22b072b" dependencies = [ "backtrace", "cc", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 8723319a3a..030268b6a2 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -1659,9 +1659,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d924829e1d14ca3b0ab2562ef7c958fd61ec3fdc6401fd09f20becf59c1f1d17" +checksum = "ea790bcdfb4e6e9d1e5ddf75b4699aac62b078fcc9f27f44e1748165ceea67bf" dependencies = [ "bytes", "cfg-if", @@ -1687,9 +1687,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945e8cd172c68cf10fefcd40f9c97bd301ecc9bf0136972bf807474f1b5951de" +checksum = "f093937725e242e5529fed27e08ff836c011a9ecc22e6819fb818c2ac6ff5f88" dependencies = [ "backtrace", "cfg-if", @@ -1710,9 +1710,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdce36e48ec8c70e34d150073d6214e52757474bb375c013f2ae0bac85800cce" +checksum = "3b27b1670d27158789ebe14e4da3902c72132174884a1c6a3533ce4fd9dd83db" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1729,9 +1729,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d8415054716a3d79e0d74e6da24795875641247d36cc35c3e46c7bf8291e158" +checksum = "02509aaab7e302fc551ff03512807514b379ba32136892e96fcaa5b62a3228de" dependencies = [ "byteorder", "dynasm", @@ -1748,9 +1748,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90277df86705920fefed23c2724ed652fa974af788f0983ca0493b51691a76bd" +checksum = "13ae8286cba2acb10065a4dac129c7c7f7bcd24acd6538555d96616eea16bc27" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1760,9 +1760,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271ed9590613a04310efa4c7dbb9c1c7891a059e081af857cbefe6351341a5c5" +checksum = "3bc8cafe02112ecf21a7fc1d090ac0f0220a86a8d4f561c24e382a4c2ee4addc" dependencies = [ "wasmer", "wasmer-types", @@ -1771,9 +1771,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918344b93266cf4efe56e6cd23f35c7325275524f534678145f7ead4b2b8c762" +checksum = "918d2f0bb5eaa95a80c06be33f21dee92f40f12cd0982da34490d121a99d244b" dependencies = [ "bytecheck", "enum-iterator", @@ -1787,9 +1787,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e36cba570e0b2662ff52d40fe9a48fd368f6eb35183a84ce43f79bc51b9fd15" +checksum = "a1e000c2cbd4f9805427af5f3b3446574caf89ab3a1e66c2f3579fbde22b072b" dependencies = [ "backtrace", "cc", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 1ba8b005c3..e5d5e5186e 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -1660,9 +1660,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d924829e1d14ca3b0ab2562ef7c958fd61ec3fdc6401fd09f20becf59c1f1d17" +checksum = "ea790bcdfb4e6e9d1e5ddf75b4699aac62b078fcc9f27f44e1748165ceea67bf" dependencies = [ "bytes", "cfg-if", @@ -1688,9 +1688,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945e8cd172c68cf10fefcd40f9c97bd301ecc9bf0136972bf807474f1b5951de" +checksum = "f093937725e242e5529fed27e08ff836c011a9ecc22e6819fb818c2ac6ff5f88" dependencies = [ "backtrace", "cfg-if", @@ -1711,9 +1711,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdce36e48ec8c70e34d150073d6214e52757474bb375c013f2ae0bac85800cce" +checksum = "3b27b1670d27158789ebe14e4da3902c72132174884a1c6a3533ce4fd9dd83db" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1730,9 +1730,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d8415054716a3d79e0d74e6da24795875641247d36cc35c3e46c7bf8291e158" +checksum = "02509aaab7e302fc551ff03512807514b379ba32136892e96fcaa5b62a3228de" dependencies = [ "byteorder", "dynasm", @@ -1749,9 +1749,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90277df86705920fefed23c2724ed652fa974af788f0983ca0493b51691a76bd" +checksum = "13ae8286cba2acb10065a4dac129c7c7f7bcd24acd6538555d96616eea16bc27" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1761,9 +1761,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271ed9590613a04310efa4c7dbb9c1c7891a059e081af857cbefe6351341a5c5" +checksum = "3bc8cafe02112ecf21a7fc1d090ac0f0220a86a8d4f561c24e382a4c2ee4addc" dependencies = [ "wasmer", "wasmer-types", @@ -1772,9 +1772,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918344b93266cf4efe56e6cd23f35c7325275524f534678145f7ead4b2b8c762" +checksum = "918d2f0bb5eaa95a80c06be33f21dee92f40f12cd0982da34490d121a99d244b" dependencies = [ "bytecheck", "enum-iterator", @@ -1788,9 +1788,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e36cba570e0b2662ff52d40fe9a48fd368f6eb35183a84ce43f79bc51b9fd15" +checksum = "a1e000c2cbd4f9805427af5f3b3446574caf89ab3a1e66c2f3579fbde22b072b" dependencies = [ "backtrace", "cc", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 1cdad2b4b0..9677d21968 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -1687,9 +1687,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d924829e1d14ca3b0ab2562ef7c958fd61ec3fdc6401fd09f20becf59c1f1d17" +checksum = "ea790bcdfb4e6e9d1e5ddf75b4699aac62b078fcc9f27f44e1748165ceea67bf" dependencies = [ "bytes", "cfg-if", @@ -1715,9 +1715,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945e8cd172c68cf10fefcd40f9c97bd301ecc9bf0136972bf807474f1b5951de" +checksum = "f093937725e242e5529fed27e08ff836c011a9ecc22e6819fb818c2ac6ff5f88" dependencies = [ "backtrace", "cfg-if", @@ -1738,9 +1738,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdce36e48ec8c70e34d150073d6214e52757474bb375c013f2ae0bac85800cce" +checksum = "3b27b1670d27158789ebe14e4da3902c72132174884a1c6a3533ce4fd9dd83db" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1757,9 +1757,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d8415054716a3d79e0d74e6da24795875641247d36cc35c3e46c7bf8291e158" +checksum = "02509aaab7e302fc551ff03512807514b379ba32136892e96fcaa5b62a3228de" dependencies = [ "byteorder", "dynasm", @@ -1776,9 +1776,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90277df86705920fefed23c2724ed652fa974af788f0983ca0493b51691a76bd" +checksum = "13ae8286cba2acb10065a4dac129c7c7f7bcd24acd6538555d96616eea16bc27" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1788,9 +1788,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271ed9590613a04310efa4c7dbb9c1c7891a059e081af857cbefe6351341a5c5" +checksum = "3bc8cafe02112ecf21a7fc1d090ac0f0220a86a8d4f561c24e382a4c2ee4addc" dependencies = [ "wasmer", "wasmer-types", @@ -1799,9 +1799,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918344b93266cf4efe56e6cd23f35c7325275524f534678145f7ead4b2b8c762" +checksum = "918d2f0bb5eaa95a80c06be33f21dee92f40f12cd0982da34490d121a99d244b" dependencies = [ "bytecheck", "enum-iterator", @@ -1815,9 +1815,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e36cba570e0b2662ff52d40fe9a48fd368f6eb35183a84ce43f79bc51b9fd15" +checksum = "a1e000c2cbd4f9805427af5f3b3446574caf89ab3a1e66c2f3579fbde22b072b" dependencies = [ "backtrace", "cc", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 96ecd638d5..cbf31b6a61 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -1660,9 +1660,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d924829e1d14ca3b0ab2562ef7c958fd61ec3fdc6401fd09f20becf59c1f1d17" +checksum = "ea790bcdfb4e6e9d1e5ddf75b4699aac62b078fcc9f27f44e1748165ceea67bf" dependencies = [ "bytes", "cfg-if", @@ -1688,9 +1688,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945e8cd172c68cf10fefcd40f9c97bd301ecc9bf0136972bf807474f1b5951de" +checksum = "f093937725e242e5529fed27e08ff836c011a9ecc22e6819fb818c2ac6ff5f88" dependencies = [ "backtrace", "cfg-if", @@ -1711,9 +1711,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdce36e48ec8c70e34d150073d6214e52757474bb375c013f2ae0bac85800cce" +checksum = "3b27b1670d27158789ebe14e4da3902c72132174884a1c6a3533ce4fd9dd83db" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1730,9 +1730,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d8415054716a3d79e0d74e6da24795875641247d36cc35c3e46c7bf8291e158" +checksum = "02509aaab7e302fc551ff03512807514b379ba32136892e96fcaa5b62a3228de" dependencies = [ "byteorder", "dynasm", @@ -1749,9 +1749,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90277df86705920fefed23c2724ed652fa974af788f0983ca0493b51691a76bd" +checksum = "13ae8286cba2acb10065a4dac129c7c7f7bcd24acd6538555d96616eea16bc27" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1761,9 +1761,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271ed9590613a04310efa4c7dbb9c1c7891a059e081af857cbefe6351341a5c5" +checksum = "3bc8cafe02112ecf21a7fc1d090ac0f0220a86a8d4f561c24e382a4c2ee4addc" dependencies = [ "wasmer", "wasmer-types", @@ -1772,9 +1772,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918344b93266cf4efe56e6cd23f35c7325275524f534678145f7ead4b2b8c762" +checksum = "918d2f0bb5eaa95a80c06be33f21dee92f40f12cd0982da34490d121a99d244b" dependencies = [ "bytecheck", "enum-iterator", @@ -1788,9 +1788,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0-beta.3" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e36cba570e0b2662ff52d40fe9a48fd368f6eb35183a84ce43f79bc51b9fd15" +checksum = "a1e000c2cbd4f9805427af5f3b3446574caf89ab3a1e66c2f3579fbde22b072b" dependencies = [ "backtrace", "cc", diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index c1deb4f416..3c36b5b33b 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -49,8 +49,8 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " serde_json = "1.0.40" sha2 = "0.10.3" thiserror = "1.0.26" -wasmer = { version = "=4.0.0-beta.3", default-features = false, features = ["cranelift", "singlepass"] } -wasmer-middlewares = "=4.0.0-beta.3" +wasmer = { version = "=4.0.0", default-features = false, features = ["cranelift", "singlepass"] } +wasmer-middlewares = "=4.0.0" # Dependencies that we do not use ourself. We add those entries # to bump the min version of them. From 0c7cbd128a7fa9d3472c374cd47b9f4f20a674b0 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 26 Jun 2023 15:28:27 +0200 Subject: [PATCH 0460/2372] Update ci's rust version --- .circleci/config.yml | 150 +++++++++++++++++++-------------------- .github/workflows/ci.yml | 2 +- 2 files changed, 76 insertions(+), 76 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 60bd628780..e50be631dd 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -72,7 +72,7 @@ workflows: matrix: parameters: # Run with MSRV and some modern stable Rust - rust-version: ["1.64.0", "1.68.2"] + rust-version: ["1.67.0", "1.68.2"] - benchmarking: requires: - package_vm @@ -118,7 +118,7 @@ jobs: command: | wget https://static.rust-lang.org/rustup/dist/aarch64-unknown-linux-gnu/rustup-init chmod +x rustup-init - ./rustup-init -y --default-toolchain 1.64.0 --profile minimal + ./rustup-init -y --default-toolchain 1.67.0 --profile minimal - run: name: Version information command: rustc --version; cargo --version; rustup --version; rustup target list --installed @@ -127,12 +127,12 @@ jobs: command: rustup target add wasm32-unknown-unknown && rustup target list --installed - restore_cache: keys: - - v4-arm64-workspace-rust:1.64.0-{{ checksum "Cargo.lock" }} - - v4-arm64-workspace-rust:1.64.0- + - v4-arm64-workspace-rust:1.67.0-{{ checksum "Cargo.lock" }} + - v4-arm64-workspace-rust:1.67.0- - restore_cache: keys: - - v4-arm64-contracts-rust:1.64.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} - - v4-arm64-contracts-rust:1.64.0- + - v4-arm64-contracts-rust:1.67.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} + - v4-arm64-contracts-rust:1.67.0- # Test a few contracts that do something potentially interesting in the VM # to test contract execution on ARM64. # No need to add all contracts here. @@ -170,14 +170,14 @@ jobs: # use all features command: cargo test --locked --features iterator,staking,stargate - save_cache: - key: v4-arm64-workspace-rust:1.64.0-{{ checksum "Cargo.lock" }} + key: v4-arm64-workspace-rust:1.67.0-{{ checksum "Cargo.lock" }} paths: - ~/.cargo/registry - target/debug/.fingerprint - target/debug/build - target/debug/deps - save_cache: - key: v4-arm64-contracts-rust:1.64.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} + key: v4-arm64-contracts-rust:1.67.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} paths: - ~/.cargo/registry # crypto-verify @@ -218,7 +218,7 @@ jobs: package_crypto: docker: - - image: rust:1.64.0 + - image: rust:1.67.0 steps: - checkout - run: @@ -226,7 +226,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_crypto-rust:1.64.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_crypto-rust:1.67.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/crypto @@ -241,11 +241,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_crypto-rust:1.64.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_crypto-rust:1.67.0-{{ checksum "Cargo.lock" }} package_check: docker: - - image: rust:1.64.0 + - image: rust:1.67.0 steps: - checkout - run: @@ -253,7 +253,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_check-rust:1.64.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_check-rust:1.67.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/check @@ -268,11 +268,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_check-rust:1.64.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_check-rust:1.67.0-{{ checksum "Cargo.lock" }} package_schema: docker: - - image: rust:1.64.0 + - image: rust:1.67.0 steps: - checkout - run: @@ -280,7 +280,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_schema-rust:1.64.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_schema-rust:1.67.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/schema @@ -295,11 +295,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_schema-rust:1.64.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_schema-rust:1.67.0-{{ checksum "Cargo.lock" }} package_schema_derive: docker: - - image: rust:1.64.0 + - image: rust:1.67.0 steps: - checkout - run: @@ -307,7 +307,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_schema_derive-rust:1.64.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_schema_derive-rust:1.67.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/schema-derive @@ -322,11 +322,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_schema_derive-rust:1.64.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_schema_derive-rust:1.67.0-{{ checksum "Cargo.lock" }} package_std: docker: - - image: rust:1.64.0 + - image: rust:1.67.0 environment: # Limit the number of parallel jobs to avoid OOM crashes during doc testing RUST_TEST_THREADS: 8 @@ -337,7 +337,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_std-rust:1.64.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_std-rust:1.67.0-{{ checksum "Cargo.lock" }} - run: name: Add wasm32 target command: rustup target add wasm32-unknown-unknown && rustup target list --installed @@ -371,11 +371,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_std-rust:1.64.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_std-rust:1.67.0-{{ checksum "Cargo.lock" }} package_storage: docker: - - image: rust:1.64.0 + - image: rust:1.67.0 steps: - checkout - run: @@ -383,7 +383,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_storage-rust:1.64.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_storage-rust:1.67.0-{{ checksum "Cargo.lock" }} - run: name: Build library for native target working_directory: ~/project/packages/storage @@ -402,11 +402,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_storage-rust:1.64.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_storage-rust:1.67.0-{{ checksum "Cargo.lock" }} package_vm: docker: - - image: rust:1.64.0 + - image: rust:1.67.0 steps: - checkout - run: @@ -414,7 +414,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_vm-rust:1.64.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_vm-rust:1.67.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/vm @@ -443,7 +443,7 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_vm-rust:1.64.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_vm-rust:1.67.0-{{ checksum "Cargo.lock" }} package_vm_windows: executor: @@ -462,7 +462,7 @@ jobs: command: | set -o errexit curl -sS --output rustup-init.exe https://static.rust-lang.org/rustup/dist/x86_64-pc-windows-msvc/rustup-init.exe - ./rustup-init.exe --default-toolchain 1.65.0 -y + ./rustup-init.exe --default-toolchain 1.67.0 -y echo 'export PATH="$PATH;$USERPROFILE/.cargo/bin"' >> "$BASH_ENV" - run: name: Version information @@ -471,7 +471,7 @@ jobs: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cachev3-package_vm_windows-rust:1.65.0-{{ checksum "Cargo.lock" }} + - cachev3-package_vm_windows-rust:1.67.0-{{ checksum "Cargo.lock" }} - run: name: Test working_directory: ~/project/packages/vm @@ -487,11 +487,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cachev3-package_vm_windows-rust:1.65.0-{{ checksum "Cargo.lock" }} + key: cachev3-package_vm_windows-rust:1.67.0-{{ checksum "Cargo.lock" }} contract_burner: docker: - - image: rust:1.64.0 + - image: rust:1.67.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/burner @@ -503,7 +503,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_burner-rust:1.64.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_burner-rust:1.67.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -514,11 +514,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_burner-rust:1.64.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_burner-rust:1.67.0-{{ checksum "Cargo.lock" }} contract_crypto_verify: docker: - - image: rust:1.64.0 + - image: rust:1.67.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/crypto-verify @@ -530,7 +530,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_crypto_verify-rust:1.64.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_crypto_verify-rust:1.67.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -541,11 +541,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_crypto_verify-rust:1.64.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_crypto_verify-rust:1.67.0-{{ checksum "Cargo.lock" }} contract_cyberpunk: docker: - - image: rust:1.64.0 + - image: rust:1.67.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/cyberpunk @@ -557,7 +557,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_cyberpunk-rust:1.64.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_cyberpunk-rust:1.67.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -568,11 +568,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_cyberpunk-rust:1.64.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_cyberpunk-rust:1.67.0-{{ checksum "Cargo.lock" }} contract_hackatom: docker: - - image: rust:1.64.0 + - image: rust:1.67.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/hackatom @@ -584,7 +584,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_hackatom-rust:1.64.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_hackatom-rust:1.67.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -595,11 +595,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_hackatom-rust:1.64.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_hackatom-rust:1.67.0-{{ checksum "Cargo.lock" }} contract_ibc_reflect: docker: - - image: rust:1.64.0 + - image: rust:1.67.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/ibc-reflect @@ -611,7 +611,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_ibc_reflect-rust:1.64.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_ibc_reflect-rust:1.67.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -622,11 +622,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_ibc_reflect-rust:1.64.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_ibc_reflect-rust:1.67.0-{{ checksum "Cargo.lock" }} contract_ibc_reflect_send: docker: - - image: rust:1.64.0 + - image: rust:1.67.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/ibc-reflect-send @@ -638,7 +638,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_ibc_reflect_send-rust:1.64.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_ibc_reflect_send-rust:1.67.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -649,11 +649,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_ibc_reflect_send-rust:1.64.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_ibc_reflect_send-rust:1.67.0-{{ checksum "Cargo.lock" }} contract_floaty: docker: - - image: rust:1.64.0 + - image: rust:1.67.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/floaty @@ -665,7 +665,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_floaty-rust:1.64.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_floaty-rust:1.67.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -676,11 +676,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_floaty-rust:1.64.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_floaty-rust:1.67.0-{{ checksum "Cargo.lock" }} contract_queue: docker: - - image: rust:1.64.0 + - image: rust:1.67.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/queue @@ -692,7 +692,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_queue-rust:1.64.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_queue-rust:1.67.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -703,11 +703,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_queue-rust:1.64.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_queue-rust:1.67.0-{{ checksum "Cargo.lock" }} contract_reflect: docker: - - image: rust:1.64.0 + - image: rust:1.67.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/reflect @@ -719,7 +719,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_reflect-rust:1.64.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_reflect-rust:1.67.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -730,11 +730,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_reflect-rust:1.64.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_reflect-rust:1.67.0-{{ checksum "Cargo.lock" }} contract_staking: docker: - - image: rust:1.64.0 + - image: rust:1.67.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/staking @@ -746,7 +746,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_staking-rust:1.64.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_staking-rust:1.67.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -757,11 +757,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_staking-rust:1.64.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_staking-rust:1.67.0-{{ checksum "Cargo.lock" }} contract_virus: docker: - - image: rust:1.64.0 + - image: rust:1.67.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/virus @@ -773,7 +773,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_virus-rust:1.64.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_virus-rust:1.67.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -784,11 +784,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_virus-rust:1.64.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_virus-rust:1.67.0-{{ checksum "Cargo.lock" }} fmt: docker: - - image: rust:1.64.0 + - image: rust:1.67.0 steps: - checkout - run: @@ -796,7 +796,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-fmt-rust:1.64.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-fmt-rust:1.67.0-{{ checksum "Cargo.lock" }} - run: name: Add rustfmt component command: rustup component add rustfmt @@ -809,7 +809,7 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-fmt-rust:1.64.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-fmt-rust:1.67.0-{{ checksum "Cargo.lock" }} fmt_extra: docker: @@ -831,7 +831,7 @@ jobs: deadlinks: docker: - - image: rust:1.64.0 + - image: rust:1.67.0 steps: - checkout - run: @@ -839,7 +839,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-deadlinks-rust:1.64.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-deadlinks-rust:1.67.0-{{ checksum "Cargo.lock" }} - run: name: Generate docs command: cargo doc @@ -859,7 +859,7 @@ jobs: - target/debug/build - target/debug/deps - /root/.cache/pip - key: cargocache-v2-deadlinks-rust:1.64.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-deadlinks-rust:1.67.0-{{ checksum "Cargo.lock" }} clippy: parameters: @@ -935,7 +935,7 @@ jobs: benchmarking: docker: - - image: rust:1.64.0 + - image: rust:1.67.0 environment: RUST_BACKTRACE: 1 steps: @@ -945,7 +945,7 @@ jobs: command: rustc --version && cargo --version - restore_cache: keys: - - cargocache-v2-benchmarking-rust:1.64.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-benchmarking-rust:1.67.0-{{ checksum "Cargo.lock" }} - run: name: Run vm benchmarks (Singlepass) working_directory: ~/project/packages/vm @@ -963,7 +963,7 @@ jobs: - target/release/.fingerprint - target/release/build - target/release/deps - key: cargocache-v2-benchmarking-rust:1.64.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-benchmarking-rust:1.67.0-{{ checksum "Cargo.lock" }} coverage: # https://circleci.com/developer/images?imageType=machine @@ -1035,7 +1035,7 @@ jobs: name: Check development contracts command: | echo "Checking all contracts under ./artifacts" - docker run --volumes-from with_code rust:1.64.0 \ + docker run --volumes-from with_code rust:1.67.0 \ /bin/bash -e -c 'export GLOBIGNORE="artifacts/floaty.wasm"; cd ./code; cargo run --bin cosmwasm-check artifacts/*.wasm' docker cp with_code:/code/artifacts . - run: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3235e56020..b59d22676d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,7 +33,7 @@ jobs: - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: 1.64.0 + toolchain: 1.67.0 target: wasm32-unknown-unknown profile: minimal override: true From 34ad3382232a877da12386d447b174946074e5c9 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 27 Jun 2023 12:13:03 +0200 Subject: [PATCH 0461/2372] Fix clippy lint --- contracts/crypto-verify/src/contract.rs | 2 +- contracts/crypto-verify/src/ethereum.rs | 3 +- contracts/hackatom/src/contract.rs | 15 ++---- contracts/hackatom/tests/integration.rs | 10 ++-- contracts/ibc-reflect-send/src/ibc.rs | 15 +++--- contracts/ibc-reflect-send/src/state.rs | 2 +- .../ibc-reflect-send/tests/integration.rs | 6 +-- contracts/ibc-reflect/src/contract.rs | 7 ++- contracts/ibc-reflect/src/state.rs | 2 +- contracts/reflect/src/contract.rs | 12 ++--- contracts/reflect/src/state.rs | 2 +- contracts/staking/src/contract.rs | 8 +-- contracts/staking/src/state.rs | 2 +- packages/check/src/main.rs | 4 +- packages/crypto/src/ed25519.rs | 3 +- packages/crypto/src/secp256k1.rs | 10 ++-- packages/derive/src/lib.rs | 9 ++-- packages/schema-derive/src/generate_api.rs | 2 +- .../src/query_responses/context.rs | 4 +- packages/schema/src/idl.rs | 2 +- packages/schema/src/remove.rs | 2 +- packages/std/src/addresses.rs | 6 +-- packages/std/src/binary.rs | 10 ++-- packages/std/src/coin.rs | 4 +- packages/std/src/errors/std_error.rs | 18 +++---- packages/std/src/errors/system_error.rs | 6 +-- packages/std/src/hex_binary.rs | 10 ++-- packages/std/src/math/decimal.rs | 40 +++++++------- packages/std/src/math/decimal256.rs | 40 +++++++------- packages/std/src/math/uint128.rs | 10 ++-- packages/std/src/math/uint256.rs | 13 +++-- packages/std/src/math/uint512.rs | 13 +++-- packages/std/src/math/uint64.rs | 10 ++-- packages/std/src/results/contract_result.rs | 6 +-- packages/std/src/results/cosmos_msg.rs | 6 +-- packages/std/src/results/events.rs | 3 +- packages/std/src/results/submessages.rs | 4 +- packages/std/src/storage.rs | 12 ++--- packages/std/src/testing/assertions.rs | 6 +-- packages/std/src/testing/mock.rs | 28 +++++----- packages/std/src/timestamp.rs | 2 +- packages/std/src/traits.rs | 14 +++-- packages/storage/src/bucket.rs | 2 +- packages/storage/src/singleton.rs | 4 +- packages/storage/src/type_helpers.rs | 2 +- packages/vm/benches/main.rs | 2 +- packages/vm/examples/module_size.rs | 4 +- packages/vm/examples/multi_threaded_cache.rs | 2 +- packages/vm/src/backend.rs | 14 ++--- packages/vm/src/cache.rs | 20 +++---- packages/vm/src/calls.rs | 6 +-- packages/vm/src/checksum.rs | 4 +- packages/vm/src/compatibility.rs | 51 +++++++++--------- packages/vm/src/conversion.rs | 14 ++--- packages/vm/src/environment.rs | 22 ++++---- packages/vm/src/errors/communication_error.rs | 12 ++--- .../vm/src/errors/region_validation_error.rs | 6 +-- packages/vm/src/errors/vm_error.rs | 44 ++++++++-------- packages/vm/src/imports.rs | 52 +++++++++---------- packages/vm/src/instance.rs | 4 +- packages/vm/src/limited.rs | 4 +- packages/vm/src/memory.rs | 8 +-- packages/vm/src/modules/file_system_cache.rs | 11 ++-- packages/vm/src/modules/in_memory_cache.rs | 2 +- packages/vm/src/serde.rs | 2 +- packages/vm/src/static_analysis.rs | 5 +- packages/vm/src/testing/instance.rs | 3 +- packages/vm/src/testing/mock.rs | 6 +-- packages/vm/src/testing/querier.rs | 4 +- packages/vm/src/wasm_backend/gatekeeper.rs | 17 +++--- .../vm/src/wasm_backend/limiting_tunables.rs | 6 +-- 71 files changed, 341 insertions(+), 375 deletions(-) diff --git a/contracts/crypto-verify/src/contract.rs b/contracts/crypto-verify/src/contract.rs index 17d11b8a70..b2917a90c9 100644 --- a/contracts/crypto-verify/src/contract.rs +++ b/contracts/crypto-verify/src/contract.rs @@ -396,7 +396,7 @@ mod tests { source: RecoverPubkeyError::UnknownErr { .. }, .. } => {} - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } diff --git a/contracts/crypto-verify/src/ethereum.rs b/contracts/crypto-verify/src/ethereum.rs index bc6d8981dd..f6958a0230 100644 --- a/contracts/crypto-verify/src/ethereum.rs +++ b/contracts/crypto-verify/src/ethereum.rs @@ -88,8 +88,7 @@ pub fn get_recovery_param_with_chain_id(v: u64, chain_id: u64) -> StdResult match recovery { 0 | 1 => Ok(recovery as u8), _ => Err(StdError::generic_err(format!( - "Calculated recovery parameter must be 0 or 1 but is {}.", - recovery + "Calculated recovery parameter must be 0 or 1 but is {recovery}." ))), } } diff --git a/contracts/hackatom/src/contract.rs b/contracts/hackatom/src/contract.rs index 26ffed649a..6de12ab53e 100644 --- a/contracts/hackatom/src/contract.rs +++ b/contracts/hackatom/src/contract.rs @@ -189,8 +189,7 @@ fn do_user_errors_in_api_calls(api: &dyn Api) -> Result { StdError::GenericErr { .. } => {} err => { return Err(StdError::generic_err(format!( - "Unexpected error in do_user_errors_in_api_calls: {:?}", - err + "Unexpected error in do_user_errors_in_api_calls: {err:?}" )) .into()) } @@ -202,8 +201,7 @@ fn do_user_errors_in_api_calls(api: &dyn Api) -> Result { StdError::GenericErr { .. } => {} err => { return Err(StdError::generic_err(format!( - "Unexpected error in do_user_errors_in_api_calls: {:?}", - err + "Unexpected error in do_user_errors_in_api_calls: {err:?}" )) .into()) } @@ -216,8 +214,7 @@ fn do_user_errors_in_api_calls(api: &dyn Api) -> Result { StdError::GenericErr { .. } => {} err => { return Err(StdError::generic_err(format!( - "Unexpected error in do_user_errors_in_api_calls: {:?}", - err + "Unexpected error in do_user_errors_in_api_calls: {err:?}" )) .into()) } @@ -228,8 +225,7 @@ fn do_user_errors_in_api_calls(api: &dyn Api) -> Result { StdError::GenericErr { .. } => {} err => { return Err(StdError::generic_err(format!( - "Unexpected error in do_user_errors_in_api_calls: {:?}", - err + "Unexpected error in do_user_errors_in_api_calls: {err:?}" )) .into()) } @@ -240,8 +236,7 @@ fn do_user_errors_in_api_calls(api: &dyn Api) -> Result { StdError::GenericErr { .. } => {} err => { return Err(StdError::generic_err(format!( - "Unexpected error in do_user_errors_in_api_calls: {:?}", - err + "Unexpected error in do_user_errors_in_api_calls: {err:?}" )) .into()) } diff --git a/contracts/hackatom/tests/integration.rs b/contracts/hackatom/tests/integration.rs index 84bdf53153..10f77d091c 100644 --- a/contracts/hackatom/tests/integration.rs +++ b/contracts/hackatom/tests/integration.rs @@ -407,7 +407,7 @@ fn execute_allocate_large_memory() { // which we only fix when using rust-optimizer, not integration tests. assert_approx_eq!(gas_used, 4413600000, "0.2"); let used = deps.memory_pages(); - assert_eq!(used, pages_before + 48, "Memory used: {} pages", used); + assert_eq!(used, pages_before + 48, "Memory used: {used} pages"); pages_before += 48; // Grow by 1600 pages (100 MiB) @@ -425,10 +425,10 @@ fn execute_allocate_large_memory() { // Note: the exact gas usage depends on the Rust version used to compile Wasm, // which we only fix when using rust-optimizer, not integration tests. let expected = 4859700000; // +/- 20% - assert!(gas_used > expected * 80 / 100, "Gas used: {}", gas_used); - assert!(gas_used < expected * 120 / 100, "Gas used: {}", gas_used); + assert!(gas_used > expected * 80 / 100, "Gas used: {gas_used}"); + assert!(gas_used < expected * 120 / 100, "Gas used: {gas_used}"); let used = deps.memory_pages(); - assert_eq!(used, pages_before, "Memory used: {} pages", used); + assert_eq!(used, pages_before, "Memory used: {used} pages"); } #[test] @@ -458,7 +458,7 @@ fn execute_panic() { ); assert!(msg.contains("contract.rs:"), "Must contain file and line"); } - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } diff --git a/contracts/ibc-reflect-send/src/ibc.rs b/contracts/ibc-reflect-send/src/ibc.rs index 76939acea8..adede549eb 100644 --- a/contracts/ibc-reflect-send/src/ibc.rs +++ b/contracts/ibc-reflect-send/src/ibc.rs @@ -25,16 +25,14 @@ pub fn ibc_channel_open(_deps: DepsMut, _env: Env, msg: IbcChannelOpenMsg) -> St } if channel.version.as_str() != IBC_APP_VERSION { return Err(StdError::generic_err(format!( - "Must set version to `{}`", - IBC_APP_VERSION + "Must set version to `{IBC_APP_VERSION}`" ))); } if let Some(counter_version) = msg.counterparty_version() { if counter_version != IBC_APP_VERSION { return Err(StdError::generic_err(format!( - "Counterparty version must be `{}`", - IBC_APP_VERSION + "Counterparty version must be `{IBC_APP_VERSION}`" ))); } } @@ -190,8 +188,7 @@ fn acknowledge_balances( if let Some(old_addr) = acct.remote_addr { if old_addr != account { return Err(StdError::generic_err(format!( - "remote account changed from {} to {}", - old_addr, account + "remote account changed from {old_addr} to {account}" ))); } } @@ -265,7 +262,7 @@ mod tests { channel_id: packet_channel, .. }) => assert_eq!(packet_channel.as_str(), channel_id), - o => panic!("Unexpected message: {:?}", o), + o => panic!("Unexpected message: {o:?}"), }; } @@ -362,7 +359,7 @@ mod tests { msg.original_packet.data = data; msg } - o => panic!("Unexpected message: {:?}", o), + o => panic!("Unexpected message: {o:?}"), }; let res = ibc_packet_ack(deps.as_mut(), mock_env(), msg).unwrap(); // no actions expected, but let's check the events to see it was dispatched properly @@ -420,7 +417,7 @@ mod tests { assert!(timeout.block().is_none()); assert!(timeout.timestamp().is_some()); } - o => panic!("unexpected message: {:?}", o), + o => panic!("unexpected message: {o:?}"), } } } diff --git a/contracts/ibc-reflect-send/src/state.rs b/contracts/ibc-reflect-send/src/state.rs index 3da062710d..062ff187e4 100644 --- a/contracts/ibc-reflect-send/src/state.rs +++ b/contracts/ibc-reflect-send/src/state.rs @@ -38,7 +38,7 @@ pub fn may_load_account(storage: &dyn Storage, id: &str) -> StdResult StdResult { - may_load_account(storage, id)?.ok_or_else(|| StdError::not_found(format!("account {}", id))) + may_load_account(storage, id)?.ok_or_else(|| StdError::not_found(format!("account {id}"))) } pub fn save_account(storage: &mut dyn Storage, id: &str, account: &AccountData) -> StdResult<()> { diff --git a/contracts/ibc-reflect-send/tests/integration.rs b/contracts/ibc-reflect-send/tests/integration.rs index c0c2977b83..21d5c95352 100644 --- a/contracts/ibc-reflect-send/tests/integration.rs +++ b/contracts/ibc-reflect-send/tests/integration.rs @@ -72,7 +72,7 @@ fn connect(deps: &mut Instance, channel_id: & channel_id: packet_channel, .. }) => assert_eq!(packet_channel.as_str(), channel_id), - o => panic!("Unexpected message: {:?}", o), + o => panic!("Unexpected message: {o:?}"), }; } @@ -183,7 +183,7 @@ fn dispatch_message_send_and_ack() { msg.original_packet.data = data; msg } - o => panic!("Unexpected message: {:?}", o), + o => panic!("Unexpected message: {o:?}"), }; let res: IbcBasicResponse = ibc_packet_ack(&mut deps, mock_env(), msg).unwrap(); // no actions expected, but let's check the events to see it was dispatched properly @@ -241,6 +241,6 @@ fn send_remote_funds() { assert!(timeout.block().is_none()); assert!(timeout.timestamp().is_some()); } - o => panic!("unexpected message: {:?}", o), + o => panic!("unexpected message: {o:?}"), } } diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 0e5ca04e0e..23fa7046a3 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -136,8 +136,7 @@ pub fn ibc_channel_open( if let Some(counter_version) = msg.counterparty_version() { if counter_version != IBC_APP_VERSION { return Err(StdError::generic_err(format!( - "Counterparty version must be `{}`", - IBC_APP_VERSION + "Counterparty version must be `{IBC_APP_VERSION}`" ))); } } @@ -164,7 +163,7 @@ pub fn ibc_channel_connect( code_id: cfg.reflect_code_id, msg: b"{}".into(), funds: vec![], - label: format!("ibc-reflect-{}", chan_id), + label: format!("ibc-reflect-{chan_id}"), }; let msg = SubMsg::reply_on_success(msg, INIT_CALLBACK_ID); @@ -255,7 +254,7 @@ pub fn ibc_packet_receive( .or_else(|e| { // we try to capture all app-level errors and convert them into // acknowledgement packets that contain an error code. - let acknowledgement = encode_ibc_error(format!("invalid packet: {}", e)); + let acknowledgement = encode_ibc_error(format!("invalid packet: {e}")); Ok(IbcReceiveResponse::new() .set_ack(acknowledgement) .add_event(Event::new("ibc").add_attribute("packet", "receive"))) diff --git a/contracts/ibc-reflect/src/state.rs b/contracts/ibc-reflect/src/state.rs index bd9a342247..bbb1fdaaa1 100644 --- a/contracts/ibc-reflect/src/state.rs +++ b/contracts/ibc-reflect/src/state.rs @@ -27,7 +27,7 @@ pub fn may_load_account(storage: &dyn Storage, id: &str) -> StdResult StdResult { - may_load_account(storage, id)?.ok_or_else(|| StdError::not_found(format!("account {}", id))) + may_load_account(storage, id)?.ok_or_else(|| StdError::not_found(format!("account {id}"))) } pub fn save_account(storage: &mut dyn Storage, id: &str, account: &Addr) -> StdResult<()> { diff --git a/contracts/reflect/src/contract.rs b/contracts/reflect/src/contract.rs index 5334dbcbc1..2213bd4b92 100644 --- a/contracts/reflect/src/contract.rs +++ b/contracts/reflect/src/contract.rs @@ -150,16 +150,14 @@ fn query_chain( request: &QueryRequest, ) -> StdResult { let raw = to_vec(request).map_err(|serialize_err| { - StdError::generic_err(format!("Serializing QueryRequest: {}", serialize_err)) + StdError::generic_err(format!("Serializing QueryRequest: {serialize_err}")) })?; match deps.querier.raw_query(&raw) { SystemResult::Err(system_err) => Err(StdError::generic_err(format!( - "Querier system error: {}", - system_err + "Querier system error: {system_err}" ))), SystemResult::Ok(ContractResult::Err(contract_err)) => Err(StdError::generic_err(format!( - "Querier contract error: {}", - contract_err + "Querier contract error: {contract_err}" ))), SystemResult::Ok(ContractResult::Ok(value)) => Ok(ChainResponse { data: value }), } @@ -241,7 +239,7 @@ mod tests { let res = execute(deps.as_mut(), mock_env(), info, msg); match res.unwrap_err() { ReflectError::NotCurrentOwner { .. } => {} - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } @@ -355,7 +353,7 @@ mod tests { ReflectError::Std(StdError::GenericErr { msg, .. }) => { assert!(msg.contains("human address too short")) } - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } diff --git a/contracts/reflect/src/state.rs b/contracts/reflect/src/state.rs index 428a451df9..417c76315e 100644 --- a/contracts/reflect/src/state.rs +++ b/contracts/reflect/src/state.rs @@ -18,7 +18,7 @@ pub struct State { pub fn load_reply(storage: &dyn Storage, id: u64) -> StdResult { storage .get(&namespace_with_key(&[RESULT_PREFIX], &id.to_be_bytes())) - .ok_or_else(|| StdError::not_found(format!("reply {}", id))) + .ok_or_else(|| StdError::not_found(format!("reply {id}"))) .and_then(|v| from_slice(&v)) } diff --git a/contracts/staking/src/contract.rs b/contracts/staking/src/contract.rs index 456fdb6c9d..ada3c22252 100644 --- a/contracts/staking/src/contract.rs +++ b/contracts/staking/src/contract.rs @@ -570,7 +570,7 @@ mod tests { assert_eq!(validator.as_str(), DEFAULT_VALIDATOR); assert_eq!(amount, &coin(1000, "ustake")); } - _ => panic!("Unexpected message: {:?}", delegate), + _ => panic!("Unexpected message: {delegate:?}"), } // bob got 1000 DRV for 1000 stake at a 1.0 ratio @@ -666,7 +666,7 @@ mod tests { StakingError::Std { original: StdError::GenericErr { msg, .. }, } => assert_eq!(msg, "No ustake tokens sent"), - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), }; } @@ -715,7 +715,7 @@ mod tests { StakingError::Std { original: StdError::Overflow { .. }, } => {} - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } // bob unbonds 600 tokens at 10% tax... @@ -736,7 +736,7 @@ mod tests { assert_eq!(validator.as_str(), DEFAULT_VALIDATOR); assert_eq!(amount, &coin(bobs_claim.u128(), "ustake")); } - _ => panic!("Unexpected message: {:?}", delegate), + _ => panic!("Unexpected message: {delegate:?}"), } // update the querier with new bond, lower balance diff --git a/contracts/staking/src/state.rs b/contracts/staking/src/state.rs index 0b99fe75c6..40e875db29 100644 --- a/contracts/staking/src/state.rs +++ b/contracts/staking/src/state.rs @@ -39,7 +39,7 @@ pub fn save_map( pub fn load_map(storage: &dyn Storage, prefix: &[u8], key: &CanonicalAddr) -> StdResult { may_load_map(storage, prefix, key)? - .ok_or_else(|| StdError::not_found(format!("map value for {}", key))) + .ok_or_else(|| StdError::not_found(format!("map value for {key}"))) } /// Investment info is fixed at initialization, and is used to control the function of the contract diff --git a/packages/check/src/main.rs b/packages/check/src/main.rs index 561992bb28..d190a64656 100644 --- a/packages/check/src/main.rs +++ b/packages/check/src/main.rs @@ -44,7 +44,7 @@ pub fn main() { .map(|s| s.as_str()) .unwrap_or(DEFAULT_AVAILABLE_CAPABILITIES); let available_capabilities = capabilities_from_csv(available_capabilities_csv); - println!("Available capabilities: {:?}", available_capabilities); + println!("Available capabilities: {available_capabilities:?}"); println!(); // File @@ -59,7 +59,7 @@ pub fn main() { Ok(_) => println!("{}: {}", p, "pass".green()), Err(e) => { println!("{}: {}", p, "failure".red()); - println!("{}", e); + println!("{e}"); } }; result diff --git a/packages/crypto/src/ed25519.rs b/packages/crypto/src/ed25519.rs index c53449cd8d..7b87affcd8 100644 --- a/packages/crypto/src/ed25519.rs +++ b/packages/crypto/src/ed25519.rs @@ -253,8 +253,7 @@ mod tests { // ed25519_verify() works assert!( ed25519_verify(&message, &signature, &public_key).unwrap(), - "verify() failed (test case {})", - i + "verify() failed (test case {i})" ); } } diff --git a/packages/crypto/src/secp256k1.rs b/packages/crypto/src/secp256k1.rs index ae42f83a5d..8ccc1cec06 100644 --- a/packages/crypto/src/secp256k1.rs +++ b/packages/crypto/src/secp256k1.rs @@ -348,7 +348,7 @@ mod tests { { let expected_x = "F3F8BB913AA68589A2C8C607A877AB05252ADBD963E1BE846DDEB8456942AEDC"; let expected_y = "A2ED51F08CA3EF3DAC0A7504613D54CD539FC1B3CBC92453CD704B6A2D012B2C"; - let expected = hex::decode(format!("04{}{}", expected_x, expected_y)).unwrap(); + let expected = hex::decode(format!("04{expected_x}{expected_y}")).unwrap(); let r_s = hex!("E30F2E6A0F705F4FB5F8501BA79C7C0D3FAC847F1AD70B873E9797B17B89B39081F1A4457589F30D76AB9F89E748A68C8A94C30FE0BAC8FB5C0B54EA70BF6D2F"); let recovery_param: u8 = 0; let message_hash = @@ -404,24 +404,24 @@ mod tests { let recovery_param: u8 = 2; match secp256k1_recover_pubkey(&message_hash, &r_s, recovery_param).unwrap_err() { CryptoError::InvalidRecoveryParam { .. } => {} - err => panic!("Unexpected error: {}", err), + err => panic!("Unexpected error: {err}"), } let recovery_param: u8 = 3; match secp256k1_recover_pubkey(&message_hash, &r_s, recovery_param).unwrap_err() { CryptoError::InvalidRecoveryParam { .. } => {} - err => panic!("Unexpected error: {}", err), + err => panic!("Unexpected error: {err}"), } // Other values are garbage let recovery_param: u8 = 4; match secp256k1_recover_pubkey(&message_hash, &r_s, recovery_param).unwrap_err() { CryptoError::InvalidRecoveryParam { .. } => {} - err => panic!("Unexpected error: {}", err), + err => panic!("Unexpected error: {err}"), } let recovery_param: u8 = 255; match secp256k1_recover_pubkey(&message_hash, &r_s, recovery_param).unwrap_err() { CryptoError::InvalidRecoveryParam { .. } => {} - err => panic!("Unexpected error: {}", err), + err => panic!("Unexpected error: {err}"), } } } diff --git a/packages/derive/src/lib.rs b/packages/derive/src/lib.rs index 349f9e3094..1a0f516f1f 100644 --- a/packages/derive/src/lib.rs +++ b/packages/derive/src/lib.rs @@ -60,9 +60,9 @@ pub fn entry_point(_attr: TokenStream, mut item: TokenStream) -> TokenStream { let args = function.sig.inputs.len() - 1; // E.g. "ptr0: u32, ptr1: u32, ptr2: u32, " - let typed_ptrs = (0..args).fold(String::new(), |acc, i| format!("{}ptr{}: u32, ", acc, i)); + let typed_ptrs = (0..args).fold(String::new(), |acc, i| format!("{acc}ptr{i}: u32, ")); // E.g. "ptr0, ptr1, ptr2, " - let ptrs = (0..args).fold(String::new(), |acc, i| format!("{}ptr{}, ", acc, i)); + let ptrs = (0..args).fold(String::new(), |acc, i| format!("{acc}ptr{i}, ")); let new_code = format!( r##" @@ -73,10 +73,7 @@ pub fn entry_point(_attr: TokenStream, mut item: TokenStream) -> TokenStream { cosmwasm_std::do_{name}(&super::{name}, {ptrs}) }} }} - "##, - name = name, - typed_ptrs = typed_ptrs, - ptrs = ptrs + "## ); let entry = TokenStream::from_str(&new_code).unwrap(); item.extend(entry); diff --git a/packages/schema-derive/src/generate_api.rs b/packages/schema-derive/src/generate_api.rs index 1864ce2ba5..1306aa613d 100644 --- a/packages/schema-derive/src/generate_api.rs +++ b/packages/schema-derive/src/generate_api.rs @@ -200,7 +200,7 @@ impl Parse for Options { }; if let Some((invalid_option, _)) = map.into_iter().next() { - panic!("unknown generate_api option: {}", invalid_option); + panic!("unknown generate_api option: {invalid_option}"); } Ok(Self { diff --git a/packages/schema-derive/src/query_responses/context.rs b/packages/schema-derive/src/query_responses/context.rs index ed7f425f1d..6c45bd1f2c 100644 --- a/packages/schema-derive/src/query_responses/context.rs +++ b/packages/schema-derive/src/query_responses/context.rs @@ -22,7 +22,7 @@ pub fn get_context(input: &ItemEnum) -> Context { if let Meta::List(l) = attr.parse_meta().unwrap() { l.nested } else { - panic!("{} attribute must contain a meta list", ATTR_PATH); + panic!("{ATTR_PATH} attribute must contain a meta list"); } }) .map(|nested_meta| { @@ -55,7 +55,7 @@ pub fn get_context(input: &ItemEnum) -> Context { } } "nested" => ctx.is_nested = true, - path => panic!("unrecognized QueryResponses param: {}", path), + path => panic!("unrecognized QueryResponses param: {path}"), } } diff --git a/packages/schema/src/idl.rs b/packages/schema/src/idl.rs index 0cad4da9f0..80166b7cdb 100644 --- a/packages/schema/src/idl.rs +++ b/packages/schema/src/idl.rs @@ -118,7 +118,7 @@ impl JsonApi { if let Some(responses) = &self.responses { for (name, response) in responses { result.push(( - format!("response_to_{}.json", name), + format!("response_to_{name}.json"), serde_json::to_string_pretty(&response)?, )); } diff --git a/packages/schema/src/remove.rs b/packages/schema/src/remove.rs index 2b7c2359ef..a5e50f0708 100644 --- a/packages/schema/src/remove.rs +++ b/packages/schema/src/remove.rs @@ -28,7 +28,7 @@ pub fn remove_schemas(schemas_dir: &path::Path) -> Result<(), io::Error> { ; for file_path in file_paths { - println!("Removing {:?} …", file_path); + println!("Removing {file_path:?} …"); fs::remove_file(file_path)?; } Ok(()) diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index ed47876a83..8ca10d0544 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -284,7 +284,7 @@ impl CanonicalAddr { impl fmt::Display for CanonicalAddr { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { for byte in self.0.as_slice() { - write!(f, "{:02X}", byte)?; + write!(f, "{byte:02X}")?; } Ok(()) } @@ -432,7 +432,7 @@ mod tests { #[test] fn addr_implements_display() { let addr = Addr::unchecked("cos934gh9034hg04g0h134"); - let embedded = format!("Address: {}", addr); + let embedded = format!("Address: {addr}"); assert_eq!(embedded, "Address: cos934gh9034hg04g0h134"); assert_eq!(addr.to_string(), "cos934gh9034hg04g0h134"); } @@ -629,7 +629,7 @@ mod tests { 0xff, ]; let address = CanonicalAddr::from(bytes); - let embedded = format!("Address: {}", address); + let embedded = format!("Address: {address}"); assert_eq!(embedded, "Address: 1203AB00FF"); assert_eq!(address.to_string(), "1203AB00FF"); } diff --git a/packages/std/src/binary.rs b/packages/std/src/binary.rs index 4e69b0ff20..15bac355d8 100644 --- a/packages/std/src/binary.rs +++ b/packages/std/src/binary.rs @@ -76,7 +76,7 @@ impl fmt::Debug for Binary { // but with a custom implementation to avoid the need for an intemediate hex string. write!(f, "Binary(")?; for byte in self.0.iter() { - write!(f, "{:02x}", byte)?; + write!(f, "{byte:02x}")?; } write!(f, ")")?; Ok(()) @@ -230,7 +230,7 @@ impl<'de> de::Visitor<'de> for Base64Visitor { { match Binary::from_base64(v) { Ok(binary) => Ok(binary), - Err(_) => Err(E::custom(format!("invalid base64: {}", v))), + Err(_) => Err(E::custom(format!("invalid base64: {v}"))), } } } @@ -284,7 +284,7 @@ mod tests { assert_eq!(expected, 8); assert_eq!(actual, 3); } - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } // long array (32 bytes) @@ -483,11 +483,11 @@ mod tests { fn binary_implements_debug() { // Some data let binary = Binary(vec![0x07, 0x35, 0xAA, 0xcb, 0x00, 0xff]); - assert_eq!(format!("{:?}", binary), "Binary(0735aacb00ff)",); + assert_eq!(format!("{binary:?}"), "Binary(0735aacb00ff)",); // Empty let binary = Binary(vec![]); - assert_eq!(format!("{:?}", binary), "Binary()",); + assert_eq!(format!("{binary:?}"), "Binary()",); } #[test] diff --git a/packages/std/src/coin.rs b/packages/std/src/coin.rs index 0838958efa..15d153cfc3 100644 --- a/packages/std/src/coin.rs +++ b/packages/std/src/coin.rs @@ -120,7 +120,7 @@ mod tests { denom: "ucosm".to_string(), }; - let embedded = format!("Amount: {}", a); + let embedded = format!("Amount: {a}"); assert_eq!(embedded, "Amount: 123ucosm"); assert_eq!(a.to_string(), "123ucosm"); } @@ -245,6 +245,6 @@ mod tests { #[test] fn debug_coin() { let coin = Coin::new(123, "ucosm"); - assert_eq!(format!("{:?}", coin), r#"Coin { 123 "ucosm" }"#); + assert_eq!(format!("{coin:?}"), r#"Coin { 123 "ucosm" }"#); } } diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index d90171c74c..e77d0c0f1f 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -488,7 +488,7 @@ pub enum OverflowOperation { impl fmt::Display for OverflowOperation { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{:?}", self) + write!(f, "{self:?}") } } @@ -608,7 +608,7 @@ impl From for CoinFromStrError { impl From for StdError { fn from(value: CoinFromStrError) -> Self { - Self::generic_err(format!("Parsing Coin: {}", value)) + Self::generic_err(format!("Parsing Coin: {value}")) } } @@ -623,12 +623,12 @@ mod tests { #[test] fn generic_err_owned() { let guess = 7; - let error = StdError::generic_err(format!("{} is too low", guess)); + let error = StdError::generic_err(format!("{guess} is too low")); match error { StdError::GenericErr { msg, .. } => { assert_eq!(msg, String::from("7 is too low")); } - e => panic!("unexpected error, {:?}", e), + e => panic!("unexpected error, {e:?}"), } } @@ -638,7 +638,7 @@ mod tests { let error = StdError::generic_err("not implemented"); match error { StdError::GenericErr { msg, .. } => assert_eq!(msg, "not implemented"), - e => panic!("unexpected error, {:?}", e), + e => panic!("unexpected error, {e:?}"), } } @@ -820,7 +820,7 @@ mod tests { #[test] fn implements_debug() { let error: StdError = StdError::from(OverflowError::new(OverflowOperation::Sub, 3, 5)); - let embedded = format!("Debug: {:?}", error); + let embedded = format!("Debug: {error:?}"); #[cfg(not(feature = "backtraces"))] let expected = r#"Debug: Overflow { source: OverflowError { operation: Sub, operand1: "3", operand2: "5" } }"#; #[cfg(feature = "backtraces")] @@ -831,7 +831,7 @@ mod tests { #[test] fn implements_display() { let error: StdError = StdError::from(OverflowError::new(OverflowOperation::Sub, 3, 5)); - let embedded = format!("Display: {}", error); + let embedded = format!("Display: {error}"); assert_eq!(embedded, "Display: Overflow: Cannot Sub with 3 and 5"); } @@ -859,7 +859,7 @@ mod tests { StdError::InvalidUtf8 { msg, .. } => { assert_eq!(msg, "invalid utf-8 sequence of 3 bytes from index 6") } - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } @@ -872,7 +872,7 @@ mod tests { StdError::InvalidUtf8 { msg, .. } => { assert_eq!(msg, "invalid utf-8 sequence of 3 bytes from index 6") } - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } } diff --git a/packages/std/src/errors/system_error.rs b/packages/std/src/errors/system_error.rs index d763f213c8..22223692c1 100644 --- a/packages/std/src/errors/system_error.rs +++ b/packages/std/src/errors/system_error.rs @@ -56,11 +56,11 @@ impl std::fmt::Display for SystemError { error, String::from_utf8_lossy(response) ), - SystemError::NoSuchContract { addr } => write!(f, "No such contract: {}", addr), - SystemError::NoSuchCode { code_id } => write!(f, "No such code: {}", code_id), + SystemError::NoSuchContract { addr } => write!(f, "No such contract: {addr}"), + SystemError::NoSuchCode { code_id } => write!(f, "No such code: {code_id}"), SystemError::Unknown {} => write!(f, "Unknown system error"), SystemError::UnsupportedRequest { kind } => { - write!(f, "Unsupported query type: {}", kind) + write!(f, "Unsupported query type: {kind}") } } } diff --git a/packages/std/src/hex_binary.rs b/packages/std/src/hex_binary.rs index fcbcc4c05b..bc3bc5ba21 100644 --- a/packages/std/src/hex_binary.rs +++ b/packages/std/src/hex_binary.rs @@ -72,7 +72,7 @@ impl fmt::Debug for HexBinary { // but with a custom implementation to avoid the need for an intemediate hex string. write!(f, "HexBinary(")?; for byte in self.0.iter() { - write!(f, "{:02x}", byte)?; + write!(f, "{byte:02x}")?; } write!(f, ")")?; Ok(()) @@ -238,7 +238,7 @@ impl<'de> de::Visitor<'de> for HexVisitor { { match HexBinary::from_hex(v) { Ok(data) => Ok(data), - Err(_) => Err(E::custom(format!("invalid hex: {}", v))), + Err(_) => Err(E::custom(format!("invalid hex: {v}"))), } } } @@ -345,7 +345,7 @@ mod tests { assert_eq!(expected, 8); assert_eq!(actual, 3); } - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } // long array (32 bytes) @@ -547,11 +547,11 @@ mod tests { fn hex_binary_implements_debug() { // Some data let data = HexBinary(vec![0x07, 0x35, 0xAA, 0xcb, 0x00, 0xff]); - assert_eq!(format!("{:?}", data), "HexBinary(0735aacb00ff)",); + assert_eq!(format!("{data:?}"), "HexBinary(0735aacb00ff)",); // Empty let data = HexBinary(vec![]); - assert_eq!(format!("{:?}", data), "HexBinary()",); + assert_eq!(format!("{data:?}"), "HexBinary()",); } #[test] diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 9e4e3424aa..29eb2a6b73 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -517,7 +517,7 @@ impl fmt::Display for Decimal { let fractional = (self.0).checked_rem(Self::DECIMAL_FRACTIONAL).unwrap(); if fractional.is_zero() { - write!(f, "{}", whole) + write!(f, "{whole}") } else { let fractional_string = format!( "{:0>padding$}", @@ -534,7 +534,7 @@ impl fmt::Display for Decimal { impl fmt::Debug for Decimal { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "Decimal({})", self) + write!(f, "Decimal({self})") } } @@ -723,7 +723,7 @@ impl<'de> de::Visitor<'de> for DecimalVisitor { { match Decimal::from_str(v) { Ok(d) => Ok(d), - Err(e) => Err(E::custom(format!("Error parsing decimal '{}': {}", v, e))), + Err(e) => Err(E::custom(format!("Error parsing decimal '{v}': {e}"))), } } } @@ -988,17 +988,17 @@ mod tests { fn decimal_from_str_errors_for_broken_whole_part() { match Decimal::from_str("").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing whole"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } match Decimal::from_str(" ").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing whole"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } match Decimal::from_str("-1").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing whole"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -1006,22 +1006,22 @@ mod tests { fn decimal_from_str_errors_for_broken_fractinal_part() { match Decimal::from_str("1.").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } match Decimal::from_str("1. ").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } match Decimal::from_str("1.e").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } match Decimal::from_str("1.2e3").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -1031,7 +1031,7 @@ mod tests { StdError::GenericErr { msg, .. } => { assert_eq!(msg, "Cannot parse more than 18 fractional digits",) } - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } // No special rules for trailing zeros. This could be changed but adds gas cost for the happy path. @@ -1039,7 +1039,7 @@ mod tests { StdError::GenericErr { msg, .. } => { assert_eq!(msg, "Cannot parse more than 18 fractional digits") } - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -1047,12 +1047,12 @@ mod tests { fn decimal_from_str_errors_for_invalid_number_of_dots() { match Decimal::from_str("1.2.3").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Unexpected number of dots"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } match Decimal::from_str("1.2.3.4").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Unexpected number of dots"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -1061,17 +1061,17 @@ mod tests { // Integer match Decimal::from_str("340282366920938463464").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } // Decimal match Decimal::from_str("340282366920938463464.0").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } match Decimal::from_str("340282366920938463463.374607431768211456").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -2145,13 +2145,13 @@ mod tests { #[test] fn decimal_implements_debug() { let decimal = Decimal::from_str("123.45").unwrap(); - assert_eq!(format!("{:?}", decimal), "Decimal(123.45)"); + assert_eq!(format!("{decimal:?}"), "Decimal(123.45)"); let test_cases = ["5", "5.01", "42", "0", "2"]; for s in test_cases { let decimal = Decimal::from_str(s).unwrap(); - let expected = format!("Decimal({})", s); - assert_eq!(format!("{:?}", decimal), expected); + let expected = format!("Decimal({s})"); + assert_eq!(format!("{decimal:?}"), expected); } } } diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 157e7397b7..b3df870ad7 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -541,7 +541,7 @@ impl fmt::Display for Decimal256 { let fractional = (self.0).checked_rem(Self::DECIMAL_FRACTIONAL).unwrap(); if fractional.is_zero() { - write!(f, "{}", whole) + write!(f, "{whole}") } else { let fractional_string = format!( "{:0>padding$}", @@ -558,7 +558,7 @@ impl fmt::Display for Decimal256 { impl fmt::Debug for Decimal256 { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "Decimal256({})", self) + write!(f, "Decimal256({self})") } } @@ -747,7 +747,7 @@ impl<'de> de::Visitor<'de> for Decimal256Visitor { { match Self::Value::from_str(v) { Ok(d) => Ok(d), - Err(e) => Err(E::custom(format!("Error parsing decimal '{}': {}", v, e))), + Err(e) => Err(E::custom(format!("Error parsing decimal '{v}': {e}"))), } } } @@ -1089,17 +1089,17 @@ mod tests { fn decimal256_from_str_errors_for_broken_whole_part() { match Decimal256::from_str("").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing whole"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } match Decimal256::from_str(" ").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing whole"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } match Decimal256::from_str("-1").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing whole"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -1107,22 +1107,22 @@ mod tests { fn decimal256_from_str_errors_for_broken_fractinal_part() { match Decimal256::from_str("1.").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } match Decimal256::from_str("1. ").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } match Decimal256::from_str("1.e").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } match Decimal256::from_str("1.2e3").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -1132,7 +1132,7 @@ mod tests { StdError::GenericErr { msg, .. } => { assert_eq!(msg, "Cannot parse more than 18 fractional digits") } - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } // No special rules for trailing zeros. This could be changed but adds gas cost for the happy path. @@ -1140,7 +1140,7 @@ mod tests { StdError::GenericErr { msg, .. } => { assert_eq!(msg, "Cannot parse more than 18 fractional digits") } - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -1148,12 +1148,12 @@ mod tests { fn decimal256_from_str_errors_for_invalid_number_of_dots() { match Decimal256::from_str("1.2.3").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Unexpected number of dots"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } match Decimal256::from_str("1.2.3.4").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Unexpected number of dots"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -1164,7 +1164,7 @@ mod tests { .unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } // Decimal @@ -1172,7 +1172,7 @@ mod tests { .unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } match Decimal256::from_str( "115792089237316195423570985008687907853269984665640564039457.584007913129639936", @@ -1180,7 +1180,7 @@ mod tests { .unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -2302,13 +2302,13 @@ mod tests { #[test] fn decimal256_implements_debug() { let decimal = Decimal256::from_str("123.45").unwrap(); - assert_eq!(format!("{:?}", decimal), "Decimal256(123.45)"); + assert_eq!(format!("{decimal:?}"), "Decimal256(123.45)"); let test_cases = ["5", "5.01", "42", "0", "2"]; for s in test_cases { let decimal256 = Decimal256::from_str(s).unwrap(); - let expected = format!("Decimal256({})", s); - assert_eq!(format!("{:?}", decimal256), expected); + let expected = format!("Decimal256({s})"); + assert_eq!(format!("{decimal256:?}"), expected); } } } diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 9c58c2cc3b..6733dfc0c0 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -335,7 +335,7 @@ impl FromStr for Uint128 { fn from_str(s: &str) -> Result { match s.parse::() { Ok(u) => Ok(Uint128(u)), - Err(e) => Err(StdError::generic_err(format!("Parsing u128: {}", e))), + Err(e) => Err(StdError::generic_err(format!("Parsing u128: {e}"))), } } } @@ -581,7 +581,7 @@ impl<'de> de::Visitor<'de> for Uint128Visitor { { match v.parse::() { Ok(u) => Ok(Uint128(u)), - Err(e) => Err(E::custom(format!("invalid Uint128 '{}' - {}", v, e))), + Err(e) => Err(E::custom(format!("invalid Uint128 '{v}' - {e}"))), } } } @@ -663,18 +663,18 @@ mod tests { #[test] fn uint128_implements_display() { let a = Uint128(12345); - assert_eq!(format!("Embedded: {}", a), "Embedded: 12345"); + assert_eq!(format!("Embedded: {a}"), "Embedded: 12345"); assert_eq!(a.to_string(), "12345"); let a = Uint128(0); - assert_eq!(format!("Embedded: {}", a), "Embedded: 0"); + assert_eq!(format!("Embedded: {a}"), "Embedded: 0"); assert_eq!(a.to_string(), "0"); } #[test] fn uint128_display_padding_works() { let a = Uint128::from(123u64); - assert_eq!(format!("Embedded: {:05}", a), "Embedded: 00123"); + assert_eq!(format!("Embedded: {a:05}"), "Embedded: 00123"); } #[test] diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index e074be4a45..d0d7fe94c9 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -429,7 +429,7 @@ impl FromStr for Uint256 { match U256::from_dec_str(s) { Ok(u) => Ok(Uint256(u)), - Err(e) => Err(StdError::generic_err(format!("Parsing u256: {}", e))), + Err(e) => Err(StdError::generic_err(format!("Parsing u256: {e}"))), } } } @@ -556,8 +556,7 @@ impl Shr for Uint256 { fn shr(self, rhs: u32) -> Self::Output { self.checked_shr(rhs).unwrap_or_else(|_| { panic!( - "right shift error: {} is larger or equal than the number of bits in Uint256", - rhs, + "right shift error: {rhs} is larger or equal than the number of bits in Uint256", ) }) } @@ -669,7 +668,7 @@ impl<'de> de::Visitor<'de> for Uint256Visitor { where E: de::Error, { - Uint256::try_from(v).map_err(|e| E::custom(format!("invalid Uint256 '{}' - {}", v, e))) + Uint256::try_from(v).map_err(|e| E::custom(format!("invalid Uint256 '{v}' - {e}"))) } } @@ -1115,18 +1114,18 @@ mod tests { #[test] fn uint256_implements_display() { let a = Uint256::from(12345u32); - assert_eq!(format!("Embedded: {}", a), "Embedded: 12345"); + assert_eq!(format!("Embedded: {a}"), "Embedded: 12345"); assert_eq!(a.to_string(), "12345"); let a = Uint256::zero(); - assert_eq!(format!("Embedded: {}", a), "Embedded: 0"); + assert_eq!(format!("Embedded: {a}"), "Embedded: 0"); assert_eq!(a.to_string(), "0"); } #[test] fn uint256_display_padding_works() { let a = Uint256::from(123u64); - assert_eq!(format!("Embedded: {:05}", a), "Embedded: 00123"); + assert_eq!(format!("Embedded: {a:05}"), "Embedded: 00123"); } #[test] diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index 9b5809d3d0..a9eb33e08e 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -426,7 +426,7 @@ impl FromStr for Uint512 { fn from_str(s: &str) -> Result { match U512::from_dec_str(s) { Ok(u) => Ok(Self(u)), - Err(e) => Err(StdError::generic_err(format!("Parsing u512: {}", e))), + Err(e) => Err(StdError::generic_err(format!("Parsing u512: {e}"))), } } } @@ -537,8 +537,7 @@ impl Shr for Uint512 { fn shr(self, rhs: u32) -> Self::Output { self.checked_shr(rhs).unwrap_or_else(|_| { panic!( - "right shift error: {} is larger or equal than the number of bits in Uint512", - rhs, + "right shift error: {rhs} is larger or equal than the number of bits in Uint512", ) }) } @@ -650,7 +649,7 @@ impl<'de> de::Visitor<'de> for Uint512Visitor { where E: de::Error, { - Uint512::try_from(v).map_err(|e| E::custom(format!("invalid Uint512 '{}' - {}", v, e))) + Uint512::try_from(v).map_err(|e| E::custom(format!("invalid Uint512 '{v}' - {e}"))) } } @@ -811,18 +810,18 @@ mod tests { #[test] fn uint512_implements_display() { let a = Uint512::from(12345u32); - assert_eq!(format!("Embedded: {}", a), "Embedded: 12345"); + assert_eq!(format!("Embedded: {a}"), "Embedded: 12345"); assert_eq!(a.to_string(), "12345"); let a = Uint512::zero(); - assert_eq!(format!("Embedded: {}", a), "Embedded: 0"); + assert_eq!(format!("Embedded: {a}"), "Embedded: 0"); assert_eq!(a.to_string(), "0"); } #[test] fn uint512_display_padding_works() { let a = Uint512::from(123u64); - assert_eq!(format!("Embedded: {:05}", a), "Embedded: 00123"); + assert_eq!(format!("Embedded: {a:05}"), "Embedded: 00123"); } #[test] diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index 9afd119647..cea6cd37ff 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -298,7 +298,7 @@ impl TryFrom<&str> for Uint64 { fn try_from(val: &str) -> Result { match val.parse::() { Ok(u) => Ok(Uint64(u)), - Err(e) => Err(StdError::generic_err(format!("Parsing u64: {}", e))), + Err(e) => Err(StdError::generic_err(format!("Parsing u64: {e}"))), } } } @@ -532,7 +532,7 @@ impl<'de> de::Visitor<'de> for Uint64Visitor { { match v.parse::() { Ok(u) => Ok(Uint64(u)), - Err(e) => Err(E::custom(format!("invalid Uint64 '{}' - {}", v, e))), + Err(e) => Err(E::custom(format!("invalid Uint64 '{v}' - {e}"))), } } } @@ -604,18 +604,18 @@ mod tests { #[test] fn uint64_implements_display() { let a = Uint64(12345); - assert_eq!(format!("Embedded: {}", a), "Embedded: 12345"); + assert_eq!(format!("Embedded: {a}"), "Embedded: 12345"); assert_eq!(a.to_string(), "12345"); let a = Uint64(0); - assert_eq!(format!("Embedded: {}", a), "Embedded: 0"); + assert_eq!(format!("Embedded: {a}"), "Embedded: 0"); assert_eq!(a.to_string(), "0"); } #[test] fn uint64_display_padding_works() { let a = Uint64::from(123u64); - assert_eq!(format!("Embedded: {:05}", a), "Embedded: 00123"); + assert_eq!(format!("Embedded: {a:05}"), "Embedded: 00123"); } #[test] diff --git a/packages/std/src/results/contract_result.rs b/packages/std/src/results/contract_result.rs index 380ecaeccb..67956bfba3 100644 --- a/packages/std/src/results/contract_result.rs +++ b/packages/std/src/results/contract_result.rs @@ -132,18 +132,18 @@ mod tests { let parse: StdResult> = from_slice(br#"{"unrelated":321,"ok":4554}"#); match parse.unwrap_err() { StdError::ParseErr { .. } => {} - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } let parse: StdResult> = from_slice(br#"{"ok":4554,"unrelated":321}"#); match parse.unwrap_err() { StdError::ParseErr { .. } => {} - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } let parse: StdResult> = from_slice(br#"{"ok":4554,"error":"What's up now?"}"#); match parse.unwrap_err() { StdError::ParseErr { .. } => {} - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index 3e93ba1868..2b483a59cc 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -116,7 +116,7 @@ pub enum DistributionMsg { fn binary_to_string(data: &Binary, fmt: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { match std::str::from_utf8(data.as_slice()) { Ok(s) => fmt.write_str(s), - Err(_) => write!(fmt, "{:?}", data), + Err(_) => write!(fmt, "{data:?}"), } } @@ -480,7 +480,7 @@ mod tests { }; assert_eq!( - format!("{:?}", msg), + format!("{msg:?}"), "Execute { contract_addr: \"joe\", msg: {\"mint\":{\"coin\":{\"denom\":\"BTC\",\"amount\":\"10\"}}}, funds: [] }" ); } @@ -494,7 +494,7 @@ mod tests { }; assert_eq!( - format!("{:?}", msg), + format!("{msg:?}"), "Execute { contract_addr: \"joe\", msg: Binary(009f9296), funds: [] }" ); } diff --git a/packages/std/src/results/events.rs b/packages/std/src/results/events.rs index 79749b00c9..31c84a9dc8 100644 --- a/packages/std/src/results/events.rs +++ b/packages/std/src/results/events.rs @@ -75,8 +75,7 @@ impl Attribute { #[cfg(debug_assertions)] if key.starts_with('_') { panic!( - "attribute key `{}` is invalid - keys starting with an underscore are reserved", - key + "attribute key `{key}` is invalid - keys starting with an underscore are reserved" ); } diff --git a/packages/std/src/results/submessages.rs b/packages/std/src/results/submessages.rs index 138680c1e3..0a89efef1c 100644 --- a/packages/std/src/results/submessages.rs +++ b/packages/std/src/results/submessages.rs @@ -259,12 +259,12 @@ mod tests { let parse: StdResult = from_slice(br#"{"unrelated":321,"error":"broken"}"#); match parse.unwrap_err() { StdError::ParseErr { .. } => {} - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } let parse: StdResult = from_slice(br#"{"error":"broken","unrelated":321}"#); match parse.unwrap_err() { StdError::ParseErr { .. } => {} - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } diff --git a/packages/std/src/storage.rs b/packages/std/src/storage.rs index be80fcdae0..f2f099f93d 100644 --- a/packages/std/src/storage.rs +++ b/packages/std/src/storage.rs @@ -74,11 +74,11 @@ impl fmt::Debug for MemoryStorage { for (key, value) in &self.data { f.write_str(" 0x")?; for byte in key { - write!(f, "{:02x}", byte)?; + write!(f, "{byte:02x}")?; } f.write_str(": 0x")?; for byte in value { - write!(f, "{:02x}", byte)?; + write!(f, "{byte:02x}")?; } f.write_str("\n")?; } @@ -284,7 +284,7 @@ mod tests { fn memory_storage_implements_debug() { let store = MemoryStorage::new(); assert_eq!( - format!("{:?}", store), + format!("{store:?}"), "MemoryStorage (0 entries) {\n\ }" ); @@ -293,7 +293,7 @@ mod tests { let mut store = MemoryStorage::new(); store.set(&[0x00, 0xAB, 0xDD], &[0xFF, 0xD5]); assert_eq!( - format!("{:?}", store), + format!("{store:?}"), "MemoryStorage (1 entries) {\n\ \x20\x200x00abdd: 0xffd5\n\ }" @@ -305,7 +305,7 @@ mod tests { store.set(&[0x00, 0xAB, 0xEE], &[0xFF, 0xD5]); store.set(&[0x00, 0xAB, 0xCC], &[0xFF, 0xD5]); assert_eq!( - format!("{:?}", store), + format!("{store:?}"), "MemoryStorage (3 entries) {\n\ \x20\x200x00abcc: 0xffd5\n\ \x20\x200x00abdd: 0xffd5\n\ @@ -320,7 +320,7 @@ mod tests { store.set(&[0xAA, 0xBB, 0xCC], &[0x11, 0x22, 0x33]); store.set(&[0xAA, 0xBB, 0xCC, 0xDD], &[0x11, 0x22, 0x33, 0x44]); assert_eq!( - format!("{:?}", store), + format!("{store:?}"), "MemoryStorage (4 entries) {\n\ \x20\x200xaa: 0x11\n\ \x20\x200xaabb: 0x1122\n\ diff --git a/packages/std/src/testing/assertions.rs b/packages/std/src/testing/assertions.rs index 3d5cf0a2d8..bac91d0138 100644 --- a/packages/std/src/testing/assertions.rs +++ b/packages/std/src/testing/assertions.rs @@ -41,12 +41,10 @@ pub fn assert_approx_eq_impl>( if rel_diff > max_rel_diff { match panic_msg { Some(panic_msg) => panic!( - "assertion failed: `(left ≈ right)`\nleft: {}\nright: {}\nrelative difference: {}\nmax allowed relative difference: {}\n: {}", - left, right, rel_diff, max_rel_diff, panic_msg + "assertion failed: `(left ≈ right)`\nleft: {left}\nright: {right}\nrelative difference: {rel_diff}\nmax allowed relative difference: {max_rel_diff}\n: {panic_msg}" ), None => panic!( - "assertion failed: `(left ≈ right)`\nleft: {}\nright: {}\nrelative difference: {}\nmax allowed relative difference: {}\n", - left, right, rel_diff, max_rel_diff + "assertion failed: `(left ≈ right)`\nleft: {left}\nright: {right}\nrelative difference: {rel_diff}\nmax allowed relative difference: {max_rel_diff}\n" ), } } diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 3b5ce6f253..375d0c86dc 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -233,7 +233,7 @@ impl Api for MockApi { } fn debug(&self, message: &str) { - println!("{}", message); + println!("{message}"); } } @@ -527,7 +527,7 @@ impl Querier for MockQuerier { Ok(v) => v, Err(e) => { return SystemResult::Err(SystemError::InvalidRequest { - error: format!("Parsing query request: {}", e), + error: format!("Parsing query request: {e}"), request: bin_request.into(), }) } @@ -1100,7 +1100,7 @@ mod tests { let result = api.secp256k1_recover_pubkey(&hash, &signature, 42); match result.unwrap_err() { RecoverPubkeyError::InvalidRecoveryParam => {} - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } @@ -1129,7 +1129,7 @@ mod tests { let result = api.secp256k1_recover_pubkey(&malformed_hash, &signature, recovery_param); match result.unwrap_err() { RecoverPubkeyError::InvalidHashFormat => {} - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } @@ -1750,7 +1750,7 @@ mod tests { .unwrap_err(); match system_err { SystemError::NoSuchContract { addr } => assert_eq!(addr, any_addr), - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } // By default, querier errors for WasmQuery::Smart @@ -1762,7 +1762,7 @@ mod tests { .unwrap_err(); match system_err { SystemError::NoSuchContract { addr } => assert_eq!(addr, any_addr), - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } // By default, querier errors for WasmQuery::ContractInfo @@ -1773,7 +1773,7 @@ mod tests { .unwrap_err(); match system_err { SystemError::NoSuchContract { addr } => assert_eq!(addr, any_addr), - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } #[cfg(feature = "cosmwasm_1_2")] @@ -1784,7 +1784,7 @@ mod tests { .unwrap_err(); match system_err { SystemError::NoSuchCode { code_id } => assert_eq!(code_id, 4), - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } @@ -1869,7 +1869,7 @@ mod tests { }); match result { SystemResult::Ok(ContractResult::Ok(value)) => assert_eq!(value, b"the value" as &[u8]), - res => panic!("Unexpected result: {:?}", res), + res => panic!("Unexpected result: {res:?}"), } let result = querier.query(&WasmQuery::Raw { contract_addr: "contract1".into(), @@ -1877,7 +1877,7 @@ mod tests { }); match result { SystemResult::Ok(ContractResult::Ok(value)) => assert_eq!(value, b"" as &[u8]), - res => panic!("Unexpected result: {:?}", res), + res => panic!("Unexpected result: {res:?}"), } // WasmQuery::Smart @@ -1890,7 +1890,7 @@ mod tests { value, br#"{"messages":[],"attributes":[],"events":[],"data":"Z29vZA=="}"# as &[u8] ), - res => panic!("Unexpected result: {:?}", res), + res => panic!("Unexpected result: {res:?}"), } let result = querier.query(&WasmQuery::Smart { contract_addr: "contract1".into(), @@ -1900,7 +1900,7 @@ mod tests { SystemResult::Ok(ContractResult::Err(err)) => { assert_eq!(err, "Error parsing into type cosmwasm_std::testing::mock::tests::wasm_querier_works::{{closure}}::MyMsg: Invalid type") } - res => panic!("Unexpected result: {:?}", res), + res => panic!("Unexpected result: {res:?}"), } // WasmQuery::ContractInfo @@ -1913,7 +1913,7 @@ mod tests { br#"{"code_id":4,"creator":"lalala","admin":null,"pinned":false,"ibc_port":null}"# as &[u8] ), - res => panic!("Unexpected result: {:?}", res), + res => panic!("Unexpected result: {res:?}"), } // WasmQuery::ContractInfo @@ -1925,7 +1925,7 @@ mod tests { value, br#"{"code_id":4,"creator":"lalala","checksum":"84cf20810fd429caf58898c3210fcb71759a27becddae08dbde8668ea2f4725d"}"# ), - res => panic!("Unexpected result: {:?}", res), + res => panic!("Unexpected result: {res:?}"), } } } diff --git a/packages/std/src/timestamp.rs b/packages/std/src/timestamp.rs index 61c363e5d7..7a3c4314c1 100644 --- a/packages/std/src/timestamp.rs +++ b/packages/std/src/timestamp.rs @@ -120,7 +120,7 @@ impl fmt::Display for Timestamp { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let whole = self.seconds(); let fractional = self.subsec_nanos(); - write!(f, "{}.{:09}", whole, fractional) + write!(f, "{whole}.{fractional:09}") } } diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 7181036cb8..c0442d0ed9 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -196,15 +196,14 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { /// eg. If you don't differentiate between contract missing and contract returned error pub fn query(&self, request: &QueryRequest) -> StdResult { let raw = to_vec(request).map_err(|serialize_err| { - StdError::generic_err(format!("Serializing QueryRequest: {}", serialize_err)) + StdError::generic_err(format!("Serializing QueryRequest: {serialize_err}")) })?; match self.raw_query(&raw) { SystemResult::Err(system_err) => Err(StdError::generic_err(format!( - "Querier system error: {}", - system_err + "Querier system error: {system_err}" ))), SystemResult::Ok(ContractResult::Err(contract_err)) => Err(StdError::generic_err( - format!("Querier contract error: {}", contract_err), + format!("Querier contract error: {contract_err}"), )), SystemResult::Ok(ContractResult::Ok(value)) => from_binary(&value), } @@ -300,15 +299,14 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { // we cannot use query, as it will try to parse the binary data, when we just want to return it, // so a bit of code copy here... let raw = to_vec(&request).map_err(|serialize_err| { - StdError::generic_err(format!("Serializing QueryRequest: {}", serialize_err)) + StdError::generic_err(format!("Serializing QueryRequest: {serialize_err}")) })?; match self.raw_query(&raw) { SystemResult::Err(system_err) => Err(StdError::generic_err(format!( - "Querier system error: {}", - system_err + "Querier system error: {system_err}" ))), SystemResult::Ok(ContractResult::Err(contract_err)) => Err(StdError::generic_err( - format!("Querier contract error: {}", contract_err), + format!("Querier contract error: {contract_err}"), )), SystemResult::Ok(ContractResult::Ok(value)) => { if value.is_empty() { diff --git a/packages/storage/src/bucket.rs b/packages/storage/src/bucket.rs index c349f1edd5..a870dfac4d 100644 --- a/packages/storage/src/bucket.rs +++ b/packages/storage/src/bucket.rs @@ -409,7 +409,7 @@ mod tests { }); match res.unwrap_err() { MyError::NotFound { .. } => {} - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } diff --git a/packages/storage/src/singleton.rs b/packages/storage/src/singleton.rs index c274a41dc8..3d5e5c9567 100644 --- a/packages/storage/src/singleton.rs +++ b/packages/storage/src/singleton.rs @@ -271,7 +271,7 @@ mod tests { }); match output.unwrap_err() { StdError::Overflow { .. } => {} - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } assert_eq!(writer.load().unwrap(), cfg); } @@ -314,7 +314,7 @@ mod tests { }); match res.unwrap_err() { MyError::Std(StdError::GenericErr { .. }) => {} - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } assert_eq!(writer.load().unwrap(), cfg); } diff --git a/packages/storage/src/type_helpers.rs b/packages/storage/src/type_helpers.rs index 6a36f074e2..233d2b1463 100644 --- a/packages/storage/src/type_helpers.rs +++ b/packages/storage/src/type_helpers.rs @@ -83,7 +83,7 @@ mod tests { StdError::NotFound { kind, .. } => { assert_eq!(kind, "cosmwasm_storage::type_helpers::tests::Person") } - e => panic!("Unexpected error {}", e), + e => panic!("Unexpected error {e}"), } } } diff --git a/packages/vm/benches/main.rs b/packages/vm/benches/main.rs index 59f46c6836..e0911e3804 100644 --- a/packages/vm/benches/main.rs +++ b/packages/vm/benches/main.rs @@ -112,7 +112,7 @@ fn bench_instance(c: &mut Criterion) { assert!(contract_result.into_result().is_ok()); gas_used = gas_before - instance.get_gas_left(); }); - println!("Gas used: {}", gas_used); + println!("Gas used: {gas_used}"); }); group.finish(); diff --git a/packages/vm/examples/module_size.rs b/packages/vm/examples/module_size.rs index 162149fd5a..bf35894718 100644 --- a/packages/vm/examples/module_size.rs +++ b/packages/vm/examples/module_size.rs @@ -32,7 +32,7 @@ pub fn main() { // Report wasm size let wasm_size = wasm.len(); - println!("wasm size: {} bytes", wasm_size); + println!("wasm size: {wasm_size} bytes"); // Compile module let module = module_compile(&wasm); @@ -49,7 +49,7 @@ pub fn main() { let serialized = module.serialize().unwrap(); mem::drop(module); let ser_size = serialized.len(); - println!("module size (serialized): {} bytes", ser_size); + println!("module size (serialized): {ser_size} bytes"); println!( "(serialized) module size ratio: {:.2}", ser_size as f32 / wasm_size as f32 diff --git a/packages/vm/examples/multi_threaded_cache.rs b/packages/vm/examples/multi_threaded_cache.rs index 71a7ba944f..7be56be405 100644 --- a/packages/vm/examples/multi_threaded_cache.rs +++ b/packages/vm/examples/multi_threaded_cache.rs @@ -44,7 +44,7 @@ pub fn main() { threads.push(thread::spawn(move || { let checksum = cache.save_wasm(CONTRACT).unwrap(); - println!("Done saving Wasm {}", checksum); + println!("Done saving Wasm {checksum}"); })); } for i in 0..INSTANTIATION_THREADS { diff --git a/packages/vm/src/backend.rs b/packages/vm/src/backend.rs index ea9a085007..0128847a65 100644 --- a/packages/vm/src/backend.rs +++ b/packages/vm/src/backend.rs @@ -304,7 +304,7 @@ mod tests { let error = BackendError::foreign_panic(); match error { BackendError::ForeignPanic { .. } => {} - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -313,7 +313,7 @@ mod tests { let error = BackendError::bad_argument(); match error { BackendError::BadArgument { .. } => {} - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -322,7 +322,7 @@ mod tests { let error = BackendError::iterator_does_not_exist(15); match error { BackendError::IteratorDoesNotExist { id, .. } => assert_eq!(id, 15), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -331,7 +331,7 @@ mod tests { let error = BackendError::out_of_gas(); match error { BackendError::OutOfGas { .. } => {} - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -340,7 +340,7 @@ mod tests { let error = BackendError::unknown("broken"); match error { BackendError::Unknown { msg, .. } => assert_eq!(msg, "broken"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -349,7 +349,7 @@ mod tests { let error = BackendError::user_err("invalid input"); match error { BackendError::UserErr { msg, .. } => assert_eq!(msg, "invalid input"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -360,7 +360,7 @@ mod tests { let error: BackendError = String::from_utf8(vec![0x80]).unwrap_err().into(); match error { BackendError::InvalidUtf8 { .. } => {} - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } } diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 1a1117ffc9..38772a2728 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -127,7 +127,7 @@ where mkdir_p(&wasm_path).map_err(|_e| VmError::cache_err("Error creating wasm directory"))?; let fs_cache = FileSystemCache::new(cache_path.join(MODULES_DIR), false) - .map_err(|e| VmError::cache_err(format!("Error file system cache: {}", e)))?; + .map_err(|e| VmError::cache_err(format!("Error file system cache: {e}")))?; Ok(Cache { available_capabilities, inner: Mutex::new(CacheInner { @@ -411,9 +411,9 @@ fn save_wasm_to_disk(dir: impl Into, wasm: &[u8]) -> VmResult .write(true) .create(true) .open(filepath) - .map_err(|e| VmError::cache_err(format!("Error opening Wasm file for writing: {}", e)))?; + .map_err(|e| VmError::cache_err(format!("Error opening Wasm file for writing: {e}")))?; file.write_all(wasm) - .map_err(|e| VmError::cache_err(format!("Error writing Wasm file: {}", e)))?; + .map_err(|e| VmError::cache_err(format!("Error writing Wasm file: {e}")))?; Ok(checksum) } @@ -559,7 +559,7 @@ mod tests { VmError::StaticValidationErr { msg, .. } => { assert_eq!(msg, "Wasm contract doesn\'t have a memory section") } - e => panic!("Unexpected error {:?}", e), + e => panic!("Unexpected error {e:?}"), } } @@ -651,7 +651,7 @@ mod tests { VmError::CacheErr { msg, .. } => { assert_eq!(msg, "Error opening Wasm file for reading") } - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -681,7 +681,7 @@ mod tests { let res = cache.load_wasm(&checksum); match res { Err(VmError::IntegrityErr { .. }) => {} - Err(e) => panic!("Unexpected error: {:?}", e), + Err(e) => panic!("Unexpected error: {e:?}"), Ok(_) => panic!("This must not succeed"), } } @@ -705,7 +705,7 @@ mod tests { VmError::CacheErr { msg, .. } => { assert_eq!(msg, "Error opening Wasm file for reading") } - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } // Removing again fails @@ -713,7 +713,7 @@ mod tests { VmError::CacheErr { msg, .. } => { assert_eq!(msg, "Wasm file does not exist") } - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -1066,7 +1066,7 @@ mod tests { .unwrap_err() { VmError::GasDepletion { .. } => (), // all good, continue - e => panic!("unexpected error, {:?}", e), + e => panic!("unexpected error, {e:?}"), } assert_eq!(instance1.get_gas_left(), 0); @@ -1145,7 +1145,7 @@ mod tests { match remove_wasm_from_disk(path, &checksum).unwrap_err() { VmError::CacheErr { msg } => assert_eq!(msg, "Wasm file does not exist"), - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 2da5e3ea39..d55389c16a 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -207,7 +207,7 @@ where // Ensure query response is valid JSON if let ContractResult::Ok(binary_response) = &result { serde_json::from_slice::(binary_response.as_slice()).map_err(|e| { - VmError::generic_err(format!("Query response must be valid JSON. {}", e)) + VmError::generic_err(format!("Query response must be valid JSON. {e}")) })?; } @@ -666,7 +666,7 @@ mod tests { "RuntimeError: Aborted: panicked at 'This page intentionally faulted'" )) } - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } @@ -688,7 +688,7 @@ mod tests { VmError::RuntimeErr { msg } => { assert!(msg.contains("RuntimeError: unreachable")) } - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } diff --git a/packages/vm/src/checksum.rs b/packages/vm/src/checksum.rs index 05d2aa88b1..c6aefc3fa9 100644 --- a/packages/vm/src/checksum.rs +++ b/packages/vm/src/checksum.rs @@ -28,7 +28,7 @@ impl Checksum { impl fmt::Display for Checksum { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { for byte in self.0.iter() { - write!(f, "{:02x}", byte)?; + write!(f, "{byte:02x}")?; } Ok(()) } @@ -82,7 +82,7 @@ mod tests { let wasm = vec![0x68, 0x69, 0x6a]; let checksum = Checksum::generate(&wasm); // echo -n "hij" | sha256sum - let embedded = format!("Check: {}", checksum); + let embedded = format!("Check: {checksum}"); assert_eq!( embedded, "Check: 722c8c993fd75a7627d69ed941344fe2a1423a3e75efd3e6778a142884227104" diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index 428d51554f..a5284a6e2e 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -137,8 +137,7 @@ fn check_wasm_memories(module: &Module) -> VmResult<()> { if limits.initial() > MEMORY_LIMIT { return Err(VmError::static_validation_err(format!( - "Wasm contract memory's minimum must not exceed {} pages.", - MEMORY_LIMIT + "Wasm contract memory's minimum must not exceed {MEMORY_LIMIT} pages." ))); } @@ -185,8 +184,7 @@ fn check_wasm_exports(module: &Module) -> VmResult<()> { for required_export in REQUIRED_EXPORTS { if !available_exports.contains(*required_export) { return Err(VmError::static_validation_err(format!( - "Wasm contract doesn't have required export: \"{}\". Exports required by VM: {:?}.", - required_export, REQUIRED_EXPORTS + "Wasm contract doesn't have required export: \"{required_export}\". Exports required by VM: {REQUIRED_EXPORTS:?}." ))); } } @@ -223,8 +221,7 @@ fn check_wasm_imports(module: &Module, supported_imports: &[&str]) -> VmResult<( match required_import.external() { External::Function(_) => {}, // ok _ => return Err(VmError::static_validation_err(format!( - "Wasm contract requires non-function import: \"{}\". Right now, all supported imports are functions.", - full_name + "Wasm contract requires non-function import: \"{full_name}\". Right now, all supported imports are functions." ))), }; } @@ -281,7 +278,7 @@ mod tests { msg, "Wasm contract has unknown interface_version_* marker export (see https://github.com/CosmWasm/cosmwasm/blob/main/packages/vm/README.md)" ), - Err(e) => panic!("Unexpected error {:?}", e), + Err(e) => panic!("Unexpected error {e:?}"), Ok(_) => panic!("This must not succeeed"), }; @@ -290,7 +287,7 @@ mod tests { msg, "Wasm contract has unknown interface_version_* marker export (see https://github.com/CosmWasm/cosmwasm/blob/main/packages/vm/README.md)" ), - Err(e) => panic!("Unexpected error {:?}", e), + Err(e) => panic!("Unexpected error {e:?}"), Ok(_) => panic!("This must not succeeed"), }; @@ -299,7 +296,7 @@ mod tests { msg, "Wasm contract missing a required marker export: interface_version_*" ), - Err(e) => panic!("Unexpected error {:?}", e), + Err(e) => panic!("Unexpected error {e:?}"), Ok(_) => panic!("This must not succeeed"), }; @@ -308,7 +305,7 @@ mod tests { msg, "Wasm contract missing a required marker export: interface_version_*" ), - Err(e) => panic!("Unexpected error {:?}", e), + Err(e) => panic!("Unexpected error {e:?}"), Ok(_) => panic!("This must not succeeed"), }; } @@ -358,7 +355,7 @@ mod tests { Err(VmError::StaticValidationErr { msg, .. }) => { assert!(msg.starts_with("Wasm contract doesn't have a memory section")); } - Err(e) => panic!("Unexpected error {:?}", e), + Err(e) => panic!("Unexpected error {e:?}"), Ok(_) => panic!("Didn't reject wasm with invalid api"), } } @@ -382,7 +379,7 @@ mod tests { Err(VmError::StaticValidationErr { msg, .. }) => { assert!(msg.starts_with("Wasm contract must contain exactly one memory")); } - Err(e) => panic!("Unexpected error {:?}", e), + Err(e) => panic!("Unexpected error {e:?}"), Ok(_) => panic!("Didn't reject wasm with invalid api"), } } @@ -403,7 +400,7 @@ mod tests { Err(VmError::StaticValidationErr { msg, .. }) => { assert!(msg.starts_with("Wasm contract must contain exactly one memory")); } - Err(e) => panic!("Unexpected error {:?}", e), + Err(e) => panic!("Unexpected error {e:?}"), Ok(_) => panic!("Didn't reject wasm with invalid api"), } } @@ -418,7 +415,7 @@ mod tests { Err(VmError::StaticValidationErr { msg, .. }) => { assert!(msg.starts_with("Wasm contract memory's minimum must not exceed 512 pages")); } - Err(e) => panic!("Unexpected error {:?}", e), + Err(e) => panic!("Unexpected error {e:?}"), Ok(_) => panic!("Didn't reject wasm with invalid api"), } } @@ -430,7 +427,7 @@ mod tests { Err(VmError::StaticValidationErr { msg, .. }) => { assert!(msg.starts_with("Wasm contract memory's maximum must be unset")); } - Err(e) => panic!("Unexpected error {:?}", e), + Err(e) => panic!("Unexpected error {e:?}"), Ok(_) => panic!("Didn't reject wasm with invalid api"), } } @@ -492,7 +489,7 @@ mod tests { "Wasm contract missing a required marker export: interface_version_*" ); } - err => panic!("Unexpected error {:?}", err), + err => panic!("Unexpected error {err:?}"), } // multiple @@ -517,7 +514,7 @@ mod tests { "Wasm contract contains more than one marker export: interface_version_*" ); } - err => panic!("Unexpected error {:?}", err), + err => panic!("Unexpected error {err:?}"), } // CosmWasm 0.15 @@ -538,7 +535,7 @@ mod tests { VmError::StaticValidationErr { msg, .. } => { assert_eq!(msg, "Wasm contract has unknown interface_version_* marker export (see https://github.com/CosmWasm/cosmwasm/blob/main/packages/vm/README.md)"); } - err => panic!("Unexpected error {:?}", err), + err => panic!("Unexpected error {err:?}"), } // Unknown value @@ -559,7 +556,7 @@ mod tests { VmError::StaticValidationErr { msg, .. } => { assert_eq!(msg, "Wasm contract has unknown interface_version_* marker export (see https://github.com/CosmWasm/cosmwasm/blob/main/packages/vm/README.md)"); } - err => panic!("Unexpected error {:?}", err), + err => panic!("Unexpected error {err:?}"), } } @@ -594,7 +591,7 @@ mod tests { Err(VmError::StaticValidationErr { msg, .. }) => { assert!(msg.starts_with("Wasm contract doesn't have required export: \"allocate\"")); } - Err(e) => panic!("Unexpected error {:?}", e), + Err(e) => panic!("Unexpected error {e:?}"), Ok(_) => panic!("Didn't reject wasm with invalid api"), } @@ -615,7 +612,7 @@ mod tests { msg.starts_with("Wasm contract doesn't have required export: \"deallocate\"") ); } - Err(e) => panic!("Unexpected error {:?}", e), + Err(e) => panic!("Unexpected error {e:?}"), Ok(_) => panic!("Didn't reject wasm with invalid api"), } } @@ -629,7 +626,7 @@ mod tests { msg.starts_with("Wasm contract doesn't have required export: \"instantiate\"") ) } - Err(e) => panic!("Unexpected error {:?}", e), + Err(e) => panic!("Unexpected error {e:?}"), Ok(_) => panic!("Didn't reject wasm with invalid api"), } } @@ -768,7 +765,7 @@ mod tests { VmError::StaticValidationErr { msg, .. } => { assert_eq!(msg, "Import count exceeds limit. Imports: 101. Limit: 100."); } - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } @@ -803,13 +800,13 @@ mod tests { let result = check_wasm_imports(&deserialize_wasm(&wasm).unwrap(), supported_imports); match result.unwrap_err() { VmError::StaticValidationErr { msg, .. } => { - println!("{}", msg); + println!("{msg}"); assert_eq!( msg, r#"Wasm contract requires unsupported import: "env.foo". Required imports: {"env.bar", "env.foo", "env.spammyspam01", "env.spammyspam02", "env.spammyspam03", "env.spammyspam04", "env.spammyspam05", "env.spammyspam06", "env.spammyspam07", "env.spammyspam08", ... 2 more}. Available imports: ["env.db_read", "env.db_write", "env.db_remove", "env.addr_canonicalize", "env.addr_humanize", "env.debug", "env.query_chain"]."# ); } - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } @@ -823,7 +820,7 @@ mod tests { msg.starts_with("Wasm contract requires unsupported import: \"env.read_db\"") ); } - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } @@ -837,7 +834,7 @@ mod tests { msg.starts_with("Wasm contract requires non-function import: \"env.db_read\"") ); } - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } diff --git a/packages/vm/src/conversion.rs b/packages/vm/src/conversion.rs index 8723cd0ebe..ef9577c4af 100644 --- a/packages/vm/src/conversion.rs +++ b/packages/vm/src/conversion.rs @@ -53,7 +53,7 @@ mod tests { assert_eq!(to_type, "u32"); assert_eq!(input, "4294967296"); } - Err(err) => panic!("unexpected error: {:?}", err), + Err(err) => panic!("unexpected error: {err:?}"), Ok(_) => panic!("must not succeed"), }; } @@ -77,7 +77,7 @@ mod tests { assert_eq!(to_type, "u32"); assert_eq!(input, "4294967296"); } - Err(err) => panic!("unexpected error: {:?}", err), + Err(err) => panic!("unexpected error: {err:?}"), Ok(_) => panic!("must not succeed"), }; } @@ -99,7 +99,7 @@ mod tests { assert_eq!(to_type, "u32"); assert_eq!(input, "-1"); } - Err(err) => panic!("unexpected error: {:?}", err), + Err(err) => panic!("unexpected error: {err:?}"), Ok(_) => panic!("must not succeed"), }; } @@ -121,7 +121,7 @@ mod tests { assert_eq!(to_type, "u32"); assert_eq!(input, "-1"); } - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), }; // usize @@ -141,7 +141,7 @@ mod tests { assert_eq!(to_type, "u32"); assert_eq!(input, "4294967296"); } - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), }; } @@ -162,7 +162,7 @@ mod tests { assert_eq!(to_type, "i32"); assert_eq!(input, "2147483648"); } - Err(err) => panic!("unexpected error: {:?}", err), + Err(err) => panic!("unexpected error: {err:?}"), Ok(_) => panic!("must not succeed"), }; } @@ -188,7 +188,7 @@ mod tests { assert_eq!(to_type, "i32"); assert_eq!(input, "-2147483649"); } - Err(err) => panic!("unexpected error: {:?}", err), + Err(err) => panic!("unexpected error: {err:?}"), Ok(_) => panic!("must not succeed"), }; } diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index 43dc652384..202cedd99a 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -562,7 +562,7 @@ mod tests { // Using one more unit of gas triggers a failure match process_gas_info(&env, &mut store, GasInfo::with_cost(1)).unwrap_err() { VmError::GasDepletion { .. } => {} - err => panic!("unexpected error: {:?}", err), + err => panic!("unexpected error: {err:?}"), } } @@ -584,7 +584,7 @@ mod tests { // Using one more unit of gas triggers a failure match process_gas_info(&env, &mut store, GasInfo::with_externally_used(1)).unwrap_err() { VmError::GasDepletion { .. } => {} - err => panic!("unexpected error: {:?}", err), + err => panic!("unexpected error: {err:?}"), } } @@ -617,7 +617,7 @@ mod tests { // More cost fail but do not change stats match process_gas_info(&env, &mut store, GasInfo::new(1, 0)).unwrap_err() { VmError::GasDepletion { .. } => {} - err => panic!("unexpected error: {:?}", err), + err => panic!("unexpected error: {err:?}"), } assert_eq!(env.get_gas_left(&mut store), 0); let gas_state = env.with_gas_state(|gas_state| gas_state.clone()); @@ -627,7 +627,7 @@ mod tests { // More externally used fails and changes stats match process_gas_info(&env, &mut store, GasInfo::new(0, 1)).unwrap_err() { VmError::GasDepletion { .. } => {} - err => panic!("unexpected error: {:?}", err), + err => panic!("unexpected error: {err:?}"), } assert_eq!(env.get_gas_left(&mut store), 0); let gas_state = env.with_gas_state(|gas_state| gas_state.clone()); @@ -643,7 +643,7 @@ mod tests { let result = process_gas_info(&env, &mut store, GasInfo::with_externally_used(120)); match result.unwrap_err() { VmError::GasDepletion { .. } => {} - err => panic!("unexpected error: {:?}", err), + err => panic!("unexpected error: {err:?}"), } assert_eq!(env.get_gas_left(&mut store), 0); let gas_state = env.with_gas_state(|gas_state| gas_state.clone()); @@ -657,7 +657,7 @@ mod tests { let result = process_gas_info(&env, &mut store, GasInfo::with_cost(120)); match result.unwrap_err() { VmError::GasDepletion { .. } => {} - err => panic!("unexpected error: {:?}", err), + err => panic!("unexpected error: {err:?}"), } assert_eq!(env.get_gas_left(&mut store), 0); let gas_state = env.with_gas_state(|gas_state| gas_state.clone()); @@ -689,7 +689,7 @@ mod tests { // Using one more unit of gas triggers a failure match process_gas_info(&env, &mut store, GasInfo::with_externally_used(1)).unwrap_err() { VmError::GasDepletion { .. } => {} - err => panic!("unexpected error: {:?}", err), + err => panic!("unexpected error: {err:?}"), } } @@ -742,7 +742,7 @@ mod tests { let res = env.call_function(&mut store, "allocate", &[]); match res.unwrap_err() { VmError::UninitializedContextData { kind, .. } => assert_eq!(kind, "wasmer_instance"), - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } @@ -756,7 +756,7 @@ mod tests { VmError::ResolveErr { msg, .. } => { assert_eq!(msg, "Could not get export: Missing export doesnt_exist"); } - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } @@ -786,7 +786,7 @@ mod tests { assert_eq!(expected, 0); assert_eq!(actual, 1); } - err => panic!("unexpected error: {:?}", err), + err => panic!("unexpected error: {err:?}"), } } @@ -825,7 +825,7 @@ mod tests { assert_eq!(expected, 1); assert_eq!(actual, 0); } - err => panic!("unexpected error: {:?}", err), + err => panic!("unexpected error: {err:?}"), } } diff --git a/packages/vm/src/errors/communication_error.rs b/packages/vm/src/errors/communication_error.rs index 263980efba..f298a46d3c 100644 --- a/packages/vm/src/errors/communication_error.rs +++ b/packages/vm/src/errors/communication_error.rs @@ -97,7 +97,7 @@ mod tests { assert_eq!(offset, 345); assert_eq!(msg, "broken stuff"); } - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -106,7 +106,7 @@ mod tests { let error = CommunicationError::invalid_order(-745); match error { CommunicationError::InvalidOrder { value, .. } => assert_eq!(value, -745), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -115,7 +115,7 @@ mod tests { let error = CommunicationError::invalid_utf8("broken"); match error { CommunicationError::InvalidUtf8 { msg, .. } => assert_eq!(msg, "broken"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -129,7 +129,7 @@ mod tests { assert_eq!(length, 50); assert_eq!(max_length, 20); } - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -141,7 +141,7 @@ mod tests { assert_eq!(size, 12); assert_eq!(required, 33); } - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -150,7 +150,7 @@ mod tests { let error = CommunicationError::zero_address(); match error { CommunicationError::ZeroAddress { .. } => {} - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } } diff --git a/packages/vm/src/errors/region_validation_error.rs b/packages/vm/src/errors/region_validation_error.rs index 7fc407e7c0..bf9dd5e360 100644 --- a/packages/vm/src/errors/region_validation_error.rs +++ b/packages/vm/src/errors/region_validation_error.rs @@ -51,7 +51,7 @@ mod tests { assert_eq!(length, 50); assert_eq!(capacity, 20); } - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -65,7 +65,7 @@ mod tests { assert_eq!(offset, u32::MAX); assert_eq!(capacity, 1); } - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -74,7 +74,7 @@ mod tests { let error = RegionValidationError::zero_offset(); match error { RegionValidationError::ZeroOffset { .. } => {} - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } } diff --git a/packages/vm/src/errors/vm_error.rs b/packages/vm/src/errors/vm_error.rs index 51f472cf7d..ed7adc6674 100644 --- a/packages/vm/src/errors/vm_error.rs +++ b/packages/vm/src/errors/vm_error.rs @@ -345,19 +345,19 @@ impl From for VmError { impl From for VmError { fn from(original: wasmer::ExportError) -> Self { - VmError::resolve_err(format!("Could not get export: {}", original)) + VmError::resolve_err(format!("Could not get export: {original}")) } } impl From for VmError { fn from(original: wasmer::SerializeError) -> Self { - VmError::cache_err(format!("Could not serialize module: {}", original)) + VmError::cache_err(format!("Could not serialize module: {original}")) } } impl From for VmError { fn from(original: wasmer::DeserializeError) -> Self { - VmError::cache_err(format!("Could not deserialize module: {}", original)) + VmError::cache_err(format!("Could not deserialize module: {original}")) } } @@ -381,7 +381,7 @@ impl From for VmError { impl From for VmError { fn from(original: wasmer::CompileError) -> Self { - VmError::compile_err(format!("Could not compile: {}", original)) + VmError::compile_err(format!("Could not compile: {original}")) } } @@ -412,7 +412,7 @@ mod tests { source: BackendError::Unknown { msg }, .. } => assert_eq!(msg, "something went wrong"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -421,7 +421,7 @@ mod tests { let error = VmError::cache_err("something went wrong"); match error { VmError::CacheErr { msg, .. } => assert_eq!(msg, "something went wrong"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -430,7 +430,7 @@ mod tests { let error = VmError::compile_err("something went wrong"); match error { VmError::CompileErr { msg, .. } => assert_eq!(msg, "something went wrong"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -448,7 +448,7 @@ mod tests { assert_eq!(to_type, "u32"); assert_eq!(input, "-9"); } - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -460,7 +460,7 @@ mod tests { source: CryptoError::GenericErr { msg, .. }, .. } => assert_eq!(msg, "something went wrong"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -469,19 +469,19 @@ mod tests { let error = VmError::gas_depletion(); match error { VmError::GasDepletion { .. } => {} - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } #[test] fn generic_err_works() { let guess = 7; - let error = VmError::generic_err(format!("{} is too low", guess)); + let error = VmError::generic_err(format!("{guess} is too low")); match error { VmError::GenericErr { msg, .. } => { assert_eq!(msg, String::from("7 is too low")); } - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -490,7 +490,7 @@ mod tests { let error = VmError::instantiation_err("something went wrong"); match error { VmError::InstantiationErr { msg, .. } => assert_eq!(msg, "something went wrong"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -499,7 +499,7 @@ mod tests { let error = VmError::integrity_err(); match error { VmError::IntegrityErr { .. } => {} - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -513,7 +513,7 @@ mod tests { assert_eq!(target_type, "Book"); assert_eq!(msg, "Missing field: title"); } - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -527,7 +527,7 @@ mod tests { assert_eq!(source_type, "Book"); assert_eq!(msg, "Content too long"); } - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -536,7 +536,7 @@ mod tests { let error = VmError::resolve_err("function has different signature"); match error { VmError::ResolveErr { msg, .. } => assert_eq!(msg, "function has different signature"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -554,7 +554,7 @@ mod tests { assert_eq!(expected, 0); assert_eq!(actual, 1); } - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -563,7 +563,7 @@ mod tests { let error = VmError::runtime_err("something went wrong"); match error { VmError::RuntimeErr { msg, .. } => assert_eq!(msg, "something went wrong"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -572,7 +572,7 @@ mod tests { let error = VmError::static_validation_err("export xy missing"); match error { VmError::StaticValidationErr { msg, .. } => assert_eq!(msg, "export xy missing"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -581,7 +581,7 @@ mod tests { let error = VmError::uninitialized_context_data("foo"); match error { VmError::UninitializedContextData { kind, .. } => assert_eq!(kind, "foo"), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -590,7 +590,7 @@ mod tests { let error = VmError::write_access_denied(); match error { VmError::WriteAccessDenied { .. } => {} - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } } diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 0fab00a1b5..d9769d7861 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -764,7 +764,7 @@ mod tests { source: CommunicationError::RegionLengthTooBig { length, .. }, .. } => assert_eq!(length, 300 * 1024), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -863,7 +863,7 @@ mod tests { assert_eq!(length, 300 * 1024); assert_eq!(max_length, MAX_LENGTH_DB_KEY); } - err => panic!("unexpected error: {:?}", err), + err => panic!("unexpected error: {err:?}"), }; } @@ -890,7 +890,7 @@ mod tests { assert_eq!(length, 300 * 1024); assert_eq!(max_length, MAX_LENGTH_DB_VALUE); } - err => panic!("unexpected error: {:?}", err), + err => panic!("unexpected error: {err:?}"), }; } @@ -909,7 +909,7 @@ mod tests { let result = do_db_write(fe_mut, key_ptr, value_ptr); match result.unwrap_err() { VmError::WriteAccessDenied { .. } => {} - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -927,7 +927,7 @@ mod tests { fe_mut .data() .with_storage_from_context::<_, _>(|store| { - println!("{:?}", store); + println!("{store:?}"); Ok(()) }) .unwrap(); @@ -937,7 +937,7 @@ mod tests { fe_mut .data() .with_storage_from_context::<_, _>(|store| { - println!("{:?}", store); + println!("{store:?}"); Ok(()) }) .unwrap(); @@ -996,7 +996,7 @@ mod tests { assert_eq!(length, 300 * 1024); assert_eq!(max_length, MAX_LENGTH_DB_KEY); } - err => panic!("unexpected error: {:?}", err), + err => panic!("unexpected error: {err:?}"), }; } @@ -1014,7 +1014,7 @@ mod tests { let result = do_db_remove(fe_mut, key_ptr); match result.unwrap_err() { VmError::WriteAccessDenied { .. } => {} - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -1084,7 +1084,7 @@ mod tests { source: BackendError::Unknown { msg, .. }, .. } => assert_eq!(msg, "Temporarily unavailable"), - err => panic!("Incorrect error returned: {:?}", err), + err => panic!("Incorrect error returned: {err:?}"), } } @@ -1110,7 +1110,7 @@ mod tests { assert_eq!(length, 333); assert_eq!(max_length, 256); } - err => panic!("Incorrect error returned: {:?}", err), + err => panic!("Incorrect error returned: {err:?}"), } } @@ -1182,7 +1182,7 @@ mod tests { source: BackendError::Unknown { msg, .. }, .. } => assert_eq!(msg, "Temporarily unavailable"), - err => panic!("Incorrect error returned: {:?}", err), + err => panic!("Incorrect error returned: {err:?}"), } } @@ -1209,7 +1209,7 @@ mod tests { assert_eq!(length, 333); assert_eq!(max_length, 256); } - err => panic!("Incorrect error returned: {:?}", err), + err => panic!("Incorrect error returned: {err:?}"), } } @@ -1233,7 +1233,7 @@ mod tests { assert_eq!(size, 7); assert_eq!(required, api.canonical_length()); } - err => panic!("Incorrect error returned: {:?}", err), + err => panic!("Incorrect error returned: {err:?}"), } } @@ -1289,7 +1289,7 @@ mod tests { source: BackendError::Unknown { msg, .. }, .. } => assert_eq!(msg, "Temporarily unavailable"), - err => panic!("Incorrect error returned: {:?}", err), + err => panic!("Incorrect error returned: {err:?}"), }; } @@ -1316,7 +1316,7 @@ mod tests { assert_eq!(length, 65); assert_eq!(max_length, 64); } - err => panic!("Incorrect error returned: {:?}", err), + err => panic!("Incorrect error returned: {err:?}"), } } @@ -1342,7 +1342,7 @@ mod tests { assert_eq!(size, 2); assert_eq!(required, api.canonical_length()); } - err => panic!("Incorrect error returned: {:?}", err), + err => panic!("Incorrect error returned: {err:?}"), } } @@ -1407,7 +1407,7 @@ mod tests { source: CommunicationError::RegionLengthTooBig { length, .. }, .. } => assert_eq!(length, MESSAGE_HASH_MAX_LEN + 1), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -1474,7 +1474,7 @@ mod tests { source: CommunicationError::RegionLengthTooBig { length, .. }, .. } => assert_eq!(length, ECDSA_SIGNATURE_LEN + 1), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -1562,7 +1562,7 @@ mod tests { source: CommunicationError::RegionLengthTooBig { length, .. }, .. } => assert_eq!(length, ECDSA_PUBKEY_MAX_LEN + 1), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -1709,7 +1709,7 @@ mod tests { source: CommunicationError::RegionLengthTooBig { length, .. }, .. } => assert_eq!(length, msg.len()), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -1755,7 +1755,7 @@ mod tests { source: CommunicationError::RegionLengthTooBig { length, .. }, .. } => assert_eq!(length, MAX_LENGTH_ED25519_SIGNATURE + 1), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -1822,7 +1822,7 @@ mod tests { source: CommunicationError::RegionLengthTooBig { length, .. }, .. } => assert_eq!(length, EDDSA_PUBKEY_LEN + 1), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -1931,7 +1931,7 @@ mod tests { SystemResult::Err(SystemError::InvalidRequest { request: err, .. }) => { assert_eq!(err.as_slice(), request) } - SystemResult::Err(err) => panic!("Unexpected error: {:?}", err), + SystemResult::Err(err) => panic!("Unexpected error: {err:?}"), } } @@ -1960,7 +1960,7 @@ mod tests { SystemResult::Err(SystemError::NoSuchContract { addr }) => { assert_eq!(addr, "non-existent") } - SystemResult::Err(err) => panic!("Unexpected error: {:?}", err), + SystemResult::Err(err) => panic!("Unexpected error: {err:?}"), } } @@ -2118,7 +2118,7 @@ mod tests { source: CommunicationError::InvalidOrder { .. }, .. } => {} - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } @@ -2169,7 +2169,7 @@ mod tests { source: BackendError::IteratorDoesNotExist { id, .. }, .. } => assert_eq!(id, non_existent_id), - e => panic!("Unexpected error: {:?}", e), + e => panic!("Unexpected error: {e:?}"), } } } diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 5cfb9fabf1..47f991a746 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -748,7 +748,7 @@ mod tests { match init_result.unwrap_err() { VmError::RuntimeErr { msg, .. } => assert!(msg.contains(error_message)), - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } @@ -777,7 +777,7 @@ mod tests { assert_eq!(length, 6); assert_eq!(max_length, 5); } - err => panic!("unexpected error: {:?}", err), + err => panic!("unexpected error: {err:?}"), }; instance.deallocate(region_ptr).expect("error deallocating"); diff --git a/packages/vm/src/limited.rs b/packages/vm/src/limited.rs index 1475dc4712..61bac32f87 100644 --- a/packages/vm/src/limited.rs +++ b/packages/vm/src/limited.rs @@ -73,9 +73,9 @@ fn collection_to_string_limited, I: ExactSizeIterator>( let skipped = elements_count - lengths_stack.len(); let remaining = elements_count - skipped; let skipped_text = if remaining == 0 { - format!("... {} elements", skipped) + format!("... {skipped} elements") } else { - format!(", ... {} more", skipped) + format!(", ... {skipped} more") }; if previous_length + skipped_text.len() + closing.len() <= max_length { out.truncate(previous_length); diff --git a/packages/vm/src/memory.rs b/packages/vm/src/memory.rs index 04aa6f054e..5143de0bd4 100644 --- a/packages/vm/src/memory.rs +++ b/packages/vm/src/memory.rs @@ -194,7 +194,7 @@ mod tests { let result = validate_region(®ion); match result.unwrap_err() { RegionValidationError::ZeroOffset { .. } => {} - e => panic!("Got unexpected error: {:?}", e), + e => panic!("Got unexpected error: {e:?}"), } } @@ -213,7 +213,7 @@ mod tests { assert_eq!(length, 501); assert_eq!(capacity, 500); } - e => panic!("Got unexpected error: {:?}", e), + e => panic!("Got unexpected error: {e:?}"), } } @@ -232,7 +232,7 @@ mod tests { assert_eq!(offset, 23); assert_eq!(capacity, u32::MAX); } - e => panic!("Got unexpected error: {:?}", e), + e => panic!("Got unexpected error: {e:?}"), } let region = Region { @@ -248,7 +248,7 @@ mod tests { assert_eq!(offset, u32::MAX); assert_eq!(capacity, 1); } - e => panic!("Got unexpected error: {:?}", e), + e => panic!("Got unexpected error: {e:?}"), } } } diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index aef4be3ec8..68c218ee49 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -137,13 +137,11 @@ impl FileSystemCache { Err(DeserializeError::Io(err)) => match err.kind() { io::ErrorKind::NotFound => Ok(None), _ => Err(VmError::cache_err(format!( - "Error opening module file: {}", - err + "Error opening module file: {err}" ))), }, Err(err) => Err(VmError::cache_err(format!( - "Error deserializing module: {}", - err + "Error deserializing module: {err}" ))), } } @@ -157,7 +155,7 @@ impl FileSystemCache { let path = self.modules_path.join(filename); module .serialize_to_file(&path) - .map_err(|e| VmError::cache_err(format!("Error writing module to disk: {}", e)))?; + .map_err(|e| VmError::cache_err(format!("Error writing module to disk: {e}")))?; let module_size = module_size(&path)?; Ok(module_size) } @@ -204,8 +202,7 @@ fn target_id(target: &Target) -> String { /// The path to the latest version of the modules. fn modules_path(base_path: &Path, wasmer_module_version: u32, target: &Target) -> PathBuf { let version_dir = format!( - "{}-wasmer{}", - MODULE_SERIALIZATION_VERSION, wasmer_module_version + "{MODULE_SERIALIZATION_VERSION}-wasmer{wasmer_module_version}" ); let target_dir = target_id(target); base_path.join(version_dir).join(target_dir) diff --git a/packages/vm/src/modules/in_memory_cache.rs b/packages/vm/src/modules/in_memory_cache.rs index ca8bc6a579..0a876e019b 100644 --- a/packages/vm/src/modules/in_memory_cache.rs +++ b/packages/vm/src/modules/in_memory_cache.rs @@ -65,7 +65,7 @@ impl InMemoryCache { size, }, ) - .map_err(|e| VmError::cache_err(format!("{:?}", e)))?; + .map_err(|e| VmError::cache_err(format!("{e:?}")))?; } Ok(()) } diff --git a/packages/vm/src/serde.rs b/packages/vm/src/serde.rs index c884dd1b80..ce6c9e0f81 100644 --- a/packages/vm/src/serde.rs +++ b/packages/vm/src/serde.rs @@ -95,7 +95,7 @@ mod tests { assert_eq!(length, 13); assert_eq!(max_length, 5); } - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } diff --git a/packages/vm/src/static_analysis.rs b/packages/vm/src/static_analysis.rs index cb577f9135..94e644721d 100644 --- a/packages/vm/src/static_analysis.rs +++ b/packages/vm/src/static_analysis.rs @@ -15,8 +15,7 @@ pub const REQUIRED_IBC_EXPORTS: &[&str] = &[ pub fn deserialize_wasm(wasm_code: &[u8]) -> VmResult { deserialize_buffer(wasm_code).map_err(|err| { VmError::static_validation_err(format!( - "Wasm bytecode could not be deserialized. Deserialization error: \"{}\"", - err + "Wasm bytecode could not be deserialized. Deserialization error: \"{err}\"" )) }) } @@ -119,7 +118,7 @@ mod tests { VmError::StaticValidationErr { msg, .. } => { assert!(msg.starts_with("Wasm bytecode could not be deserialized.")) } - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } diff --git a/packages/vm/src/testing/instance.rs b/packages/vm/src/testing/instance.rs index 6a4f11a37f..0b94321d7e 100644 --- a/packages/vm/src/testing/instance.rs +++ b/packages/vm/src/testing/instance.rs @@ -193,8 +193,7 @@ where let wasm_data = instance.read_memory(wasm_ptr, size).expect("error reading"); assert_eq!( original, wasm_data, - "failed for size {}; expected: {:?}; actual: {:?}", - size, original, wasm_data + "failed for size {size}; expected: {original:?}; actual: {wasm_data:?}" ); instance .deallocate(wasm_ptr) diff --git a/packages/vm/src/testing/mock.rs b/packages/vm/src/testing/mock.rs index 64bacb40cf..15c7942eb3 100644 --- a/packages/vm/src/testing/mock.rs +++ b/packages/vm/src/testing/mock.rs @@ -249,7 +249,7 @@ mod tests { let (result, _gas_info) = api.human_address(&input); match result.unwrap_err() { BackendError::UserErr { .. } => {} - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } @@ -259,7 +259,7 @@ mod tests { let human = "1"; match api.canonical_address(human).0.unwrap_err() { BackendError::UserErr { msg } => assert!(msg.contains("too short")), - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } @@ -269,7 +269,7 @@ mod tests { let human = "longer-than-the-address-length-supported-by-this-api-longer-than-54"; match api.canonical_address(human).0.unwrap_err() { BackendError::UserErr { msg } => assert!(msg.contains("too long")), - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } } diff --git a/packages/vm/src/testing/querier.rs b/packages/vm/src/testing/querier.rs index 6a3edae14b..a578fca2b5 100644 --- a/packages/vm/src/testing/querier.rs +++ b/packages/vm/src/testing/querier.rs @@ -99,7 +99,7 @@ impl MockQuerier { let gas_info = GasInfo::with_externally_used(err.to_string().len() as u64); return ( Ok(SystemResult::Err(SystemError::InvalidRequest { - error: format!("Serializing query request: {}", err), + error: format!("Serializing query request: {err}"), request: b"N/A".into(), })), gas_info, @@ -127,7 +127,7 @@ mod tests { let (result, _gas_info) = querier.query_raw(b"broken request", gas_limit); match result.unwrap_err() { BackendError::OutOfGas {} => {} - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } diff --git a/packages/vm/src/wasm_backend/gatekeeper.rs b/packages/vm/src/wasm_backend/gatekeeper.rs index dc0f443883..3062e3950b 100644 --- a/packages/vm/src/wasm_backend/gatekeeper.rs +++ b/packages/vm/src/wasm_backend/gatekeeper.rs @@ -222,7 +222,7 @@ impl FunctionMiddleware for FunctionGatekeeper { state.push_operator(operator); Ok(()) } else { - let msg = format!("Reference type operation detected: {:?}. Reference types are not supported.", operator); + let msg = format!("Reference type operation detected: {operator:?}. Reference types are not supported."); Err(MiddlewareError::new(MIDDLEWARE_NAME, msg)) } } @@ -297,7 +297,7 @@ impl FunctionMiddleware for FunctionGatekeeper { state.push_operator(operator); Ok(()) } else { - let msg = format!("Threads operator detected: {:?}. The Wasm Threads extension is not supported.", operator); + let msg = format!("Threads operator detected: {operator:?}. The Wasm Threads extension is not supported."); Err(MiddlewareError::new(MIDDLEWARE_NAME, msg)) } } @@ -490,8 +490,7 @@ impl FunctionMiddleware for FunctionGatekeeper { Ok(()) } else { let msg = format!( - "SIMD operator detected: {:?}. The Wasm SIMD extension is not supported.", - operator + "SIMD operator detected: {operator:?}. The Wasm SIMD extension is not supported." ); Err(MiddlewareError::new(MIDDLEWARE_NAME, msg)) } @@ -519,8 +518,7 @@ impl FunctionMiddleware for FunctionGatekeeper { | Operator::I32x4DotI8x16I7x16AddS | Operator::F32x4RelaxedDotBf16x8AddF32x4 => { let msg = format!( - "Relaxed SIMD operator detected: {:?}. The Wasm Relaxed SIMD extension is not supported.", - operator + "Relaxed SIMD operator detected: {operator:?}. The Wasm Relaxed SIMD extension is not supported." ); Err(MiddlewareError::new(MIDDLEWARE_NAME, msg)) } @@ -657,8 +655,7 @@ impl FunctionMiddleware for FunctionGatekeeper { Ok(()) } else { let msg = format!( - "Float operator detected: {:?}. The use of floats is not supported.", - operator + "Float operator detected: {operator:?}. The use of floats is not supported." ); Err(MiddlewareError::new(MIDDLEWARE_NAME, msg)) } @@ -675,7 +672,7 @@ impl FunctionMiddleware for FunctionGatekeeper { state.push_operator(operator); Ok(()) } else { - let msg = format!("Bulk memory operation detected: {:?}. Bulk memory operations are not supported.", operator); + let msg = format!("Bulk memory operation detected: {operator:?}. Bulk memory operations are not supported."); Err(MiddlewareError::new(MIDDLEWARE_NAME, msg)) } } @@ -689,7 +686,7 @@ impl FunctionMiddleware for FunctionGatekeeper { state.push_operator(operator); Ok(()) } else { - let msg = format!("Exception handling operation detected: {:?}. Exception handling is not supported.", operator); + let msg = format!("Exception handling operation detected: {operator:?}. Exception handling is not supported."); Err(MiddlewareError::new(MIDDLEWARE_NAME, msg)) } } diff --git a/packages/vm/src/wasm_backend/limiting_tunables.rs b/packages/vm/src/wasm_backend/limiting_tunables.rs index d0b5c8a999..cc476930af 100644 --- a/packages/vm/src/wasm_backend/limiting_tunables.rs +++ b/packages/vm/src/wasm_backend/limiting_tunables.rs @@ -186,7 +186,7 @@ mod tests { MemoryError::Generic(msg) => { assert_eq!(msg, "Maximum exceeds the allowed memory limit") } - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } // Maximum not set @@ -194,7 +194,7 @@ mod tests { let result = limiting.validate_memory(&memory); match result.unwrap_err() { MemoryError::Generic(msg) => assert_eq!(msg, "Maximum unset"), - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } // Minimum greater than maximum (not our problem) @@ -208,7 +208,7 @@ mod tests { MemoryError::Generic(msg) => { assert_eq!(msg, "Minimum exceeds the allowed memory limit") } - err => panic!("Unexpected error: {:?}", err), + err => panic!("Unexpected error: {err:?}"), } } } From 6d5f98b2c90cbc6afcf19bd9a8cf2d8d7e6c8fe6 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 27 Jun 2023 12:29:27 +0200 Subject: [PATCH 0462/2372] cargo fmt --- packages/vm/src/calls.rs | 5 ++--- packages/vm/src/modules/file_system_cache.rs | 4 +--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index d55389c16a..dc24a11a6f 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -206,9 +206,8 @@ where from_slice(&data, deserialization_limits::RESULT_QUERY)?; // Ensure query response is valid JSON if let ContractResult::Ok(binary_response) = &result { - serde_json::from_slice::(binary_response.as_slice()).map_err(|e| { - VmError::generic_err(format!("Query response must be valid JSON. {e}")) - })?; + serde_json::from_slice::(binary_response.as_slice()) + .map_err(|e| VmError::generic_err(format!("Query response must be valid JSON. {e}")))?; } Ok(result) diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 68c218ee49..f2298c8f6e 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -201,9 +201,7 @@ fn target_id(target: &Target) -> String { /// The path to the latest version of the modules. fn modules_path(base_path: &Path, wasmer_module_version: u32, target: &Target) -> PathBuf { - let version_dir = format!( - "{MODULE_SERIALIZATION_VERSION}-wasmer{wasmer_module_version}" - ); + let version_dir = format!("{MODULE_SERIALIZATION_VERSION}-wasmer{wasmer_module_version}"); let target_dir = target_id(target); base_path.join(version_dir).join(target_dir) } From 14d35a2dbfe4a4f5b70f2d69c81d8b9b744506fd Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 27 Jun 2023 13:16:04 +0200 Subject: [PATCH 0463/2372] Fix cyberpunk clippy --- contracts/cyberpunk/src/contract.rs | 2 +- contracts/cyberpunk/tests/integration.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/cyberpunk/src/contract.rs b/contracts/cyberpunk/src/contract.rs index 7de7d80fd2..bc9c7052e9 100644 --- a/contracts/cyberpunk/src/contract.rs +++ b/contracts/cyberpunk/src/contract.rs @@ -57,7 +57,7 @@ fn execute_argon2(mem_cost: u32, time_cost: u32) -> Result expected * 80 / 100, "Gas used: {}", gas_used); - assert!(gas_used < expected * 120 / 100, "Gas used: {}", gas_used); + assert!(gas_used > expected * 80 / 100, "Gas used: {gas_used}"); + assert!(gas_used < expected * 120 / 100, "Gas used: {gas_used}"); } // Test with From bb413cc46afff751546f3394a5120923c6c4005a Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 27 Jun 2023 13:17:23 +0200 Subject: [PATCH 0464/2372] Update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 303090ccdc..3636d5af41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,7 +42,7 @@ and this project adheres to - cosmwasm-vm: Add `Instance::set_debug_handler`/`unset_debug_handler` to allow customizing the handling of debug messages emitted by the contract ([#1667]). - cosmwasm-vm: Add `.wasm` extension to stored wasm files ([#1686]). -- cosmwasm-vm: Upgrade Wasmer to version 3.3.0. +- cosmwasm-vm: Upgrade Wasmer to version 4.0.0. - cosmwasm-check: Update clap dependency to version 4 ([#1677]) - cosmwasm-std: Coin uses shorter `Coin { 123 "ucosm" }` format for Debug ([#1704]) From afc610acd0eb640cf3458063fd28f44d8199df6a Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 27 Jun 2023 13:41:44 +0200 Subject: [PATCH 0465/2372] Update mergify config --- .mergify.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.mergify.yml b/.mergify.yml index a1d0596643..f37873c2bf 100644 --- a/.mergify.yml +++ b/.mergify.yml @@ -13,7 +13,7 @@ pull_request_rules: - "status-success=macOS" - "status-success=Windows" - "status-success=ci/circleci: arm64" - - "status-success=ci/circleci: clippy-1.60.0" + - "status-success=ci/circleci: clippy-1.67.0" - "status-success=ci/circleci: clippy-1.68.2" - "status-success=ci/circleci: contract_burner" - "status-success=ci/circleci: contract_crypto_verify" From a9d2b0a9a8a5b3872140bd874116e12a76a1b4bb Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 27 Jun 2023 15:22:34 +0200 Subject: [PATCH 0466/2372] Add Storage::range_keys and Storage::range_values --- CHANGELOG.md | 4 ++++ packages/std/src/traits.rs | 37 +++++++++++++++++++++++++++++++++++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 53e075edb1..1d882e7ab3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,12 +21,16 @@ and this project adheres to was checked when it was first uploaded. ([#1635]) - cosmwasm-vm: Allow sign extension Wasm opcodes in static validation. This allows contracts to be compiled with Rust 1.70.0 and above. ([#1727]) +- cosmwasm-std: Add trait functions `Storage::range_keys` and + `Storage::range_values`. The default implementations just use + `Storage::range`. Later this can be implemented more efficiently. ([#1748]) [#1635]: https://github.com/CosmWasm/cosmwasm/pull/1635 [#1647]: https://github.com/CosmWasm/cosmwasm/pull/1647 [#1684]: https://github.com/CosmWasm/cosmwasm/pull/1684 [#1687]: https://github.com/CosmWasm/cosmwasm/pull/1687 [#1727]: https://github.com/CosmWasm/cosmwasm/issues/1727 +[#1748]: https://github.com/CosmWasm/cosmwasm/pull/1748 ### Changed diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 7181036cb8..0b28803b89 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -38,12 +38,11 @@ pub trait Storage { /// is not great yet and might not be possible in all backends. But we're trying to get there. fn get(&self, key: &[u8]) -> Option>; - #[cfg(feature = "iterator")] /// Allows iteration over a set of key/value pairs, either forwards or backwards. /// /// The bound `start` is inclusive and `end` is exclusive. - /// /// If `start` is lexicographically greater than or equal to `end`, an empty range is described, mo matter of the order. + #[cfg(feature = "iterator")] fn range<'a>( &'a self, start: Option<&[u8]>, @@ -51,6 +50,40 @@ pub trait Storage { order: Order, ) -> Box + 'a>; + /// Allows iteration over a set of keys, either forwards or backwards. + /// + /// The bound `start` is inclusive and `end` is exclusive. + /// If `start` is lexicographically greater than or equal to `end`, an empty range is described, mo matter of the order. + /// + /// The default implementation uses [`Storage::range`] and discards the values. More efficient + /// implementations might be possible depending on the storage. + #[cfg(feature = "iterator")] + fn range_keys<'a>( + &'a self, + start: Option<&[u8]>, + end: Option<&[u8]>, + order: Order, + ) -> Box> + 'a> { + Box::new(self.range(start, end, order).map(|(k, _v)| k)) + } + + /// Allows iteration over a set of values, either forwards or backwards. + /// + /// The bound `start` is inclusive and `end` is exclusive. + /// If `start` is lexicographically greater than or equal to `end`, an empty range is described, mo matter of the order. + /// + /// The default implementation uses [`Storage::range`] and discards the keys. More efficient implementations + /// might be possible depending on the storage. + #[cfg(feature = "iterator")] + fn range_values<'a>( + &'a self, + start: Option<&[u8]>, + end: Option<&[u8]>, + order: Order, + ) -> Box> + 'a> { + Box::new(self.range(start, end, order).map(|(_k, v)| v)) + } + fn set(&mut self, key: &[u8], value: &[u8]); /// Removes a database entry at `key`. From 3c1e58b6fb957ccd59dbb576e9cd932b075d3d32 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 27 Jun 2023 16:56:28 +0200 Subject: [PATCH 0467/2372] Remove staking feature gate for distribution query Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/std/src/query/mod.rs | 6 +++--- packages/std/src/testing/mock.rs | 16 ++++++++-------- packages/std/src/testing/mod.rs | 2 +- packages/std/src/traits.rs | 4 ++-- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/std/src/query/mod.rs b/packages/std/src/query/mod.rs index f768faadad..5401f9145d 100644 --- a/packages/std/src/query/mod.rs +++ b/packages/std/src/query/mod.rs @@ -17,7 +17,7 @@ pub use bank::SupplyResponse; pub use bank::{AllBalanceResponse, BalanceResponse, BankQuery}; #[cfg(feature = "cosmwasm_1_3")] pub use bank::{AllDenomMetadataResponse, DenomMetadataResponse}; -#[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] +#[cfg(feature = "cosmwasm_1_3")] pub use distribution::{DelegatorWithdrawAddressResponse, DistributionQuery}; #[cfg(feature = "stargate")] pub use ibc::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; @@ -38,7 +38,7 @@ pub enum QueryRequest { Custom(C), #[cfg(feature = "staking")] Staking(StakingQuery), - #[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] + #[cfg(feature = "cosmwasm_1_3")] Distribution(DistributionQuery), /// A Stargate query is encoded the same way as abci_query, with path and protobuf encoded request data. /// The format is defined in [ADR-21](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-021-protobuf-query-encoding.md). @@ -114,7 +114,7 @@ impl From for QueryRequest { } } -#[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] +#[cfg(feature = "cosmwasm_1_3")] impl From for QueryRequest { fn from(msg: DistributionQuery) -> Self { QueryRequest::Distribution(msg) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 2542f87249..f2ed550cda 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -28,7 +28,7 @@ use crate::query::{ AllDelegationsResponse, AllValidatorsResponse, BondedDenomResponse, DelegationResponse, FullDelegation, StakingQuery, Validator, ValidatorResponse, }; -#[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] +#[cfg(feature = "cosmwasm_1_3")] use crate::query::{DelegatorWithdrawAddressResponse, DistributionQuery}; use crate::results::{ContractResult, Empty, SystemResult}; use crate::serde::{from_slice, to_binary}; @@ -445,7 +445,7 @@ pub struct MockQuerier { bank: BankQuerier, #[cfg(feature = "staking")] staking: StakingQuerier, - #[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] + #[cfg(feature = "cosmwasm_1_3")] distribution: DistributionQuerier, wasm: WasmQuerier, #[cfg(feature = "stargate")] @@ -461,7 +461,7 @@ impl MockQuerier { pub fn new(balances: &[(&str, &[Coin])]) -> Self { MockQuerier { bank: BankQuerier::new(balances), - #[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] + #[cfg(feature = "cosmwasm_1_3")] distribution: DistributionQuerier::default(), #[cfg(feature = "staking")] staking: StakingQuerier::default(), @@ -490,7 +490,7 @@ impl MockQuerier { self.bank.set_denom_metadata(denom_metadata); } - #[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] + #[cfg(feature = "cosmwasm_1_3")] pub fn set_withdraw_addresses(&mut self, withdraw_addresses: HashMap) { self.distribution.set_withdraw_addresses(withdraw_addresses); } @@ -554,7 +554,7 @@ impl MockQuerier { QueryRequest::Custom(custom_query) => (*self.custom_handler)(custom_query), #[cfg(feature = "staking")] QueryRequest::Staking(staking_query) => self.staking.query(staking_query), - #[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] + #[cfg(feature = "cosmwasm_1_3")] QueryRequest::Distribution(distribution_query) => { self.distribution.query(distribution_query) } @@ -908,13 +908,13 @@ impl StakingQuerier { } } -#[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] +#[cfg(feature = "cosmwasm_1_3")] #[derive(Clone, Default)] pub struct DistributionQuerier { withdraw_addresses: HashMap, } -#[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] +#[cfg(feature = "cosmwasm_1_3")] impl DistributionQuerier { pub fn new(withdraw_addresses: HashMap) -> Self { DistributionQuerier { withdraw_addresses } @@ -1477,7 +1477,7 @@ mod tests { ); } - #[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] + #[cfg(feature = "cosmwasm_1_3")] #[test] fn distribution_querier_delegator_withdraw_address() { let mut distribution = DistributionQuerier::new(HashMap::new()); diff --git a/packages/std/src/testing/mod.rs b/packages/std/src/testing/mod.rs index 02487f8496..550486a0b6 100644 --- a/packages/std/src/testing/mod.rs +++ b/packages/std/src/testing/mod.rs @@ -9,7 +9,7 @@ mod shuffle; pub use assertions::assert_approx_eq_impl; -#[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] +#[cfg(feature = "cosmwasm_1_3")] pub use mock::DistributionQuerier; #[cfg(feature = "staking")] pub use mock::StakingQuerier; diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index c6a12ef504..c9bb3e3972 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -22,7 +22,7 @@ use crate::query::{ }; #[cfg(feature = "cosmwasm_1_3")] use crate::query::{AllDenomMetadataResponse, DenomMetadataResponse}; -#[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] +#[cfg(feature = "cosmwasm_1_3")] use crate::query::{DelegatorWithdrawAddressResponse, DistributionQuery}; use crate::results::{ContractResult, Empty, SystemResult}; use crate::serde::{from_binary, to_binary, to_vec}; @@ -245,7 +245,7 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { Ok(res.amount) } - #[cfg(all(feature = "staking", feature = "cosmwasm_1_3"))] + #[cfg(feature = "cosmwasm_1_3")] pub fn query_delegator_withdraw_address( &self, delegator: impl Into, From 3f6cc077486ca94ba6e6af6568b259cd2fbf9816 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 27 Jun 2023 17:06:27 +0200 Subject: [PATCH 0468/2372] Update changelog and capabilities docs --- CHANGELOG.md | 3 +++ docs/CAPABILITIES-BUILT-IN.md | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc73ece393..55dff32b36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,12 +14,15 @@ and this project adheres to enabled for the `cosmwasm_std` dependency. This makes the contract incompatible with chains running anything lower than CosmWasm `1.3.0`. ([#1647]) +- cosmwasm-std: Add `DistributionQuery::DelegatorWithdrawAddress`. Also needs + the `cosmwasm_1_3` feature (see above). ([#1593]) - cosmwasm-std: Add `FromStr` impl for `Coin`. ([#1684]) - cosmwasm-std: Add `Coins` helper to handle multiple coins. ([#1687]) - cosmwasm-vm: Add `Cache::save_wasm_unchecked` to save Wasm blobs that have been checked before. This is useful for state-sync where we know the Wasm code was checked when it was first uploaded. ([#1635]) +[#1593]: https://github.com/CosmWasm/cosmwasm/pull/1593 [#1635]: https://github.com/CosmWasm/cosmwasm/pull/1635 [#1647]: https://github.com/CosmWasm/cosmwasm/pull/1647 [#1684]: https://github.com/CosmWasm/cosmwasm/pull/1684 diff --git a/docs/CAPABILITIES-BUILT-IN.md b/docs/CAPABILITIES-BUILT-IN.md index d822971807..11990c839a 100644 --- a/docs/CAPABILITIES-BUILT-IN.md +++ b/docs/CAPABILITIES-BUILT-IN.md @@ -16,5 +16,6 @@ might define others. - `cosmwasm_1_2` enables the `GovMsg::VoteWeighted` and `WasmMsg::Instantiate2` messages. Only chains running CosmWasm `1.2.0` or higher support this. - `cosmwasm_1_3` enables the `BankQuery::AllDenomMetadata` and - `BankQuery::DenomMetadata` queries. Only chains running CosmWasm `1.3.0` or - higher support this. + `BankQuery::DenomMetadata` queries, as well as + `DistributionQuery::DelegatorWithdrawAddress`. Only chains running CosmWasm + `1.3.0` or higher support this. From 851ea63ef3d8204e75ae8bb916b134cea65f486c Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 28 Jun 2023 11:39:41 +0200 Subject: [PATCH 0469/2372] Improve DistributionQuerier api --- packages/std/src/testing/mock.rs | 58 +++++++++++++++++++++++++++----- 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index f2ed550cda..109342884e 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -491,10 +491,32 @@ impl MockQuerier { } #[cfg(feature = "cosmwasm_1_3")] - pub fn set_withdraw_addresses(&mut self, withdraw_addresses: HashMap) { + pub fn set_withdraw_address( + &mut self, + delegator_address: impl Into, + withdraw_address: impl Into, + ) { + self.distribution + .set_withdraw_address(delegator_address, withdraw_address); + } + + /// Sets multiple withdraw addresses. + /// + /// This allows passing multiple tuples of `(delegator_address, withdraw_address)`. + /// It does not overwrite existing entries. + #[cfg(feature = "cosmwasm_1_3")] + pub fn set_withdraw_addresses( + &mut self, + withdraw_addresses: impl IntoIterator, impl Into)>, + ) { self.distribution.set_withdraw_addresses(withdraw_addresses); } + #[cfg(feature = "cosmwasm_1_3")] + pub fn clear_withdraw_addresses(&mut self) { + self.distribution.clear_withdraw_addresses(); + } + #[cfg(feature = "staking")] pub fn update_staking( &mut self, @@ -920,8 +942,30 @@ impl DistributionQuerier { DistributionQuerier { withdraw_addresses } } - pub fn set_withdraw_addresses(&mut self, withdraw_addresses: HashMap) { - self.withdraw_addresses = withdraw_addresses; + pub fn set_withdraw_address( + &mut self, + delegator_address: impl Into, + withdraw_address: impl Into, + ) { + self.withdraw_addresses + .insert(delegator_address.into(), withdraw_address.into()); + } + + /// Sets multiple withdraw addresses. + /// + /// This allows passing multiple tuples of `(delegator_address, withdraw_address)`. + /// It does not overwrite existing entries. + pub fn set_withdraw_addresses( + &mut self, + withdraw_addresses: impl IntoIterator, impl Into)>, + ) { + for (d, w) in withdraw_addresses { + self.set_withdraw_address(d, w); + } + } + + pub fn clear_withdraw_addresses(&mut self) { + self.withdraw_addresses.clear(); } pub fn query(&self, request: &DistributionQuery) -> QuerierResult { @@ -1480,12 +1524,8 @@ mod tests { #[cfg(feature = "cosmwasm_1_3")] #[test] fn distribution_querier_delegator_withdraw_address() { - let mut distribution = DistributionQuerier::new(HashMap::new()); - distribution.set_withdraw_addresses( - [("addr0".to_string(), "withdraw0".to_string())] - .into_iter() - .collect(), - ); + let mut distribution = DistributionQuerier::default(); + distribution.set_withdraw_address("addr0", "withdraw0"); let query = DistributionQuery::DelegatorWithdrawAddress { delegator_address: "addr0".to_string(), From 3e3c9eece27e2e224e9401cd5ce91e7109056599 Mon Sep 17 00:00:00 2001 From: Till Ziegler Date: Fri, 23 Jun 2023 17:33:40 +0200 Subject: [PATCH 0470/2372] add FundCommunityPool distribution message --- packages/std/src/results/cosmos_msg.rs | 44 ++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index 3e93ba1868..ccd5c97084 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -111,6 +111,12 @@ pub enum DistributionMsg { /// The `validator_address` validator: String, }, + /// This is translated to a [[MsgFundCommunityPool](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#LL69C1-L76C2). + /// `depositor` is automatically filled with the current contract's address. + FundCommunityPool { + /// The amount to spend + amount: Vec, + }, } fn binary_to_string(data: &Binary, fmt: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { @@ -462,6 +468,44 @@ mod tests { ); } } + + #[test] + fn msg_distribution_serializes_to_correct_json() { + + // FundCommunityPool + let fund_coins = vec![ + coin(200, "feathers"), + coin(200, "stones"), + ]; + let fund_msg = DistributionMsg::FundCommunityPool{ + amount: fund_coins, + }; + let fund_json = to_binary(&fund_msg).unwrap(); + assert_eq!( + String::from_utf8_lossy(&fund_json), + r#"{"fund_community_pool":{"amount":[{"denom":"feathers","amount":"200"},{"denom":"stones","amount":"200"}]}}"#, + ); + + // SetWithdrawAddress + let set_msg = DistributionMsg::SetWithdrawAddress{ + address: String::from("withdrawer"), + }; + let set_json = to_binary(&set_msg).unwrap(); + assert_eq!( + String::from_utf8_lossy(&set_json), + r#"{"set_withdraw_address":{"address":"withdrawer"}}"#, + ); + + // WithdrawDelegatorRewards + let withdraw_msg = DistributionMsg::WithdrawDelegatorReward{ + validator: String::from("fancyoperator"), + }; + let withdraw_json = to_binary(&withdraw_msg).unwrap(); + assert_eq!( + String::from_utf8_lossy(&withdraw_json), + r#"{"withdraw_delegator_reward":{"validator":"fancyoperator"}}"# + ); + } #[test] fn wasm_msg_debug_decodes_binary_string_when_possible() { From faf9ee7fbc443489093d9a4d0b028019cb823dce Mon Sep 17 00:00:00 2001 From: Till Ziegler Date: Wed, 28 Jun 2023 01:56:13 +0200 Subject: [PATCH 0471/2372] add unreleased changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 40aec8c334..6cbe5face8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ and this project adheres to ## [Unreleased] +- cosmwasm-std: Add `DistributionMsg::FundCommunityPool` ([#1747]) + ### Added - cosmwasm-std: Implement `BankQuery::AllDenomMetadata` to allow querying all From d4af1b0645e2962d7d6785f5c76d11fc4f8d2d87 Mon Sep 17 00:00:00 2001 From: Till Ziegler Date: Wed, 28 Jun 2023 01:59:13 +0200 Subject: [PATCH 0472/2372] Commit Suggested Changes Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/std/src/results/cosmos_msg.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index ccd5c97084..2da661292b 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -113,6 +113,7 @@ pub enum DistributionMsg { }, /// This is translated to a [[MsgFundCommunityPool](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#LL69C1-L76C2). /// `depositor` is automatically filled with the current contract's address. + #[cfg(feature = "cosmwasm_1_3")] FundCommunityPool { /// The amount to spend amount: Vec, From 021617f0c5e4907a19390b82c86037c70f02ed06 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 28 Jun 2023 14:47:13 +0200 Subject: [PATCH 0473/2372] Format code --- packages/std/src/results/cosmos_msg.rs | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index 2da661292b..cf5c61e91e 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -115,9 +115,9 @@ pub enum DistributionMsg { /// `depositor` is automatically filled with the current contract's address. #[cfg(feature = "cosmwasm_1_3")] FundCommunityPool { - /// The amount to spend - amount: Vec, - }, + /// The amount to spend + amount: Vec, + }, } fn binary_to_string(data: &Binary, fmt: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { @@ -469,26 +469,20 @@ mod tests { ); } } - + #[test] fn msg_distribution_serializes_to_correct_json() { - // FundCommunityPool - let fund_coins = vec![ - coin(200, "feathers"), - coin(200, "stones"), - ]; - let fund_msg = DistributionMsg::FundCommunityPool{ - amount: fund_coins, - }; + let fund_coins = vec![coin(200, "feathers"), coin(200, "stones")]; + let fund_msg = DistributionMsg::FundCommunityPool { amount: fund_coins }; let fund_json = to_binary(&fund_msg).unwrap(); assert_eq!( String::from_utf8_lossy(&fund_json), r#"{"fund_community_pool":{"amount":[{"denom":"feathers","amount":"200"},{"denom":"stones","amount":"200"}]}}"#, ); - + // SetWithdrawAddress - let set_msg = DistributionMsg::SetWithdrawAddress{ + let set_msg = DistributionMsg::SetWithdrawAddress { address: String::from("withdrawer"), }; let set_json = to_binary(&set_msg).unwrap(); @@ -496,9 +490,9 @@ mod tests { String::from_utf8_lossy(&set_json), r#"{"set_withdraw_address":{"address":"withdrawer"}}"#, ); - + // WithdrawDelegatorRewards - let withdraw_msg = DistributionMsg::WithdrawDelegatorReward{ + let withdraw_msg = DistributionMsg::WithdrawDelegatorReward { validator: String::from("fancyoperator"), }; let withdraw_json = to_binary(&withdraw_msg).unwrap(); From ca986c5cd5205e4ec3e0e7a4f965a8c61835c701 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 28 Jun 2023 14:47:26 +0200 Subject: [PATCH 0474/2372] Limit msg_distribution_serializes_to_correct_json to cosmwasm_1_3 --- packages/std/src/results/cosmos_msg.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index cf5c61e91e..9502f3efc6 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -471,6 +471,7 @@ mod tests { } #[test] + #[cfg(feature = "cosmwasm_1_3")] fn msg_distribution_serializes_to_correct_json() { // FundCommunityPool let fund_coins = vec![coin(200, "feathers"), coin(200, "stones")]; From f5886940613a8106b7e8edf55344174254c5d3e5 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 28 Jun 2023 14:52:11 +0200 Subject: [PATCH 0475/2372] Polish CHANGELOG entry and capabilities docs --- CHANGELOG.md | 5 +++-- docs/CAPABILITIES-BUILT-IN.md | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6cbe5face8..4aafbc2baf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,6 @@ and this project adheres to ## [Unreleased] -- cosmwasm-std: Add `DistributionMsg::FundCommunityPool` ([#1747]) - ### Added - cosmwasm-std: Implement `BankQuery::AllDenomMetadata` to allow querying all @@ -18,6 +16,8 @@ and this project adheres to ([#1647]) - cosmwasm-std: Add `DistributionQuery::DelegatorWithdrawAddress`. Also needs the `cosmwasm_1_3` feature (see above). ([#1593]) +- cosmwasm-std: Add `DistributionMsg::FundCommunityPool`. Also needs the + `cosmwasm_1_3` feature (see above). ([#1747]) - cosmwasm-std: Add `FromStr` impl for `Coin`. ([#1684]) - cosmwasm-std: Add `Coins` helper to handle multiple coins. ([#1687]) - cosmwasm-vm: Add `Cache::save_wasm_unchecked` to save Wasm blobs that have @@ -35,6 +35,7 @@ and this project adheres to [#1684]: https://github.com/CosmWasm/cosmwasm/pull/1684 [#1687]: https://github.com/CosmWasm/cosmwasm/pull/1687 [#1727]: https://github.com/CosmWasm/cosmwasm/issues/1727 +[#1747]: https://github.com/CosmWasm/cosmwasm/pull/1747 [#1748]: https://github.com/CosmWasm/cosmwasm/pull/1748 ### Changed diff --git a/docs/CAPABILITIES-BUILT-IN.md b/docs/CAPABILITIES-BUILT-IN.md index 11990c839a..2f2268e4e7 100644 --- a/docs/CAPABILITIES-BUILT-IN.md +++ b/docs/CAPABILITIES-BUILT-IN.md @@ -15,7 +15,7 @@ might define others. CosmWasm `1.1.0` or higher support this. - `cosmwasm_1_2` enables the `GovMsg::VoteWeighted` and `WasmMsg::Instantiate2` messages. Only chains running CosmWasm `1.2.0` or higher support this. -- `cosmwasm_1_3` enables the `BankQuery::AllDenomMetadata` and - `BankQuery::DenomMetadata` queries, as well as - `DistributionQuery::DelegatorWithdrawAddress`. Only chains running CosmWasm - `1.3.0` or higher support this. +- `cosmwasm_1_3` enables the `BankQuery::AllDenomMetadata`, + `BankQuery::DenomMetadata` and `DistributionQuery::DelegatorWithdrawAddress` + queries, as well as `DistributionMsg::FundCommunityPool`. Only chains running + CosmWasm `1.3.0` or higher support this. From 78c9adfeeb29d64e890fa45827ce5de4c9d43eb4 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 7 Jun 2023 11:34:54 +0200 Subject: [PATCH 0476/2372] Port big uint types to bnum --- Cargo.lock | 7 ++ contracts/burner/Cargo.lock | 7 ++ contracts/crypto-verify/Cargo.lock | 7 ++ contracts/cyberpunk/Cargo.lock | 7 ++ contracts/floaty/Cargo.lock | 7 ++ contracts/hackatom/Cargo.lock | 7 ++ contracts/ibc-reflect-send/Cargo.lock | 7 ++ contracts/ibc-reflect/Cargo.lock | 7 ++ contracts/queue/Cargo.lock | 7 ++ contracts/reflect/Cargo.lock | 7 ++ contracts/staking/Cargo.lock | 7 ++ contracts/virus/Cargo.lock | 7 ++ packages/std/Cargo.toml | 1 + packages/std/src/math/decimal256.rs | 2 +- packages/std/src/math/uint256.rs | 67 ++++++++--------- packages/std/src/math/uint512.rs | 104 +++++++++++++------------- 16 files changed, 167 insertions(+), 91 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2a7dafafed..dc3a1c5bf9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -123,6 +123,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bnum" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" + [[package]] name = "bumpalo" version = "3.12.0" @@ -350,6 +356,7 @@ name = "cosmwasm-std" version = "1.2.7" dependencies = [ "base64", + "bnum", "chrono", "cosmwasm-crypto", "cosmwasm-derive", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index ffc5bc3faf..129021b06e 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -91,6 +91,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bnum" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" + [[package]] name = "bumpalo" version = "3.12.0" @@ -215,6 +221,7 @@ name = "cosmwasm-std" version = "1.2.7" dependencies = [ "base64", + "bnum", "cosmwasm-crypto", "cosmwasm-derive", "derivative", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 525807cef8..a4e25b5b03 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -91,6 +91,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bnum" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" + [[package]] name = "bumpalo" version = "3.12.0" @@ -210,6 +216,7 @@ name = "cosmwasm-std" version = "1.2.7" dependencies = [ "base64", + "bnum", "cosmwasm-crypto", "cosmwasm-derive", "derivative", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index b254a657ac..e6ab3c05f3 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -114,6 +114,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bnum" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" + [[package]] name = "bumpalo" version = "3.12.0" @@ -233,6 +239,7 @@ name = "cosmwasm-std" version = "1.2.7" dependencies = [ "base64", + "bnum", "cosmwasm-crypto", "cosmwasm-derive", "derivative", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 7903f0555d..e9932e6158 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -91,6 +91,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bnum" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" + [[package]] name = "bumpalo" version = "3.12.0" @@ -204,6 +210,7 @@ name = "cosmwasm-std" version = "1.2.7" dependencies = [ "base64", + "bnum", "cosmwasm-crypto", "cosmwasm-derive", "derivative", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 77eb0d0e6d..f7ac3df002 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -91,6 +91,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bnum" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" + [[package]] name = "bumpalo" version = "3.12.0" @@ -204,6 +210,7 @@ name = "cosmwasm-std" version = "1.2.7" dependencies = [ "base64", + "bnum", "cosmwasm-crypto", "cosmwasm-derive", "derivative", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 68f519d999..b5688564bc 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -91,6 +91,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bnum" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" + [[package]] name = "bumpalo" version = "3.12.0" @@ -204,6 +210,7 @@ name = "cosmwasm-std" version = "1.2.7" dependencies = [ "base64", + "bnum", "cosmwasm-crypto", "cosmwasm-derive", "derivative", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 06dcdd37bc..1491d26548 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -91,6 +91,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bnum" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" + [[package]] name = "bumpalo" version = "3.12.0" @@ -204,6 +210,7 @@ name = "cosmwasm-std" version = "1.2.7" dependencies = [ "base64", + "bnum", "cosmwasm-crypto", "cosmwasm-derive", "derivative", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index ec0086d567..f4d4dd6354 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -91,6 +91,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bnum" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" + [[package]] name = "bumpalo" version = "3.12.0" @@ -204,6 +210,7 @@ name = "cosmwasm-std" version = "1.2.7" dependencies = [ "base64", + "bnum", "cosmwasm-crypto", "cosmwasm-derive", "derivative", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 90a729bb0d..8099b681ec 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -91,6 +91,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bnum" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" + [[package]] name = "bumpalo" version = "3.12.0" @@ -204,6 +210,7 @@ name = "cosmwasm-std" version = "1.2.7" dependencies = [ "base64", + "bnum", "cosmwasm-crypto", "cosmwasm-derive", "derivative", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 7d8e834d27..0886b36c00 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -91,6 +91,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bnum" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" + [[package]] name = "bumpalo" version = "3.12.0" @@ -204,6 +210,7 @@ name = "cosmwasm-std" version = "1.2.7" dependencies = [ "base64", + "bnum", "cosmwasm-crypto", "cosmwasm-derive", "derivative", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index a55dc46412..d01769b280 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -91,6 +91,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bnum" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" + [[package]] name = "bumpalo" version = "3.12.0" @@ -204,6 +210,7 @@ name = "cosmwasm-std" version = "1.2.7" dependencies = [ "base64", + "bnum", "cosmwasm-crypto", "cosmwasm-derive", "derivative", diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index af772d64e4..fbec9eb810 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -55,6 +55,7 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " serde-json-wasm = { version = "0.5.0" } thiserror = "1.0.26" uint = "0.9.3" +bnum = "=0.7.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] cosmwasm-crypto = { path = "../crypto", version = "1.2.7" } diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 157e7397b7..927c10b616 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -2070,7 +2070,7 @@ mod tests { } #[test] - #[should_panic(expected = "division by zero")] + #[should_panic(expected = "divisor of zero")] fn decimal256_rem_panics_for_zero() { let _ = Decimal256::percent(777) % Decimal256::zero(); } diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index e074be4a45..b770f6614b 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -14,18 +14,9 @@ use crate::errors::{ }; use crate::{forward_ref_partial_eq, impl_mul_fraction, Fraction, Uint128, Uint512, Uint64}; -/// This module is purely a workaround that lets us ignore lints for all the code -/// the `construct_uint!` macro generates. -#[allow(clippy::all)] -mod uints { - uint::construct_uint! { - pub struct U256(4); - } -} - /// Used internally - we don't want to leak this type since we might change /// the implementation in the future. -use uints::U256; +use bnum::types::U256; /// An implementation of u256 that is using strings for JSON encoding/decoding, /// such that the full u256 range can be used for clients that convert JSON numbers to floats, @@ -54,7 +45,7 @@ forward_ref_partial_eq!(Uint256, Uint256); impl Uint256 { pub const MAX: Uint256 = Uint256(U256::MAX); - pub const MIN: Uint256 = Uint256(U256::zero()); + pub const MIN: Uint256 = Uint256(U256::ZERO); /// Creates a Uint256(value) from a big endian representation. It's just an alias for /// [`Uint256::from_be_bytes`]. @@ -67,7 +58,7 @@ impl Uint256 { /// Creates a Uint256(0) #[inline] pub const fn zero() -> Self { - Uint256(U256::zero()) + Uint256(U256::ZERO) } /// Creates a Uint256(1) @@ -95,7 +86,7 @@ impl Uint256 { data[7], data[6], data[5], data[4], data[3], data[2], data[1], data[0], ]), ]; - Self(U256(words)) + Self(U256::from_digits(words)) } #[must_use] @@ -114,7 +105,7 @@ impl Uint256 { data[24], data[25], data[26], data[27], data[28], data[29], data[30], data[31], ]), ]; - Uint256(U256(words)) + Self(U256::from_digits(words)) } /// A conversion from `u128` that, unlike the one provided by the `From` trait, @@ -140,11 +131,12 @@ impl Uint256 { /// Returns a copy of the number as big endian bytes. #[must_use = "this returns the result of the operation, without modifying the original"] pub const fn to_be_bytes(self) -> [u8; 32] { + let words = self.0.digits(); let words = [ - (self.0).0[3].to_be_bytes(), - (self.0).0[2].to_be_bytes(), - (self.0).0[1].to_be_bytes(), - (self.0).0[0].to_be_bytes(), + words[3].to_be_bytes(), + words[2].to_be_bytes(), + words[1].to_be_bytes(), + words[0].to_be_bytes(), ]; unsafe { std::mem::transmute::<[[u8; 8]; 4], [u8; 32]>(words) } } @@ -152,24 +144,24 @@ impl Uint256 { /// Returns a copy of the number as little endian bytes. #[must_use = "this returns the result of the operation, without modifying the original"] pub const fn to_le_bytes(self) -> [u8; 32] { + let words = self.0.digits(); let words = [ - (self.0).0[0].to_le_bytes(), - (self.0).0[1].to_le_bytes(), - (self.0).0[2].to_le_bytes(), - (self.0).0[3].to_le_bytes(), + words[0].to_le_bytes(), + words[1].to_le_bytes(), + words[2].to_le_bytes(), + words[3].to_le_bytes(), ]; unsafe { std::mem::transmute::<[[u8; 8]; 4], [u8; 32]>(words) } } #[must_use] pub const fn is_zero(&self) -> bool { - let words = (self.0).0; - words[0] == 0 && words[1] == 0 && words[2] == 0 && words[3] == 0 + self.0.is_zero() } #[must_use = "this returns the result of the operation, without modifying the original"] pub fn pow(self, exp: u32) -> Self { - let res = self.0.pow(exp.into()); + let res = self.0.pow(exp); Self(res) } @@ -257,7 +249,7 @@ impl Uint256 { pub fn checked_pow(self, exp: u32) -> Result { self.0 - .checked_pow(exp.into()) + .checked_pow(exp) .map(Self) .ok_or_else(|| OverflowError::new(OverflowOperation::Pow, self, exp)) } @@ -320,7 +312,7 @@ impl Uint256 { #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_pow(self, other: u32) -> Self { - let (value, _did_overflow) = self.0.overflowing_pow(other.into()); + let (value, _did_overflow) = self.0.overflowing_pow(other); Self(value) } @@ -427,7 +419,7 @@ impl FromStr for Uint256 { return Err(StdError::generic_err("Parsing u256: received empty string")); } - match U256::from_dec_str(s) { + match U256::from_str_radix(s, 10) { Ok(u) => Ok(Uint256(u)), Err(e) => Err(StdError::generic_err(format!("Parsing u256: {}", e))), } @@ -1047,22 +1039,25 @@ mod tests { #[test] fn uint256_convert_from() { let a = Uint256::from(5u128); - assert_eq!(a.0, U256::from(5)); + assert_eq!(a.0, U256::from(5u32)); let a = Uint256::from(5u64); - assert_eq!(a.0, U256::from(5)); + assert_eq!(a.0, U256::from(5u32)); let a = Uint256::from(5u32); - assert_eq!(a.0, U256::from(5)); + assert_eq!(a.0, U256::from(5u32)); let a = Uint256::from(5u16); - assert_eq!(a.0, U256::from(5)); + assert_eq!(a.0, U256::from(5u32)); let a = Uint256::from(5u8); - assert_eq!(a.0, U256::from(5)); + assert_eq!(a.0, U256::from(5u32)); let result = Uint256::try_from("34567"); - assert_eq!(result.unwrap().0, U256::from_dec_str("34567").unwrap()); + assert_eq!( + result.unwrap().0, + U256::from_str_radix("34567", 10).unwrap() + ); let result = Uint256::try_from("1.23"); assert!(result.is_err()); @@ -1222,7 +1217,7 @@ mod tests { #[test] fn uint256_is_zero_works() { assert!(Uint256::zero().is_zero()); - assert!(Uint256(U256::from(0)).is_zero()); + assert!(Uint256(U256::from(0u32)).is_zero()); assert!(!Uint256::from(1u32).is_zero()); assert!(!Uint256::from(123u32).is_zero()); @@ -1643,7 +1638,7 @@ mod tests { } #[test] - #[should_panic(expected = "division by zero")] + #[should_panic(expected = "divisor of zero")] fn uint256_rem_panics_for_zero() { let _ = Uint256::from(10u32) % Uint256::zero(); } diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index 9b5809d3d0..c44e214b50 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -3,8 +3,8 @@ use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; use std::fmt; use std::ops::{ - Add, AddAssign, Div, DivAssign, Mul, MulAssign, Rem, RemAssign, Shl, ShlAssign, Shr, ShrAssign, - Sub, SubAssign, + Add, AddAssign, Div, DivAssign, Mul, MulAssign, Not, Rem, RemAssign, Shl, ShlAssign, Shr, + ShrAssign, Sub, SubAssign, }; use std::str::FromStr; @@ -13,18 +13,9 @@ use crate::errors::{ }; use crate::{forward_ref_partial_eq, Uint128, Uint256, Uint64}; -/// This module is purely a workaround that lets us ignore lints for all the code -/// the `construct_uint!` macro generates. -#[allow(clippy::all)] -mod uints { - uint::construct_uint! { - pub struct U512(8); - } -} - /// Used internally - we don't want to leak this type since we might change /// the implementation in the future. -use uints::U512; +use bnum::types::U512; /// An implementation of u512 that is using strings for JSON encoding/decoding, /// such that the full u512 range can be used for clients that convert JSON numbers to floats, @@ -57,10 +48,10 @@ forward_ref_partial_eq!(Uint512, Uint512); impl Uint512 { pub const MAX: Uint512 = Uint512(U512::MAX); - pub const MIN: Uint512 = Uint512(U512::zero()); + pub const MIN: Uint512 = Uint512(U512::ZERO); /// Creates a Uint512(value) from a big endian representation. It's just an alias for - /// `from_big_endian`. + /// `from_be_bytes`. pub const fn new(value: [u8; 64]) -> Self { Self::from_be_bytes(value) } @@ -68,7 +59,7 @@ impl Uint512 { /// Creates a Uint512(0) #[inline] pub const fn zero() -> Self { - Uint512(U512::zero()) + Uint512(U512::ZERO) } /// Creates a Uint512(1) @@ -109,7 +100,7 @@ impl Uint512 { data[7], data[6], data[5], data[4], data[3], data[2], data[1], data[0], ]), ]; - Self(U512(words)) + Self(U512::from_digits(words)) } #[must_use] @@ -140,7 +131,7 @@ impl Uint512 { data[56], data[57], data[58], data[59], data[60], data[61], data[62], data[63], ]), ]; - Self(U512(words)) + Self(U512::from_digits(words)) } /// A conversion from `Uint256` that, unlike the one provided by the `From` trait, @@ -161,15 +152,16 @@ impl Uint512 { /// Returns a copy of the number as big endian bytes. #[must_use = "this returns the result of the operation, without modifying the original"] pub const fn to_be_bytes(self) -> [u8; 64] { + let words = self.0.digits(); let words = [ - (self.0).0[7].to_be_bytes(), - (self.0).0[6].to_be_bytes(), - (self.0).0[5].to_be_bytes(), - (self.0).0[4].to_be_bytes(), - (self.0).0[3].to_be_bytes(), - (self.0).0[2].to_be_bytes(), - (self.0).0[1].to_be_bytes(), - (self.0).0[0].to_be_bytes(), + words[7].to_be_bytes(), + words[6].to_be_bytes(), + words[5].to_be_bytes(), + words[4].to_be_bytes(), + words[3].to_be_bytes(), + words[2].to_be_bytes(), + words[1].to_be_bytes(), + words[0].to_be_bytes(), ]; unsafe { std::mem::transmute::<[[u8; 8]; 8], [u8; 64]>(words) } } @@ -177,35 +169,28 @@ impl Uint512 { /// Returns a copy of the number as little endian bytes. #[must_use = "this returns the result of the operation, without modifying the original"] pub const fn to_le_bytes(self) -> [u8; 64] { + let words = self.0.digits(); let words = [ - (self.0).0[0].to_le_bytes(), - (self.0).0[1].to_le_bytes(), - (self.0).0[2].to_le_bytes(), - (self.0).0[3].to_le_bytes(), - (self.0).0[4].to_le_bytes(), - (self.0).0[5].to_le_bytes(), - (self.0).0[6].to_le_bytes(), - (self.0).0[7].to_le_bytes(), + words[0].to_le_bytes(), + words[1].to_le_bytes(), + words[2].to_le_bytes(), + words[3].to_le_bytes(), + words[4].to_le_bytes(), + words[5].to_le_bytes(), + words[6].to_le_bytes(), + words[7].to_le_bytes(), ]; unsafe { std::mem::transmute::<[[u8; 8]; 8], [u8; 64]>(words) } } #[must_use] pub const fn is_zero(&self) -> bool { - let words = (self.0).0; - words[0] == 0 - && words[1] == 0 - && words[2] == 0 - && words[3] == 0 - && words[4] == 0 - && words[5] == 0 - && words[6] == 0 - && words[7] == 0 + self.0.is_zero() } #[must_use = "this returns the result of the operation, without modifying the original"] pub fn pow(self, exp: u32) -> Self { - let res = self.0.pow(exp.into()); + let res = self.0.pow(exp); Self(res) } @@ -232,7 +217,7 @@ impl Uint512 { pub fn checked_pow(self, exp: u32) -> Result { self.0 - .checked_pow(exp.into()) + .checked_pow(exp) .map(Self) .ok_or_else(|| OverflowError::new(OverflowOperation::Pow, self, exp)) } @@ -295,7 +280,7 @@ impl Uint512 { #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_pow(self, other: u32) -> Self { - let (value, _did_overflow) = self.0.overflowing_pow(other.into()); + let (value, _did_overflow) = self.0.overflowing_pow(other); Self(value) } @@ -424,7 +409,7 @@ impl FromStr for Uint512 { type Err = StdError; fn from_str(s: &str) -> Result { - match U512::from_dec_str(s) { + match U512::from_str_radix(s, 10) { Ok(u) => Ok(Self(u)), Err(e) => Err(StdError::generic_err(format!("Parsing u512: {}", e))), } @@ -508,6 +493,14 @@ impl Rem for Uint512 { } forward_ref_binop!(impl Rem, rem for Uint512, Uint512); +impl Not for Uint512 { + type Output = Self; + + fn not(self) -> Self::Output { + Self(!self.0) + } +} + impl RemAssign for Uint512 { fn rem_assign(&mut self, rhs: Uint512) { *self = *self % rhs; @@ -743,22 +736,25 @@ mod tests { #[test] fn uint512_convert_from() { let a = Uint512::from(5u128); - assert_eq!(a.0, U512::from(5)); + assert_eq!(a.0, U512::from(5u32)); let a = Uint512::from(5u64); - assert_eq!(a.0, U512::from(5)); + assert_eq!(a.0, U512::from(5u32)); let a = Uint512::from(5u32); - assert_eq!(a.0, U512::from(5)); + assert_eq!(a.0, U512::from(5u32)); let a = Uint512::from(5u16); - assert_eq!(a.0, U512::from(5)); + assert_eq!(a.0, U512::from(5u32)); let a = Uint512::from(5u8); - assert_eq!(a.0, U512::from(5)); + assert_eq!(a.0, U512::from(5u32)); let result = Uint512::try_from("34567"); - assert_eq!(result.unwrap().0, U512::from_dec_str("34567").unwrap()); + assert_eq!( + result.unwrap().0, + U512::from_str_radix("34567", 10).unwrap() + ); let result = Uint512::try_from("1.23"); assert!(result.is_err()); @@ -936,7 +932,7 @@ mod tests { #[test] fn uint512_is_zero_works() { assert!(Uint512::zero().is_zero()); - assert!(Uint512(U512::from(0)).is_zero()); + assert!(Uint512(U512::from(0u32)).is_zero()); assert!(!Uint512::from(1u32).is_zero()); assert!(!Uint512::from(123u32).is_zero()); @@ -1301,7 +1297,7 @@ mod tests { } #[test] - #[should_panic(expected = "division by zero")] + #[should_panic(expected = "divisor of zero")] fn uint512_rem_panics_for_zero() { let _ = Uint512::from(10u32) % Uint512::zero(); } From 6b9b234cc0f283abd12daf6f451d0a153ea5c796 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 7 Jun 2023 12:07:02 +0200 Subject: [PATCH 0477/2372] Implement Int512 --- packages/std/src/lib.rs | 4 +- packages/std/src/math/int512.rs | 1293 +++++++++++++++++++++++++++++++ packages/std/src/math/mod.rs | 3 + 3 files changed, 1298 insertions(+), 2 deletions(-) create mode 100644 packages/std/src/math/int512.rs diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 28dfcc9ec1..e05f1b4eb1 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -52,8 +52,8 @@ pub use crate::ibc::{ #[cfg(feature = "iterator")] pub use crate::iterator::{Order, Record}; pub use crate::math::{ - Decimal, Decimal256, Decimal256RangeExceeded, DecimalRangeExceeded, Fraction, Isqrt, Uint128, - Uint256, Uint512, Uint64, + Decimal, Decimal256, Decimal256RangeExceeded, DecimalRangeExceeded, Fraction, Int512, Isqrt, + Uint128, Uint256, Uint512, Uint64, }; pub use crate::metadata::{DenomMetadata, DenomUnit}; pub use crate::never::Never; diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs new file mode 100644 index 0000000000..ddf1a89675 --- /dev/null +++ b/packages/std/src/math/int512.rs @@ -0,0 +1,1293 @@ +use forward_ref::{forward_ref_binop, forward_ref_op_assign}; +use schemars::JsonSchema; +use serde::{de, ser, Deserialize, Deserializer, Serialize}; +use std::fmt; +use std::ops::{ + Add, AddAssign, Div, DivAssign, Mul, MulAssign, Not, Rem, RemAssign, Shr, ShrAssign, Sub, + SubAssign, +}; +use std::str::FromStr; + +use crate::errors::{ + ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, StdError, +}; +use crate::{forward_ref_partial_eq, Uint128, Uint256, Uint64}; + +/// Used internally - we don't want to leak this type since we might change +/// the implementation in the future. +use bnum::types::{I512, U512}; + +/// An implementation of u512 that is using strings for JSON encoding/decoding, +/// such that the full u512 range can be used for clients that convert JSON numbers to floats, +/// like JavaScript and jq. +/// +/// # Examples +/// +/// Use `from` to create instances out of primitive uint types or `new` to provide big +/// endian bytes: +/// +/// ``` +/// # use cosmwasm_std::Int512; +/// let a = Int512::from(258u128); +/// let b = Int512::new([ +/// 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, +/// 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, +/// 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, +/// 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, +/// 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, +/// 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, +/// 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, +/// 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 2u8, +/// ]); +/// assert_eq!(a, b); +/// ``` +#[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] +pub struct Int512(#[schemars(with = "String")] I512); + +forward_ref_partial_eq!(Int512, Int512); + +impl Int512 { + pub const MAX: Int512 = Int512(I512::MAX); + pub const MIN: Int512 = Int512(I512::MIN); + + /// Creates a Int512(value) from a big endian representation. It's just an alias for + /// `from_be_bytes`. + pub const fn new(value: [u8; 64]) -> Self { + Self::from_be_bytes(value) + } + + /// Creates a Int512(0) + #[inline] + pub const fn zero() -> Self { + Int512(I512::ZERO) + } + + /// Creates a Int512(1) + #[inline] + pub const fn one() -> Self { + Self::from_be_bytes([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, + ]) + } + + #[must_use] + pub const fn from_be_bytes(data: [u8; 64]) -> Self { + let words: [u64; 8] = [ + u64::from_le_bytes([ + data[63], data[62], data[61], data[60], data[59], data[58], data[57], data[56], + ]), + u64::from_le_bytes([ + data[55], data[54], data[53], data[52], data[51], data[50], data[49], data[48], + ]), + u64::from_le_bytes([ + data[47], data[46], data[45], data[44], data[43], data[42], data[41], data[40], + ]), + u64::from_le_bytes([ + data[39], data[38], data[37], data[36], data[35], data[34], data[33], data[32], + ]), + u64::from_le_bytes([ + data[31], data[30], data[29], data[28], data[27], data[26], data[25], data[24], + ]), + u64::from_le_bytes([ + data[23], data[22], data[21], data[20], data[19], data[18], data[17], data[16], + ]), + u64::from_le_bytes([ + data[15], data[14], data[13], data[12], data[11], data[10], data[9], data[8], + ]), + u64::from_le_bytes([ + data[7], data[6], data[5], data[4], data[3], data[2], data[1], data[0], + ]), + ]; + Self(I512::from_bits(U512::from_digits(words))) + } + + #[must_use] + pub const fn from_le_bytes(data: [u8; 64]) -> Self { + let words: [u64; 8] = [ + u64::from_le_bytes([ + data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], + ]), + u64::from_le_bytes([ + data[8], data[9], data[10], data[11], data[12], data[13], data[14], data[15], + ]), + u64::from_le_bytes([ + data[16], data[17], data[18], data[19], data[20], data[21], data[22], data[23], + ]), + u64::from_le_bytes([ + data[24], data[25], data[26], data[27], data[28], data[29], data[30], data[31], + ]), + u64::from_le_bytes([ + data[32], data[33], data[34], data[35], data[36], data[37], data[38], data[39], + ]), + u64::from_le_bytes([ + data[40], data[41], data[42], data[43], data[44], data[45], data[46], data[47], + ]), + u64::from_le_bytes([ + data[48], data[49], data[50], data[51], data[52], data[53], data[54], data[55], + ]), + u64::from_le_bytes([ + data[56], data[57], data[58], data[59], data[60], data[61], data[62], data[63], + ]), + ]; + Self(I512::from_bits(U512::from_digits(words))) + } + + /// A conversion from `Uint256` that, unlike the one provided by the `From` trait, + /// can be used in a `const` context. + #[must_use] + pub const fn from_uint256(num: Uint256) -> Self { + let bytes = num.to_le_bytes(); + Self::from_le_bytes([ + bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7], + bytes[8], bytes[9], bytes[10], bytes[11], bytes[12], bytes[13], bytes[14], bytes[15], + bytes[16], bytes[17], bytes[18], bytes[19], bytes[20], bytes[21], bytes[22], bytes[23], + bytes[24], bytes[25], bytes[26], bytes[27], bytes[28], bytes[29], bytes[30], bytes[31], + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + ]) + } + + /// Returns a copy of the number as big endian bytes. + #[must_use = "this returns the result of the operation, without modifying the original"] + pub const fn to_be_bytes(self) -> [u8; 64] { + let bits = self.0.to_bits(); + let words = bits.digits(); + let words = [ + words[7].to_be_bytes(), + words[6].to_be_bytes(), + words[5].to_be_bytes(), + words[4].to_be_bytes(), + words[3].to_be_bytes(), + words[2].to_be_bytes(), + words[1].to_be_bytes(), + words[0].to_be_bytes(), + ]; + unsafe { std::mem::transmute::<[[u8; 8]; 8], [u8; 64]>(words) } + } + + /// Returns a copy of the number as little endian bytes. + #[must_use = "this returns the result of the operation, without modifying the original"] + pub const fn to_le_bytes(self) -> [u8; 64] { + let bits = self.0.to_bits(); + let words = bits.digits(); + let words = [ + words[0].to_le_bytes(), + words[1].to_le_bytes(), + words[2].to_le_bytes(), + words[3].to_le_bytes(), + words[4].to_le_bytes(), + words[5].to_le_bytes(), + words[6].to_le_bytes(), + words[7].to_le_bytes(), + ]; + unsafe { std::mem::transmute::<[[u8; 8]; 8], [u8; 64]>(words) } + } + + #[must_use] + pub const fn is_zero(&self) -> bool { + self.0.is_zero() + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn pow(self, exp: u32) -> Self { + let res = self.0.pow(exp); + Self(res) + } + + pub fn checked_add(self, other: Self) -> Result { + self.0 + .checked_add(other.0) + .map(Self) + .ok_or_else(|| OverflowError::new(OverflowOperation::Add, self, other)) + } + + pub fn checked_sub(self, other: Self) -> Result { + self.0 + .checked_sub(other.0) + .map(Self) + .ok_or_else(|| OverflowError::new(OverflowOperation::Sub, self, other)) + } + + pub fn checked_mul(self, other: Self) -> Result { + self.0 + .checked_mul(other.0) + .map(Self) + .ok_or_else(|| OverflowError::new(OverflowOperation::Mul, self, other)) + } + + pub fn checked_pow(self, exp: u32) -> Result { + self.0 + .checked_pow(exp) + .map(Self) + .ok_or_else(|| OverflowError::new(OverflowOperation::Pow, self, exp)) + } + + pub fn checked_div(self, other: Self) -> Result { + self.0 + .checked_div(other.0) + .map(Self) + .ok_or_else(|| DivideByZeroError::new(self)) + } + + pub fn checked_div_euclid(self, other: Self) -> Result { + self.checked_div(other) + } + + pub fn checked_rem(self, other: Self) -> Result { + self.0 + .checked_rem(other.0) + .map(Self) + .ok_or_else(|| DivideByZeroError::new(self)) + } + + pub fn checked_shr(self, other: u32) -> Result { + if other >= 512 { + return Err(OverflowError::new(OverflowOperation::Shr, self, other)); + } + + Ok(Self(self.0.shr(other))) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + #[inline] + pub fn wrapping_add(self, other: Self) -> Self { + let (value, _did_overflow) = self.0.overflowing_add(other.0); + Self(value) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + #[inline] + pub fn wrapping_sub(self, other: Self) -> Self { + let (value, _did_overflow) = self.0.overflowing_sub(other.0); + Self(value) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + #[inline] + pub fn wrapping_mul(self, other: Self) -> Self { + let (value, _did_overflow) = self.0.overflowing_mul(other.0); + Self(value) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + #[inline] + pub fn wrapping_pow(self, other: u32) -> Self { + let (value, _did_overflow) = self.0.overflowing_pow(other); + Self(value) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn saturating_add(self, other: Self) -> Self { + Self(self.0.saturating_add(other.0)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn saturating_sub(self, other: Self) -> Self { + Self(self.0.saturating_sub(other.0)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn saturating_mul(self, other: Self) -> Self { + Self(self.0.saturating_mul(other.0)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn saturating_pow(self, exp: u32) -> Self { + match self.checked_pow(exp) { + Ok(value) => value, + Err(_) => Self::MAX, + } + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn abs_diff(self, other: Self) -> Self { + if self < other { + other - self + } else { + self - other + } + } +} + +impl From for Int512 { + fn from(val: Uint256) -> Self { + let bytes = [[0u8; 32], val.to_be_bytes()].concat(); + + Self::from_be_bytes(bytes.try_into().unwrap()) + } +} + +impl From for Int512 { + fn from(val: Uint128) -> Self { + val.u128().into() + } +} + +impl From for Int512 { + fn from(val: Uint64) -> Self { + val.u64().into() + } +} + +impl From for Int512 { + fn from(val: u128) -> Self { + Int512(val.into()) + } +} + +impl From for Int512 { + fn from(val: u64) -> Self { + Int512(val.into()) + } +} + +impl From for Int512 { + fn from(val: u32) -> Self { + Int512(val.into()) + } +} + +impl From for Int512 { + fn from(val: u16) -> Self { + Int512(val.into()) + } +} + +impl From for Int512 { + fn from(val: u8) -> Self { + Int512(val.into()) + } +} + +impl From for Int512 { + fn from(val: i128) -> Self { + Int512(val.into()) + } +} + +impl From for Int512 { + fn from(val: i64) -> Self { + Int512(val.into()) + } +} + +impl From for Int512 { + fn from(val: i32) -> Self { + Int512(val.into()) + } +} + +impl From for Int512 { + fn from(val: i16) -> Self { + Int512(val.into()) + } +} + +impl From for Int512 { + fn from(val: i8) -> Self { + Int512(val.into()) + } +} + +// impl TryFrom for Int256 { +// type Error = ConversionOverflowError; + +// fn try_from(value: Int512) -> Result { +// let bytes = value.to_be_bytes(); +// let (first_bytes, last_bytes) = bytes.split_at(32); + +// if first_bytes != [0u8; 32] { +// return Err(ConversionOverflowError::new( +// "Int512", +// "Uint256", +// value.to_string(), +// )); +// } + +// Ok(Self::from_be_bytes(last_bytes.try_into().unwrap())) +// } +// } + +// impl TryFrom for Int128 { +// type Error = ConversionOverflowError; + +// fn try_from(value: Int512) -> Result { +// Ok(Uint128::new(value.0.try_into().map_err(|_| { +// ConversionOverflowError::new("Int512", "Uint128", value.to_string()) +// })?)) +// } +// } + +impl TryFrom<&str> for Int512 { + type Error = StdError; + + fn try_from(val: &str) -> Result { + Self::from_str(val) + } +} + +impl FromStr for Int512 { + type Err = StdError; + + fn from_str(s: &str) -> Result { + match I512::from_str_radix(s, 10) { + Ok(u) => Ok(Self(u)), + Err(e) => Err(StdError::generic_err(format!("Parsing u512: {}", e))), + } + } +} + +impl From for String { + fn from(original: Int512) -> Self { + original.to_string() + } +} + +impl fmt::Display for Int512 { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + // The inner type doesn't work as expected with padding, so we + // work around that. + let unpadded = self.0.to_string(); + + f.pad_integral(true, "", &unpadded) + } +} + +impl Add for Int512 { + type Output = Self; + + fn add(self, rhs: Self) -> Self { + Int512(self.0.checked_add(rhs.0).unwrap()) + } +} + +impl<'a> Add<&'a Int512> for Int512 { + type Output = Self; + + fn add(self, rhs: &'a Int512) -> Self { + Int512(self.0.checked_add(rhs.0).unwrap()) + } +} + +impl Sub for Int512 { + type Output = Self; + + fn sub(self, rhs: Self) -> Self { + Int512(self.0.checked_sub(rhs.0).unwrap()) + } +} +forward_ref_binop!(impl Sub, sub for Int512, Int512); + +impl SubAssign for Int512 { + fn sub_assign(&mut self, rhs: Int512) { + self.0 = self.0.checked_sub(rhs.0).unwrap(); + } +} +forward_ref_op_assign!(impl SubAssign, sub_assign for Int512, Int512); + +impl Div for Int512 { + type Output = Self; + + fn div(self, rhs: Self) -> Self::Output { + Self(self.0.checked_div(rhs.0).unwrap()) + } +} + +impl<'a> Div<&'a Int512> for Int512 { + type Output = Self; + + fn div(self, rhs: &'a Int512) -> Self::Output { + Self(self.0.checked_div(rhs.0).unwrap()) + } +} + +impl Rem for Int512 { + type Output = Self; + + /// # Panics + /// + /// This operation will panic if `rhs` is zero. + #[inline] + fn rem(self, rhs: Self) -> Self { + Self(self.0.rem(rhs.0)) + } +} +forward_ref_binop!(impl Rem, rem for Int512, Int512); + +impl Not for Int512 { + type Output = Self; + + fn not(self) -> Self::Output { + Self(!self.0) + } +} + +impl RemAssign for Int512 { + fn rem_assign(&mut self, rhs: Int512) { + *self = *self % rhs; + } +} +forward_ref_op_assign!(impl RemAssign, rem_assign for Int512, Int512); + +impl Mul for Int512 { + type Output = Self; + + fn mul(self, rhs: Self) -> Self::Output { + Self(self.0.checked_mul(rhs.0).unwrap()) + } +} +forward_ref_binop!(impl Mul, mul for Int512, Int512); + +impl MulAssign for Int512 { + fn mul_assign(&mut self, rhs: Self) { + self.0 = self.0.checked_mul(rhs.0).unwrap(); + } +} +forward_ref_op_assign!(impl MulAssign, mul_assign for Int512, Int512); + +impl Shr for Int512 { + type Output = Self; + + fn shr(self, rhs: u32) -> Self::Output { + self.checked_shr(rhs).unwrap_or_else(|_| { + panic!( + "right shift error: {} is larger or equal than the number of bits in Int512", + rhs, + ) + }) + } +} + +impl<'a> Shr<&'a u32> for Int512 { + type Output = Self; + + fn shr(self, rhs: &'a u32) -> Self::Output { + Shr::::shr(self, *rhs) + } +} + +impl AddAssign for Int512 { + fn add_assign(&mut self, rhs: Int512) { + self.0 = self.0.checked_add(rhs.0).unwrap(); + } +} + +impl<'a> AddAssign<&'a Int512> for Int512 { + fn add_assign(&mut self, rhs: &'a Int512) { + self.0 = self.0.checked_add(rhs.0).unwrap(); + } +} + +impl DivAssign for Int512 { + fn div_assign(&mut self, rhs: Self) { + self.0 = self.0.checked_div(rhs.0).unwrap(); + } +} + +impl<'a> DivAssign<&'a Int512> for Int512 { + fn div_assign(&mut self, rhs: &'a Int512) { + self.0 = self.0.checked_div(rhs.0).unwrap(); + } +} + +impl ShrAssign for Int512 { + fn shr_assign(&mut self, rhs: u32) { + *self = Shr::::shr(*self, rhs); + } +} + +impl<'a> ShrAssign<&'a u32> for Int512 { + fn shr_assign(&mut self, rhs: &'a u32) { + *self = Shr::::shr(*self, *rhs); + } +} + +impl Serialize for Int512 { + /// Serializes as an integer string using base 10 + fn serialize(&self, serializer: S) -> Result + where + S: ser::Serializer, + { + serializer.serialize_str(&self.to_string()) + } +} + +impl<'de> Deserialize<'de> for Int512 { + /// Deserialized from an integer string using base 10 + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_str(Int512Visitor) + } +} + +struct Int512Visitor; + +impl<'de> de::Visitor<'de> for Int512Visitor { + type Value = Int512; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("string-encoded integer") + } + + fn visit_str(self, v: &str) -> Result + where + E: de::Error, + { + Int512::try_from(v).map_err(|e| E::custom(format!("invalid Int512 '{}' - {}", v, e))) + } +} + +impl
std::iter::Sum for Int512 +where + Self: Add, +{ + fn sum>(iter: I) -> Self { + iter.fold(Self::zero(), Add::add) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{from_slice, to_vec}; + + #[test] + fn size_of_works() { + assert_eq!(std::mem::size_of::(), 64); + } + + #[test] + fn int512_new_works() { + let num = Int512::new([1; 64]); + let a: [u8; 64] = num.to_be_bytes(); + assert_eq!(a, [1; 64]); + + let be_bytes = [ + 0u8, 222u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 2u8, 3u8, + ]; + let num = Int512::new(be_bytes); + let resulting_bytes: [u8; 64] = num.to_be_bytes(); + assert_eq!(be_bytes, resulting_bytes); + } + + #[test] + fn int512_zero_works() { + let zero = Int512::zero(); + assert_eq!( + zero.to_be_bytes(), + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 + ] + ); + } + + #[test] + fn uin512_one_works() { + let one = Int512::one(); + assert_eq!( + one.to_be_bytes(), + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1 + ] + ); + } + + #[test] + fn int512_endianness() { + let be_bytes = [ + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 2u8, 3u8, + ]; + let le_bytes = [ + 3u8, 2u8, 1u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + ]; + + // These should all be the same. + let num1 = Int512::new(be_bytes); + let num2 = Int512::from_be_bytes(be_bytes); + let num3 = Int512::from_le_bytes(le_bytes); + assert_eq!(num1, Int512::from(65536u32 + 512 + 3)); + assert_eq!(num1, num2); + assert_eq!(num1, num3); + } + + #[test] + fn int512_convert_from() { + let a = Int512::from(5u128); + assert_eq!(a.0, I512::from(5u32)); + + let a = Int512::from(5u64); + assert_eq!(a.0, I512::from(5u32)); + + let a = Int512::from(5u32); + assert_eq!(a.0, I512::from(5u32)); + + let a = Int512::from(5u16); + assert_eq!(a.0, I512::from(5u32)); + + let a = Int512::from(5u8); + assert_eq!(a.0, I512::from(5u32)); + + let result = Int512::try_from("34567"); + assert_eq!( + result.unwrap().0, + I512::from_str_radix("34567", 10).unwrap() + ); + + let result = Int512::try_from("1.23"); + assert!(result.is_err()); + } + + // #[test] + // fn int512_convert_to_uint128() { + // let source = Int512::from(42u128); + // let target = Uint128::try_from(source); + // assert_eq!(target, Ok(Uint128::new(42u128))); + + // let source = Int512::MAX; + // let target = Uint128::try_from(source); + // assert_eq!( + // target, + // Err(ConversionOverflowError::new( + // "Int512", + // "Uint128", + // Int512::MAX.to_string() + // )) + // ); + // } + + #[test] + fn int512_from_uint256() { + assert_eq!( + Int512::from_uint256(Uint256::from_str("123").unwrap()), + Int512::from_str("123").unwrap() + ); + + assert_eq!( + Int512::from_uint256(Uint256::from_str("9785746283745").unwrap()), + Int512::from_str("9785746283745").unwrap() + ); + + assert_eq!( + Int512::from_uint256( + Uint256::from_str( + "97857462837575757832978493758398593853985452378423874623874628736482736487236" + ) + .unwrap() + ), + Int512::from_str( + "97857462837575757832978493758398593853985452378423874623874628736482736487236" + ) + .unwrap() + ); + } + + #[test] + fn int512_implements_display() { + let a = Int512::from(12345u32); + assert_eq!(format!("Embedded: {}", a), "Embedded: 12345"); + assert_eq!(a.to_string(), "12345"); + + let a = Int512::zero(); + assert_eq!(format!("Embedded: {}", a), "Embedded: 0"); + assert_eq!(a.to_string(), "0"); + } + + #[test] + fn int512_display_padding_works() { + let a = Int512::from(123u64); + assert_eq!(format!("Embedded: {:05}", a), "Embedded: 00123"); + } + + #[test] + fn int512_to_be_bytes_works() { + assert_eq!( + Int512::zero().to_be_bytes(), + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + ] + ); + assert_eq!( + Int512::MAX.to_be_bytes(), + [ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + ] + ); + assert_eq!( + Int512::from(1u128).to_be_bytes(), + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1 + ] + ); + // Python: `[b for b in (240282366920938463463374607431768124608).to_bytes(64, "big")]` + assert_eq!( + Int512::from(240282366920938463463374607431768124608u128).to_be_bytes(), + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, 196, 179, 87, 165, + 121, 59, 133, 246, 117, 221, 191, 255, 254, 172, 192 + ] + ); + assert_eq!( + Int512::from_be_bytes([ + 17, 4, 23, 32, 87, 67, 123, 200, 58, 91, 0, 38, 33, 21, 67, 78, 87, 76, 65, 54, + 211, 201, 192, 7, 42, 233, 2, 240, 200, 115, 150, 240, 218, 88, 106, 45, 208, 134, + 238, 119, 85, 22, 14, 88, 166, 195, 154, 73, 64, 10, 44, 59, 13, 22, 47, 12, 99, 8, + 252, 96, 230, 187, 38, 29 + ]) + .to_be_bytes(), + [ + 17, 4, 23, 32, 87, 67, 123, 200, 58, 91, 0, 38, 33, 21, 67, 78, 87, 76, 65, 54, + 211, 201, 192, 7, 42, 233, 2, 240, 200, 115, 150, 240, 218, 88, 106, 45, 208, 134, + 238, 119, 85, 22, 14, 88, 166, 195, 154, 73, 64, 10, 44, 59, 13, 22, 47, 12, 99, 8, + 252, 96, 230, 187, 38, 29 + ] + ); + } + + #[test] + fn int512_to_le_bytes_works() { + assert_eq!( + Int512::zero().to_le_bytes(), + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 + ] + ); + assert_eq!( + Int512::MAX.to_le_bytes(), + [ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f + ] + ); + assert_eq!( + Int512::from(1u128).to_le_bytes(), + [ + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 + ] + ); + // Python: `[b for b in (240282366920938463463374607431768124608).to_bytes(64, "little")]` + assert_eq!( + Int512::from(240282366920938463463374607431768124608u128).to_le_bytes(), + [ + 192, 172, 254, 255, 191, 221, 117, 246, 133, 59, 121, 165, 87, 179, 196, 180, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + ); + assert_eq!( + Int512::from_be_bytes([ + 17, 4, 23, 32, 87, 67, 123, 200, 58, 91, 0, 38, 33, 21, 67, 78, 87, 76, 65, 54, + 211, 201, 192, 7, 42, 233, 2, 240, 200, 115, 150, 240, 218, 88, 106, 45, 208, 134, + 238, 119, 85, 22, 14, 88, 166, 195, 154, 73, 64, 10, 44, 59, 13, 22, 47, 12, 99, 8, + 252, 96, 230, 187, 38, 29 + ]) + .to_le_bytes(), + [ + 29, 38, 187, 230, 96, 252, 8, 99, 12, 47, 22, 13, 59, 44, 10, 64, 73, 154, 195, + 166, 88, 14, 22, 85, 119, 238, 134, 208, 45, 106, 88, 218, 240, 150, 115, 200, 240, + 2, 233, 42, 7, 192, 201, 211, 54, 65, 76, 87, 78, 67, 21, 33, 38, 0, 91, 58, 200, + 123, 67, 87, 32, 23, 4, 17 + ] + ); + } + + #[test] + fn int512_is_zero_works() { + assert!(Int512::zero().is_zero()); + assert!(Int512(I512::from(0u32)).is_zero()); + + assert!(!Int512::from(1u32).is_zero()); + assert!(!Int512::from(123u32).is_zero()); + } + + #[test] + fn int512_wrapping_methods() { + // wrapping_add + assert_eq!( + Int512::from(2u32).wrapping_add(Int512::from(2u32)), + Int512::from(4u32) + ); // non-wrapping + assert_eq!(Int512::MAX.wrapping_add(Int512::from(1u32)), Int512::MIN); // wrapping + + // wrapping_sub + assert_eq!( + Int512::from(7u32).wrapping_sub(Int512::from(5u32)), + Int512::from(2u32) + ); // non-wrapping + assert_eq!(Int512::MIN.wrapping_sub(Int512::from(1u32)), Int512::MAX); // wrapping + + // wrapping_mul + assert_eq!( + Int512::from(3u32).wrapping_mul(Int512::from(2u32)), + Int512::from(6u32) + ); // non-wrapping + assert_eq!( + Int512::MAX.wrapping_mul(Int512::from(2u32)), + Int512::from(-2i32) + ); // wrapping + + // wrapping_pow + assert_eq!(Int512::from(2u32).wrapping_pow(3), Int512::from(8u32)); // non-wrapping + assert_eq!(Int512::MAX.wrapping_pow(2), Int512::from(1u32)); // wrapping + } + + #[test] + fn int512_json() { + let orig = Int512::from(1234567890987654321u128); + let serialized = to_vec(&orig).unwrap(); + assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); + let parsed: Int512 = from_slice(&serialized).unwrap(); + assert_eq!(parsed, orig); + } + + #[test] + fn int512_compare() { + let a = Int512::from(12345u32); + let b = Int512::from(23456u32); + + assert!(a < b); + assert!(b > a); + assert_eq!(a, Int512::from(12345u32)); + } + + #[test] + #[allow(clippy::op_ref)] + fn int512_math() { + let a = Int512::from(12345u32); + let b = Int512::from(23456u32); + + // test + with owned and reference right hand side + assert_eq!(a + b, Int512::from(35801u32)); + assert_eq!(a + &b, Int512::from(35801u32)); + + // test - with owned and reference right hand side + assert_eq!(b - a, Int512::from(11111u32)); + assert_eq!(b - &a, Int512::from(11111u32)); + + // test += with owned and reference right hand side + let mut c = Int512::from(300000u32); + c += b; + assert_eq!(c, Int512::from(323456u32)); + let mut d = Int512::from(300000u32); + d += &b; + assert_eq!(d, Int512::from(323456u32)); + + // test -= with owned and reference right hand side + let mut c = Int512::from(300000u32); + c -= b; + assert_eq!(c, Int512::from(276544u32)); + let mut d = Int512::from(300000u32); + d -= &b; + assert_eq!(d, Int512::from(276544u32)); + + // test - with negative result + assert_eq!(a - b, Int512::from(-11111i32)); + } + + #[test] + #[should_panic] + fn int512_add_overflow_panics() { + let _ = Int512::MAX + Int512::from(12u32); + } + + #[test] + #[allow(clippy::op_ref)] + fn int512_sub_works() { + assert_eq!(Int512::from(2u32) - Int512::from(1u32), Int512::from(1u32)); + assert_eq!(Int512::from(2u32) - Int512::from(0u32), Int512::from(2u32)); + assert_eq!(Int512::from(2u32) - Int512::from(2u32), Int512::from(0u32)); + + // works for refs + let a = Int512::from(10u32); + let b = Int512::from(3u32); + let expected = Int512::from(7u32); + assert_eq!(a - b, expected); + assert_eq!(a - &b, expected); + assert_eq!(&a - b, expected); + assert_eq!(&a - &b, expected); + } + + #[test] + #[should_panic] + fn int512_sub_overflow_panics() { + let _ = Int512::MIN + Int512::one() - Int512::from(2u32); + } + + #[test] + fn int512_sub_assign_works() { + let mut a = Int512::from(14u32); + a -= Int512::from(2u32); + assert_eq!(a, Int512::from(12u32)); + + // works for refs + let mut a = Int512::from(10u32); + let b = Int512::from(3u32); + let expected = Int512::from(7u32); + a -= &b; + assert_eq!(a, expected); + } + + #[test] + #[allow(clippy::op_ref)] + fn int512_mul_works() { + assert_eq!(Int512::from(2u32) * Int512::from(3u32), Int512::from(6u32)); + assert_eq!(Int512::from(2u32) * Int512::zero(), Int512::zero()); + + // works for refs + let a = Int512::from(11u32); + let b = Int512::from(3u32); + let expected = Int512::from(33u32); + assert_eq!(a * b, expected); + assert_eq!(a * &b, expected); + assert_eq!(&a * b, expected); + assert_eq!(&a * &b, expected); + } + + #[test] + fn int512_mul_assign_works() { + let mut a = Int512::from(14u32); + a *= Int512::from(2u32); + assert_eq!(a, Int512::from(28u32)); + + // works for refs + let mut a = Int512::from(10u32); + let b = Int512::from(3u32); + a *= &b; + assert_eq!(a, Int512::from(30u32)); + } + + #[test] + fn int512_pow_works() { + assert_eq!(Int512::from(2u32).pow(2), Int512::from(4u32)); + assert_eq!(Int512::from(2u32).pow(10), Int512::from(1024u32)); + } + + #[test] + #[should_panic] + fn int512_pow_overflow_panics() { + _ = Int512::MAX.pow(2u32); + } + + #[test] + fn int512_shr_works() { + let original = Int512::new([ + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 2u8, 0u8, 4u8, 2u8, + ]); + + let shifted = Int512::new([ + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 128u8, 1u8, 0u8, + ]); + + assert_eq!(original >> 2u32, shifted); + } + + #[test] + #[should_panic] + fn int512_shr_overflow_panics() { + let _ = Int512::from(1u32) >> 512u32; + } + + #[test] + fn sum_works() { + let nums = vec![ + Int512::from(17u32), + Int512::from(123u32), + Int512::from(540u32), + Int512::from(82u32), + ]; + let expected = Int512::from(762u32); + + let sum_as_ref: Int512 = nums.iter().sum(); + assert_eq!(expected, sum_as_ref); + + let sum_as_owned: Int512 = nums.into_iter().sum(); + assert_eq!(expected, sum_as_owned); + } + + #[test] + fn int512_methods() { + // checked_* + assert!(matches!( + Int512::MAX.checked_add(Int512::from(1u32)), + Err(OverflowError { .. }) + )); + assert_eq!( + Int512::from(1u32).checked_add(Int512::from(1u32)), + Ok(Int512::from(2u32)), + ); + assert!(matches!( + Int512::MIN.checked_sub(Int512::from(1u32)), + Err(OverflowError { .. }) + )); + assert_eq!( + Int512::from(2u32).checked_sub(Int512::from(1u32)), + Ok(Int512::from(1u32)), + ); + assert!(matches!( + Int512::MAX.checked_mul(Int512::from(2u32)), + Err(OverflowError { .. }) + )); + assert_eq!( + Int512::from(2u32).checked_mul(Int512::from(2u32)), + Ok(Int512::from(4u32)), + ); + assert!(matches!( + Int512::MAX.checked_pow(2u32), + Err(OverflowError { .. }) + )); + assert_eq!(Int512::from(2u32).checked_pow(3u32), Ok(Int512::from(8u32)),); + assert!(matches!( + Int512::MAX.checked_div(Int512::from(0u32)), + Err(DivideByZeroError { .. }) + )); + assert_eq!( + Int512::from(6u32).checked_div(Int512::from(2u32)), + Ok(Int512::from(3u32)), + ); + assert!(matches!( + Int512::MAX.checked_div_euclid(Int512::from(0u32)), + Err(DivideByZeroError { .. }) + )); + assert_eq!( + Int512::from(6u32).checked_div_euclid(Int512::from(2u32)), + Ok(Int512::from(3u32)), + ); + assert_eq!( + Int512::from(7u32).checked_div_euclid(Int512::from(2u32)), + Ok(Int512::from(3u32)), + ); + assert!(matches!( + Int512::MAX.checked_rem(Int512::from(0u32)), + Err(DivideByZeroError { .. }) + )); + + // saturating_* + assert_eq!(Int512::MAX.saturating_add(Int512::from(1u32)), Int512::MAX); + assert_eq!(Int512::MIN.saturating_sub(Int512::from(1u32)), Int512::MIN); + assert_eq!(Int512::MAX.saturating_mul(Int512::from(2u32)), Int512::MAX); + assert_eq!(Int512::from(4u32).saturating_pow(2u32), Int512::from(16u32)); + assert_eq!(Int512::MAX.saturating_pow(2u32), Int512::MAX); + } + + #[test] + #[allow(clippy::op_ref)] + fn int512_implements_rem() { + let a = Int512::from(10u32); + assert_eq!(a % Int512::from(10u32), Int512::zero()); + assert_eq!(a % Int512::from(2u32), Int512::zero()); + assert_eq!(a % Int512::from(1u32), Int512::zero()); + assert_eq!(a % Int512::from(3u32), Int512::from(1u32)); + assert_eq!(a % Int512::from(4u32), Int512::from(2u32)); + + // works for refs + let a = Int512::from(10u32); + let b = Int512::from(3u32); + let expected = Int512::from(1u32); + assert_eq!(a % b, expected); + assert_eq!(a % &b, expected); + assert_eq!(&a % b, expected); + assert_eq!(&a % &b, expected); + } + + #[test] + #[should_panic(expected = "divisor of zero")] + fn int512_rem_panics_for_zero() { + let _ = Int512::from(10u32) % Int512::zero(); + } + + #[test] + #[allow(clippy::op_ref)] + fn int512_rem_works() { + assert_eq!( + Int512::from(12u32) % Int512::from(10u32), + Int512::from(2u32) + ); + assert_eq!(Int512::from(50u32) % Int512::from(5u32), Int512::zero()); + + // works for refs + let a = Int512::from(42u32); + let b = Int512::from(5u32); + let expected = Int512::from(2u32); + assert_eq!(a % b, expected); + assert_eq!(a % &b, expected); + assert_eq!(&a % b, expected); + assert_eq!(&a % &b, expected); + } + + #[test] + fn int512_rem_assign_works() { + let mut a = Int512::from(30u32); + a %= Int512::from(4u32); + assert_eq!(a, Int512::from(2u32)); + + // works for refs + let mut a = Int512::from(25u32); + let b = Int512::from(6u32); + a %= &b; + assert_eq!(a, Int512::from(1u32)); + } + + #[test] + fn int512_abs_diff_works() { + let a = Int512::from(42u32); + let b = Int512::from(5u32); + let expected = Int512::from(37u32); + assert_eq!(a.abs_diff(b), expected); + assert_eq!(b.abs_diff(a), expected); + } + + #[test] + fn int512_partial_eq() { + let test_cases = [(1, 1, true), (42, 42, true), (42, 24, false), (0, 0, true)] + .into_iter() + .map(|(lhs, rhs, expected): (u64, u64, bool)| { + (Int512::from(lhs), Int512::from(rhs), expected) + }); + + #[allow(clippy::op_ref)] + for (lhs, rhs, expected) in test_cases { + assert_eq!(lhs == rhs, expected); + assert_eq!(&lhs == rhs, expected); + assert_eq!(lhs == &rhs, expected); + assert_eq!(&lhs == &rhs, expected); + } + } +} diff --git a/packages/std/src/math/mod.rs b/packages/std/src/math/mod.rs index 72e55d9f1d..ee514f36b8 100644 --- a/packages/std/src/math/mod.rs +++ b/packages/std/src/math/mod.rs @@ -1,6 +1,7 @@ mod decimal; mod decimal256; mod fraction; +mod int512; mod isqrt; mod uint128; mod uint256; @@ -10,6 +11,7 @@ mod uint64; pub use decimal::{Decimal, DecimalRangeExceeded}; pub use decimal256::{Decimal256, Decimal256RangeExceeded}; pub use fraction::Fraction; +pub use int512::Int512; pub use isqrt::Isqrt; pub use uint128::Uint128; pub use uint256::Uint256; @@ -68,6 +70,7 @@ mod tests { impl AllImpl<'_> for Uint128 {} impl AllImpl<'_> for Uint256 {} impl AllImpl<'_> for Uint512 {} + impl AllImpl<'_> for Int512 {} impl IntImpl<'_> for Uint64 {} impl IntImpl<'_> for Uint128 {} impl IntImpl<'_> for Uint256 {} From 1f157e7e7fcd0593980d9db511cd69593eee5ed9 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 7 Jun 2023 15:12:11 +0200 Subject: [PATCH 0478/2372] Update ci rust version --- .circleci/config.yml | 144 +++++++++++++++++++++---------------------- 1 file changed, 72 insertions(+), 72 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ff5bb17087..ab1f977075 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -72,7 +72,7 @@ workflows: matrix: parameters: # Run with MSRV and some modern stable Rust - rust-version: ["1.60.0", "1.68.2"] + rust-version: ["1.65.0", "1.68.2"] - benchmarking: requires: - package_vm @@ -117,7 +117,7 @@ jobs: command: | wget https://static.rust-lang.org/rustup/dist/aarch64-unknown-linux-gnu/rustup-init chmod +x rustup-init - ./rustup-init -y --default-toolchain 1.60.0 --profile minimal + ./rustup-init -y --default-toolchain 1.65.0 --profile minimal - run: name: Version information command: rustc --version; cargo --version; rustup --version; rustup target list --installed @@ -126,12 +126,12 @@ jobs: command: rustup target add wasm32-unknown-unknown && rustup target list --installed - restore_cache: keys: - - v4-arm64-workspace-rust:1.60.0-{{ checksum "Cargo.lock" }} - - v4-arm64-workspace-rust:1.60.0- + - v4-arm64-workspace-rust:1.65.0-{{ checksum "Cargo.lock" }} + - v4-arm64-workspace-rust:1.65.0- - restore_cache: keys: - - v4-arm64-contracts-rust:1.60.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} - - v4-arm64-contracts-rust:1.60.0- + - v4-arm64-contracts-rust:1.65.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} + - v4-arm64-contracts-rust:1.65.0- # Test a few contracts that do something potentially interesting in the VM # to test contract execution on ARM64. # No need to add all contracts here. @@ -169,14 +169,14 @@ jobs: # use all features command: cargo test --locked --features iterator,staking,stargate - save_cache: - key: v4-arm64-workspace-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: v4-arm64-workspace-rust:1.65.0-{{ checksum "Cargo.lock" }} paths: - ~/.cargo/registry - target/debug/.fingerprint - target/debug/build - target/debug/deps - save_cache: - key: v4-arm64-contracts-rust:1.60.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} + key: v4-arm64-contracts-rust:1.65.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} paths: - ~/.cargo/registry # crypto-verify @@ -217,7 +217,7 @@ jobs: package_crypto: docker: - - image: rust:1.60.0 + - image: rust:1.65.0 steps: - checkout - run: @@ -225,7 +225,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_crypto-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_crypto-rust:1.65.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/crypto @@ -240,11 +240,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_crypto-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_crypto-rust:1.65.0-{{ checksum "Cargo.lock" }} package_check: docker: - - image: rust:1.60.0 + - image: rust:1.65.0 steps: - checkout - run: @@ -252,7 +252,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_check-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_check-rust:1.65.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/check @@ -267,11 +267,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_check-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_check-rust:1.65.0-{{ checksum "Cargo.lock" }} package_schema: docker: - - image: rust:1.60.0 + - image: rust:1.65.0 steps: - checkout - run: @@ -279,7 +279,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_schema-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_schema-rust:1.65.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/schema @@ -294,11 +294,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_schema-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_schema-rust:1.65.0-{{ checksum "Cargo.lock" }} package_schema_derive: docker: - - image: rust:1.60.0 + - image: rust:1.65.0 steps: - checkout - run: @@ -306,7 +306,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_schema_derive-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_schema_derive-rust:1.65.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/schema-derive @@ -321,11 +321,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_schema_derive-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_schema_derive-rust:1.65.0-{{ checksum "Cargo.lock" }} package_std: docker: - - image: rust:1.60.0 + - image: rust:1.65.0 environment: # Limit the number of parallel jobs to avoid OOM crashes during doc testing RUST_TEST_THREADS: 8 @@ -336,7 +336,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_std-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_std-rust:1.65.0-{{ checksum "Cargo.lock" }} - run: name: Add wasm32 target command: rustup target add wasm32-unknown-unknown && rustup target list --installed @@ -370,11 +370,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_std-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_std-rust:1.65.0-{{ checksum "Cargo.lock" }} package_storage: docker: - - image: rust:1.60.0 + - image: rust:1.65.0 steps: - checkout - run: @@ -382,7 +382,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_storage-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_storage-rust:1.65.0-{{ checksum "Cargo.lock" }} - run: name: Build library for native target working_directory: ~/project/packages/storage @@ -401,11 +401,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_storage-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_storage-rust:1.65.0-{{ checksum "Cargo.lock" }} package_vm: docker: - - image: rust:1.60.0 + - image: rust:1.65.0 steps: - checkout - run: @@ -413,7 +413,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_vm-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_vm-rust:1.65.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/vm @@ -442,7 +442,7 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_vm-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_vm-rust:1.65.0-{{ checksum "Cargo.lock" }} package_vm_windows: executor: @@ -490,7 +490,7 @@ jobs: contract_burner: docker: - - image: rust:1.60.0 + - image: rust:1.65.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/burner @@ -502,7 +502,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_burner-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_burner-rust:1.65.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -513,11 +513,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_burner-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_burner-rust:1.65.0-{{ checksum "Cargo.lock" }} contract_crypto_verify: docker: - - image: rust:1.60.0 + - image: rust:1.65.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/crypto-verify @@ -529,7 +529,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_crypto_verify-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_crypto_verify-rust:1.65.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -540,11 +540,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_crypto_verify-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_crypto_verify-rust:1.65.0-{{ checksum "Cargo.lock" }} contract_cyberpunk: docker: - - image: rust:1.60.0 + - image: rust:1.65.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/cyberpunk @@ -556,7 +556,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_cyberpunk-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_cyberpunk-rust:1.65.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -567,11 +567,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_cyberpunk-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_cyberpunk-rust:1.65.0-{{ checksum "Cargo.lock" }} contract_hackatom: docker: - - image: rust:1.60.0 + - image: rust:1.65.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/hackatom @@ -583,7 +583,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_hackatom-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_hackatom-rust:1.65.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -594,11 +594,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_hackatom-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_hackatom-rust:1.65.0-{{ checksum "Cargo.lock" }} contract_ibc_reflect: docker: - - image: rust:1.60.0 + - image: rust:1.65.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/ibc-reflect @@ -610,7 +610,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_ibc_reflect-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_ibc_reflect-rust:1.65.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -621,11 +621,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_ibc_reflect-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_ibc_reflect-rust:1.65.0-{{ checksum "Cargo.lock" }} contract_ibc_reflect_send: docker: - - image: rust:1.60.0 + - image: rust:1.65.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/ibc-reflect-send @@ -637,7 +637,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_ibc_reflect_send-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_ibc_reflect_send-rust:1.65.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -648,11 +648,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_ibc_reflect_send-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_ibc_reflect_send-rust:1.65.0-{{ checksum "Cargo.lock" }} contract_floaty: docker: - - image: rust:1.60.0 + - image: rust:1.65.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/floaty @@ -664,7 +664,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_floaty-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_floaty-rust:1.65.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -675,11 +675,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_floaty-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_floaty-rust:1.65.0-{{ checksum "Cargo.lock" }} contract_queue: docker: - - image: rust:1.60.0 + - image: rust:1.65.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/queue @@ -691,7 +691,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_queue-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_queue-rust:1.65.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -702,11 +702,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_queue-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_queue-rust:1.65.0-{{ checksum "Cargo.lock" }} contract_reflect: docker: - - image: rust:1.60.0 + - image: rust:1.65.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/reflect @@ -718,7 +718,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_reflect-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_reflect-rust:1.65.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -729,11 +729,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_reflect-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_reflect-rust:1.65.0-{{ checksum "Cargo.lock" }} contract_staking: docker: - - image: rust:1.60.0 + - image: rust:1.65.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/staking @@ -745,7 +745,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_staking-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_staking-rust:1.65.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -756,11 +756,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_staking-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_staking-rust:1.65.0-{{ checksum "Cargo.lock" }} contract_virus: docker: - - image: rust:1.60.0 + - image: rust:1.65.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/virus @@ -772,7 +772,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_virus-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_virus-rust:1.65.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -783,11 +783,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_virus-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_virus-rust:1.65.0-{{ checksum "Cargo.lock" }} fmt: docker: - - image: rust:1.60.0 + - image: rust:1.65.0 steps: - checkout - run: @@ -795,7 +795,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-fmt-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-fmt-rust:1.65.0-{{ checksum "Cargo.lock" }} - run: name: Add rustfmt component command: rustup component add rustfmt @@ -808,7 +808,7 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-fmt-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-fmt-rust:1.65.0-{{ checksum "Cargo.lock" }} fmt_extra: docker: @@ -830,7 +830,7 @@ jobs: deadlinks: docker: - - image: rust:1.60.0 + - image: rust:1.65.0 steps: - checkout - run: @@ -838,7 +838,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-deadlinks-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-deadlinks-rust:1.65.0-{{ checksum "Cargo.lock" }} - run: name: Generate docs command: cargo doc @@ -858,7 +858,7 @@ jobs: - target/debug/build - target/debug/deps - /root/.cache/pip - key: cargocache-v2-deadlinks-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-deadlinks-rust:1.65.0-{{ checksum "Cargo.lock" }} clippy: parameters: @@ -934,7 +934,7 @@ jobs: benchmarking: docker: - - image: rust:1.60.0 + - image: rust:1.65.0 environment: RUST_BACKTRACE: 1 steps: @@ -944,7 +944,7 @@ jobs: command: rustc --version && cargo --version - restore_cache: keys: - - cargocache-v2-benchmarking-rust:1.60.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-benchmarking-rust:1.65.0-{{ checksum "Cargo.lock" }} - run: name: Run vm benchmarks (Singlepass) working_directory: ~/project/packages/vm @@ -962,7 +962,7 @@ jobs: - target/release/.fingerprint - target/release/build - target/release/deps - key: cargocache-v2-benchmarking-rust:1.60.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-benchmarking-rust:1.65.0-{{ checksum "Cargo.lock" }} coverage: # https://circleci.com/developer/images?imageType=machine @@ -1034,7 +1034,7 @@ jobs: name: Check development contracts command: | echo "Checking all contracts under ./artifacts" - docker run --volumes-from with_code rust:1.60.0 \ + docker run --volumes-from with_code rust:1.65.0 \ /bin/bash -e -c 'export GLOBIGNORE="artifacts/floaty.wasm"; cd ./code; cargo run --bin cosmwasm-check artifacts/*.wasm' docker cp with_code:/code/artifacts . - run: From 560d1d9769d1babaf8b689cf9533133b5e62bbef Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 7 Jun 2023 16:21:32 +0200 Subject: [PATCH 0479/2372] Disable coverage check temporarily --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ab1f977075..ddd1d20bf1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -85,7 +85,7 @@ workflows: - /^[0-9]+\.[0-9]+$/ # Add your branch here if benchmarking matters to your work - fix-benchmarking - - coverage + # - coverage # disabled temporarily because Rust version is too low deploy: jobs: - build_and_upload_devcontracts: From ee059cd76fb41b3509d9341ee222c08392a9a5b7 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 7 Jun 2023 16:43:35 +0200 Subject: [PATCH 0480/2372] Simplify uint impls --- packages/std/src/math/uint256.rs | 35 ++++++++------------------ packages/std/src/math/uint512.rs | 43 ++++++++++---------------------- 2 files changed, 23 insertions(+), 55 deletions(-) diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index b770f6614b..8e329e20c7 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -39,7 +39,7 @@ use bnum::types::U256; /// assert_eq!(a, b); /// ``` #[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] -pub struct Uint256(#[schemars(with = "String")] U256); +pub struct Uint256(#[schemars(with = "String")] pub(crate) U256); forward_ref_partial_eq!(Uint256, Uint256); @@ -58,16 +58,13 @@ impl Uint256 { /// Creates a Uint256(0) #[inline] pub const fn zero() -> Self { - Uint256(U256::ZERO) + Self(U256::ZERO) } /// Creates a Uint256(1) #[inline] pub const fn one() -> Self { - Self::from_be_bytes([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, - ]) + Self(U256::ONE) } #[must_use] @@ -161,8 +158,7 @@ impl Uint256 { #[must_use = "this returns the result of the operation, without modifying the original"] pub fn pow(self, exp: u32) -> Self { - let res = self.0.pow(exp); - Self(res) + Self(self.0.pow(exp)) } /// Returns `self * numerator / denominator`. @@ -291,29 +287,25 @@ impl Uint256 { #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_add(self, other: Self) -> Self { - let (value, _did_overflow) = self.0.overflowing_add(other.0); - Self(value) + Self(self.0.wrapping_add(other.0)) } #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_sub(self, other: Self) -> Self { - let (value, _did_overflow) = self.0.overflowing_sub(other.0); - Self(value) + Self(self.0.wrapping_sub(other.0)) } #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_mul(self, other: Self) -> Self { - let (value, _did_overflow) = self.0.overflowing_mul(other.0); - Self(value) + Self(self.0.wrapping_mul(other.0)) } #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_pow(self, other: u32) -> Self { - let (value, _did_overflow) = self.0.overflowing_pow(other); - Self(value) + Self(self.0.wrapping_pow(other)) } #[must_use = "this returns the result of the operation, without modifying the original"] @@ -333,19 +325,12 @@ impl Uint256 { #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_pow(self, exp: u32) -> Self { - match self.checked_pow(exp) { - Ok(value) => value, - Err(_) => Self::MAX, - } + Self(self.0.saturating_pow(exp)) } #[must_use = "this returns the result of the operation, without modifying the original"] pub fn abs_diff(self, other: Self) -> Self { - if self < other { - other - self - } else { - self - other - } + Self(self.0.abs_diff(other.0)) } } diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index c44e214b50..b3f1f278cf 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -42,7 +42,7 @@ use bnum::types::U512; /// assert_eq!(a, b); /// ``` #[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] -pub struct Uint512(#[schemars(with = "String")] U512); +pub struct Uint512(#[schemars(with = "String")] pub(crate) U512); forward_ref_partial_eq!(Uint512, Uint512); @@ -65,11 +65,7 @@ impl Uint512 { /// Creates a Uint512(1) #[inline] pub const fn one() -> Self { - Self::from_be_bytes([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - ]) + Self(U512::ONE) } #[must_use] @@ -190,8 +186,7 @@ impl Uint512 { #[must_use = "this returns the result of the operation, without modifying the original"] pub fn pow(self, exp: u32) -> Self { - let res = self.0.pow(exp); - Self(res) + Self(self.0.pow(exp)) } pub fn checked_add(self, other: Self) -> Result { @@ -241,11 +236,10 @@ impl Uint512 { } pub fn checked_shr(self, other: u32) -> Result { - if other >= 512 { - return Err(OverflowError::new(OverflowOperation::Shr, self, other)); - } - - Ok(Self(self.0.shr(other))) + self.0 + .checked_shr(other) + .map(Self) + .ok_or_else(|| OverflowError::new(OverflowOperation::Shr, self, other)) } pub fn checked_shl(self, other: u32) -> Result { @@ -259,29 +253,25 @@ impl Uint512 { #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_add(self, other: Self) -> Self { - let (value, _did_overflow) = self.0.overflowing_add(other.0); - Self(value) + Self(self.0.wrapping_add(other.0)) } #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_sub(self, other: Self) -> Self { - let (value, _did_overflow) = self.0.overflowing_sub(other.0); - Self(value) + Self(self.0.wrapping_sub(other.0)) } #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_mul(self, other: Self) -> Self { - let (value, _did_overflow) = self.0.overflowing_mul(other.0); - Self(value) + Self(self.0.wrapping_mul(other.0)) } #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_pow(self, other: u32) -> Self { - let (value, _did_overflow) = self.0.overflowing_pow(other); - Self(value) + Self(self.0.wrapping_pow(other)) } #[must_use = "this returns the result of the operation, without modifying the original"] @@ -301,19 +291,12 @@ impl Uint512 { #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_pow(self, exp: u32) -> Self { - match self.checked_pow(exp) { - Ok(value) => value, - Err(_) => Self::MAX, - } + Self(self.0.saturating_pow(exp)) } #[must_use = "this returns the result of the operation, without modifying the original"] pub fn abs_diff(self, other: Self) -> Self { - if self < other { - other - self - } else { - self - other - } + Self(self.0.abs_diff(other.0)) } } From 77be691886a96dcd186f248805a25572da4bf5a2 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 9 Jun 2023 09:56:28 +0200 Subject: [PATCH 0481/2372] Cleanup int512 --- packages/std/src/math/int512.rs | 133 ++++---------------------------- 1 file changed, 14 insertions(+), 119 deletions(-) diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index ddf1a89675..7533c8dcd8 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -8,17 +8,15 @@ use std::ops::{ }; use std::str::FromStr; -use crate::errors::{ - ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, StdError, -}; -use crate::{forward_ref_partial_eq, Uint128, Uint256, Uint64}; +use crate::errors::{DivideByZeroError, OverflowError, OverflowOperation, StdError}; +use crate::{forward_ref_partial_eq, Uint128, Uint256, Uint512, Uint64}; /// Used internally - we don't want to leak this type since we might change /// the implementation in the future. use bnum::types::{I512, U512}; -/// An implementation of u512 that is using strings for JSON encoding/decoding, -/// such that the full u512 range can be used for clients that convert JSON numbers to floats, +/// An implementation of i512 that is using strings for JSON encoding/decoding, +/// such that the full i512 range can be used for clients that convert JSON numbers to floats, /// like JavaScript and jq. /// /// # Examples @@ -65,11 +63,7 @@ impl Int512 { /// Creates a Int512(1) #[inline] pub const fn one() -> Self { - Self::from_be_bytes([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - ]) + Self(I512::ONE) } #[must_use] @@ -134,21 +128,6 @@ impl Int512 { Self(I512::from_bits(U512::from_digits(words))) } - /// A conversion from `Uint256` that, unlike the one provided by the `From` trait, - /// can be used in a `const` context. - #[must_use] - pub const fn from_uint256(num: Uint256) -> Self { - let bytes = num.to_le_bytes(); - Self::from_le_bytes([ - bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7], - bytes[8], bytes[9], bytes[10], bytes[11], bytes[12], bytes[13], bytes[14], bytes[15], - bytes[16], bytes[17], bytes[18], bytes[19], bytes[20], bytes[21], bytes[22], bytes[23], - bytes[24], bytes[25], bytes[26], bytes[27], bytes[28], bytes[29], bytes[30], bytes[31], - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, - ]) - } - /// Returns a copy of the number as big endian bytes. #[must_use = "this returns the result of the operation, without modifying the original"] pub const fn to_be_bytes(self) -> [u8; 64] { @@ -192,8 +171,7 @@ impl Int512 { #[must_use = "this returns the result of the operation, without modifying the original"] pub fn pow(self, exp: u32) -> Self { - let res = self.0.pow(exp); - Self(res) + Self(self.0.pow(exp)) } pub fn checked_add(self, other: Self) -> Result { @@ -253,22 +231,19 @@ impl Int512 { #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_add(self, other: Self) -> Self { - let (value, _did_overflow) = self.0.overflowing_add(other.0); - Self(value) + Self(self.0.wrapping_add(other.0)) } #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_sub(self, other: Self) -> Self { - let (value, _did_overflow) = self.0.overflowing_sub(other.0); - Self(value) + Self(self.0.wrapping_sub(other.0)) } #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_mul(self, other: Self) -> Self { - let (value, _did_overflow) = self.0.overflowing_mul(other.0); - Self(value) + Self(self.0.wrapping_mul(other.0)) } #[must_use = "this returns the result of the operation, without modifying the original"] @@ -295,19 +270,12 @@ impl Int512 { #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_pow(self, exp: u32) -> Self { - match self.checked_pow(exp) { - Ok(value) => value, - Err(_) => Self::MAX, - } + Self(self.0.saturating_pow(exp)) } #[must_use = "this returns the result of the operation, without modifying the original"] - pub fn abs_diff(self, other: Self) -> Self { - if self < other { - other - self - } else { - self - other - } + pub fn abs_diff(self, other: Self) -> Uint512 { + Uint512(self.0.abs_diff(other.0)) } } @@ -391,35 +359,6 @@ impl From for Int512 { } } -// impl TryFrom for Int256 { -// type Error = ConversionOverflowError; - -// fn try_from(value: Int512) -> Result { -// let bytes = value.to_be_bytes(); -// let (first_bytes, last_bytes) = bytes.split_at(32); - -// if first_bytes != [0u8; 32] { -// return Err(ConversionOverflowError::new( -// "Int512", -// "Uint256", -// value.to_string(), -// )); -// } - -// Ok(Self::from_be_bytes(last_bytes.try_into().unwrap())) -// } -// } - -// impl TryFrom for Int128 { -// type Error = ConversionOverflowError; - -// fn try_from(value: Int512) -> Result { -// Ok(Uint128::new(value.0.try_into().map_err(|_| { -// ConversionOverflowError::new("Int512", "Uint128", value.to_string()) -// })?)) -// } -// } - impl TryFrom<&str> for Int512 { type Error = StdError; @@ -434,7 +373,7 @@ impl FromStr for Int512 { fn from_str(s: &str) -> Result { match I512::from_str_radix(s, 10) { Ok(u) => Ok(Self(u)), - Err(e) => Err(StdError::generic_err(format!("Parsing u512: {}", e))), + Err(e) => Err(StdError::generic_err(format!("Parsing i512: {}", e))), } } } @@ -754,50 +693,6 @@ mod tests { assert!(result.is_err()); } - // #[test] - // fn int512_convert_to_uint128() { - // let source = Int512::from(42u128); - // let target = Uint128::try_from(source); - // assert_eq!(target, Ok(Uint128::new(42u128))); - - // let source = Int512::MAX; - // let target = Uint128::try_from(source); - // assert_eq!( - // target, - // Err(ConversionOverflowError::new( - // "Int512", - // "Uint128", - // Int512::MAX.to_string() - // )) - // ); - // } - - #[test] - fn int512_from_uint256() { - assert_eq!( - Int512::from_uint256(Uint256::from_str("123").unwrap()), - Int512::from_str("123").unwrap() - ); - - assert_eq!( - Int512::from_uint256(Uint256::from_str("9785746283745").unwrap()), - Int512::from_str("9785746283745").unwrap() - ); - - assert_eq!( - Int512::from_uint256( - Uint256::from_str( - "97857462837575757832978493758398593853985452378423874623874628736482736487236" - ) - .unwrap() - ), - Int512::from_str( - "97857462837575757832978493758398593853985452378423874623874628736482736487236" - ) - .unwrap() - ); - } - #[test] fn int512_implements_display() { let a = Int512::from(12345u32); @@ -1269,7 +1164,7 @@ mod tests { fn int512_abs_diff_works() { let a = Int512::from(42u32); let b = Int512::from(5u32); - let expected = Int512::from(37u32); + let expected = Uint512::from(37u32); assert_eq!(a.abs_diff(b), expected); assert_eq!(b.abs_diff(a), expected); } From 776d6295ce93c4f97b1319b461c955878725ce51 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 9 Jun 2023 11:00:51 +0200 Subject: [PATCH 0482/2372] Update rust in github workflow --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1d50ccbda5..3a83bedddb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,7 +33,7 @@ jobs: - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: 1.60.0 + toolchain: 1.65.0 target: wasm32-unknown-unknown profile: minimal override: true From 92ef1c64cf13b3e947fae2c8f6016f207efc34d3 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 12 Jun 2023 12:59:34 +0200 Subject: [PATCH 0483/2372] Improve int512 tests --- packages/std/src/math/int512.rs | 89 ++++++++++++++++++++++++--------- 1 file changed, 64 insertions(+), 25 deletions(-) diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index 7533c8dcd8..a7877f9f69 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -683,6 +683,21 @@ mod tests { let a = Int512::from(5u8); assert_eq!(a.0, I512::from(5u32)); + let a = Int512::from(-5i128); + assert_eq!(a.0, I512::from(-5i32)); + + let a = Int512::from(-5i64); + assert_eq!(a.0, I512::from(-5i32)); + + let a = Int512::from(-5i32); + assert_eq!(a.0, I512::from(-5i32)); + + let a = Int512::from(-5i16); + assert_eq!(a.0, I512::from(-5i32)); + + let a = Int512::from(-5i8); + assert_eq!(a.0, I512::from(-5i32)); + let result = Int512::try_from("34567"); assert_eq!( result.unwrap().0, @@ -699,6 +714,10 @@ mod tests { assert_eq!(format!("Embedded: {}", a), "Embedded: 12345"); assert_eq!(a.to_string(), "12345"); + let a = Int512::from(-12345i32); + assert_eq!(format!("Embedded: {}", a), "Embedded: -12345"); + assert_eq!(a.to_string(), "-12345"); + let a = Int512::zero(); assert_eq!(format!("Embedded: {}", a), "Embedded: 0"); assert_eq!(a.to_string(), "0"); @@ -708,6 +727,9 @@ mod tests { fn int512_display_padding_works() { let a = Int512::from(123u64); assert_eq!(format!("Embedded: {:05}", a), "Embedded: 00123"); + + let a = Int512::from(-123i64); + assert_eq!(format!("Embedded: {:05}", a), "Embedded: -0123"); } #[test] @@ -825,6 +847,7 @@ mod tests { assert!(!Int512::from(1u32).is_zero()); assert!(!Int512::from(123u32).is_zero()); + assert!(!Int512::from(-123i32).is_zero()); } #[test] @@ -880,16 +903,16 @@ mod tests { #[test] #[allow(clippy::op_ref)] fn int512_math() { - let a = Int512::from(12345u32); + let a = Int512::from(-12345i32); let b = Int512::from(23456u32); // test + with owned and reference right hand side - assert_eq!(a + b, Int512::from(35801u32)); - assert_eq!(a + &b, Int512::from(35801u32)); + assert_eq!(a + b, Int512::from(11111u32)); + assert_eq!(a + &b, Int512::from(11111u32)); // test - with owned and reference right hand side - assert_eq!(b - a, Int512::from(11111u32)); - assert_eq!(b - &a, Int512::from(11111u32)); + assert_eq!(b - a, Int512::from(35801u32)); + assert_eq!(b - &a, Int512::from(35801u32)); // test += with owned and reference right hand side let mut c = Int512::from(300000u32); @@ -908,7 +931,7 @@ mod tests { assert_eq!(d, Int512::from(276544u32)); // test - with negative result - assert_eq!(a - b, Int512::from(-11111i32)); + assert_eq!(a - b, Int512::from(-35801i32)); } #[test] @@ -923,6 +946,7 @@ mod tests { assert_eq!(Int512::from(2u32) - Int512::from(1u32), Int512::from(1u32)); assert_eq!(Int512::from(2u32) - Int512::from(0u32), Int512::from(2u32)); assert_eq!(Int512::from(2u32) - Int512::from(2u32), Int512::from(0u32)); + assert_eq!(Int512::from(2u32) - Int512::from(3u32), Int512::from(-1i32)); // works for refs let a = Int512::from(10u32); @@ -1093,6 +1117,23 @@ mod tests { Int512::MAX.checked_rem(Int512::from(0u32)), Err(DivideByZeroError { .. }) )); + // checked_* with negative numbers + assert_eq!( + Int512::from(-12i32).checked_div(Int512::from(10i32)), + Ok(Int512::from(-1i32)), + ); + assert_eq!( + Int512::from(-2i32).checked_pow(3u32), + Ok(Int512::from(-8i32)), + ); + assert_eq!( + Int512::from(-6i32).checked_mul(Int512::from(-7i32)), + Ok(Int512::from(42i32)), + ); + assert_eq!( + Int512::from(-2i32).checked_add(Int512::from(3i32)), + Ok(Int512::from(1i32)), + ); // saturating_* assert_eq!(Int512::MAX.saturating_add(Int512::from(1u32)), Int512::MAX); @@ -1112,6 +1153,19 @@ mod tests { assert_eq!(a % Int512::from(3u32), Int512::from(1u32)); assert_eq!(a % Int512::from(4u32), Int512::from(2u32)); + assert_eq!( + Int512::from(-12i32) % Int512::from(10i32), + Int512::from(-2i32) + ); + assert_eq!( + Int512::from(12i32) % Int512::from(-10i32), + Int512::from(2i32) + ); + assert_eq!( + Int512::from(-12i32) % Int512::from(-10i32), + Int512::from(-2i32) + ); + // works for refs let a = Int512::from(10u32); let b = Int512::from(3u32); @@ -1128,25 +1182,6 @@ mod tests { let _ = Int512::from(10u32) % Int512::zero(); } - #[test] - #[allow(clippy::op_ref)] - fn int512_rem_works() { - assert_eq!( - Int512::from(12u32) % Int512::from(10u32), - Int512::from(2u32) - ); - assert_eq!(Int512::from(50u32) % Int512::from(5u32), Int512::zero()); - - // works for refs - let a = Int512::from(42u32); - let b = Int512::from(5u32); - let expected = Int512::from(2u32); - assert_eq!(a % b, expected); - assert_eq!(a % &b, expected); - assert_eq!(&a % b, expected); - assert_eq!(&a % &b, expected); - } - #[test] fn int512_rem_assign_works() { let mut a = Int512::from(30u32); @@ -1167,6 +1202,10 @@ mod tests { let expected = Uint512::from(37u32); assert_eq!(a.abs_diff(b), expected); assert_eq!(b.abs_diff(a), expected); + + let c = Int512::from(-5i32); + assert_eq!(b.abs_diff(c), Uint512::from(10u32)); + assert_eq!(c.abs_diff(b), Uint512::from(10u32)); } #[test] From 59f7f83e06def8154a6cd85f8a6c93dcc097cc58 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 12 Jun 2023 13:04:04 +0200 Subject: [PATCH 0484/2372] Add Shl and Neg impl for Int512 --- packages/std/src/math/int512.rs | 99 +++++++++++++++++++++++++++++++-- 1 file changed, 93 insertions(+), 6 deletions(-) diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index a7877f9f69..8726e3e4b2 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -3,8 +3,8 @@ use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; use std::fmt; use std::ops::{ - Add, AddAssign, Div, DivAssign, Mul, MulAssign, Not, Rem, RemAssign, Shr, ShrAssign, Sub, - SubAssign, + Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Not, Rem, RemAssign, Shl, ShlAssign, Shr, + ShrAssign, Sub, SubAssign, }; use std::str::FromStr; @@ -228,6 +228,14 @@ impl Int512 { Ok(Self(self.0.shr(other))) } + pub fn checked_shl(self, other: u32) -> Result { + if other >= 512 { + return Err(OverflowError::new(OverflowOperation::Shr, self, other)); + } + + Ok(Self(self.0.shl(other))) + } + #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_add(self, other: Self) -> Self { @@ -249,8 +257,7 @@ impl Int512 { #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_pow(self, other: u32) -> Self { - let (value, _did_overflow) = self.0.overflowing_pow(other); - Self(value) + Self(self.0.wrapping_pow(other)) } #[must_use = "this returns the result of the operation, without modifying the original"] @@ -387,10 +394,11 @@ impl From for String { impl fmt::Display for Int512 { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { // The inner type doesn't work as expected with padding, so we - // work around that. + // work around that. Remove this code when the upstream padding is fixed. let unpadded = self.0.to_string(); + let numeric = unpadded.strip_prefix('-').unwrap_or(&unpadded); - f.pad_integral(true, "", &unpadded) + f.pad_integral(self >= &Self::zero(), "", numeric) } } @@ -463,6 +471,14 @@ impl Not for Int512 { } } +impl Neg for Int512 { + type Output = Self; + + fn neg(self) -> Self::Output { + Self(-self.0) + } +} + impl RemAssign for Int512 { fn rem_assign(&mut self, rhs: Int512) { *self = *self % rhs; @@ -507,6 +523,27 @@ impl<'a> Shr<&'a u32> for Int512 { } } +impl Shl for Int512 { + type Output = Self; + + fn shl(self, rhs: u32) -> Self::Output { + self.checked_shl(rhs).unwrap_or_else(|_| { + panic!( + "left shift error: {} is larger or equal than the number of bits in Int512", + rhs, + ) + }) + } +} + +impl<'a> Shl<&'a u32> for Int512 { + type Output = Self; + + fn shl(self, rhs: &'a u32) -> Self::Output { + Shl::::shl(self, *rhs) + } +} + impl AddAssign for Int512 { fn add_assign(&mut self, rhs: Int512) { self.0 = self.0.checked_add(rhs.0).unwrap(); @@ -543,6 +580,18 @@ impl<'a> ShrAssign<&'a u32> for Int512 { } } +impl ShlAssign for Int512 { + fn shl_assign(&mut self, rhs: u32) { + *self = Shl::::shl(*self, rhs); + } +} + +impl<'a> ShlAssign<&'a u32> for Int512 { + fn shl_assign(&mut self, rhs: &'a u32) { + *self = Shl::::shl(*self, *rhs); + } +} + impl Serialize for Int512 { /// Serializes as an integer string using base 10 fn serialize(&self, serializer: S) -> Result @@ -1195,6 +1244,44 @@ mod tests { assert_eq!(a, Int512::from(1u32)); } + #[test] + fn int512_shr() { + let x: Int512 = 0x8000_0000_0000_0000_0000_0000_0000_0000u128.into(); + assert_eq!(x >> 0, x); // right shift by 0 should be no-op + assert_eq!( + x >> 1, + Int512::from(0x4000_0000_0000_0000_0000_0000_0000_0000u128) + ); + assert_eq!( + x >> 4, + Int512::from(0x0800_0000_0000_0000_0000_0000_0000_0000u128) + ); + // right shift of MIN value by the maximum shift value should result in -1 (filled with 1s) + assert_eq!( + Int512::MIN >> (std::mem::size_of::() as u32 * 8 - 1), + -Int512::one() + ); + } + + #[test] + fn int512_shl() { + let x: Int512 = 0x0800_0000_0000_0000_0000_0000_0000_0000u128.into(); + assert_eq!(x << 0, x); // left shift by 0 should be no-op + assert_eq!( + x << 1, + Int512::from(0x1000_0000_0000_0000_0000_0000_0000_0000u128) + ); + assert_eq!( + x << 4, + Int512::from(0x8000_0000_0000_0000_0000_0000_0000_0000u128) + ); + // left shift by by the maximum shift value should result in MIN + assert_eq!( + Int512::one() << (std::mem::size_of::() as u32 * 8 - 1), + Int512::MIN + ); + } + #[test] fn int512_abs_diff_works() { let a = Int512::from(42u32); From bcbb3e169ca8827c0b35977b93c454169ac0e035 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 13 Jun 2023 11:07:39 +0200 Subject: [PATCH 0485/2372] Int512::checked_div_euclid --- packages/std/src/errors/mod.rs | 4 ++-- packages/std/src/errors/std_error.rs | 11 ++++++++++ packages/std/src/math/int512.rs | 33 ++++++++++++++++++++++------ 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/packages/std/src/errors/mod.rs b/packages/std/src/errors/mod.rs index 8c41d36540..54422007d3 100644 --- a/packages/std/src/errors/mod.rs +++ b/packages/std/src/errors/mod.rs @@ -6,8 +6,8 @@ mod verification_error; pub use recover_pubkey_error::RecoverPubkeyError; pub use std_error::{ CheckedFromRatioError, CheckedMultiplyFractionError, CheckedMultiplyRatioError, - CoinFromStrError, CoinsError, ConversionOverflowError, DivideByZeroError, OverflowError, - OverflowOperation, RoundUpOverflowError, StdError, StdResult, + CoinFromStrError, CoinsError, ConversionOverflowError, DivideByZeroError, DivisionError, + OverflowError, OverflowOperation, RoundUpOverflowError, StdError, StdResult, }; pub use system_error::SystemError; pub use verification_error::VerificationError; diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index d30fec6a71..f06e91fa59 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -481,6 +481,8 @@ pub enum OverflowOperation { Add, Sub, Mul, + // TODO: Adding these is technically breaking + Div, Pow, Shr, Shl, @@ -556,6 +558,15 @@ impl DivideByZeroError { } } +#[derive(Error, Debug, PartialEq, Eq)] +pub enum DivisionError { + #[error("Divide by zero error: {0}")] + DivideByZero(#[from] DivideByZeroError), + + #[error("Overflow error: {0}")] + Overflow(#[from] OverflowError), +} + #[derive(Error, Debug, PartialEq, Eq)] pub enum CheckedMultiplyFractionError { #[error("{0}")] diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index 8726e3e4b2..a9da55ff4f 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -8,7 +8,7 @@ use std::ops::{ }; use std::str::FromStr; -use crate::errors::{DivideByZeroError, OverflowError, OverflowOperation, StdError}; +use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; use crate::{forward_ref_partial_eq, Uint128, Uint256, Uint512, Uint64}; /// Used internally - we don't want to leak this type since we might change @@ -202,15 +202,24 @@ impl Int512 { .ok_or_else(|| OverflowError::new(OverflowOperation::Pow, self, exp)) } - pub fn checked_div(self, other: Self) -> Result { + pub fn checked_div(self, other: Self) -> Result { + if other.is_zero() { + return Err(DivideByZeroError::new(self).into()); + } self.0 .checked_div(other.0) .map(Self) - .ok_or_else(|| DivideByZeroError::new(self)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Div, self, other).into()) } - pub fn checked_div_euclid(self, other: Self) -> Result { - self.checked_div(other) + pub fn checked_div_euclid(self, other: Self) -> Result { + if other.is_zero() { + return Err(DivideByZeroError::new(self).into()); + } + self.0 + .checked_div_euclid(other.0) + .map(Self) + .ok_or_else(|| OverflowError::new(OverflowOperation::Div, self, other).into()) } pub fn checked_rem(self, other: Self) -> Result { @@ -1144,7 +1153,7 @@ mod tests { assert_eq!(Int512::from(2u32).checked_pow(3u32), Ok(Int512::from(8u32)),); assert!(matches!( Int512::MAX.checked_div(Int512::from(0u32)), - Err(DivideByZeroError { .. }) + Err(DivisionError::DivideByZero(_)) )); assert_eq!( Int512::from(6u32).checked_div(Int512::from(2u32)), @@ -1152,7 +1161,7 @@ mod tests { ); assert!(matches!( Int512::MAX.checked_div_euclid(Int512::from(0u32)), - Err(DivideByZeroError { .. }) + Err(DivisionError::DivideByZero(_)) )); assert_eq!( Int512::from(6u32).checked_div_euclid(Int512::from(2u32)), @@ -1183,6 +1192,10 @@ mod tests { Int512::from(-2i32).checked_add(Int512::from(3i32)), Ok(Int512::from(1i32)), ); + assert_eq!( + Int512::from(-1i32).checked_div_euclid(Int512::from(-2i32)), + Ok(Int512::from(1u32)), + ); // saturating_* assert_eq!(Int512::MAX.saturating_add(Int512::from(1u32)), Int512::MAX); @@ -1295,6 +1308,12 @@ mod tests { assert_eq!(c.abs_diff(b), Uint512::from(10u32)); } + #[test] + #[should_panic = "attempt to negate with overflow"] + fn int512_neg_min_panics() { + _ = -Int512::MIN; + } + #[test] fn int512_partial_eq() { let test_cases = [(1, 1, true), (42, 42, true), (42, 24, false), (0, 0, true)] From 98e877f95514ecfd8cfa547821d25791eb016d8c Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 13 Jun 2023 12:19:25 +0200 Subject: [PATCH 0486/2372] Add checked_neg to Int512 --- packages/std/src/errors/std_error.rs | 1 + packages/std/src/math/int512.rs | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index f06e91fa59..f4121e6b9e 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -483,6 +483,7 @@ pub enum OverflowOperation { Mul, // TODO: Adding these is technically breaking Div, + Neg, Pow, Shr, Shl, diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index a9da55ff4f..cebf7b409b 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -245,6 +245,13 @@ impl Int512 { Ok(Self(self.0.shl(other))) } + pub fn checked_neg(self) -> Result { + self.0 + .checked_neg() + .map(Self) + .ok_or_else(|| OverflowError::new(OverflowOperation::Neg, self, self)) + } + #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_add(self, other: Self) -> Self { @@ -1102,6 +1109,16 @@ mod tests { let _ = Int512::from(1u32) >> 512u32; } + #[test] + fn int512_checked_neg() { + assert_eq!(Int512::one().checked_neg(), Ok(Int512::from(-1i32))); + assert!(matches!( + Int512::MIN.checked_neg(), + Err(OverflowError { .. }) + )); + assert_eq!(Int512::MAX.checked_neg(), Ok(Int512::MIN + Int512::one())); + } + #[test] fn sum_works() { let nums = vec![ From 630e299aada1951a3069957a9f611788982fefae Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 14 Jun 2023 10:12:01 +0200 Subject: [PATCH 0487/2372] Remove uint dependency --- Cargo.lock | 25 ------------------------- contracts/burner/Cargo.lock | 25 ------------------------- contracts/crypto-verify/Cargo.lock | 25 ------------------------- contracts/cyberpunk/Cargo.lock | 25 ------------------------- contracts/floaty/Cargo.lock | 25 ------------------------- contracts/hackatom/Cargo.lock | 25 ------------------------- contracts/ibc-reflect-send/Cargo.lock | 25 ------------------------- contracts/ibc-reflect/Cargo.lock | 25 ------------------------- contracts/queue/Cargo.lock | 25 ------------------------- contracts/reflect/Cargo.lock | 25 ------------------------- contracts/staking/Cargo.lock | 25 ------------------------- contracts/virus/Cargo.lock | 25 ------------------------- packages/std/Cargo.toml | 1 - 13 files changed, 301 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dc3a1c5bf9..c76a0f514a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -371,7 +371,6 @@ dependencies = [ "serde_json", "sha2 0.10.3", "thiserror", - "uint", ] [[package]] @@ -572,12 +571,6 @@ dependencies = [ "lazy_static", ] -[[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.8" @@ -1691,12 +1684,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "strsim" version = "0.8.0" @@ -1824,18 +1811,6 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" -[[package]] -name = "uint" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f03af7ccf01dd611cc450a0d10dbc9b745770d096473e2faf0ca6e2d66d1e0" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - [[package]] name = "unicode-width" version = "0.1.9" diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 129021b06e..8ebe8fa1a9 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -232,7 +232,6 @@ dependencies = [ "serde-json-wasm", "sha2 0.10.3", "thiserror", - "uint", ] [[package]] @@ -388,12 +387,6 @@ dependencies = [ "lazy_static", ] -[[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.8" @@ -1395,12 +1388,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "strsim" version = "0.10.0" @@ -1503,18 +1490,6 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" -[[package]] -name = "uint" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f03af7ccf01dd611cc450a0d10dbc9b745770d096473e2faf0ca6e2d66d1e0" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - [[package]] name = "unicode-xid" version = "0.2.2" diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index a4e25b5b03..8193676a13 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -227,7 +227,6 @@ dependencies = [ "serde-json-wasm", "sha2 0.10.3", "thiserror", - "uint", ] [[package]] @@ -391,12 +390,6 @@ dependencies = [ "lazy_static", ] -[[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.8" @@ -1453,12 +1446,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "strsim" version = "0.10.0" @@ -1561,18 +1548,6 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" -[[package]] -name = "uint" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f03af7ccf01dd611cc450a0d10dbc9b745770d096473e2faf0ca6e2d66d1e0" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - [[package]] name = "unicode-xid" version = "0.2.2" diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index e6ab3c05f3..60fb94530e 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -250,7 +250,6 @@ dependencies = [ "serde-json-wasm", "sha2 0.10.3", "thiserror", - "uint", ] [[package]] @@ -414,12 +413,6 @@ dependencies = [ "lazy_static", ] -[[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.8" @@ -1445,12 +1438,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "strsim" version = "0.10.0" @@ -1553,18 +1540,6 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" -[[package]] -name = "uint" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f03af7ccf01dd611cc450a0d10dbc9b745770d096473e2faf0ca6e2d66d1e0" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - [[package]] name = "unicode-xid" version = "0.2.2" diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index e9932e6158..b7eefeda60 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -221,7 +221,6 @@ dependencies = [ "serde-json-wasm", "sha2 0.10.3", "thiserror", - "uint", ] [[package]] @@ -385,12 +384,6 @@ dependencies = [ "lazy_static", ] -[[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.8" @@ -1405,12 +1398,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "strsim" version = "0.10.0" @@ -1513,18 +1500,6 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" -[[package]] -name = "uint" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f03af7ccf01dd611cc450a0d10dbc9b745770d096473e2faf0ca6e2d66d1e0" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - [[package]] name = "unicode-xid" version = "0.2.2" diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index f7ac3df002..4a22c86347 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -221,7 +221,6 @@ dependencies = [ "serde-json-wasm", "sha2 0.10.3", "thiserror", - "uint", ] [[package]] @@ -385,12 +384,6 @@ dependencies = [ "lazy_static", ] -[[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.8" @@ -1406,12 +1399,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "strsim" version = "0.10.0" @@ -1514,18 +1501,6 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" -[[package]] -name = "uint" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f03af7ccf01dd611cc450a0d10dbc9b745770d096473e2faf0ca6e2d66d1e0" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - [[package]] name = "unicode-xid" version = "0.2.2" diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index b5688564bc..dfff7aa4e7 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -221,7 +221,6 @@ dependencies = [ "serde-json-wasm", "sha2 0.10.3", "thiserror", - "uint", ] [[package]] @@ -385,12 +384,6 @@ dependencies = [ "lazy_static", ] -[[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.8" @@ -1404,12 +1397,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "strsim" version = "0.10.0" @@ -1512,18 +1499,6 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" -[[package]] -name = "uint" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f03af7ccf01dd611cc450a0d10dbc9b745770d096473e2faf0ca6e2d66d1e0" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - [[package]] name = "unicode-xid" version = "0.2.2" diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 1491d26548..f14335aa9a 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -221,7 +221,6 @@ dependencies = [ "serde-json-wasm", "sha2 0.10.3", "thiserror", - "uint", ] [[package]] @@ -385,12 +384,6 @@ dependencies = [ "lazy_static", ] -[[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.8" @@ -1404,12 +1397,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "strsim" version = "0.10.0" @@ -1512,18 +1499,6 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" -[[package]] -name = "uint" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f03af7ccf01dd611cc450a0d10dbc9b745770d096473e2faf0ca6e2d66d1e0" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - [[package]] name = "unicode-xid" version = "0.2.2" diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index f4d4dd6354..baecd4b897 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -221,7 +221,6 @@ dependencies = [ "serde-json-wasm", "sha2 0.10.3", "thiserror", - "uint", ] [[package]] @@ -377,12 +376,6 @@ dependencies = [ "lazy_static", ] -[[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.8" @@ -1395,12 +1388,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "strsim" version = "0.10.0" @@ -1503,18 +1490,6 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" -[[package]] -name = "uint" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f03af7ccf01dd611cc450a0d10dbc9b745770d096473e2faf0ca6e2d66d1e0" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - [[package]] name = "unicode-xid" version = "0.2.2" diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 8099b681ec..6539fc1a75 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -221,7 +221,6 @@ dependencies = [ "serde-json-wasm", "sha2 0.10.3", "thiserror", - "uint", ] [[package]] @@ -385,12 +384,6 @@ dependencies = [ "lazy_static", ] -[[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.8" @@ -1405,12 +1398,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "strsim" version = "0.10.0" @@ -1513,18 +1500,6 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" -[[package]] -name = "uint" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f03af7ccf01dd611cc450a0d10dbc9b745770d096473e2faf0ca6e2d66d1e0" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - [[package]] name = "unicode-xid" version = "0.2.2" diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 0886b36c00..ab6d49866e 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -221,7 +221,6 @@ dependencies = [ "serde-json-wasm", "sha2 0.10.3", "thiserror", - "uint", ] [[package]] @@ -385,12 +384,6 @@ dependencies = [ "lazy_static", ] -[[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.8" @@ -1432,12 +1425,6 @@ dependencies = [ "snafu", ] -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "strsim" version = "0.10.0" @@ -1540,18 +1527,6 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" -[[package]] -name = "uint" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f03af7ccf01dd611cc450a0d10dbc9b745770d096473e2faf0ca6e2d66d1e0" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - [[package]] name = "unicode-xid" version = "0.2.2" diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index d01769b280..ba54a8d9e3 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -221,7 +221,6 @@ dependencies = [ "serde-json-wasm", "sha2 0.10.3", "thiserror", - "uint", ] [[package]] @@ -377,12 +376,6 @@ dependencies = [ "lazy_static", ] -[[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.8" @@ -1384,12 +1377,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "strsim" version = "0.10.0" @@ -1492,18 +1479,6 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" -[[package]] -name = "uint" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f03af7ccf01dd611cc450a0d10dbc9b745770d096473e2faf0ca6e2d66d1e0" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - [[package]] name = "unicode-xid" version = "0.2.2" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index fbec9eb810..0175ec7b3d 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -54,7 +54,6 @@ sha2 = "0.10.3" serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } serde-json-wasm = { version = "0.5.0" } thiserror = "1.0.26" -uint = "0.9.3" bnum = "=0.7.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] From d530dbcaedcc4001c45382fc4794719de0eb25ba Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 14 Jun 2023 12:40:32 +0200 Subject: [PATCH 0488/2372] Use forward_ref macros for Int512 impls --- packages/std/src/math/int512.rs | 64 +++++---------------------------- 1 file changed, 8 insertions(+), 56 deletions(-) diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index cebf7b409b..9027dd8cef 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -425,14 +425,7 @@ impl Add for Int512 { Int512(self.0.checked_add(rhs.0).unwrap()) } } - -impl<'a> Add<&'a Int512> for Int512 { - type Output = Self; - - fn add(self, rhs: &'a Int512) -> Self { - Int512(self.0.checked_add(rhs.0).unwrap()) - } -} +forward_ref_binop!(impl Add, add for Int512, Int512); impl Sub for Int512 { type Output = Self; @@ -457,14 +450,7 @@ impl Div for Int512 { Self(self.0.checked_div(rhs.0).unwrap()) } } - -impl<'a> Div<&'a Int512> for Int512 { - type Output = Self; - - fn div(self, rhs: &'a Int512) -> Self::Output { - Self(self.0.checked_div(rhs.0).unwrap()) - } -} +forward_ref_binop!(impl Div, div for Int512, Int512); impl Rem for Int512 { type Output = Self; @@ -530,14 +516,7 @@ impl Shr for Int512 { }) } } - -impl<'a> Shr<&'a u32> for Int512 { - type Output = Self; - - fn shr(self, rhs: &'a u32) -> Self::Output { - Shr::::shr(self, *rhs) - } -} +forward_ref_binop!(impl Shr, shr for Int512, u32); impl Shl for Int512 { type Output = Self; @@ -551,62 +530,35 @@ impl Shl for Int512 { }) } } - -impl<'a> Shl<&'a u32> for Int512 { - type Output = Self; - - fn shl(self, rhs: &'a u32) -> Self::Output { - Shl::::shl(self, *rhs) - } -} +forward_ref_binop!(impl Shl, shl for Int512, u32); impl AddAssign for Int512 { fn add_assign(&mut self, rhs: Int512) { self.0 = self.0.checked_add(rhs.0).unwrap(); } } - -impl<'a> AddAssign<&'a Int512> for Int512 { - fn add_assign(&mut self, rhs: &'a Int512) { - self.0 = self.0.checked_add(rhs.0).unwrap(); - } -} +forward_ref_op_assign!(impl AddAssign, add_assign for Int512, Int512); impl DivAssign for Int512 { fn div_assign(&mut self, rhs: Self) { self.0 = self.0.checked_div(rhs.0).unwrap(); } } - -impl<'a> DivAssign<&'a Int512> for Int512 { - fn div_assign(&mut self, rhs: &'a Int512) { - self.0 = self.0.checked_div(rhs.0).unwrap(); - } -} +forward_ref_op_assign!(impl DivAssign, div_assign for Int512, Int512); impl ShrAssign for Int512 { fn shr_assign(&mut self, rhs: u32) { *self = Shr::::shr(*self, rhs); } } - -impl<'a> ShrAssign<&'a u32> for Int512 { - fn shr_assign(&mut self, rhs: &'a u32) { - *self = Shr::::shr(*self, *rhs); - } -} +forward_ref_op_assign!(impl ShrAssign, shr_assign for Int512, u32); impl ShlAssign for Int512 { fn shl_assign(&mut self, rhs: u32) { *self = Shl::::shl(*self, rhs); } } - -impl<'a> ShlAssign<&'a u32> for Int512 { - fn shl_assign(&mut self, rhs: &'a u32) { - *self = Shl::::shl(*self, *rhs); - } -} +forward_ref_op_assign!(impl ShlAssign, shl_assign for Int512, u32); impl Serialize for Int512 { /// Serializes as an integer string using base 10 From 5bcb9d2332f010a0d309e5003eac7122f3ebfc58 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 14 Jun 2023 13:19:00 +0200 Subject: [PATCH 0489/2372] Improve DivisionError --- packages/std/src/errors/std_error.rs | 10 ++++------ packages/std/src/math/int512.rs | 20 ++++++++++---------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index f4121e6b9e..a6837a98b6 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -481,8 +481,6 @@ pub enum OverflowOperation { Add, Sub, Mul, - // TODO: Adding these is technically breaking - Div, Neg, Pow, Shr, @@ -561,11 +559,11 @@ impl DivideByZeroError { #[derive(Error, Debug, PartialEq, Eq)] pub enum DivisionError { - #[error("Divide by zero error: {0}")] - DivideByZero(#[from] DivideByZeroError), + #[error("Divide by zero")] + DivideByZero, - #[error("Overflow error: {0}")] - Overflow(#[from] OverflowError), + #[error("Overflow in division")] + Overflow, } #[derive(Error, Debug, PartialEq, Eq)] diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index 9027dd8cef..d6d427afab 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -204,22 +204,22 @@ impl Int512 { pub fn checked_div(self, other: Self) -> Result { if other.is_zero() { - return Err(DivideByZeroError::new(self).into()); + return Err(DivisionError::DivideByZero); } self.0 .checked_div(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Div, self, other).into()) + .ok_or(DivisionError::Overflow) } pub fn checked_div_euclid(self, other: Self) -> Result { if other.is_zero() { - return Err(DivideByZeroError::new(self).into()); + return Err(DivisionError::DivideByZero); } self.0 .checked_div_euclid(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Div, self, other).into()) + .ok_or(DivisionError::Overflow) } pub fn checked_rem(self, other: Self) -> Result { @@ -1120,18 +1120,18 @@ mod tests { Err(OverflowError { .. }) )); assert_eq!(Int512::from(2u32).checked_pow(3u32), Ok(Int512::from(8u32)),); - assert!(matches!( + assert_eq!( Int512::MAX.checked_div(Int512::from(0u32)), - Err(DivisionError::DivideByZero(_)) - )); + Err(DivisionError::DivideByZero) + ); assert_eq!( Int512::from(6u32).checked_div(Int512::from(2u32)), Ok(Int512::from(3u32)), ); - assert!(matches!( + assert_eq!( Int512::MAX.checked_div_euclid(Int512::from(0u32)), - Err(DivisionError::DivideByZero(_)) - )); + Err(DivisionError::DivideByZero) + ); assert_eq!( Int512::from(6u32).checked_div_euclid(Int512::from(2u32)), Ok(Int512::from(3u32)), From 6b38adf08d083517342da992923eb32713fb7f6e Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 14 Jun 2023 13:19:16 +0200 Subject: [PATCH 0490/2372] Improve error string --- packages/std/src/math/int512.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index d6d427afab..74ba0218c2 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -396,7 +396,7 @@ impl FromStr for Int512 { fn from_str(s: &str) -> Result { match I512::from_str_radix(s, 10) { Ok(u) => Ok(Self(u)), - Err(e) => Err(StdError::generic_err(format!("Parsing i512: {}", e))), + Err(e) => Err(StdError::generic_err(format!("Parsing Int512: {}", e))), } } } From 67fe1b438cc346483e6bf4b7448d8520ca4dde15 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 14 Jun 2023 13:28:33 +0200 Subject: [PATCH 0491/2372] Inline Int512 constructor Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/std/src/math/int512.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index 74ba0218c2..954f355a51 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -50,6 +50,7 @@ impl Int512 { /// Creates a Int512(value) from a big endian representation. It's just an alias for /// `from_be_bytes`. + #[inline] pub const fn new(value: [u8; 64]) -> Self { Self::from_be_bytes(value) } From c65232f327f9fef810d90f236b9a7dcdffae6b01 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 14 Jun 2023 13:26:02 +0200 Subject: [PATCH 0492/2372] Add non_exhaustive to OverflowOperation --- packages/std/src/errors/std_error.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index a6837a98b6..5accfcc6be 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -477,6 +477,7 @@ impl From for StdError { pub type StdResult = core::result::Result; #[derive(Error, Debug, PartialEq, Eq)] +#[non_exhaustive] pub enum OverflowOperation { Add, Sub, From 7a379c5491250001729ac7f9f553d4592b88d7e7 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 28 Jun 2023 16:15:51 +0200 Subject: [PATCH 0493/2372] Simplify tests --- packages/std/src/math/int512.rs | 91 +++++++++------------------------ 1 file changed, 23 insertions(+), 68 deletions(-) diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index 954f355a51..b4f5655e89 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -637,27 +637,16 @@ mod tests { #[test] fn int512_zero_works() { let zero = Int512::zero(); - assert_eq!( - zero.to_be_bytes(), - [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 - ] - ); + assert_eq!(zero.to_be_bytes(), [0; 64]); } #[test] fn uin512_one_works() { let one = Int512::one(); - assert_eq!( - one.to_be_bytes(), - [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1 - ] - ); + let mut one_be = [0; 64]; + one_be[63] = 1; + + assert_eq!(one.to_be_bytes(), one_be); } #[test] @@ -752,32 +741,15 @@ mod tests { #[test] fn int512_to_be_bytes_works() { - assert_eq!( - Int512::zero().to_be_bytes(), - [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - ] - ); - assert_eq!( - Int512::MAX.to_be_bytes(), - [ - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - ] - ); - assert_eq!( - Int512::from(1u128).to_be_bytes(), - [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1 - ] - ); + assert_eq!(Int512::zero().to_be_bytes(), [0; 64]); + + let mut max = [0xff; 64]; + max[0] = 0x7f; + assert_eq!(Int512::MAX.to_be_bytes(), max); + + let mut one = [0; 64]; + one[63] = 1; + assert_eq!(Int512::from(1u128).to_be_bytes(), one); // Python: `[b for b in (240282366920938463463374607431768124608).to_bytes(64, "big")]` assert_eq!( Int512::from(240282366920938463463374607431768124608u128).to_be_bytes(), @@ -806,32 +778,15 @@ mod tests { #[test] fn int512_to_le_bytes_works() { - assert_eq!( - Int512::zero().to_le_bytes(), - [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 - ] - ); - assert_eq!( - Int512::MAX.to_le_bytes(), - [ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f - ] - ); - assert_eq!( - Int512::from(1u128).to_le_bytes(), - [ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 - ] - ); + assert_eq!(Int512::zero().to_le_bytes(), [0; 64]); + + let mut max = [0xff; 64]; + max[63] = 0x7f; + assert_eq!(Int512::MAX.to_le_bytes(), max); + + let mut one = [0; 64]; + one[0] = 1; + assert_eq!(Int512::from(1u128).to_le_bytes(), one); // Python: `[b for b in (240282366920938463463374607431768124608).to_bytes(64, "little")]` assert_eq!( Int512::from(240282366920938463463374607431768124608u128).to_le_bytes(), From ac2b0be321b34515fa901569514257f5761f6c67 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 28 Jun 2023 16:33:41 +0200 Subject: [PATCH 0494/2372] Add Int256 --- packages/std/src/lib.rs | 4 +- packages/std/src/math/int256.rs | 1202 +++++++++++++++++++++++++++++++ packages/std/src/math/mod.rs | 2 + 3 files changed, 1206 insertions(+), 2 deletions(-) create mode 100644 packages/std/src/math/int256.rs diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index e05f1b4eb1..e6abac0efb 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -52,8 +52,8 @@ pub use crate::ibc::{ #[cfg(feature = "iterator")] pub use crate::iterator::{Order, Record}; pub use crate::math::{ - Decimal, Decimal256, Decimal256RangeExceeded, DecimalRangeExceeded, Fraction, Int512, Isqrt, - Uint128, Uint256, Uint512, Uint64, + Decimal, Decimal256, Decimal256RangeExceeded, DecimalRangeExceeded, Fraction, Int256, Int512, + Isqrt, Uint128, Uint256, Uint512, Uint64, }; pub use crate::metadata::{DenomMetadata, DenomUnit}; pub use crate::never::Never; diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs new file mode 100644 index 0000000000..211719d1e6 --- /dev/null +++ b/packages/std/src/math/int256.rs @@ -0,0 +1,1202 @@ +use forward_ref::{forward_ref_binop, forward_ref_op_assign}; +use schemars::JsonSchema; +use serde::{de, ser, Deserialize, Deserializer, Serialize}; +use std::fmt; +use std::ops::{ + Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Not, Rem, RemAssign, Shl, ShlAssign, Shr, + ShrAssign, Sub, SubAssign, +}; +use std::str::FromStr; + +use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; +use crate::{forward_ref_partial_eq, Uint128, Uint256, Uint64}; + +/// Used internally - we don't want to leak this type since we might change +/// the implementation in the future. +use bnum::types::{I256, U256}; + +/// An implementation of i256 that is using strings for JSON encoding/decoding, +/// such that the full i256 range can be used for clients that convert JSON numbers to floats, +/// like JavaScript and jq. +/// +/// # Examples +/// +/// Use `from` to create instances out of primitive uint types or `new` to provide big +/// endian bytes: +/// +/// ``` +/// # use cosmwasm_std::Int256; +/// let a = Int256::from(258u128); +/// let b = Int256::new([ +/// 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, +/// 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, +/// 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, +/// 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 2u8, +/// ]); +/// assert_eq!(a, b); +/// ``` +#[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] +pub struct Int256(#[schemars(with = "String")] I256); + +forward_ref_partial_eq!(Int256, Int256); + +impl Int256 { + pub const MAX: Int256 = Int256(I256::MAX); + pub const MIN: Int256 = Int256(I256::MIN); + + /// Creates a Int256(value) from a big endian representation. It's just an alias for + /// `from_be_bytes`. + #[inline] + pub const fn new(value: [u8; 32]) -> Self { + Self::from_be_bytes(value) + } + + /// Creates a Int256(0) + #[inline] + pub const fn zero() -> Self { + Int256(I256::ZERO) + } + + /// Creates a Int256(1) + #[inline] + pub const fn one() -> Self { + Self(I256::ONE) + } + + #[must_use] + pub const fn from_be_bytes(data: [u8; 32]) -> Self { + let words: [u64; 4] = [ + u64::from_le_bytes([ + data[31], data[30], data[29], data[28], data[27], data[26], data[25], data[24], + ]), + u64::from_le_bytes([ + data[23], data[22], data[21], data[20], data[19], data[18], data[17], data[16], + ]), + u64::from_le_bytes([ + data[15], data[14], data[13], data[12], data[11], data[10], data[9], data[8], + ]), + u64::from_le_bytes([ + data[7], data[6], data[5], data[4], data[3], data[2], data[1], data[0], + ]), + ]; + Self(I256::from_bits(U256::from_digits(words))) + } + + #[must_use] + pub const fn from_le_bytes(data: [u8; 32]) -> Self { + let words: [u64; 4] = [ + u64::from_le_bytes([ + data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], + ]), + u64::from_le_bytes([ + data[8], data[9], data[10], data[11], data[12], data[13], data[14], data[15], + ]), + u64::from_le_bytes([ + data[16], data[17], data[18], data[19], data[20], data[21], data[22], data[23], + ]), + u64::from_le_bytes([ + data[24], data[25], data[26], data[27], data[28], data[29], data[30], data[31], + ]), + ]; + Self(I256::from_bits(U256::from_digits(words))) + } + + /// Returns a copy of the number as big endian bytes. + #[must_use = "this returns the result of the operation, without modifying the original"] + pub const fn to_be_bytes(self) -> [u8; 32] { + let bits = self.0.to_bits(); + let words = bits.digits(); + let words = [ + words[3].to_be_bytes(), + words[2].to_be_bytes(), + words[1].to_be_bytes(), + words[0].to_be_bytes(), + ]; + unsafe { std::mem::transmute::<[[u8; 8]; 4], [u8; 32]>(words) } + } + + /// Returns a copy of the number as little endian bytes. + #[must_use = "this returns the result of the operation, without modifying the original"] + pub const fn to_le_bytes(self) -> [u8; 32] { + let bits = self.0.to_bits(); + let words = bits.digits(); + let words = [ + words[0].to_le_bytes(), + words[1].to_le_bytes(), + words[2].to_le_bytes(), + words[3].to_le_bytes(), + ]; + unsafe { std::mem::transmute::<[[u8; 8]; 4], [u8; 32]>(words) } + } + + #[must_use] + pub const fn is_zero(&self) -> bool { + self.0.is_zero() + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn pow(self, exp: u32) -> Self { + Self(self.0.pow(exp)) + } + + pub fn checked_add(self, other: Self) -> Result { + self.0 + .checked_add(other.0) + .map(Self) + .ok_or_else(|| OverflowError::new(OverflowOperation::Add, self, other)) + } + + pub fn checked_sub(self, other: Self) -> Result { + self.0 + .checked_sub(other.0) + .map(Self) + .ok_or_else(|| OverflowError::new(OverflowOperation::Sub, self, other)) + } + + pub fn checked_mul(self, other: Self) -> Result { + self.0 + .checked_mul(other.0) + .map(Self) + .ok_or_else(|| OverflowError::new(OverflowOperation::Mul, self, other)) + } + + pub fn checked_pow(self, exp: u32) -> Result { + self.0 + .checked_pow(exp) + .map(Self) + .ok_or_else(|| OverflowError::new(OverflowOperation::Pow, self, exp)) + } + + pub fn checked_div(self, other: Self) -> Result { + if other.is_zero() { + return Err(DivisionError::DivideByZero); + } + self.0 + .checked_div(other.0) + .map(Self) + .ok_or(DivisionError::Overflow) + } + + pub fn checked_div_euclid(self, other: Self) -> Result { + if other.is_zero() { + return Err(DivisionError::DivideByZero); + } + self.0 + .checked_div_euclid(other.0) + .map(Self) + .ok_or(DivisionError::Overflow) + } + + pub fn checked_rem(self, other: Self) -> Result { + self.0 + .checked_rem(other.0) + .map(Self) + .ok_or_else(|| DivideByZeroError::new(self)) + } + + pub fn checked_shr(self, other: u32) -> Result { + if other >= 256 { + return Err(OverflowError::new(OverflowOperation::Shr, self, other)); + } + + Ok(Self(self.0.shr(other))) + } + + pub fn checked_shl(self, other: u32) -> Result { + if other >= 256 { + return Err(OverflowError::new(OverflowOperation::Shr, self, other)); + } + + Ok(Self(self.0.shl(other))) + } + + pub fn checked_neg(self) -> Result { + self.0 + .checked_neg() + .map(Self) + .ok_or_else(|| OverflowError::new(OverflowOperation::Neg, self, self)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + #[inline] + pub fn wrapping_add(self, other: Self) -> Self { + Self(self.0.wrapping_add(other.0)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + #[inline] + pub fn wrapping_sub(self, other: Self) -> Self { + Self(self.0.wrapping_sub(other.0)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + #[inline] + pub fn wrapping_mul(self, other: Self) -> Self { + Self(self.0.wrapping_mul(other.0)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + #[inline] + pub fn wrapping_pow(self, other: u32) -> Self { + Self(self.0.wrapping_pow(other)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn saturating_add(self, other: Self) -> Self { + Self(self.0.saturating_add(other.0)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn saturating_sub(self, other: Self) -> Self { + Self(self.0.saturating_sub(other.0)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn saturating_mul(self, other: Self) -> Self { + Self(self.0.saturating_mul(other.0)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn saturating_pow(self, exp: u32) -> Self { + Self(self.0.saturating_pow(exp)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn abs_diff(self, other: Self) -> Uint256 { + Uint256(self.0.abs_diff(other.0)) + } +} + +impl From for Int256 { + fn from(val: Uint256) -> Self { + let bytes = [[0u8; 32], val.to_be_bytes()].concat(); + + Self::from_be_bytes(bytes.try_into().unwrap()) + } +} + +impl From for Int256 { + fn from(val: Uint128) -> Self { + val.u128().into() + } +} + +impl From for Int256 { + fn from(val: Uint64) -> Self { + val.u64().into() + } +} + +impl From for Int256 { + fn from(val: u128) -> Self { + Int256(val.into()) + } +} + +impl From for Int256 { + fn from(val: u64) -> Self { + Int256(val.into()) + } +} + +impl From for Int256 { + fn from(val: u32) -> Self { + Int256(val.into()) + } +} + +impl From for Int256 { + fn from(val: u16) -> Self { + Int256(val.into()) + } +} + +impl From for Int256 { + fn from(val: u8) -> Self { + Int256(val.into()) + } +} + +impl From for Int256 { + fn from(val: i128) -> Self { + Int256(val.into()) + } +} + +impl From for Int256 { + fn from(val: i64) -> Self { + Int256(val.into()) + } +} + +impl From for Int256 { + fn from(val: i32) -> Self { + Int256(val.into()) + } +} + +impl From for Int256 { + fn from(val: i16) -> Self { + Int256(val.into()) + } +} + +impl From for Int256 { + fn from(val: i8) -> Self { + Int256(val.into()) + } +} + +impl TryFrom<&str> for Int256 { + type Error = StdError; + + fn try_from(val: &str) -> Result { + Self::from_str(val) + } +} + +impl FromStr for Int256 { + type Err = StdError; + + fn from_str(s: &str) -> Result { + match I256::from_str_radix(s, 10) { + Ok(u) => Ok(Self(u)), + Err(e) => Err(StdError::generic_err(format!("Parsing Int256: {}", e))), + } + } +} + +impl From for String { + fn from(original: Int256) -> Self { + original.to_string() + } +} + +impl fmt::Display for Int256 { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + // The inner type doesn't work as expected with padding, so we + // work around that. Remove this code when the upstream padding is fixed. + let unpadded = self.0.to_string(); + let numeric = unpadded.strip_prefix('-').unwrap_or(&unpadded); + + f.pad_integral(self >= &Self::zero(), "", numeric) + } +} + +impl Add for Int256 { + type Output = Self; + + fn add(self, rhs: Self) -> Self { + Int256(self.0.checked_add(rhs.0).unwrap()) + } +} +forward_ref_binop!(impl Add, add for Int256, Int256); + +impl Sub for Int256 { + type Output = Self; + + fn sub(self, rhs: Self) -> Self { + Int256(self.0.checked_sub(rhs.0).unwrap()) + } +} +forward_ref_binop!(impl Sub, sub for Int256, Int256); + +impl SubAssign for Int256 { + fn sub_assign(&mut self, rhs: Int256) { + self.0 = self.0.checked_sub(rhs.0).unwrap(); + } +} +forward_ref_op_assign!(impl SubAssign, sub_assign for Int256, Int256); + +impl Div for Int256 { + type Output = Self; + + fn div(self, rhs: Self) -> Self::Output { + Self(self.0.checked_div(rhs.0).unwrap()) + } +} +forward_ref_binop!(impl Div, div for Int256, Int256); + +impl Rem for Int256 { + type Output = Self; + + /// # Panics + /// + /// This operation will panic if `rhs` is zero. + #[inline] + fn rem(self, rhs: Self) -> Self { + Self(self.0.rem(rhs.0)) + } +} +forward_ref_binop!(impl Rem, rem for Int256, Int256); + +impl Not for Int256 { + type Output = Self; + + fn not(self) -> Self::Output { + Self(!self.0) + } +} + +impl Neg for Int256 { + type Output = Self; + + fn neg(self) -> Self::Output { + Self(-self.0) + } +} + +impl RemAssign for Int256 { + fn rem_assign(&mut self, rhs: Int256) { + *self = *self % rhs; + } +} +forward_ref_op_assign!(impl RemAssign, rem_assign for Int256, Int256); + +impl Mul for Int256 { + type Output = Self; + + fn mul(self, rhs: Self) -> Self::Output { + Self(self.0.checked_mul(rhs.0).unwrap()) + } +} +forward_ref_binop!(impl Mul, mul for Int256, Int256); + +impl MulAssign for Int256 { + fn mul_assign(&mut self, rhs: Self) { + self.0 = self.0.checked_mul(rhs.0).unwrap(); + } +} +forward_ref_op_assign!(impl MulAssign, mul_assign for Int256, Int256); + +impl Shr for Int256 { + type Output = Self; + + fn shr(self, rhs: u32) -> Self::Output { + self.checked_shr(rhs).unwrap_or_else(|_| { + panic!( + "right shift error: {} is larger or equal than the number of bits in Int256", + rhs, + ) + }) + } +} +forward_ref_binop!(impl Shr, shr for Int256, u32); + +impl Shl for Int256 { + type Output = Self; + + fn shl(self, rhs: u32) -> Self::Output { + self.checked_shl(rhs).unwrap_or_else(|_| { + panic!( + "left shift error: {} is larger or equal than the number of bits in Int256", + rhs, + ) + }) + } +} +forward_ref_binop!(impl Shl, shl for Int256, u32); + +impl AddAssign for Int256 { + fn add_assign(&mut self, rhs: Int256) { + self.0 = self.0.checked_add(rhs.0).unwrap(); + } +} +forward_ref_op_assign!(impl AddAssign, add_assign for Int256, Int256); + +impl DivAssign for Int256 { + fn div_assign(&mut self, rhs: Self) { + self.0 = self.0.checked_div(rhs.0).unwrap(); + } +} +forward_ref_op_assign!(impl DivAssign, div_assign for Int256, Int256); + +impl ShrAssign for Int256 { + fn shr_assign(&mut self, rhs: u32) { + *self = Shr::::shr(*self, rhs); + } +} +forward_ref_op_assign!(impl ShrAssign, shr_assign for Int256, u32); + +impl ShlAssign for Int256 { + fn shl_assign(&mut self, rhs: u32) { + *self = Shl::::shl(*self, rhs); + } +} +forward_ref_op_assign!(impl ShlAssign, shl_assign for Int256, u32); + +impl Serialize for Int256 { + /// Serializes as an integer string using base 10 + fn serialize(&self, serializer: S) -> Result + where + S: ser::Serializer, + { + serializer.serialize_str(&self.to_string()) + } +} + +impl<'de> Deserialize<'de> for Int256 { + /// Deserialized from an integer string using base 10 + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_str(Int256Visitor) + } +} + +struct Int256Visitor; + +impl<'de> de::Visitor<'de> for Int256Visitor { + type Value = Int256; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("string-encoded integer") + } + + fn visit_str(self, v: &str) -> Result + where + E: de::Error, + { + Int256::try_from(v).map_err(|e| E::custom(format!("invalid Int256 '{}' - {}", v, e))) + } +} + +impl std::iter::Sum for Int256 +where + Self: Add, +{ + fn sum>(iter: I) -> Self { + iter.fold(Self::zero(), Add::add) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{from_slice, to_vec}; + + #[test] + fn size_of_works() { + assert_eq!(std::mem::size_of::(), 32); + } + + #[test] + fn int256_new_works() { + let num = Int256::new([1; 32]); + let a: [u8; 32] = num.to_be_bytes(); + assert_eq!(a, [1; 32]); + + let be_bytes = [ + 0u8, 222u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 2u8, 3u8, + ]; + let num = Int256::new(be_bytes); + let resulting_bytes: [u8; 32] = num.to_be_bytes(); + assert_eq!(be_bytes, resulting_bytes); + } + + #[test] + fn int256_zero_works() { + let zero = Int256::zero(); + assert_eq!(zero.to_be_bytes(), [0; 32]); + } + + #[test] + fn uin256_one_works() { + let one = Int256::one(); + let mut one_be = [0; 32]; + one_be[31] = 1; + + assert_eq!(one.to_be_bytes(), one_be); + } + + #[test] + fn int256_endianness() { + let be_bytes = [ + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 2u8, 3u8, + ]; + let le_bytes = [ + 3u8, 2u8, 1u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + ]; + + // These should all be the same. + let num1 = Int256::new(be_bytes); + let num2 = Int256::from_be_bytes(be_bytes); + let num3 = Int256::from_le_bytes(le_bytes); + assert_eq!(num1, Int256::from(65536u32 + 512 + 3)); + assert_eq!(num1, num2); + assert_eq!(num1, num3); + } + + #[test] + fn int256_convert_from() { + let a = Int256::from(5u128); + assert_eq!(a.0, I256::from(5u32)); + + let a = Int256::from(5u64); + assert_eq!(a.0, I256::from(5u32)); + + let a = Int256::from(5u32); + assert_eq!(a.0, I256::from(5u32)); + + let a = Int256::from(5u16); + assert_eq!(a.0, I256::from(5u32)); + + let a = Int256::from(5u8); + assert_eq!(a.0, I256::from(5u32)); + + let a = Int256::from(-5i128); + assert_eq!(a.0, I256::from(-5i32)); + + let a = Int256::from(-5i64); + assert_eq!(a.0, I256::from(-5i32)); + + let a = Int256::from(-5i32); + assert_eq!(a.0, I256::from(-5i32)); + + let a = Int256::from(-5i16); + assert_eq!(a.0, I256::from(-5i32)); + + let a = Int256::from(-5i8); + assert_eq!(a.0, I256::from(-5i32)); + + let result = Int256::try_from("34567"); + assert_eq!( + result.unwrap().0, + I256::from_str_radix("34567", 10).unwrap() + ); + + let result = Int256::try_from("1.23"); + assert!(result.is_err()); + } + + #[test] + fn int256_implements_display() { + let a = Int256::from(12345u32); + assert_eq!(format!("Embedded: {}", a), "Embedded: 12345"); + assert_eq!(a.to_string(), "12345"); + + let a = Int256::from(-12345i32); + assert_eq!(format!("Embedded: {}", a), "Embedded: -12345"); + assert_eq!(a.to_string(), "-12345"); + + let a = Int256::zero(); + assert_eq!(format!("Embedded: {}", a), "Embedded: 0"); + assert_eq!(a.to_string(), "0"); + } + + #[test] + fn int256_display_padding_works() { + let a = Int256::from(123u64); + assert_eq!(format!("Embedded: {:05}", a), "Embedded: 00123"); + + let a = Int256::from(-123i64); + assert_eq!(format!("Embedded: {:05}", a), "Embedded: -0123"); + } + + #[test] + fn int256_to_be_bytes_works() { + assert_eq!(Int256::zero().to_be_bytes(), [0; 32]); + + let mut max = [0xff; 32]; + max[0] = 0x7f; + assert_eq!(Int256::MAX.to_be_bytes(), max); + + let mut one = [0; 32]; + one[31] = 1; + assert_eq!(Int256::from(1u128).to_be_bytes(), one); + // Python: `[b for b in (240282366920938463463374607431768124608).to_bytes(32, "big")]` + assert_eq!( + Int256::from(240282366920938463463374607431768124608u128).to_be_bytes(), + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, 196, 179, 87, 165, 121, 59, + 133, 246, 117, 221, 191, 255, 254, 172, 192 + ] + ); + assert_eq!( + Int256::from_be_bytes([ + 17, 4, 23, 32, 87, 67, 123, 200, 58, 91, 0, 38, 33, 21, 67, 78, 87, 76, 65, 54, + 211, 201, 192, 7, 42, 233, 2, 240, 200, 115, 150, 240 + ]) + .to_be_bytes(), + [ + 17, 4, 23, 32, 87, 67, 123, 200, 58, 91, 0, 38, 33, 21, 67, 78, 87, 76, 65, 54, + 211, 201, 192, 7, 42, 233, 2, 240, 200, 115, 150, 240 + ] + ); + } + + #[test] + fn int256_to_le_bytes_works() { + assert_eq!(Int256::zero().to_le_bytes(), [0; 32]); + + let mut max = [0xff; 32]; + max[31] = 0x7f; + assert_eq!(Int256::MAX.to_le_bytes(), max); + + let mut one = [0; 32]; + one[0] = 1; + assert_eq!(Int256::from(1u128).to_le_bytes(), one); + // Python: `[b for b in (240282366920938463463374607431768124608).to_bytes(64, "little")]` + assert_eq!( + Int256::from(240282366920938463463374607431768124608u128).to_le_bytes(), + [ + 192, 172, 254, 255, 191, 221, 117, 246, 133, 59, 121, 165, 87, 179, 196, 180, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ] + ); + assert_eq!( + Int256::from_be_bytes([ + 17, 4, 23, 32, 87, 67, 123, 200, 58, 91, 0, 38, 33, 21, 67, 78, 87, 76, 65, 54, + 211, 201, 192, 7, 42, 233, 2, 240, 200, 115, 150, 240 + ]) + .to_le_bytes(), + [ + 240, 150, 115, 200, 240, 2, 233, 42, 7, 192, 201, 211, 54, 65, 76, 87, 78, 67, 21, + 33, 38, 0, 91, 58, 200, 123, 67, 87, 32, 23, 4, 17 + ] + ); + } + + #[test] + fn int256_is_zero_works() { + assert!(Int256::zero().is_zero()); + assert!(Int256(I256::from(0u32)).is_zero()); + + assert!(!Int256::from(1u32).is_zero()); + assert!(!Int256::from(123u32).is_zero()); + assert!(!Int256::from(-123i32).is_zero()); + } + + #[test] + fn int256_wrapping_methods() { + // wrapping_add + assert_eq!( + Int256::from(2u32).wrapping_add(Int256::from(2u32)), + Int256::from(4u32) + ); // non-wrapping + assert_eq!(Int256::MAX.wrapping_add(Int256::from(1u32)), Int256::MIN); // wrapping + + // wrapping_sub + assert_eq!( + Int256::from(7u32).wrapping_sub(Int256::from(5u32)), + Int256::from(2u32) + ); // non-wrapping + assert_eq!(Int256::MIN.wrapping_sub(Int256::from(1u32)), Int256::MAX); // wrapping + + // wrapping_mul + assert_eq!( + Int256::from(3u32).wrapping_mul(Int256::from(2u32)), + Int256::from(6u32) + ); // non-wrapping + assert_eq!( + Int256::MAX.wrapping_mul(Int256::from(2u32)), + Int256::from(-2i32) + ); // wrapping + + // wrapping_pow + assert_eq!(Int256::from(2u32).wrapping_pow(3), Int256::from(8u32)); // non-wrapping + assert_eq!(Int256::MAX.wrapping_pow(2), Int256::from(1u32)); // wrapping + } + + #[test] + fn int256_json() { + let orig = Int256::from(1234567890987654321u128); + let serialized = to_vec(&orig).unwrap(); + assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); + let parsed: Int256 = from_slice(&serialized).unwrap(); + assert_eq!(parsed, orig); + } + + #[test] + fn int256_compare() { + let a = Int256::from(12345u32); + let b = Int256::from(23456u32); + + assert!(a < b); + assert!(b > a); + assert_eq!(a, Int256::from(12345u32)); + } + + #[test] + #[allow(clippy::op_ref)] + fn int256_math() { + let a = Int256::from(-12345i32); + let b = Int256::from(23456u32); + + // test + with owned and reference right hand side + assert_eq!(a + b, Int256::from(11111u32)); + assert_eq!(a + &b, Int256::from(11111u32)); + + // test - with owned and reference right hand side + assert_eq!(b - a, Int256::from(35801u32)); + assert_eq!(b - &a, Int256::from(35801u32)); + + // test += with owned and reference right hand side + let mut c = Int256::from(300000u32); + c += b; + assert_eq!(c, Int256::from(323456u32)); + let mut d = Int256::from(300000u32); + d += &b; + assert_eq!(d, Int256::from(323456u32)); + + // test -= with owned and reference right hand side + let mut c = Int256::from(300000u32); + c -= b; + assert_eq!(c, Int256::from(276544u32)); + let mut d = Int256::from(300000u32); + d -= &b; + assert_eq!(d, Int256::from(276544u32)); + + // test - with negative result + assert_eq!(a - b, Int256::from(-35801i32)); + } + + #[test] + #[should_panic] + fn int256_add_overflow_panics() { + let _ = Int256::MAX + Int256::from(12u32); + } + + #[test] + #[allow(clippy::op_ref)] + fn int256_sub_works() { + assert_eq!(Int256::from(2u32) - Int256::from(1u32), Int256::from(1u32)); + assert_eq!(Int256::from(2u32) - Int256::from(0u32), Int256::from(2u32)); + assert_eq!(Int256::from(2u32) - Int256::from(2u32), Int256::from(0u32)); + assert_eq!(Int256::from(2u32) - Int256::from(3u32), Int256::from(-1i32)); + + // works for refs + let a = Int256::from(10u32); + let b = Int256::from(3u32); + let expected = Int256::from(7u32); + assert_eq!(a - b, expected); + assert_eq!(a - &b, expected); + assert_eq!(&a - b, expected); + assert_eq!(&a - &b, expected); + } + + #[test] + #[should_panic] + fn int256_sub_overflow_panics() { + let _ = Int256::MIN + Int256::one() - Int256::from(2u32); + } + + #[test] + fn int256_sub_assign_works() { + let mut a = Int256::from(14u32); + a -= Int256::from(2u32); + assert_eq!(a, Int256::from(12u32)); + + // works for refs + let mut a = Int256::from(10u32); + let b = Int256::from(3u32); + let expected = Int256::from(7u32); + a -= &b; + assert_eq!(a, expected); + } + + #[test] + #[allow(clippy::op_ref)] + fn int256_mul_works() { + assert_eq!(Int256::from(2u32) * Int256::from(3u32), Int256::from(6u32)); + assert_eq!(Int256::from(2u32) * Int256::zero(), Int256::zero()); + + // works for refs + let a = Int256::from(11u32); + let b = Int256::from(3u32); + let expected = Int256::from(33u32); + assert_eq!(a * b, expected); + assert_eq!(a * &b, expected); + assert_eq!(&a * b, expected); + assert_eq!(&a * &b, expected); + } + + #[test] + fn int256_mul_assign_works() { + let mut a = Int256::from(14u32); + a *= Int256::from(2u32); + assert_eq!(a, Int256::from(28u32)); + + // works for refs + let mut a = Int256::from(10u32); + let b = Int256::from(3u32); + a *= &b; + assert_eq!(a, Int256::from(30u32)); + } + + #[test] + fn int256_pow_works() { + assert_eq!(Int256::from(2u32).pow(2), Int256::from(4u32)); + assert_eq!(Int256::from(2u32).pow(10), Int256::from(1024u32)); + } + + #[test] + #[should_panic] + fn int256_pow_overflow_panics() { + _ = Int256::MAX.pow(2u32); + } + + #[test] + fn int256_shr_works() { + let original = Int256::new([ + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 2u8, 0u8, 4u8, 2u8, + ]); + + let shifted = Int256::new([ + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 128u8, 1u8, 0u8, + ]); + + assert_eq!(original >> 2u32, shifted); + } + + #[test] + #[should_panic] + fn int256_shr_overflow_panics() { + let _ = Int256::from(1u32) >> 256u32; + } + + #[test] + fn int256_checked_neg() { + assert_eq!(Int256::one().checked_neg(), Ok(Int256::from(-1i32))); + assert!(matches!( + Int256::MIN.checked_neg(), + Err(OverflowError { .. }) + )); + assert_eq!(Int256::MAX.checked_neg(), Ok(Int256::MIN + Int256::one())); + } + + #[test] + fn sum_works() { + let nums = vec![ + Int256::from(17u32), + Int256::from(123u32), + Int256::from(540u32), + Int256::from(82u32), + ]; + let expected = Int256::from(762u32); + + let sum_as_ref: Int256 = nums.iter().sum(); + assert_eq!(expected, sum_as_ref); + + let sum_as_owned: Int256 = nums.into_iter().sum(); + assert_eq!(expected, sum_as_owned); + } + + #[test] + fn int256_methods() { + // checked_* + assert!(matches!( + Int256::MAX.checked_add(Int256::from(1u32)), + Err(OverflowError { .. }) + )); + assert_eq!( + Int256::from(1u32).checked_add(Int256::from(1u32)), + Ok(Int256::from(2u32)), + ); + assert!(matches!( + Int256::MIN.checked_sub(Int256::from(1u32)), + Err(OverflowError { .. }) + )); + assert_eq!( + Int256::from(2u32).checked_sub(Int256::from(1u32)), + Ok(Int256::from(1u32)), + ); + assert!(matches!( + Int256::MAX.checked_mul(Int256::from(2u32)), + Err(OverflowError { .. }) + )); + assert_eq!( + Int256::from(2u32).checked_mul(Int256::from(2u32)), + Ok(Int256::from(4u32)), + ); + assert!(matches!( + Int256::MAX.checked_pow(2u32), + Err(OverflowError { .. }) + )); + assert_eq!(Int256::from(2u32).checked_pow(3u32), Ok(Int256::from(8u32)),); + assert_eq!( + Int256::MAX.checked_div(Int256::from(0u32)), + Err(DivisionError::DivideByZero) + ); + assert_eq!( + Int256::from(6u32).checked_div(Int256::from(2u32)), + Ok(Int256::from(3u32)), + ); + assert_eq!( + Int256::MAX.checked_div_euclid(Int256::from(0u32)), + Err(DivisionError::DivideByZero) + ); + assert_eq!( + Int256::from(6u32).checked_div_euclid(Int256::from(2u32)), + Ok(Int256::from(3u32)), + ); + assert_eq!( + Int256::from(7u32).checked_div_euclid(Int256::from(2u32)), + Ok(Int256::from(3u32)), + ); + assert!(matches!( + Int256::MAX.checked_rem(Int256::from(0u32)), + Err(DivideByZeroError { .. }) + )); + // checked_* with negative numbers + assert_eq!( + Int256::from(-12i32).checked_div(Int256::from(10i32)), + Ok(Int256::from(-1i32)), + ); + assert_eq!( + Int256::from(-2i32).checked_pow(3u32), + Ok(Int256::from(-8i32)), + ); + assert_eq!( + Int256::from(-6i32).checked_mul(Int256::from(-7i32)), + Ok(Int256::from(42i32)), + ); + assert_eq!( + Int256::from(-2i32).checked_add(Int256::from(3i32)), + Ok(Int256::from(1i32)), + ); + assert_eq!( + Int256::from(-1i32).checked_div_euclid(Int256::from(-2i32)), + Ok(Int256::from(1u32)), + ); + + // saturating_* + assert_eq!(Int256::MAX.saturating_add(Int256::from(1u32)), Int256::MAX); + assert_eq!(Int256::MIN.saturating_sub(Int256::from(1u32)), Int256::MIN); + assert_eq!(Int256::MAX.saturating_mul(Int256::from(2u32)), Int256::MAX); + assert_eq!(Int256::from(4u32).saturating_pow(2u32), Int256::from(16u32)); + assert_eq!(Int256::MAX.saturating_pow(2u32), Int256::MAX); + } + + #[test] + #[allow(clippy::op_ref)] + fn int256_implements_rem() { + let a = Int256::from(10u32); + assert_eq!(a % Int256::from(10u32), Int256::zero()); + assert_eq!(a % Int256::from(2u32), Int256::zero()); + assert_eq!(a % Int256::from(1u32), Int256::zero()); + assert_eq!(a % Int256::from(3u32), Int256::from(1u32)); + assert_eq!(a % Int256::from(4u32), Int256::from(2u32)); + + assert_eq!( + Int256::from(-12i32) % Int256::from(10i32), + Int256::from(-2i32) + ); + assert_eq!( + Int256::from(12i32) % Int256::from(-10i32), + Int256::from(2i32) + ); + assert_eq!( + Int256::from(-12i32) % Int256::from(-10i32), + Int256::from(-2i32) + ); + + // works for refs + let a = Int256::from(10u32); + let b = Int256::from(3u32); + let expected = Int256::from(1u32); + assert_eq!(a % b, expected); + assert_eq!(a % &b, expected); + assert_eq!(&a % b, expected); + assert_eq!(&a % &b, expected); + } + + #[test] + #[should_panic(expected = "divisor of zero")] + fn int256_rem_panics_for_zero() { + let _ = Int256::from(10u32) % Int256::zero(); + } + + #[test] + fn int256_rem_assign_works() { + let mut a = Int256::from(30u32); + a %= Int256::from(4u32); + assert_eq!(a, Int256::from(2u32)); + + // works for refs + let mut a = Int256::from(25u32); + let b = Int256::from(6u32); + a %= &b; + assert_eq!(a, Int256::from(1u32)); + } + + #[test] + fn int256_shr() { + let x: Int256 = 0x8000_0000_0000_0000_0000_0000_0000_0000u128.into(); + assert_eq!(x >> 0, x); // right shift by 0 should be no-op + assert_eq!( + x >> 1, + Int256::from(0x4000_0000_0000_0000_0000_0000_0000_0000u128) + ); + assert_eq!( + x >> 4, + Int256::from(0x0800_0000_0000_0000_0000_0000_0000_0000u128) + ); + // right shift of MIN value by the maximum shift value should result in -1 (filled with 1s) + assert_eq!( + Int256::MIN >> (std::mem::size_of::() as u32 * 8 - 1), + -Int256::one() + ); + } + + #[test] + fn int256_shl() { + let x: Int256 = 0x0800_0000_0000_0000_0000_0000_0000_0000u128.into(); + assert_eq!(x << 0, x); // left shift by 0 should be no-op + assert_eq!( + x << 1, + Int256::from(0x1000_0000_0000_0000_0000_0000_0000_0000u128) + ); + assert_eq!( + x << 4, + Int256::from(0x8000_0000_0000_0000_0000_0000_0000_0000u128) + ); + // left shift by by the maximum shift value should result in MIN + assert_eq!( + Int256::one() << (std::mem::size_of::() as u32 * 8 - 1), + Int256::MIN + ); + } + + #[test] + fn int256_abs_diff_works() { + let a = Int256::from(42u32); + let b = Int256::from(5u32); + let expected = Uint256::from(37u32); + assert_eq!(a.abs_diff(b), expected); + assert_eq!(b.abs_diff(a), expected); + + let c = Int256::from(-5i32); + assert_eq!(b.abs_diff(c), Uint256::from(10u32)); + assert_eq!(c.abs_diff(b), Uint256::from(10u32)); + } + + #[test] + #[should_panic = "attempt to negate with overflow"] + fn int256_neg_min_panics() { + _ = -Int256::MIN; + } + + #[test] + fn int256_partial_eq() { + let test_cases = [(1, 1, true), (42, 42, true), (42, 24, false), (0, 0, true)] + .into_iter() + .map(|(lhs, rhs, expected): (u64, u64, bool)| { + (Int256::from(lhs), Int256::from(rhs), expected) + }); + + #[allow(clippy::op_ref)] + for (lhs, rhs, expected) in test_cases { + assert_eq!(lhs == rhs, expected); + assert_eq!(&lhs == rhs, expected); + assert_eq!(lhs == &rhs, expected); + assert_eq!(&lhs == &rhs, expected); + } + } +} diff --git a/packages/std/src/math/mod.rs b/packages/std/src/math/mod.rs index ee514f36b8..d1cce93bf5 100644 --- a/packages/std/src/math/mod.rs +++ b/packages/std/src/math/mod.rs @@ -1,6 +1,7 @@ mod decimal; mod decimal256; mod fraction; +mod int256; mod int512; mod isqrt; mod uint128; @@ -11,6 +12,7 @@ mod uint64; pub use decimal::{Decimal, DecimalRangeExceeded}; pub use decimal256::{Decimal256, Decimal256RangeExceeded}; pub use fraction::Fraction; +pub use int256::Int256; pub use int512::Int512; pub use isqrt::Isqrt; pub use uint128::Uint128; From 49867d900ff083f46ded912816cee06636a0b53e Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 28 Jun 2023 17:18:45 +0200 Subject: [PATCH 0495/2372] Fix typo --- packages/std/src/math/int256.rs | 2 +- packages/std/src/math/int512.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index 211719d1e6..d8d666e1e8 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -603,7 +603,7 @@ mod tests { } #[test] - fn uin256_one_works() { + fn uint256_one_works() { let one = Int256::one(); let mut one_be = [0; 32]; one_be[31] = 1; diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index b4f5655e89..7fbb89411b 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -641,7 +641,7 @@ mod tests { } #[test] - fn uin512_one_works() { + fn uint512_one_works() { let one = Int512::one(); let mut one_be = [0; 64]; one_be[63] = 1; From b395d8e7cb960446677388921c9c99eed4b80607 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 28 Jun 2023 17:18:54 +0200 Subject: [PATCH 0496/2372] Add Int128 --- packages/std/src/lib.rs | 2 +- packages/std/src/math/int128.rs | 1106 ++++++++++++++++++++++++++++++ packages/std/src/math/mod.rs | 2 + packages/std/src/math/uint128.rs | 2 +- 4 files changed, 1110 insertions(+), 2 deletions(-) create mode 100644 packages/std/src/math/int128.rs diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index e6abac0efb..a0a6a546d8 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -52,7 +52,7 @@ pub use crate::ibc::{ #[cfg(feature = "iterator")] pub use crate::iterator::{Order, Record}; pub use crate::math::{ - Decimal, Decimal256, Decimal256RangeExceeded, DecimalRangeExceeded, Fraction, Int256, Int512, + Decimal, Decimal256, Decimal256RangeExceeded, DecimalRangeExceeded, Fraction, Int256, Int512, Int128, Isqrt, Uint128, Uint256, Uint512, Uint64, }; pub use crate::metadata::{DenomMetadata, DenomUnit}; diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs new file mode 100644 index 0000000000..c88c4b3a79 --- /dev/null +++ b/packages/std/src/math/int128.rs @@ -0,0 +1,1106 @@ +use forward_ref::{forward_ref_binop, forward_ref_op_assign}; +use schemars::JsonSchema; +use serde::{de, ser, Deserialize, Deserializer, Serialize}; +use std::fmt; +use std::ops::{ + Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Not, Rem, RemAssign, Shl, ShlAssign, Shr, + ShrAssign, Sub, SubAssign, +}; +use std::str::FromStr; + +use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; +use crate::{forward_ref_partial_eq, Uint128, Uint64}; + +/// An implementation of i128 that is using strings for JSON encoding/decoding, +/// such that the full i128 range can be used for clients that convert JSON numbers to floats, +/// like JavaScript and jq. +/// +/// # Examples +/// +/// Use `from` to create instances out of primitive uint types or `new` to provide big +/// endian bytes: +/// +/// ``` +/// # use cosmwasm_std::Int128; +/// let a = Int128::from(258i128); +/// let b = Int128::new([ +/// 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, +/// 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 2u8, +/// ]); +/// assert_eq!(a, b); +/// ``` +#[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] +pub struct Int128(#[schemars(with = "String")] i128); + +forward_ref_partial_eq!(Int128, Int128); + +impl Int128 { + pub const MAX: Int128 = Int128(i128::MAX); + pub const MIN: Int128 = Int128(i128::MIN); + + /// Creates a Int128(value) from a big endian representation. It's just an alias for + /// `from_be_bytes`. + #[inline] + pub const fn new(value: [u8; 16]) -> Self { + Self::from_be_bytes(value) + } + + /// Creates a Int128(0) + #[inline] + pub const fn zero() -> Self { + Int128(0) + } + + /// Creates a Int128(1) + #[inline] + pub const fn one() -> Self { + Self(1) + } + + #[must_use] + pub const fn from_be_bytes(data: [u8; 16]) -> Self { + Self(i128::from_be_bytes(data)) + } + + #[must_use] + pub const fn from_le_bytes(data: [u8; 16]) -> Self { + Self(i128::from_le_bytes(data)) + } + + /// Returns a copy of the number as big endian bytes. + #[must_use = "this returns the result of the operation, without modifying the original"] + pub const fn to_be_bytes(self) -> [u8; 16] { + self.0.to_be_bytes() + } + + /// Returns a copy of the number as little endian bytes. + #[must_use = "this returns the result of the operation, without modifying the original"] + pub const fn to_le_bytes(self) -> [u8; 16] { + self.0.to_le_bytes() + } + + #[must_use] + pub const fn is_zero(&self) -> bool { + self.0 == 0 + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn pow(self, exp: u32) -> Self { + Self(self.0.pow(exp)) + } + + pub fn checked_add(self, other: Self) -> Result { + self.0 + .checked_add(other.0) + .map(Self) + .ok_or_else(|| OverflowError::new(OverflowOperation::Add, self, other)) + } + + pub fn checked_sub(self, other: Self) -> Result { + self.0 + .checked_sub(other.0) + .map(Self) + .ok_or_else(|| OverflowError::new(OverflowOperation::Sub, self, other)) + } + + pub fn checked_mul(self, other: Self) -> Result { + self.0 + .checked_mul(other.0) + .map(Self) + .ok_or_else(|| OverflowError::new(OverflowOperation::Mul, self, other)) + } + + pub fn checked_pow(self, exp: u32) -> Result { + self.0 + .checked_pow(exp) + .map(Self) + .ok_or_else(|| OverflowError::new(OverflowOperation::Pow, self, exp)) + } + + pub fn checked_div(self, other: Self) -> Result { + if other.is_zero() { + return Err(DivisionError::DivideByZero); + } + self.0 + .checked_div(other.0) + .map(Self) + .ok_or(DivisionError::Overflow) + } + + pub fn checked_div_euclid(self, other: Self) -> Result { + if other.is_zero() { + return Err(DivisionError::DivideByZero); + } + self.0 + .checked_div_euclid(other.0) + .map(Self) + .ok_or(DivisionError::Overflow) + } + + pub fn checked_rem(self, other: Self) -> Result { + self.0 + .checked_rem(other.0) + .map(Self) + .ok_or_else(|| DivideByZeroError::new(self)) + } + + pub fn checked_shr(self, other: u32) -> Result { + if other >= 128 { + return Err(OverflowError::new(OverflowOperation::Shr, self, other)); + } + + Ok(Self(self.0.shr(other))) + } + + pub fn checked_shl(self, other: u32) -> Result { + if other >= 128 { + return Err(OverflowError::new(OverflowOperation::Shr, self, other)); + } + + Ok(Self(self.0.shl(other))) + } + + pub fn checked_neg(self) -> Result { + self.0 + .checked_neg() + .map(Self) + .ok_or_else(|| OverflowError::new(OverflowOperation::Neg, self, self)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + #[inline] + pub fn wrapping_add(self, other: Self) -> Self { + Self(self.0.wrapping_add(other.0)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + #[inline] + pub fn wrapping_sub(self, other: Self) -> Self { + Self(self.0.wrapping_sub(other.0)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + #[inline] + pub fn wrapping_mul(self, other: Self) -> Self { + Self(self.0.wrapping_mul(other.0)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + #[inline] + pub fn wrapping_pow(self, other: u32) -> Self { + Self(self.0.wrapping_pow(other)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn saturating_add(self, other: Self) -> Self { + Self(self.0.saturating_add(other.0)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn saturating_sub(self, other: Self) -> Self { + Self(self.0.saturating_sub(other.0)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn saturating_mul(self, other: Self) -> Self { + Self(self.0.saturating_mul(other.0)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn saturating_pow(self, exp: u32) -> Self { + Self(self.0.saturating_pow(exp)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn abs_diff(self, other: Self) -> Uint128 { + Uint128(self.0.abs_diff(other.0)) + } +} + +impl From for Int128 { + fn from(val: Uint64) -> Self { + val.u64().into() + } +} + +impl From for Int128 { + fn from(val: u64) -> Self { + Int128(val.into()) + } +} + +impl From for Int128 { + fn from(val: u32) -> Self { + Int128(val.into()) + } +} + +impl From for Int128 { + fn from(val: u16) -> Self { + Int128(val.into()) + } +} + +impl From for Int128 { + fn from(val: u8) -> Self { + Int128(val.into()) + } +} + +impl From for Int128 { + fn from(val: i128) -> Self { + Int128(val) + } +} + +impl From for Int128 { + fn from(val: i64) -> Self { + Int128(val.into()) + } +} + +impl From for Int128 { + fn from(val: i32) -> Self { + Int128(val.into()) + } +} + +impl From for Int128 { + fn from(val: i16) -> Self { + Int128(val.into()) + } +} + +impl From for Int128 { + fn from(val: i8) -> Self { + Int128(val.into()) + } +} + +impl TryFrom<&str> for Int128 { + type Error = StdError; + + fn try_from(val: &str) -> Result { + Self::from_str(val) + } +} + +impl FromStr for Int128 { + type Err = StdError; + + fn from_str(s: &str) -> Result { + match s.parse::() { + Ok(u) => Ok(Self(u)), + Err(e) => Err(StdError::generic_err(format!("Parsing Int128: {}", e))), + } + } +} + +impl From for String { + fn from(original: Int128) -> Self { + original.to_string() + } +} + +impl fmt::Display for Int128 { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + // The inner type doesn't work as expected with padding, so we + // work around that. Remove this code when the upstream padding is fixed. + let unpadded = self.0.to_string(); + let numeric = unpadded.strip_prefix('-').unwrap_or(&unpadded); + + f.pad_integral(self >= &Self::zero(), "", numeric) + } +} + +impl Add for Int128 { + type Output = Self; + + fn add(self, rhs: Self) -> Self { + Int128(self.0.checked_add(rhs.0).unwrap()) + } +} +forward_ref_binop!(impl Add, add for Int128, Int128); + +impl Sub for Int128 { + type Output = Self; + + fn sub(self, rhs: Self) -> Self { + Int128(self.0.checked_sub(rhs.0).unwrap()) + } +} +forward_ref_binop!(impl Sub, sub for Int128, Int128); + +impl SubAssign for Int128 { + fn sub_assign(&mut self, rhs: Int128) { + self.0 = self.0.checked_sub(rhs.0).unwrap(); + } +} +forward_ref_op_assign!(impl SubAssign, sub_assign for Int128, Int128); + +impl Div for Int128 { + type Output = Self; + + fn div(self, rhs: Self) -> Self::Output { + Self(self.0.checked_div(rhs.0).unwrap()) + } +} +forward_ref_binop!(impl Div, div for Int128, Int128); + +impl Rem for Int128 { + type Output = Self; + + /// # Panics + /// + /// This operation will panic if `rhs` is zero. + #[inline] + fn rem(self, rhs: Self) -> Self { + Self(self.0.rem(rhs.0)) + } +} +forward_ref_binop!(impl Rem, rem for Int128, Int128); + +impl Not for Int128 { + type Output = Self; + + fn not(self) -> Self::Output { + Self(!self.0) + } +} + +impl Neg for Int128 { + type Output = Self; + + fn neg(self) -> Self::Output { + Self(-self.0) + } +} + +impl RemAssign for Int128 { + fn rem_assign(&mut self, rhs: Int128) { + *self = *self % rhs; + } +} +forward_ref_op_assign!(impl RemAssign, rem_assign for Int128, Int128); + +impl Mul for Int128 { + type Output = Self; + + fn mul(self, rhs: Self) -> Self::Output { + Self(self.0.checked_mul(rhs.0).unwrap()) + } +} +forward_ref_binop!(impl Mul, mul for Int128, Int128); + +impl MulAssign for Int128 { + fn mul_assign(&mut self, rhs: Self) { + self.0 = self.0.checked_mul(rhs.0).unwrap(); + } +} +forward_ref_op_assign!(impl MulAssign, mul_assign for Int128, Int128); + +impl Shr for Int128 { + type Output = Self; + + fn shr(self, rhs: u32) -> Self::Output { + self.checked_shr(rhs).unwrap_or_else(|_| { + panic!( + "right shift error: {} is larger or equal than the number of bits in Int128", + rhs, + ) + }) + } +} +forward_ref_binop!(impl Shr, shr for Int128, u32); + +impl Shl for Int128 { + type Output = Self; + + fn shl(self, rhs: u32) -> Self::Output { + self.checked_shl(rhs).unwrap_or_else(|_| { + panic!( + "left shift error: {} is larger or equal than the number of bits in Int128", + rhs, + ) + }) + } +} +forward_ref_binop!(impl Shl, shl for Int128, u32); + +impl AddAssign for Int128 { + fn add_assign(&mut self, rhs: Int128) { + self.0 = self.0.checked_add(rhs.0).unwrap(); + } +} +forward_ref_op_assign!(impl AddAssign, add_assign for Int128, Int128); + +impl DivAssign for Int128 { + fn div_assign(&mut self, rhs: Self) { + self.0 = self.0.checked_div(rhs.0).unwrap(); + } +} +forward_ref_op_assign!(impl DivAssign, div_assign for Int128, Int128); + +impl ShrAssign for Int128 { + fn shr_assign(&mut self, rhs: u32) { + *self = Shr::::shr(*self, rhs); + } +} +forward_ref_op_assign!(impl ShrAssign, shr_assign for Int128, u32); + +impl ShlAssign for Int128 { + fn shl_assign(&mut self, rhs: u32) { + *self = Shl::::shl(*self, rhs); + } +} +forward_ref_op_assign!(impl ShlAssign, shl_assign for Int128, u32); + +impl Serialize for Int128 { + /// Serializes as an integer string using base 10 + fn serialize(&self, serializer: S) -> Result + where + S: ser::Serializer, + { + serializer.serialize_str(&self.to_string()) + } +} + +impl<'de> Deserialize<'de> for Int128 { + /// Deserialized from an integer string using base 10 + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_str(Int128Visitor) + } +} + +struct Int128Visitor; + +impl<'de> de::Visitor<'de> for Int128Visitor { + type Value = Int128; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("string-encoded integer") + } + + fn visit_str(self, v: &str) -> Result + where + E: de::Error, + { + Int128::try_from(v).map_err(|e| E::custom(format!("invalid Int128 '{}' - {}", v, e))) + } +} + +impl std::iter::Sum for Int128 +where + Self: Add, +{ + fn sum>(iter: I) -> Self { + iter.fold(Self::zero(), Add::add) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{from_slice, to_vec}; + + #[test] + fn size_of_works() { + assert_eq!(std::mem::size_of::(), 16); + } + + #[test] + fn int128_new_works() { + let num = Int128::new([1; 16]); + let a: [u8; 16] = num.to_be_bytes(); + assert_eq!(a, [1; 16]); + + let be_bytes = [ + 0u8, 222u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 2u8, 3u8, + ]; + let num = Int128::new(be_bytes); + let resulting_bytes: [u8; 16] = num.to_be_bytes(); + assert_eq!(be_bytes, resulting_bytes); + } + + #[test] + fn int128_zero_works() { + let zero = Int128::zero(); + assert_eq!(zero.to_be_bytes(), [0; 16]); + } + + #[test] + fn uint128_one_works() { + let one = Int128::one(); + let mut one_be = [0; 16]; + one_be[15] = 1; + + assert_eq!(one.to_be_bytes(), one_be); + } + + #[test] + fn int128_endianness() { + let be_bytes = [ + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 2u8, 3u8, + ]; + let le_bytes = [ + 3u8, 2u8, 1u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + ]; + + // These should all be the same. + let num1 = Int128::new(be_bytes); + let num2 = Int128::from_be_bytes(be_bytes); + let num3 = Int128::from_le_bytes(le_bytes); + assert_eq!(num1, Int128::from(65536u32 + 512 + 3)); + assert_eq!(num1, num2); + assert_eq!(num1, num3); + } + + #[test] + fn int128_convert_from() { + let a = Int128::from(5i128); + assert_eq!(a.0, i128::from(5u32)); + + let a = Int128::from(5u64); + assert_eq!(a.0, i128::from(5u32)); + + let a = Int128::from(5u32); + assert_eq!(a.0, i128::from(5u32)); + + let a = Int128::from(5u16); + assert_eq!(a.0, i128::from(5u32)); + + let a = Int128::from(5u8); + assert_eq!(a.0, i128::from(5u32)); + + let a = Int128::from(-5i128); + assert_eq!(a.0, i128::from(-5i32)); + + let a = Int128::from(-5i64); + assert_eq!(a.0, i128::from(-5i32)); + + let a = Int128::from(-5i32); + assert_eq!(a.0, i128::from(-5i32)); + + let a = Int128::from(-5i16); + assert_eq!(a.0, i128::from(-5i32)); + + let a = Int128::from(-5i8); + assert_eq!(a.0, i128::from(-5i32)); + + let result = Int128::try_from("34567"); + assert_eq!(result.unwrap().0, "34567".parse::().unwrap()); + + let result = Int128::try_from("1.23"); + assert!(result.is_err()); + } + + #[test] + fn int128_implements_display() { + let a = Int128::from(12345u32); + assert_eq!(format!("Embedded: {}", a), "Embedded: 12345"); + assert_eq!(a.to_string(), "12345"); + + let a = Int128::from(-12345i32); + assert_eq!(format!("Embedded: {}", a), "Embedded: -12345"); + assert_eq!(a.to_string(), "-12345"); + + let a = Int128::zero(); + assert_eq!(format!("Embedded: {}", a), "Embedded: 0"); + assert_eq!(a.to_string(), "0"); + } + + #[test] + fn int128_display_padding_works() { + let a = Int128::from(123u64); + assert_eq!(format!("Embedded: {:05}", a), "Embedded: 00123"); + + let a = Int128::from(-123i64); + assert_eq!(format!("Embedded: {:05}", a), "Embedded: -0123"); + } + + #[test] + fn int128_to_be_bytes_works() { + assert_eq!(Int128::zero().to_be_bytes(), [0; 16]); + + let mut max = [0xff; 16]; + max[0] = 0x7f; + assert_eq!(Int128::MAX.to_be_bytes(), max); + + let mut one = [0; 16]; + one[15] = 1; + assert_eq!(Int128::from(1i128).to_be_bytes(), one); + // Python: `[b for b in (70141183460469231731687303715884018880).to_bytes(16, "big")]` + assert_eq!( + Int128::from(70141183460469231731687303715884018880i128).to_be_bytes(), + [52, 196, 179, 87, 165, 121, 59, 133, 246, 117, 221, 191, 255, 254, 172, 192] + ); + assert_eq!( + Int128::from_be_bytes([17, 4, 23, 32, 87, 67, 123, 200, 58, 91, 0, 38, 33, 21, 67, 78]) + .to_be_bytes(), + [17, 4, 23, 32, 87, 67, 123, 200, 58, 91, 0, 38, 33, 21, 67, 78] + ); + } + + #[test] + fn int128_to_le_bytes_works() { + assert_eq!(Int128::zero().to_le_bytes(), [0; 16]); + + let mut max = [0xff; 16]; + max[15] = 0x7f; + assert_eq!(Int128::MAX.to_le_bytes(), max); + + let mut one = [0; 16]; + one[0] = 1; + assert_eq!(Int128::from(1i128).to_le_bytes(), one); + // Python: `[b for b in (70141183460469231731687303715884018880).to_bytes(16, "little")]` + assert_eq!( + Int128::from(70141183460469231731687303715884018880i128).to_le_bytes(), + [192, 172, 254, 255, 191, 221, 117, 246, 133, 59, 121, 165, 87, 179, 196, 52] + ); + assert_eq!( + Int128::from_be_bytes([17, 4, 23, 32, 87, 67, 123, 200, 58, 91, 0, 38, 33, 21, 67, 78]) + .to_le_bytes(), + [78, 67, 21, 33, 38, 0, 91, 58, 200, 123, 67, 87, 32, 23, 4, 17] + ); + } + + #[test] + fn int128_is_zero_works() { + assert!(Int128::zero().is_zero()); + assert!(Int128(i128::from(0u32)).is_zero()); + + assert!(!Int128::from(1u32).is_zero()); + assert!(!Int128::from(123u32).is_zero()); + assert!(!Int128::from(-123i32).is_zero()); + } + + #[test] + fn int128_wrapping_methods() { + // wrapping_add + assert_eq!( + Int128::from(2u32).wrapping_add(Int128::from(2u32)), + Int128::from(4u32) + ); // non-wrapping + assert_eq!(Int128::MAX.wrapping_add(Int128::from(1u32)), Int128::MIN); // wrapping + + // wrapping_sub + assert_eq!( + Int128::from(7u32).wrapping_sub(Int128::from(5u32)), + Int128::from(2u32) + ); // non-wrapping + assert_eq!(Int128::MIN.wrapping_sub(Int128::from(1u32)), Int128::MAX); // wrapping + + // wrapping_mul + assert_eq!( + Int128::from(3u32).wrapping_mul(Int128::from(2u32)), + Int128::from(6u32) + ); // non-wrapping + assert_eq!( + Int128::MAX.wrapping_mul(Int128::from(2u32)), + Int128::from(-2i32) + ); // wrapping + + // wrapping_pow + assert_eq!(Int128::from(2u32).wrapping_pow(3), Int128::from(8u32)); // non-wrapping + assert_eq!(Int128::MAX.wrapping_pow(2), Int128::from(1u32)); // wrapping + } + + #[test] + fn int128_json() { + let orig = Int128::from(1234567890987654321i128); + let serialized = to_vec(&orig).unwrap(); + assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); + let parsed: Int128 = from_slice(&serialized).unwrap(); + assert_eq!(parsed, orig); + } + + #[test] + fn int128_compare() { + let a = Int128::from(12345u32); + let b = Int128::from(23456u32); + + assert!(a < b); + assert!(b > a); + assert_eq!(a, Int128::from(12345u32)); + } + + #[test] + #[allow(clippy::op_ref)] + fn int128_math() { + let a = Int128::from(-12345i32); + let b = Int128::from(23456u32); + + // test + with owned and reference right hand side + assert_eq!(a + b, Int128::from(11111u32)); + assert_eq!(a + &b, Int128::from(11111u32)); + + // test - with owned and reference right hand side + assert_eq!(b - a, Int128::from(35801u32)); + assert_eq!(b - &a, Int128::from(35801u32)); + + // test += with owned and reference right hand side + let mut c = Int128::from(300000u32); + c += b; + assert_eq!(c, Int128::from(323456u32)); + let mut d = Int128::from(300000u32); + d += &b; + assert_eq!(d, Int128::from(323456u32)); + + // test -= with owned and reference right hand side + let mut c = Int128::from(300000u32); + c -= b; + assert_eq!(c, Int128::from(276544u32)); + let mut d = Int128::from(300000u32); + d -= &b; + assert_eq!(d, Int128::from(276544u32)); + + // test - with negative result + assert_eq!(a - b, Int128::from(-35801i32)); + } + + #[test] + #[should_panic] + fn int128_add_overflow_panics() { + let _ = Int128::MAX + Int128::from(12u32); + } + + #[test] + #[allow(clippy::op_ref)] + fn int128_sub_works() { + assert_eq!(Int128::from(2u32) - Int128::from(1u32), Int128::from(1u32)); + assert_eq!(Int128::from(2u32) - Int128::from(0u32), Int128::from(2u32)); + assert_eq!(Int128::from(2u32) - Int128::from(2u32), Int128::from(0u32)); + assert_eq!(Int128::from(2u32) - Int128::from(3u32), Int128::from(-1i32)); + + // works for refs + let a = Int128::from(10u32); + let b = Int128::from(3u32); + let expected = Int128::from(7u32); + assert_eq!(a - b, expected); + assert_eq!(a - &b, expected); + assert_eq!(&a - b, expected); + assert_eq!(&a - &b, expected); + } + + #[test] + #[should_panic] + fn int128_sub_overflow_panics() { + let _ = Int128::MIN + Int128::one() - Int128::from(2u32); + } + + #[test] + fn int128_sub_assign_works() { + let mut a = Int128::from(14u32); + a -= Int128::from(2u32); + assert_eq!(a, Int128::from(12u32)); + + // works for refs + let mut a = Int128::from(10u32); + let b = Int128::from(3u32); + let expected = Int128::from(7u32); + a -= &b; + assert_eq!(a, expected); + } + + #[test] + #[allow(clippy::op_ref)] + fn int128_mul_works() { + assert_eq!(Int128::from(2u32) * Int128::from(3u32), Int128::from(6u32)); + assert_eq!(Int128::from(2u32) * Int128::zero(), Int128::zero()); + + // works for refs + let a = Int128::from(11u32); + let b = Int128::from(3u32); + let expected = Int128::from(33u32); + assert_eq!(a * b, expected); + assert_eq!(a * &b, expected); + assert_eq!(&a * b, expected); + assert_eq!(&a * &b, expected); + } + + #[test] + fn int128_mul_assign_works() { + let mut a = Int128::from(14u32); + a *= Int128::from(2u32); + assert_eq!(a, Int128::from(28u32)); + + // works for refs + let mut a = Int128::from(10u32); + let b = Int128::from(3u32); + a *= &b; + assert_eq!(a, Int128::from(30u32)); + } + + #[test] + fn int128_pow_works() { + assert_eq!(Int128::from(2u32).pow(2), Int128::from(4u32)); + assert_eq!(Int128::from(2u32).pow(10), Int128::from(1024u32)); + } + + #[test] + #[should_panic] + fn int128_pow_overflow_panics() { + _ = Int128::MAX.pow(2u32); + } + + #[test] + fn int128_shr_works() { + let original = Int128::new([ + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 2u8, 0u8, 4u8, 2u8, + ]); + + let shifted = Int128::new([ + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 128u8, 1u8, 0u8, + ]); + + assert_eq!(original >> 2u32, shifted); + } + + #[test] + #[should_panic] + fn int128_shr_overflow_panics() { + let _ = Int128::from(1u32) >> 128u32; + } + + #[test] + fn int128_checked_neg() { + assert_eq!(Int128::one().checked_neg(), Ok(Int128::from(-1i32))); + assert!(matches!( + Int128::MIN.checked_neg(), + Err(OverflowError { .. }) + )); + assert_eq!(Int128::MAX.checked_neg(), Ok(Int128::MIN + Int128::one())); + } + + #[test] + fn sum_works() { + let nums = vec![ + Int128::from(17u32), + Int128::from(123u32), + Int128::from(540u32), + Int128::from(82u32), + ]; + let expected = Int128::from(762u32); + + let sum_as_ref: Int128 = nums.iter().sum(); + assert_eq!(expected, sum_as_ref); + + let sum_as_owned: Int128 = nums.into_iter().sum(); + assert_eq!(expected, sum_as_owned); + } + + #[test] + fn int128_methods() { + // checked_* + assert!(matches!( + Int128::MAX.checked_add(Int128::from(1u32)), + Err(OverflowError { .. }) + )); + assert_eq!( + Int128::from(1u32).checked_add(Int128::from(1u32)), + Ok(Int128::from(2u32)), + ); + assert!(matches!( + Int128::MIN.checked_sub(Int128::from(1u32)), + Err(OverflowError { .. }) + )); + assert_eq!( + Int128::from(2u32).checked_sub(Int128::from(1u32)), + Ok(Int128::from(1u32)), + ); + assert!(matches!( + Int128::MAX.checked_mul(Int128::from(2u32)), + Err(OverflowError { .. }) + )); + assert_eq!( + Int128::from(2u32).checked_mul(Int128::from(2u32)), + Ok(Int128::from(4u32)), + ); + assert!(matches!( + Int128::MAX.checked_pow(2u32), + Err(OverflowError { .. }) + )); + assert_eq!(Int128::from(2u32).checked_pow(3u32), Ok(Int128::from(8u32)),); + assert_eq!( + Int128::MAX.checked_div(Int128::from(0u32)), + Err(DivisionError::DivideByZero) + ); + assert_eq!( + Int128::from(6u32).checked_div(Int128::from(2u32)), + Ok(Int128::from(3u32)), + ); + assert_eq!( + Int128::MAX.checked_div_euclid(Int128::from(0u32)), + Err(DivisionError::DivideByZero) + ); + assert_eq!( + Int128::from(6u32).checked_div_euclid(Int128::from(2u32)), + Ok(Int128::from(3u32)), + ); + assert_eq!( + Int128::from(7u32).checked_div_euclid(Int128::from(2u32)), + Ok(Int128::from(3u32)), + ); + assert!(matches!( + Int128::MAX.checked_rem(Int128::from(0u32)), + Err(DivideByZeroError { .. }) + )); + // checked_* with negative numbers + assert_eq!( + Int128::from(-12i32).checked_div(Int128::from(10i32)), + Ok(Int128::from(-1i32)), + ); + assert_eq!( + Int128::from(-2i32).checked_pow(3u32), + Ok(Int128::from(-8i32)), + ); + assert_eq!( + Int128::from(-6i32).checked_mul(Int128::from(-7i32)), + Ok(Int128::from(42i32)), + ); + assert_eq!( + Int128::from(-2i32).checked_add(Int128::from(3i32)), + Ok(Int128::from(1i32)), + ); + assert_eq!( + Int128::from(-1i32).checked_div_euclid(Int128::from(-2i32)), + Ok(Int128::from(1u32)), + ); + + // saturating_* + assert_eq!(Int128::MAX.saturating_add(Int128::from(1u32)), Int128::MAX); + assert_eq!(Int128::MIN.saturating_sub(Int128::from(1u32)), Int128::MIN); + assert_eq!(Int128::MAX.saturating_mul(Int128::from(2u32)), Int128::MAX); + assert_eq!(Int128::from(4u32).saturating_pow(2u32), Int128::from(16u32)); + assert_eq!(Int128::MAX.saturating_pow(2u32), Int128::MAX); + } + + #[test] + #[allow(clippy::op_ref)] + fn int128_implements_rem() { + let a = Int128::from(10u32); + assert_eq!(a % Int128::from(10u32), Int128::zero()); + assert_eq!(a % Int128::from(2u32), Int128::zero()); + assert_eq!(a % Int128::from(1u32), Int128::zero()); + assert_eq!(a % Int128::from(3u32), Int128::from(1u32)); + assert_eq!(a % Int128::from(4u32), Int128::from(2u32)); + + assert_eq!( + Int128::from(-12i32) % Int128::from(10i32), + Int128::from(-2i32) + ); + assert_eq!( + Int128::from(12i32) % Int128::from(-10i32), + Int128::from(2i32) + ); + assert_eq!( + Int128::from(-12i32) % Int128::from(-10i32), + Int128::from(-2i32) + ); + + // works for refs + let a = Int128::from(10u32); + let b = Int128::from(3u32); + let expected = Int128::from(1u32); + assert_eq!(a % b, expected); + assert_eq!(a % &b, expected); + assert_eq!(&a % b, expected); + assert_eq!(&a % &b, expected); + } + + #[test] + #[should_panic(expected = "divisor of zero")] + fn int128_rem_panics_for_zero() { + let _ = Int128::from(10u32) % Int128::zero(); + } + + #[test] + fn int128_rem_assign_works() { + let mut a = Int128::from(30u32); + a %= Int128::from(4u32); + assert_eq!(a, Int128::from(2u32)); + + // works for refs + let mut a = Int128::from(25u32); + let b = Int128::from(6u32); + a %= &b; + assert_eq!(a, Int128::from(1u32)); + } + + #[test] + fn int128_shr() { + let x: Int128 = 0x4000_0000_0000_0000_0000_0000_0000_0000i128.into(); + assert_eq!(x >> 0, x); // right shift by 0 should be no-op + assert_eq!( + x >> 1, + Int128::from(0x2000_0000_0000_0000_0000_0000_0000_0000i128) + ); + assert_eq!( + x >> 4, + Int128::from(0x0400_0000_0000_0000_0000_0000_0000_0000i128) + ); + // right shift of MIN value by the maximum shift value should result in -1 (filled with 1s) + assert_eq!( + Int128::MIN >> (std::mem::size_of::() as u32 * 8 - 1), + -Int128::one() + ); + } + + #[test] + fn int128_shl() { + let x: Int128 = 0x0800_0000_0000_0000_0000_0000_0000_0000i128.into(); + assert_eq!(x << 0, x); // left shift by 0 should be no-op + assert_eq!( + x << 1, + Int128::from(0x1000_0000_0000_0000_0000_0000_0000_0000i128) + ); + assert_eq!( + x << 4, + Int128::from(0x0800_0000_0000_0000_0000_0000_0000_0000i128 << 4) + ); + // left shift by by the maximum shift value should result in MIN + assert_eq!( + Int128::one() << (std::mem::size_of::() as u32 * 8 - 1), + Int128::MIN + ); + } + + #[test] + fn int128_abs_diff_works() { + let a = Int128::from(42u32); + let b = Int128::from(5u32); + let expected = Uint128::from(37u32); + assert_eq!(a.abs_diff(b), expected); + assert_eq!(b.abs_diff(a), expected); + + let c = Int128::from(-5i32); + assert_eq!(b.abs_diff(c), Uint128::from(10u32)); + assert_eq!(c.abs_diff(b), Uint128::from(10u32)); + } + + #[test] + #[should_panic = "attempt to negate with overflow"] + fn int128_neg_min_panics() { + _ = -Int128::MIN; + } + + #[test] + fn int128_partial_eq() { + let test_cases = [(1, 1, true), (42, 42, true), (42, 24, false), (0, 0, true)] + .into_iter() + .map(|(lhs, rhs, expected): (u64, u64, bool)| { + (Int128::from(lhs), Int128::from(rhs), expected) + }); + + #[allow(clippy::op_ref)] + for (lhs, rhs, expected) in test_cases { + assert_eq!(lhs == rhs, expected); + assert_eq!(&lhs == rhs, expected); + assert_eq!(lhs == &rhs, expected); + assert_eq!(&lhs == &rhs, expected); + } + } +} diff --git a/packages/std/src/math/mod.rs b/packages/std/src/math/mod.rs index d1cce93bf5..6122814f36 100644 --- a/packages/std/src/math/mod.rs +++ b/packages/std/src/math/mod.rs @@ -1,6 +1,7 @@ mod decimal; mod decimal256; mod fraction; +mod int128; mod int256; mod int512; mod isqrt; @@ -12,6 +13,7 @@ mod uint64; pub use decimal::{Decimal, DecimalRangeExceeded}; pub use decimal256::{Decimal256, Decimal256RangeExceeded}; pub use fraction::Fraction; +pub use int128::Int128; pub use int256::Int256; pub use int512::Int512; pub use isqrt::Isqrt; diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 9c58c2cc3b..8dfd89e976 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -37,7 +37,7 @@ use crate::{ /// assert_eq!(c.u128(), 70); /// ``` #[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] -pub struct Uint128(#[schemars(with = "String")] u128); +pub struct Uint128(#[schemars(with = "String")] pub(crate) u128); forward_ref_partial_eq!(Uint128, Uint128); From a5ae44ae04c1a2907cd737b0f11fecfc9be60139 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 28 Jun 2023 17:38:10 +0200 Subject: [PATCH 0497/2372] Add Int64 --- packages/std/src/lib.rs | 4 +- packages/std/src/math/int64.rs | 1054 +++++++++++++++++++++++++++++++ packages/std/src/math/mod.rs | 2 + packages/std/src/math/uint64.rs | 2 +- 4 files changed, 1059 insertions(+), 3 deletions(-) create mode 100644 packages/std/src/math/int64.rs diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index a0a6a546d8..13eeee2874 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -52,8 +52,8 @@ pub use crate::ibc::{ #[cfg(feature = "iterator")] pub use crate::iterator::{Order, Record}; pub use crate::math::{ - Decimal, Decimal256, Decimal256RangeExceeded, DecimalRangeExceeded, Fraction, Int256, Int512, Int128, - Isqrt, Uint128, Uint256, Uint512, Uint64, + Decimal, Decimal256, Decimal256RangeExceeded, DecimalRangeExceeded, Fraction, Int128, Int256, + Int512, Int64, Isqrt, Uint128, Uint256, Uint512, Uint64, }; pub use crate::metadata::{DenomMetadata, DenomUnit}; pub use crate::never::Never; diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs new file mode 100644 index 0000000000..088c7d4565 --- /dev/null +++ b/packages/std/src/math/int64.rs @@ -0,0 +1,1054 @@ +use forward_ref::{forward_ref_binop, forward_ref_op_assign}; +use schemars::JsonSchema; +use serde::{de, ser, Deserialize, Deserializer, Serialize}; +use std::fmt; +use std::ops::{ + Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Not, Rem, RemAssign, Shl, ShlAssign, Shr, + ShrAssign, Sub, SubAssign, +}; +use std::str::FromStr; + +use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; +use crate::{forward_ref_partial_eq, Uint64}; + +/// An implementation of i64 that is using strings for JSON encoding/decoding, +/// such that the full i64 range can be used for clients that convert JSON numbers to floats, +/// like JavaScript and jq. +/// +/// # Examples +/// +/// Use `from` to create instances out of primitive uint types or `new` to provide big +/// endian bytes: +/// +/// ``` +/// # use cosmwasm_std::Int64; +/// let a = Int64::from(258i64); +/// let b = Int64::new([ +/// 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 2u8, +/// ]); +/// assert_eq!(a, b); +/// ``` +#[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] +pub struct Int64(#[schemars(with = "String")] i64); + +forward_ref_partial_eq!(Int64, Int64); + +impl Int64 { + pub const MAX: Int64 = Int64(i64::MAX); + pub const MIN: Int64 = Int64(i64::MIN); + + /// Creates a Int64(value) from a big endian representation. It's just an alias for + /// `from_be_bytes`. + #[inline] + pub const fn new(value: [u8; 8]) -> Self { + Self::from_be_bytes(value) + } + + /// Creates a Int64(0) + #[inline] + pub const fn zero() -> Self { + Int64(0) + } + + /// Creates a Int64(1) + #[inline] + pub const fn one() -> Self { + Self(1) + } + + #[must_use] + pub const fn from_be_bytes(data: [u8; 8]) -> Self { + Self(i64::from_be_bytes(data)) + } + + #[must_use] + pub const fn from_le_bytes(data: [u8; 8]) -> Self { + Self(i64::from_le_bytes(data)) + } + + /// Returns a copy of the number as big endian bytes. + #[must_use = "this returns the result of the operation, without modifying the original"] + pub const fn to_be_bytes(self) -> [u8; 8] { + self.0.to_be_bytes() + } + + /// Returns a copy of the number as little endian bytes. + #[must_use = "this returns the result of the operation, without modifying the original"] + pub const fn to_le_bytes(self) -> [u8; 8] { + self.0.to_le_bytes() + } + + #[must_use] + pub const fn is_zero(&self) -> bool { + self.0 == 0 + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn pow(self, exp: u32) -> Self { + Self(self.0.pow(exp)) + } + + pub fn checked_add(self, other: Self) -> Result { + self.0 + .checked_add(other.0) + .map(Self) + .ok_or_else(|| OverflowError::new(OverflowOperation::Add, self, other)) + } + + pub fn checked_sub(self, other: Self) -> Result { + self.0 + .checked_sub(other.0) + .map(Self) + .ok_or_else(|| OverflowError::new(OverflowOperation::Sub, self, other)) + } + + pub fn checked_mul(self, other: Self) -> Result { + self.0 + .checked_mul(other.0) + .map(Self) + .ok_or_else(|| OverflowError::new(OverflowOperation::Mul, self, other)) + } + + pub fn checked_pow(self, exp: u32) -> Result { + self.0 + .checked_pow(exp) + .map(Self) + .ok_or_else(|| OverflowError::new(OverflowOperation::Pow, self, exp)) + } + + pub fn checked_div(self, other: Self) -> Result { + if other.is_zero() { + return Err(DivisionError::DivideByZero); + } + self.0 + .checked_div(other.0) + .map(Self) + .ok_or(DivisionError::Overflow) + } + + pub fn checked_div_euclid(self, other: Self) -> Result { + if other.is_zero() { + return Err(DivisionError::DivideByZero); + } + self.0 + .checked_div_euclid(other.0) + .map(Self) + .ok_or(DivisionError::Overflow) + } + + pub fn checked_rem(self, other: Self) -> Result { + self.0 + .checked_rem(other.0) + .map(Self) + .ok_or_else(|| DivideByZeroError::new(self)) + } + + pub fn checked_shr(self, other: u32) -> Result { + if other >= 64 { + return Err(OverflowError::new(OverflowOperation::Shr, self, other)); + } + + Ok(Self(self.0.shr(other))) + } + + pub fn checked_shl(self, other: u32) -> Result { + if other >= 64 { + return Err(OverflowError::new(OverflowOperation::Shr, self, other)); + } + + Ok(Self(self.0.shl(other))) + } + + pub fn checked_neg(self) -> Result { + self.0 + .checked_neg() + .map(Self) + .ok_or_else(|| OverflowError::new(OverflowOperation::Neg, self, self)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + #[inline] + pub fn wrapping_add(self, other: Self) -> Self { + Self(self.0.wrapping_add(other.0)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + #[inline] + pub fn wrapping_sub(self, other: Self) -> Self { + Self(self.0.wrapping_sub(other.0)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + #[inline] + pub fn wrapping_mul(self, other: Self) -> Self { + Self(self.0.wrapping_mul(other.0)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + #[inline] + pub fn wrapping_pow(self, other: u32) -> Self { + Self(self.0.wrapping_pow(other)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn saturating_add(self, other: Self) -> Self { + Self(self.0.saturating_add(other.0)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn saturating_sub(self, other: Self) -> Self { + Self(self.0.saturating_sub(other.0)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn saturating_mul(self, other: Self) -> Self { + Self(self.0.saturating_mul(other.0)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn saturating_pow(self, exp: u32) -> Self { + Self(self.0.saturating_pow(exp)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn abs_diff(self, other: Self) -> Uint64 { + Uint64(self.0.abs_diff(other.0)) + } +} + +impl From for Int64 { + fn from(val: u32) -> Self { + Int64(val.into()) + } +} + +impl From for Int64 { + fn from(val: u16) -> Self { + Int64(val.into()) + } +} + +impl From for Int64 { + fn from(val: u8) -> Self { + Int64(val.into()) + } +} + +impl From for Int64 { + fn from(val: i64) -> Self { + Int64(val) + } +} + +impl From for Int64 { + fn from(val: i32) -> Self { + Int64(val.into()) + } +} + +impl From for Int64 { + fn from(val: i16) -> Self { + Int64(val.into()) + } +} + +impl From for Int64 { + fn from(val: i8) -> Self { + Int64(val.into()) + } +} + +impl TryFrom<&str> for Int64 { + type Error = StdError; + + fn try_from(val: &str) -> Result { + Self::from_str(val) + } +} + +impl FromStr for Int64 { + type Err = StdError; + + fn from_str(s: &str) -> Result { + match s.parse::() { + Ok(u) => Ok(Self(u)), + Err(e) => Err(StdError::generic_err(format!("Parsing Int64: {}", e))), + } + } +} + +impl From for String { + fn from(original: Int64) -> Self { + original.to_string() + } +} + +impl fmt::Display for Int64 { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + // The inner type doesn't work as expected with padding, so we + // work around that. Remove this code when the upstream padding is fixed. + let unpadded = self.0.to_string(); + let numeric = unpadded.strip_prefix('-').unwrap_or(&unpadded); + + f.pad_integral(self >= &Self::zero(), "", numeric) + } +} + +impl Add for Int64 { + type Output = Self; + + fn add(self, rhs: Self) -> Self { + Int64(self.0.checked_add(rhs.0).unwrap()) + } +} +forward_ref_binop!(impl Add, add for Int64, Int64); + +impl Sub for Int64 { + type Output = Self; + + fn sub(self, rhs: Self) -> Self { + Int64(self.0.checked_sub(rhs.0).unwrap()) + } +} +forward_ref_binop!(impl Sub, sub for Int64, Int64); + +impl SubAssign for Int64 { + fn sub_assign(&mut self, rhs: Int64) { + self.0 = self.0.checked_sub(rhs.0).unwrap(); + } +} +forward_ref_op_assign!(impl SubAssign, sub_assign for Int64, Int64); + +impl Div for Int64 { + type Output = Self; + + fn div(self, rhs: Self) -> Self::Output { + Self(self.0.checked_div(rhs.0).unwrap()) + } +} +forward_ref_binop!(impl Div, div for Int64, Int64); + +impl Rem for Int64 { + type Output = Self; + + /// # Panics + /// + /// This operation will panic if `rhs` is zero. + #[inline] + fn rem(self, rhs: Self) -> Self { + Self(self.0.rem(rhs.0)) + } +} +forward_ref_binop!(impl Rem, rem for Int64, Int64); + +impl Not for Int64 { + type Output = Self; + + fn not(self) -> Self::Output { + Self(!self.0) + } +} + +impl Neg for Int64 { + type Output = Self; + + fn neg(self) -> Self::Output { + Self(-self.0) + } +} + +impl RemAssign for Int64 { + fn rem_assign(&mut self, rhs: Int64) { + *self = *self % rhs; + } +} +forward_ref_op_assign!(impl RemAssign, rem_assign for Int64, Int64); + +impl Mul for Int64 { + type Output = Self; + + fn mul(self, rhs: Self) -> Self::Output { + Self(self.0.checked_mul(rhs.0).unwrap()) + } +} +forward_ref_binop!(impl Mul, mul for Int64, Int64); + +impl MulAssign for Int64 { + fn mul_assign(&mut self, rhs: Self) { + self.0 = self.0.checked_mul(rhs.0).unwrap(); + } +} +forward_ref_op_assign!(impl MulAssign, mul_assign for Int64, Int64); + +impl Shr for Int64 { + type Output = Self; + + fn shr(self, rhs: u32) -> Self::Output { + self.checked_shr(rhs).unwrap_or_else(|_| { + panic!( + "right shift error: {} is larger or equal than the number of bits in Int64", + rhs, + ) + }) + } +} +forward_ref_binop!(impl Shr, shr for Int64, u32); + +impl Shl for Int64 { + type Output = Self; + + fn shl(self, rhs: u32) -> Self::Output { + self.checked_shl(rhs).unwrap_or_else(|_| { + panic!( + "left shift error: {} is larger or equal than the number of bits in Int64", + rhs, + ) + }) + } +} +forward_ref_binop!(impl Shl, shl for Int64, u32); + +impl AddAssign for Int64 { + fn add_assign(&mut self, rhs: Int64) { + self.0 = self.0.checked_add(rhs.0).unwrap(); + } +} +forward_ref_op_assign!(impl AddAssign, add_assign for Int64, Int64); + +impl DivAssign for Int64 { + fn div_assign(&mut self, rhs: Self) { + self.0 = self.0.checked_div(rhs.0).unwrap(); + } +} +forward_ref_op_assign!(impl DivAssign, div_assign for Int64, Int64); + +impl ShrAssign for Int64 { + fn shr_assign(&mut self, rhs: u32) { + *self = Shr::::shr(*self, rhs); + } +} +forward_ref_op_assign!(impl ShrAssign, shr_assign for Int64, u32); + +impl ShlAssign for Int64 { + fn shl_assign(&mut self, rhs: u32) { + *self = Shl::::shl(*self, rhs); + } +} +forward_ref_op_assign!(impl ShlAssign, shl_assign for Int64, u32); + +impl Serialize for Int64 { + /// Serializes as an integer string using base 10 + fn serialize(&self, serializer: S) -> Result + where + S: ser::Serializer, + { + serializer.serialize_str(&self.to_string()) + } +} + +impl<'de> Deserialize<'de> for Int64 { + /// Deserialized from an integer string using base 10 + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_str(Int64Visitor) + } +} + +struct Int64Visitor; + +impl<'de> de::Visitor<'de> for Int64Visitor { + type Value = Int64; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("string-encoded integer") + } + + fn visit_str(self, v: &str) -> Result + where + E: de::Error, + { + Int64::try_from(v).map_err(|e| E::custom(format!("invalid Int64 '{}' - {}", v, e))) + } +} + +impl std::iter::Sum for Int64 +where + Self: Add, +{ + fn sum>(iter: I) -> Self { + iter.fold(Self::zero(), Add::add) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{from_slice, to_vec}; + + #[test] + fn size_of_works() { + assert_eq!(std::mem::size_of::(), 8); + } + + #[test] + fn int64_new_works() { + let num = Int64::new([1; 8]); + let a: [u8; 8] = num.to_be_bytes(); + assert_eq!(a, [1; 8]); + + let be_bytes = [0u8, 222u8, 0u8, 0u8, 0u8, 1u8, 2u8, 3u8]; + let num = Int64::new(be_bytes); + let resulting_bytes: [u8; 8] = num.to_be_bytes(); + assert_eq!(be_bytes, resulting_bytes); + } + + #[test] + fn int64_zero_works() { + let zero = Int64::zero(); + assert_eq!(zero.to_be_bytes(), [0; 8]); + } + + #[test] + fn uint64_one_works() { + let one = Int64::one(); + let mut one_be = [0; 8]; + one_be[7] = 1; + + assert_eq!(one.to_be_bytes(), one_be); + } + + #[test] + fn int64_endianness() { + let be_bytes = [0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 2u8, 3u8]; + let le_bytes = [3u8, 2u8, 1u8, 0u8, 0u8, 0u8, 0u8, 0u8]; + + // These should all be the same. + let num1 = Int64::new(be_bytes); + let num2 = Int64::from_be_bytes(be_bytes); + let num3 = Int64::from_le_bytes(le_bytes); + assert_eq!(num1, Int64::from(65536u32 + 512 + 3)); + assert_eq!(num1, num2); + assert_eq!(num1, num3); + } + + #[test] + fn int64_convert_from() { + let a = Int64::from(5i64); + assert_eq!(a.0, i64::from(5u32)); + + let a = Int64::from(5i64); + assert_eq!(a.0, i64::from(5u32)); + + let a = Int64::from(5u32); + assert_eq!(a.0, i64::from(5u32)); + + let a = Int64::from(5u16); + assert_eq!(a.0, i64::from(5u32)); + + let a = Int64::from(5u8); + assert_eq!(a.0, i64::from(5u32)); + + let a = Int64::from(-5i64); + assert_eq!(a.0, i64::from(-5i32)); + + let a = Int64::from(-5i64); + assert_eq!(a.0, i64::from(-5i32)); + + let a = Int64::from(-5i32); + assert_eq!(a.0, i64::from(-5i32)); + + let a = Int64::from(-5i16); + assert_eq!(a.0, i64::from(-5i32)); + + let a = Int64::from(-5i8); + assert_eq!(a.0, i64::from(-5i32)); + + let result = Int64::try_from("34567"); + assert_eq!(result.unwrap().0, "34567".parse::().unwrap()); + + let result = Int64::try_from("1.23"); + assert!(result.is_err()); + } + + #[test] + fn int64_implements_display() { + let a = Int64::from(12345u32); + assert_eq!(format!("Embedded: {}", a), "Embedded: 12345"); + assert_eq!(a.to_string(), "12345"); + + let a = Int64::from(-12345i32); + assert_eq!(format!("Embedded: {}", a), "Embedded: -12345"); + assert_eq!(a.to_string(), "-12345"); + + let a = Int64::zero(); + assert_eq!(format!("Embedded: {}", a), "Embedded: 0"); + assert_eq!(a.to_string(), "0"); + } + + #[test] + fn int64_display_padding_works() { + let a = Int64::from(123i64); + assert_eq!(format!("Embedded: {:05}", a), "Embedded: 00123"); + + let a = Int64::from(-123i64); + assert_eq!(format!("Embedded: {:05}", a), "Embedded: -0123"); + } + + #[test] + fn int64_to_be_bytes_works() { + assert_eq!(Int64::zero().to_be_bytes(), [0; 8]); + + let mut max = [0xff; 8]; + max[0] = 0x7f; + assert_eq!(Int64::MAX.to_be_bytes(), max); + + let mut one = [0; 8]; + one[7] = 1; + assert_eq!(Int64::from(1i64).to_be_bytes(), one); + // Python: `[b for b in (8535972485454015680).to_bytes(8, "big")]` + assert_eq!( + Int64::from(8535972485454015680i64).to_be_bytes(), + [118, 117, 221, 191, 255, 254, 172, 192] + ); + assert_eq!( + Int64::from_be_bytes([17, 4, 23, 32, 87, 67, 123, 200]).to_be_bytes(), + [17, 4, 23, 32, 87, 67, 123, 200] + ); + } + + #[test] + fn int64_to_le_bytes_works() { + assert_eq!(Int64::zero().to_le_bytes(), [0; 8]); + + let mut max = [0xff; 8]; + max[7] = 0x7f; + assert_eq!(Int64::MAX.to_le_bytes(), max); + + let mut one = [0; 8]; + one[0] = 1; + assert_eq!(Int64::from(1i64).to_le_bytes(), one); + // Python: `[b for b in (8535972485454015680).to_bytes(8, "little")]` + assert_eq!( + Int64::from(8535972485454015680i64).to_le_bytes(), + [192, 172, 254, 255, 191, 221, 117, 118] + ); + assert_eq!( + Int64::from_be_bytes([17, 4, 23, 32, 87, 67, 123, 200]).to_le_bytes(), + [200, 123, 67, 87, 32, 23, 4, 17] + ); + } + + #[test] + fn int64_is_zero_works() { + assert!(Int64::zero().is_zero()); + assert!(Int64(i64::from(0u32)).is_zero()); + + assert!(!Int64::from(1u32).is_zero()); + assert!(!Int64::from(123u32).is_zero()); + assert!(!Int64::from(-123i32).is_zero()); + } + + #[test] + fn int64_wrapping_methods() { + // wrapping_add + assert_eq!( + Int64::from(2u32).wrapping_add(Int64::from(2u32)), + Int64::from(4u32) + ); // non-wrapping + assert_eq!(Int64::MAX.wrapping_add(Int64::from(1u32)), Int64::MIN); // wrapping + + // wrapping_sub + assert_eq!( + Int64::from(7u32).wrapping_sub(Int64::from(5u32)), + Int64::from(2u32) + ); // non-wrapping + assert_eq!(Int64::MIN.wrapping_sub(Int64::from(1u32)), Int64::MAX); // wrapping + + // wrapping_mul + assert_eq!( + Int64::from(3u32).wrapping_mul(Int64::from(2u32)), + Int64::from(6u32) + ); // non-wrapping + assert_eq!( + Int64::MAX.wrapping_mul(Int64::from(2u32)), + Int64::from(-2i32) + ); // wrapping + + // wrapping_pow + assert_eq!(Int64::from(2u32).wrapping_pow(3), Int64::from(8u32)); // non-wrapping + assert_eq!(Int64::MAX.wrapping_pow(2), Int64::from(1u32)); // wrapping + } + + #[test] + fn int64_json() { + let orig = Int64::from(1234567890987654321i64); + let serialized = to_vec(&orig).unwrap(); + assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); + let parsed: Int64 = from_slice(&serialized).unwrap(); + assert_eq!(parsed, orig); + } + + #[test] + fn int64_compare() { + let a = Int64::from(12345u32); + let b = Int64::from(23456u32); + + assert!(a < b); + assert!(b > a); + assert_eq!(a, Int64::from(12345u32)); + } + + #[test] + #[allow(clippy::op_ref)] + fn int64_math() { + let a = Int64::from(-12345i32); + let b = Int64::from(23456u32); + + // test + with owned and reference right hand side + assert_eq!(a + b, Int64::from(11111u32)); + assert_eq!(a + &b, Int64::from(11111u32)); + + // test - with owned and reference right hand side + assert_eq!(b - a, Int64::from(35801u32)); + assert_eq!(b - &a, Int64::from(35801u32)); + + // test += with owned and reference right hand side + let mut c = Int64::from(300000u32); + c += b; + assert_eq!(c, Int64::from(323456u32)); + let mut d = Int64::from(300000u32); + d += &b; + assert_eq!(d, Int64::from(323456u32)); + + // test -= with owned and reference right hand side + let mut c = Int64::from(300000u32); + c -= b; + assert_eq!(c, Int64::from(276544u32)); + let mut d = Int64::from(300000u32); + d -= &b; + assert_eq!(d, Int64::from(276544u32)); + + // test - with negative result + assert_eq!(a - b, Int64::from(-35801i32)); + } + + #[test] + #[should_panic] + fn int64_add_overflow_panics() { + let _ = Int64::MAX + Int64::from(12u32); + } + + #[test] + #[allow(clippy::op_ref)] + fn int64_sub_works() { + assert_eq!(Int64::from(2u32) - Int64::from(1u32), Int64::from(1u32)); + assert_eq!(Int64::from(2u32) - Int64::from(0u32), Int64::from(2u32)); + assert_eq!(Int64::from(2u32) - Int64::from(2u32), Int64::from(0u32)); + assert_eq!(Int64::from(2u32) - Int64::from(3u32), Int64::from(-1i32)); + + // works for refs + let a = Int64::from(10u32); + let b = Int64::from(3u32); + let expected = Int64::from(7u32); + assert_eq!(a - b, expected); + assert_eq!(a - &b, expected); + assert_eq!(&a - b, expected); + assert_eq!(&a - &b, expected); + } + + #[test] + #[should_panic] + fn int64_sub_overflow_panics() { + let _ = Int64::MIN + Int64::one() - Int64::from(2u32); + } + + #[test] + fn int64_sub_assign_works() { + let mut a = Int64::from(14u32); + a -= Int64::from(2u32); + assert_eq!(a, Int64::from(12u32)); + + // works for refs + let mut a = Int64::from(10u32); + let b = Int64::from(3u32); + let expected = Int64::from(7u32); + a -= &b; + assert_eq!(a, expected); + } + + #[test] + #[allow(clippy::op_ref)] + fn int64_mul_works() { + assert_eq!(Int64::from(2u32) * Int64::from(3u32), Int64::from(6u32)); + assert_eq!(Int64::from(2u32) * Int64::zero(), Int64::zero()); + + // works for refs + let a = Int64::from(11u32); + let b = Int64::from(3u32); + let expected = Int64::from(33u32); + assert_eq!(a * b, expected); + assert_eq!(a * &b, expected); + assert_eq!(&a * b, expected); + assert_eq!(&a * &b, expected); + } + + #[test] + fn int64_mul_assign_works() { + let mut a = Int64::from(14u32); + a *= Int64::from(2u32); + assert_eq!(a, Int64::from(28u32)); + + // works for refs + let mut a = Int64::from(10u32); + let b = Int64::from(3u32); + a *= &b; + assert_eq!(a, Int64::from(30u32)); + } + + #[test] + fn int64_pow_works() { + assert_eq!(Int64::from(2u32).pow(2), Int64::from(4u32)); + assert_eq!(Int64::from(2u32).pow(10), Int64::from(1024u32)); + } + + #[test] + #[should_panic] + fn int64_pow_overflow_panics() { + _ = Int64::MAX.pow(2u32); + } + + #[test] + fn int64_shr_works() { + let original = Int64::new([0u8, 0u8, 0u8, 0u8, 2u8, 0u8, 4u8, 2u8]); + + let shifted = Int64::new([0u8, 0u8, 0u8, 0u8, 0u8, 128u8, 1u8, 0u8]); + + assert_eq!(original >> 2u32, shifted); + } + + #[test] + #[should_panic] + fn int64_shr_overflow_panics() { + let _ = Int64::from(1u32) >> 64u32; + } + + #[test] + fn int64_checked_neg() { + assert_eq!(Int64::one().checked_neg(), Ok(Int64::from(-1i32))); + assert!(matches!( + Int64::MIN.checked_neg(), + Err(OverflowError { .. }) + )); + assert_eq!(Int64::MAX.checked_neg(), Ok(Int64::MIN + Int64::one())); + } + + #[test] + fn sum_works() { + let nums = vec![ + Int64::from(17u32), + Int64::from(123u32), + Int64::from(540u32), + Int64::from(82u32), + ]; + let expected = Int64::from(762u32); + + let sum_as_ref: Int64 = nums.iter().sum(); + assert_eq!(expected, sum_as_ref); + + let sum_as_owned: Int64 = nums.into_iter().sum(); + assert_eq!(expected, sum_as_owned); + } + + #[test] + fn int64_methods() { + // checked_* + assert!(matches!( + Int64::MAX.checked_add(Int64::from(1u32)), + Err(OverflowError { .. }) + )); + assert_eq!( + Int64::from(1u32).checked_add(Int64::from(1u32)), + Ok(Int64::from(2u32)), + ); + assert!(matches!( + Int64::MIN.checked_sub(Int64::from(1u32)), + Err(OverflowError { .. }) + )); + assert_eq!( + Int64::from(2u32).checked_sub(Int64::from(1u32)), + Ok(Int64::from(1u32)), + ); + assert!(matches!( + Int64::MAX.checked_mul(Int64::from(2u32)), + Err(OverflowError { .. }) + )); + assert_eq!( + Int64::from(2u32).checked_mul(Int64::from(2u32)), + Ok(Int64::from(4u32)), + ); + assert!(matches!( + Int64::MAX.checked_pow(2u32), + Err(OverflowError { .. }) + )); + assert_eq!(Int64::from(2u32).checked_pow(3u32), Ok(Int64::from(8u32)),); + assert_eq!( + Int64::MAX.checked_div(Int64::from(0u32)), + Err(DivisionError::DivideByZero) + ); + assert_eq!( + Int64::from(6u32).checked_div(Int64::from(2u32)), + Ok(Int64::from(3u32)), + ); + assert_eq!( + Int64::MAX.checked_div_euclid(Int64::from(0u32)), + Err(DivisionError::DivideByZero) + ); + assert_eq!( + Int64::from(6u32).checked_div_euclid(Int64::from(2u32)), + Ok(Int64::from(3u32)), + ); + assert_eq!( + Int64::from(7u32).checked_div_euclid(Int64::from(2u32)), + Ok(Int64::from(3u32)), + ); + assert!(matches!( + Int64::MAX.checked_rem(Int64::from(0u32)), + Err(DivideByZeroError { .. }) + )); + // checked_* with negative numbers + assert_eq!( + Int64::from(-12i32).checked_div(Int64::from(10i32)), + Ok(Int64::from(-1i32)), + ); + assert_eq!(Int64::from(-2i32).checked_pow(3u32), Ok(Int64::from(-8i32)),); + assert_eq!( + Int64::from(-6i32).checked_mul(Int64::from(-7i32)), + Ok(Int64::from(42i32)), + ); + assert_eq!( + Int64::from(-2i32).checked_add(Int64::from(3i32)), + Ok(Int64::from(1i32)), + ); + assert_eq!( + Int64::from(-1i32).checked_div_euclid(Int64::from(-2i32)), + Ok(Int64::from(1u32)), + ); + + // saturating_* + assert_eq!(Int64::MAX.saturating_add(Int64::from(1u32)), Int64::MAX); + assert_eq!(Int64::MIN.saturating_sub(Int64::from(1u32)), Int64::MIN); + assert_eq!(Int64::MAX.saturating_mul(Int64::from(2u32)), Int64::MAX); + assert_eq!(Int64::from(4u32).saturating_pow(2u32), Int64::from(16u32)); + assert_eq!(Int64::MAX.saturating_pow(2u32), Int64::MAX); + } + + #[test] + #[allow(clippy::op_ref)] + fn int64_implements_rem() { + let a = Int64::from(10u32); + assert_eq!(a % Int64::from(10u32), Int64::zero()); + assert_eq!(a % Int64::from(2u32), Int64::zero()); + assert_eq!(a % Int64::from(1u32), Int64::zero()); + assert_eq!(a % Int64::from(3u32), Int64::from(1u32)); + assert_eq!(a % Int64::from(4u32), Int64::from(2u32)); + + assert_eq!(Int64::from(-12i32) % Int64::from(10i32), Int64::from(-2i32)); + assert_eq!(Int64::from(12i32) % Int64::from(-10i32), Int64::from(2i32)); + assert_eq!( + Int64::from(-12i32) % Int64::from(-10i32), + Int64::from(-2i32) + ); + + // works for refs + let a = Int64::from(10u32); + let b = Int64::from(3u32); + let expected = Int64::from(1u32); + assert_eq!(a % b, expected); + assert_eq!(a % &b, expected); + assert_eq!(&a % b, expected); + assert_eq!(&a % &b, expected); + } + + #[test] + #[should_panic(expected = "divisor of zero")] + fn int64_rem_panics_for_zero() { + let _ = Int64::from(10u32) % Int64::zero(); + } + + #[test] + fn int64_rem_assign_works() { + let mut a = Int64::from(30u32); + a %= Int64::from(4u32); + assert_eq!(a, Int64::from(2u32)); + + // works for refs + let mut a = Int64::from(25u32); + let b = Int64::from(6u32); + a %= &b; + assert_eq!(a, Int64::from(1u32)); + } + + #[test] + fn int64_shr() { + let x: Int64 = 0x4000_0000_0000_0000i64.into(); + assert_eq!(x >> 0, x); // right shift by 0 should be no-op + assert_eq!(x >> 1, Int64::from(0x2000_0000_0000_0000i64)); + assert_eq!(x >> 4, Int64::from(0x0400_0000_0000_0000i64)); + // right shift of MIN value by the maximum shift value should result in -1 (filled with 1s) + assert_eq!( + Int64::MIN >> (std::mem::size_of::() as u32 * 8 - 1), + -Int64::one() + ); + } + + #[test] + fn int64_shl() { + let x: Int64 = 0x0800_0000_0000_0000i64.into(); + assert_eq!(x << 0, x); // left shift by 0 should be no-op + assert_eq!(x << 1, Int64::from(0x1000_0000_0000_0000i64)); + assert_eq!(x << 4, Int64::from(0x0800_0000_0000_0000i64 << 4)); + // left shift by by the maximum shift value should result in MIN + assert_eq!( + Int64::one() << (std::mem::size_of::() as u32 * 8 - 1), + Int64::MIN + ); + } + + #[test] + fn int64_abs_diff_works() { + let a = Int64::from(42u32); + let b = Int64::from(5u32); + let expected = Uint64::from(37u32); + assert_eq!(a.abs_diff(b), expected); + assert_eq!(b.abs_diff(a), expected); + + let c = Int64::from(-5i32); + assert_eq!(b.abs_diff(c), Uint64::from(10u32)); + assert_eq!(c.abs_diff(b), Uint64::from(10u32)); + } + + #[test] + #[should_panic = "attempt to negate with overflow"] + fn int64_neg_min_panics() { + _ = -Int64::MIN; + } + + #[test] + fn int64_partial_eq() { + let test_cases = [(1, 1, true), (42, 42, true), (42, 24, false), (0, 0, true)] + .into_iter() + .map(|(lhs, rhs, expected): (i64, i64, bool)| { + (Int64::from(lhs), Int64::from(rhs), expected) + }); + + #[allow(clippy::op_ref)] + for (lhs, rhs, expected) in test_cases { + assert_eq!(lhs == rhs, expected); + assert_eq!(&lhs == rhs, expected); + assert_eq!(lhs == &rhs, expected); + assert_eq!(&lhs == &rhs, expected); + } + } +} diff --git a/packages/std/src/math/mod.rs b/packages/std/src/math/mod.rs index 6122814f36..fde3d4789b 100644 --- a/packages/std/src/math/mod.rs +++ b/packages/std/src/math/mod.rs @@ -4,6 +4,7 @@ mod fraction; mod int128; mod int256; mod int512; +mod int64; mod isqrt; mod uint128; mod uint256; @@ -16,6 +17,7 @@ pub use fraction::Fraction; pub use int128::Int128; pub use int256::Int256; pub use int512::Int512; +pub use int64::Int64; pub use isqrt::Isqrt; pub use uint128::Uint128; pub use uint256::Uint256; diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index 9afd119647..c0a6603b5a 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -30,7 +30,7 @@ use crate::{forward_ref_partial_eq, impl_mul_fraction, Fraction, Uint128}; /// assert_eq!(b.u64(), 70); /// ``` #[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] -pub struct Uint64(#[schemars(with = "String")] u64); +pub struct Uint64(#[schemars(with = "String")] pub(crate) u64); forward_ref_partial_eq!(Uint64, Uint64); From 8d8968479faf9653a911ff7138ddcc69afc2747f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 28 Jun 2023 17:41:37 +0200 Subject: [PATCH 0498/2372] Add trait impl check for signed ints --- packages/std/src/math/mod.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/packages/std/src/math/mod.rs b/packages/std/src/math/mod.rs index fde3d4789b..782276af37 100644 --- a/packages/std/src/math/mod.rs +++ b/packages/std/src/math/mod.rs @@ -72,15 +72,31 @@ mod tests { { } + trait SignedImpl<'a>: IntImpl<'a> + Neg {} + impl AllImpl<'_> for Uint64 {} impl AllImpl<'_> for Uint128 {} impl AllImpl<'_> for Uint256 {} impl AllImpl<'_> for Uint512 {} + impl AllImpl<'_> for Int64 {} + impl AllImpl<'_> for Int128 {} + impl AllImpl<'_> for Int256 {} impl AllImpl<'_> for Int512 {} + + impl IntImpl<'_> for Int64 {} + impl IntImpl<'_> for Int128 {} + impl IntImpl<'_> for Int256 {} + impl IntImpl<'_> for Int512 {} impl IntImpl<'_> for Uint64 {} impl IntImpl<'_> for Uint128 {} impl IntImpl<'_> for Uint256 {} impl IntImpl<'_> for Uint512 {} + impl AllImpl<'_> for Decimal {} impl AllImpl<'_> for Decimal256 {} + + impl SignedImpl<'_> for Int64 {} + impl SignedImpl<'_> for Int128 {} + impl SignedImpl<'_> for Int256 {} + impl SignedImpl<'_> for Int512 {} } From 4d560c99b101adaebd49244da5725e26e0cf40dc Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 29 Jun 2023 10:14:44 +0200 Subject: [PATCH 0499/2372] Fix left-shift error message --- packages/std/src/math/int128.rs | 2 +- packages/std/src/math/int256.rs | 2 +- packages/std/src/math/int512.rs | 2 +- packages/std/src/math/int64.rs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index c88c4b3a79..75073ce30a 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -154,7 +154,7 @@ impl Int128 { pub fn checked_shl(self, other: u32) -> Result { if other >= 128 { - return Err(OverflowError::new(OverflowOperation::Shr, self, other)); + return Err(OverflowError::new(OverflowOperation::Shl, self, other)); } Ok(Self(self.0.shl(other))) diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index d8d666e1e8..0e0717bae6 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -204,7 +204,7 @@ impl Int256 { pub fn checked_shl(self, other: u32) -> Result { if other >= 256 { - return Err(OverflowError::new(OverflowOperation::Shr, self, other)); + return Err(OverflowError::new(OverflowOperation::Shl, self, other)); } Ok(Self(self.0.shl(other))) diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index 7fbb89411b..a29b9746d5 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -240,7 +240,7 @@ impl Int512 { pub fn checked_shl(self, other: u32) -> Result { if other >= 512 { - return Err(OverflowError::new(OverflowOperation::Shr, self, other)); + return Err(OverflowError::new(OverflowOperation::Shl, self, other)); } Ok(Self(self.0.shl(other))) diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index 088c7d4565..0f9bb0982a 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -153,7 +153,7 @@ impl Int64 { pub fn checked_shl(self, other: u32) -> Result { if other >= 64 { - return Err(OverflowError::new(OverflowOperation::Shr, self, other)); + return Err(OverflowError::new(OverflowOperation::Shl, self, other)); } Ok(Self(self.0.shl(other))) From 87d685cb503790b0e1ae5ff301e103385d64952e Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 29 Jun 2023 10:31:00 +0200 Subject: [PATCH 0500/2372] Avoid vec allocation --- packages/std/src/math/int512.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index a29b9746d5..cc63c39626 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -305,9 +305,10 @@ impl Int512 { impl From for Int512 { fn from(val: Uint256) -> Self { - let bytes = [[0u8; 32], val.to_be_bytes()].concat(); + let mut bytes = [0u8; 64]; + bytes[32..].copy_from_slice(&val.to_be_bytes()); - Self::from_be_bytes(bytes.try_into().unwrap()) + Self::from_be_bytes(bytes) } } From bdb28e29299255111d60066d45c0e676ccd8b453 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 29 Jun 2023 10:45:59 +0200 Subject: [PATCH 0501/2372] Fix integer conversions --- packages/std/src/math/int128.rs | 13 ++++++++++++- packages/std/src/math/int256.rs | 22 +++++++++++++--------- packages/std/src/math/int64.rs | 5 +++++ 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index 75073ce30a..ab1da7cd35 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -9,7 +9,7 @@ use std::ops::{ use std::str::FromStr; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; -use crate::{forward_ref_partial_eq, Uint128, Uint64}; +use crate::{forward_ref_partial_eq, Int64, Uint128, Uint64}; /// An implementation of i128 that is using strings for JSON encoding/decoding, /// such that the full i128 range can be used for clients that convert JSON numbers to floats, @@ -57,6 +57,11 @@ impl Int128 { Self(1) } + /// Returns a copy of the internal data + pub const fn i128(&self) -> i128 { + self.0 + } + #[must_use] pub const fn from_be_bytes(data: [u8; 16]) -> Self { Self(i128::from_be_bytes(data)) @@ -247,6 +252,12 @@ impl From for Int128 { } } +impl From for Int128 { + fn from(val: Int64) -> Self { + val.i64().into() + } +} + impl From for Int128 { fn from(val: i128) -> Self { Int128(val) diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index 0e0717bae6..6bc061df39 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -9,7 +9,7 @@ use std::ops::{ use std::str::FromStr; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; -use crate::{forward_ref_partial_eq, Uint128, Uint256, Uint64}; +use crate::{forward_ref_partial_eq, Int128, Int64, Uint128, Uint256, Uint64}; /// Used internally - we don't want to leak this type since we might change /// the implementation in the future. @@ -267,14 +267,6 @@ impl Int256 { } } -impl From for Int256 { - fn from(val: Uint256) -> Self { - let bytes = [[0u8; 32], val.to_be_bytes()].concat(); - - Self::from_be_bytes(bytes.try_into().unwrap()) - } -} - impl From for Int256 { fn from(val: Uint128) -> Self { val.u128().into() @@ -317,6 +309,18 @@ impl From for Int256 { } } +impl From for Int256 { + fn from(val: Int128) -> Self { + val.i128().into() + } +} + +impl From for Int256 { + fn from(val: Int64) -> Self { + val.i64().into() + } +} + impl From for Int256 { fn from(val: i128) -> Self { Int256(val.into()) diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index 0f9bb0982a..82c56ca853 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -56,6 +56,11 @@ impl Int64 { Self(1) } + /// Returns a copy of the internal data + pub const fn i64(&self) -> i64 { + self.0 + } + #[must_use] pub const fn from_be_bytes(data: [u8; 8]) -> Self { Self(i64::from_be_bytes(data)) From 8d5a243980265c539ae16659c31794c41c96fbc4 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 29 Jun 2023 10:56:21 +0200 Subject: [PATCH 0502/2372] Fix Int64 and Int128 Display impls --- packages/std/src/math/int128.rs | 7 +------ packages/std/src/math/int64.rs | 7 +------ 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index ab1da7cd35..18283de135 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -315,12 +315,7 @@ impl From for String { impl fmt::Display for Int128 { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - // The inner type doesn't work as expected with padding, so we - // work around that. Remove this code when the upstream padding is fixed. - let unpadded = self.0.to_string(); - let numeric = unpadded.strip_prefix('-').unwrap_or(&unpadded); - - f.pad_integral(self >= &Self::zero(), "", numeric) + self.0.fmt(f) } } diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index 82c56ca853..0ea734998d 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -290,12 +290,7 @@ impl From for String { impl fmt::Display for Int64 { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - // The inner type doesn't work as expected with padding, so we - // work around that. Remove this code when the upstream padding is fixed. - let unpadded = self.0.to_string(); - let numeric = unpadded.strip_prefix('-').unwrap_or(&unpadded); - - f.pad_integral(self >= &Self::zero(), "", numeric) + self.0.fmt(f) } } From 4ecaea72d78f5ad1467d3379bd8923cd97767293 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 29 Jun 2023 11:06:00 +0200 Subject: [PATCH 0503/2372] Improve Int64 and Int128 constructor --- packages/std/src/math/int128.rs | 32 +++++++++++++------------------- packages/std/src/math/int64.rs | 31 +++++++++++++------------------ 2 files changed, 26 insertions(+), 37 deletions(-) diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index 18283de135..37f14a9764 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -17,17 +17,12 @@ use crate::{forward_ref_partial_eq, Int64, Uint128, Uint64}; /// /// # Examples /// -/// Use `from` to create instances out of primitive uint types or `new` to provide big -/// endian bytes: +/// Use `from` to create instances of this and `i128` to get the value out: /// /// ``` /// # use cosmwasm_std::Int128; /// let a = Int128::from(258i128); -/// let b = Int128::new([ -/// 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, -/// 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 2u8, -/// ]); -/// assert_eq!(a, b); +/// assert_eq!(a.i128(), 258); /// ``` #[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] pub struct Int128(#[schemars(with = "String")] i128); @@ -38,11 +33,12 @@ impl Int128 { pub const MAX: Int128 = Int128(i128::MAX); pub const MIN: Int128 = Int128(i128::MIN); - /// Creates a Int128(value) from a big endian representation. It's just an alias for - /// `from_be_bytes`. + /// Creates a Int128(value). + /// + /// This method is less flexible than `from` but can be called in a const context. #[inline] - pub const fn new(value: [u8; 16]) -> Self { - Self::from_be_bytes(value) + pub const fn new(value: i128) -> Self { + Self(value) } /// Creates a Int128(0) @@ -519,14 +515,14 @@ mod tests { #[test] fn int128_new_works() { - let num = Int128::new([1; 16]); + let num = Int128::from_be_bytes([1; 16]); let a: [u8; 16] = num.to_be_bytes(); assert_eq!(a, [1; 16]); let be_bytes = [ 0u8, 222u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 2u8, 3u8, ]; - let num = Int128::new(be_bytes); + let num = Int128::from_be_bytes(be_bytes); let resulting_bytes: [u8; 16] = num.to_be_bytes(); assert_eq!(be_bytes, resulting_bytes); } @@ -556,12 +552,10 @@ mod tests { ]; // These should all be the same. - let num1 = Int128::new(be_bytes); - let num2 = Int128::from_be_bytes(be_bytes); - let num3 = Int128::from_le_bytes(le_bytes); + let num1 = Int128::from_be_bytes(be_bytes); + let num2 = Int128::from_le_bytes(le_bytes); assert_eq!(num1, Int128::from(65536u32 + 512 + 3)); assert_eq!(num1, num2); - assert_eq!(num1, num3); } #[test] @@ -854,11 +848,11 @@ mod tests { #[test] fn int128_shr_works() { - let original = Int128::new([ + let original = Int128::from_be_bytes([ 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 2u8, 0u8, 4u8, 2u8, ]); - let shifted = Int128::new([ + let shifted = Int128::from_be_bytes([ 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 128u8, 1u8, 0u8, ]); diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index 0ea734998d..6f75d7c54e 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -17,16 +17,12 @@ use crate::{forward_ref_partial_eq, Uint64}; /// /// # Examples /// -/// Use `from` to create instances out of primitive uint types or `new` to provide big -/// endian bytes: +/// Use `from` to create instances of this and `i64` to get the value out: /// /// ``` /// # use cosmwasm_std::Int64; /// let a = Int64::from(258i64); -/// let b = Int64::new([ -/// 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 2u8, -/// ]); -/// assert_eq!(a, b); +/// assert_eq!(a.i64(), 258); /// ``` #[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] pub struct Int64(#[schemars(with = "String")] i64); @@ -37,11 +33,12 @@ impl Int64 { pub const MAX: Int64 = Int64(i64::MAX); pub const MIN: Int64 = Int64(i64::MIN); - /// Creates a Int64(value) from a big endian representation. It's just an alias for - /// `from_be_bytes`. + /// Creates a Int64(value). + /// + /// This method is less flexible than `from` but can be called in a const context. #[inline] - pub const fn new(value: [u8; 8]) -> Self { - Self::from_be_bytes(value) + pub const fn new(value: i64) -> Self { + Self(value) } /// Creates a Int64(0) @@ -494,12 +491,12 @@ mod tests { #[test] fn int64_new_works() { - let num = Int64::new([1; 8]); + let num = Int64::from_be_bytes([1; 8]); let a: [u8; 8] = num.to_be_bytes(); assert_eq!(a, [1; 8]); let be_bytes = [0u8, 222u8, 0u8, 0u8, 0u8, 1u8, 2u8, 3u8]; - let num = Int64::new(be_bytes); + let num = Int64::from_be_bytes(be_bytes); let resulting_bytes: [u8; 8] = num.to_be_bytes(); assert_eq!(be_bytes, resulting_bytes); } @@ -525,12 +522,10 @@ mod tests { let le_bytes = [3u8, 2u8, 1u8, 0u8, 0u8, 0u8, 0u8, 0u8]; // These should all be the same. - let num1 = Int64::new(be_bytes); - let num2 = Int64::from_be_bytes(be_bytes); - let num3 = Int64::from_le_bytes(le_bytes); + let num1 = Int64::from_be_bytes(be_bytes); + let num2 = Int64::from_le_bytes(le_bytes); assert_eq!(num1, Int64::from(65536u32 + 512 + 3)); assert_eq!(num1, num2); - assert_eq!(num1, num3); } #[test] @@ -821,9 +816,9 @@ mod tests { #[test] fn int64_shr_works() { - let original = Int64::new([0u8, 0u8, 0u8, 0u8, 2u8, 0u8, 4u8, 2u8]); + let original = Int64::from_be_bytes([0u8, 0u8, 0u8, 0u8, 2u8, 0u8, 4u8, 2u8]); - let shifted = Int64::new([0u8, 0u8, 0u8, 0u8, 0u8, 128u8, 1u8, 0u8]); + let shifted = Int64::from_be_bytes([0u8, 0u8, 0u8, 0u8, 0u8, 128u8, 1u8, 0u8]); assert_eq!(original >> 2u32, shifted); } From 062be1ab4768a2f481ce08fb95d0e417cb8b7251 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 29 Jun 2023 15:05:18 +0200 Subject: [PATCH 0504/2372] Add missing stats call --- CHANGELOG.md | 4 ++++ packages/vm/src/cache.rs | 1 + 2 files changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4aafbc2baf..66ff512359 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ and this project adheres to ## [Unreleased] +### Fixed + +- cosmwasm-vm: Add missing cache stats increment when calling `pin`. + ### Added - cosmwasm-std: Implement `BankQuery::AllDenomMetadata` to allow querying all diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 85c145e15d..4f00e7430a 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -272,6 +272,7 @@ where // Re-compile from original Wasm bytecode let code = self.load_wasm_with_path(&cache.wasm_path, checksum)?; + cache.stats.misses = cache.stats.misses.saturating_add(1); let module = compile(&code, Some(cache.instance_memory_limit), &[])?; // Store into the fs cache too cache.fs_cache.store(checksum, &module)?; From 053b5c9a91bdcfcbac7a2bab257e7d0b2cdb000e Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 29 Jun 2023 15:41:04 +0200 Subject: [PATCH 0505/2372] Test recompiling modules from Wasm --- packages/vm/src/cache.rs | 60 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 4f00e7430a..dbc809ef09 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -452,7 +452,7 @@ mod tests { use crate::errors::VmError; use crate::testing::{mock_backend, mock_env, mock_info, MockApi, MockQuerier, MockStorage}; use cosmwasm_std::{coins, Empty}; - use std::fs::{create_dir_all, OpenOptions}; + use std::fs::{create_dir_all, remove_dir_all, OpenOptions}; use std::io::Write; use tempfile::TempDir; @@ -776,6 +776,36 @@ mod tests { assert_eq!(cache.stats().misses, 0); } + #[test] + fn get_instance_recompiles_module() { + let options = make_testing_options(); + let cache = unsafe { Cache::new(options.clone()).unwrap() }; + let checksum = cache.save_wasm(CONTRACT).unwrap(); + + // Remove compiled module from disk + remove_dir_all(options.base_dir.join(CACHE_DIR).join(MODULES_DIR)).unwrap(); + + // The first get_instance recompiles the Wasm (miss) + let backend = mock_backend(&[]); + let _instance = cache + .get_instance(&checksum, backend, TESTING_OPTIONS) + .unwrap(); + assert_eq!(cache.stats().hits_pinned_memory_cache, 0); + assert_eq!(cache.stats().hits_memory_cache, 0); + assert_eq!(cache.stats().hits_fs_cache, 0); + assert_eq!(cache.stats().misses, 1); + + // The second get_instance finds the module in cache (hit) + let backend = mock_backend(&[]); + let _instance = cache + .get_instance(&checksum, backend, TESTING_OPTIONS) + .unwrap(); + assert_eq!(cache.stats().hits_pinned_memory_cache, 0); + assert_eq!(cache.stats().hits_memory_cache, 1); + assert_eq!(cache.stats().hits_fs_cache, 0); + assert_eq!(cache.stats().misses, 1); + } + #[test] fn call_instantiate_on_cached_contract() { let cache = unsafe { Cache::new(make_testing_options()).unwrap() }; @@ -1220,6 +1250,34 @@ mod tests { cache.unpin(&non_id).unwrap(); } + #[test] + fn pin_recompiles_module() { + let options = make_testing_options(); + let cache: Cache = + unsafe { Cache::new(options.clone()).unwrap() }; + let checksum = cache.save_wasm(CONTRACT).unwrap(); + + // Remove compiled module from disk + remove_dir_all(options.base_dir.join(CACHE_DIR).join(MODULES_DIR)).unwrap(); + + // Pin misses, forcing a re-compile of the module + cache.pin(&checksum).unwrap(); + assert_eq!(cache.stats().hits_pinned_memory_cache, 0); + assert_eq!(cache.stats().hits_memory_cache, 0); + assert_eq!(cache.stats().hits_fs_cache, 0); + assert_eq!(cache.stats().misses, 1); + + // After the compilation in pin, the module can be used from pinned memory cache + let backend = mock_backend(&[]); + let _ = cache + .get_instance(&checksum, backend, TESTING_OPTIONS) + .unwrap(); + assert_eq!(cache.stats().hits_pinned_memory_cache, 1); + assert_eq!(cache.stats().hits_memory_cache, 0); + assert_eq!(cache.stats().hits_fs_cache, 0); + assert_eq!(cache.stats().misses, 1); + } + #[test] fn loading_without_extension_works() { let tmp_dir = TempDir::new().unwrap(); From 3c1abf3c385c5d5905b851aa139971905ef4d615 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 29 Jun 2023 16:26:42 +0200 Subject: [PATCH 0506/2372] Remove breaking checked_neg implementations --- packages/std/src/errors/std_error.rs | 2 -- packages/std/src/math/int128.rs | 17 ----------------- packages/std/src/math/int256.rs | 17 ----------------- packages/std/src/math/int512.rs | 17 ----------------- packages/std/src/math/int64.rs | 17 ----------------- packages/std/src/math/mod.rs | 7 ------- 6 files changed, 77 deletions(-) diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index 5accfcc6be..aecdb82cc6 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -477,12 +477,10 @@ impl From for StdError { pub type StdResult = core::result::Result; #[derive(Error, Debug, PartialEq, Eq)] -#[non_exhaustive] pub enum OverflowOperation { Add, Sub, Mul, - Neg, Pow, Shr, Shl, diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index 37f14a9764..f95c2e0b02 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -161,13 +161,6 @@ impl Int128 { Ok(Self(self.0.shl(other))) } - pub fn checked_neg(self) -> Result { - self.0 - .checked_neg() - .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Neg, self, self)) - } - #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_add(self, other: Self) -> Self { @@ -865,16 +858,6 @@ mod tests { let _ = Int128::from(1u32) >> 128u32; } - #[test] - fn int128_checked_neg() { - assert_eq!(Int128::one().checked_neg(), Ok(Int128::from(-1i32))); - assert!(matches!( - Int128::MIN.checked_neg(), - Err(OverflowError { .. }) - )); - assert_eq!(Int128::MAX.checked_neg(), Ok(Int128::MIN + Int128::one())); - } - #[test] fn sum_works() { let nums = vec![ diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index 6bc061df39..937cf8df80 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -210,13 +210,6 @@ impl Int256 { Ok(Self(self.0.shl(other))) } - pub fn checked_neg(self) -> Result { - self.0 - .checked_neg() - .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Neg, self, self)) - } - #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_add(self, other: Self) -> Self { @@ -965,16 +958,6 @@ mod tests { let _ = Int256::from(1u32) >> 256u32; } - #[test] - fn int256_checked_neg() { - assert_eq!(Int256::one().checked_neg(), Ok(Int256::from(-1i32))); - assert!(matches!( - Int256::MIN.checked_neg(), - Err(OverflowError { .. }) - )); - assert_eq!(Int256::MAX.checked_neg(), Ok(Int256::MIN + Int256::one())); - } - #[test] fn sum_works() { let nums = vec![ diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index cc63c39626..980b81ee5c 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -246,13 +246,6 @@ impl Int512 { Ok(Self(self.0.shl(other))) } - pub fn checked_neg(self) -> Result { - self.0 - .checked_neg() - .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Neg, self, self)) - } - #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_add(self, other: Self) -> Self { @@ -1018,16 +1011,6 @@ mod tests { let _ = Int512::from(1u32) >> 512u32; } - #[test] - fn int512_checked_neg() { - assert_eq!(Int512::one().checked_neg(), Ok(Int512::from(-1i32))); - assert!(matches!( - Int512::MIN.checked_neg(), - Err(OverflowError { .. }) - )); - assert_eq!(Int512::MAX.checked_neg(), Ok(Int512::MIN + Int512::one())); - } - #[test] fn sum_works() { let nums = vec![ diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index 6f75d7c54e..abd3f162a6 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -161,13 +161,6 @@ impl Int64 { Ok(Self(self.0.shl(other))) } - pub fn checked_neg(self) -> Result { - self.0 - .checked_neg() - .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Neg, self, self)) - } - #[must_use = "this returns the result of the operation, without modifying the original"] #[inline] pub fn wrapping_add(self, other: Self) -> Self { @@ -829,16 +822,6 @@ mod tests { let _ = Int64::from(1u32) >> 64u32; } - #[test] - fn int64_checked_neg() { - assert_eq!(Int64::one().checked_neg(), Ok(Int64::from(-1i32))); - assert!(matches!( - Int64::MIN.checked_neg(), - Err(OverflowError { .. }) - )); - assert_eq!(Int64::MAX.checked_neg(), Ok(Int64::MIN + Int64::one())); - } - #[test] fn sum_works() { let nums = vec![ diff --git a/packages/std/src/math/mod.rs b/packages/std/src/math/mod.rs index 782276af37..900b46f6ae 100644 --- a/packages/std/src/math/mod.rs +++ b/packages/std/src/math/mod.rs @@ -72,8 +72,6 @@ mod tests { { } - trait SignedImpl<'a>: IntImpl<'a> + Neg {} - impl AllImpl<'_> for Uint64 {} impl AllImpl<'_> for Uint128 {} impl AllImpl<'_> for Uint256 {} @@ -94,9 +92,4 @@ mod tests { impl AllImpl<'_> for Decimal {} impl AllImpl<'_> for Decimal256 {} - - impl SignedImpl<'_> for Int64 {} - impl SignedImpl<'_> for Int128 {} - impl SignedImpl<'_> for Int256 {} - impl SignedImpl<'_> for Int512 {} } From e2b7437eb2c51f39502e21072e65e494e311f527 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 29 Jun 2023 16:45:38 +0200 Subject: [PATCH 0507/2372] Actually test constructors --- packages/std/src/math/int128.rs | 17 ++++++++++++++++- packages/std/src/math/int64.rs | 17 ++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index f95c2e0b02..e30aea7914 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -507,7 +507,7 @@ mod tests { } #[test] - fn int128_new_works() { + fn int128_from_be_bytes_works() { let num = Int128::from_be_bytes([1; 16]); let a: [u8; 16] = num.to_be_bytes(); assert_eq!(a, [1; 16]); @@ -520,6 +520,21 @@ mod tests { assert_eq!(be_bytes, resulting_bytes); } + #[test] + fn int128_new_works() { + let num = Int128::new(222); + assert_eq!(num.i128(), 222); + + let num = Int128::new(-222); + assert_eq!(num.i128(), -222); + + let num = Int128::new(i128::MAX); + assert_eq!(num.i128(), i128::MAX); + + let num = Int128::new(i128::MIN); + assert_eq!(num.i128(), i128::MIN); + } + #[test] fn int128_zero_works() { let zero = Int128::zero(); diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index abd3f162a6..8cfbc756c6 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -483,7 +483,7 @@ mod tests { } #[test] - fn int64_new_works() { + fn int64_from_be_bytes_works() { let num = Int64::from_be_bytes([1; 8]); let a: [u8; 8] = num.to_be_bytes(); assert_eq!(a, [1; 8]); @@ -494,6 +494,21 @@ mod tests { assert_eq!(be_bytes, resulting_bytes); } + #[test] + fn int64_new_works() { + let num = Int64::new(222); + assert_eq!(num.i64(), 222); + + let num = Int64::new(-222); + assert_eq!(num.i64(), -222); + + let num = Int64::new(i64::MAX); + assert_eq!(num.i64(), i64::MAX); + + let num = Int64::new(i64::MIN); + assert_eq!(num.i64(), i64::MIN); + } + #[test] fn int64_zero_works() { let zero = Int64::zero(); From e16f13d1c1627d3fd8fae673d8d89d220bca7b35 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 29 Jun 2023 16:47:49 +0200 Subject: [PATCH 0508/2372] Don't fix bnum version Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/std/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 0175ec7b3d..d9c9c37ac3 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -54,7 +54,7 @@ sha2 = "0.10.3" serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } serde-json-wasm = { version = "0.5.0" } thiserror = "1.0.26" -bnum = "=0.7.0" +bnum = "0.7.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] cosmwasm-crypto = { path = "../crypto", version = "1.2.7" } From a173bb82f8210ac4ec0e169910a63bfe07fd33dd Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 29 Jun 2023 16:51:45 +0200 Subject: [PATCH 0509/2372] Add signed int trait check back in --- packages/std/src/math/mod.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/std/src/math/mod.rs b/packages/std/src/math/mod.rs index 900b46f6ae..782276af37 100644 --- a/packages/std/src/math/mod.rs +++ b/packages/std/src/math/mod.rs @@ -72,6 +72,8 @@ mod tests { { } + trait SignedImpl<'a>: IntImpl<'a> + Neg {} + impl AllImpl<'_> for Uint64 {} impl AllImpl<'_> for Uint128 {} impl AllImpl<'_> for Uint256 {} @@ -92,4 +94,9 @@ mod tests { impl AllImpl<'_> for Decimal {} impl AllImpl<'_> for Decimal256 {} + + impl SignedImpl<'_> for Int64 {} + impl SignedImpl<'_> for Int128 {} + impl SignedImpl<'_> for Int256 {} + impl SignedImpl<'_> for Int512 {} } From 6f01a8193e8d81915de97cd321245f31485d805a Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 30 Jun 2023 10:28:19 +0200 Subject: [PATCH 0510/2372] Add changelog entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4aafbc2baf..41108579a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,12 +28,15 @@ and this project adheres to - cosmwasm-std: Add trait functions `Storage::range_keys` and `Storage::range_values`. The default implementations just use `Storage::range`. Later this can be implemented more efficiently. ([#1748]) +- cosmwasm-std: Add `Int64`, `Int128`, `Int256` and `Int512` signed integer + types. ([#1718]) [#1593]: https://github.com/CosmWasm/cosmwasm/pull/1593 [#1635]: https://github.com/CosmWasm/cosmwasm/pull/1635 [#1647]: https://github.com/CosmWasm/cosmwasm/pull/1647 [#1684]: https://github.com/CosmWasm/cosmwasm/pull/1684 [#1687]: https://github.com/CosmWasm/cosmwasm/pull/1687 +[#1718]: https://github.com/CosmWasm/cosmwasm/pull/1718 [#1727]: https://github.com/CosmWasm/cosmwasm/issues/1727 [#1747]: https://github.com/CosmWasm/cosmwasm/pull/1747 [#1748]: https://github.com/CosmWasm/cosmwasm/pull/1748 From 7d5edd5aa02525e78570c6dccecac5e90f6e2091 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 3 Jul 2023 09:54:13 +0200 Subject: [PATCH 0511/2372] Set version: 1.3.0-rc.0 --- Cargo.lock | 16 ++++++++-------- contracts/burner/Cargo.lock | 12 ++++++------ contracts/crypto-verify/Cargo.lock | 14 +++++++------- contracts/cyberpunk/Cargo.lock | 14 +++++++------- contracts/floaty/Cargo.lock | 14 +++++++------- contracts/hackatom/Cargo.lock | 14 +++++++------- contracts/ibc-reflect-send/Cargo.lock | 14 +++++++------- contracts/ibc-reflect/Cargo.lock | 14 +++++++------- contracts/queue/Cargo.lock | 12 ++++++------ contracts/reflect/Cargo.lock | 14 +++++++------- contracts/staking/Cargo.lock | 14 +++++++------- contracts/virus/Cargo.lock | 12 ++++++------ packages/check/Cargo.toml | 6 +++--- packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema-derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 6 +++--- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 20 files changed, 99 insertions(+), 99 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c76a0f514a..69cbf273a3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -291,7 +291,7 @@ dependencies = [ [[package]] name = "cosmwasm-check" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "anyhow", "clap 2.34.0", @@ -302,7 +302,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "base64", "criterion", @@ -321,7 +321,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "cosmwasm-std", "syn", @@ -329,7 +329,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "anyhow", "cosmwasm-schema-derive", @@ -344,7 +344,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "proc-macro2", "quote", @@ -353,7 +353,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "base64", "bnum", @@ -375,7 +375,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "cosmwasm-std", "serde", @@ -383,7 +383,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 8ebe8fa1a9..be7757298c 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -180,7 +180,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -191,14 +191,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -209,7 +209,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "proc-macro2", "quote", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "base64", "bnum", @@ -236,7 +236,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 8193676a13..e8a7642c26 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -175,7 +175,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -186,14 +186,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -204,7 +204,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "proc-macro2", "quote", @@ -213,7 +213,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "base64", "bnum", @@ -231,7 +231,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "cosmwasm-std", "serde", @@ -239,7 +239,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 60fb94530e..7892644170 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -209,14 +209,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "proc-macro2", "quote", @@ -236,7 +236,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "base64", "bnum", @@ -254,7 +254,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "cosmwasm-std", "serde", @@ -262,7 +262,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index b7eefeda60..b58fbb095f 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 4a22c86347..af14c9838d 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index dfff7aa4e7..74a3b933e2 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index f14335aa9a..2d988662b7 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index baecd4b897..ae7fe21b4f 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 6539fc1a75..194816e2eb 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index ab6d49866e..14a3ce5011 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index ba54a8d9e3..c422907033 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.2.7" +version = "1.3.0-rc.0" dependencies = [ "bitflags", "bytecheck", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index 9cd05860a7..40f0a0c777 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-check" -version = "1.2.7" +version = "1.3.0-rc.0" authors = ["Mauro Lacy "] edition = "2021" description = "A CLI tool for verifying CosmWasm smart contracts" @@ -11,5 +11,5 @@ license = "Apache-2.0" anyhow = "1.0.57" clap = "2" colored = "2" -cosmwasm-vm = { path = "../vm", version = "1.2.7" } -cosmwasm-std = { path = "../std", version = "1.2.7" } +cosmwasm-vm = { path = "../vm", version = "1.3.0-rc.0" } +cosmwasm-std = { path = "../std", version = "1.3.0-rc.0" } diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index e5e16090a3..c1a3d9b102 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "1.2.7" +version = "1.3.0-rc.0" authors = ["Mauro Lacy "] edition = "2021" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index c6ab3d563e..68212e10a3 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "1.2.7" +version = "1.3.0-rc.0" authors = ["Simon Warta "] edition = "2021" description = "A package for auto-generated code used for CosmWasm contract development. This is shipped as part of cosmwasm-std. Do not use directly." diff --git a/packages/schema-derive/Cargo.toml b/packages/schema-derive/Cargo.toml index 07b76b970d..ccf9e6ce09 100644 --- a/packages/schema-derive/Cargo.toml +++ b/packages/schema-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema-derive" -version = "1.2.7" +version = "1.3.0-rc.0" authors = ["Tomasz Kurcz "] edition = "2021" description = "Derive macros for cosmwasm-schema" diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index 153beae691..7394ecb894 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "1.2.7" +version = "1.3.0-rc.0" authors = ["Simon Warta ", "Ethan Frey "] edition = "2021" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." @@ -8,7 +8,7 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/schema" license = "Apache-2.0" [dependencies] -cosmwasm-schema-derive = { version = "=1.2.7", path = "../schema-derive" } +cosmwasm-schema-derive = { version = "=1.3.0-rc.0", path = "../schema-derive" } schemars = "0.8.3" serde = "1.0" serde_json = "1.0.40" @@ -16,6 +16,6 @@ thiserror = "1.0.26" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = { version = "1.2.7", path = "../std" } +cosmwasm-std = { version = "1.3.0-rc.0", path = "../std" } semver = "1" tempfile = "3" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index d9c9c37ac3..0c34b84a5c 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "1.2.7" +version = "1.3.0-rc.0" authors = ["Ethan Frey "] edition = "2021" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -45,7 +45,7 @@ cosmwasm_1_3 = ["cosmwasm_1_2"] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "1.2.7" } +cosmwasm-derive = { path = "../derive", version = "1.3.0-rc.0" } derivative = "2" forward_ref = "1" hex = "0.4" @@ -57,7 +57,7 @@ thiserror = "1.0.26" bnum = "0.7.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "1.2.7" } +cosmwasm-crypto = { path = "../crypto", version = "1.3.0-rc.0" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index b5dbbab45a..270906d7e9 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "1.2.7" +version = "1.3.0-rc.0" authors = ["Ethan Frey "] edition = "2021" description = "CosmWasm library with useful helpers for Storage patterns" @@ -16,5 +16,5 @@ iterator = ["cosmwasm-std/iterator"] [dependencies] # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.2.7", default-features = false } +cosmwasm-std = { path = "../std", version = "1.3.0-rc.0", default-features = false } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 206716f8a7..4073bdddb1 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "1.2.7" +version = "1.3.0-rc.0" authors = ["Ethan Frey "] edition = "2021" description = "VM bindings to run cosmwams contracts" @@ -42,8 +42,8 @@ required-features = ["iterator"] clru = "0.4.0" crc32fast = "1.3.2" # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.2.7", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "1.2.7" } +cosmwasm-std = { path = "../std", version = "1.3.0-rc.0", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "1.3.0-rc.0" } hex = "0.4" parity-wasm = { version = "0.45", features = ["sign_ext"] } schemars = "0.8.3" From f6301da70f38cb57b47f5a525f255f0127a4d32d Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 3 Jul 2023 11:54:03 +0200 Subject: [PATCH 0512/2372] Update changelog --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ae197ae3b..90769d0a04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [1.3.0-rc.0] - 2023-07-03 ### Fixed @@ -1769,7 +1769,7 @@ Some main points: All future Changelog entries will reference this base -[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.7...HEAD +[1.3.0-rc.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.7...v1.3.0-rc.0 [1.2.7]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.6...v1.2.7 [1.2.6]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.5...v1.2.6 [1.2.5]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.4...v1.2.5 From 1d58dc9547aa134833ba1d016f0c02ce2e90c663 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 3 Jul 2023 15:39:15 +0200 Subject: [PATCH 0513/2372] Fix clippy lints --- packages/std/src/errors/std_error.rs | 4 ++-- packages/std/src/math/int128.rs | 24 +++++++++--------------- packages/std/src/math/int256.rs | 24 +++++++++--------------- packages/std/src/math/int512.rs | 24 +++++++++--------------- packages/std/src/math/int64.rs | 24 +++++++++--------------- 5 files changed, 38 insertions(+), 62 deletions(-) diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index af18d282ea..8e2a486cdc 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -607,7 +607,7 @@ pub enum CoinsError { impl From for StdError { fn from(value: CoinsError) -> Self { - Self::generic_err(format!("Creating Coins: {}", value)) + Self::generic_err(format!("Creating Coins: {value}")) } } @@ -629,7 +629,7 @@ impl From for CoinFromStrError { impl From for StdError { fn from(value: CoinFromStrError) -> Self { - Self::generic_err(format!("Parsing Coin: {}", value)) + Self::generic_err(format!("Parsing Coin: {value}")) } } diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index e30aea7914..0a44bd2744 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -291,7 +291,7 @@ impl FromStr for Int128 { fn from_str(s: &str) -> Result { match s.parse::() { Ok(u) => Ok(Self(u)), - Err(e) => Err(StdError::generic_err(format!("Parsing Int128: {}", e))), + Err(e) => Err(StdError::generic_err(format!("Parsing Int128: {e}"))), } } } @@ -399,10 +399,7 @@ impl Shr for Int128 { fn shr(self, rhs: u32) -> Self::Output { self.checked_shr(rhs).unwrap_or_else(|_| { - panic!( - "right shift error: {} is larger or equal than the number of bits in Int128", - rhs, - ) + panic!("right shift error: {rhs} is larger or equal than the number of bits in Int128",) }) } } @@ -413,10 +410,7 @@ impl Shl for Int128 { fn shl(self, rhs: u32) -> Self::Output { self.checked_shl(rhs).unwrap_or_else(|_| { - panic!( - "left shift error: {} is larger or equal than the number of bits in Int128", - rhs, - ) + panic!("left shift error: {rhs} is larger or equal than the number of bits in Int128",) }) } } @@ -483,7 +477,7 @@ impl<'de> de::Visitor<'de> for Int128Visitor { where E: de::Error, { - Int128::try_from(v).map_err(|e| E::custom(format!("invalid Int128 '{}' - {}", v, e))) + Int128::try_from(v).map_err(|e| E::custom(format!("invalid Int128 '{v}' - {e}"))) } } @@ -608,25 +602,25 @@ mod tests { #[test] fn int128_implements_display() { let a = Int128::from(12345u32); - assert_eq!(format!("Embedded: {}", a), "Embedded: 12345"); + assert_eq!(format!("Embedded: {a}"), "Embedded: 12345"); assert_eq!(a.to_string(), "12345"); let a = Int128::from(-12345i32); - assert_eq!(format!("Embedded: {}", a), "Embedded: -12345"); + assert_eq!(format!("Embedded: {a}"), "Embedded: -12345"); assert_eq!(a.to_string(), "-12345"); let a = Int128::zero(); - assert_eq!(format!("Embedded: {}", a), "Embedded: 0"); + assert_eq!(format!("Embedded: {a}"), "Embedded: 0"); assert_eq!(a.to_string(), "0"); } #[test] fn int128_display_padding_works() { let a = Int128::from(123u64); - assert_eq!(format!("Embedded: {:05}", a), "Embedded: 00123"); + assert_eq!(format!("Embedded: {a:05}"), "Embedded: 00123"); let a = Int128::from(-123i64); - assert_eq!(format!("Embedded: {:05}", a), "Embedded: -0123"); + assert_eq!(format!("Embedded: {a:05}"), "Embedded: -0123"); } #[test] diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index 937cf8df80..74ace49ac0 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -358,7 +358,7 @@ impl FromStr for Int256 { fn from_str(s: &str) -> Result { match I256::from_str_radix(s, 10) { Ok(u) => Ok(Self(u)), - Err(e) => Err(StdError::generic_err(format!("Parsing Int256: {}", e))), + Err(e) => Err(StdError::generic_err(format!("Parsing Int256: {e}"))), } } } @@ -471,10 +471,7 @@ impl Shr for Int256 { fn shr(self, rhs: u32) -> Self::Output { self.checked_shr(rhs).unwrap_or_else(|_| { - panic!( - "right shift error: {} is larger or equal than the number of bits in Int256", - rhs, - ) + panic!("right shift error: {rhs} is larger or equal than the number of bits in Int256",) }) } } @@ -485,10 +482,7 @@ impl Shl for Int256 { fn shl(self, rhs: u32) -> Self::Output { self.checked_shl(rhs).unwrap_or_else(|_| { - panic!( - "left shift error: {} is larger or equal than the number of bits in Int256", - rhs, - ) + panic!("left shift error: {rhs} is larger or equal than the number of bits in Int256",) }) } } @@ -555,7 +549,7 @@ impl<'de> de::Visitor<'de> for Int256Visitor { where E: de::Error, { - Int256::try_from(v).map_err(|e| E::custom(format!("invalid Int256 '{}' - {}", v, e))) + Int256::try_from(v).map_err(|e| E::custom(format!("invalid Int256 '{v}' - {e}"))) } } @@ -673,25 +667,25 @@ mod tests { #[test] fn int256_implements_display() { let a = Int256::from(12345u32); - assert_eq!(format!("Embedded: {}", a), "Embedded: 12345"); + assert_eq!(format!("Embedded: {a}"), "Embedded: 12345"); assert_eq!(a.to_string(), "12345"); let a = Int256::from(-12345i32); - assert_eq!(format!("Embedded: {}", a), "Embedded: -12345"); + assert_eq!(format!("Embedded: {a}"), "Embedded: -12345"); assert_eq!(a.to_string(), "-12345"); let a = Int256::zero(); - assert_eq!(format!("Embedded: {}", a), "Embedded: 0"); + assert_eq!(format!("Embedded: {a}"), "Embedded: 0"); assert_eq!(a.to_string(), "0"); } #[test] fn int256_display_padding_works() { let a = Int256::from(123u64); - assert_eq!(format!("Embedded: {:05}", a), "Embedded: 00123"); + assert_eq!(format!("Embedded: {a:05}"), "Embedded: 00123"); let a = Int256::from(-123i64); - assert_eq!(format!("Embedded: {:05}", a), "Embedded: -0123"); + assert_eq!(format!("Embedded: {a:05}"), "Embedded: -0123"); } #[test] diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index 980b81ee5c..f3e5cba0f9 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -391,7 +391,7 @@ impl FromStr for Int512 { fn from_str(s: &str) -> Result { match I512::from_str_radix(s, 10) { Ok(u) => Ok(Self(u)), - Err(e) => Err(StdError::generic_err(format!("Parsing Int512: {}", e))), + Err(e) => Err(StdError::generic_err(format!("Parsing Int512: {e}"))), } } } @@ -504,10 +504,7 @@ impl Shr for Int512 { fn shr(self, rhs: u32) -> Self::Output { self.checked_shr(rhs).unwrap_or_else(|_| { - panic!( - "right shift error: {} is larger or equal than the number of bits in Int512", - rhs, - ) + panic!("right shift error: {rhs} is larger or equal than the number of bits in Int512",) }) } } @@ -518,10 +515,7 @@ impl Shl for Int512 { fn shl(self, rhs: u32) -> Self::Output { self.checked_shl(rhs).unwrap_or_else(|_| { - panic!( - "left shift error: {} is larger or equal than the number of bits in Int512", - rhs, - ) + panic!("left shift error: {rhs} is larger or equal than the number of bits in Int512",) }) } } @@ -588,7 +582,7 @@ impl<'de> de::Visitor<'de> for Int512Visitor { where E: de::Error, { - Int512::try_from(v).map_err(|e| E::custom(format!("invalid Int512 '{}' - {}", v, e))) + Int512::try_from(v).map_err(|e| E::custom(format!("invalid Int512 '{v}' - {e}"))) } } @@ -712,25 +706,25 @@ mod tests { #[test] fn int512_implements_display() { let a = Int512::from(12345u32); - assert_eq!(format!("Embedded: {}", a), "Embedded: 12345"); + assert_eq!(format!("Embedded: {a}"), "Embedded: 12345"); assert_eq!(a.to_string(), "12345"); let a = Int512::from(-12345i32); - assert_eq!(format!("Embedded: {}", a), "Embedded: -12345"); + assert_eq!(format!("Embedded: {a}"), "Embedded: -12345"); assert_eq!(a.to_string(), "-12345"); let a = Int512::zero(); - assert_eq!(format!("Embedded: {}", a), "Embedded: 0"); + assert_eq!(format!("Embedded: {a}"), "Embedded: 0"); assert_eq!(a.to_string(), "0"); } #[test] fn int512_display_padding_works() { let a = Int512::from(123u64); - assert_eq!(format!("Embedded: {:05}", a), "Embedded: 00123"); + assert_eq!(format!("Embedded: {a:05}"), "Embedded: 00123"); let a = Int512::from(-123i64); - assert_eq!(format!("Embedded: {:05}", a), "Embedded: -0123"); + assert_eq!(format!("Embedded: {a:05}"), "Embedded: -0123"); } #[test] diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index 8cfbc756c6..f26e79fe75 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -267,7 +267,7 @@ impl FromStr for Int64 { fn from_str(s: &str) -> Result { match s.parse::() { Ok(u) => Ok(Self(u)), - Err(e) => Err(StdError::generic_err(format!("Parsing Int64: {}", e))), + Err(e) => Err(StdError::generic_err(format!("Parsing Int64: {e}"))), } } } @@ -375,10 +375,7 @@ impl Shr for Int64 { fn shr(self, rhs: u32) -> Self::Output { self.checked_shr(rhs).unwrap_or_else(|_| { - panic!( - "right shift error: {} is larger or equal than the number of bits in Int64", - rhs, - ) + panic!("right shift error: {rhs} is larger or equal than the number of bits in Int64",) }) } } @@ -389,10 +386,7 @@ impl Shl for Int64 { fn shl(self, rhs: u32) -> Self::Output { self.checked_shl(rhs).unwrap_or_else(|_| { - panic!( - "left shift error: {} is larger or equal than the number of bits in Int64", - rhs, - ) + panic!("left shift error: {rhs} is larger or equal than the number of bits in Int64",) }) } } @@ -459,7 +453,7 @@ impl<'de> de::Visitor<'de> for Int64Visitor { where E: de::Error, { - Int64::try_from(v).map_err(|e| E::custom(format!("invalid Int64 '{}' - {}", v, e))) + Int64::try_from(v).map_err(|e| E::custom(format!("invalid Int64 '{v}' - {e}"))) } } @@ -578,25 +572,25 @@ mod tests { #[test] fn int64_implements_display() { let a = Int64::from(12345u32); - assert_eq!(format!("Embedded: {}", a), "Embedded: 12345"); + assert_eq!(format!("Embedded: {a}"), "Embedded: 12345"); assert_eq!(a.to_string(), "12345"); let a = Int64::from(-12345i32); - assert_eq!(format!("Embedded: {}", a), "Embedded: -12345"); + assert_eq!(format!("Embedded: {a}"), "Embedded: -12345"); assert_eq!(a.to_string(), "-12345"); let a = Int64::zero(); - assert_eq!(format!("Embedded: {}", a), "Embedded: 0"); + assert_eq!(format!("Embedded: {a}"), "Embedded: 0"); assert_eq!(a.to_string(), "0"); } #[test] fn int64_display_padding_works() { let a = Int64::from(123i64); - assert_eq!(format!("Embedded: {:05}", a), "Embedded: 00123"); + assert_eq!(format!("Embedded: {a:05}"), "Embedded: 00123"); let a = Int64::from(-123i64); - assert_eq!(format!("Embedded: {:05}", a), "Embedded: -0123"); + assert_eq!(format!("Embedded: {a:05}"), "Embedded: -0123"); } #[test] From 5a4533242cff2414e98c1457c98f8016606b5297 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 3 Jul 2023 17:29:55 +0200 Subject: [PATCH 0514/2372] Fix changelog --- CHANGELOG.md | 67 +++++++++++++--------------------------------------- 1 file changed, 17 insertions(+), 50 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f818a6feb..9cea75c7e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,22 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + +### Changed + +- cosmwasm-vm: Avoid using loupe for getting the `Module` size in the file + system cache to prepare for the Wasmer 3 upgrade. +- cosmwasm-vm: When enabling `print_debug` the debug logs are now printed to + STDERR instead of STDOUT by default ([#1667]). +- cosmwasm-vm: Add `Instance::set_debug_handler`/`unset_debug_handler` to allow + customizing the handling of debug messages emitted by the contract ([#1667]). +- cosmwasm-vm: Upgrade Wasmer to version 4.0.0. +- cosmwasm-check: Update clap dependency to version 4 ([#1677]) + +[#1667]: https://github.com/CosmWasm/cosmwasm/pull/1667 +[#1677]: https://github.com/CosmWasm/cosmwasm/pull/1677 + ## [1.3.0-rc.0] - 2023-07-03 ### Fixed @@ -59,56 +75,6 @@ and this project adheres to [#1664]: https://github.com/CosmWasm/cosmwasm/pull/1664 [#1686]: https://github.com/CosmWasm/cosmwasm/pull/1686 -### Added - -- cosmwasm-std: Implement `BankQuery::AllDenomMetadata` to allow querying all - the denom metadata and `BankQuery::DenomMetadata` to query a specific one. In - order to use this query in a contract, the `cosmwasm_1_3` feature needs to be - enabled for the `cosmwasm_std` dependency. This makes the contract - incompatible with chains running anything lower than CosmWasm `1.3.0`. - ([#1647]) -- cosmwasm-vm: Add `Cache::save_wasm_unchecked` to save Wasm blobs that have - been checked before. This is useful for state-sync where we know the Wasm code - was checked when it was first uploaded. ([#1635]) -- cosmwasm-std: Add `FromStr` impl for `Coin`. ([#1684]) -- cosmwasm-std: Add `Decimal::bps` and `Decimal256::bps` to create a decimal - from a basis point value ([#1715]). - -[#1635]: https://github.com/CosmWasm/cosmwasm/pull/1635 -[#1647]: https://github.com/CosmWasm/cosmwasm/pull/1647 -[#1684]: https://github.com/CosmWasm/cosmwasm/pull/1684 -[#1715]: https://github.com/CosmWasm/cosmwasm/pull/1715 - -### Changed - -- cosmwasm-vm: Add checks for table section of Wasm blob ([#1631]). -- cosmwasm-vm: Limit number of imports during static validation ([#1629]). -- cosmwasm-vm: The `check_contract` example was removed. Please use the crate - [cosmwasm-check](https://crates.io/crates/cosmwasm-check) instead ([#1511]). -- cosmwasm-vm: Avoid using loupe for getting the `Module` size in the file - system cache to prepare for the Wasmer 3 upgrade. -- cosmwasm-vm: Add target (triple + CPU features) into the module cache - directory to avoid using modules compiled for a different system. Bump - `MODULE_SERIALIZATION_VERSION` to "v5". ([#1664]) -- cosmwasm-vm: When enabling `print_debug` the debug logs are now printed to - STDERR instead of STDOUT by default ([#1667]). -- cosmwasm-vm: Add `Instance::set_debug_handler`/`unset_debug_handler` to allow - customizing the handling of debug messages emitted by the contract ([#1667]). -- cosmwasm-vm: Add `.wasm` extension to stored wasm files ([#1686]). -- cosmwasm-vm: Upgrade Wasmer to version 4.0.0. -- cosmwasm-check: Update clap dependency to version 4 ([#1677]) -- cosmwasm-std: Coin uses shorter `Coin { 123 "ucosm" }` format for Debug - ([#1704]) - -[#1511]: https://github.com/CosmWasm/cosmwasm/issues/1511 -[#1629]: https://github.com/CosmWasm/cosmwasm/pull/1629 -[#1631]: https://github.com/CosmWasm/cosmwasm/pull/1631 -[#1664]: https://github.com/CosmWasm/cosmwasm/pull/1664 -[#1667]: https://github.com/CosmWasm/cosmwasm/pull/1667 -[#1677]: https://github.com/CosmWasm/cosmwasm/pull/1677 -[#1686]: https://github.com/CosmWasm/cosmwasm/pull/1686 -[#1704]: https://github.com/CosmWasm/cosmwasm/pull/1704 - ### Deprecated - cosmwasm-storage: All exports are deprecated because this crate will be @@ -1826,6 +1792,7 @@ Some main points: All future Changelog entries will reference this base +[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.0-rc.0...HEAD [1.3.0-rc.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.7...v1.3.0-rc.0 [1.2.7]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.6...v1.2.7 [1.2.6]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.5...v1.2.6 From 580277dd0daf0762f9f3c91570f28f79e74e118a Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 4 Jul 2023 13:38:26 +0200 Subject: [PATCH 0515/2372] Use Addr in DelegatorWithdrawAddressResponse --- packages/std/src/query/distribution.rs | 20 ++++++++++++++++---- packages/std/src/testing/mock.rs | 10 +++++----- packages/std/src/traits.rs | 2 +- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/packages/std/src/query/distribution.rs b/packages/std/src/query/distribution.rs index ffe5772322..9e1b5e0db1 100644 --- a/packages/std/src/query/distribution.rs +++ b/packages/std/src/query/distribution.rs @@ -1,7 +1,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use super::query_response::QueryResponseType; +use crate::Addr; #[non_exhaustive] #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] @@ -12,11 +12,23 @@ pub enum DistributionQuery { } // https://github.com/cosmos/cosmos-sdk/blob/4f6f6c00021f4b5ee486bbb71ae2071a8ceb47c9/x/distribution/types/query.pb.go#L832-L835 -#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq, JsonSchema)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] #[non_exhaustive] pub struct DelegatorWithdrawAddressResponse { - pub withdraw_address: String, + pub withdraw_address: Addr, } -impl QueryResponseType for DelegatorWithdrawAddressResponse {} +impl DelegatorWithdrawAddressResponse { + /// Constructor for testing frameworks such as cw-multi-test. + /// This is required because query response types should be #[non_exhaustive]. + /// As a contract developer you should not need this constructor since + /// query responses are constructed for you via deserialization. + /// + /// Warning: This is for cw-multi-test use only and can change at any time. + #[doc(hidden)] + #[allow(dead_code)] + pub fn from_parts(withdraw_address: Addr) -> Self { + Self { withdraw_address } + } +} diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 109342884e..a367e0e8b4 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -972,11 +972,11 @@ impl DistributionQuerier { let contract_result: ContractResult = match request { DistributionQuery::DelegatorWithdrawAddress { delegator_address } => { let res = DelegatorWithdrawAddressResponse { - withdraw_address: self - .withdraw_addresses - .get(delegator_address) - .unwrap_or(delegator_address) - .clone(), + withdraw_address: Addr::unchecked( + self.withdraw_addresses + .get(delegator_address) + .unwrap_or(delegator_address), + ), }; to_binary(&res).into() } diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index f33f3799a5..f7aca97ba4 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -282,7 +282,7 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { pub fn query_delegator_withdraw_address( &self, delegator: impl Into, - ) -> StdResult { + ) -> StdResult { let request = DistributionQuery::DelegatorWithdrawAddress { delegator_address: delegator.into(), } From 16a69905655aae0660b5d08b8bf199bb8dae64a4 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 4 Jul 2023 15:18:55 +0200 Subject: [PATCH 0516/2372] Create hidden constructor for query responses --- packages/std/src/query/bank.rs | 33 ++++++++++++++++++++++++++ packages/std/src/query/distribution.rs | 14 +---------- packages/std/src/query/ibc.rs | 6 +++++ packages/std/src/query/mod.rs | 19 +++++++++++++++ packages/std/src/query/staking.rs | 10 ++++++++ packages/std/src/query/wasm.rs | 8 +++++++ 6 files changed, 77 insertions(+), 13 deletions(-) diff --git a/packages/std/src/query/bank.rs b/packages/std/src/query/bank.rs index 74d8b2b9d7..94215c4045 100644 --- a/packages/std/src/query/bank.rs +++ b/packages/std/src/query/bank.rs @@ -44,6 +44,9 @@ pub struct SupplyResponse { pub amount: Coin, } +#[cfg(feature = "cosmwasm_1_1")] +impl_response_constructor!(SupplyResponse, amount: Coin); + #[cfg(feature = "cosmwasm_1_1")] impl QueryResponseType for SupplyResponse {} @@ -55,6 +58,8 @@ pub struct BalanceResponse { pub amount: Coin, } +impl_response_constructor!(BalanceResponse, amount: Coin); + impl QueryResponseType for BalanceResponse {} #[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq, JsonSchema)] @@ -64,6 +69,8 @@ pub struct AllBalanceResponse { pub amount: Vec, } +impl_response_constructor!(AllBalanceResponse, amount: Vec); + impl QueryResponseType for AllBalanceResponse {} #[cfg(feature = "cosmwasm_1_3")] @@ -75,6 +82,9 @@ pub struct DenomMetadataResponse { pub metadata: DenomMetadata, } +#[cfg(feature = "cosmwasm_1_3")] +impl_response_constructor!(DenomMetadataResponse, metadata: DenomMetadata); + #[cfg(feature = "cosmwasm_1_3")] impl QueryResponseType for DenomMetadataResponse {} @@ -88,5 +98,28 @@ pub struct AllDenomMetadataResponse { pub next_key: Option, } +#[cfg(feature = "cosmwasm_1_3")] +impl_response_constructor!( + AllDenomMetadataResponse, + metadata: Vec, + next_key: Option +); + #[cfg(feature = "cosmwasm_1_3")] impl QueryResponseType for AllDenomMetadataResponse {} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn private_constructor_works() { + let response = AllBalanceResponse::new(vec![Coin::new(1234, "uatom")]); + assert_eq!( + response, + AllBalanceResponse { + amount: vec![Coin::new(1234, "uatom")] + } + ); + } +} diff --git a/packages/std/src/query/distribution.rs b/packages/std/src/query/distribution.rs index 9e1b5e0db1..4afa0032ee 100644 --- a/packages/std/src/query/distribution.rs +++ b/packages/std/src/query/distribution.rs @@ -19,16 +19,4 @@ pub struct DelegatorWithdrawAddressResponse { pub withdraw_address: Addr, } -impl DelegatorWithdrawAddressResponse { - /// Constructor for testing frameworks such as cw-multi-test. - /// This is required because query response types should be #[non_exhaustive]. - /// As a contract developer you should not need this constructor since - /// query responses are constructed for you via deserialization. - /// - /// Warning: This is for cw-multi-test use only and can change at any time. - #[doc(hidden)] - #[allow(dead_code)] - pub fn from_parts(withdraw_address: Addr) -> Self { - Self { withdraw_address } - } -} +impl_response_constructor!(DelegatorWithdrawAddressResponse, withdraw_address: Addr); diff --git a/packages/std/src/query/ibc.rs b/packages/std/src/query/ibc.rs index 0164de3301..4cff9e43b4 100644 --- a/packages/std/src/query/ibc.rs +++ b/packages/std/src/query/ibc.rs @@ -37,12 +37,18 @@ pub struct PortIdResponse { pub port_id: String, } +impl_response_constructor!(PortIdResponse, port_id: String); + #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] pub struct ListChannelsResponse { pub channels: Vec, } +impl_response_constructor!(ListChannelsResponse, channels: Vec); + #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] pub struct ChannelResponse { pub channel: Option, } + +impl_response_constructor!(ChannelResponse, channel: Option); diff --git a/packages/std/src/query/mod.rs b/packages/std/src/query/mod.rs index 5401f9145d..42a7978c38 100644 --- a/packages/std/src/query/mod.rs +++ b/packages/std/src/query/mod.rs @@ -5,6 +5,25 @@ use serde::{Deserialize, Serialize}; use crate::Binary; use crate::Empty; +/// Implements a hidden constructor for query responses. +macro_rules! impl_response_constructor { + ( $response:ty, $( $field: ident : $t: ty),* ) => { + impl $response { + /// Constructor for testing frameworks such as cw-multi-test. + /// This is required because query response types should be #[non_exhaustive]. + /// As a contract developer you should not need this constructor since + /// query responses are constructed for you via deserialization. + /// + /// Warning: This can change in breaking ways in minor versions. + #[doc(hidden)] + #[allow(dead_code)] + pub fn new($( $field: $t),*) -> Self { + Self { $( $field: $field.into() ),* } + } + } + }; +} + mod bank; mod distribution; mod ibc; diff --git a/packages/std/src/query/staking.rs b/packages/std/src/query/staking.rs index fa513ac52a..c8d1b8e1c1 100644 --- a/packages/std/src/query/staking.rs +++ b/packages/std/src/query/staking.rs @@ -40,6 +40,8 @@ pub struct BondedDenomResponse { pub denom: String, } +impl_response_constructor!(BondedDenomResponse, denom: String); + /// DelegationsResponse is data format returned from StakingRequest::AllDelegations query #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] @@ -47,6 +49,8 @@ pub struct AllDelegationsResponse { pub delegations: Vec, } +impl_response_constructor!(AllDelegationsResponse, delegations: Vec); + /// Delegation is basic (cheap to query) data about a delegation. /// /// Instances are created in the querier. @@ -76,6 +80,8 @@ pub struct DelegationResponse { pub delegation: Option, } +impl_response_constructor!(DelegationResponse, delegation: Option); + /// FullDelegation is all the info on the delegation, some (like accumulated_reward and can_redelegate) /// is expensive to query. /// @@ -101,12 +107,16 @@ pub struct AllValidatorsResponse { pub validators: Vec, } +impl_response_constructor!(AllValidatorsResponse, validators: Vec); + /// The data format returned from StakingRequest::Validator query #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] pub struct ValidatorResponse { pub validator: Option, } +impl_response_constructor!(ValidatorResponse, validator: Option); + /// Instances are created in the querier. #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] pub struct Validator { diff --git a/packages/std/src/query/wasm.rs b/packages/std/src/query/wasm.rs index 039251a4d7..e8f72ad737 100644 --- a/packages/std/src/query/wasm.rs +++ b/packages/std/src/query/wasm.rs @@ -85,6 +85,14 @@ pub struct CodeInfoResponse { pub checksum: HexBinary, } +#[cfg(feature = "cosmwasm_1_2")] +impl_response_constructor!( + CodeInfoResponse, + code_id: u64, + creator: String, + checksum: HexBinary +); + #[cfg(feature = "cosmwasm_1_2")] impl QueryResponseType for CodeInfoResponse {} From 333952f3aaf5f5015b726600c470ba4b0d83635c Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 6 Jul 2023 12:51:18 +0200 Subject: [PATCH 0517/2372] Remove Default impls --- packages/std/src/query/bank.rs | 4 ++-- packages/std/src/query/query_response.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/std/src/query/bank.rs b/packages/std/src/query/bank.rs index 94215c4045..a1ea2670f7 100644 --- a/packages/std/src/query/bank.rs +++ b/packages/std/src/query/bank.rs @@ -74,7 +74,7 @@ impl_response_constructor!(AllBalanceResponse, amount: Vec); impl QueryResponseType for AllBalanceResponse {} #[cfg(feature = "cosmwasm_1_3")] -#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq, JsonSchema)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] #[non_exhaustive] pub struct DenomMetadataResponse { @@ -89,7 +89,7 @@ impl_response_constructor!(DenomMetadataResponse, metadata: DenomMetadata); impl QueryResponseType for DenomMetadataResponse {} #[cfg(feature = "cosmwasm_1_3")] -#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq, JsonSchema)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] #[non_exhaustive] pub struct AllDenomMetadataResponse { diff --git a/packages/std/src/query/query_response.rs b/packages/std/src/query/query_response.rs index dca2e766c9..667c11e59e 100644 --- a/packages/std/src/query/query_response.rs +++ b/packages/std/src/query/query_response.rs @@ -13,4 +13,4 @@ use serde::de::DeserializeOwned; /// - multi-test/cw-sdk: create a default instance and mutate the fields /// /// This trait is crate-internal and can change any time. -pub(crate) trait QueryResponseType: Default + DeserializeOwned {} +pub(crate) trait QueryResponseType: DeserializeOwned {} From b4fc7f6a19b8c53bd0009467bc61c4c0beec6f9d Mon Sep 17 00:00:00 2001 From: Michal Nazarewicz Date: Thu, 13 Jul 2023 13:56:25 +0200 Subject: [PATCH 0518/2372] cosmwasm_std: remove dependency on DefaultHasher in tests DefaultHasher is part of std module and is not available on no_std builds. Remove dependency on that type to pave the path for no_std support. This is done by adding test_utils::check_hash_impl helper function which tests whether type implements Hash trait. That function uses crc32fast::Hasher instead of DefaultHasher thus eliminating need for std. Furthermore, Binary and HexBinary tests checking AsRef implementation call AsRef::as_ref directly and explicitly check the result rather than unnecessarily hashing the data. As an added bonus, this diff has negative delta. \o/ --- Cargo.lock | 1 + packages/std/Cargo.toml | 1 + packages/std/src/addresses.rs | 20 ++------------ packages/std/src/binary.rs | 48 +++++----------------------------- packages/std/src/hex_binary.rs | 48 +++++----------------------------- packages/std/src/lib.rs | 4 +++ packages/std/src/test_utils.rs | 24 +++++++++++++++++ 7 files changed, 44 insertions(+), 102 deletions(-) create mode 100644 packages/std/src/test_utils.rs diff --git a/Cargo.lock b/Cargo.lock index 0071b3775a..2d51248c97 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -489,6 +489,7 @@ dependencies = [ "cosmwasm-crypto", "cosmwasm-derive", "cosmwasm-schema", + "crc32fast", "derivative", "forward_ref", "hex", diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 0c34b84a5c..aadcbb4488 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -63,5 +63,6 @@ cosmwasm-crypto = { path = "../crypto", version = "1.3.0-rc.0" } cosmwasm-schema = { path = "../schema" } # The chrono dependency is only used in an example, which Rust compiles for us. If this causes trouble, remove it. chrono = { version = "0.4", default-features = false, features = ["alloc", "std"] } +crc32fast = "1.3.2" hex-literal = "0.3.1" serde_json = "1.0.81" diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index 8ca10d0544..7eec12502c 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -401,9 +401,7 @@ mod tests { use super::*; use crate::HexBinary; use hex_literal::hex; - use std::collections::hash_map::DefaultHasher; use std::collections::HashSet; - use std::hash::{Hash, Hasher}; #[test] fn addr_unchecked_works() { @@ -651,23 +649,9 @@ mod tests { #[test] fn canonical_addr_implements_hash() { - let alice1 = CanonicalAddr::from([0, 187, 61, 11, 250, 0]); - let mut hasher = DefaultHasher::new(); - alice1.hash(&mut hasher); - let alice1_hash = hasher.finish(); - - let alice2 = CanonicalAddr::from([0, 187, 61, 11, 250, 0]); - let mut hasher = DefaultHasher::new(); - alice2.hash(&mut hasher); - let alice2_hash = hasher.finish(); - + let alice = CanonicalAddr::from([0, 187, 61, 11, 250, 0]); let bob = CanonicalAddr::from([16, 21, 33, 0, 255, 9]); - let mut hasher = DefaultHasher::new(); - bob.hash(&mut hasher); - let bob_hash = hasher.finish(); - - assert_eq!(alice1_hash, alice2_hash); - assert_ne!(alice1_hash, bob_hash); + crate::test_utils::check_hash_impl(alice, bob) } /// This requires Hash and Eq to be implemented diff --git a/packages/std/src/binary.rs b/packages/std/src/binary.rs index 15bac355d8..9696063422 100644 --- a/packages/std/src/binary.rs +++ b/packages/std/src/binary.rs @@ -240,9 +240,7 @@ mod tests { use super::*; use crate::errors::StdError; use crate::serde::{from_slice, to_vec}; - use std::collections::hash_map::DefaultHasher; use std::collections::HashSet; - use std::hash::{Hash, Hasher}; #[test] fn encode_decode() { @@ -505,51 +503,17 @@ mod tests { #[test] fn binary_implements_as_ref() { - // Can use as_ref (this we already get via the Deref implementation) - let data = Binary(vec![7u8, 35, 49, 101, 0, 255]); - assert_eq!(data.as_ref(), &[7u8, 35, 49, 101, 0, 255]); - - let data = Binary(vec![7u8, 35, 49, 101, 0, 255]); - let data_ref = &data; - assert_eq!(data_ref.as_ref(), &[7u8, 35, 49, 101, 0, 255]); - - // Implements as ref - - // This is a dummy function to mimic the signature of - // https://docs.rs/sha2/0.10.6/sha2/trait.Digest.html#tymethod.digest - fn hash(data: impl AsRef<[u8]>) -> u64 { - let mut hasher = DefaultHasher::new(); - data.as_ref().hash(&mut hasher); - hasher.finish() - } - - let data = Binary(vec![7u8, 35, 49, 101, 0, 255]); - hash(data); - - let data = Binary(vec![7u8, 35, 49, 101, 0, 255]); - let data_ref = &data; - hash(data_ref); + let want = &[7u8, 35, 49, 101, 0, 255]; + let data = Binary(want.to_vec()); + assert_eq!(want, AsRef::<[u8]>::as_ref(&data)); + assert_eq!(want, AsRef::<[u8]>::as_ref(&&data)); } #[test] fn binary_implements_hash() { - let a1 = Binary::from([0, 187, 61, 11, 250, 0]); - let mut hasher = DefaultHasher::new(); - a1.hash(&mut hasher); - let a1_hash = hasher.finish(); - - let a2 = Binary::from([0, 187, 61, 11, 250, 0]); - let mut hasher = DefaultHasher::new(); - a2.hash(&mut hasher); - let a2_hash = hasher.finish(); - + let a = Binary::from([0, 187, 61, 11, 250, 0]); let b = Binary::from([16, 21, 33, 0, 255, 9]); - let mut hasher = DefaultHasher::new(); - b.hash(&mut hasher); - let b_hash = hasher.finish(); - - assert_eq!(a1_hash, a2_hash); - assert_ne!(a1_hash, b_hash); + crate::test_utils::check_hash_impl(a, b) } /// This requires Hash and Eq to be implemented diff --git a/packages/std/src/hex_binary.rs b/packages/std/src/hex_binary.rs index bc3bc5ba21..e81ee35ede 100644 --- a/packages/std/src/hex_binary.rs +++ b/packages/std/src/hex_binary.rs @@ -248,9 +248,7 @@ mod tests { use super::*; use crate::{from_slice, to_vec, StdError}; - use std::collections::hash_map::DefaultHasher; use std::collections::HashSet; - use std::hash::{Hash, Hasher}; #[test] fn from_hex_works() { @@ -569,51 +567,17 @@ mod tests { #[test] fn hex_binary_implements_as_ref() { - // Can use as_ref (this we already get via the Deref implementation) - let data = HexBinary(vec![7u8, 35, 49, 101, 0, 255]); - assert_eq!(data.as_ref(), &[7u8, 35, 49, 101, 0, 255]); - - let data = HexBinary(vec![7u8, 35, 49, 101, 0, 255]); - let data_ref = &data; - assert_eq!(data_ref.as_ref(), &[7u8, 35, 49, 101, 0, 255]); - - // Implements as ref - - // This is a dummy function to mimic the signature of - // https://docs.rs/sha2/0.10.6/sha2/trait.Digest.html#tymethod.digest - fn hash(data: impl AsRef<[u8]>) -> u64 { - let mut hasher = DefaultHasher::new(); - data.as_ref().hash(&mut hasher); - hasher.finish() - } - - let data = HexBinary(vec![7u8, 35, 49, 101, 0, 255]); - hash(data); - - let data = HexBinary(vec![7u8, 35, 49, 101, 0, 255]); - let data_ref = &data; - hash(data_ref); + let want = &[7u8, 35, 49, 101, 0, 255]; + let data = HexBinary(want.to_vec()); + assert_eq!(want, AsRef::<[u8]>::as_ref(&data)); + assert_eq!(want, AsRef::<[u8]>::as_ref(&&data)); } #[test] fn hex_binary_implements_hash() { - let a1 = HexBinary::from([0, 187, 61, 11, 250, 0]); - let mut hasher = DefaultHasher::new(); - a1.hash(&mut hasher); - let a1_hash = hasher.finish(); - - let a2 = HexBinary::from([0, 187, 61, 11, 250, 0]); - let mut hasher = DefaultHasher::new(); - a2.hash(&mut hasher); - let a2_hash = hasher.finish(); - + let a = HexBinary::from([0, 187, 61, 11, 250, 0]); let b = HexBinary::from([16, 21, 33, 0, 255, 9]); - let mut hasher = DefaultHasher::new(); - b.hash(&mut hasher); - let b_hash = hasher.finish(); - - assert_eq!(a1_hash, a2_hash); - assert_ne!(a1_hash, b_hash); + crate::test_utils::check_hash_impl(a, b) } /// This requires Hash and Eq to be implemented diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 0f26389b38..326e6f1132 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -121,6 +121,10 @@ pub use crate::imports::{ExternalApi, ExternalQuerier, ExternalStorage}; #[cfg(not(target_arch = "wasm32"))] pub mod testing; +// Internal testing utilities +#[cfg(test)] +mod test_utils; + // Re-exports pub use cosmwasm_derive::entry_point; diff --git a/packages/std/src/test_utils.rs b/packages/std/src/test_utils.rs new file mode 100644 index 0000000000..3da93c189b --- /dev/null +++ b/packages/std/src/test_utils.rs @@ -0,0 +1,24 @@ +//! Module with common routines used internally by the library in unit tests. + +use core::hash::{Hash, Hasher}; + +/// Tests that type `T` implements `Hash` trait correctly. +/// +/// `foo` and `bar` must be different objects. +/// +/// Some object pairs may produce the same hash causing test failure. In those +/// cases try different objects. The test uses stable hasher so once working +/// pair is identified, the test’s going to continue passing. +pub(crate) fn check_hash_impl(foo: T, bar: T) { + let foo_copy = foo.clone(); + + fn hash(value: &T) -> u64 { + let mut hasher = crc32fast::Hasher::default(); + value.hash(&mut hasher); + hasher.finish() + } + + let foo_hash = hash(&foo); + assert_eq!(foo_hash, hash(&foo_copy)); + assert_ne!(foo_hash, hash(&bar)); +} From a3c95971002e291ff8c18d3a990e87f9d6cec74c Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Sat, 15 Jul 2023 12:26:53 +0200 Subject: [PATCH 0519/2372] Convert test helper into assert_hash_works --- packages/std/src/addresses.rs | 4 +- packages/std/src/binary.rs | 3 +- packages/std/src/hex_binary.rs | 4 +- packages/std/src/lib.rs | 4 -- packages/std/src/test_utils.rs | 24 ----------- packages/std/src/testing/assertions.rs | 60 ++++++++++++++++++++++++++ packages/std/src/testing/mod.rs | 2 + 7 files changed, 68 insertions(+), 33 deletions(-) delete mode 100644 packages/std/src/test_utils.rs diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index 7eec12502c..3110b4d634 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -399,7 +399,7 @@ fn hash(ty: &str, key: &[u8]) -> Vec { #[cfg(test)] mod tests { use super::*; - use crate::HexBinary; + use crate::{assert_hash_works, HexBinary}; use hex_literal::hex; use std::collections::HashSet; @@ -651,7 +651,7 @@ mod tests { fn canonical_addr_implements_hash() { let alice = CanonicalAddr::from([0, 187, 61, 11, 250, 0]); let bob = CanonicalAddr::from([16, 21, 33, 0, 255, 9]); - crate::test_utils::check_hash_impl(alice, bob) + assert_hash_works!(alice, bob); } /// This requires Hash and Eq to be implemented diff --git a/packages/std/src/binary.rs b/packages/std/src/binary.rs index 9696063422..368d5f6f84 100644 --- a/packages/std/src/binary.rs +++ b/packages/std/src/binary.rs @@ -238,6 +238,7 @@ impl<'de> de::Visitor<'de> for Base64Visitor { #[cfg(test)] mod tests { use super::*; + use crate::assert_hash_works; use crate::errors::StdError; use crate::serde::{from_slice, to_vec}; use std::collections::HashSet; @@ -513,7 +514,7 @@ mod tests { fn binary_implements_hash() { let a = Binary::from([0, 187, 61, 11, 250, 0]); let b = Binary::from([16, 21, 33, 0, 255, 9]); - crate::test_utils::check_hash_impl(a, b) + assert_hash_works!(a, b); } /// This requires Hash and Eq to be implemented diff --git a/packages/std/src/hex_binary.rs b/packages/std/src/hex_binary.rs index e81ee35ede..26048dc30b 100644 --- a/packages/std/src/hex_binary.rs +++ b/packages/std/src/hex_binary.rs @@ -247,7 +247,7 @@ impl<'de> de::Visitor<'de> for HexVisitor { mod tests { use super::*; - use crate::{from_slice, to_vec, StdError}; + use crate::{assert_hash_works, from_slice, to_vec, StdError}; use std::collections::HashSet; #[test] @@ -577,7 +577,7 @@ mod tests { fn hex_binary_implements_hash() { let a = HexBinary::from([0, 187, 61, 11, 250, 0]); let b = HexBinary::from([16, 21, 33, 0, 255, 9]); - crate::test_utils::check_hash_impl(a, b) + assert_hash_works!(a, b); } /// This requires Hash and Eq to be implemented diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 326e6f1132..0f26389b38 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -121,10 +121,6 @@ pub use crate::imports::{ExternalApi, ExternalQuerier, ExternalStorage}; #[cfg(not(target_arch = "wasm32"))] pub mod testing; -// Internal testing utilities -#[cfg(test)] -mod test_utils; - // Re-exports pub use cosmwasm_derive::entry_point; diff --git a/packages/std/src/test_utils.rs b/packages/std/src/test_utils.rs deleted file mode 100644 index 3da93c189b..0000000000 --- a/packages/std/src/test_utils.rs +++ /dev/null @@ -1,24 +0,0 @@ -//! Module with common routines used internally by the library in unit tests. - -use core::hash::{Hash, Hasher}; - -/// Tests that type `T` implements `Hash` trait correctly. -/// -/// `foo` and `bar` must be different objects. -/// -/// Some object pairs may produce the same hash causing test failure. In those -/// cases try different objects. The test uses stable hasher so once working -/// pair is identified, the test’s going to continue passing. -pub(crate) fn check_hash_impl(foo: T, bar: T) { - let foo_copy = foo.clone(); - - fn hash(value: &T) -> u64 { - let mut hasher = crc32fast::Hasher::default(); - value.hash(&mut hasher); - hasher.finish() - } - - let foo_hash = hash(&foo); - assert_eq!(foo_hash, hash(&foo_copy)); - assert_ne!(foo_hash, hash(&bar)); -} diff --git a/packages/std/src/testing/assertions.rs b/packages/std/src/testing/assertions.rs index bac91d0138..78df8450a3 100644 --- a/packages/std/src/testing/assertions.rs +++ b/packages/std/src/testing/assertions.rs @@ -1,4 +1,6 @@ use crate::{Decimal, Uint128}; +#[cfg(test)] +use core::hash::{Hash, Hasher}; use std::str::FromStr as _; /// Asserts that two expressions are approximately equal to each other. @@ -21,6 +23,25 @@ macro_rules! assert_approx_eq { }}; } +/// Asserts that type `T` implements `Hash` trait correctly. +/// +/// `left` and `right` must be unequal objects. +/// +/// Some object pairs may produce the same hash causing test failure. +/// In those cases try different objects. The test uses stable hasher +/// so once working pair is identified, the test’s going to continue +/// passing. +#[macro_export] +#[cfg(test)] +macro_rules! assert_hash_works { + ($left:expr, $right:expr $(,)?) => {{ + $crate::testing::assert_hash_works_impl($left, $right, None); + }}; + ($left:expr, $right:expr, $($args:tt)+) => {{ + $crate::testing::assert_hash_works_impl($left, $right, Some(format!($($args)*))); + }}; +} + /// Implementation for the [`cosmwasm_std::assert_approx_eq`] macro. This does not provide any /// stability guarantees and may change any time. #[track_caller] @@ -50,6 +71,45 @@ pub fn assert_approx_eq_impl>( } } +/// Tests that type `T` implements `Hash` trait correctly. +/// +/// `left` and `right` must be unequal objects. +/// +/// Some object pairs may produce the same hash causing test failure. +/// In those cases try different objects. The test uses stable hasher +/// so once working pair is identified, the test’s going to continue +/// passing. +#[track_caller] +#[doc(hidden)] +#[cfg(test)] +pub fn assert_hash_works_impl(left: T, right: T, panic_msg: Option) { + fn hash(value: &impl Hash) -> u64 { + let mut hasher = crc32fast::Hasher::default(); + value.hash(&mut hasher); + hasher.finish() + } + + // Check clone + if hash(&left) != hash(&left.clone()) { + match panic_msg { + Some(panic_msg) => { + panic!("assertion failed: `hash(left) == hash(left.clone())`\n: {panic_msg}") + } + None => panic!("assertion failed: `hash(left) == hash(left.clone())`"), + } + } + + // Check different object + if hash(&left) == hash(&right) { + match panic_msg { + Some(panic_msg) => { + panic!("assertion failed: `hash(left) != hash(right)`\n: {panic_msg}") + } + None => panic!("assertion failed: `hash(left) != hash(right)`"), + } + } +} + #[cfg(test)] mod tests { #[test] diff --git a/packages/std/src/testing/mod.rs b/packages/std/src/testing/mod.rs index 550486a0b6..14b362ce42 100644 --- a/packages/std/src/testing/mod.rs +++ b/packages/std/src/testing/mod.rs @@ -8,6 +8,8 @@ mod mock; mod shuffle; pub use assertions::assert_approx_eq_impl; +#[cfg(test)] +pub use assertions::assert_hash_works_impl; #[cfg(feature = "cosmwasm_1_3")] pub use mock::DistributionQuerier; From 854cd60403cf1eb69ffb2119dcc9f4717c2628ba Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Sat, 15 Jul 2023 13:27:10 +0200 Subject: [PATCH 0520/2372] Implement QueryResponseType trait for responses --- packages/std/src/query/distribution.rs | 4 ++++ packages/std/src/query/staking.rs | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/packages/std/src/query/distribution.rs b/packages/std/src/query/distribution.rs index 4afa0032ee..bd60fa2654 100644 --- a/packages/std/src/query/distribution.rs +++ b/packages/std/src/query/distribution.rs @@ -3,6 +3,8 @@ use serde::{Deserialize, Serialize}; use crate::Addr; +use super::query_response::QueryResponseType; + #[non_exhaustive] #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] @@ -20,3 +22,5 @@ pub struct DelegatorWithdrawAddressResponse { } impl_response_constructor!(DelegatorWithdrawAddressResponse, withdraw_address: Addr); + +impl QueryResponseType for DelegatorWithdrawAddressResponse {} diff --git a/packages/std/src/query/staking.rs b/packages/std/src/query/staking.rs index c8d1b8e1c1..6f7b55513f 100644 --- a/packages/std/src/query/staking.rs +++ b/packages/std/src/query/staking.rs @@ -5,6 +5,8 @@ use serde::{Deserialize, Serialize}; use crate::{Addr, Coin, Decimal}; +use super::query_response::QueryResponseType; + #[non_exhaustive] #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] @@ -40,6 +42,8 @@ pub struct BondedDenomResponse { pub denom: String, } +impl QueryResponseType for BondedDenomResponse {} + impl_response_constructor!(BondedDenomResponse, denom: String); /// DelegationsResponse is data format returned from StakingRequest::AllDelegations query @@ -49,6 +53,8 @@ pub struct AllDelegationsResponse { pub delegations: Vec, } +impl QueryResponseType for AllDelegationsResponse {} + impl_response_constructor!(AllDelegationsResponse, delegations: Vec); /// Delegation is basic (cheap to query) data about a delegation. @@ -80,6 +86,8 @@ pub struct DelegationResponse { pub delegation: Option, } +impl QueryResponseType for DelegationResponse {} + impl_response_constructor!(DelegationResponse, delegation: Option); /// FullDelegation is all the info on the delegation, some (like accumulated_reward and can_redelegate) @@ -107,6 +115,8 @@ pub struct AllValidatorsResponse { pub validators: Vec, } +impl QueryResponseType for AllValidatorsResponse {} + impl_response_constructor!(AllValidatorsResponse, validators: Vec); /// The data format returned from StakingRequest::Validator query @@ -115,6 +125,8 @@ pub struct ValidatorResponse { pub validator: Option, } +impl QueryResponseType for ValidatorResponse {} + impl_response_constructor!(ValidatorResponse, validator: Option); /// Instances are created in the querier. From 75d4a5e75dfa641d742497a3f3bbe5301622d477 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Sat, 15 Jul 2023 13:27:51 +0200 Subject: [PATCH 0521/2372] Extend QueryResponseType constraints --- packages/std/src/query/query_response.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/std/src/query/query_response.rs b/packages/std/src/query/query_response.rs index 667c11e59e..4aa4559e4b 100644 --- a/packages/std/src/query/query_response.rs +++ b/packages/std/src/query/query_response.rs @@ -1,3 +1,5 @@ +use std::fmt::Debug; + use serde::de::DeserializeOwned; /// A marker trait for query response types. @@ -13,4 +15,4 @@ use serde::de::DeserializeOwned; /// - multi-test/cw-sdk: create a default instance and mutate the fields /// /// This trait is crate-internal and can change any time. -pub(crate) trait QueryResponseType: DeserializeOwned {} +pub(crate) trait QueryResponseType: DeserializeOwned + Debug + PartialEq + Clone {} From eb00887cb9ca8387daa3e07e079a3b975bb80c09 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Sat, 15 Jul 2023 13:28:57 +0200 Subject: [PATCH 0522/2372] Remove into --- packages/std/src/query/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/query/mod.rs b/packages/std/src/query/mod.rs index 42a7978c38..f1694805e6 100644 --- a/packages/std/src/query/mod.rs +++ b/packages/std/src/query/mod.rs @@ -18,7 +18,7 @@ macro_rules! impl_response_constructor { #[doc(hidden)] #[allow(dead_code)] pub fn new($( $field: $t),*) -> Self { - Self { $( $field: $field.into() ),* } + Self { $( $field ),* } } } }; From 46fae640ed38ef3ca7378967d923901b406caaa3 Mon Sep 17 00:00:00 2001 From: Michal Nazarewicz Date: Sat, 15 Jul 2023 14:08:10 +0200 Subject: [PATCH 0523/2372] cosmwasm_std: prefer core and alloc modules to prepare for no_std To make it easier to implement no_std in cosmwasm_std prefer core and alloc modules over std module. std remains used - for std::backtrace module when backtraces feature is enabled, - for std::panic::set_hook if abort feature is enabled, - in testing::mock module for HashMap and - in tests. Furthermore, std is forced by some of the dependencies. Those cases will be dealt with in another change which will add default std feature. --- packages/std/src/addresses.rs | 9 +++---- packages/std/src/assertions.rs | 6 ++--- packages/std/src/binary.rs | 11 +++++---- packages/std/src/coin.rs | 2 +- packages/std/src/coins.rs | 6 ++--- packages/std/src/deps.rs | 2 +- .../std/src/errors/recover_pubkey_error.rs | 2 +- packages/std/src/errors/std_error.rs | 20 ++++++++-------- packages/std/src/errors/system_error.rs | 4 ++-- packages/std/src/errors/verification_error.rs | 2 +- packages/std/src/exports.rs | 4 ++-- packages/std/src/hex_binary.rs | 11 +++++---- packages/std/src/ibc.rs | 2 +- packages/std/src/imports.rs | 2 +- packages/std/src/lib.rs | 2 ++ packages/std/src/math/decimal.rs | 18 +++++++------- packages/std/src/math/decimal256.rs | 18 +++++++------- packages/std/src/math/int128.rs | 20 ++++++++-------- packages/std/src/math/int256.rs | 24 +++++++++---------- packages/std/src/math/int512.rs | 24 +++++++++---------- packages/std/src/math/int64.rs | 20 ++++++++-------- packages/std/src/math/isqrt.rs | 2 +- packages/std/src/math/mod.rs | 2 +- packages/std/src/math/uint128.rs | 10 ++++---- packages/std/src/math/uint256.rs | 20 ++++++++-------- packages/std/src/math/uint512.rs | 20 ++++++++-------- packages/std/src/math/uint64.rs | 14 +++++------ packages/std/src/memory.rs | 4 ++-- packages/std/src/results/contract_result.rs | 2 +- packages/std/src/results/cosmos_msg.rs | 8 +++---- packages/std/src/results/response.rs | 2 +- packages/std/src/results/system_result.rs | 2 +- packages/std/src/serde.rs | 2 +- packages/std/src/storage.rs | 8 +++---- packages/std/src/testing/assertions.rs | 4 ++-- packages/std/src/testing/mock.rs | 9 +++---- packages/std/src/timestamp.rs | 2 +- packages/std/src/traits.rs | 4 ++-- 38 files changed, 165 insertions(+), 159 deletions(-) diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index 3110b4d634..ce916909ac 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -1,12 +1,12 @@ +use alloc::borrow::Cow; +use core::fmt; +use core::ops::Deref; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use sha2::{ digest::{Digest, Update}, Sha256, }; -use std::borrow::Cow; -use std::fmt; -use std::ops::Deref; use thiserror::Error; use crate::{binary::Binary, forward_ref_partial_eq, HexBinary}; @@ -401,7 +401,6 @@ mod tests { use super::*; use crate::{assert_hash_works, HexBinary}; use hex_literal::hex; - use std::collections::HashSet; #[test] fn addr_unchecked_works() { @@ -657,6 +656,8 @@ mod tests { /// This requires Hash and Eq to be implemented #[test] fn canonical_addr_can_be_used_in_hash_set() { + use std::collections::HashSet; + let alice1 = CanonicalAddr::from([0, 187, 61, 11, 250, 0]); let alice2 = CanonicalAddr::from([0, 187, 61, 11, 250, 0]); let bob = CanonicalAddr::from([16, 21, 33, 0, 255, 9]); diff --git a/packages/std/src/assertions.rs b/packages/std/src/assertions.rs index bc67312b71..fb02e26ab9 100644 --- a/packages/std/src/assertions.rs +++ b/packages/std/src/assertions.rs @@ -30,7 +30,7 @@ macro_rules! ensure { ($cond:expr, $e:expr) => { if !($cond) { - return Err(std::convert::From::from($e)); + return Err(core::convert::From::from($e)); } }; } @@ -68,7 +68,7 @@ macro_rules! ensure_eq { ($a:expr, $b:expr, $e:expr) => { // Not implemented via `ensure!` because the caller would have to import both macros. if !($a == $b) { - return Err(std::convert::From::from($e)); + return Err(core::convert::From::from($e)); } }; } @@ -100,7 +100,7 @@ macro_rules! ensure_ne { ($a:expr, $b:expr, $e:expr) => { // Not implemented via `ensure!` because the caller would have to import both macros. if !($a != $b) { - return Err(std::convert::From::from($e)); + return Err(core::convert::From::from($e)); } }; } diff --git a/packages/std/src/binary.rs b/packages/std/src/binary.rs index 368d5f6f84..6bde49f90d 100644 --- a/packages/std/src/binary.rs +++ b/packages/std/src/binary.rs @@ -1,5 +1,5 @@ -use std::fmt; -use std::ops::Deref; +use core::fmt; +use core::ops::Deref; use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; @@ -135,7 +135,7 @@ impl From for Vec { } } -/// Implement `encoding::Binary == std::vec::Vec` +/// Implement `encoding::Binary == alloc::vec::Vec` impl PartialEq> for Binary { fn eq(&self, rhs: &Vec) -> bool { // Use Vec == Vec @@ -143,7 +143,7 @@ impl PartialEq> for Binary { } } -/// Implement `std::vec::Vec == encoding::Binary` +/// Implement `alloc::vec::Vec == encoding::Binary` impl PartialEq for Vec { fn eq(&self, rhs: &Binary) -> bool { // Use Vec == Vec @@ -241,7 +241,6 @@ mod tests { use crate::assert_hash_works; use crate::errors::StdError; use crate::serde::{from_slice, to_vec}; - use std::collections::HashSet; #[test] fn encode_decode() { @@ -520,6 +519,8 @@ mod tests { /// This requires Hash and Eq to be implemented #[test] fn binary_can_be_used_in_hash_set() { + use std::collections::HashSet; + let a1 = Binary::from([0, 187, 61, 11, 250, 0]); let a2 = Binary::from([0, 187, 61, 11, 250, 0]); let b = Binary::from([16, 21, 33, 0, 255, 9]); diff --git a/packages/std/src/coin.rs b/packages/std/src/coin.rs index 15d153cfc3..1a28480188 100644 --- a/packages/std/src/coin.rs +++ b/packages/std/src/coin.rs @@ -1,6 +1,6 @@ +use core::{fmt, str::FromStr}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use std::{fmt, str::FromStr}; use crate::{errors::CoinFromStrError, math::Uint128}; diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index 1548cfffad..5a0f05a7f3 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -1,6 +1,6 @@ -use std::collections::BTreeMap; -use std::fmt; -use std::str::FromStr; +use alloc::collections::BTreeMap; +use core::fmt; +use core::str::FromStr; use crate::{errors::CoinsError, Coin, StdError, StdResult, Uint128}; use crate::{OverflowError, OverflowOperation}; diff --git a/packages/std/src/deps.rs b/packages/std/src/deps.rs index 4d9a9ecdce..939a5bd5e1 100644 --- a/packages/std/src/deps.rs +++ b/packages/std/src/deps.rs @@ -1,4 +1,4 @@ -use std::marker::PhantomData; +use core::marker::PhantomData; use crate::query::CustomQuery; use crate::results::Empty; diff --git a/packages/std/src/errors/recover_pubkey_error.rs b/packages/std/src/errors/recover_pubkey_error.rs index 75af03a7ca..6a48fa2af8 100644 --- a/packages/std/src/errors/recover_pubkey_error.rs +++ b/packages/std/src/errors/recover_pubkey_error.rs @@ -1,8 +1,8 @@ +use core::fmt::Debug; #[cfg(not(target_arch = "wasm32"))] use cosmwasm_crypto::CryptoError; #[cfg(feature = "backtraces")] use std::backtrace::Backtrace; -use std::fmt::Debug; use thiserror::Error; #[derive(Error, Debug)] diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index 8e2a486cdc..dcc80d0be4 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -1,6 +1,6 @@ +use core::fmt; #[cfg(feature = "backtraces")] use std::backtrace::Backtrace; -use std::fmt; use thiserror::Error; use crate::errors::{RecoverPubkeyError, VerificationError}; @@ -433,14 +433,14 @@ impl PartialEq for StdError { } } -impl From for StdError { - fn from(source: std::str::Utf8Error) -> Self { +impl From for StdError { + fn from(source: core::str::Utf8Error) -> Self { Self::invalid_utf8(source) } } -impl From for StdError { - fn from(source: std::string::FromUtf8Error) -> Self { +impl From for StdError { + fn from(source: alloc::string::FromUtf8Error) -> Self { Self::invalid_utf8(source) } } @@ -517,7 +517,7 @@ impl OverflowError { /// The error returned by [`TryFrom`] conversions that overflow, for example /// when converting from [`Uint256`] to [`Uint128`]. /// -/// [`TryFrom`]: std::convert::TryFrom +/// [`TryFrom`]: core::convert::TryFrom /// [`Uint256`]: crate::Uint256 /// [`Uint128`]: crate::Uint128 #[derive(Error, Debug, PartialEq, Eq)] @@ -618,11 +618,11 @@ pub enum CoinFromStrError { #[error("Missing amount or non-digit characters in amount")] MissingAmount, #[error("Invalid amount: {0}")] - InvalidAmount(std::num::ParseIntError), + InvalidAmount(core::num::ParseIntError), } -impl From for CoinFromStrError { - fn from(value: std::num::ParseIntError) -> Self { +impl From for CoinFromStrError { + fn from(value: core::num::ParseIntError) -> Self { Self::InvalidAmount(value) } } @@ -636,7 +636,7 @@ impl From for StdError { #[cfg(test)] mod tests { use super::*; - use std::str; + use core::str; // constructors diff --git a/packages/std/src/errors/system_error.rs b/packages/std/src/errors/system_error.rs index 22223692c1..98dc6f6707 100644 --- a/packages/std/src/errors/system_error.rs +++ b/packages/std/src/errors/system_error.rs @@ -41,8 +41,8 @@ pub enum SystemError { impl std::error::Error for SystemError {} -impl std::fmt::Display for SystemError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { +impl core::fmt::Display for SystemError { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { match self { SystemError::InvalidRequest { error, request } => write!( f, diff --git a/packages/std/src/errors/verification_error.rs b/packages/std/src/errors/verification_error.rs index 26786596e5..5c57999767 100644 --- a/packages/std/src/errors/verification_error.rs +++ b/packages/std/src/errors/verification_error.rs @@ -1,6 +1,6 @@ +use core::fmt::Debug; #[cfg(feature = "backtraces")] use std::backtrace::Backtrace; -use std::fmt::Debug; use thiserror::Error; #[cfg(not(target_arch = "wasm32"))] diff --git a/packages/std/src/exports.rs b/packages/std/src/exports.rs index 27c46768dc..473f63a36b 100644 --- a/packages/std/src/exports.rs +++ b/packages/std/src/exports.rs @@ -7,8 +7,8 @@ //! and `do_sudo` should be wrapped with a extern "C" entry point including //! the contract-specific function pointer. This is done via the `#[entry_point]` //! macro attribute from cosmwasm-derive. -use std::marker::PhantomData; -use std::vec::Vec; +use alloc::vec::Vec; +use core::marker::PhantomData; use serde::de::DeserializeOwned; diff --git a/packages/std/src/hex_binary.rs b/packages/std/src/hex_binary.rs index 26048dc30b..ae3438cc93 100644 --- a/packages/std/src/hex_binary.rs +++ b/packages/std/src/hex_binary.rs @@ -1,5 +1,5 @@ -use std::fmt; -use std::ops::Deref; +use core::fmt; +use core::ops::Deref; use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; @@ -143,7 +143,7 @@ impl From for Binary { } } -/// Implement `HexBinary == std::vec::Vec` +/// Implement `HexBinary == alloc::vec::Vec` impl PartialEq> for HexBinary { fn eq(&self, rhs: &Vec) -> bool { // Use Vec == Vec @@ -151,7 +151,7 @@ impl PartialEq> for HexBinary { } } -/// Implement `std::vec::Vec == HexBinary` +/// Implement `alloc::vec::Vec == HexBinary` impl PartialEq for Vec { fn eq(&self, rhs: &HexBinary) -> bool { // Use Vec == Vec @@ -248,7 +248,6 @@ mod tests { use super::*; use crate::{assert_hash_works, from_slice, to_vec, StdError}; - use std::collections::HashSet; #[test] fn from_hex_works() { @@ -583,6 +582,8 @@ mod tests { /// This requires Hash and Eq to be implemented #[test] fn hex_binary_can_be_used_in_hash_set() { + use std::collections::HashSet; + let a1 = HexBinary::from([0, 187, 61, 11, 250, 0]); let a2 = HexBinary::from([0, 187, 61, 11, 250, 0]); let b = HexBinary::from([16, 21, 33, 0, 255, 9]); diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 1ce06432a6..27904fe16a 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -2,9 +2,9 @@ // The CosmosMsg variants are defined in results/cosmos_msg.rs // The rest of the IBC related functionality is defined here +use core::cmp::{Ord, Ordering, PartialOrd}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use std::cmp::{Ord, Ordering, PartialOrd}; #[cfg(feature = "ibc3")] use crate::addresses::Addr; diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index f7438a9df0..c58580dcf0 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -1,4 +1,4 @@ -use std::vec::Vec; +use alloc::vec::Vec; use crate::addresses::{Addr, CanonicalAddr}; use crate::errors::{RecoverPubkeyError, StdError, StdResult, SystemError, VerificationError}; diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 0f26389b38..ebf58b56f0 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -1,6 +1,8 @@ #![cfg_attr(feature = "backtraces", feature(error_generic_member_access))] #![cfg_attr(feature = "backtraces", feature(provide_any))] +extern crate alloc; + // Exposed on all platforms mod addresses; diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 29eb2a6b73..cf3f749176 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -1,10 +1,10 @@ +use core::cmp::Ordering; +use core::fmt::{self, Write}; +use core::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Rem, RemAssign, Sub, SubAssign}; +use core::str::FromStr; use forward_ref::{forward_ref_binop, forward_ref_op_assign}; use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; -use std::cmp::Ordering; -use std::fmt::{self, Write}; -use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Rem, RemAssign, Sub, SubAssign}; -use std::str::FromStr; use thiserror::Error; use crate::errors::{ @@ -175,7 +175,7 @@ impl Decimal { /// /// ``` /// # use cosmwasm_std::{Decimal, Uint128}; - /// # use std::str::FromStr; + /// # use core::str::FromStr; /// // Value with whole and fractional part /// let a = Decimal::from_str("1.234").unwrap(); /// assert_eq!(a.decimal_places(), 18); @@ -385,7 +385,7 @@ impl Decimal { /// ## Examples /// /// ``` - /// use std::str::FromStr; + /// use core::str::FromStr; /// use cosmwasm_std::{Decimal, Uint128}; /// /// let d = Decimal::from_str("12.345").unwrap(); @@ -408,7 +408,7 @@ impl Decimal { /// ## Examples /// /// ``` - /// use std::str::FromStr; + /// use core::str::FromStr; /// use cosmwasm_std::{Decimal, Uint128}; /// /// let d = Decimal::from_str("12.345").unwrap(); @@ -679,7 +679,7 @@ impl RemAssign for Decimal { } forward_ref_op_assign!(impl RemAssign, rem_assign for Decimal, Decimal); -impl std::iter::Sum for Decimal +impl core::iter::Sum for Decimal where Self: Add, { @@ -1408,7 +1408,7 @@ mod tests { (Decimal::permille(6), Decimal::permille(13)), ]; - // The regular std::ops::Mul is our source of truth for these tests. + // The regular core::ops::Mul is our source of truth for these tests. for (x, y) in test_data.into_iter() { assert_eq!(x * y, x.checked_mul(y).unwrap()); } diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 2b98a82ce6..e9341ff47c 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -1,10 +1,10 @@ +use core::cmp::Ordering; +use core::fmt::{self, Write}; +use core::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Rem, RemAssign, Sub, SubAssign}; +use core::str::FromStr; use forward_ref::{forward_ref_binop, forward_ref_op_assign}; use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; -use std::cmp::Ordering; -use std::fmt::{self, Write}; -use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Rem, RemAssign, Sub, SubAssign}; -use std::str::FromStr; use thiserror::Error; use crate::errors::{ @@ -187,7 +187,7 @@ impl Decimal256 { /// /// ``` /// # use cosmwasm_std::{Decimal256, Uint256}; - /// # use std::str::FromStr; + /// # use core::str::FromStr; /// // Value with whole and fractional part /// let a = Decimal256::from_str("1.234").unwrap(); /// assert_eq!(a.decimal_places(), 18); @@ -401,7 +401,7 @@ impl Decimal256 { /// ## Examples /// /// ``` - /// use std::str::FromStr; + /// use core::str::FromStr; /// use cosmwasm_std::{Decimal256, Uint256}; /// /// let d = Decimal256::from_str("12.345").unwrap(); @@ -424,7 +424,7 @@ impl Decimal256 { /// ## Examples /// /// ``` - /// use std::str::FromStr; + /// use core::str::FromStr; /// use cosmwasm_std::{Decimal256, Uint256}; /// /// let d = Decimal256::from_str("12.345").unwrap(); @@ -703,7 +703,7 @@ impl RemAssign for Decimal256 { } forward_ref_op_assign!(impl RemAssign, rem_assign for Decimal256, Decimal256); -impl std::iter::Sum for Decimal256 +impl core::iter::Sum for Decimal256 where Self: Add, { @@ -1529,7 +1529,7 @@ mod tests { (Decimal256::permille(6), Decimal256::permille(13)), ]; - // The regular std::ops::Mul is our source of truth for these tests. + // The regular core::ops::Mul is our source of truth for these tests. for (x, y) in test_data.into_iter() { assert_eq!(x * y, x.checked_mul(y).unwrap()); } diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index 0a44bd2744..1edf250771 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -1,12 +1,12 @@ -use forward_ref::{forward_ref_binop, forward_ref_op_assign}; -use schemars::JsonSchema; -use serde::{de, ser, Deserialize, Deserializer, Serialize}; -use std::fmt; -use std::ops::{ +use core::fmt; +use core::ops::{ Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Not, Rem, RemAssign, Shl, ShlAssign, Shr, ShrAssign, Sub, SubAssign, }; -use std::str::FromStr; +use core::str::FromStr; +use forward_ref::{forward_ref_binop, forward_ref_op_assign}; +use schemars::JsonSchema; +use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; use crate::{forward_ref_partial_eq, Int64, Uint128, Uint64}; @@ -481,7 +481,7 @@ impl<'de> de::Visitor<'de> for Int128Visitor { } } -impl std::iter::Sum for Int128 +impl core::iter::Sum for Int128 where Self: Add, { @@ -497,7 +497,7 @@ mod tests { #[test] fn size_of_works() { - assert_eq!(std::mem::size_of::(), 16); + assert_eq!(core::mem::size_of::(), 16); } #[test] @@ -1036,7 +1036,7 @@ mod tests { ); // right shift of MIN value by the maximum shift value should result in -1 (filled with 1s) assert_eq!( - Int128::MIN >> (std::mem::size_of::() as u32 * 8 - 1), + Int128::MIN >> (core::mem::size_of::() as u32 * 8 - 1), -Int128::one() ); } @@ -1055,7 +1055,7 @@ mod tests { ); // left shift by by the maximum shift value should result in MIN assert_eq!( - Int128::one() << (std::mem::size_of::() as u32 * 8 - 1), + Int128::one() << (core::mem::size_of::() as u32 * 8 - 1), Int128::MIN ); } diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index 74ace49ac0..6cb71dd654 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -1,12 +1,12 @@ -use forward_ref::{forward_ref_binop, forward_ref_op_assign}; -use schemars::JsonSchema; -use serde::{de, ser, Deserialize, Deserializer, Serialize}; -use std::fmt; -use std::ops::{ +use core::fmt; +use core::ops::{ Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Not, Rem, RemAssign, Shl, ShlAssign, Shr, ShrAssign, Sub, SubAssign, }; -use std::str::FromStr; +use core::str::FromStr; +use forward_ref::{forward_ref_binop, forward_ref_op_assign}; +use schemars::JsonSchema; +use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; use crate::{forward_ref_partial_eq, Int128, Int64, Uint128, Uint256, Uint64}; @@ -112,7 +112,7 @@ impl Int256 { words[1].to_be_bytes(), words[0].to_be_bytes(), ]; - unsafe { std::mem::transmute::<[[u8; 8]; 4], [u8; 32]>(words) } + unsafe { core::mem::transmute::<[[u8; 8]; 4], [u8; 32]>(words) } } /// Returns a copy of the number as little endian bytes. @@ -126,7 +126,7 @@ impl Int256 { words[2].to_le_bytes(), words[3].to_le_bytes(), ]; - unsafe { std::mem::transmute::<[[u8; 8]; 4], [u8; 32]>(words) } + unsafe { core::mem::transmute::<[[u8; 8]; 4], [u8; 32]>(words) } } #[must_use] @@ -553,7 +553,7 @@ impl<'de> de::Visitor<'de> for Int256Visitor { } } -impl std::iter::Sum for Int256 +impl core::iter::Sum for Int256 where Self: Add, { @@ -569,7 +569,7 @@ mod tests { #[test] fn size_of_works() { - assert_eq!(std::mem::size_of::(), 32); + assert_eq!(core::mem::size_of::(), 32); } #[test] @@ -1121,7 +1121,7 @@ mod tests { ); // right shift of MIN value by the maximum shift value should result in -1 (filled with 1s) assert_eq!( - Int256::MIN >> (std::mem::size_of::() as u32 * 8 - 1), + Int256::MIN >> (core::mem::size_of::() as u32 * 8 - 1), -Int256::one() ); } @@ -1140,7 +1140,7 @@ mod tests { ); // left shift by by the maximum shift value should result in MIN assert_eq!( - Int256::one() << (std::mem::size_of::() as u32 * 8 - 1), + Int256::one() << (core::mem::size_of::() as u32 * 8 - 1), Int256::MIN ); } diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index f3e5cba0f9..c3145d2cd4 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -1,12 +1,12 @@ -use forward_ref::{forward_ref_binop, forward_ref_op_assign}; -use schemars::JsonSchema; -use serde::{de, ser, Deserialize, Deserializer, Serialize}; -use std::fmt; -use std::ops::{ +use core::fmt; +use core::ops::{ Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Not, Rem, RemAssign, Shl, ShlAssign, Shr, ShrAssign, Sub, SubAssign, }; -use std::str::FromStr; +use core::str::FromStr; +use forward_ref::{forward_ref_binop, forward_ref_op_assign}; +use schemars::JsonSchema; +use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; use crate::{forward_ref_partial_eq, Uint128, Uint256, Uint512, Uint64}; @@ -144,7 +144,7 @@ impl Int512 { words[1].to_be_bytes(), words[0].to_be_bytes(), ]; - unsafe { std::mem::transmute::<[[u8; 8]; 8], [u8; 64]>(words) } + unsafe { core::mem::transmute::<[[u8; 8]; 8], [u8; 64]>(words) } } /// Returns a copy of the number as little endian bytes. @@ -162,7 +162,7 @@ impl Int512 { words[6].to_le_bytes(), words[7].to_le_bytes(), ]; - unsafe { std::mem::transmute::<[[u8; 8]; 8], [u8; 64]>(words) } + unsafe { core::mem::transmute::<[[u8; 8]; 8], [u8; 64]>(words) } } #[must_use] @@ -586,7 +586,7 @@ impl<'de> de::Visitor<'de> for Int512Visitor { } } -impl std::iter::Sum for Int512 +impl core::iter::Sum for Int512 where Self: Add, { @@ -602,7 +602,7 @@ mod tests { #[test] fn size_of_works() { - assert_eq!(std::mem::size_of::(), 64); + assert_eq!(core::mem::size_of::(), 64); } #[test] @@ -1174,7 +1174,7 @@ mod tests { ); // right shift of MIN value by the maximum shift value should result in -1 (filled with 1s) assert_eq!( - Int512::MIN >> (std::mem::size_of::() as u32 * 8 - 1), + Int512::MIN >> (core::mem::size_of::() as u32 * 8 - 1), -Int512::one() ); } @@ -1193,7 +1193,7 @@ mod tests { ); // left shift by by the maximum shift value should result in MIN assert_eq!( - Int512::one() << (std::mem::size_of::() as u32 * 8 - 1), + Int512::one() << (core::mem::size_of::() as u32 * 8 - 1), Int512::MIN ); } diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index f26e79fe75..a0fd3db4fe 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -1,12 +1,12 @@ -use forward_ref::{forward_ref_binop, forward_ref_op_assign}; -use schemars::JsonSchema; -use serde::{de, ser, Deserialize, Deserializer, Serialize}; -use std::fmt; -use std::ops::{ +use core::fmt; +use core::ops::{ Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Not, Rem, RemAssign, Shl, ShlAssign, Shr, ShrAssign, Sub, SubAssign, }; -use std::str::FromStr; +use core::str::FromStr; +use forward_ref::{forward_ref_binop, forward_ref_op_assign}; +use schemars::JsonSchema; +use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; use crate::{forward_ref_partial_eq, Uint64}; @@ -457,7 +457,7 @@ impl<'de> de::Visitor<'de> for Int64Visitor { } } -impl std::iter::Sum for Int64 +impl core::iter::Sum for Int64 where Self: Add, { @@ -473,7 +473,7 @@ mod tests { #[test] fn size_of_works() { - assert_eq!(std::mem::size_of::(), 8); + assert_eq!(core::mem::size_of::(), 8); } #[test] @@ -985,7 +985,7 @@ mod tests { assert_eq!(x >> 4, Int64::from(0x0400_0000_0000_0000i64)); // right shift of MIN value by the maximum shift value should result in -1 (filled with 1s) assert_eq!( - Int64::MIN >> (std::mem::size_of::() as u32 * 8 - 1), + Int64::MIN >> (core::mem::size_of::() as u32 * 8 - 1), -Int64::one() ); } @@ -998,7 +998,7 @@ mod tests { assert_eq!(x << 4, Int64::from(0x0800_0000_0000_0000i64 << 4)); // left shift by by the maximum shift value should result in MIN assert_eq!( - Int64::one() << (std::mem::size_of::() as u32 * 8 - 1), + Int64::one() << (core::mem::size_of::() as u32 * 8 - 1), Int64::MIN ); } diff --git a/packages/std/src/math/isqrt.rs b/packages/std/src/math/isqrt.rs index 6e44ce1695..6fd58c3974 100644 --- a/packages/std/src/math/isqrt.rs +++ b/packages/std/src/math/isqrt.rs @@ -1,4 +1,4 @@ -use std::{cmp, ops}; +use core::{cmp, ops}; use crate::{Uint128, Uint256, Uint512, Uint64}; diff --git a/packages/std/src/math/mod.rs b/packages/std/src/math/mod.rs index 782276af37..a96b14acb8 100644 --- a/packages/std/src/math/mod.rs +++ b/packages/std/src/math/mod.rs @@ -27,7 +27,7 @@ pub use uint64::Uint64; #[cfg(test)] mod tests { use super::*; - use std::ops::*; + use core::ops::*; /// A trait that ensures other traits are implemented for our number types trait AllImpl<'a>: diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 5bcaed78dc..7a8dc510f7 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -1,9 +1,9 @@ -use std::fmt::{self}; -use std::ops::{ +use core::fmt::{self}; +use core::ops::{ Add, AddAssign, Div, DivAssign, Mul, MulAssign, Rem, RemAssign, Shl, ShlAssign, Shr, ShrAssign, Sub, SubAssign, }; -use std::str::FromStr; +use core::str::FromStr; use forward_ref::{forward_ref_binop, forward_ref_op_assign}; use schemars::JsonSchema; @@ -586,7 +586,7 @@ impl<'de> de::Visitor<'de> for Uint128Visitor { } } -impl std::iter::Sum for Uint128 +impl core::iter::Sum for Uint128 where Self: Add, { @@ -604,7 +604,7 @@ mod tests { #[test] fn size_of_works() { - assert_eq!(std::mem::size_of::(), 16); + assert_eq!(core::mem::size_of::(), 16); } #[test] diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 9f71573c40..255195c422 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -1,12 +1,12 @@ -use forward_ref::{forward_ref_binop, forward_ref_op_assign}; -use schemars::JsonSchema; -use serde::{de, ser, Deserialize, Deserializer, Serialize}; -use std::fmt; -use std::ops::{ +use core::fmt; +use core::ops::{ Add, AddAssign, Div, DivAssign, Mul, MulAssign, Rem, RemAssign, Shl, ShlAssign, Shr, ShrAssign, Sub, SubAssign, }; -use std::str::FromStr; +use core::str::FromStr; +use forward_ref::{forward_ref_binop, forward_ref_op_assign}; +use schemars::JsonSchema; +use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{ CheckedMultiplyFractionError, CheckedMultiplyRatioError, ConversionOverflowError, @@ -135,7 +135,7 @@ impl Uint256 { words[1].to_be_bytes(), words[0].to_be_bytes(), ]; - unsafe { std::mem::transmute::<[[u8; 8]; 4], [u8; 32]>(words) } + unsafe { core::mem::transmute::<[[u8; 8]; 4], [u8; 32]>(words) } } /// Returns a copy of the number as little endian bytes. @@ -148,7 +148,7 @@ impl Uint256 { words[2].to_le_bytes(), words[3].to_le_bytes(), ]; - unsafe { std::mem::transmute::<[[u8; 8]; 4], [u8; 32]>(words) } + unsafe { core::mem::transmute::<[[u8; 8]; 4], [u8; 32]>(words) } } #[must_use] @@ -649,7 +649,7 @@ impl<'de> de::Visitor<'de> for Uint256Visitor { } } -impl std::iter::Sum for Uint256 +impl core::iter::Sum for Uint256 where Self: Add, { @@ -666,7 +666,7 @@ mod tests { #[test] fn size_of_works() { - assert_eq!(std::mem::size_of::(), 32); + assert_eq!(core::mem::size_of::(), 32); } #[test] diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index 5d581e05c7..6100985e07 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -1,12 +1,12 @@ -use forward_ref::{forward_ref_binop, forward_ref_op_assign}; -use schemars::JsonSchema; -use serde::{de, ser, Deserialize, Deserializer, Serialize}; -use std::fmt; -use std::ops::{ +use core::fmt; +use core::ops::{ Add, AddAssign, Div, DivAssign, Mul, MulAssign, Not, Rem, RemAssign, Shl, ShlAssign, Shr, ShrAssign, Sub, SubAssign, }; -use std::str::FromStr; +use core::str::FromStr; +use forward_ref::{forward_ref_binop, forward_ref_op_assign}; +use schemars::JsonSchema; +use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{ ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, StdError, @@ -159,7 +159,7 @@ impl Uint512 { words[1].to_be_bytes(), words[0].to_be_bytes(), ]; - unsafe { std::mem::transmute::<[[u8; 8]; 8], [u8; 64]>(words) } + unsafe { core::mem::transmute::<[[u8; 8]; 8], [u8; 64]>(words) } } /// Returns a copy of the number as little endian bytes. @@ -176,7 +176,7 @@ impl Uint512 { words[6].to_le_bytes(), words[7].to_le_bytes(), ]; - unsafe { std::mem::transmute::<[[u8; 8]; 8], [u8; 64]>(words) } + unsafe { core::mem::transmute::<[[u8; 8]; 8], [u8; 64]>(words) } } #[must_use] @@ -629,7 +629,7 @@ impl<'de> de::Visitor<'de> for Uint512Visitor { } } -impl std::iter::Sum for Uint512 +impl core::iter::Sum for Uint512 where Self: Add, { @@ -645,7 +645,7 @@ mod tests { #[test] fn size_of_works() { - assert_eq!(std::mem::size_of::(), 64); + assert_eq!(core::mem::size_of::(), 64); } #[test] diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index 734b7a248d..39cc583eed 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -1,11 +1,11 @@ -use forward_ref::{forward_ref_binop, forward_ref_op_assign}; -use schemars::JsonSchema; -use serde::{de, ser, Deserialize, Deserializer, Serialize}; -use std::fmt::{self}; -use std::ops::{ +use core::fmt::{self}; +use core::ops::{ Add, AddAssign, Div, DivAssign, Mul, MulAssign, Rem, RemAssign, Shl, ShlAssign, Shr, ShrAssign, Sub, SubAssign, }; +use forward_ref::{forward_ref_binop, forward_ref_op_assign}; +use schemars::JsonSchema; +use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{ CheckedMultiplyFractionError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, @@ -537,7 +537,7 @@ impl<'de> de::Visitor<'de> for Uint64Visitor { } } -impl std::iter::Sum for Uint64 +impl core::iter::Sum for Uint64 where Self: Add, { @@ -554,7 +554,7 @@ mod tests { #[test] fn size_of_works() { - assert_eq!(std::mem::size_of::(), 8); + assert_eq!(core::mem::size_of::(), 8); } #[test] diff --git a/packages/std/src/memory.rs b/packages/std/src/memory.rs index c331a53c47..7fa3098a1a 100644 --- a/packages/std/src/memory.rs +++ b/packages/std/src/memory.rs @@ -1,5 +1,5 @@ -use std::mem; -use std::vec::Vec; +use alloc::vec::Vec; +use core::mem; /// Describes some data allocated in Wasm's linear memory. /// A pointer to an instance of this can be returned over FFI boundaries. diff --git a/packages/std/src/results/contract_result.rs b/packages/std/src/results/contract_result.rs index 67956bfba3..343da57c85 100644 --- a/packages/std/src/results/contract_result.rs +++ b/packages/std/src/results/contract_result.rs @@ -1,6 +1,6 @@ +use core::fmt; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use std::fmt; /// This is the final result type that is created and serialized in a contract for /// every init/execute/migrate call. The VM then deserializes this type to distinguish diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index 68dbd4f732..d99a9450a5 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -1,7 +1,7 @@ +use core::fmt; use derivative::Derivative; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use std::fmt; use crate::binary::Binary; use crate::coin::Coin; @@ -120,10 +120,10 @@ pub enum DistributionMsg { }, } -fn binary_to_string(data: &Binary, fmt: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { - match std::str::from_utf8(data.as_slice()) { +fn binary_to_string(data: &Binary, fmt: &mut core::fmt::Formatter) -> core::fmt::Result { + match core::str::from_utf8(data.as_slice()) { Ok(s) => fmt.write_str(s), - Err(_) => write!(fmt, "{data:?}"), + Err(_) => core::fmt::Debug::fmt(data, fmt), } } diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index 2fa5ed82d0..7da7d622d6 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -239,7 +239,7 @@ mod tests { #[test] fn response_add_attributes_works() { - let res = Response::::new().add_attributes(std::iter::empty::()); + let res = Response::::new().add_attributes(core::iter::empty::()); assert_eq!(res.attributes.len(), 0); let res = Response::::new().add_attributes([Attribute::new("test", "ing")]); diff --git a/packages/std/src/results/system_result.rs b/packages/std/src/results/system_result.rs index 9cc7a48582..6ad224d940 100644 --- a/packages/std/src/results/system_result.rs +++ b/packages/std/src/results/system_result.rs @@ -1,6 +1,6 @@ +use core::fmt; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use std::fmt; use super::super::errors::SystemError; diff --git a/packages/std/src/serde.rs b/packages/std/src/serde.rs index e58a51e6dd..5b258fd1f3 100644 --- a/packages/std/src/serde.rs +++ b/packages/std/src/serde.rs @@ -2,8 +2,8 @@ // The reason is two fold: // 1. To easily ensure that all calling libraries use the same version (minimize code size) // 2. To allow us to switch out to eg. serde-json-core more easily +use core::any::type_name; use serde::{de::DeserializeOwned, Serialize}; -use std::any::type_name; use crate::binary::Binary; use crate::errors::{StdError, StdResult}; diff --git a/packages/std/src/storage.rs b/packages/std/src/storage.rs index f2f099f93d..26d7f710d2 100644 --- a/packages/std/src/storage.rs +++ b/packages/std/src/storage.rs @@ -1,9 +1,9 @@ -use std::collections::BTreeMap; -use std::fmt; +use alloc::collections::BTreeMap; +use core::fmt; #[cfg(feature = "iterator")] -use std::iter; +use core::iter; #[cfg(feature = "iterator")] -use std::ops::{Bound, RangeBounds}; +use core::ops::{Bound, RangeBounds}; #[cfg(feature = "iterator")] use crate::iterator::{Order, Record}; diff --git a/packages/std/src/testing/assertions.rs b/packages/std/src/testing/assertions.rs index 78df8450a3..b5d5a838ee 100644 --- a/packages/std/src/testing/assertions.rs +++ b/packages/std/src/testing/assertions.rs @@ -1,7 +1,7 @@ use crate::{Decimal, Uint128}; #[cfg(test)] use core::hash::{Hash, Hasher}; -use std::str::FromStr as _; +use core::str::FromStr as _; /// Asserts that two expressions are approximately equal to each other. /// @@ -56,7 +56,7 @@ pub fn assert_approx_eq_impl>( let right = right.into(); let max_rel_diff = Decimal::from_str(max_rel_diff).unwrap(); - let largest = std::cmp::max(left, right); + let largest = core::cmp::max(left, right); let rel_diff = Decimal::from_ratio(left.abs_diff(right), largest); if rel_diff > max_rel_diff { diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 69d3281dd1..26feb791e7 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -1,10 +1,11 @@ +use alloc::collections::BTreeMap; +use core::marker::PhantomData; +#[cfg(feature = "cosmwasm_1_3")] +use core::ops::Bound; use serde::de::DeserializeOwned; #[cfg(feature = "stargate")] use serde::Serialize; -use std::collections::{BTreeMap, HashMap}; -use std::marker::PhantomData; -#[cfg(feature = "cosmwasm_1_3")] -use std::ops::Bound; +use std::collections::HashMap; use crate::addresses::{Addr, CanonicalAddr}; use crate::binary::Binary; diff --git a/packages/std/src/timestamp.rs b/packages/std/src/timestamp.rs index 7a3c4314c1..6a10f060d5 100644 --- a/packages/std/src/timestamp.rs +++ b/packages/std/src/timestamp.rs @@ -1,6 +1,6 @@ +use core::fmt; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use std::fmt; use crate::math::Uint64; diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 3b3812307b..b778a8ef13 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -1,6 +1,6 @@ +use core::marker::PhantomData; +use core::ops::Deref; use serde::{de::DeserializeOwned, Serialize}; -use std::marker::PhantomData; -use std::ops::Deref; use crate::addresses::{Addr, CanonicalAddr}; use crate::binary::Binary; From 100f99361dfc0046c78cc2a90162ce3648f4782e Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 17 Jul 2023 09:36:26 +0200 Subject: [PATCH 0524/2372] Fix compiler warning --- contracts/cyberpunk/src/msg.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/contracts/cyberpunk/src/msg.rs b/contracts/cyberpunk/src/msg.rs index e3a9366d73..e133d67bd8 100644 --- a/contracts/cyberpunk/src/msg.rs +++ b/contracts/cyberpunk/src/msg.rs @@ -1,5 +1,4 @@ use cosmwasm_schema::{cw_serde, QueryResponses}; -use cosmwasm_std::DenomMetadata; #[cw_serde] pub enum ExecuteMsg { @@ -39,10 +38,10 @@ pub enum QueryMsg { MirrorEnv {}, /// Queries `AllDenomMetadata` from the bank module repeatedly and returns all entries - #[returns(Vec)] + #[returns(Vec)] Denoms {}, /// Queries `DenomMetadata` from the bank module and returns the result - #[returns(DenomMetadata)] + #[returns(cosmwasm_std::DenomMetadata)] Denom { denom: String }, } From 2cf7f1bb760628899a0a8f1003e3a1cbad9a5072 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 17 Jul 2023 09:28:16 +0200 Subject: [PATCH 0525/2372] Set version: 1.3.0 --- Cargo.lock | 16 ++++++++-------- contracts/burner/Cargo.lock | 12 ++++++------ contracts/crypto-verify/Cargo.lock | 14 +++++++------- contracts/cyberpunk/Cargo.lock | 14 +++++++------- contracts/floaty/Cargo.lock | 14 +++++++------- contracts/hackatom/Cargo.lock | 14 +++++++------- contracts/ibc-reflect-send/Cargo.lock | 14 +++++++------- contracts/ibc-reflect/Cargo.lock | 14 +++++++------- contracts/queue/Cargo.lock | 12 ++++++------ contracts/reflect/Cargo.lock | 14 +++++++------- contracts/staking/Cargo.lock | 14 +++++++------- contracts/virus/Cargo.lock | 12 ++++++------ packages/check/Cargo.toml | 6 +++--- packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema-derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 6 +++--- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 20 files changed, 99 insertions(+), 99 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 69cbf273a3..4b39980522 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -291,7 +291,7 @@ dependencies = [ [[package]] name = "cosmwasm-check" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "anyhow", "clap 2.34.0", @@ -302,7 +302,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "base64", "criterion", @@ -321,7 +321,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "cosmwasm-std", "syn", @@ -329,7 +329,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "anyhow", "cosmwasm-schema-derive", @@ -344,7 +344,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "proc-macro2", "quote", @@ -353,7 +353,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "base64", "bnum", @@ -375,7 +375,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "cosmwasm-std", "serde", @@ -383,7 +383,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index be7757298c..0d6f928b77 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -180,7 +180,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -191,14 +191,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -209,7 +209,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "proc-macro2", "quote", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "base64", "bnum", @@ -236,7 +236,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index e8a7642c26..a641d5bb7f 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -175,7 +175,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -186,14 +186,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -204,7 +204,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "proc-macro2", "quote", @@ -213,7 +213,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "base64", "bnum", @@ -231,7 +231,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "cosmwasm-std", "serde", @@ -239,7 +239,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 7892644170..75b467213f 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -209,14 +209,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "proc-macro2", "quote", @@ -236,7 +236,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "base64", "bnum", @@ -254,7 +254,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "cosmwasm-std", "serde", @@ -262,7 +262,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index b58fbb095f..a4ac82239f 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index af14c9838d..1ee118477a 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 74a3b933e2..430d3b2917 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 2d988662b7..d85eb711d6 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index ae7fe21b4f..18578306b7 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 194816e2eb..d1e2882193 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 14a3ce5011..f603dc7541 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index c422907033..f0c1750191 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.0-rc.0" +version = "1.3.0" dependencies = [ "bitflags", "bytecheck", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index 40f0a0c777..7a3eadf860 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-check" -version = "1.3.0-rc.0" +version = "1.3.0" authors = ["Mauro Lacy "] edition = "2021" description = "A CLI tool for verifying CosmWasm smart contracts" @@ -11,5 +11,5 @@ license = "Apache-2.0" anyhow = "1.0.57" clap = "2" colored = "2" -cosmwasm-vm = { path = "../vm", version = "1.3.0-rc.0" } -cosmwasm-std = { path = "../std", version = "1.3.0-rc.0" } +cosmwasm-vm = { path = "../vm", version = "1.3.0" } +cosmwasm-std = { path = "../std", version = "1.3.0" } diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index c1a3d9b102..480808b805 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "1.3.0-rc.0" +version = "1.3.0" authors = ["Mauro Lacy "] edition = "2021" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index 68212e10a3..3e8f640ee9 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "1.3.0-rc.0" +version = "1.3.0" authors = ["Simon Warta "] edition = "2021" description = "A package for auto-generated code used for CosmWasm contract development. This is shipped as part of cosmwasm-std. Do not use directly." diff --git a/packages/schema-derive/Cargo.toml b/packages/schema-derive/Cargo.toml index ccf9e6ce09..ccebd5fd9f 100644 --- a/packages/schema-derive/Cargo.toml +++ b/packages/schema-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema-derive" -version = "1.3.0-rc.0" +version = "1.3.0" authors = ["Tomasz Kurcz "] edition = "2021" description = "Derive macros for cosmwasm-schema" diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index 7394ecb894..4f22af3473 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "1.3.0-rc.0" +version = "1.3.0" authors = ["Simon Warta ", "Ethan Frey "] edition = "2021" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." @@ -8,7 +8,7 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/schema" license = "Apache-2.0" [dependencies] -cosmwasm-schema-derive = { version = "=1.3.0-rc.0", path = "../schema-derive" } +cosmwasm-schema-derive = { version = "=1.3.0", path = "../schema-derive" } schemars = "0.8.3" serde = "1.0" serde_json = "1.0.40" @@ -16,6 +16,6 @@ thiserror = "1.0.26" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = { version = "1.3.0-rc.0", path = "../std" } +cosmwasm-std = { version = "1.3.0", path = "../std" } semver = "1" tempfile = "3" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 0c34b84a5c..41e4935170 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "1.3.0-rc.0" +version = "1.3.0" authors = ["Ethan Frey "] edition = "2021" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -45,7 +45,7 @@ cosmwasm_1_3 = ["cosmwasm_1_2"] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "1.3.0-rc.0" } +cosmwasm-derive = { path = "../derive", version = "1.3.0" } derivative = "2" forward_ref = "1" hex = "0.4" @@ -57,7 +57,7 @@ thiserror = "1.0.26" bnum = "0.7.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "1.3.0-rc.0" } +cosmwasm-crypto = { path = "../crypto", version = "1.3.0" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 270906d7e9..e2dd2012a3 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "1.3.0-rc.0" +version = "1.3.0" authors = ["Ethan Frey "] edition = "2021" description = "CosmWasm library with useful helpers for Storage patterns" @@ -16,5 +16,5 @@ iterator = ["cosmwasm-std/iterator"] [dependencies] # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.3.0-rc.0", default-features = false } +cosmwasm-std = { path = "../std", version = "1.3.0", default-features = false } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 4073bdddb1..ec07ccb8d8 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "1.3.0-rc.0" +version = "1.3.0" authors = ["Ethan Frey "] edition = "2021" description = "VM bindings to run cosmwams contracts" @@ -42,8 +42,8 @@ required-features = ["iterator"] clru = "0.4.0" crc32fast = "1.3.2" # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.3.0-rc.0", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "1.3.0-rc.0" } +cosmwasm-std = { path = "../std", version = "1.3.0", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "1.3.0" } hex = "0.4" parity-wasm = { version = "0.45", features = ["sign_ext"] } schemars = "0.8.3" From f3d57ce2a92c55495267c426e3c9c0364bf98596 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 17 Jul 2023 09:29:15 +0200 Subject: [PATCH 0526/2372] Update changelog --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 90769d0a04..4f58ec032a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [1.3.0-rc.0] - 2023-07-03 +## [1.3.0] - 2023-07-17 ### Fixed @@ -1769,7 +1769,7 @@ Some main points: All future Changelog entries will reference this base -[1.3.0-rc.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.7...v1.3.0-rc.0 +[1.3.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.7...v1.3.0 [1.2.7]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.6...v1.2.7 [1.2.6]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.5...v1.2.6 [1.2.5]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.4...v1.2.5 From 7fc21c375beaeedc5d2def7e34b9f0120f68f311 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 20 Jul 2023 10:33:14 +0200 Subject: [PATCH 0527/2372] Update packages/std/src/results/cosmos_msg.rs --- packages/std/src/results/cosmos_msg.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index d99a9450a5..85ccda6938 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -123,7 +123,7 @@ pub enum DistributionMsg { fn binary_to_string(data: &Binary, fmt: &mut core::fmt::Formatter) -> core::fmt::Result { match core::str::from_utf8(data.as_slice()) { Ok(s) => fmt.write_str(s), - Err(_) => core::fmt::Debug::fmt(data, fmt), + Err(_) => fmt::Debug::fmt(data, fmt), } } From e3b9478db258ad72de43713c7d1d04516becfc15 Mon Sep 17 00:00:00 2001 From: Michal Nazarewicz Date: Fri, 14 Jul 2023 02:26:00 +0200 Subject: [PATCH 0528/2372] =?UTF-8?q?cosmwasm=5Fstd:=20simplify=20?= =?UTF-8?q?=E2=80=98T=20can=20be=20used=20with=20HashSet=E2=80=99=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Checking whether a type can be used with a HashSet doesn’t actually need to involve using the HashSet. It’s sufficient to check Eq and Hash traits implementations. Simplify the tests by extending assert_hash_works macro to also test Eq trait. This also helps with eventual no_std support since there’ll be less need for conditional compilation. --- packages/std/src/addresses.rs | 24 ++-------- packages/std/src/binary.rs | 24 ++-------- packages/std/src/hex_binary.rs | 24 ++-------- packages/std/src/testing/assertions.rs | 62 ++++++++++++++------------ 4 files changed, 42 insertions(+), 92 deletions(-) diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index ce916909ac..39bc8bc06b 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -646,33 +646,15 @@ mod tests { assert_eq!(canonical_addr_slice, &[0u8, 187, 61, 11, 250, 0]); } + /// Tests that `CanonicalAddr` implements `EQ` and `Hash` correctly and thus + /// can be used with hash maps and sets. #[test] - fn canonical_addr_implements_hash() { + fn canonical_addr_implements_hash_eq() { let alice = CanonicalAddr::from([0, 187, 61, 11, 250, 0]); let bob = CanonicalAddr::from([16, 21, 33, 0, 255, 9]); assert_hash_works!(alice, bob); } - /// This requires Hash and Eq to be implemented - #[test] - fn canonical_addr_can_be_used_in_hash_set() { - use std::collections::HashSet; - - let alice1 = CanonicalAddr::from([0, 187, 61, 11, 250, 0]); - let alice2 = CanonicalAddr::from([0, 187, 61, 11, 250, 0]); - let bob = CanonicalAddr::from([16, 21, 33, 0, 255, 9]); - - let mut set = HashSet::new(); - set.insert(alice1.clone()); - set.insert(alice2.clone()); - set.insert(bob.clone()); - assert_eq!(set.len(), 2); - - let set1 = HashSet::::from_iter(vec![bob.clone(), alice1.clone()]); - let set2 = HashSet::from_iter(vec![alice1, alice2, bob]); - assert_eq!(set1, set2); - } - // helper to show we can handle Addr and &Addr equally fn flexible<'a>(a: impl Into>) -> String { a.into().into_owned().to_string() diff --git a/packages/std/src/binary.rs b/packages/std/src/binary.rs index 6bde49f90d..fb415b5945 100644 --- a/packages/std/src/binary.rs +++ b/packages/std/src/binary.rs @@ -509,33 +509,15 @@ mod tests { assert_eq!(want, AsRef::<[u8]>::as_ref(&&data)); } + /// Tests that `Binary` implements `EQ` and `Hash` correctly and thus can be + /// used with hash maps and sets. #[test] - fn binary_implements_hash() { + fn binary_implements_hash_eq() { let a = Binary::from([0, 187, 61, 11, 250, 0]); let b = Binary::from([16, 21, 33, 0, 255, 9]); assert_hash_works!(a, b); } - /// This requires Hash and Eq to be implemented - #[test] - fn binary_can_be_used_in_hash_set() { - use std::collections::HashSet; - - let a1 = Binary::from([0, 187, 61, 11, 250, 0]); - let a2 = Binary::from([0, 187, 61, 11, 250, 0]); - let b = Binary::from([16, 21, 33, 0, 255, 9]); - - let mut set = HashSet::new(); - set.insert(a1.clone()); - set.insert(a2.clone()); - set.insert(b.clone()); - assert_eq!(set.len(), 2); - - let set1 = HashSet::::from_iter(vec![b.clone(), a1.clone()]); - let set2 = HashSet::from_iter(vec![a1, a2, b]); - assert_eq!(set1, set2); - } - #[test] fn binary_implements_partial_eq_with_vector() { let a = Binary(vec![5u8; 3]); diff --git a/packages/std/src/hex_binary.rs b/packages/std/src/hex_binary.rs index ae3438cc93..0def99b36a 100644 --- a/packages/std/src/hex_binary.rs +++ b/packages/std/src/hex_binary.rs @@ -572,33 +572,15 @@ mod tests { assert_eq!(want, AsRef::<[u8]>::as_ref(&&data)); } + /// Tests that `HexBinary` implements `EQ` and `Hash` correctly and thus can + /// be used with hash maps and sets. #[test] - fn hex_binary_implements_hash() { + fn hex_binary_implements_hash_eq() { let a = HexBinary::from([0, 187, 61, 11, 250, 0]); let b = HexBinary::from([16, 21, 33, 0, 255, 9]); assert_hash_works!(a, b); } - /// This requires Hash and Eq to be implemented - #[test] - fn hex_binary_can_be_used_in_hash_set() { - use std::collections::HashSet; - - let a1 = HexBinary::from([0, 187, 61, 11, 250, 0]); - let a2 = HexBinary::from([0, 187, 61, 11, 250, 0]); - let b = HexBinary::from([16, 21, 33, 0, 255, 9]); - - let mut set = HashSet::new(); - set.insert(a1.clone()); - set.insert(a2.clone()); - set.insert(b.clone()); - assert_eq!(set.len(), 2); - - let set1 = HashSet::::from_iter(vec![b.clone(), a1.clone()]); - let set2 = HashSet::from_iter(vec![a1, a2, b]); - assert_eq!(set1, set2); - } - #[test] fn hex_binary_implements_partial_eq_with_vector() { let a = HexBinary(vec![5u8; 3]); diff --git a/packages/std/src/testing/assertions.rs b/packages/std/src/testing/assertions.rs index b5d5a838ee..5a3462391d 100644 --- a/packages/std/src/testing/assertions.rs +++ b/packages/std/src/testing/assertions.rs @@ -60,29 +60,21 @@ pub fn assert_approx_eq_impl>( let rel_diff = Decimal::from_ratio(left.abs_diff(right), largest); if rel_diff > max_rel_diff { - match panic_msg { - Some(panic_msg) => panic!( - "assertion failed: `(left ≈ right)`\nleft: {left}\nright: {right}\nrelative difference: {rel_diff}\nmax allowed relative difference: {max_rel_diff}\n: {panic_msg}" - ), - None => panic!( - "assertion failed: `(left ≈ right)`\nleft: {left}\nright: {right}\nrelative difference: {rel_diff}\nmax allowed relative difference: {max_rel_diff}\n" - ), - } + do_panic(format_args!("assertion failed: `(left ≈ right)`\nleft: {left}\nright: {right}\nrelative difference: {rel_diff}\nmax allowed relative difference: {max_rel_diff}"), panic_msg); } } -/// Tests that type `T` implements `Hash` trait correctly. +/// Tests that type `T` implements `Eq` and `Hash` traits correctly. /// /// `left` and `right` must be unequal objects. /// -/// Some object pairs may produce the same hash causing test failure. -/// In those cases try different objects. The test uses stable hasher -/// so once working pair is identified, the test’s going to continue -/// passing. +/// Some object pairs may produce the same hash causing test failure. In those +/// cases try different objects. The test uses stable hasher so once working +/// pair is identified, the test’s going to continue passing. #[track_caller] #[doc(hidden)] #[cfg(test)] -pub fn assert_hash_works_impl(left: T, right: T, panic_msg: Option) { +pub fn assert_hash_works_impl(left: T, right: T, panic_msg: Option) { fn hash(value: &impl Hash) -> u64 { let mut hasher = crc32fast::Hasher::default(); value.hash(&mut hasher); @@ -90,23 +82,35 @@ pub fn assert_hash_works_impl(left: T, right: T, panic_msg: Opt } // Check clone - if hash(&left) != hash(&left.clone()) { - match panic_msg { - Some(panic_msg) => { - panic!("assertion failed: `hash(left) == hash(left.clone())`\n: {panic_msg}") - } - None => panic!("assertion failed: `hash(left) == hash(left.clone())`"), - } + let clone = left.clone(); + if left != clone { + do_panic("assertion failed: `left == left.clone()`", panic_msg); + } + if hash(&left) != hash(&clone) { + do_panic( + "assertion failed: `hash(left) == hash(left.clone())`", + panic_msg, + ); } // Check different object + if left == right { + do_panic("assertion failed: `left != right`", panic_msg); + } if hash(&left) == hash(&right) { - match panic_msg { - Some(panic_msg) => { - panic!("assertion failed: `hash(left) != hash(right)`\n: {panic_msg}") - } - None => panic!("assertion failed: `hash(left) != hash(right)`"), - } + do_panic("assertion failed: `hash(left) != hash(right)`", panic_msg); + } +} + +#[track_caller] +/// Panics concatenating both arguments. +/// +/// If second argument is `None` panics with just the first argument as message. +/// Otherwise, formats the panic message as `{reason}:\n{panic_msg}`. +fn do_panic(reason: impl core::fmt::Display, panic_msg: Option) -> ! { + match panic_msg { + Some(panic_msg) => panic!("{reason}:\n{panic_msg}"), + None => panic!("{reason}"), } } @@ -140,7 +144,7 @@ mod tests { #[test] #[should_panic( - expected = "assertion failed: `(left ≈ right)`\nleft: 8\nright: 10\nrelative difference: 0.2\nmax allowed relative difference: 0.12\n" + expected = "assertion failed: `(left ≈ right)`\nleft: 8\nright: 10\nrelative difference: 0.2\nmax allowed relative difference: 0.12" )] fn assert_approx_fail() { assert_approx_eq!(8_u32, 10_u32, "0.12"); @@ -148,7 +152,7 @@ mod tests { #[test] #[should_panic( - expected = "assertion failed: `(left ≈ right)`\nleft: 17\nright: 20\nrelative difference: 0.15\nmax allowed relative difference: 0.12\n: some extra info about the error: Foo(8)" + expected = "assertion failed: `(left ≈ right)`\nleft: 17\nright: 20\nrelative difference: 0.15\nmax allowed relative difference: 0.12:\nsome extra info about the error: Foo(8)" )] fn assert_approx_with_custom_panic_msg() { let adjective = "extra"; From e01f672f55a7b3a91830235bdfb28b6295fa54bf Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 21 Jul 2023 15:37:05 +0200 Subject: [PATCH 0529/2372] Update mergify config --- .mergify.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.mergify.yml b/.mergify.yml index f37873c2bf..8d026132a4 100644 --- a/.mergify.yml +++ b/.mergify.yml @@ -27,7 +27,8 @@ pull_request_rules: - "status-success=ci/circleci: contract_reflect" - "status-success=ci/circleci: contract_staking" - "status-success=ci/circleci: contract_virus" - - "status-success=ci/circleci: coverage" + # disabled temporarily because Rust version is too low + # - "status-success=ci/circleci: coverage" - "status-success=ci/circleci: fmt" - "status-success=ci/circleci: fmt_extra" - "status-success=ci/circleci: package_check" @@ -49,6 +50,6 @@ pull_request_rules: backport: branches: # Update this when going to a new minor version - - "1.2" + - "1.4" assignees: - "{{ author }}" From a23ff665e41c673e81bfc974d84e59dc071cd4ac Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 21 Jul 2023 15:38:58 +0200 Subject: [PATCH 0530/2372] Fix backport branch --- .mergify.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.mergify.yml b/.mergify.yml index 8d026132a4..4bb3f061d8 100644 --- a/.mergify.yml +++ b/.mergify.yml @@ -50,6 +50,6 @@ pull_request_rules: backport: branches: # Update this when going to a new minor version - - "1.4" + - "release/1.4" assignees: - "{{ author }}" From 9292c772298e7b87796ecbad56a65047958598d3 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 5 Jul 2023 12:09:04 +0200 Subject: [PATCH 0531/2372] Refactore code to reuse an engine --- packages/vm/examples/module_size.rs | 2 +- packages/vm/src/cache.rs | 43 +++++++------- packages/vm/src/instance.rs | 8 ++- packages/vm/src/lib.rs | 4 +- packages/vm/src/modules/cached_module.rs | 3 +- packages/vm/src/modules/file_system_cache.rs | 26 ++++----- packages/vm/src/modules/in_memory_cache.rs | 57 ++++++++----------- .../vm/src/modules/pinned_memory_cache.rs | 47 +++++++-------- packages/vm/src/wasm_backend/compile.rs | 2 +- packages/vm/src/wasm_backend/mod.rs | 4 +- packages/vm/src/wasm_backend/store.rs | 25 ++++++-- 11 files changed, 116 insertions(+), 105 deletions(-) diff --git a/packages/vm/examples/module_size.rs b/packages/vm/examples/module_size.rs index bf35894718..4b6ed3a494 100644 --- a/packages/vm/examples/module_size.rs +++ b/packages/vm/examples/module_size.rs @@ -65,6 +65,6 @@ fn module_compile(wasm: &[u8]) -> Module { #[inline(never)] fn module_deserialize(serialized: &[u8]) -> Module { // Deserialize using make_engine() - let engine = make_engine(&[]); + let engine = make_engine(None, &[]); unsafe { Module::deserialize(&engine, serialized) }.unwrap() } diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 872ec5f19f..93d4d1dec2 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -4,7 +4,7 @@ use std::io::{Read, Write}; use std::marker::PhantomData; use std::path::{Path, PathBuf}; use std::sync::Mutex; -use wasmer::{Engine, NativeEngineExt}; +use wasmer::{Engine, Module, Store}; use crate::backend::{Backend, BackendApi, Querier, Storage}; use crate::capabilities::required_capabilities_from_module; @@ -16,7 +16,7 @@ use crate::instance::{Instance, InstanceOptions}; use crate::modules::{CachedModule, FileSystemCache, InMemoryCache, PinnedMemoryCache}; use crate::size::Size; use crate::static_analysis::{deserialize_wasm, has_ibc_entry_points}; -use crate::wasm_backend::{compile, make_store_with_engine}; +use crate::wasm_backend::{compile, make_engine}; const STATE_DIR: &str = "state"; // Things related to the state of the blockchain. @@ -74,6 +74,7 @@ pub struct CacheInner { memory_cache: InMemoryCache, fs_cache: FileSystemCache, stats: Stats, + engine: Engine, } pub struct Cache { @@ -137,6 +138,7 @@ where memory_cache: InMemoryCache::new(memory_cache_size), fs_cache, stats: Stats::default(), + engine: make_engine(Some(instance_memory_limit), &[]), }), type_storage: PhantomData::, type_api: PhantomData::, @@ -270,23 +272,22 @@ where // for a not-so-relevant use case. // Try to get module from file system cache - let engine = Engine::headless(); - if let Some((module, module_size)) = cache.fs_cache.load(checksum, &engine)? { + if let Some((module, module_size)) = cache.fs_cache.load(checksum, &cache.engine)? { cache.stats.hits_fs_cache = cache.stats.hits_fs_cache.saturating_add(1); return cache .pinned_memory_cache - .store(checksum, (engine, module), module_size); + .store(checksum, module, module_size); } // Re-compile from original Wasm bytecode let code = self.load_wasm_with_path(&cache.wasm_path, checksum)?; cache.stats.misses = cache.stats.misses.saturating_add(1); - let (engine, module) = compile(&code, &[])?; + let (_engine, module) = compile(&code, &[])?; // Store into the fs cache too let module_size = cache.fs_cache.store(checksum, &module)?; cache .pinned_memory_cache - .store(checksum, (engine, module), module_size) + .store(checksum, module, module_size) } /// Unpins a Module, i.e. removes it from the pinned memory cache. @@ -310,8 +311,7 @@ where backend: Backend, options: InstanceOptions, ) -> VmResult> { - let (cached, memory_limit, _from_pinned) = self.get_module(checksum)?; - let store = make_store_with_engine(cached.engine, Some(memory_limit)); + let (cached, store, _memory_limit, _from_pinned) = self.get_module(checksum)?; let instance = Instance::from_module( store, &cached.module, @@ -327,35 +327,36 @@ where /// Returns a module tied to a previously saved Wasm. /// Depending on availability, this is either generated from a memory cache, file system cache or Wasm code. /// This is part of `get_instance` but pulled out to reduce the locking time. - fn get_module(&self, checksum: &Checksum) -> VmResult<(CachedModule, Size, bool)> { + fn get_module(&self, checksum: &Checksum) -> VmResult<(CachedModule, Store, Size, bool)> { let mut cache = self.inner.lock().unwrap(); // Try to get module from the pinned memory cache if let Some(element) = cache.pinned_memory_cache.load(checksum)? { cache.stats.hits_pinned_memory_cache = cache.stats.hits_pinned_memory_cache.saturating_add(1); - return Ok((element, cache.instance_memory_limit, true)); + let store = Store::new(cache.engine.clone()); + return Ok((element, store, cache.instance_memory_limit, true)); } // Get module from memory cache if let Some(element) = cache.memory_cache.load(checksum)? { cache.stats.hits_memory_cache = cache.stats.hits_memory_cache.saturating_add(1); - return Ok((element, cache.instance_memory_limit, false)); + let store = Store::new(cache.engine.clone()); + return Ok((element, store, cache.instance_memory_limit, false)); } // Get module from file system cache - let engine = Engine::headless(); - if let Some((module, module_size)) = cache.fs_cache.load(checksum, &engine)? { + if let Some((module, module_size)) = cache.fs_cache.load(checksum, &cache.engine)? { cache.stats.hits_fs_cache = cache.stats.hits_fs_cache.saturating_add(1); cache .memory_cache - .store(checksum, (engine.clone(), module.clone()), module_size)?; + .store(checksum, module.clone(), module_size)?; let cached = CachedModule { - engine, module, size: module_size, }; - return Ok((cached, cache.instance_memory_limit, false)); + let store = Store::new(cache.engine.clone()); + return Ok((cached, store, cache.instance_memory_limit, false)); } // Re-compile module from wasm @@ -365,18 +366,18 @@ where // stored the old module format. let wasm = self.load_wasm_with_path(&cache.wasm_path, checksum)?; cache.stats.misses = cache.stats.misses.saturating_add(1); - let (engine, module) = compile(&wasm, &[])?; + let module = Module::new(&cache.engine, wasm)?; let module_size = cache.fs_cache.store(checksum, &module)?; cache .memory_cache - .store(checksum, (engine.clone(), module.clone()), module_size)?; + .store(checksum, module.clone(), module_size)?; let cached = CachedModule { - engine, module, size: module_size, }; - Ok((cached, cache.instance_memory_limit, false)) + let store = Store::new(cache.engine.clone()); + Ok((cached, store, cache.instance_memory_limit, false)) } } diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 47f991a746..f2ea0335f7 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -22,7 +22,7 @@ use crate::imports::{ use crate::imports::{do_db_next, do_db_scan}; use crate::memory::{read_region, write_region}; use crate::size::Size; -use crate::wasm_backend::{compile, make_store_with_engine}; +use crate::wasm_backend::make_engine; pub use crate::environment::DebugInfo; // Re-exported as public via to be usable for set_debug_handler @@ -71,8 +71,9 @@ where options: InstanceOptions, memory_limit: Option, ) -> VmResult { - let (engine, module) = compile(code, &[])?; - let store = make_store_with_engine(engine, memory_limit); + let engine = make_engine(memory_limit, &[]); + let module = Module::new(&engine, code)?; + let store = Store::new(engine); Instance::from_module( store, &module, @@ -494,6 +495,7 @@ mod tests { mock_instance_with_balances, mock_instance_with_failing_api, mock_instance_with_gas_limit, mock_instance_with_options, MockInstanceOptions, }; + use crate::wasm_backend::{compile, make_store_with_engine}; use cosmwasm_std::{ coin, coins, from_binary, AllBalanceResponse, BalanceResponse, BankQuery, Empty, QueryRequest, diff --git a/packages/vm/src/lib.rs b/packages/vm/src/lib.rs index 0c1b541c9c..88b5b325ac 100644 --- a/packages/vm/src/lib.rs +++ b/packages/vm/src/lib.rs @@ -58,5 +58,7 @@ pub mod internals { pub use crate::compatibility::check_wasm; pub use crate::instance::instance_from_module; - pub use crate::wasm_backend::{compile, make_engine, make_runtime_store}; + #[cfg(test)] + pub use crate::wasm_backend::make_runtime_store; + pub use crate::wasm_backend::{compile, make_engine}; } diff --git a/packages/vm/src/modules/cached_module.rs b/packages/vm/src/modules/cached_module.rs index 027242a588..ee6b80d2de 100644 --- a/packages/vm/src/modules/cached_module.rs +++ b/packages/vm/src/modules/cached_module.rs @@ -1,8 +1,7 @@ -use wasmer::{Engine, Module}; +use wasmer::Module; #[derive(Debug, Clone)] pub struct CachedModule { - pub engine: Engine, pub module: Module, /// The estimated size of this element in memory pub size: usize, diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index d3c9679417..6847ac2ea3 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -213,9 +213,9 @@ mod tests { use super::*; use crate::size::Size; - use crate::wasm_backend::{compile, make_runtime_store}; + use crate::wasm_backend::make_engine; use tempfile::TempDir; - use wasmer::{imports, Instance as WasmerInstance}; + use wasmer::{imports, Instance as WasmerInstance, Store}; use wasmer_middlewares::metering::set_remaining_points; const TESTING_MEMORY_LIMIT: Option = Some(Size::mebi(16)); @@ -231,6 +231,7 @@ mod tests { #[test] fn file_system_cache_run() { + let engine = make_engine(TESTING_MEMORY_LIMIT, &[]); let tmp_dir = TempDir::new().unwrap(); let mut cache = unsafe { FileSystemCache::new(tmp_dir.path(), false).unwrap() }; @@ -239,17 +240,15 @@ mod tests { let checksum = Checksum::generate(&wasm); // Module does not exist - let store = make_runtime_store(TESTING_MEMORY_LIMIT); - let cached = cache.load(&checksum, &store).unwrap(); + let cached = cache.load(&checksum, &engine).unwrap(); assert!(cached.is_none()); // Store module - let (_engine, module) = compile(&wasm, &[]).unwrap(); + let module = Module::new(&engine, wasm).unwrap(); cache.store(&checksum, &module).unwrap(); // Load module - let mut store = make_runtime_store(TESTING_MEMORY_LIMIT); - let cached = cache.load(&checksum, &store).unwrap(); + let cached = cache.load(&checksum, &engine).unwrap(); assert!(cached.is_some()); // Check the returned module is functional. @@ -258,6 +257,7 @@ mod tests { let (cached_module, module_size) = cached.unwrap(); assert_eq!(module_size, module.serialize().unwrap().len()); let import_object = imports! {}; + let mut store = Store::new(engine); let instance = WasmerInstance::new(&mut store, &cached_module, &import_object).unwrap(); set_remaining_points(&mut store, &instance, TESTING_GAS_LIMIT); let add_one = instance.exports.get_function("add_one").unwrap(); @@ -268,6 +268,7 @@ mod tests { #[test] fn file_system_cache_store_uses_expected_path() { + let engine = make_engine(TESTING_MEMORY_LIMIT, &[]); let tmp_dir = TempDir::new().unwrap(); let mut cache = unsafe { FileSystemCache::new(tmp_dir.path(), false).unwrap() }; @@ -276,7 +277,7 @@ mod tests { let checksum = Checksum::generate(&wasm); // Store module - let (_engine, module) = compile(&wasm, &[]).unwrap(); + let module = Module::new(&engine, wasm).unwrap(); cache.store(&checksum, &module).unwrap(); let mut globber = glob::glob(&format!( @@ -291,6 +292,7 @@ mod tests { #[test] fn file_system_cache_remove_works() { + let engine = make_engine(TESTING_MEMORY_LIMIT, &[]); let tmp_dir = TempDir::new().unwrap(); let mut cache = unsafe { FileSystemCache::new(tmp_dir.path(), false).unwrap() }; @@ -299,20 +301,18 @@ mod tests { let checksum = Checksum::generate(&wasm); // Store module - let (_engine, module) = compile(&wasm, &[]).unwrap(); + let module = Module::new(&engine, wasm).unwrap(); cache.store(&checksum, &module).unwrap(); // It's there - let store = make_runtime_store(TESTING_MEMORY_LIMIT); - assert!(cache.load(&checksum, &store).unwrap().is_some()); + assert!(cache.load(&checksum, &engine).unwrap().is_some()); // Remove module let existed = cache.remove(&checksum).unwrap(); assert!(existed); // it's gone now - let store = make_runtime_store(TESTING_MEMORY_LIMIT); - assert!(cache.load(&checksum, &store).unwrap().is_none()); + assert!(cache.load(&checksum, &engine).unwrap().is_none()); // Remove again let existed = cache.remove(&checksum).unwrap(); diff --git a/packages/vm/src/modules/in_memory_cache.rs b/packages/vm/src/modules/in_memory_cache.rs index 0a876e019b..bbc9ed0589 100644 --- a/packages/vm/src/modules/in_memory_cache.rs +++ b/packages/vm/src/modules/in_memory_cache.rs @@ -1,7 +1,7 @@ use clru::{CLruCache, CLruCacheConfig, WeightScale}; use std::collections::hash_map::RandomState; use std::num::NonZeroUsize; -use wasmer::{Engine, Module}; +use wasmer::Module; use super::cached_module::CachedModule; use crate::{Checksum, Size, VmError, VmResult}; @@ -49,19 +49,13 @@ impl InMemoryCache { } } - pub fn store( - &mut self, - checksum: &Checksum, - entry: (Engine, Module), - size: usize, - ) -> VmResult<()> { + pub fn store(&mut self, checksum: &Checksum, entry: Module, size: usize) -> VmResult<()> { if let Some(modules) = &mut self.modules { modules .put_with_weight( *checksum, CachedModule { - engine: entry.0, - module: entry.1, + module: entry, size, }, ) @@ -106,11 +100,12 @@ impl InMemoryCache { mod tests { use super::*; use crate::size::Size; - use crate::wasm_backend::{compile, make_store_with_engine}; + use crate::wasm_backend::make_engine; use std::mem; - use wasmer::{imports, Instance as WasmerInstance}; + use wasmer::{imports, Instance as WasmerInstance, Store}; use wasmer_middlewares::metering::set_remaining_points; + const TESTING_MEMORY_LIMIT: Option = Some(Size::mebi(16)); const TESTING_GAS_LIMIT: u64 = 500_000_000; // Based on `examples/module_size.sh` const TESTING_WASM_SIZE_FACTOR: usize = 18; @@ -130,6 +125,7 @@ mod tests { #[test] fn in_memory_cache_run() { + let engine = make_engine(TESTING_MEMORY_LIMIT, &[]); let mut cache = InMemoryCache::new(Size::mebi(200)); // Create module @@ -150,11 +146,11 @@ mod tests { assert!(cache_entry.is_none()); // Compile module - let (engine, original) = compile(&wasm, &[]).unwrap(); - let mut store = make_store_with_engine(engine.clone(), None); + let original = Module::new(&engine, &wasm).unwrap(); // Ensure original module can be executed { + let mut store = Store::new(engine.clone()); let instance = WasmerInstance::new(&mut store, &original, &imports! {}).unwrap(); set_remaining_points(&mut store, &instance, TESTING_GAS_LIMIT); let add_one = instance.exports.get_function("add_one").unwrap(); @@ -164,13 +160,14 @@ mod tests { // Store module let size = wasm.len() * TESTING_WASM_SIZE_FACTOR; - cache.store(&checksum, (engine, original), size).unwrap(); + cache.store(&checksum, original, size).unwrap(); // Load module let cached = cache.load(&checksum).unwrap().unwrap(); // Ensure cached module can be executed { + let mut store = Store::new(engine); let instance = WasmerInstance::new(&mut store, &cached.module, &imports! {}).unwrap(); set_remaining_points(&mut store, &instance, TESTING_GAS_LIMIT); let add_one = instance.exports.get_function("add_one").unwrap(); @@ -181,6 +178,7 @@ mod tests { #[test] fn len_works() { + let engine = make_engine(TESTING_MEMORY_LIMIT, &[]); let mut cache = InMemoryCache::new(Size::mebi(2)); // Create module @@ -221,26 +219,24 @@ mod tests { assert_eq!(cache.len(), 0); // Add 1 - cache - .store(&checksum1, compile(&wasm1, &[]).unwrap(), 900_000) - .unwrap(); + let module = Module::new(&engine, &wasm1).unwrap(); + cache.store(&checksum1, module, 900_000).unwrap(); assert_eq!(cache.len(), 1); // Add 2 - cache - .store(&checksum2, compile(&wasm2, &[]).unwrap(), 900_000) - .unwrap(); + let module = Module::new(&engine, &wasm2).unwrap(); + cache.store(&checksum2, module, 900_000).unwrap(); assert_eq!(cache.len(), 2); // Add 3 (pushes out the previous two) - cache - .store(&checksum3, compile(&wasm3, &[]).unwrap(), 1_500_000) - .unwrap(); + let module = Module::new(&engine, &wasm3).unwrap(); + cache.store(&checksum3, module, 1_500_000).unwrap(); assert_eq!(cache.len(), 1); } #[test] fn size_works() { + let engine = make_engine(TESTING_MEMORY_LIMIT, &[]); let mut cache = InMemoryCache::new(Size::mebi(2)); // Create module @@ -281,21 +277,18 @@ mod tests { assert_eq!(cache.size(), 0); // Add 1 - cache - .store(&checksum1, compile(&wasm1, &[]).unwrap(), 900_000) - .unwrap(); + let module = Module::new(&engine, &wasm1).unwrap(); + cache.store(&checksum1, module, 900_000).unwrap(); assert_eq!(cache.size(), 900_000); // Add 2 - cache - .store(&checksum2, compile(&wasm2, &[]).unwrap(), 800_000) - .unwrap(); + let module = Module::new(&engine, &wasm2).unwrap(); + cache.store(&checksum2, module, 800_000).unwrap(); assert_eq!(cache.size(), 1_700_000); // Add 3 (pushes out the previous two) - cache - .store(&checksum3, compile(&wasm3, &[]).unwrap(), 1_500_000) - .unwrap(); + let module = Module::new(&engine, &wasm3).unwrap(); + cache.store(&checksum3, module, 1_500_000).unwrap(); assert_eq!(cache.size(), 1_500_000); } } diff --git a/packages/vm/src/modules/pinned_memory_cache.rs b/packages/vm/src/modules/pinned_memory_cache.rs index bb4b72c04e..5aaffc1ce8 100644 --- a/packages/vm/src/modules/pinned_memory_cache.rs +++ b/packages/vm/src/modules/pinned_memory_cache.rs @@ -1,5 +1,5 @@ use std::collections::HashMap; -use wasmer::{Engine, Module}; +use wasmer::Module; use super::cached_module::CachedModule; use crate::{Checksum, VmResult}; @@ -17,17 +17,11 @@ impl PinnedMemoryCache { } } - pub fn store( - &mut self, - checksum: &Checksum, - element: (Engine, Module), - size: usize, - ) -> VmResult<()> { + pub fn store(&mut self, checksum: &Checksum, element: Module, size: usize) -> VmResult<()> { self.modules.insert( *checksum, CachedModule { - engine: element.0, - module: element.1, + module: element, size, }, ); @@ -71,14 +65,16 @@ impl PinnedMemoryCache { #[cfg(test)] mod tests { use super::*; - use crate::wasm_backend::{compile, make_store_with_engine}; - use wasmer::{imports, Instance as WasmerInstance}; + use crate::{wasm_backend::make_engine, Size}; + use wasmer::{imports, Instance as WasmerInstance, Store}; use wasmer_middlewares::metering::set_remaining_points; + const TESTING_MEMORY_LIMIT: Option = Some(Size::mebi(16)); const TESTING_GAS_LIMIT: u64 = 500_000_000; #[test] fn pinned_memory_cache_run() { + let engine = make_engine(TESTING_MEMORY_LIMIT, &[]); let mut cache = PinnedMemoryCache::new(); // Create module @@ -99,11 +95,11 @@ mod tests { assert!(cache_entry.is_none()); // Compile module - let (engine, original) = compile(&wasm, &[]).unwrap(); - let mut store = make_store_with_engine(engine.clone(), None); + let original = Module::new(&engine, &wasm).unwrap(); // Ensure original module can be executed { + let mut store = Store::new(engine.clone()); let instance = WasmerInstance::new(&mut store, &original, &imports! {}).unwrap(); set_remaining_points(&mut store, &instance, TESTING_GAS_LIMIT); let add_one = instance.exports.get_function("add_one").unwrap(); @@ -112,14 +108,14 @@ mod tests { } // Store module - cache.store(&checksum, (engine, original), 0).unwrap(); + cache.store(&checksum, original, 0).unwrap(); // Load module let cached = cache.load(&checksum).unwrap().unwrap(); - let mut store = make_store_with_engine(cached.engine, None); // Ensure cached module can be executed { + let mut store = Store::new(engine); let instance = WasmerInstance::new(&mut store, &cached.module, &imports! {}).unwrap(); set_remaining_points(&mut store, &instance, TESTING_GAS_LIMIT); let add_one = instance.exports.get_function("add_one").unwrap(); @@ -130,6 +126,7 @@ mod tests { #[test] fn has_works() { + let engine = make_engine(TESTING_MEMORY_LIMIT, &[]); let mut cache = PinnedMemoryCache::new(); // Create module @@ -148,8 +145,8 @@ mod tests { assert!(!cache.has(&checksum)); // Add - let (engine, original) = compile(&wasm, &[]).unwrap(); - cache.store(&checksum, (engine, original), 0).unwrap(); + let original = Module::new(&engine, &wasm).unwrap(); + cache.store(&checksum, original, 0).unwrap(); assert!(cache.has(&checksum)); @@ -161,6 +158,7 @@ mod tests { #[test] fn len_works() { + let engine = make_engine(TESTING_MEMORY_LIMIT, &[]); let mut cache = PinnedMemoryCache::new(); // Create module @@ -179,8 +177,8 @@ mod tests { assert_eq!(cache.len(), 0); // Add - let (engine, original) = compile(&wasm, &[]).unwrap(); - cache.store(&checksum, (engine, original), 0).unwrap(); + let original = Module::new(&engine, &wasm).unwrap(); + cache.store(&checksum, original, 0).unwrap(); assert_eq!(cache.len(), 1); @@ -192,6 +190,7 @@ mod tests { #[test] fn size_works() { + let engine = make_engine(TESTING_MEMORY_LIMIT, &[]); let mut cache = PinnedMemoryCache::new(); // Create module @@ -221,15 +220,13 @@ mod tests { assert_eq!(cache.size(), 0); // Add 1 - cache - .store(&checksum1, compile(&wasm1, &[]).unwrap(), 500) - .unwrap(); + let module = Module::new(&engine, &wasm1).unwrap(); + cache.store(&checksum1, module, 500).unwrap(); assert_eq!(cache.size(), 500); // Add 2 - cache - .store(&checksum2, compile(&wasm2, &[]).unwrap(), 300) - .unwrap(); + let module = Module::new(&engine, &wasm2).unwrap(); + cache.store(&checksum2, module, 300).unwrap(); assert_eq!(cache.size(), 800); // Remove 1 diff --git a/packages/vm/src/wasm_backend/compile.rs b/packages/vm/src/wasm_backend/compile.rs index 64296849fe..12df3a5b5a 100644 --- a/packages/vm/src/wasm_backend/compile.rs +++ b/packages/vm/src/wasm_backend/compile.rs @@ -10,7 +10,7 @@ pub fn compile( code: &[u8], middlewares: &[Arc], ) -> VmResult<(Engine, Module)> { - let engine = make_engine(middlewares); + let engine = make_engine(None, middlewares); let module = Module::new(&engine, code)?; Ok((engine, module)) } diff --git a/packages/vm/src/wasm_backend/mod.rs b/packages/vm/src/wasm_backend/mod.rs index 2b327f70e1..b84223e0b1 100644 --- a/packages/vm/src/wasm_backend/mod.rs +++ b/packages/vm/src/wasm_backend/mod.rs @@ -5,4 +5,6 @@ mod store; pub use compile::compile; pub use limiting_tunables::LimitingTunables; -pub use store::{make_engine, make_runtime_store, make_store_with_engine}; +pub use store::make_engine; +#[cfg(test)] +pub use store::{make_runtime_store, make_store_with_engine}; diff --git a/packages/vm/src/wasm_backend/store.rs b/packages/vm/src/wasm_backend/store.rs index bd44ccc4b9..715ac33b23 100644 --- a/packages/vm/src/wasm_backend/store.rs +++ b/packages/vm/src/wasm_backend/store.rs @@ -4,9 +4,11 @@ use wasmer::Cranelift; use wasmer::NativeEngineExt; #[cfg(not(feature = "cranelift"))] use wasmer::Singlepass; +#[cfg(test)] +use wasmer::Store; use wasmer::{ - wasmparser::Operator, BaseTunables, CompilerConfig, Engine, ModuleMiddleware, Pages, Store, - Target, WASM_PAGE_SIZE, + wasmparser::Operator, BaseTunables, CompilerConfig, Engine, ModuleMiddleware, Pages, Target, + WASM_PAGE_SIZE, }; use wasmer_middlewares::Metering; @@ -32,7 +34,10 @@ fn cost(_operator: &Operator) -> u64 { } /// Creates an engine with the default compiler. -pub fn make_engine(middlewares: &[Arc]) -> Engine { +pub fn make_engine( + memory_limit: Option, + middlewares: &[Arc], +) -> Engine { let gas_limit = 0; let deterministic = Arc::new(Gatekeeper::default()); let metering = Arc::new(Metering::new(gas_limit, cost)); @@ -48,11 +53,20 @@ pub fn make_engine(middlewares: &[Arc]) -> Engine { } compiler.push_middleware(deterministic); compiler.push_middleware(metering); - compiler.into() + let mut engine = Engine::from(compiler); + if let Some(limit) = memory_limit { + let base = BaseTunables::for_target(&Target::default()); + let tunables = LimitingTunables::new(base, limit_to_pages(limit)); + engine.set_tunables(tunables); + } + engine } /// Created a store with no compiler and the given memory limit (in bytes) /// If memory_limit is None, no limit is applied. +/// +/// Used for testing only. +#[cfg(test)] pub fn make_runtime_store(memory_limit: Option) -> Store { let engine = Engine::headless(); make_store_with_engine(engine, memory_limit) @@ -60,6 +74,7 @@ pub fn make_runtime_store(memory_limit: Option) -> Store { /// Creates a store from an engine and an optional memory limit. /// If no limit is set, the no custom tunables will be used. +#[cfg(test)] pub fn make_store_with_engine(mut engine: Engine, memory_limit: Option) -> Store { if let Some(limit) = memory_limit { let base = BaseTunables::for_target(&Target::default()); @@ -115,7 +130,7 @@ mod tests { // Compile let serialized = { let wasm = wat::parse_str(EXPORTED_MEMORY_WAT).unwrap(); - let store = make_engine(&[]); + let store = make_engine(None, &[]); let module = Module::new(&store, wasm).unwrap(); module.serialize().unwrap() }; From cacb1507dc665fc0c92d3e887a70259f966585bf Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 5 Jul 2023 12:10:17 +0200 Subject: [PATCH 0532/2372] Let compile not create its own engine --- packages/check/src/main.rs | 5 +++-- packages/vm/examples/module_size.rs | 21 +++++++-------------- packages/vm/src/cache.rs | 9 ++++----- packages/vm/src/environment.rs | 9 +++++---- packages/vm/src/imports.rs | 9 +++++---- packages/vm/src/instance.rs | 6 ++++-- packages/vm/src/modules/versioning.rs | 8 ++++++-- packages/vm/src/wasm_backend/compile.rs | 17 ++++++----------- 8 files changed, 40 insertions(+), 44 deletions(-) diff --git a/packages/check/src/main.rs b/packages/check/src/main.rs index d190a64656..9fcfaef4be 100644 --- a/packages/check/src/main.rs +++ b/packages/check/src/main.rs @@ -8,7 +8,7 @@ use clap::{Arg, ArgAction, Command}; use colored::Colorize; use cosmwasm_vm::capabilities_from_csv; -use cosmwasm_vm::internals::{check_wasm, compile}; +use cosmwasm_vm::internals::{check_wasm, compile, make_engine}; const DEFAULT_AVAILABLE_CAPABILITIES: &str = "iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2,cosmwasm_1_3"; @@ -99,7 +99,8 @@ fn check_contract( check_wasm(&wasm, available_capabilities)?; // Compile module - compile(&wasm, &[])?; + let engine = make_engine(None, &[]); + let _module = compile(&engine, &wasm)?; Ok(()) } diff --git a/packages/vm/examples/module_size.rs b/packages/vm/examples/module_size.rs index 4b6ed3a494..ac1b6ed9d2 100644 --- a/packages/vm/examples/module_size.rs +++ b/packages/vm/examples/module_size.rs @@ -4,9 +4,8 @@ use std::mem; use clap::{Arg, Command}; -use cosmwasm_vm::internals::compile; -use cosmwasm_vm::internals::make_engine; -use wasmer::Module; +use cosmwasm_vm::internals::{compile, make_engine}; +use wasmer::{Engine, Module}; pub fn main() { let matches = Command::new("Module size estimation") @@ -20,6 +19,8 @@ pub fn main() { ) .get_matches(); + let engine = make_engine(None, &[]); + // File let path: &String = matches.get_one("WASM").expect("Error parsing file name"); let mut file = File::open(path).unwrap(); @@ -35,14 +36,14 @@ pub fn main() { println!("wasm size: {wasm_size} bytes"); // Compile module - let module = module_compile(&wasm); + let module = compile(&engine, &wasm).unwrap(); mem::drop(wasm); let serialized = module.serialize().unwrap(); mem::drop(module); // Deserialize module - let module = module_deserialize(&serialized); + let module = module_deserialize(&engine, &serialized); mem::drop(serialized); // Report (serialized) module size @@ -57,14 +58,6 @@ pub fn main() { } #[inline(never)] -fn module_compile(wasm: &[u8]) -> Module { - let (_engine, module) = compile(wasm, &[]).unwrap(); - module -} - -#[inline(never)] -fn module_deserialize(serialized: &[u8]) -> Module { - // Deserialize using make_engine() - let engine = make_engine(None, &[]); +fn module_deserialize(engine: &Engine, serialized: &[u8]) -> Module { unsafe { Module::deserialize(&engine, serialized) }.unwrap() } diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 93d4d1dec2..bb322afe5c 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -16,7 +16,7 @@ use crate::instance::{Instance, InstanceOptions}; use crate::modules::{CachedModule, FileSystemCache, InMemoryCache, PinnedMemoryCache}; use crate::size::Size; use crate::static_analysis::{deserialize_wasm, has_ibc_entry_points}; -use crate::wasm_backend::{compile, make_engine}; +use crate::wasm_backend::make_engine; const STATE_DIR: &str = "state"; // Things related to the state of the blockchain. @@ -193,9 +193,8 @@ where /// When a Wasm blob is stored which was previously checked (e.g. as part of state sync), /// use this function. pub fn save_wasm_unchecked(&self, wasm: &[u8]) -> VmResult { - let (_engine, module) = compile(wasm, &[])?; - let mut cache = self.inner.lock().unwrap(); + let module = Module::new(&cache.engine, wasm)?; let checksum = save_wasm_to_disk(&cache.wasm_path, wasm)?; cache.fs_cache.store(&checksum, &module)?; Ok(checksum) @@ -280,9 +279,9 @@ where } // Re-compile from original Wasm bytecode - let code = self.load_wasm_with_path(&cache.wasm_path, checksum)?; + let wasm = self.load_wasm_with_path(&cache.wasm_path, checksum)?; cache.stats.misses = cache.stats.misses.saturating_add(1); - let (_engine, module) = compile(&code, &[])?; + let module = Module::new(&cache.engine, wasm)?; // Store into the fs cache too let module_size = cache.fs_cache.store(checksum, &module)?; cache diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index 202cedd99a..b7d467e9de 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -446,11 +446,11 @@ mod tests { use crate::errors::VmError; use crate::size::Size; use crate::testing::{MockApi, MockQuerier, MockStorage}; - use crate::wasm_backend::{compile, make_store_with_engine}; + use crate::wasm_backend::make_engine; use cosmwasm_std::{ coins, from_binary, to_vec, AllBalanceResponse, BankQuery, Empty, QueryRequest, }; - use wasmer::{imports, Function, Instance as WasmerInstance, Store}; + use wasmer::{imports, Function, Instance as WasmerInstance, Module, Store}; static CONTRACT: &[u8] = include_bytes!("../testdata/hackatom.wasm"); @@ -475,8 +475,9 @@ mod tests { ) { let env = Environment::new(MockApi::default(), gas_limit); - let (engine, module) = compile(CONTRACT, &[]).unwrap(); - let mut store = make_store_with_engine(engine, TESTING_MEMORY_LIMIT); + let engine = make_engine(TESTING_MEMORY_LIMIT, &[]); + let module = Module::new(&engine, CONTRACT).unwrap(); + let mut store = Store::new(engine); // we need stubs for all required imports let import_obj = imports! { diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index d9769d7861..ba257e6fbd 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -578,12 +578,12 @@ mod tests { }; use hex_literal::hex; use std::ptr::NonNull; - use wasmer::{imports, Function, FunctionEnv, Instance as WasmerInstance, Store}; + use wasmer::{imports, Function, FunctionEnv, Instance as WasmerInstance, Module, Store}; use crate::backend::{BackendError, Storage}; use crate::size::Size; use crate::testing::{MockApi, MockQuerier, MockStorage}; - use crate::wasm_backend::{compile, make_store_with_engine}; + use crate::wasm_backend::make_engine; static CONTRACT: &[u8] = include_bytes!("../testdata/hackatom.wasm"); @@ -620,8 +620,9 @@ mod tests { let gas_limit = TESTING_GAS_LIMIT; let env = Environment::new(api, gas_limit); - let (engine, module) = compile(CONTRACT, &[]).unwrap(); - let mut store = make_store_with_engine(engine, TESTING_MEMORY_LIMIT); + let engine = make_engine(TESTING_MEMORY_LIMIT, &[]); + let module = Module::new(&engine, CONTRACT).unwrap(); + let mut store = Store::new(engine); let fe = FunctionEnv::new(&mut store, env); diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index f2ea0335f7..31565bede6 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -495,7 +495,7 @@ mod tests { mock_instance_with_balances, mock_instance_with_failing_api, mock_instance_with_gas_limit, mock_instance_with_options, MockInstanceOptions, }; - use crate::wasm_backend::{compile, make_store_with_engine}; + use crate::wasm_backend::make_store_with_engine; use cosmwasm_std::{ coin, coins, from_binary, AllBalanceResponse, BalanceResponse, BankQuery, Empty, QueryRequest, @@ -592,6 +592,8 @@ mod tests { #[test] fn extra_imports_get_added() { + let engine = make_engine(mock_instance_options().1, &[]); + let wasm = wat::parse_str( r#"(module (import "foo" "bar" (func $bar)) @@ -604,7 +606,7 @@ mod tests { let backend = mock_backend(&[]); let (instance_options, memory_limit) = mock_instance_options(); - let (engine, module) = compile(&wasm, &[]).unwrap(); + let module = Module::new(&engine, wasm).unwrap(); let mut store = make_store_with_engine(engine, memory_limit); let called = Arc::new(AtomicBool::new(false)); diff --git a/packages/vm/src/modules/versioning.rs b/packages/vm/src/modules/versioning.rs index 6b1984c89d..47e9bb7c5e 100644 --- a/packages/vm/src/modules/versioning.rs +++ b/packages/vm/src/modules/versioning.rs @@ -1,4 +1,6 @@ -use crate::wasm_backend::compile; +use wasmer::Module; + +use crate::wasm_backend::make_engine; /// This header prefix contains the module type (wasmer-universal) and /// the magic value WASMER\0\0. @@ -12,7 +14,9 @@ const METADATA_HEADER_LEN: usize = 16; // https://github.com/wasmerio/wasmer/blo fn current_wasmer_module_header() -> Vec { // echo "(module)" > my.wat && wat2wasm my.wat && hexdump -C my.wasm const WASM: &[u8] = b"\x00\x61\x73\x6d\x01\x00\x00\x00"; - let (_, module) = compile(WASM, &[]).unwrap(); + let engine = make_engine(None, &[]); + let module = Module::new(&engine, WASM).unwrap(); + let mut bytes = module.serialize().unwrap_or_default(); bytes.truncate(ENGINE_TYPE_LEN + METADATA_HEADER_LEN); diff --git a/packages/vm/src/wasm_backend/compile.rs b/packages/vm/src/wasm_backend/compile.rs index 12df3a5b5a..392403dca4 100644 --- a/packages/vm/src/wasm_backend/compile.rs +++ b/packages/vm/src/wasm_backend/compile.rs @@ -1,29 +1,24 @@ -use std::sync::Arc; - -use wasmer::{Engine, Module, ModuleMiddleware}; +use wasmer::{Engine, Module}; use crate::errors::VmResult; -use crate::wasm_backend::make_engine; /// Compiles a given Wasm bytecode into a module. -pub fn compile( - code: &[u8], - middlewares: &[Arc], -) -> VmResult<(Engine, Module)> { - let engine = make_engine(None, middlewares); +pub fn compile(engine: &Engine, code: &[u8]) -> VmResult { let module = Module::new(&engine, code)?; - Ok((engine, module)) + Ok(module) } #[cfg(test)] mod tests { use super::*; + use crate::wasm_backend::make_engine; static CONTRACT: &[u8] = include_bytes!("../../testdata/floaty.wasm"); #[test] fn contract_with_floats_fails_check() { - let err = compile(CONTRACT, &[]).unwrap_err(); + let engine = make_engine(None, &[]); + let err = compile(&engine, CONTRACT).unwrap_err(); assert!(err.to_string().contains("Float operator detected:")); } } From 3180fe7e4171fb5ff3c08fd9b0473bd31dbcee62 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 27 Jun 2023 17:28:44 +0200 Subject: [PATCH 0533/2372] Remove make_runtime_store/make_store_with_engine --- packages/vm/src/instance.rs | 7 ++- packages/vm/src/lib.rs | 2 - packages/vm/src/wasm_backend/mod.rs | 2 - packages/vm/src/wasm_backend/store.rs | 76 --------------------------- 4 files changed, 3 insertions(+), 84 deletions(-) diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 31565bede6..86e505c417 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -495,7 +495,6 @@ mod tests { mock_instance_with_balances, mock_instance_with_failing_api, mock_instance_with_gas_limit, mock_instance_with_options, MockInstanceOptions, }; - use crate::wasm_backend::make_store_with_engine; use cosmwasm_std::{ coin, coins, from_binary, AllBalanceResponse, BalanceResponse, BankQuery, Empty, QueryRequest, @@ -592,7 +591,8 @@ mod tests { #[test] fn extra_imports_get_added() { - let engine = make_engine(mock_instance_options().1, &[]); + let (instance_options, memory_limit) = mock_instance_options(); + let engine = make_engine(memory_limit, &[]); let wasm = wat::parse_str( r#"(module @@ -605,9 +605,8 @@ mod tests { .unwrap(); let backend = mock_backend(&[]); - let (instance_options, memory_limit) = mock_instance_options(); let module = Module::new(&engine, wasm).unwrap(); - let mut store = make_store_with_engine(engine, memory_limit); + let mut store = Store::new(engine); let called = Arc::new(AtomicBool::new(false)); diff --git a/packages/vm/src/lib.rs b/packages/vm/src/lib.rs index 88b5b325ac..c3b467f3a3 100644 --- a/packages/vm/src/lib.rs +++ b/packages/vm/src/lib.rs @@ -58,7 +58,5 @@ pub mod internals { pub use crate::compatibility::check_wasm; pub use crate::instance::instance_from_module; - #[cfg(test)] - pub use crate::wasm_backend::make_runtime_store; pub use crate::wasm_backend::{compile, make_engine}; } diff --git a/packages/vm/src/wasm_backend/mod.rs b/packages/vm/src/wasm_backend/mod.rs index b84223e0b1..8e7583fb8d 100644 --- a/packages/vm/src/wasm_backend/mod.rs +++ b/packages/vm/src/wasm_backend/mod.rs @@ -6,5 +6,3 @@ mod store; pub use compile::compile; pub use limiting_tunables::LimitingTunables; pub use store::make_engine; -#[cfg(test)] -pub use store::{make_runtime_store, make_store_with_engine}; diff --git a/packages/vm/src/wasm_backend/store.rs b/packages/vm/src/wasm_backend/store.rs index 715ac33b23..deb7118b7c 100644 --- a/packages/vm/src/wasm_backend/store.rs +++ b/packages/vm/src/wasm_backend/store.rs @@ -4,8 +4,6 @@ use wasmer::Cranelift; use wasmer::NativeEngineExt; #[cfg(not(feature = "cranelift"))] use wasmer::Singlepass; -#[cfg(test)] -use wasmer::Store; use wasmer::{ wasmparser::Operator, BaseTunables, CompilerConfig, Engine, ModuleMiddleware, Pages, Target, WASM_PAGE_SIZE, @@ -62,28 +60,6 @@ pub fn make_engine( engine } -/// Created a store with no compiler and the given memory limit (in bytes) -/// If memory_limit is None, no limit is applied. -/// -/// Used for testing only. -#[cfg(test)] -pub fn make_runtime_store(memory_limit: Option) -> Store { - let engine = Engine::headless(); - make_store_with_engine(engine, memory_limit) -} - -/// Creates a store from an engine and an optional memory limit. -/// If no limit is set, the no custom tunables will be used. -#[cfg(test)] -pub fn make_store_with_engine(mut engine: Engine, memory_limit: Option) -> Store { - if let Some(limit) = memory_limit { - let base = BaseTunables::for_target(&Target::default()); - let tunables = LimitingTunables::new(base, limit_to_pages(limit)); - engine.set_tunables(tunables); - } - Store::new(engine) -} - fn limit_to_pages(limit: Size) -> Pages { // round down to ensure the limit is less than or equal to the config let limit_in_pages: usize = limit.0 / WASM_PAGE_SIZE; @@ -101,13 +77,6 @@ fn limit_to_pages(limit: Size) -> Pages { #[cfg(test)] mod tests { use super::*; - use wasmer::{Imports, Instance, Memory, Module}; - - /// A Wasm module with an exported memory (min: 4 pages, max: none) - const EXPORTED_MEMORY_WAT: &str = r#"(module - (memory 4) - (export "memory" (memory 0)) - )"#; #[test] fn limit_to_pages_works() { @@ -124,49 +93,4 @@ mod tests { assert_eq!(limit_to_pages(Size::gibi(5)), Pages(65536)); assert_eq!(limit_to_pages(Size(usize::MAX)), Pages(65536)); } - - #[test] - fn make_runtime_store_applies_memory_limit() { - // Compile - let serialized = { - let wasm = wat::parse_str(EXPORTED_MEMORY_WAT).unwrap(); - let store = make_engine(None, &[]); - let module = Module::new(&store, wasm).unwrap(); - module.serialize().unwrap() - }; - - // No limit - let mut store = make_runtime_store(None); - let module = unsafe { Module::deserialize(&store, serialized.clone()) }.unwrap(); - let module_memory = module.info().memories.last().unwrap(); - assert_eq!(module_memory.minimum, Pages(4)); - assert_eq!(module_memory.maximum, None); - let instance = Instance::new(&mut store, &module, &Imports::new()).unwrap(); - let instance_memory: Memory = instance - .exports - .iter() - .memories() - .map(|pair| pair.1.clone()) - .next() - .unwrap(); - assert_eq!(instance_memory.ty(&store).minimum, Pages(4)); - assert_eq!(instance_memory.ty(&store).maximum, None); - - // Instantiate with limit - let mut store = make_runtime_store(Some(Size::kibi(23 * 64))); - let module = unsafe { Module::deserialize(&store, serialized) }.unwrap(); - let module_memory = module.info().memories.last().unwrap(); - assert_eq!(module_memory.minimum, Pages(4)); - assert_eq!(module_memory.maximum, None); - let instance = Instance::new(&mut store, &module, &Imports::new()).unwrap(); - let instance_memory: Memory = instance - .exports - .iter() - .memories() - .map(|pair| pair.1.clone()) - .next() - .unwrap(); - assert_eq!(instance_memory.ty(&store).minimum, Pages(4)); - assert_eq!(instance_memory.ty(&store).maximum, Some(Pages(23))); - } } From f9bcc0b5326b219e1244a71aa98aab5fcb39693b Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 28 Jun 2023 15:20:18 +0200 Subject: [PATCH 0534/2372] Create new engines for each compilation --- packages/vm/src/cache.rs | 7 +++-- packages/vm/src/lib.rs | 2 +- packages/vm/src/modules/in_memory_cache.rs | 25 +++++++++------- .../vm/src/modules/pinned_memory_cache.rs | 15 +++++----- packages/vm/src/wasm_backend/mod.rs | 2 +- packages/vm/src/wasm_backend/store.rs | 29 +++++++++++++++++++ 6 files changed, 58 insertions(+), 22 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index bb322afe5c..f63cd8c32f 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -16,7 +16,7 @@ use crate::instance::{Instance, InstanceOptions}; use crate::modules::{CachedModule, FileSystemCache, InMemoryCache, PinnedMemoryCache}; use crate::size::Size; use crate::static_analysis::{deserialize_wasm, has_ibc_entry_points}; -use crate::wasm_backend::make_engine; +use crate::wasm_backend::{make_compiling_engine, make_engine}; const STATE_DIR: &str = "state"; // Things related to the state of the blockchain. @@ -193,8 +193,11 @@ where /// When a Wasm blob is stored which was previously checked (e.g. as part of state sync), /// use this function. pub fn save_wasm_unchecked(&self, wasm: &[u8]) -> VmResult { + // We need a new engine for each Wasm -> module compilation due to the metering middleware. + let compiling_engine = make_compiling_engine(None, &[]); + let module = Module::new(&compiling_engine, wasm)?; + let mut cache = self.inner.lock().unwrap(); - let module = Module::new(&cache.engine, wasm)?; let checksum = save_wasm_to_disk(&cache.wasm_path, wasm)?; cache.fs_cache.store(&checksum, &module)?; Ok(checksum) diff --git a/packages/vm/src/lib.rs b/packages/vm/src/lib.rs index c3b467f3a3..3206e5605b 100644 --- a/packages/vm/src/lib.rs +++ b/packages/vm/src/lib.rs @@ -58,5 +58,5 @@ pub mod internals { pub use crate::compatibility::check_wasm; pub use crate::instance::instance_from_module; - pub use crate::wasm_backend::{compile, make_engine}; + pub use crate::wasm_backend::{compile, make_compiling_engine, make_engine}; } diff --git a/packages/vm/src/modules/in_memory_cache.rs b/packages/vm/src/modules/in_memory_cache.rs index bbc9ed0589..35a4cb8eee 100644 --- a/packages/vm/src/modules/in_memory_cache.rs +++ b/packages/vm/src/modules/in_memory_cache.rs @@ -99,8 +99,7 @@ impl InMemoryCache { #[cfg(test)] mod tests { use super::*; - use crate::size::Size; - use crate::wasm_backend::make_engine; + use crate::{size::Size, wasm_backend::make_compiling_engine}; use std::mem; use wasmer::{imports, Instance as WasmerInstance, Store}; use wasmer_middlewares::metering::set_remaining_points; @@ -125,7 +124,6 @@ mod tests { #[test] fn in_memory_cache_run() { - let engine = make_engine(TESTING_MEMORY_LIMIT, &[]); let mut cache = InMemoryCache::new(Size::mebi(200)); // Create module @@ -146,6 +144,7 @@ mod tests { assert!(cache_entry.is_none()); // Compile module + let engine = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); let original = Module::new(&engine, &wasm).unwrap(); // Ensure original module can be executed @@ -178,7 +177,6 @@ mod tests { #[test] fn len_works() { - let engine = make_engine(TESTING_MEMORY_LIMIT, &[]); let mut cache = InMemoryCache::new(Size::mebi(2)); // Create module @@ -219,24 +217,26 @@ mod tests { assert_eq!(cache.len(), 0); // Add 1 - let module = Module::new(&engine, &wasm1).unwrap(); + let engine1 = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let module = Module::new(&engine1, &wasm1).unwrap(); cache.store(&checksum1, module, 900_000).unwrap(); assert_eq!(cache.len(), 1); // Add 2 - let module = Module::new(&engine, &wasm2).unwrap(); + let engine2 = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let module = Module::new(&engine2, &wasm2).unwrap(); cache.store(&checksum2, module, 900_000).unwrap(); assert_eq!(cache.len(), 2); // Add 3 (pushes out the previous two) - let module = Module::new(&engine, &wasm3).unwrap(); + let engine3 = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let module = Module::new(&engine3, &wasm3).unwrap(); cache.store(&checksum3, module, 1_500_000).unwrap(); assert_eq!(cache.len(), 1); } #[test] fn size_works() { - let engine = make_engine(TESTING_MEMORY_LIMIT, &[]); let mut cache = InMemoryCache::new(Size::mebi(2)); // Create module @@ -277,17 +277,20 @@ mod tests { assert_eq!(cache.size(), 0); // Add 1 - let module = Module::new(&engine, &wasm1).unwrap(); + let engine1 = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let module = Module::new(&engine1, &wasm1).unwrap(); cache.store(&checksum1, module, 900_000).unwrap(); assert_eq!(cache.size(), 900_000); // Add 2 - let module = Module::new(&engine, &wasm2).unwrap(); + let engine2 = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let module = Module::new(&engine2, &wasm2).unwrap(); cache.store(&checksum2, module, 800_000).unwrap(); assert_eq!(cache.size(), 1_700_000); // Add 3 (pushes out the previous two) - let module = Module::new(&engine, &wasm3).unwrap(); + let engine3 = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let module = Module::new(&engine3, &wasm3).unwrap(); cache.store(&checksum3, module, 1_500_000).unwrap(); assert_eq!(cache.size(), 1_500_000); } diff --git a/packages/vm/src/modules/pinned_memory_cache.rs b/packages/vm/src/modules/pinned_memory_cache.rs index 5aaffc1ce8..d0b2239511 100644 --- a/packages/vm/src/modules/pinned_memory_cache.rs +++ b/packages/vm/src/modules/pinned_memory_cache.rs @@ -65,7 +65,7 @@ impl PinnedMemoryCache { #[cfg(test)] mod tests { use super::*; - use crate::{wasm_backend::make_engine, Size}; + use crate::{wasm_backend::make_compiling_engine, Size}; use wasmer::{imports, Instance as WasmerInstance, Store}; use wasmer_middlewares::metering::set_remaining_points; @@ -74,7 +74,6 @@ mod tests { #[test] fn pinned_memory_cache_run() { - let engine = make_engine(TESTING_MEMORY_LIMIT, &[]); let mut cache = PinnedMemoryCache::new(); // Create module @@ -95,6 +94,7 @@ mod tests { assert!(cache_entry.is_none()); // Compile module + let engine = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); let original = Module::new(&engine, &wasm).unwrap(); // Ensure original module can be executed @@ -126,7 +126,6 @@ mod tests { #[test] fn has_works() { - let engine = make_engine(TESTING_MEMORY_LIMIT, &[]); let mut cache = PinnedMemoryCache::new(); // Create module @@ -145,6 +144,7 @@ mod tests { assert!(!cache.has(&checksum)); // Add + let engine = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); let original = Module::new(&engine, &wasm).unwrap(); cache.store(&checksum, original, 0).unwrap(); @@ -158,7 +158,6 @@ mod tests { #[test] fn len_works() { - let engine = make_engine(TESTING_MEMORY_LIMIT, &[]); let mut cache = PinnedMemoryCache::new(); // Create module @@ -177,6 +176,7 @@ mod tests { assert_eq!(cache.len(), 0); // Add + let engine = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); let original = Module::new(&engine, &wasm).unwrap(); cache.store(&checksum, original, 0).unwrap(); @@ -190,7 +190,6 @@ mod tests { #[test] fn size_works() { - let engine = make_engine(TESTING_MEMORY_LIMIT, &[]); let mut cache = PinnedMemoryCache::new(); // Create module @@ -220,12 +219,14 @@ mod tests { assert_eq!(cache.size(), 0); // Add 1 - let module = Module::new(&engine, &wasm1).unwrap(); + let engine1 = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let module = Module::new(&engine1, &wasm1).unwrap(); cache.store(&checksum1, module, 500).unwrap(); assert_eq!(cache.size(), 500); // Add 2 - let module = Module::new(&engine, &wasm2).unwrap(); + let engine2 = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let module = Module::new(&engine2, &wasm2).unwrap(); cache.store(&checksum2, module, 300).unwrap(); assert_eq!(cache.size(), 800); diff --git a/packages/vm/src/wasm_backend/mod.rs b/packages/vm/src/wasm_backend/mod.rs index 8e7583fb8d..a570eb209d 100644 --- a/packages/vm/src/wasm_backend/mod.rs +++ b/packages/vm/src/wasm_backend/mod.rs @@ -5,4 +5,4 @@ mod store; pub use compile::compile; pub use limiting_tunables::LimitingTunables; -pub use store::make_engine; +pub use store::{make_compiling_engine, make_engine}; diff --git a/packages/vm/src/wasm_backend/store.rs b/packages/vm/src/wasm_backend/store.rs index deb7118b7c..4cd578d673 100644 --- a/packages/vm/src/wasm_backend/store.rs +++ b/packages/vm/src/wasm_backend/store.rs @@ -60,6 +60,35 @@ pub fn make_engine( engine } +/// Creates an Engine with a compiler attached. Use this when compiling Wasm to a module. +pub fn make_compiling_engine( + memory_limit: Option, + middlewares: &[Arc], +) -> Engine { + let gas_limit = 0; + let deterministic = Arc::new(Gatekeeper::default()); + let metering = Arc::new(Metering::new(gas_limit, cost)); + + #[cfg(feature = "cranelift")] + let mut compiler = Cranelift::default(); + + #[cfg(not(feature = "cranelift"))] + let mut compiler = Singlepass::default(); + + for middleware in middlewares { + compiler.push_middleware(middleware.clone()); + } + compiler.push_middleware(deterministic); + compiler.push_middleware(metering); + let mut engine = Engine::from(compiler); + if let Some(limit) = memory_limit { + let base = BaseTunables::for_target(&Target::default()); + let tunables = LimitingTunables::new(base, limit_to_pages(limit)); + engine.set_tunables(tunables); + } + engine +} + fn limit_to_pages(limit: Size) -> Pages { // round down to ensure the limit is less than or equal to the config let limit_in_pages: usize = limit.0 / WASM_PAGE_SIZE; From 0fa5362c1435ff9bdeb65897f0d78ba0b9b392fd Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 5 Jul 2023 12:12:07 +0200 Subject: [PATCH 0535/2372] Migrate make_engine to make_runtime_engine --- packages/check/src/main.rs | 4 +-- packages/vm/examples/module_size.rs | 5 ++-- packages/vm/src/cache.rs | 24 +++++++++-------- packages/vm/src/environment.rs | 4 +-- packages/vm/src/imports.rs | 4 +-- packages/vm/src/instance.rs | 6 ++--- packages/vm/src/lib.rs | 2 +- packages/vm/src/modules/file_system_cache.rs | 28 +++++++++++--------- packages/vm/src/modules/versioning.rs | 4 +-- packages/vm/src/wasm_backend/compile.rs | 4 +-- packages/vm/src/wasm_backend/mod.rs | 2 +- packages/vm/src/wasm_backend/store.rs | 25 +++-------------- 12 files changed, 50 insertions(+), 62 deletions(-) diff --git a/packages/check/src/main.rs b/packages/check/src/main.rs index 9fcfaef4be..df52d59c8e 100644 --- a/packages/check/src/main.rs +++ b/packages/check/src/main.rs @@ -8,7 +8,7 @@ use clap::{Arg, ArgAction, Command}; use colored::Colorize; use cosmwasm_vm::capabilities_from_csv; -use cosmwasm_vm::internals::{check_wasm, compile, make_engine}; +use cosmwasm_vm::internals::{check_wasm, compile, make_compiling_engine}; const DEFAULT_AVAILABLE_CAPABILITIES: &str = "iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2,cosmwasm_1_3"; @@ -99,7 +99,7 @@ fn check_contract( check_wasm(&wasm, available_capabilities)?; // Compile module - let engine = make_engine(None, &[]); + let engine = make_compiling_engine(None, &[]); let _module = compile(&engine, &wasm)?; Ok(()) diff --git a/packages/vm/examples/module_size.rs b/packages/vm/examples/module_size.rs index ac1b6ed9d2..23b510c78f 100644 --- a/packages/vm/examples/module_size.rs +++ b/packages/vm/examples/module_size.rs @@ -4,7 +4,7 @@ use std::mem; use clap::{Arg, Command}; -use cosmwasm_vm::internals::{compile, make_engine}; +use cosmwasm_vm::internals::{compile, make_compiling_engine}; use wasmer::{Engine, Module}; pub fn main() { @@ -19,8 +19,6 @@ pub fn main() { ) .get_matches(); - let engine = make_engine(None, &[]); - // File let path: &String = matches.get_one("WASM").expect("Error parsing file name"); let mut file = File::open(path).unwrap(); @@ -36,6 +34,7 @@ pub fn main() { println!("wasm size: {wasm_size} bytes"); // Compile module + let engine = make_compiling_engine(None, &[]); let module = compile(&engine, &wasm).unwrap(); mem::drop(wasm); diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index f63cd8c32f..ee17515993 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -16,7 +16,7 @@ use crate::instance::{Instance, InstanceOptions}; use crate::modules::{CachedModule, FileSystemCache, InMemoryCache, PinnedMemoryCache}; use crate::size::Size; use crate::static_analysis::{deserialize_wasm, has_ibc_entry_points}; -use crate::wasm_backend::{make_compiling_engine, make_engine}; +use crate::wasm_backend::{make_compiling_engine, make_runtime_engine}; const STATE_DIR: &str = "state"; // Things related to the state of the blockchain. @@ -74,7 +74,7 @@ pub struct CacheInner { memory_cache: InMemoryCache, fs_cache: FileSystemCache, stats: Stats, - engine: Engine, + runtime_engine: Engine, } pub struct Cache { @@ -138,7 +138,7 @@ where memory_cache: InMemoryCache::new(memory_cache_size), fs_cache, stats: Stats::default(), - engine: make_engine(Some(instance_memory_limit), &[]), + runtime_engine: make_runtime_engine(Some(instance_memory_limit)), }), type_storage: PhantomData::, type_api: PhantomData::, @@ -274,7 +274,7 @@ where // for a not-so-relevant use case. // Try to get module from file system cache - if let Some((module, module_size)) = cache.fs_cache.load(checksum, &cache.engine)? { + if let Some((module, module_size)) = cache.fs_cache.load(checksum, &cache.runtime_engine)? { cache.stats.hits_fs_cache = cache.stats.hits_fs_cache.saturating_add(1); return cache .pinned_memory_cache @@ -284,7 +284,8 @@ where // Re-compile from original Wasm bytecode let wasm = self.load_wasm_with_path(&cache.wasm_path, checksum)?; cache.stats.misses = cache.stats.misses.saturating_add(1); - let module = Module::new(&cache.engine, wasm)?; + // TODO: this code is not covered by tests. Otherwise it would fail. + let module = Module::new(&cache.runtime_engine, wasm)?; // Store into the fs cache too let module_size = cache.fs_cache.store(checksum, &module)?; cache @@ -335,19 +336,19 @@ where if let Some(element) = cache.pinned_memory_cache.load(checksum)? { cache.stats.hits_pinned_memory_cache = cache.stats.hits_pinned_memory_cache.saturating_add(1); - let store = Store::new(cache.engine.clone()); + let store = Store::new(cache.runtime_engine.clone()); return Ok((element, store, cache.instance_memory_limit, true)); } // Get module from memory cache if let Some(element) = cache.memory_cache.load(checksum)? { cache.stats.hits_memory_cache = cache.stats.hits_memory_cache.saturating_add(1); - let store = Store::new(cache.engine.clone()); + let store = Store::new(cache.runtime_engine.clone()); return Ok((element, store, cache.instance_memory_limit, false)); } // Get module from file system cache - if let Some((module, module_size)) = cache.fs_cache.load(checksum, &cache.engine)? { + if let Some((module, module_size)) = cache.fs_cache.load(checksum, &cache.runtime_engine)? { cache.stats.hits_fs_cache = cache.stats.hits_fs_cache.saturating_add(1); cache @@ -357,7 +358,7 @@ where module, size: module_size, }; - let store = Store::new(cache.engine.clone()); + let store = Store::new(cache.runtime_engine.clone()); return Ok((cached, store, cache.instance_memory_limit, false)); } @@ -368,7 +369,8 @@ where // stored the old module format. let wasm = self.load_wasm_with_path(&cache.wasm_path, checksum)?; cache.stats.misses = cache.stats.misses.saturating_add(1); - let module = Module::new(&cache.engine, wasm)?; + // TODO: this code is not covered by tests. Otherwise it would fail. + let module = Module::new(&cache.runtime_engine, wasm)?; let module_size = cache.fs_cache.store(checksum, &module)?; cache @@ -378,7 +380,7 @@ where module, size: module_size, }; - let store = Store::new(cache.engine.clone()); + let store = Store::new(cache.runtime_engine.clone()); Ok((cached, store, cache.instance_memory_limit, false)) } } diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index b7d467e9de..b78683cbbb 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -446,7 +446,7 @@ mod tests { use crate::errors::VmError; use crate::size::Size; use crate::testing::{MockApi, MockQuerier, MockStorage}; - use crate::wasm_backend::make_engine; + use crate::wasm_backend::make_compiling_engine; use cosmwasm_std::{ coins, from_binary, to_vec, AllBalanceResponse, BankQuery, Empty, QueryRequest, }; @@ -475,7 +475,7 @@ mod tests { ) { let env = Environment::new(MockApi::default(), gas_limit); - let engine = make_engine(TESTING_MEMORY_LIMIT, &[]); + let engine = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); let module = Module::new(&engine, CONTRACT).unwrap(); let mut store = Store::new(engine); diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index ba257e6fbd..430fff68f0 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -583,7 +583,7 @@ mod tests { use crate::backend::{BackendError, Storage}; use crate::size::Size; use crate::testing::{MockApi, MockQuerier, MockStorage}; - use crate::wasm_backend::make_engine; + use crate::wasm_backend::make_compiling_engine; static CONTRACT: &[u8] = include_bytes!("../testdata/hackatom.wasm"); @@ -620,7 +620,7 @@ mod tests { let gas_limit = TESTING_GAS_LIMIT; let env = Environment::new(api, gas_limit); - let engine = make_engine(TESTING_MEMORY_LIMIT, &[]); + let engine = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); let module = Module::new(&engine, CONTRACT).unwrap(); let mut store = Store::new(engine); diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 86e505c417..7fbf2ebfa6 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -22,7 +22,7 @@ use crate::imports::{ use crate::imports::{do_db_next, do_db_scan}; use crate::memory::{read_region, write_region}; use crate::size::Size; -use crate::wasm_backend::make_engine; +use crate::wasm_backend::make_compiling_engine; pub use crate::environment::DebugInfo; // Re-exported as public via to be usable for set_debug_handler @@ -71,7 +71,7 @@ where options: InstanceOptions, memory_limit: Option, ) -> VmResult { - let engine = make_engine(memory_limit, &[]); + let engine = make_compiling_engine(memory_limit, &[]); let module = Module::new(&engine, code)?; let store = Store::new(engine); Instance::from_module( @@ -592,7 +592,6 @@ mod tests { #[test] fn extra_imports_get_added() { let (instance_options, memory_limit) = mock_instance_options(); - let engine = make_engine(memory_limit, &[]); let wasm = wat::parse_str( r#"(module @@ -605,6 +604,7 @@ mod tests { .unwrap(); let backend = mock_backend(&[]); + let engine = make_compiling_engine(memory_limit, &[]); let module = Module::new(&engine, wasm).unwrap(); let mut store = Store::new(engine); diff --git a/packages/vm/src/lib.rs b/packages/vm/src/lib.rs index 3206e5605b..af7ed2f519 100644 --- a/packages/vm/src/lib.rs +++ b/packages/vm/src/lib.rs @@ -58,5 +58,5 @@ pub mod internals { pub use crate::compatibility::check_wasm; pub use crate::instance::instance_from_module; - pub use crate::wasm_backend::{compile, make_compiling_engine, make_engine}; + pub use crate::wasm_backend::{compile, make_compiling_engine, make_runtime_engine}; } diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 6847ac2ea3..e5a5b169b8 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -212,8 +212,10 @@ mod tests { use std::fs; use super::*; - use crate::size::Size; - use crate::wasm_backend::make_engine; + use crate::{ + size::Size, + wasm_backend::{make_compiling_engine, make_runtime_engine}, + }; use tempfile::TempDir; use wasmer::{imports, Instance as WasmerInstance, Store}; use wasmer_middlewares::metering::set_remaining_points; @@ -231,7 +233,6 @@ mod tests { #[test] fn file_system_cache_run() { - let engine = make_engine(TESTING_MEMORY_LIMIT, &[]); let tmp_dir = TempDir::new().unwrap(); let mut cache = unsafe { FileSystemCache::new(tmp_dir.path(), false).unwrap() }; @@ -240,15 +241,17 @@ mod tests { let checksum = Checksum::generate(&wasm); // Module does not exist - let cached = cache.load(&checksum, &engine).unwrap(); + let runtime_engine = make_runtime_engine(TESTING_MEMORY_LIMIT); + let cached = cache.load(&checksum, &runtime_engine).unwrap(); assert!(cached.is_none()); // Store module - let module = Module::new(&engine, wasm).unwrap(); + let compiling_engine = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let module = Module::new(&compiling_engine, wasm).unwrap(); cache.store(&checksum, &module).unwrap(); // Load module - let cached = cache.load(&checksum, &engine).unwrap(); + let cached = cache.load(&checksum, &runtime_engine).unwrap(); assert!(cached.is_some()); // Check the returned module is functional. @@ -257,7 +260,7 @@ mod tests { let (cached_module, module_size) = cached.unwrap(); assert_eq!(module_size, module.serialize().unwrap().len()); let import_object = imports! {}; - let mut store = Store::new(engine); + let mut store = Store::new(runtime_engine); let instance = WasmerInstance::new(&mut store, &cached_module, &import_object).unwrap(); set_remaining_points(&mut store, &instance, TESTING_GAS_LIMIT); let add_one = instance.exports.get_function("add_one").unwrap(); @@ -268,7 +271,6 @@ mod tests { #[test] fn file_system_cache_store_uses_expected_path() { - let engine = make_engine(TESTING_MEMORY_LIMIT, &[]); let tmp_dir = TempDir::new().unwrap(); let mut cache = unsafe { FileSystemCache::new(tmp_dir.path(), false).unwrap() }; @@ -277,6 +279,7 @@ mod tests { let checksum = Checksum::generate(&wasm); // Store module + let engine = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); let module = Module::new(&engine, wasm).unwrap(); cache.store(&checksum, &module).unwrap(); @@ -292,7 +295,6 @@ mod tests { #[test] fn file_system_cache_remove_works() { - let engine = make_engine(TESTING_MEMORY_LIMIT, &[]); let tmp_dir = TempDir::new().unwrap(); let mut cache = unsafe { FileSystemCache::new(tmp_dir.path(), false).unwrap() }; @@ -301,18 +303,20 @@ mod tests { let checksum = Checksum::generate(&wasm); // Store module - let module = Module::new(&engine, wasm).unwrap(); + let engine1 = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let module = Module::new(&engine1, wasm).unwrap(); cache.store(&checksum, &module).unwrap(); // It's there - assert!(cache.load(&checksum, &engine).unwrap().is_some()); + let engine2 = make_runtime_engine(TESTING_MEMORY_LIMIT); + assert!(cache.load(&checksum, &engine2).unwrap().is_some()); // Remove module let existed = cache.remove(&checksum).unwrap(); assert!(existed); // it's gone now - assert!(cache.load(&checksum, &engine).unwrap().is_none()); + assert!(cache.load(&checksum, &engine2).unwrap().is_none()); // Remove again let existed = cache.remove(&checksum).unwrap(); diff --git a/packages/vm/src/modules/versioning.rs b/packages/vm/src/modules/versioning.rs index 47e9bb7c5e..69f2703380 100644 --- a/packages/vm/src/modules/versioning.rs +++ b/packages/vm/src/modules/versioning.rs @@ -1,6 +1,6 @@ use wasmer::Module; -use crate::wasm_backend::make_engine; +use crate::wasm_backend::make_compiling_engine; /// This header prefix contains the module type (wasmer-universal) and /// the magic value WASMER\0\0. @@ -14,7 +14,7 @@ const METADATA_HEADER_LEN: usize = 16; // https://github.com/wasmerio/wasmer/blo fn current_wasmer_module_header() -> Vec { // echo "(module)" > my.wat && wat2wasm my.wat && hexdump -C my.wasm const WASM: &[u8] = b"\x00\x61\x73\x6d\x01\x00\x00\x00"; - let engine = make_engine(None, &[]); + let engine = make_compiling_engine(None, &[]); let module = Module::new(&engine, WASM).unwrap(); let mut bytes = module.serialize().unwrap_or_default(); diff --git a/packages/vm/src/wasm_backend/compile.rs b/packages/vm/src/wasm_backend/compile.rs index 392403dca4..8dd7d45683 100644 --- a/packages/vm/src/wasm_backend/compile.rs +++ b/packages/vm/src/wasm_backend/compile.rs @@ -11,13 +11,13 @@ pub fn compile(engine: &Engine, code: &[u8]) -> VmResult { #[cfg(test)] mod tests { use super::*; - use crate::wasm_backend::make_engine; + use crate::wasm_backend::make_compiling_engine; static CONTRACT: &[u8] = include_bytes!("../../testdata/floaty.wasm"); #[test] fn contract_with_floats_fails_check() { - let engine = make_engine(None, &[]); + let engine = make_compiling_engine(None, &[]); let err = compile(&engine, CONTRACT).unwrap_err(); assert!(err.to_string().contains("Float operator detected:")); } diff --git a/packages/vm/src/wasm_backend/mod.rs b/packages/vm/src/wasm_backend/mod.rs index a570eb209d..eb4ac08e7f 100644 --- a/packages/vm/src/wasm_backend/mod.rs +++ b/packages/vm/src/wasm_backend/mod.rs @@ -5,4 +5,4 @@ mod store; pub use compile::compile; pub use limiting_tunables::LimitingTunables; -pub use store::{make_compiling_engine, make_engine}; +pub use store::{make_compiling_engine, make_runtime_engine}; diff --git a/packages/vm/src/wasm_backend/store.rs b/packages/vm/src/wasm_backend/store.rs index 4cd578d673..c04c24dbde 100644 --- a/packages/vm/src/wasm_backend/store.rs +++ b/packages/vm/src/wasm_backend/store.rs @@ -31,27 +31,10 @@ fn cost(_operator: &Operator) -> u64 { 150_000 } -/// Creates an engine with the default compiler. -pub fn make_engine( - memory_limit: Option, - middlewares: &[Arc], -) -> Engine { - let gas_limit = 0; - let deterministic = Arc::new(Gatekeeper::default()); - let metering = Arc::new(Metering::new(gas_limit, cost)); - - #[cfg(feature = "cranelift")] - let mut compiler = Cranelift::default(); - - #[cfg(not(feature = "cranelift"))] - let mut compiler = Singlepass::default(); - - for middleware in middlewares { - compiler.push_middleware(middleware.clone()); - } - compiler.push_middleware(deterministic); - compiler.push_middleware(metering); - let mut engine = Engine::from(compiler); +/// Creates an engine without a compiler. +/// This is used to run modules compiled before. +pub fn make_runtime_engine(memory_limit: Option) -> Engine { + let mut engine = Engine::headless(); if let Some(limit) = memory_limit { let base = BaseTunables::for_target(&Target::default()); let tunables = LimitingTunables::new(base, limit_to_pages(limit)); From 330f53f3f86d3af5dcc046a8fe9080be0a31ccbe Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 5 Jul 2023 20:24:02 +0200 Subject: [PATCH 0536/2372] Create new compiling engines when Wasm is recompiled --- packages/vm/src/cache.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index ee17515993..4441fb85af 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -284,8 +284,9 @@ where // Re-compile from original Wasm bytecode let wasm = self.load_wasm_with_path(&cache.wasm_path, checksum)?; cache.stats.misses = cache.stats.misses.saturating_add(1); - // TODO: this code is not covered by tests. Otherwise it would fail. - let module = Module::new(&cache.runtime_engine, wasm)?; + // Module will run with a different engine, so we can set memory limit to None + let engine = make_compiling_engine(None, &[]); + let module = Module::new(&engine, wasm)?; // Store into the fs cache too let module_size = cache.fs_cache.store(checksum, &module)?; cache @@ -369,8 +370,9 @@ where // stored the old module format. let wasm = self.load_wasm_with_path(&cache.wasm_path, checksum)?; cache.stats.misses = cache.stats.misses.saturating_add(1); - // TODO: this code is not covered by tests. Otherwise it would fail. - let module = Module::new(&cache.runtime_engine, wasm)?; + // Module will run with a different engine, so we can set memory limit to None + let engine = make_compiling_engine(None, &[]); + let module = Module::new(&engine, wasm)?; let module_size = cache.fs_cache.store(checksum, &module)?; cache From 6480054d39e0f241dd9678c265cce75c8b3e3381 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 5 Jul 2023 20:26:07 +0200 Subject: [PATCH 0537/2372] Remove some unused values --- packages/vm/src/cache.rs | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 4441fb85af..9973cd4766 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -67,9 +67,6 @@ pub struct CacheOptions { pub struct CacheInner { /// The directory in which the Wasm blobs are stored in the file system. wasm_path: PathBuf, - /// Instances memory limit in bytes. Use a value that is divisible by the Wasm page size 65536, - /// e.g. full MiBs. - instance_memory_limit: Size, pinned_memory_cache: PinnedMemoryCache, memory_cache: InMemoryCache, fs_cache: FileSystemCache, @@ -133,7 +130,6 @@ where available_capabilities, inner: Mutex::new(CacheInner { wasm_path, - instance_memory_limit, pinned_memory_cache: PinnedMemoryCache::new(), memory_cache: InMemoryCache::new(memory_cache_size), fs_cache, @@ -315,7 +311,7 @@ where backend: Backend, options: InstanceOptions, ) -> VmResult> { - let (cached, store, _memory_limit, _from_pinned) = self.get_module(checksum)?; + let (cached, store) = self.get_module(checksum)?; let instance = Instance::from_module( store, &cached.module, @@ -331,21 +327,21 @@ where /// Returns a module tied to a previously saved Wasm. /// Depending on availability, this is either generated from a memory cache, file system cache or Wasm code. /// This is part of `get_instance` but pulled out to reduce the locking time. - fn get_module(&self, checksum: &Checksum) -> VmResult<(CachedModule, Store, Size, bool)> { + fn get_module(&self, checksum: &Checksum) -> VmResult<(CachedModule, Store)> { let mut cache = self.inner.lock().unwrap(); // Try to get module from the pinned memory cache if let Some(element) = cache.pinned_memory_cache.load(checksum)? { cache.stats.hits_pinned_memory_cache = cache.stats.hits_pinned_memory_cache.saturating_add(1); let store = Store::new(cache.runtime_engine.clone()); - return Ok((element, store, cache.instance_memory_limit, true)); + return Ok((element, store)); } // Get module from memory cache if let Some(element) = cache.memory_cache.load(checksum)? { cache.stats.hits_memory_cache = cache.stats.hits_memory_cache.saturating_add(1); let store = Store::new(cache.runtime_engine.clone()); - return Ok((element, store, cache.instance_memory_limit, false)); + return Ok((element, store)); } // Get module from file system cache @@ -360,7 +356,7 @@ where size: module_size, }; let store = Store::new(cache.runtime_engine.clone()); - return Ok((cached, store, cache.instance_memory_limit, false)); + return Ok((cached, store)); } // Re-compile module from wasm @@ -383,7 +379,7 @@ where size: module_size, }; let store = Store::new(cache.runtime_engine.clone()); - Ok((cached, store, cache.instance_memory_limit, false)) + Ok((cached, store)) } } From 5c2032f327f025839d3a8e059266bc3724af75e5 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 5 Jul 2023 20:35:12 +0200 Subject: [PATCH 0538/2372] Add comment on runtime_engine --- packages/vm/src/cache.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 9973cd4766..668329bf0c 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -71,6 +71,16 @@ pub struct CacheInner { memory_cache: InMemoryCache, fs_cache: FileSystemCache, stats: Stats, + /// A single engine to execute all contracts in this cache instance (usually + /// this means all contracts in the process). + /// + /// This engine is headless, i.e. does not contain a Singlepass compiler. + /// It only executes modules compiled with other engines. + /// + /// The engine has one memory limit set which is the same for all contracts + /// running with it. If different memory limits would be needed for different + /// contracts at some point, we'd need multiple engines. This because the tubables + /// that control the limit are attached to the engine. runtime_engine: Engine, } From ec4ee776713a41d92058c57a375729d20ffd3766 Mon Sep 17 00:00:00 2001 From: Simon Warta <2603011+webmaster128@users.noreply.github.com> Date: Mon, 10 Jul 2023 10:47:51 +0200 Subject: [PATCH 0539/2372] Apply suggestions from code review Co-authored-by: Mauro Lacy --- packages/vm/src/cache.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 668329bf0c..b02b028a25 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -79,7 +79,7 @@ pub struct CacheInner { /// /// The engine has one memory limit set which is the same for all contracts /// running with it. If different memory limits would be needed for different - /// contracts at some point, we'd need multiple engines. This because the tubables + /// contracts at some point, we'd need multiple engines. This because the tunables /// that control the limit are attached to the engine. runtime_engine: Engine, } From 2d98110f1e71c9bdbb6351c93f5ffacb1fca20e8 Mon Sep 17 00:00:00 2001 From: Simon Warta <2603011+webmaster128@users.noreply.github.com> Date: Mon, 24 Jul 2023 09:01:27 +0200 Subject: [PATCH 0540/2372] Apply suggestions from code review Co-authored-by: Christoph Otter --- packages/vm/src/cache.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index b02b028a25..69090ea09b 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -79,7 +79,7 @@ pub struct CacheInner { /// /// The engine has one memory limit set which is the same for all contracts /// running with it. If different memory limits would be needed for different - /// contracts at some point, we'd need multiple engines. This because the tunables + /// contracts at some point, we'd need multiple engines. This is because the tunables /// that control the limit are attached to the engine. runtime_engine: Engine, } From 13f2373be145e9da70683ec07209c662e79f1e6d Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 24 Jul 2023 09:10:17 +0200 Subject: [PATCH 0541/2372] Remove extra middlewares feature --- packages/check/src/main.rs | 2 +- packages/vm/examples/module_size.rs | 2 +- packages/vm/src/cache.rs | 6 +++--- packages/vm/src/environment.rs | 2 +- packages/vm/src/imports.rs | 2 +- packages/vm/src/instance.rs | 4 ++-- packages/vm/src/modules/file_system_cache.rs | 6 +++--- packages/vm/src/modules/in_memory_cache.rs | 14 +++++++------- packages/vm/src/modules/pinned_memory_cache.rs | 10 +++++----- packages/vm/src/modules/versioning.rs | 2 +- packages/vm/src/wasm_backend/compile.rs | 2 +- packages/vm/src/wasm_backend/store.rs | 11 ++--------- 12 files changed, 28 insertions(+), 35 deletions(-) diff --git a/packages/check/src/main.rs b/packages/check/src/main.rs index df52d59c8e..6ba097470f 100644 --- a/packages/check/src/main.rs +++ b/packages/check/src/main.rs @@ -99,7 +99,7 @@ fn check_contract( check_wasm(&wasm, available_capabilities)?; // Compile module - let engine = make_compiling_engine(None, &[]); + let engine = make_compiling_engine(None); let _module = compile(&engine, &wasm)?; Ok(()) diff --git a/packages/vm/examples/module_size.rs b/packages/vm/examples/module_size.rs index 23b510c78f..9b1f1d973e 100644 --- a/packages/vm/examples/module_size.rs +++ b/packages/vm/examples/module_size.rs @@ -34,7 +34,7 @@ pub fn main() { println!("wasm size: {wasm_size} bytes"); // Compile module - let engine = make_compiling_engine(None, &[]); + let engine = make_compiling_engine(None); let module = compile(&engine, &wasm).unwrap(); mem::drop(wasm); diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 69090ea09b..b8ad348890 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -200,7 +200,7 @@ where /// use this function. pub fn save_wasm_unchecked(&self, wasm: &[u8]) -> VmResult { // We need a new engine for each Wasm -> module compilation due to the metering middleware. - let compiling_engine = make_compiling_engine(None, &[]); + let compiling_engine = make_compiling_engine(None); let module = Module::new(&compiling_engine, wasm)?; let mut cache = self.inner.lock().unwrap(); @@ -291,7 +291,7 @@ where let wasm = self.load_wasm_with_path(&cache.wasm_path, checksum)?; cache.stats.misses = cache.stats.misses.saturating_add(1); // Module will run with a different engine, so we can set memory limit to None - let engine = make_compiling_engine(None, &[]); + let engine = make_compiling_engine(None); let module = Module::new(&engine, wasm)?; // Store into the fs cache too let module_size = cache.fs_cache.store(checksum, &module)?; @@ -377,7 +377,7 @@ where let wasm = self.load_wasm_with_path(&cache.wasm_path, checksum)?; cache.stats.misses = cache.stats.misses.saturating_add(1); // Module will run with a different engine, so we can set memory limit to None - let engine = make_compiling_engine(None, &[]); + let engine = make_compiling_engine(None); let module = Module::new(&engine, wasm)?; let module_size = cache.fs_cache.store(checksum, &module)?; diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index b78683cbbb..4c767c2440 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -475,7 +475,7 @@ mod tests { ) { let env = Environment::new(MockApi::default(), gas_limit); - let engine = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let engine = make_compiling_engine(TESTING_MEMORY_LIMIT); let module = Module::new(&engine, CONTRACT).unwrap(); let mut store = Store::new(engine); diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 430fff68f0..da0dd205fc 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -620,7 +620,7 @@ mod tests { let gas_limit = TESTING_GAS_LIMIT; let env = Environment::new(api, gas_limit); - let engine = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let engine = make_compiling_engine(TESTING_MEMORY_LIMIT); let module = Module::new(&engine, CONTRACT).unwrap(); let mut store = Store::new(engine); diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 7fbf2ebfa6..bfd82e2c85 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -71,7 +71,7 @@ where options: InstanceOptions, memory_limit: Option, ) -> VmResult { - let engine = make_compiling_engine(memory_limit, &[]); + let engine = make_compiling_engine(memory_limit); let module = Module::new(&engine, code)?; let store = Store::new(engine); Instance::from_module( @@ -604,7 +604,7 @@ mod tests { .unwrap(); let backend = mock_backend(&[]); - let engine = make_compiling_engine(memory_limit, &[]); + let engine = make_compiling_engine(memory_limit); let module = Module::new(&engine, wasm).unwrap(); let mut store = Store::new(engine); diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index e5a5b169b8..1090fbec03 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -246,7 +246,7 @@ mod tests { assert!(cached.is_none()); // Store module - let compiling_engine = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let compiling_engine = make_compiling_engine(TESTING_MEMORY_LIMIT); let module = Module::new(&compiling_engine, wasm).unwrap(); cache.store(&checksum, &module).unwrap(); @@ -279,7 +279,7 @@ mod tests { let checksum = Checksum::generate(&wasm); // Store module - let engine = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let engine = make_compiling_engine(TESTING_MEMORY_LIMIT); let module = Module::new(&engine, wasm).unwrap(); cache.store(&checksum, &module).unwrap(); @@ -303,7 +303,7 @@ mod tests { let checksum = Checksum::generate(&wasm); // Store module - let engine1 = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let engine1 = make_compiling_engine(TESTING_MEMORY_LIMIT); let module = Module::new(&engine1, wasm).unwrap(); cache.store(&checksum, &module).unwrap(); diff --git a/packages/vm/src/modules/in_memory_cache.rs b/packages/vm/src/modules/in_memory_cache.rs index 35a4cb8eee..d44da26b13 100644 --- a/packages/vm/src/modules/in_memory_cache.rs +++ b/packages/vm/src/modules/in_memory_cache.rs @@ -144,7 +144,7 @@ mod tests { assert!(cache_entry.is_none()); // Compile module - let engine = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let engine = make_compiling_engine(TESTING_MEMORY_LIMIT); let original = Module::new(&engine, &wasm).unwrap(); // Ensure original module can be executed @@ -217,19 +217,19 @@ mod tests { assert_eq!(cache.len(), 0); // Add 1 - let engine1 = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let engine1 = make_compiling_engine(TESTING_MEMORY_LIMIT); let module = Module::new(&engine1, &wasm1).unwrap(); cache.store(&checksum1, module, 900_000).unwrap(); assert_eq!(cache.len(), 1); // Add 2 - let engine2 = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let engine2 = make_compiling_engine(TESTING_MEMORY_LIMIT); let module = Module::new(&engine2, &wasm2).unwrap(); cache.store(&checksum2, module, 900_000).unwrap(); assert_eq!(cache.len(), 2); // Add 3 (pushes out the previous two) - let engine3 = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let engine3 = make_compiling_engine(TESTING_MEMORY_LIMIT); let module = Module::new(&engine3, &wasm3).unwrap(); cache.store(&checksum3, module, 1_500_000).unwrap(); assert_eq!(cache.len(), 1); @@ -277,19 +277,19 @@ mod tests { assert_eq!(cache.size(), 0); // Add 1 - let engine1 = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let engine1 = make_compiling_engine(TESTING_MEMORY_LIMIT); let module = Module::new(&engine1, &wasm1).unwrap(); cache.store(&checksum1, module, 900_000).unwrap(); assert_eq!(cache.size(), 900_000); // Add 2 - let engine2 = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let engine2 = make_compiling_engine(TESTING_MEMORY_LIMIT); let module = Module::new(&engine2, &wasm2).unwrap(); cache.store(&checksum2, module, 800_000).unwrap(); assert_eq!(cache.size(), 1_700_000); // Add 3 (pushes out the previous two) - let engine3 = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let engine3 = make_compiling_engine(TESTING_MEMORY_LIMIT); let module = Module::new(&engine3, &wasm3).unwrap(); cache.store(&checksum3, module, 1_500_000).unwrap(); assert_eq!(cache.size(), 1_500_000); diff --git a/packages/vm/src/modules/pinned_memory_cache.rs b/packages/vm/src/modules/pinned_memory_cache.rs index d0b2239511..68ca5f9b79 100644 --- a/packages/vm/src/modules/pinned_memory_cache.rs +++ b/packages/vm/src/modules/pinned_memory_cache.rs @@ -94,7 +94,7 @@ mod tests { assert!(cache_entry.is_none()); // Compile module - let engine = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let engine = make_compiling_engine(TESTING_MEMORY_LIMIT); let original = Module::new(&engine, &wasm).unwrap(); // Ensure original module can be executed @@ -144,7 +144,7 @@ mod tests { assert!(!cache.has(&checksum)); // Add - let engine = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let engine = make_compiling_engine(TESTING_MEMORY_LIMIT); let original = Module::new(&engine, &wasm).unwrap(); cache.store(&checksum, original, 0).unwrap(); @@ -176,7 +176,7 @@ mod tests { assert_eq!(cache.len(), 0); // Add - let engine = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let engine = make_compiling_engine(TESTING_MEMORY_LIMIT); let original = Module::new(&engine, &wasm).unwrap(); cache.store(&checksum, original, 0).unwrap(); @@ -219,13 +219,13 @@ mod tests { assert_eq!(cache.size(), 0); // Add 1 - let engine1 = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let engine1 = make_compiling_engine(TESTING_MEMORY_LIMIT); let module = Module::new(&engine1, &wasm1).unwrap(); cache.store(&checksum1, module, 500).unwrap(); assert_eq!(cache.size(), 500); // Add 2 - let engine2 = make_compiling_engine(TESTING_MEMORY_LIMIT, &[]); + let engine2 = make_compiling_engine(TESTING_MEMORY_LIMIT); let module = Module::new(&engine2, &wasm2).unwrap(); cache.store(&checksum2, module, 300).unwrap(); assert_eq!(cache.size(), 800); diff --git a/packages/vm/src/modules/versioning.rs b/packages/vm/src/modules/versioning.rs index 69f2703380..ae804af7cb 100644 --- a/packages/vm/src/modules/versioning.rs +++ b/packages/vm/src/modules/versioning.rs @@ -14,7 +14,7 @@ const METADATA_HEADER_LEN: usize = 16; // https://github.com/wasmerio/wasmer/blo fn current_wasmer_module_header() -> Vec { // echo "(module)" > my.wat && wat2wasm my.wat && hexdump -C my.wasm const WASM: &[u8] = b"\x00\x61\x73\x6d\x01\x00\x00\x00"; - let engine = make_compiling_engine(None, &[]); + let engine = make_compiling_engine(None); let module = Module::new(&engine, WASM).unwrap(); let mut bytes = module.serialize().unwrap_or_default(); diff --git a/packages/vm/src/wasm_backend/compile.rs b/packages/vm/src/wasm_backend/compile.rs index 8dd7d45683..38fd4966d2 100644 --- a/packages/vm/src/wasm_backend/compile.rs +++ b/packages/vm/src/wasm_backend/compile.rs @@ -17,7 +17,7 @@ mod tests { #[test] fn contract_with_floats_fails_check() { - let engine = make_compiling_engine(None, &[]); + let engine = make_compiling_engine(None); let err = compile(&engine, CONTRACT).unwrap_err(); assert!(err.to_string().contains("Float operator detected:")); } diff --git a/packages/vm/src/wasm_backend/store.rs b/packages/vm/src/wasm_backend/store.rs index c04c24dbde..0761e5968a 100644 --- a/packages/vm/src/wasm_backend/store.rs +++ b/packages/vm/src/wasm_backend/store.rs @@ -5,8 +5,7 @@ use wasmer::NativeEngineExt; #[cfg(not(feature = "cranelift"))] use wasmer::Singlepass; use wasmer::{ - wasmparser::Operator, BaseTunables, CompilerConfig, Engine, ModuleMiddleware, Pages, Target, - WASM_PAGE_SIZE, + wasmparser::Operator, BaseTunables, CompilerConfig, Engine, Pages, Target, WASM_PAGE_SIZE, }; use wasmer_middlewares::Metering; @@ -44,10 +43,7 @@ pub fn make_runtime_engine(memory_limit: Option) -> Engine { } /// Creates an Engine with a compiler attached. Use this when compiling Wasm to a module. -pub fn make_compiling_engine( - memory_limit: Option, - middlewares: &[Arc], -) -> Engine { +pub fn make_compiling_engine(memory_limit: Option) -> Engine { let gas_limit = 0; let deterministic = Arc::new(Gatekeeper::default()); let metering = Arc::new(Metering::new(gas_limit, cost)); @@ -58,9 +54,6 @@ pub fn make_compiling_engine( #[cfg(not(feature = "cranelift"))] let mut compiler = Singlepass::default(); - for middleware in middlewares { - compiler.push_middleware(middleware.clone()); - } compiler.push_middleware(deterministic); compiler.push_middleware(metering); let mut engine = Engine::from(compiler); From 7d6b01714bf86bf94d650c517d03467e20673df3 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 24 Jul 2023 09:27:29 +0200 Subject: [PATCH 0542/2372] Rename store.rs -> engine.rs --- packages/vm/src/wasm_backend/{store.rs => engine.rs} | 0 packages/vm/src/wasm_backend/mod.rs | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename packages/vm/src/wasm_backend/{store.rs => engine.rs} (100%) diff --git a/packages/vm/src/wasm_backend/store.rs b/packages/vm/src/wasm_backend/engine.rs similarity index 100% rename from packages/vm/src/wasm_backend/store.rs rename to packages/vm/src/wasm_backend/engine.rs diff --git a/packages/vm/src/wasm_backend/mod.rs b/packages/vm/src/wasm_backend/mod.rs index eb4ac08e7f..59707b8d2f 100644 --- a/packages/vm/src/wasm_backend/mod.rs +++ b/packages/vm/src/wasm_backend/mod.rs @@ -1,8 +1,8 @@ mod compile; +mod engine; mod gatekeeper; mod limiting_tunables; -mod store; pub use compile::compile; +pub use engine::{make_compiling_engine, make_runtime_engine}; pub use limiting_tunables::LimitingTunables; -pub use store::{make_compiling_engine, make_runtime_engine}; From c856e1fa6ca2927ae216dde57a8a4f5663312db6 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 24 Jul 2023 09:37:20 +0200 Subject: [PATCH 0543/2372] Use compile consistently --- packages/vm/src/cache.rs | 10 +++++----- packages/vm/src/environment.rs | 6 +++--- packages/vm/src/imports.rs | 6 +++--- packages/vm/src/instance.rs | 6 +++--- packages/vm/src/modules/file_system_cache.rs | 8 ++++---- packages/vm/src/modules/in_memory_cache.rs | 19 +++++++++++-------- .../vm/src/modules/pinned_memory_cache.rs | 15 +++++++++------ packages/vm/src/modules/versioning.rs | 6 ++---- 8 files changed, 40 insertions(+), 36 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index b8ad348890..98303f78f7 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -4,7 +4,7 @@ use std::io::{Read, Write}; use std::marker::PhantomData; use std::path::{Path, PathBuf}; use std::sync::Mutex; -use wasmer::{Engine, Module, Store}; +use wasmer::{Engine, Store}; use crate::backend::{Backend, BackendApi, Querier, Storage}; use crate::capabilities::required_capabilities_from_module; @@ -16,7 +16,7 @@ use crate::instance::{Instance, InstanceOptions}; use crate::modules::{CachedModule, FileSystemCache, InMemoryCache, PinnedMemoryCache}; use crate::size::Size; use crate::static_analysis::{deserialize_wasm, has_ibc_entry_points}; -use crate::wasm_backend::{make_compiling_engine, make_runtime_engine}; +use crate::wasm_backend::{compile, make_compiling_engine, make_runtime_engine}; const STATE_DIR: &str = "state"; // Things related to the state of the blockchain. @@ -201,7 +201,7 @@ where pub fn save_wasm_unchecked(&self, wasm: &[u8]) -> VmResult { // We need a new engine for each Wasm -> module compilation due to the metering middleware. let compiling_engine = make_compiling_engine(None); - let module = Module::new(&compiling_engine, wasm)?; + let module = compile(&compiling_engine, wasm)?; let mut cache = self.inner.lock().unwrap(); let checksum = save_wasm_to_disk(&cache.wasm_path, wasm)?; @@ -292,7 +292,7 @@ where cache.stats.misses = cache.stats.misses.saturating_add(1); // Module will run with a different engine, so we can set memory limit to None let engine = make_compiling_engine(None); - let module = Module::new(&engine, wasm)?; + let module = compile(&engine, &wasm)?; // Store into the fs cache too let module_size = cache.fs_cache.store(checksum, &module)?; cache @@ -378,7 +378,7 @@ where cache.stats.misses = cache.stats.misses.saturating_add(1); // Module will run with a different engine, so we can set memory limit to None let engine = make_compiling_engine(None); - let module = Module::new(&engine, wasm)?; + let module = compile(&engine, &wasm)?; let module_size = cache.fs_cache.store(checksum, &module)?; cache diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index 4c767c2440..985ce810db 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -446,11 +446,11 @@ mod tests { use crate::errors::VmError; use crate::size::Size; use crate::testing::{MockApi, MockQuerier, MockStorage}; - use crate::wasm_backend::make_compiling_engine; + use crate::wasm_backend::{compile, make_compiling_engine}; use cosmwasm_std::{ coins, from_binary, to_vec, AllBalanceResponse, BankQuery, Empty, QueryRequest, }; - use wasmer::{imports, Function, Instance as WasmerInstance, Module, Store}; + use wasmer::{imports, Function, Instance as WasmerInstance, Store}; static CONTRACT: &[u8] = include_bytes!("../testdata/hackatom.wasm"); @@ -476,7 +476,7 @@ mod tests { let env = Environment::new(MockApi::default(), gas_limit); let engine = make_compiling_engine(TESTING_MEMORY_LIMIT); - let module = Module::new(&engine, CONTRACT).unwrap(); + let module = compile(&engine, CONTRACT).unwrap(); let mut store = Store::new(engine); // we need stubs for all required imports diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index da0dd205fc..fcb556b5b9 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -578,12 +578,12 @@ mod tests { }; use hex_literal::hex; use std::ptr::NonNull; - use wasmer::{imports, Function, FunctionEnv, Instance as WasmerInstance, Module, Store}; + use wasmer::{imports, Function, FunctionEnv, Instance as WasmerInstance, Store}; use crate::backend::{BackendError, Storage}; use crate::size::Size; use crate::testing::{MockApi, MockQuerier, MockStorage}; - use crate::wasm_backend::make_compiling_engine; + use crate::wasm_backend::{compile, make_compiling_engine}; static CONTRACT: &[u8] = include_bytes!("../testdata/hackatom.wasm"); @@ -621,7 +621,7 @@ mod tests { let env = Environment::new(api, gas_limit); let engine = make_compiling_engine(TESTING_MEMORY_LIMIT); - let module = Module::new(&engine, CONTRACT).unwrap(); + let module = compile(&engine, CONTRACT).unwrap(); let mut store = Store::new(engine); let fe = FunctionEnv::new(&mut store, env); diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index bfd82e2c85..1661565a88 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -22,7 +22,7 @@ use crate::imports::{ use crate::imports::{do_db_next, do_db_scan}; use crate::memory::{read_region, write_region}; use crate::size::Size; -use crate::wasm_backend::make_compiling_engine; +use crate::wasm_backend::{compile, make_compiling_engine}; pub use crate::environment::DebugInfo; // Re-exported as public via to be usable for set_debug_handler @@ -72,7 +72,7 @@ where memory_limit: Option, ) -> VmResult { let engine = make_compiling_engine(memory_limit); - let module = Module::new(&engine, code)?; + let module = compile(&engine, code)?; let store = Store::new(engine); Instance::from_module( store, @@ -605,7 +605,7 @@ mod tests { let backend = mock_backend(&[]); let engine = make_compiling_engine(memory_limit); - let module = Module::new(&engine, wasm).unwrap(); + let module = compile(&engine, &wasm).unwrap(); let mut store = Store::new(engine); let called = Arc::new(AtomicBool::new(false)); diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 1090fbec03..5a90b6fcad 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -214,7 +214,7 @@ mod tests { use super::*; use crate::{ size::Size, - wasm_backend::{make_compiling_engine, make_runtime_engine}, + wasm_backend::{compile, make_compiling_engine, make_runtime_engine}, }; use tempfile::TempDir; use wasmer::{imports, Instance as WasmerInstance, Store}; @@ -247,7 +247,7 @@ mod tests { // Store module let compiling_engine = make_compiling_engine(TESTING_MEMORY_LIMIT); - let module = Module::new(&compiling_engine, wasm).unwrap(); + let module = compile(&compiling_engine, &wasm).unwrap(); cache.store(&checksum, &module).unwrap(); // Load module @@ -280,7 +280,7 @@ mod tests { // Store module let engine = make_compiling_engine(TESTING_MEMORY_LIMIT); - let module = Module::new(&engine, wasm).unwrap(); + let module = compile(&engine, &wasm).unwrap(); cache.store(&checksum, &module).unwrap(); let mut globber = glob::glob(&format!( @@ -304,7 +304,7 @@ mod tests { // Store module let engine1 = make_compiling_engine(TESTING_MEMORY_LIMIT); - let module = Module::new(&engine1, wasm).unwrap(); + let module = compile(&engine1, &wasm).unwrap(); cache.store(&checksum, &module).unwrap(); // It's there diff --git a/packages/vm/src/modules/in_memory_cache.rs b/packages/vm/src/modules/in_memory_cache.rs index d44da26b13..3fda9ec75e 100644 --- a/packages/vm/src/modules/in_memory_cache.rs +++ b/packages/vm/src/modules/in_memory_cache.rs @@ -99,7 +99,10 @@ impl InMemoryCache { #[cfg(test)] mod tests { use super::*; - use crate::{size::Size, wasm_backend::make_compiling_engine}; + use crate::{ + size::Size, + wasm_backend::{compile, make_compiling_engine}, + }; use std::mem; use wasmer::{imports, Instance as WasmerInstance, Store}; use wasmer_middlewares::metering::set_remaining_points; @@ -145,7 +148,7 @@ mod tests { // Compile module let engine = make_compiling_engine(TESTING_MEMORY_LIMIT); - let original = Module::new(&engine, &wasm).unwrap(); + let original = compile(&engine, &wasm).unwrap(); // Ensure original module can be executed { @@ -218,19 +221,19 @@ mod tests { // Add 1 let engine1 = make_compiling_engine(TESTING_MEMORY_LIMIT); - let module = Module::new(&engine1, &wasm1).unwrap(); + let module = compile(&engine1, &wasm1).unwrap(); cache.store(&checksum1, module, 900_000).unwrap(); assert_eq!(cache.len(), 1); // Add 2 let engine2 = make_compiling_engine(TESTING_MEMORY_LIMIT); - let module = Module::new(&engine2, &wasm2).unwrap(); + let module = compile(&engine2, &wasm2).unwrap(); cache.store(&checksum2, module, 900_000).unwrap(); assert_eq!(cache.len(), 2); // Add 3 (pushes out the previous two) let engine3 = make_compiling_engine(TESTING_MEMORY_LIMIT); - let module = Module::new(&engine3, &wasm3).unwrap(); + let module = compile(&engine3, &wasm3).unwrap(); cache.store(&checksum3, module, 1_500_000).unwrap(); assert_eq!(cache.len(), 1); } @@ -278,19 +281,19 @@ mod tests { // Add 1 let engine1 = make_compiling_engine(TESTING_MEMORY_LIMIT); - let module = Module::new(&engine1, &wasm1).unwrap(); + let module = compile(&engine1, &wasm1).unwrap(); cache.store(&checksum1, module, 900_000).unwrap(); assert_eq!(cache.size(), 900_000); // Add 2 let engine2 = make_compiling_engine(TESTING_MEMORY_LIMIT); - let module = Module::new(&engine2, &wasm2).unwrap(); + let module = compile(&engine2, &wasm2).unwrap(); cache.store(&checksum2, module, 800_000).unwrap(); assert_eq!(cache.size(), 1_700_000); // Add 3 (pushes out the previous two) let engine3 = make_compiling_engine(TESTING_MEMORY_LIMIT); - let module = Module::new(&engine3, &wasm3).unwrap(); + let module = compile(&engine3, &wasm3).unwrap(); cache.store(&checksum3, module, 1_500_000).unwrap(); assert_eq!(cache.size(), 1_500_000); } diff --git a/packages/vm/src/modules/pinned_memory_cache.rs b/packages/vm/src/modules/pinned_memory_cache.rs index 68ca5f9b79..94cdfdc201 100644 --- a/packages/vm/src/modules/pinned_memory_cache.rs +++ b/packages/vm/src/modules/pinned_memory_cache.rs @@ -65,7 +65,10 @@ impl PinnedMemoryCache { #[cfg(test)] mod tests { use super::*; - use crate::{wasm_backend::make_compiling_engine, Size}; + use crate::{ + wasm_backend::{compile, make_compiling_engine}, + Size, + }; use wasmer::{imports, Instance as WasmerInstance, Store}; use wasmer_middlewares::metering::set_remaining_points; @@ -95,7 +98,7 @@ mod tests { // Compile module let engine = make_compiling_engine(TESTING_MEMORY_LIMIT); - let original = Module::new(&engine, &wasm).unwrap(); + let original = compile(&engine, &wasm).unwrap(); // Ensure original module can be executed { @@ -145,7 +148,7 @@ mod tests { // Add let engine = make_compiling_engine(TESTING_MEMORY_LIMIT); - let original = Module::new(&engine, &wasm).unwrap(); + let original = compile(&engine, &wasm).unwrap(); cache.store(&checksum, original, 0).unwrap(); assert!(cache.has(&checksum)); @@ -177,7 +180,7 @@ mod tests { // Add let engine = make_compiling_engine(TESTING_MEMORY_LIMIT); - let original = Module::new(&engine, &wasm).unwrap(); + let original = compile(&engine, &wasm).unwrap(); cache.store(&checksum, original, 0).unwrap(); assert_eq!(cache.len(), 1); @@ -220,13 +223,13 @@ mod tests { // Add 1 let engine1 = make_compiling_engine(TESTING_MEMORY_LIMIT); - let module = Module::new(&engine1, &wasm1).unwrap(); + let module = compile(&engine1, &wasm1).unwrap(); cache.store(&checksum1, module, 500).unwrap(); assert_eq!(cache.size(), 500); // Add 2 let engine2 = make_compiling_engine(TESTING_MEMORY_LIMIT); - let module = Module::new(&engine2, &wasm2).unwrap(); + let module = compile(&engine2, &wasm2).unwrap(); cache.store(&checksum2, module, 300).unwrap(); assert_eq!(cache.size(), 800); diff --git a/packages/vm/src/modules/versioning.rs b/packages/vm/src/modules/versioning.rs index ae804af7cb..1911852b3f 100644 --- a/packages/vm/src/modules/versioning.rs +++ b/packages/vm/src/modules/versioning.rs @@ -1,6 +1,4 @@ -use wasmer::Module; - -use crate::wasm_backend::make_compiling_engine; +use crate::wasm_backend::{compile, make_compiling_engine}; /// This header prefix contains the module type (wasmer-universal) and /// the magic value WASMER\0\0. @@ -15,7 +13,7 @@ fn current_wasmer_module_header() -> Vec { // echo "(module)" > my.wat && wat2wasm my.wat && hexdump -C my.wasm const WASM: &[u8] = b"\x00\x61\x73\x6d\x01\x00\x00\x00"; let engine = make_compiling_engine(None); - let module = Module::new(&engine, WASM).unwrap(); + let module = compile(&engine, WASM).unwrap(); let mut bytes = module.serialize().unwrap_or_default(); From 274191c16caba78fe87c5b29098a8f4b4e90c432 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 21 Jul 2023 15:47:19 +0200 Subject: [PATCH 0544/2372] Bump MODULE_SERIALIZATION_VERSION --- packages/vm/src/modules/file_system_cache.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 5a90b6fcad..6a99f6bb24 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -46,7 +46,9 @@ use crate::modules::current_wasmer_module_version; /// To work around this, the version was bumped to "v5" here to invalidate these corrupt caches. /// - **v6**:
/// Version for cosmwasm_vm 1.3+ which adds a sub-folder with the target identier for the modules. -const MODULE_SERIALIZATION_VERSION: &str = "v6"; +/// - **v7**:
+/// New version because of Wasmer 4 upgrade +const MODULE_SERIALIZATION_VERSION: &str = "v7"; /// Representation of a directory that contains compiled Wasm artifacts. pub struct FileSystemCache { @@ -284,7 +286,7 @@ mod tests { cache.store(&checksum, &module).unwrap(); let mut globber = glob::glob(&format!( - "{}/v6-wasmer4/**/{}", + "{}/v7-wasmer4/**/{}", tmp_dir.path().to_string_lossy(), checksum )) @@ -362,9 +364,9 @@ mod tests { assert_eq!( p.as_os_str(), if cfg!(windows) { - "modules\\v6-wasmer17\\x86_64-nintendo-fuchsia-gnu-coff-01E9F9FE" + "modules\\v7-wasmer17\\x86_64-nintendo-fuchsia-gnu-coff-01E9F9FE" } else { - "modules/v6-wasmer17/x86_64-nintendo-fuchsia-gnu-coff-01E9F9FE" + "modules/v7-wasmer17/x86_64-nintendo-fuchsia-gnu-coff-01E9F9FE" } ); } From 24707a57228e800746caa9ffe62f08aab885b2ba Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 24 Jul 2023 10:22:52 +0200 Subject: [PATCH 0545/2372] Apply suggestion from code review Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/vm/src/modules/file_system_cache.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 6a99f6bb24..52f5be2763 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -47,7 +47,8 @@ use crate::modules::current_wasmer_module_version; /// - **v6**:
/// Version for cosmwasm_vm 1.3+ which adds a sub-folder with the target identier for the modules. /// - **v7**:
-/// New version because of Wasmer 4 upgrade +/// New version because of Wasmer 2.3.0 -> 4 upgrade. +/// This internally changes how rkyv is used for module serialization, making compatibility unlikely. const MODULE_SERIALIZATION_VERSION: &str = "v7"; /// Representation of a directory that contains compiled Wasm artifacts. From ad94727c8a1f158e0a00d6c9e7db51eb8104851f Mon Sep 17 00:00:00 2001 From: Michal Nazarewicz Date: Wed, 19 Jul 2023 03:41:17 +0200 Subject: [PATCH 0546/2372] Update base64 dependency to 0.21 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In cosmwasm-crypto replace the use of base64 crate with the use of hex instead. It’s used once in tests and once in benchmarks to decode const binary data. Using hex works just as well. In cosmwasm-std update the dependency. --- Cargo.lock | 5 +- contracts/burner/Cargo.lock | 4 +- contracts/crypto-verify/Cargo.lock | 4 +- contracts/cyberpunk/Cargo.lock | 14 +++-- contracts/floaty/Cargo.lock | 4 +- contracts/hackatom/Cargo.lock | 4 +- contracts/ibc-reflect-send/Cargo.lock | 4 +- contracts/ibc-reflect/Cargo.lock | 4 +- contracts/queue/Cargo.lock | 4 +- contracts/reflect/Cargo.lock | 4 +- contracts/staking/Cargo.lock | 4 +- contracts/virus/Cargo.lock | 4 +- packages/crypto/Cargo.toml | 1 - packages/crypto/benches/main.rs | 5 +- packages/crypto/src/secp256k1.rs | 5 +- packages/std/Cargo.toml | 2 +- packages/std/src/binary.rs | 80 +++++++++++++-------------- 17 files changed, 78 insertions(+), 74 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e3a42ca29c..c832d96c46 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -165,9 +165,9 @@ checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" [[package]] name = "base64" -version = "0.13.1" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "base64ct" @@ -432,7 +432,6 @@ dependencies = [ name = "cosmwasm-crypto" version = "1.3.0" dependencies = [ - "base64", "criterion", "digest 0.10.6", "ed25519-zebra", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 8e5dc9aba7..d032e3bdc2 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -63,9 +63,9 @@ checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" [[package]] name = "base64" -version = "0.13.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "base64ct" diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 8fe3c3b231..d079ea3739 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -63,9 +63,9 @@ checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" [[package]] name = "base64" -version = "0.13.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "base64ct" diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index b5c0b4ec3b..c368a2f418 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -75,9 +75,15 @@ checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" [[package]] name = "base64" -version = "0.13.0" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "base64ct" @@ -251,7 +257,7 @@ dependencies = [ name = "cosmwasm-std" version = "1.3.0" dependencies = [ - "base64", + "base64 0.21.2", "bnum", "cosmwasm-crypto", "cosmwasm-derive", @@ -1325,7 +1331,7 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb" dependencies = [ - "base64", + "base64 0.13.1", "blake2b_simd", "constant_time_eq", "crossbeam-utils", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 92b19c33ab..561b28c792 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -63,9 +63,9 @@ checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" [[package]] name = "base64" -version = "0.13.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "base64ct" diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index fa745cfa4f..f8f4871546 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -63,9 +63,9 @@ checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" [[package]] name = "base64" -version = "0.13.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "base64ct" diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index d48fccc9aa..c92eacc312 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -63,9 +63,9 @@ checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" [[package]] name = "base64" -version = "0.13.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "base64ct" diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 844282d14f..81dd255ccd 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -63,9 +63,9 @@ checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" [[package]] name = "base64" -version = "0.13.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "base64ct" diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 6f28d16340..2ac6f0b6cc 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -63,9 +63,9 @@ checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" [[package]] name = "base64" -version = "0.13.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "base64ct" diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index fcd335dd5f..696cd50c43 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -63,9 +63,9 @@ checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" [[package]] name = "base64" -version = "0.13.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "base64ct" diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 1f8eb40d03..8c0c68de32 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -63,9 +63,9 @@ checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" [[package]] name = "base64" -version = "0.13.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "base64ct" diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 9e3e0dff33..736125cd3e 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -63,9 +63,9 @@ checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" [[package]] name = "base64" -version = "0.13.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "base64ct" diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 480808b805..150b0d5697 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -30,7 +30,6 @@ criterion = "0.4" serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } serde_json = "1.0.40" sha2 = "0.10" -base64 = "0.13.0" hex = "0.4" hex-literal = "0.3.1" english-numbers = "0.3" diff --git a/packages/crypto/benches/main.rs b/packages/crypto/benches/main.rs index e1efbfe2a3..f3509cebf0 100644 --- a/packages/crypto/benches/main.rs +++ b/packages/crypto/benches/main.rs @@ -18,7 +18,8 @@ use std::cmp::min; const COSMOS_SECP256K1_MSG_HEX: &str = "0a93010a90010a1c2f636f736d6f732e62616e6b2e763162657461312e4d736753656e6412700a2d636f736d6f7331706b707472653766646b6c366766727a6c65736a6a766878686c63337234676d6d6b38727336122d636f736d6f7331717970717870713971637273737a673270767871367273307a716733797963356c7a763778751a100a0575636f736d12073132333435363712650a4e0a460a1f2f636f736d6f732e63727970746f2e736563703235366b312e5075624b657912230a21034f04181eeba35391b858633a765c4a0c189697b40d216354d50890d350c7029012040a02080112130a0d0a0575636f736d12043230303010c09a0c1a0c73696d642d74657374696e672001"; const COSMOS_SECP256K1_SIGNATURE_HEX: &str = "c9dd20e07464d3a688ff4b710b1fbc027e495e797cfa0b4804da2ed117959227772de059808f765aa29b8f92edf30f4c2c5a438e30d3fe6897daa7141e3ce6f9"; -const COSMOS_SECP256K1_PUBKEY_BASE64: &str = "A08EGB7ro1ORuFhjOnZcSgwYlpe0DSFjVNUIkNNQxwKQ"; +const COSMOS_SECP256K1_PUBKEY_HEX: &str = + "034f04181eeba35391b858633a765c4a0c189697b40d216354d50890d350c70290"; // TEST 3 test vector from https://tools.ietf.org/html/rfc8032#section-7.1 const COSMOS_ED25519_MSG_HEX: &str = "af82"; @@ -80,7 +81,7 @@ fn bench_crypto(c: &mut Criterion) { let message = hex::decode(COSMOS_SECP256K1_MSG_HEX).unwrap(); let message_hash = Sha256::digest(message); let signature = hex::decode(COSMOS_SECP256K1_SIGNATURE_HEX).unwrap(); - let public_key = base64::decode(COSMOS_SECP256K1_PUBKEY_BASE64).unwrap(); + let public_key = hex::decode(COSMOS_SECP256K1_PUBKEY_HEX).unwrap(); b.iter(|| { assert!(secp256k1_verify(&message_hash, &signature, &public_key).unwrap()); }); diff --git a/packages/crypto/src/secp256k1.rs b/packages/crypto/src/secp256k1.rs index 8ccc1cec06..0b57d507c6 100644 --- a/packages/crypto/src/secp256k1.rs +++ b/packages/crypto/src/secp256k1.rs @@ -195,7 +195,8 @@ mod tests { // Cosmos secp256k1 signature verification // tendermint/PubKeySecp256k1 pubkey - const COSMOS_SECP256K1_PUBKEY_BASE64: &str = "A08EGB7ro1ORuFhjOnZcSgwYlpe0DSFjVNUIkNNQxwKQ"; + const COSMOS_SECP256K1_PUBKEY_HEX: &str = + "034f04181eeba35391b858633a765c4a0c189697b40d216354d50890d350c70290"; const COSMOS_SECP256K1_MSG_HEX1: &str = "0a93010a90010a1c2f636f736d6f732e62616e6b2e763162657461312e4d736753656e6412700a2d636f736d6f7331706b707472653766646b6c366766727a6c65736a6a766878686c63337234676d6d6b38727336122d636f736d6f7331717970717870713971637273737a673270767871367273307a716733797963356c7a763778751a100a0575636f736d12073132333435363712650a4e0a460a1f2f636f736d6f732e63727970746f2e736563703235366b312e5075624b657912230a21034f04181eeba35391b858633a765c4a0c189697b40d216354d50890d350c7029012040a02080112130a0d0a0575636f736d12043230303010c09a0c1a0c73696d642d74657374696e672001"; const COSMOS_SECP256K1_MSG_HEX2: &str = "0a93010a90010a1c2f636f736d6f732e62616e6b2e763162657461312e4d736753656e6412700a2d636f736d6f7331706b707472653766646b6c366766727a6c65736a6a766878686c63337234676d6d6b38727336122d636f736d6f7331717970717870713971637273737a673270767871367273307a716733797963356c7a763778751a100a0575636f736d12073132333435363712670a500a460a1f2f636f736d6f732e63727970746f2e736563703235366b312e5075624b657912230a21034f04181eeba35391b858633a765c4a0c189697b40d216354d50890d350c7029012040a020801180112130a0d0a0575636f736d12043230303010c09a0c1a0c73696d642d74657374696e672001"; @@ -271,7 +272,7 @@ mod tests { #[test] fn test_cosmos_secp256k1_verify() { - let public_key = base64::decode(COSMOS_SECP256K1_PUBKEY_BASE64).unwrap(); + let public_key = hex::decode(COSMOS_SECP256K1_PUBKEY_HEX).unwrap(); for ((i, msg), sig) in (1..) .zip(&[ diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 3f9264ea42..23952f9a4f 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -44,7 +44,7 @@ cosmwasm_1_2 = ["cosmwasm_1_1"] cosmwasm_1_3 = ["cosmwasm_1_2"] [dependencies] -base64 = "0.13.0" +base64 = "0.21.0" cosmwasm-derive = { path = "../derive", version = "1.3.0" } derivative = "2" forward_ref = "1" diff --git a/packages/std/src/binary.rs b/packages/std/src/binary.rs index 6bde49f90d..2cf30cea41 100644 --- a/packages/std/src/binary.rs +++ b/packages/std/src/binary.rs @@ -1,6 +1,7 @@ use core::fmt; use core::ops::Deref; +use base64::engine::{Engine, GeneralPurpose}; use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; @@ -15,17 +16,29 @@ use crate::errors::{StdError, StdResult}; pub struct Binary(#[schemars(with = "String")] pub Vec); impl Binary { + /// Base64 encoding engine used in conversion to/from base64. + /// + /// The engine adds padding when encoding and accepts strings with or + /// without padding when decoding. + const B64_ENGINE: GeneralPurpose = GeneralPurpose::new( + &base64::alphabet::STANDARD, + base64::engine::GeneralPurposeConfig::new() + .with_decode_padding_mode(base64::engine::DecodePaddingMode::Indifferent), + ); + /// take an (untrusted) string and decode it into bytes. /// fails if it is not valid base64 pub fn from_base64(encoded: &str) -> StdResult { - let binary = base64::decode(encoded).map_err(StdError::invalid_base64)?; - Ok(Binary(binary)) + Self::B64_ENGINE + .decode(encoded.as_bytes()) + .map(Binary::from) + .map_err(StdError::invalid_base64) } /// encode to base64 string (guaranteed to be success as we control the data inside). /// this returns normalized form (with trailing = if needed) pub fn to_base64(&self) -> String { - base64::encode(&self.0) + Self::B64_ENGINE.encode(self.0.as_slice()) } pub fn as_slice(&self) -> &[u8] { @@ -242,24 +255,6 @@ mod tests { use crate::errors::StdError; use crate::serde::{from_slice, to_vec}; - #[test] - fn encode_decode() { - let binary: &[u8] = b"hello"; - let encoded = Binary::from(binary).to_base64(); - assert_eq!(8, encoded.len()); - let decoded = Binary::from_base64(&encoded).unwrap(); - assert_eq!(binary, decoded.as_slice()); - } - - #[test] - fn encode_decode_non_ascii() { - let binary = vec![12u8, 187, 0, 17, 250, 1]; - let encoded = Binary(binary.clone()).to_base64(); - assert_eq!(8, encoded.len()); - let decoded = Binary::from_base64(&encoded).unwrap(); - assert_eq!(binary.deref(), decoded.deref()); - } - #[test] fn to_array_works() { // simple @@ -312,29 +307,32 @@ mod tests { } #[test] - fn from_valid_string() { - let valid_base64 = "cmFuZG9taVo="; - let binary = Binary::from_base64(valid_base64).unwrap(); - assert_eq!(b"randomiZ", binary.as_slice()); - } - - // this accepts input without a trailing = but outputs normal form - #[test] - fn from_shortened_string() { - let short = "cmFuZG9taVo"; - let long = "cmFuZG9taVo="; - let binary = Binary::from_base64(short).unwrap(); - assert_eq!(b"randomiZ", binary.as_slice()); - assert_eq!(long, binary.to_base64()); + fn test_base64_encoding_success() { + for (value, encoded, encoded_no_pad) in [ + (&b""[..], "", ""), + (&b"hello"[..], "aGVsbG8=", "aGVsbG8"), + (&b"\x0C\xBB\x00\x11\xFA\x01"[..], "DLsAEfoB", "DLsAEfoB"), + (&b"rand"[..], "cmFuZA==", "cmFuZA"), + (&b"rand"[..], "cmFuZA==", "cmFuZA="), + (&b"randomiZ"[..], "cmFuZG9taVo=", "cmFuZG9taVo"), + ] { + let value = Binary::from(value); + assert_eq!(encoded, value.to_base64()); + assert_eq!(Ok(value.clone()), Binary::from_base64(encoded)); + assert_eq!(Ok(value.clone()), Binary::from_base64(encoded_no_pad)); + } } #[test] - fn from_invalid_string() { - let invalid_base64 = "cm%uZG9taVo"; - let res = Binary::from_base64(invalid_base64); - match res.unwrap_err() { - StdError::InvalidBase64 { msg, .. } => assert_eq!(msg, "Invalid byte 37, offset 2."), - _ => panic!("Unexpected error type"), + fn test_base64_encoding_error() { + for (invalid_base64, want) in [ + ("cm%uZG9taVo", "Invalid byte 37, offset 2."), + ("cmFuZ", "Encoded text cannot have a 6-bit remainder."), + ] { + match Binary::from_base64(invalid_base64) { + Err(StdError::InvalidBase64 { msg }) => assert_eq!(want, msg), + result => panic!("Unexpected result: {result:?}"), + } } } From 55aafa4d6452b8fbab9440314f4d2c951e449af7 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 24 Jul 2023 14:12:19 +0200 Subject: [PATCH 0547/2372] Add key size to cache element size --- packages/vm/src/checksum.rs | 12 ++++++++++++ packages/vm/src/modules/in_memory_cache.rs | 10 +++++----- packages/vm/src/modules/pinned_memory_cache.rs | 11 +++++++---- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/packages/vm/src/checksum.rs b/packages/vm/src/checksum.rs index c6aefc3fa9..a3ee9bd7fe 100644 --- a/packages/vm/src/checksum.rs +++ b/packages/vm/src/checksum.rs @@ -23,6 +23,12 @@ impl Checksum { pub fn to_hex(self) -> String { self.to_string() } + + #[inline] + #[allow(clippy::len_without_is_empty)] + pub fn len(&self) -> usize { + 32 + } } impl fmt::Display for Checksum { @@ -110,4 +116,10 @@ mod tests { let as_vec: Vec = checksum.into(); assert_eq!(as_vec, checksum.0); } + + #[test] + fn len_works() { + let checksum = Checksum::generate(&[12u8; 17]); + assert_eq!(checksum.len(), 32); + } } diff --git a/packages/vm/src/modules/in_memory_cache.rs b/packages/vm/src/modules/in_memory_cache.rs index 3fda9ec75e..59a3426f09 100644 --- a/packages/vm/src/modules/in_memory_cache.rs +++ b/packages/vm/src/modules/in_memory_cache.rs @@ -20,8 +20,8 @@ struct SizeScale; impl WeightScale for SizeScale { #[inline] - fn weight(&self, _key: &Checksum, value: &CachedModule) -> usize { - value.size + fn weight(&self, key: &Checksum, value: &CachedModule) -> usize { + key.len() + value.size } } @@ -283,18 +283,18 @@ mod tests { let engine1 = make_compiling_engine(TESTING_MEMORY_LIMIT); let module = compile(&engine1, &wasm1).unwrap(); cache.store(&checksum1, module, 900_000).unwrap(); - assert_eq!(cache.size(), 900_000); + assert_eq!(cache.size(), 900_032); // Add 2 let engine2 = make_compiling_engine(TESTING_MEMORY_LIMIT); let module = compile(&engine2, &wasm2).unwrap(); cache.store(&checksum2, module, 800_000).unwrap(); - assert_eq!(cache.size(), 1_700_000); + assert_eq!(cache.size(), 900_032 + 800_032); // Add 3 (pushes out the previous two) let engine3 = make_compiling_engine(TESTING_MEMORY_LIMIT); let module = compile(&engine3, &wasm3).unwrap(); cache.store(&checksum3, module, 1_500_000).unwrap(); - assert_eq!(cache.size(), 1_500_000); + assert_eq!(cache.size(), 1_500_032); } } diff --git a/packages/vm/src/modules/pinned_memory_cache.rs b/packages/vm/src/modules/pinned_memory_cache.rs index 94cdfdc201..9e36d1c916 100644 --- a/packages/vm/src/modules/pinned_memory_cache.rs +++ b/packages/vm/src/modules/pinned_memory_cache.rs @@ -58,7 +58,10 @@ impl PinnedMemoryCache { /// This is based on the values provided with `store`. No actual /// memory size is measured here. pub fn size(&self) -> usize { - self.modules.values().map(|module| module.size).sum() + self.modules + .iter() + .map(|(key, module)| key.len() + module.size) + .sum() } } @@ -225,17 +228,17 @@ mod tests { let engine1 = make_compiling_engine(TESTING_MEMORY_LIMIT); let module = compile(&engine1, &wasm1).unwrap(); cache.store(&checksum1, module, 500).unwrap(); - assert_eq!(cache.size(), 500); + assert_eq!(cache.size(), 532); // Add 2 let engine2 = make_compiling_engine(TESTING_MEMORY_LIMIT); let module = compile(&engine2, &wasm2).unwrap(); cache.store(&checksum2, module, 300).unwrap(); - assert_eq!(cache.size(), 800); + assert_eq!(cache.size(), 532 + 332); // Remove 1 cache.remove(&checksum1).unwrap(); - assert_eq!(cache.size(), 300); + assert_eq!(cache.size(), 332); // Remove 2 cache.remove(&checksum2).unwrap(); From ca558148bb7c15e3501b7ec1744c3c53e3e21ab6 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 24 Jul 2023 14:14:06 +0200 Subject: [PATCH 0548/2372] Elaborate on size estimation --- packages/vm/src/cache.rs | 4 ++-- packages/vm/src/modules/cached_module.rs | 9 +++++++-- packages/vm/src/modules/in_memory_cache.rs | 11 ++++++++--- packages/vm/src/modules/pinned_memory_cache.rs | 11 ++++++++--- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 98303f78f7..701a314cdd 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -363,7 +363,7 @@ where .store(checksum, module.clone(), module_size)?; let cached = CachedModule { module, - size: module_size, + size_estimate: module_size, }; let store = Store::new(cache.runtime_engine.clone()); return Ok((cached, store)); @@ -386,7 +386,7 @@ where .store(checksum, module.clone(), module_size)?; let cached = CachedModule { module, - size: module_size, + size_estimate: module_size, }; let store = Store::new(cache.runtime_engine.clone()); Ok((cached, store)) diff --git a/packages/vm/src/modules/cached_module.rs b/packages/vm/src/modules/cached_module.rs index ee6b80d2de..6f9a157a9b 100644 --- a/packages/vm/src/modules/cached_module.rs +++ b/packages/vm/src/modules/cached_module.rs @@ -3,6 +3,11 @@ use wasmer::Module; #[derive(Debug, Clone)] pub struct CachedModule { pub module: Module, - /// The estimated size of this element in memory - pub size: usize, + /// The estimated size of this element in memory. + /// Since the cached modules are just [rkyv](https://rkyv.org/) dumps of the Module + /// instances, we use the file size of the module on disk (not the Wasm!) + /// as an estimate for this. + /// Note: Since CosmWasm 1.4 (Wasmer 4), Store/Engine are not cached anymore. + /// The majority of the Module size is the Artifact. + pub size_estimate: usize, } diff --git a/packages/vm/src/modules/in_memory_cache.rs b/packages/vm/src/modules/in_memory_cache.rs index 59a3426f09..ab71b851ce 100644 --- a/packages/vm/src/modules/in_memory_cache.rs +++ b/packages/vm/src/modules/in_memory_cache.rs @@ -21,7 +21,7 @@ struct SizeScale; impl WeightScale for SizeScale { #[inline] fn weight(&self, key: &Checksum, value: &CachedModule) -> usize { - key.len() + value.size + key.len() + value.size_estimate } } @@ -49,14 +49,19 @@ impl InMemoryCache { } } - pub fn store(&mut self, checksum: &Checksum, entry: Module, size: usize) -> VmResult<()> { + pub fn store( + &mut self, + checksum: &Checksum, + entry: Module, + module_size: usize, + ) -> VmResult<()> { if let Some(modules) = &mut self.modules { modules .put_with_weight( *checksum, CachedModule { module: entry, - size, + size_estimate: module_size, }, ) .map_err(|e| VmError::cache_err(format!("{e:?}")))?; diff --git a/packages/vm/src/modules/pinned_memory_cache.rs b/packages/vm/src/modules/pinned_memory_cache.rs index 9e36d1c916..073a094b88 100644 --- a/packages/vm/src/modules/pinned_memory_cache.rs +++ b/packages/vm/src/modules/pinned_memory_cache.rs @@ -17,12 +17,17 @@ impl PinnedMemoryCache { } } - pub fn store(&mut self, checksum: &Checksum, element: Module, size: usize) -> VmResult<()> { + pub fn store( + &mut self, + checksum: &Checksum, + element: Module, + module_size: usize, + ) -> VmResult<()> { self.modules.insert( *checksum, CachedModule { module: element, - size, + size_estimate: module_size, }, ); Ok(()) @@ -60,7 +65,7 @@ impl PinnedMemoryCache { pub fn size(&self) -> usize { self.modules .iter() - .map(|(key, module)| key.len() + module.size) + .map(|(key, module)| key.len() + module.size_estimate) .sum() } } From 259d5e6c1e1ff00aeaa7847e898a67fa6e71c9e4 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 24 Jul 2023 16:00:26 +0200 Subject: [PATCH 0549/2372] Use size_of_val for the checksum size --- packages/vm/src/checksum.rs | 12 ------------ packages/vm/src/modules/in_memory_cache.rs | 2 +- packages/vm/src/modules/pinned_memory_cache.rs | 2 +- 3 files changed, 2 insertions(+), 14 deletions(-) diff --git a/packages/vm/src/checksum.rs b/packages/vm/src/checksum.rs index a3ee9bd7fe..c6aefc3fa9 100644 --- a/packages/vm/src/checksum.rs +++ b/packages/vm/src/checksum.rs @@ -23,12 +23,6 @@ impl Checksum { pub fn to_hex(self) -> String { self.to_string() } - - #[inline] - #[allow(clippy::len_without_is_empty)] - pub fn len(&self) -> usize { - 32 - } } impl fmt::Display for Checksum { @@ -116,10 +110,4 @@ mod tests { let as_vec: Vec = checksum.into(); assert_eq!(as_vec, checksum.0); } - - #[test] - fn len_works() { - let checksum = Checksum::generate(&[12u8; 17]); - assert_eq!(checksum.len(), 32); - } } diff --git a/packages/vm/src/modules/in_memory_cache.rs b/packages/vm/src/modules/in_memory_cache.rs index ab71b851ce..95991c0e5a 100644 --- a/packages/vm/src/modules/in_memory_cache.rs +++ b/packages/vm/src/modules/in_memory_cache.rs @@ -21,7 +21,7 @@ struct SizeScale; impl WeightScale for SizeScale { #[inline] fn weight(&self, key: &Checksum, value: &CachedModule) -> usize { - key.len() + value.size_estimate + std::mem::size_of_val(key) + value.size_estimate } } diff --git a/packages/vm/src/modules/pinned_memory_cache.rs b/packages/vm/src/modules/pinned_memory_cache.rs index 073a094b88..8fd6f9d039 100644 --- a/packages/vm/src/modules/pinned_memory_cache.rs +++ b/packages/vm/src/modules/pinned_memory_cache.rs @@ -65,7 +65,7 @@ impl PinnedMemoryCache { pub fn size(&self) -> usize { self.modules .iter() - .map(|(key, module)| key.len() + module.size_estimate) + .map(|(key, module)| std::mem::size_of_val(key) + module.size_estimate) .sum() } } From fdfd37c43cf00aee4266830caed2b929f795464c Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 26 Jul 2023 09:51:26 +0200 Subject: [PATCH 0550/2372] Upgrade Wasmer to 4.1.0 --- CHANGELOG.md | 7 +++++- Cargo.lock | 32 +++++++++++++-------------- contracts/burner/Cargo.lock | 32 +++++++++++++-------------- contracts/crypto-verify/Cargo.lock | 32 +++++++++++++-------------- contracts/cyberpunk/Cargo.lock | 32 +++++++++++++-------------- contracts/floaty/Cargo.lock | 32 +++++++++++++-------------- contracts/hackatom/Cargo.lock | 32 +++++++++++++-------------- contracts/ibc-reflect-send/Cargo.lock | 32 +++++++++++++-------------- contracts/ibc-reflect/Cargo.lock | 32 +++++++++++++-------------- contracts/queue/Cargo.lock | 32 +++++++++++++-------------- contracts/reflect/Cargo.lock | 32 +++++++++++++-------------- contracts/staking/Cargo.lock | 32 +++++++++++++-------------- contracts/virus/Cargo.lock | 32 +++++++++++++-------------- packages/vm/Cargo.toml | 4 ++-- 14 files changed, 200 insertions(+), 195 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 480e8b1e27..e21eaca8bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,11 +14,16 @@ and this project adheres to STDERR instead of STDOUT by default ([#1667]). - cosmwasm-vm: Add `Instance::set_debug_handler`/`unset_debug_handler` to allow customizing the handling of debug messages emitted by the contract ([#1667]). -- cosmwasm-vm: Upgrade Wasmer to version 4.0.0. +- cosmwasm-vm: Upgrade Wasmer to version 4.1. ([#1674], [#1693], [#1701], + [#1793]) - cosmwasm-check: Update clap dependency to version 4 ([#1677]) [#1667]: https://github.com/CosmWasm/cosmwasm/pull/1667 +[#1674]: https://github.com/CosmWasm/cosmwasm/pull/1674 [#1677]: https://github.com/CosmWasm/cosmwasm/pull/1677 +[#1693]: https://github.com/CosmWasm/cosmwasm/pull/1693 +[#1701]: https://github.com/CosmWasm/cosmwasm/pull/1701 +[#1793]: https://github.com/CosmWasm/cosmwasm/pull/1793 ## [1.3.0] - 2023-07-17 diff --git a/Cargo.lock b/Cargo.lock index c832d96c46..6177ed20d8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2338,9 +2338,9 @@ dependencies = [ [[package]] name = "wasmer" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea790bcdfb4e6e9d1e5ddf75b4699aac62b078fcc9f27f44e1748165ceea67bf" +checksum = "3849811ec23a31369ad40a07fcf4a6d259f2b05debdb6b21726c47a6a62f618f" dependencies = [ "bytes", "cfg-if", @@ -2366,9 +2366,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f093937725e242e5529fed27e08ff836c011a9ecc22e6819fb818c2ac6ff5f88" +checksum = "860db1e73e4a088a0636aabff2f89735eb9b4c4927e25c49da3aba561c8f26f4" dependencies = [ "backtrace", "cfg-if", @@ -2389,9 +2389,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b27b1670d27158789ebe14e4da3902c72132174884a1c6a3533ce4fd9dd83db" +checksum = "a5e01da3c6832c0f5b54dda23279e99b4aa82544c90ae0b0d4ebc584b8f6f4ef" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -2408,9 +2408,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02509aaab7e302fc551ff03512807514b379ba32136892e96fcaa5b62a3228de" +checksum = "e856957b7173bbd15da77833e4db3d1ca5aeff35dd2f88e69f7d36cfeaf822d6" dependencies = [ "byteorder", "dynasm", @@ -2427,9 +2427,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13ae8286cba2acb10065a4dac129c7c7f7bcd24acd6538555d96616eea16bc27" +checksum = "34a2a51c07a1e476ceece72c8a09ab777e4832f104bf62fa454e8ea8db3ac7c9" dependencies = [ "proc-macro-error", "proc-macro2", @@ -2439,9 +2439,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bc8cafe02112ecf21a7fc1d090ac0f0220a86a8d4f561c24e382a4c2ee4addc" +checksum = "ce87a2a7b622d91a901630c9879922a39087e8046eabe9d8d7879ba781f7c8ce" dependencies = [ "wasmer", "wasmer-types", @@ -2450,9 +2450,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918d2f0bb5eaa95a80c06be33f21dee92f40f12cd0982da34490d121a99d244b" +checksum = "4b2274b2b4d931e77fcae9f90d4a1af6d72f6c3a3e38cc19277c5dc72a2fc5a5" dependencies = [ "bytecheck", "enum-iterator", @@ -2466,9 +2466,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e000c2cbd4f9805427af5f3b3446574caf89ab3a1e66c2f3579fbde22b072b" +checksum = "58112eb6257d4fc293814d155ad296d3ddbdf88536784f493984cc56c3e3a0e2" dependencies = [ "backtrace", "cc", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index d032e3bdc2..780b58f1e6 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -1641,9 +1641,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea790bcdfb4e6e9d1e5ddf75b4699aac62b078fcc9f27f44e1748165ceea67bf" +checksum = "3849811ec23a31369ad40a07fcf4a6d259f2b05debdb6b21726c47a6a62f618f" dependencies = [ "bytes", "cfg-if", @@ -1669,9 +1669,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f093937725e242e5529fed27e08ff836c011a9ecc22e6819fb818c2ac6ff5f88" +checksum = "860db1e73e4a088a0636aabff2f89735eb9b4c4927e25c49da3aba561c8f26f4" dependencies = [ "backtrace", "cfg-if", @@ -1692,9 +1692,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b27b1670d27158789ebe14e4da3902c72132174884a1c6a3533ce4fd9dd83db" +checksum = "a5e01da3c6832c0f5b54dda23279e99b4aa82544c90ae0b0d4ebc584b8f6f4ef" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1711,9 +1711,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02509aaab7e302fc551ff03512807514b379ba32136892e96fcaa5b62a3228de" +checksum = "e856957b7173bbd15da77833e4db3d1ca5aeff35dd2f88e69f7d36cfeaf822d6" dependencies = [ "byteorder", "dynasm", @@ -1730,9 +1730,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13ae8286cba2acb10065a4dac129c7c7f7bcd24acd6538555d96616eea16bc27" +checksum = "34a2a51c07a1e476ceece72c8a09ab777e4832f104bf62fa454e8ea8db3ac7c9" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1742,9 +1742,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bc8cafe02112ecf21a7fc1d090ac0f0220a86a8d4f561c24e382a4c2ee4addc" +checksum = "ce87a2a7b622d91a901630c9879922a39087e8046eabe9d8d7879ba781f7c8ce" dependencies = [ "wasmer", "wasmer-types", @@ -1753,9 +1753,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918d2f0bb5eaa95a80c06be33f21dee92f40f12cd0982da34490d121a99d244b" +checksum = "4b2274b2b4d931e77fcae9f90d4a1af6d72f6c3a3e38cc19277c5dc72a2fc5a5" dependencies = [ "bytecheck", "enum-iterator", @@ -1769,9 +1769,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e000c2cbd4f9805427af5f3b3446574caf89ab3a1e66c2f3579fbde22b072b" +checksum = "58112eb6257d4fc293814d155ad296d3ddbdf88536784f493984cc56c3e3a0e2" dependencies = [ "backtrace", "cc", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index d079ea3739..8b0074ca41 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -1684,9 +1684,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea790bcdfb4e6e9d1e5ddf75b4699aac62b078fcc9f27f44e1748165ceea67bf" +checksum = "3849811ec23a31369ad40a07fcf4a6d259f2b05debdb6b21726c47a6a62f618f" dependencies = [ "bytes", "cfg-if", @@ -1712,9 +1712,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f093937725e242e5529fed27e08ff836c011a9ecc22e6819fb818c2ac6ff5f88" +checksum = "860db1e73e4a088a0636aabff2f89735eb9b4c4927e25c49da3aba561c8f26f4" dependencies = [ "backtrace", "cfg-if", @@ -1735,9 +1735,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b27b1670d27158789ebe14e4da3902c72132174884a1c6a3533ce4fd9dd83db" +checksum = "a5e01da3c6832c0f5b54dda23279e99b4aa82544c90ae0b0d4ebc584b8f6f4ef" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1754,9 +1754,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02509aaab7e302fc551ff03512807514b379ba32136892e96fcaa5b62a3228de" +checksum = "e856957b7173bbd15da77833e4db3d1ca5aeff35dd2f88e69f7d36cfeaf822d6" dependencies = [ "byteorder", "dynasm", @@ -1773,9 +1773,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13ae8286cba2acb10065a4dac129c7c7f7bcd24acd6538555d96616eea16bc27" +checksum = "34a2a51c07a1e476ceece72c8a09ab777e4832f104bf62fa454e8ea8db3ac7c9" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1785,9 +1785,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bc8cafe02112ecf21a7fc1d090ac0f0220a86a8d4f561c24e382a4c2ee4addc" +checksum = "ce87a2a7b622d91a901630c9879922a39087e8046eabe9d8d7879ba781f7c8ce" dependencies = [ "wasmer", "wasmer-types", @@ -1796,9 +1796,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918d2f0bb5eaa95a80c06be33f21dee92f40f12cd0982da34490d121a99d244b" +checksum = "4b2274b2b4d931e77fcae9f90d4a1af6d72f6c3a3e38cc19277c5dc72a2fc5a5" dependencies = [ "bytecheck", "enum-iterator", @@ -1812,9 +1812,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e000c2cbd4f9805427af5f3b3446574caf89ab3a1e66c2f3579fbde22b072b" +checksum = "58112eb6257d4fc293814d155ad296d3ddbdf88536784f493984cc56c3e3a0e2" dependencies = [ "backtrace", "cc", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index c368a2f418..ae1b4aa6b4 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -1787,9 +1787,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea790bcdfb4e6e9d1e5ddf75b4699aac62b078fcc9f27f44e1748165ceea67bf" +checksum = "3849811ec23a31369ad40a07fcf4a6d259f2b05debdb6b21726c47a6a62f618f" dependencies = [ "bytes", "cfg-if", @@ -1815,9 +1815,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f093937725e242e5529fed27e08ff836c011a9ecc22e6819fb818c2ac6ff5f88" +checksum = "860db1e73e4a088a0636aabff2f89735eb9b4c4927e25c49da3aba561c8f26f4" dependencies = [ "backtrace", "cfg-if", @@ -1838,9 +1838,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b27b1670d27158789ebe14e4da3902c72132174884a1c6a3533ce4fd9dd83db" +checksum = "a5e01da3c6832c0f5b54dda23279e99b4aa82544c90ae0b0d4ebc584b8f6f4ef" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1857,9 +1857,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02509aaab7e302fc551ff03512807514b379ba32136892e96fcaa5b62a3228de" +checksum = "e856957b7173bbd15da77833e4db3d1ca5aeff35dd2f88e69f7d36cfeaf822d6" dependencies = [ "byteorder", "dynasm", @@ -1876,9 +1876,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13ae8286cba2acb10065a4dac129c7c7f7bcd24acd6538555d96616eea16bc27" +checksum = "34a2a51c07a1e476ceece72c8a09ab777e4832f104bf62fa454e8ea8db3ac7c9" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1888,9 +1888,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bc8cafe02112ecf21a7fc1d090ac0f0220a86a8d4f561c24e382a4c2ee4addc" +checksum = "ce87a2a7b622d91a901630c9879922a39087e8046eabe9d8d7879ba781f7c8ce" dependencies = [ "wasmer", "wasmer-types", @@ -1899,9 +1899,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918d2f0bb5eaa95a80c06be33f21dee92f40f12cd0982da34490d121a99d244b" +checksum = "4b2274b2b4d931e77fcae9f90d4a1af6d72f6c3a3e38cc19277c5dc72a2fc5a5" dependencies = [ "bytecheck", "enum-iterator", @@ -1915,9 +1915,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e000c2cbd4f9805427af5f3b3446574caf89ab3a1e66c2f3579fbde22b072b" +checksum = "58112eb6257d4fc293814d155ad296d3ddbdf88536784f493984cc56c3e3a0e2" dependencies = [ "backtrace", "cc", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 561b28c792..b22982c2b0 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -1642,9 +1642,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea790bcdfb4e6e9d1e5ddf75b4699aac62b078fcc9f27f44e1748165ceea67bf" +checksum = "3849811ec23a31369ad40a07fcf4a6d259f2b05debdb6b21726c47a6a62f618f" dependencies = [ "bytes", "cfg-if", @@ -1670,9 +1670,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f093937725e242e5529fed27e08ff836c011a9ecc22e6819fb818c2ac6ff5f88" +checksum = "860db1e73e4a088a0636aabff2f89735eb9b4c4927e25c49da3aba561c8f26f4" dependencies = [ "backtrace", "cfg-if", @@ -1693,9 +1693,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b27b1670d27158789ebe14e4da3902c72132174884a1c6a3533ce4fd9dd83db" +checksum = "a5e01da3c6832c0f5b54dda23279e99b4aa82544c90ae0b0d4ebc584b8f6f4ef" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1712,9 +1712,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02509aaab7e302fc551ff03512807514b379ba32136892e96fcaa5b62a3228de" +checksum = "e856957b7173bbd15da77833e4db3d1ca5aeff35dd2f88e69f7d36cfeaf822d6" dependencies = [ "byteorder", "dynasm", @@ -1731,9 +1731,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13ae8286cba2acb10065a4dac129c7c7f7bcd24acd6538555d96616eea16bc27" +checksum = "34a2a51c07a1e476ceece72c8a09ab777e4832f104bf62fa454e8ea8db3ac7c9" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1743,9 +1743,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bc8cafe02112ecf21a7fc1d090ac0f0220a86a8d4f561c24e382a4c2ee4addc" +checksum = "ce87a2a7b622d91a901630c9879922a39087e8046eabe9d8d7879ba781f7c8ce" dependencies = [ "wasmer", "wasmer-types", @@ -1754,9 +1754,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918d2f0bb5eaa95a80c06be33f21dee92f40f12cd0982da34490d121a99d244b" +checksum = "4b2274b2b4d931e77fcae9f90d4a1af6d72f6c3a3e38cc19277c5dc72a2fc5a5" dependencies = [ "bytecheck", "enum-iterator", @@ -1770,9 +1770,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e000c2cbd4f9805427af5f3b3446574caf89ab3a1e66c2f3579fbde22b072b" +checksum = "58112eb6257d4fc293814d155ad296d3ddbdf88536784f493984cc56c3e3a0e2" dependencies = [ "backtrace", "cc", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index f8f4871546..43d3659f6b 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -1643,9 +1643,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea790bcdfb4e6e9d1e5ddf75b4699aac62b078fcc9f27f44e1748165ceea67bf" +checksum = "3849811ec23a31369ad40a07fcf4a6d259f2b05debdb6b21726c47a6a62f618f" dependencies = [ "bytes", "cfg-if", @@ -1671,9 +1671,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f093937725e242e5529fed27e08ff836c011a9ecc22e6819fb818c2ac6ff5f88" +checksum = "860db1e73e4a088a0636aabff2f89735eb9b4c4927e25c49da3aba561c8f26f4" dependencies = [ "backtrace", "cfg-if", @@ -1694,9 +1694,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b27b1670d27158789ebe14e4da3902c72132174884a1c6a3533ce4fd9dd83db" +checksum = "a5e01da3c6832c0f5b54dda23279e99b4aa82544c90ae0b0d4ebc584b8f6f4ef" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1713,9 +1713,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02509aaab7e302fc551ff03512807514b379ba32136892e96fcaa5b62a3228de" +checksum = "e856957b7173bbd15da77833e4db3d1ca5aeff35dd2f88e69f7d36cfeaf822d6" dependencies = [ "byteorder", "dynasm", @@ -1732,9 +1732,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13ae8286cba2acb10065a4dac129c7c7f7bcd24acd6538555d96616eea16bc27" +checksum = "34a2a51c07a1e476ceece72c8a09ab777e4832f104bf62fa454e8ea8db3ac7c9" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1744,9 +1744,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bc8cafe02112ecf21a7fc1d090ac0f0220a86a8d4f561c24e382a4c2ee4addc" +checksum = "ce87a2a7b622d91a901630c9879922a39087e8046eabe9d8d7879ba781f7c8ce" dependencies = [ "wasmer", "wasmer-types", @@ -1755,9 +1755,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918d2f0bb5eaa95a80c06be33f21dee92f40f12cd0982da34490d121a99d244b" +checksum = "4b2274b2b4d931e77fcae9f90d4a1af6d72f6c3a3e38cc19277c5dc72a2fc5a5" dependencies = [ "bytecheck", "enum-iterator", @@ -1771,9 +1771,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e000c2cbd4f9805427af5f3b3446574caf89ab3a1e66c2f3579fbde22b072b" +checksum = "58112eb6257d4fc293814d155ad296d3ddbdf88536784f493984cc56c3e3a0e2" dependencies = [ "backtrace", "cc", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index c92eacc312..82cac20de9 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -1641,9 +1641,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea790bcdfb4e6e9d1e5ddf75b4699aac62b078fcc9f27f44e1748165ceea67bf" +checksum = "3849811ec23a31369ad40a07fcf4a6d259f2b05debdb6b21726c47a6a62f618f" dependencies = [ "bytes", "cfg-if", @@ -1669,9 +1669,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f093937725e242e5529fed27e08ff836c011a9ecc22e6819fb818c2ac6ff5f88" +checksum = "860db1e73e4a088a0636aabff2f89735eb9b4c4927e25c49da3aba561c8f26f4" dependencies = [ "backtrace", "cfg-if", @@ -1692,9 +1692,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b27b1670d27158789ebe14e4da3902c72132174884a1c6a3533ce4fd9dd83db" +checksum = "a5e01da3c6832c0f5b54dda23279e99b4aa82544c90ae0b0d4ebc584b8f6f4ef" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1711,9 +1711,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02509aaab7e302fc551ff03512807514b379ba32136892e96fcaa5b62a3228de" +checksum = "e856957b7173bbd15da77833e4db3d1ca5aeff35dd2f88e69f7d36cfeaf822d6" dependencies = [ "byteorder", "dynasm", @@ -1730,9 +1730,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13ae8286cba2acb10065a4dac129c7c7f7bcd24acd6538555d96616eea16bc27" +checksum = "34a2a51c07a1e476ceece72c8a09ab777e4832f104bf62fa454e8ea8db3ac7c9" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1742,9 +1742,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bc8cafe02112ecf21a7fc1d090ac0f0220a86a8d4f561c24e382a4c2ee4addc" +checksum = "ce87a2a7b622d91a901630c9879922a39087e8046eabe9d8d7879ba781f7c8ce" dependencies = [ "wasmer", "wasmer-types", @@ -1753,9 +1753,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918d2f0bb5eaa95a80c06be33f21dee92f40f12cd0982da34490d121a99d244b" +checksum = "4b2274b2b4d931e77fcae9f90d4a1af6d72f6c3a3e38cc19277c5dc72a2fc5a5" dependencies = [ "bytecheck", "enum-iterator", @@ -1769,9 +1769,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e000c2cbd4f9805427af5f3b3446574caf89ab3a1e66c2f3579fbde22b072b" +checksum = "58112eb6257d4fc293814d155ad296d3ddbdf88536784f493984cc56c3e3a0e2" dependencies = [ "backtrace", "cc", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 81dd255ccd..cd927806fb 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -1641,9 +1641,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea790bcdfb4e6e9d1e5ddf75b4699aac62b078fcc9f27f44e1748165ceea67bf" +checksum = "3849811ec23a31369ad40a07fcf4a6d259f2b05debdb6b21726c47a6a62f618f" dependencies = [ "bytes", "cfg-if", @@ -1669,9 +1669,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f093937725e242e5529fed27e08ff836c011a9ecc22e6819fb818c2ac6ff5f88" +checksum = "860db1e73e4a088a0636aabff2f89735eb9b4c4927e25c49da3aba561c8f26f4" dependencies = [ "backtrace", "cfg-if", @@ -1692,9 +1692,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b27b1670d27158789ebe14e4da3902c72132174884a1c6a3533ce4fd9dd83db" +checksum = "a5e01da3c6832c0f5b54dda23279e99b4aa82544c90ae0b0d4ebc584b8f6f4ef" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1711,9 +1711,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02509aaab7e302fc551ff03512807514b379ba32136892e96fcaa5b62a3228de" +checksum = "e856957b7173bbd15da77833e4db3d1ca5aeff35dd2f88e69f7d36cfeaf822d6" dependencies = [ "byteorder", "dynasm", @@ -1730,9 +1730,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13ae8286cba2acb10065a4dac129c7c7f7bcd24acd6538555d96616eea16bc27" +checksum = "34a2a51c07a1e476ceece72c8a09ab777e4832f104bf62fa454e8ea8db3ac7c9" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1742,9 +1742,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bc8cafe02112ecf21a7fc1d090ac0f0220a86a8d4f561c24e382a4c2ee4addc" +checksum = "ce87a2a7b622d91a901630c9879922a39087e8046eabe9d8d7879ba781f7c8ce" dependencies = [ "wasmer", "wasmer-types", @@ -1753,9 +1753,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918d2f0bb5eaa95a80c06be33f21dee92f40f12cd0982da34490d121a99d244b" +checksum = "4b2274b2b4d931e77fcae9f90d4a1af6d72f6c3a3e38cc19277c5dc72a2fc5a5" dependencies = [ "bytecheck", "enum-iterator", @@ -1769,9 +1769,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e000c2cbd4f9805427af5f3b3446574caf89ab3a1e66c2f3579fbde22b072b" +checksum = "58112eb6257d4fc293814d155ad296d3ddbdf88536784f493984cc56c3e3a0e2" dependencies = [ "backtrace", "cc", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 2ac6f0b6cc..0c2b3eda62 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -1641,9 +1641,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea790bcdfb4e6e9d1e5ddf75b4699aac62b078fcc9f27f44e1748165ceea67bf" +checksum = "3849811ec23a31369ad40a07fcf4a6d259f2b05debdb6b21726c47a6a62f618f" dependencies = [ "bytes", "cfg-if", @@ -1669,9 +1669,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f093937725e242e5529fed27e08ff836c011a9ecc22e6819fb818c2ac6ff5f88" +checksum = "860db1e73e4a088a0636aabff2f89735eb9b4c4927e25c49da3aba561c8f26f4" dependencies = [ "backtrace", "cfg-if", @@ -1692,9 +1692,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b27b1670d27158789ebe14e4da3902c72132174884a1c6a3533ce4fd9dd83db" +checksum = "a5e01da3c6832c0f5b54dda23279e99b4aa82544c90ae0b0d4ebc584b8f6f4ef" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1711,9 +1711,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02509aaab7e302fc551ff03512807514b379ba32136892e96fcaa5b62a3228de" +checksum = "e856957b7173bbd15da77833e4db3d1ca5aeff35dd2f88e69f7d36cfeaf822d6" dependencies = [ "byteorder", "dynasm", @@ -1730,9 +1730,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13ae8286cba2acb10065a4dac129c7c7f7bcd24acd6538555d96616eea16bc27" +checksum = "34a2a51c07a1e476ceece72c8a09ab777e4832f104bf62fa454e8ea8db3ac7c9" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1742,9 +1742,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bc8cafe02112ecf21a7fc1d090ac0f0220a86a8d4f561c24e382a4c2ee4addc" +checksum = "ce87a2a7b622d91a901630c9879922a39087e8046eabe9d8d7879ba781f7c8ce" dependencies = [ "wasmer", "wasmer-types", @@ -1753,9 +1753,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918d2f0bb5eaa95a80c06be33f21dee92f40f12cd0982da34490d121a99d244b" +checksum = "4b2274b2b4d931e77fcae9f90d4a1af6d72f6c3a3e38cc19277c5dc72a2fc5a5" dependencies = [ "bytecheck", "enum-iterator", @@ -1769,9 +1769,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e000c2cbd4f9805427af5f3b3446574caf89ab3a1e66c2f3579fbde22b072b" +checksum = "58112eb6257d4fc293814d155ad296d3ddbdf88536784f493984cc56c3e3a0e2" dependencies = [ "backtrace", "cc", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 696cd50c43..9f042e0cc5 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -1642,9 +1642,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea790bcdfb4e6e9d1e5ddf75b4699aac62b078fcc9f27f44e1748165ceea67bf" +checksum = "3849811ec23a31369ad40a07fcf4a6d259f2b05debdb6b21726c47a6a62f618f" dependencies = [ "bytes", "cfg-if", @@ -1670,9 +1670,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f093937725e242e5529fed27e08ff836c011a9ecc22e6819fb818c2ac6ff5f88" +checksum = "860db1e73e4a088a0636aabff2f89735eb9b4c4927e25c49da3aba561c8f26f4" dependencies = [ "backtrace", "cfg-if", @@ -1693,9 +1693,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b27b1670d27158789ebe14e4da3902c72132174884a1c6a3533ce4fd9dd83db" +checksum = "a5e01da3c6832c0f5b54dda23279e99b4aa82544c90ae0b0d4ebc584b8f6f4ef" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1712,9 +1712,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02509aaab7e302fc551ff03512807514b379ba32136892e96fcaa5b62a3228de" +checksum = "e856957b7173bbd15da77833e4db3d1ca5aeff35dd2f88e69f7d36cfeaf822d6" dependencies = [ "byteorder", "dynasm", @@ -1731,9 +1731,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13ae8286cba2acb10065a4dac129c7c7f7bcd24acd6538555d96616eea16bc27" +checksum = "34a2a51c07a1e476ceece72c8a09ab777e4832f104bf62fa454e8ea8db3ac7c9" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1743,9 +1743,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bc8cafe02112ecf21a7fc1d090ac0f0220a86a8d4f561c24e382a4c2ee4addc" +checksum = "ce87a2a7b622d91a901630c9879922a39087e8046eabe9d8d7879ba781f7c8ce" dependencies = [ "wasmer", "wasmer-types", @@ -1754,9 +1754,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918d2f0bb5eaa95a80c06be33f21dee92f40f12cd0982da34490d121a99d244b" +checksum = "4b2274b2b4d931e77fcae9f90d4a1af6d72f6c3a3e38cc19277c5dc72a2fc5a5" dependencies = [ "bytecheck", "enum-iterator", @@ -1770,9 +1770,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e000c2cbd4f9805427af5f3b3446574caf89ab3a1e66c2f3579fbde22b072b" +checksum = "58112eb6257d4fc293814d155ad296d3ddbdf88536784f493984cc56c3e3a0e2" dependencies = [ "backtrace", "cc", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 8c0c68de32..534b141cc7 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -1669,9 +1669,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea790bcdfb4e6e9d1e5ddf75b4699aac62b078fcc9f27f44e1748165ceea67bf" +checksum = "3849811ec23a31369ad40a07fcf4a6d259f2b05debdb6b21726c47a6a62f618f" dependencies = [ "bytes", "cfg-if", @@ -1697,9 +1697,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f093937725e242e5529fed27e08ff836c011a9ecc22e6819fb818c2ac6ff5f88" +checksum = "860db1e73e4a088a0636aabff2f89735eb9b4c4927e25c49da3aba561c8f26f4" dependencies = [ "backtrace", "cfg-if", @@ -1720,9 +1720,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b27b1670d27158789ebe14e4da3902c72132174884a1c6a3533ce4fd9dd83db" +checksum = "a5e01da3c6832c0f5b54dda23279e99b4aa82544c90ae0b0d4ebc584b8f6f4ef" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1739,9 +1739,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02509aaab7e302fc551ff03512807514b379ba32136892e96fcaa5b62a3228de" +checksum = "e856957b7173bbd15da77833e4db3d1ca5aeff35dd2f88e69f7d36cfeaf822d6" dependencies = [ "byteorder", "dynasm", @@ -1758,9 +1758,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13ae8286cba2acb10065a4dac129c7c7f7bcd24acd6538555d96616eea16bc27" +checksum = "34a2a51c07a1e476ceece72c8a09ab777e4832f104bf62fa454e8ea8db3ac7c9" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1770,9 +1770,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bc8cafe02112ecf21a7fc1d090ac0f0220a86a8d4f561c24e382a4c2ee4addc" +checksum = "ce87a2a7b622d91a901630c9879922a39087e8046eabe9d8d7879ba781f7c8ce" dependencies = [ "wasmer", "wasmer-types", @@ -1781,9 +1781,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918d2f0bb5eaa95a80c06be33f21dee92f40f12cd0982da34490d121a99d244b" +checksum = "4b2274b2b4d931e77fcae9f90d4a1af6d72f6c3a3e38cc19277c5dc72a2fc5a5" dependencies = [ "bytecheck", "enum-iterator", @@ -1797,9 +1797,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e000c2cbd4f9805427af5f3b3446574caf89ab3a1e66c2f3579fbde22b072b" +checksum = "58112eb6257d4fc293814d155ad296d3ddbdf88536784f493984cc56c3e3a0e2" dependencies = [ "backtrace", "cc", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 736125cd3e..fd55847fb4 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -1642,9 +1642,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea790bcdfb4e6e9d1e5ddf75b4699aac62b078fcc9f27f44e1748165ceea67bf" +checksum = "3849811ec23a31369ad40a07fcf4a6d259f2b05debdb6b21726c47a6a62f618f" dependencies = [ "bytes", "cfg-if", @@ -1670,9 +1670,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f093937725e242e5529fed27e08ff836c011a9ecc22e6819fb818c2ac6ff5f88" +checksum = "860db1e73e4a088a0636aabff2f89735eb9b4c4927e25c49da3aba561c8f26f4" dependencies = [ "backtrace", "cfg-if", @@ -1693,9 +1693,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b27b1670d27158789ebe14e4da3902c72132174884a1c6a3533ce4fd9dd83db" +checksum = "a5e01da3c6832c0f5b54dda23279e99b4aa82544c90ae0b0d4ebc584b8f6f4ef" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1712,9 +1712,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02509aaab7e302fc551ff03512807514b379ba32136892e96fcaa5b62a3228de" +checksum = "e856957b7173bbd15da77833e4db3d1ca5aeff35dd2f88e69f7d36cfeaf822d6" dependencies = [ "byteorder", "dynasm", @@ -1731,9 +1731,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13ae8286cba2acb10065a4dac129c7c7f7bcd24acd6538555d96616eea16bc27" +checksum = "34a2a51c07a1e476ceece72c8a09ab777e4832f104bf62fa454e8ea8db3ac7c9" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1743,9 +1743,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bc8cafe02112ecf21a7fc1d090ac0f0220a86a8d4f561c24e382a4c2ee4addc" +checksum = "ce87a2a7b622d91a901630c9879922a39087e8046eabe9d8d7879ba781f7c8ce" dependencies = [ "wasmer", "wasmer-types", @@ -1754,9 +1754,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918d2f0bb5eaa95a80c06be33f21dee92f40f12cd0982da34490d121a99d244b" +checksum = "4b2274b2b4d931e77fcae9f90d4a1af6d72f6c3a3e38cc19277c5dc72a2fc5a5" dependencies = [ "bytecheck", "enum-iterator", @@ -1770,9 +1770,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e000c2cbd4f9805427af5f3b3446574caf89ab3a1e66c2f3579fbde22b072b" +checksum = "58112eb6257d4fc293814d155ad296d3ddbdf88536784f493984cc56c3e3a0e2" dependencies = [ "backtrace", "cc", diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 0283bcf32d..934cb8d34e 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -49,8 +49,8 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " serde_json = "1.0.40" sha2 = "0.10.3" thiserror = "1.0.26" -wasmer = { version = "=4.0.0", default-features = false, features = ["cranelift", "singlepass"] } -wasmer-middlewares = "=4.0.0" +wasmer = { version = "=4.1.0", default-features = false, features = ["cranelift", "singlepass"] } +wasmer-middlewares = "=4.1.0" # Dependencies that we do not use ourself. We add those entries # to bump the min version of them. From cdfd25d0c89238bdddba995615ab67ed268313a7 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 19 Jul 2023 16:16:32 +0200 Subject: [PATCH 0551/2372] Replace parity-wasm with wasmparser --- Cargo.lock | 7 - packages/vm/Cargo.toml | 1 - packages/vm/src/cache.rs | 4 +- packages/vm/src/capabilities.rs | 8 +- packages/vm/src/compatibility.rs | 238 +++++++++++++++++++---------- packages/vm/src/errors/vm_error.rs | 8 + packages/vm/src/static_analysis.rs | 141 ++++++++++------- 7 files changed, 262 insertions(+), 145 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6177ed20d8..445fa69cff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -528,7 +528,6 @@ dependencies = [ "hex", "hex-literal", "leb128", - "parity-wasm", "rand", "schemars", "serde", @@ -1448,12 +1447,6 @@ version = "6.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" -[[package]] -name = "parity-wasm" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" - [[package]] name = "parking_lot_core" version = "0.9.7" diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 934cb8d34e..d30584dad3 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -43,7 +43,6 @@ cosmwasm-std = { path = "../std", version = "1.3.0", default-features = false } cosmwasm-crypto = { path = "../crypto", version = "1.3.0" } derivative = "2" hex = "0.4" -parity-wasm = { version = "0.45", features = ["sign_ext"] } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } serde_json = "1.0.40" diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 701a314cdd..e21f8d259a 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -15,7 +15,7 @@ use crate::filesystem::mkdir_p; use crate::instance::{Instance, InstanceOptions}; use crate::modules::{CachedModule, FileSystemCache, InMemoryCache, PinnedMemoryCache}; use crate::size::Size; -use crate::static_analysis::{deserialize_wasm, has_ibc_entry_points}; +use crate::static_analysis::{deserialize_exports, has_ibc_entry_points}; use crate::wasm_backend::{compile, make_compiling_engine, make_runtime_engine}; const STATE_DIR: &str = "state"; @@ -254,7 +254,7 @@ where pub fn analyze(&self, checksum: &Checksum) -> VmResult { // Here we could use a streaming deserializer to slightly improve performance. However, this way it is DRYer. let wasm = self.load_wasm(checksum)?; - let module = deserialize_wasm(&wasm)?; + let module = deserialize_exports(&wasm)?; Ok(AnalysisReport { has_ibc_entry_points: has_ibc_entry_points(&module), required_capabilities: required_capabilities_from_module(&module), diff --git a/packages/vm/src/capabilities.rs b/packages/vm/src/capabilities.rs index 85dabe9c95..af560c007d 100644 --- a/packages/vm/src/capabilities.rs +++ b/packages/vm/src/capabilities.rs @@ -15,7 +15,7 @@ pub fn capabilities_from_csv(csv: &str) -> HashSet { /// Implementation for check_wasm, based on static analysis of the bytecode. /// This is used for code upload, to perform check before compiling the Wasm. -pub fn required_capabilities_from_module(module: &impl ExportInfo) -> HashSet { +pub fn required_capabilities_from_module(module: impl ExportInfo) -> HashSet { module .exported_function_names(Some(REQUIRES_PREFIX)) .into_iter() @@ -33,7 +33,7 @@ pub fn required_capabilities_from_module(module: &impl ExportInfo) -> HashSet) -> VmResult<()> { - let module = deserialize_wasm(wasm_code)?; - check_wasm_tables(&module)?; - check_wasm_memories(&module)?; - check_interface_version(&module)?; - check_wasm_exports(&module)?; - check_wasm_imports(&module, SUPPORTED_IMPORTS)?; - check_wasm_capabilities(&module, available_capabilities)?; + let parsed = Parser::new(0).parse_all(wasm_code); + let mut validator = Validator::new(); + // TODO: some of the validator checks are duplicated in our checks below + + let mut memory_section: Option> = None; + for payload in parsed { + let payload = payload?; + validator.payload(&payload)?; + + match payload { + Payload::TableSection(t) => check_wasm_tables(t)?, + Payload::MemorySection(m) => memory_section = Some(m), + Payload::ExportSection(e) => { + let exports = e.into_iter().collect::, _>>()?; + check_interface_version(&exports)?; + check_wasm_exports(&exports)?; + check_wasm_capabilities(&exports, available_capabilities)?; + } + Payload::ImportSection(i) => check_wasm_imports(i, SUPPORTED_IMPORTS)?, + _ => {} + } + } + check_wasm_memories(memory_section)?; + Ok(()) } -fn check_wasm_tables(module: &Module) -> VmResult<()> { - let sections: &[TableType] = module - .table_section() - .map_or(&[], |section| section.entries()); - match sections.len() { +fn check_wasm_tables(mut tables: TableSectionReader<'_>) -> VmResult<()> { + match tables.get_count() { 0 => Ok(()), 1 => { - let limits = sections[0].limits(); - if let Some(maximum) = limits.maximum() { - if limits.initial() > maximum { + let limits = tables.read()?; + if let Some(maximum) = limits.maximum { + if limits.initial > maximum { return Err(VmError::static_validation_err( "Wasm contract's first table section has a initial limit > max limit", )); @@ -114,8 +137,8 @@ fn check_wasm_tables(module: &Module) -> VmResult<()> { } } -fn check_wasm_memories(module: &Module) -> VmResult<()> { - let section = match module.memory_section() { +fn check_wasm_memories(memory: Option>) -> VmResult<()> { + let mut section = match memory { Some(section) => section, None => { return Err(VmError::static_validation_err( @@ -124,24 +147,21 @@ fn check_wasm_memories(module: &Module) -> VmResult<()> { } }; - let memories = section.entries(); - if memories.len() != 1 { + if section.get_count() != 1 { return Err(VmError::static_validation_err( "Wasm contract must contain exactly one memory", )); } - let memory = memories[0]; - // println!("Memory: {:?}", memory); - let limits = memory.limits(); + let memory = section.read()?; - if limits.initial() > MEMORY_LIMIT { + if memory.initial > MEMORY_LIMIT as u64 { return Err(VmError::static_validation_err(format!( "Wasm contract memory's minimum must not exceed {MEMORY_LIMIT} pages." ))); } - if limits.maximum().is_some() { + if memory.maximum.is_some() { return Err(VmError::static_validation_err( "Wasm contract memory's maximum must be unset. The host will set it for you.", )); @@ -149,8 +169,8 @@ fn check_wasm_memories(module: &Module) -> VmResult<()> { Ok(()) } -fn check_interface_version(module: &Module) -> VmResult<()> { - let mut interface_version_exports = module +fn check_interface_version(exports: &[Export<'_>]) -> VmResult<()> { + let mut interface_version_exports = exports .exported_function_names(Some(INTERFACE_VERSION_PREFIX)) .into_iter(); if let Some(first_interface_version_export) = interface_version_exports.next() { @@ -179,8 +199,8 @@ fn check_interface_version(module: &Module) -> VmResult<()> { } } -fn check_wasm_exports(module: &Module) -> VmResult<()> { - let available_exports: HashSet = module.exported_function_names(None); +fn check_wasm_exports(exports: &[Export<'_>]) -> VmResult<()> { + let available_exports: HashSet = exports.exported_function_names(None); for required_export in REQUIRED_EXPORTS { if !available_exports.contains(*required_export) { return Err(VmError::static_validation_err(format!( @@ -194,20 +214,21 @@ fn check_wasm_exports(module: &Module) -> VmResult<()> { /// Checks if the import requirements of the contract are satisfied. /// When this is not the case, we either have an incompatibility between contract and VM /// or a error in the contract. -fn check_wasm_imports(module: &Module, supported_imports: &[&str]) -> VmResult<()> { - let required_imports: &[ImportEntry] = module - .import_section() - .map_or(&[], |import_section| import_section.entries()); - - if required_imports.len() > MAX_IMPORTS { +fn check_wasm_imports(imports: ImportSectionReader, supported_imports: &[&str]) -> VmResult<()> { + if imports.get_count() > MAX_IMPORTS { return Err(VmError::static_validation_err(format!( "Import count exceeds limit. Imports: {}. Limit: {}.", - required_imports.len(), + imports.get_count(), MAX_IMPORTS ))); } - for required_import in required_imports { + let required_imports = imports + .into_iter() + .map(|i| Ok(i?)) + .collect::>>()?; + + for required_import in &required_imports { let full_name = full_import_name(required_import); if !supported_imports.contains(&full_name.as_str()) { let required_import_names: BTreeSet<_> = @@ -218,25 +239,25 @@ fn check_wasm_imports(module: &Module, supported_imports: &[&str]) -> VmResult<( ))); } - match required_import.external() { - External::Function(_) => {}, // ok + match required_import.ty { + TypeRef::Func(_) => {} // ok _ => return Err(VmError::static_validation_err(format!( "Wasm contract requires non-function import: \"{full_name}\". Right now, all supported imports are functions." - ))), - }; + ))) + } } Ok(()) } -fn full_import_name(ie: &ImportEntry) -> String { - format!("{}.{}", ie.module(), ie.field()) +fn full_import_name(ie: &Import) -> String { + format!("{}.{}", ie.module, ie.name) } fn check_wasm_capabilities( - module: &Module, + exports: &[Export<'_>], available_capabilities: &HashSet, ) -> VmResult<()> { - let required_capabilities = required_capabilities_from_module(module); + let required_capabilities = required_capabilities_from_module(exports); if !required_capabilities.is_subset(available_capabilities) { // We switch to BTreeSet to get a sorted error message let unavailable: BTreeSet<_> = required_capabilities @@ -253,7 +274,10 @@ fn check_wasm_capabilities( #[cfg(test)] mod tests { use super::*; - use crate::errors::VmError; + use crate::{ + errors::VmError, + static_analysis::{deserialize_exports, extract_reader}, + }; static CONTRACT_0_7: &[u8] = include_bytes!("../testdata/hackatom_0.7.wasm"); static CONTRACT_0_12: &[u8] = include_bytes!("../testdata/hackatom_0.12.wasm"); @@ -321,29 +345,48 @@ mod tests { fn check_wasm_tables_works() { // No tables is fine let wasm = wat::parse_str("(module)").unwrap(); - check_wasm_tables(&deserialize_wasm(&wasm).unwrap()).unwrap(); + assert!(extract_reader!(&wasm, TableSection, TableSectionReader<'_>) + .unwrap() + .is_none()); // One table (bound) let wasm = wat::parse_str("(module (table $name 123 123 funcref))").unwrap(); - check_wasm_tables(&deserialize_wasm(&wasm).unwrap()).unwrap(); + check_wasm_tables( + extract_reader!(&wasm, TableSection, TableSectionReader<'_>) + .unwrap() + .unwrap(), + ) + .unwrap(); // One table (bound, initial > max) let wasm = wat::parse_str("(module (table $name 124 123 funcref))").unwrap(); - let err = check_wasm_tables(&deserialize_wasm(&wasm).unwrap()).unwrap_err(); + let err = check_wasm_tables( + extract_reader!(&wasm, TableSection, TableSectionReader<'_>) + .unwrap() + .unwrap(), + ) + .unwrap_err(); assert!(err .to_string() .contains("Wasm contract's first table section has a initial limit > max limit")); // One table (bound, max too large) let wasm = wat::parse_str("(module (table $name 100 9999 funcref))").unwrap(); - let err = check_wasm_tables(&deserialize_wasm(&wasm).unwrap()).unwrap_err(); + let err = extract_reader!(&wasm, TableSection, TableSectionReader<'_>) + .map(|_| ()) // map away the `Ok` value, it does not impl Debug + .unwrap_err(); assert!(err .to_string() .contains("Wasm contract's first table section has a too large max limit")); // One table (unbound) let wasm = wat::parse_str("(module (table $name 100 funcref))").unwrap(); - let err = check_wasm_tables(&deserialize_wasm(&wasm).unwrap()).unwrap_err(); + let err = check_wasm_tables( + extract_reader!(&wasm, TableSection, TableSectionReader<'_>) + .unwrap() + .unwrap(), + ) + .unwrap_err(); assert!(err .to_string() .contains("Wasm contract must not have unbound table section")); @@ -352,13 +395,16 @@ mod tests { #[test] fn check_wasm_memories_ok() { let wasm = wat::parse_str("(module (memory 1))").unwrap(); - check_wasm_memories(&deserialize_wasm(&wasm).unwrap()).unwrap() + check_wasm_memories(extract_reader!(&wasm, MemorySection, MemorySectionReader<'_>).unwrap()) + .unwrap() } #[test] fn check_wasm_memories_no_memory() { let wasm = wat::parse_str("(module)").unwrap(); - match check_wasm_memories(&deserialize_wasm(&wasm).unwrap()) { + match check_wasm_memories( + extract_reader!(&wasm, MemorySection, MemorySectionReader<'_>).unwrap(), + ) { Err(VmError::StaticValidationErr { msg, .. }) => { assert!(msg.starts_with("Wasm contract doesn't have a memory section")); } @@ -382,7 +428,9 @@ mod tests { )) .unwrap(); - match check_wasm_memories(&deserialize_wasm(&wasm).unwrap()) { + match check_wasm_memories( + extract_reader!(&wasm, MemorySection, MemorySectionReader<'_>).unwrap(), + ) { Err(VmError::StaticValidationErr { msg, .. }) => { assert!(msg.starts_with("Wasm contract must contain exactly one memory")); } @@ -403,7 +451,9 @@ mod tests { )) .unwrap(); - match check_wasm_memories(&deserialize_wasm(&wasm).unwrap()) { + match check_wasm_memories( + extract_reader!(&wasm, MemorySection, MemorySectionReader<'_>).unwrap(), + ) { Err(VmError::StaticValidationErr { msg, .. }) => { assert!(msg.starts_with("Wasm contract must contain exactly one memory")); } @@ -415,10 +465,15 @@ mod tests { #[test] fn check_wasm_memories_initial_size() { let wasm_ok = wat::parse_str("(module (memory 512))").unwrap(); - check_wasm_memories(&deserialize_wasm(&wasm_ok).unwrap()).unwrap(); + check_wasm_memories( + extract_reader!(&wasm_ok, MemorySection, MemorySectionReader<'_>).unwrap(), + ) + .unwrap(); let wasm_too_big = wat::parse_str("(module (memory 513))").unwrap(); - match check_wasm_memories(&deserialize_wasm(&wasm_too_big).unwrap()) { + match check_wasm_memories( + extract_reader!(&wasm_too_big, MemorySection, MemorySectionReader<'_>).unwrap(), + ) { Err(VmError::StaticValidationErr { msg, .. }) => { assert!(msg.starts_with("Wasm contract memory's minimum must not exceed 512 pages")); } @@ -430,7 +485,9 @@ mod tests { #[test] fn check_wasm_memories_maximum_size() { let wasm_max = wat::parse_str("(module (memory 1 5))").unwrap(); - match check_wasm_memories(&deserialize_wasm(&wasm_max).unwrap()) { + match check_wasm_memories( + extract_reader!(&wasm_max, MemorySection, MemorySectionReader<'_>).unwrap(), + ) { Err(VmError::StaticValidationErr { msg, .. }) => { assert!(msg.starts_with("Wasm contract memory's maximum must be unset")); } @@ -454,7 +511,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_wasm(&wasm).unwrap(); + let module = deserialize_exports(&wasm).unwrap(); check_interface_version(&module).unwrap(); #[cfg(feature = "allow_interface_version_7")] @@ -472,7 +529,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_wasm(&wasm).unwrap(); + let module = deserialize_exports(&wasm).unwrap(); check_interface_version(&module).unwrap(); } @@ -488,7 +545,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_wasm(&wasm).unwrap(); + let module = deserialize_exports(&wasm).unwrap(); match check_interface_version(&module).unwrap_err() { VmError::StaticValidationErr { msg, .. } => { assert_eq!( @@ -513,7 +570,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_wasm(&wasm).unwrap(); + let module = deserialize_exports(&wasm).unwrap(); match check_interface_version(&module).unwrap_err() { VmError::StaticValidationErr { msg, .. } => { assert_eq!( @@ -537,7 +594,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_wasm(&wasm).unwrap(); + let module = deserialize_exports(&wasm).unwrap(); match check_interface_version(&module).unwrap_err() { VmError::StaticValidationErr { msg, .. } => { assert_eq!(msg, "Wasm contract has unknown interface_version_* marker export (see https://github.com/CosmWasm/cosmwasm/blob/main/packages/vm/README.md)"); @@ -558,7 +615,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_wasm(&wasm).unwrap(); + let module = deserialize_exports(&wasm).unwrap(); match check_interface_version(&module).unwrap_err() { VmError::StaticValidationErr { msg, .. } => { assert_eq!(msg, "Wasm contract has unknown interface_version_* marker export (see https://github.com/CosmWasm/cosmwasm/blob/main/packages/vm/README.md)"); @@ -581,7 +638,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_wasm(&wasm).unwrap(); + let module = deserialize_exports(&wasm).unwrap(); check_wasm_exports(&module).unwrap(); // this is invalid, as it doesn't any required export @@ -593,7 +650,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_wasm(&wasm).unwrap(); + let module = deserialize_exports(&wasm).unwrap(); match check_wasm_exports(&module) { Err(VmError::StaticValidationErr { msg, .. }) => { assert!(msg.starts_with("Wasm contract doesn't have required export: \"allocate\"")); @@ -612,7 +669,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_wasm(&wasm).unwrap(); + let module = deserialize_exports(&wasm).unwrap(); match check_wasm_exports(&module) { Err(VmError::StaticValidationErr { msg, .. }) => { assert!( @@ -626,7 +683,7 @@ mod tests { #[test] fn check_wasm_exports_of_old_contract() { - let module = deserialize_wasm(CONTRACT_0_7).unwrap(); + let module = deserialize_exports(CONTRACT_0_7).unwrap(); match check_wasm_exports(&module) { Err(VmError::StaticValidationErr { msg, .. }) => { assert!( @@ -655,7 +712,13 @@ mod tests { )"#, ) .unwrap(); - check_wasm_imports(&deserialize_wasm(&wasm).unwrap(), SUPPORTED_IMPORTS).unwrap(); + check_wasm_imports( + extract_reader!(&wasm, ImportSection, ImportSectionReader<'_>) + .unwrap() + .unwrap(), + SUPPORTED_IMPORTS, + ) + .unwrap(); } #[test] @@ -766,8 +829,13 @@ mod tests { )"#, ) .unwrap(); - let err = - check_wasm_imports(&deserialize_wasm(&wasm).unwrap(), SUPPORTED_IMPORTS).unwrap_err(); + let err = check_wasm_imports( + extract_reader!(&wasm, ImportSection, ImportSectionReader<'_>) + .unwrap() + .unwrap(), + SUPPORTED_IMPORTS, + ) + .unwrap_err(); match err { VmError::StaticValidationErr { msg, .. } => { assert_eq!(msg, "Import count exceeds limit. Imports: 101. Limit: 100."); @@ -804,7 +872,12 @@ mod tests { "env.debug", "env.query_chain", ]; - let result = check_wasm_imports(&deserialize_wasm(&wasm).unwrap(), supported_imports); + let result = check_wasm_imports( + extract_reader!(&wasm, ImportSection, ImportSectionReader<'_>) + .unwrap() + .unwrap(), + supported_imports, + ); match result.unwrap_err() { VmError::StaticValidationErr { msg, .. } => { println!("{msg}"); @@ -819,8 +892,10 @@ mod tests { #[test] fn check_wasm_imports_of_old_contract() { - let module = deserialize_wasm(CONTRACT_0_7).unwrap(); - let result = check_wasm_imports(&module, SUPPORTED_IMPORTS); + let module = extract_reader!(&CONTRACT_0_7, ImportSection, ImportSectionReader<'_>) + .unwrap() + .unwrap(); + let result = check_wasm_imports(module, SUPPORTED_IMPORTS); match result.unwrap_err() { VmError::StaticValidationErr { msg, .. } => { assert!( @@ -834,7 +909,12 @@ mod tests { #[test] fn check_wasm_imports_wrong_type() { let wasm = wat::parse_str(r#"(module (import "env" "db_read" (memory 1 1)))"#).unwrap(); - let result = check_wasm_imports(&deserialize_wasm(&wasm).unwrap(), SUPPORTED_IMPORTS); + let result = check_wasm_imports( + extract_reader!(&wasm, ImportSection, ImportSectionReader<'_>) + .unwrap() + .unwrap(), + SUPPORTED_IMPORTS, + ); match result.unwrap_err() { VmError::StaticValidationErr { msg, .. } => { assert!( @@ -860,7 +940,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_wasm(&wasm).unwrap(); + let module = deserialize_exports(&wasm).unwrap(); let available = [ "water".to_string(), "nutrients".to_string(), @@ -887,7 +967,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_wasm(&wasm).unwrap(); + let module = deserialize_exports(&wasm).unwrap(); // Available set 1 let available = [ diff --git a/packages/vm/src/errors/vm_error.rs b/packages/vm/src/errors/vm_error.rs index ed7adc6674..b0ed25f9a5 100644 --- a/packages/vm/src/errors/vm_error.rs +++ b/packages/vm/src/errors/vm_error.rs @@ -343,6 +343,14 @@ impl From for VmError { } } +impl From for VmError { + fn from(original: wasmer::wasmparser::BinaryReaderError) -> Self { + VmError::static_validation_err(format!( + "Wasm bytecode could not be deserialized. Deserialization error: \"{original}\"" + )) + } +} + impl From for VmError { fn from(original: wasmer::ExportError) -> Self { VmError::resolve_err(format!("Could not get export: {original}")) diff --git a/packages/vm/src/static_analysis.rs b/packages/vm/src/static_analysis.rs index 94e644721d..767c96977e 100644 --- a/packages/vm/src/static_analysis.rs +++ b/packages/vm/src/static_analysis.rs @@ -1,7 +1,8 @@ -use parity_wasm::elements::{deserialize_buffer, Internal, Module}; use std::collections::HashSet; -use crate::errors::{VmError, VmResult}; +use wasmer::wasmparser::{Export, ExportSectionReader, ExternalKind}; + +use crate::errors::VmResult; pub const REQUIRED_IBC_EXPORTS: &[&str] = &[ "ibc_channel_open", @@ -12,47 +13,88 @@ pub const REQUIRED_IBC_EXPORTS: &[&str] = &[ "ibc_packet_timeout", ]; -pub fn deserialize_wasm(wasm_code: &[u8]) -> VmResult { - deserialize_buffer(wasm_code).map_err(|err| { - VmError::static_validation_err(format!( - "Wasm bytecode could not be deserialized. Deserialization error: \"{err}\"" - )) - }) +/// A small helper macro to validate the wasm module and extract a reader for a specific section. +/// +/// # Example +/// ``` +/// use wasmer::wasmparser::{ExportSectionReader, Export}; +/// use cosmwasm_vm::extract_reader; +/// +/// let wasm_ok = wat::parse_str("(module (memory 512))").unwrap(); +/// check_wasm_memories( +/// extract_reader!(&wasm_ok, MemorySection, MemorySectionReader<'_>).unwrap(), +/// ) +/// .unwrap(); +/// ``` +macro_rules! extract_reader { + ($wasm_code: expr, $payload: ident, $t: ty) => {{ + fn extract(wasm_code: &[u8]) -> crate::VmResult> { + use wasmer::wasmparser::{Parser, Payload, Validator}; + + let mut validator = Validator::new(); + let parser = Parser::new(0); + + let mut value = None; + for p in parser.parse_all(wasm_code) { + let p = p?; + validator.payload(&p)?; + if let Payload::$payload(e) = p { + // do not return immediately, as we want to validate the entire module + value = Some(e); + } + } + + Ok(value) + } + + extract($wasm_code) + }}; +} + +pub(crate) use extract_reader; + +pub fn deserialize_exports(wasm_code: &[u8]) -> VmResult>> { + let exports = extract_reader!(wasm_code, ExportSection, ExportSectionReader<'_>)?; + Ok(exports + .map(|e| e.into_iter().collect::, _>>()) + .transpose()? + .unwrap_or_default()) } /// A trait that allows accessing shared functionality of `parity_wasm::elements::Module` /// and `wasmer::Module` in a shared fashion. pub trait ExportInfo { /// Returns all exported function names with the given prefix - fn exported_function_names(&self, prefix: Option<&str>) -> HashSet; + fn exported_function_names(self, prefix: Option<&str>) -> HashSet; } -impl ExportInfo for Module { - fn exported_function_names(&self, prefix: Option<&str>) -> HashSet { - self.export_section() - .map_or(HashSet::default(), |export_section| { - export_section - .entries() - .iter() - .filter_map(|entry| match entry.internal() { - Internal::Function(_) => Some(entry.field()), - _ => None, - }) - .filter(|name| { - if let Some(required_prefix) = prefix { - name.starts_with(required_prefix) - } else { - true - } - }) - .map(|name| name.to_string()) - .collect() +impl ExportInfo for &[Export<'_>] { + fn exported_function_names(self, prefix: Option<&str>) -> HashSet { + self.iter() + .filter_map(|export| match export.kind { + ExternalKind::Func => Some(export.name), + _ => None, + }) + .filter(|name| { + if let Some(required_prefix) = prefix { + name.starts_with(required_prefix) + } else { + true + } }) + .map(|name| name.to_string()) + .collect() } } -impl ExportInfo for wasmer::Module { - fn exported_function_names(&self, prefix: Option<&str>) -> HashSet { +impl ExportInfo for &Vec> { + fn exported_function_names(self, prefix: Option<&str>) -> HashSet { + self[..].exported_function_names(prefix) + } +} + +impl ExportInfo for &wasmer::Module { + fn exported_function_names(self, prefix: Option<&str>) -> HashSet { self.exports() .functions() .filter_map(|function_export| { @@ -74,7 +116,7 @@ impl ExportInfo for wasmer::Module { /// Returns true if and only if all IBC entry points ([`REQUIRED_IBC_EXPORTS`]) /// exist as exported functions. This does not guarantee the entry points /// are functional and for simplicity does not even check their signatures. -pub fn has_ibc_entry_points(module: &impl ExportInfo) -> bool { +pub fn has_ibc_entry_points(module: impl ExportInfo) -> bool { let available_exports = module.exported_function_names(None); REQUIRED_IBC_EXPORTS .iter() @@ -83,38 +125,33 @@ pub fn has_ibc_entry_points(module: &impl ExportInfo) -> bool { #[cfg(test)] mod tests { + use crate::VmError; + use super::*; - use parity_wasm::elements::Internal; use wasmer::{Cranelift, Store}; static CONTRACT: &[u8] = include_bytes!("../testdata/hackatom.wasm"); static CORRUPTED: &[u8] = include_bytes!("../testdata/corrupted.wasm"); #[test] - fn deserialize_wasm_works() { - let module = deserialize_wasm(CONTRACT).unwrap(); - assert_eq!(module.version(), 1); + fn deserialize_exports_works() { + let module = deserialize_exports(CONTRACT).unwrap(); + // assert_eq!(module.version(), 1); // TODO: not implemented anymore let exported_functions = module - .export_section() - .unwrap() - .entries() .iter() - .filter(|entry| matches!(entry.internal(), Internal::Function(_))); + .filter(|entry| matches!(entry.kind, ExternalKind::Func)); assert_eq!(exported_functions.count(), 8); // 4 required exports plus "execute", "migrate", "query" and "sudo" let exported_memories = module - .export_section() - .unwrap() - .entries() .iter() - .filter(|entry| matches!(entry.internal(), Internal::Memory(_))); + .filter(|entry| matches!(entry.kind, ExternalKind::Memory)); assert_eq!(exported_memories.count(), 1); } #[test] fn deserialize_wasm_corrupted_data() { - match deserialize_wasm(CORRUPTED).unwrap_err() { + match deserialize_exports(CORRUPTED).unwrap_err() { VmError::StaticValidationErr { msg, .. } => { assert!(msg.starts_with("Wasm bytecode could not be deserialized.")) } @@ -125,7 +162,7 @@ mod tests { #[test] fn exported_function_names_works_for_parity_with_no_prefix() { let wasm = wat::parse_str(r#"(module)"#).unwrap(); - let module = deserialize_wasm(&wasm).unwrap(); + let module = deserialize_exports(&wasm).unwrap(); let exports = module.exported_function_names(None); assert_eq!(exports, HashSet::new()); @@ -141,7 +178,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_wasm(&wasm).unwrap(); + let module = deserialize_exports(&wasm).unwrap(); let exports = module.exported_function_names(None); assert_eq!( exports, @@ -152,7 +189,7 @@ mod tests { #[test] fn exported_function_names_works_for_parity_with_prefix() { let wasm = wat::parse_str(r#"(module)"#).unwrap(); - let module = deserialize_wasm(&wasm).unwrap(); + let module = deserialize_exports(&wasm).unwrap(); let exports = module.exported_function_names(Some("b")); assert_eq!(exports, HashSet::new()); @@ -169,7 +206,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_wasm(&wasm).unwrap(); + let module = deserialize_exports(&wasm).unwrap(); let exports = module.exported_function_names(Some("b")); assert_eq!( exports, @@ -257,7 +294,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_wasm(&wasm).unwrap(); + let module = deserialize_exports(&wasm).unwrap(); assert!(!has_ibc_entry_points(&module)); // IBC contract @@ -282,7 +319,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_wasm(&wasm).unwrap(); + let module = deserialize_exports(&wasm).unwrap(); assert!(has_ibc_entry_points(&module)); // Missing packet ack @@ -306,7 +343,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_wasm(&wasm).unwrap(); + let module = deserialize_exports(&wasm).unwrap(); assert!(!has_ibc_entry_points(&module)); } } From b63b3a2e8d66b3132b1723a6d3ea4293a34d0f9d Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 19 Jul 2023 17:07:29 +0200 Subject: [PATCH 0552/2372] Fix tests --- packages/vm/src/cache.rs | 5 +++- packages/vm/src/compatibility.rs | 45 +++++++++++++----------------- packages/vm/src/static_analysis.rs | 12 -------- 3 files changed, 23 insertions(+), 39 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index e21f8d259a..1fe61f9933 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -571,7 +571,10 @@ mod tests { let save_result = cache.save_wasm(&wasm); match save_result.unwrap_err() { VmError::StaticValidationErr { msg, .. } => { - assert_eq!(msg, "Wasm contract doesn\'t have a memory section") + assert_eq!( + msg, + "Wasm contract missing a required marker export: interface_version_*" + ) } e => panic!("Unexpected error {e:?}"), } diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index f64bca067d..f0af607f44 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -114,11 +114,6 @@ fn check_wasm_tables(mut tables: TableSectionReader<'_>) -> VmResult<()> { 1 => { let limits = tables.read()?; if let Some(maximum) = limits.maximum { - if limits.initial > maximum { - return Err(VmError::static_validation_err( - "Wasm contract's first table section has a initial limit > max limit", - )); - } if maximum > TABLE_SIZE_LIMIT { return Err(VmError::static_validation_err( "Wasm contract's first table section has a too large max limit", @@ -323,19 +318,17 @@ mod tests { }; match check_wasm(CONTRACT_0_12, &default_capabilities()) { - Err(VmError::StaticValidationErr { msg, .. }) => assert_eq!( - msg, - "Wasm contract missing a required marker export: interface_version_*" - ), + Err(VmError::StaticValidationErr { msg, .. }) => { + assert!(msg.contains("Wasm contract requires unsupported import")) + } Err(e) => panic!("Unexpected error {e:?}"), Ok(_) => panic!("This must not succeeed"), }; match check_wasm(CONTRACT_0_7, &default_capabilities()) { - Err(VmError::StaticValidationErr { msg, .. }) => assert_eq!( - msg, - "Wasm contract missing a required marker export: interface_version_*" - ), + Err(VmError::StaticValidationErr { msg, .. }) => { + assert!(msg.contains("Wasm contract requires unsupported import")) + } Err(e) => panic!("Unexpected error {e:?}"), Ok(_) => panic!("This must not succeeed"), }; @@ -360,21 +353,22 @@ mod tests { // One table (bound, initial > max) let wasm = wat::parse_str("(module (table $name 124 123 funcref))").unwrap(); + // this should be caught by the validator + let err = extract_reader!(&wasm, TableSection, TableSectionReader<'_>) + .map(|_| ()) + .unwrap_err(); + assert!(err + .to_string() + .contains("size minimum must not be greater than maximum")); + + // One table (bound, max too large) + let wasm = wat::parse_str("(module (table $name 100 9999 funcref))").unwrap(); let err = check_wasm_tables( extract_reader!(&wasm, TableSection, TableSectionReader<'_>) .unwrap() .unwrap(), ) .unwrap_err(); - assert!(err - .to_string() - .contains("Wasm contract's first table section has a initial limit > max limit")); - - // One table (bound, max too large) - let wasm = wat::parse_str("(module (table $name 100 9999 funcref))").unwrap(); - let err = extract_reader!(&wasm, TableSection, TableSectionReader<'_>) - .map(|_| ()) // map away the `Ok` value, it does not impl Debug - .unwrap_err(); assert!(err .to_string() .contains("Wasm contract's first table section has a too large max limit")); @@ -428,11 +422,10 @@ mod tests { )) .unwrap(); - match check_wasm_memories( - extract_reader!(&wasm, MemorySection, MemorySectionReader<'_>).unwrap(), - ) { + // wrong number of memories should be caught by the validator + match extract_reader!(&wasm, MemorySection, MemorySectionReader<'_>) { Err(VmError::StaticValidationErr { msg, .. }) => { - assert!(msg.starts_with("Wasm contract must contain exactly one memory")); + assert!(msg.contains("multiple memories")); } Err(e) => panic!("Unexpected error {e:?}"), Ok(_) => panic!("Didn't reject wasm with invalid api"), diff --git a/packages/vm/src/static_analysis.rs b/packages/vm/src/static_analysis.rs index 767c96977e..5e79585ef5 100644 --- a/packages/vm/src/static_analysis.rs +++ b/packages/vm/src/static_analysis.rs @@ -14,18 +14,6 @@ pub const REQUIRED_IBC_EXPORTS: &[&str] = &[ ]; /// A small helper macro to validate the wasm module and extract a reader for a specific section. -/// -/// # Example -/// ``` -/// use wasmer::wasmparser::{ExportSectionReader, Export}; -/// use cosmwasm_vm::extract_reader; -/// -/// let wasm_ok = wat::parse_str("(module (memory 512))").unwrap(); -/// check_wasm_memories( -/// extract_reader!(&wasm_ok, MemorySection, MemorySectionReader<'_>).unwrap(), -/// ) -/// .unwrap(); -/// ``` macro_rules! extract_reader { ($wasm_code: expr, $payload: ident, $t: ty) => {{ fn extract(wasm_code: &[u8]) -> crate::VmResult> { From 7eea2db491d21e5c891560cfcc72b96b4a43a6c6 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 20 Jul 2023 11:27:51 +0200 Subject: [PATCH 0553/2372] Fix contract lock files --- contracts/burner/Cargo.lock | 74 +++++++++++---------------- contracts/crypto-verify/Cargo.lock | 74 +++++++++++---------------- contracts/cyberpunk/Cargo.lock | 30 +++-------- contracts/floaty/Cargo.lock | 74 +++++++++++---------------- contracts/hackatom/Cargo.lock | 74 +++++++++++---------------- contracts/ibc-reflect-send/Cargo.lock | 74 +++++++++++---------------- contracts/ibc-reflect/Cargo.lock | 74 +++++++++++---------------- contracts/queue/Cargo.lock | 74 +++++++++++---------------- contracts/reflect/Cargo.lock | 74 +++++++++++---------------- contracts/staking/Cargo.lock | 74 +++++++++++---------------- contracts/virus/Cargo.lock | 74 +++++++++++---------------- 11 files changed, 297 insertions(+), 473 deletions(-) diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 780b58f1e6..7a1e1425cb 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ "cfg-if", "libc", "scopeguard", - "windows-sys 0.33.0", + "windows-sys", ] [[package]] @@ -261,7 +261,6 @@ dependencies = [ "derivative", "enumset", "hex", - "parity-wasm", "schemars", "serde", "serde_json", @@ -993,30 +992,24 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "parity-wasm" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" - [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys 0.45.0", + "windows-targets", ] [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project-lite" @@ -1141,9 +1134,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.9" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ "bitflags", ] @@ -1839,35 +1832,26 @@ dependencies = [ "windows_x86_64_msvc 0.33.0", ] -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets", -] - [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ "windows_aarch64_gnullvm", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", "windows_x86_64_gnullvm", - "windows_x86_64_msvc 0.42.2", + "windows_x86_64_msvc 0.48.0", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] name = "windows_aarch64_msvc" @@ -1877,9 +1861,9 @@ checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" [[package]] name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] name = "windows_i686_gnu" @@ -1889,9 +1873,9 @@ checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" [[package]] name = "windows_i686_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" @@ -1901,9 +1885,9 @@ checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" [[package]] name = "windows_i686_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_x86_64_gnu" @@ -1913,15 +1897,15 @@ checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" [[package]] name = "windows_x86_64_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_msvc" @@ -1931,9 +1915,9 @@ checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 8b0074ca41..83e09bcd08 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -177,7 +177,7 @@ dependencies = [ "cfg-if", "libc", "scopeguard", - "windows-sys 0.33.0", + "windows-sys", ] [[package]] @@ -250,7 +250,6 @@ dependencies = [ "derivative", "enumset", "hex", - "parity-wasm", "schemars", "serde", "serde_json", @@ -1010,30 +1009,24 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "parity-wasm" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" - [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys 0.45.0", + "windows-targets", ] [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project-lite" @@ -1158,9 +1151,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.9" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ "bitflags", ] @@ -1882,35 +1875,26 @@ dependencies = [ "windows_x86_64_msvc 0.33.0", ] -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets", -] - [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ "windows_aarch64_gnullvm", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", "windows_x86_64_gnullvm", - "windows_x86_64_msvc 0.42.2", + "windows_x86_64_msvc 0.48.0", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] name = "windows_aarch64_msvc" @@ -1920,9 +1904,9 @@ checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" [[package]] name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] name = "windows_i686_gnu" @@ -1932,9 +1916,9 @@ checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" [[package]] name = "windows_i686_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" @@ -1944,9 +1928,9 @@ checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" [[package]] name = "windows_i686_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_x86_64_gnu" @@ -1956,15 +1940,15 @@ checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" [[package]] name = "windows_x86_64_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_msvc" @@ -1974,9 +1958,9 @@ checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index ae1b4aa6b4..ba0cf97246 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -285,7 +285,6 @@ dependencies = [ "derivative", "enumset", "hex", - "parity-wasm", "schemars", "serde", "serde_json", @@ -1091,30 +1090,24 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "parity-wasm" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" - [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.2.9", + "redox_syscall", "smallvec", - "windows-sys 0.45.0", + "windows-targets 0.48.0", ] [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project-lite" @@ -1237,15 +1230,6 @@ dependencies = [ "num_cpus", ] -[[package]] -name = "redox_syscall" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee" -dependencies = [ - "bitflags", -] - [[package]] name = "redox_syscall" version = "0.3.5" @@ -1580,7 +1564,7 @@ checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" dependencies = [ "cfg-if", "fastrand", - "redox_syscall 0.3.5", + "redox_syscall", "rustix", "windows-sys 0.45.0", ] diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index b22982c2b0..067d47d4c0 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -177,7 +177,7 @@ dependencies = [ "cfg-if", "libc", "scopeguard", - "windows-sys 0.33.0", + "windows-sys", ] [[package]] @@ -250,7 +250,6 @@ dependencies = [ "derivative", "enumset", "hex", - "parity-wasm", "schemars", "serde", "serde_json", @@ -994,30 +993,24 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "parity-wasm" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" - [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys 0.45.0", + "windows-targets", ] [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project-lite" @@ -1142,9 +1135,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.9" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ "bitflags", ] @@ -1840,35 +1833,26 @@ dependencies = [ "windows_x86_64_msvc 0.33.0", ] -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets", -] - [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ "windows_aarch64_gnullvm", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", "windows_x86_64_gnullvm", - "windows_x86_64_msvc 0.42.2", + "windows_x86_64_msvc 0.48.0", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] name = "windows_aarch64_msvc" @@ -1878,9 +1862,9 @@ checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" [[package]] name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] name = "windows_i686_gnu" @@ -1890,9 +1874,9 @@ checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" [[package]] name = "windows_i686_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" @@ -1902,9 +1886,9 @@ checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" [[package]] name = "windows_i686_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_x86_64_gnu" @@ -1914,15 +1898,15 @@ checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" [[package]] name = "windows_x86_64_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_msvc" @@ -1932,9 +1916,9 @@ checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 43d3659f6b..bc781605fe 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -177,7 +177,7 @@ dependencies = [ "cfg-if", "libc", "scopeguard", - "windows-sys 0.33.0", + "windows-sys", ] [[package]] @@ -250,7 +250,6 @@ dependencies = [ "derivative", "enumset", "hex", - "parity-wasm", "schemars", "serde", "serde_json", @@ -995,30 +994,24 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "parity-wasm" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" - [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys 0.45.0", + "windows-targets", ] [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project-lite" @@ -1143,9 +1136,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.9" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ "bitflags", ] @@ -1841,35 +1834,26 @@ dependencies = [ "windows_x86_64_msvc 0.33.0", ] -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets", -] - [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ "windows_aarch64_gnullvm", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", "windows_x86_64_gnullvm", - "windows_x86_64_msvc 0.42.2", + "windows_x86_64_msvc 0.48.0", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] name = "windows_aarch64_msvc" @@ -1879,9 +1863,9 @@ checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" [[package]] name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] name = "windows_i686_gnu" @@ -1891,9 +1875,9 @@ checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" [[package]] name = "windows_i686_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" @@ -1903,9 +1887,9 @@ checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" [[package]] name = "windows_i686_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_x86_64_gnu" @@ -1915,15 +1899,15 @@ checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" [[package]] name = "windows_x86_64_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_msvc" @@ -1933,9 +1917,9 @@ checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 82cac20de9..4f0cbebd58 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -177,7 +177,7 @@ dependencies = [ "cfg-if", "libc", "scopeguard", - "windows-sys 0.33.0", + "windows-sys", ] [[package]] @@ -250,7 +250,6 @@ dependencies = [ "derivative", "enumset", "hex", - "parity-wasm", "schemars", "serde", "serde_json", @@ -993,30 +992,24 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "parity-wasm" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" - [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys 0.45.0", + "windows-targets", ] [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project-lite" @@ -1141,9 +1134,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.9" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ "bitflags", ] @@ -1839,35 +1832,26 @@ dependencies = [ "windows_x86_64_msvc 0.33.0", ] -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets", -] - [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ "windows_aarch64_gnullvm", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", "windows_x86_64_gnullvm", - "windows_x86_64_msvc 0.42.2", + "windows_x86_64_msvc 0.48.0", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] name = "windows_aarch64_msvc" @@ -1877,9 +1861,9 @@ checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" [[package]] name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] name = "windows_i686_gnu" @@ -1889,9 +1873,9 @@ checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" [[package]] name = "windows_i686_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" @@ -1901,9 +1885,9 @@ checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" [[package]] name = "windows_i686_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_x86_64_gnu" @@ -1913,15 +1897,15 @@ checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" [[package]] name = "windows_x86_64_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_msvc" @@ -1931,9 +1915,9 @@ checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index cd927806fb..1319868f94 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -177,7 +177,7 @@ dependencies = [ "cfg-if", "libc", "scopeguard", - "windows-sys 0.33.0", + "windows-sys", ] [[package]] @@ -250,7 +250,6 @@ dependencies = [ "derivative", "enumset", "hex", - "parity-wasm", "schemars", "serde", "serde_json", @@ -993,30 +992,24 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "parity-wasm" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" - [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys 0.45.0", + "windows-targets", ] [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project-lite" @@ -1141,9 +1134,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.9" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ "bitflags", ] @@ -1839,35 +1832,26 @@ dependencies = [ "windows_x86_64_msvc 0.33.0", ] -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets", -] - [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ "windows_aarch64_gnullvm", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", "windows_x86_64_gnullvm", - "windows_x86_64_msvc 0.42.2", + "windows_x86_64_msvc 0.48.0", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] name = "windows_aarch64_msvc" @@ -1877,9 +1861,9 @@ checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" [[package]] name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] name = "windows_i686_gnu" @@ -1889,9 +1873,9 @@ checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" [[package]] name = "windows_i686_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" @@ -1901,9 +1885,9 @@ checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" [[package]] name = "windows_i686_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_x86_64_gnu" @@ -1913,15 +1897,15 @@ checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" [[package]] name = "windows_x86_64_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_msvc" @@ -1931,9 +1915,9 @@ checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 0c2b3eda62..573e612f00 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -177,7 +177,7 @@ dependencies = [ "cfg-if", "libc", "scopeguard", - "windows-sys 0.33.0", + "windows-sys", ] [[package]] @@ -250,7 +250,6 @@ dependencies = [ "derivative", "enumset", "hex", - "parity-wasm", "schemars", "serde", "serde_json", @@ -982,30 +981,24 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "parity-wasm" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" - [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys 0.45.0", + "windows-targets", ] [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project-lite" @@ -1141,9 +1134,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.9" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ "bitflags", ] @@ -1839,35 +1832,26 @@ dependencies = [ "windows_x86_64_msvc 0.33.0", ] -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets", -] - [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ "windows_aarch64_gnullvm", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", "windows_x86_64_gnullvm", - "windows_x86_64_msvc 0.42.2", + "windows_x86_64_msvc 0.48.0", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] name = "windows_aarch64_msvc" @@ -1877,9 +1861,9 @@ checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" [[package]] name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] name = "windows_i686_gnu" @@ -1889,9 +1873,9 @@ checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" [[package]] name = "windows_i686_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" @@ -1901,9 +1885,9 @@ checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" [[package]] name = "windows_i686_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_x86_64_gnu" @@ -1913,15 +1897,15 @@ checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" [[package]] name = "windows_x86_64_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_msvc" @@ -1931,9 +1915,9 @@ checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 9f042e0cc5..2151faa4d0 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -177,7 +177,7 @@ dependencies = [ "cfg-if", "libc", "scopeguard", - "windows-sys 0.33.0", + "windows-sys", ] [[package]] @@ -250,7 +250,6 @@ dependencies = [ "derivative", "enumset", "hex", - "parity-wasm", "schemars", "serde", "serde_json", @@ -982,30 +981,24 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "parity-wasm" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" - [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys 0.45.0", + "windows-targets", ] [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project-lite" @@ -1130,9 +1123,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.9" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ "bitflags", ] @@ -1840,35 +1833,26 @@ dependencies = [ "windows_x86_64_msvc 0.33.0", ] -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets", -] - [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ "windows_aarch64_gnullvm", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", "windows_x86_64_gnullvm", - "windows_x86_64_msvc 0.42.2", + "windows_x86_64_msvc 0.48.0", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] name = "windows_aarch64_msvc" @@ -1878,9 +1862,9 @@ checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" [[package]] name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] name = "windows_i686_gnu" @@ -1890,9 +1874,9 @@ checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" [[package]] name = "windows_i686_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" @@ -1902,9 +1886,9 @@ checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" [[package]] name = "windows_i686_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_x86_64_gnu" @@ -1914,15 +1898,15 @@ checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" [[package]] name = "windows_x86_64_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_msvc" @@ -1932,9 +1916,9 @@ checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 534b141cc7..f0875ba7b9 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -177,7 +177,7 @@ dependencies = [ "cfg-if", "libc", "scopeguard", - "windows-sys 0.33.0", + "windows-sys", ] [[package]] @@ -250,7 +250,6 @@ dependencies = [ "derivative", "enumset", "hex", - "parity-wasm", "schemars", "serde", "serde_json", @@ -988,30 +987,24 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "parity-wasm" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" - [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys 0.45.0", + "windows-targets", ] [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project-lite" @@ -1136,9 +1129,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.9" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ "bitflags", ] @@ -1867,35 +1860,26 @@ dependencies = [ "windows_x86_64_msvc 0.33.0", ] -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets", -] - [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ "windows_aarch64_gnullvm", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", "windows_x86_64_gnullvm", - "windows_x86_64_msvc 0.42.2", + "windows_x86_64_msvc 0.48.0", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] name = "windows_aarch64_msvc" @@ -1905,9 +1889,9 @@ checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" [[package]] name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] name = "windows_i686_gnu" @@ -1917,9 +1901,9 @@ checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" [[package]] name = "windows_i686_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" @@ -1929,9 +1913,9 @@ checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" [[package]] name = "windows_i686_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_x86_64_gnu" @@ -1941,15 +1925,15 @@ checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" [[package]] name = "windows_x86_64_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_msvc" @@ -1959,9 +1943,9 @@ checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index fd55847fb4..1be41e542a 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -177,7 +177,7 @@ dependencies = [ "cfg-if", "libc", "scopeguard", - "windows-sys 0.33.0", + "windows-sys", ] [[package]] @@ -250,7 +250,6 @@ dependencies = [ "derivative", "enumset", "hex", - "parity-wasm", "schemars", "serde", "serde_json", @@ -982,30 +981,24 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "parity-wasm" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" - [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys 0.45.0", + "windows-targets", ] [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project-lite" @@ -1130,9 +1123,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.9" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ "bitflags", ] @@ -1840,35 +1833,26 @@ dependencies = [ "windows_x86_64_msvc 0.33.0", ] -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets", -] - [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ "windows_aarch64_gnullvm", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", "windows_x86_64_gnullvm", - "windows_x86_64_msvc 0.42.2", + "windows_x86_64_msvc 0.48.0", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] name = "windows_aarch64_msvc" @@ -1878,9 +1862,9 @@ checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" [[package]] name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] name = "windows_i686_gnu" @@ -1890,9 +1874,9 @@ checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" [[package]] name = "windows_i686_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" @@ -1902,9 +1886,9 @@ checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" [[package]] name = "windows_i686_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_x86_64_gnu" @@ -1914,15 +1898,15 @@ checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" [[package]] name = "windows_x86_64_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_msvc" @@ -1932,9 +1916,9 @@ checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" From f3a234a6d71b5fcc063d079c3d1907b64e219c2b Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 20 Jul 2023 11:49:57 +0200 Subject: [PATCH 0554/2372] Fix lint --- packages/vm/src/compatibility.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index f0af607f44..9cfdc4dfe1 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -885,7 +885,7 @@ mod tests { #[test] fn check_wasm_imports_of_old_contract() { - let module = extract_reader!(&CONTRACT_0_7, ImportSection, ImportSectionReader<'_>) + let module = extract_reader!(CONTRACT_0_7, ImportSection, ImportSectionReader<'_>) .unwrap() .unwrap(); let result = check_wasm_imports(module, SUPPORTED_IMPORTS); From d09523db823a7338acc3306ecd65e2d0c70fd21a Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 20 Jul 2023 14:48:47 +0200 Subject: [PATCH 0555/2372] Validate function bodies --- packages/vm/src/static_analysis.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/vm/src/static_analysis.rs b/packages/vm/src/static_analysis.rs index 5e79585ef5..ddf55195e2 100644 --- a/packages/vm/src/static_analysis.rs +++ b/packages/vm/src/static_analysis.rs @@ -17,7 +17,7 @@ pub const REQUIRED_IBC_EXPORTS: &[&str] = &[ macro_rules! extract_reader { ($wasm_code: expr, $payload: ident, $t: ty) => {{ fn extract(wasm_code: &[u8]) -> crate::VmResult> { - use wasmer::wasmparser::{Parser, Payload, Validator}; + use wasmer::wasmparser::{Parser, Payload, ValidPayload, Validator}; let mut validator = Validator::new(); let parser = Parser::new(0); @@ -25,7 +25,11 @@ macro_rules! extract_reader { let mut value = None; for p in parser.parse_all(wasm_code) { let p = p?; - validator.payload(&p)?; + // validate the payload + if let ValidPayload::Func(mut fv, body) = validator.payload(&p)? { + // also validate function bodies + fv.validate(&body)?; + } if let Payload::$payload(e) = p { // do not return immediately, as we want to validate the entire module value = Some(e); From 6bd9a8f5ff8bf3ad42908e807529da569be6817c Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 20 Jul 2023 15:57:35 +0200 Subject: [PATCH 0556/2372] Refactor wasm validation --- packages/vm/src/compatibility.rs | 16 +++---- packages/vm/src/static_analysis.rs | 68 +++++++++++++++++++++--------- 2 files changed, 54 insertions(+), 30 deletions(-) diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index 9cfdc4dfe1..e11300d188 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -5,15 +5,14 @@ use wasmer::wasmparser::Export; use wasmer::wasmparser::Import; use wasmer::wasmparser::ImportSectionReader; use wasmer::wasmparser::MemorySectionReader; -use wasmer::wasmparser::Parser; use wasmer::wasmparser::Payload; use wasmer::wasmparser::TableSectionReader; use wasmer::wasmparser::TypeRef; -use wasmer::wasmparser::Validator; use crate::capabilities::required_capabilities_from_module; use crate::errors::{VmError, VmResult}; use crate::limited::LimitedDisplay; +use crate::static_analysis::validate_wasm; use crate::static_analysis::ExportInfo; /// Lists all imports we provide upon instantiating the instance in Instance::from_module() @@ -81,15 +80,8 @@ const MAX_IMPORTS: u32 = 100; /// Checks if the data is valid wasm and compatibility with the CosmWasm API (imports and exports) pub fn check_wasm(wasm_code: &[u8], available_capabilities: &HashSet) -> VmResult<()> { - let parsed = Parser::new(0).parse_all(wasm_code); - let mut validator = Validator::new(); - // TODO: some of the validator checks are duplicated in our checks below - let mut memory_section: Option> = None; - for payload in parsed { - let payload = payload?; - validator.payload(&payload)?; - + validate_wasm(wasm_code, |payload| { match payload { Payload::TableSection(t) => check_wasm_tables(t)?, Payload::MemorySection(m) => memory_section = Some(m), @@ -102,7 +94,9 @@ pub fn check_wasm(wasm_code: &[u8], available_capabilities: &HashSet) -> Payload::ImportSection(i) => check_wasm_imports(i, SUPPORTED_IMPORTS)?, _ => {} } - } + Ok(()) + })?; + // we want to fail if there is no memory section, so this check is delayed until the end check_wasm_memories(memory_section)?; Ok(()) diff --git a/packages/vm/src/static_analysis.rs b/packages/vm/src/static_analysis.rs index ddf55195e2..74a2dfe578 100644 --- a/packages/vm/src/static_analysis.rs +++ b/packages/vm/src/static_analysis.rs @@ -1,6 +1,9 @@ use std::collections::HashSet; -use wasmer::wasmparser::{Export, ExportSectionReader, ExternalKind}; +use wasmer::wasmparser::{ + Export, ExportSectionReader, ExternalKind, Parser, Payload, ValidPayload, Validator, + WasmFeatures, +}; use crate::errors::VmResult; @@ -13,29 +16,56 @@ pub const REQUIRED_IBC_EXPORTS: &[&str] = &[ "ibc_packet_timeout", ]; +/// Validates the given wasm code and calls the callback for each payload. +/// "Validates" in this case refers to general WebAssembly validation, not specific to CosmWasm. +pub fn validate_wasm<'a>( + wasm_code: &'a [u8], + mut handle_payload: impl FnMut(Payload<'a>) -> VmResult<()>, +) -> VmResult<()> { + let mut validator = Validator::new_with_features(WasmFeatures { + mutable_global: false, + saturating_float_to_int: false, + sign_extension: true, + reference_types: true, + multi_value: false, + bulk_memory: false, + component_model: false, + simd: false, + relaxed_simd: false, + threads: false, + tail_call: false, + deterministic_only: true, + multi_memory: false, + exceptions: false, + memory64: false, + extended_const: false, + }); + + for p in Parser::new(0).parse_all(wasm_code) { + let p = p?; + // validate the payload + if let ValidPayload::Func(fv, body) = validator.payload(&p)? { + // also validate function bodies + fv.into_validator(Default::default()).validate(&body)?; + } + // tell caller about the payload + handle_payload(p)?; + } + + Ok(()) +} + /// A small helper macro to validate the wasm module and extract a reader for a specific section. macro_rules! extract_reader { ($wasm_code: expr, $payload: ident, $t: ty) => {{ - fn extract(wasm_code: &[u8]) -> crate::VmResult> { - use wasmer::wasmparser::{Parser, Payload, ValidPayload, Validator}; - - let mut validator = Validator::new(); - let parser = Parser::new(0); - + fn extract(wasm_code: &[u8]) -> $crate::VmResult> { let mut value = None; - for p in parser.parse_all(wasm_code) { - let p = p?; - // validate the payload - if let ValidPayload::Func(mut fv, body) = validator.payload(&p)? { - // also validate function bodies - fv.validate(&body)?; - } - if let Payload::$payload(e) = p { - // do not return immediately, as we want to validate the entire module - value = Some(e); + $crate::static_analysis::validate_wasm(wasm_code, |p| { + if let Payload::$payload(p) = p { + value = Some(p); } - } - + Ok(()) + })?; Ok(value) } From 749586fbe7b018593c28aa75610ec6f9f995ac64 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 20 Jul 2023 16:36:08 +0200 Subject: [PATCH 0557/2372] Adjust WasmFeatures for validation --- packages/vm/src/static_analysis.rs | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/packages/vm/src/static_analysis.rs b/packages/vm/src/static_analysis.rs index 74a2dfe578..3a43140009 100644 --- a/packages/vm/src/static_analysis.rs +++ b/packages/vm/src/static_analysis.rs @@ -23,22 +23,14 @@ pub fn validate_wasm<'a>( mut handle_payload: impl FnMut(Payload<'a>) -> VmResult<()>, ) -> VmResult<()> { let mut validator = Validator::new_with_features(WasmFeatures { - mutable_global: false, - saturating_float_to_int: false, - sign_extension: true, - reference_types: true, - multi_value: false, - bulk_memory: false, + deterministic_only: true, component_model: false, simd: false, relaxed_simd: false, threads: false, - tail_call: false, - deterministic_only: true, multi_memory: false, - exceptions: false, memory64: false, - extended_const: false, + ..Default::default() }); for p in Parser::new(0).parse_all(wasm_code) { From bc7cd910533feff01265f618bc5a9240cc273c28 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 24 Jul 2023 12:57:26 +0200 Subject: [PATCH 0558/2372] Reuse validator allocations --- packages/vm/src/static_analysis.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/vm/src/static_analysis.rs b/packages/vm/src/static_analysis.rs index 3a43140009..f3e5804427 100644 --- a/packages/vm/src/static_analysis.rs +++ b/packages/vm/src/static_analysis.rs @@ -33,12 +33,15 @@ pub fn validate_wasm<'a>( ..Default::default() }); + let mut fun_allocations = Default::default(); for p in Parser::new(0).parse_all(wasm_code) { let p = p?; // validate the payload if let ValidPayload::Func(fv, body) = validator.payload(&p)? { // also validate function bodies - fv.into_validator(Default::default()).validate(&body)?; + let mut fun_validator = fv.into_validator(fun_allocations); + fun_validator.validate(&body)?; + fun_allocations = fun_validator.into_allocations(); } // tell caller about the payload handle_payload(p)?; From c23482fae66c04c672707ca9c1a6f2381877ef4d Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 24 Jul 2023 16:34:09 +0200 Subject: [PATCH 0559/2372] Parse and validate wasm before static analysis --- packages/vm/src/cache.rs | 10 +- packages/vm/src/capabilities.rs | 7 +- packages/vm/src/compatibility.rs | 211 +++++++++-------------------- packages/vm/src/lib.rs | 1 + packages/vm/src/parsed_wasm.rs | 70 ++++++++++ packages/vm/src/static_analysis.rs | 102 +++----------- 6 files changed, 160 insertions(+), 241 deletions(-) create mode 100644 packages/vm/src/parsed_wasm.rs diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 1fe61f9933..7d853affa0 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -14,8 +14,9 @@ use crate::errors::{VmError, VmResult}; use crate::filesystem::mkdir_p; use crate::instance::{Instance, InstanceOptions}; use crate::modules::{CachedModule, FileSystemCache, InMemoryCache, PinnedMemoryCache}; +use crate::parsed_wasm::ParsedWasm; use crate::size::Size; -use crate::static_analysis::{deserialize_exports, has_ibc_entry_points}; +use crate::static_analysis::has_ibc_entry_points; use crate::wasm_backend::{compile, make_compiling_engine, make_runtime_engine}; const STATE_DIR: &str = "state"; @@ -254,7 +255,7 @@ where pub fn analyze(&self, checksum: &Checksum) -> VmResult { // Here we could use a streaming deserializer to slightly improve performance. However, this way it is DRYer. let wasm = self.load_wasm(checksum)?; - let module = deserialize_exports(&wasm)?; + let module = ParsedWasm::parse(&wasm)?; Ok(AnalysisReport { has_ibc_entry_points: has_ibc_entry_points(&module), required_capabilities: required_capabilities_from_module(&module), @@ -571,10 +572,7 @@ mod tests { let save_result = cache.save_wasm(&wasm); match save_result.unwrap_err() { VmError::StaticValidationErr { msg, .. } => { - assert_eq!( - msg, - "Wasm contract missing a required marker export: interface_version_*" - ) + assert_eq!(msg, "Wasm contract must contain exactly one memory") } e => panic!("Unexpected error {e:?}"), } diff --git a/packages/vm/src/capabilities.rs b/packages/vm/src/capabilities.rs index af560c007d..8281105011 100644 --- a/packages/vm/src/capabilities.rs +++ b/packages/vm/src/capabilities.rs @@ -32,8 +32,9 @@ pub fn required_capabilities_from_module(module: impl ExportInfo) -> HashSet) -> VmResult<()> { - let mut memory_section: Option> = None; - validate_wasm(wasm_code, |payload| { - match payload { - Payload::TableSection(t) => check_wasm_tables(t)?, - Payload::MemorySection(m) => memory_section = Some(m), - Payload::ExportSection(e) => { - let exports = e.into_iter().collect::, _>>()?; - check_interface_version(&exports)?; - check_wasm_exports(&exports)?; - check_wasm_capabilities(&exports, available_capabilities)?; - } - Payload::ImportSection(i) => check_wasm_imports(i, SUPPORTED_IMPORTS)?, - _ => {} - } - Ok(()) - })?; - // we want to fail if there is no memory section, so this check is delayed until the end - check_wasm_memories(memory_section)?; + let module = ParsedWasm::parse(wasm_code)?; + + check_wasm_tables(&module)?; + check_wasm_memories(&module)?; + check_interface_version(&module)?; + check_wasm_exports(&module)?; + check_wasm_imports(&module, SUPPORTED_IMPORTS)?; + check_wasm_capabilities(&module, available_capabilities)?; Ok(()) } -fn check_wasm_tables(mut tables: TableSectionReader<'_>) -> VmResult<()> { - match tables.get_count() { +fn check_wasm_tables(module: &ParsedWasm) -> VmResult<()> { + match module.tables.len() { 0 => Ok(()), 1 => { - let limits = tables.read()?; + let limits = &module.tables[0]; if let Some(maximum) = limits.maximum { if maximum > TABLE_SIZE_LIMIT { return Err(VmError::static_validation_err( @@ -126,23 +111,13 @@ fn check_wasm_tables(mut tables: TableSectionReader<'_>) -> VmResult<()> { } } -fn check_wasm_memories(memory: Option>) -> VmResult<()> { - let mut section = match memory { - Some(section) => section, - None => { - return Err(VmError::static_validation_err( - "Wasm contract doesn't have a memory section", - )); - } - }; - - if section.get_count() != 1 { +fn check_wasm_memories(module: &ParsedWasm) -> VmResult<()> { + if module.memories.len() != 1 { return Err(VmError::static_validation_err( "Wasm contract must contain exactly one memory", )); } - - let memory = section.read()?; + let memory = &module.memories[0]; if memory.initial > MEMORY_LIMIT as u64 { return Err(VmError::static_validation_err(format!( @@ -158,8 +133,8 @@ fn check_wasm_memories(memory: Option>) -> VmResult<()> Ok(()) } -fn check_interface_version(exports: &[Export<'_>]) -> VmResult<()> { - let mut interface_version_exports = exports +fn check_interface_version(module: &ParsedWasm) -> VmResult<()> { + let mut interface_version_exports = module .exported_function_names(Some(INTERFACE_VERSION_PREFIX)) .into_iter(); if let Some(first_interface_version_export) = interface_version_exports.next() { @@ -188,8 +163,8 @@ fn check_interface_version(exports: &[Export<'_>]) -> VmResult<()> { } } -fn check_wasm_exports(exports: &[Export<'_>]) -> VmResult<()> { - let available_exports: HashSet = exports.exported_function_names(None); +fn check_wasm_exports(module: &ParsedWasm) -> VmResult<()> { + let available_exports: HashSet = module.exported_function_names(None); for required_export in REQUIRED_EXPORTS { if !available_exports.contains(*required_export) { return Err(VmError::static_validation_err(format!( @@ -203,25 +178,20 @@ fn check_wasm_exports(exports: &[Export<'_>]) -> VmResult<()> { /// Checks if the import requirements of the contract are satisfied. /// When this is not the case, we either have an incompatibility between contract and VM /// or a error in the contract. -fn check_wasm_imports(imports: ImportSectionReader, supported_imports: &[&str]) -> VmResult<()> { - if imports.get_count() > MAX_IMPORTS { +fn check_wasm_imports(module: &ParsedWasm, supported_imports: &[&str]) -> VmResult<()> { + if module.imports.len() > MAX_IMPORTS { return Err(VmError::static_validation_err(format!( "Import count exceeds limit. Imports: {}. Limit: {}.", - imports.get_count(), + module.imports.len(), MAX_IMPORTS ))); } - let required_imports = imports - .into_iter() - .map(|i| Ok(i?)) - .collect::>>()?; - - for required_import in &required_imports { + for required_import in &module.imports { let full_name = full_import_name(required_import); if !supported_imports.contains(&full_name.as_str()) { let required_import_names: BTreeSet<_> = - required_imports.iter().map(full_import_name).collect(); + module.imports.iter().map(full_import_name).collect(); return Err(VmError::static_validation_err(format!( "Wasm contract requires unsupported import: \"{}\". Required imports: {}. Available imports: {:?}.", full_name, required_import_names.to_string_limited(200), supported_imports @@ -243,7 +213,7 @@ fn full_import_name(ie: &Import) -> String { } fn check_wasm_capabilities( - exports: &[Export<'_>], + exports: &ParsedWasm, available_capabilities: &HashSet, ) -> VmResult<()> { let required_capabilities = required_capabilities_from_module(exports); @@ -263,10 +233,7 @@ fn check_wasm_capabilities( #[cfg(test)] mod tests { use super::*; - use crate::{ - errors::VmError, - static_analysis::{deserialize_exports, extract_reader}, - }; + use crate::errors::VmError; static CONTRACT_0_7: &[u8] = include_bytes!("../testdata/hackatom_0.7.wasm"); static CONTRACT_0_12: &[u8] = include_bytes!("../testdata/hackatom_0.12.wasm"); @@ -313,7 +280,9 @@ mod tests { match check_wasm(CONTRACT_0_12, &default_capabilities()) { Err(VmError::StaticValidationErr { msg, .. }) => { - assert!(msg.contains("Wasm contract requires unsupported import")) + assert!(msg.contains( + "Wasm contract missing a required marker export: interface_version_*" + )) } Err(e) => panic!("Unexpected error {e:?}"), Ok(_) => panic!("This must not succeeed"), @@ -321,7 +290,9 @@ mod tests { match check_wasm(CONTRACT_0_7, &default_capabilities()) { Err(VmError::StaticValidationErr { msg, .. }) => { - assert!(msg.contains("Wasm contract requires unsupported import")) + assert!(msg.contains( + "Wasm contract missing a required marker export: interface_version_*" + )) } Err(e) => panic!("Unexpected error {e:?}"), Ok(_) => panic!("This must not succeeed"), @@ -332,49 +303,30 @@ mod tests { fn check_wasm_tables_works() { // No tables is fine let wasm = wat::parse_str("(module)").unwrap(); - assert!(extract_reader!(&wasm, TableSection, TableSectionReader<'_>) - .unwrap() - .is_none()); + assert!(ParsedWasm::parse(&wasm).unwrap().memories.is_empty()); // One table (bound) let wasm = wat::parse_str("(module (table $name 123 123 funcref))").unwrap(); - check_wasm_tables( - extract_reader!(&wasm, TableSection, TableSectionReader<'_>) - .unwrap() - .unwrap(), - ) - .unwrap(); + check_wasm_tables(&ParsedWasm::parse(&wasm).unwrap()).unwrap(); // One table (bound, initial > max) let wasm = wat::parse_str("(module (table $name 124 123 funcref))").unwrap(); // this should be caught by the validator - let err = extract_reader!(&wasm, TableSection, TableSectionReader<'_>) - .map(|_| ()) - .unwrap_err(); + let err = &ParsedWasm::parse(&wasm).unwrap_err(); assert!(err .to_string() .contains("size minimum must not be greater than maximum")); // One table (bound, max too large) let wasm = wat::parse_str("(module (table $name 100 9999 funcref))").unwrap(); - let err = check_wasm_tables( - extract_reader!(&wasm, TableSection, TableSectionReader<'_>) - .unwrap() - .unwrap(), - ) - .unwrap_err(); + let err = check_wasm_tables(&ParsedWasm::parse(&wasm).unwrap()).unwrap_err(); assert!(err .to_string() .contains("Wasm contract's first table section has a too large max limit")); // One table (unbound) let wasm = wat::parse_str("(module (table $name 100 funcref))").unwrap(); - let err = check_wasm_tables( - extract_reader!(&wasm, TableSection, TableSectionReader<'_>) - .unwrap() - .unwrap(), - ) - .unwrap_err(); + let err = check_wasm_tables(&ParsedWasm::parse(&wasm).unwrap()).unwrap_err(); assert!(err .to_string() .contains("Wasm contract must not have unbound table section")); @@ -383,18 +335,15 @@ mod tests { #[test] fn check_wasm_memories_ok() { let wasm = wat::parse_str("(module (memory 1))").unwrap(); - check_wasm_memories(extract_reader!(&wasm, MemorySection, MemorySectionReader<'_>).unwrap()) - .unwrap() + check_wasm_memories(&ParsedWasm::parse(&wasm).unwrap()).unwrap() } #[test] fn check_wasm_memories_no_memory() { let wasm = wat::parse_str("(module)").unwrap(); - match check_wasm_memories( - extract_reader!(&wasm, MemorySection, MemorySectionReader<'_>).unwrap(), - ) { + match check_wasm_memories(&ParsedWasm::parse(&wasm).unwrap()) { Err(VmError::StaticValidationErr { msg, .. }) => { - assert!(msg.starts_with("Wasm contract doesn't have a memory section")); + assert!(msg.starts_with("Wasm contract must contain exactly one memory")); } Err(e) => panic!("Unexpected error {e:?}"), Ok(_) => panic!("Didn't reject wasm with invalid api"), @@ -417,7 +366,7 @@ mod tests { .unwrap(); // wrong number of memories should be caught by the validator - match extract_reader!(&wasm, MemorySection, MemorySectionReader<'_>) { + match ParsedWasm::parse(&wasm) { Err(VmError::StaticValidationErr { msg, .. }) => { assert!(msg.contains("multiple memories")); } @@ -438,9 +387,7 @@ mod tests { )) .unwrap(); - match check_wasm_memories( - extract_reader!(&wasm, MemorySection, MemorySectionReader<'_>).unwrap(), - ) { + match check_wasm_memories(&ParsedWasm::parse(&wasm).unwrap()) { Err(VmError::StaticValidationErr { msg, .. }) => { assert!(msg.starts_with("Wasm contract must contain exactly one memory")); } @@ -452,15 +399,10 @@ mod tests { #[test] fn check_wasm_memories_initial_size() { let wasm_ok = wat::parse_str("(module (memory 512))").unwrap(); - check_wasm_memories( - extract_reader!(&wasm_ok, MemorySection, MemorySectionReader<'_>).unwrap(), - ) - .unwrap(); + check_wasm_memories(&ParsedWasm::parse(&wasm_ok).unwrap()).unwrap(); let wasm_too_big = wat::parse_str("(module (memory 513))").unwrap(); - match check_wasm_memories( - extract_reader!(&wasm_too_big, MemorySection, MemorySectionReader<'_>).unwrap(), - ) { + match check_wasm_memories(&ParsedWasm::parse(&wasm_too_big).unwrap()) { Err(VmError::StaticValidationErr { msg, .. }) => { assert!(msg.starts_with("Wasm contract memory's minimum must not exceed 512 pages")); } @@ -472,9 +414,7 @@ mod tests { #[test] fn check_wasm_memories_maximum_size() { let wasm_max = wat::parse_str("(module (memory 1 5))").unwrap(); - match check_wasm_memories( - extract_reader!(&wasm_max, MemorySection, MemorySectionReader<'_>).unwrap(), - ) { + match check_wasm_memories(&ParsedWasm::parse(&wasm_max).unwrap()) { Err(VmError::StaticValidationErr { msg, .. }) => { assert!(msg.starts_with("Wasm contract memory's maximum must be unset")); } @@ -498,7 +438,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_exports(&wasm).unwrap(); + let module = ParsedWasm::parse(&wasm).unwrap(); check_interface_version(&module).unwrap(); #[cfg(feature = "allow_interface_version_7")] @@ -516,7 +456,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_exports(&wasm).unwrap(); + let module = ParsedWasm::parse(&wasm).unwrap(); check_interface_version(&module).unwrap(); } @@ -532,7 +472,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_exports(&wasm).unwrap(); + let module = ParsedWasm::parse(&wasm).unwrap(); match check_interface_version(&module).unwrap_err() { VmError::StaticValidationErr { msg, .. } => { assert_eq!( @@ -557,7 +497,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_exports(&wasm).unwrap(); + let module = ParsedWasm::parse(&wasm).unwrap(); match check_interface_version(&module).unwrap_err() { VmError::StaticValidationErr { msg, .. } => { assert_eq!( @@ -581,7 +521,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_exports(&wasm).unwrap(); + let module = ParsedWasm::parse(&wasm).unwrap(); match check_interface_version(&module).unwrap_err() { VmError::StaticValidationErr { msg, .. } => { assert_eq!(msg, "Wasm contract has unknown interface_version_* marker export (see https://github.com/CosmWasm/cosmwasm/blob/main/packages/vm/README.md)"); @@ -602,7 +542,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_exports(&wasm).unwrap(); + let module = ParsedWasm::parse(&wasm).unwrap(); match check_interface_version(&module).unwrap_err() { VmError::StaticValidationErr { msg, .. } => { assert_eq!(msg, "Wasm contract has unknown interface_version_* marker export (see https://github.com/CosmWasm/cosmwasm/blob/main/packages/vm/README.md)"); @@ -625,7 +565,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_exports(&wasm).unwrap(); + let module = ParsedWasm::parse(&wasm).unwrap(); check_wasm_exports(&module).unwrap(); // this is invalid, as it doesn't any required export @@ -637,7 +577,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_exports(&wasm).unwrap(); + let module = ParsedWasm::parse(&wasm).unwrap(); match check_wasm_exports(&module) { Err(VmError::StaticValidationErr { msg, .. }) => { assert!(msg.starts_with("Wasm contract doesn't have required export: \"allocate\"")); @@ -656,7 +596,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_exports(&wasm).unwrap(); + let module = ParsedWasm::parse(&wasm).unwrap(); match check_wasm_exports(&module) { Err(VmError::StaticValidationErr { msg, .. }) => { assert!( @@ -670,7 +610,7 @@ mod tests { #[test] fn check_wasm_exports_of_old_contract() { - let module = deserialize_exports(CONTRACT_0_7).unwrap(); + let module = ParsedWasm::parse(CONTRACT_0_7).unwrap(); match check_wasm_exports(&module) { Err(VmError::StaticValidationErr { msg, .. }) => { assert!( @@ -699,13 +639,7 @@ mod tests { )"#, ) .unwrap(); - check_wasm_imports( - extract_reader!(&wasm, ImportSection, ImportSectionReader<'_>) - .unwrap() - .unwrap(), - SUPPORTED_IMPORTS, - ) - .unwrap(); + check_wasm_imports(&ParsedWasm::parse(&wasm).unwrap(), SUPPORTED_IMPORTS).unwrap(); } #[test] @@ -816,13 +750,8 @@ mod tests { )"#, ) .unwrap(); - let err = check_wasm_imports( - extract_reader!(&wasm, ImportSection, ImportSectionReader<'_>) - .unwrap() - .unwrap(), - SUPPORTED_IMPORTS, - ) - .unwrap_err(); + let err = + check_wasm_imports(&ParsedWasm::parse(&wasm).unwrap(), SUPPORTED_IMPORTS).unwrap_err(); match err { VmError::StaticValidationErr { msg, .. } => { assert_eq!(msg, "Import count exceeds limit. Imports: 101. Limit: 100."); @@ -859,12 +788,7 @@ mod tests { "env.debug", "env.query_chain", ]; - let result = check_wasm_imports( - extract_reader!(&wasm, ImportSection, ImportSectionReader<'_>) - .unwrap() - .unwrap(), - supported_imports, - ); + let result = check_wasm_imports(&ParsedWasm::parse(&wasm).unwrap(), supported_imports); match result.unwrap_err() { VmError::StaticValidationErr { msg, .. } => { println!("{msg}"); @@ -879,9 +803,7 @@ mod tests { #[test] fn check_wasm_imports_of_old_contract() { - let module = extract_reader!(CONTRACT_0_7, ImportSection, ImportSectionReader<'_>) - .unwrap() - .unwrap(); + let module = &ParsedWasm::parse(CONTRACT_0_7).unwrap(); let result = check_wasm_imports(module, SUPPORTED_IMPORTS); match result.unwrap_err() { VmError::StaticValidationErr { msg, .. } => { @@ -896,12 +818,7 @@ mod tests { #[test] fn check_wasm_imports_wrong_type() { let wasm = wat::parse_str(r#"(module (import "env" "db_read" (memory 1 1)))"#).unwrap(); - let result = check_wasm_imports( - extract_reader!(&wasm, ImportSection, ImportSectionReader<'_>) - .unwrap() - .unwrap(), - SUPPORTED_IMPORTS, - ); + let result = check_wasm_imports(&ParsedWasm::parse(&wasm).unwrap(), SUPPORTED_IMPORTS); match result.unwrap_err() { VmError::StaticValidationErr { msg, .. } => { assert!( @@ -927,7 +844,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_exports(&wasm).unwrap(); + let module = ParsedWasm::parse(&wasm).unwrap(); let available = [ "water".to_string(), "nutrients".to_string(), @@ -954,7 +871,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_exports(&wasm).unwrap(); + let module = ParsedWasm::parse(&wasm).unwrap(); // Available set 1 let available = [ diff --git a/packages/vm/src/lib.rs b/packages/vm/src/lib.rs index af7ed2f519..05987bac76 100644 --- a/packages/vm/src/lib.rs +++ b/packages/vm/src/lib.rs @@ -16,6 +16,7 @@ mod instance; mod limited; mod memory; mod modules; +mod parsed_wasm; mod sections; mod serde; mod size; diff --git a/packages/vm/src/parsed_wasm.rs b/packages/vm/src/parsed_wasm.rs new file mode 100644 index 0000000000..6de9fbaed4 --- /dev/null +++ b/packages/vm/src/parsed_wasm.rs @@ -0,0 +1,70 @@ +use wasmer::wasmparser::{ + Export, Import, MemoryType, Parser, TableType, ValidPayload, Validator, WasmFeatures, +}; + +use crate::VmResult; + +/// A parsed and validated wasm module. +/// It keeps track of the parts that are important for our static analysis and compatibility checks. +#[derive(Debug)] +pub struct ParsedWasm<'a> { + pub version: u32, + pub exports: Vec>, + pub imports: Vec>, + pub tables: Vec, + pub memories: Vec, +} + +impl<'a> ParsedWasm<'a> { + pub fn parse(wasm: &'a [u8]) -> VmResult { + let mut validator = Validator::new_with_features(WasmFeatures { + deterministic_only: true, + component_model: false, + simd: false, + relaxed_simd: false, + threads: false, + multi_memory: false, + memory64: false, + ..Default::default() + }); + + let mut this = Self { + version: 0, + exports: vec![], + imports: vec![], + tables: vec![], + memories: vec![], + }; + + let mut fun_allocations = Default::default(); + for p in Parser::new(0).parse_all(wasm) { + let p = p?; + // validate the payload + if let ValidPayload::Func(fv, body) = validator.payload(&p)? { + // also validate function bodies + let mut fun_validator = fv.into_validator(fun_allocations); + fun_validator.validate(&body)?; + fun_allocations = fun_validator.into_allocations(); + } + + match p { + wasmer::wasmparser::Payload::Version { num, .. } => this.version = num, + wasmer::wasmparser::Payload::ImportSection(i) => { + this.imports = i.into_iter().collect::, _>>()?; + } + wasmer::wasmparser::Payload::TableSection(t) => { + this.tables = t.into_iter().collect::, _>>()?; + } + wasmer::wasmparser::Payload::MemorySection(m) => { + this.memories = m.into_iter().collect::, _>>()?; + } + wasmer::wasmparser::Payload::ExportSection(e) => { + this.exports = e.into_iter().collect::, _>>()?; + } + _ => {} // ignore everything else + } + } + + Ok(this) + } +} diff --git a/packages/vm/src/static_analysis.rs b/packages/vm/src/static_analysis.rs index f3e5804427..7e20fb95f3 100644 --- a/packages/vm/src/static_analysis.rs +++ b/packages/vm/src/static_analysis.rs @@ -1,11 +1,8 @@ use std::collections::HashSet; -use wasmer::wasmparser::{ - Export, ExportSectionReader, ExternalKind, Parser, Payload, ValidPayload, Validator, - WasmFeatures, -}; +use wasmer::wasmparser::ExternalKind; -use crate::errors::VmResult; +use crate::parsed_wasm::ParsedWasm; pub const REQUIRED_IBC_EXPORTS: &[&str] = &[ "ibc_channel_open", @@ -16,68 +13,6 @@ pub const REQUIRED_IBC_EXPORTS: &[&str] = &[ "ibc_packet_timeout", ]; -/// Validates the given wasm code and calls the callback for each payload. -/// "Validates" in this case refers to general WebAssembly validation, not specific to CosmWasm. -pub fn validate_wasm<'a>( - wasm_code: &'a [u8], - mut handle_payload: impl FnMut(Payload<'a>) -> VmResult<()>, -) -> VmResult<()> { - let mut validator = Validator::new_with_features(WasmFeatures { - deterministic_only: true, - component_model: false, - simd: false, - relaxed_simd: false, - threads: false, - multi_memory: false, - memory64: false, - ..Default::default() - }); - - let mut fun_allocations = Default::default(); - for p in Parser::new(0).parse_all(wasm_code) { - let p = p?; - // validate the payload - if let ValidPayload::Func(fv, body) = validator.payload(&p)? { - // also validate function bodies - let mut fun_validator = fv.into_validator(fun_allocations); - fun_validator.validate(&body)?; - fun_allocations = fun_validator.into_allocations(); - } - // tell caller about the payload - handle_payload(p)?; - } - - Ok(()) -} - -/// A small helper macro to validate the wasm module and extract a reader for a specific section. -macro_rules! extract_reader { - ($wasm_code: expr, $payload: ident, $t: ty) => {{ - fn extract(wasm_code: &[u8]) -> $crate::VmResult> { - let mut value = None; - $crate::static_analysis::validate_wasm(wasm_code, |p| { - if let Payload::$payload(p) = p { - value = Some(p); - } - Ok(()) - })?; - Ok(value) - } - - extract($wasm_code) - }}; -} - -pub(crate) use extract_reader; - -pub fn deserialize_exports(wasm_code: &[u8]) -> VmResult>> { - let exports = extract_reader!(wasm_code, ExportSection, ExportSectionReader<'_>)?; - Ok(exports - .map(|e| e.into_iter().collect::, _>>()) - .transpose()? - .unwrap_or_default()) -} - /// A trait that allows accessing shared functionality of `parity_wasm::elements::Module` /// and `wasmer::Module` in a shared fashion. pub trait ExportInfo { @@ -85,9 +20,10 @@ pub trait ExportInfo { fn exported_function_names(self, prefix: Option<&str>) -> HashSet; } -impl ExportInfo for &[Export<'_>] { +impl ExportInfo for &ParsedWasm<'_> { fn exported_function_names(self, prefix: Option<&str>) -> HashSet { - self.iter() + self.exports + .iter() .filter_map(|export| match export.kind { ExternalKind::Func => Some(export.name), _ => None, @@ -104,12 +40,6 @@ impl ExportInfo for &[Export<'_>] { } } -impl ExportInfo for &Vec> { - fn exported_function_names(self, prefix: Option<&str>) -> HashSet { - self[..].exported_function_names(prefix) - } -} - impl ExportInfo for &wasmer::Module { fn exported_function_names(self, prefix: Option<&str>) -> HashSet { self.exports() @@ -152,15 +82,17 @@ mod tests { #[test] fn deserialize_exports_works() { - let module = deserialize_exports(CONTRACT).unwrap(); - // assert_eq!(module.version(), 1); // TODO: not implemented anymore + let module = ParsedWasm::parse(CONTRACT).unwrap(); + assert_eq!(module.version, 1); let exported_functions = module + .exports .iter() .filter(|entry| matches!(entry.kind, ExternalKind::Func)); assert_eq!(exported_functions.count(), 8); // 4 required exports plus "execute", "migrate", "query" and "sudo" let exported_memories = module + .exports .iter() .filter(|entry| matches!(entry.kind, ExternalKind::Memory)); assert_eq!(exported_memories.count(), 1); @@ -168,7 +100,7 @@ mod tests { #[test] fn deserialize_wasm_corrupted_data() { - match deserialize_exports(CORRUPTED).unwrap_err() { + match ParsedWasm::parse(CORRUPTED).unwrap_err() { VmError::StaticValidationErr { msg, .. } => { assert!(msg.starts_with("Wasm bytecode could not be deserialized.")) } @@ -179,7 +111,7 @@ mod tests { #[test] fn exported_function_names_works_for_parity_with_no_prefix() { let wasm = wat::parse_str(r#"(module)"#).unwrap(); - let module = deserialize_exports(&wasm).unwrap(); + let module = ParsedWasm::parse(&wasm).unwrap(); let exports = module.exported_function_names(None); assert_eq!(exports, HashSet::new()); @@ -195,7 +127,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_exports(&wasm).unwrap(); + let module = ParsedWasm::parse(&wasm).unwrap(); let exports = module.exported_function_names(None); assert_eq!( exports, @@ -206,7 +138,7 @@ mod tests { #[test] fn exported_function_names_works_for_parity_with_prefix() { let wasm = wat::parse_str(r#"(module)"#).unwrap(); - let module = deserialize_exports(&wasm).unwrap(); + let module = ParsedWasm::parse(&wasm).unwrap(); let exports = module.exported_function_names(Some("b")); assert_eq!(exports, HashSet::new()); @@ -223,7 +155,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_exports(&wasm).unwrap(); + let module = ParsedWasm::parse(&wasm).unwrap(); let exports = module.exported_function_names(Some("b")); assert_eq!( exports, @@ -311,7 +243,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_exports(&wasm).unwrap(); + let module = ParsedWasm::parse(&wasm).unwrap(); assert!(!has_ibc_entry_points(&module)); // IBC contract @@ -336,7 +268,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_exports(&wasm).unwrap(); + let module = ParsedWasm::parse(&wasm).unwrap(); assert!(has_ibc_entry_points(&module)); // Missing packet ack @@ -360,7 +292,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_exports(&wasm).unwrap(); + let module = ParsedWasm::parse(&wasm).unwrap(); assert!(!has_ibc_entry_points(&module)); } } From 18faa267029c42c9838c533da73a4b473c72a939 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 25 Jul 2023 11:29:07 +0200 Subject: [PATCH 0560/2372] Fix review comments --- packages/vm/src/compatibility.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index 7654978a2f..c1c6d824b5 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -213,10 +213,10 @@ fn full_import_name(ie: &Import) -> String { } fn check_wasm_capabilities( - exports: &ParsedWasm, + module: &ParsedWasm, available_capabilities: &HashSet, ) -> VmResult<()> { - let required_capabilities = required_capabilities_from_module(exports); + let required_capabilities = required_capabilities_from_module(module); if !required_capabilities.is_subset(available_capabilities) { // We switch to BTreeSet to get a sorted error message let unavailable: BTreeSet<_> = required_capabilities @@ -303,7 +303,7 @@ mod tests { fn check_wasm_tables_works() { // No tables is fine let wasm = wat::parse_str("(module)").unwrap(); - assert!(ParsedWasm::parse(&wasm).unwrap().memories.is_empty()); + assert!(ParsedWasm::parse(&wasm).unwrap().tables.is_empty()); // One table (bound) let wasm = wat::parse_str("(module (table $name 123 123 funcref))").unwrap(); From 55cfdf15b7db90d4f6639d02197695f72b94242c Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 26 Jul 2023 10:35:49 +0200 Subject: [PATCH 0561/2372] Add changelog entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e21eaca8bd..dd8ea7f1ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,12 +17,15 @@ and this project adheres to - cosmwasm-vm: Upgrade Wasmer to version 4.1. ([#1674], [#1693], [#1701], [#1793]) - cosmwasm-check: Update clap dependency to version 4 ([#1677]) +- cosmwasm-vm: Use `wasmparser` for initial validation instead of `parity-wasm` + ([#1786]) [#1667]: https://github.com/CosmWasm/cosmwasm/pull/1667 [#1674]: https://github.com/CosmWasm/cosmwasm/pull/1674 [#1677]: https://github.com/CosmWasm/cosmwasm/pull/1677 [#1693]: https://github.com/CosmWasm/cosmwasm/pull/1693 [#1701]: https://github.com/CosmWasm/cosmwasm/pull/1701 +[#1786]: https://github.com/CosmWasm/cosmwasm/pull/1786 [#1793]: https://github.com/CosmWasm/cosmwasm/pull/1793 ## [1.3.0] - 2023-07-17 From 3c04c6aac548b910124701ce6c3dca362f29031e Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 26 Jul 2023 11:25:49 +0200 Subject: [PATCH 0562/2372] Export missing query responses --- packages/std/src/lib.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 13eeee2874..a120f14ff5 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -71,6 +71,11 @@ pub use crate::query::{ AllDelegationsResponse, AllValidatorsResponse, BondedDenomResponse, Delegation, DelegationResponse, FullDelegation, StakingQuery, Validator, ValidatorResponse, }; +#[cfg(feature = "cosmwasm_1_3")] +pub use crate::query::{ + AllDenomMetadataResponse, DelegatorWithdrawAddressResponse, DenomMetadataResponse, + DistributionQuery, +}; #[cfg(feature = "stargate")] pub use crate::query::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; #[allow(deprecated)] From 1c844817609ead448141ecaf358286d66329bb91 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 26 Jul 2023 13:05:32 +0200 Subject: [PATCH 0563/2372] Export all types in query module --- packages/std/src/query/mod.rs | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/packages/std/src/query/mod.rs b/packages/std/src/query/mod.rs index f1694805e6..90bac6f38e 100644 --- a/packages/std/src/query/mod.rs +++ b/packages/std/src/query/mod.rs @@ -31,23 +31,13 @@ mod query_response; mod staking; mod wasm; -#[cfg(feature = "cosmwasm_1_1")] -pub use bank::SupplyResponse; -pub use bank::{AllBalanceResponse, BalanceResponse, BankQuery}; -#[cfg(feature = "cosmwasm_1_3")] -pub use bank::{AllDenomMetadataResponse, DenomMetadataResponse}; -#[cfg(feature = "cosmwasm_1_3")] -pub use distribution::{DelegatorWithdrawAddressResponse, DistributionQuery}; +pub use bank::*; +pub use distribution::*; #[cfg(feature = "stargate")] -pub use ibc::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; +pub use ibc::*; #[cfg(feature = "staking")] -pub use staking::{ - AllDelegationsResponse, AllValidatorsResponse, BondedDenomResponse, Delegation, - DelegationResponse, FullDelegation, StakingQuery, Validator, ValidatorResponse, -}; -#[cfg(feature = "cosmwasm_1_2")] -pub use wasm::CodeInfoResponse; -pub use wasm::{ContractInfoResponse, WasmQuery}; +pub use staking::*; +pub use wasm::*; #[non_exhaustive] #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] From 9c94a882d53de282d5a5b2e79030b68ad0fd1fe3 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 26 Jul 2023 13:56:15 +0200 Subject: [PATCH 0564/2372] Reduce feature gates for queries --- packages/std/src/ibc.rs | 1 - packages/std/src/lib.rs | 25 ++++++------------------- packages/std/src/query/bank.rs | 12 ++---------- packages/std/src/query/ibc.rs | 2 -- packages/std/src/query/mod.rs | 2 -- packages/std/src/query/staking.rs | 2 -- packages/std/src/query/wasm.rs | 7 +------ 7 files changed, 9 insertions(+), 42 deletions(-) diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 1ce06432a6..85e982c4c4 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -1,4 +1,3 @@ -#![cfg(feature = "stargate")] // The CosmosMsg variants are defined in results/cosmos_msg.rs // The rest of the IBC related functionality is defined here diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index a120f14ff5..a71ed491e7 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -42,7 +42,6 @@ pub use crate::errors::{ RecoverPubkeyError, StdError, StdResult, SystemError, VerificationError, }; pub use crate::hex_binary::HexBinary; -#[cfg(feature = "stargate")] pub use crate::ibc::{ Ibc3ChannelOpenResponse, IbcAcknowledgement, IbcBasicResponse, IbcChannel, IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcChannelOpenResponse, IbcEndpoint, IbcMsg, IbcOrder, @@ -58,26 +57,14 @@ pub use crate::math::{ pub use crate::metadata::{DenomMetadata, DenomUnit}; pub use crate::never::Never; pub use crate::pagination::PageRequest; -#[cfg(feature = "cosmwasm_1_2")] -pub use crate::query::CodeInfoResponse; -#[cfg(feature = "cosmwasm_1_1")] -pub use crate::query::SupplyResponse; -pub use crate::query::{ - AllBalanceResponse, BalanceResponse, BankQuery, ContractInfoResponse, CustomQuery, - QueryRequest, WasmQuery, -}; -#[cfg(feature = "staking")] pub use crate::query::{ - AllDelegationsResponse, AllValidatorsResponse, BondedDenomResponse, Delegation, - DelegationResponse, FullDelegation, StakingQuery, Validator, ValidatorResponse, + AllBalanceResponse, AllDelegationsResponse, AllDenomMetadataResponse, AllValidatorsResponse, + BalanceResponse, BankQuery, BondedDenomResponse, ChannelResponse, CodeInfoResponse, + ContractInfoResponse, CustomQuery, Delegation, DelegationResponse, + DelegatorWithdrawAddressResponse, DenomMetadataResponse, DistributionQuery, FullDelegation, + IbcQuery, ListChannelsResponse, PortIdResponse, QueryRequest, StakingQuery, SupplyResponse, + Validator, ValidatorResponse, WasmQuery, }; -#[cfg(feature = "cosmwasm_1_3")] -pub use crate::query::{ - AllDenomMetadataResponse, DelegatorWithdrawAddressResponse, DenomMetadataResponse, - DistributionQuery, -}; -#[cfg(feature = "stargate")] -pub use crate::query::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; #[allow(deprecated)] pub use crate::results::SubMsgExecutionResponse; #[cfg(all(feature = "stargate", feature = "cosmwasm_1_2"))] diff --git a/packages/std/src/query/bank.rs b/packages/std/src/query/bank.rs index a1ea2670f7..95cf616e2a 100644 --- a/packages/std/src/query/bank.rs +++ b/packages/std/src/query/bank.rs @@ -4,7 +4,8 @@ use serde::{Deserialize, Serialize}; use crate::Coin; #[cfg(feature = "cosmwasm_1_3")] -use crate::{Binary, DenomMetadata, PageRequest}; +use crate::PageRequest; +use crate::{Binary, DenomMetadata}; use super::query_response::QueryResponseType; @@ -34,7 +35,6 @@ pub enum BankQuery { AllDenomMetadata { pagination: Option }, } -#[cfg(feature = "cosmwasm_1_1")] #[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] #[non_exhaustive] @@ -44,10 +44,8 @@ pub struct SupplyResponse { pub amount: Coin, } -#[cfg(feature = "cosmwasm_1_1")] impl_response_constructor!(SupplyResponse, amount: Coin); -#[cfg(feature = "cosmwasm_1_1")] impl QueryResponseType for SupplyResponse {} #[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq, JsonSchema)] @@ -73,7 +71,6 @@ impl_response_constructor!(AllBalanceResponse, amount: Vec); impl QueryResponseType for AllBalanceResponse {} -#[cfg(feature = "cosmwasm_1_3")] #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] #[non_exhaustive] @@ -82,13 +79,10 @@ pub struct DenomMetadataResponse { pub metadata: DenomMetadata, } -#[cfg(feature = "cosmwasm_1_3")] impl_response_constructor!(DenomMetadataResponse, metadata: DenomMetadata); -#[cfg(feature = "cosmwasm_1_3")] impl QueryResponseType for DenomMetadataResponse {} -#[cfg(feature = "cosmwasm_1_3")] #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] #[non_exhaustive] @@ -98,14 +92,12 @@ pub struct AllDenomMetadataResponse { pub next_key: Option, } -#[cfg(feature = "cosmwasm_1_3")] impl_response_constructor!( AllDenomMetadataResponse, metadata: Vec, next_key: Option ); -#[cfg(feature = "cosmwasm_1_3")] impl QueryResponseType for AllDenomMetadataResponse {} #[cfg(test)] diff --git a/packages/std/src/query/ibc.rs b/packages/std/src/query/ibc.rs index 4cff9e43b4..e8d6ff81e7 100644 --- a/packages/std/src/query/ibc.rs +++ b/packages/std/src/query/ibc.rs @@ -1,5 +1,3 @@ -#![cfg(feature = "stargate")] - use schemars::JsonSchema; use serde::{Deserialize, Serialize}; diff --git a/packages/std/src/query/mod.rs b/packages/std/src/query/mod.rs index 90bac6f38e..a957574a89 100644 --- a/packages/std/src/query/mod.rs +++ b/packages/std/src/query/mod.rs @@ -33,9 +33,7 @@ mod wasm; pub use bank::*; pub use distribution::*; -#[cfg(feature = "stargate")] pub use ibc::*; -#[cfg(feature = "staking")] pub use staking::*; pub use wasm::*; diff --git a/packages/std/src/query/staking.rs b/packages/std/src/query/staking.rs index 6f7b55513f..889144b122 100644 --- a/packages/std/src/query/staking.rs +++ b/packages/std/src/query/staking.rs @@ -1,5 +1,3 @@ -#![cfg(feature = "staking")] - use schemars::JsonSchema; use serde::{Deserialize, Serialize}; diff --git a/packages/std/src/query/wasm.rs b/packages/std/src/query/wasm.rs index e8f72ad737..9487ff592d 100644 --- a/packages/std/src/query/wasm.rs +++ b/packages/std/src/query/wasm.rs @@ -1,9 +1,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use crate::Binary; -#[cfg(feature = "cosmwasm_1_2")] -use crate::HexBinary; +use crate::{Binary, HexBinary}; use super::query_response::QueryResponseType; @@ -76,7 +74,6 @@ impl ContractInfoResponse { /// [CodeInfoResponse]: https://github.com/CosmWasm/wasmd/blob/v0.30.0/proto/cosmwasm/wasm/v1/query.proto#L184-L199 #[non_exhaustive] #[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] -#[cfg(feature = "cosmwasm_1_2")] pub struct CodeInfoResponse { pub code_id: u64, /// The address that initially stored the code @@ -85,7 +82,6 @@ pub struct CodeInfoResponse { pub checksum: HexBinary, } -#[cfg(feature = "cosmwasm_1_2")] impl_response_constructor!( CodeInfoResponse, code_id: u64, @@ -93,7 +89,6 @@ impl_response_constructor!( checksum: HexBinary ); -#[cfg(feature = "cosmwasm_1_2")] impl QueryResponseType for CodeInfoResponse {} #[cfg(test)] From a908ba80db96c136bfa34c82dbac547531d6fd25 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 26 Jul 2023 14:50:03 +0200 Subject: [PATCH 0565/2372] Add changelog entry --- CHANGELOG.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f58ec032a..c0160e6aec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,21 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.3.1] - 2023-07-26 + +### Fixed + +- cosmwasm-std: Export `DelegatorWithdrawAddressResponse`, + `DenomMetadataResponse` and `AllDenomMetadataResponse` which were added in + `1.3.0` ([#1795]). + +[#1795]: https://github.com/CosmWasm/cosmwasm/pull/1795 + +### Changed + +- cosmwasm-std: Query responses are now exported, even if the corresponding + cargo feature is not enabled ([#1795]). + ## [1.3.0] - 2023-07-17 ### Fixed @@ -1769,6 +1784,7 @@ Some main points: All future Changelog entries will reference this base +[1.3.1]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.0...v1.3.1 [1.3.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.7...v1.3.0 [1.2.7]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.6...v1.2.7 [1.2.6]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.5...v1.2.6 From 9687af4bbd96b3a8ccbe2f46c289937e858b7fe0 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 26 Jul 2023 14:58:34 +0200 Subject: [PATCH 0566/2372] Set version: 1.3.1 --- Cargo.lock | 16 ++++++++-------- contracts/burner/Cargo.lock | 12 ++++++------ contracts/crypto-verify/Cargo.lock | 14 +++++++------- contracts/cyberpunk/Cargo.lock | 14 +++++++------- contracts/floaty/Cargo.lock | 14 +++++++------- contracts/hackatom/Cargo.lock | 14 +++++++------- contracts/ibc-reflect-send/Cargo.lock | 14 +++++++------- contracts/ibc-reflect/Cargo.lock | 14 +++++++------- contracts/queue/Cargo.lock | 12 ++++++------ contracts/reflect/Cargo.lock | 14 +++++++------- contracts/staking/Cargo.lock | 14 +++++++------- contracts/virus/Cargo.lock | 12 ++++++------ packages/check/Cargo.toml | 6 +++--- packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema-derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 6 +++--- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 20 files changed, 99 insertions(+), 99 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4b39980522..0b00b733ae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -291,7 +291,7 @@ dependencies = [ [[package]] name = "cosmwasm-check" -version = "1.3.0" +version = "1.3.1" dependencies = [ "anyhow", "clap 2.34.0", @@ -302,7 +302,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.0" +version = "1.3.1" dependencies = [ "base64", "criterion", @@ -321,7 +321,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.0" +version = "1.3.1" dependencies = [ "cosmwasm-std", "syn", @@ -329,7 +329,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "1.3.0" +version = "1.3.1" dependencies = [ "anyhow", "cosmwasm-schema-derive", @@ -344,7 +344,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.0" +version = "1.3.1" dependencies = [ "proc-macro2", "quote", @@ -353,7 +353,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.0" +version = "1.3.1" dependencies = [ "base64", "bnum", @@ -375,7 +375,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.0" +version = "1.3.1" dependencies = [ "cosmwasm-std", "serde", @@ -383,7 +383,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.0" +version = "1.3.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 0d6f928b77..e99ff31e89 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -180,7 +180,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.0" +version = "1.3.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -191,14 +191,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.0" +version = "1.3.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.0" +version = "1.3.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -209,7 +209,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.0" +version = "1.3.1" dependencies = [ "proc-macro2", "quote", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.0" +version = "1.3.1" dependencies = [ "base64", "bnum", @@ -236,7 +236,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.0" +version = "1.3.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index a641d5bb7f..d1665ab649 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -175,7 +175,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.0" +version = "1.3.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -186,14 +186,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.0" +version = "1.3.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.0" +version = "1.3.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -204,7 +204,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.0" +version = "1.3.1" dependencies = [ "proc-macro2", "quote", @@ -213,7 +213,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.0" +version = "1.3.1" dependencies = [ "base64", "bnum", @@ -231,7 +231,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.0" +version = "1.3.1" dependencies = [ "cosmwasm-std", "serde", @@ -239,7 +239,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.0" +version = "1.3.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 75b467213f..234257a90e 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.0" +version = "1.3.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -209,14 +209,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.0" +version = "1.3.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.0" +version = "1.3.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.0" +version = "1.3.1" dependencies = [ "proc-macro2", "quote", @@ -236,7 +236,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.0" +version = "1.3.1" dependencies = [ "base64", "bnum", @@ -254,7 +254,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.0" +version = "1.3.1" dependencies = [ "cosmwasm-std", "serde", @@ -262,7 +262,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.0" +version = "1.3.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index a4ac82239f..e2323cdb0a 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.0" +version = "1.3.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.0" +version = "1.3.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.0" +version = "1.3.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.0" +version = "1.3.1" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.0" +version = "1.3.1" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.0" +version = "1.3.1" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.0" +version = "1.3.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 1ee118477a..f51757ff85 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.0" +version = "1.3.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.0" +version = "1.3.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.0" +version = "1.3.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.0" +version = "1.3.1" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.0" +version = "1.3.1" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.0" +version = "1.3.1" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.0" +version = "1.3.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 430d3b2917..080476fa46 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.0" +version = "1.3.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.0" +version = "1.3.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.0" +version = "1.3.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.0" +version = "1.3.1" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.0" +version = "1.3.1" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.0" +version = "1.3.1" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.0" +version = "1.3.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index d85eb711d6..f8494b2c95 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.0" +version = "1.3.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.0" +version = "1.3.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.0" +version = "1.3.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.0" +version = "1.3.1" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.0" +version = "1.3.1" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.0" +version = "1.3.1" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.0" +version = "1.3.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 18578306b7..348ba3f121 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.0" +version = "1.3.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.0" +version = "1.3.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.0" +version = "1.3.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.0" +version = "1.3.1" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.0" +version = "1.3.1" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.0" +version = "1.3.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index d1e2882193..cc1177fb54 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.0" +version = "1.3.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.0" +version = "1.3.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.0" +version = "1.3.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.0" +version = "1.3.1" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.0" +version = "1.3.1" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.0" +version = "1.3.1" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.0" +version = "1.3.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index f603dc7541..2c0aec3bc2 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.0" +version = "1.3.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.0" +version = "1.3.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.0" +version = "1.3.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.0" +version = "1.3.1" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.0" +version = "1.3.1" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.0" +version = "1.3.1" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.0" +version = "1.3.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index f0c1750191..11a1463eac 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.0" +version = "1.3.1" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.0" +version = "1.3.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.0" +version = "1.3.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.0" +version = "1.3.1" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.0" +version = "1.3.1" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.0" +version = "1.3.1" dependencies = [ "bitflags", "bytecheck", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index 7a3eadf860..fd7e91a07f 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-check" -version = "1.3.0" +version = "1.3.1" authors = ["Mauro Lacy "] edition = "2021" description = "A CLI tool for verifying CosmWasm smart contracts" @@ -11,5 +11,5 @@ license = "Apache-2.0" anyhow = "1.0.57" clap = "2" colored = "2" -cosmwasm-vm = { path = "../vm", version = "1.3.0" } -cosmwasm-std = { path = "../std", version = "1.3.0" } +cosmwasm-vm = { path = "../vm", version = "1.3.1" } +cosmwasm-std = { path = "../std", version = "1.3.1" } diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 480808b805..bd894f27a7 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "1.3.0" +version = "1.3.1" authors = ["Mauro Lacy "] edition = "2021" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index 3e8f640ee9..d1ddfacd33 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "1.3.0" +version = "1.3.1" authors = ["Simon Warta "] edition = "2021" description = "A package for auto-generated code used for CosmWasm contract development. This is shipped as part of cosmwasm-std. Do not use directly." diff --git a/packages/schema-derive/Cargo.toml b/packages/schema-derive/Cargo.toml index ccebd5fd9f..96f66eddb0 100644 --- a/packages/schema-derive/Cargo.toml +++ b/packages/schema-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema-derive" -version = "1.3.0" +version = "1.3.1" authors = ["Tomasz Kurcz "] edition = "2021" description = "Derive macros for cosmwasm-schema" diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index 4f22af3473..f4906527b9 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "1.3.0" +version = "1.3.1" authors = ["Simon Warta ", "Ethan Frey "] edition = "2021" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." @@ -8,7 +8,7 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/schema" license = "Apache-2.0" [dependencies] -cosmwasm-schema-derive = { version = "=1.3.0", path = "../schema-derive" } +cosmwasm-schema-derive = { version = "=1.3.1", path = "../schema-derive" } schemars = "0.8.3" serde = "1.0" serde_json = "1.0.40" @@ -16,6 +16,6 @@ thiserror = "1.0.26" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = { version = "1.3.0", path = "../std" } +cosmwasm-std = { version = "1.3.1", path = "../std" } semver = "1" tempfile = "3" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 41e4935170..8ca24cc67b 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "1.3.0" +version = "1.3.1" authors = ["Ethan Frey "] edition = "2021" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -45,7 +45,7 @@ cosmwasm_1_3 = ["cosmwasm_1_2"] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "1.3.0" } +cosmwasm-derive = { path = "../derive", version = "1.3.1" } derivative = "2" forward_ref = "1" hex = "0.4" @@ -57,7 +57,7 @@ thiserror = "1.0.26" bnum = "0.7.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "1.3.0" } +cosmwasm-crypto = { path = "../crypto", version = "1.3.1" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index e2dd2012a3..4bf9e84087 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "1.3.0" +version = "1.3.1" authors = ["Ethan Frey "] edition = "2021" description = "CosmWasm library with useful helpers for Storage patterns" @@ -16,5 +16,5 @@ iterator = ["cosmwasm-std/iterator"] [dependencies] # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.3.0", default-features = false } +cosmwasm-std = { path = "../std", version = "1.3.1", default-features = false } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index ec07ccb8d8..b934195123 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "1.3.0" +version = "1.3.1" authors = ["Ethan Frey "] edition = "2021" description = "VM bindings to run cosmwams contracts" @@ -42,8 +42,8 @@ required-features = ["iterator"] clru = "0.4.0" crc32fast = "1.3.2" # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.3.0", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "1.3.0" } +cosmwasm-std = { path = "../std", version = "1.3.1", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "1.3.1" } hex = "0.4" parity-wasm = { version = "0.45", features = ["sign_ext"] } schemars = "0.8.3" From 0785c0b983c26208de2fd6324e350e79cd423a96 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 26 Jul 2023 16:56:43 +0200 Subject: [PATCH 0567/2372] Implement Not for all integers --- packages/std/src/math/mod.rs | 1 + packages/std/src/math/uint128.rs | 9 +++++++++ packages/std/src/math/uint256.rs | 9 +++++++++ packages/std/src/math/uint64.rs | 9 +++++++++ 4 files changed, 28 insertions(+) diff --git a/packages/std/src/math/mod.rs b/packages/std/src/math/mod.rs index a96b14acb8..a6cf8af3cb 100644 --- a/packages/std/src/math/mod.rs +++ b/packages/std/src/math/mod.rs @@ -69,6 +69,7 @@ mod tests { + Shr<&'a u32> + ShrAssign + ShrAssign<&'a u32> + + Not { } diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 7a8dc510f7..ef555c51b9 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -4,6 +4,7 @@ use core::ops::{ Sub, SubAssign, }; use core::str::FromStr; +use std::ops::Not; use forward_ref::{forward_ref_binop, forward_ref_op_assign}; use schemars::JsonSchema; @@ -515,6 +516,14 @@ impl Rem for Uint128 { } forward_ref_binop!(impl Rem, rem for Uint128, Uint128); +impl Not for Uint128 { + type Output = Self; + + fn not(self) -> Self::Output { + Self(!self.0) + } +} + impl RemAssign for Uint128 { fn rem_assign(&mut self, rhs: Uint128) { *self = *self % rhs; diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 255195c422..6d42004197 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -7,6 +7,7 @@ use core::str::FromStr; use forward_ref::{forward_ref_binop, forward_ref_op_assign}; use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; +use std::ops::Not; use crate::errors::{ CheckedMultiplyFractionError, CheckedMultiplyRatioError, ConversionOverflowError, @@ -500,6 +501,14 @@ impl Rem for Uint256 { } forward_ref_binop!(impl Rem, rem for Uint256, Uint256); +impl Not for Uint256 { + type Output = Self; + + fn not(self) -> Self::Output { + Self(!self.0) + } +} + impl RemAssign for Uint256 { fn rem_assign(&mut self, rhs: Uint256) { *self = *self % rhs; diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index 39cc583eed..a0da39e76c 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -6,6 +6,7 @@ use core::ops::{ use forward_ref::{forward_ref_binop, forward_ref_op_assign}; use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; +use std::ops::Not; use crate::errors::{ CheckedMultiplyFractionError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, @@ -406,6 +407,14 @@ impl Rem for Uint64 { } forward_ref_binop!(impl Rem, rem for Uint64, Uint64); +impl Not for Uint64 { + type Output = Self; + + fn not(self) -> Self::Output { + Self(!self.0) + } +} + impl RemAssign for Uint64 { fn rem_assign(&mut self, rhs: Uint64) { *self = *self % rhs; From 7b6899746f549f2c8f996875ab487fa1032ece15 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 27 Jul 2023 09:56:32 +0200 Subject: [PATCH 0568/2372] Add tests for Not impl --- packages/std/src/math/int128.rs | 9 +++++++++ packages/std/src/math/int256.rs | 12 ++++++++++++ packages/std/src/math/int512.rs | 12 ++++++++++++ packages/std/src/math/int64.rs | 9 +++++++++ packages/std/src/math/uint128.rs | 8 ++++++++ packages/std/src/math/uint256.rs | 10 ++++++++++ packages/std/src/math/uint512.rs | 10 ++++++++++ packages/std/src/math/uint64.rs | 8 ++++++++ 8 files changed, 78 insertions(+) diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index 1edf250771..191b47ce26 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -529,6 +529,15 @@ mod tests { assert_eq!(num.i128(), i128::MIN); } + #[test] + fn int128_not_works() { + assert_eq!(!Int128::new(222), Int128::new(!222)); + assert_eq!(!Int128::new(-222), Int128::new(!-222)); + + assert_eq!(!Int128::MAX, Int128::new(!i128::MAX)); + assert_eq!(!Int128::MIN, Int128::new(!i128::MIN)); + } + #[test] fn int128_zero_works() { let zero = Int128::zero(); diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index 6cb71dd654..39a8212e55 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -587,6 +587,18 @@ mod tests { assert_eq!(be_bytes, resulting_bytes); } + #[test] + fn int256_not_works() { + let num = Int256::new([1; 32]); + let a = (!num).to_be_bytes(); + assert_eq!(a, [254; 32]); + + assert_eq!(!Int256::from(-1234806i128), Int256::from(!-1234806i128)); + + assert_eq!(!Int256::MAX, Int256::MIN); + assert_eq!(!Int256::MIN, Int256::MAX); + } + #[test] fn int256_zero_works() { let zero = Int256::zero(); diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index c3145d2cd4..905e1ddb99 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -622,6 +622,18 @@ mod tests { assert_eq!(be_bytes, resulting_bytes); } + #[test] + fn int512_not_works() { + let num = Int512::new([1; 64]); + let a = (!num).to_be_bytes(); + assert_eq!(a, [254; 64]); + + assert_eq!(!Int512::from(-1234806i128), Int512::from(!-1234806i128)); + + assert_eq!(!Int512::MAX, Int512::MIN); + assert_eq!(!Int512::MIN, Int512::MAX); + } + #[test] fn int512_zero_works() { let zero = Int512::zero(); diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index a0fd3db4fe..c1262384e0 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -503,6 +503,15 @@ mod tests { assert_eq!(num.i64(), i64::MIN); } + #[test] + fn int64_not_works() { + assert_eq!(!Int64::new(222), Int64::new(!222)); + assert_eq!(!Int64::new(-222), Int64::new(!-222)); + + assert_eq!(!Int64::MAX, Int64::new(!i64::MAX)); + assert_eq!(!Int64::MIN, Int64::new(!i64::MIN)); + } + #[test] fn int64_zero_works() { let zero = Int64::zero(); diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index ef555c51b9..9c80beff1c 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -616,6 +616,14 @@ mod tests { assert_eq!(core::mem::size_of::(), 16); } + #[test] + fn uint128_not_works() { + assert_eq!(!Uint128::new(1234806), Uint128::new(!1234806)); + + assert_eq!(!Uint128::MAX, Uint128::new(!u128::MAX)); + assert_eq!(!Uint128::MIN, Uint128::new(!u128::MIN)); + } + #[test] fn uint128_zero_works() { let zero = Uint128::zero(); diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 6d42004197..1d75282b30 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -693,6 +693,16 @@ mod tests { assert_eq!(be_bytes, resulting_bytes); } + #[test] + fn uint256_not_works() { + let num = Uint256::new([1; 32]); + let a = (!num).to_be_bytes(); + assert_eq!(a, [254; 32]); + + assert_eq!(!Uint256::MAX, Uint256::MIN); + assert_eq!(!Uint256::MIN, Uint256::MAX); + } + #[test] fn uint256_zero_works() { let zero = Uint256::zero(); diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index 6100985e07..8b7b691095 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -665,6 +665,16 @@ mod tests { assert_eq!(be_bytes, resulting_bytes); } + #[test] + fn uint512_not_works() { + let num = Uint512::new([1; 64]); + let a = (!num).to_be_bytes(); + assert_eq!(a, [254; 64]); + + assert_eq!(!Uint512::MAX, Uint512::MIN); + assert_eq!(!Uint512::MIN, Uint512::MAX); + } + #[test] fn uint512_zero_works() { let zero = Uint512::zero(); diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index a0da39e76c..386adbd54d 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -566,6 +566,14 @@ mod tests { assert_eq!(core::mem::size_of::(), 8); } + #[test] + fn uint64_not_works() { + assert_eq!(!Uint64::new(1234806), Uint64::new(!1234806)); + + assert_eq!(!Uint64::MAX, Uint64::new(!u64::MAX)); + assert_eq!(!Uint64::MIN, Uint64::new(!u64::MIN)); + } + #[test] fn uint64_zero_works() { let zero = Uint64::zero(); From e2a14587f5171b33dc77f78ff8927f48ca37d177 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 27 Jul 2023 09:59:29 +0200 Subject: [PATCH 0569/2372] Add changelog entry for Not impl --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0bdf9f7f4f..f92ce52545 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ and this project adheres to ## [Unreleased] +### Added + +- cosmwasm-std: Implement `Not` for `Uint{64,128,256}` ([#1799]). + +[#1799]: https://github.com/CosmWasm/cosmwasm/pull/1799 + ### Changed - cosmwasm-vm: Avoid using loupe for getting the `Module` size in the file From 512e3f6b9eb2d4c53c5f2b79135b6023ee91b01a Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 27 Jul 2023 13:11:08 +0200 Subject: [PATCH 0570/2372] Upgrade k256 to 0.13.1 --- Cargo.lock | 62 ++++++++------- contracts/burner/Cargo.lock | 102 +++++++++++++------------ contracts/crypto-verify/Cargo.lock | 104 +++++++++++++------------- contracts/cyberpunk/Cargo.lock | 102 +++++++++++++------------ contracts/floaty/Cargo.lock | 102 +++++++++++++------------ contracts/hackatom/Cargo.lock | 102 +++++++++++++------------ contracts/ibc-reflect-send/Cargo.lock | 102 +++++++++++++------------ contracts/ibc-reflect/Cargo.lock | 102 +++++++++++++------------ contracts/queue/Cargo.lock | 102 +++++++++++++------------ contracts/reflect/Cargo.lock | 102 +++++++++++++------------ contracts/staking/Cargo.lock | 102 +++++++++++++------------ contracts/virus/Cargo.lock | 102 +++++++++++++------------ packages/crypto/Cargo.toml | 2 +- packages/crypto/src/secp256k1.rs | 35 ++++----- 14 files changed, 634 insertions(+), 589 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 560852a15a..8771721e2d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -159,9 +159,9 @@ dependencies = [ [[package]] name = "base16ct" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64" @@ -723,9 +723,9 @@ dependencies = [ [[package]] name = "crypto-bigint" -version = "0.4.9" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" +checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" dependencies = [ "generic-array", "rand_core 0.6.4", @@ -805,9 +805,9 @@ dependencies = [ [[package]] name = "der" -version = "0.6.1" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", "zeroize", @@ -846,6 +846,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" dependencies = [ "block-buffer 0.10.4", + "const-oid", "crypto-common", "subtle", ] @@ -890,14 +891,16 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.14.8" +version = "0.16.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" +checksum = "0997c976637b606099b9985693efa3581e84e41f5c11ba5255f88711058ad428" dependencies = [ "der", + "digest 0.10.6", "elliptic-curve", "rfc6979", "signature", + "spki", ] [[package]] @@ -923,13 +926,12 @@ checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] name = "elliptic-curve" -version = "0.12.3" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" +checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ "base16ct", "crypto-bigint", - "der", "digest 0.10.6", "ff", "generic-array", @@ -1026,9 +1028,9 @@ dependencies = [ [[package]] name = "ff" -version = "0.12.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ "rand_core 0.6.4", "subtle", @@ -1087,6 +1089,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -1125,9 +1128,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "group" -version = "0.12.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", "rand_core 0.6.4", @@ -1278,14 +1281,16 @@ dependencies = [ [[package]] name = "k256" -version = "0.11.6" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" +checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", + "once_cell", "sha2 0.10.6", + "signature", ] [[package]] @@ -1474,9 +1479,9 @@ checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" [[package]] name = "pkcs8" -version = "0.9.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ "der", "spki", @@ -1749,13 +1754,12 @@ dependencies = [ [[package]] name = "rfc6979" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "crypto-bigint", "hmac", - "zeroize", + "subtle", ] [[package]] @@ -1860,9 +1864,9 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "sec1" -version = "0.3.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", @@ -1966,9 +1970,9 @@ dependencies = [ [[package]] name = "signature" -version = "1.6.4" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ "digest 0.10.6", "rand_core 0.6.4", @@ -1994,9 +1998,9 @@ checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] name = "spki" -version = "0.6.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" dependencies = [ "base64ct", "der", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 8a29a148c7..8763a5a841 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -57,9 +57,9 @@ dependencies = [ [[package]] name = "base16ct" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64" @@ -174,9 +174,9 @@ checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" [[package]] name = "const-oid" -version = "0.9.0" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "722e23542a15cea1f65d4a1419c4cfd7a26706c70871a13a04238ca3f40f1661" +checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" [[package]] name = "corosensei" @@ -195,10 +195,10 @@ dependencies = [ name = "cosmwasm-crypto" version = "1.3.1" dependencies = [ - "digest 0.10.3", + "digest 0.10.7", "ed25519-zebra", "k256", - "rand_core 0.6.3", + "rand_core 0.6.4", "thiserror", ] @@ -426,12 +426,12 @@ dependencies = [ [[package]] name = "crypto-bigint" -version = "0.4.8" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f2b443d17d49dad5ef0ede301c3179cc923b8822f3393b4d2c28c269dd4a122" +checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" dependencies = [ "generic-array", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", "zeroize", ] @@ -509,9 +509,9 @@ dependencies = [ [[package]] name = "der" -version = "0.6.0" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dd2ae565c0a381dde7fade45fce95984c568bdcb4700a4fdbe3175e0380b2f" +checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", "zeroize", @@ -539,11 +539,12 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.3" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.2", + "const-oid", "crypto-common", "subtle", ] @@ -582,14 +583,16 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.14.3" +version = "0.16.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd46e0c364655e5baf2f5e99b603e7a09905da9966d7928d7470af393b28670" +checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", + "spki", ] [[package]] @@ -600,7 +603,7 @@ checksum = "403ef3e961ab98f0ba902771d29f842058578bb1ce7e3c59dad5a6a93e784c69" dependencies = [ "curve25519-dalek", "hex", - "rand_core 0.6.3", + "rand_core 0.6.4", "serde", "sha2 0.9.5", "thiserror", @@ -615,19 +618,18 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.12.2" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c47abd0a791d2ac0c7aa1118715f85b83689e4522c4e3a244e159d4fc9848a8d" +checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ "base16ct", "crypto-bigint", - "der", - "digest 0.10.3", + "digest 0.10.7", "ff", "generic-array", "group", "pkcs8", - "rand_core 0.6.3", + "rand_core 0.6.4", "sec1", "subtle", "zeroize", @@ -682,11 +684,11 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "ff" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df689201f395c6b90dfe87127685f8dbfc083a5e779e613575d8bd7314300c3e" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -722,12 +724,13 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.4" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -771,12 +774,12 @@ dependencies = [ [[package]] name = "group" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7391856def869c1c81063a03457c676fbcd419709c3dfb33d8d319de484b154d" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -810,7 +813,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.3", + "digest 0.10.7", ] [[package]] @@ -856,14 +859,16 @@ dependencies = [ [[package]] name = "k256" -version = "0.11.3" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8a5a96d92d849c4499d99461da81c9cdc1467418a8ed2aaeb407e8d85940ed" +checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", + "once_cell", "sha2 0.10.3", + "signature", ] [[package]] @@ -1019,9 +1024,9 @@ checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" [[package]] name = "pkcs8" -version = "0.9.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ "der", "spki", @@ -1100,9 +1105,9 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom 0.2.3", ] @@ -1176,13 +1181,12 @@ dependencies = [ [[package]] name = "rfc6979" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88c86280f057430a52f4861551b092a01b419b8eacefc7c995eacb9dc132fe32" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "crypto-bigint", "hmac", - "zeroize", + "subtle", ] [[package]] @@ -1261,9 +1265,9 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "sec1" -version = "0.3.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", @@ -1356,17 +1360,17 @@ checksum = "899bf02746a2c92bf1053d9327dadb252b01af1f81f90cdb902411f518bc7215" dependencies = [ "cfg-if", "cpufeatures 0.2.2", - "digest 0.10.3", + "digest 0.10.7", ] [[package]] name = "signature" -version = "1.5.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f054c6c1a6e95179d6f23ed974060dcefb2d9388bb7256900badad682c499de4" +checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.3", - "rand_core 0.6.3", + "digest 0.10.7", + "rand_core 0.6.4", ] [[package]] @@ -1389,9 +1393,9 @@ checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "spki" -version = "0.6.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" dependencies = [ "base64ct", "der", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 74435f8435..1774d39fec 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -57,9 +57,9 @@ dependencies = [ [[package]] name = "base16ct" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64" @@ -163,9 +163,9 @@ checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" [[package]] name = "const-oid" -version = "0.9.0" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "722e23542a15cea1f65d4a1419c4cfd7a26706c70871a13a04238ca3f40f1661" +checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" [[package]] name = "corosensei" @@ -184,10 +184,10 @@ dependencies = [ name = "cosmwasm-crypto" version = "1.3.1" dependencies = [ - "digest 0.10.3", + "digest 0.10.7", "ed25519-zebra", "k256", - "rand_core 0.6.3", + "rand_core 0.6.4", "thiserror", ] @@ -415,12 +415,12 @@ dependencies = [ [[package]] name = "crypto-bigint" -version = "0.4.8" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f2b443d17d49dad5ef0ede301c3179cc923b8822f3393b4d2c28c269dd4a122" +checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" dependencies = [ "generic-array", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", "zeroize", ] @@ -514,9 +514,9 @@ dependencies = [ [[package]] name = "der" -version = "0.6.0" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dd2ae565c0a381dde7fade45fce95984c568bdcb4700a4fdbe3175e0380b2f" +checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", "zeroize", @@ -544,11 +544,12 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.3" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.2", + "const-oid", "crypto-common", "subtle", ] @@ -587,14 +588,16 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.14.3" +version = "0.16.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd46e0c364655e5baf2f5e99b603e7a09905da9966d7928d7470af393b28670" +checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", + "spki", ] [[package]] @@ -605,7 +608,7 @@ checksum = "403ef3e961ab98f0ba902771d29f842058578bb1ce7e3c59dad5a6a93e784c69" dependencies = [ "curve25519-dalek", "hex", - "rand_core 0.6.3", + "rand_core 0.6.4", "serde", "sha2 0.9.5", "thiserror", @@ -620,19 +623,18 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.12.2" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c47abd0a791d2ac0c7aa1118715f85b83689e4522c4e3a244e159d4fc9848a8d" +checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ "base16ct", "crypto-bigint", - "der", - "digest 0.10.3", + "digest 0.10.7", "ff", "generic-array", "group", "pkcs8", - "rand_core 0.6.3", + "rand_core 0.6.4", "sec1", "subtle", "zeroize", @@ -687,11 +689,11 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "ff" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df689201f395c6b90dfe87127685f8dbfc083a5e779e613575d8bd7314300c3e" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -727,12 +729,13 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.4" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -776,12 +779,12 @@ dependencies = [ [[package]] name = "group" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7391856def869c1c81063a03457c676fbcd419709c3dfb33d8d319de484b154d" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -821,7 +824,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.3", + "digest 0.10.7", ] [[package]] @@ -867,14 +870,16 @@ dependencies = [ [[package]] name = "k256" -version = "0.11.3" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8a5a96d92d849c4499d99461da81c9cdc1467418a8ed2aaeb407e8d85940ed" +checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", + "once_cell", "sha2 0.10.3", + "signature", ] [[package]] @@ -1036,9 +1041,9 @@ checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" [[package]] name = "pkcs8" -version = "0.9.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ "der", "spki", @@ -1117,9 +1122,9 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom 0.2.3", ] @@ -1193,13 +1198,12 @@ dependencies = [ [[package]] name = "rfc6979" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88c86280f057430a52f4861551b092a01b419b8eacefc7c995eacb9dc132fe32" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "crypto-bigint", "hmac", - "zeroize", + "subtle", ] [[package]] @@ -1294,9 +1298,9 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "sec1" -version = "0.3.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", @@ -1389,7 +1393,7 @@ checksum = "899bf02746a2c92bf1053d9327dadb252b01af1f81f90cdb902411f518bc7215" dependencies = [ "cfg-if", "cpufeatures 0.2.2", - "digest 0.10.3", + "digest 0.10.7", ] [[package]] @@ -1398,18 +1402,18 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a31480366ec990f395a61b7c08122d99bd40544fdb5abcfc1b06bb29994312c" dependencies = [ - "digest 0.10.3", + "digest 0.10.7", "keccak", ] [[package]] name = "signature" -version = "1.5.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f054c6c1a6e95179d6f23ed974060dcefb2d9388bb7256900badad682c499de4" +checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.3", - "rand_core 0.6.3", + "digest 0.10.7", + "rand_core 0.6.4", ] [[package]] @@ -1432,9 +1436,9 @@ checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "spki" -version = "0.6.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" dependencies = [ "base64ct", "der", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 4e8337c124..580dcbbd9f 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -69,9 +69,9 @@ dependencies = [ [[package]] name = "base16ct" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64" @@ -192,9 +192,9 @@ checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" [[package]] name = "const-oid" -version = "0.9.0" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "722e23542a15cea1f65d4a1419c4cfd7a26706c70871a13a04238ca3f40f1661" +checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" [[package]] name = "constant_time_eq" @@ -219,10 +219,10 @@ dependencies = [ name = "cosmwasm-crypto" version = "1.3.1" dependencies = [ - "digest 0.10.3", + "digest 0.10.7", "ed25519-zebra", "k256", - "rand_core 0.6.3", + "rand_core 0.6.4", "thiserror", ] @@ -450,12 +450,12 @@ dependencies = [ [[package]] name = "crypto-bigint" -version = "0.4.8" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f2b443d17d49dad5ef0ede301c3179cc923b8822f3393b4d2c28c269dd4a122" +checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" dependencies = [ "generic-array", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", "zeroize", ] @@ -545,9 +545,9 @@ dependencies = [ [[package]] name = "der" -version = "0.6.0" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dd2ae565c0a381dde7fade45fce95984c568bdcb4700a4fdbe3175e0380b2f" +checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", "zeroize", @@ -575,11 +575,12 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.3" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.2", + "const-oid", "crypto-common", "subtle", ] @@ -618,14 +619,16 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.14.3" +version = "0.16.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd46e0c364655e5baf2f5e99b603e7a09905da9966d7928d7470af393b28670" +checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", + "spki", ] [[package]] @@ -636,7 +639,7 @@ checksum = "403ef3e961ab98f0ba902771d29f842058578bb1ce7e3c59dad5a6a93e784c69" dependencies = [ "curve25519-dalek", "hex", - "rand_core 0.6.3", + "rand_core 0.6.4", "serde", "sha2 0.9.5", "thiserror", @@ -651,19 +654,18 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.12.2" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c47abd0a791d2ac0c7aa1118715f85b83689e4522c4e3a244e159d4fc9848a8d" +checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ "base16ct", "crypto-bigint", - "der", - "digest 0.10.3", + "digest 0.10.7", "ff", "generic-array", "group", "pkcs8", - "rand_core 0.6.3", + "rand_core 0.6.4", "sec1", "subtle", "zeroize", @@ -748,11 +750,11 @@ dependencies = [ [[package]] name = "ff" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df689201f395c6b90dfe87127685f8dbfc083a5e779e613575d8bd7314300c3e" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -788,12 +790,13 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.4" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -837,12 +840,12 @@ dependencies = [ [[package]] name = "group" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7391856def869c1c81063a03457c676fbcd419709c3dfb33d8d319de484b154d" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -882,7 +885,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.3", + "digest 0.10.7", ] [[package]] @@ -948,14 +951,16 @@ dependencies = [ [[package]] name = "k256" -version = "0.11.3" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8a5a96d92d849c4499d99461da81c9cdc1467418a8ed2aaeb407e8d85940ed" +checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", + "once_cell", "sha2 0.10.3", + "signature", ] [[package]] @@ -1117,9 +1122,9 @@ checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" [[package]] name = "pkcs8" -version = "0.9.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ "der", "spki", @@ -1198,9 +1203,9 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom 0.2.3", ] @@ -1274,13 +1279,12 @@ dependencies = [ [[package]] name = "rfc6979" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88c86280f057430a52f4861551b092a01b419b8eacefc7c995eacb9dc132fe32" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "crypto-bigint", "hmac", - "zeroize", + "subtle", ] [[package]] @@ -1385,9 +1389,9 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "sec1" -version = "0.3.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", @@ -1480,17 +1484,17 @@ checksum = "899bf02746a2c92bf1053d9327dadb252b01af1f81f90cdb902411f518bc7215" dependencies = [ "cfg-if", "cpufeatures 0.2.2", - "digest 0.10.3", + "digest 0.10.7", ] [[package]] name = "signature" -version = "1.5.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f054c6c1a6e95179d6f23ed974060dcefb2d9388bb7256900badad682c499de4" +checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.3", - "rand_core 0.6.3", + "digest 0.10.7", + "rand_core 0.6.4", ] [[package]] @@ -1513,9 +1517,9 @@ checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "spki" -version = "0.6.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" dependencies = [ "base64ct", "der", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index bc87714e9d..30d92c3581 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -57,9 +57,9 @@ dependencies = [ [[package]] name = "base16ct" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64" @@ -163,9 +163,9 @@ checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" [[package]] name = "const-oid" -version = "0.9.0" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "722e23542a15cea1f65d4a1419c4cfd7a26706c70871a13a04238ca3f40f1661" +checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" [[package]] name = "corosensei" @@ -184,10 +184,10 @@ dependencies = [ name = "cosmwasm-crypto" version = "1.3.1" dependencies = [ - "digest 0.10.3", + "digest 0.10.7", "ed25519-zebra", "k256", - "rand_core 0.6.3", + "rand_core 0.6.4", "thiserror", ] @@ -415,12 +415,12 @@ dependencies = [ [[package]] name = "crypto-bigint" -version = "0.4.8" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f2b443d17d49dad5ef0ede301c3179cc923b8822f3393b4d2c28c269dd4a122" +checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" dependencies = [ "generic-array", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", "zeroize", ] @@ -498,9 +498,9 @@ dependencies = [ [[package]] name = "der" -version = "0.6.0" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dd2ae565c0a381dde7fade45fce95984c568bdcb4700a4fdbe3175e0380b2f" +checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", "zeroize", @@ -528,11 +528,12 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.3" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.2", + "const-oid", "crypto-common", "subtle", ] @@ -571,14 +572,16 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.14.3" +version = "0.16.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd46e0c364655e5baf2f5e99b603e7a09905da9966d7928d7470af393b28670" +checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", + "spki", ] [[package]] @@ -589,7 +592,7 @@ checksum = "403ef3e961ab98f0ba902771d29f842058578bb1ce7e3c59dad5a6a93e784c69" dependencies = [ "curve25519-dalek", "hex", - "rand_core 0.6.3", + "rand_core 0.6.4", "serde", "sha2 0.9.5", "thiserror", @@ -604,19 +607,18 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.12.2" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c47abd0a791d2ac0c7aa1118715f85b83689e4522c4e3a244e159d4fc9848a8d" +checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ "base16ct", "crypto-bigint", - "der", - "digest 0.10.3", + "digest 0.10.7", "ff", "generic-array", "group", "pkcs8", - "rand_core 0.6.3", + "rand_core 0.6.4", "sec1", "subtle", "zeroize", @@ -671,11 +673,11 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "ff" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df689201f395c6b90dfe87127685f8dbfc083a5e779e613575d8bd7314300c3e" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -723,12 +725,13 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.4" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -772,12 +775,12 @@ dependencies = [ [[package]] name = "group" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7391856def869c1c81063a03457c676fbcd419709c3dfb33d8d319de484b154d" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -811,7 +814,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.3", + "digest 0.10.7", ] [[package]] @@ -857,14 +860,16 @@ dependencies = [ [[package]] name = "k256" -version = "0.11.3" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8a5a96d92d849c4499d99461da81c9cdc1467418a8ed2aaeb407e8d85940ed" +checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", + "once_cell", "sha2 0.10.3", + "signature", ] [[package]] @@ -1020,9 +1025,9 @@ checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" [[package]] name = "pkcs8" -version = "0.9.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ "der", "spki", @@ -1101,9 +1106,9 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom 0.2.3", ] @@ -1177,13 +1182,12 @@ dependencies = [ [[package]] name = "rfc6979" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88c86280f057430a52f4861551b092a01b419b8eacefc7c995eacb9dc132fe32" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "crypto-bigint", "hmac", - "zeroize", + "subtle", ] [[package]] @@ -1262,9 +1266,9 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "sec1" -version = "0.3.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", @@ -1357,17 +1361,17 @@ checksum = "899bf02746a2c92bf1053d9327dadb252b01af1f81f90cdb902411f518bc7215" dependencies = [ "cfg-if", "cpufeatures 0.2.2", - "digest 0.10.3", + "digest 0.10.7", ] [[package]] name = "signature" -version = "1.5.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f054c6c1a6e95179d6f23ed974060dcefb2d9388bb7256900badad682c499de4" +checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.3", - "rand_core 0.6.3", + "digest 0.10.7", + "rand_core 0.6.4", ] [[package]] @@ -1390,9 +1394,9 @@ checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "spki" -version = "0.6.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" dependencies = [ "base64ct", "der", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 567464c731..80b2e70688 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -57,9 +57,9 @@ dependencies = [ [[package]] name = "base16ct" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64" @@ -163,9 +163,9 @@ checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" [[package]] name = "const-oid" -version = "0.9.0" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "722e23542a15cea1f65d4a1419c4cfd7a26706c70871a13a04238ca3f40f1661" +checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" [[package]] name = "corosensei" @@ -184,10 +184,10 @@ dependencies = [ name = "cosmwasm-crypto" version = "1.3.1" dependencies = [ - "digest 0.10.3", + "digest 0.10.7", "ed25519-zebra", "k256", - "rand_core 0.6.3", + "rand_core 0.6.4", "thiserror", ] @@ -415,12 +415,12 @@ dependencies = [ [[package]] name = "crypto-bigint" -version = "0.4.8" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f2b443d17d49dad5ef0ede301c3179cc923b8822f3393b4d2c28c269dd4a122" +checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" dependencies = [ "generic-array", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", "zeroize", ] @@ -498,9 +498,9 @@ dependencies = [ [[package]] name = "der" -version = "0.6.0" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dd2ae565c0a381dde7fade45fce95984c568bdcb4700a4fdbe3175e0380b2f" +checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", "zeroize", @@ -528,11 +528,12 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.3" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.2", + "const-oid", "crypto-common", "subtle", ] @@ -571,14 +572,16 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.14.3" +version = "0.16.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd46e0c364655e5baf2f5e99b603e7a09905da9966d7928d7470af393b28670" +checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", + "spki", ] [[package]] @@ -589,7 +592,7 @@ checksum = "403ef3e961ab98f0ba902771d29f842058578bb1ce7e3c59dad5a6a93e784c69" dependencies = [ "curve25519-dalek", "hex", - "rand_core 0.6.3", + "rand_core 0.6.4", "serde", "sha2 0.9.5", "thiserror", @@ -604,19 +607,18 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.12.2" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c47abd0a791d2ac0c7aa1118715f85b83689e4522c4e3a244e159d4fc9848a8d" +checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ "base16ct", "crypto-bigint", - "der", - "digest 0.10.3", + "digest 0.10.7", "ff", "generic-array", "group", "pkcs8", - "rand_core 0.6.3", + "rand_core 0.6.4", "sec1", "subtle", "zeroize", @@ -671,11 +673,11 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "ff" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df689201f395c6b90dfe87127685f8dbfc083a5e779e613575d8bd7314300c3e" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -711,12 +713,13 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.4" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -760,12 +763,12 @@ dependencies = [ [[package]] name = "group" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7391856def869c1c81063a03457c676fbcd419709c3dfb33d8d319de484b154d" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -812,7 +815,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.3", + "digest 0.10.7", ] [[package]] @@ -858,14 +861,16 @@ dependencies = [ [[package]] name = "k256" -version = "0.11.3" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8a5a96d92d849c4499d99461da81c9cdc1467418a8ed2aaeb407e8d85940ed" +checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", + "once_cell", "sha2 0.10.3", + "signature", ] [[package]] @@ -1021,9 +1026,9 @@ checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" [[package]] name = "pkcs8" -version = "0.9.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ "der", "spki", @@ -1102,9 +1107,9 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom 0.2.3", ] @@ -1178,13 +1183,12 @@ dependencies = [ [[package]] name = "rfc6979" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88c86280f057430a52f4861551b092a01b419b8eacefc7c995eacb9dc132fe32" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "crypto-bigint", "hmac", - "zeroize", + "subtle", ] [[package]] @@ -1263,9 +1267,9 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "sec1" -version = "0.3.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", @@ -1358,17 +1362,17 @@ checksum = "899bf02746a2c92bf1053d9327dadb252b01af1f81f90cdb902411f518bc7215" dependencies = [ "cfg-if", "cpufeatures 0.2.2", - "digest 0.10.3", + "digest 0.10.7", ] [[package]] name = "signature" -version = "1.5.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f054c6c1a6e95179d6f23ed974060dcefb2d9388bb7256900badad682c499de4" +checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.3", - "rand_core 0.6.3", + "digest 0.10.7", + "rand_core 0.6.4", ] [[package]] @@ -1391,9 +1395,9 @@ checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "spki" -version = "0.6.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" dependencies = [ "base64ct", "der", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 9b388c9cf0..75550a2eb7 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -57,9 +57,9 @@ dependencies = [ [[package]] name = "base16ct" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64" @@ -163,9 +163,9 @@ checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" [[package]] name = "const-oid" -version = "0.9.0" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "722e23542a15cea1f65d4a1419c4cfd7a26706c70871a13a04238ca3f40f1661" +checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" [[package]] name = "corosensei" @@ -184,10 +184,10 @@ dependencies = [ name = "cosmwasm-crypto" version = "1.3.1" dependencies = [ - "digest 0.10.3", + "digest 0.10.7", "ed25519-zebra", "k256", - "rand_core 0.6.3", + "rand_core 0.6.4", "thiserror", ] @@ -415,12 +415,12 @@ dependencies = [ [[package]] name = "crypto-bigint" -version = "0.4.8" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f2b443d17d49dad5ef0ede301c3179cc923b8822f3393b4d2c28c269dd4a122" +checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" dependencies = [ "generic-array", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", "zeroize", ] @@ -498,9 +498,9 @@ dependencies = [ [[package]] name = "der" -version = "0.6.0" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dd2ae565c0a381dde7fade45fce95984c568bdcb4700a4fdbe3175e0380b2f" +checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", "zeroize", @@ -528,11 +528,12 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.3" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.2", + "const-oid", "crypto-common", "subtle", ] @@ -571,14 +572,16 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.14.3" +version = "0.16.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd46e0c364655e5baf2f5e99b603e7a09905da9966d7928d7470af393b28670" +checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", + "spki", ] [[package]] @@ -589,7 +592,7 @@ checksum = "403ef3e961ab98f0ba902771d29f842058578bb1ce7e3c59dad5a6a93e784c69" dependencies = [ "curve25519-dalek", "hex", - "rand_core 0.6.3", + "rand_core 0.6.4", "serde", "sha2 0.9.5", "thiserror", @@ -604,19 +607,18 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.12.2" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c47abd0a791d2ac0c7aa1118715f85b83689e4522c4e3a244e159d4fc9848a8d" +checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ "base16ct", "crypto-bigint", - "der", - "digest 0.10.3", + "digest 0.10.7", "ff", "generic-array", "group", "pkcs8", - "rand_core 0.6.3", + "rand_core 0.6.4", "sec1", "subtle", "zeroize", @@ -671,11 +673,11 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "ff" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df689201f395c6b90dfe87127685f8dbfc083a5e779e613575d8bd7314300c3e" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -711,12 +713,13 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.4" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -760,12 +763,12 @@ dependencies = [ [[package]] name = "group" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7391856def869c1c81063a03457c676fbcd419709c3dfb33d8d319de484b154d" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -799,7 +802,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.3", + "digest 0.10.7", ] [[package]] @@ -856,14 +859,16 @@ dependencies = [ [[package]] name = "k256" -version = "0.11.3" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8a5a96d92d849c4499d99461da81c9cdc1467418a8ed2aaeb407e8d85940ed" +checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", + "once_cell", "sha2 0.10.3", + "signature", ] [[package]] @@ -1019,9 +1024,9 @@ checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" [[package]] name = "pkcs8" -version = "0.9.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ "der", "spki", @@ -1100,9 +1105,9 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom 0.2.3", ] @@ -1176,13 +1181,12 @@ dependencies = [ [[package]] name = "rfc6979" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88c86280f057430a52f4861551b092a01b419b8eacefc7c995eacb9dc132fe32" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "crypto-bigint", "hmac", - "zeroize", + "subtle", ] [[package]] @@ -1261,9 +1265,9 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "sec1" -version = "0.3.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", @@ -1356,17 +1360,17 @@ checksum = "899bf02746a2c92bf1053d9327dadb252b01af1f81f90cdb902411f518bc7215" dependencies = [ "cfg-if", "cpufeatures 0.2.2", - "digest 0.10.3", + "digest 0.10.7", ] [[package]] name = "signature" -version = "1.5.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f054c6c1a6e95179d6f23ed974060dcefb2d9388bb7256900badad682c499de4" +checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.3", - "rand_core 0.6.3", + "digest 0.10.7", + "rand_core 0.6.4", ] [[package]] @@ -1389,9 +1393,9 @@ checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "spki" -version = "0.6.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" dependencies = [ "base64ct", "der", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 5718409d1a..4d49f2d390 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -57,9 +57,9 @@ dependencies = [ [[package]] name = "base16ct" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64" @@ -163,9 +163,9 @@ checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" [[package]] name = "const-oid" -version = "0.9.0" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "722e23542a15cea1f65d4a1419c4cfd7a26706c70871a13a04238ca3f40f1661" +checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" [[package]] name = "corosensei" @@ -184,10 +184,10 @@ dependencies = [ name = "cosmwasm-crypto" version = "1.3.1" dependencies = [ - "digest 0.10.3", + "digest 0.10.7", "ed25519-zebra", "k256", - "rand_core 0.6.3", + "rand_core 0.6.4", "thiserror", ] @@ -415,12 +415,12 @@ dependencies = [ [[package]] name = "crypto-bigint" -version = "0.4.8" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f2b443d17d49dad5ef0ede301c3179cc923b8822f3393b4d2c28c269dd4a122" +checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" dependencies = [ "generic-array", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", "zeroize", ] @@ -498,9 +498,9 @@ dependencies = [ [[package]] name = "der" -version = "0.6.0" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dd2ae565c0a381dde7fade45fce95984c568bdcb4700a4fdbe3175e0380b2f" +checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", "zeroize", @@ -528,11 +528,12 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.3" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.2", + "const-oid", "crypto-common", "subtle", ] @@ -571,14 +572,16 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.14.3" +version = "0.16.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd46e0c364655e5baf2f5e99b603e7a09905da9966d7928d7470af393b28670" +checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", + "spki", ] [[package]] @@ -589,7 +592,7 @@ checksum = "403ef3e961ab98f0ba902771d29f842058578bb1ce7e3c59dad5a6a93e784c69" dependencies = [ "curve25519-dalek", "hex", - "rand_core 0.6.3", + "rand_core 0.6.4", "serde", "sha2 0.9.5", "thiserror", @@ -604,19 +607,18 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.12.2" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c47abd0a791d2ac0c7aa1118715f85b83689e4522c4e3a244e159d4fc9848a8d" +checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ "base16ct", "crypto-bigint", - "der", - "digest 0.10.3", + "digest 0.10.7", "ff", "generic-array", "group", "pkcs8", - "rand_core 0.6.3", + "rand_core 0.6.4", "sec1", "subtle", "zeroize", @@ -671,11 +673,11 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "ff" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df689201f395c6b90dfe87127685f8dbfc083a5e779e613575d8bd7314300c3e" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -711,12 +713,13 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.4" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -760,12 +763,12 @@ dependencies = [ [[package]] name = "group" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7391856def869c1c81063a03457c676fbcd419709c3dfb33d8d319de484b154d" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -799,7 +802,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.3", + "digest 0.10.7", ] [[package]] @@ -856,14 +859,16 @@ dependencies = [ [[package]] name = "k256" -version = "0.11.3" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8a5a96d92d849c4499d99461da81c9cdc1467418a8ed2aaeb407e8d85940ed" +checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", + "once_cell", "sha2 0.10.3", + "signature", ] [[package]] @@ -1019,9 +1024,9 @@ checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" [[package]] name = "pkcs8" -version = "0.9.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ "der", "spki", @@ -1100,9 +1105,9 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom 0.2.3", ] @@ -1176,13 +1181,12 @@ dependencies = [ [[package]] name = "rfc6979" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88c86280f057430a52f4861551b092a01b419b8eacefc7c995eacb9dc132fe32" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "crypto-bigint", "hmac", - "zeroize", + "subtle", ] [[package]] @@ -1261,9 +1265,9 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "sec1" -version = "0.3.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", @@ -1356,17 +1360,17 @@ checksum = "899bf02746a2c92bf1053d9327dadb252b01af1f81f90cdb902411f518bc7215" dependencies = [ "cfg-if", "cpufeatures 0.2.2", - "digest 0.10.3", + "digest 0.10.7", ] [[package]] name = "signature" -version = "1.5.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f054c6c1a6e95179d6f23ed974060dcefb2d9388bb7256900badad682c499de4" +checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.3", - "rand_core 0.6.3", + "digest 0.10.7", + "rand_core 0.6.4", ] [[package]] @@ -1389,9 +1393,9 @@ checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "spki" -version = "0.6.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" dependencies = [ "base64ct", "der", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index fc4c9ec4f8..d661cb3cd5 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -57,9 +57,9 @@ dependencies = [ [[package]] name = "base16ct" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64" @@ -163,9 +163,9 @@ checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" [[package]] name = "const-oid" -version = "0.9.0" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "722e23542a15cea1f65d4a1419c4cfd7a26706c70871a13a04238ca3f40f1661" +checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" [[package]] name = "corosensei" @@ -184,10 +184,10 @@ dependencies = [ name = "cosmwasm-crypto" version = "1.3.1" dependencies = [ - "digest 0.10.3", + "digest 0.10.7", "ed25519-zebra", "k256", - "rand_core 0.6.3", + "rand_core 0.6.4", "thiserror", ] @@ -415,12 +415,12 @@ dependencies = [ [[package]] name = "crypto-bigint" -version = "0.4.8" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f2b443d17d49dad5ef0ede301c3179cc923b8822f3393b4d2c28c269dd4a122" +checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" dependencies = [ "generic-array", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", "zeroize", ] @@ -498,9 +498,9 @@ dependencies = [ [[package]] name = "der" -version = "0.6.0" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dd2ae565c0a381dde7fade45fce95984c568bdcb4700a4fdbe3175e0380b2f" +checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", "zeroize", @@ -528,11 +528,12 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.3" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.2", + "const-oid", "crypto-common", "subtle", ] @@ -571,14 +572,16 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.14.3" +version = "0.16.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd46e0c364655e5baf2f5e99b603e7a09905da9966d7928d7470af393b28670" +checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", + "spki", ] [[package]] @@ -589,7 +592,7 @@ checksum = "403ef3e961ab98f0ba902771d29f842058578bb1ce7e3c59dad5a6a93e784c69" dependencies = [ "curve25519-dalek", "hex", - "rand_core 0.6.3", + "rand_core 0.6.4", "serde", "sha2 0.9.5", "thiserror", @@ -604,19 +607,18 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.12.2" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c47abd0a791d2ac0c7aa1118715f85b83689e4522c4e3a244e159d4fc9848a8d" +checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ "base16ct", "crypto-bigint", - "der", - "digest 0.10.3", + "digest 0.10.7", "ff", "generic-array", "group", "pkcs8", - "rand_core 0.6.3", + "rand_core 0.6.4", "sec1", "subtle", "zeroize", @@ -671,11 +673,11 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "ff" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df689201f395c6b90dfe87127685f8dbfc083a5e779e613575d8bd7314300c3e" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -711,12 +713,13 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.4" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -760,12 +763,12 @@ dependencies = [ [[package]] name = "group" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7391856def869c1c81063a03457c676fbcd419709c3dfb33d8d319de484b154d" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -799,7 +802,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.3", + "digest 0.10.7", ] [[package]] @@ -845,14 +848,16 @@ dependencies = [ [[package]] name = "k256" -version = "0.11.3" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8a5a96d92d849c4499d99461da81c9cdc1467418a8ed2aaeb407e8d85940ed" +checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", + "once_cell", "sha2 0.10.3", + "signature", ] [[package]] @@ -1008,9 +1013,9 @@ checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" [[package]] name = "pkcs8" -version = "0.9.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ "der", "spki", @@ -1100,9 +1105,9 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom 0.2.3", ] @@ -1176,13 +1181,12 @@ dependencies = [ [[package]] name = "rfc6979" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88c86280f057430a52f4861551b092a01b419b8eacefc7c995eacb9dc132fe32" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "crypto-bigint", "hmac", - "zeroize", + "subtle", ] [[package]] @@ -1261,9 +1265,9 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "sec1" -version = "0.3.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", @@ -1356,17 +1360,17 @@ checksum = "899bf02746a2c92bf1053d9327dadb252b01af1f81f90cdb902411f518bc7215" dependencies = [ "cfg-if", "cpufeatures 0.2.2", - "digest 0.10.3", + "digest 0.10.7", ] [[package]] name = "signature" -version = "1.5.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f054c6c1a6e95179d6f23ed974060dcefb2d9388bb7256900badad682c499de4" +checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.3", - "rand_core 0.6.3", + "digest 0.10.7", + "rand_core 0.6.4", ] [[package]] @@ -1389,9 +1393,9 @@ checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "spki" -version = "0.6.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" dependencies = [ "base64ct", "der", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index eb41b8b39a..3996a6fa41 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -57,9 +57,9 @@ dependencies = [ [[package]] name = "base16ct" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64" @@ -163,9 +163,9 @@ checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" [[package]] name = "const-oid" -version = "0.9.0" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "722e23542a15cea1f65d4a1419c4cfd7a26706c70871a13a04238ca3f40f1661" +checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" [[package]] name = "corosensei" @@ -184,10 +184,10 @@ dependencies = [ name = "cosmwasm-crypto" version = "1.3.1" dependencies = [ - "digest 0.10.3", + "digest 0.10.7", "ed25519-zebra", "k256", - "rand_core 0.6.3", + "rand_core 0.6.4", "thiserror", ] @@ -415,12 +415,12 @@ dependencies = [ [[package]] name = "crypto-bigint" -version = "0.4.8" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f2b443d17d49dad5ef0ede301c3179cc923b8822f3393b4d2c28c269dd4a122" +checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" dependencies = [ "generic-array", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", "zeroize", ] @@ -498,9 +498,9 @@ dependencies = [ [[package]] name = "der" -version = "0.6.0" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dd2ae565c0a381dde7fade45fce95984c568bdcb4700a4fdbe3175e0380b2f" +checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", "zeroize", @@ -528,11 +528,12 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.3" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.2", + "const-oid", "crypto-common", "subtle", ] @@ -571,14 +572,16 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.14.3" +version = "0.16.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd46e0c364655e5baf2f5e99b603e7a09905da9966d7928d7470af393b28670" +checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", + "spki", ] [[package]] @@ -589,7 +592,7 @@ checksum = "403ef3e961ab98f0ba902771d29f842058578bb1ce7e3c59dad5a6a93e784c69" dependencies = [ "curve25519-dalek", "hex", - "rand_core 0.6.3", + "rand_core 0.6.4", "serde", "sha2 0.9.5", "thiserror", @@ -604,19 +607,18 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.12.2" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c47abd0a791d2ac0c7aa1118715f85b83689e4522c4e3a244e159d4fc9848a8d" +checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ "base16ct", "crypto-bigint", - "der", - "digest 0.10.3", + "digest 0.10.7", "ff", "generic-array", "group", "pkcs8", - "rand_core 0.6.3", + "rand_core 0.6.4", "sec1", "subtle", "zeroize", @@ -671,11 +673,11 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "ff" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df689201f395c6b90dfe87127685f8dbfc083a5e779e613575d8bd7314300c3e" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -711,12 +713,13 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.4" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -760,12 +763,12 @@ dependencies = [ [[package]] name = "group" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7391856def869c1c81063a03457c676fbcd419709c3dfb33d8d319de484b154d" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -799,7 +802,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.3", + "digest 0.10.7", ] [[package]] @@ -845,14 +848,16 @@ dependencies = [ [[package]] name = "k256" -version = "0.11.3" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8a5a96d92d849c4499d99461da81c9cdc1467418a8ed2aaeb407e8d85940ed" +checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", + "once_cell", "sha2 0.10.3", + "signature", ] [[package]] @@ -1008,9 +1013,9 @@ checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" [[package]] name = "pkcs8" -version = "0.9.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ "der", "spki", @@ -1089,9 +1094,9 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom 0.2.3", ] @@ -1177,13 +1182,12 @@ dependencies = [ [[package]] name = "rfc6979" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88c86280f057430a52f4861551b092a01b419b8eacefc7c995eacb9dc132fe32" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "crypto-bigint", "hmac", - "zeroize", + "subtle", ] [[package]] @@ -1262,9 +1266,9 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "sec1" -version = "0.3.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", @@ -1357,17 +1361,17 @@ checksum = "899bf02746a2c92bf1053d9327dadb252b01af1f81f90cdb902411f518bc7215" dependencies = [ "cfg-if", "cpufeatures 0.2.2", - "digest 0.10.3", + "digest 0.10.7", ] [[package]] name = "signature" -version = "1.5.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f054c6c1a6e95179d6f23ed974060dcefb2d9388bb7256900badad682c499de4" +checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.3", - "rand_core 0.6.3", + "digest 0.10.7", + "rand_core 0.6.4", ] [[package]] @@ -1390,9 +1394,9 @@ checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "spki" -version = "0.6.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" dependencies = [ "base64ct", "der", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index fa95f9de55..2e40710089 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -57,9 +57,9 @@ dependencies = [ [[package]] name = "base16ct" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64" @@ -163,9 +163,9 @@ checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" [[package]] name = "const-oid" -version = "0.9.0" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "722e23542a15cea1f65d4a1419c4cfd7a26706c70871a13a04238ca3f40f1661" +checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" [[package]] name = "corosensei" @@ -184,10 +184,10 @@ dependencies = [ name = "cosmwasm-crypto" version = "1.3.1" dependencies = [ - "digest 0.10.3", + "digest 0.10.7", "ed25519-zebra", "k256", - "rand_core 0.6.3", + "rand_core 0.6.4", "thiserror", ] @@ -415,12 +415,12 @@ dependencies = [ [[package]] name = "crypto-bigint" -version = "0.4.8" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f2b443d17d49dad5ef0ede301c3179cc923b8822f3393b4d2c28c269dd4a122" +checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" dependencies = [ "generic-array", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", "zeroize", ] @@ -498,9 +498,9 @@ dependencies = [ [[package]] name = "der" -version = "0.6.0" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dd2ae565c0a381dde7fade45fce95984c568bdcb4700a4fdbe3175e0380b2f" +checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", "zeroize", @@ -528,11 +528,12 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.3" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.2", + "const-oid", "crypto-common", "subtle", ] @@ -577,14 +578,16 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.14.3" +version = "0.16.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd46e0c364655e5baf2f5e99b603e7a09905da9966d7928d7470af393b28670" +checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", + "spki", ] [[package]] @@ -595,7 +598,7 @@ checksum = "403ef3e961ab98f0ba902771d29f842058578bb1ce7e3c59dad5a6a93e784c69" dependencies = [ "curve25519-dalek", "hex", - "rand_core 0.6.3", + "rand_core 0.6.4", "serde", "sha2 0.9.5", "thiserror", @@ -610,19 +613,18 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.12.2" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c47abd0a791d2ac0c7aa1118715f85b83689e4522c4e3a244e159d4fc9848a8d" +checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ "base16ct", "crypto-bigint", - "der", - "digest 0.10.3", + "digest 0.10.7", "ff", "generic-array", "group", "pkcs8", - "rand_core 0.6.3", + "rand_core 0.6.4", "sec1", "subtle", "zeroize", @@ -677,11 +679,11 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "ff" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df689201f395c6b90dfe87127685f8dbfc083a5e779e613575d8bd7314300c3e" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -717,12 +719,13 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.4" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -766,12 +769,12 @@ dependencies = [ [[package]] name = "group" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7391856def869c1c81063a03457c676fbcd419709c3dfb33d8d319de484b154d" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -805,7 +808,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.3", + "digest 0.10.7", ] [[package]] @@ -851,14 +854,16 @@ dependencies = [ [[package]] name = "k256" -version = "0.11.3" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8a5a96d92d849c4499d99461da81c9cdc1467418a8ed2aaeb407e8d85940ed" +checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", + "once_cell", "sha2 0.10.3", + "signature", ] [[package]] @@ -1014,9 +1019,9 @@ checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" [[package]] name = "pkcs8" -version = "0.9.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ "der", "spki", @@ -1095,9 +1100,9 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom 0.2.3", ] @@ -1171,13 +1176,12 @@ dependencies = [ [[package]] name = "rfc6979" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88c86280f057430a52f4861551b092a01b419b8eacefc7c995eacb9dc132fe32" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "crypto-bigint", "hmac", - "zeroize", + "subtle", ] [[package]] @@ -1256,9 +1260,9 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "sec1" -version = "0.3.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", @@ -1351,17 +1355,17 @@ checksum = "899bf02746a2c92bf1053d9327dadb252b01af1f81f90cdb902411f518bc7215" dependencies = [ "cfg-if", "cpufeatures 0.2.2", - "digest 0.10.3", + "digest 0.10.7", ] [[package]] name = "signature" -version = "1.5.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f054c6c1a6e95179d6f23ed974060dcefb2d9388bb7256900badad682c499de4" +checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.3", - "rand_core 0.6.3", + "digest 0.10.7", + "rand_core 0.6.4", ] [[package]] @@ -1405,9 +1409,9 @@ dependencies = [ [[package]] name = "spki" -version = "0.6.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" dependencies = [ "base64ct", "der", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 0740f60d53..42ea6f6d17 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -57,9 +57,9 @@ dependencies = [ [[package]] name = "base16ct" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64" @@ -163,9 +163,9 @@ checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" [[package]] name = "const-oid" -version = "0.9.0" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "722e23542a15cea1f65d4a1419c4cfd7a26706c70871a13a04238ca3f40f1661" +checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" [[package]] name = "corosensei" @@ -184,10 +184,10 @@ dependencies = [ name = "cosmwasm-crypto" version = "1.3.1" dependencies = [ - "digest 0.10.3", + "digest 0.10.7", "ed25519-zebra", "k256", - "rand_core 0.6.3", + "rand_core 0.6.4", "thiserror", ] @@ -415,12 +415,12 @@ dependencies = [ [[package]] name = "crypto-bigint" -version = "0.4.8" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f2b443d17d49dad5ef0ede301c3179cc923b8822f3393b4d2c28c269dd4a122" +checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" dependencies = [ "generic-array", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", "zeroize", ] @@ -498,9 +498,9 @@ dependencies = [ [[package]] name = "der" -version = "0.6.0" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dd2ae565c0a381dde7fade45fce95984c568bdcb4700a4fdbe3175e0380b2f" +checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", "zeroize", @@ -528,11 +528,12 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.3" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.2", + "const-oid", "crypto-common", "subtle", ] @@ -571,14 +572,16 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.14.3" +version = "0.16.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd46e0c364655e5baf2f5e99b603e7a09905da9966d7928d7470af393b28670" +checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", + "spki", ] [[package]] @@ -589,7 +592,7 @@ checksum = "403ef3e961ab98f0ba902771d29f842058578bb1ce7e3c59dad5a6a93e784c69" dependencies = [ "curve25519-dalek", "hex", - "rand_core 0.6.3", + "rand_core 0.6.4", "serde", "sha2 0.9.5", "thiserror", @@ -604,19 +607,18 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.12.2" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c47abd0a791d2ac0c7aa1118715f85b83689e4522c4e3a244e159d4fc9848a8d" +checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ "base16ct", "crypto-bigint", - "der", - "digest 0.10.3", + "digest 0.10.7", "ff", "generic-array", "group", "pkcs8", - "rand_core 0.6.3", + "rand_core 0.6.4", "sec1", "subtle", "zeroize", @@ -671,11 +673,11 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "ff" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df689201f395c6b90dfe87127685f8dbfc083a5e779e613575d8bd7314300c3e" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -711,12 +713,13 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.4" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -760,12 +763,12 @@ dependencies = [ [[package]] name = "group" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7391856def869c1c81063a03457c676fbcd419709c3dfb33d8d319de484b154d" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand_core 0.6.3", + "rand_core 0.6.4", "subtle", ] @@ -799,7 +802,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.3", + "digest 0.10.7", ] [[package]] @@ -845,14 +848,16 @@ dependencies = [ [[package]] name = "k256" -version = "0.11.3" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8a5a96d92d849c4499d99461da81c9cdc1467418a8ed2aaeb407e8d85940ed" +checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", + "once_cell", "sha2 0.10.3", + "signature", ] [[package]] @@ -1008,9 +1013,9 @@ checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" [[package]] name = "pkcs8" -version = "0.9.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ "der", "spki", @@ -1089,9 +1094,9 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom 0.2.3", ] @@ -1165,13 +1170,12 @@ dependencies = [ [[package]] name = "rfc6979" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88c86280f057430a52f4861551b092a01b419b8eacefc7c995eacb9dc132fe32" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "crypto-bigint", "hmac", - "zeroize", + "subtle", ] [[package]] @@ -1250,9 +1254,9 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "sec1" -version = "0.3.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", @@ -1345,17 +1349,17 @@ checksum = "899bf02746a2c92bf1053d9327dadb252b01af1f81f90cdb902411f518bc7215" dependencies = [ "cfg-if", "cpufeatures 0.2.2", - "digest 0.10.3", + "digest 0.10.7", ] [[package]] name = "signature" -version = "1.5.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f054c6c1a6e95179d6f23ed974060dcefb2d9388bb7256900badad682c499de4" +checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.3", - "rand_core 0.6.3", + "digest 0.10.7", + "rand_core 0.6.4", ] [[package]] @@ -1378,9 +1382,9 @@ checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "spki" -version = "0.6.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" dependencies = [ "base64ct", "der", diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 78a2e2069d..ca632e0230 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -19,7 +19,7 @@ backtraces = [] bench = false [dependencies] -k256 = { version = "0.11.1", features = ["ecdsa"] } +k256 = { version = "0.13.1", features = ["ecdsa"] } ed25519-zebra = "3" digest = "0.10" rand_core = { version = "0.6", features = ["getrandom"] } diff --git a/packages/crypto/src/secp256k1.rs b/packages/crypto/src/secp256k1.rs index 0b57d507c6..cb30e2b3dc 100644 --- a/packages/crypto/src/secp256k1.rs +++ b/packages/crypto/src/secp256k1.rs @@ -1,9 +1,7 @@ use digest::{Digest, Update}; // trait use k256::{ - ecdsa::recoverable, - ecdsa::signature::{DigestVerifier, Signature as _}, // traits - ecdsa::{Signature, VerifyingKey}, // type aliases - elliptic_curve::sec1::ToEncodedPoint, + ecdsa::signature::DigestVerifier, // traits + ecdsa::{RecoveryId, Signature, VerifyingKey}, // type aliases }; use crate::errors::{CryptoError, CryptoResult}; @@ -52,8 +50,8 @@ pub fn secp256k1_verify( // Already hashed, just build Digest container let message_digest = Identity256::new().chain(message_hash); - let mut signature = - Signature::from_bytes(&signature).map_err(|e| CryptoError::generic_err(e.to_string()))?; + let mut signature = Signature::from_bytes(&signature.into()) + .map_err(|e| CryptoError::generic_err(e.to_string()))?; // High-S signatures require normalization since our verification implementation // rejects them by default. If we had a verifier that does not restrict to @@ -106,19 +104,19 @@ pub fn secp256k1_recover_pubkey( let message_hash = read_hash(message_hash)?; let signature = read_signature(signature)?; - let id = - recoverable::Id::new(recovery_param).map_err(|_| CryptoError::invalid_recovery_param())?; + // params other than 0 and 1 are explicitly not supported + if recovery_param >= 2 { + return Err(CryptoError::invalid_recovery_param()); + } + let id = RecoveryId::from_byte(recovery_param).unwrap(); // Compose extended signature - let signature = - Signature::from_bytes(&signature).map_err(|e| CryptoError::generic_err(e.to_string()))?; - let extended_signature = recoverable::Signature::new(&signature, id) + let signature = Signature::from_bytes(&signature.into()) .map_err(|e| CryptoError::generic_err(e.to_string()))?; // Recover let message_digest = Identity256::new().chain(message_hash); - let pubkey = extended_signature - .recover_verifying_key_from_digest(message_digest) + let pubkey = VerifyingKey::recover_from_digest(message_digest, &signature, id) .map_err(|e| CryptoError::generic_err(e.to_string()))?; let encoded: Vec = pubkey.to_encoded_point(false).as_bytes().into(); Ok(encoded) @@ -183,7 +181,6 @@ mod tests { ecdsa::signature::DigestSigner, // trait ecdsa::SigningKey, // type alias elliptic_curve::rand_core::OsRng, - elliptic_curve::sec1::ToEncodedPoint, }; use serde::Deserialize; use sha2::Sha256; @@ -237,7 +234,7 @@ mod tests { // Verification (uncompressed public key) assert!(secp256k1_verify( &message_hash, - signature.as_bytes(), + signature.to_bytes().as_slice(), public_key.to_encoded_point(false).as_bytes() ) .unwrap()); @@ -245,7 +242,7 @@ mod tests { // Verification (compressed public key) assert!(secp256k1_verify( &message_hash, - signature.as_bytes(), + signature.to_bytes().as_slice(), public_key.to_encoded_point(true).as_bytes() ) .unwrap()); @@ -254,7 +251,7 @@ mod tests { let bad_message_hash = Sha256::new().chain(MSG).chain("\0").finalize(); assert!(!secp256k1_verify( &bad_message_hash, - signature.as_bytes(), + signature.to_bytes().as_slice(), public_key.to_encoded_point(false).as_bytes() ) .unwrap()); @@ -264,7 +261,7 @@ mod tests { let other_public_key = VerifyingKey::from(&other_secret_key); assert!(!secp256k1_verify( &message_hash, - signature.as_bytes(), + signature.to_bytes().as_slice(), other_public_key.to_encoded_point(false).as_bytes() ) .unwrap()); @@ -330,7 +327,7 @@ mod tests { { let private_key = hex!("3c9229289a6125f7fdf1885a77bb12c37a8d3b4962d936f7e3084dece32a3ca1"); - let expected = SigningKey::from_bytes(&private_key) + let expected = SigningKey::from_bytes(&private_key.into()) .unwrap() .verifying_key() .to_encoded_point(false) From 57e5da2fd61d6da04c03e518f7a6d5f4e6df5cb4 Mon Sep 17 00:00:00 2001 From: Michal Nazarewicz Date: Thu, 27 Jul 2023 13:13:59 +0200 Subject: [PATCH 0571/2372] Update packages/std/src/testing/assertions.rs Co-authored-by: Christoph Otter --- packages/std/src/testing/assertions.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/testing/assertions.rs b/packages/std/src/testing/assertions.rs index 5a3462391d..3f3527c1de 100644 --- a/packages/std/src/testing/assertions.rs +++ b/packages/std/src/testing/assertions.rs @@ -102,11 +102,11 @@ pub fn assert_hash_works_impl(left: T, right: T, panic_msg } } -#[track_caller] /// Panics concatenating both arguments. /// /// If second argument is `None` panics with just the first argument as message. /// Otherwise, formats the panic message as `{reason}:\n{panic_msg}`. +#[track_caller] fn do_panic(reason: impl core::fmt::Display, panic_msg: Option) -> ! { match panic_msg { Some(panic_msg) => panic!("{reason}:\n{panic_msg}"), From 91a0e5bb9e6ecf93d27ca0a6e4848f79b4815d38 Mon Sep 17 00:00:00 2001 From: Michal Nazarewicz Date: Thu, 27 Jul 2023 13:17:50 +0200 Subject: [PATCH 0572/2372] update docs --- packages/std/src/testing/assertions.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/testing/assertions.rs b/packages/std/src/testing/assertions.rs index 3f3527c1de..d747360070 100644 --- a/packages/std/src/testing/assertions.rs +++ b/packages/std/src/testing/assertions.rs @@ -23,7 +23,7 @@ macro_rules! assert_approx_eq { }}; } -/// Asserts that type `T` implements `Hash` trait correctly. +/// Tests that type `T` implements `Eq` and `Hash` traits correctly. /// /// `left` and `right` must be unequal objects. /// From c5f1cbc48633b67c5230f5aeaf424bcc23f28f79 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 27 Jul 2023 13:52:48 +0200 Subject: [PATCH 0573/2372] Fix crypto benches --- packages/crypto/benches/main.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/crypto/benches/main.rs b/packages/crypto/benches/main.rs index f3509cebf0..ce4b8d2eb3 100644 --- a/packages/crypto/benches/main.rs +++ b/packages/crypto/benches/main.rs @@ -8,7 +8,6 @@ use serde::Deserialize; // Crypto stuff use digest::Digest; use k256::ecdsa::SigningKey; // type alias -use k256::elliptic_curve::sec1::ToEncodedPoint; use sha2::Sha256; use cosmwasm_crypto::{ @@ -95,7 +94,7 @@ fn bench_crypto(c: &mut Criterion) { let r_s = hex!("99e71a99cb2270b8cac5254f9e99b6210c6c10224a1579cf389ef88b20a1abe9129ff05af364204442bdb53ab6f18a99ab48acc9326fa689f228040429e3ca66"); let recovery_param: u8 = 0; - let expected = SigningKey::from_bytes(&private_key) + let expected = SigningKey::from_bytes(&private_key.into()) .unwrap() .verifying_key() .to_encoded_point(false) From 10d2fa7a5221585e56da020a9a752e32e91be4ac Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 27 Jul 2023 14:09:46 +0200 Subject: [PATCH 0574/2372] Test both long and short width for integer padding --- packages/std/src/math/int128.rs | 8 +++++++- packages/std/src/math/int256.rs | 8 +++++++- packages/std/src/math/int512.rs | 8 +++++++- packages/std/src/math/int64.rs | 8 +++++++- packages/std/src/math/uint128.rs | 5 +++++ packages/std/src/math/uint256.rs | 5 +++++ packages/std/src/math/uint512.rs | 5 +++++ packages/std/src/math/uint64.rs | 5 +++++ 8 files changed, 48 insertions(+), 4 deletions(-) diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index 1edf250771..a6e94cdf6c 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -616,11 +616,17 @@ mod tests { #[test] fn int128_display_padding_works() { + // width > natural representation let a = Int128::from(123u64); assert_eq!(format!("Embedded: {a:05}"), "Embedded: 00123"); - let a = Int128::from(-123i64); assert_eq!(format!("Embedded: {a:05}"), "Embedded: -0123"); + + // width < natural representation + let a = Int128::from(123u64); + assert_eq!(format!("Embedded: {a:02}"), "Embedded: 123"); + let a = Int128::from(-123i64); + assert_eq!(format!("Embedded: {a:02}"), "Embedded: -123"); } #[test] diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index 6cb71dd654..9aca95d25f 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -681,11 +681,17 @@ mod tests { #[test] fn int256_display_padding_works() { + // width > natural representation let a = Int256::from(123u64); assert_eq!(format!("Embedded: {a:05}"), "Embedded: 00123"); - let a = Int256::from(-123i64); assert_eq!(format!("Embedded: {a:05}"), "Embedded: -0123"); + + // width < natural representation + let a = Int256::from(123u64); + assert_eq!(format!("Embedded: {a:02}"), "Embedded: 123"); + let a = Int256::from(-123i64); + assert_eq!(format!("Embedded: {a:02}"), "Embedded: -123"); } #[test] diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index c3145d2cd4..eea1d5ebf4 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -720,11 +720,17 @@ mod tests { #[test] fn int512_display_padding_works() { + // width > natural representation let a = Int512::from(123u64); assert_eq!(format!("Embedded: {a:05}"), "Embedded: 00123"); - let a = Int512::from(-123i64); assert_eq!(format!("Embedded: {a:05}"), "Embedded: -0123"); + + // width < natural representation + let a = Int512::from(123u64); + assert_eq!(format!("Embedded: {a:02}"), "Embedded: 123"); + let a = Int512::from(-123i64); + assert_eq!(format!("Embedded: {a:02}"), "Embedded: -123"); } #[test] diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index a0fd3db4fe..5715e7852f 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -586,11 +586,17 @@ mod tests { #[test] fn int64_display_padding_works() { + // width > natural representation let a = Int64::from(123i64); assert_eq!(format!("Embedded: {a:05}"), "Embedded: 00123"); - let a = Int64::from(-123i64); assert_eq!(format!("Embedded: {a:05}"), "Embedded: -0123"); + + // width < natural representation + let a = Int64::from(123i64); + assert_eq!(format!("Embedded: {a:02}"), "Embedded: 123"); + let a = Int64::from(-123i64); + assert_eq!(format!("Embedded: {a:02}"), "Embedded: -123"); } #[test] diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 7a8dc510f7..ae33a62058 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -673,8 +673,13 @@ mod tests { #[test] fn uint128_display_padding_works() { + // width > natural representation let a = Uint128::from(123u64); assert_eq!(format!("Embedded: {a:05}"), "Embedded: 00123"); + + // width < natural representation + let a = Uint128::from(123u64); + assert_eq!(format!("Embedded: {a:02}"), "Embedded: 123"); } #[test] diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 255195c422..8f4bd17248 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -1104,8 +1104,13 @@ mod tests { #[test] fn uint256_display_padding_works() { + // width > natural representation let a = Uint256::from(123u64); assert_eq!(format!("Embedded: {a:05}"), "Embedded: 00123"); + + // width < natural representation + let a = Uint256::from(123u64); + assert_eq!(format!("Embedded: {a:02}"), "Embedded: 123"); } #[test] diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index 6100985e07..6166f68038 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -799,8 +799,13 @@ mod tests { #[test] fn uint512_display_padding_works() { + // width > natural representation let a = Uint512::from(123u64); assert_eq!(format!("Embedded: {a:05}"), "Embedded: 00123"); + + // width < natural representation + let a = Uint512::from(123u64); + assert_eq!(format!("Embedded: {a:02}"), "Embedded: 123"); } #[test] diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index 39cc583eed..bf584d8c5f 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -614,8 +614,13 @@ mod tests { #[test] fn uint64_display_padding_works() { + // width > natural representation let a = Uint64::from(123u64); assert_eq!(format!("Embedded: {a:05}"), "Embedded: 00123"); + + // width < natural representation + let a = Uint64::from(123u64); + assert_eq!(format!("Embedded: {a:02}"), "Embedded: 123"); } #[test] From ed2d3f2f35087fba64fda4cf73b16a729d6113c1 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 27 Jul 2023 13:28:00 +0200 Subject: [PATCH 0575/2372] Upgrade bnum to 0.8.0 --- Cargo.lock | 4 ++-- contracts/burner/Cargo.lock | 4 ++-- contracts/crypto-verify/Cargo.lock | 4 ++-- contracts/cyberpunk/Cargo.lock | 4 ++-- contracts/floaty/Cargo.lock | 4 ++-- contracts/hackatom/Cargo.lock | 4 ++-- contracts/ibc-reflect-send/Cargo.lock | 4 ++-- contracts/ibc-reflect/Cargo.lock | 4 ++-- contracts/queue/Cargo.lock | 4 ++-- contracts/reflect/Cargo.lock | 4 ++-- contracts/staking/Cargo.lock | 4 ++-- contracts/virus/Cargo.lock | 4 ++-- packages/std/Cargo.toml | 2 +- packages/std/src/math/int256.rs | 7 +------ packages/std/src/math/int512.rs | 7 +------ packages/std/src/math/uint256.rs | 6 +----- packages/std/src/math/uint512.rs | 6 +----- 17 files changed, 29 insertions(+), 47 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 560852a15a..b0489b0ad6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -213,9 +213,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" +checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" [[package]] name = "bstr" diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 8a29a148c7..1028e65b44 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -99,9 +99,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" +checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" [[package]] name = "bumpalo" diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 74435f8435..880b8d3b87 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -99,9 +99,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" +checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" [[package]] name = "bumpalo" diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 4e8337c124..7c71e28ba2 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -128,9 +128,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" +checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" [[package]] name = "bumpalo" diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index bc87714e9d..720ec49797 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -99,9 +99,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" +checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" [[package]] name = "bumpalo" diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 567464c731..ed7746c87b 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -99,9 +99,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" +checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" [[package]] name = "bumpalo" diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 9b388c9cf0..d9ac52237a 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -99,9 +99,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" +checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" [[package]] name = "bumpalo" diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 5718409d1a..013c20bb95 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -99,9 +99,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" +checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" [[package]] name = "bumpalo" diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index fc4c9ec4f8..0d496d4ed6 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -99,9 +99,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" +checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" [[package]] name = "bumpalo" diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index eb41b8b39a..254fd7ce3b 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -99,9 +99,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" +checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" [[package]] name = "bumpalo" diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index fa95f9de55..f15f15c876 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -99,9 +99,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" +checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" [[package]] name = "bumpalo" diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 0740f60d53..18f94c037c 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -99,9 +99,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" +checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" [[package]] name = "bumpalo" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index d619bedf2d..0be7f670c8 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -54,7 +54,7 @@ sha2 = "0.10.3" serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } serde-json-wasm = { version = "0.5.0" } thiserror = "1.0.26" -bnum = "0.7.0" +bnum = "0.8.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] cosmwasm-crypto = { path = "../crypto", version = "1.3.1" } diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index 80ce83a9b3..50905713a2 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -371,12 +371,7 @@ impl From for String { impl fmt::Display for Int256 { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - // The inner type doesn't work as expected with padding, so we - // work around that. Remove this code when the upstream padding is fixed. - let unpadded = self.0.to_string(); - let numeric = unpadded.strip_prefix('-').unwrap_or(&unpadded); - - f.pad_integral(self >= &Self::zero(), "", numeric) + self.0.fmt(f) } } diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index f6ca8a29cf..08a30d0c3a 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -404,12 +404,7 @@ impl From for String { impl fmt::Display for Int512 { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - // The inner type doesn't work as expected with padding, so we - // work around that. Remove this code when the upstream padding is fixed. - let unpadded = self.0.to_string(); - let numeric = unpadded.strip_prefix('-').unwrap_or(&unpadded); - - f.pad_integral(self >= &Self::zero(), "", numeric) + self.0.fmt(f) } } diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index c31018ea9a..2199245a75 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -420,11 +420,7 @@ impl From for String { impl fmt::Display for Uint256 { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - // The inner type doesn't work as expected with padding, so we - // work around that. - let unpadded = self.0.to_string(); - - f.pad_integral(true, "", &unpadded) + self.0.fmt(f) } } diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index 8b88252d9e..0300d0f76e 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -407,11 +407,7 @@ impl From for String { impl fmt::Display for Uint512 { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - // The inner type doesn't work as expected with padding, so we - // work around that. - let unpadded = self.0.to_string(); - - f.pad_integral(true, "", &unpadded) + self.0.fmt(f) } } From 1cee2dfb586549a7cc665b109f182fb618ee5d1a Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 27 Jul 2023 18:32:14 +0200 Subject: [PATCH 0576/2372] Avoid unwrapping recovery ID --- packages/crypto/src/secp256k1.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/crypto/src/secp256k1.rs b/packages/crypto/src/secp256k1.rs index cb30e2b3dc..d77f71181d 100644 --- a/packages/crypto/src/secp256k1.rs +++ b/packages/crypto/src/secp256k1.rs @@ -105,10 +105,11 @@ pub fn secp256k1_recover_pubkey( let signature = read_signature(signature)?; // params other than 0 and 1 are explicitly not supported - if recovery_param >= 2 { - return Err(CryptoError::invalid_recovery_param()); - } - let id = RecoveryId::from_byte(recovery_param).unwrap(); + let id = match recovery_param { + 0 => RecoveryId::new(false, false), + 1 => RecoveryId::new(true, false), + _ => return Err(CryptoError::invalid_recovery_param()), + }; // Compose extended signature let signature = Signature::from_bytes(&signature.into()) From 56d4cb17714e685936d4a79cc53c449015cf2407 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 1 Aug 2023 17:13:00 +0200 Subject: [PATCH 0577/2372] Start working on go code generator --- Cargo.lock | 21 +++ packages/go-gen/Cargo.toml | 13 ++ packages/go-gen/README.md | 15 ++ packages/go-gen/src/main.rs | 321 ++++++++++++++++++++++++++++++++++++ 4 files changed, 370 insertions(+) create mode 100644 packages/go-gen/Cargo.toml create mode 100644 packages/go-gen/README.md create mode 100644 packages/go-gen/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index b0489b0ad6..fc60a0ea67 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,16 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + [[package]] name = "addr2line" version = "0.19.0" @@ -1123,6 +1133,17 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +[[package]] +name = "go-gen" +version = "0.1.0" +dependencies = [ + "Inflector", + "anyhow", + "cosmwasm-schema", + "cosmwasm-std", + "schemars", +] + [[package]] name = "group" version = "0.12.1" diff --git a/packages/go-gen/Cargo.toml b/packages/go-gen/Cargo.toml new file mode 100644 index 0000000000..8f687225e6 --- /dev/null +++ b/packages/go-gen/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "go-gen" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +schemars = "0.8.3" +cosmwasm-std = { path = "../std", version = "1.3.1" } +cosmwasm-schema = { path = "../schema", version = "1.3.1" } +anyhow = "1" +Inflector = "0.11.4" diff --git a/packages/go-gen/README.md b/packages/go-gen/README.md new file mode 100644 index 0000000000..743c58f3bf --- /dev/null +++ b/packages/go-gen/README.md @@ -0,0 +1,15 @@ +# JsonSchema Go Type Generator + +This is an internal utility to generate Go types from `cosmwasm-std`'s query +response types. These types can then be used in +[wasmvm](https://github.com/CosmWasm/wasmvm). + +## Limitations + +Only basic structs and enums are supported. Tuples don't work for example. + +## License + +This package is part of the cosmwasm repository, licensed under the Apache +License 2.0 (see [NOTICE](https://github.com/CosmWasm/cosmwasm/blob/main/NOTICE) +and [LICENSE](https://github.com/CosmWasm/cosmwasm/blob/main/LICENSE)). diff --git a/packages/go-gen/src/main.rs b/packages/go-gen/src/main.rs new file mode 100644 index 0000000000..4a46a42b14 --- /dev/null +++ b/packages/go-gen/src/main.rs @@ -0,0 +1,321 @@ +use anyhow::{bail, ensure, Context, Result}; +use inflector::cases::pascalcase::to_pascal_case; +use schemars::schema::{InstanceType, RootSchema, SchemaObject, SingleOrVec}; + +fn main() -> Result<()> { + let root = cosmwasm_schema::schema_for!(cosmwasm_std::SupplyResponse); + println!("{:#?}", root); + + let code = generate_go(root)?; + println!("{}", code); + + Ok(()) +} + +fn generate_go(root: RootSchema) -> Result { + let title = schema_object_type(&root.schema).context("failed to get type name")?; + let mut code = + generate_type(&title, root.schema).with_context(|| format!("error generating {title}"))?; + let additional_types: String = root + .definitions + .into_iter() + .map(|(name, def)| generate_type(&name, def.into_object())) + .collect::>>() + .context("failed generating additional definitions")? // TODO: better error message + .join("\n"); + + code.push('\n'); + code.push_str(&additional_types); + + Ok(code) +} + +fn generate_type(name: &str, schema: SchemaObject) -> Result { + if custom_type_of(name).is_some() { + // ignore custom types + // TODO: ugly + return Ok("".to_string()); + } + // first detect if we have a struct or enum + if is_object(&schema) { + generate_struct(name, schema) + } else if let Some(variants) = enum_variants(schema) { + generate_enum(name, variants) + } else { + // ignore other types + Ok("".to_string()) + } +} + +fn generate_struct(name: &str, strct: SchemaObject) -> Result { + // generate documentation + let mut out = String::new(); + if let Some(doc) = documentation(&strct, false) { + out.push_str(&doc); + } + + // type {name} struct { + out.push_str("type "); + out.push_str(name); + out.push_str(" struct {\n"); + + // go through all fields + let o = strct.object.context("expected object")?; + let fields = o + .properties + .into_iter() + .map(|(field, ty)| (field, ty.into_object())); + + for (field, ty) in fields { + if let Some(doc) = documentation(&ty, true) { + out.push_str(&doc); + } + + // {field} {type} `json:"{field}"` + out.push_str(" "); + out.push_str(&to_pascal_case(&field)); + out.push(' '); + out.push_str( + &schema_object_type(&ty) + .with_context(|| format!("failed to get type of field {field}"))?, + ); + out.push(' '); + out.push_str("`json:\""); + out.push_str(&field); + out.push_str("\"`\n"); + } + out.push('}'); + + Ok(out) +} + +fn generate_enum(name: &str, variants: Vec) -> Result { + todo!("generate_enum") +} + +/// Returns `true` if the given schema is an object and `false` if it is not. +fn is_object(schema: &SchemaObject) -> bool { + schema.object.is_some() + // schema + // .instance_type + // .as_ref() + // .map(|s| { + // if let SingleOrVec::Single(s) = s { + // &InstanceType::Object == s.as_ref() + // } else { + // false + // } + // }) + // .unwrap_or_default() +} + +/// Returns the schemas of the variants of this enum, if it is an enum. +/// Returns `None` if the schema is not an enum. +fn enum_variants(schema: SchemaObject) -> Option> { + Some( + schema + .subschemas? + .one_of? + .into_iter() + .map(|s| s.into_object()) + .collect(), + ) +} + +/// Returns the Go type for the given schema object. +fn schema_object_type(schema: &SchemaObject) -> Result { + // if it has a title, use that + if let Some(title) = schema.metadata.as_ref().and_then(|m| m.title.as_ref()) { + Ok(replace_custom_type(title)) + } else if let Some(reference) = &schema.reference { + // if it has a reference, strip the path and use that + Ok(replace_custom_type( + reference + .split('/') + .last() + .expect("split should always return at least one item"), + )) + } else if let Some(SingleOrVec::Single(t)) = &schema.instance_type { + // if it has an instance type, use that + let ty = match &**t { + InstanceType::String => "string".to_string(), + InstanceType::Number => "float64".to_string(), + InstanceType::Integer => "int64".to_string(), + InstanceType::Boolean => "bool".to_string(), + InstanceType::Object => bail!("object type not supported: {:?}", schema), + InstanceType::Array => { + // get type of items + let item_type = match schema.array.as_ref().and_then(|a| a.items.as_ref()) { + Some(SingleOrVec::Single(array_validation)) => { + schema_object_type(&array_validation.clone().into_object())? + } + _ => bail!("array type with non-singular item type not supported"), + }; + // map custom types + let item_type = custom_type_of(&item_type).unwrap_or(&item_type); + + format!("[]{}", item_type) + } + InstanceType::Null => bail!("null type not supported"), + }; + + Ok(ty) + } else if let Some(subschemas) = schema.subschemas.as_ref().and_then(|s| s.any_of.as_ref()) { + // if one of them is null, use pointer type + // TODO: ugly clone + if let Some(null_index) = subschemas + .iter() + .position(|s| is_null(&s.clone().into_object())) + { + ensure!(subschemas.len() == 2, "multiple subschemas in anyOf"); + // extract non-null type + let non_null_index = (null_index + 1) % 2; + let non_null_type = schema_object_type( + &subschemas + .get(non_null_index) + .expect("index should be valid") + .clone() + .into_object(), + )?; + // map custom types + let non_null_type = custom_type_of(&non_null_type).unwrap_or(&non_null_type); + Ok(format!("*{non_null_type}")) + } else if subschemas.len() == 1 { + todo!("handle like allOf") + } else { + bail!("multiple anyOf without null type not supported") + } + } else if let Some(subschemas) = schema + .subschemas + .as_ref() + .and_then(|s| s.all_of.as_ref().or(s.one_of.as_ref())) + { + ensure!(subschemas.len() == 1, "multiple subschemas in allOf"); + // just checked that there is exactly one subschema + let subschema = subschemas.first().unwrap(); + + // TODO: ugly clone + Ok(replace_custom_type(&schema_object_type( + &subschema.clone().into_object(), + )?)) + } else { + bail!("no type found for schema: {:?}", schema); + } +} + +fn is_null(schema: &SchemaObject) -> bool { + schema + .instance_type + .as_ref() + .map(|s| { + if let SingleOrVec::Single(s) = s { + InstanceType::Null == **s + } else { + false + } + }) + .unwrap_or_default() +} + +fn documentation(schema: &SchemaObject, indented: bool) -> Option { + if let Some(description) = schema + .metadata + .as_ref() + .and_then(|m| m.description.as_ref()) + { + // all new lines must be prefixed with `// ` + let replacement = if indented { "\n // " } else { "\n// " }; + let docs = description.replace("\n", replacement); + // and the first line too + if indented { + Some(format!(" // {}\n", docs)) + } else { + Some(format!("// {}\n", docs)) + } + } else { + None + } +} + +/// Maps special types to their Go equivalents. +/// If the given type is not a special type, returns `None`. +fn custom_type_of(ty: &str) -> Option<&str> { + match ty { + "Uint128" => Some("string"), + "Binary" => Some("[]byte"), + _ => None, + } +} + +fn replace_custom_type(ty: &str) -> String { + custom_type_of(ty) + .map(|ty| ty.to_string()) + .unwrap_or_else(|| ty.to_string()) +} + +#[cfg(test)] +mod tests { + use cosmwasm_schema::cw_serde; + use cosmwasm_std::{Binary, Uint128}; + + use super::*; + + #[cw_serde] + struct SpecialTypes { + binary: Binary, + nested_binary: Vec>, + uint128: Uint128, + } + + fn assert_code_eq(actual: String, expected: &str) { + assert!( + actual.split_whitespace().eq(expected.split_whitespace()), + "expected code to be equal" + ); + } + + #[test] + fn special_types() { + let schema = schemars::schema_for!(SpecialTypes); + let code = generate_go(schema).unwrap(); + println!("{}", code); + + assert_code_eq( + code, + r#" + type SpecialTypes struct { + Binary []byte `json:"binary"` + NestedBinary []*[]byte `json:"nested_binary"` + Uint128 string `json:"uint128"` + }"#, + ); + } + + // TODO: write tests + + #[test] + fn responses_work() { + generate_go(cosmwasm_schema::schema_for!(cosmwasm_std::SupplyResponse)).unwrap(); + generate_go(cosmwasm_schema::schema_for!(cosmwasm_std::BalanceResponse)).unwrap(); + generate_go(cosmwasm_schema::schema_for!( + cosmwasm_std::AllBalanceResponse + )) + .unwrap(); + generate_go(cosmwasm_schema::schema_for!( + cosmwasm_std::DenomMetadataResponse + )) + .unwrap(); + generate_go(cosmwasm_schema::schema_for!( + cosmwasm_std::AllDenomMetadataResponse + )) + .unwrap(); + generate_go(cosmwasm_schema::schema_for!( + cosmwasm_std::ValidatorResponse + )) + .unwrap(); + generate_go(cosmwasm_schema::schema_for!( + cosmwasm_std::AllValidatorsResponse + )) + .unwrap(); + } +} From 7b467020efb20383e84cc13a7272e12d20b3506b Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 2 Aug 2023 13:00:17 +0200 Subject: [PATCH 0578/2372] Improve go generator --- Cargo.lock | 40 +++--- packages/go-gen/src/main.rs | 255 +++++++++++++++++++++++++++--------- 2 files changed, 213 insertions(+), 82 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fc60a0ea67..38c6767c68 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -786,7 +786,7 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.28", ] [[package]] @@ -797,7 +797,7 @@ checksum = "29a358ff9f12ec09c3e61fef9b5a9902623a695a46a917b07f269bff1445611a" dependencies = [ "darling_core", "quote", - "syn 2.0.16", + "syn 2.0.28", ] [[package]] @@ -995,7 +995,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.28", ] [[package]] @@ -1594,9 +1594,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.57" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4ec6d5fe0b140acb27c9a0444118cf55bfbb4e0b259739429abb4521dd67c16" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] @@ -1623,9 +1623,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.27" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] @@ -1901,9 +1901,9 @@ checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" [[package]] name = "serde" -version = "1.0.163" +version = "1.0.180" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" +checksum = "0ea67f183f058fe88a4e3ec6e2788e003840893b91bac4559cabedd00863b3ed" dependencies = [ "serde_derive", ] @@ -1930,13 +1930,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.163" +version = "1.0.180" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" +checksum = "24e744d7782b686ab3b73267ef05697159cc0e5abbed3f47f9933165e5219036" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.28", ] [[package]] @@ -1952,9 +1952,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.96" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" dependencies = [ "itoa", "ryu", @@ -2054,9 +2054,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.16" +version = "2.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6f671d4b5ffdb8eadec19c0ae67fe2639df8684bd7bc4b83d986b8db549cf01" +checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567" dependencies = [ "proc-macro2", "quote", @@ -2117,7 +2117,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.28", ] [[package]] @@ -2165,7 +2165,7 @@ checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.28", ] [[package]] @@ -2285,7 +2285,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.28", "wasm-bindgen-shared", ] @@ -2330,7 +2330,7 @@ checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.28", "wasm-bindgen-backend", "wasm-bindgen-shared", ] diff --git a/packages/go-gen/src/main.rs b/packages/go-gen/src/main.rs index 4a46a42b14..db4ef9b143 100644 --- a/packages/go-gen/src/main.rs +++ b/packages/go-gen/src/main.rs @@ -3,8 +3,11 @@ use inflector::cases::pascalcase::to_pascal_case; use schemars::schema::{InstanceType, RootSchema, SchemaObject, SingleOrVec}; fn main() -> Result<()> { - let root = cosmwasm_schema::schema_for!(cosmwasm_std::SupplyResponse); - println!("{:#?}", root); + let root = cosmwasm_schema::schema_for!(cosmwasm_std::AllDelegationsResponse); + // println!( + // "{}", + // String::from_utf8(cosmwasm_std::to_vec(&root)?).unwrap() + // ); let code = generate_go(root)?; println!("{}", code); @@ -13,7 +16,7 @@ fn main() -> Result<()> { } fn generate_go(root: RootSchema) -> Result { - let title = schema_object_type(&root.schema).context("failed to get type name")?; + let (title, _) = schema_object_type(&root.schema).context("failed to get type name")?; let mut code = generate_type(&title, root.schema).with_context(|| format!("error generating {title}"))?; let additional_types: String = root @@ -21,12 +24,14 @@ fn generate_go(root: RootSchema) -> Result { .into_iter() .map(|(name, def)| generate_type(&name, def.into_object())) .collect::>>() - .context("failed generating additional definitions")? // TODO: better error message + .context("failed generating additional definitions")? .join("\n"); code.push('\n'); code.push_str(&additional_types); + println!("{}", code); + Ok(code) } @@ -60,7 +65,9 @@ fn generate_struct(name: &str, strct: SchemaObject) -> Result { out.push_str(" struct {\n"); // go through all fields - let o = strct.object.context("expected object")?; + let o = strct + .object + .with_context(|| format!("failed to generate struct '{name}': expected object"))?; let fields = o .properties .into_iter() @@ -72,16 +79,22 @@ fn generate_struct(name: &str, strct: SchemaObject) -> Result { } // {field} {type} `json:"{field}"` + let (ty, nullable) = schema_object_type(&ty) + .with_context(|| format!("failed to get type of field '{field}' of struct '{name}'"))?; out.push_str(" "); out.push_str(&to_pascal_case(&field)); out.push(' '); - out.push_str( - &schema_object_type(&ty) - .with_context(|| format!("failed to get type of field {field}"))?, - ); + if nullable && !is_basic_go_type(&ty) { + // if the type is nullable and not a basic type, use a pointer + out.push('*'); + } + out.push_str(&ty); out.push(' '); out.push_str("`json:\""); out.push_str(&field); + if nullable { + out.push_str(",omitempty"); + } out.push_str("\"`\n"); } out.push('}'); @@ -122,44 +135,61 @@ fn enum_variants(schema: SchemaObject) -> Option> { ) } -/// Returns the Go type for the given schema object. -fn schema_object_type(schema: &SchemaObject) -> Result { +/// Returns the Go type for the given schema object and whether it is nullable. +fn schema_object_type(schema: &SchemaObject) -> Result<(String, bool)> { + let mut is_nullable = is_null(schema); // if it has a title, use that - if let Some(title) = schema.metadata.as_ref().and_then(|m| m.title.as_ref()) { - Ok(replace_custom_type(title)) + let ty = if let Some(title) = schema.metadata.as_ref().and_then(|m| m.title.as_ref()) { + replace_custom_type(title) } else if let Some(reference) = &schema.reference { // if it has a reference, strip the path and use that - Ok(replace_custom_type( + replace_custom_type( reference .split('/') .last() .expect("split should always return at least one item"), - )) - } else if let Some(SingleOrVec::Single(t)) = &schema.instance_type { + ) + } else if let Some(t) = &schema.instance_type { // if it has an instance type, use that - let ty = match &**t { - InstanceType::String => "string".to_string(), - InstanceType::Number => "float64".to_string(), - InstanceType::Integer => "int64".to_string(), - InstanceType::Boolean => "bool".to_string(), - InstanceType::Object => bail!("object type not supported: {:?}", schema), - InstanceType::Array => { - // get type of items - let item_type = match schema.array.as_ref().and_then(|a| a.items.as_ref()) { + if t.contains(&InstanceType::String) { + "string".to_string() + } else if t.contains(&InstanceType::Number) { + "float64".to_string() + } else if t.contains(&InstanceType::Integer) { + const AVAILABLE_INTS: &[&str] = &[ + "uint8", "int8", "uint16", "int16", "uint32", "int32", "uint64", "int64", + ]; + let format = schema.format.as_deref().unwrap_or("int64"); + if AVAILABLE_INTS.contains(&format) { + format.to_string() + } else { + bail!("unsupported integer format: {}", format); + } + } else if t.contains(&InstanceType::Boolean) { + "bool".to_string() + } else if t.contains(&InstanceType::Object) { + bail!("object type not supported: {:?}", schema); + } else if t.contains(&InstanceType::Array) { + // get type of items + let (item_type, item_nullable) = + match schema.array.as_ref().and_then(|a| a.items.as_ref()) { Some(SingleOrVec::Single(array_validation)) => { - schema_object_type(&array_validation.clone().into_object())? + schema_object_type(&array_validation.clone().into_object()) + .context("failed to get type of array item")? } _ => bail!("array type with non-singular item type not supported"), }; - // map custom types - let item_type = custom_type_of(&item_type).unwrap_or(&item_type); + // map custom types + let item_type = custom_type_of(&item_type).unwrap_or(&item_type); - format!("[]{}", item_type) + if item_nullable { + replace_custom_type(&format!("[]*{}", item_type)) + } else { + replace_custom_type(&format!("[]{}", item_type)) } - InstanceType::Null => bail!("null type not supported"), - }; - - Ok(ty) + } else { + unreachable!("instance type should be one of the above") + } } else if let Some(subschemas) = schema.subschemas.as_ref().and_then(|s| s.any_of.as_ref()) { // if one of them is null, use pointer type // TODO: ugly clone @@ -167,10 +197,11 @@ fn schema_object_type(schema: &SchemaObject) -> Result { .iter() .position(|s| is_null(&s.clone().into_object())) { + is_nullable = true; ensure!(subschemas.len() == 2, "multiple subschemas in anyOf"); // extract non-null type let non_null_index = (null_index + 1) % 2; - let non_null_type = schema_object_type( + let (non_null_type, _) = schema_object_type( &subschemas .get(non_null_index) .expect("index should be valid") @@ -179,7 +210,7 @@ fn schema_object_type(schema: &SchemaObject) -> Result { )?; // map custom types let non_null_type = custom_type_of(&non_null_type).unwrap_or(&non_null_type); - Ok(format!("*{non_null_type}")) + non_null_type.to_string() } else if subschemas.len() == 1 { todo!("handle like allOf") } else { @@ -195,25 +226,20 @@ fn schema_object_type(schema: &SchemaObject) -> Result { let subschema = subschemas.first().unwrap(); // TODO: ugly clone - Ok(replace_custom_type(&schema_object_type( - &subschema.clone().into_object(), - )?)) + let (ty, _) = schema_object_type(&subschema.clone().into_object())?; + replace_custom_type(&ty) } else { bail!("no type found for schema: {:?}", schema); - } + }; + + Ok((ty, is_nullable)) } fn is_null(schema: &SchemaObject) -> bool { schema .instance_type .as_ref() - .map(|s| { - if let SingleOrVec::Single(s) = s { - InstanceType::Null == **s - } else { - false - } - }) + .map(|s| s.contains(&InstanceType::Null)) .unwrap_or_default() } @@ -225,7 +251,7 @@ fn documentation(schema: &SchemaObject, indented: bool) -> Option { { // all new lines must be prefixed with `// ` let replacement = if indented { "\n // " } else { "\n// " }; - let docs = description.replace("\n", replacement); + let docs = description.replace('\n', replacement); // and the first line too if indented { Some(format!(" // {}\n", docs)) @@ -237,12 +263,40 @@ fn documentation(schema: &SchemaObject, indented: bool) -> Option { } } +fn is_basic_go_type(ty: &str) -> bool { + const BASIC_GO_TYPES: &[&str] = &[ + "string", + "bool", + "int", + "int8", + "int16", + "int32", + "int64", + "uint", + "uint8", + "uint16", + "uint32", + "uint64", + "float32", + "float64", + "byte", + "rune", + "uintptr", + "complex64", + "complex128", + ]; + BASIC_GO_TYPES.contains(&ty) +} + /// Maps special types to their Go equivalents. /// If the given type is not a special type, returns `None`. fn custom_type_of(ty: &str) -> Option<&str> { match ty { "Uint128" => Some("string"), "Binary" => Some("[]byte"), + "HexBinary" => Some("Checksum"), + "Addr" => Some("string"), + "Decimal" => Some("string"), _ => None, } } @@ -256,45 +310,98 @@ fn replace_custom_type(ty: &str) -> String { #[cfg(test)] mod tests { use cosmwasm_schema::cw_serde; - use cosmwasm_std::{Binary, Uint128}; + use cosmwasm_std::{Binary, HexBinary, Uint128}; use super::*; - #[cw_serde] - struct SpecialTypes { - binary: Binary, - nested_binary: Vec>, - uint128: Uint128, - } - fn assert_code_eq(actual: String, expected: &str) { - assert!( - actual.split_whitespace().eq(expected.split_whitespace()), - "expected code to be equal" - ); + let actual: Vec<_> = actual.split_whitespace().collect(); + let expected: Vec<_> = expected.split_whitespace().collect(); + assert_eq!(actual, expected, "expected code to be equal"); } #[test] fn special_types() { + #[cw_serde] + struct SpecialTypes { + binary: Binary, + nested_binary: Vec>, + hex_binary: HexBinary, + uint128: Uint128, + } + let schema = schemars::schema_for!(SpecialTypes); let code = generate_go(schema).unwrap(); - println!("{}", code); assert_code_eq( code, r#" type SpecialTypes struct { Binary []byte `json:"binary"` + HexBinary Checksum `json:"hex_binary"` NestedBinary []*[]byte `json:"nested_binary"` Uint128 string `json:"uint128"` }"#, ); } - // TODO: write tests + #[test] + fn integers() { + #[cw_serde] + struct Integers { + a: u64, + b: i64, + c: u32, + d: i32, + e: u8, + f: i8, + g: u16, + h: i16, + } + + let schema = schemars::schema_for!(Integers); + let code = generate_go(schema).unwrap(); + + assert_code_eq( + code, + r#" + type Integers struct { + A uint64 `json:"a"` + B int64 `json:"b"` + C uint32 `json:"c"` + D int32 `json:"d"` + E uint8 `json:"e"` + F int8 `json:"f"` + G uint16 `json:"g"` + H int16 `json:"h"` + }"#, + ); + + #[cw_serde] + struct U128 { + a: u128, + } + #[cw_serde] + struct I128 { + a: i128, + } + let schema = schemars::schema_for!(U128); + assert!(generate_go(schema) + .unwrap_err() + .root_cause() + .to_string() + .contains("unsupported integer format: uint128")); + let schema = schemars::schema_for!(I128); + assert!(generate_go(schema) + .unwrap_err() + .root_cause() + .to_string() + .contains("unsupported integer format: int128")); + } #[test] fn responses_work() { + // bank generate_go(cosmwasm_schema::schema_for!(cosmwasm_std::SupplyResponse)).unwrap(); generate_go(cosmwasm_schema::schema_for!(cosmwasm_std::BalanceResponse)).unwrap(); generate_go(cosmwasm_schema::schema_for!( @@ -309,13 +416,37 @@ mod tests { cosmwasm_std::AllDenomMetadataResponse )) .unwrap(); + // staking generate_go(cosmwasm_schema::schema_for!( - cosmwasm_std::ValidatorResponse + cosmwasm_std::BondedDenomResponse + )) + .unwrap(); + generate_go(cosmwasm_schema::schema_for!( + cosmwasm_std::AllDelegationsResponse + )) + .unwrap(); + generate_go(cosmwasm_schema::schema_for!( + cosmwasm_std::DelegationResponse )) .unwrap(); generate_go(cosmwasm_schema::schema_for!( cosmwasm_std::AllValidatorsResponse )) .unwrap(); + generate_go(cosmwasm_schema::schema_for!( + cosmwasm_std::ValidatorResponse + )) + .unwrap(); + // distribution + generate_go(cosmwasm_schema::schema_for!( + cosmwasm_std::DelegatorWithdrawAddressResponse + )) + .unwrap(); + // wasm + generate_go(cosmwasm_schema::schema_for!( + cosmwasm_std::ContractInfoResponse + )) + .unwrap(); + generate_go(cosmwasm_schema::schema_for!(cosmwasm_std::CodeInfoResponse)).unwrap(); } } From 2c84cee03d6ba2400d06c95146ce41942b42c0c5 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 2 Aug 2023 14:18:31 +0200 Subject: [PATCH 0579/2372] Refactor codegen into own module --- Cargo.lock | 7 + packages/go-gen/Cargo.toml | 1 + packages/go-gen/src/go.rs | 248 ++++++++++++++++++++++++++++++++++++ packages/go-gen/src/main.rs | 144 +++++++-------------- 4 files changed, 301 insertions(+), 99 deletions(-) create mode 100644 packages/go-gen/src/go.rs diff --git a/Cargo.lock b/Cargo.lock index 38c6767c68..a82590b178 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1141,6 +1141,7 @@ dependencies = [ "anyhow", "cosmwasm-schema", "cosmwasm-std", + "indenter", "schemars", ] @@ -1231,6 +1232,12 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + [[package]] name = "indexmap" version = "1.9.3" diff --git a/packages/go-gen/Cargo.toml b/packages/go-gen/Cargo.toml index 8f687225e6..0ccefc1d1f 100644 --- a/packages/go-gen/Cargo.toml +++ b/packages/go-gen/Cargo.toml @@ -11,3 +11,4 @@ cosmwasm-std = { path = "../std", version = "1.3.1" } cosmwasm-schema = { path = "../schema", version = "1.3.1" } anyhow = "1" Inflector = "0.11.4" +indenter = "0.3.3" diff --git a/packages/go-gen/src/go.rs b/packages/go-gen/src/go.rs new file mode 100644 index 0000000000..84b4dd2d0a --- /dev/null +++ b/packages/go-gen/src/go.rs @@ -0,0 +1,248 @@ +use std::fmt::{self, Display, Write}; + +use indenter::indented; +use inflector::cases::pascalcase::to_pascal_case; + +pub struct GoTypeDef { + pub name: String, + pub docs: Option, + pub ty: GoTypeDefType, +} + +pub enum GoTypeDefType { + Struct { fields: Vec }, + // TODO: implement enums + // Enum { + // name: String, + // variants: Vec, + // }, +} + +impl Display for GoTypeDef { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + // generate documentation + format_docs(f, self.docs.as_deref())?; + writeln!(f, "type {} struct {{", self.name)?; + match &self.ty { + GoTypeDefType::Struct { fields } => { + let mut f = indented(f); + for field in fields { + writeln!(f, "{}", field)?; + } + } + } + f.write_char('}')?; + Ok(()) + } +} + +fn format_docs(f: &mut fmt::Formatter, docs: Option<&str>) -> fmt::Result { + if let Some(docs) = docs { + for line in docs.lines() { + f.write_str("// ")?; + f.write_str(line)?; + f.write_char('\n')?; + } + } + Ok(()) +} + +pub struct GoField { + /// The name of the field in Rust (snake_case) + pub rust_name: String, + /// The documentation of the field + pub docs: Option, + /// The type of the field + pub ty: GoType, +} + +impl Display for GoField { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + // documentation + format_docs(f, self.docs.as_deref())?; + // {field} {type} `json:"{field}"` + write!( + f, + "{} {} `json:\"{}", + to_pascal_case(&self.rust_name), + self.ty, + self.rust_name + )?; + if self.ty.is_nullable { + f.write_str(",omitempty")?; + } + f.write_str("\"`") + } +} + +pub struct GoType { + /// The name of the type in Go + pub name: String, + /// Whether the type should be nullable + /// This will add `omitempty` to the json tag and use a pointer type if + /// the type is not a basic type + pub is_nullable: bool, +} + +impl GoType { + pub fn is_basic_type(&self) -> bool { + const BASIC_GO_TYPES: &[&str] = &[ + "string", + "bool", + "int", + "int8", + "int16", + "int32", + "int64", + "uint", + "uint8", + "uint16", + "uint32", + "uint64", + "float32", + "float64", + "byte", + "rune", + "uintptr", + "complex64", + "complex128", + ]; + BASIC_GO_TYPES.contains(&&*self.name) + } +} + +impl Display for GoType { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + if self.is_nullable && !self.is_basic_type() { + // if the type is nullable and not a basic type, use a pointer + f.write_char('*')?; + } + f.write_str(&self.name) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn go_type_display_works() { + let ty = GoType { + name: "string".to_string(), + is_nullable: true, + }; + let ty2 = GoType { + name: "string".to_string(), + is_nullable: false, + }; + assert_eq!(format!("{}", ty), "string"); + assert_eq!(format!("{}", ty2), "string"); + + let ty = GoType { + name: "FooBar".to_string(), + is_nullable: true, + }; + assert_eq!(format!("{}", ty), "*FooBar"); + let ty = GoType { + name: "FooBar".to_string(), + is_nullable: false, + }; + assert_eq!(format!("{}", ty), "FooBar"); + } + + #[test] + fn go_field_display_works() { + let field = GoField { + rust_name: "foo_bar".to_string(), + docs: None, + ty: GoType { + name: "string".to_string(), + is_nullable: true, + }, + }; + assert_eq!( + format!("{}", field), + "FooBar string `json:\"foo_bar,omitempty\"`" + ); + + let field = GoField { + rust_name: "foo_bar".to_string(), + docs: None, + ty: GoType { + name: "string".to_string(), + is_nullable: false, + }, + }; + assert_eq!(format!("{}", field), "FooBar string `json:\"foo_bar\"`"); + + let field = GoField { + rust_name: "foo_bar".to_string(), + docs: None, + ty: GoType { + name: "FooBar".to_string(), + is_nullable: true, + }, + }; + assert_eq!( + format!("{}", field), + "FooBar *FooBar `json:\"foo_bar,omitempty\"`" + ); + } + + #[test] + fn go_field_docs_display_works() { + let field = GoField { + rust_name: "foo_bar".to_string(), + docs: Some("foo_bar is a test field".to_string()), + ty: GoType { + name: "string".to_string(), + is_nullable: true, + }, + }; + assert_eq!( + format!("{}", field), + "// foo_bar is a test field\nFooBar string `json:\"foo_bar,omitempty\"`" + ); + } + + #[test] + fn go_type_def_display_works() { + let ty = GoTypeDef { + name: "FooBar".to_string(), + docs: None, + ty: GoTypeDefType::Struct { + fields: vec![GoField { + rust_name: "foo_bar".to_string(), + docs: None, + ty: GoType { + name: "string".to_string(), + is_nullable: true, + }, + }], + }, + }; + assert_eq!( + format!("{}", ty), + "type FooBar struct {\n FooBar string `json:\"foo_bar,omitempty\"`\n}" + ); + + let ty = GoTypeDef { + name: "FooBar".to_string(), + docs: Some("FooBar is a test struct".to_string()), + ty: GoTypeDefType::Struct { + fields: vec![GoField { + rust_name: "foo_bar".to_string(), + docs: None, + ty: GoType { + name: "string".to_string(), + is_nullable: true, + }, + }], + }, + }; + assert_eq!( + format!("{}", ty), + "// FooBar is a test struct\ntype FooBar struct {\n FooBar string `json:\"foo_bar,omitempty\"`\n}" + ); + } +} diff --git a/packages/go-gen/src/main.rs b/packages/go-gen/src/main.rs index db4ef9b143..91bddf5dcb 100644 --- a/packages/go-gen/src/main.rs +++ b/packages/go-gen/src/main.rs @@ -1,6 +1,10 @@ use anyhow::{bail, ensure, Context, Result}; +use go::{GoField, GoType, GoTypeDef, GoTypeDefType}; use inflector::cases::pascalcase::to_pascal_case; use schemars::schema::{InstanceType, RootSchema, SchemaObject, SingleOrVec}; +use std::fmt::Write; + +mod go; fn main() -> Result<()> { let root = cosmwasm_schema::schema_for!(cosmwasm_std::AllDelegationsResponse); @@ -17,92 +21,71 @@ fn main() -> Result<()> { fn generate_go(root: RootSchema) -> Result { let (title, _) = schema_object_type(&root.schema).context("failed to get type name")?; - let mut code = - generate_type(&title, root.schema).with_context(|| format!("error generating {title}"))?; - let additional_types: String = root + let main_type = generate_type(&title, root.schema) + .with_context(|| format!("failed to generate {title}"))? + .with_context(|| format!("failed to generate {title}, because it is a custom type"))?; + + let additional_types = root .definitions .into_iter() - .map(|(name, def)| generate_type(&name, def.into_object())) + .filter_map(|(name, def)| generate_type(&name, def.into_object()).transpose()) .collect::>>() - .context("failed generating additional definitions")? - .join("\n"); - - code.push('\n'); - code.push_str(&additional_types); + .context("failed to generate additional definitions")?; - println!("{}", code); + let mut code = format!("{main_type}\n"); + for additional_type in additional_types { + writeln!(&mut code, "{additional_type}")?; + } Ok(code) } -fn generate_type(name: &str, schema: SchemaObject) -> Result { +fn generate_type(name: &str, schema: SchemaObject) -> Result> { if custom_type_of(name).is_some() { // ignore custom types - // TODO: ugly - return Ok("".to_string()); + return Ok(None); } // first detect if we have a struct or enum if is_object(&schema) { - generate_struct(name, schema) + generate_struct(name, schema).map(Some) } else if let Some(variants) = enum_variants(schema) { - generate_enum(name, variants) + generate_enum(name, variants).map(Some) } else { // ignore other types - Ok("".to_string()) + Ok(None) } } -fn generate_struct(name: &str, strct: SchemaObject) -> Result { - // generate documentation - let mut out = String::new(); - if let Some(doc) = documentation(&strct, false) { - out.push_str(&doc); - } - - // type {name} struct { - out.push_str("type "); - out.push_str(name); - out.push_str(" struct {\n"); +fn generate_struct(name: &str, strct: SchemaObject) -> Result { + let docs = documentation(&strct); // go through all fields let o = strct .object .with_context(|| format!("failed to generate struct '{name}': expected object"))?; - let fields = o - .properties - .into_iter() - .map(|(field, ty)| (field, ty.into_object())); - - for (field, ty) in fields { - if let Some(doc) = documentation(&ty, true) { - out.push_str(&doc); - } - - // {field} {type} `json:"{field}"` - let (ty, nullable) = schema_object_type(&ty) + let fields = o.properties.into_iter().map(|(field, ty)| { + let ty = ty.into_object(); + let (go_type, is_nullable) = schema_object_type(&ty) .with_context(|| format!("failed to get type of field '{field}' of struct '{name}'"))?; - out.push_str(" "); - out.push_str(&to_pascal_case(&field)); - out.push(' '); - if nullable && !is_basic_go_type(&ty) { - // if the type is nullable and not a basic type, use a pointer - out.push('*'); - } - out.push_str(&ty); - out.push(' '); - out.push_str("`json:\""); - out.push_str(&field); - if nullable { - out.push_str(",omitempty"); - } - out.push_str("\"`\n"); - } - out.push('}'); - - Ok(out) + Ok(GoField { + rust_name: field, + docs: documentation(&ty), + ty: GoType { + name: go_type, + is_nullable, + }, + }) + }); + let fields = fields.collect::>>()?; + + Ok(GoTypeDef { + name: to_pascal_case(name), + docs, + ty: GoTypeDefType::Struct { fields }, + }) } -fn generate_enum(name: &str, variants: Vec) -> Result { +fn generate_enum(name: &str, variants: Vec) -> Result { todo!("generate_enum") } @@ -243,49 +226,12 @@ fn is_null(schema: &SchemaObject) -> bool { .unwrap_or_default() } -fn documentation(schema: &SchemaObject, indented: bool) -> Option { - if let Some(description) = schema +fn documentation(schema: &SchemaObject) -> Option { + schema .metadata .as_ref() .and_then(|m| m.description.as_ref()) - { - // all new lines must be prefixed with `// ` - let replacement = if indented { "\n // " } else { "\n// " }; - let docs = description.replace('\n', replacement); - // and the first line too - if indented { - Some(format!(" // {}\n", docs)) - } else { - Some(format!("// {}\n", docs)) - } - } else { - None - } -} - -fn is_basic_go_type(ty: &str) -> bool { - const BASIC_GO_TYPES: &[&str] = &[ - "string", - "bool", - "int", - "int8", - "int16", - "int32", - "int64", - "uint", - "uint8", - "uint16", - "uint32", - "uint64", - "float32", - "float64", - "byte", - "rune", - "uintptr", - "complex64", - "complex128", - ]; - BASIC_GO_TYPES.contains(&ty) + .cloned() } /// Maps special types to their Go equivalents. From 8d4f1569f9975f00fdf88eaffef0921ae059ba48 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 2 Aug 2023 17:13:56 +0200 Subject: [PATCH 0580/2372] Use indenter to format go code --- packages/go-gen/Cargo.toml | 2 +- packages/go-gen/src/main.rs | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/go-gen/Cargo.toml b/packages/go-gen/Cargo.toml index 0ccefc1d1f..7ebaaf9b4a 100644 --- a/packages/go-gen/Cargo.toml +++ b/packages/go-gen/Cargo.toml @@ -11,4 +11,4 @@ cosmwasm-std = { path = "../std", version = "1.3.1" } cosmwasm-schema = { path = "../schema", version = "1.3.1" } anyhow = "1" Inflector = "0.11.4" -indenter = "0.3.3" +indenter = { version = "0.3.3", features = ["std"] } diff --git a/packages/go-gen/src/main.rs b/packages/go-gen/src/main.rs index 91bddf5dcb..eefc643aaa 100644 --- a/packages/go-gen/src/main.rs +++ b/packages/go-gen/src/main.rs @@ -257,13 +257,20 @@ fn replace_custom_type(ty: &str) -> String { mod tests { use cosmwasm_schema::cw_serde; use cosmwasm_std::{Binary, HexBinary, Uint128}; + use indenter::CodeFormatter; use super::*; fn assert_code_eq(actual: String, expected: &str) { - let actual: Vec<_> = actual.split_whitespace().collect(); - let expected: Vec<_> = expected.split_whitespace().collect(); - assert_eq!(actual, expected, "expected code to be equal"); + let mut actual_fmt = String::new(); + let mut fmt = CodeFormatter::new(&mut actual_fmt, " "); + fmt.write_str(&actual).unwrap(); + + let mut expected_fmt = String::new(); + let mut fmt = CodeFormatter::new(&mut expected_fmt, " "); + fmt.write_str(expected).unwrap(); + + assert_eq!(actual_fmt, expected_fmt, "expected code to be equal"); } #[test] From 6a5f3f282ad0db0f767b158b94b3ed4aba79ad05 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 3 Aug 2023 11:28:57 +0200 Subject: [PATCH 0581/2372] Cleanup --- packages/go-gen/src/main.rs | 239 ++++++++-------------------------- packages/go-gen/src/schema.rs | 194 +++++++++++++++++++++++++++ 2 files changed, 245 insertions(+), 188 deletions(-) create mode 100644 packages/go-gen/src/schema.rs diff --git a/packages/go-gen/src/main.rs b/packages/go-gen/src/main.rs index eefc643aaa..ce632382ad 100644 --- a/packages/go-gen/src/main.rs +++ b/packages/go-gen/src/main.rs @@ -1,10 +1,12 @@ -use anyhow::{bail, ensure, Context, Result}; -use go::{GoField, GoType, GoTypeDef, GoTypeDefType}; +use anyhow::{Context, Result}; +use go::*; use inflector::cases::pascalcase::to_pascal_case; -use schemars::schema::{InstanceType, RootSchema, SchemaObject, SingleOrVec}; +use schema::{documentation, schema_object_type, SchemaExt}; +use schemars::schema::{ObjectValidation, RootSchema, Schema, SchemaObject}; use std::fmt::Write; mod go; +mod schema; fn main() -> Result<()> { let root = cosmwasm_schema::schema_for!(cosmwasm_std::AllDelegationsResponse); @@ -20,15 +22,20 @@ fn main() -> Result<()> { } fn generate_go(root: RootSchema) -> Result { - let (title, _) = schema_object_type(&root.schema).context("failed to get type name")?; - let main_type = generate_type(&title, root.schema) + let (title, _) = schema::schema_object_type(&root.schema).context("failed to get type name")?; + let main_type = build_type(&title, &root.schema) .with_context(|| format!("failed to generate {title}"))? .with_context(|| format!("failed to generate {title}, because it is a custom type"))?; let additional_types = root .definitions .into_iter() - .filter_map(|(name, def)| generate_type(&name, def.into_object()).transpose()) + .filter_map(|(name, def)| { + def.object() + .map(|def| build_type(&name, def)) + .and_then(|r| r) + .transpose() + }) .collect::>>() .context("failed to generate additional definitions")?; @@ -40,36 +47,46 @@ fn generate_go(root: RootSchema) -> Result { Ok(code) } -fn generate_type(name: &str, schema: SchemaObject) -> Result> { - if custom_type_of(name).is_some() { +fn build_type(name: &str, schema: &SchemaObject) -> Result> { + if schema::custom_type_of(name).is_some() { // ignore custom types return Ok(None); } + // first detect if we have a struct or enum - if is_object(&schema) { - generate_struct(name, schema).map(Some) - } else if let Some(variants) = enum_variants(schema) { - generate_enum(name, variants).map(Some) + if let Some(obj) = schema.object.as_ref() { + build_struct(name, schema, obj) + .map(Some) + .with_context(|| format!("failed to generate struct '{name}")) + } else if let Some(variants) = schema::enum_variants(schema) { + build_enum(name, variants) + .map(Some) + .with_context(|| format!("failed to generate enum '{name}")) } else { // ignore other types Ok(None) } } -fn generate_struct(name: &str, strct: SchemaObject) -> Result { - let docs = documentation(&strct); +pub(crate) fn build_struct( + name: &str, + strct: &SchemaObject, + obj: &ObjectValidation, +) -> Result { + let docs = documentation(strct); // go through all fields - let o = strct - .object - .with_context(|| format!("failed to generate struct '{name}': expected object"))?; - let fields = o.properties.into_iter().map(|(field, ty)| { - let ty = ty.into_object(); - let (go_type, is_nullable) = schema_object_type(&ty) - .with_context(|| format!("failed to get type of field '{field}' of struct '{name}'"))?; + let fields = obj.properties.iter().map(|(field, ty)| { + // get schema object + let ty = ty + .object() + .with_context(|| format!("expected schema object for field {field}"))?; + // extract type from schema object + let (go_type, is_nullable) = schema_object_type(ty) + .with_context(|| format!("failed to get type of field '{field}'"))?; Ok(GoField { - rust_name: field, - docs: documentation(&ty), + rust_name: field.clone(), + docs: documentation(ty), ty: GoType { name: go_type, is_nullable, @@ -85,174 +102,10 @@ fn generate_struct(name: &str, strct: SchemaObject) -> Result { }) } -fn generate_enum(name: &str, variants: Vec) -> Result { +pub(crate) fn build_enum(_name: &str, _variants: Vec<&Schema>) -> Result { todo!("generate_enum") } -/// Returns `true` if the given schema is an object and `false` if it is not. -fn is_object(schema: &SchemaObject) -> bool { - schema.object.is_some() - // schema - // .instance_type - // .as_ref() - // .map(|s| { - // if let SingleOrVec::Single(s) = s { - // &InstanceType::Object == s.as_ref() - // } else { - // false - // } - // }) - // .unwrap_or_default() -} - -/// Returns the schemas of the variants of this enum, if it is an enum. -/// Returns `None` if the schema is not an enum. -fn enum_variants(schema: SchemaObject) -> Option> { - Some( - schema - .subschemas? - .one_of? - .into_iter() - .map(|s| s.into_object()) - .collect(), - ) -} - -/// Returns the Go type for the given schema object and whether it is nullable. -fn schema_object_type(schema: &SchemaObject) -> Result<(String, bool)> { - let mut is_nullable = is_null(schema); - // if it has a title, use that - let ty = if let Some(title) = schema.metadata.as_ref().and_then(|m| m.title.as_ref()) { - replace_custom_type(title) - } else if let Some(reference) = &schema.reference { - // if it has a reference, strip the path and use that - replace_custom_type( - reference - .split('/') - .last() - .expect("split should always return at least one item"), - ) - } else if let Some(t) = &schema.instance_type { - // if it has an instance type, use that - if t.contains(&InstanceType::String) { - "string".to_string() - } else if t.contains(&InstanceType::Number) { - "float64".to_string() - } else if t.contains(&InstanceType::Integer) { - const AVAILABLE_INTS: &[&str] = &[ - "uint8", "int8", "uint16", "int16", "uint32", "int32", "uint64", "int64", - ]; - let format = schema.format.as_deref().unwrap_or("int64"); - if AVAILABLE_INTS.contains(&format) { - format.to_string() - } else { - bail!("unsupported integer format: {}", format); - } - } else if t.contains(&InstanceType::Boolean) { - "bool".to_string() - } else if t.contains(&InstanceType::Object) { - bail!("object type not supported: {:?}", schema); - } else if t.contains(&InstanceType::Array) { - // get type of items - let (item_type, item_nullable) = - match schema.array.as_ref().and_then(|a| a.items.as_ref()) { - Some(SingleOrVec::Single(array_validation)) => { - schema_object_type(&array_validation.clone().into_object()) - .context("failed to get type of array item")? - } - _ => bail!("array type with non-singular item type not supported"), - }; - // map custom types - let item_type = custom_type_of(&item_type).unwrap_or(&item_type); - - if item_nullable { - replace_custom_type(&format!("[]*{}", item_type)) - } else { - replace_custom_type(&format!("[]{}", item_type)) - } - } else { - unreachable!("instance type should be one of the above") - } - } else if let Some(subschemas) = schema.subschemas.as_ref().and_then(|s| s.any_of.as_ref()) { - // if one of them is null, use pointer type - // TODO: ugly clone - if let Some(null_index) = subschemas - .iter() - .position(|s| is_null(&s.clone().into_object())) - { - is_nullable = true; - ensure!(subschemas.len() == 2, "multiple subschemas in anyOf"); - // extract non-null type - let non_null_index = (null_index + 1) % 2; - let (non_null_type, _) = schema_object_type( - &subschemas - .get(non_null_index) - .expect("index should be valid") - .clone() - .into_object(), - )?; - // map custom types - let non_null_type = custom_type_of(&non_null_type).unwrap_or(&non_null_type); - non_null_type.to_string() - } else if subschemas.len() == 1 { - todo!("handle like allOf") - } else { - bail!("multiple anyOf without null type not supported") - } - } else if let Some(subschemas) = schema - .subschemas - .as_ref() - .and_then(|s| s.all_of.as_ref().or(s.one_of.as_ref())) - { - ensure!(subschemas.len() == 1, "multiple subschemas in allOf"); - // just checked that there is exactly one subschema - let subschema = subschemas.first().unwrap(); - - // TODO: ugly clone - let (ty, _) = schema_object_type(&subschema.clone().into_object())?; - replace_custom_type(&ty) - } else { - bail!("no type found for schema: {:?}", schema); - }; - - Ok((ty, is_nullable)) -} - -fn is_null(schema: &SchemaObject) -> bool { - schema - .instance_type - .as_ref() - .map(|s| s.contains(&InstanceType::Null)) - .unwrap_or_default() -} - -fn documentation(schema: &SchemaObject) -> Option { - schema - .metadata - .as_ref() - .and_then(|m| m.description.as_ref()) - .cloned() -} - -/// Maps special types to their Go equivalents. -/// If the given type is not a special type, returns `None`. -fn custom_type_of(ty: &str) -> Option<&str> { - match ty { - "Uint128" => Some("string"), - "Binary" => Some("[]byte"), - "HexBinary" => Some("Checksum"), - "Addr" => Some("string"), - "Decimal" => Some("string"), - _ => None, - } -} - -fn replace_custom_type(ty: &str) -> String { - custom_type_of(ty) - .map(|ty| ty.to_string()) - .unwrap_or_else(|| ty.to_string()) -} - #[cfg(test)] mod tests { use cosmwasm_schema::cw_serde; @@ -352,6 +205,16 @@ mod tests { .contains("unsupported integer format: int128")); } + #[test] + fn empty() { + #[cw_serde] + struct Empty {} + + let schema = schemars::schema_for!(Empty); + let code = generate_go(schema).unwrap(); + assert_eq!(code, "type Empty struct {\n}\n"); + } + #[test] fn responses_work() { // bank diff --git a/packages/go-gen/src/schema.rs b/packages/go-gen/src/schema.rs new file mode 100644 index 0000000000..5c7435ccbe --- /dev/null +++ b/packages/go-gen/src/schema.rs @@ -0,0 +1,194 @@ +use anyhow::{bail, ensure, Context, Result}; + +use schemars::schema::{InstanceType, Schema, SchemaObject, SingleOrVec}; + +pub trait SchemaExt { + fn object(&self) -> anyhow::Result<&SchemaObject>; +} + +impl SchemaExt for Schema { + fn object(&self) -> anyhow::Result<&SchemaObject> { + match self { + Schema::Object(o) => Ok(o), + _ => bail!("expected schema object"), + } + } +} + +/// Returns the schemas of the variants of this enum, if it is an enum. +/// Returns `None` if the schema is not an enum. +pub(crate) fn enum_variants(schema: &SchemaObject) -> Option> { + Some( + schema + .subschemas + .as_ref()? + .one_of + .as_ref()? + .iter() + .collect(), + ) +} + +/// Returns the Go type for the given schema object and whether it is nullable. +pub(crate) fn schema_object_type(schema: &SchemaObject) -> Result<(String, bool)> { + let mut is_nullable = is_null(schema); + + // if it has a title, use that + let ty = if let Some(title) = schema.metadata.as_ref().and_then(|m| m.title.as_ref()) { + replace_custom_type(title) + } else if let Some(reference) = &schema.reference { + // if it has a reference, strip the path and use that + replace_custom_type( + reference + .split('/') + .last() + .expect("split should always return at least one item"), + ) + } else if let Some(t) = &schema.instance_type { + type_from_instance_type(schema, t)? + } else if let Some(subschemas) = schema.subschemas.as_ref().and_then(|s| s.any_of.as_ref()) { + // check if one of them is null + let nullable = nullable_type(subschemas)?; + if let Some(non_null) = nullable { + ensure!(subschemas.len() == 2, "multiple subschemas in anyOf"); + is_nullable = true; + // extract non-null type + let (non_null_type, _) = schema_object_type(non_null)?; + replace_custom_type(&non_null_type) + } else { + subschema_type(subschemas).context("failed to get type of anyOf subschemas")? + } + } else if let Some(subschemas) = schema + .subschemas + .as_ref() + .and_then(|s| s.all_of.as_ref().or(s.one_of.as_ref())) + { + subschema_type(subschemas).context("failed to get type of allOf subschemas")? + } else { + bail!("no type for schema found: {:?}", schema); + }; + + Ok((ty, is_nullable)) +} + +/// Tries to extract the type of the non-null variant of an anyOf schema. +/// +/// Returns `Ok(None)` if the type is not nullable. +pub(crate) fn nullable_type(subschemas: &[Schema]) -> Result, anyhow::Error> { + let (found_null, nullable_type): (bool, Option<&SchemaObject>) = subschemas + .iter() + .fold(Ok((false, None)), |result: Result<_>, subschema| { + result.and_then(|(nullable, not_null)| { + let subschema = subschema.object()?; + if is_null(subschema) { + Ok((true, not_null)) + } else { + Ok((nullable, Some(subschema))) + } + }) + }) + .context("failed to get anyOf subschemas")?; + + Ok(if found_null { nullable_type } else { None }) +} + +/// Tries to extract a type name from the given instance type. +/// +/// Fails for unsupported instance types or integer formats. +pub(crate) fn type_from_instance_type( + schema: &SchemaObject, + t: &SingleOrVec, +) -> Result { + // if it has an instance type, use that + Ok(if t.contains(&InstanceType::String) { + "string".to_string() + } else if t.contains(&InstanceType::Number) { + "float64".to_string() + } else if t.contains(&InstanceType::Integer) { + const AVAILABLE_INTS: &[&str] = &[ + "uint8", "int8", "uint16", "int16", "uint32", "int32", "uint64", "int64", + ]; + let format = schema.format.as_deref().unwrap_or("int64"); + if AVAILABLE_INTS.contains(&format) { + format.to_string() + } else { + bail!("unsupported integer format: {}", format); + } + } else if t.contains(&InstanceType::Boolean) { + "bool".to_string() + } else if t.contains(&InstanceType::Object) { + bail!("object type not supported: {:?}", schema); + } else if t.contains(&InstanceType::Array) { + // get type of items + let (item_type, item_nullable) = + array_item_type(schema).context("failed to get array item type")?; + // map custom types + let item_type = custom_type_of(&item_type).unwrap_or(&item_type); + + if item_nullable { + replace_custom_type(&format!("[]*{}", item_type)) + } else { + replace_custom_type(&format!("[]{}", item_type)) + } + } else { + unreachable!("instance type should be one of the above") + }) +} + +/// Extract the type of the items of an array. +/// +/// This fails if the given schema object is not an array, +/// has multiple item types or other errors occur during type extraction of +/// the underlying schema. +pub(crate) fn array_item_type(schema: &SchemaObject) -> Result<(String, bool)> { + match schema.array.as_ref().and_then(|a| a.items.as_ref()) { + Some(SingleOrVec::Single(array_validation)) => { + schema_object_type(array_validation.object()?) + } + _ => bail!("array type with non-singular item type not supported"), + } +} + +/// Tries to extract a type name from the given subschemas. +/// +/// This fails if there are multiple subschemas or other errors occur +/// during subschema type extraction. +pub(crate) fn subschema_type(subschemas: &[Schema]) -> Result { + ensure!( + subschemas.len() == 1, + "multiple subschemas are not supported" + ); + let subschema = &subschemas[0]; + let (ty, _) = schema_object_type(subschema.object()?)?; + Ok(replace_custom_type(&ty)) +} + +pub(crate) fn is_null(schema: &SchemaObject) -> bool { + schema + .instance_type + .as_ref() + .map_or(false, |s| s.contains(&InstanceType::Null)) +} + +pub(crate) fn documentation(schema: &SchemaObject) -> Option { + schema.metadata.as_ref()?.description.as_ref().cloned() +} + +/// Maps special types to their Go equivalents. +/// If the given type is not a special type, returns `None`. +pub(crate) fn custom_type_of(ty: &str) -> Option<&str> { + match ty { + "Uint128" => Some("string"), + "Binary" => Some("[]byte"), + "HexBinary" => Some("Checksum"), + "Addr" => Some("string"), + "Decimal" => Some("string"), + _ => None, + } +} + +pub(crate) fn replace_custom_type(ty: &str) -> String { + custom_type_of(ty) + .map(|ty| ty.to_string()) + .unwrap_or_else(|| ty.to_string()) +} From 7af6cc0e5dcd2f666a625523ece88da285bef413 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 3 Aug 2023 12:46:40 +0200 Subject: [PATCH 0582/2372] Start enum type generation --- packages/go-gen/Cargo.toml | 2 +- packages/go-gen/src/go.rs | 89 ++++++++++++----------------- packages/go-gen/src/main.rs | 102 ++++++++++++++++++++++++++-------- packages/go-gen/src/schema.rs | 53 ++++++++++++++---- 4 files changed, 160 insertions(+), 86 deletions(-) diff --git a/packages/go-gen/Cargo.toml b/packages/go-gen/Cargo.toml index 7ebaaf9b4a..0ccefc1d1f 100644 --- a/packages/go-gen/Cargo.toml +++ b/packages/go-gen/Cargo.toml @@ -11,4 +11,4 @@ cosmwasm-std = { path = "../std", version = "1.3.1" } cosmwasm-schema = { path = "../schema", version = "1.3.1" } anyhow = "1" Inflector = "0.11.4" -indenter = { version = "0.3.3", features = ["std"] } +indenter = "0.3.3" diff --git a/packages/go-gen/src/go.rs b/packages/go-gen/src/go.rs index 84b4dd2d0a..e7e2771766 100644 --- a/packages/go-gen/src/go.rs +++ b/packages/go-gen/src/go.rs @@ -3,50 +3,28 @@ use std::fmt::{self, Display, Write}; use indenter::indented; use inflector::cases::pascalcase::to_pascal_case; -pub struct GoTypeDef { +pub struct GoStruct { pub name: String, pub docs: Option, - pub ty: GoTypeDefType, + pub fields: Vec, } -pub enum GoTypeDefType { - Struct { fields: Vec }, - // TODO: implement enums - // Enum { - // name: String, - // variants: Vec, - // }, -} - -impl Display for GoTypeDef { +impl Display for GoStruct { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { // generate documentation format_docs(f, self.docs.as_deref())?; + // generate type writeln!(f, "type {} struct {{", self.name)?; - match &self.ty { - GoTypeDefType::Struct { fields } => { - let mut f = indented(f); - for field in fields { - writeln!(f, "{}", field)?; - } - } + // generate fields + let mut f = indented(f); + for field in &self.fields { + writeln!(f, "{}", field)?; } f.write_char('}')?; Ok(()) } } -fn format_docs(f: &mut fmt::Formatter, docs: Option<&str>) -> fmt::Result { - if let Some(docs) = docs { - for line in docs.lines() { - f.write_str("// ")?; - f.write_str(line)?; - f.write_char('\n')?; - } - } - Ok(()) -} - pub struct GoField { /// The name of the field in Rust (snake_case) pub rust_name: String, @@ -121,6 +99,17 @@ impl Display for GoType { } } +fn format_docs(f: &mut fmt::Formatter, docs: Option<&str>) -> fmt::Result { + if let Some(docs) = docs { + for line in docs.lines() { + f.write_str("// ")?; + f.write_str(line)?; + f.write_char('\n')?; + } + } + Ok(()) +} + #[cfg(test)] mod tests { use super::*; @@ -207,38 +196,34 @@ mod tests { #[test] fn go_type_def_display_works() { - let ty = GoTypeDef { + let ty = GoStruct { name: "FooBar".to_string(), docs: None, - ty: GoTypeDefType::Struct { - fields: vec![GoField { - rust_name: "foo_bar".to_string(), - docs: None, - ty: GoType { - name: "string".to_string(), - is_nullable: true, - }, - }], - }, + fields: vec![GoField { + rust_name: "foo_bar".to_string(), + docs: None, + ty: GoType { + name: "string".to_string(), + is_nullable: true, + }, + }], }; assert_eq!( format!("{}", ty), "type FooBar struct {\n FooBar string `json:\"foo_bar,omitempty\"`\n}" ); - let ty = GoTypeDef { + let ty = GoStruct { name: "FooBar".to_string(), docs: Some("FooBar is a test struct".to_string()), - ty: GoTypeDefType::Struct { - fields: vec![GoField { - rust_name: "foo_bar".to_string(), - docs: None, - ty: GoType { - name: "string".to_string(), - is_nullable: true, - }, - }], - }, + fields: vec![GoField { + rust_name: "foo_bar".to_string(), + docs: None, + ty: GoType { + name: "string".to_string(), + is_nullable: true, + }, + }], }; assert_eq!( format!("{}", ty), diff --git a/packages/go-gen/src/main.rs b/packages/go-gen/src/main.rs index ce632382ad..22ae971281 100644 --- a/packages/go-gen/src/main.rs +++ b/packages/go-gen/src/main.rs @@ -47,7 +47,7 @@ fn generate_go(root: RootSchema) -> Result { Ok(code) } -fn build_type(name: &str, schema: &SchemaObject) -> Result> { +fn build_type(name: &str, schema: &SchemaObject) -> Result> { if schema::custom_type_of(name).is_some() { // ignore custom types return Ok(None); @@ -57,22 +57,18 @@ fn build_type(name: &str, schema: &SchemaObject) -> Result> { if let Some(obj) = schema.object.as_ref() { build_struct(name, schema, obj) .map(Some) - .with_context(|| format!("failed to generate struct '{name}")) + .with_context(|| format!("failed to generate struct '{name}'")) } else if let Some(variants) = schema::enum_variants(schema) { - build_enum(name, variants) + build_enum(name, schema, &variants) .map(Some) - .with_context(|| format!("failed to generate enum '{name}")) + .with_context(|| format!("failed to generate enum '{name}'")) } else { // ignore other types Ok(None) } } -pub(crate) fn build_struct( - name: &str, - strct: &SchemaObject, - obj: &ObjectValidation, -) -> Result { +pub fn build_struct(name: &str, strct: &SchemaObject, obj: &ObjectValidation) -> Result { let docs = documentation(strct); // go through all fields @@ -95,35 +91,61 @@ pub(crate) fn build_struct( }); let fields = fields.collect::>>()?; - Ok(GoTypeDef { + Ok(GoStruct { name: to_pascal_case(name), docs, - ty: GoTypeDefType::Struct { fields }, + fields, }) } -pub(crate) fn build_enum(_name: &str, _variants: Vec<&Schema>) -> Result { - todo!("generate_enum") +pub fn build_enum(name: &str, enm: &SchemaObject, variants: &[&Schema]) -> Result { + let docs = documentation(enm); + + // go through all fields + let fields = variants.iter().map(|v| { + // get schema object + let v = v + .object() + .with_context(|| format!("expected schema object for enum variants of {name}"))?; + + // analyze the variant + let (field, go_type) = schema::enum_variant(v).context("failed to extract enum variant")?; + + anyhow::Ok(GoField { + rust_name: field, + docs: documentation(v), + ty: GoType { + name: go_type, + is_nullable: true, // always nullable + }, + }) + }); + let fields = fields.collect::>>()?; + + Ok(GoStruct { + name: name.to_string(), + docs, + fields, + }) } #[cfg(test)] mod tests { use cosmwasm_schema::cw_serde; use cosmwasm_std::{Binary, HexBinary, Uint128}; - use indenter::CodeFormatter; use super::*; fn assert_code_eq(actual: String, expected: &str) { - let mut actual_fmt = String::new(); - let mut fmt = CodeFormatter::new(&mut actual_fmt, " "); - fmt.write_str(&actual).unwrap(); - - let mut expected_fmt = String::new(); - let mut fmt = CodeFormatter::new(&mut expected_fmt, " "); - fmt.write_str(expected).unwrap(); + let actual_no_ws = actual.split_whitespace().collect::>(); + let expected_no_ws = expected.split_whitespace().collect::>(); - assert_eq!(actual_fmt, expected_fmt, "expected code to be equal"); + assert!( + actual_no_ws == expected_no_ws, + "assertion failed: `(actual == expected)`\nactual:\n`{}`,\nexpected:\n`\"{}\"`", + actual, + expected + ); } #[test] @@ -212,7 +234,7 @@ mod tests { let schema = schemars::schema_for!(Empty); let code = generate_go(schema).unwrap(); - assert_eq!(code, "type Empty struct {\n}\n"); + assert_code_eq(code, "type Empty struct { }"); } #[test] @@ -265,4 +287,38 @@ mod tests { .unwrap(); generate_go(cosmwasm_schema::schema_for!(cosmwasm_std::CodeInfoResponse)).unwrap(); } + + #[test] + fn nested_enum_works() { + #[cw_serde] + struct Inner { + a: String, + } + + #[cw_serde] + enum MyEnum { + A(Inner), + B(String), + C { a: String }, + } + + let schema = schemars::schema_for!(MyEnum); + let code = generate_go(schema).unwrap(); + assert_code_eq( + code, + r#" + type MyEnum struct { + A *Inner `json:"a,omitempty"` + B string `json:"b,omitempty"` + C *CQuery `json:"c,omitempty"` + } + type Inner struct { + A string `json:"a"` + } + type CQuery struct { + A string `json:"a"` + } + "#, + ); + } } diff --git a/packages/go-gen/src/schema.rs b/packages/go-gen/src/schema.rs index 5c7435ccbe..951ce9b85e 100644 --- a/packages/go-gen/src/schema.rs +++ b/packages/go-gen/src/schema.rs @@ -17,7 +17,7 @@ impl SchemaExt for Schema { /// Returns the schemas of the variants of this enum, if it is an enum. /// Returns `None` if the schema is not an enum. -pub(crate) fn enum_variants(schema: &SchemaObject) -> Option> { +pub fn enum_variants(schema: &SchemaObject) -> Option> { Some( schema .subschemas @@ -29,8 +29,41 @@ pub(crate) fn enum_variants(schema: &SchemaObject) -> Option> { ) } +/// Tries to extract the name and type of the given enum variant. +pub fn enum_variant(schema: &SchemaObject) -> Result<(String, String)> { + // for variants without inner data, there is an entry in `enum_variants` + // we are not interested in that case, so we error out + if let Some(values) = &schema.enum_values { + bail!( + "enum variants {} without inner data not supported", + values + .iter() + .map(|v| v.to_string()) + .collect::>() + .join(", ") + ); + } + + // for variants with inner data, there is an object validation entry with a single property + // we extract the type of that property + let properties = &schema + .object + .as_ref() + .context("expected object validation for enum variant")? + .properties; + ensure!( + properties.len() == 1, + "expected exactly one property in enum variant" + ); + // we can unwrap here, because we checked the length above + let (name, schema) = properties.first_key_value().unwrap(); + let (ty, _) = schema_object_type(schema.object()?)?; + + Ok((name.to_string(), ty)) +} + /// Returns the Go type for the given schema object and whether it is nullable. -pub(crate) fn schema_object_type(schema: &SchemaObject) -> Result<(String, bool)> { +pub fn schema_object_type(schema: &SchemaObject) -> Result<(String, bool)> { let mut is_nullable = is_null(schema); // if it has a title, use that @@ -74,7 +107,7 @@ pub(crate) fn schema_object_type(schema: &SchemaObject) -> Result<(String, bool) /// Tries to extract the type of the non-null variant of an anyOf schema. /// /// Returns `Ok(None)` if the type is not nullable. -pub(crate) fn nullable_type(subschemas: &[Schema]) -> Result, anyhow::Error> { +pub fn nullable_type(subschemas: &[Schema]) -> Result, anyhow::Error> { let (found_null, nullable_type): (bool, Option<&SchemaObject>) = subschemas .iter() .fold(Ok((false, None)), |result: Result<_>, subschema| { @@ -95,7 +128,7 @@ pub(crate) fn nullable_type(subschemas: &[Schema]) -> Result, ) -> Result { @@ -140,7 +173,7 @@ pub(crate) fn type_from_instance_type( /// This fails if the given schema object is not an array, /// has multiple item types or other errors occur during type extraction of /// the underlying schema. -pub(crate) fn array_item_type(schema: &SchemaObject) -> Result<(String, bool)> { +pub fn array_item_type(schema: &SchemaObject) -> Result<(String, bool)> { match schema.array.as_ref().and_then(|a| a.items.as_ref()) { Some(SingleOrVec::Single(array_validation)) => { schema_object_type(array_validation.object()?) @@ -153,7 +186,7 @@ pub(crate) fn array_item_type(schema: &SchemaObject) -> Result<(String, bool)> { /// /// This fails if there are multiple subschemas or other errors occur /// during subschema type extraction. -pub(crate) fn subschema_type(subschemas: &[Schema]) -> Result { +pub fn subschema_type(subschemas: &[Schema]) -> Result { ensure!( subschemas.len() == 1, "multiple subschemas are not supported" @@ -163,20 +196,20 @@ pub(crate) fn subschema_type(subschemas: &[Schema]) -> Result { Ok(replace_custom_type(&ty)) } -pub(crate) fn is_null(schema: &SchemaObject) -> bool { +pub fn is_null(schema: &SchemaObject) -> bool { schema .instance_type .as_ref() .map_or(false, |s| s.contains(&InstanceType::Null)) } -pub(crate) fn documentation(schema: &SchemaObject) -> Option { +pub fn documentation(schema: &SchemaObject) -> Option { schema.metadata.as_ref()?.description.as_ref().cloned() } /// Maps special types to their Go equivalents. /// If the given type is not a special type, returns `None`. -pub(crate) fn custom_type_of(ty: &str) -> Option<&str> { +pub fn custom_type_of(ty: &str) -> Option<&str> { match ty { "Uint128" => Some("string"), "Binary" => Some("[]byte"), @@ -187,7 +220,7 @@ pub(crate) fn custom_type_of(ty: &str) -> Option<&str> { } } -pub(crate) fn replace_custom_type(ty: &str) -> String { +pub fn replace_custom_type(ty: &str) -> String { custom_type_of(ty) .map(|ty| ty.to_string()) .unwrap_or_else(|| ty.to_string()) From 4546e33e49680806697aa789493a02608d96bd1f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 3 Aug 2023 14:22:07 +0200 Subject: [PATCH 0583/2372] Fix struct indenting --- packages/go-gen/src/go.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/go-gen/src/go.rs b/packages/go-gen/src/go.rs index e7e2771766..3a34d90526 100644 --- a/packages/go-gen/src/go.rs +++ b/packages/go-gen/src/go.rs @@ -16,9 +16,11 @@ impl Display for GoStruct { // generate type writeln!(f, "type {} struct {{", self.name)?; // generate fields - let mut f = indented(f); - for field in &self.fields { - writeln!(f, "{}", field)?; + { + let mut f = indented(f); + for field in &self.fields { + writeln!(f, "{}", field)?; + } } f.write_char('}')?; Ok(()) @@ -42,7 +44,7 @@ impl Display for GoField { write!( f, "{} {} `json:\"{}", - to_pascal_case(&self.rust_name), + self.rust_name.to_pascal_case(), self.ty, self.rust_name )?; From 0dea8c0fc0bc41a4af3797ce1a975d7e43cbd2e1 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 3 Aug 2023 15:36:50 +0200 Subject: [PATCH 0584/2372] Allow generating go code from enums --- packages/go-gen/src/go.rs | 2 +- packages/go-gen/src/main.rs | 154 ++++++++++++++++++++++------------ packages/go-gen/src/schema.rs | 131 +++++++++++++++++++++++++---- packages/go-gen/src/utils.rs | 7 ++ 4 files changed, 224 insertions(+), 70 deletions(-) create mode 100644 packages/go-gen/src/utils.rs diff --git a/packages/go-gen/src/go.rs b/packages/go-gen/src/go.rs index 3a34d90526..521a0cf399 100644 --- a/packages/go-gen/src/go.rs +++ b/packages/go-gen/src/go.rs @@ -1,7 +1,7 @@ use std::fmt::{self, Display, Write}; use indenter::indented; -use inflector::cases::pascalcase::to_pascal_case; +use inflector::Inflector; pub struct GoStruct { pub name: String, diff --git a/packages/go-gen/src/main.rs b/packages/go-gen/src/main.rs index 22ae971281..df4f663a84 100644 --- a/packages/go-gen/src/main.rs +++ b/packages/go-gen/src/main.rs @@ -1,19 +1,16 @@ use anyhow::{Context, Result}; use go::*; use inflector::cases::pascalcase::to_pascal_case; -use schema::{documentation, schema_object_type, SchemaExt}; +use schema::{documentation, schema_object_type, SchemaExt, TypeContext}; use schemars::schema::{ObjectValidation, RootSchema, Schema, SchemaObject}; use std::fmt::Write; mod go; mod schema; +mod utils; fn main() -> Result<()> { - let root = cosmwasm_schema::schema_for!(cosmwasm_std::AllDelegationsResponse); - // println!( - // "{}", - // String::from_utf8(cosmwasm_std::to_vec(&root)?).unwrap() - // ); + let root = cosmwasm_schema::schema_for!(cosmwasm_std::BankQuery); let code = generate_go(root)?; println!("{}", code); @@ -22,53 +19,64 @@ fn main() -> Result<()> { } fn generate_go(root: RootSchema) -> Result { - let (title, _) = schema::schema_object_type(&root.schema).context("failed to get type name")?; - let main_type = build_type(&title, &root.schema) - .with_context(|| format!("failed to generate {title}"))? - .with_context(|| format!("failed to generate {title}, because it is a custom type"))?; - - let additional_types = root - .definitions - .into_iter() - .filter_map(|(name, def)| { - def.object() - .map(|def| build_type(&name, def)) - .and_then(|r| r) - .transpose() - }) - .collect::>>() - .context("failed to generate additional definitions")?; - - let mut code = format!("{main_type}\n"); - for additional_type in additional_types { - writeln!(&mut code, "{additional_type}")?; + let title = root + .schema + .metadata + .as_ref() + .and_then(|m| m.title.as_ref()) + .context("failed to get type name")?; + let mut types = vec![]; + build_type(title, &root.schema, &mut types) + .with_context(|| format!("failed to generate {title}"))?; + + // go through additional definitions + for (name, additional_type) in &root.definitions { + additional_type + .object() + .map(|def| build_type(name, def, &mut types)) + .and_then(|r| r) + .context("failed to generate additional definitions")?; + } + let mut code = String::new(); + for ty in types { + writeln!(&mut code, "{ty}")?; } Ok(code) } -fn build_type(name: &str, schema: &SchemaObject) -> Result> { +fn build_type(name: &str, schema: &SchemaObject, structs: &mut Vec) -> Result<()> { if schema::custom_type_of(name).is_some() { // ignore custom types - return Ok(None); + return Ok(()); } // first detect if we have a struct or enum if let Some(obj) = schema.object.as_ref() { - build_struct(name, schema, obj) + let strct = build_struct(name, schema, obj, structs) .map(Some) - .with_context(|| format!("failed to generate struct '{name}'")) + .with_context(|| format!("failed to generate struct '{name}'"))?; + if let Some(strct) = strct { + structs.push(strct); + } } else if let Some(variants) = schema::enum_variants(schema) { - build_enum(name, schema, &variants) + let strct = build_enum(name, schema, &variants, structs) .map(Some) - .with_context(|| format!("failed to generate enum '{name}'")) - } else { - // ignore other types - Ok(None) + .with_context(|| format!("failed to generate enum '{name}'"))?; + if let Some(strct) = strct { + structs.push(strct); + } } + + Ok(()) } -pub fn build_struct(name: &str, strct: &SchemaObject, obj: &ObjectValidation) -> Result { +pub fn build_struct( + name: &str, + strct: &SchemaObject, + obj: &ObjectValidation, + additional_structs: &mut Vec, +) -> Result { let docs = documentation(strct); // go through all fields @@ -78,8 +86,9 @@ pub fn build_struct(name: &str, strct: &SchemaObject, obj: &ObjectValidation) -> .object() .with_context(|| format!("expected schema object for field {field}"))?; // extract type from schema object - let (go_type, is_nullable) = schema_object_type(ty) - .with_context(|| format!("failed to get type of field '{field}'"))?; + let (go_type, is_nullable) = + schema_object_type(ty, TypeContext::new(name, field), additional_structs) + .with_context(|| format!("failed to get type of field '{field}'"))?; Ok(GoField { rust_name: field.clone(), docs: documentation(ty), @@ -98,7 +107,12 @@ pub fn build_struct(name: &str, strct: &SchemaObject, obj: &ObjectValidation) -> }) } -pub fn build_enum(name: &str, enm: &SchemaObject, variants: &[&Schema]) -> Result { +pub fn build_enum( + name: &str, + enm: &SchemaObject, + variants: &[&Schema], + additional_structs: &mut Vec, +) -> Result { let docs = documentation(enm); // go through all fields @@ -109,16 +123,10 @@ pub fn build_enum(name: &str, enm: &SchemaObject, variants: &[&Schema]) -> Resul .with_context(|| format!("expected schema object for enum variants of {name}"))?; // analyze the variant - let (field, go_type) = schema::enum_variant(v).context("failed to extract enum variant")?; + let variant_field = schema::enum_variant(v, name, additional_structs) + .context("failed to extract enum variant")?; - anyhow::Ok(GoField { - rust_name: field, - docs: documentation(v), - ty: GoType { - name: go_type, - is_nullable: true, // always nullable - }, - }) + anyhow::Ok(variant_field) }); let fields = fields.collect::>>()?; @@ -132,7 +140,7 @@ pub fn build_enum(name: &str, enm: &SchemaObject, variants: &[&Schema]) -> Resul #[cfg(test)] mod tests { use cosmwasm_schema::cw_serde; - use cosmwasm_std::{Binary, HexBinary, Uint128}; + use cosmwasm_std::{Binary, Empty, HexBinary, Uint128}; use super::*; @@ -307,18 +315,58 @@ mod tests { assert_code_eq( code, r#" + type CEnum struct { + A string `json:"a"` + } type MyEnum struct { A *Inner `json:"a,omitempty"` B string `json:"b,omitempty"` - C *CQuery `json:"c,omitempty"` + C *CEnum `json:"c,omitempty"` } type Inner struct { A string `json:"a"` } - type CQuery struct { - A string `json:"a"` - } "#, ); + + #[cw_serde] + enum ShouldFail1 { + A(), + } + #[cw_serde] + enum ShouldFail2 { + A, + } + let schema = schemars::schema_for!(ShouldFail1); + assert!(generate_go(schema) + .unwrap_err() + .root_cause() + .to_string() + .contains("array type with non-singular item type is not supported")); + let schema = schemars::schema_for!(ShouldFail2); + let code = generate_go(schema).unwrap(); + println!("{code}"); + // println!("{:?}", generate_go(schema).unwrap_err()); + // assert!(generate_go(schema) + // .unwrap_err() + // .root_cause() + // .to_string() + // .contains("expected schema object for enum variants of ShouldFail2")); + } + + #[test] + fn queries_work() { + generate_go(cosmwasm_schema::schema_for!( + cosmwasm_std::QueryRequest + )) + .unwrap(); + generate_go(cosmwasm_schema::schema_for!(cosmwasm_std::BankQuery)).unwrap(); + generate_go(cosmwasm_schema::schema_for!(cosmwasm_std::StakingQuery)).unwrap(); + generate_go(cosmwasm_schema::schema_for!( + cosmwasm_std::DistributionQuery + )) + .unwrap(); + generate_go(cosmwasm_schema::schema_for!(cosmwasm_std::IbcQuery)).unwrap(); + generate_go(cosmwasm_schema::schema_for!(cosmwasm_std::WasmQuery)).unwrap(); } } diff --git a/packages/go-gen/src/schema.rs b/packages/go-gen/src/schema.rs index 951ce9b85e..56185905ca 100644 --- a/packages/go-gen/src/schema.rs +++ b/packages/go-gen/src/schema.rs @@ -1,7 +1,13 @@ use anyhow::{bail, ensure, Context, Result}; +use inflector::Inflector; use schemars::schema::{InstanceType, Schema, SchemaObject, SingleOrVec}; +use crate::{ + go::{GoField, GoStruct, GoType}, + utils::suffixes, +}; + pub trait SchemaExt { fn object(&self) -> anyhow::Result<&SchemaObject>; } @@ -30,7 +36,11 @@ pub fn enum_variants(schema: &SchemaObject) -> Option> { } /// Tries to extract the name and type of the given enum variant. -pub fn enum_variant(schema: &SchemaObject) -> Result<(String, String)> { +pub fn enum_variant( + schema: &SchemaObject, + enum_name: &str, + additional_structs: &mut Vec, +) -> Result { // for variants without inner data, there is an entry in `enum_variants` // we are not interested in that case, so we error out if let Some(values) = &schema.enum_values { @@ -44,6 +54,8 @@ pub fn enum_variant(schema: &SchemaObject) -> Result<(String, String)> { ); } + let docs = documentation(schema); + // for variants with inner data, there is an object validation entry with a single property // we extract the type of that property let properties = &schema @@ -57,13 +69,29 @@ pub fn enum_variant(schema: &SchemaObject) -> Result<(String, String)> { ); // we can unwrap here, because we checked the length above let (name, schema) = properties.first_key_value().unwrap(); - let (ty, _) = schema_object_type(schema.object()?)?; + let (ty, _) = schema_object_type( + schema.object()?, + TypeContext::new(enum_name, name), + additional_structs, + )?; - Ok((name.to_string(), ty)) + Ok(GoField { + rust_name: name.to_string(), + docs, + ty: GoType { + name: ty, + is_nullable: true, // always nullable + }, + }) } /// Returns the Go type for the given schema object and whether it is nullable. -pub fn schema_object_type(schema: &SchemaObject) -> Result<(String, bool)> { +/// May also add additional structs to the given `Vec` that need to be generated for this type. +pub fn schema_object_type( + schema: &SchemaObject, + type_context: TypeContext, + additional_structs: &mut Vec, +) -> Result<(String, bool)> { let mut is_nullable = is_null(schema); // if it has a title, use that @@ -78,7 +106,7 @@ pub fn schema_object_type(schema: &SchemaObject) -> Result<(String, bool)> { .expect("split should always return at least one item"), ) } else if let Some(t) = &schema.instance_type { - type_from_instance_type(schema, t)? + type_from_instance_type(schema, type_context, t, additional_structs)? } else if let Some(subschemas) = schema.subschemas.as_ref().and_then(|s| s.any_of.as_ref()) { // check if one of them is null let nullable = nullable_type(subschemas)?; @@ -86,17 +114,20 @@ pub fn schema_object_type(schema: &SchemaObject) -> Result<(String, bool)> { ensure!(subschemas.len() == 2, "multiple subschemas in anyOf"); is_nullable = true; // extract non-null type - let (non_null_type, _) = schema_object_type(non_null)?; + let (non_null_type, _) = + schema_object_type(non_null, type_context, additional_structs)?; replace_custom_type(&non_null_type) } else { - subschema_type(subschemas).context("failed to get type of anyOf subschemas")? + subschema_type(subschemas, type_context, additional_structs) + .context("failed to get type of anyOf subschemas")? } } else if let Some(subschemas) = schema .subschemas .as_ref() .and_then(|s| s.all_of.as_ref().or(s.one_of.as_ref())) { - subschema_type(subschemas).context("failed to get type of allOf subschemas")? + subschema_type(subschemas, type_context, additional_structs) + .context("failed to get type of allOf subschemas")? } else { bail!("no type for schema found: {:?}", schema); }; @@ -125,12 +156,32 @@ pub fn nullable_type(subschemas: &[Schema]) -> Result, any Ok(if found_null { nullable_type } else { None }) } +/// The context for type extraction +#[derive(Clone, Copy, Debug)] +pub struct TypeContext<'a> { + /// The struct name + struct_name: &'a str, + /// The name of the field in the parent struct + field: &'a str, +} + +impl<'a> TypeContext<'a> { + pub fn new(parent: &'a str, field: &'a str) -> Self { + Self { + struct_name: parent, + field, + } + } +} + /// Tries to extract a type name from the given instance type. /// /// Fails for unsupported instance types or integer formats. pub fn type_from_instance_type( schema: &SchemaObject, + type_context: TypeContext, t: &SingleOrVec, + additional_structs: &mut Vec, ) -> Result { // if it has an instance type, use that Ok(if t.contains(&InstanceType::String) { @@ -150,11 +201,51 @@ pub fn type_from_instance_type( } else if t.contains(&InstanceType::Boolean) { "bool".to_string() } else if t.contains(&InstanceType::Object) { - bail!("object type not supported: {:?}", schema); + // generate a new struct for this object + // struct_name should be in PascalCase, so we detect the last word and use that as + // the suffix for the new struct name + let suffix = suffixes(type_context.struct_name) + .rev() + .find(|s| s.starts_with(char::is_uppercase)) + .unwrap_or(type_context.struct_name); + let new_struct_name = format!("{}{suffix}", type_context.field.to_pascal_case()); + + let fields = schema + .object + .as_ref() + .context("expected object validation")? + .properties + .iter() + .map(|(name, schema)| { + let schema = schema.object()?; + let (ty, is_nullable) = schema_object_type( + schema, + TypeContext::new(&new_struct_name, name), + additional_structs, + )?; + Ok(GoField { + rust_name: name.to_string(), + docs: documentation(schema), + ty: GoType { + name: ty, + is_nullable, + }, + }) + }) + .collect::>>()?; + + let strct = GoStruct { + name: new_struct_name.clone(), + docs: None, + fields, + }; + additional_structs.push(strct); + + new_struct_name } else if t.contains(&InstanceType::Array) { // get type of items - let (item_type, item_nullable) = - array_item_type(schema).context("failed to get array item type")?; + let (item_type, item_nullable) = array_item_type(schema, type_context, additional_structs) + .context("failed to get array item type")?; // map custom types let item_type = custom_type_of(&item_type).unwrap_or(&item_type); @@ -173,12 +264,16 @@ pub fn type_from_instance_type( /// This fails if the given schema object is not an array, /// has multiple item types or other errors occur during type extraction of /// the underlying schema. -pub fn array_item_type(schema: &SchemaObject) -> Result<(String, bool)> { +pub fn array_item_type( + schema: &SchemaObject, + type_context: TypeContext, + additional_structs: &mut Vec, +) -> Result<(String, bool)> { match schema.array.as_ref().and_then(|a| a.items.as_ref()) { Some(SingleOrVec::Single(array_validation)) => { - schema_object_type(array_validation.object()?) + schema_object_type(array_validation.object()?, type_context, additional_structs) } - _ => bail!("array type with non-singular item type not supported"), + _ => bail!("array type with non-singular item type is not supported"), } } @@ -186,13 +281,17 @@ pub fn array_item_type(schema: &SchemaObject) -> Result<(String, bool)> { /// /// This fails if there are multiple subschemas or other errors occur /// during subschema type extraction. -pub fn subschema_type(subschemas: &[Schema]) -> Result { +pub fn subschema_type( + subschemas: &[Schema], + type_context: TypeContext, + additional_structs: &mut Vec, +) -> Result { ensure!( subschemas.len() == 1, "multiple subschemas are not supported" ); let subschema = &subschemas[0]; - let (ty, _) = schema_object_type(subschema.object()?)?; + let (ty, _) = schema_object_type(subschema.object()?, type_context, additional_structs)?; Ok(replace_custom_type(&ty)) } diff --git a/packages/go-gen/src/utils.rs b/packages/go-gen/src/utils.rs new file mode 100644 index 0000000000..1b5107a371 --- /dev/null +++ b/packages/go-gen/src/utils.rs @@ -0,0 +1,7 @@ +/// An iterator that returns all suffixes of a string, excluding the empty string. +/// +/// It starts with the full string and ends with the last character. +/// It is a double-ended iterator and can be reversed. +pub fn suffixes(s: &str) -> impl Iterator + DoubleEndedIterator { + s.char_indices().map(|(pos, _)| &s[pos..]) +} From 249d5c3fe31c932b1aed911571f06bb00ea21fcf Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 3 Aug 2023 15:53:23 +0200 Subject: [PATCH 0585/2372] Enable all cosmwasm features for go generator --- packages/go-gen/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/go-gen/Cargo.toml b/packages/go-gen/Cargo.toml index 0ccefc1d1f..0af1ede26c 100644 --- a/packages/go-gen/Cargo.toml +++ b/packages/go-gen/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] schemars = "0.8.3" -cosmwasm-std = { path = "../std", version = "1.3.1" } +cosmwasm-std = { path = "../std", version = "1.3.1", features = ["cosmwasm_1_3", "staking", "stargate", "ibc3"] } cosmwasm-schema = { path = "../schema", version = "1.3.1" } anyhow = "1" Inflector = "0.11.4" From ca122c3411e4c68922e42ce3579d94c0bb3052cf Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 3 Aug 2023 15:58:31 +0200 Subject: [PATCH 0586/2372] Use iterator --- packages/go-gen/src/main.rs | 21 +++++++++------------ packages/go-gen/src/schema.rs | 12 ++---------- 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/packages/go-gen/src/main.rs b/packages/go-gen/src/main.rs index df4f663a84..256ced708e 100644 --- a/packages/go-gen/src/main.rs +++ b/packages/go-gen/src/main.rs @@ -60,7 +60,7 @@ fn build_type(name: &str, schema: &SchemaObject, structs: &mut Vec) -> structs.push(strct); } } else if let Some(variants) = schema::enum_variants(schema) { - let strct = build_enum(name, schema, &variants, structs) + let strct = build_enum(name, schema, variants, structs) .map(Some) .with_context(|| format!("failed to generate enum '{name}'"))?; if let Some(strct) = strct { @@ -107,16 +107,16 @@ pub fn build_struct( }) } -pub fn build_enum( +pub fn build_enum<'a>( name: &str, enm: &SchemaObject, - variants: &[&Schema], + variants: impl Iterator, additional_structs: &mut Vec, ) -> Result { let docs = documentation(enm); // go through all fields - let fields = variants.iter().map(|v| { + let fields = variants.map(|v| { // get schema object let v = v .object() @@ -344,14 +344,11 @@ mod tests { .to_string() .contains("array type with non-singular item type is not supported")); let schema = schemars::schema_for!(ShouldFail2); - let code = generate_go(schema).unwrap(); - println!("{code}"); - // println!("{:?}", generate_go(schema).unwrap_err()); - // assert!(generate_go(schema) - // .unwrap_err() - // .root_cause() - // .to_string() - // .contains("expected schema object for enum variants of ShouldFail2")); + assert!(generate_go(schema) + .unwrap_err() + .root_cause() + .to_string() + .contains("expected schema object for enum variants of ShouldFail2")); } #[test] diff --git a/packages/go-gen/src/schema.rs b/packages/go-gen/src/schema.rs index 56185905ca..50f076e339 100644 --- a/packages/go-gen/src/schema.rs +++ b/packages/go-gen/src/schema.rs @@ -23,16 +23,8 @@ impl SchemaExt for Schema { /// Returns the schemas of the variants of this enum, if it is an enum. /// Returns `None` if the schema is not an enum. -pub fn enum_variants(schema: &SchemaObject) -> Option> { - Some( - schema - .subschemas - .as_ref()? - .one_of - .as_ref()? - .iter() - .collect(), - ) +pub fn enum_variants(schema: &SchemaObject) -> Option> { + Some(schema.subschemas.as_ref()?.one_of.as_ref()?.iter()) } /// Tries to extract the name and type of the given enum variant. From 126562bc946b3dca9eb3cae60bb8d5a706862a90 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 3 Aug 2023 16:02:21 +0200 Subject: [PATCH 0587/2372] Fail if no type generated --- packages/go-gen/src/main.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/go-gen/src/main.rs b/packages/go-gen/src/main.rs index 256ced708e..88deb988c2 100644 --- a/packages/go-gen/src/main.rs +++ b/packages/go-gen/src/main.rs @@ -66,6 +66,8 @@ fn build_type(name: &str, schema: &SchemaObject, structs: &mut Vec) -> if let Some(strct) = strct { structs.push(strct); } + } else { + anyhow::bail!("failed to generate type for {name}"); } Ok(()) @@ -348,7 +350,7 @@ mod tests { .unwrap_err() .root_cause() .to_string() - .contains("expected schema object for enum variants of ShouldFail2")); + .contains("failed to generate type for ShouldFail2")); } #[test] From 376ab1b582cbbc36485a5c8ae888ef8e1f6ae2c3 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 3 Aug 2023 16:42:09 +0200 Subject: [PATCH 0588/2372] Refactor --- packages/go-gen/src/main.rs | 111 ++++++++++++++++++++++++++++++---- packages/go-gen/src/schema.rs | 92 +++++++--------------------- 2 files changed, 123 insertions(+), 80 deletions(-) diff --git a/packages/go-gen/src/main.rs b/packages/go-gen/src/main.rs index 88deb988c2..7e3300902a 100644 --- a/packages/go-gen/src/main.rs +++ b/packages/go-gen/src/main.rs @@ -1,4 +1,4 @@ -use anyhow::{Context, Result}; +use anyhow::{bail, ensure, Context, Result}; use go::*; use inflector::cases::pascalcase::to_pascal_case; use schema::{documentation, schema_object_type, SchemaExt, TypeContext}; @@ -18,6 +18,7 @@ fn main() -> Result<()> { Ok(()) } +/// Generates the Go code for the given schema fn generate_go(root: RootSchema) -> Result { let title = root .schema @@ -45,6 +46,8 @@ fn generate_go(root: RootSchema) -> Result { Ok(code) } +/// Generates Go structs for the given schema and adds them to `structs`. +/// This will add more than one struct if the schema contains object types (anonymous structs). fn build_type(name: &str, schema: &SchemaObject, structs: &mut Vec) -> Result<()> { if schema::custom_type_of(name).is_some() { // ignore custom types @@ -73,6 +76,8 @@ fn build_type(name: &str, schema: &SchemaObject, structs: &mut Vec) -> Ok(()) } +/// Creates a Go struct for the given schema object and returns it. +/// This will also add any additional structs to `additional_structs` (but not the returned one). pub fn build_struct( name: &str, strct: &SchemaObject, @@ -84,20 +89,16 @@ pub fn build_struct( // go through all fields let fields = obj.properties.iter().map(|(field, ty)| { // get schema object - let ty = ty + let schema = ty .object() .with_context(|| format!("expected schema object for field {field}"))?; // extract type from schema object - let (go_type, is_nullable) = - schema_object_type(ty, TypeContext::new(name, field), additional_structs) - .with_context(|| format!("failed to get type of field '{field}'"))?; + let ty = schema_object_type(schema, TypeContext::new(name, field), additional_structs) + .with_context(|| format!("failed to get type of field '{field}'"))?; Ok(GoField { rust_name: field.clone(), - docs: documentation(ty), - ty: GoType { - name: go_type, - is_nullable, - }, + docs: documentation(schema), + ty, }) }); let fields = fields.collect::>>()?; @@ -109,6 +110,8 @@ pub fn build_struct( }) } +/// Creates a Go struct for the given schema object and returns it. +/// This will also add any additional structs to `additional_structs` (but not the returned one). pub fn build_enum<'a>( name: &str, enm: &SchemaObject, @@ -125,7 +128,7 @@ pub fn build_enum<'a>( .with_context(|| format!("expected schema object for enum variants of {name}"))?; // analyze the variant - let variant_field = schema::enum_variant(v, name, additional_structs) + let variant_field = build_enum_variant(v, name, additional_structs) .context("failed to extract enum variant")?; anyhow::Ok(variant_field) @@ -139,6 +142,56 @@ pub fn build_enum<'a>( }) } +/// Tries to extract the name and type of the given enum variant and returns it as a `GoField`. +pub fn build_enum_variant( + schema: &SchemaObject, + enum_name: &str, + additional_structs: &mut Vec, +) -> Result { + // for variants without inner data, there is an entry in `enum_variants` + // we are not interested in that case, so we error out + if let Some(values) = &schema.enum_values { + bail!( + "enum variants {} without inner data not supported", + values + .iter() + .map(|v| v.to_string()) + .collect::>() + .join(", ") + ); + } + + let docs = documentation(schema); + + // for variants with inner data, there is an object validation entry with a single property + // we extract the type of that property + let properties = &schema + .object + .as_ref() + .context("expected object validation for enum variant")? + .properties; + ensure!( + properties.len() == 1, + "expected exactly one property in enum variant" + ); + // we can unwrap here, because we checked the length above + let (name, schema) = properties.first_key_value().unwrap(); + let GoType { name: ty, .. } = schema_object_type( + schema.object()?, + TypeContext::new(enum_name, name), + additional_structs, + )?; + + Ok(GoField { + rust_name: name.to_string(), + docs, + ty: GoType { + name: ty, + is_nullable: true, // always nullable + }, + }) +} + #[cfg(test)] mod tests { use cosmwasm_schema::cw_serde; @@ -368,4 +421,40 @@ mod tests { generate_go(cosmwasm_schema::schema_for!(cosmwasm_std::IbcQuery)).unwrap(); generate_go(cosmwasm_schema::schema_for!(cosmwasm_std::WasmQuery)).unwrap(); } + + #[test] + fn array_item_type_works() { + #[cw_serde] + struct A { + a: Vec>>>>, + } + #[cw_serde] + struct B {} + + // example json: + // A { a: vec![vec![vec![None, Some(Some(B {})), Some(None)]]] } + // => {"a":[[[null,{},null]]]} + let code = generate_go(cosmwasm_schema::schema_for!(A)).unwrap(); + assert_code_eq( + code, + r#" + type A struct { + A [][][]*B `json:"a"` + } + type B struct { }"#, + ); + + #[cw_serde] + struct C { + c: Vec>>>>, + } + let code = generate_go(cosmwasm_schema::schema_for!(C)).unwrap(); + assert_code_eq( + code, + r#" + type C struct { + C [][][]*string `json:"c"` + }"#, + ); + } } diff --git a/packages/go-gen/src/schema.rs b/packages/go-gen/src/schema.rs index 50f076e339..52b00ca607 100644 --- a/packages/go-gen/src/schema.rs +++ b/packages/go-gen/src/schema.rs @@ -9,6 +9,8 @@ use crate::{ }; pub trait SchemaExt { + /// Returns a reference to the contained schema object, + /// or an error if the schema is not an object. fn object(&self) -> anyhow::Result<&SchemaObject>; } @@ -27,63 +29,13 @@ pub fn enum_variants(schema: &SchemaObject) -> Option, -) -> Result { - // for variants without inner data, there is an entry in `enum_variants` - // we are not interested in that case, so we error out - if let Some(values) = &schema.enum_values { - bail!( - "enum variants {} without inner data not supported", - values - .iter() - .map(|v| v.to_string()) - .collect::>() - .join(", ") - ); - } - - let docs = documentation(schema); - - // for variants with inner data, there is an object validation entry with a single property - // we extract the type of that property - let properties = &schema - .object - .as_ref() - .context("expected object validation for enum variant")? - .properties; - ensure!( - properties.len() == 1, - "expected exactly one property in enum variant" - ); - // we can unwrap here, because we checked the length above - let (name, schema) = properties.first_key_value().unwrap(); - let (ty, _) = schema_object_type( - schema.object()?, - TypeContext::new(enum_name, name), - additional_structs, - )?; - - Ok(GoField { - rust_name: name.to_string(), - docs, - ty: GoType { - name: ty, - is_nullable: true, // always nullable - }, - }) -} - /// Returns the Go type for the given schema object and whether it is nullable. /// May also add additional structs to the given `Vec` that need to be generated for this type. pub fn schema_object_type( schema: &SchemaObject, type_context: TypeContext, additional_structs: &mut Vec, -) -> Result<(String, bool)> { +) -> Result { let mut is_nullable = is_null(schema); // if it has a title, use that @@ -106,9 +58,9 @@ pub fn schema_object_type( ensure!(subschemas.len() == 2, "multiple subschemas in anyOf"); is_nullable = true; // extract non-null type - let (non_null_type, _) = + let GoType { name, .. } = schema_object_type(non_null, type_context, additional_structs)?; - replace_custom_type(&non_null_type) + replace_custom_type(&name) } else { subschema_type(subschemas, type_context, additional_structs) .context("failed to get type of anyOf subschemas")? @@ -124,7 +76,10 @@ pub fn schema_object_type( bail!("no type for schema found: {:?}", schema); }; - Ok((ty, is_nullable)) + Ok(GoType { + name: ty, + is_nullable, + }) } /// Tries to extract the type of the non-null variant of an anyOf schema. @@ -210,7 +165,7 @@ pub fn type_from_instance_type( .iter() .map(|(name, schema)| { let schema = schema.object()?; - let (ty, is_nullable) = schema_object_type( + let ty = schema_object_type( schema, TypeContext::new(&new_struct_name, name), additional_structs, @@ -218,10 +173,7 @@ pub fn type_from_instance_type( Ok(GoField { rust_name: name.to_string(), docs: documentation(schema), - ty: GoType { - name: ty, - is_nullable, - }, + ty, }) }) .collect::>>()?; @@ -236,16 +188,17 @@ pub fn type_from_instance_type( new_struct_name } else if t.contains(&InstanceType::Array) { // get type of items - let (item_type, item_nullable) = array_item_type(schema, type_context, additional_structs) + let item_type = array_item_type(schema, type_context, additional_structs) .context("failed to get array item type")?; - // map custom types - let item_type = custom_type_of(&item_type).unwrap_or(&item_type); - if item_nullable { - replace_custom_type(&format!("[]*{}", item_type)) + // for nullable array item types, we have to use a pointer type, even for basic types, + // so we can pass null as elements + // otherwise they would just be omitted from the array + replace_custom_type(&if item_type.is_nullable { + format!("[]*{}", item_type.name) } else { - replace_custom_type(&format!("[]{}", item_type)) - } + format!("[]{}", item_type.name) + }) } else { unreachable!("instance type should be one of the above") }) @@ -260,7 +213,7 @@ pub fn array_item_type( schema: &SchemaObject, type_context: TypeContext, additional_structs: &mut Vec, -) -> Result<(String, bool)> { +) -> Result { match schema.array.as_ref().and_then(|a| a.items.as_ref()) { Some(SingleOrVec::Single(array_validation)) => { schema_object_type(array_validation.object()?, type_context, additional_structs) @@ -283,8 +236,9 @@ pub fn subschema_type( "multiple subschemas are not supported" ); let subschema = &subschemas[0]; - let (ty, _) = schema_object_type(subschema.object()?, type_context, additional_structs)?; - Ok(replace_custom_type(&ty)) + let GoType { name, .. } = + schema_object_type(subschema.object()?, type_context, additional_structs)?; + Ok(replace_custom_type(&name)) } pub fn is_null(schema: &SchemaObject) -> bool { From 591b198a1ec593a515b373356437ac7c4f749eeb Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 3 Aug 2023 16:55:19 +0200 Subject: [PATCH 0589/2372] Improve readme --- packages/go-gen/Cargo.toml | 1 + packages/go-gen/README.md | 8 +++++++- packages/go-gen/src/main.rs | 4 ++-- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/go-gen/Cargo.toml b/packages/go-gen/Cargo.toml index 0af1ede26c..89b1ae4715 100644 --- a/packages/go-gen/Cargo.toml +++ b/packages/go-gen/Cargo.toml @@ -1,5 +1,6 @@ [package] name = "go-gen" +authors = ["Christoph Otter "] version = "0.1.0" edition = "2021" diff --git a/packages/go-gen/README.md b/packages/go-gen/README.md index 743c58f3bf..07d242a152 100644 --- a/packages/go-gen/README.md +++ b/packages/go-gen/README.md @@ -4,9 +4,15 @@ This is an internal utility to generate Go types from `cosmwasm-std`'s query response types. These types can then be used in [wasmvm](https://github.com/CosmWasm/wasmvm). +## Usage + +Adjust the query / response type you want to generate in `src/main.rs` and run: +`cargo run -p go-gen` + ## Limitations -Only basic structs and enums are supported. Tuples don't work for example. +Only basic structs and enums are supported. Tuples and enum variants with 0 or +more than 1 parameters don't work, for example. ## License diff --git a/packages/go-gen/src/main.rs b/packages/go-gen/src/main.rs index 7e3300902a..7e034c5d5d 100644 --- a/packages/go-gen/src/main.rs +++ b/packages/go-gen/src/main.rs @@ -70,7 +70,7 @@ fn build_type(name: &str, schema: &SchemaObject, structs: &mut Vec) -> structs.push(strct); } } else { - anyhow::bail!("failed to generate type for {name}"); + anyhow::bail!("failed to determine type for '{name}'"); } Ok(()) @@ -403,7 +403,7 @@ mod tests { .unwrap_err() .root_cause() .to_string() - .contains("failed to generate type for ShouldFail2")); + .contains("failed to determine type for 'ShouldFail2'")); } #[test] From 3248b5bf7ce7a8f4cfdb1dc5de344d5aa3b0a4cb Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 14 Aug 2023 14:59:15 +0200 Subject: [PATCH 0590/2372] Fix wasm_execute docs --- packages/std/src/results/cosmos_msg.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index 85ccda6938..4ad4572253 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -336,7 +336,7 @@ pub fn wasm_instantiate( }) } -/// Shortcut helper as the construction of WasmMsg::Instantiate can be quite verbose in contract code +/// Shortcut helper as the construction of WasmMsg::Execute can be quite verbose in contract code pub fn wasm_execute( contract_addr: impl Into, msg: &impl Serialize, From fa4725caed133fdddcf89915668a661e1209b3cb Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 14 Aug 2023 15:48:40 +0200 Subject: [PATCH 0591/2372] Fix Validator struct docs --- packages/std/src/query/staking.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/query/staking.rs b/packages/std/src/query/staking.rs index 889144b122..fec3424917 100644 --- a/packages/std/src/query/staking.rs +++ b/packages/std/src/query/staking.rs @@ -134,6 +134,6 @@ pub struct Validator { pub address: String, pub commission: Decimal, pub max_commission: Decimal, - /// TODO: what units are these (in terms of time)? + /// The maximum daily increase of the commission pub max_change_rate: Decimal, } From 972c9a074a1a6369d59d7fe9d7f916a8d9b50f31 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 14 Aug 2023 15:48:58 +0200 Subject: [PATCH 0592/2372] Add docs about label validation --- packages/std/src/results/cosmos_msg.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index 4ad4572253..c83c0d38db 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -162,7 +162,12 @@ pub enum WasmMsg { #[derivative(Debug(format_with = "binary_to_string"))] msg: Binary, funds: Vec, - /// A human-readbale label for the contract + /// A human-readbale label for the contract. + /// + /// Valid values should: + /// - not be empty + /// - not be bigger than 128 bytes (or some chain-specific limit) + /// - not start / end with whitespace label: String, }, /// Instantiates a new contracts from previously uploaded Wasm code @@ -176,7 +181,12 @@ pub enum WasmMsg { Instantiate2 { admin: Option, code_id: u64, - /// A human-readbale label for the contract + /// A human-readbale label for the contract. + /// + /// Valid values should: + /// - not be empty + /// - not be bigger than 128 bytes (or some chain-specific limit) + /// - not start / end with whitespace label: String, /// msg is the JSON-encoded InstantiateMsg struct (as raw Binary) #[derivative(Debug(format_with = "binary_to_string"))] From 521cf04b2cdab16dc5abd392a5a7fbfb5ffe556b Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 14 Aug 2023 16:38:56 +0200 Subject: [PATCH 0593/2372] Update schema --- contracts/ibc-reflect-send/schema/ibc-reflect-send.json | 2 +- contracts/ibc-reflect-send/schema/packet_msg.json | 2 +- contracts/ibc-reflect-send/schema/raw/execute.json | 2 +- contracts/ibc-reflect/schema/packet_msg.json | 2 +- contracts/reflect/schema/raw/execute.json | 2 +- contracts/reflect/schema/reflect.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/contracts/ibc-reflect-send/schema/ibc-reflect-send.json b/contracts/ibc-reflect-send/schema/ibc-reflect-send.json index 33fb5467c8..1113f4030a 100644 --- a/contracts/ibc-reflect-send/schema/ibc-reflect-send.json +++ b/contracts/ibc-reflect-send/schema/ibc-reflect-send.json @@ -729,7 +729,7 @@ } }, "label": { - "description": "A human-readbale label for the contract", + "description": "A human-readbale label for the contract.\n\nValid values should: - not be empty - not be bigger than 128 bytes (or some chain-specific limit) - not start / end with whitespace", "type": "string" }, "msg": { diff --git a/contracts/ibc-reflect-send/schema/packet_msg.json b/contracts/ibc-reflect-send/schema/packet_msg.json index ed5b77d0b8..216e450b56 100644 --- a/contracts/ibc-reflect-send/schema/packet_msg.json +++ b/contracts/ibc-reflect-send/schema/packet_msg.json @@ -667,7 +667,7 @@ } }, "label": { - "description": "A human-readbale label for the contract", + "description": "A human-readbale label for the contract.\n\nValid values should: - not be empty - not be bigger than 128 bytes (or some chain-specific limit) - not start / end with whitespace", "type": "string" }, "msg": { diff --git a/contracts/ibc-reflect-send/schema/raw/execute.json b/contracts/ibc-reflect-send/schema/raw/execute.json index db374275af..660c6a35de 100644 --- a/contracts/ibc-reflect-send/schema/raw/execute.json +++ b/contracts/ibc-reflect-send/schema/raw/execute.json @@ -718,7 +718,7 @@ } }, "label": { - "description": "A human-readbale label for the contract", + "description": "A human-readbale label for the contract.\n\nValid values should: - not be empty - not be bigger than 128 bytes (or some chain-specific limit) - not start / end with whitespace", "type": "string" }, "msg": { diff --git a/contracts/ibc-reflect/schema/packet_msg.json b/contracts/ibc-reflect/schema/packet_msg.json index 547c6fe054..04626e6ebf 100644 --- a/contracts/ibc-reflect/schema/packet_msg.json +++ b/contracts/ibc-reflect/schema/packet_msg.json @@ -570,7 +570,7 @@ } }, "label": { - "description": "A human-readbale label for the contract", + "description": "A human-readbale label for the contract.\n\nValid values should: - not be empty - not be bigger than 128 bytes (or some chain-specific limit) - not start / end with whitespace", "type": "string" }, "msg": { diff --git a/contracts/reflect/schema/raw/execute.json b/contracts/reflect/schema/raw/execute.json index 5460db7a9b..59043a1418 100644 --- a/contracts/reflect/schema/raw/execute.json +++ b/contracts/reflect/schema/raw/execute.json @@ -778,7 +778,7 @@ } }, "label": { - "description": "A human-readbale label for the contract", + "description": "A human-readbale label for the contract.\n\nValid values should: - not be empty - not be bigger than 128 bytes (or some chain-specific limit) - not start / end with whitespace", "type": "string" }, "msg": { diff --git a/contracts/reflect/schema/reflect.json b/contracts/reflect/schema/reflect.json index aa6f6da44c..c1dec29d92 100644 --- a/contracts/reflect/schema/reflect.json +++ b/contracts/reflect/schema/reflect.json @@ -788,7 +788,7 @@ } }, "label": { - "description": "A human-readbale label for the contract", + "description": "A human-readbale label for the contract.\n\nValid values should: - not be empty - not be bigger than 128 bytes (or some chain-specific limit) - not start / end with whitespace", "type": "string" }, "msg": { From 9895b97228d07cbc676372620bdf3e3c218e19bf Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 14 Aug 2023 17:04:45 +0200 Subject: [PATCH 0594/2372] Fix typo --- contracts/ibc-reflect-send/schema/ibc-reflect-send.json | 2 +- contracts/ibc-reflect-send/schema/packet_msg.json | 2 +- contracts/ibc-reflect-send/schema/raw/execute.json | 2 +- contracts/ibc-reflect/schema/packet_msg.json | 2 +- contracts/reflect/schema/raw/execute.json | 2 +- contracts/reflect/schema/reflect.json | 2 +- packages/std/src/results/cosmos_msg.rs | 4 ++-- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/contracts/ibc-reflect-send/schema/ibc-reflect-send.json b/contracts/ibc-reflect-send/schema/ibc-reflect-send.json index 1113f4030a..fd003a55ef 100644 --- a/contracts/ibc-reflect-send/schema/ibc-reflect-send.json +++ b/contracts/ibc-reflect-send/schema/ibc-reflect-send.json @@ -729,7 +729,7 @@ } }, "label": { - "description": "A human-readbale label for the contract.\n\nValid values should: - not be empty - not be bigger than 128 bytes (or some chain-specific limit) - not start / end with whitespace", + "description": "A human-readable label for the contract.\n\nValid values should: - not be empty - not be bigger than 128 bytes (or some chain-specific limit) - not start / end with whitespace", "type": "string" }, "msg": { diff --git a/contracts/ibc-reflect-send/schema/packet_msg.json b/contracts/ibc-reflect-send/schema/packet_msg.json index 216e450b56..ed79c6860e 100644 --- a/contracts/ibc-reflect-send/schema/packet_msg.json +++ b/contracts/ibc-reflect-send/schema/packet_msg.json @@ -667,7 +667,7 @@ } }, "label": { - "description": "A human-readbale label for the contract.\n\nValid values should: - not be empty - not be bigger than 128 bytes (or some chain-specific limit) - not start / end with whitespace", + "description": "A human-readable label for the contract.\n\nValid values should: - not be empty - not be bigger than 128 bytes (or some chain-specific limit) - not start / end with whitespace", "type": "string" }, "msg": { diff --git a/contracts/ibc-reflect-send/schema/raw/execute.json b/contracts/ibc-reflect-send/schema/raw/execute.json index 660c6a35de..aacf4a1a66 100644 --- a/contracts/ibc-reflect-send/schema/raw/execute.json +++ b/contracts/ibc-reflect-send/schema/raw/execute.json @@ -718,7 +718,7 @@ } }, "label": { - "description": "A human-readbale label for the contract.\n\nValid values should: - not be empty - not be bigger than 128 bytes (or some chain-specific limit) - not start / end with whitespace", + "description": "A human-readable label for the contract.\n\nValid values should: - not be empty - not be bigger than 128 bytes (or some chain-specific limit) - not start / end with whitespace", "type": "string" }, "msg": { diff --git a/contracts/ibc-reflect/schema/packet_msg.json b/contracts/ibc-reflect/schema/packet_msg.json index 04626e6ebf..33dcb522c2 100644 --- a/contracts/ibc-reflect/schema/packet_msg.json +++ b/contracts/ibc-reflect/schema/packet_msg.json @@ -570,7 +570,7 @@ } }, "label": { - "description": "A human-readbale label for the contract.\n\nValid values should: - not be empty - not be bigger than 128 bytes (or some chain-specific limit) - not start / end with whitespace", + "description": "A human-readable label for the contract.\n\nValid values should: - not be empty - not be bigger than 128 bytes (or some chain-specific limit) - not start / end with whitespace", "type": "string" }, "msg": { diff --git a/contracts/reflect/schema/raw/execute.json b/contracts/reflect/schema/raw/execute.json index 59043a1418..74726daf4e 100644 --- a/contracts/reflect/schema/raw/execute.json +++ b/contracts/reflect/schema/raw/execute.json @@ -778,7 +778,7 @@ } }, "label": { - "description": "A human-readbale label for the contract.\n\nValid values should: - not be empty - not be bigger than 128 bytes (or some chain-specific limit) - not start / end with whitespace", + "description": "A human-readable label for the contract.\n\nValid values should: - not be empty - not be bigger than 128 bytes (or some chain-specific limit) - not start / end with whitespace", "type": "string" }, "msg": { diff --git a/contracts/reflect/schema/reflect.json b/contracts/reflect/schema/reflect.json index c1dec29d92..5165bed0e3 100644 --- a/contracts/reflect/schema/reflect.json +++ b/contracts/reflect/schema/reflect.json @@ -788,7 +788,7 @@ } }, "label": { - "description": "A human-readbale label for the contract.\n\nValid values should: - not be empty - not be bigger than 128 bytes (or some chain-specific limit) - not start / end with whitespace", + "description": "A human-readable label for the contract.\n\nValid values should: - not be empty - not be bigger than 128 bytes (or some chain-specific limit) - not start / end with whitespace", "type": "string" }, "msg": { diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index c83c0d38db..36e2d17007 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -162,7 +162,7 @@ pub enum WasmMsg { #[derivative(Debug(format_with = "binary_to_string"))] msg: Binary, funds: Vec, - /// A human-readbale label for the contract. + /// A human-readable label for the contract. /// /// Valid values should: /// - not be empty @@ -181,7 +181,7 @@ pub enum WasmMsg { Instantiate2 { admin: Option, code_id: u64, - /// A human-readbale label for the contract. + /// A human-readable label for the contract. /// /// Valid values should: /// - not be empty From d40030d934ebd889b27b0f916bd8e301c445d490 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 14 Aug 2023 12:22:06 +0200 Subject: [PATCH 0595/2372] Add missing error exports --- packages/std/src/lib.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index a71ed491e7..637845898d 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -38,8 +38,9 @@ pub use crate::coins::Coins; pub use crate::deps::{Deps, DepsMut, OwnedDeps}; pub use crate::errors::{ CheckedFromRatioError, CheckedMultiplyFractionError, CheckedMultiplyRatioError, - ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, - RecoverPubkeyError, StdError, StdResult, SystemError, VerificationError, + CoinFromStrError, CoinsError, ConversionOverflowError, DivideByZeroError, DivisionError, + OverflowError, OverflowOperation, RecoverPubkeyError, StdError, StdResult, SystemError, + VerificationError, }; pub use crate::hex_binary::HexBinary; pub use crate::ibc::{ From 87ec2774b850ca77668e9e68efafacd3b111072f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 15 Aug 2023 11:53:08 +0200 Subject: [PATCH 0596/2372] Add changelog entry for missing errors --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c0160e6aec..59558b3d68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.3.2] - 2023-08-15 + +### Fixed + +- cosmwasm-std: Export `CoinFromStrError`, `CoinsError` and `DivisionError` + ## [1.3.1] - 2023-07-26 ### Fixed @@ -1784,6 +1790,7 @@ Some main points: All future Changelog entries will reference this base +[1.3.2]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.1...v1.3.2 [1.3.1]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.0...v1.3.1 [1.3.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.7...v1.3.0 [1.2.7]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.6...v1.2.7 From 2150dfd4687f9173fb935190699937372de54d60 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 15 Aug 2023 12:00:20 +0200 Subject: [PATCH 0597/2372] Set version: 1.3.2 --- Cargo.lock | 16 ++++++++-------- contracts/burner/Cargo.lock | 12 ++++++------ contracts/crypto-verify/Cargo.lock | 14 +++++++------- contracts/cyberpunk/Cargo.lock | 14 +++++++------- contracts/floaty/Cargo.lock | 14 +++++++------- contracts/hackatom/Cargo.lock | 14 +++++++------- contracts/ibc-reflect-send/Cargo.lock | 14 +++++++------- contracts/ibc-reflect/Cargo.lock | 14 +++++++------- contracts/queue/Cargo.lock | 12 ++++++------ contracts/reflect/Cargo.lock | 14 +++++++------- contracts/staking/Cargo.lock | 14 +++++++------- contracts/virus/Cargo.lock | 12 ++++++------ packages/check/Cargo.toml | 6 +++--- packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema-derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 6 +++--- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 20 files changed, 99 insertions(+), 99 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0b00b733ae..d2363377f5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -291,7 +291,7 @@ dependencies = [ [[package]] name = "cosmwasm-check" -version = "1.3.1" +version = "1.3.2" dependencies = [ "anyhow", "clap 2.34.0", @@ -302,7 +302,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.1" +version = "1.3.2" dependencies = [ "base64", "criterion", @@ -321,7 +321,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.1" +version = "1.3.2" dependencies = [ "cosmwasm-std", "syn", @@ -329,7 +329,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "1.3.1" +version = "1.3.2" dependencies = [ "anyhow", "cosmwasm-schema-derive", @@ -344,7 +344,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.1" +version = "1.3.2" dependencies = [ "proc-macro2", "quote", @@ -353,7 +353,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.1" +version = "1.3.2" dependencies = [ "base64", "bnum", @@ -375,7 +375,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.1" +version = "1.3.2" dependencies = [ "cosmwasm-std", "serde", @@ -383,7 +383,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.1" +version = "1.3.2" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index e99ff31e89..d27f3c3386 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -180,7 +180,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.1" +version = "1.3.2" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -191,14 +191,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.1" +version = "1.3.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.1" +version = "1.3.2" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -209,7 +209,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.1" +version = "1.3.2" dependencies = [ "proc-macro2", "quote", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.1" +version = "1.3.2" dependencies = [ "base64", "bnum", @@ -236,7 +236,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.1" +version = "1.3.2" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index d1665ab649..6c01f72537 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -175,7 +175,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.1" +version = "1.3.2" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -186,14 +186,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.1" +version = "1.3.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.1" +version = "1.3.2" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -204,7 +204,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.1" +version = "1.3.2" dependencies = [ "proc-macro2", "quote", @@ -213,7 +213,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.1" +version = "1.3.2" dependencies = [ "base64", "bnum", @@ -231,7 +231,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.1" +version = "1.3.2" dependencies = [ "cosmwasm-std", "serde", @@ -239,7 +239,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.1" +version = "1.3.2" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 234257a90e..98349c9dc7 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.1" +version = "1.3.2" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -209,14 +209,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.1" +version = "1.3.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.1" +version = "1.3.2" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.1" +version = "1.3.2" dependencies = [ "proc-macro2", "quote", @@ -236,7 +236,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.1" +version = "1.3.2" dependencies = [ "base64", "bnum", @@ -254,7 +254,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.1" +version = "1.3.2" dependencies = [ "cosmwasm-std", "serde", @@ -262,7 +262,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.1" +version = "1.3.2" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index e2323cdb0a..5b8ef9a533 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.1" +version = "1.3.2" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.1" +version = "1.3.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.1" +version = "1.3.2" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.1" +version = "1.3.2" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.1" +version = "1.3.2" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.1" +version = "1.3.2" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.1" +version = "1.3.2" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index f51757ff85..289d8a5495 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.1" +version = "1.3.2" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.1" +version = "1.3.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.1" +version = "1.3.2" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.1" +version = "1.3.2" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.1" +version = "1.3.2" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.1" +version = "1.3.2" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.1" +version = "1.3.2" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 080476fa46..05b35892fd 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.1" +version = "1.3.2" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.1" +version = "1.3.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.1" +version = "1.3.2" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.1" +version = "1.3.2" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.1" +version = "1.3.2" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.1" +version = "1.3.2" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.1" +version = "1.3.2" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index f8494b2c95..61a8c0a2c5 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.1" +version = "1.3.2" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.1" +version = "1.3.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.1" +version = "1.3.2" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.1" +version = "1.3.2" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.1" +version = "1.3.2" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.1" +version = "1.3.2" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.1" +version = "1.3.2" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 348ba3f121..b9b2c85f59 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.1" +version = "1.3.2" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.1" +version = "1.3.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.1" +version = "1.3.2" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.1" +version = "1.3.2" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.1" +version = "1.3.2" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.1" +version = "1.3.2" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index cc1177fb54..9ba307009b 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.1" +version = "1.3.2" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.1" +version = "1.3.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.1" +version = "1.3.2" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.1" +version = "1.3.2" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.1" +version = "1.3.2" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.1" +version = "1.3.2" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.1" +version = "1.3.2" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 2c0aec3bc2..c525e103ca 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.1" +version = "1.3.2" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.1" +version = "1.3.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.1" +version = "1.3.2" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.1" +version = "1.3.2" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.1" +version = "1.3.2" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.1" +version = "1.3.2" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.1" +version = "1.3.2" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 11a1463eac..fd9f491ada 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.1" +version = "1.3.2" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.1" +version = "1.3.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.1" +version = "1.3.2" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.1" +version = "1.3.2" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.1" +version = "1.3.2" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.1" +version = "1.3.2" dependencies = [ "bitflags", "bytecheck", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index fd7e91a07f..64e2292ae7 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-check" -version = "1.3.1" +version = "1.3.2" authors = ["Mauro Lacy "] edition = "2021" description = "A CLI tool for verifying CosmWasm smart contracts" @@ -11,5 +11,5 @@ license = "Apache-2.0" anyhow = "1.0.57" clap = "2" colored = "2" -cosmwasm-vm = { path = "../vm", version = "1.3.1" } -cosmwasm-std = { path = "../std", version = "1.3.1" } +cosmwasm-vm = { path = "../vm", version = "1.3.2" } +cosmwasm-std = { path = "../std", version = "1.3.2" } diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index bd894f27a7..03826e465e 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "1.3.1" +version = "1.3.2" authors = ["Mauro Lacy "] edition = "2021" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index d1ddfacd33..8676971c60 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "1.3.1" +version = "1.3.2" authors = ["Simon Warta "] edition = "2021" description = "A package for auto-generated code used for CosmWasm contract development. This is shipped as part of cosmwasm-std. Do not use directly." diff --git a/packages/schema-derive/Cargo.toml b/packages/schema-derive/Cargo.toml index 96f66eddb0..0654e2e856 100644 --- a/packages/schema-derive/Cargo.toml +++ b/packages/schema-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema-derive" -version = "1.3.1" +version = "1.3.2" authors = ["Tomasz Kurcz "] edition = "2021" description = "Derive macros for cosmwasm-schema" diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index f4906527b9..58c9148e45 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "1.3.1" +version = "1.3.2" authors = ["Simon Warta ", "Ethan Frey "] edition = "2021" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." @@ -8,7 +8,7 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/schema" license = "Apache-2.0" [dependencies] -cosmwasm-schema-derive = { version = "=1.3.1", path = "../schema-derive" } +cosmwasm-schema-derive = { version = "=1.3.2", path = "../schema-derive" } schemars = "0.8.3" serde = "1.0" serde_json = "1.0.40" @@ -16,6 +16,6 @@ thiserror = "1.0.26" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = { version = "1.3.1", path = "../std" } +cosmwasm-std = { version = "1.3.2", path = "../std" } semver = "1" tempfile = "3" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 8ca24cc67b..691fca98e1 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "1.3.1" +version = "1.3.2" authors = ["Ethan Frey "] edition = "2021" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -45,7 +45,7 @@ cosmwasm_1_3 = ["cosmwasm_1_2"] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "1.3.1" } +cosmwasm-derive = { path = "../derive", version = "1.3.2" } derivative = "2" forward_ref = "1" hex = "0.4" @@ -57,7 +57,7 @@ thiserror = "1.0.26" bnum = "0.7.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "1.3.1" } +cosmwasm-crypto = { path = "../crypto", version = "1.3.2" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 4bf9e84087..8028adef44 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "1.3.1" +version = "1.3.2" authors = ["Ethan Frey "] edition = "2021" description = "CosmWasm library with useful helpers for Storage patterns" @@ -16,5 +16,5 @@ iterator = ["cosmwasm-std/iterator"] [dependencies] # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.3.1", default-features = false } +cosmwasm-std = { path = "../std", version = "1.3.2", default-features = false } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index b934195123..b921be6357 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "1.3.1" +version = "1.3.2" authors = ["Ethan Frey "] edition = "2021" description = "VM bindings to run cosmwams contracts" @@ -42,8 +42,8 @@ required-features = ["iterator"] clru = "0.4.0" crc32fast = "1.3.2" # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.3.1", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "1.3.1" } +cosmwasm-std = { path = "../std", version = "1.3.2", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "1.3.2" } hex = "0.4" parity-wasm = { version = "0.45", features = ["sign_ext"] } schemars = "0.8.3" From 5741162b4b969e9bb00bcc62f28111e56176614b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Wo=C5=BAniak?= Date: Mon, 14 Aug 2023 17:19:53 +0200 Subject: [PATCH 0598/2372] feat: Provide native way to cast deps to empty --- CHANGELOG.md | 2 ++ packages/std/src/deps.rs | 45 +++++++++++++++++++++++++++++++++++--- packages/std/src/traits.rs | 23 +++++++++++++++++++ 3 files changed, 67 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f92ce52545..377b65cc2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ and this project adheres to ### Added - cosmwasm-std: Implement `Not` for `Uint{64,128,256}` ([#1799]). +- cosmwasm-std: Implement `into_empty` for `QuerierWrapper`, `Deps` and + `DepsMut`. [#1799]: https://github.com/CosmWasm/cosmwasm/pull/1799 diff --git a/packages/std/src/deps.rs b/packages/std/src/deps.rs index 939a5bd5e1..cc7a4681ab 100644 --- a/packages/std/src/deps.rs +++ b/packages/std/src/deps.rs @@ -69,6 +69,28 @@ impl<'a, C: CustomQuery> DepsMut<'a, C> { querier: self.querier, } } + + /// This allows to convert any `DepsMut` into one generic over `Empty` custom + /// query type. + pub fn into_empty(self) -> DepsMut<'a, Empty> { + DepsMut { + storage: self.storage, + api: self.api, + querier: self.querier.into_empty(), + } + } +} + +impl<'a, C: CustomQuery> Deps<'a, C> { + /// This allows to convert any `Deps` into one generic over `Empty` custom + /// query type. + pub fn into_empty(self) -> Deps<'a, Empty> { + Deps { + storage: self.storage, + api: self.api, + querier: self.querier.into_empty(), + } + } } #[cfg(test)] @@ -98,12 +120,13 @@ mod tests { query(deps.as_ref()) } + #[derive(Clone, Serialize, Deserialize)] + struct MyQuery; + impl CustomQuery for MyQuery {} + #[test] fn deps_implements_copy() { impl CustomQuery for u64 {} - #[derive(Clone, Serialize, Deserialize)] - struct MyQuery; - impl CustomQuery for MyQuery {} // With C: Copy let owned = OwnedDeps::<_, _, _, u64> { @@ -127,4 +150,20 @@ mod tests { let _copy1 = deps; let _copy2 = deps; } + + #[test] + fn deps_to_empty() { + let mut owned = OwnedDeps::<_, _, _, MyQuery> { + storage: MockStorage::default(), + api: MockApi::default(), + querier: MockQuerier::::new(&[]), + custom_query_type: PhantomData, + }; + + let deps_mut: DepsMut = owned.as_mut(); + let _: DepsMut = deps_mut.into_empty(); + + let deps: Deps = owned.as_ref(); + let _: Deps = deps.into_empty(); + } } diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 4e77f56873..8aaa853101 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -225,6 +225,15 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { } } + /// This allows to convert any `QuerierWrapper` into a `QuerierWrapper` generic + /// over `Empty` custom query type. + pub fn into_empty(self) -> QuerierWrapper<'a, Empty> { + QuerierWrapper { + querier: self.querier, + custom_query_type: PhantomData, + } + } + /// Makes the query and parses the response. /// /// Any error (System Error, Error or called contract, or Parse Error) are flattened into @@ -441,6 +450,8 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { #[cfg(test)] mod tests { + use serde::Deserialize; + use super::*; use crate::testing::MockQuerier; use crate::{coins, from_slice, Uint128}; @@ -571,4 +582,16 @@ mod tests { } if msg == "Querier system error: No such contract: foobar" )); } + + #[test] + fn querier_into_empty() { + #[derive(Clone, Serialize, Deserialize)] + struct MyQuery; + impl CustomQuery for MyQuery {} + + let querier: MockQuerier = MockQuerier::new(&[]); + let wrapper = QuerierWrapper::::new(&querier); + + let _: QuerierWrapper = wrapper.into_empty(); + } } From 0decbb2ea710e3cda1f6463a09d49edaee87ff18 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 15 Aug 2023 15:56:36 +0200 Subject: [PATCH 0599/2372] Document usage of CosmWasm gas values --- packages/vm/src/backend.rs | 18 +++++++++++++++--- packages/vm/src/environment.rs | 6 ++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/packages/vm/src/backend.rs b/packages/vm/src/backend.rs index 0128847a65..336044cd92 100644 --- a/packages/vm/src/backend.rs +++ b/packages/vm/src/backend.rs @@ -10,6 +10,10 @@ use cosmwasm_std::{Order, Record}; /// A structure that represents gas cost to be deducted from the remaining gas. /// This is always needed when computations are performed outside of /// Wasm execution, such as calling crypto APIs or calls into the blockchain. +/// +/// All values are measured in [CosmWasm gas]. +/// +/// [CosmWasm gas]: https://github.com/CosmWasm/cosmwasm/blob/main/docs/GAS.md #[derive(Copy, Clone, Debug, PartialEq, Eq)] pub struct GasInfo { /// The gas cost of a computation that was executed already but not yet charged. @@ -19,6 +23,12 @@ pub struct GasInfo { pub cost: u64, /// Gas that was used and charged externally. This is needed to /// adjust the VM's gas limit but does not affect the gas usage. + /// + /// Since this is measured in [CosmWasm gas], the caller may need + /// to convert from Cosmos SDK gas in cases where an SDK gas meter + /// is used. + /// + /// [CosmWasm gas]: https://github.com/CosmWasm/cosmwasm/blob/main/docs/GAS.md pub externally_used: u64, } @@ -141,10 +151,12 @@ pub trait Querier { /// knowing the custom format, or we can decode it, with the knowledge of the allowed /// types. /// - /// The gas limit describes how much VM gas this particular query is allowed + /// The gas limit describes how much [CosmWasm gas] this particular query is allowed /// to comsume when measured separately from the rest of the contract. /// The returned gas info (in BackendResult) can exceed the gas limit in cases /// where the query could not be aborted exactly at the limit. + /// + /// [CosmWasm gas]: https://github.com/CosmWasm/cosmwasm/blob/main/docs/GAS.md fn query_raw( &self, request: &[u8], @@ -153,8 +165,8 @@ pub trait Querier { } /// A result type for calling into the backend. Such a call can cause -/// non-negligible computational cost in both success and faiure case and must always have gas information -/// attached. +/// non-negligible computational cost in both success and faiure case and +/// must always have gas information attached. pub type BackendResult = (core::result::Result, GasInfo); #[derive(Error, Debug, PartialEq, Eq)] diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index 985ce810db..53eb402cc3 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -322,6 +322,9 @@ impl Environment { }) } + /// Returns the remaining gas measured in [CosmWasm gas]. + /// + /// [CosmWasm gas]: https://github.com/CosmWasm/cosmwasm/blob/main/docs/GAS.md pub fn get_gas_left(&self, store: &mut impl AsStoreMut) -> u64 { self.with_wasmer_instance(|instance| { Ok(match get_remaining_points(store, instance) { @@ -332,6 +335,9 @@ impl Environment { .expect("Wasmer instance is not set. This is a bug in the lifecycle.") } + /// Sets the remaining gas measured in [CosmWasm gas]. + /// + /// [CosmWasm gas]: https://github.com/CosmWasm/cosmwasm/blob/main/docs/GAS.md pub fn set_gas_left(&self, store: &mut impl AsStoreMut, new_value: u64) { self.with_wasmer_instance(|instance| { set_remaining_points(store, instance, new_value); From ec25a5437d16217efce4be3edfdda89adf22d6d6 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 4 Aug 2023 14:15:39 +0200 Subject: [PATCH 0600/2372] Implement IntoIterator for Coins --- packages/std/src/coin.rs | 16 ++++++ packages/std/src/coins.rs | 116 +++++++++++++++++++++++++++++++++++++- packages/std/src/lib.rs | 2 +- 3 files changed, 131 insertions(+), 3 deletions(-) diff --git a/packages/std/src/coin.rs b/packages/std/src/coin.rs index 1a28480188..e39fcfe9fa 100644 --- a/packages/std/src/coin.rs +++ b/packages/std/src/coin.rs @@ -55,6 +55,22 @@ impl fmt::Display for Coin { } } +/// Equivalent to Coin, but with a reference to the denom +#[derive(Serialize, Deserialize, Debug, Clone, Default, PartialEq, Eq, JsonSchema)] +pub struct CoinRef<'a> { + pub denom: &'a str, + pub amount: Uint128, +} + +impl From> for Coin { + fn from(value: CoinRef) -> Self { + Coin { + denom: value.denom.to_owned(), + amount: value.amount, + } + } +} + /// A shortcut constructor for a set of one denomination of coins /// /// # Examples diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index 5a0f05a7f3..dfbc7709c5 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -2,8 +2,10 @@ use alloc::collections::BTreeMap; use core::fmt; use core::str::FromStr; -use crate::{errors::CoinsError, Coin, StdError, StdResult, Uint128}; -use crate::{OverflowError, OverflowOperation}; +use crate::{ + errors::CoinsError, Coin, CoinRef, OverflowError, OverflowOperation, StdError, StdResult, + Uint128, +}; /// A collection of coins, similar to Cosmos SDK's `sdk.Coins` struct. /// @@ -206,6 +208,92 @@ impl Coins { Ok(()) } + + /// Returns an iterator over the coins. + /// The iterator does not yield [Coin]s, but [CoinRef]s as items. + /// + /// # Examples + /// + /// ``` + /// # use cosmwasm_std::{coin, Coin, CoinRef, Coins, Uint128}; + /// let mut coins = Coins::default(); + /// coins.add(coin(500, "uluna")).unwrap(); + /// coins.add(coin(1000, "uatom")).unwrap(); + /// let mut iterator = coins.iter(); + /// + /// let uatom: CoinRef = iterator.next().unwrap(); + /// assert_eq!(uatom.denom, "uatom"); + /// assert_eq!(uatom.amount.u128(), 1000); + /// + /// let uluna = iterator.next().unwrap(); + /// assert_eq!(uluna.denom, "uluna"); + /// assert_eq!(uluna.amount.u128(), 500); + /// + /// assert_eq!(iterator.next(), None); + /// ``` + pub fn iter(&self) -> CoinsIter<'_> { + CoinsIter(self.0.iter()) + } +} + +impl IntoIterator for Coins { + type Item = Coin; + type IntoIter = CoinsIntoIter; + + fn into_iter(self) -> Self::IntoIter { + CoinsIntoIter(self.0.into_iter()) + } +} + +impl<'a> IntoIterator for &'a Coins { + type Item = CoinRef<'a>; + type IntoIter = CoinsIter<'a>; + + fn into_iter(self) -> Self::IntoIter { + self.iter() + } +} + +#[derive(Debug)] +pub struct CoinsIntoIter(alloc::collections::btree_map::IntoIter); + +impl Iterator for CoinsIntoIter { + type Item = Coin; + + fn next(&mut self) -> Option { + self.0.next().map(|(denom, amount)| Coin { denom, amount }) + } +} + +impl DoubleEndedIterator for CoinsIntoIter { + fn next_back(&mut self) -> Option { + self.0 + .next_back() + .map(|(denom, amount)| Coin { denom, amount }) + } +} + +#[derive(Debug)] +pub struct CoinsIter<'a>(alloc::collections::btree_map::Iter<'a, String, Uint128>); + +impl<'a> Iterator for CoinsIter<'a> { + type Item = CoinRef<'a>; + + fn next(&mut self) -> Option { + self.0.next().map(|(denom, amount)| CoinRef { + denom, + amount: *amount, + }) + } +} + +impl<'a> DoubleEndedIterator for CoinsIter<'a> { + fn next_back(&mut self) -> Option { + self.0.next_back().map(|(denom, amount)| CoinRef { + denom, + amount: *amount, + }) + } } #[cfg(test)] @@ -389,4 +477,28 @@ mod tests { assert_eq!(coins.len(), 1); assert_eq!(coins.amount_of("uatom").u128(), 12345); } + + #[test] + fn can_iterate_owned() { + let coins = mock_coins(); + let mut moved = Coins::default(); + for c in coins { + moved.add(c).unwrap(); + } + assert_eq!(moved.len(), 3); + + assert!(mock_coins().into_iter().eq(mock_coins().to_vec())); + } + + #[test] + fn can_iterate_borrowed() { + let coins = mock_coins(); + assert!(coins + .iter() + .map(|c| c.denom) + .eq(coins.to_vec().iter().map(|c| &c.denom))); + + // can still use the coins afterwards + assert_eq!(coins.amount_of("uatom").u128(), 12345); + } } diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index cc63087d43..bf8605fc40 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -40,7 +40,7 @@ pub mod storage_keys; pub use crate::addresses::{instantiate2_address, Addr, CanonicalAddr, Instantiate2AddressError}; pub use crate::binary::Binary; -pub use crate::coin::{coin, coins, has_coins, Coin}; +pub use crate::coin::{coin, coins, has_coins, Coin, CoinRef}; pub use crate::coins::Coins; pub use crate::deps::{Deps, DepsMut, OwnedDeps}; pub use crate::errors::{ From 3b98fc368a4afcb606421df68ee054628f4ff1a4 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 4 Aug 2023 14:17:09 +0200 Subject: [PATCH 0601/2372] Implement From<&Coin> for CoinRef --- packages/std/src/coin.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/std/src/coin.rs b/packages/std/src/coin.rs index e39fcfe9fa..af4d650fea 100644 --- a/packages/std/src/coin.rs +++ b/packages/std/src/coin.rs @@ -71,6 +71,15 @@ impl From> for Coin { } } +impl<'a> From<&'a Coin> for CoinRef<'a> { + fn from(value: &'a Coin) -> Self { + CoinRef { + denom: &value.denom, + amount: value.amount, + } + } +} + /// A shortcut constructor for a set of one denomination of coins /// /// # Examples From 9f794475d02d9dabc504bce3c5cf982b55e58687 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 14 Aug 2023 11:55:51 +0200 Subject: [PATCH 0602/2372] Keep whole Coin struct in Coins helper --- packages/std/src/coin.rs | 25 ------------- packages/std/src/coins.rs | 76 ++++++++++++++++++--------------------- packages/std/src/lib.rs | 2 +- 3 files changed, 35 insertions(+), 68 deletions(-) diff --git a/packages/std/src/coin.rs b/packages/std/src/coin.rs index af4d650fea..1a28480188 100644 --- a/packages/std/src/coin.rs +++ b/packages/std/src/coin.rs @@ -55,31 +55,6 @@ impl fmt::Display for Coin { } } -/// Equivalent to Coin, but with a reference to the denom -#[derive(Serialize, Deserialize, Debug, Clone, Default, PartialEq, Eq, JsonSchema)] -pub struct CoinRef<'a> { - pub denom: &'a str, - pub amount: Uint128, -} - -impl From> for Coin { - fn from(value: CoinRef) -> Self { - Coin { - denom: value.denom.to_owned(), - amount: value.amount, - } - } -} - -impl<'a> From<&'a Coin> for CoinRef<'a> { - fn from(value: &'a Coin) -> Self { - CoinRef { - denom: &value.denom, - amount: value.amount, - } - } -} - /// A shortcut constructor for a set of one denomination of coins /// /// # Examples diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index dfbc7709c5..df450186a0 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -3,21 +3,20 @@ use core::fmt; use core::str::FromStr; use crate::{ - errors::CoinsError, Coin, CoinRef, OverflowError, OverflowOperation, StdError, StdResult, - Uint128, + errors::CoinsError, Coin, OverflowError, OverflowOperation, StdError, StdResult, Uint128, }; /// A collection of coins, similar to Cosmos SDK's `sdk.Coins` struct. /// /// Differently from `sdk.Coins`, which is a vector of `sdk.Coin`, here we -/// implement Coins as a BTreeMap that maps from coin denoms to amounts. +/// implement Coins as a BTreeMap that maps from coin denoms to `Coin`. /// This has a number of advantages: /// /// - coins are naturally sorted alphabetically by denom /// - duplicate denoms are automatically removed /// - cheaper for searching/inserting/deleting: O(log(n)) compared to O(n) #[derive(Clone, Default, Debug, PartialEq, Eq)] -pub struct Coins(BTreeMap); +pub struct Coins(BTreeMap); /// Casting a Vec to Coins. /// The Vec can be out of order, but must not contain duplicate denoms. @@ -28,13 +27,13 @@ impl TryFrom> for Coins { fn try_from(vec: Vec) -> Result { let mut map = BTreeMap::new(); - for Coin { amount, denom } in vec { - if amount.is_zero() { + for coin in vec { + if coin.amount.is_zero() { continue; } // if the insertion returns a previous value, we have a duplicate denom - if map.insert(denom, amount).is_some() { + if map.insert(coin.denom.clone(), coin).is_some() { return Err(CoinsError::DuplicateDenom); } } @@ -104,21 +103,12 @@ impl fmt::Display for Coins { impl Coins { /// Conversion to Vec, while NOT consuming the original object pub fn to_vec(&self) -> Vec { - self.0 - .iter() - .map(|(denom, amount)| Coin { - denom: denom.clone(), - amount: *amount, - }) - .collect() + self.0.values().cloned().collect() } /// Conversion to Vec, consuming the original object pub fn into_vec(self) -> Vec { - self.0 - .into_iter() - .map(|(denom, amount)| Coin { denom, amount }) - .collect() + self.0.into_values().collect() } /// Returns the number of different denoms in this collection. @@ -139,7 +129,10 @@ impl Coins { /// Returns the amount of the given denom or zero if the denom is not present. pub fn amount_of(&self, denom: &str) -> Uint128 { - self.0.get(denom).copied().unwrap_or_else(Uint128::zero) + self.0 + .get(denom) + .map(|c| c.amount) + .unwrap_or_else(Uint128::zero) } /// Returns the amount of the given denom if and only if this collection contains only @@ -163,7 +156,7 @@ impl Coins { /// ``` pub fn contains_only(&self, denom: &str) -> Option { if self.len() == 1 { - self.0.get(denom).copied() + self.0.get(denom).map(|c| c.amount) } else { None } @@ -176,8 +169,15 @@ impl Coins { return Ok(()); } - let amount = self.0.entry(coin.denom).or_insert_with(Uint128::zero); - *amount = amount.checked_add(coin.amount)?; + // if the coin is not present yet, insert it, otherwise add to existing amount + match self.0.get_mut(&coin.denom) { + None => { + self.0.insert(coin.denom.clone(), coin); + } + Some(existing) => { + existing.amount = existing.amount.checked_add(coin.amount)?; + } + } Ok(()) } @@ -185,10 +185,10 @@ impl Coins { /// Errors in case of overflow or if the denom is not present. pub fn sub(&mut self, coin: Coin) -> StdResult<()> { match self.0.get_mut(&coin.denom) { - Some(v) => { - *v = v.checked_sub(coin.amount)?; + Some(existing) => { + existing.amount = existing.amount.checked_sub(coin.amount)?; // make sure to remove zero coin - if v.is_zero() { + if existing.amount.is_zero() { self.0.remove(&coin.denom); } } @@ -246,7 +246,7 @@ impl IntoIterator for Coins { } impl<'a> IntoIterator for &'a Coins { - type Item = CoinRef<'a>; + type Item = &'a Coin; type IntoIter = CoinsIter<'a>; fn into_iter(self) -> Self::IntoIter { @@ -255,44 +255,36 @@ impl<'a> IntoIterator for &'a Coins { } #[derive(Debug)] -pub struct CoinsIntoIter(alloc::collections::btree_map::IntoIter); +pub struct CoinsIntoIter(alloc::collections::btree_map::IntoIter); impl Iterator for CoinsIntoIter { type Item = Coin; fn next(&mut self) -> Option { - self.0.next().map(|(denom, amount)| Coin { denom, amount }) + self.0.next().map(|(_, coin)| coin) } } impl DoubleEndedIterator for CoinsIntoIter { fn next_back(&mut self) -> Option { - self.0 - .next_back() - .map(|(denom, amount)| Coin { denom, amount }) + self.0.next_back().map(|(_, coin)| coin) } } #[derive(Debug)] -pub struct CoinsIter<'a>(alloc::collections::btree_map::Iter<'a, String, Uint128>); +pub struct CoinsIter<'a>(alloc::collections::btree_map::Iter<'a, String, Coin>); impl<'a> Iterator for CoinsIter<'a> { - type Item = CoinRef<'a>; + type Item = &'a Coin; fn next(&mut self) -> Option { - self.0.next().map(|(denom, amount)| CoinRef { - denom, - amount: *amount, - }) + self.0.next().map(|(_, coin)| coin) } } impl<'a> DoubleEndedIterator for CoinsIter<'a> { fn next_back(&mut self) -> Option { - self.0.next_back().map(|(denom, amount)| CoinRef { - denom, - amount: *amount, - }) + self.0.next_back().map(|(_, coin)| coin) } } @@ -495,7 +487,7 @@ mod tests { let coins = mock_coins(); assert!(coins .iter() - .map(|c| c.denom) + .map(|c| &c.denom) .eq(coins.to_vec().iter().map(|c| &c.denom))); // can still use the coins afterwards diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index bf8605fc40..cc63087d43 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -40,7 +40,7 @@ pub mod storage_keys; pub use crate::addresses::{instantiate2_address, Addr, CanonicalAddr, Instantiate2AddressError}; pub use crate::binary::Binary; -pub use crate::coin::{coin, coins, has_coins, Coin, CoinRef}; +pub use crate::coin::{coin, coins, has_coins, Coin}; pub use crate::coins::Coins; pub use crate::deps::{Deps, DepsMut, OwnedDeps}; pub use crate::errors::{ From 87ed3a7abe5539a1b451c0ec06ea7db524dc175e Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 14 Aug 2023 12:34:42 +0200 Subject: [PATCH 0603/2372] Fix Coins Display impl --- packages/std/src/coins.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index df450186a0..520b09836d 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -92,8 +92,8 @@ impl fmt::Display for Coins { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let s = self .0 - .iter() - .map(|(denom, amount)| format!("{amount}{denom}")) + .values() + .map(|coin| format!("{coin}")) .collect::>() .join(","); write!(f, "{s}") From 1eafab9ebc923c130c497ecb9b621a359bdaa209 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 14 Aug 2023 12:40:37 +0200 Subject: [PATCH 0604/2372] Fix test --- packages/std/src/coins.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index 520b09836d..6144bc2ea2 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -210,18 +210,17 @@ impl Coins { } /// Returns an iterator over the coins. - /// The iterator does not yield [Coin]s, but [CoinRef]s as items. /// /// # Examples /// /// ``` - /// # use cosmwasm_std::{coin, Coin, CoinRef, Coins, Uint128}; + /// # use cosmwasm_std::{coin, Coin, Coins, Uint128}; /// let mut coins = Coins::default(); /// coins.add(coin(500, "uluna")).unwrap(); /// coins.add(coin(1000, "uatom")).unwrap(); /// let mut iterator = coins.iter(); /// - /// let uatom: CoinRef = iterator.next().unwrap(); + /// let uatom = iterator.next().unwrap(); /// assert_eq!(uatom.denom, "uatom"); /// assert_eq!(uatom.amount.u128(), 1000); /// From 54fa6762a7a788db183b9a83979ba4e86b9dc1f2 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 15 Aug 2023 11:25:22 +0200 Subject: [PATCH 0605/2372] Simplify coins formatting Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/std/src/coins.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index 6144bc2ea2..38133981fd 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -93,7 +93,7 @@ impl fmt::Display for Coins { let s = self .0 .values() - .map(|coin| format!("{coin}")) + .map(|coin| coin.to_string()) .collect::>() .join(","); write!(f, "{s}") From f1776c0abaeb8b26821256861fc5fc29325d58e1 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 15 Aug 2023 11:28:41 +0200 Subject: [PATCH 0606/2372] Implement ExactSizeIterator for Coins iterators --- packages/std/src/coins.rs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index 38133981fd..fa7c5b8c44 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -262,6 +262,10 @@ impl Iterator for CoinsIntoIter { fn next(&mut self) -> Option { self.0.next().map(|(_, coin)| coin) } + + fn size_hint(&self) -> (usize, Option) { + self.0.size_hint() + } } impl DoubleEndedIterator for CoinsIntoIter { @@ -270,6 +274,12 @@ impl DoubleEndedIterator for CoinsIntoIter { } } +impl ExactSizeIterator for CoinsIntoIter { + fn len(&self) -> usize { + self.0.len() + } +} + #[derive(Debug)] pub struct CoinsIter<'a>(alloc::collections::btree_map::Iter<'a, String, Coin>); @@ -279,6 +289,10 @@ impl<'a> Iterator for CoinsIter<'a> { fn next(&mut self) -> Option { self.0.next().map(|(_, coin)| coin) } + + fn size_hint(&self) -> (usize, Option) { + self.0.size_hint() + } } impl<'a> DoubleEndedIterator for CoinsIter<'a> { @@ -287,6 +301,12 @@ impl<'a> DoubleEndedIterator for CoinsIter<'a> { } } +impl<'a> ExactSizeIterator for CoinsIter<'a> { + fn len(&self) -> usize { + self.0.len() + } +} + #[cfg(test)] mod tests { use super::*; @@ -469,6 +489,18 @@ mod tests { assert_eq!(coins.amount_of("uatom").u128(), 12345); } + #[test] + fn exact_size_iterator() { + let coins = mock_coins(); + let iter = coins.iter(); + assert_eq!(iter.len(), 3); + assert_eq!(iter.size_hint(), (3, Some(3))); + + let iter = coins.into_iter(); + assert_eq!(iter.len(), 3); + assert_eq!(iter.size_hint(), (3, Some(3))); + } + #[test] fn can_iterate_owned() { let coins = mock_coins(); From b2460bb5c8a45a9b0e95a50ad0c59b75d21ea8a7 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 15 Aug 2023 11:33:04 +0200 Subject: [PATCH 0607/2372] Add changelog entry for Coins iterators --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 377b65cc2a..4ee07964b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,8 +11,10 @@ and this project adheres to - cosmwasm-std: Implement `Not` for `Uint{64,128,256}` ([#1799]). - cosmwasm-std: Implement `into_empty` for `QuerierWrapper`, `Deps` and `DepsMut`. +- cosmwasm-std: Add iterators for `Coins` ([#1806]). [#1799]: https://github.com/CosmWasm/cosmwasm/pull/1799 +[#1806]: https://github.com/CosmWasm/cosmwasm/pull/1806 ### Changed From 261cead30a68a4dda55ad0c36ccbcea4b208384c Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 15 Aug 2023 14:48:07 +0200 Subject: [PATCH 0608/2372] Apply suggestions from code review Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/std/src/coins.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index fa7c5b8c44..44e72e1330 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -264,6 +264,7 @@ impl Iterator for CoinsIntoIter { } fn size_hint(&self) -> (usize, Option) { + // Since btree_map::IntoIter implements ExactSizeIterator, this is guaranteed to return the exact length self.0.size_hint() } } @@ -291,6 +292,7 @@ impl<'a> Iterator for CoinsIter<'a> { } fn size_hint(&self) -> (usize, Option) { + // Since btree_map::Iter implements ExactSizeIterator, this is guaranteed to return the exact length self.0.size_hint() } } From ae4986e4bd95b8a752d31793bd076be9107160d9 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 17 Aug 2023 16:53:02 +0200 Subject: [PATCH 0609/2372] Use doc comments --- packages/schema/src/export.rs | 6 +++--- packages/std/src/ibc.rs | 10 +++++----- packages/std/src/lib.rs | 10 +++++----- packages/std/src/traits.rs | 19 ++++++++++--------- packages/vm/src/testing/querier.rs | 2 +- 5 files changed, 24 insertions(+), 23 deletions(-) diff --git a/packages/schema/src/export.rs b/packages/schema/src/export.rs index 2e5c7dcd10..fa26dae9a9 100644 --- a/packages/schema/src/export.rs +++ b/packages/schema/src/export.rs @@ -7,7 +7,7 @@ use schemars::schema::RootSchema; use crate::casing::to_snake_case; -// Exports a schema, auto-generating filename based on the metadata title of the generated schema. +/// Exports a schema, auto-generating filename based on the metadata title of the generated schema. pub fn export_schema(schema: &RootSchema, out_dir: &Path) { let title = schema .schema @@ -18,8 +18,8 @@ pub fn export_schema(schema: &RootSchema, out_dir: &Path) { write_schema(schema, out_dir, &title); } -// use this if you want to override the auto-detected name of the object. -// very useful when creating an alias for a type-alias. +/// Use this if you want to override the auto-detected name of the object. +/// very useful when creating an alias for a type-alias. pub fn export_schema_with_title(schema: &RootSchema, out_dir: &Path, title: &str) { let mut schema = schema.clone(); // set the title explicitly on the schema's metadata diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 709506dcaf..f56944691c 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -617,11 +617,11 @@ impl IbcBasicResponse { } } -// This defines the return value on packet response processing. -// This "success" case should be returned even in application-level errors, -// Where the acknowledgement bytes contain an encoded error message to be returned to -// the calling chain. (Returning ContractResult::Err will abort processing of this packet -// and not inform the calling chain). +/// This defines the return value on packet response processing. +/// This "success" case should be returned even in application-level errors, +/// Where the acknowledgement bytes contain an encoded error message to be returned to +/// the calling chain. (Returning ContractResult::Err will abort processing of this packet +/// and not inform the calling chain). #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[non_exhaustive] pub struct IbcReceiveResponse { diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index e0c732631f..d44d686da6 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -33,9 +33,9 @@ mod timestamp; mod traits; mod types; -// This modules is very advanced and will not be used directly by the vast majority of users. -// We want to offer it to ensure a stable storage key composition system but don't encourage -// contract devs to use it directly. +/// This modules is very advanced and will not be used directly by the vast majority of users. +/// We want to offer it to ensure a stable storage key composition system but don't encourage +/// contract devs to use it directly. pub mod storage_keys; pub use crate::addresses::{instantiate2_address, Addr, CanonicalAddr, Instantiate2AddressError}; @@ -111,8 +111,8 @@ pub use crate::exports::{ #[cfg(target_arch = "wasm32")] pub use crate::imports::{ExternalApi, ExternalQuerier, ExternalStorage}; -// Exposed for testing only -// Both unit tests and integration tests are compiled to native code, so everything in here does not need to compile to Wasm. +/// Exposed for testing only +/// Both unit tests and integration tests are compiled to native code, so everything in here does not need to compile to Wasm. #[cfg(not(target_arch = "wasm32"))] pub mod testing; diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 8aaa853101..2118e189d2 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -322,8 +322,8 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { self.query(&request) } - // this queries another wasm contract. You should know a priori the proper types for T and U - // (response and request) based on the contract API + /// Queries another wasm contract. You should know a priori the proper types for T and U + /// (response and request) based on the contract API pub fn query_wasm_smart( &self, contract_addr: impl Into, @@ -337,13 +337,14 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { self.query(&request) } - // this queries the raw storage from another wasm contract. - // you must know the exact layout and are implementation dependent - // (not tied to an interface like query_wasm_smart) - // that said, if you are building a few contracts together, this is a much cheaper approach - // - // Similar return value to Storage.get(). Returns Some(val) or None if the data is there. - // It only returns error on some runtime issue, not on any data cases. + /// Queries the raw storage from another wasm contract. + /// + /// You must know the exact layout and are implementation dependent + /// (not tied to an interface like query_wasm_smart). + /// That said, if you are building a few contracts together, this is a much cheaper approach + /// + /// Similar return value to [`Storage::get`]. Returns `Some(val)` or `None` if the data is there. + /// It only returns error on some runtime issue, not on any data cases. pub fn query_wasm_raw( &self, contract_addr: impl Into, diff --git a/packages/vm/src/testing/querier.rs b/packages/vm/src/testing/querier.rs index a578fca2b5..3f86e2d264 100644 --- a/packages/vm/src/testing/querier.rs +++ b/packages/vm/src/testing/querier.rs @@ -26,7 +26,7 @@ impl MockQuerier { } } - // set a new balance for the given address and return the old balance + /// Set a new balance for the given address and return the old balance pub fn update_balance( &mut self, addr: impl Into, From 98d24595b5227f438c28e9b2e8ef9e1b207af4ef Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 17 Aug 2023 17:16:36 +0200 Subject: [PATCH 0610/2372] Document order of Coins::{to_vec, into_vec} --- packages/std/src/coins.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index 44e72e1330..08171a1424 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -101,12 +101,18 @@ impl fmt::Display for Coins { } impl Coins { - /// Conversion to Vec, while NOT consuming the original object + /// Conversion to Vec, while NOT consuming the original object. + /// + /// This produces a vector of coins that is sorted alphabetically by denom with + /// no duplicate denoms. pub fn to_vec(&self) -> Vec { self.0.values().cloned().collect() } - /// Conversion to Vec, consuming the original object + /// Conversion to Vec, consuming the original object. + /// + /// This produces a vector of coins that is sorted alphabetically by denom with + /// no duplicate denoms. pub fn into_vec(self) -> Vec { self.0.into_values().collect() } From 60e669368db9105981c4b83b2b9fc17e9d8f7ed3 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 21 Aug 2023 15:22:53 +0200 Subject: [PATCH 0611/2372] Replace acronyms --- packages/go-gen/src/go.rs | 4 ++- packages/go-gen/src/main.rs | 19 +++++++++------ packages/go-gen/src/schema.rs | 7 ++++-- packages/go-gen/src/utils.rs | 46 +++++++++++++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 11 deletions(-) diff --git a/packages/go-gen/src/go.rs b/packages/go-gen/src/go.rs index 521a0cf399..5af5d3885a 100644 --- a/packages/go-gen/src/go.rs +++ b/packages/go-gen/src/go.rs @@ -3,6 +3,8 @@ use std::fmt::{self, Display, Write}; use indenter::indented; use inflector::Inflector; +use crate::utils::replace_acronyms; + pub struct GoStruct { pub name: String, pub docs: Option, @@ -44,7 +46,7 @@ impl Display for GoField { write!( f, "{} {} `json:\"{}", - self.rust_name.to_pascal_case(), + replace_acronyms(&self.rust_name.to_pascal_case()), self.ty, self.rust_name )?; diff --git a/packages/go-gen/src/main.rs b/packages/go-gen/src/main.rs index 7e034c5d5d..6a9fd3152e 100644 --- a/packages/go-gen/src/main.rs +++ b/packages/go-gen/src/main.rs @@ -4,6 +4,7 @@ use inflector::cases::pascalcase::to_pascal_case; use schema::{documentation, schema_object_type, SchemaExt, TypeContext}; use schemars::schema::{ObjectValidation, RootSchema, Schema, SchemaObject}; use std::fmt::Write; +use utils::replace_acronyms; mod go; mod schema; @@ -20,21 +21,23 @@ fn main() -> Result<()> { /// Generates the Go code for the given schema fn generate_go(root: RootSchema) -> Result { - let title = root - .schema - .metadata - .as_ref() - .and_then(|m| m.title.as_ref()) - .context("failed to get type name")?; + let title = replace_acronyms( + root.schema + .metadata + .as_ref() + .and_then(|m| m.title.as_ref()) + .context("failed to get type name")?, + ); + let mut types = vec![]; - build_type(title, &root.schema, &mut types) + build_type(&title, &root.schema, &mut types) .with_context(|| format!("failed to generate {title}"))?; // go through additional definitions for (name, additional_type) in &root.definitions { additional_type .object() - .map(|def| build_type(name, def, &mut types)) + .map(|def| build_type(&replace_acronyms(name), def, &mut types)) .and_then(|r| r) .context("failed to generate additional definitions")?; } diff --git a/packages/go-gen/src/schema.rs b/packages/go-gen/src/schema.rs index 52b00ca607..89aec8190f 100644 --- a/packages/go-gen/src/schema.rs +++ b/packages/go-gen/src/schema.rs @@ -5,7 +5,7 @@ use schemars::schema::{InstanceType, Schema, SchemaObject, SingleOrVec}; use crate::{ go::{GoField, GoStruct, GoType}, - utils::suffixes, + utils::{replace_acronyms, suffixes}, }; pub trait SchemaExt { @@ -155,7 +155,10 @@ pub fn type_from_instance_type( .rev() .find(|s| s.starts_with(char::is_uppercase)) .unwrap_or(type_context.struct_name); - let new_struct_name = format!("{}{suffix}", type_context.field.to_pascal_case()); + let new_struct_name = format!( + "{}{suffix}", + replace_acronyms(&type_context.field.to_pascal_case()) + ); let fields = schema .object diff --git a/packages/go-gen/src/utils.rs b/packages/go-gen/src/utils.rs index 1b5107a371..f7d24e6078 100644 --- a/packages/go-gen/src/utils.rs +++ b/packages/go-gen/src/utils.rs @@ -5,3 +5,49 @@ pub fn suffixes(s: &str) -> impl Iterator + DoubleEndedIterator { s.char_indices().map(|(pos, _)| &s[pos..]) } + +/// Replaces common pascal-case acronyms with their uppercase counterparts. +pub fn replace_acronyms(ty: &str) -> String { + let mut ty = ty.replace("Url", "URL"); + replace_in_place(&mut ty, "Uri", "URI"); + replace_in_place(&mut ty, "Id", "ID"); + replace_in_place(&mut ty, "Ibc", "IBC"); + ty +} + +pub fn replace_in_place(haystack: &mut String, from: &str, to: &str) { + assert_eq!(from.len(), to.len(), "from and to must be the same length"); + let mut start = 0; + while let Some(pos) = haystack[start..].find(from) { + let begin = start + pos; + let end = start + pos + from.len(); + haystack.replace_range(begin..end, to); + start = end; + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + #[should_panic = "from and to must be the same length"] + fn replace_in_place_different_lengths() { + let mut s = "foo".to_string(); + replace_in_place(&mut s, "foo", "barbar"); + } + + #[test] + fn replace_in_place_multiple_works() { + let mut s = "foofoofoofoofoo".to_string(); + replace_in_place(&mut s, "foo", "bar"); + assert_eq!(s, "barbarbarbarbar"); + } + + #[test] + fn replace_in_place_single_works() { + let mut s = "foo".to_string(); + replace_in_place(&mut s, "foo", "bar"); + assert_eq!(s, "bar"); + } +} From 8dbbad3442724ea2e551111e43df6766ae8ce368 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 21 Aug 2023 15:55:27 +0200 Subject: [PATCH 0612/2372] Add test cases for all responses and queries --- packages/go-gen/src/main.rs | 105 +++++++++--------- .../tests/cosmwasm_std__AllBalanceResponse.go | 10 ++ .../cosmwasm_std__AllDelegationsResponse.go | 16 +++ .../cosmwasm_std__AllDenomMetadataResponse.go | 51 +++++++++ .../cosmwasm_std__AllValidatorsResponse.go | 14 +++ .../tests/cosmwasm_std__BalanceResponse.go | 10 ++ .../go-gen/tests/cosmwasm_std__BankQuery.go | 43 +++++++ .../cosmwasm_std__BondedDenomResponse.go | 3 + .../tests/cosmwasm_std__CodeInfoResponse.go | 5 + .../cosmwasm_std__ContractInfoResponse.go | 9 ++ .../tests/cosmwasm_std__DelegationResponse.go | 18 +++ ...m_std__DelegatorWithdrawAddressResponse.go | 3 + .../cosmwasm_std__DenomMetadataResponse.go | 47 ++++++++ .../tests/cosmwasm_std__DistributionQuery.go | 8 ++ .../go-gen/tests/cosmwasm_std__IbcQuery.go | 25 +++++ .../tests/cosmwasm_std__StakingQuery.go | 27 +++++ .../tests/cosmwasm_std__SupplyResponse.go | 10 ++ .../tests/cosmwasm_std__ValidatorResponse.go | 14 +++ .../go-gen/tests/cosmwasm_std__WasmQuery.go | 30 +++++ 19 files changed, 397 insertions(+), 51 deletions(-) create mode 100644 packages/go-gen/tests/cosmwasm_std__AllBalanceResponse.go create mode 100644 packages/go-gen/tests/cosmwasm_std__AllDelegationsResponse.go create mode 100644 packages/go-gen/tests/cosmwasm_std__AllDenomMetadataResponse.go create mode 100644 packages/go-gen/tests/cosmwasm_std__AllValidatorsResponse.go create mode 100644 packages/go-gen/tests/cosmwasm_std__BalanceResponse.go create mode 100644 packages/go-gen/tests/cosmwasm_std__BankQuery.go create mode 100644 packages/go-gen/tests/cosmwasm_std__BondedDenomResponse.go create mode 100644 packages/go-gen/tests/cosmwasm_std__CodeInfoResponse.go create mode 100644 packages/go-gen/tests/cosmwasm_std__ContractInfoResponse.go create mode 100644 packages/go-gen/tests/cosmwasm_std__DelegationResponse.go create mode 100644 packages/go-gen/tests/cosmwasm_std__DelegatorWithdrawAddressResponse.go create mode 100644 packages/go-gen/tests/cosmwasm_std__DenomMetadataResponse.go create mode 100644 packages/go-gen/tests/cosmwasm_std__DistributionQuery.go create mode 100644 packages/go-gen/tests/cosmwasm_std__IbcQuery.go create mode 100644 packages/go-gen/tests/cosmwasm_std__StakingQuery.go create mode 100644 packages/go-gen/tests/cosmwasm_std__SupplyResponse.go create mode 100644 packages/go-gen/tests/cosmwasm_std__ValidatorResponse.go create mode 100644 packages/go-gen/tests/cosmwasm_std__WasmQuery.go diff --git a/packages/go-gen/src/main.rs b/packages/go-gen/src/main.rs index 6a9fd3152e..7688db1878 100644 --- a/packages/go-gen/src/main.rs +++ b/packages/go-gen/src/main.rs @@ -214,6 +214,26 @@ mod tests { ); } + fn assert_code_eq_ignore_docs(actual: String, expected: &str) { + let actual_filtered = actual + .lines() + .map(|line| line.split("//").next().unwrap()) // ignore comments + .flat_map(|line| line.split_whitespace()) + .collect::>(); + let expected_filtered = expected + .lines() + .map(|line| line.split("//").next().unwrap()) // ignore comments + .flat_map(|line| line.split_whitespace()) + .collect::>(); + + assert!( + actual_filtered == expected_filtered, + "assertion failed: `(actual == expected)`\nactual:\n`{}`,\nexpected:\n`\"{}\"`", + actual, + expected + ); + } + #[test] fn special_types() { #[cw_serde] @@ -303,55 +323,38 @@ mod tests { assert_code_eq(code, "type Empty struct { }"); } + /// Compares the generated code for a given type with the code in the corresponding file in + /// `tests/`. + /// The file name is derived from the type name by replacing `::` with `__` and adding `.go`. + macro_rules! compare_codes { + ($name:ty) => {{ + let filename = stringify!($name).replace("::", "__"); + let generated = generate_go(cosmwasm_schema::schema_for!($name)).unwrap(); + let expected = std::fs::read_to_string(format!("tests/{}.go", filename)).unwrap(); + + assert_code_eq_ignore_docs(generated, &expected); + }}; + } + #[test] fn responses_work() { // bank - generate_go(cosmwasm_schema::schema_for!(cosmwasm_std::SupplyResponse)).unwrap(); - generate_go(cosmwasm_schema::schema_for!(cosmwasm_std::BalanceResponse)).unwrap(); - generate_go(cosmwasm_schema::schema_for!( - cosmwasm_std::AllBalanceResponse - )) - .unwrap(); - generate_go(cosmwasm_schema::schema_for!( - cosmwasm_std::DenomMetadataResponse - )) - .unwrap(); - generate_go(cosmwasm_schema::schema_for!( - cosmwasm_std::AllDenomMetadataResponse - )) - .unwrap(); + compare_codes!(cosmwasm_std::SupplyResponse); + compare_codes!(cosmwasm_std::BalanceResponse); + // compare_codes!(cosmwasm_std::AllBalanceResponse); // has different name in wasmvm + compare_codes!(cosmwasm_std::DenomMetadataResponse); + // compare_codes!(cosmwasm_std::AllDenomMetadataResponse); // uses `[]byte` instead of `*[]byte` // staking - generate_go(cosmwasm_schema::schema_for!( - cosmwasm_std::BondedDenomResponse - )) - .unwrap(); - generate_go(cosmwasm_schema::schema_for!( - cosmwasm_std::AllDelegationsResponse - )) - .unwrap(); - generate_go(cosmwasm_schema::schema_for!( - cosmwasm_std::DelegationResponse - )) - .unwrap(); - generate_go(cosmwasm_schema::schema_for!( - cosmwasm_std::AllValidatorsResponse - )) - .unwrap(); - generate_go(cosmwasm_schema::schema_for!( - cosmwasm_std::ValidatorResponse - )) - .unwrap(); + compare_codes!(cosmwasm_std::BondedDenomResponse); + compare_codes!(cosmwasm_std::AllDelegationsResponse); + compare_codes!(cosmwasm_std::DelegationResponse); + compare_codes!(cosmwasm_std::AllValidatorsResponse); + // compare_codes!(cosmwasm_std::ValidatorResponse); // does not use "omitempty" for `Validator` field // distribution - generate_go(cosmwasm_schema::schema_for!( - cosmwasm_std::DelegatorWithdrawAddressResponse - )) - .unwrap(); + compare_codes!(cosmwasm_std::DelegatorWithdrawAddressResponse); // wasm - generate_go(cosmwasm_schema::schema_for!( - cosmwasm_std::ContractInfoResponse - )) - .unwrap(); - generate_go(cosmwasm_schema::schema_for!(cosmwasm_std::CodeInfoResponse)).unwrap(); + compare_codes!(cosmwasm_std::ContractInfoResponse); + // compare_codes!(cosmwasm_std::CodeInfoResponse); // TODO: Checksum type and "omitempty" } #[test] @@ -411,18 +414,18 @@ mod tests { #[test] fn queries_work() { + // compare_codes!(cosmwasm_std::QueryRequest); // omit for now because it's huge + // just assert that it compiles generate_go(cosmwasm_schema::schema_for!( cosmwasm_std::QueryRequest )) .unwrap(); - generate_go(cosmwasm_schema::schema_for!(cosmwasm_std::BankQuery)).unwrap(); - generate_go(cosmwasm_schema::schema_for!(cosmwasm_std::StakingQuery)).unwrap(); - generate_go(cosmwasm_schema::schema_for!( - cosmwasm_std::DistributionQuery - )) - .unwrap(); - generate_go(cosmwasm_schema::schema_for!(cosmwasm_std::IbcQuery)).unwrap(); - generate_go(cosmwasm_schema::schema_for!(cosmwasm_std::WasmQuery)).unwrap(); + // TODO: PageRequest.Key uses "omitempty" and no * + // compare_codes!(cosmwasm_std::BankQuery); + compare_codes!(cosmwasm_std::StakingQuery); + compare_codes!(cosmwasm_std::DistributionQuery); + compare_codes!(cosmwasm_std::IbcQuery); + compare_codes!(cosmwasm_std::WasmQuery); } #[test] diff --git a/packages/go-gen/tests/cosmwasm_std__AllBalanceResponse.go b/packages/go-gen/tests/cosmwasm_std__AllBalanceResponse.go new file mode 100644 index 0000000000..8d1ea81369 --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__AllBalanceResponse.go @@ -0,0 +1,10 @@ +// AllBalancesResponse is the expected response to AllBalancesQuery +type AllBalancesResponse struct { + Amount []Coin `json:"amount"` // in wasmvm, there is an alias for `[]Coin` +} + +// Coin is a string representation of the sdk.Coin type (more portable than sdk.Int) +type Coin struct { + Amount string `json:"amount"` // string encoing of decimal value, eg. "12.3456" + Denom string `json:"denom"` // type, eg. "ATOM" +} diff --git a/packages/go-gen/tests/cosmwasm_std__AllDelegationsResponse.go b/packages/go-gen/tests/cosmwasm_std__AllDelegationsResponse.go new file mode 100644 index 0000000000..ccebdbcd34 --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__AllDelegationsResponse.go @@ -0,0 +1,16 @@ +// AllDelegationsResponse is the expected response to AllDelegationsQuery +type AllDelegationsResponse struct { + Delegations []Delegation `json:"delegations"` // in wasmvm, there is an alias for `[]Delegation` +} + +// Coin is a string representation of the sdk.Coin type (more portable than sdk.Int) +type Coin struct { + Amount string `json:"amount"` // string encoing of decimal value, eg. "12.3456" + Denom string `json:"denom"` // type, eg. "ATOM" +} + +type Delegation struct { + Amount Coin `json:"amount"` + Delegator string `json:"delegator"` + Validator string `json:"validator"` +} diff --git a/packages/go-gen/tests/cosmwasm_std__AllDenomMetadataResponse.go b/packages/go-gen/tests/cosmwasm_std__AllDenomMetadataResponse.go new file mode 100644 index 0000000000..c9a6f0798c --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__AllDenomMetadataResponse.go @@ -0,0 +1,51 @@ +type AllDenomMetadataResponse struct { + Metadata []DenomMetadata `json:"metadata"` + // NextKey is the key to be passed to PageRequest.key to + // query the next page most efficiently. It will be empty if + // there are no more results. + NextKey []byte `json:"next_key,omitempty"` +} + +// Replicating the cosmos-sdk bank module Metadata type +type DenomMetadata struct { + // Base represents the base denom (should be the DenomUnit with exponent = 0). + Base string `json:"base"` + // DenomUnits represents the list of DenomUnits for a given coin + DenomUnits []DenomUnit `json:"denom_units"` + Description string `json:"description"` + // Display indicates the suggested denom that should be + // displayed in clients. + Display string `json:"display"` + // Name defines the name of the token (eg: Cosmos Atom) + // + // Since: cosmos-sdk 0.43 + Name string `json:"name"` + // Symbol is the token symbol usually shown on exchanges (eg: ATOM). This can + // be the same as the display. + // + // Since: cosmos-sdk 0.43 + Symbol string `json:"symbol"` + // URI to a document (on or off-chain) that contains additional information. Optional. + // + // Since: cosmos-sdk 0.46 + URI string `json:"uri"` + // URIHash is a sha256 hash of a document pointed by URI. It's used to verify that + // the document didn't change. Optional. + // + // Since: cosmos-sdk 0.46 + URIHash string `json:"uri_hash"` +} + +// Replicating the cosmos-sdk bank module DenomUnit type +type DenomUnit struct { + // Aliases is a list of string aliases for the given denom + Aliases []string `json:"aliases"` + // Denom represents the string name of the given denom unit (e.g uatom). + Denom string `json:"denom"` + // Exponent represents power of 10 exponent that one must + // raise the base_denom to in order to equal the given DenomUnit's denom + // 1 denom = 10^exponent base_denom + // (e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with + // exponent = 6, thus: 1 atom = 10^6 uatom). + Exponent uint32 `json:"exponent"` +} \ No newline at end of file diff --git a/packages/go-gen/tests/cosmwasm_std__AllValidatorsResponse.go b/packages/go-gen/tests/cosmwasm_std__AllValidatorsResponse.go new file mode 100644 index 0000000000..9280eda055 --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__AllValidatorsResponse.go @@ -0,0 +1,14 @@ +// AllValidatorsResponse is the expected response to AllValidatorsQuery +type AllValidatorsResponse struct { + Validators []Validator `json:"validators"` // in wasmvm, there is an alias for `[]Validator` +} + +type Validator struct { + Address string `json:"address"` + // decimal string, eg "0.02" + Commission string `json:"commission"` + // decimal string, eg "0.02" + MaxChangeRate string `json:"max_change_rate"` + // decimal string, eg "0.02" + MaxCommission string `json:"max_commission"` +} \ No newline at end of file diff --git a/packages/go-gen/tests/cosmwasm_std__BalanceResponse.go b/packages/go-gen/tests/cosmwasm_std__BalanceResponse.go new file mode 100644 index 0000000000..a8735fd00f --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__BalanceResponse.go @@ -0,0 +1,10 @@ +// BalanceResponse is the expected response to BalanceQuery +type BalanceResponse struct { + Amount Coin `json:"amount"` +} + +// Coin is a string representation of the sdk.Coin type (more portable than sdk.Int) +type Coin struct { + Amount string `json:"amount"` // string encoing of decimal value, eg. "12.3456" + Denom string `json:"denom"` // type, eg. "ATOM" +} diff --git a/packages/go-gen/tests/cosmwasm_std__BankQuery.go b/packages/go-gen/tests/cosmwasm_std__BankQuery.go new file mode 100644 index 0000000000..ef7729af81 --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__BankQuery.go @@ -0,0 +1,43 @@ +type SupplyQuery struct { + Denom string `json:"denom"` +} + +type BalanceQuery struct { + Address string `json:"address"` + Denom string `json:"denom"` +} + +type AllBalancesQuery struct { + Address string `json:"address"` +} + +type DenomMetadataQuery struct { + Denom string `json:"denom"` +} + +type AllDenomMetadataQuery struct { + // Pagination is an optional argument. + // Default pagination will be used if this is omitted + Pagination *PageRequest `json:"pagination,omitempty"` +} + +type BankQuery struct { + Supply *SupplyQuery `json:"supply,omitempty"` + Balance *BalanceQuery `json:"balance,omitempty"` + AllBalances *AllBalancesQuery `json:"all_balances,omitempty"` + DenomMetadata *DenomMetadataQuery `json:"denom_metadata,omitempty"` + AllDenomMetadata *AllDenomMetadataQuery `json:"all_denom_metadata,omitempty"` +} + +// Simplified version of the cosmos-sdk PageRequest type +type PageRequest struct { + // Key is a value returned in PageResponse.next_key to begin + // querying the next page most efficiently. Only one of offset or key + // should be set. + Key []byte `json:"key"` + // Limit is the total number of results to be returned in the result page. + // If left empty it will default to a value to be set by each app. + Limit uint32 `json:"limit"` + // Reverse is set to true if results are to be returned in the descending order. + Reverse bool `json:"reverse"` +} \ No newline at end of file diff --git a/packages/go-gen/tests/cosmwasm_std__BondedDenomResponse.go b/packages/go-gen/tests/cosmwasm_std__BondedDenomResponse.go new file mode 100644 index 0000000000..cb16d22737 --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__BondedDenomResponse.go @@ -0,0 +1,3 @@ +type BondedDenomResponse struct { + Denom string `json:"denom"` +} \ No newline at end of file diff --git a/packages/go-gen/tests/cosmwasm_std__CodeInfoResponse.go b/packages/go-gen/tests/cosmwasm_std__CodeInfoResponse.go new file mode 100644 index 0000000000..1173e9e7f9 --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__CodeInfoResponse.go @@ -0,0 +1,5 @@ +type CodeInfoResponse struct { + Checksum Checksum `json:"checksum,omitempty"` + CodeID uint64 `json:"code_id"` + Creator string `json:"creator"` +} diff --git a/packages/go-gen/tests/cosmwasm_std__ContractInfoResponse.go b/packages/go-gen/tests/cosmwasm_std__ContractInfoResponse.go new file mode 100644 index 0000000000..55ae866f55 --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__ContractInfoResponse.go @@ -0,0 +1,9 @@ +type ContractInfoResponse struct { + // Set to the admin who can migrate contract, if any + Admin string `json:"admin,omitempty"` + CodeID uint64 `json:"code_id"` + Creator string `json:"creator"` + // Set if the contract is IBC enabled + IBCPort string `json:"ibc_port,omitempty"` + Pinned bool `json:"pinned"` +} \ No newline at end of file diff --git a/packages/go-gen/tests/cosmwasm_std__DelegationResponse.go b/packages/go-gen/tests/cosmwasm_std__DelegationResponse.go new file mode 100644 index 0000000000..9dcac82dfa --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__DelegationResponse.go @@ -0,0 +1,18 @@ +// DelegationResponse is the expected response to DelegationsQuery +type DelegationResponse struct { + Delegation *FullDelegation `json:"delegation,omitempty"` +} + +// Coin is a string representation of the sdk.Coin type (more portable than sdk.Int) +type Coin struct { + Amount string `json:"amount"` // string encoing of decimal value, eg. "12.3456" + Denom string `json:"denom"` // type, eg. "ATOM" +} + +type FullDelegation struct { + AccumulatedRewards []Coin `json:"accumulated_rewards"` // in wasmvm, there is an alias for `[]Coin` + Amount Coin `json:"amount"` + CanRedelegate Coin `json:"can_redelegate"` + Delegator string `json:"delegator"` + Validator string `json:"validator"` +} \ No newline at end of file diff --git a/packages/go-gen/tests/cosmwasm_std__DelegatorWithdrawAddressResponse.go b/packages/go-gen/tests/cosmwasm_std__DelegatorWithdrawAddressResponse.go new file mode 100644 index 0000000000..0e46ed30e6 --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__DelegatorWithdrawAddressResponse.go @@ -0,0 +1,3 @@ +type DelegatorWithdrawAddressResponse struct { + WithdrawAddress string `json:"withdraw_address"` +} diff --git a/packages/go-gen/tests/cosmwasm_std__DenomMetadataResponse.go b/packages/go-gen/tests/cosmwasm_std__DenomMetadataResponse.go new file mode 100644 index 0000000000..a75ddaf21c --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__DenomMetadataResponse.go @@ -0,0 +1,47 @@ +type DenomMetadataResponse struct { + Metadata DenomMetadata `json:"metadata"` +} + +// Replicating the cosmos-sdk bank module Metadata type +type DenomMetadata struct { + // Base represents the base denom (should be the DenomUnit with exponent = 0). + Base string `json:"base"` + // DenomUnits represents the list of DenomUnits for a given coin + DenomUnits []DenomUnit `json:"denom_units"` + Description string `json:"description"` + // Display indicates the suggested denom that should be + // displayed in clients. + Display string `json:"display"` + // Name defines the name of the token (eg: Cosmos Atom) + // + // Since: cosmos-sdk 0.43 + Name string `json:"name"` + // Symbol is the token symbol usually shown on exchanges (eg: ATOM). This can + // be the same as the display. + // + // Since: cosmos-sdk 0.43 + Symbol string `json:"symbol"` + // URI to a document (on or off-chain) that contains additional information. Optional. + // + // Since: cosmos-sdk 0.46 + URI string `json:"uri"` + // URIHash is a sha256 hash of a document pointed by URI. It's used to verify that + // the document didn't change. Optional. + // + // Since: cosmos-sdk 0.46 + URIHash string `json:"uri_hash"` +} + +// Replicating the cosmos-sdk bank module DenomUnit type +type DenomUnit struct { + // Aliases is a list of string aliases for the given denom + Aliases []string `json:"aliases"` + // Denom represents the string name of the given denom unit (e.g uatom). + Denom string `json:"denom"` + // Exponent represents power of 10 exponent that one must + // raise the base_denom to in order to equal the given DenomUnit's denom + // 1 denom = 10^exponent base_denom + // (e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with + // exponent = 6, thus: 1 atom = 10^6 uatom). + Exponent uint32 `json:"exponent"` +} \ No newline at end of file diff --git a/packages/go-gen/tests/cosmwasm_std__DistributionQuery.go b/packages/go-gen/tests/cosmwasm_std__DistributionQuery.go new file mode 100644 index 0000000000..79b541a7a1 --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__DistributionQuery.go @@ -0,0 +1,8 @@ + +type DelegatorWithdrawAddressQuery struct { + DelegatorAddress string `json:"delegator_address"` +} + +type DistributionQuery struct { + DelegatorWithdrawAddress *DelegatorWithdrawAddressQuery `json:"delegator_withdraw_address,omitempty"` +} \ No newline at end of file diff --git a/packages/go-gen/tests/cosmwasm_std__IbcQuery.go b/packages/go-gen/tests/cosmwasm_std__IbcQuery.go new file mode 100644 index 0000000000..0bf4e30faa --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__IbcQuery.go @@ -0,0 +1,25 @@ +type PortIDQuery struct { +} + +// ListChannelsQuery is an IBCQuery that lists all channels that are bound to a given port. +// If `PortID` is unset, this list all channels bound to the contract's port. +// Returns a `ListChannelsResponse`. +// This is the counterpart of [IbcQuery::ListChannels](https://github.com/CosmWasm/cosmwasm/blob/v0.14.0-beta1/packages/std/src/ibc.rs#L70-L73). +type ListChannelsQuery struct { + // optional argument + PortID string `json:"port_id,omitempty"` +} + +type ChannelQuery struct { + ChannelID string `json:"channel_id"` + // optional argument + PortID string `json:"port_id,omitempty"` +} + +// IBCQuery defines a query request from the contract into the chain. +// This is the counterpart of [IbcQuery](https://github.com/CosmWasm/cosmwasm/blob/v0.14.0-beta1/packages/std/src/ibc.rs#L61-L83). +type IBCQuery struct { + PortID *PortIDQuery `json:"port_id,omitempty"` + ListChannels *ListChannelsQuery `json:"list_channels,omitempty"` + Channel *ChannelQuery `json:"channel,omitempty"` +} diff --git a/packages/go-gen/tests/cosmwasm_std__StakingQuery.go b/packages/go-gen/tests/cosmwasm_std__StakingQuery.go new file mode 100644 index 0000000000..a9667033f9 --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__StakingQuery.go @@ -0,0 +1,27 @@ +type BondedDenomQuery struct { // does not exist in wasmvm, but is an anonymous struct instead +} + +type AllDelegationsQuery struct { + Delegator string `json:"delegator"` +} + +type DelegationQuery struct { + Delegator string `json:"delegator"` + Validator string `json:"validator"` +} + +type AllValidatorsQuery struct { +} + +type ValidatorQuery struct { + /// Address is the validator's address (e.g. cosmosvaloper1...) + Address string `json:"address"` +} + +type StakingQuery struct { + BondedDenom *BondedDenomQuery `json:"bonded_denom,omitempty"` + AllDelegations *AllDelegationsQuery `json:"all_delegations,omitempty"` + Delegation *DelegationQuery `json:"delegation,omitempty"` + AllValidators *AllValidatorsQuery `json:"all_validators,omitempty"` + Validator *ValidatorQuery `json:"validator,omitempty"` +} \ No newline at end of file diff --git a/packages/go-gen/tests/cosmwasm_std__SupplyResponse.go b/packages/go-gen/tests/cosmwasm_std__SupplyResponse.go new file mode 100644 index 0000000000..c87e3dc2be --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__SupplyResponse.go @@ -0,0 +1,10 @@ +// SupplyResponse is the expected response to SupplyQuery +type SupplyResponse struct { + Amount Coin `json:"amount"` +} + +// Coin is a string representation of the sdk.Coin type (more portable than sdk.Int) +type Coin struct { + Amount string `json:"amount"` // string encoing of decimal value, eg. "12.3456" + Denom string `json:"denom"` // type, eg. "ATOM" +} \ No newline at end of file diff --git a/packages/go-gen/tests/cosmwasm_std__ValidatorResponse.go b/packages/go-gen/tests/cosmwasm_std__ValidatorResponse.go new file mode 100644 index 0000000000..21c24134ec --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__ValidatorResponse.go @@ -0,0 +1,14 @@ +// ValidatorResponse is the expected response to ValidatorQuery +type ValidatorResponse struct { + Validator *Validator `json:"validator"` // serializes to `null` when unset which matches Rust's Option::None serialization +} + +type Validator struct { + Address string `json:"address"` + // decimal string, eg "0.02" + Commission string `json:"commission"` + // decimal string, eg "0.02" + MaxChangeRate string `json:"max_change_rate"` + // decimal string, eg "0.02" + MaxCommission string `json:"max_commission"` +} diff --git a/packages/go-gen/tests/cosmwasm_std__WasmQuery.go b/packages/go-gen/tests/cosmwasm_std__WasmQuery.go new file mode 100644 index 0000000000..84f3f453c1 --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__WasmQuery.go @@ -0,0 +1,30 @@ + +// SmartQuery response is raw bytes ([]byte) +type SmartQuery struct { + // Bech32 encoded sdk.AccAddress of the contract + ContractAddr string `json:"contract_addr"` + Msg []byte `json:"msg"` +} + +// RawQuery response is raw bytes ([]byte) +type RawQuery struct { + // Bech32 encoded sdk.AccAddress of the contract + ContractAddr string `json:"contract_addr"` + Key []byte `json:"key"` +} + +type ContractInfoQuery struct { + // Bech32 encoded sdk.AccAddress of the contract + ContractAddr string `json:"contract_addr"` +} + +type CodeInfoQuery struct { + CodeID uint64 `json:"code_id"` +} + +type WasmQuery struct { + Smart *SmartQuery `json:"smart,omitempty"` + Raw *RawQuery `json:"raw,omitempty"` + ContractInfo *ContractInfoQuery `json:"contract_info,omitempty"` + CodeInfo *CodeInfoQuery `json:"code_info,omitempty"` +} \ No newline at end of file From 9cc403017097b39bbf495f5cb5f0a78541afafc0 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 21 Aug 2023 16:07:38 +0200 Subject: [PATCH 0613/2372] Constify Decimal/Decimal256 constructors --- CHANGELOG.md | 1 + packages/std/src/math/decimal.rs | 50 +++++++++++++++++++++++++---- packages/std/src/math/decimal256.rs | 50 +++++++++++++++++++++++++---- 3 files changed, 89 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b43d3d4477..41f6a61e2f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ and this project adheres to - cosmwasm-check: Update clap dependency to version 4 ([#1677]) - cosmwasm-vm: Use `wasmparser` for initial validation instead of `parity-wasm` ([#1786]) +- cosmwasm-std: Make constructors `Decimal{,256}::{percent,permille,bps}` const [#1667]: https://github.com/CosmWasm/cosmwasm/pull/1667 [#1674]: https://github.com/CosmWasm/cosmwasm/pull/1674 diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index cf3f749176..4ac1b402e4 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -67,18 +67,56 @@ impl Decimal { } /// Convert x% into Decimal - pub fn percent(x: u64) -> Self { - Self(((x as u128) * 10_000_000_000_000_000).into()) + /// + /// ## Examples + /// + /// ``` + /// # use std::str::FromStr; + /// # use cosmwasm_std::Decimal; + /// const HALF: Decimal = Decimal::percent(50); + /// + /// assert_eq!(HALF, Decimal::from_str("0.5").unwrap()); + /// ``` + pub const fn percent(x: u64) -> Self { + // multiplication does not overflow since `u64::MAX` * 10**16 is well in u128 range + let atomics = (x as u128) * 10_000_000_000_000_000; + Self(Uint128::new(atomics)) } /// Convert permille (x/1000) into Decimal - pub fn permille(x: u64) -> Self { - Self(((x as u128) * 1_000_000_000_000_000).into()) + /// + /// ## Examples + /// + /// ``` + /// # use std::str::FromStr; + /// # use cosmwasm_std::Decimal; + /// const HALF: Decimal = Decimal::permille(500); + /// + /// assert_eq!(HALF, Decimal::from_str("0.5").unwrap()); + /// ``` + pub const fn permille(x: u64) -> Self { + // multiplication does not overflow since `u64::MAX` * 10**15 is well in u128 range + let atomics = (x as u128) * 1_000_000_000_000_000; + Self(Uint128::new(atomics)) } /// Convert basis points (x/10000) into Decimal - pub fn bps(x: u64) -> Self { - Self(((x as u128) * 100_000_000_000_000).into()) + /// + /// ## Examples + /// + /// ``` + /// # use std::str::FromStr; + /// # use cosmwasm_std::Decimal; + /// const TWO_BPS: Decimal = Decimal::bps(2); + /// const HALF: Decimal = Decimal::bps(5000); + /// + /// assert_eq!(TWO_BPS, Decimal::from_str("0.0002").unwrap()); + /// assert_eq!(HALF, Decimal::from_str("0.5").unwrap()); + /// ``` + pub const fn bps(x: u64) -> Self { + // multiplication does not overflow since `u64::MAX` * 10**14 is well in u128 range + let atomics = (x as u128) * 100_000_000_000_000; + Self(Uint128::new(atomics)) } /// Creates a decimal from a number of atomic units and the number diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index e9341ff47c..bff4ecd157 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -76,18 +76,56 @@ impl Decimal256 { } /// Convert x% into Decimal256 - pub fn percent(x: u64) -> Self { - Self(Uint256::from(x) * Uint256::from(10_000_000_000_000_000u128)) + /// + /// ## Examples + /// + /// ``` + /// # use std::str::FromStr; + /// # use cosmwasm_std::Decimal256; + /// const HALF: Decimal256 = Decimal256::percent(50); + /// + /// assert_eq!(HALF, Decimal256::from_str("0.5").unwrap()); + /// ``` + pub const fn percent(x: u64) -> Self { + // multiplication does not overflow since `u64::MAX` * 10**16 is well in u128 range + let atomics = (x as u128) * 10_000_000_000_000_000; + Self(Uint256::from_u128(atomics)) } /// Convert permille (x/1000) into Decimal256 - pub fn permille(x: u64) -> Self { - Self(Uint256::from(x) * Uint256::from(1_000_000_000_000_000u128)) + /// + /// ## Examples + /// + /// ``` + /// # use std::str::FromStr; + /// # use cosmwasm_std::Decimal256; + /// const HALF: Decimal256 = Decimal256::permille(500); + /// + /// assert_eq!(HALF, Decimal256::from_str("0.5").unwrap()); + /// ``` + pub const fn permille(x: u64) -> Self { + // multiplication does not overflow since `u64::MAX` * 10**15 is well in u128 range + let atomics = (x as u128) * 1_000_000_000_000_000; + Self(Uint256::from_u128(atomics)) } /// Convert basis points (x/10000) into Decimal256 - pub fn bps(x: u64) -> Self { - Self(Uint256::from(x) * Uint256::from(100_000_000_000_000u128)) + /// + /// ## Examples + /// + /// ``` + /// # use std::str::FromStr; + /// # use cosmwasm_std::Decimal256; + /// const TWO_BPS: Decimal256 = Decimal256::bps(2); + /// const HALF: Decimal256 = Decimal256::bps(5000); + /// + /// assert_eq!(TWO_BPS, Decimal256::from_str("0.0002").unwrap()); + /// assert_eq!(HALF, Decimal256::from_str("0.5").unwrap()); + /// ``` + pub const fn bps(x: u64) -> Self { + // multiplication does not overflow since `u64::MAX` * 10**14 is well in u128 range + let atomics = (x as u128) * 100_000_000_000_000; + Self(Uint256::from_u128(atomics)) } /// Creates a decimal from a number of atomic units and the number From 550416f3e7b60735dee01126c12f49123879712a Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 22 Aug 2023 09:50:53 +0200 Subject: [PATCH 0614/2372] Remove extra brackets --- packages/std/src/math/decimal.rs | 2 +- packages/std/src/math/decimal256.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 4ac1b402e4..108b76b2e2 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -146,7 +146,7 @@ impl Decimal { ) -> Result { let atomics = atomics.into(); const TEN: Uint128 = Uint128::new(10); - Ok(match decimal_places.cmp(&(Self::DECIMAL_PLACES)) { + Ok(match decimal_places.cmp(&Self::DECIMAL_PLACES) { Ordering::Less => { let digits = (Self::DECIMAL_PLACES) - decimal_places; // No overflow because decimal_places < DECIMAL_PLACES let factor = TEN.checked_pow(digits).unwrap(); // Safe because digits <= 17 diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index bff4ecd157..1174df112b 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -158,7 +158,7 @@ impl Decimal256 { ) -> Result { let atomics = atomics.into(); let ten = Uint256::from(10u64); // TODO: make const - Ok(match decimal_places.cmp(&(Self::DECIMAL_PLACES)) { + Ok(match decimal_places.cmp(&Self::DECIMAL_PLACES) { Ordering::Less => { let digits = (Self::DECIMAL_PLACES) - decimal_places; // No overflow because decimal_places < DECIMAL_PLACES let factor = ten.checked_pow(digits).unwrap(); // Safe because digits <= 17 From 928f70b1d52fff0f9352c16b8b5dba2a04786e73 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 22 Aug 2023 09:51:12 +0200 Subject: [PATCH 0615/2372] Make ten constant const --- packages/std/src/math/decimal256.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 1174df112b..f3fea968cd 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -157,11 +157,14 @@ impl Decimal256 { decimal_places: u32, ) -> Result { let atomics = atomics.into(); - let ten = Uint256::from(10u64); // TODO: make const + const TEN: Uint256 = Uint256::from_be_bytes([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, + ]); Ok(match decimal_places.cmp(&Self::DECIMAL_PLACES) { Ordering::Less => { let digits = (Self::DECIMAL_PLACES) - decimal_places; // No overflow because decimal_places < DECIMAL_PLACES - let factor = ten.checked_pow(digits).unwrap(); // Safe because digits <= 17 + let factor = TEN.checked_pow(digits).unwrap(); // Safe because digits <= 17 Self( atomics .checked_mul(factor) @@ -171,7 +174,7 @@ impl Decimal256 { Ordering::Equal => Self(atomics), Ordering::Greater => { let digits = decimal_places - (Self::DECIMAL_PLACES); // No overflow because decimal_places > DECIMAL_PLACES - if let Ok(factor) = ten.checked_pow(digits) { + if let Ok(factor) = TEN.checked_pow(digits) { Self(atomics.checked_div(factor).unwrap()) // Safe because factor cannot be zero } else { // In this case `factor` exceeds the Uint256 range. From 3e01c3bbb7a073641cfc117fb6a3f4267189b2ea Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 22 Aug 2023 09:56:28 +0200 Subject: [PATCH 0616/2372] Add missing newline --- packages/go-gen/tests/cosmwasm_std__AllDenomMetadataResponse.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/go-gen/tests/cosmwasm_std__AllDenomMetadataResponse.go b/packages/go-gen/tests/cosmwasm_std__AllDenomMetadataResponse.go index c9a6f0798c..d61cf12f3f 100644 --- a/packages/go-gen/tests/cosmwasm_std__AllDenomMetadataResponse.go +++ b/packages/go-gen/tests/cosmwasm_std__AllDenomMetadataResponse.go @@ -48,4 +48,4 @@ type DenomUnit struct { // (e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with // exponent = 6, thus: 1 atom = 10^6 uatom). Exponent uint32 `json:"exponent"` -} \ No newline at end of file +} From 6877bb3627f5e58230e1c84541e28f0d5f9eef45 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 22 Aug 2023 10:48:23 +0200 Subject: [PATCH 0617/2372] Fix acronym replacement --- packages/go-gen/src/go.rs | 2 +- packages/go-gen/src/schema.rs | 2 +- packages/go-gen/src/utils.rs | 49 +++++++++++++++++++++++++++-------- 3 files changed, 40 insertions(+), 13 deletions(-) diff --git a/packages/go-gen/src/go.rs b/packages/go-gen/src/go.rs index 5af5d3885a..faead10df9 100644 --- a/packages/go-gen/src/go.rs +++ b/packages/go-gen/src/go.rs @@ -46,7 +46,7 @@ impl Display for GoField { write!( f, "{} {} `json:\"{}", - replace_acronyms(&self.rust_name.to_pascal_case()), + replace_acronyms(self.rust_name.to_pascal_case()), self.ty, self.rust_name )?; diff --git a/packages/go-gen/src/schema.rs b/packages/go-gen/src/schema.rs index 89aec8190f..22e6fd7c97 100644 --- a/packages/go-gen/src/schema.rs +++ b/packages/go-gen/src/schema.rs @@ -157,7 +157,7 @@ pub fn type_from_instance_type( .unwrap_or(type_context.struct_name); let new_struct_name = format!( "{}{suffix}", - replace_acronyms(&type_context.field.to_pascal_case()) + replace_acronyms(type_context.field.to_pascal_case()) ); let fields = schema diff --git a/packages/go-gen/src/utils.rs b/packages/go-gen/src/utils.rs index f7d24e6078..fab616c7ec 100644 --- a/packages/go-gen/src/utils.rs +++ b/packages/go-gen/src/utils.rs @@ -7,21 +7,30 @@ pub fn suffixes(s: &str) -> impl Iterator + DoubleEndedIterator { } /// Replaces common pascal-case acronyms with their uppercase counterparts. -pub fn replace_acronyms(ty: &str) -> String { - let mut ty = ty.replace("Url", "URL"); - replace_in_place(&mut ty, "Uri", "URI"); - replace_in_place(&mut ty, "Id", "ID"); - replace_in_place(&mut ty, "Ibc", "IBC"); +pub fn replace_acronyms(ty: impl Into) -> String { + let mut ty = ty.into(); + replace_word_in_place(&mut ty, "Url", "URL"); + replace_word_in_place(&mut ty, "Uri", "URI"); + replace_word_in_place(&mut ty, "Id", "ID"); + replace_word_in_place(&mut ty, "Ibc", "IBC"); ty } -pub fn replace_in_place(haystack: &mut String, from: &str, to: &str) { +fn replace_word_in_place(haystack: &mut String, from: &str, to: &str) { assert_eq!(from.len(), to.len(), "from and to must be the same length"); let mut start = 0; while let Some(pos) = haystack[start..].find(from) { let begin = start + pos; let end = start + pos + from.len(); - haystack.replace_range(begin..end, to); + let next_char = haystack.chars().nth(end); + match next_char { + Some(next_char) if next_char.is_ascii_lowercase() => {} + _ => { + // if the next character is uppercase or any non-ascii char or + // there is no next char, it's a full word + haystack.replace_range(begin..end, to); + } + } start = end; } } @@ -34,20 +43,38 @@ mod tests { #[should_panic = "from and to must be the same length"] fn replace_in_place_different_lengths() { let mut s = "foo".to_string(); - replace_in_place(&mut s, "foo", "barbar"); + replace_word_in_place(&mut s, "foo", "barbar"); } #[test] fn replace_in_place_multiple_works() { - let mut s = "foofoofoofoofoo".to_string(); - replace_in_place(&mut s, "foo", "bar"); + let mut s = "FooFooFooFooFoo".to_string(); + replace_word_in_place(&mut s, "Foo", "bar"); assert_eq!(s, "barbarbarbarbar"); } #[test] fn replace_in_place_single_works() { let mut s = "foo".to_string(); - replace_in_place(&mut s, "foo", "bar"); + replace_word_in_place(&mut s, "foo", "bar"); assert_eq!(s, "bar"); } + + #[test] + fn replace_word_in_place_part() { + let mut s = "Foofoo".to_string(); + replace_word_in_place(&mut s, "Foo", "Bar"); + // should not replace, because it's not a full word + assert_eq!(s, "Foofoo"); + } + + #[test] + fn replace_acronyms_works() { + assert_eq!(replace_acronyms("MyIdentity"), "MyIdentity"); + assert_eq!(replace_acronyms("MyIdentityId"), "MyIdentityID"); + assert_eq!(replace_acronyms("MyUri"), "MyURI"); + assert_eq!(replace_acronyms("Url"), "URL"); + assert_eq!(replace_acronyms("A"), "A"); + assert_eq!(replace_acronyms("Url🦦"), "URL🦦"); + } } From c966495348dc62e8744ade6917d976b336720d3e Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 22 Aug 2023 11:24:46 +0200 Subject: [PATCH 0618/2372] Improve docs of Validator::address --- packages/std/src/query/staking.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/std/src/query/staking.rs b/packages/std/src/query/staking.rs index fec3424917..08222f3cbd 100644 --- a/packages/std/src/query/staking.rs +++ b/packages/std/src/query/staking.rs @@ -130,7 +130,12 @@ impl_response_constructor!(ValidatorResponse, validator: Option); /// Instances are created in the querier. #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] pub struct Validator { - /// A validator address (e.g. cosmosvaloper1...) + /// The operator address of the validator (e.g. cosmosvaloper1...). + /// See https://github.com/cosmos/cosmos-sdk/blob/v0.47.4/proto/cosmos/staking/v1beta1/staking.proto#L95-L96 + /// for more information. + /// + /// This uses `String` instead of `Addr` since the bech32 address prefix is different from + /// the ones that regular user accounts use. pub address: String, pub commission: Decimal, pub max_commission: Decimal, From 00ff6a53acb3a9179471f4537eb9f240119dc3b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Wo=C5=BAniak?= Date: Mon, 14 Aug 2023 17:19:53 +0200 Subject: [PATCH 0619/2372] feat: Provide native way to cast deps to empty --- CHANGELOG.md | 8 +++++++ packages/std/src/deps.rs | 45 +++++++++++++++++++++++++++++++++++--- packages/std/src/traits.rs | 23 +++++++++++++++++++ 3 files changed, 73 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 59558b3d68..9fa4d3c4cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + +### Added + +- cosmwasm-std: Implement `into_empty` for `QuerierWrapper`, `Deps` and + `DepsMut`. + ## [1.3.2] - 2023-08-15 ### Fixed @@ -1790,6 +1797,7 @@ Some main points: All future Changelog entries will reference this base +[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.2...HEAD [1.3.2]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.1...v1.3.2 [1.3.1]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.0...v1.3.1 [1.3.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.7...v1.3.0 diff --git a/packages/std/src/deps.rs b/packages/std/src/deps.rs index 4d9a9ecdce..bbae1b8871 100644 --- a/packages/std/src/deps.rs +++ b/packages/std/src/deps.rs @@ -69,6 +69,28 @@ impl<'a, C: CustomQuery> DepsMut<'a, C> { querier: self.querier, } } + + /// This allows to convert any `DepsMut` into one generic over `Empty` custom + /// query type. + pub fn into_empty(self) -> DepsMut<'a, Empty> { + DepsMut { + storage: self.storage, + api: self.api, + querier: self.querier.into_empty(), + } + } +} + +impl<'a, C: CustomQuery> Deps<'a, C> { + /// This allows to convert any `Deps` into one generic over `Empty` custom + /// query type. + pub fn into_empty(self) -> Deps<'a, Empty> { + Deps { + storage: self.storage, + api: self.api, + querier: self.querier.into_empty(), + } + } } #[cfg(test)] @@ -98,12 +120,13 @@ mod tests { query(deps.as_ref()) } + #[derive(Clone, Serialize, Deserialize)] + struct MyQuery; + impl CustomQuery for MyQuery {} + #[test] fn deps_implements_copy() { impl CustomQuery for u64 {} - #[derive(Clone, Serialize, Deserialize)] - struct MyQuery; - impl CustomQuery for MyQuery {} // With C: Copy let owned = OwnedDeps::<_, _, _, u64> { @@ -127,4 +150,20 @@ mod tests { let _copy1 = deps; let _copy2 = deps; } + + #[test] + fn deps_to_empty() { + let mut owned = OwnedDeps::<_, _, _, MyQuery> { + storage: MockStorage::default(), + api: MockApi::default(), + querier: MockQuerier::::new(&[]), + custom_query_type: PhantomData, + }; + + let deps_mut: DepsMut = owned.as_mut(); + let _: DepsMut = deps_mut.into_empty(); + + let deps: Deps = owned.as_ref(); + let _: Deps = deps.into_empty(); + } } diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index f7aca97ba4..e8e5998430 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -224,6 +224,15 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { } } + /// This allows to convert any `QuerierWrapper` into a `QuerierWrapper` generic + /// over `Empty` custom query type. + pub fn into_empty(self) -> QuerierWrapper<'a, Empty> { + QuerierWrapper { + querier: self.querier, + custom_query_type: PhantomData, + } + } + /// Makes the query and parses the response. /// /// Any error (System Error, Error or called contract, or Parse Error) are flattened into @@ -442,6 +451,8 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { #[cfg(test)] mod tests { + use serde::Deserialize; + use super::*; use crate::testing::MockQuerier; use crate::{coins, from_slice, Uint128}; @@ -572,4 +583,16 @@ mod tests { } if msg == "Querier system error: No such contract: foobar" )); } + + #[test] + fn querier_into_empty() { + #[derive(Clone, Serialize, Deserialize)] + struct MyQuery; + impl CustomQuery for MyQuery {} + + let querier: MockQuerier = MockQuerier::new(&[]); + let wrapper = QuerierWrapper::::new(&querier); + + let _: QuerierWrapper = wrapper.into_empty(); + } } From 943cdbfd28527b17dd35479e2d825bd012d37041 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 22 Aug 2023 12:45:41 +0200 Subject: [PATCH 0620/2372] Set version: 1.3.3 --- Cargo.lock | 16 ++++++++-------- contracts/burner/Cargo.lock | 12 ++++++------ contracts/crypto-verify/Cargo.lock | 14 +++++++------- contracts/cyberpunk/Cargo.lock | 14 +++++++------- contracts/floaty/Cargo.lock | 14 +++++++------- contracts/hackatom/Cargo.lock | 14 +++++++------- contracts/ibc-reflect-send/Cargo.lock | 14 +++++++------- contracts/ibc-reflect/Cargo.lock | 14 +++++++------- contracts/queue/Cargo.lock | 12 ++++++------ contracts/reflect/Cargo.lock | 14 +++++++------- contracts/staking/Cargo.lock | 14 +++++++------- contracts/virus/Cargo.lock | 12 ++++++------ packages/check/Cargo.toml | 6 +++--- packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema-derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 6 +++--- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 20 files changed, 99 insertions(+), 99 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d2363377f5..3e6a1bdf50 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -291,7 +291,7 @@ dependencies = [ [[package]] name = "cosmwasm-check" -version = "1.3.2" +version = "1.3.3" dependencies = [ "anyhow", "clap 2.34.0", @@ -302,7 +302,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.2" +version = "1.3.3" dependencies = [ "base64", "criterion", @@ -321,7 +321,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.2" +version = "1.3.3" dependencies = [ "cosmwasm-std", "syn", @@ -329,7 +329,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "1.3.2" +version = "1.3.3" dependencies = [ "anyhow", "cosmwasm-schema-derive", @@ -344,7 +344,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.2" +version = "1.3.3" dependencies = [ "proc-macro2", "quote", @@ -353,7 +353,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.2" +version = "1.3.3" dependencies = [ "base64", "bnum", @@ -375,7 +375,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.2" +version = "1.3.3" dependencies = [ "cosmwasm-std", "serde", @@ -383,7 +383,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.2" +version = "1.3.3" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index d27f3c3386..d65d74accb 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -180,7 +180,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.2" +version = "1.3.3" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -191,14 +191,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.2" +version = "1.3.3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.2" +version = "1.3.3" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -209,7 +209,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.2" +version = "1.3.3" dependencies = [ "proc-macro2", "quote", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.2" +version = "1.3.3" dependencies = [ "base64", "bnum", @@ -236,7 +236,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.2" +version = "1.3.3" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 6c01f72537..fb5ebb8157 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -175,7 +175,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.2" +version = "1.3.3" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -186,14 +186,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.2" +version = "1.3.3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.2" +version = "1.3.3" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -204,7 +204,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.2" +version = "1.3.3" dependencies = [ "proc-macro2", "quote", @@ -213,7 +213,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.2" +version = "1.3.3" dependencies = [ "base64", "bnum", @@ -231,7 +231,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.2" +version = "1.3.3" dependencies = [ "cosmwasm-std", "serde", @@ -239,7 +239,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.2" +version = "1.3.3" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 98349c9dc7..9225b45c66 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.2" +version = "1.3.3" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -209,14 +209,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.2" +version = "1.3.3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.2" +version = "1.3.3" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.2" +version = "1.3.3" dependencies = [ "proc-macro2", "quote", @@ -236,7 +236,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.2" +version = "1.3.3" dependencies = [ "base64", "bnum", @@ -254,7 +254,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.2" +version = "1.3.3" dependencies = [ "cosmwasm-std", "serde", @@ -262,7 +262,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.2" +version = "1.3.3" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 5b8ef9a533..e3d44962c6 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.2" +version = "1.3.3" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.2" +version = "1.3.3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.2" +version = "1.3.3" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.2" +version = "1.3.3" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.2" +version = "1.3.3" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.2" +version = "1.3.3" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.2" +version = "1.3.3" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 289d8a5495..1a9c02d3ad 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.2" +version = "1.3.3" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.2" +version = "1.3.3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.2" +version = "1.3.3" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.2" +version = "1.3.3" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.2" +version = "1.3.3" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.2" +version = "1.3.3" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.2" +version = "1.3.3" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 05b35892fd..d53f2e5987 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.2" +version = "1.3.3" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.2" +version = "1.3.3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.2" +version = "1.3.3" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.2" +version = "1.3.3" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.2" +version = "1.3.3" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.2" +version = "1.3.3" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.2" +version = "1.3.3" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 61a8c0a2c5..59941ae33f 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.2" +version = "1.3.3" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.2" +version = "1.3.3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.2" +version = "1.3.3" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.2" +version = "1.3.3" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.2" +version = "1.3.3" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.2" +version = "1.3.3" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.2" +version = "1.3.3" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index b9b2c85f59..b8a21b1fb3 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.2" +version = "1.3.3" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.2" +version = "1.3.3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.2" +version = "1.3.3" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.2" +version = "1.3.3" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.2" +version = "1.3.3" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.2" +version = "1.3.3" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 9ba307009b..ee5a70691f 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.2" +version = "1.3.3" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.2" +version = "1.3.3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.2" +version = "1.3.3" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.2" +version = "1.3.3" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.2" +version = "1.3.3" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.2" +version = "1.3.3" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.2" +version = "1.3.3" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index c525e103ca..fea02ba84e 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.2" +version = "1.3.3" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.2" +version = "1.3.3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.2" +version = "1.3.3" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.2" +version = "1.3.3" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.2" +version = "1.3.3" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.2" +version = "1.3.3" dependencies = [ "cosmwasm-std", "serde", @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.2" +version = "1.3.3" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index fd9f491ada..f5e5f6b7e5 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.2" +version = "1.3.3" dependencies = [ "digest 0.10.3", "ed25519-zebra", @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.2" +version = "1.3.3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.2" +version = "1.3.3" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.2" +version = "1.3.3" dependencies = [ "proc-macro2", "quote", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.2" +version = "1.3.3" dependencies = [ "base64", "bnum", @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.2" +version = "1.3.3" dependencies = [ "bitflags", "bytecheck", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index 64e2292ae7..9a1444e5e7 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-check" -version = "1.3.2" +version = "1.3.3" authors = ["Mauro Lacy "] edition = "2021" description = "A CLI tool for verifying CosmWasm smart contracts" @@ -11,5 +11,5 @@ license = "Apache-2.0" anyhow = "1.0.57" clap = "2" colored = "2" -cosmwasm-vm = { path = "../vm", version = "1.3.2" } -cosmwasm-std = { path = "../std", version = "1.3.2" } +cosmwasm-vm = { path = "../vm", version = "1.3.3" } +cosmwasm-std = { path = "../std", version = "1.3.3" } diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 03826e465e..95471a37eb 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "1.3.2" +version = "1.3.3" authors = ["Mauro Lacy "] edition = "2021" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index 8676971c60..1d36bab3f9 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "1.3.2" +version = "1.3.3" authors = ["Simon Warta "] edition = "2021" description = "A package for auto-generated code used for CosmWasm contract development. This is shipped as part of cosmwasm-std. Do not use directly." diff --git a/packages/schema-derive/Cargo.toml b/packages/schema-derive/Cargo.toml index 0654e2e856..06eec0d629 100644 --- a/packages/schema-derive/Cargo.toml +++ b/packages/schema-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema-derive" -version = "1.3.2" +version = "1.3.3" authors = ["Tomasz Kurcz "] edition = "2021" description = "Derive macros for cosmwasm-schema" diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index 58c9148e45..180f4afbe6 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "1.3.2" +version = "1.3.3" authors = ["Simon Warta ", "Ethan Frey "] edition = "2021" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." @@ -8,7 +8,7 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/schema" license = "Apache-2.0" [dependencies] -cosmwasm-schema-derive = { version = "=1.3.2", path = "../schema-derive" } +cosmwasm-schema-derive = { version = "=1.3.3", path = "../schema-derive" } schemars = "0.8.3" serde = "1.0" serde_json = "1.0.40" @@ -16,6 +16,6 @@ thiserror = "1.0.26" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = { version = "1.3.2", path = "../std" } +cosmwasm-std = { version = "1.3.3", path = "../std" } semver = "1" tempfile = "3" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 691fca98e1..2f9bf3a0d4 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "1.3.2" +version = "1.3.3" authors = ["Ethan Frey "] edition = "2021" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -45,7 +45,7 @@ cosmwasm_1_3 = ["cosmwasm_1_2"] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "1.3.2" } +cosmwasm-derive = { path = "../derive", version = "1.3.3" } derivative = "2" forward_ref = "1" hex = "0.4" @@ -57,7 +57,7 @@ thiserror = "1.0.26" bnum = "0.7.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "1.3.2" } +cosmwasm-crypto = { path = "../crypto", version = "1.3.3" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 8028adef44..962b6af827 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "1.3.2" +version = "1.3.3" authors = ["Ethan Frey "] edition = "2021" description = "CosmWasm library with useful helpers for Storage patterns" @@ -16,5 +16,5 @@ iterator = ["cosmwasm-std/iterator"] [dependencies] # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.3.2", default-features = false } +cosmwasm-std = { path = "../std", version = "1.3.3", default-features = false } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index b921be6357..bace27fb41 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "1.3.2" +version = "1.3.3" authors = ["Ethan Frey "] edition = "2021" description = "VM bindings to run cosmwams contracts" @@ -42,8 +42,8 @@ required-features = ["iterator"] clru = "0.4.0" crc32fast = "1.3.2" # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.3.2", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "1.3.2" } +cosmwasm-std = { path = "../std", version = "1.3.3", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "1.3.3" } hex = "0.4" parity-wasm = { version = "0.45", features = ["sign_ext"] } schemars = "0.8.3" From 7cb25b441d20d37a0c039eb6ded23fd9e6878e98 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 22 Aug 2023 12:46:53 +0200 Subject: [PATCH 0621/2372] Update changelog --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9fa4d3c4cb..aadf0ebe0c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ and this project adheres to ## [Unreleased] +## [1.3.3] - 2023-08-22 + ### Added - cosmwasm-std: Implement `into_empty` for `QuerierWrapper`, `Deps` and @@ -1797,7 +1799,8 @@ Some main points: All future Changelog entries will reference this base -[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.2...HEAD +[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.3...HEAD +[1.3.3]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.2...v1.3.3 [1.3.2]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.1...v1.3.2 [1.3.1]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.0...v1.3.1 [1.3.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.2.7...v1.3.0 From 0688df7bd20b26482d8336cdd010754684a3615e Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 22 Aug 2023 15:37:53 +0200 Subject: [PATCH 0622/2372] Make abs_diff const for all integers --- CHANGELOG.md | 2 ++ packages/std/src/math/int128.rs | 2 +- packages/std/src/math/int256.rs | 2 +- packages/std/src/math/int512.rs | 2 +- packages/std/src/math/int64.rs | 2 +- packages/std/src/math/uint256.rs | 2 +- packages/std/src/math/uint512.rs | 2 +- 7 files changed, 8 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d4aca887e9..5e7490734f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ and this project adheres to - cosmwasm-std: Implement `Not` for `Uint{64,128,256}` ([#1799]). - cosmwasm-std: Add iterators for `Coins` ([#1806]). +- cosmwasm-std: Make `abs_diff` const for `Uint{256,512}` and + `Int{64,128,256,512}`. It is now const for all integer types. [#1799]: https://github.com/CosmWasm/cosmwasm/pull/1799 [#1806]: https://github.com/CosmWasm/cosmwasm/pull/1806 diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index 080236c19a..cc0b7c83b5 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -206,7 +206,7 @@ impl Int128 { } #[must_use = "this returns the result of the operation, without modifying the original"] - pub fn abs_diff(self, other: Self) -> Uint128 { + pub const fn abs_diff(self, other: Self) -> Uint128 { Uint128(self.0.abs_diff(other.0)) } } diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index 50905713a2..5616fcc2e7 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -255,7 +255,7 @@ impl Int256 { } #[must_use = "this returns the result of the operation, without modifying the original"] - pub fn abs_diff(self, other: Self) -> Uint256 { + pub const fn abs_diff(self, other: Self) -> Uint256 { Uint256(self.0.abs_diff(other.0)) } } diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index 08a30d0c3a..2b122418e5 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -291,7 +291,7 @@ impl Int512 { } #[must_use = "this returns the result of the operation, without modifying the original"] - pub fn abs_diff(self, other: Self) -> Uint512 { + pub const fn abs_diff(self, other: Self) -> Uint512 { Uint512(self.0.abs_diff(other.0)) } } diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index c977ed5581..2e9ac7f68d 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -206,7 +206,7 @@ impl Int64 { } #[must_use = "this returns the result of the operation, without modifying the original"] - pub fn abs_diff(self, other: Self) -> Uint64 { + pub const fn abs_diff(self, other: Self) -> Uint64 { Uint64(self.0.abs_diff(other.0)) } } diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 2199245a75..6422dee764 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -330,7 +330,7 @@ impl Uint256 { } #[must_use = "this returns the result of the operation, without modifying the original"] - pub fn abs_diff(self, other: Self) -> Self { + pub const fn abs_diff(self, other: Self) -> Self { Self(self.0.abs_diff(other.0)) } } diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index 0300d0f76e..c4dd9e3f52 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -295,7 +295,7 @@ impl Uint512 { } #[must_use = "this returns the result of the operation, without modifying the original"] - pub fn abs_diff(self, other: Self) -> Self { + pub const fn abs_diff(self, other: Self) -> Self { Self(self.0.abs_diff(other.0)) } } From 03e3d461ce706648ce839c1244ed1a0166b68a72 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 23 Aug 2023 08:58:58 +0200 Subject: [PATCH 0623/2372] Add TryFrom impl for Decimal --- CHANGELOG.md | 2 ++ packages/std/src/math/decimal.rs | 30 +++++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e7490734f..e116a990d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,9 +12,11 @@ and this project adheres to - cosmwasm-std: Add iterators for `Coins` ([#1806]). - cosmwasm-std: Make `abs_diff` const for `Uint{256,512}` and `Int{64,128,256,512}`. It is now const for all integer types. +- cosmwasm-std: Implement `TryFrom` for `Decimal` ([#1832]) [#1799]: https://github.com/CosmWasm/cosmwasm/pull/1799 [#1806]: https://github.com/CosmWasm/cosmwasm/pull/1806 +[#1832]: https://github.com/CosmWasm/cosmwasm/pull/1832 ### Changed diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 108b76b2e2..b8de3e90bc 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -11,7 +11,7 @@ use crate::errors::{ CheckedFromRatioError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, OverflowOperation, RoundUpOverflowError, StdError, }; -use crate::forward_ref_partial_eq; +use crate::{forward_ref_partial_eq, Decimal256}; use super::Fraction; use super::Isqrt; @@ -498,6 +498,18 @@ impl Fraction for Decimal { } } +impl TryFrom for Decimal { + type Error = DecimalRangeExceeded; + + fn try_from(value: Decimal256) -> Result { + value + .atomics() + .try_into() + .map(Decimal) + .map_err(|_| DecimalRangeExceeded) + } +} + impl FromStr for Decimal { type Err = StdError; @@ -817,6 +829,22 @@ mod tests { assert_eq!(value.0, Decimal::DECIMAL_FRACTIONAL / Uint128::from(80u8)); } + #[test] + fn decimal_from_decimal256_works() { + let too_big = Decimal256::new(Uint256::from(Uint128::MAX) + Uint256::one()); + assert_eq!(Decimal::try_from(too_big), Err(DecimalRangeExceeded)); + + let just_right = Decimal256::new(Uint256::from(Uint128::MAX)); + assert_eq!(Decimal::try_from(just_right), Ok(Decimal::MAX)); + + assert_eq!(Decimal::try_from(Decimal256::zero()), Ok(Decimal::zero())); + assert_eq!(Decimal::try_from(Decimal256::one()), Ok(Decimal::one())); + assert_eq!( + Decimal::try_from(Decimal256::percent(50)), + Ok(Decimal::percent(50)) + ); + } + #[test] fn decimal_from_atomics_works() { let one = Decimal::one(); From e88a0e68d1b94e052a0f6eddad95fb22901b1f4b Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 23 Aug 2023 09:56:56 +0200 Subject: [PATCH 0624/2372] Refactor AcknowledgementMsg in ibc-reflect and ibc-reflect-send --- contracts/ibc-reflect-send/src/ibc_msg.rs | 36 ++++++++++++++++--- .../schema/acknowledgement_msg_balances.json | 3 +- .../schema/acknowledgement_msg_dispatch.json | 3 +- .../schema/acknowledgement_msg_who_am_i.json | 3 +- contracts/ibc-reflect/src/msg.rs | 35 +++++++++++++++--- 5 files changed, 66 insertions(+), 14 deletions(-) diff --git a/contracts/ibc-reflect-send/src/ibc_msg.rs b/contracts/ibc-reflect-send/src/ibc_msg.rs index d395388c3a..48f38406a4 100644 --- a/contracts/ibc-reflect-send/src/ibc_msg.rs +++ b/contracts/ibc-reflect-send/src/ibc_msg.rs @@ -1,4 +1,5 @@ -use cosmwasm_std::{Coin, ContractResult, CosmosMsg}; +use cosmwasm_schema::cw_serde; +use cosmwasm_std::{Coin, CosmosMsg}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; @@ -11,9 +12,36 @@ pub enum PacketMsg { Balances {}, } -/// All IBC acknowledgements are wrapped in `ContractResult`. -/// The success value depends on the PacketMsg variant. -pub type AcknowledgementMsg = ContractResult; +/// A custom acknowledgement type. +/// The success type `T` depends on the PacketMsg variant. +/// +/// This could be refactored to use [StdAck] at some point. However, +/// it has a different success variant name ("ok" vs. "result") and +/// a JSON payload instead of a binary payload. +/// +/// [StdAck]: https://github.com/CosmWasm/cosmwasm/issues/1512 +#[cw_serde] +pub enum AcknowledgementMsg { + Ok(S), + #[serde(rename = "error")] + Err(String), +} + +impl AcknowledgementMsg { + pub fn unwrap(self) -> S { + match self { + AcknowledgementMsg::Ok(data) => data, + AcknowledgementMsg::Err(err) => panic!("{}", err), + } + } + + pub fn unwrap_err(self) -> String { + match self { + AcknowledgementMsg::Ok(_) => panic!("not an error"), + AcknowledgementMsg::Err(err) => err, + } + } +} /// This is the success response we send on ack for PacketMsg::Dispatch. /// Just acknowledge success or error diff --git a/contracts/ibc-reflect/schema/acknowledgement_msg_balances.json b/contracts/ibc-reflect/schema/acknowledgement_msg_balances.json index 20e956cd3f..b181c28559 100644 --- a/contracts/ibc-reflect/schema/acknowledgement_msg_balances.json +++ b/contracts/ibc-reflect/schema/acknowledgement_msg_balances.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "title": "AcknowledgementMsgBalances", - "description": "This is the final result type that is created and serialized in a contract for every init/execute/migrate call. The VM then deserializes this type to distinguish between successful and failed executions.\n\nWe use a custom type here instead of Rust's Result because we want to be able to define the serialization, which is a public interface. Every language that compiles to Wasm and runs in the ComsWasm VM needs to create the same JSON representation.\n\n# Examples\n\nSuccess:\n\n``` # use cosmwasm_std::{to_vec, ContractResult, Response}; let response: Response = Response::default(); let result: ContractResult = ContractResult::Ok(response); assert_eq!(to_vec(&result).unwrap(), br#\"{\"ok\":{\"messages\":[],\"attributes\":[],\"events\":[],\"data\":null}}\"#); ```\n\nFailure:\n\n``` # use cosmwasm_std::{to_vec, ContractResult, Response}; let error_msg = String::from(\"Something went wrong\"); let result: ContractResult = ContractResult::Err(error_msg); assert_eq!(to_vec(&result).unwrap(), br#\"{\"error\":\"Something went wrong\"}\"#); ```", + "description": "A custom acknowledgement type. The success type `T` depends on the PacketMsg variant.\n\nThis could be refactored to use [StdAck] at some point. However, it has a different success variant name (\"ok\" vs. \"result\") and a JSON payload instead of a binary payload.\n\n[StdAck]: https://github.com/CosmWasm/cosmwasm/issues/1512", "oneOf": [ { "type": "object", @@ -16,7 +16,6 @@ "additionalProperties": false }, { - "description": "An error type that every custom error created by contract developers can be converted to. This could potientially have more structure, but String is the easiest.", "type": "object", "required": [ "error" diff --git a/contracts/ibc-reflect/schema/acknowledgement_msg_dispatch.json b/contracts/ibc-reflect/schema/acknowledgement_msg_dispatch.json index e89f54b65d..5c010f5bd1 100644 --- a/contracts/ibc-reflect/schema/acknowledgement_msg_dispatch.json +++ b/contracts/ibc-reflect/schema/acknowledgement_msg_dispatch.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "title": "AcknowledgementMsgDispatch", - "description": "This is the final result type that is created and serialized in a contract for every init/execute/migrate call. The VM then deserializes this type to distinguish between successful and failed executions.\n\nWe use a custom type here instead of Rust's Result because we want to be able to define the serialization, which is a public interface. Every language that compiles to Wasm and runs in the ComsWasm VM needs to create the same JSON representation.\n\n# Examples\n\nSuccess:\n\n``` # use cosmwasm_std::{to_vec, ContractResult, Response}; let response: Response = Response::default(); let result: ContractResult = ContractResult::Ok(response); assert_eq!(to_vec(&result).unwrap(), br#\"{\"ok\":{\"messages\":[],\"attributes\":[],\"events\":[],\"data\":null}}\"#); ```\n\nFailure:\n\n``` # use cosmwasm_std::{to_vec, ContractResult, Response}; let error_msg = String::from(\"Something went wrong\"); let result: ContractResult = ContractResult::Err(error_msg); assert_eq!(to_vec(&result).unwrap(), br#\"{\"error\":\"Something went wrong\"}\"#); ```", + "description": "A custom acknowledgement type. The success type `T` depends on the PacketMsg variant.\n\nThis could be refactored to use [StdAck] at some point. However, it has a different success variant name (\"ok\" vs. \"result\") and a JSON payload instead of a binary payload.\n\n[StdAck]: https://github.com/CosmWasm/cosmwasm/issues/1512", "oneOf": [ { "type": "object", @@ -16,7 +16,6 @@ "additionalProperties": false }, { - "description": "An error type that every custom error created by contract developers can be converted to. This could potientially have more structure, but String is the easiest.", "type": "object", "required": [ "error" diff --git a/contracts/ibc-reflect/schema/acknowledgement_msg_who_am_i.json b/contracts/ibc-reflect/schema/acknowledgement_msg_who_am_i.json index 57c0933f8c..f706c655de 100644 --- a/contracts/ibc-reflect/schema/acknowledgement_msg_who_am_i.json +++ b/contracts/ibc-reflect/schema/acknowledgement_msg_who_am_i.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "title": "AcknowledgementMsgWhoAmI", - "description": "This is the final result type that is created and serialized in a contract for every init/execute/migrate call. The VM then deserializes this type to distinguish between successful and failed executions.\n\nWe use a custom type here instead of Rust's Result because we want to be able to define the serialization, which is a public interface. Every language that compiles to Wasm and runs in the ComsWasm VM needs to create the same JSON representation.\n\n# Examples\n\nSuccess:\n\n``` # use cosmwasm_std::{to_vec, ContractResult, Response}; let response: Response = Response::default(); let result: ContractResult = ContractResult::Ok(response); assert_eq!(to_vec(&result).unwrap(), br#\"{\"ok\":{\"messages\":[],\"attributes\":[],\"events\":[],\"data\":null}}\"#); ```\n\nFailure:\n\n``` # use cosmwasm_std::{to_vec, ContractResult, Response}; let error_msg = String::from(\"Something went wrong\"); let result: ContractResult = ContractResult::Err(error_msg); assert_eq!(to_vec(&result).unwrap(), br#\"{\"error\":\"Something went wrong\"}\"#); ```", + "description": "A custom acknowledgement type. The success type `T` depends on the PacketMsg variant.\n\nThis could be refactored to use [StdAck] at some point. However, it has a different success variant name (\"ok\" vs. \"result\") and a JSON payload instead of a binary payload.\n\n[StdAck]: https://github.com/CosmWasm/cosmwasm/issues/1512", "oneOf": [ { "type": "object", @@ -16,7 +16,6 @@ "additionalProperties": false }, { - "description": "An error type that every custom error created by contract developers can be converted to. This could potientially have more structure, but String is the easiest.", "type": "object", "required": [ "error" diff --git a/contracts/ibc-reflect/src/msg.rs b/contracts/ibc-reflect/src/msg.rs index acd49baf63..487e28edaa 100644 --- a/contracts/ibc-reflect/src/msg.rs +++ b/contracts/ibc-reflect/src/msg.rs @@ -1,5 +1,5 @@ use cosmwasm_schema::{cw_serde, QueryResponses}; -use cosmwasm_std::{Coin, ContractResult, CosmosMsg}; +use cosmwasm_std::{Coin, CosmosMsg}; /// Just needs to know the code_id of a reflect contract to spawn sub-accounts #[cw_serde] @@ -51,9 +51,36 @@ pub enum PacketMsg { ReturnMsgs { msgs: Vec }, } -/// All acknowledgements are wrapped in `ContractResult`. -/// The success value depends on the PacketMsg variant. -pub type AcknowledgementMsg = ContractResult; +/// A custom acknowledgement type. +/// The success type `T` depends on the PacketMsg variant. +/// +/// This could be refactored to use [StdAck] at some point. However, +/// it has a different success variant name ("ok" vs. "result") and +/// a JSON payload instead of a binary payload. +/// +/// [StdAck]: https://github.com/CosmWasm/cosmwasm/issues/1512 +#[cw_serde] +pub enum AcknowledgementMsg { + Ok(S), + #[serde(rename = "error")] + Err(String), +} + +impl AcknowledgementMsg { + pub fn unwrap(self) -> S { + match self { + AcknowledgementMsg::Ok(data) => data, + AcknowledgementMsg::Err(err) => panic!("{}", err), + } + } + + pub fn unwrap_err(self) -> String { + match self { + AcknowledgementMsg::Ok(_) => panic!("not an error"), + AcknowledgementMsg::Err(err) => err, + } + } +} /// This is the success response we send on ack for PacketMsg::Dispatch. /// Just acknowledge success or error From f28adbe8952e4688e5fe4ef894681fdd41eac1c8 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 23 Aug 2023 09:59:22 +0200 Subject: [PATCH 0625/2372] Add AcknowledgementMsgs to ibc-reflect-send schemas --- .../schema/acknowledgement_msg_balances.json | 71 +++++++++++++++++++ .../schema/acknowledgement_msg_dispatch.json | 31 ++++++++ .../schema/acknowledgement_msg_who_am_i.json | 45 ++++++++++++ contracts/ibc-reflect-send/src/bin/schema.rs | 21 +++++- 4 files changed, 166 insertions(+), 2 deletions(-) create mode 100644 contracts/ibc-reflect-send/schema/acknowledgement_msg_balances.json create mode 100644 contracts/ibc-reflect-send/schema/acknowledgement_msg_dispatch.json create mode 100644 contracts/ibc-reflect-send/schema/acknowledgement_msg_who_am_i.json diff --git a/contracts/ibc-reflect-send/schema/acknowledgement_msg_balances.json b/contracts/ibc-reflect-send/schema/acknowledgement_msg_balances.json new file mode 100644 index 0000000000..4bde7573d0 --- /dev/null +++ b/contracts/ibc-reflect-send/schema/acknowledgement_msg_balances.json @@ -0,0 +1,71 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "AcknowledgementMsgBalances", + "description": "A custom acknowledgement type. The success type `T` depends on the PacketMsg variant.\n\nThis could be refactored to use [StdAck] at some point. However, it has a different success variant name (\"ok\" vs. \"result\") and a JSON payload instead of a binary payload.\n\n[StdAck]: https://github.com/CosmWasm/cosmwasm/issues/1512", + "oneOf": [ + { + "type": "object", + "required": [ + "ok" + ], + "properties": { + "ok": { + "$ref": "#/definitions/BalancesResponse" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "error" + ], + "properties": { + "error": { + "type": "string" + } + }, + "additionalProperties": false + } + ], + "definitions": { + "BalancesResponse": { + "description": "This is the success response we send on ack for PacketMsg::Balance. Just acknowledge success or error", + "type": "object", + "required": [ + "account", + "balances" + ], + "properties": { + "account": { + "type": "string" + }, + "balances": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + } + }, + "Coin": { + "type": "object", + "required": [ + "amount", + "denom" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + } + } + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } +} diff --git a/contracts/ibc-reflect-send/schema/acknowledgement_msg_dispatch.json b/contracts/ibc-reflect-send/schema/acknowledgement_msg_dispatch.json new file mode 100644 index 0000000000..5c010f5bd1 --- /dev/null +++ b/contracts/ibc-reflect-send/schema/acknowledgement_msg_dispatch.json @@ -0,0 +1,31 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "AcknowledgementMsgDispatch", + "description": "A custom acknowledgement type. The success type `T` depends on the PacketMsg variant.\n\nThis could be refactored to use [StdAck] at some point. However, it has a different success variant name (\"ok\" vs. \"result\") and a JSON payload instead of a binary payload.\n\n[StdAck]: https://github.com/CosmWasm/cosmwasm/issues/1512", + "oneOf": [ + { + "type": "object", + "required": [ + "ok" + ], + "properties": { + "ok": { + "type": "null" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "error" + ], + "properties": { + "error": { + "type": "string" + } + }, + "additionalProperties": false + } + ] +} diff --git a/contracts/ibc-reflect-send/schema/acknowledgement_msg_who_am_i.json b/contracts/ibc-reflect-send/schema/acknowledgement_msg_who_am_i.json new file mode 100644 index 0000000000..e4ad97424b --- /dev/null +++ b/contracts/ibc-reflect-send/schema/acknowledgement_msg_who_am_i.json @@ -0,0 +1,45 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "AcknowledgementMsgWhoAmI", + "description": "A custom acknowledgement type. The success type `T` depends on the PacketMsg variant.\n\nThis could be refactored to use [StdAck] at some point. However, it has a different success variant name (\"ok\" vs. \"result\") and a JSON payload instead of a binary payload.\n\n[StdAck]: https://github.com/CosmWasm/cosmwasm/issues/1512", + "oneOf": [ + { + "type": "object", + "required": [ + "ok" + ], + "properties": { + "ok": { + "$ref": "#/definitions/WhoAmIResponse" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "error" + ], + "properties": { + "error": { + "type": "string" + } + }, + "additionalProperties": false + } + ], + "definitions": { + "WhoAmIResponse": { + "description": "This is the success response we send on ack for PacketMsg::WhoAmI. Return the caller's account address on the remote chain", + "type": "object", + "required": [ + "account" + ], + "properties": { + "account": { + "type": "string" + } + } + } + } +} diff --git a/contracts/ibc-reflect-send/src/bin/schema.rs b/contracts/ibc-reflect-send/src/bin/schema.rs index 2f8a8d3e72..9bb005e075 100644 --- a/contracts/ibc-reflect-send/src/bin/schema.rs +++ b/contracts/ibc-reflect-send/src/bin/schema.rs @@ -1,8 +1,10 @@ use std::env::current_dir; -use cosmwasm_schema::{export_schema, schema_for, write_api}; +use cosmwasm_schema::{export_schema, export_schema_with_title, schema_for, write_api}; -use ibc_reflect_send::ibc_msg::PacketMsg; +use ibc_reflect_send::ibc_msg::{ + AcknowledgementMsg, BalancesResponse, DispatchResponse, PacketMsg, WhoAmIResponse, +}; use ibc_reflect_send::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; fn main() { @@ -17,4 +19,19 @@ fn main() { let mut out_dir = current_dir().unwrap(); out_dir.push("schema"); export_schema(&schema_for!(PacketMsg), &out_dir); + export_schema_with_title( + &schema_for!(AcknowledgementMsg), + &out_dir, + "AcknowledgementMsgBalances", + ); + export_schema_with_title( + &schema_for!(AcknowledgementMsg), + &out_dir, + "AcknowledgementMsgDispatch", + ); + export_schema_with_title( + &schema_for!(AcknowledgementMsg), + &out_dir, + "AcknowledgementMsgWhoAmI", + ); } From b95931571fd136f4ba9eacedc52ff8306d9ea504 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 23 Aug 2023 10:01:15 +0200 Subject: [PATCH 0626/2372] Move ibc protocol to ibc subfolder --- .../schema/{ => ibc}/acknowledgement_msg_balances.json | 0 .../schema/{ => ibc}/acknowledgement_msg_dispatch.json | 0 .../schema/{ => ibc}/acknowledgement_msg_who_am_i.json | 0 contracts/ibc-reflect-send/schema/{ => ibc}/packet_msg.json | 0 contracts/ibc-reflect-send/src/bin/schema.rs | 1 + .../schema/{ => ibc}/acknowledgement_msg_balances.json | 0 .../schema/{ => ibc}/acknowledgement_msg_dispatch.json | 0 .../schema/{ => ibc}/acknowledgement_msg_who_am_i.json | 0 contracts/ibc-reflect/schema/{ => ibc}/packet_msg.json | 0 contracts/ibc-reflect/src/bin/schema.rs | 1 + 10 files changed, 2 insertions(+) rename contracts/ibc-reflect-send/schema/{ => ibc}/acknowledgement_msg_balances.json (100%) rename contracts/ibc-reflect-send/schema/{ => ibc}/acknowledgement_msg_dispatch.json (100%) rename contracts/ibc-reflect-send/schema/{ => ibc}/acknowledgement_msg_who_am_i.json (100%) rename contracts/ibc-reflect-send/schema/{ => ibc}/packet_msg.json (100%) rename contracts/ibc-reflect/schema/{ => ibc}/acknowledgement_msg_balances.json (100%) rename contracts/ibc-reflect/schema/{ => ibc}/acknowledgement_msg_dispatch.json (100%) rename contracts/ibc-reflect/schema/{ => ibc}/acknowledgement_msg_who_am_i.json (100%) rename contracts/ibc-reflect/schema/{ => ibc}/packet_msg.json (100%) diff --git a/contracts/ibc-reflect-send/schema/acknowledgement_msg_balances.json b/contracts/ibc-reflect-send/schema/ibc/acknowledgement_msg_balances.json similarity index 100% rename from contracts/ibc-reflect-send/schema/acknowledgement_msg_balances.json rename to contracts/ibc-reflect-send/schema/ibc/acknowledgement_msg_balances.json diff --git a/contracts/ibc-reflect-send/schema/acknowledgement_msg_dispatch.json b/contracts/ibc-reflect-send/schema/ibc/acknowledgement_msg_dispatch.json similarity index 100% rename from contracts/ibc-reflect-send/schema/acknowledgement_msg_dispatch.json rename to contracts/ibc-reflect-send/schema/ibc/acknowledgement_msg_dispatch.json diff --git a/contracts/ibc-reflect-send/schema/acknowledgement_msg_who_am_i.json b/contracts/ibc-reflect-send/schema/ibc/acknowledgement_msg_who_am_i.json similarity index 100% rename from contracts/ibc-reflect-send/schema/acknowledgement_msg_who_am_i.json rename to contracts/ibc-reflect-send/schema/ibc/acknowledgement_msg_who_am_i.json diff --git a/contracts/ibc-reflect-send/schema/packet_msg.json b/contracts/ibc-reflect-send/schema/ibc/packet_msg.json similarity index 100% rename from contracts/ibc-reflect-send/schema/packet_msg.json rename to contracts/ibc-reflect-send/schema/ibc/packet_msg.json diff --git a/contracts/ibc-reflect-send/src/bin/schema.rs b/contracts/ibc-reflect-send/src/bin/schema.rs index 9bb005e075..cb7ea07166 100644 --- a/contracts/ibc-reflect-send/src/bin/schema.rs +++ b/contracts/ibc-reflect-send/src/bin/schema.rs @@ -18,6 +18,7 @@ fn main() { // Schemas for inter-contract communication let mut out_dir = current_dir().unwrap(); out_dir.push("schema"); + out_dir.push("ibc"); export_schema(&schema_for!(PacketMsg), &out_dir); export_schema_with_title( &schema_for!(AcknowledgementMsg), diff --git a/contracts/ibc-reflect/schema/acknowledgement_msg_balances.json b/contracts/ibc-reflect/schema/ibc/acknowledgement_msg_balances.json similarity index 100% rename from contracts/ibc-reflect/schema/acknowledgement_msg_balances.json rename to contracts/ibc-reflect/schema/ibc/acknowledgement_msg_balances.json diff --git a/contracts/ibc-reflect/schema/acknowledgement_msg_dispatch.json b/contracts/ibc-reflect/schema/ibc/acknowledgement_msg_dispatch.json similarity index 100% rename from contracts/ibc-reflect/schema/acknowledgement_msg_dispatch.json rename to contracts/ibc-reflect/schema/ibc/acknowledgement_msg_dispatch.json diff --git a/contracts/ibc-reflect/schema/acknowledgement_msg_who_am_i.json b/contracts/ibc-reflect/schema/ibc/acknowledgement_msg_who_am_i.json similarity index 100% rename from contracts/ibc-reflect/schema/acknowledgement_msg_who_am_i.json rename to contracts/ibc-reflect/schema/ibc/acknowledgement_msg_who_am_i.json diff --git a/contracts/ibc-reflect/schema/packet_msg.json b/contracts/ibc-reflect/schema/ibc/packet_msg.json similarity index 100% rename from contracts/ibc-reflect/schema/packet_msg.json rename to contracts/ibc-reflect/schema/ibc/packet_msg.json diff --git a/contracts/ibc-reflect/src/bin/schema.rs b/contracts/ibc-reflect/src/bin/schema.rs index 74b3408387..5103b778f8 100644 --- a/contracts/ibc-reflect/src/bin/schema.rs +++ b/contracts/ibc-reflect/src/bin/schema.rs @@ -19,6 +19,7 @@ fn main() { // Schemas for inter-contract communication let mut out_dir = current_dir().unwrap(); out_dir.push("schema"); + out_dir.push("ibc"); export_schema(&schema_for!(PacketMsg), &out_dir); export_schema_with_title( &schema_for!(AcknowledgementMsg), From 793bc1c2ae705126d2148ee87408816ec36f0c10 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 23 Aug 2023 10:06:01 +0200 Subject: [PATCH 0627/2372] Rename AcknowledgementMsg::Err to ::Error --- contracts/ibc-reflect-send/src/ibc.rs | 4 ++-- contracts/ibc-reflect-send/src/ibc_msg.rs | 7 +++---- contracts/ibc-reflect/src/contract.rs | 2 +- contracts/ibc-reflect/src/msg.rs | 7 +++---- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/contracts/ibc-reflect-send/src/ibc.rs b/contracts/ibc-reflect-send/src/ibc.rs index adede549eb..634fed3e81 100644 --- a/contracts/ibc-reflect-send/src/ibc.rs +++ b/contracts/ibc-reflect-send/src/ibc.rs @@ -146,7 +146,7 @@ fn acknowledge_who_am_i( // ignore errors (but mention in log) let WhoAmIResponse { account } = match ack { AcknowledgementMsg::Ok(res) => res, - AcknowledgementMsg::Err(e) => { + AcknowledgementMsg::Error(e) => { return Ok(IbcBasicResponse::new() .add_attribute("action", "acknowledge_who_am_i") .add_attribute("error", e)) @@ -176,7 +176,7 @@ fn acknowledge_balances( // ignore errors (but mention in log) let BalancesResponse { account, balances } = match ack { AcknowledgementMsg::Ok(res) => res, - AcknowledgementMsg::Err(e) => { + AcknowledgementMsg::Error(e) => { return Ok(IbcBasicResponse::new() .add_attribute("action", "acknowledge_balances") .add_attribute("error", e)) diff --git a/contracts/ibc-reflect-send/src/ibc_msg.rs b/contracts/ibc-reflect-send/src/ibc_msg.rs index 48f38406a4..ca6041218c 100644 --- a/contracts/ibc-reflect-send/src/ibc_msg.rs +++ b/contracts/ibc-reflect-send/src/ibc_msg.rs @@ -23,22 +23,21 @@ pub enum PacketMsg { #[cw_serde] pub enum AcknowledgementMsg { Ok(S), - #[serde(rename = "error")] - Err(String), + Error(String), } impl AcknowledgementMsg { pub fn unwrap(self) -> S { match self { AcknowledgementMsg::Ok(data) => data, - AcknowledgementMsg::Err(err) => panic!("{}", err), + AcknowledgementMsg::Error(err) => panic!("{}", err), } } pub fn unwrap_err(self) -> String { match self { AcknowledgementMsg::Ok(_) => panic!("not an error"), - AcknowledgementMsg::Err(err) => err, + AcknowledgementMsg::Error(err) => err, } } } diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 23fa7046a3..1af5d90e91 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -224,7 +224,7 @@ pub fn migrate(_deps: DepsMut, _env: Env, _msg: Empty) -> StdResult { // this encode an error or error message into a proper acknowledgement to the recevier fn encode_ibc_error(msg: impl Into) -> Binary { // this cannot error, unwrap to keep the interface simple - to_binary(&AcknowledgementMsg::<()>::Err(msg.into())).unwrap() + to_binary(&AcknowledgementMsg::<()>::Error(msg.into())).unwrap() } #[entry_point] diff --git a/contracts/ibc-reflect/src/msg.rs b/contracts/ibc-reflect/src/msg.rs index 487e28edaa..6f72005f1c 100644 --- a/contracts/ibc-reflect/src/msg.rs +++ b/contracts/ibc-reflect/src/msg.rs @@ -62,22 +62,21 @@ pub enum PacketMsg { #[cw_serde] pub enum AcknowledgementMsg { Ok(S), - #[serde(rename = "error")] - Err(String), + Error(String), } impl AcknowledgementMsg { pub fn unwrap(self) -> S { match self { AcknowledgementMsg::Ok(data) => data, - AcknowledgementMsg::Err(err) => panic!("{}", err), + AcknowledgementMsg::Error(err) => panic!("{}", err), } } pub fn unwrap_err(self) -> String { match self { AcknowledgementMsg::Ok(_) => panic!("not an error"), - AcknowledgementMsg::Err(err) => err, + AcknowledgementMsg::Error(err) => err, } } } From d6c0644cc2b51482a44744d414459aa65d343eb6 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 23 Aug 2023 10:44:12 +0200 Subject: [PATCH 0628/2372] Add next_key and next_value to Storage trait --- packages/vm/src/backend.rs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/packages/vm/src/backend.rs b/packages/vm/src/backend.rs index 336044cd92..7d0b399f7e 100644 --- a/packages/vm/src/backend.rs +++ b/packages/vm/src/backend.rs @@ -122,6 +122,32 @@ pub trait Storage { #[cfg(feature = "iterator")] fn next(&mut self, iterator_id: u32) -> BackendResult>; + /// Returns the next value of the iterator with the given ID. + /// + /// If the ID is not found, a BackendError::IteratorDoesNotExist is returned. + /// + /// The default implementation uses [`Storage::next`] and discards the key. + /// More efficient implementations might be possible depending on the storage. + #[cfg(feature = "iterator")] + fn next_value(&mut self, iterator_id: u32) -> BackendResult>> { + let (result, gas_info) = self.next(iterator_id); + let result = result.map(|record| record.map(|(_, v)| v)); + (result, gas_info) + } + + /// Returns the next key of the iterator with the given ID. + /// + /// If the ID is not found, a BackendError::IteratorDoesNotExist is returned. + /// + /// The default implementation uses [`Storage::next`] and discards the value. + /// More efficient implementations might be possible depending on the storage. + #[cfg(feature = "iterator")] + fn next_key(&mut self, iterator_id: u32) -> BackendResult>> { + let (result, gas_info) = self.next(iterator_id); + let result = result.map(|record| record.map(|(k, _)| k)); + (result, gas_info) + } + fn set(&mut self, key: &[u8], value: &[u8]) -> BackendResult<()>; /// Removes a database entry at `key`. From aef3f74080951bd042adda954ac1671fb82db281 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 23 Aug 2023 09:29:26 +0200 Subject: [PATCH 0629/2372] Add StdAck --- CHANGELOG.md | 2 + packages/std/src/lib.rs | 2 + packages/std/src/stdack.rs | 156 +++++++++++++++++++++++++++++++++++++ 3 files changed, 160 insertions(+) create mode 100644 packages/std/src/stdack.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index e116a990d1..6eff430a0a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,9 @@ and this project adheres to - cosmwasm-std: Make `abs_diff` const for `Uint{256,512}` and `Int{64,128,256,512}`. It is now const for all integer types. - cosmwasm-std: Implement `TryFrom` for `Decimal` ([#1832]) +- cosmwasm-std: Add `StdAck`. ([#1512]) +[#1512]: https://github.com/CosmWasm/cosmwasm/issues/1512 [#1799]: https://github.com/CosmWasm/cosmwasm/pull/1799 [#1806]: https://github.com/CosmWasm/cosmwasm/pull/1806 [#1832]: https://github.com/CosmWasm/cosmwasm/pull/1832 diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index d44d686da6..6bccc14595 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -28,6 +28,7 @@ mod query; mod results; mod sections; mod serde; +mod stdack; mod storage; mod timestamp; mod traits; @@ -87,6 +88,7 @@ pub use crate::results::{DistributionMsg, StakingMsg}; #[cfg(feature = "stargate")] pub use crate::results::{GovMsg, VoteOption}; pub use crate::serde::{from_binary, from_slice, to_binary, to_vec}; +pub use crate::stdack::StdAck; pub use crate::storage::MemoryStorage; pub use crate::timestamp::Timestamp; pub use crate::traits::{Api, Querier, QuerierResult, QuerierWrapper, Storage}; diff --git a/packages/std/src/stdack.rs b/packages/std/src/stdack.rs new file mode 100644 index 0000000000..860e82c6a7 --- /dev/null +++ b/packages/std/src/stdack.rs @@ -0,0 +1,156 @@ +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +use crate::binary::Binary; +use crate::to_binary; + +/// This is a standard IBC acknowledgement type. IBC application are free +/// to use any acknowledgement format they want. However, for compatibility +/// purposes it is recommended to use this. +/// +/// The original proto definition can be found at +/// and . +/// +/// In contrast to the original idea, [ICS-20](https://github.com/cosmos/ibc/tree/ed849c7bacf16204e9509f0f0df325391f3ce25c/spec/app/ics-020-fungible-token-transfer#technical-specification) and CosmWasm IBC protocols +/// use JSON instead of a protobuf serialization. +/// +/// If ibc_receive_packet returns Err(), then x/wasm runtime will rollback the state and return an error message in this format. +/// +/// ## Examples +/// +/// For your convenience, there are success and error constructors. +/// +/// ``` +/// use cosmwasm_std::StdAck; +/// +/// let ack1 = StdAck::success(b"\x01"); // 0x01 is a FungibleTokenPacketSuccess from ICS-20. +/// assert!(ack1.is_success()); +/// +/// let ack2 = StdAck::error("kaputt"); // Some free text error message +/// assert!(ack2.is_error()); +/// ``` +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum StdAck { + Result(Binary), + Error(String), +} + +impl StdAck { + /// Creates a success ack with the given data + pub fn success(data: impl Into) -> Self { + StdAck::Result(data.into()) + } + + /// Creates an error ack + pub fn error(err: impl Into) -> Self { + StdAck::Error(err.into()) + } + + #[must_use = "if you intended to assert that this is a success, consider `.unwrap()` instead"] + #[inline] + pub const fn is_success(&self) -> bool { + matches!(*self, StdAck::Result(_)) + } + + #[must_use = "if you intended to assert that this is an error, consider `.unwrap_err()` instead"] + #[inline] + pub const fn is_error(&self) -> bool { + !self.is_success() + } + + /// Serialized the ack to binary using JSON. This used for setting the acknowledgement + /// field in IbcReceiveResponse. + /// + /// ## Examples + /// + /// Show how the acknowledgement looks on the write: + /// + /// ``` + /// # use cosmwasm_std::StdAck; + /// let ack1 = StdAck::success(b"\x01"); // 0x01 is a FungibleTokenPacketSuccess from ICS-20. + /// assert_eq!(ack1.to_binary(), br#"{"result":"AQ=="}"#); + /// + /// let ack2 = StdAck::error("kaputt"); // Some free text error message + /// assert_eq!(ack2.to_binary(), br#"{"error":"kaputt"}"#); + /// ``` + /// + /// Set acknowledgement field in `IbcReceiveResponse`: + /// + /// ```ignore + /// use cosmwasm_std::{StdAck, IbcReceiveResponse}; + /// + /// let ack = StdAck::success(b"\x01"); // 0x01 is a FungibleTokenPacketSuccess from ICS-20. + /// + /// let res = IbcReceiveResponse::new().set_ack(ack.to_binary()); + /// let res = IbcReceiveResponse::new().set_ack(ack); // Does the same but consumes the instance + /// ``` + pub fn to_binary(&self) -> Binary { + // Pretty sure this cannot fail. If that changes we can create a non-failing implementation here. + to_binary(&self).unwrap() + } + + pub fn unwrap(self) -> Binary { + match self { + StdAck::Result(data) => data, + StdAck::Error(err) => panic!("{}", err), + } + } + + pub fn unwrap_err(self) -> String { + match self { + StdAck::Result(_) => panic!("not an error"), + StdAck::Error(err) => err, + } + } +} + +impl From for Binary { + fn from(original: StdAck) -> Binary { + original.to_binary() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn stdack_success_works() { + let success = StdAck::success(b"foo"); + match success { + StdAck::Result(data) => assert_eq!(data, b"foo"), + StdAck::Error(_err) => panic!("must not be an error"), + } + } + + #[test] + fn stdack_error_works() { + let err = StdAck::error("bar"); + match err { + StdAck::Result(_data) => panic!("must not be a success"), + StdAck::Error(err) => assert_eq!(err, "bar"), + } + } + + #[test] + fn stdack_is_success_is_error_work() { + let success = StdAck::success(b"foo"); + let err = StdAck::error("bar"); + // is_success + assert!(success.is_success()); + assert!(!err.is_success()); + // is_eror + assert!(!success.is_error()); + assert!(err.is_error()); + } + + #[test] + fn stdack_to_binary_works() { + let ack1 = StdAck::success(b"\x01"); + assert_eq!(ack1.to_binary(), br#"{"result":"AQ=="}"#); + + let ack2 = StdAck::error("kaputt"); + assert_eq!(ack2.to_binary(), br#"{"error":"kaputt"}"#); + } +} From 4df0e340eba37db9e8e18b107f292d402ad93c23 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 23 Aug 2023 10:39:59 +0200 Subject: [PATCH 0630/2372] Rename to StdAck::Success --- packages/std/src/stdack.rs | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/packages/std/src/stdack.rs b/packages/std/src/stdack.rs index 860e82c6a7..46acad3a2b 100644 --- a/packages/std/src/stdack.rs +++ b/packages/std/src/stdack.rs @@ -14,7 +14,11 @@ use crate::to_binary; /// In contrast to the original idea, [ICS-20](https://github.com/cosmos/ibc/tree/ed849c7bacf16204e9509f0f0df325391f3ce25c/spec/app/ics-020-fungible-token-transfer#technical-specification) and CosmWasm IBC protocols /// use JSON instead of a protobuf serialization. /// -/// If ibc_receive_packet returns Err(), then x/wasm runtime will rollback the state and return an error message in this format. +/// For compatibility, we use the field name "result" for the success case in JSON. +/// However, all Rust APIs use the term "success" for clarity and discriminability from [Result]. +/// +/// If ibc_receive_packet returns Err(), then x/wasm runtime will rollback the state and +/// return an error message in this format. /// /// ## Examples /// @@ -32,14 +36,15 @@ use crate::to_binary; #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] pub enum StdAck { - Result(Binary), + #[serde(rename = "result")] + Success(Binary), Error(String), } impl StdAck { /// Creates a success ack with the given data pub fn success(data: impl Into) -> Self { - StdAck::Result(data.into()) + StdAck::Success(data.into()) } /// Creates an error ack @@ -50,7 +55,7 @@ impl StdAck { #[must_use = "if you intended to assert that this is a success, consider `.unwrap()` instead"] #[inline] pub const fn is_success(&self) -> bool { - matches!(*self, StdAck::Result(_)) + matches!(*self, StdAck::Success(_)) } #[must_use = "if you intended to assert that this is an error, consider `.unwrap_err()` instead"] @@ -92,14 +97,14 @@ impl StdAck { pub fn unwrap(self) -> Binary { match self { - StdAck::Result(data) => data, + StdAck::Success(data) => data, StdAck::Error(err) => panic!("{}", err), } } pub fn unwrap_err(self) -> String { match self { - StdAck::Result(_) => panic!("not an error"), + StdAck::Success(_) => panic!("not an error"), StdAck::Error(err) => err, } } @@ -119,7 +124,7 @@ mod tests { fn stdack_success_works() { let success = StdAck::success(b"foo"); match success { - StdAck::Result(data) => assert_eq!(data, b"foo"), + StdAck::Success(data) => assert_eq!(data, b"foo"), StdAck::Error(_err) => panic!("must not be an error"), } } @@ -128,7 +133,7 @@ mod tests { fn stdack_error_works() { let err = StdAck::error("bar"); match err { - StdAck::Result(_data) => panic!("must not be a success"), + StdAck::Success(_data) => panic!("must not be a success"), StdAck::Error(err) => assert_eq!(err, "bar"), } } From 94d0eea61d66b0d98b264d1ae7c7f84feefa1776 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 23 Aug 2023 11:12:10 +0200 Subject: [PATCH 0631/2372] Improve some docs around StdAck -> Binary conversion --- packages/std/src/ibc.rs | 11 +++++++++++ packages/std/src/stdack.rs | 8 +++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index f56944691c..d3afd68887 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -666,6 +666,17 @@ impl IbcReceiveResponse { } /// Set the acknowledgement for this response. + /// + /// ## Examples + /// + /// ``` + /// use cosmwasm_std::{StdAck, IbcReceiveResponse}; + /// + /// fn make_response_with_ack() -> IbcReceiveResponse { + /// let ack = StdAck::success(b"\x01"); // 0x01 is a FungibleTokenPacketSuccess from ICS-20. + /// IbcReceiveResponse::new().set_ack(ack) + /// } + /// ``` pub fn set_ack(mut self, ack: impl Into) -> Self { self.acknowledgement = ack.into(); self diff --git a/packages/std/src/stdack.rs b/packages/std/src/stdack.rs index 46acad3a2b..e933257a08 100644 --- a/packages/std/src/stdack.rs +++ b/packages/std/src/stdack.rs @@ -82,15 +82,17 @@ impl StdAck { /// /// Set acknowledgement field in `IbcReceiveResponse`: /// - /// ```ignore + /// ``` /// use cosmwasm_std::{StdAck, IbcReceiveResponse}; /// /// let ack = StdAck::success(b"\x01"); // 0x01 is a FungibleTokenPacketSuccess from ICS-20. /// - /// let res = IbcReceiveResponse::new().set_ack(ack.to_binary()); - /// let res = IbcReceiveResponse::new().set_ack(ack); // Does the same but consumes the instance + /// let res: IbcReceiveResponse = IbcReceiveResponse::new().set_ack(ack.to_binary()); + /// let res: IbcReceiveResponse = IbcReceiveResponse::new().set_ack(ack); // Does the same but consumes the instance /// ``` pub fn to_binary(&self) -> Binary { + // We need a non-failing StdAck -> Binary conversion to allow using StdAck in + // `impl Into` arguments. // Pretty sure this cannot fail. If that changes we can create a non-failing implementation here. to_binary(&self).unwrap() } From b11b89b7fbbf1cc367a351c37e4ce4a98ff94a0f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 23 Aug 2023 15:40:23 +0200 Subject: [PATCH 0632/2372] Add db_next_key and db_next_value imports to vm --- packages/vm/src/compatibility.rs | 4 + packages/vm/src/environment.rs | 2 + packages/vm/src/imports.rs | 125 +++++++++++++++++++++++++++++++ packages/vm/src/instance.rs | 23 +++++- 4 files changed, 153 insertions(+), 1 deletion(-) diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index c1c6d824b5..03d367351e 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -30,6 +30,10 @@ const SUPPORTED_IMPORTS: &[&str] = &[ "env.db_scan", #[cfg(feature = "iterator")] "env.db_next", + #[cfg(all(feature = "iterator"))] + "env.db_next_key", + #[cfg(all(feature = "iterator"))] + "env.db_next_value", ]; /// Lists all entry points we expect to be present when calling a contract. diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index 53eb402cc3..746126f1fe 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -493,6 +493,8 @@ mod tests { "db_remove" => Function::new_typed(&mut store, |_a: u32| {}), "db_scan" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: i32| -> u32 { 0 }), "db_next" => Function::new_typed(&mut store, |_a: u32| -> u32 { 0 }), + "db_next_key" => Function::new_typed(&mut store, |_a: u32| -> u32 { 0 }), + "db_next_value" => Function::new_typed(&mut store, |_a: u32| -> u32 { 0 }), "query_chain" => Function::new_typed(&mut store, |_a: u32| -> u32 { 0 }), "addr_validate" => Function::new_typed(&mut store, |_a: u32| -> u32 { 0 }), "addr_canonicalize" => Function::new_typed(&mut store, |_a: u32, _b: u32| -> u32 { 0 }), diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index fcb556b5b9..7e6c81e586 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -533,6 +533,48 @@ pub fn do_db_next( + mut env: FunctionEnvMut>, + iterator_id: u32, +) -> VmResult { + let (data, mut store) = env.data_and_store_mut(); + + let (result, gas_info) = + data.with_storage_from_context::<_, _>(|store| Ok(store.next_key(iterator_id)))?; + + process_gas_info(data, &mut store, gas_info)?; + + // Empty key will later be treated as _no more element_. + let key = result?.unwrap_or_default(); + + write_to_contract(data, &mut store, &key) +} + +#[cfg(feature = "iterator")] +pub fn do_db_next_value( + mut env: FunctionEnvMut>, + iterator_id: u32, +) -> VmResult { + let (data, mut store) = env.data_and_store_mut(); + + let (result, gas_info) = + data.with_storage_from_context::<_, _>(|store| Ok(store.next_value(iterator_id)))?; + + process_gas_info(data, &mut store, gas_info)?; + + // Empty key will later be treated as _no more element_. + // No need to encode this further, as it is a single value. + let (mut value, has_next) = match result? { + Some(value) => (value, true), + None => (Vec::::new(), false), + }; + + // add has_next flag at the end + value.push(has_next as u8); + write_to_contract(data, &mut store, &value) +} + /// Creates a Region in the contract, writes the given data to it and returns the memory location fn write_to_contract( data: &Environment, @@ -634,6 +676,8 @@ mod tests { "db_remove" => Function::new_typed(&mut store, |_a: u32| {}), "db_scan" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: i32| -> u32 { 0 }), "db_next" => Function::new_typed(&mut store, |_a: u32| -> u32 { 0 }), + "db_next_key" => Function::new_typed(&mut store, |_a: u32| -> u32 { 0 }), + "db_next_value" => Function::new_typed(&mut store, |_a: u32| -> u32 { 0 }), "query_chain" => Function::new_typed(&mut store, |_a: u32| -> u32 { 0 }), "addr_validate" => Function::new_typed(&mut store, |_a: u32| -> u32 { 0 }), "addr_canonicalize" => Function::new_typed(&mut store, |_a: u32, _b: u32| -> u32 { 0 }), @@ -2173,4 +2217,85 @@ mod tests { e => panic!("Unexpected error: {e:?}"), } } + + #[test] + #[cfg(feature = "iterator")] + fn do_db_next_key_works() { + let api = MockApi::default(); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + + leave_default_data(&mut fe_mut); + + let id = do_db_scan(fe_mut.as_mut(), 0, 0, Order::Ascending.into()).unwrap(); + + // Entry 1 + let key_region_ptr = do_db_next_key(fe_mut.as_mut(), id).unwrap(); + assert_eq!(force_read(&mut fe_mut, key_region_ptr), KEY1); + + // Entry 2 + let key_region_ptr = do_db_next_key(fe_mut.as_mut(), id).unwrap(); + assert_eq!(force_read(&mut fe_mut, key_region_ptr), KEY2); + + // End + let key_region_ptr: u32 = do_db_next_key(fe_mut.as_mut(), id).unwrap(); + assert_eq!(force_read(&mut fe_mut, key_region_ptr), b""); + } + + #[test] + #[cfg(feature = "iterator")] + fn do_db_next_value_works() { + let api = MockApi::default(); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + + leave_default_data(&mut fe_mut); + + let id = do_db_scan(fe_mut.as_mut(), 0, 0, Order::Ascending.into()).unwrap(); + + // Entry 1 + let value_region_ptr = do_db_next_value(fe_mut.as_mut(), id).unwrap(); + assert_eq!( + force_read(&mut fe_mut, value_region_ptr), + [VALUE1, &[1]].concat() + ); + + // Entry 2 + let value_region_ptr = do_db_next_value(fe_mut.as_mut(), id).unwrap(); + assert_eq!( + force_read(&mut fe_mut, value_region_ptr), + [VALUE2, &[1]].concat() + ); + + // End + let value_region_ptr = do_db_next_value(fe_mut.as_mut(), id).unwrap(); + assert_eq!(force_read(&mut fe_mut, value_region_ptr), [0]); + } + + #[test] + #[cfg(feature = "iterator")] + fn do_db_next_works_mixed() { + let api = MockApi::default(); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + + leave_default_data(&mut fe_mut); + + let id = do_db_scan(fe_mut.as_mut(), 0, 0, Order::Ascending.into()).unwrap(); + + // Key 1 + let key_region_ptr = do_db_next_key(fe_mut.as_mut(), id).unwrap(); + assert_eq!(force_read(&mut fe_mut, key_region_ptr), KEY1); + + // Value 2 + let value_region_ptr = do_db_next_value(fe_mut.as_mut(), id).unwrap(); + assert_eq!( + force_read(&mut fe_mut, value_region_ptr), + [VALUE2, &[1]].concat() + ); + + // End + let kv_region_ptr = do_db_next(fe_mut.as_mut(), id).unwrap(); + assert_eq!(force_read(&mut fe_mut, kv_region_ptr), b"\0\0\0\0\0\0\0\0"); + } } diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 1661565a88..cafad9bd4c 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -19,7 +19,7 @@ use crate::imports::{ do_secp256k1_recover_pubkey, do_secp256k1_verify, }; #[cfg(feature = "iterator")] -use crate::imports::{do_db_next, do_db_scan}; +use crate::imports::{do_db_next, do_db_next_key, do_db_next_value, do_db_scan}; use crate::memory::{read_region, write_region}; use crate::size::Size; use crate::wasm_backend::{compile, make_compiling_engine}; @@ -237,6 +237,27 @@ where Function::new_typed_with_env(&mut store, &fe, do_db_next), ); + // Get next key of iterator with ID `iterator_id`. + // Creates a region containing the key and returns its address. + // Ownership of the result region is transferred to the contract. + // An empty key means no more elements. + #[cfg(feature = "iterator")] + env_imports.insert( + "db_next_key", + Function::new_typed_with_env(&mut store, &fe, do_db_next_key), + ); + + // Get next value of iterator with ID `iterator_id`. + // Creates a region containing the value and returns its address. + // Ownership of the result region is transferred to the contract. + // The region uses the format value || has_next (without length encoding), + // where has_next is a bool (encoded as u8) indicating whether there are more elements. + #[cfg(feature = "iterator")] + env_imports.insert( + "db_next_value", + Function::new_typed_with_env(&mut store, &fe, do_db_next_value), + ); + import_obj.register_namespace("env", env_imports); if let Some(extra_imports) = extra_imports { From d01f1b703991f2ed04df5eef8d5228cdbf4e0c34 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 23 Aug 2023 15:55:10 +0200 Subject: [PATCH 0633/2372] Add db_next_key and db_next_value imports to std --- packages/check/src/main.rs | 2 +- packages/std/Cargo.toml | 4 ++++ packages/std/src/imports.rs | 4 ++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/check/src/main.rs b/packages/check/src/main.rs index 6ba097470f..48998f889f 100644 --- a/packages/check/src/main.rs +++ b/packages/check/src/main.rs @@ -11,7 +11,7 @@ use cosmwasm_vm::capabilities_from_csv; use cosmwasm_vm::internals::{check_wasm, compile, make_compiling_engine}; const DEFAULT_AVAILABLE_CAPABILITIES: &str = - "iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2,cosmwasm_1_3"; + "iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2,cosmwasm_1_3,cosmwasm_1_4"; pub fn main() { let matches = Command::new("Contract checking") diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 614a6c0a41..160eb862a0 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -42,6 +42,10 @@ cosmwasm_1_2 = ["cosmwasm_1_1"] # This feature makes `BankQuery::DenomMetadata` available for the contract to call, but requires # the host blockchain to run CosmWasm `1.3.0` or higher. cosmwasm_1_3 = ["cosmwasm_1_2"] +# Together with the `iterator` feature this enables additional imports for more +# efficient iteration over DB keys or values. +# It requires the host blockchain to run CosmWasm `1.4.0` or higher. +cosmwasm_1_4 = ["cosmwasm_1_3"] [dependencies] base64 = "0.21.0" diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index c58580dcf0..8967514f6f 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -37,6 +37,10 @@ extern "C" { fn db_scan(start_ptr: u32, end_ptr: u32, order: i32) -> u32; #[cfg(feature = "iterator")] fn db_next(iterator_id: u32) -> u32; + #[cfg(all(feature = "iterator", feature = "cosmwasm_1_4"))] + fn db_next_key(iterator_id: u32) -> u32; + #[cfg(all(feature = "iterator", feature = "cosmwasm_1_4"))] + fn db_next_value(iterator_id: u32) -> u32; fn addr_validate(source_ptr: u32) -> u32; fn addr_canonicalize(source_ptr: u32, destination_ptr: u32) -> u32; From 06066d3da0fefff59fa94cafd22bddc721aabe2d Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 24 Aug 2023 12:04:54 +0200 Subject: [PATCH 0634/2372] Apply suggestions from code review Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/vm/src/backend.rs | 2 ++ packages/vm/src/compatibility.rs | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/vm/src/backend.rs b/packages/vm/src/backend.rs index 7d0b399f7e..3e2c58a768 100644 --- a/packages/vm/src/backend.rs +++ b/packages/vm/src/backend.rs @@ -123,6 +123,7 @@ pub trait Storage { fn next(&mut self, iterator_id: u32) -> BackendResult>; /// Returns the next value of the iterator with the given ID. + /// Since the iterator is incremented, the corresponding key will never be accessible. /// /// If the ID is not found, a BackendError::IteratorDoesNotExist is returned. /// @@ -136,6 +137,7 @@ pub trait Storage { } /// Returns the next key of the iterator with the given ID. + /// Since the iterator is incremented, the corresponding value will never be accessible. /// /// If the ID is not found, a BackendError::IteratorDoesNotExist is returned. /// diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index 03d367351e..dfbbb606a8 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -30,9 +30,9 @@ const SUPPORTED_IMPORTS: &[&str] = &[ "env.db_scan", #[cfg(feature = "iterator")] "env.db_next", - #[cfg(all(feature = "iterator"))] + #[cfg(feature = "iterator")] "env.db_next_key", - #[cfg(all(feature = "iterator"))] + #[cfg(feature = "iterator")] "env.db_next_value", ]; From 4c68932f5d8e365cb74a268dabe2f775930507c0 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 24 Aug 2023 12:18:58 +0200 Subject: [PATCH 0635/2372] cargo fmt --- packages/vm/src/backend.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vm/src/backend.rs b/packages/vm/src/backend.rs index 3e2c58a768..bd81d466c4 100644 --- a/packages/vm/src/backend.rs +++ b/packages/vm/src/backend.rs @@ -123,7 +123,7 @@ pub trait Storage { fn next(&mut self, iterator_id: u32) -> BackendResult>; /// Returns the next value of the iterator with the given ID. - /// Since the iterator is incremented, the corresponding key will never be accessible. + /// Since the iterator is incremented, the corresponding key will never be accessible. /// /// If the ID is not found, a BackendError::IteratorDoesNotExist is returned. /// @@ -137,7 +137,7 @@ pub trait Storage { } /// Returns the next key of the iterator with the given ID. - /// Since the iterator is incremented, the corresponding value will never be accessible. + /// Since the iterator is incremented, the corresponding value will never be accessible. /// /// If the ID is not found, a BackendError::IteratorDoesNotExist is returned. /// From d2db5ed49d766b605545edd9934cc92c90e59822 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 24 Aug 2023 12:47:53 +0200 Subject: [PATCH 0636/2372] Remove unnecessary capability --- packages/check/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/check/src/main.rs b/packages/check/src/main.rs index 48998f889f..6ba097470f 100644 --- a/packages/check/src/main.rs +++ b/packages/check/src/main.rs @@ -11,7 +11,7 @@ use cosmwasm_vm::capabilities_from_csv; use cosmwasm_vm::internals::{check_wasm, compile, make_compiling_engine}; const DEFAULT_AVAILABLE_CAPABILITIES: &str = - "iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2,cosmwasm_1_3,cosmwasm_1_4"; + "iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2,cosmwasm_1_3"; pub fn main() { let matches = Command::new("Contract checking") From b92782b45b46d0e140c223c49d0319187579dae7 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 24 Aug 2023 13:30:50 +0200 Subject: [PATCH 0637/2372] Return null pointer when no more elements --- packages/vm/src/imports.rs | 35 ++++++++++++----------------------- packages/vm/src/instance.rs | 9 +++------ 2 files changed, 15 insertions(+), 29 deletions(-) diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 7e6c81e586..08fdc252b6 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -545,8 +545,10 @@ pub fn do_db_next_key key, + None => return Ok(0), + }; write_to_contract(data, &mut store, &key) } @@ -563,15 +565,11 @@ pub fn do_db_next_value (value, true), - None => (Vec::::new(), false), + let value = match result? { + Some(value) => value, + None => return Ok(0), }; - // add has_next flag at the end - value.push(has_next as u8); write_to_contract(data, &mut store, &value) } @@ -2239,7 +2237,7 @@ mod tests { // End let key_region_ptr: u32 = do_db_next_key(fe_mut.as_mut(), id).unwrap(); - assert_eq!(force_read(&mut fe_mut, key_region_ptr), b""); + assert_eq!(key_region_ptr, 0); } #[test] @@ -2255,21 +2253,15 @@ mod tests { // Entry 1 let value_region_ptr = do_db_next_value(fe_mut.as_mut(), id).unwrap(); - assert_eq!( - force_read(&mut fe_mut, value_region_ptr), - [VALUE1, &[1]].concat() - ); + assert_eq!(force_read(&mut fe_mut, value_region_ptr), VALUE1); // Entry 2 let value_region_ptr = do_db_next_value(fe_mut.as_mut(), id).unwrap(); - assert_eq!( - force_read(&mut fe_mut, value_region_ptr), - [VALUE2, &[1]].concat() - ); + assert_eq!(force_read(&mut fe_mut, value_region_ptr), VALUE2); // End let value_region_ptr = do_db_next_value(fe_mut.as_mut(), id).unwrap(); - assert_eq!(force_read(&mut fe_mut, value_region_ptr), [0]); + assert_eq!(value_region_ptr, 0); } #[test] @@ -2289,10 +2281,7 @@ mod tests { // Value 2 let value_region_ptr = do_db_next_value(fe_mut.as_mut(), id).unwrap(); - assert_eq!( - force_read(&mut fe_mut, value_region_ptr), - [VALUE2, &[1]].concat() - ); + assert_eq!(force_read(&mut fe_mut, value_region_ptr), VALUE2); // End let kv_region_ptr = do_db_next(fe_mut.as_mut(), id).unwrap(); diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index cafad9bd4c..38cde7c4aa 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -110,7 +110,7 @@ where let mut import_obj = Imports::new(); let mut env_imports = Exports::new(); - // Reads the database entry at the given key into the the value. + // Reads the database entry at the given key into the value. // Returns 0 if key does not exist and pointer to result region otherwise. // Ownership of the key pointer is not transferred to the host. // Ownership of the value pointer is transferred to the contract. @@ -238,9 +238,8 @@ where ); // Get next key of iterator with ID `iterator_id`. - // Creates a region containing the key and returns its address. + // Returns 0 if there are no more entries and pointer to result region otherwise. // Ownership of the result region is transferred to the contract. - // An empty key means no more elements. #[cfg(feature = "iterator")] env_imports.insert( "db_next_key", @@ -248,10 +247,8 @@ where ); // Get next value of iterator with ID `iterator_id`. - // Creates a region containing the value and returns its address. + // Returns 0 if there are no more entries and pointer to result region otherwise. // Ownership of the result region is transferred to the contract. - // The region uses the format value || has_next (without length encoding), - // where has_next is a bool (encoded as u8) indicating whether there are more elements. #[cfg(feature = "iterator")] env_imports.insert( "db_next_value", From 7ee3ebf9479a594af8177b347e53077949766018 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 24 Aug 2023 17:53:53 +0200 Subject: [PATCH 0638/2372] Implement range_{keys, values} using new imports --- packages/std/src/imports.rs | 87 ++++++++++++++++++++++++++++++++++--- 1 file changed, 80 insertions(+), 7 deletions(-) diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index 8967514f6f..8f99e6941e 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -133,16 +133,89 @@ impl Storage for ExternalStorage { end: Option<&[u8]>, order: Order, ) -> Box> { - // There is lots of gotchas on turning options into regions for FFI, thus this design - // See: https://github.com/CosmWasm/cosmwasm/pull/509 - let start_region = start.map(build_region); - let end_region = end.map(build_region); - let start_region_addr = get_optional_region_address(&start_region.as_ref()); - let end_region_addr = get_optional_region_address(&end_region.as_ref()); - let iterator_id = unsafe { db_scan(start_region_addr, end_region_addr, order as i32) }; + let iterator_id = create_iter(start, end, order); let iter = ExternalIterator { iterator_id }; Box::new(iter) } + + #[cfg(all(feature = "cosmwasm_1_4", feature = "iterator"))] + fn range_keys<'a>( + &'a self, + start: Option<&[u8]>, + end: Option<&[u8]>, + order: Order, + ) -> Box> + 'a> { + let iterator_id = create_iter(start, end, order); + let iter = ExternalPartialIterator { + iterator_id, + partial_type: PartialType::Keys, + }; + Box::new(iter) + } + + #[cfg(all(feature = "cosmwasm_1_4", feature = "iterator"))] + fn range_values<'a>( + &'a self, + start: Option<&[u8]>, + end: Option<&[u8]>, + order: Order, + ) -> Box> + 'a> { + let iterator_id = create_iter(start, end, order); + let iter = ExternalPartialIterator { + iterator_id, + partial_type: PartialType::Values, + }; + Box::new(iter) + } +} + +#[cfg(feature = "iterator")] +fn create_iter(start: Option<&[u8]>, end: Option<&[u8]>, order: Order) -> u32 { + // There is lots of gotchas on turning options into regions for FFI, thus this design + // See: https://github.com/CosmWasm/cosmwasm/pull/509 + let start_region = start.map(build_region); + let end_region = end.map(build_region); + let start_region_addr = get_optional_region_address(&start_region.as_ref()); + let end_region_addr = get_optional_region_address(&end_region.as_ref()); + unsafe { db_scan(start_region_addr, end_region_addr, order as i32) } +} + +#[cfg(all(feature = "cosmwasm_1_4", feature = "iterator"))] +enum PartialType { + Keys, + Values, +} + +/// ExternalPartialIterator makes a call out to `next_key` or `next_value` +/// depending on its `partial_type`. +/// Compared to `ExternalIterator`, it allows iterating only over the keys or +/// values instead of both. +#[cfg(all(feature = "cosmwasm_1_4", feature = "iterator"))] +struct ExternalPartialIterator { + iterator_id: u32, + partial_type: PartialType, +} + +#[cfg(all(feature = "cosmwasm_1_4", feature = "iterator"))] +impl Iterator for ExternalPartialIterator { + type Item = Vec; + + fn next(&mut self) -> Option { + // here we differentiate between the two types + let next_result = match self.partial_type { + PartialType::Keys => unsafe { db_next_key(self.iterator_id) }, + PartialType::Values => unsafe { db_next_value(self.iterator_id) }, + }; + + if next_result == 0 { + // iterator is done + return None; + } + + let data_region = next_result as *mut Region; + let data = unsafe { consume_region(data_region) }; + Some(data) + } } #[cfg(feature = "iterator")] From 28459fae9c1f53af859614dd1f133656d2f0eb6b Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 25 Aug 2023 09:45:50 +0200 Subject: [PATCH 0639/2372] Use range_keys in burner contract --- contracts/burner/Cargo.toml | 2 +- contracts/burner/src/contract.rs | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/contracts/burner/Cargo.toml b/contracts/burner/Cargo.toml index 7484840261..394074b75d 100644 --- a/contracts/burner/Cargo.toml +++ b/contracts/burner/Cargo.toml @@ -33,7 +33,7 @@ backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } -cosmwasm-std = { path = "../../packages/std", features = ["iterator"] } +cosmwasm-std = { path = "../../packages/std", features = ["iterator", "cosmwasm_1_4"] } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } diff --git a/contracts/burner/src/contract.rs b/contracts/burner/src/contract.rs index e2cd85fb37..d50ec14761 100644 --- a/contracts/burner/src/contract.rs +++ b/contracts/burner/src/contract.rs @@ -52,9 +52,8 @@ pub fn execute_cleanup( let take_this_scan = std::cmp::min(PER_SCAN, limit); let keys: Vec<_> = deps .storage - .range(None, None, Order::Ascending) + .range_keys(None, None, Order::Ascending) .take(take_this_scan) - .map(|(k, _)| k) .collect(); let deleted_this_scan = keys.len(); for k in keys { From 00730d89b58fc975c22f32f248ba5e9d42579699 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 28 Aug 2023 09:32:04 +0200 Subject: [PATCH 0640/2372] Add changelog entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e116a990d1..55cfc4c1aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,10 +13,14 @@ and this project adheres to - cosmwasm-std: Make `abs_diff` const for `Uint{256,512}` and `Int{64,128,256,512}`. It is now const for all integer types. - cosmwasm-std: Implement `TryFrom` for `Decimal` ([#1832]) +- cosmwasm-std: Add new imports `db_next_{key, value}` for iterating storage + keys / values only and make `Storage::{range_key, range_value}` more + efficient. This requires the `cosmwasm_1_4` feature to be enabled. ([#1834]) [#1799]: https://github.com/CosmWasm/cosmwasm/pull/1799 [#1806]: https://github.com/CosmWasm/cosmwasm/pull/1806 [#1832]: https://github.com/CosmWasm/cosmwasm/pull/1832 +[#1834]: https://github.com/CosmWasm/cosmwasm/pull/1834 ### Changed From 4f68dd714f9ec95d04379561a900c893e2a4b484 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 28 Aug 2023 10:07:59 +0200 Subject: [PATCH 0641/2372] Fix changelog Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55cfc4c1aa..f46ce5bbe3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,7 @@ and this project adheres to `Int{64,128,256,512}`. It is now const for all integer types. - cosmwasm-std: Implement `TryFrom` for `Decimal` ([#1832]) - cosmwasm-std: Add new imports `db_next_{key, value}` for iterating storage - keys / values only and make `Storage::{range_key, range_value}` more + keys / values only and make `Storage::{range_keys, range_values}` more efficient. This requires the `cosmwasm_1_4` feature to be enabled. ([#1834]) [#1799]: https://github.com/CosmWasm/cosmwasm/pull/1799 From ab08351d843091c9fc7e9c6b2cb213c893eae291 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Mon, 28 Aug 2023 12:33:23 +0200 Subject: [PATCH 0642/2372] Fix dead links / syntax --- packages/std/src/ibc.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index d3afd68887..27ca1ddf58 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -26,7 +26,7 @@ pub enum IbcMsg { /// We cannot select the port_id, this is whatever the local chain has bound the ibctransfer /// module to. Transfer { - /// exisiting channel to send the tokens over + /// existing channel to send the tokens over channel_id: String, /// address on the remote chain to receive these tokens to_address: String, @@ -164,7 +164,7 @@ pub enum IbcOrder { #[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialEq, Eq, JsonSchema)] pub struct IbcTimeoutBlock { /// the version that the client is currently on - /// (eg. after reseting the chain this could increment 1 as height drops to 0) + /// (e.g. after resetting the chain this could increment 1 as height drops to 0) pub revision: u64, /// block height after which the packet times out. /// the height within the given revision @@ -492,18 +492,18 @@ pub struct IbcBasicResponse { /// /// More info about events (and their attributes) can be found in [*Cosmos SDK* docs]. /// - /// [*Cosmos SDK* docs]: https://docs.cosmos.network/v0.42/core/events.html + /// [*Cosmos SDK* docs]: https://docs.cosmos.network/main/core/events.html pub attributes: Vec, /// Extra, custom events separate from the main `wasm` one. These will have /// `wasm-` prepended to the type. /// /// More info about events can be found in [*Cosmos SDK* docs]. /// - /// [*Cosmos SDK* docs]: https://docs.cosmos.network/v0.42/core/events.html + /// [*Cosmos SDK* docs]: https://docs.cosmos.network/main/core/events.html pub events: Vec, } -// Custom imlementation in order to implement it for all `T`, even if `T` is not `Default`. +// Custom implementation in order to implement it for all `T`, even if `T` is not `Default`. impl Default for IbcBasicResponse { fn default() -> Self { IbcBasicResponse { @@ -532,7 +532,7 @@ impl IbcBasicResponse { self } - /// This takes an explicit SubMsg (creates via eg. `reply_on_error`) + /// This takes an explicit SubMsg (creates via e.g. `reply_on_error`) /// and adds it to the list of messages to process. pub fn add_submessage(mut self, msg: SubMsg) -> Self { self.messages.push(msg); @@ -626,7 +626,7 @@ impl IbcBasicResponse { #[non_exhaustive] pub struct IbcReceiveResponse { /// The bytes we return to the contract that sent the packet. - /// This may represent a success or error of exection + /// This may represent a success or error of execution pub acknowledgement: Binary, /// Optional list of messages to pass. These will be executed in order. /// If the ReplyOn member is set, they will invoke this contract's `reply` entry point @@ -637,18 +637,18 @@ pub struct IbcReceiveResponse { /// /// More info about events (and their attributes) can be found in [*Cosmos SDK* docs]. /// - /// [*Cosmos SDK* docs]: https://docs.cosmos.network/v0.42/core/events.html + /// [*Cosmos SDK* docs]: https://docs.cosmos.network/main/core/events.html pub attributes: Vec, /// Extra, custom events separate from the main `wasm` one. These will have /// `wasm-` prepended to the type. /// /// More info about events can be found in [*Cosmos SDK* docs]. /// - /// [*Cosmos SDK* docs]: https://docs.cosmos.network/v0.42/core/events.html + /// [*Cosmos SDK* docs]: https://docs.cosmos.network/main/core/events.html pub events: Vec, } -// Custom imlementation in order to implement it for all `T`, even if `T` is not `Default`. +// Custom implementation in order to implement it for all `T`, even if `T` is not `Default`. impl Default for IbcReceiveResponse { fn default() -> Self { IbcReceiveResponse { @@ -695,7 +695,7 @@ impl IbcReceiveResponse { self } - /// This takes an explicit SubMsg (creates via eg. `reply_on_error`) + /// This takes an explicit SubMsg (creates via e.g. `reply_on_error`) /// and adds it to the list of messages to process. pub fn add_submessage(mut self, msg: SubMsg) -> Self { self.messages.push(msg); @@ -844,7 +844,7 @@ mod tests { }; // basic checks - assert!(epoch1a == epoch1a); + assert_eq!(epoch1a, epoch1a); assert!(epoch1a < epoch1b); assert!(epoch1b > epoch1a); assert!(epoch2a > epoch1a); From ebf8c086ff85db11b21dd5669ff2f7ed426a462d Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Mon, 28 Aug 2023 13:35:27 +0200 Subject: [PATCH 0643/2372] Update schema files --- contracts/ibc-reflect-send/schema/ibc-reflect-send.json | 4 ++-- contracts/ibc-reflect-send/schema/ibc/packet_msg.json | 4 ++-- contracts/ibc-reflect-send/schema/raw/execute.json | 4 ++-- contracts/ibc-reflect/schema/ibc/packet_msg.json | 4 ++-- contracts/reflect/schema/raw/execute.json | 4 ++-- contracts/reflect/schema/reflect.json | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/contracts/ibc-reflect-send/schema/ibc-reflect-send.json b/contracts/ibc-reflect-send/schema/ibc-reflect-send.json index fd003a55ef..cf36088129 100644 --- a/contracts/ibc-reflect-send/schema/ibc-reflect-send.json +++ b/contracts/ibc-reflect-send/schema/ibc-reflect-send.json @@ -421,7 +421,7 @@ ] }, "channel_id": { - "description": "exisiting channel to send the tokens over", + "description": "existing channel to send the tokens over", "type": "string" }, "timeout": { @@ -539,7 +539,7 @@ "minimum": 0.0 }, "revision": { - "description": "the version that the client is currently on (eg. after reseting the chain this could increment 1 as height drops to 0)", + "description": "the version that the client is currently on (e.g. after resetting the chain this could increment 1 as height drops to 0)", "type": "integer", "format": "uint64", "minimum": 0.0 diff --git a/contracts/ibc-reflect-send/schema/ibc/packet_msg.json b/contracts/ibc-reflect-send/schema/ibc/packet_msg.json index ed79c6860e..00bcd35219 100644 --- a/contracts/ibc-reflect-send/schema/ibc/packet_msg.json +++ b/contracts/ibc-reflect-send/schema/ibc/packet_msg.json @@ -359,7 +359,7 @@ ] }, "channel_id": { - "description": "exisiting channel to send the tokens over", + "description": "existing channel to send the tokens over", "type": "string" }, "timeout": { @@ -477,7 +477,7 @@ "minimum": 0.0 }, "revision": { - "description": "the version that the client is currently on (eg. after reseting the chain this could increment 1 as height drops to 0)", + "description": "the version that the client is currently on (e.g. after resetting the chain this could increment 1 as height drops to 0)", "type": "integer", "format": "uint64", "minimum": 0.0 diff --git a/contracts/ibc-reflect-send/schema/raw/execute.json b/contracts/ibc-reflect-send/schema/raw/execute.json index aacf4a1a66..5fee9b17a4 100644 --- a/contracts/ibc-reflect-send/schema/raw/execute.json +++ b/contracts/ibc-reflect-send/schema/raw/execute.json @@ -410,7 +410,7 @@ ] }, "channel_id": { - "description": "exisiting channel to send the tokens over", + "description": "existing channel to send the tokens over", "type": "string" }, "timeout": { @@ -528,7 +528,7 @@ "minimum": 0.0 }, "revision": { - "description": "the version that the client is currently on (eg. after reseting the chain this could increment 1 as height drops to 0)", + "description": "the version that the client is currently on (e.g. after resetting the chain this could increment 1 as height drops to 0)", "type": "integer", "format": "uint64", "minimum": 0.0 diff --git a/contracts/ibc-reflect/schema/ibc/packet_msg.json b/contracts/ibc-reflect/schema/ibc/packet_msg.json index 33dcb522c2..3b9ebaef68 100644 --- a/contracts/ibc-reflect/schema/ibc/packet_msg.json +++ b/contracts/ibc-reflect/schema/ibc/packet_msg.json @@ -346,7 +346,7 @@ ] }, "channel_id": { - "description": "exisiting channel to send the tokens over", + "description": "existing channel to send the tokens over", "type": "string" }, "timeout": { @@ -464,7 +464,7 @@ "minimum": 0.0 }, "revision": { - "description": "the version that the client is currently on (eg. after reseting the chain this could increment 1 as height drops to 0)", + "description": "the version that the client is currently on (e.g. after resetting the chain this could increment 1 as height drops to 0)", "type": "integer", "format": "uint64", "minimum": 0.0 diff --git a/contracts/reflect/schema/raw/execute.json b/contracts/reflect/schema/raw/execute.json index 74726daf4e..c6ce9e141d 100644 --- a/contracts/reflect/schema/raw/execute.json +++ b/contracts/reflect/schema/raw/execute.json @@ -405,7 +405,7 @@ ] }, "channel_id": { - "description": "exisiting channel to send the tokens over", + "description": "existing channel to send the tokens over", "type": "string" }, "timeout": { @@ -523,7 +523,7 @@ "minimum": 0.0 }, "revision": { - "description": "the version that the client is currently on (eg. after reseting the chain this could increment 1 as height drops to 0)", + "description": "the version that the client is currently on (e.g. after resetting the chain this could increment 1 as height drops to 0)", "type": "integer", "format": "uint64", "minimum": 0.0 diff --git a/contracts/reflect/schema/reflect.json b/contracts/reflect/schema/reflect.json index 5165bed0e3..999f0b7506 100644 --- a/contracts/reflect/schema/reflect.json +++ b/contracts/reflect/schema/reflect.json @@ -415,7 +415,7 @@ ] }, "channel_id": { - "description": "exisiting channel to send the tokens over", + "description": "existing channel to send the tokens over", "type": "string" }, "timeout": { @@ -533,7 +533,7 @@ "minimum": 0.0 }, "revision": { - "description": "the version that the client is currently on (eg. after reseting the chain this could increment 1 as height drops to 0)", + "description": "the version that the client is currently on (e.g. after resetting the chain this could increment 1 as height drops to 0)", "type": "integer", "format": "uint64", "minimum": 0.0 From b7a6d1ae51eb1749a18de6e26ec932e9711d066e Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Mon, 28 Aug 2023 14:08:08 +0200 Subject: [PATCH 0644/2372] Update to latest wasmer 4.1.x (4.1.2) --- packages/vm/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index cb91b2ca6d..720930b405 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -48,8 +48,8 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " serde_json = "1.0.40" sha2 = "0.10.3" thiserror = "1.0.26" -wasmer = { version = "=4.1.0", default-features = false, features = ["cranelift", "singlepass"] } -wasmer-middlewares = "=4.1.0" +wasmer = { version = "=4.1.2", default-features = false, features = ["cranelift", "singlepass"] } +wasmer-middlewares = "=4.1.2" # Dependencies that we do not use ourself. We add those entries # to bump the min version of them. From 23b3dfc6db26a54f198b7b088a9ce1ca87e8b8a3 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Mon, 28 Aug 2023 14:18:12 +0200 Subject: [PATCH 0645/2372] Update lock files --- Cargo.lock | 32 +++++++++++++-------------- contracts/burner/Cargo.lock | 32 +++++++++++++-------------- contracts/crypto-verify/Cargo.lock | 32 +++++++++++++-------------- contracts/cyberpunk/Cargo.lock | 32 +++++++++++++-------------- contracts/floaty/Cargo.lock | 32 +++++++++++++-------------- contracts/hackatom/Cargo.lock | 32 +++++++++++++-------------- contracts/ibc-reflect-send/Cargo.lock | 32 +++++++++++++-------------- contracts/ibc-reflect/Cargo.lock | 32 +++++++++++++-------------- contracts/queue/Cargo.lock | 32 +++++++++++++-------------- contracts/reflect/Cargo.lock | 32 +++++++++++++-------------- contracts/staking/Cargo.lock | 32 +++++++++++++-------------- contracts/virus/Cargo.lock | 32 +++++++++++++-------------- 12 files changed, 192 insertions(+), 192 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4151125ce1..b0fec241b0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2363,9 +2363,9 @@ dependencies = [ [[package]] name = "wasmer" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3849811ec23a31369ad40a07fcf4a6d259f2b05debdb6b21726c47a6a62f618f" +checksum = "fc7142dbb91ede83cc0aef2301fa75fcc7e0c9e5a7d5358e3c4f3a7249fe9ce8" dependencies = [ "bytes", "cfg-if", @@ -2391,9 +2391,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "860db1e73e4a088a0636aabff2f89735eb9b4c4927e25c49da3aba561c8f26f4" +checksum = "e5b99c70711ec7631b602a9fc95577c40df21e8f3916159c9d80c3fb4f77abdc" dependencies = [ "backtrace", "cfg-if", @@ -2414,9 +2414,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e01da3c6832c0f5b54dda23279e99b4aa82544c90ae0b0d4ebc584b8f6f4ef" +checksum = "52aef2ef35513a04fed54de9a7dc9c469d4742a5c2e378a5f7e2a79b1327e3bd" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -2433,9 +2433,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e856957b7173bbd15da77833e4db3d1ca5aeff35dd2f88e69f7d36cfeaf822d6" +checksum = "ebfd019aa98b19fea0fb1d8db9b539145c9416d183ce4cda4e8e024b2c890aac" dependencies = [ "byteorder", "dynasm", @@ -2452,9 +2452,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34a2a51c07a1e476ceece72c8a09ab777e4832f104bf62fa454e8ea8db3ac7c9" +checksum = "25bb1425c9e4dc3e2d3aacd6e82e22e27a3127379e0d09bcbdf25ff376229162" dependencies = [ "proc-macro-error", "proc-macro2", @@ -2464,9 +2464,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce87a2a7b622d91a901630c9879922a39087e8046eabe9d8d7879ba781f7c8ce" +checksum = "acfc08fb8e2e1511f1d69302d7406ace6c0ec0c90e103f8c0a5aa81ecb9fe81f" dependencies = [ "wasmer", "wasmer-types", @@ -2475,9 +2475,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2274b2b4d931e77fcae9f90d4a1af6d72f6c3a3e38cc19277c5dc72a2fc5a5" +checksum = "d7e32ed799fa8c0d96ca9615d9ea8006857a0f0c18e7c2ed8082bd5c63a9ea70" dependencies = [ "bytecheck", "enum-iterator", @@ -2491,9 +2491,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58112eb6257d4fc293814d155ad296d3ddbdf88536784f493984cc56c3e3a0e2" +checksum = "0847513cb176b5d62a6f65d6ae474594935e726a10e9e3387177d9cbf8b8cda0" dependencies = [ "backtrace", "cc", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index fe65dfca42..33133db032 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -1638,9 +1638,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3849811ec23a31369ad40a07fcf4a6d259f2b05debdb6b21726c47a6a62f618f" +checksum = "fc7142dbb91ede83cc0aef2301fa75fcc7e0c9e5a7d5358e3c4f3a7249fe9ce8" dependencies = [ "bytes", "cfg-if", @@ -1666,9 +1666,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "860db1e73e4a088a0636aabff2f89735eb9b4c4927e25c49da3aba561c8f26f4" +checksum = "e5b99c70711ec7631b602a9fc95577c40df21e8f3916159c9d80c3fb4f77abdc" dependencies = [ "backtrace", "cfg-if", @@ -1689,9 +1689,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e01da3c6832c0f5b54dda23279e99b4aa82544c90ae0b0d4ebc584b8f6f4ef" +checksum = "52aef2ef35513a04fed54de9a7dc9c469d4742a5c2e378a5f7e2a79b1327e3bd" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1708,9 +1708,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e856957b7173bbd15da77833e4db3d1ca5aeff35dd2f88e69f7d36cfeaf822d6" +checksum = "ebfd019aa98b19fea0fb1d8db9b539145c9416d183ce4cda4e8e024b2c890aac" dependencies = [ "byteorder", "dynasm", @@ -1727,9 +1727,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34a2a51c07a1e476ceece72c8a09ab777e4832f104bf62fa454e8ea8db3ac7c9" +checksum = "25bb1425c9e4dc3e2d3aacd6e82e22e27a3127379e0d09bcbdf25ff376229162" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1739,9 +1739,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce87a2a7b622d91a901630c9879922a39087e8046eabe9d8d7879ba781f7c8ce" +checksum = "acfc08fb8e2e1511f1d69302d7406ace6c0ec0c90e103f8c0a5aa81ecb9fe81f" dependencies = [ "wasmer", "wasmer-types", @@ -1750,9 +1750,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2274b2b4d931e77fcae9f90d4a1af6d72f6c3a3e38cc19277c5dc72a2fc5a5" +checksum = "d7e32ed799fa8c0d96ca9615d9ea8006857a0f0c18e7c2ed8082bd5c63a9ea70" dependencies = [ "bytecheck", "enum-iterator", @@ -1766,9 +1766,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58112eb6257d4fc293814d155ad296d3ddbdf88536784f493984cc56c3e3a0e2" +checksum = "0847513cb176b5d62a6f65d6ae474594935e726a10e9e3387177d9cbf8b8cda0" dependencies = [ "backtrace", "cc", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index bf541ff137..bb0ec470ff 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -1681,9 +1681,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3849811ec23a31369ad40a07fcf4a6d259f2b05debdb6b21726c47a6a62f618f" +checksum = "fc7142dbb91ede83cc0aef2301fa75fcc7e0c9e5a7d5358e3c4f3a7249fe9ce8" dependencies = [ "bytes", "cfg-if", @@ -1709,9 +1709,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "860db1e73e4a088a0636aabff2f89735eb9b4c4927e25c49da3aba561c8f26f4" +checksum = "e5b99c70711ec7631b602a9fc95577c40df21e8f3916159c9d80c3fb4f77abdc" dependencies = [ "backtrace", "cfg-if", @@ -1732,9 +1732,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e01da3c6832c0f5b54dda23279e99b4aa82544c90ae0b0d4ebc584b8f6f4ef" +checksum = "52aef2ef35513a04fed54de9a7dc9c469d4742a5c2e378a5f7e2a79b1327e3bd" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1751,9 +1751,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e856957b7173bbd15da77833e4db3d1ca5aeff35dd2f88e69f7d36cfeaf822d6" +checksum = "ebfd019aa98b19fea0fb1d8db9b539145c9416d183ce4cda4e8e024b2c890aac" dependencies = [ "byteorder", "dynasm", @@ -1770,9 +1770,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34a2a51c07a1e476ceece72c8a09ab777e4832f104bf62fa454e8ea8db3ac7c9" +checksum = "25bb1425c9e4dc3e2d3aacd6e82e22e27a3127379e0d09bcbdf25ff376229162" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1782,9 +1782,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce87a2a7b622d91a901630c9879922a39087e8046eabe9d8d7879ba781f7c8ce" +checksum = "acfc08fb8e2e1511f1d69302d7406ace6c0ec0c90e103f8c0a5aa81ecb9fe81f" dependencies = [ "wasmer", "wasmer-types", @@ -1793,9 +1793,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2274b2b4d931e77fcae9f90d4a1af6d72f6c3a3e38cc19277c5dc72a2fc5a5" +checksum = "d7e32ed799fa8c0d96ca9615d9ea8006857a0f0c18e7c2ed8082bd5c63a9ea70" dependencies = [ "bytecheck", "enum-iterator", @@ -1809,9 +1809,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58112eb6257d4fc293814d155ad296d3ddbdf88536784f493984cc56c3e3a0e2" +checksum = "0847513cb176b5d62a6f65d6ae474594935e726a10e9e3387177d9cbf8b8cda0" dependencies = [ "backtrace", "cc", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 21a5490854..957c96f99a 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -1775,9 +1775,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3849811ec23a31369ad40a07fcf4a6d259f2b05debdb6b21726c47a6a62f618f" +checksum = "fc7142dbb91ede83cc0aef2301fa75fcc7e0c9e5a7d5358e3c4f3a7249fe9ce8" dependencies = [ "bytes", "cfg-if", @@ -1803,9 +1803,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "860db1e73e4a088a0636aabff2f89735eb9b4c4927e25c49da3aba561c8f26f4" +checksum = "e5b99c70711ec7631b602a9fc95577c40df21e8f3916159c9d80c3fb4f77abdc" dependencies = [ "backtrace", "cfg-if", @@ -1826,9 +1826,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e01da3c6832c0f5b54dda23279e99b4aa82544c90ae0b0d4ebc584b8f6f4ef" +checksum = "52aef2ef35513a04fed54de9a7dc9c469d4742a5c2e378a5f7e2a79b1327e3bd" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1845,9 +1845,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e856957b7173bbd15da77833e4db3d1ca5aeff35dd2f88e69f7d36cfeaf822d6" +checksum = "ebfd019aa98b19fea0fb1d8db9b539145c9416d183ce4cda4e8e024b2c890aac" dependencies = [ "byteorder", "dynasm", @@ -1864,9 +1864,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34a2a51c07a1e476ceece72c8a09ab777e4832f104bf62fa454e8ea8db3ac7c9" +checksum = "25bb1425c9e4dc3e2d3aacd6e82e22e27a3127379e0d09bcbdf25ff376229162" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1876,9 +1876,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce87a2a7b622d91a901630c9879922a39087e8046eabe9d8d7879ba781f7c8ce" +checksum = "acfc08fb8e2e1511f1d69302d7406ace6c0ec0c90e103f8c0a5aa81ecb9fe81f" dependencies = [ "wasmer", "wasmer-types", @@ -1887,9 +1887,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2274b2b4d931e77fcae9f90d4a1af6d72f6c3a3e38cc19277c5dc72a2fc5a5" +checksum = "d7e32ed799fa8c0d96ca9615d9ea8006857a0f0c18e7c2ed8082bd5c63a9ea70" dependencies = [ "bytecheck", "enum-iterator", @@ -1903,9 +1903,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58112eb6257d4fc293814d155ad296d3ddbdf88536784f493984cc56c3e3a0e2" +checksum = "0847513cb176b5d62a6f65d6ae474594935e726a10e9e3387177d9cbf8b8cda0" dependencies = [ "backtrace", "cc", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 611d3cdd7a..ba1bbf1800 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -1639,9 +1639,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3849811ec23a31369ad40a07fcf4a6d259f2b05debdb6b21726c47a6a62f618f" +checksum = "fc7142dbb91ede83cc0aef2301fa75fcc7e0c9e5a7d5358e3c4f3a7249fe9ce8" dependencies = [ "bytes", "cfg-if", @@ -1667,9 +1667,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "860db1e73e4a088a0636aabff2f89735eb9b4c4927e25c49da3aba561c8f26f4" +checksum = "e5b99c70711ec7631b602a9fc95577c40df21e8f3916159c9d80c3fb4f77abdc" dependencies = [ "backtrace", "cfg-if", @@ -1690,9 +1690,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e01da3c6832c0f5b54dda23279e99b4aa82544c90ae0b0d4ebc584b8f6f4ef" +checksum = "52aef2ef35513a04fed54de9a7dc9c469d4742a5c2e378a5f7e2a79b1327e3bd" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1709,9 +1709,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e856957b7173bbd15da77833e4db3d1ca5aeff35dd2f88e69f7d36cfeaf822d6" +checksum = "ebfd019aa98b19fea0fb1d8db9b539145c9416d183ce4cda4e8e024b2c890aac" dependencies = [ "byteorder", "dynasm", @@ -1728,9 +1728,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34a2a51c07a1e476ceece72c8a09ab777e4832f104bf62fa454e8ea8db3ac7c9" +checksum = "25bb1425c9e4dc3e2d3aacd6e82e22e27a3127379e0d09bcbdf25ff376229162" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1740,9 +1740,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce87a2a7b622d91a901630c9879922a39087e8046eabe9d8d7879ba781f7c8ce" +checksum = "acfc08fb8e2e1511f1d69302d7406ace6c0ec0c90e103f8c0a5aa81ecb9fe81f" dependencies = [ "wasmer", "wasmer-types", @@ -1751,9 +1751,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2274b2b4d931e77fcae9f90d4a1af6d72f6c3a3e38cc19277c5dc72a2fc5a5" +checksum = "d7e32ed799fa8c0d96ca9615d9ea8006857a0f0c18e7c2ed8082bd5c63a9ea70" dependencies = [ "bytecheck", "enum-iterator", @@ -1767,9 +1767,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58112eb6257d4fc293814d155ad296d3ddbdf88536784f493984cc56c3e3a0e2" +checksum = "0847513cb176b5d62a6f65d6ae474594935e726a10e9e3387177d9cbf8b8cda0" dependencies = [ "backtrace", "cc", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index c103133ad7..c76ce0890a 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -1640,9 +1640,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3849811ec23a31369ad40a07fcf4a6d259f2b05debdb6b21726c47a6a62f618f" +checksum = "fc7142dbb91ede83cc0aef2301fa75fcc7e0c9e5a7d5358e3c4f3a7249fe9ce8" dependencies = [ "bytes", "cfg-if", @@ -1668,9 +1668,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "860db1e73e4a088a0636aabff2f89735eb9b4c4927e25c49da3aba561c8f26f4" +checksum = "e5b99c70711ec7631b602a9fc95577c40df21e8f3916159c9d80c3fb4f77abdc" dependencies = [ "backtrace", "cfg-if", @@ -1691,9 +1691,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e01da3c6832c0f5b54dda23279e99b4aa82544c90ae0b0d4ebc584b8f6f4ef" +checksum = "52aef2ef35513a04fed54de9a7dc9c469d4742a5c2e378a5f7e2a79b1327e3bd" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1710,9 +1710,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e856957b7173bbd15da77833e4db3d1ca5aeff35dd2f88e69f7d36cfeaf822d6" +checksum = "ebfd019aa98b19fea0fb1d8db9b539145c9416d183ce4cda4e8e024b2c890aac" dependencies = [ "byteorder", "dynasm", @@ -1729,9 +1729,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34a2a51c07a1e476ceece72c8a09ab777e4832f104bf62fa454e8ea8db3ac7c9" +checksum = "25bb1425c9e4dc3e2d3aacd6e82e22e27a3127379e0d09bcbdf25ff376229162" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1741,9 +1741,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce87a2a7b622d91a901630c9879922a39087e8046eabe9d8d7879ba781f7c8ce" +checksum = "acfc08fb8e2e1511f1d69302d7406ace6c0ec0c90e103f8c0a5aa81ecb9fe81f" dependencies = [ "wasmer", "wasmer-types", @@ -1752,9 +1752,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2274b2b4d931e77fcae9f90d4a1af6d72f6c3a3e38cc19277c5dc72a2fc5a5" +checksum = "d7e32ed799fa8c0d96ca9615d9ea8006857a0f0c18e7c2ed8082bd5c63a9ea70" dependencies = [ "bytecheck", "enum-iterator", @@ -1768,9 +1768,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58112eb6257d4fc293814d155ad296d3ddbdf88536784f493984cc56c3e3a0e2" +checksum = "0847513cb176b5d62a6f65d6ae474594935e726a10e9e3387177d9cbf8b8cda0" dependencies = [ "backtrace", "cc", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index efc78f52d1..936cf54f83 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -1638,9 +1638,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3849811ec23a31369ad40a07fcf4a6d259f2b05debdb6b21726c47a6a62f618f" +checksum = "fc7142dbb91ede83cc0aef2301fa75fcc7e0c9e5a7d5358e3c4f3a7249fe9ce8" dependencies = [ "bytes", "cfg-if", @@ -1666,9 +1666,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "860db1e73e4a088a0636aabff2f89735eb9b4c4927e25c49da3aba561c8f26f4" +checksum = "e5b99c70711ec7631b602a9fc95577c40df21e8f3916159c9d80c3fb4f77abdc" dependencies = [ "backtrace", "cfg-if", @@ -1689,9 +1689,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e01da3c6832c0f5b54dda23279e99b4aa82544c90ae0b0d4ebc584b8f6f4ef" +checksum = "52aef2ef35513a04fed54de9a7dc9c469d4742a5c2e378a5f7e2a79b1327e3bd" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1708,9 +1708,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e856957b7173bbd15da77833e4db3d1ca5aeff35dd2f88e69f7d36cfeaf822d6" +checksum = "ebfd019aa98b19fea0fb1d8db9b539145c9416d183ce4cda4e8e024b2c890aac" dependencies = [ "byteorder", "dynasm", @@ -1727,9 +1727,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34a2a51c07a1e476ceece72c8a09ab777e4832f104bf62fa454e8ea8db3ac7c9" +checksum = "25bb1425c9e4dc3e2d3aacd6e82e22e27a3127379e0d09bcbdf25ff376229162" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1739,9 +1739,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce87a2a7b622d91a901630c9879922a39087e8046eabe9d8d7879ba781f7c8ce" +checksum = "acfc08fb8e2e1511f1d69302d7406ace6c0ec0c90e103f8c0a5aa81ecb9fe81f" dependencies = [ "wasmer", "wasmer-types", @@ -1750,9 +1750,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2274b2b4d931e77fcae9f90d4a1af6d72f6c3a3e38cc19277c5dc72a2fc5a5" +checksum = "d7e32ed799fa8c0d96ca9615d9ea8006857a0f0c18e7c2ed8082bd5c63a9ea70" dependencies = [ "bytecheck", "enum-iterator", @@ -1766,9 +1766,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58112eb6257d4fc293814d155ad296d3ddbdf88536784f493984cc56c3e3a0e2" +checksum = "0847513cb176b5d62a6f65d6ae474594935e726a10e9e3387177d9cbf8b8cda0" dependencies = [ "backtrace", "cc", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 84af353705..5ee1d90102 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -1638,9 +1638,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3849811ec23a31369ad40a07fcf4a6d259f2b05debdb6b21726c47a6a62f618f" +checksum = "fc7142dbb91ede83cc0aef2301fa75fcc7e0c9e5a7d5358e3c4f3a7249fe9ce8" dependencies = [ "bytes", "cfg-if", @@ -1666,9 +1666,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "860db1e73e4a088a0636aabff2f89735eb9b4c4927e25c49da3aba561c8f26f4" +checksum = "e5b99c70711ec7631b602a9fc95577c40df21e8f3916159c9d80c3fb4f77abdc" dependencies = [ "backtrace", "cfg-if", @@ -1689,9 +1689,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e01da3c6832c0f5b54dda23279e99b4aa82544c90ae0b0d4ebc584b8f6f4ef" +checksum = "52aef2ef35513a04fed54de9a7dc9c469d4742a5c2e378a5f7e2a79b1327e3bd" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1708,9 +1708,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e856957b7173bbd15da77833e4db3d1ca5aeff35dd2f88e69f7d36cfeaf822d6" +checksum = "ebfd019aa98b19fea0fb1d8db9b539145c9416d183ce4cda4e8e024b2c890aac" dependencies = [ "byteorder", "dynasm", @@ -1727,9 +1727,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34a2a51c07a1e476ceece72c8a09ab777e4832f104bf62fa454e8ea8db3ac7c9" +checksum = "25bb1425c9e4dc3e2d3aacd6e82e22e27a3127379e0d09bcbdf25ff376229162" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1739,9 +1739,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce87a2a7b622d91a901630c9879922a39087e8046eabe9d8d7879ba781f7c8ce" +checksum = "acfc08fb8e2e1511f1d69302d7406ace6c0ec0c90e103f8c0a5aa81ecb9fe81f" dependencies = [ "wasmer", "wasmer-types", @@ -1750,9 +1750,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2274b2b4d931e77fcae9f90d4a1af6d72f6c3a3e38cc19277c5dc72a2fc5a5" +checksum = "d7e32ed799fa8c0d96ca9615d9ea8006857a0f0c18e7c2ed8082bd5c63a9ea70" dependencies = [ "bytecheck", "enum-iterator", @@ -1766,9 +1766,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58112eb6257d4fc293814d155ad296d3ddbdf88536784f493984cc56c3e3a0e2" +checksum = "0847513cb176b5d62a6f65d6ae474594935e726a10e9e3387177d9cbf8b8cda0" dependencies = [ "backtrace", "cc", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 6e4e6db6d0..ab0dad0377 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -1638,9 +1638,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3849811ec23a31369ad40a07fcf4a6d259f2b05debdb6b21726c47a6a62f618f" +checksum = "fc7142dbb91ede83cc0aef2301fa75fcc7e0c9e5a7d5358e3c4f3a7249fe9ce8" dependencies = [ "bytes", "cfg-if", @@ -1666,9 +1666,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "860db1e73e4a088a0636aabff2f89735eb9b4c4927e25c49da3aba561c8f26f4" +checksum = "e5b99c70711ec7631b602a9fc95577c40df21e8f3916159c9d80c3fb4f77abdc" dependencies = [ "backtrace", "cfg-if", @@ -1689,9 +1689,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e01da3c6832c0f5b54dda23279e99b4aa82544c90ae0b0d4ebc584b8f6f4ef" +checksum = "52aef2ef35513a04fed54de9a7dc9c469d4742a5c2e378a5f7e2a79b1327e3bd" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1708,9 +1708,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e856957b7173bbd15da77833e4db3d1ca5aeff35dd2f88e69f7d36cfeaf822d6" +checksum = "ebfd019aa98b19fea0fb1d8db9b539145c9416d183ce4cda4e8e024b2c890aac" dependencies = [ "byteorder", "dynasm", @@ -1727,9 +1727,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34a2a51c07a1e476ceece72c8a09ab777e4832f104bf62fa454e8ea8db3ac7c9" +checksum = "25bb1425c9e4dc3e2d3aacd6e82e22e27a3127379e0d09bcbdf25ff376229162" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1739,9 +1739,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce87a2a7b622d91a901630c9879922a39087e8046eabe9d8d7879ba781f7c8ce" +checksum = "acfc08fb8e2e1511f1d69302d7406ace6c0ec0c90e103f8c0a5aa81ecb9fe81f" dependencies = [ "wasmer", "wasmer-types", @@ -1750,9 +1750,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2274b2b4d931e77fcae9f90d4a1af6d72f6c3a3e38cc19277c5dc72a2fc5a5" +checksum = "d7e32ed799fa8c0d96ca9615d9ea8006857a0f0c18e7c2ed8082bd5c63a9ea70" dependencies = [ "bytecheck", "enum-iterator", @@ -1766,9 +1766,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58112eb6257d4fc293814d155ad296d3ddbdf88536784f493984cc56c3e3a0e2" +checksum = "0847513cb176b5d62a6f65d6ae474594935e726a10e9e3387177d9cbf8b8cda0" dependencies = [ "backtrace", "cc", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 97dc61b499..d4c7397453 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -1639,9 +1639,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3849811ec23a31369ad40a07fcf4a6d259f2b05debdb6b21726c47a6a62f618f" +checksum = "fc7142dbb91ede83cc0aef2301fa75fcc7e0c9e5a7d5358e3c4f3a7249fe9ce8" dependencies = [ "bytes", "cfg-if", @@ -1667,9 +1667,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "860db1e73e4a088a0636aabff2f89735eb9b4c4927e25c49da3aba561c8f26f4" +checksum = "e5b99c70711ec7631b602a9fc95577c40df21e8f3916159c9d80c3fb4f77abdc" dependencies = [ "backtrace", "cfg-if", @@ -1690,9 +1690,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e01da3c6832c0f5b54dda23279e99b4aa82544c90ae0b0d4ebc584b8f6f4ef" +checksum = "52aef2ef35513a04fed54de9a7dc9c469d4742a5c2e378a5f7e2a79b1327e3bd" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1709,9 +1709,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e856957b7173bbd15da77833e4db3d1ca5aeff35dd2f88e69f7d36cfeaf822d6" +checksum = "ebfd019aa98b19fea0fb1d8db9b539145c9416d183ce4cda4e8e024b2c890aac" dependencies = [ "byteorder", "dynasm", @@ -1728,9 +1728,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34a2a51c07a1e476ceece72c8a09ab777e4832f104bf62fa454e8ea8db3ac7c9" +checksum = "25bb1425c9e4dc3e2d3aacd6e82e22e27a3127379e0d09bcbdf25ff376229162" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1740,9 +1740,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce87a2a7b622d91a901630c9879922a39087e8046eabe9d8d7879ba781f7c8ce" +checksum = "acfc08fb8e2e1511f1d69302d7406ace6c0ec0c90e103f8c0a5aa81ecb9fe81f" dependencies = [ "wasmer", "wasmer-types", @@ -1751,9 +1751,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2274b2b4d931e77fcae9f90d4a1af6d72f6c3a3e38cc19277c5dc72a2fc5a5" +checksum = "d7e32ed799fa8c0d96ca9615d9ea8006857a0f0c18e7c2ed8082bd5c63a9ea70" dependencies = [ "bytecheck", "enum-iterator", @@ -1767,9 +1767,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58112eb6257d4fc293814d155ad296d3ddbdf88536784f493984cc56c3e3a0e2" +checksum = "0847513cb176b5d62a6f65d6ae474594935e726a10e9e3387177d9cbf8b8cda0" dependencies = [ "backtrace", "cc", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index e670bf0618..b15ae1ef66 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -1666,9 +1666,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3849811ec23a31369ad40a07fcf4a6d259f2b05debdb6b21726c47a6a62f618f" +checksum = "fc7142dbb91ede83cc0aef2301fa75fcc7e0c9e5a7d5358e3c4f3a7249fe9ce8" dependencies = [ "bytes", "cfg-if", @@ -1694,9 +1694,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "860db1e73e4a088a0636aabff2f89735eb9b4c4927e25c49da3aba561c8f26f4" +checksum = "e5b99c70711ec7631b602a9fc95577c40df21e8f3916159c9d80c3fb4f77abdc" dependencies = [ "backtrace", "cfg-if", @@ -1717,9 +1717,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e01da3c6832c0f5b54dda23279e99b4aa82544c90ae0b0d4ebc584b8f6f4ef" +checksum = "52aef2ef35513a04fed54de9a7dc9c469d4742a5c2e378a5f7e2a79b1327e3bd" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1736,9 +1736,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e856957b7173bbd15da77833e4db3d1ca5aeff35dd2f88e69f7d36cfeaf822d6" +checksum = "ebfd019aa98b19fea0fb1d8db9b539145c9416d183ce4cda4e8e024b2c890aac" dependencies = [ "byteorder", "dynasm", @@ -1755,9 +1755,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34a2a51c07a1e476ceece72c8a09ab777e4832f104bf62fa454e8ea8db3ac7c9" +checksum = "25bb1425c9e4dc3e2d3aacd6e82e22e27a3127379e0d09bcbdf25ff376229162" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1767,9 +1767,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce87a2a7b622d91a901630c9879922a39087e8046eabe9d8d7879ba781f7c8ce" +checksum = "acfc08fb8e2e1511f1d69302d7406ace6c0ec0c90e103f8c0a5aa81ecb9fe81f" dependencies = [ "wasmer", "wasmer-types", @@ -1778,9 +1778,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2274b2b4d931e77fcae9f90d4a1af6d72f6c3a3e38cc19277c5dc72a2fc5a5" +checksum = "d7e32ed799fa8c0d96ca9615d9ea8006857a0f0c18e7c2ed8082bd5c63a9ea70" dependencies = [ "bytecheck", "enum-iterator", @@ -1794,9 +1794,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58112eb6257d4fc293814d155ad296d3ddbdf88536784f493984cc56c3e3a0e2" +checksum = "0847513cb176b5d62a6f65d6ae474594935e726a10e9e3387177d9cbf8b8cda0" dependencies = [ "backtrace", "cc", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 26fafa0890..4eb0e460fc 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -1639,9 +1639,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3849811ec23a31369ad40a07fcf4a6d259f2b05debdb6b21726c47a6a62f618f" +checksum = "fc7142dbb91ede83cc0aef2301fa75fcc7e0c9e5a7d5358e3c4f3a7249fe9ce8" dependencies = [ "bytes", "cfg-if", @@ -1667,9 +1667,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "860db1e73e4a088a0636aabff2f89735eb9b4c4927e25c49da3aba561c8f26f4" +checksum = "e5b99c70711ec7631b602a9fc95577c40df21e8f3916159c9d80c3fb4f77abdc" dependencies = [ "backtrace", "cfg-if", @@ -1690,9 +1690,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e01da3c6832c0f5b54dda23279e99b4aa82544c90ae0b0d4ebc584b8f6f4ef" +checksum = "52aef2ef35513a04fed54de9a7dc9c469d4742a5c2e378a5f7e2a79b1327e3bd" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1709,9 +1709,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e856957b7173bbd15da77833e4db3d1ca5aeff35dd2f88e69f7d36cfeaf822d6" +checksum = "ebfd019aa98b19fea0fb1d8db9b539145c9416d183ce4cda4e8e024b2c890aac" dependencies = [ "byteorder", "dynasm", @@ -1728,9 +1728,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34a2a51c07a1e476ceece72c8a09ab777e4832f104bf62fa454e8ea8db3ac7c9" +checksum = "25bb1425c9e4dc3e2d3aacd6e82e22e27a3127379e0d09bcbdf25ff376229162" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1740,9 +1740,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce87a2a7b622d91a901630c9879922a39087e8046eabe9d8d7879ba781f7c8ce" +checksum = "acfc08fb8e2e1511f1d69302d7406ace6c0ec0c90e103f8c0a5aa81ecb9fe81f" dependencies = [ "wasmer", "wasmer-types", @@ -1751,9 +1751,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2274b2b4d931e77fcae9f90d4a1af6d72f6c3a3e38cc19277c5dc72a2fc5a5" +checksum = "d7e32ed799fa8c0d96ca9615d9ea8006857a0f0c18e7c2ed8082bd5c63a9ea70" dependencies = [ "bytecheck", "enum-iterator", @@ -1767,9 +1767,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58112eb6257d4fc293814d155ad296d3ddbdf88536784f493984cc56c3e3a0e2" +checksum = "0847513cb176b5d62a6f65d6ae474594935e726a10e9e3387177d9cbf8b8cda0" dependencies = [ "backtrace", "cc", From 85b5f24d9afb3e6f5bc4b49482177c475559ff05 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 28 Aug 2023 17:03:08 +0200 Subject: [PATCH 0646/2372] Add changelog entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a859fa4c0..8724ef54eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,9 @@ and this project adheres to - cosmwasm-vm: Use `wasmparser` for initial validation instead of `parity-wasm` ([#1786]) - cosmwasm-std: Make constructors `Decimal{,256}::{percent,permille,bps}` const +- cosmwasm-std: Use new `db_next_key` import to make `skip` and `nth` + implementation of `range` iterators more efficient. This requires the + `cosmwasm_1_4` feature to be enabled. ([#1838]) [#1667]: https://github.com/CosmWasm/cosmwasm/pull/1667 [#1674]: https://github.com/CosmWasm/cosmwasm/pull/1674 @@ -46,6 +49,7 @@ and this project adheres to [#1701]: https://github.com/CosmWasm/cosmwasm/pull/1701 [#1786]: https://github.com/CosmWasm/cosmwasm/pull/1786 [#1793]: https://github.com/CosmWasm/cosmwasm/pull/1793 +[#1838]: https://github.com/CosmWasm/cosmwasm/pull/1838 ## [1.3.3] - 2023-08-22 From e24ff622ab0830f02dfd5f7577a4baae77e4372c Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 28 Aug 2023 17:03:54 +0200 Subject: [PATCH 0647/2372] Revert "Add changelog entry" This reverts commit 85b5f24d9afb3e6f5bc4b49482177c475559ff05. --- CHANGELOG.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8724ef54eb..2a859fa4c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,9 +38,6 @@ and this project adheres to - cosmwasm-vm: Use `wasmparser` for initial validation instead of `parity-wasm` ([#1786]) - cosmwasm-std: Make constructors `Decimal{,256}::{percent,permille,bps}` const -- cosmwasm-std: Use new `db_next_key` import to make `skip` and `nth` - implementation of `range` iterators more efficient. This requires the - `cosmwasm_1_4` feature to be enabled. ([#1838]) [#1667]: https://github.com/CosmWasm/cosmwasm/pull/1667 [#1674]: https://github.com/CosmWasm/cosmwasm/pull/1674 @@ -49,7 +46,6 @@ and this project adheres to [#1701]: https://github.com/CosmWasm/cosmwasm/pull/1701 [#1786]: https://github.com/CosmWasm/cosmwasm/pull/1786 [#1793]: https://github.com/CosmWasm/cosmwasm/pull/1793 -[#1838]: https://github.com/CosmWasm/cosmwasm/pull/1838 ## [1.3.3] - 2023-08-22 From 11cf89ca37cfd9e8bfb213b262be4b166ea85a1f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 28 Aug 2023 16:52:32 +0200 Subject: [PATCH 0648/2372] Impl nth for External(Partial)Iterator --- packages/std/src/imports.rs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index 8f99e6941e..7df3f22c95 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -200,6 +200,15 @@ struct ExternalPartialIterator { impl Iterator for ExternalPartialIterator { type Item = Vec; + /// The default implementation calls `next` repeatedly, + /// which we can do a little more efficiently by using `db_next_key` instead. + /// It is used by `skip`, so it allows cheaper skipping. + #[cfg(feature = "cosmwasm_1_4")] + fn nth(&mut self, n: usize) -> Option { + skip_iter(self.iterator_id, n); + self.next() + } + fn next(&mut self) -> Option { // here we differentiate between the two types let next_result = match self.partial_type { @@ -229,6 +238,15 @@ struct ExternalIterator { impl Iterator for ExternalIterator { type Item = Record; + /// The default implementation calls `next` repeatedly, + /// which we can do a little more efficiently by using `db_next_key` instead. + /// It is used by `skip`, so it allows cheaper skipping. + #[cfg(feature = "cosmwasm_1_4")] + fn nth(&mut self, n: usize) -> Option { + skip_iter(self.iterator_id, n); + self.next() + } + fn next(&mut self) -> Option { let next_result = unsafe { db_next(self.iterator_id) }; let kv_region_ptr = next_result as *mut Region; @@ -242,6 +260,20 @@ impl Iterator for ExternalIterator { } } +/// Helper function to skip `count` elements of an iterator. +#[cfg(all(feature = "iterator", feature = "cosmwasm_1_4"))] +fn skip_iter(iter_id: u32, count: usize) { + for _ in 0..count { + let region = unsafe { db_next_key(iter_id) }; + if region == 0 { + // early return + return; + } + // just deallocate the region + unsafe { consume_region(region as *mut Region) }; + } +} + /// A stateless convenience wrapper around imports provided by the VM #[derive(Copy, Clone)] pub struct ExternalApi {} From 8e4907ae2d5cb16ff228220df48907f9172819d3 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 28 Aug 2023 17:03:08 +0200 Subject: [PATCH 0649/2372] Add changelog entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a859fa4c0..8724ef54eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,9 @@ and this project adheres to - cosmwasm-vm: Use `wasmparser` for initial validation instead of `parity-wasm` ([#1786]) - cosmwasm-std: Make constructors `Decimal{,256}::{percent,permille,bps}` const +- cosmwasm-std: Use new `db_next_key` import to make `skip` and `nth` + implementation of `range` iterators more efficient. This requires the + `cosmwasm_1_4` feature to be enabled. ([#1838]) [#1667]: https://github.com/CosmWasm/cosmwasm/pull/1667 [#1674]: https://github.com/CosmWasm/cosmwasm/pull/1674 @@ -46,6 +49,7 @@ and this project adheres to [#1701]: https://github.com/CosmWasm/cosmwasm/pull/1701 [#1786]: https://github.com/CosmWasm/cosmwasm/pull/1786 [#1793]: https://github.com/CosmWasm/cosmwasm/pull/1793 +[#1838]: https://github.com/CosmWasm/cosmwasm/pull/1838 ## [1.3.3] - 2023-08-22 From 495b5ae0ac57df89441b5d56f4caff45b8bd1890 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 29 Aug 2023 11:42:16 +0200 Subject: [PATCH 0650/2372] Add optional delete field to burner migrate msg --- contracts/burner/schema/burner.json | 7 +++ contracts/burner/schema/raw/migrate.json | 7 +++ contracts/burner/src/contract.rs | 57 +++++++++++++++++++----- contracts/burner/src/msg.rs | 5 +++ contracts/burner/tests/integration.rs | 3 +- 5 files changed, 68 insertions(+), 11 deletions(-) diff --git a/contracts/burner/schema/burner.json b/contracts/burner/schema/burner.json index 9aa679c82d..94c2124eb3 100644 --- a/contracts/burner/schema/burner.json +++ b/contracts/burner/schema/burner.json @@ -19,6 +19,13 @@ "payout" ], "properties": { + "delete": { + "description": "Optional amount of items to delete in this call. If it is not provided, nothing will be deleted. You can delete further items in a subsequent execute call.", + "default": 0, + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, "payout": { "description": "The address we send all remaining balance to", "type": "string" diff --git a/contracts/burner/schema/raw/migrate.json b/contracts/burner/schema/raw/migrate.json index 30b6f16527..752175c3ea 100644 --- a/contracts/burner/schema/raw/migrate.json +++ b/contracts/burner/schema/raw/migrate.json @@ -6,6 +6,13 @@ "payout" ], "properties": { + "delete": { + "description": "Optional amount of items to delete in this call. If it is not provided, nothing will be deleted. You can delete further items in a subsequent execute call.", + "default": 0, + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, "payout": { "description": "The address we send all remaining balance to", "type": "string" diff --git a/contracts/burner/src/contract.rs b/contracts/burner/src/contract.rs index d50ec14761..5921261da1 100644 --- a/contracts/burner/src/contract.rs +++ b/contracts/burner/src/contract.rs @@ -1,5 +1,5 @@ use cosmwasm_std::{ - entry_point, BankMsg, DepsMut, Env, MessageInfo, Order, Response, StdError, StdResult, + entry_point, BankMsg, DepsMut, Env, MessageInfo, Order, Response, StdError, StdResult, Storage, }; use crate::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg}; @@ -24,10 +24,18 @@ pub fn migrate(deps: DepsMut, env: Env, msg: MigrateMsg) -> StdResult to_address: msg.payout.clone(), amount: balance, }; + + let deleted = if msg.delete != 0 { + cleanup(deps.storage, Some(msg.delete)) + } else { + 0 + }; + Ok(Response::new() .add_message(send) - .add_attribute("action", "burn") - .add_attribute("payout", msg.payout)) + .add_attribute("action", "migrate") + .add_attribute("payout", msg.payout) + .add_attribute("deleted_entries", deleted.to_string())) } #[entry_point] @@ -43,6 +51,14 @@ pub fn execute_cleanup( _info: MessageInfo, limit: Option, ) -> StdResult { + let deleted = cleanup(deps.storage, limit); + + Ok(Response::new() + .add_attribute("action", "burn") + .add_attribute("deleted_entries", deleted.to_string())) +} + +fn cleanup(storage: &mut dyn Storage, limit: Option) -> usize { // the number of elements we can still take (decreasing over time) let mut limit = limit.unwrap_or(u32::MAX) as usize; @@ -50,14 +66,13 @@ pub fn execute_cleanup( const PER_SCAN: usize = 20; loop { let take_this_scan = std::cmp::min(PER_SCAN, limit); - let keys: Vec<_> = deps - .storage + let keys: Vec<_> = storage .range_keys(None, None, Order::Ascending) .take(take_this_scan) .collect(); let deleted_this_scan = keys.len(); for k in keys { - deps.storage.remove(&k); + storage.remove(&k); } deleted += deleted_this_scan; limit -= deleted_this_scan; @@ -66,9 +81,7 @@ pub fn execute_cleanup( } } - Ok(Response::new() - .add_attribute("action", "burn") - .add_attribute("deleted_entries", deleted.to_string())) + deleted } #[cfg(test)] @@ -114,6 +127,7 @@ mod tests { let payout = String::from("someone else"); let msg = MigrateMsg { payout: payout.clone(), + delete: 0, }; let res = migrate(deps.as_mut(), mock_env(), msg).unwrap(); // check payout @@ -128,6 +142,29 @@ mod tests { ); } + #[test] + fn migrate_with_delete() { + let mut deps = mock_dependencies_with_balance(&coins(123456, "gold")); + + // store some sample data + deps.storage.set(b"foo", b"bar"); + deps.storage.set(b"key2", b"data2"); + deps.storage.set(b"key3", b"cool stuff"); + let cnt = deps.storage.range(None, None, Order::Ascending).count(); + assert_eq!(cnt, 3); + + // migrate all of the data in one go + let msg = MigrateMsg { + payout: "user".to_string(), + delete: 100, + }; + migrate(deps.as_mut(), mock_env(), msg).unwrap(); + + // no more data + let cnt = deps.storage.range(None, None, Order::Ascending).count(); + assert_eq!(cnt, 0); + } + #[test] fn execute_cleans_up_data() { let mut deps = mock_dependencies_with_balance(&coins(123456, "gold")); @@ -141,7 +178,7 @@ mod tests { // change the verifier via migrate let payout = String::from("someone else"); - let msg = MigrateMsg { payout }; + let msg = MigrateMsg { payout, delete: 0 }; let _res = migrate(deps.as_mut(), mock_env(), msg).unwrap(); let res = execute( diff --git a/contracts/burner/src/msg.rs b/contracts/burner/src/msg.rs index 602223eccb..f8d7f4558d 100644 --- a/contracts/burner/src/msg.rs +++ b/contracts/burner/src/msg.rs @@ -4,6 +4,11 @@ use cosmwasm_schema::cw_serde; pub struct MigrateMsg { /// The address we send all remaining balance to pub payout: String, + /// Optional amount of items to delete in this call. + /// If it is not provided, nothing will be deleted. + /// You can delete further items in a subsequent execute call. + #[serde(default)] + pub delete: u32, } /// A placeholder where we don't take any input diff --git a/contracts/burner/tests/integration.rs b/contracts/burner/tests/integration.rs index fe6069d4c9..c783a6fa3c 100644 --- a/contracts/burner/tests/integration.rs +++ b/contracts/burner/tests/integration.rs @@ -62,6 +62,7 @@ fn migrate_sends_funds() { let payout = String::from("someone else"); let msg = MigrateMsg { payout: payout.clone(), + delete: 0, }; let res: Response = migrate(&mut deps, mock_env(), msg).unwrap(); // check payout @@ -94,7 +95,7 @@ fn execute_cleans_up_data() { // change the verifier via migrate let payout = String::from("someone else"); - let msg = MigrateMsg { payout }; + let msg = MigrateMsg { payout, delete: 0 }; let _res: Response = migrate(&mut deps, mock_env(), msg).unwrap(); let res: Response = execute( From 569c366a3b7cdde9d3d84d4570e7648a28c044ec Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 29 Aug 2023 12:32:27 +0200 Subject: [PATCH 0651/2372] Apply review feedback --- contracts/burner/src/contract.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/contracts/burner/src/contract.rs b/contracts/burner/src/contract.rs index 5921261da1..1276720c6d 100644 --- a/contracts/burner/src/contract.rs +++ b/contracts/burner/src/contract.rs @@ -25,11 +25,7 @@ pub fn migrate(deps: DepsMut, env: Env, msg: MigrateMsg) -> StdResult amount: balance, }; - let deleted = if msg.delete != 0 { - cleanup(deps.storage, Some(msg.delete)) - } else { - 0 - }; + let deleted = cleanup(deps.storage, Some(msg.delete)); Ok(Response::new() .add_message(send) @@ -54,7 +50,7 @@ pub fn execute_cleanup( let deleted = cleanup(deps.storage, limit); Ok(Response::new() - .add_attribute("action", "burn") + .add_attribute("action", "cleanup") .add_attribute("deleted_entries", deleted.to_string())) } From f42f83036c2a87bf59b55dd362f22bcedae5dbfa Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 29 Aug 2023 12:39:42 +0200 Subject: [PATCH 0652/2372] Use range_{keys, values} in queue contract --- contracts/queue/Cargo.toml | 3 ++- contracts/queue/src/contract.rs | 36 +++++++++++++++++---------------- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/contracts/queue/Cargo.toml b/contracts/queue/Cargo.toml index 5743c2dacb..b37c1f79e6 100644 --- a/contracts/queue/Cargo.toml +++ b/contracts/queue/Cargo.toml @@ -34,7 +34,8 @@ library = [] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } -cosmwasm-std = { path = "../../packages/std", features = ["iterator"] } +# cosmwasm_1_4 is enabled here for more efficient `range_keys` and `range_values` +cosmwasm-std = { path = "../../packages/std", features = ["iterator", "cosmwasm_1_4"] } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } diff --git a/contracts/queue/src/contract.rs b/contracts/queue/src/contract.rs index 381ed0fcd6..63c1769ec7 100644 --- a/contracts/queue/src/contract.rs +++ b/contracts/queue/src/contract.rs @@ -42,11 +42,11 @@ fn handle_enqueue(deps: DepsMut, value: i32) -> StdResult { fn enqueue(storage: &mut dyn Storage, value: i32) -> StdResult<()> { // find the last element in the queue and extract key - let last_item = storage.range(None, None, Order::Descending).next(); + let last_item = storage.range_keys(None, None, Order::Descending).next(); let new_key = match last_item { None => FIRST_KEY, - Some((key, _value)) => { + Some(key) => { let last_key = u32::from_be_bytes(key.try_into().unwrap()); (last_key + 1).to_be_bytes() } @@ -76,8 +76,7 @@ pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> StdResult = deps .storage - .range(None, None, Order::Ascending) - .map(|(key, _)| key) + .range_keys(None, None, Order::Ascending) .collect(); for key in keys { deps.storage.remove(&key); @@ -102,15 +101,18 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { } fn query_count(deps: Deps) -> CountResponse { - let count = deps.storage.range(None, None, Order::Ascending).count() as u32; + let count = deps + .storage + .range_keys(None, None, Order::Ascending) + .count() as u32; CountResponse { count } } fn query_sum(deps: Deps) -> StdResult { let values: StdResult> = deps .storage - .range(None, None, Order::Ascending) - .map(|(_, v)| from_slice(&v)) + .range_values(None, None, Order::Ascending) + .map(|v| from_slice(&v)) .collect(); let sum = values?.iter().fold(0, |s, v| s + v.value); Ok(SumResponse { sum }) @@ -121,17 +123,17 @@ fn query_reducer(deps: Deps) -> StdResult { // val: StdResult for val in deps .storage - .range(None, None, Order::Ascending) - .map(|(_, v)| from_slice::(&v)) + .range_values(None, None, Order::Ascending) + .map(|v| from_slice::(&v)) { // this returns error on parse error let my_val = val?.value; // now, let's do second iterator let sum: i32 = deps .storage - .range(None, None, Order::Ascending) + .range_values(None, None, Order::Ascending) // get value. ignore parse errors, just count as 0 - .map(|(_, v)| { + .map(|v| { from_slice::(&v) .map(|v| v.value) .expect("error in item") @@ -149,18 +151,18 @@ fn query_list(deps: Deps) -> ListResponse { const THRESHOLD: [u8; 4] = [0x00, 0x00, 0x00, 0x20]; let empty: Vec = deps .storage - .range(Some(&THRESHOLD), Some(&THRESHOLD), Order::Ascending) - .map(|(k, _)| u32::from_be_bytes(k.try_into().unwrap())) + .range_keys(Some(&THRESHOLD), Some(&THRESHOLD), Order::Ascending) + .map(|k| u32::from_be_bytes(k.try_into().unwrap())) .collect(); let early: Vec = deps .storage - .range(None, Some(&THRESHOLD), Order::Ascending) - .map(|(k, _)| u32::from_be_bytes(k.try_into().unwrap())) + .range_keys(None, Some(&THRESHOLD), Order::Ascending) + .map(|k| u32::from_be_bytes(k.try_into().unwrap())) .collect(); let late: Vec = deps .storage - .range(Some(&THRESHOLD), None, Order::Ascending) - .map(|(k, _)| u32::from_be_bytes(k.try_into().unwrap())) + .range_keys(Some(&THRESHOLD), None, Order::Ascending) + .map(|k| u32::from_be_bytes(k.try_into().unwrap())) .collect(); ListResponse { empty, early, late } } From 3a962cca657df8b1e1a23e0b1e50b55fb61e374f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 29 Aug 2023 13:55:33 +0200 Subject: [PATCH 0653/2372] Refactor --- contracts/burner/src/contract.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/contracts/burner/src/contract.rs b/contracts/burner/src/contract.rs index 1276720c6d..d6a96a0e08 100644 --- a/contracts/burner/src/contract.rs +++ b/contracts/burner/src/contract.rs @@ -25,7 +25,7 @@ pub fn migrate(deps: DepsMut, env: Env, msg: MigrateMsg) -> StdResult amount: balance, }; - let deleted = cleanup(deps.storage, Some(msg.delete)); + let deleted = cleanup(deps.storage, msg.delete as usize); Ok(Response::new() .add_message(send) @@ -47,6 +47,7 @@ pub fn execute_cleanup( _info: MessageInfo, limit: Option, ) -> StdResult { + let limit = limit.unwrap_or(u32::MAX) as usize; let deleted = cleanup(deps.storage, limit); Ok(Response::new() @@ -54,10 +55,7 @@ pub fn execute_cleanup( .add_attribute("deleted_entries", deleted.to_string())) } -fn cleanup(storage: &mut dyn Storage, limit: Option) -> usize { - // the number of elements we can still take (decreasing over time) - let mut limit = limit.unwrap_or(u32::MAX) as usize; - +fn cleanup(storage: &mut dyn Storage, mut limit: usize) -> usize { let mut deleted = 0; const PER_SCAN: usize = 20; loop { @@ -71,6 +69,7 @@ fn cleanup(storage: &mut dyn Storage, limit: Option) -> usize { storage.remove(&k); } deleted += deleted_this_scan; + // decrease the number of elements we can still take limit -= deleted_this_scan; if limit == 0 || deleted_this_scan < take_this_scan { break; From 435edd946d36cbc9981ca425fc21f2c8f4eb2126 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 29 Aug 2023 14:37:41 +0200 Subject: [PATCH 0654/2372] Rename variable _gas_remaining -> _info --- packages/vm/src/instance.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 38cde7c4aa..73125edbc3 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -99,7 +99,7 @@ where let e = Environment::new(backend.api, gas_limit); if print_debug { e.set_debug_handler(Some(Rc::new(RefCell::new( - |msg: &str, _gas_remaining: DebugInfo<'_>| { + |msg: &str, _info: DebugInfo<'_>| { eprintln!("{msg}"); }, )))) From 39da0b20e5dc18069e2370210bdfe612a24ead99 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 29 Aug 2023 14:50:11 +0200 Subject: [PATCH 0655/2372] Upgrade clippy to 1.72.0 and adapt codebase --- .circleci/config.yml | 2 +- contracts/cyberpunk/src/contract.rs | 2 +- contracts/staking/src/contract.rs | 3 +-- packages/std/src/errors/std_error.rs | 5 ++--- packages/std/src/ibc.rs | 8 ++++---- packages/std/src/results/response.rs | 8 ++++---- packages/vm/src/imports.rs | 2 +- 7 files changed, 14 insertions(+), 16 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d0ee3dcb84..fd8abd4538 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -72,7 +72,7 @@ workflows: matrix: parameters: # Run with MSRV and some modern stable Rust - rust-version: ["1.67.0", "1.68.2"] + rust-version: ["1.67.0", "1.72.0"] - benchmarking: requires: - package_vm diff --git a/contracts/cyberpunk/src/contract.rs b/contracts/cyberpunk/src/contract.rs index bc9c7052e9..0374a06a86 100644 --- a/contracts/cyberpunk/src/contract.rs +++ b/contracts/cyberpunk/src/contract.rs @@ -205,7 +205,7 @@ fn query_denoms(deps: Deps) -> StdResult> { })?; let len = page.metadata.len() as u32; - all_metadata.extend(page.metadata.into_iter()); + all_metadata.extend(page.metadata); next_key = page.next_key; if next_key.is_none() || len < PAGE_SIZE { diff --git a/contracts/staking/src/contract.rs b/contracts/staking/src/contract.rs index ada3c22252..19295f8efd 100644 --- a/contracts/staking/src/contract.rs +++ b/contracts/staking/src/contract.rs @@ -111,8 +111,7 @@ fn get_bonded(querier: &QuerierWrapper, contract_addr: impl Into) -> Std return Ok(Uint128::new(0)); } let denom = bonds[0].amount.denom.as_str(); - bonds.iter().fold(Ok(Uint128::new(0)), |racc, d| { - let acc = racc?; + bonds.iter().try_fold(Uint128::zero(), |acc, d| { if d.amount.denom.as_str() != denom { Err(StdError::generic_err(format!( "different denoms in bonds: '{}' vs '{}'", diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index dcc80d0be4..f8b0c8275e 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -873,9 +873,8 @@ mod tests { #[test] fn from_std_str_utf8error_works() { - let error: StdError = str::from_utf8(b"Hello \xF0\x90\x80World") - .unwrap_err() - .into(); + let broken = b"Hello \xF0\x90\x80World"; + let error: StdError = str::from_utf8(broken).unwrap_err().into(); match error { StdError::InvalidUtf8 { msg, .. } => { assert_eq!(msg, "invalid utf-8 sequence of 3 bytes from index 6") diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 27ca1ddf58..dab621b71b 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -602,7 +602,7 @@ impl IbcBasicResponse { /// } /// ``` pub fn add_submessages(mut self, msgs: impl IntoIterator>) -> Self { - self.messages.extend(msgs.into_iter()); + self.messages.extend(msgs); self } @@ -612,7 +612,7 @@ impl IbcBasicResponse { /// The `wasm-` prefix will be appended by the runtime to the provided types /// of events. pub fn add_events(mut self, events: impl IntoIterator) -> Self { - self.events.extend(events.into_iter()); + self.events.extend(events); self } } @@ -765,7 +765,7 @@ impl IbcReceiveResponse { /// } /// ``` pub fn add_submessages(mut self, msgs: impl IntoIterator>) -> Self { - self.messages.extend(msgs.into_iter()); + self.messages.extend(msgs); self } @@ -775,7 +775,7 @@ impl IbcReceiveResponse { /// The `wasm-` prefix will be appended by the runtime to the provided types /// of events. pub fn add_events(mut self, events: impl IntoIterator) -> Self { - self.events.extend(events.into_iter()); + self.events.extend(events); self } } diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index 7da7d622d6..41de24fc67 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -209,7 +209,7 @@ impl Response { /// } /// ``` pub fn add_submessages(mut self, msgs: impl IntoIterator>) -> Self { - self.messages.extend(msgs.into_iter()); + self.messages.extend(msgs); self } @@ -219,7 +219,7 @@ impl Response { /// The `wasm-` prefix will be appended by the runtime to the provided types /// of events. pub fn add_events(mut self, events: impl IntoIterator) -> Self { - self.events.extend(events.into_iter()); + self.events.extend(events); self } @@ -261,11 +261,11 @@ mod tests { assert_eq!(res.attributes, attrs); let optional = Option::::None; - let res: Response = Response::new().add_attributes(optional.into_iter()); + let res: Response = Response::new().add_attributes(optional); assert_eq!(res.attributes.len(), 0); let optional = Option::::Some(Attribute::new("test", "ing")); - let res: Response = Response::new().add_attributes(optional.into_iter()); + let res: Response = Response::new().add_attributes(optional); assert_eq!(res.attributes.len(), 1); assert_eq!( res.attributes[0], diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 08fdc252b6..4924c888d8 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -451,7 +451,7 @@ pub fn do_debug Date: Tue, 29 Aug 2023 16:09:11 +0200 Subject: [PATCH 0656/2372] Fix go-gen dependency version --- packages/go-gen/Cargo.toml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/go-gen/Cargo.toml b/packages/go-gen/Cargo.toml index 89b1ae4715..f2616b1f28 100644 --- a/packages/go-gen/Cargo.toml +++ b/packages/go-gen/Cargo.toml @@ -3,13 +3,14 @@ name = "go-gen" authors = ["Christoph Otter "] version = "0.1.0" edition = "2021" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] schemars = "0.8.3" -cosmwasm-std = { path = "../std", version = "1.3.1", features = ["cosmwasm_1_3", "staking", "stargate", "ibc3"] } -cosmwasm-schema = { path = "../schema", version = "1.3.1" } +cosmwasm-std = { path = "../std", version = "1.3.3", features = ["cosmwasm_1_3", "staking", "stargate", "ibc3"] } +cosmwasm-schema = { path = "../schema", version = "1.3.3" } anyhow = "1" Inflector = "0.11.4" indenter = "0.3.3" From e86c4d54d933995932c1d1da48766a39cbf9f98b Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 29 Aug 2023 16:10:25 +0200 Subject: [PATCH 0657/2372] Set version: 1.4.0-beta.1 --- Cargo.lock | 16 ++++++++-------- contracts/burner/Cargo.lock | 12 ++++++------ contracts/crypto-verify/Cargo.lock | 12 ++++++------ contracts/cyberpunk/Cargo.lock | 12 ++++++------ contracts/floaty/Cargo.lock | 12 ++++++------ contracts/hackatom/Cargo.lock | 12 ++++++------ contracts/ibc-reflect-send/Cargo.lock | 12 ++++++------ contracts/ibc-reflect/Cargo.lock | 12 ++++++------ contracts/queue/Cargo.lock | 12 ++++++------ contracts/reflect/Cargo.lock | 12 ++++++------ contracts/staking/Cargo.lock | 12 ++++++------ contracts/virus/Cargo.lock | 12 ++++++------ packages/check/Cargo.toml | 6 +++--- packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/go-gen/Cargo.toml | 4 ++-- packages/schema-derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 6 +++--- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 21 files changed, 93 insertions(+), 93 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b0fec241b0..b346fcc721 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -427,7 +427,7 @@ dependencies = [ [[package]] name = "cosmwasm-check" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "anyhow", "assert_cmd", @@ -440,7 +440,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "criterion", "digest 0.10.6", @@ -458,7 +458,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "cosmwasm-std", "syn 1.0.109", @@ -466,7 +466,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "anyhow", "cosmwasm-schema-derive", @@ -481,7 +481,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -490,7 +490,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "base64", "bnum", @@ -513,7 +513,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "cosmwasm-std", "serde", @@ -521,7 +521,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 33133db032..21724bb37f 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -193,7 +193,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -204,14 +204,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -222,7 +222,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -231,7 +231,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "base64", "bnum", @@ -249,7 +249,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index bb0ec470ff..6388fb6fa6 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 957c96f99a..3263aea6fd 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -217,7 +217,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -228,14 +228,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -246,7 +246,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -255,7 +255,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "base64 0.21.2", "bnum", @@ -273,7 +273,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index ba1bbf1800..bdfd1dd93f 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index c76ce0890a..a53524f237 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 936cf54f83..c96d853fa0 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 5ee1d90102..fe04d31dcb 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index ab0dad0377..fd54c44354 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index d4c7397453..eeb04b20a9 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index b15ae1ef66..89a26d00c7 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 4eb0e460fc..c4b8f4adef 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.3.3" +version = "1.4.0-beta.1" dependencies = [ "bitflags", "bytecheck", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index 511cd0bb38..d993171208 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-check" -version = "1.3.3" +version = "1.4.0-beta.1" authors = ["Mauro Lacy "] edition = "2021" description = "A CLI tool for verifying CosmWasm smart contracts" @@ -11,8 +11,8 @@ license = "Apache-2.0" anyhow = "1.0.57" clap = "4" colored = "2" -cosmwasm-vm = { path = "../vm", version = "1.3.3" } -cosmwasm-std = { path = "../std", version = "1.3.3" } +cosmwasm-vm = { path = "../vm", version = "1.4.0-beta.1" } +cosmwasm-std = { path = "../std", version = "1.4.0-beta.1" } [dev-dependencies] assert_cmd = "=2.0.10" # 2.0.11+ requires Rust 1.65.0 which we currently don't want to make the minimum if possible diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index cfd8dec5d4..9e14f8c3d6 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "1.3.3" +version = "1.4.0-beta.1" authors = ["Mauro Lacy "] edition = "2021" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index 1d36bab3f9..a6cf42757a 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "1.3.3" +version = "1.4.0-beta.1" authors = ["Simon Warta "] edition = "2021" description = "A package for auto-generated code used for CosmWasm contract development. This is shipped as part of cosmwasm-std. Do not use directly." diff --git a/packages/go-gen/Cargo.toml b/packages/go-gen/Cargo.toml index f2616b1f28..5f3ad6ed74 100644 --- a/packages/go-gen/Cargo.toml +++ b/packages/go-gen/Cargo.toml @@ -9,8 +9,8 @@ publish = false [dependencies] schemars = "0.8.3" -cosmwasm-std = { path = "../std", version = "1.3.3", features = ["cosmwasm_1_3", "staking", "stargate", "ibc3"] } -cosmwasm-schema = { path = "../schema", version = "1.3.3" } +cosmwasm-std = { path = "../std", version = "1.4.0-beta.1", features = ["cosmwasm_1_3", "staking", "stargate", "ibc3"] } +cosmwasm-schema = { path = "../schema", version = "1.4.0-beta.1" } anyhow = "1" Inflector = "0.11.4" indenter = "0.3.3" diff --git a/packages/schema-derive/Cargo.toml b/packages/schema-derive/Cargo.toml index 06eec0d629..9afa3f5455 100644 --- a/packages/schema-derive/Cargo.toml +++ b/packages/schema-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema-derive" -version = "1.3.3" +version = "1.4.0-beta.1" authors = ["Tomasz Kurcz "] edition = "2021" description = "Derive macros for cosmwasm-schema" diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index 180f4afbe6..db6648fada 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "1.3.3" +version = "1.4.0-beta.1" authors = ["Simon Warta ", "Ethan Frey "] edition = "2021" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." @@ -8,7 +8,7 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/schema" license = "Apache-2.0" [dependencies] -cosmwasm-schema-derive = { version = "=1.3.3", path = "../schema-derive" } +cosmwasm-schema-derive = { version = "=1.4.0-beta.1", path = "../schema-derive" } schemars = "0.8.3" serde = "1.0" serde_json = "1.0.40" @@ -16,6 +16,6 @@ thiserror = "1.0.26" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = { version = "1.3.3", path = "../std" } +cosmwasm-std = { version = "1.4.0-beta.1", path = "../std" } semver = "1" tempfile = "3" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 160eb862a0..8b2487fb7c 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "1.3.3" +version = "1.4.0-beta.1" authors = ["Ethan Frey "] edition = "2021" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -49,7 +49,7 @@ cosmwasm_1_4 = ["cosmwasm_1_3"] [dependencies] base64 = "0.21.0" -cosmwasm-derive = { path = "../derive", version = "1.3.3" } +cosmwasm-derive = { path = "../derive", version = "1.4.0-beta.1" } derivative = "2" forward_ref = "1" hex = "0.4" @@ -61,7 +61,7 @@ thiserror = "1.0.26" bnum = "0.8.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "1.3.3" } +cosmwasm-crypto = { path = "../crypto", version = "1.4.0-beta.1" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 962b6af827..39fbc3591c 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "1.3.3" +version = "1.4.0-beta.1" authors = ["Ethan Frey "] edition = "2021" description = "CosmWasm library with useful helpers for Storage patterns" @@ -16,5 +16,5 @@ iterator = ["cosmwasm-std/iterator"] [dependencies] # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.3.3", default-features = false } +cosmwasm-std = { path = "../std", version = "1.4.0-beta.1", default-features = false } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 720930b405..b945828286 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "1.3.3" +version = "1.4.0-beta.1" authors = ["Ethan Frey "] edition = "2021" description = "VM bindings to run cosmwams contracts" @@ -39,8 +39,8 @@ bytes = "1.4.0" # need a higher version than the one required by Wasmer for the clru = "0.4.0" crc32fast = "1.3.2" # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.3.3", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "1.3.3" } +cosmwasm-std = { path = "../std", version = "1.4.0-beta.1", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "1.4.0-beta.1" } derivative = "2" hex = "0.4" schemars = "0.8.3" From 7424634d9cae7f8e6ede2d7d48376331d6111807 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 29 Aug 2023 16:15:17 +0200 Subject: [PATCH 0658/2372] Update changelog --- CHANGELOG.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8724ef54eb..9fd9de9720 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ and this project adheres to ## [Unreleased] +## [1.4.0-beta.1] - 2023-08-29 + ### Added - cosmwasm-std: Implement `Not` for `Uint{64,128,256}` ([#1799]). @@ -1851,7 +1853,9 @@ Some main points: All future Changelog entries will reference this base -[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.3...HEAD +[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.4.0-beta.1...HEAD +[1.4.0-beta.1]: + https://github.com/CosmWasm/cosmwasm/compare/v1.3.3...v1.4.0-beta.1 [1.3.3]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.2...v1.3.3 [1.3.2]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.1...v1.3.2 [1.3.1]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.0...v1.3.1 From b8f4777606acee81fb67cf69446c54df24975663 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 21 Jul 2023 17:26:15 +0200 Subject: [PATCH 0659/2372] Add cosmwasm_1_4 feature --- .vscode/settings.json | 9 +++++++-- packages/std/Cargo.toml | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 3105948a84..411942acf5 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,8 @@ { - "rust-analyzer.cargo.features": ["abort", "stargate", "staking", "cosmwasm_1_3"] -} + "rust-analyzer.cargo.features": [ + "abort", + "stargate", + "staking", + "cosmwasm_1_4" + ] +} \ No newline at end of file diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 8b2487fb7c..c24de72d95 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -44,6 +44,7 @@ cosmwasm_1_2 = ["cosmwasm_1_1"] cosmwasm_1_3 = ["cosmwasm_1_2"] # Together with the `iterator` feature this enables additional imports for more # efficient iteration over DB keys or values. +# It also makes `DistributionQuery::DelegationRewards` available for the contract to call # It requires the host blockchain to run CosmWasm `1.4.0` or higher. cosmwasm_1_4 = ["cosmwasm_1_3"] From 77dd1c03af2cb5ea9fe92ee48b8487ec54c4e0ac Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 21 Jul 2023 18:17:05 +0200 Subject: [PATCH 0660/2372] Add DelegationRewards query --- packages/std/src/lib.rs | 8 +++--- packages/std/src/query/distribution.rs | 29 +++++++++++++++++++++- packages/std/src/testing/mock.rs | 34 +++++++++++++++++++++++++- packages/std/src/traits.rs | 18 ++++++++++++++ 4 files changed, 83 insertions(+), 6 deletions(-) diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 6bccc14595..82858a063e 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -69,10 +69,10 @@ pub use crate::pagination::PageRequest; pub use crate::query::{ AllBalanceResponse, AllDelegationsResponse, AllDenomMetadataResponse, AllValidatorsResponse, BalanceResponse, BankQuery, BondedDenomResponse, ChannelResponse, CodeInfoResponse, - ContractInfoResponse, CustomQuery, Delegation, DelegationResponse, - DelegatorWithdrawAddressResponse, DenomMetadataResponse, DistributionQuery, FullDelegation, - IbcQuery, ListChannelsResponse, PortIdResponse, QueryRequest, StakingQuery, SupplyResponse, - Validator, ValidatorResponse, WasmQuery, + ContractInfoResponse, CustomQuery, DecCoin, Delegation, DelegationResponse, + DelegationRewardsResponse, DelegatorWithdrawAddressResponse, DenomMetadataResponse, + DistributionQuery, FullDelegation, IbcQuery, ListChannelsResponse, PortIdResponse, + QueryRequest, StakingQuery, SupplyResponse, Validator, ValidatorResponse, WasmQuery, }; #[allow(deprecated)] pub use crate::results::SubMsgExecutionResponse; diff --git a/packages/std/src/query/distribution.rs b/packages/std/src/query/distribution.rs index bd60fa2654..35252a05a5 100644 --- a/packages/std/src/query/distribution.rs +++ b/packages/std/src/query/distribution.rs @@ -10,7 +10,15 @@ use super::query_response::QueryResponseType; #[serde(rename_all = "snake_case")] pub enum DistributionQuery { // https://github.com/cosmos/cosmos-sdk/blob/4f6f6c00021f4b5ee486bbb71ae2071a8ceb47c9/x/distribution/types/query.pb.go#L792-L795 - DelegatorWithdrawAddress { delegator_address: String }, + DelegatorWithdrawAddress { + delegator_address: String, + }, + // https://github.com/cosmos/cosmos-sdk/blob/e3482f2d4142c55f9dc3f47a321b56610a11492c/x/distribution/types/query.pb.go#L525-L532 + #[cfg(feature = "cosmwasm_1_4")] + DelegationRewards { + delegator_address: String, + validator_address: String, + }, } // https://github.com/cosmos/cosmos-sdk/blob/4f6f6c00021f4b5ee486bbb71ae2071a8ceb47c9/x/distribution/types/query.pb.go#L832-L835 @@ -24,3 +32,22 @@ pub struct DelegatorWithdrawAddressResponse { impl_response_constructor!(DelegatorWithdrawAddressResponse, withdraw_address: Addr); impl QueryResponseType for DelegatorWithdrawAddressResponse {} + +// https://github.com/cosmos/cosmos-sdk/blob/e3482f2d4142c55f9dc3f47a321b56610a11492c/x/distribution/types/query.pb.go#L567-L572 +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub struct DelegationRewardsResponse { + pub rewards: Vec, +} + +impl_response_constructor!(DelegationRewardsResponse, rewards: Vec); +impl QueryResponseType for DelegationRewardsResponse {} + +/// A coin type with decimal amount. +/// Modeled after the Cosmos SDK's `DecCoin` type +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub struct DecCoin { + pub denom: String, + pub amount: crate::Decimal, +} diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index e3b0248cbf..257f5ac553 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -45,6 +45,8 @@ use crate::{ use crate::{Attribute, DenomMetadata}; #[cfg(feature = "stargate")] use crate::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; +#[cfg(feature = "cosmwasm_1_4")] +use crate::{DecCoin, DelegationRewardsResponse}; use super::riffle_shuffle; @@ -935,12 +937,17 @@ impl StakingQuerier { #[derive(Clone, Default)] pub struct DistributionQuerier { withdraw_addresses: HashMap, + #[cfg(feature = "cosmwasm_1_4")] + rewards: BTreeMap<(String, String), Vec>, } #[cfg(feature = "cosmwasm_1_3")] impl DistributionQuerier { pub fn new(withdraw_addresses: HashMap) -> Self { - DistributionQuerier { withdraw_addresses } + DistributionQuerier { + withdraw_addresses, + ..Default::default() + } } pub fn set_withdraw_address( @@ -969,6 +976,17 @@ impl DistributionQuerier { self.withdraw_addresses.clear(); } + /// Sets accumulated rewards for a given validator and delegator pair. + pub fn set_rewards( + &mut self, + validator: impl Into, + delegator: impl Into, + rewards: Vec, + ) { + self.rewards + .insert((validator.into(), delegator.into()), rewards); + } + pub fn query(&self, request: &DistributionQuery) -> QuerierResult { let contract_result: ContractResult = match request { DistributionQuery::DelegatorWithdrawAddress { delegator_address } => { @@ -981,6 +999,20 @@ impl DistributionQuerier { }; to_binary(&res).into() } + #[cfg(feature = "cosmwasm_1_4")] + DistributionQuery::DelegationRewards { + delegator_address, + validator_address, + } => { + let res = DelegationRewardsResponse { + rewards: self + .rewards + .get(&(validator_address.clone(), delegator_address.clone())) + .cloned() + .unwrap_or_default(), + }; + to_binary(&res).into() + } }; // system result is always ok in the mock implementation SystemResult::Ok(contract_result) diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 2118e189d2..3f7aef43c2 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -322,6 +322,24 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { self.query(&request) } + #[cfg(feature = "cosmwasm_1_4")] + pub fn query_delegation_rewards( + &self, + delegator: impl Into, + validator: impl Into, + ) -> StdResult> { + use crate::DelegationRewardsResponse; + + let request = DistributionQuery::DelegationRewards { + delegator_address: delegator.into(), + validator_address: validator.into(), + } + .into(); + let DelegationRewardsResponse { rewards } = self.query(&request)?; + + Ok(rewards) + } + /// Queries another wasm contract. You should know a priori the proper types for T and U /// (response and request) based on the contract API pub fn query_wasm_smart( From ace26ab429d07372155d28793604f7b0f9e75aae Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 21 Jul 2023 18:17:22 +0200 Subject: [PATCH 0661/2372] Add DelegationTotalRewards query --- packages/std/src/lib.rs | 7 ++-- packages/std/src/query/distribution.rs | 26 +++++++++++++ packages/std/src/testing/mock.rs | 54 ++++++++++++++++++++++++-- packages/std/src/traits.rs | 13 +++++++ 4 files changed, 93 insertions(+), 7 deletions(-) diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 82858a063e..3b2954b4ce 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -70,9 +70,10 @@ pub use crate::query::{ AllBalanceResponse, AllDelegationsResponse, AllDenomMetadataResponse, AllValidatorsResponse, BalanceResponse, BankQuery, BondedDenomResponse, ChannelResponse, CodeInfoResponse, ContractInfoResponse, CustomQuery, DecCoin, Delegation, DelegationResponse, - DelegationRewardsResponse, DelegatorWithdrawAddressResponse, DenomMetadataResponse, - DistributionQuery, FullDelegation, IbcQuery, ListChannelsResponse, PortIdResponse, - QueryRequest, StakingQuery, SupplyResponse, Validator, ValidatorResponse, WasmQuery, + DelegationRewardsResponse, DelegationTotalRewardsResponse, DelegatorReward, + DelegatorWithdrawAddressResponse, DenomMetadataResponse, DistributionQuery, FullDelegation, + IbcQuery, ListChannelsResponse, PortIdResponse, QueryRequest, StakingQuery, SupplyResponse, + Validator, ValidatorResponse, WasmQuery, }; #[allow(deprecated)] pub use crate::results::SubMsgExecutionResponse; diff --git a/packages/std/src/query/distribution.rs b/packages/std/src/query/distribution.rs index 35252a05a5..152c79994f 100644 --- a/packages/std/src/query/distribution.rs +++ b/packages/std/src/query/distribution.rs @@ -19,6 +19,11 @@ pub enum DistributionQuery { delegator_address: String, validator_address: String, }, + // https://github.com/cosmos/cosmos-sdk/blob/e3482f2d4142c55f9dc3f47a321b56610a11492c/x/distribution/types/query.pb.go#L614-L619 + #[cfg(feature = "cosmwasm_1_4")] + DelegationTotalRewards { + delegator_address: String, + }, } // https://github.com/cosmos/cosmos-sdk/blob/4f6f6c00021f4b5ee486bbb71ae2071a8ceb47c9/x/distribution/types/query.pb.go#L832-L835 @@ -51,3 +56,24 @@ pub struct DecCoin { pub denom: String, pub amount: crate::Decimal, } + +// https://github.com/cosmos/cosmos-sdk/blob/e3482f2d4142c55f9dc3f47a321b56610a11492c/x/distribution/types/query.pb.go#L654-L661 +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[non_exhaustive] +pub struct DelegationTotalRewardsResponse { + pub rewards: Vec, + pub total: Vec, +} + +impl_response_constructor!( + DelegationTotalRewardsResponse, + rewards: Vec, + total: Vec +); +impl QueryResponseType for DelegationTotalRewardsResponse {} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +pub struct DelegatorReward { + pub validator_address: String, + pub reward: Vec, +} diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 257f5ac553..31505a3f0f 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -46,7 +46,7 @@ use crate::{Attribute, DenomMetadata}; #[cfg(feature = "stargate")] use crate::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; #[cfg(feature = "cosmwasm_1_4")] -use crate::{DecCoin, DelegationRewardsResponse}; +use crate::{DecCoin, Decimal, DelegationRewardsResponse}; use super::riffle_shuffle; @@ -938,7 +938,8 @@ impl StakingQuerier { pub struct DistributionQuerier { withdraw_addresses: HashMap, #[cfg(feature = "cosmwasm_1_4")] - rewards: BTreeMap<(String, String), Vec>, + /// Mock of accumulated rewards, indexed first by delegator and then validator address. + rewards: BTreeMap>>, } #[cfg(feature = "cosmwasm_1_3")] @@ -984,7 +985,9 @@ impl DistributionQuerier { rewards: Vec, ) { self.rewards - .insert((validator.into(), delegator.into()), rewards); + .entry(delegator.into()) + .or_default() + .insert(validator.into(), rewards); } pub fn query(&self, request: &DistributionQuery) -> QuerierResult { @@ -1007,16 +1010,59 @@ impl DistributionQuerier { let res = DelegationRewardsResponse { rewards: self .rewards - .get(&(validator_address.clone(), delegator_address.clone())) + .get(delegator_address) + .and_then(|v| v.get(validator_address)) .cloned() .unwrap_or_default(), }; to_binary(&res).into() } + #[cfg(feature = "cosmwasm_1_4")] + DistributionQuery::DelegationTotalRewards { delegator_address } => { + let validator_rewards = self + .validator_rewards(delegator_address) + .unwrap_or_default(); + let res = crate::DelegationTotalRewardsResponse { + total: validator_rewards + .iter() + .fold(BTreeMap::<&str, DecCoin>::new(), |mut acc, rewards| { + for coin in &rewards.reward { + acc.entry(&coin.denom) + .or_insert_with(|| DecCoin { + denom: coin.denom.clone(), + amount: Decimal::zero(), + }) + .amount += coin.amount; + } + + acc + }) + .into_values() + .collect(), + rewards: validator_rewards, + }; + to_binary(&res).into() + } }; // system result is always ok in the mock implementation SystemResult::Ok(contract_result) } + + /// Helper method to get all rewards for a given delegator. + #[cfg(feature = "cosmwasm_1_4")] + fn validator_rewards(&self, delegator_address: &str) -> Option> { + let validator_rewards = self.rewards.get(delegator_address)?; + + Some( + validator_rewards + .iter() + .map(|(validator, rewards)| crate::DelegatorReward { + validator_address: validator.clone(), + reward: rewards.clone(), + }) + .collect(), + ) + } } pub fn digit_sum(input: &[u8]) -> usize { diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 3f7aef43c2..5895b87a11 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -340,6 +340,19 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { Ok(rewards) } + #[cfg(feature = "cosmwasm_1_4")] + pub fn query_delegation_total_rewards( + &self, + delegator: impl Into, + validator: impl Into, + ) -> StdResult { + let request = DistributionQuery::DelegationTotalRewards { + delegator_address: delegator.into(), + } + .into(); + self.query(&request) + } + /// Queries another wasm contract. You should know a priori the proper types for T and U /// (response and request) based on the contract API pub fn query_wasm_smart( From 0fc4bb37e1d5c487a7c62d77d549f635e044ab1b Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 21 Jul 2023 18:23:16 +0200 Subject: [PATCH 0662/2372] Fix mock --- packages/std/src/testing/mock.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 31505a3f0f..98841e5a55 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -937,9 +937,9 @@ impl StakingQuerier { #[derive(Clone, Default)] pub struct DistributionQuerier { withdraw_addresses: HashMap, - #[cfg(feature = "cosmwasm_1_4")] /// Mock of accumulated rewards, indexed first by delegator and then validator address. - rewards: BTreeMap>>, + #[cfg(feature = "cosmwasm_1_4")] + rewards: BTreeMap>>, } #[cfg(feature = "cosmwasm_1_3")] @@ -978,6 +978,7 @@ impl DistributionQuerier { } /// Sets accumulated rewards for a given validator and delegator pair. + #[cfg(feature = "cosmwasm_1_4")] pub fn set_rewards( &mut self, validator: impl Into, From 5fde07a45e6859da6961067b722634187d7ba330 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 24 Jul 2023 09:20:19 +0200 Subject: [PATCH 0663/2372] Disable clippy lint --- packages/std/src/testing/mock.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 98841e5a55..a52d554d1d 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -945,6 +945,7 @@ pub struct DistributionQuerier { #[cfg(feature = "cosmwasm_1_3")] impl DistributionQuerier { pub fn new(withdraw_addresses: HashMap) -> Self { + #[allow(clippy::needless_update)] DistributionQuerier { withdraw_addresses, ..Default::default() From 60dae3a250e87bd44d0c190a58ed322db9df8a42 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 25 Jul 2023 12:10:18 +0200 Subject: [PATCH 0664/2372] Link to protobuf files instead of generated code --- packages/std/src/query/distribution.rs | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/packages/std/src/query/distribution.rs b/packages/std/src/query/distribution.rs index 152c79994f..c6c511b366 100644 --- a/packages/std/src/query/distribution.rs +++ b/packages/std/src/query/distribution.rs @@ -9,24 +9,20 @@ use super::query_response::QueryResponseType; #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] pub enum DistributionQuery { - // https://github.com/cosmos/cosmos-sdk/blob/4f6f6c00021f4b5ee486bbb71ae2071a8ceb47c9/x/distribution/types/query.pb.go#L792-L795 - DelegatorWithdrawAddress { - delegator_address: String, - }, - // https://github.com/cosmos/cosmos-sdk/blob/e3482f2d4142c55f9dc3f47a321b56610a11492c/x/distribution/types/query.pb.go#L525-L532 + /// See + DelegatorWithdrawAddress { delegator_address: String }, + /// See #[cfg(feature = "cosmwasm_1_4")] DelegationRewards { delegator_address: String, validator_address: String, }, - // https://github.com/cosmos/cosmos-sdk/blob/e3482f2d4142c55f9dc3f47a321b56610a11492c/x/distribution/types/query.pb.go#L614-L619 + /// See #[cfg(feature = "cosmwasm_1_4")] - DelegationTotalRewards { - delegator_address: String, - }, + DelegationTotalRewards { delegator_address: String }, } -// https://github.com/cosmos/cosmos-sdk/blob/4f6f6c00021f4b5ee486bbb71ae2071a8ceb47c9/x/distribution/types/query.pb.go#L832-L835 +/// See #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] #[non_exhaustive] @@ -38,7 +34,7 @@ impl_response_constructor!(DelegatorWithdrawAddressResponse, withdraw_address: A impl QueryResponseType for DelegatorWithdrawAddressResponse {} -// https://github.com/cosmos/cosmos-sdk/blob/e3482f2d4142c55f9dc3f47a321b56610a11492c/x/distribution/types/query.pb.go#L567-L572 +/// See #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] pub struct DelegationRewardsResponse { @@ -49,7 +45,7 @@ impl_response_constructor!(DelegationRewardsResponse, rewards: Vec); impl QueryResponseType for DelegationRewardsResponse {} /// A coin type with decimal amount. -/// Modeled after the Cosmos SDK's `DecCoin` type +/// Modeled after the Cosmos SDK's [DecCoin](https://github.com/cosmos/cosmos-sdk/blob/c74e2887b0b73e81d48c2f33e6b1020090089ee0/proto/cosmos/base/v1beta1/coin.proto#L32-L41) type #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] pub struct DecCoin { @@ -57,7 +53,7 @@ pub struct DecCoin { pub amount: crate::Decimal, } -// https://github.com/cosmos/cosmos-sdk/blob/e3482f2d4142c55f9dc3f47a321b56610a11492c/x/distribution/types/query.pb.go#L654-L661 +/// See #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[non_exhaustive] pub struct DelegationTotalRewardsResponse { From 306ea202dba1bf7cd9187ee27550c041917e6055 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 25 Jul 2023 17:20:20 +0200 Subject: [PATCH 0665/2372] Add DelegatorValidators query --- packages/std/src/lib.rs | 6 ++-- packages/std/src/query/distribution.rs | 13 +++++++- packages/std/src/testing/mock.rs | 43 ++++++++++++++++++++++---- packages/std/src/traits.rs | 16 +++++++++- 4 files changed, 67 insertions(+), 11 deletions(-) diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 3b2954b4ce..99706aa22b 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -71,9 +71,9 @@ pub use crate::query::{ BalanceResponse, BankQuery, BondedDenomResponse, ChannelResponse, CodeInfoResponse, ContractInfoResponse, CustomQuery, DecCoin, Delegation, DelegationResponse, DelegationRewardsResponse, DelegationTotalRewardsResponse, DelegatorReward, - DelegatorWithdrawAddressResponse, DenomMetadataResponse, DistributionQuery, FullDelegation, - IbcQuery, ListChannelsResponse, PortIdResponse, QueryRequest, StakingQuery, SupplyResponse, - Validator, ValidatorResponse, WasmQuery, + DelegatorValidatorsResponse, DelegatorWithdrawAddressResponse, DenomMetadataResponse, + DistributionQuery, FullDelegation, IbcQuery, ListChannelsResponse, PortIdResponse, + QueryRequest, StakingQuery, SupplyResponse, Validator, ValidatorResponse, WasmQuery, }; #[allow(deprecated)] pub use crate::results::SubMsgExecutionResponse; diff --git a/packages/std/src/query/distribution.rs b/packages/std/src/query/distribution.rs index c6c511b366..fd052ba651 100644 --- a/packages/std/src/query/distribution.rs +++ b/packages/std/src/query/distribution.rs @@ -20,6 +20,9 @@ pub enum DistributionQuery { /// See #[cfg(feature = "cosmwasm_1_4")] DelegationTotalRewards { delegator_address: String }, + /// See + #[cfg(feature = "cosmwasm_1_4")] + DelegatorValidators { delegator_address: String }, } /// See @@ -31,7 +34,6 @@ pub struct DelegatorWithdrawAddressResponse { } impl_response_constructor!(DelegatorWithdrawAddressResponse, withdraw_address: Addr); - impl QueryResponseType for DelegatorWithdrawAddressResponse {} /// See @@ -73,3 +75,12 @@ pub struct DelegatorReward { pub validator_address: String, pub reward: Vec, } + +/// See +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +pub struct DelegatorValidatorsResponse { + pub validators: Vec, +} + +impl_response_constructor!(DelegatorValidatorsResponse, validators: Vec); +impl QueryResponseType for DelegatorValidatorsResponse {} diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index a52d554d1d..7b7d3f043d 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -5,6 +5,8 @@ use core::ops::Bound; use serde::de::DeserializeOwned; #[cfg(feature = "stargate")] use serde::Serialize; +#[cfg(feature = "cosmwasm_1_3")] +use std::collections::BTreeSet; use std::collections::HashMap; use crate::addresses::{Addr, CanonicalAddr}; @@ -39,7 +41,7 @@ use crate::traits::{Api, Querier, QuerierResult}; use crate::types::{BlockInfo, ContractInfo, Env, MessageInfo, TransactionInfo}; #[cfg(feature = "cosmwasm_1_3")] use crate::{ - query::{AllDenomMetadataResponse, DenomMetadataResponse}, + query::{AllDenomMetadataResponse, DelegatorValidatorsResponse, DenomMetadataResponse}, PageRequest, }; use crate::{Attribute, DenomMetadata}; @@ -938,14 +940,14 @@ impl StakingQuerier { pub struct DistributionQuerier { withdraw_addresses: HashMap, /// Mock of accumulated rewards, indexed first by delegator and then validator address. - #[cfg(feature = "cosmwasm_1_4")] rewards: BTreeMap>>, + /// Mock of validators that a delegator has bonded to. + validators: BTreeMap>, } #[cfg(feature = "cosmwasm_1_3")] impl DistributionQuerier { pub fn new(withdraw_addresses: HashMap) -> Self { - #[allow(clippy::needless_update)] DistributionQuerier { withdraw_addresses, ..Default::default() @@ -979,17 +981,35 @@ impl DistributionQuerier { } /// Sets accumulated rewards for a given validator and delegator pair. - #[cfg(feature = "cosmwasm_1_4")] pub fn set_rewards( &mut self, validator: impl Into, delegator: impl Into, rewards: Vec, ) { + let delegator = delegator.into(); + let validator = validator.into(); self.rewards - .entry(delegator.into()) + .entry(delegator.clone()) + .or_default() + .insert(validator.clone(), rewards); + // also add to validator set + self.validators + .entry(delegator) .or_default() - .insert(validator.into(), rewards); + .insert(validator); + } + + /// Sets the validators a given delegator has bonded to. + pub fn set_validators( + &mut self, + delegator: impl Into, + validators: impl IntoIterator>, + ) { + self.validators.insert( + delegator.into(), + validators.into_iter().map(Into::into).collect(), + ); } pub fn query(&self, request: &DistributionQuery) -> QuerierResult { @@ -1045,6 +1065,17 @@ impl DistributionQuerier { }; to_binary(&res).into() } + #[cfg(feature = "cosmwasm_1_4")] + DistributionQuery::DelegatorValidators { delegator_address } => { + let res = DelegatorValidatorsResponse { + validators: self + .validators + .get(delegator_address) + .map(|set| set.iter().cloned().collect()) + .unwrap_or_default(), + }; + to_binary(&res).into() + } }; // system result is always ok in the mock implementation SystemResult::Ok(contract_result) diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 5895b87a11..a5402660d1 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -344,7 +344,6 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { pub fn query_delegation_total_rewards( &self, delegator: impl Into, - validator: impl Into, ) -> StdResult { let request = DistributionQuery::DelegationTotalRewards { delegator_address: delegator.into(), @@ -353,6 +352,21 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { self.query(&request) } + #[cfg(feature = "cosmwasm_1_4")] + pub fn query_delegator_validators( + &self, + delegator: impl Into, + ) -> StdResult> { + use crate::DelegatorValidatorsResponse; + + let request = DistributionQuery::DelegatorValidators { + delegator_address: delegator.into(), + } + .into(); + let res: DelegatorValidatorsResponse = self.query(&request)?; + Ok(res.validators) + } + /// Queries another wasm contract. You should know a priori the proper types for T and U /// (response and request) based on the contract API pub fn query_wasm_smart( From fbea4b8e4c6a7a6bc499e42c7ea8053e397ff714 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 25 Jul 2023 17:34:29 +0200 Subject: [PATCH 0666/2372] Add cosmwasm_1_4 capability --- packages/check/src/main.rs | 2 +- packages/vm/src/testing/instance.rs | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/check/src/main.rs b/packages/check/src/main.rs index 6ba097470f..48998f889f 100644 --- a/packages/check/src/main.rs +++ b/packages/check/src/main.rs @@ -11,7 +11,7 @@ use cosmwasm_vm::capabilities_from_csv; use cosmwasm_vm::internals::{check_wasm, compile, make_compiling_engine}; const DEFAULT_AVAILABLE_CAPABILITIES: &str = - "iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2,cosmwasm_1_3"; + "iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2,cosmwasm_1_3,cosmwasm_1_4"; pub fn main() { let matches = Command::new("Contract checking") diff --git a/packages/vm/src/testing/instance.rs b/packages/vm/src/testing/instance.rs index 0b94321d7e..ce1ba84c07 100644 --- a/packages/vm/src/testing/instance.rs +++ b/packages/vm/src/testing/instance.rs @@ -98,8 +98,9 @@ pub struct MockInstanceOptions<'a> { impl MockInstanceOptions<'_> { fn default_capabilities() -> HashSet { #[allow(unused_mut)] - let mut out = - capabilities_from_csv("iterator,staking,cosmwasm_1_1,cosmwasm_1_2,cosmwasm_1_3"); + let mut out = capabilities_from_csv( + "iterator,staking,cosmwasm_1_1,cosmwasm_1_2,cosmwasm_1_3,cosmwasm_1_4", + ); #[cfg(feature = "stargate")] out.insert("stargate".to_string()); out From 8480348db7ac11e1e062cd669d71f99ee284cc69 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 25 Jul 2023 18:18:36 +0200 Subject: [PATCH 0667/2372] Add tests for new distribution querier mocks --- packages/std/src/query/distribution.rs | 9 ++ packages/std/src/testing/mock.rs | 109 +++++++++++++++++++++++-- 2 files changed, 109 insertions(+), 9 deletions(-) diff --git a/packages/std/src/query/distribution.rs b/packages/std/src/query/distribution.rs index fd052ba651..b59b83b50e 100644 --- a/packages/std/src/query/distribution.rs +++ b/packages/std/src/query/distribution.rs @@ -55,6 +55,15 @@ pub struct DecCoin { pub amount: crate::Decimal, } +impl DecCoin { + pub fn new(amount: crate::Decimal, denom: impl Into) -> Self { + Self { + denom: denom.into(), + amount, + } + } +} + /// See #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[non_exhaustive] diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 7b7d3f043d..d4a6547939 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -987,17 +987,10 @@ impl DistributionQuerier { delegator: impl Into, rewards: Vec, ) { - let delegator = delegator.into(); - let validator = validator.into(); self.rewards - .entry(delegator.clone()) + .entry(delegator.into()) .or_default() - .insert(validator.clone(), rewards); - // also add to validator set - self.validators - .entry(delegator) - .or_default() - .insert(validator); + .insert(validator.into(), rewards); } /// Sets the validators a given delegator has bonded to. @@ -1656,6 +1649,104 @@ mod tests { assert_eq!(res.withdraw_address, "addr1"); } + #[cfg(feature = "cosmwasm_1_4")] + #[test] + fn distribution_querier_delegator_validators() { + let mut distribution = DistributionQuerier::default(); + distribution.set_validators("addr0", ["valoper1", "valoper2"]); + + let query = DistributionQuery::DelegatorValidators { + delegator_address: "addr0".to_string(), + }; + + let res = distribution.query(&query).unwrap().unwrap(); + let res: DelegatorValidatorsResponse = from_binary(&res).unwrap(); + assert_eq!(res.validators, ["valoper1", "valoper2"]); + + let query = DistributionQuery::DelegatorValidators { + delegator_address: "addr1".to_string(), + }; + + let res = distribution.query(&query).unwrap().unwrap(); + let res: DelegatorValidatorsResponse = from_binary(&res).unwrap(); + assert_eq!(res.validators, ([] as [String; 0])); + } + + #[cfg(feature = "cosmwasm_1_4")] + #[test] + fn distribution_querier_delegation_rewards() { + use crate::{DelegationTotalRewardsResponse, DelegatorReward}; + + let mut distribution = DistributionQuerier::default(); + let valoper0_rewards = vec![ + DecCoin::new(Decimal::from_atomics(1234u128, 0).unwrap(), "uatom"), + DecCoin::new(Decimal::from_atomics(56781234u128, 4).unwrap(), "utest"), + ]; + distribution.set_rewards("valoper0", "addr0", valoper0_rewards.clone()); + + // both exist / are set + let query = DistributionQuery::DelegationRewards { + delegator_address: "addr0".to_string(), + validator_address: "valoper0".to_string(), + }; + let res = distribution.query(&query).unwrap().unwrap(); + let res: DelegationRewardsResponse = from_binary(&res).unwrap(); + assert_eq!(res.rewards, valoper0_rewards); + + // delegator does not exist + let query = DistributionQuery::DelegationRewards { + delegator_address: "nonexistent".to_string(), + validator_address: "valoper0".to_string(), + }; + let res = distribution.query(&query).unwrap().unwrap(); + let res: DelegationRewardsResponse = from_binary(&res).unwrap(); + assert_eq!(res.rewards.len(), 0); + + // validator does not exist + let query = DistributionQuery::DelegationRewards { + delegator_address: "addr0".to_string(), + validator_address: "valopernonexistent".to_string(), + }; + let res = distribution.query(&query).unwrap().unwrap(); + let res: DelegationRewardsResponse = from_binary(&res).unwrap(); + assert_eq!(res.rewards.len(), 0); + + // add one more validator + let valoper1_rewards = vec![DecCoin::new(Decimal::one(), "uatom")]; + distribution.set_rewards("valoper1", "addr0", valoper1_rewards.clone()); + + // total rewards + let query = DistributionQuery::DelegationTotalRewards { + delegator_address: "addr0".to_string(), + }; + let res = distribution.query(&query).unwrap().unwrap(); + let res: DelegationTotalRewardsResponse = from_binary(&res).unwrap(); + assert_eq!( + res.rewards, + vec![ + DelegatorReward { + validator_address: "valoper0".into(), + reward: valoper0_rewards + }, + DelegatorReward { + validator_address: "valoper1".into(), + reward: valoper1_rewards + }, + ] + ); + assert_eq!( + res.total, + [ + DecCoin::new( + Decimal::from_atomics(1234u128, 0).unwrap() + Decimal::one(), + "uatom" + ), + // total for utest should still be the same + DecCoin::new(Decimal::from_atomics(56781234u128, 4).unwrap(), "utest") + ] + ); + } + #[cfg(feature = "stargate")] #[test] fn ibc_querier_channel_existing() { From 3210d26e43fa47278698728e0b1d39a757ec4a08 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 26 Jul 2023 10:43:28 +0200 Subject: [PATCH 0668/2372] Fix build --- packages/std/src/testing/mock.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index d4a6547939..b3003508f5 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -41,14 +41,14 @@ use crate::traits::{Api, Querier, QuerierResult}; use crate::types::{BlockInfo, ContractInfo, Env, MessageInfo, TransactionInfo}; #[cfg(feature = "cosmwasm_1_3")] use crate::{ - query::{AllDenomMetadataResponse, DelegatorValidatorsResponse, DenomMetadataResponse}, + query::{AllDenomMetadataResponse, DecCoin, DenomMetadataResponse}, PageRequest, }; use crate::{Attribute, DenomMetadata}; #[cfg(feature = "stargate")] use crate::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; #[cfg(feature = "cosmwasm_1_4")] -use crate::{DecCoin, Decimal, DelegationRewardsResponse}; +use crate::{Decimal, DelegationRewardsResponse, DelegatorValidatorsResponse}; use super::riffle_shuffle; From 09d9a61f67d2ae5096975e0346569fef258c31d8 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 26 Jul 2023 15:58:13 +0200 Subject: [PATCH 0669/2372] Use cosmwasm_1_4 feature in ci --- .circleci/config.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index fd8abd4538..bae052e68f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -356,15 +356,15 @@ jobs: - run: name: Build library for native target (all features) working_directory: ~/project/packages/std - command: cargo build --locked --features abort,iterator,staking,stargate,cosmwasm_1_3 + command: cargo build --locked --features abort,iterator,staking,stargate,cosmwasm_1_4 - run: name: Build library for wasm target (all features) working_directory: ~/project/packages/std - command: cargo wasm --locked --features abort,iterator,staking,stargate,cosmwasm_1_3 + command: cargo wasm --locked --features abort,iterator,staking,stargate,cosmwasm_1_4 - run: name: Run unit tests (all features) working_directory: ~/project/packages/std - command: cargo test --locked --features abort,iterator,staking,stargate,cosmwasm_1_3 + command: cargo test --locked --features abort,iterator,staking,stargate,cosmwasm_1_4 - save_cache: paths: - /usr/local/cargo/registry @@ -907,7 +907,7 @@ jobs: - run: name: Clippy linting on std (all feature flags) working_directory: ~/project/packages/std - command: cargo clippy --all-targets --features abort,iterator,staking,stargate,cosmwasm_1_3 -- -D warnings + command: cargo clippy --all-targets --features abort,iterator,staking,stargate,cosmwasm_1_4 -- -D warnings - run: name: Clippy linting on storage (no feature flags) working_directory: ~/project/packages/storage @@ -984,7 +984,7 @@ jobs: CRYPTO=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/crypto --packages cosmwasm-crypto" DERIVE=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/derive --packages cosmwasm-derive" SCHEMA=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/schema --packages cosmwasm-schema" - STD=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/std --packages cosmwasm-std --features abort,iterator,staking,stargate,cosmwasm_1_3" + STD=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/std --packages cosmwasm-std --features abort,iterator,staking,stargate,cosmwasm_1_4" STORAGE="cargo tarpaulin --skip-clean --out Xml --output-dir reports/storage --packages cosmwasm-storage" docker run --security-opt seccomp=unconfined -v "${PWD}:/volume" xd009642/tarpaulin:0.21.0 \ sh -c "$CRYPTO && $DERIVE && $SCHEMA && $STD && $STORAGE" From e063fae3dd57d26bb4058aec511bf1904bd465e5 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 26 Jul 2023 16:07:34 +0200 Subject: [PATCH 0670/2372] Add cosmwasm_1_4 export --- packages/std/src/exports.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/std/src/exports.rs b/packages/std/src/exports.rs index 473f63a36b..8f057712d4 100644 --- a/packages/std/src/exports.rs +++ b/packages/std/src/exports.rs @@ -53,6 +53,10 @@ extern "C" fn requires_cosmwasm_1_2() -> () {} #[no_mangle] extern "C" fn requires_cosmwasm_1_3() -> () {} +#[cfg(feature = "cosmwasm_1_4")] +#[no_mangle] +extern "C" fn requires_cosmwasm_1_4() -> () {} + /// interface_version_* exports mark which Wasm VM interface level this contract is compiled for. /// They can be checked by cosmwasm_vm. /// Update this whenever the Wasm VM interface breaks. From 52910b64060aa352f761954532267fdf5d32fcc8 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 26 Jul 2023 16:46:50 +0200 Subject: [PATCH 0671/2372] Add cosmwasm_1_4 capability docs --- docs/CAPABILITIES-BUILT-IN.md | 4 ++++ docs/USING_COSMWASM_STD.md | 1 + 2 files changed, 5 insertions(+) diff --git a/docs/CAPABILITIES-BUILT-IN.md b/docs/CAPABILITIES-BUILT-IN.md index 2f2268e4e7..bf31681e9d 100644 --- a/docs/CAPABILITIES-BUILT-IN.md +++ b/docs/CAPABILITIES-BUILT-IN.md @@ -19,3 +19,7 @@ might define others. `BankQuery::DenomMetadata` and `DistributionQuery::DelegatorWithdrawAddress` queries, as well as `DistributionMsg::FundCommunityPool`. Only chains running CosmWasm `1.3.0` or higher support this. +- `cosmwasm_1_4` enables the `DistributionQuery::DelegationRewards`, + `DistributionQuery::DelegationTotalRewards` and + `DistributionQuery::DelegatorValidators` queries. Only chains running CosmWasm + `1.4.0` or higher support this. diff --git a/docs/USING_COSMWASM_STD.md b/docs/USING_COSMWASM_STD.md index 36730f9945..19a04bdb66 100644 --- a/docs/USING_COSMWASM_STD.md +++ b/docs/USING_COSMWASM_STD.md @@ -45,6 +45,7 @@ The libarary comes with the following features: | cosmwasm_1_1 | | Features that require CosmWasm 1.1+ on the chain | | cosmwasm_1_2 | | Features that require CosmWasm 1.2+ on the chain | | cosmwasm_1_3 | | Features that require CosmWasm 1.3+ on the chain | +| cosmwasm_1_4 | | Features that require CosmWasm 1.4+ on the chain | ## The cosmwasm-std dependency for contract developers From 16ff40b036d4639dec9223f0376875fe84f96c72 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 25 Aug 2023 11:58:38 +0200 Subject: [PATCH 0672/2372] Enable cosmwasm_1_4 feature in go-gen --- packages/go-gen/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/go-gen/Cargo.toml b/packages/go-gen/Cargo.toml index 5f3ad6ed74..5b0a24d80e 100644 --- a/packages/go-gen/Cargo.toml +++ b/packages/go-gen/Cargo.toml @@ -9,7 +9,7 @@ publish = false [dependencies] schemars = "0.8.3" -cosmwasm-std = { path = "../std", version = "1.4.0-beta.1", features = ["cosmwasm_1_3", "staking", "stargate", "ibc3"] } +cosmwasm-std = { path = "../std", version = "1.4.0-beta.1", features = ["cosmwasm_1_4", "staking", "stargate", "ibc3"] } cosmwasm-schema = { path = "../schema", version = "1.4.0-beta.1" } anyhow = "1" Inflector = "0.11.4" From f49390197c5a7a722f49e7df04cfea8b477e364e Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 25 Aug 2023 16:31:13 +0200 Subject: [PATCH 0673/2372] Add new query responses to go-gen tests --- packages/go-gen/src/main.rs | 3 +++ .../cosmwasm_std__DelegationRewardsResponse.go | 10 ++++++++++ ...wasm_std__DelegationTotalRewardsResponse.go | 16 ++++++++++++++++ ...osmwasm_std__DelegatorValidatorsResponse.go | 4 ++++ .../tests/cosmwasm_std__DistributionQuery.go | 18 +++++++++++++++++- 5 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 packages/go-gen/tests/cosmwasm_std__DelegationRewardsResponse.go create mode 100644 packages/go-gen/tests/cosmwasm_std__DelegationTotalRewardsResponse.go create mode 100644 packages/go-gen/tests/cosmwasm_std__DelegatorValidatorsResponse.go diff --git a/packages/go-gen/src/main.rs b/packages/go-gen/src/main.rs index 7688db1878..8d3dcc3d40 100644 --- a/packages/go-gen/src/main.rs +++ b/packages/go-gen/src/main.rs @@ -352,6 +352,9 @@ mod tests { // compare_codes!(cosmwasm_std::ValidatorResponse); // does not use "omitempty" for `Validator` field // distribution compare_codes!(cosmwasm_std::DelegatorWithdrawAddressResponse); + compare_codes!(cosmwasm_std::DelegationRewardsResponse); + compare_codes!(cosmwasm_std::DelegationTotalRewardsResponse); + compare_codes!(cosmwasm_std::DelegatorValidatorsResponse); // wasm compare_codes!(cosmwasm_std::ContractInfoResponse); // compare_codes!(cosmwasm_std::CodeInfoResponse); // TODO: Checksum type and "omitempty" diff --git a/packages/go-gen/tests/cosmwasm_std__DelegationRewardsResponse.go b/packages/go-gen/tests/cosmwasm_std__DelegationRewardsResponse.go new file mode 100644 index 0000000000..8779f696dc --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__DelegationRewardsResponse.go @@ -0,0 +1,10 @@ +// See +type DelegationRewardsResponse struct { + Rewards []DecCoin `json:"rewards"` +} + +// A coin type with decimal amount. Modeled after the Cosmos SDK's [DecCoin](https://github.com/cosmos/cosmos-sdk/blob/c74e2887b0b73e81d48c2f33e6b1020090089ee0/proto/cosmos/base/v1beta1/coin.proto#L32-L41) type +type DecCoin struct { + Amount string `json:"amount"` + Denom string `json:"denom"` +} \ No newline at end of file diff --git a/packages/go-gen/tests/cosmwasm_std__DelegationTotalRewardsResponse.go b/packages/go-gen/tests/cosmwasm_std__DelegationTotalRewardsResponse.go new file mode 100644 index 0000000000..772861c71b --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__DelegationTotalRewardsResponse.go @@ -0,0 +1,16 @@ +// See +type DelegationTotalRewardsResponse struct { + Rewards []DelegatorReward `json:"rewards"` + Total []DecCoin `json:"total"` +} + +// A coin type with decimal amount. Modeled after the Cosmos SDK's [DecCoin](https://github.com/cosmos/cosmos-sdk/blob/c74e2887b0b73e81d48c2f33e6b1020090089ee0/proto/cosmos/base/v1beta1/coin.proto#L32-L41) type +type DecCoin struct { + Amount string `json:"amount"` + Denom string `json:"denom"` +} + +type DelegatorReward struct { + Reward []DecCoin `json:"reward"` + ValidatorAddress string `json:"validator_address"` +} \ No newline at end of file diff --git a/packages/go-gen/tests/cosmwasm_std__DelegatorValidatorsResponse.go b/packages/go-gen/tests/cosmwasm_std__DelegatorValidatorsResponse.go new file mode 100644 index 0000000000..3b831e04ad --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__DelegatorValidatorsResponse.go @@ -0,0 +1,4 @@ +// See +type DelegatorValidatorsResponse struct { + Validators []string `json:"validators"` +} \ No newline at end of file diff --git a/packages/go-gen/tests/cosmwasm_std__DistributionQuery.go b/packages/go-gen/tests/cosmwasm_std__DistributionQuery.go index 79b541a7a1..5d33c3805d 100644 --- a/packages/go-gen/tests/cosmwasm_std__DistributionQuery.go +++ b/packages/go-gen/tests/cosmwasm_std__DistributionQuery.go @@ -1,8 +1,24 @@ - type DelegatorWithdrawAddressQuery struct { DelegatorAddress string `json:"delegator_address"` } +type DelegationRewardsQuery struct { + DelegatorAddress string `json:"delegator_address"` + ValidatorAddress string `json:"validator_address"` +} +type DelegationTotalRewardsQuery struct { + DelegatorAddress string `json:"delegator_address"` +} +type DelegatorValidatorsQuery struct { + DelegatorAddress string `json:"delegator_address"` +} type DistributionQuery struct { + // See DelegatorWithdrawAddress *DelegatorWithdrawAddressQuery `json:"delegator_withdraw_address,omitempty"` + // See + DelegationRewards *DelegationRewardsQuery `json:"delegation_rewards,omitempty"` + // See + DelegationTotalRewards *DelegationTotalRewardsQuery `json:"delegation_total_rewards,omitempty"` + // See + DelegatorValidators *DelegatorValidatorsQuery `json:"delegator_validators,omitempty"` } \ No newline at end of file From 75bc92c2efaa3801105567b9769c5ee0360eaad3 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 28 Aug 2023 14:12:17 +0200 Subject: [PATCH 0674/2372] Fix DecCoin::amount Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/go-gen/src/schema.rs | 1 + packages/std/src/query/distribution.rs | 8 ++++++-- packages/std/src/testing/mock.rs | 16 ++++++++-------- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/packages/go-gen/src/schema.rs b/packages/go-gen/src/schema.rs index 22e6fd7c97..9d9a3fa866 100644 --- a/packages/go-gen/src/schema.rs +++ b/packages/go-gen/src/schema.rs @@ -264,6 +264,7 @@ pub fn custom_type_of(ty: &str) -> Option<&str> { "HexBinary" => Some("Checksum"), "Addr" => Some("string"), "Decimal" => Some("string"), + "Decimal256" => Some("string"), _ => None, } } diff --git a/packages/std/src/query/distribution.rs b/packages/std/src/query/distribution.rs index b59b83b50e..dc6d096a68 100644 --- a/packages/std/src/query/distribution.rs +++ b/packages/std/src/query/distribution.rs @@ -52,11 +52,15 @@ impl QueryResponseType for DelegationRewardsResponse {} #[serde(rename_all = "snake_case")] pub struct DecCoin { pub denom: String, - pub amount: crate::Decimal, + /// An amount in the base denom of the distributed token. + /// + /// Some chains have choosen atto (10^-18) for their token's base denomination. If we used `Decimal` here, we could only store + /// 340282366920938463463.374607431768211455atoken which is 340.28 TOKEN. + pub amount: crate::Decimal256, } impl DecCoin { - pub fn new(amount: crate::Decimal, denom: impl Into) -> Self { + pub fn new(amount: crate::Decimal256, denom: impl Into) -> Self { Self { denom: denom.into(), amount, diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index b3003508f5..305af4afb1 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -48,7 +48,7 @@ use crate::{Attribute, DenomMetadata}; #[cfg(feature = "stargate")] use crate::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; #[cfg(feature = "cosmwasm_1_4")] -use crate::{Decimal, DelegationRewardsResponse, DelegatorValidatorsResponse}; +use crate::{Decimal256, DelegationRewardsResponse, DelegatorValidatorsResponse}; use super::riffle_shuffle; @@ -1045,7 +1045,7 @@ impl DistributionQuerier { acc.entry(&coin.denom) .or_insert_with(|| DecCoin { denom: coin.denom.clone(), - amount: Decimal::zero(), + amount: Decimal256::zero(), }) .amount += coin.amount; } @@ -1675,12 +1675,12 @@ mod tests { #[cfg(feature = "cosmwasm_1_4")] #[test] fn distribution_querier_delegation_rewards() { - use crate::{DelegationTotalRewardsResponse, DelegatorReward}; + use crate::{Decimal256, DelegationTotalRewardsResponse, DelegatorReward}; let mut distribution = DistributionQuerier::default(); let valoper0_rewards = vec![ - DecCoin::new(Decimal::from_atomics(1234u128, 0).unwrap(), "uatom"), - DecCoin::new(Decimal::from_atomics(56781234u128, 4).unwrap(), "utest"), + DecCoin::new(Decimal256::from_atomics(1234u128, 0).unwrap(), "uatom"), + DecCoin::new(Decimal256::from_atomics(56781234u128, 4).unwrap(), "utest"), ]; distribution.set_rewards("valoper0", "addr0", valoper0_rewards.clone()); @@ -1712,7 +1712,7 @@ mod tests { assert_eq!(res.rewards.len(), 0); // add one more validator - let valoper1_rewards = vec![DecCoin::new(Decimal::one(), "uatom")]; + let valoper1_rewards = vec![DecCoin::new(Decimal256::one(), "uatom")]; distribution.set_rewards("valoper1", "addr0", valoper1_rewards.clone()); // total rewards @@ -1738,11 +1738,11 @@ mod tests { res.total, [ DecCoin::new( - Decimal::from_atomics(1234u128, 0).unwrap() + Decimal::one(), + Decimal256::from_atomics(1234u128, 0).unwrap() + Decimal256::one(), "uatom" ), // total for utest should still be the same - DecCoin::new(Decimal::from_atomics(56781234u128, 4).unwrap(), "utest") + DecCoin::new(Decimal256::from_atomics(56781234u128, 4).unwrap(), "utest") ] ); } From 8193b2d2c978f544cb795bd17f8775fa7caeb712 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 28 Aug 2023 14:16:27 +0200 Subject: [PATCH 0675/2372] Add suggested DecCoin docs Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/std/src/query/distribution.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/std/src/query/distribution.rs b/packages/std/src/query/distribution.rs index dc6d096a68..0414ef7927 100644 --- a/packages/std/src/query/distribution.rs +++ b/packages/std/src/query/distribution.rs @@ -47,7 +47,14 @@ impl_response_constructor!(DelegationRewardsResponse, rewards: Vec); impl QueryResponseType for DelegationRewardsResponse {} /// A coin type with decimal amount. -/// Modeled after the Cosmos SDK's [DecCoin](https://github.com/cosmos/cosmos-sdk/blob/c74e2887b0b73e81d48c2f33e6b1020090089ee0/proto/cosmos/base/v1beta1/coin.proto#L32-L41) type +/// Modeled after the Cosmos SDK's [DecCoin] type. +/// However, in contrast to the Cosmos SDK the `amount` string MUST always have a dot at JSON level, +/// see . +/// Also if Cosmos SDK choses to migrate away from fixed point decimals +/// (as shown [here](https://github.com/cosmos/cosmos-sdk/blob/v0.47.4/x/group/internal/math/dec.go#L13-L21 and discussed [here](https://github.com/cosmos/cosmos-sdk/issues/11783)), +/// wasmd needs to truncate the decimal places to 18. +/// +/// [DecCoin]: (https://github.com/cosmos/cosmos-sdk/blob/v0.47.4/proto/cosmos/base/v1beta1/coin.proto#L28-L38) #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] pub struct DecCoin { From 8ebbaf30c5cb897c68c2e7fe08a3485a8851fff9 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 28 Aug 2023 14:32:17 +0200 Subject: [PATCH 0676/2372] Update cosmwasm_1_4 feature description --- packages/std/Cargo.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index c24de72d95..b617ef8392 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -44,7 +44,8 @@ cosmwasm_1_2 = ["cosmwasm_1_1"] cosmwasm_1_3 = ["cosmwasm_1_2"] # Together with the `iterator` feature this enables additional imports for more # efficient iteration over DB keys or values. -# It also makes `DistributionQuery::DelegationRewards` available for the contract to call +# It also makes `DistributionQuery::{DelegationRewards, DelegationTotalRewards, DelegatorValidators}` +# available for the contract to call. # It requires the host blockchain to run CosmWasm `1.4.0` or higher. cosmwasm_1_4 = ["cosmwasm_1_3"] From 26d4956da3ec7fe811047966d40a590cec3b305d Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 30 Aug 2023 09:42:04 +0200 Subject: [PATCH 0677/2372] Fix missing new line --- .vscode/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 411942acf5..a9e08224c1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,4 +5,4 @@ "staking", "cosmwasm_1_4" ] -} \ No newline at end of file +} From ea4a20bbf01de0cefdec642d902946db90e3c0b0 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 30 Aug 2023 09:47:25 +0200 Subject: [PATCH 0678/2372] Add changelog entry --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9fd9de9720..0f79ddbe7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,14 @@ and this project adheres to ## [Unreleased] +### Added + +- cosmwasm-std: Add + `DistributionQuery::{DelegationRewards, DelegationTotalRewards, DelegatorValidators}`. + This requires the `cosmwasm_1_4` feature to be enabled. ([#1788]) + +[#1788]: https://github.com/CosmWasm/cosmwasm/pull/1788 + ## [1.4.0-beta.1] - 2023-08-29 ### Added From e3a17d19ad4008db5d598c2603205ed3c5b9fa65 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 30 Aug 2023 12:19:32 +0200 Subject: [PATCH 0679/2372] Add must_use to Instance::recycle --- packages/vm/src/instance.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 73125edbc3..cd9efe65de 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -306,6 +306,7 @@ where /// Decomposes this instance into its components. /// External dependencies are returned for reuse, the rest is dropped. + #[must_use = "Calling ::recycle() without reusing the returned backend just drops the instance"] pub fn recycle(self) -> Option> { let Instance { _inner, fe, store, .. From c6a373ca1d343f021f9db7af40f095950cdb7932 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 30 Aug 2023 12:20:48 +0200 Subject: [PATCH 0680/2372] Set version: 1.4.0-rc.1 --- Cargo.lock | 16 ++++++++-------- contracts/burner/Cargo.lock | 12 ++++++------ contracts/crypto-verify/Cargo.lock | 12 ++++++------ contracts/cyberpunk/Cargo.lock | 12 ++++++------ contracts/floaty/Cargo.lock | 12 ++++++------ contracts/hackatom/Cargo.lock | 12 ++++++------ contracts/ibc-reflect-send/Cargo.lock | 12 ++++++------ contracts/ibc-reflect/Cargo.lock | 12 ++++++------ contracts/queue/Cargo.lock | 12 ++++++------ contracts/reflect/Cargo.lock | 12 ++++++------ contracts/staking/Cargo.lock | 12 ++++++------ contracts/virus/Cargo.lock | 12 ++++++------ packages/check/Cargo.toml | 6 +++--- packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/go-gen/Cargo.toml | 4 ++-- packages/schema-derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 6 +++--- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 21 files changed, 93 insertions(+), 93 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b346fcc721..6247d9211f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -427,7 +427,7 @@ dependencies = [ [[package]] name = "cosmwasm-check" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "anyhow", "assert_cmd", @@ -440,7 +440,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "criterion", "digest 0.10.6", @@ -458,7 +458,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "cosmwasm-std", "syn 1.0.109", @@ -466,7 +466,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "anyhow", "cosmwasm-schema-derive", @@ -481,7 +481,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -490,7 +490,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "base64", "bnum", @@ -513,7 +513,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "cosmwasm-std", "serde", @@ -521,7 +521,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 21724bb37f..c6a75dd82c 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -193,7 +193,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -204,14 +204,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -222,7 +222,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -231,7 +231,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "base64", "bnum", @@ -249,7 +249,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 6388fb6fa6..107d48bf27 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 3263aea6fd..28b5b37982 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -217,7 +217,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -228,14 +228,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -246,7 +246,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -255,7 +255,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "base64 0.21.2", "bnum", @@ -273,7 +273,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index bdfd1dd93f..4bd69542be 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index a53524f237..6301975378 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index c96d853fa0..aa6edd652f 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index fe04d31dcb..8883eb426c 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index fd54c44354..8b018e2926 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index eeb04b20a9..abf6ee617a 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 89a26d00c7..125a5918cd 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index c4b8f4adef..5555eb9db5 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" dependencies = [ "bitflags", "bytecheck", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index d993171208..3d5435bc67 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-check" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" authors = ["Mauro Lacy "] edition = "2021" description = "A CLI tool for verifying CosmWasm smart contracts" @@ -11,8 +11,8 @@ license = "Apache-2.0" anyhow = "1.0.57" clap = "4" colored = "2" -cosmwasm-vm = { path = "../vm", version = "1.4.0-beta.1" } -cosmwasm-std = { path = "../std", version = "1.4.0-beta.1" } +cosmwasm-vm = { path = "../vm", version = "1.4.0-rc.1" } +cosmwasm-std = { path = "../std", version = "1.4.0-rc.1" } [dev-dependencies] assert_cmd = "=2.0.10" # 2.0.11+ requires Rust 1.65.0 which we currently don't want to make the minimum if possible diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 9e14f8c3d6..dddbefe920 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" authors = ["Mauro Lacy "] edition = "2021" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index a6cf42757a..3a3adbd84a 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" authors = ["Simon Warta "] edition = "2021" description = "A package for auto-generated code used for CosmWasm contract development. This is shipped as part of cosmwasm-std. Do not use directly." diff --git a/packages/go-gen/Cargo.toml b/packages/go-gen/Cargo.toml index 5b0a24d80e..8309d7d4a1 100644 --- a/packages/go-gen/Cargo.toml +++ b/packages/go-gen/Cargo.toml @@ -9,8 +9,8 @@ publish = false [dependencies] schemars = "0.8.3" -cosmwasm-std = { path = "../std", version = "1.4.0-beta.1", features = ["cosmwasm_1_4", "staking", "stargate", "ibc3"] } -cosmwasm-schema = { path = "../schema", version = "1.4.0-beta.1" } +cosmwasm-std = { path = "../std", version = "1.4.0-rc.1", features = ["cosmwasm_1_4", "staking", "stargate", "ibc3"] } +cosmwasm-schema = { path = "../schema", version = "1.4.0-rc.1" } anyhow = "1" Inflector = "0.11.4" indenter = "0.3.3" diff --git a/packages/schema-derive/Cargo.toml b/packages/schema-derive/Cargo.toml index 9afa3f5455..77a17c51c5 100644 --- a/packages/schema-derive/Cargo.toml +++ b/packages/schema-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema-derive" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" authors = ["Tomasz Kurcz "] edition = "2021" description = "Derive macros for cosmwasm-schema" diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index db6648fada..cfa7b5485f 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" authors = ["Simon Warta ", "Ethan Frey "] edition = "2021" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." @@ -8,7 +8,7 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/schema" license = "Apache-2.0" [dependencies] -cosmwasm-schema-derive = { version = "=1.4.0-beta.1", path = "../schema-derive" } +cosmwasm-schema-derive = { version = "=1.4.0-rc.1", path = "../schema-derive" } schemars = "0.8.3" serde = "1.0" serde_json = "1.0.40" @@ -16,6 +16,6 @@ thiserror = "1.0.26" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = { version = "1.4.0-beta.1", path = "../std" } +cosmwasm-std = { version = "1.4.0-rc.1", path = "../std" } semver = "1" tempfile = "3" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index b617ef8392..51d474b6e0 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" authors = ["Ethan Frey "] edition = "2021" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -51,7 +51,7 @@ cosmwasm_1_4 = ["cosmwasm_1_3"] [dependencies] base64 = "0.21.0" -cosmwasm-derive = { path = "../derive", version = "1.4.0-beta.1" } +cosmwasm-derive = { path = "../derive", version = "1.4.0-rc.1" } derivative = "2" forward_ref = "1" hex = "0.4" @@ -63,7 +63,7 @@ thiserror = "1.0.26" bnum = "0.8.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "1.4.0-beta.1" } +cosmwasm-crypto = { path = "../crypto", version = "1.4.0-rc.1" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 39fbc3591c..709de7eb63 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" authors = ["Ethan Frey "] edition = "2021" description = "CosmWasm library with useful helpers for Storage patterns" @@ -16,5 +16,5 @@ iterator = ["cosmwasm-std/iterator"] [dependencies] # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.4.0-beta.1", default-features = false } +cosmwasm-std = { path = "../std", version = "1.4.0-rc.1", default-features = false } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index b945828286..32b7271216 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "1.4.0-beta.1" +version = "1.4.0-rc.1" authors = ["Ethan Frey "] edition = "2021" description = "VM bindings to run cosmwams contracts" @@ -39,8 +39,8 @@ bytes = "1.4.0" # need a higher version than the one required by Wasmer for the clru = "0.4.0" crc32fast = "1.3.2" # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.4.0-beta.1", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "1.4.0-beta.1" } +cosmwasm-std = { path = "../std", version = "1.4.0-rc.1", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "1.4.0-rc.1" } derivative = "2" hex = "0.4" schemars = "0.8.3" From 4ed28b17cb977a9e6b2fa610cf36936dfe6b0f69 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 30 Aug 2023 12:21:54 +0200 Subject: [PATCH 0681/2372] Update changelog --- CHANGELOG.md | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f79ddbe7a..e0158cd88a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,15 +6,7 @@ and this project adheres to ## [Unreleased] -### Added - -- cosmwasm-std: Add - `DistributionQuery::{DelegationRewards, DelegationTotalRewards, DelegatorValidators}`. - This requires the `cosmwasm_1_4` feature to be enabled. ([#1788]) - -[#1788]: https://github.com/CosmWasm/cosmwasm/pull/1788 - -## [1.4.0-beta.1] - 2023-08-29 +## [1.4.0-rc.1] - 2023-08-30 ### Added @@ -27,12 +19,16 @@ and this project adheres to - cosmwasm-std: Add new imports `db_next_{key, value}` for iterating storage keys / values only and make `Storage::{range_keys, range_values}` more efficient. This requires the `cosmwasm_1_4` feature to be enabled. ([#1834]) +- cosmwasm-std: Add + `DistributionQuery::{DelegationRewards, DelegationTotalRewards, DelegatorValidators}`. + This requires the `cosmwasm_1_4` feature to be enabled. ([#1788]) [#1512]: https://github.com/CosmWasm/cosmwasm/issues/1512 [#1799]: https://github.com/CosmWasm/cosmwasm/pull/1799 [#1806]: https://github.com/CosmWasm/cosmwasm/pull/1806 [#1832]: https://github.com/CosmWasm/cosmwasm/pull/1832 [#1834]: https://github.com/CosmWasm/cosmwasm/pull/1834 +[#1788]: https://github.com/CosmWasm/cosmwasm/pull/1788 ### Changed @@ -1861,9 +1857,9 @@ Some main points: All future Changelog entries will reference this base -[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.4.0-beta.1...HEAD -[1.4.0-beta.1]: - https://github.com/CosmWasm/cosmwasm/compare/v1.3.3...v1.4.0-beta.1 +[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.4.0-rc.1...HEAD +[1.4.0-rc.1]: + https://github.com/CosmWasm/cosmwasm/compare/v1.3.3...v1.4.0-rc.1 [1.3.3]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.2...v1.3.3 [1.3.2]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.1...v1.3.2 [1.3.1]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.0...v1.3.1 From f8b64d4fc07b97768ada7c9c53e749aed000c9c5 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 30 Aug 2023 12:44:10 +0200 Subject: [PATCH 0682/2372] Format changelog --- CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0158cd88a..f09e3ccc17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1858,8 +1858,7 @@ Some main points: All future Changelog entries will reference this base [unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.4.0-rc.1...HEAD -[1.4.0-rc.1]: - https://github.com/CosmWasm/cosmwasm/compare/v1.3.3...v1.4.0-rc.1 +[1.4.0-rc.1]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.3...v1.4.0-rc.1 [1.3.3]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.2...v1.3.3 [1.3.2]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.1...v1.3.2 [1.3.1]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.0...v1.3.1 From 22a923a705e92d6fa12e3aac249865d821e787e5 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 30 Aug 2023 16:20:51 +0200 Subject: [PATCH 0683/2372] Update doc links --- docs/MESSAGE_TYPES.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/MESSAGE_TYPES.md b/docs/MESSAGE_TYPES.md index 30d4ce91f7..627b3b351e 100644 --- a/docs/MESSAGE_TYPES.md +++ b/docs/MESSAGE_TYPES.md @@ -32,18 +32,18 @@ Rust types as well as `cosmwasm_std` types and how they are encoded in JSON. | [HexBinary] | string containing hex data | `"b5d7d24e428c"` | | | [Timestamp] | string containing nanoseconds since epoch | `"1677687687000000000"` | | -[uint64]: https://docs.rs/cosmwasm-std/1.2.5/cosmwasm_std/struct.Uint64.html -[uint128]: https://docs.rs/cosmwasm-std/1.2.5/cosmwasm_std/struct.Uint128.html -[uint256]: https://docs.rs/cosmwasm-std/1.2.5/cosmwasm_std/struct.Uint256.html -[uint512]: https://docs.rs/cosmwasm-std/1.2.5/cosmwasm_std/struct.Uint512.html -[decimal]: https://docs.rs/cosmwasm-std/1.2.5/cosmwasm_std/struct.Decimal.html +[uint64]: https://docs.rs/cosmwasm-std/1.3.3/cosmwasm_std/struct.Uint64.html +[uint128]: https://docs.rs/cosmwasm-std/1.3.3/cosmwasm_std/struct.Uint128.html +[uint256]: https://docs.rs/cosmwasm-std/1.3.3/cosmwasm_std/struct.Uint256.html +[uint512]: https://docs.rs/cosmwasm-std/1.3.3/cosmwasm_std/struct.Uint512.html +[decimal]: https://docs.rs/cosmwasm-std/1.3.3/cosmwasm_std/struct.Decimal.html [decimal256]: - https://docs.rs/cosmwasm-std/1.2.5/cosmwasm_std/struct.Decimal256.html -[binary]: https://docs.rs/cosmwasm-std/1.2.5/cosmwasm_std/struct.Binary.html + https://docs.rs/cosmwasm-std/1.3.3/cosmwasm_std/struct.Decimal256.html +[binary]: https://docs.rs/cosmwasm-std/1.3.3/cosmwasm_std/struct.Binary.html [hexbinary]: - https://docs.rs/cosmwasm-std/1.2.5/cosmwasm_std/struct.HexBinary.html + https://docs.rs/cosmwasm-std/1.3.3/cosmwasm_std/struct.HexBinary.html [timestamp]: - https://docs.rs/cosmwasm-std/1.2.5/cosmwasm_std/struct.Timestamp.html + https://docs.rs/cosmwasm-std/1.3.3/cosmwasm_std/struct.Timestamp.html [dev-note-4]: https://medium.com/cosmwasm/dev-note-4-u128-i128-serialization-in-cosmwasm-90cb76784d44 From f9300b49abe6f118d4fe55f73308375489523890 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 30 Aug 2023 16:51:17 +0200 Subject: [PATCH 0684/2372] Add Int64/Int128/Int256/Int512 to MESSAGE_TYPES --- docs/MESSAGE_TYPES.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/MESSAGE_TYPES.md b/docs/MESSAGE_TYPES.md index 627b3b351e..8c34243704 100644 --- a/docs/MESSAGE_TYPES.md +++ b/docs/MESSAGE_TYPES.md @@ -22,10 +22,10 @@ Rust types as well as `cosmwasm_std` types and how they are encoded in JSON. | Vec\ | array of JSON type of `T` | `["one", "two", "three"]` (Vec\), `[true, false]` (Vec\) | | Vec\ | array of numbers from 0 to 255 | `[187, 61, 11, 250]` | ⚠️ Discouraged as this encoding is not as compact as it can be. See `Binary`. | | struct MyType { … } | object | `{"foo":12}` | | -| [Uint64] | string containing number | `"1234321"` | Used to support full uint64 range in all implementations | -| [Uint128] | string containing number | `"1234321"` | | -| [Uint256] | string containing number | `"1234321"` | | -| [Uint512] | string containing number | `"1234321"` | | +| [Uint64]/[Int64] | string containing number | `"1234321"`, `"-1234321"` | Used to support full uint64/int64 range in all implementations | +| [Uint128]/[Int128] | string containing number | `"1234321"`, `"-1234321"` | | +| [Uint256]/[Int256] | string containing number | `"1234321"`, `"-1234321"` | | +| [Uint512]/[Int512] | string containing number | `"1234321"`, `"-1234321"` | | | [Decimal] | string containing decimal number | `"55.6584"` | | | [Decimal256] | string containing decimal number | `"55.6584"` | | | [Binary] | string containing base64 data | `"MTIzCg=="` | | @@ -36,6 +36,10 @@ Rust types as well as `cosmwasm_std` types and how they are encoded in JSON. [uint128]: https://docs.rs/cosmwasm-std/1.3.3/cosmwasm_std/struct.Uint128.html [uint256]: https://docs.rs/cosmwasm-std/1.3.3/cosmwasm_std/struct.Uint256.html [uint512]: https://docs.rs/cosmwasm-std/1.3.3/cosmwasm_std/struct.Uint512.html +[int64]: https://docs.rs/cosmwasm-std/1.3.3/cosmwasm_std/struct.Int64.html +[int128]: https://docs.rs/cosmwasm-std/1.3.3/cosmwasm_std/struct.Int128.html +[int256]: https://docs.rs/cosmwasm-std/1.3.3/cosmwasm_std/struct.Int256.html +[int512]: https://docs.rs/cosmwasm-std/1.3.3/cosmwasm_std/struct.Int512.html [decimal]: https://docs.rs/cosmwasm-std/1.3.3/cosmwasm_std/struct.Decimal.html [decimal256]: https://docs.rs/cosmwasm-std/1.3.3/cosmwasm_std/struct.Decimal256.html From 51bd8ea5f57fbf0a79bbd4cd4603a5f6a6348735 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 31 Aug 2023 16:55:16 +0200 Subject: [PATCH 0685/2372] Remove custom rustfmt.toml files from contracts --- contracts/reflect/rustfmt.toml | 15 --------------- contracts/staking/rustfmt.toml | 15 --------------- 2 files changed, 30 deletions(-) delete mode 100644 contracts/reflect/rustfmt.toml delete mode 100644 contracts/staking/rustfmt.toml diff --git a/contracts/reflect/rustfmt.toml b/contracts/reflect/rustfmt.toml deleted file mode 100644 index 11a85e6a9c..0000000000 --- a/contracts/reflect/rustfmt.toml +++ /dev/null @@ -1,15 +0,0 @@ -# stable -newline_style = "unix" -hard_tabs = false -tab_spaces = 4 - -# unstable... should we require `rustup run nightly cargo fmt` ? -# or just update the style guide when they are stable? -#fn_single_line = true -#format_code_in_doc_comments = true -#overflow_delimited_expr = true -#reorder_impl_items = true -#struct_field_align_threshold = 20 -#struct_lit_single_line = true -#report_todo = "Always" - diff --git a/contracts/staking/rustfmt.toml b/contracts/staking/rustfmt.toml deleted file mode 100644 index 11a85e6a9c..0000000000 --- a/contracts/staking/rustfmt.toml +++ /dev/null @@ -1,15 +0,0 @@ -# stable -newline_style = "unix" -hard_tabs = false -tab_spaces = 4 - -# unstable... should we require `rustup run nightly cargo fmt` ? -# or just update the style guide when they are stable? -#fn_single_line = true -#format_code_in_doc_comments = true -#overflow_delimited_expr = true -#reorder_impl_items = true -#struct_field_align_threshold = 20 -#struct_lit_single_line = true -#report_todo = "Always" - From 677b3fb68df15b832109e351ec4aafb581bfe50f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 1 Sep 2023 10:30:02 +0200 Subject: [PATCH 0686/2372] Enable cosmwasm_1_4 for reflect contract --- contracts/reflect/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/reflect/Cargo.toml b/contracts/reflect/Cargo.toml index 0bdd45558e..8ef7e171b2 100644 --- a/contracts/reflect/Cargo.toml +++ b/contracts/reflect/Cargo.toml @@ -34,7 +34,7 @@ backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } -cosmwasm-std = { path = "../../packages/std", default-features = false, features = ["staking", "stargate", "cosmwasm_1_1"] } +cosmwasm-std = { path = "../../packages/std", default-features = false, features = ["staking", "stargate", "cosmwasm_1_4"] } schemars = "0.8.3" serde = { version = "=1.0.103", default-features = false, features = ["derive"] } thiserror = "1.0.26" From 4b45ed566ad3aeeeacb8130e16fc31b97b6b32f0 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 1 Sep 2023 10:51:13 +0200 Subject: [PATCH 0687/2372] Update schema --- contracts/reflect/schema/raw/execute.json | 128 +++++++++ contracts/reflect/schema/raw/query.json | 201 +++++++++++++ contracts/reflect/schema/reflect.json | 329 ++++++++++++++++++++++ 3 files changed, 658 insertions(+) diff --git a/contracts/reflect/schema/raw/execute.json b/contracts/reflect/schema/raw/execute.json index c6ce9e141d..4180145986 100644 --- a/contracts/reflect/schema/raw/execute.json +++ b/contracts/reflect/schema/raw/execute.json @@ -291,6 +291,10 @@ } ] }, + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + }, "DistributionMsg": { "description": "The message types of the distribution module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto", "oneOf": [ @@ -337,6 +341,31 @@ } }, "additionalProperties": false + }, + { + "description": "This is translated to a [[MsgFundCommunityPool](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#LL69C1-L76C2). `depositor` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "fund_community_pool" + ], + "properties": { + "fund_community_pool": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "description": "The amount to spend", + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + } + } + }, + "additionalProperties": false } ] }, @@ -374,6 +403,36 @@ } }, "additionalProperties": false + }, + { + "description": "This maps directly to [MsgVoteWeighted](https://github.com/cosmos/cosmos-sdk/blob/v0.45.8/proto/cosmos/gov/v1beta1/tx.proto#L66-L78) in the Cosmos SDK with voter set to the contract address.", + "type": "object", + "required": [ + "vote_weighted" + ], + "properties": { + "vote_weighted": { + "type": "object", + "required": [ + "options", + "proposal_id" + ], + "properties": { + "options": { + "type": "array", + "items": { + "$ref": "#/definitions/WeightedVoteOption" + } + }, + "proposal_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false } ] }, @@ -794,6 +853,60 @@ }, "additionalProperties": false }, + { + "description": "Instantiates a new contracts from previously uploaded Wasm code using a predictable address derivation algorithm implemented in [`cosmwasm_std::instantiate2_address`].\n\nThis is translated to a [MsgInstantiateContract2](https://github.com/CosmWasm/wasmd/blob/v0.29.2/proto/cosmwasm/wasm/v1/tx.proto#L73-L96). `sender` is automatically filled with the current contract's address. `fix_msg` is automatically set to false.", + "type": "object", + "required": [ + "instantiate2" + ], + "properties": { + "instantiate2": { + "type": "object", + "required": [ + "code_id", + "funds", + "label", + "msg", + "salt" + ], + "properties": { + "admin": { + "type": [ + "string", + "null" + ] + }, + "code_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "funds": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "label": { + "description": "A human-readable label for the contract.\n\nValid values should: - not be empty - not be bigger than 128 bytes (or some chain-specific limit) - not start / end with whitespace", + "type": "string" + }, + "msg": { + "description": "msg is the JSON-encoded InstantiateMsg struct (as raw Binary)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "salt": { + "$ref": "#/definitions/Binary" + } + } + } + }, + "additionalProperties": false + }, { "description": "Migrates a given contracts to use new wasm code. Passes a MigrateMsg to allow us to customize behavior.\n\nOnly the contract admin (as defined in wasmd), if any, is able to make this call.\n\nThis is translated to a [MsgMigrateContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L86-L96). `sender` is automatically filled with the current contract's address.", "type": "object", @@ -878,6 +991,21 @@ "additionalProperties": false } ] + }, + "WeightedVoteOption": { + "type": "object", + "required": [ + "option", + "weight" + ], + "properties": { + "option": { + "$ref": "#/definitions/VoteOption" + }, + "weight": { + "$ref": "#/definitions/Decimal" + } + } } } } diff --git a/contracts/reflect/schema/raw/query.json b/contracts/reflect/schema/raw/query.json index 914555088d..ef21990549 100644 --- a/contracts/reflect/schema/raw/query.json +++ b/contracts/reflect/schema/raw/query.json @@ -179,6 +179,52 @@ } }, "additionalProperties": false + }, + { + "description": "This calls into the native bank module for querying metadata for a specific bank token. Return value is DenomMetadataResponse", + "type": "object", + "required": [ + "denom_metadata" + ], + "properties": { + "denom_metadata": { + "type": "object", + "required": [ + "denom" + ], + "properties": { + "denom": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This calls into the native bank module for querying metadata for all bank tokens that have a metadata entry. Return value is AllDenomMetadataResponse", + "type": "object", + "required": [ + "all_denom_metadata" + ], + "properties": { + "all_denom_metadata": { + "type": "object", + "properties": { + "pagination": { + "anyOf": [ + { + "$ref": "#/definitions/PageRequest" + }, + { + "type": "null" + } + ] + } + } + } + }, + "additionalProperties": false } ] }, @@ -186,6 +232,98 @@ "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", "type": "string" }, + "DistributionQuery": { + "oneOf": [ + { + "description": "See ", + "type": "object", + "required": [ + "delegator_withdraw_address" + ], + "properties": { + "delegator_withdraw_address": { + "type": "object", + "required": [ + "delegator_address" + ], + "properties": { + "delegator_address": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "See ", + "type": "object", + "required": [ + "delegation_rewards" + ], + "properties": { + "delegation_rewards": { + "type": "object", + "required": [ + "delegator_address", + "validator_address" + ], + "properties": { + "delegator_address": { + "type": "string" + }, + "validator_address": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "See ", + "type": "object", + "required": [ + "delegation_total_rewards" + ], + "properties": { + "delegation_total_rewards": { + "type": "object", + "required": [ + "delegator_address" + ], + "properties": { + "delegator_address": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "See ", + "type": "object", + "required": [ + "delegator_validators" + ], + "properties": { + "delegator_validators": { + "type": "object", + "required": [ + "delegator_address" + ], + "properties": { + "delegator_address": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, "IbcQuery": { "description": "These are queries to the various IBC modules to see the state of the contract's IBC connection. These will return errors if the contract is not \"ibc enabled\"", "oneOf": [ @@ -252,6 +390,34 @@ } ] }, + "PageRequest": { + "description": "Simplified version of the PageRequest type for pagination from the cosmos-sdk", + "type": "object", + "required": [ + "limit", + "reverse" + ], + "properties": { + "key": { + "anyOf": [ + { + "$ref": "#/definitions/Binary" + }, + { + "type": "null" + } + ] + }, + "limit": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "reverse": { + "type": "boolean" + } + } + }, "QueryRequest_for_SpecialQuery": { "oneOf": [ { @@ -290,6 +456,18 @@ }, "additionalProperties": false }, + { + "type": "object", + "required": [ + "distribution" + ], + "properties": { + "distribution": { + "$ref": "#/definitions/DistributionQuery" + } + }, + "additionalProperties": false + }, { "description": "A Stargate query is encoded the same way as abci_query, with path and protobuf encoded request data. The format is defined in [ADR-21](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-021-protobuf-query-encoding.md). The response is protobuf encoded data directly without a JSON response wrapper. The caller is responsible for compiling the proper protobuf definitions for both requests and responses.", "type": "object", @@ -566,6 +744,29 @@ } }, "additionalProperties": false + }, + { + "description": "Returns a [`CodeInfoResponse`] with metadata of the code", + "type": "object", + "required": [ + "code_info" + ], + "properties": { + "code_info": { + "type": "object", + "required": [ + "code_id" + ], + "properties": { + "code_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false } ] } diff --git a/contracts/reflect/schema/reflect.json b/contracts/reflect/schema/reflect.json index 999f0b7506..ab5217ce28 100644 --- a/contracts/reflect/schema/reflect.json +++ b/contracts/reflect/schema/reflect.json @@ -301,6 +301,10 @@ } ] }, + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + }, "DistributionMsg": { "description": "The message types of the distribution module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto", "oneOf": [ @@ -347,6 +351,31 @@ } }, "additionalProperties": false + }, + { + "description": "This is translated to a [[MsgFundCommunityPool](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#LL69C1-L76C2). `depositor` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "fund_community_pool" + ], + "properties": { + "fund_community_pool": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "description": "The amount to spend", + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + } + } + }, + "additionalProperties": false } ] }, @@ -384,6 +413,36 @@ } }, "additionalProperties": false + }, + { + "description": "This maps directly to [MsgVoteWeighted](https://github.com/cosmos/cosmos-sdk/blob/v0.45.8/proto/cosmos/gov/v1beta1/tx.proto#L66-L78) in the Cosmos SDK with voter set to the contract address.", + "type": "object", + "required": [ + "vote_weighted" + ], + "properties": { + "vote_weighted": { + "type": "object", + "required": [ + "options", + "proposal_id" + ], + "properties": { + "options": { + "type": "array", + "items": { + "$ref": "#/definitions/WeightedVoteOption" + } + }, + "proposal_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false } ] }, @@ -804,6 +863,60 @@ }, "additionalProperties": false }, + { + "description": "Instantiates a new contracts from previously uploaded Wasm code using a predictable address derivation algorithm implemented in [`cosmwasm_std::instantiate2_address`].\n\nThis is translated to a [MsgInstantiateContract2](https://github.com/CosmWasm/wasmd/blob/v0.29.2/proto/cosmwasm/wasm/v1/tx.proto#L73-L96). `sender` is automatically filled with the current contract's address. `fix_msg` is automatically set to false.", + "type": "object", + "required": [ + "instantiate2" + ], + "properties": { + "instantiate2": { + "type": "object", + "required": [ + "code_id", + "funds", + "label", + "msg", + "salt" + ], + "properties": { + "admin": { + "type": [ + "string", + "null" + ] + }, + "code_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "funds": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "label": { + "description": "A human-readable label for the contract.\n\nValid values should: - not be empty - not be bigger than 128 bytes (or some chain-specific limit) - not start / end with whitespace", + "type": "string" + }, + "msg": { + "description": "msg is the JSON-encoded InstantiateMsg struct (as raw Binary)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "salt": { + "$ref": "#/definitions/Binary" + } + } + } + }, + "additionalProperties": false + }, { "description": "Migrates a given contracts to use new wasm code. Passes a MigrateMsg to allow us to customize behavior.\n\nOnly the contract admin (as defined in wasmd), if any, is able to make this call.\n\nThis is translated to a [MsgMigrateContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L86-L96). `sender` is automatically filled with the current contract's address.", "type": "object", @@ -888,6 +1001,21 @@ "additionalProperties": false } ] + }, + "WeightedVoteOption": { + "type": "object", + "required": [ + "option", + "weight" + ], + "properties": { + "option": { + "$ref": "#/definitions/VoteOption" + }, + "weight": { + "$ref": "#/definitions/Decimal" + } + } } } }, @@ -1072,6 +1200,52 @@ } }, "additionalProperties": false + }, + { + "description": "This calls into the native bank module for querying metadata for a specific bank token. Return value is DenomMetadataResponse", + "type": "object", + "required": [ + "denom_metadata" + ], + "properties": { + "denom_metadata": { + "type": "object", + "required": [ + "denom" + ], + "properties": { + "denom": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "This calls into the native bank module for querying metadata for all bank tokens that have a metadata entry. Return value is AllDenomMetadataResponse", + "type": "object", + "required": [ + "all_denom_metadata" + ], + "properties": { + "all_denom_metadata": { + "type": "object", + "properties": { + "pagination": { + "anyOf": [ + { + "$ref": "#/definitions/PageRequest" + }, + { + "type": "null" + } + ] + } + } + } + }, + "additionalProperties": false } ] }, @@ -1079,6 +1253,98 @@ "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", "type": "string" }, + "DistributionQuery": { + "oneOf": [ + { + "description": "See ", + "type": "object", + "required": [ + "delegator_withdraw_address" + ], + "properties": { + "delegator_withdraw_address": { + "type": "object", + "required": [ + "delegator_address" + ], + "properties": { + "delegator_address": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "See ", + "type": "object", + "required": [ + "delegation_rewards" + ], + "properties": { + "delegation_rewards": { + "type": "object", + "required": [ + "delegator_address", + "validator_address" + ], + "properties": { + "delegator_address": { + "type": "string" + }, + "validator_address": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "See ", + "type": "object", + "required": [ + "delegation_total_rewards" + ], + "properties": { + "delegation_total_rewards": { + "type": "object", + "required": [ + "delegator_address" + ], + "properties": { + "delegator_address": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "See ", + "type": "object", + "required": [ + "delegator_validators" + ], + "properties": { + "delegator_validators": { + "type": "object", + "required": [ + "delegator_address" + ], + "properties": { + "delegator_address": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] + }, "IbcQuery": { "description": "These are queries to the various IBC modules to see the state of the contract's IBC connection. These will return errors if the contract is not \"ibc enabled\"", "oneOf": [ @@ -1145,6 +1411,34 @@ } ] }, + "PageRequest": { + "description": "Simplified version of the PageRequest type for pagination from the cosmos-sdk", + "type": "object", + "required": [ + "limit", + "reverse" + ], + "properties": { + "key": { + "anyOf": [ + { + "$ref": "#/definitions/Binary" + }, + { + "type": "null" + } + ] + }, + "limit": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "reverse": { + "type": "boolean" + } + } + }, "QueryRequest_for_SpecialQuery": { "oneOf": [ { @@ -1183,6 +1477,18 @@ }, "additionalProperties": false }, + { + "type": "object", + "required": [ + "distribution" + ], + "properties": { + "distribution": { + "$ref": "#/definitions/DistributionQuery" + } + }, + "additionalProperties": false + }, { "description": "A Stargate query is encoded the same way as abci_query, with path and protobuf encoded request data. The format is defined in [ADR-21](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-021-protobuf-query-encoding.md). The response is protobuf encoded data directly without a JSON response wrapper. The caller is responsible for compiling the proper protobuf definitions for both requests and responses.", "type": "object", @@ -1459,6 +1765,29 @@ } }, "additionalProperties": false + }, + { + "description": "Returns a [`CodeInfoResponse`] with metadata of the code", + "type": "object", + "required": [ + "code_info" + ], + "properties": { + "code_info": { + "type": "object", + "required": [ + "code_id" + ], + "properties": { + "code_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false } ] } From 2ab4f01bf1bf686f016e8bb5eed0564f78f9de45 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 1 Sep 2023 13:11:04 +0200 Subject: [PATCH 0688/2372] Add migrating docs for 1.4 --- MIGRATING.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/MIGRATING.md b/MIGRATING.md index ac9d8dd347..d06877b406 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -4,6 +4,33 @@ This guide explains what is needed to upgrade contracts when migrating over major releases of `cosmwasm`. Note that you can also view the [complete CHANGELOG](./CHANGELOG.md) to understand the differences. +## 1.3.x -> 1.4.0 + +- Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): + + ``` + [dependencies] + cosmwasm-std = "1.4.0" + cosmwasm-storage = "1.4.0" + # ... + + [dev-dependencies] + cosmwasm-schema = "1.4.0" + cosmwasm-vm = "1.4.0" + # ... + ``` + +- If you want to use a feature that is only available on CosmWasm 1.4+ chains, + use this feature: + + ```diff + -cosmwasm-std = { version = "1.4.0", features = ["stargate"] } + +cosmwasm-std = { version = "1.4.0", features = ["stargate", "cosmwasm_1_4"] } + ``` + + Please note that `cosmwasm_1_2` implies `cosmwasm_1_1`, and `cosmwasm_1_3` + implies `cosmwasm_1_2`, and so on, so there is no need to set multiple. + ## 1.2.x -> 1.3.0 - Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): From 76aa8d814c22cfc19844e108cce341be1c923949 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 4 Sep 2023 09:12:49 +0200 Subject: [PATCH 0689/2372] Set version: 1.4.0 --- Cargo.lock | 16 ++++++++-------- contracts/burner/Cargo.lock | 12 ++++++------ contracts/crypto-verify/Cargo.lock | 12 ++++++------ contracts/cyberpunk/Cargo.lock | 12 ++++++------ contracts/floaty/Cargo.lock | 12 ++++++------ contracts/hackatom/Cargo.lock | 12 ++++++------ contracts/ibc-reflect-send/Cargo.lock | 12 ++++++------ contracts/ibc-reflect/Cargo.lock | 12 ++++++------ contracts/queue/Cargo.lock | 12 ++++++------ contracts/reflect/Cargo.lock | 12 ++++++------ contracts/staking/Cargo.lock | 12 ++++++------ contracts/virus/Cargo.lock | 12 ++++++------ packages/check/Cargo.toml | 6 +++--- packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/go-gen/Cargo.toml | 4 ++-- packages/schema-derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 6 +++--- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 21 files changed, 93 insertions(+), 93 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6247d9211f..7468e3988c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -427,7 +427,7 @@ dependencies = [ [[package]] name = "cosmwasm-check" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "anyhow", "assert_cmd", @@ -440,7 +440,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "criterion", "digest 0.10.6", @@ -458,7 +458,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "cosmwasm-std", "syn 1.0.109", @@ -466,7 +466,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "anyhow", "cosmwasm-schema-derive", @@ -481,7 +481,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "proc-macro2", "quote", @@ -490,7 +490,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "base64", "bnum", @@ -513,7 +513,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "cosmwasm-std", "serde", @@ -521,7 +521,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index c6a75dd82c..07242e93c8 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -193,7 +193,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -204,14 +204,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -222,7 +222,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "proc-macro2", "quote", @@ -231,7 +231,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "base64", "bnum", @@ -249,7 +249,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 107d48bf27..57f3c4eb5b 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 28b5b37982..402cce654b 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -217,7 +217,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -228,14 +228,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -246,7 +246,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "proc-macro2", "quote", @@ -255,7 +255,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "base64 0.21.2", "bnum", @@ -273,7 +273,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 4bd69542be..f0469fa3c6 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 6301975378..a3523bb6c8 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index aa6edd652f..f41393259d 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 8883eb426c..553ee55464 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 8b018e2926..a4c45020ee 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index abf6ee617a..42c8d1a249 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 125a5918cd..798cd9cfa1 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 5555eb9db5..bb24cd92a7 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0-rc.1" +version = "1.4.0" dependencies = [ "bitflags", "bytecheck", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index 3d5435bc67..eb12f16401 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-check" -version = "1.4.0-rc.1" +version = "1.4.0" authors = ["Mauro Lacy "] edition = "2021" description = "A CLI tool for verifying CosmWasm smart contracts" @@ -11,8 +11,8 @@ license = "Apache-2.0" anyhow = "1.0.57" clap = "4" colored = "2" -cosmwasm-vm = { path = "../vm", version = "1.4.0-rc.1" } -cosmwasm-std = { path = "../std", version = "1.4.0-rc.1" } +cosmwasm-vm = { path = "../vm", version = "1.4.0" } +cosmwasm-std = { path = "../std", version = "1.4.0" } [dev-dependencies] assert_cmd = "=2.0.10" # 2.0.11+ requires Rust 1.65.0 which we currently don't want to make the minimum if possible diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index dddbefe920..8bbb5c4e42 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "1.4.0-rc.1" +version = "1.4.0" authors = ["Mauro Lacy "] edition = "2021" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index 3a3adbd84a..cc426c01a8 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "1.4.0-rc.1" +version = "1.4.0" authors = ["Simon Warta "] edition = "2021" description = "A package for auto-generated code used for CosmWasm contract development. This is shipped as part of cosmwasm-std. Do not use directly." diff --git a/packages/go-gen/Cargo.toml b/packages/go-gen/Cargo.toml index 8309d7d4a1..99693a0c37 100644 --- a/packages/go-gen/Cargo.toml +++ b/packages/go-gen/Cargo.toml @@ -9,8 +9,8 @@ publish = false [dependencies] schemars = "0.8.3" -cosmwasm-std = { path = "../std", version = "1.4.0-rc.1", features = ["cosmwasm_1_4", "staking", "stargate", "ibc3"] } -cosmwasm-schema = { path = "../schema", version = "1.4.0-rc.1" } +cosmwasm-std = { path = "../std", version = "1.4.0", features = ["cosmwasm_1_4", "staking", "stargate", "ibc3"] } +cosmwasm-schema = { path = "../schema", version = "1.4.0" } anyhow = "1" Inflector = "0.11.4" indenter = "0.3.3" diff --git a/packages/schema-derive/Cargo.toml b/packages/schema-derive/Cargo.toml index 77a17c51c5..ba106b1a9c 100644 --- a/packages/schema-derive/Cargo.toml +++ b/packages/schema-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema-derive" -version = "1.4.0-rc.1" +version = "1.4.0" authors = ["Tomasz Kurcz "] edition = "2021" description = "Derive macros for cosmwasm-schema" diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index cfa7b5485f..b473ee6a99 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "1.4.0-rc.1" +version = "1.4.0" authors = ["Simon Warta ", "Ethan Frey "] edition = "2021" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." @@ -8,7 +8,7 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/schema" license = "Apache-2.0" [dependencies] -cosmwasm-schema-derive = { version = "=1.4.0-rc.1", path = "../schema-derive" } +cosmwasm-schema-derive = { version = "=1.4.0", path = "../schema-derive" } schemars = "0.8.3" serde = "1.0" serde_json = "1.0.40" @@ -16,6 +16,6 @@ thiserror = "1.0.26" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = { version = "1.4.0-rc.1", path = "../std" } +cosmwasm-std = { version = "1.4.0", path = "../std" } semver = "1" tempfile = "3" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 51d474b6e0..13b12083f3 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "1.4.0-rc.1" +version = "1.4.0" authors = ["Ethan Frey "] edition = "2021" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -51,7 +51,7 @@ cosmwasm_1_4 = ["cosmwasm_1_3"] [dependencies] base64 = "0.21.0" -cosmwasm-derive = { path = "../derive", version = "1.4.0-rc.1" } +cosmwasm-derive = { path = "../derive", version = "1.4.0" } derivative = "2" forward_ref = "1" hex = "0.4" @@ -63,7 +63,7 @@ thiserror = "1.0.26" bnum = "0.8.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "1.4.0-rc.1" } +cosmwasm-crypto = { path = "../crypto", version = "1.4.0" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 709de7eb63..c32c37a0e5 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "1.4.0-rc.1" +version = "1.4.0" authors = ["Ethan Frey "] edition = "2021" description = "CosmWasm library with useful helpers for Storage patterns" @@ -16,5 +16,5 @@ iterator = ["cosmwasm-std/iterator"] [dependencies] # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.4.0-rc.1", default-features = false } +cosmwasm-std = { path = "../std", version = "1.4.0", default-features = false } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 32b7271216..51a1bfd459 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "1.4.0-rc.1" +version = "1.4.0" authors = ["Ethan Frey "] edition = "2021" description = "VM bindings to run cosmwams contracts" @@ -39,8 +39,8 @@ bytes = "1.4.0" # need a higher version than the one required by Wasmer for the clru = "0.4.0" crc32fast = "1.3.2" # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.4.0-rc.1", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "1.4.0-rc.1" } +cosmwasm-std = { path = "../std", version = "1.4.0", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "1.4.0" } derivative = "2" hex = "0.4" schemars = "0.8.3" From f11b456d46073d0324d9e39ed617f7fcfdbe1b06 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 4 Sep 2023 09:21:28 +0200 Subject: [PATCH 0690/2372] Update changelog --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f09e3ccc17..e4123a67dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ and this project adheres to ## [Unreleased] -## [1.4.0-rc.1] - 2023-08-30 +## [1.4.0] - 2023-09-04 ### Added @@ -1857,8 +1857,8 @@ Some main points: All future Changelog entries will reference this base -[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.4.0-rc.1...HEAD -[1.4.0-rc.1]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.3...v1.4.0-rc.1 +[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.4.0...HEAD +[1.4.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.3...v1.4.0 [1.3.3]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.2...v1.3.3 [1.3.2]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.1...v1.3.2 [1.3.1]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.0...v1.3.1 From eda6f866be839a47418a9ed995fdc2d10bfbd1dd Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 1 Sep 2023 15:22:17 +0200 Subject: [PATCH 0691/2372] Add abs function for all signed ints --- packages/std/src/math/int128.rs | 5 +++++ packages/std/src/math/int256.rs | 5 +++++ packages/std/src/math/int512.rs | 5 +++++ packages/std/src/math/int64.rs | 5 +++++ 4 files changed, 20 insertions(+) diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index cc0b7c83b5..603c4fbd75 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -209,6 +209,11 @@ impl Int128 { pub const fn abs_diff(self, other: Self) -> Uint128 { Uint128(self.0.abs_diff(other.0)) } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub const fn abs(self) -> Self { + Self(self.0.abs()) + } } impl From for Int128 { diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index 5616fcc2e7..30cf982ff5 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -258,6 +258,11 @@ impl Int256 { pub const fn abs_diff(self, other: Self) -> Uint256 { Uint256(self.0.abs_diff(other.0)) } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub const fn abs(self) -> Self { + Self(self.0.abs()) + } } impl From for Int256 { diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index 2b122418e5..f1c9a2ce72 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -294,6 +294,11 @@ impl Int512 { pub const fn abs_diff(self, other: Self) -> Uint512 { Uint512(self.0.abs_diff(other.0)) } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub const fn abs(self) -> Self { + Self(self.0.abs()) + } } impl From for Int512 { diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index 2e9ac7f68d..42c54e72d4 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -209,6 +209,11 @@ impl Int64 { pub const fn abs_diff(self, other: Self) -> Uint64 { Uint64(self.0.abs_diff(other.0)) } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub const fn abs(self) -> Self { + Self(self.0.abs()) + } } impl From for Int64 { From b232b5a514bf940f982eeca20df5cd05c0a57517 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 1 Sep 2023 15:35:49 +0200 Subject: [PATCH 0692/2372] Add changelog entry --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4123a67dd..27a9e9302a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ and this project adheres to ## [Unreleased] +### Added + +- cosmwasm-std: Add `abs` for `Int{64,128,256,512}` ([#1854]). + +[#1854]: https://github.com/CosmWasm/cosmwasm/pull/1854 + ## [1.4.0] - 2023-09-04 ### Added From 034ade9dcea3464465d25e0a5c8056a7468b77d1 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 4 Sep 2023 09:55:12 +0200 Subject: [PATCH 0693/2372] Add tests --- packages/std/src/math/int128.rs | 16 ++++++++++++++++ packages/std/src/math/int256.rs | 16 ++++++++++++++++ packages/std/src/math/int512.rs | 16 ++++++++++++++++ packages/std/src/math/int64.rs | 16 ++++++++++++++++ 4 files changed, 64 insertions(+) diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index 603c4fbd75..e94db80043 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -1093,6 +1093,22 @@ mod tests { assert_eq!(c.abs_diff(b), Uint128::from(10u32)); } + #[test] + fn int128_abs_works() { + let a = Int128::from(42i32); + assert_eq!(a.abs(), a); + + let b = Int128::from(-42i32); + assert_eq!(b.abs(), a); + assert_eq!((Int128::MIN + Int128::one()).abs(), Int128::MAX); + } + + #[test] + #[should_panic = "attempt to negate with overflow"] + fn int128_abs_min_panics() { + _ = Int128::MIN.abs(); + } + #[test] #[should_panic = "attempt to negate with overflow"] fn int128_neg_min_panics() { diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index 30cf982ff5..312215930b 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -1176,6 +1176,22 @@ mod tests { assert_eq!(c.abs_diff(b), Uint256::from(10u32)); } + #[test] + fn int256_abs_works() { + let a = Int256::from(42i32); + assert_eq!(a.abs(), a); + + let b = Int256::from(-42i32); + assert_eq!(b.abs(), a); + assert_eq!((Int256::MIN + Int256::one()).abs(), Int256::MAX); + } + + #[test] + #[should_panic = "attempt to negate with overflow"] + fn int256_abs_min_panics() { + _ = Int256::MIN.abs(); + } + #[test] #[should_panic = "attempt to negate with overflow"] fn int256_neg_min_panics() { diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index f1c9a2ce72..a7759f8fe6 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -1229,6 +1229,22 @@ mod tests { assert_eq!(c.abs_diff(b), Uint512::from(10u32)); } + #[test] + fn int512_abs_works() { + let a = Int512::from(42i32); + assert_eq!(a.abs(), a); + + let b = Int512::from(-42i32); + assert_eq!(b.abs(), a); + assert_eq!((Int512::MIN + Int512::one()).abs(), Int512::MAX); + } + + #[test] + #[should_panic = "attempt to negate with overflow"] + fn int512_abs_min_panics() { + _ = Int512::MIN.abs(); + } + #[test] #[should_panic = "attempt to negate with overflow"] fn int512_neg_min_panics() { diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index 42c54e72d4..f87f719e07 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -1036,6 +1036,22 @@ mod tests { assert_eq!(c.abs_diff(b), Uint64::from(10u32)); } + #[test] + fn int64_abs_works() { + let a = Int64::from(42i32); + assert_eq!(a.abs(), a); + + let b = Int64::from(-42i32); + assert_eq!(b.abs(), a); + assert_eq!((Int64::MIN + Int64::one()).abs(), Int64::MAX); + } + + #[test] + #[should_panic = "attempt to negate with overflow"] + fn int64_abs_min_panics() { + _ = Int64::MIN.abs(); + } + #[test] #[should_panic = "attempt to negate with overflow"] fn int64_neg_min_panics() { From b57b8ced1d304dc3d8ac5a306890c1ed2ee602d7 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 4 Sep 2023 10:09:53 +0200 Subject: [PATCH 0694/2372] Add zero abs test --- packages/std/src/math/int128.rs | 2 ++ packages/std/src/math/int256.rs | 2 ++ packages/std/src/math/int512.rs | 2 ++ packages/std/src/math/int64.rs | 2 ++ 4 files changed, 8 insertions(+) diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index e94db80043..347924de06 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -1100,6 +1100,8 @@ mod tests { let b = Int128::from(-42i32); assert_eq!(b.abs(), a); + + assert_eq!(Int128::zero().abs(), Int128::zero()); assert_eq!((Int128::MIN + Int128::one()).abs(), Int128::MAX); } diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index 312215930b..c8ee50b442 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -1183,6 +1183,8 @@ mod tests { let b = Int256::from(-42i32); assert_eq!(b.abs(), a); + + assert_eq!(Int256::zero().abs(), Int256::zero()); assert_eq!((Int256::MIN + Int256::one()).abs(), Int256::MAX); } diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index a7759f8fe6..f9accee297 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -1236,6 +1236,8 @@ mod tests { let b = Int512::from(-42i32); assert_eq!(b.abs(), a); + + assert_eq!(Int512::zero().abs(), Int512::zero()); assert_eq!((Int512::MIN + Int512::one()).abs(), Int512::MAX); } diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index f87f719e07..12151eda2d 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -1043,6 +1043,8 @@ mod tests { let b = Int64::from(-42i32); assert_eq!(b.abs(), a); + + assert_eq!(Int64::zero().abs(), Int64::zero()); assert_eq!((Int64::MIN + Int64::one()).abs(), Int64::MAX); } From 6bab85f39f409d99eeb53c55b27df02a4c5d1487 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 4 Sep 2023 10:55:02 +0200 Subject: [PATCH 0695/2372] Add unsigned_abs for Int{64,128,256,512} --- CHANGELOG.md | 3 ++- packages/std/src/math/int128.rs | 18 ++++++++++++++++++ packages/std/src/math/int256.rs | 18 ++++++++++++++++++ packages/std/src/math/int512.rs | 18 ++++++++++++++++++ packages/std/src/math/int64.rs | 18 ++++++++++++++++++ 5 files changed, 74 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 27a9e9302a..e15bac5a8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,8 @@ and this project adheres to ### Added -- cosmwasm-std: Add `abs` for `Int{64,128,256,512}` ([#1854]). +- cosmwasm-std: Add `abs` and `unsigned_abs` for `Int{64,128,256,512}` + ([#1854]). [#1854]: https://github.com/CosmWasm/cosmwasm/pull/1854 diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index 347924de06..1eb62c3f10 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -214,6 +214,11 @@ impl Int128 { pub const fn abs(self) -> Self { Self(self.0.abs()) } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub const fn unsigned_abs(self) -> Uint128 { + Uint128(self.0.unsigned_abs()) + } } impl From for Int128 { @@ -1105,6 +1110,19 @@ mod tests { assert_eq!((Int128::MIN + Int128::one()).abs(), Int128::MAX); } + #[test] + fn int128_unsigned_abs_works() { + assert_eq!(Int128::zero().unsigned_abs(), Uint128::zero()); + assert_eq!(Int128::one().unsigned_abs(), Uint128::one()); + assert_eq!( + Int128::MIN.unsigned_abs(), + Uint128::new(Int128::MAX.0 as u128) + Uint128::one() + ); + + let v = Int128::from(-42i32); + assert_eq!(v.unsigned_abs(), v.abs_diff(Int128::zero())); + } + #[test] #[should_panic = "attempt to negate with overflow"] fn int128_abs_min_panics() { diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index c8ee50b442..78f9a15af5 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -263,6 +263,11 @@ impl Int256 { pub const fn abs(self) -> Self { Self(self.0.abs()) } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub const fn unsigned_abs(self) -> Uint256 { + Uint256(self.0.unsigned_abs()) + } } impl From for Int256 { @@ -1188,6 +1193,19 @@ mod tests { assert_eq!((Int256::MIN + Int256::one()).abs(), Int256::MAX); } + #[test] + fn int256_unsigned_abs_works() { + assert_eq!(Int256::zero().unsigned_abs(), Uint256::zero()); + assert_eq!(Int256::one().unsigned_abs(), Uint256::one()); + assert_eq!( + Int256::MIN.unsigned_abs(), + Uint256::from_be_bytes(Int256::MAX.to_be_bytes()) + Uint256::one() + ); + + let v = Int256::from(-42i32); + assert_eq!(v.unsigned_abs(), v.abs_diff(Int256::zero())); + } + #[test] #[should_panic = "attempt to negate with overflow"] fn int256_abs_min_panics() { diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index f9accee297..6004a6f134 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -299,6 +299,11 @@ impl Int512 { pub const fn abs(self) -> Self { Self(self.0.abs()) } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub const fn unsigned_abs(self) -> Uint512 { + Uint512(self.0.unsigned_abs()) + } } impl From for Int512 { @@ -1241,6 +1246,19 @@ mod tests { assert_eq!((Int512::MIN + Int512::one()).abs(), Int512::MAX); } + #[test] + fn int512_unsigned_abs_works() { + assert_eq!(Int512::zero().unsigned_abs(), Uint512::zero()); + assert_eq!(Int512::one().unsigned_abs(), Uint512::one()); + assert_eq!( + Int512::MIN.unsigned_abs(), + Uint512::from_be_bytes(Int512::MAX.to_be_bytes()) + Uint512::one() + ); + + let v = Int512::from(-42i32); + assert_eq!(v.unsigned_abs(), v.abs_diff(Int512::zero())); + } + #[test] #[should_panic = "attempt to negate with overflow"] fn int512_abs_min_panics() { diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index 12151eda2d..da4bc4f160 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -214,6 +214,11 @@ impl Int64 { pub const fn abs(self) -> Self { Self(self.0.abs()) } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub const fn unsigned_abs(self) -> Uint64 { + Uint64(self.0.unsigned_abs()) + } } impl From for Int64 { @@ -1048,6 +1053,19 @@ mod tests { assert_eq!((Int64::MIN + Int64::one()).abs(), Int64::MAX); } + #[test] + fn int64_unsigned_abs_works() { + assert_eq!(Int64::zero().unsigned_abs(), Uint64::zero()); + assert_eq!(Int64::one().unsigned_abs(), Uint64::one()); + assert_eq!( + Int64::MIN.unsigned_abs(), + Uint64::new(Int64::MAX.0 as u64) + Uint64::one() + ); + + let v = Int64::from(-42i32); + assert_eq!(v.unsigned_abs(), v.abs_diff(Int64::zero())); + } + #[test] #[should_panic = "attempt to negate with overflow"] fn int64_abs_min_panics() { From 706b4cd0726caa5dd15fb23af581c4525b9842b4 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 4 Sep 2023 15:35:14 +0200 Subject: [PATCH 0696/2372] Update clru to 0.6.1 --- Cargo.lock | 4 ++-- contracts/burner/Cargo.lock | 4 ++-- contracts/crypto-verify/Cargo.lock | 4 ++-- contracts/cyberpunk/Cargo.lock | 4 ++-- contracts/floaty/Cargo.lock | 4 ++-- contracts/hackatom/Cargo.lock | 4 ++-- contracts/ibc-reflect-send/Cargo.lock | 4 ++-- contracts/ibc-reflect/Cargo.lock | 4 ++-- contracts/queue/Cargo.lock | 4 ++-- contracts/reflect/Cargo.lock | 4 ++-- contracts/staking/Cargo.lock | 4 ++-- contracts/virus/Cargo.lock | 4 ++-- packages/vm/Cargo.toml | 2 +- 13 files changed, 25 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7468e3988c..63e8441e71 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -385,9 +385,9 @@ checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" [[package]] name = "clru" -version = "0.4.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" +checksum = "b8191fa7302e03607ff0e237d4246cc043ff5b3cb9409d995172ba3bea16b807" [[package]] name = "colorchoice" diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 07242e93c8..fd095ac5a3 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -168,9 +168,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clru" -version = "0.4.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" +checksum = "b8191fa7302e03607ff0e237d4246cc043ff5b3cb9409d995172ba3bea16b807" [[package]] name = "const-oid" diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 57f3c4eb5b..953bf83a64 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -157,9 +157,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clru" -version = "0.4.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" +checksum = "b8191fa7302e03607ff0e237d4246cc043ff5b3cb9409d995172ba3bea16b807" [[package]] name = "const-oid" diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 402cce654b..4d37fda836 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -186,9 +186,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clru" -version = "0.4.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" +checksum = "b8191fa7302e03607ff0e237d4246cc043ff5b3cb9409d995172ba3bea16b807" [[package]] name = "const-oid" diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index f0469fa3c6..d3e15072a0 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -157,9 +157,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clru" -version = "0.4.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" +checksum = "b8191fa7302e03607ff0e237d4246cc043ff5b3cb9409d995172ba3bea16b807" [[package]] name = "const-oid" diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index a3523bb6c8..1a9c1f9dff 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -157,9 +157,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clru" -version = "0.4.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" +checksum = "b8191fa7302e03607ff0e237d4246cc043ff5b3cb9409d995172ba3bea16b807" [[package]] name = "const-oid" diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index f41393259d..47e48de0e0 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -157,9 +157,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clru" -version = "0.4.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" +checksum = "b8191fa7302e03607ff0e237d4246cc043ff5b3cb9409d995172ba3bea16b807" [[package]] name = "const-oid" diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 553ee55464..1408955925 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -157,9 +157,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clru" -version = "0.4.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" +checksum = "b8191fa7302e03607ff0e237d4246cc043ff5b3cb9409d995172ba3bea16b807" [[package]] name = "const-oid" diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index a4c45020ee..73f7809bc4 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -157,9 +157,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clru" -version = "0.4.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" +checksum = "b8191fa7302e03607ff0e237d4246cc043ff5b3cb9409d995172ba3bea16b807" [[package]] name = "const-oid" diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 42c8d1a249..cd1189d134 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -157,9 +157,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clru" -version = "0.4.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" +checksum = "b8191fa7302e03607ff0e237d4246cc043ff5b3cb9409d995172ba3bea16b807" [[package]] name = "const-oid" diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 798cd9cfa1..884ee8dbae 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -157,9 +157,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clru" -version = "0.4.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" +checksum = "b8191fa7302e03607ff0e237d4246cc043ff5b3cb9409d995172ba3bea16b807" [[package]] name = "const-oid" diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index bb24cd92a7..767054387a 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -157,9 +157,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clru" -version = "0.4.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" +checksum = "b8191fa7302e03607ff0e237d4246cc043ff5b3cb9409d995172ba3bea16b807" [[package]] name = "const-oid" diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 51a1bfd459..b38c772715 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -36,7 +36,7 @@ bench = false [dependencies] bytes = "1.4.0" # need a higher version than the one required by Wasmer for the Bytes -> Vec implementation -clru = "0.4.0" +clru = "0.6.1" crc32fast = "1.3.2" # Uses the path when built locally; uses the given version from crates.io when published cosmwasm-std = { path = "../std", version = "1.4.0", default-features = false } From 1335f780f0acc381ca21214deffbc36273bfa281 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 5 Sep 2023 00:15:13 +0200 Subject: [PATCH 0697/2372] Upgrade assert_cmd --- Cargo.lock | 20 +++++++------------- packages/check/Cargo.toml | 2 +- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 63e8441e71..d23defb584 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -59,7 +59,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" dependencies = [ - "anstyle 1.0.0", + "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", @@ -68,12 +68,6 @@ dependencies = [ "utf8parse", ] -[[package]] -name = "anstyle" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23ea9e81bd02e310c216d080f6223c179012256e5151c41db88d12c88a1684d2" - [[package]] name = "anstyle" version = "1.0.0" @@ -104,7 +98,7 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" dependencies = [ - "anstyle 1.0.0", + "anstyle", "windows-sys 0.48.0", ] @@ -122,11 +116,11 @@ checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" [[package]] name = "assert_cmd" -version = "2.0.10" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0b2340f55d9661d76793b2bfc2eb0e62689bd79d067a95707ea762afd5e9dd" +checksum = "88903cb14723e4d4003335bb7f8a14f27691649105346a0f0957466c096adfe6" dependencies = [ - "anstyle 0.3.5", + "anstyle", "bstr", "doc-comment", "predicates", @@ -362,7 +356,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f423e341edefb78c9caba2d9c7f7687d0e72e89df3ce3394554754393ac3990" dependencies = [ "anstream", - "anstyle 1.0.0", + "anstyle", "bitflags", "clap_lex 0.5.0", "strsim", @@ -1555,7 +1549,7 @@ version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09963355b9f467184c04017ced4a2ba2d75cbcb4e7462690d388233253d4b1a9" dependencies = [ - "anstyle 1.0.0", + "anstyle", "difflib", "float-cmp", "itertools", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index eb12f16401..41f2255618 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -15,5 +15,5 @@ cosmwasm-vm = { path = "../vm", version = "1.4.0" } cosmwasm-std = { path = "../std", version = "1.4.0" } [dev-dependencies] -assert_cmd = "=2.0.10" # 2.0.11+ requires Rust 1.65.0 which we currently don't want to make the minimum if possible +assert_cmd = "2.0.12" predicates = "3" From b086d9f97dcb1dc9db0d29212b8d5ddac8c19fb0 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 5 Sep 2023 13:18:16 +0200 Subject: [PATCH 0698/2372] Implement missing From conversions for Int512 --- packages/std/src/math/conversion.rs | 22 ++++++++++++ packages/std/src/math/int512.rs | 56 ++++++++++++++++++++++++++++- packages/std/src/math/mod.rs | 1 + 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 packages/std/src/math/conversion.rs diff --git a/packages/std/src/math/conversion.rs b/packages/std/src/math/conversion.rs new file mode 100644 index 0000000000..3d3b8280f4 --- /dev/null +++ b/packages/std/src/math/conversion.rs @@ -0,0 +1,22 @@ +/// Grows a big endian signed integer to a bigger size. +pub const fn grow_be_int( + input: [u8; INPUT_SIZE], +) -> [u8; OUTPUT_SIZE] { + debug_assert!(INPUT_SIZE <= OUTPUT_SIZE); + // check if sign bit is set + let mut output = if input[0] & 0b10000000 != 0 { + // negative number is filled up with 1s + [0b11111111u8; OUTPUT_SIZE] + } else { + [0u8; OUTPUT_SIZE] + }; + let mut i = 0; + + // copy input to the end of output + // copy_from_slice is not const, so we have to do this manually + while i < INPUT_SIZE { + output[OUTPUT_SIZE - INPUT_SIZE + i] = input[i]; + i += 1; + } + output +} diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index 6004a6f134..b09fb0c725 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -9,12 +9,14 @@ use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; -use crate::{forward_ref_partial_eq, Uint128, Uint256, Uint512, Uint64}; +use crate::{forward_ref_partial_eq, Int128, Int256, Int64, Uint128, Uint256, Uint512, Uint64}; /// Used internally - we don't want to leak this type since we might change /// the implementation in the future. use bnum::types::{I512, U512}; +use super::conversion::grow_be_int; + /// An implementation of i512 that is using strings for JSON encoding/decoding, /// such that the full i512 range can be used for clients that convert JSON numbers to floats, /// like JavaScript and jq. @@ -387,6 +389,24 @@ impl From for Int512 { } } +impl From for Int512 { + fn from(val: Int64) -> Self { + Int512(val.i64().into()) + } +} + +impl From for Int512 { + fn from(val: Int128) -> Self { + Int512(val.i128().into()) + } +} + +impl From for Int512 { + fn from(val: Int256) -> Self { + Self::from_be_bytes(grow_be_int(val.to_be_bytes())) + } +} + impl TryFrom<&str> for Int512 { type Error = StdError; @@ -710,6 +730,40 @@ mod tests { let a = Int512::from(-5i8); assert_eq!(a.0, I512::from(-5i32)); + // other big signed integers + let values = [ + Int64::MAX, + Int64::MIN, + Int64::one(), + -Int64::one(), + Int64::zero(), + ]; + for v in values { + assert_eq!(Int512::from(v).to_string(), v.to_string()); + } + + let values = [ + Int128::MAX, + Int128::MIN, + Int128::one(), + -Int128::one(), + Int128::zero(), + ]; + for v in values { + assert_eq!(Int512::from(v).to_string(), v.to_string()); + } + + let values = [ + Int256::MAX, + Int256::MIN, + Int256::one(), + -Int256::one(), + Int256::zero(), + ]; + for v in values { + assert_eq!(Int512::from(v).to_string(), v.to_string()); + } + let result = Int512::try_from("34567"); assert_eq!( result.unwrap().0, diff --git a/packages/std/src/math/mod.rs b/packages/std/src/math/mod.rs index a6cf8af3cb..9b27fd859a 100644 --- a/packages/std/src/math/mod.rs +++ b/packages/std/src/math/mod.rs @@ -1,3 +1,4 @@ +mod conversion; mod decimal; mod decimal256; mod fraction; From 9e5123dc05b8376e3b25225c06ff46d26b5b8567 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 5 Sep 2023 13:19:49 +0200 Subject: [PATCH 0699/2372] Implement const fn to convert i128 to Int256 --- packages/std/src/math/int256.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index 78f9a15af5..3b01cfe549 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -15,6 +15,8 @@ use crate::{forward_ref_partial_eq, Int128, Int64, Uint128, Uint256, Uint64}; /// the implementation in the future. use bnum::types::{I256, U256}; +use super::conversion::grow_be_int; + /// An implementation of i256 that is using strings for JSON encoding/decoding, /// such that the full i256 range can be used for clients that convert JSON numbers to floats, /// like JavaScript and jq. @@ -63,6 +65,12 @@ impl Int256 { Self(I256::ONE) } + /// A conversion from `i128` that, unlike the one provided by the `From` trait, + /// can be used in a `const` context. + pub const fn from_i128(v: i128) -> Self { + Self::from_be_bytes(grow_be_int(v.to_be_bytes())) + } + #[must_use] pub const fn from_be_bytes(data: [u8; 32]) -> Self { let words: [u64; 4] = [ @@ -681,6 +689,25 @@ mod tests { assert!(result.is_err()); } + #[test] + fn int256_from_i128() { + assert_eq!(Int256::from_i128(123i128), Int256::from_str("123").unwrap()); + + assert_eq!( + Int256::from_i128(9785746283745i128), + Int256::from_str("9785746283745").unwrap() + ); + + assert_eq!( + Int256::from_i128(i128::MAX).to_string(), + i128::MAX.to_string() + ); + assert_eq!( + Int256::from_i128(i128::MIN).to_string(), + i128::MIN.to_string() + ); + } + #[test] fn int256_implements_display() { let a = Int256::from(12345u32); From b99bd923d28170dde55c187cde2f52a7d6fa310b Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 5 Sep 2023 13:51:20 +0200 Subject: [PATCH 0700/2372] Add test for grow_be_int --- packages/std/src/math/conversion.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/packages/std/src/math/conversion.rs b/packages/std/src/math/conversion.rs index 3d3b8280f4..135bed4241 100644 --- a/packages/std/src/math/conversion.rs +++ b/packages/std/src/math/conversion.rs @@ -20,3 +20,25 @@ pub const fn grow_be_int( } output } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn grow_be_int_works() { + // test against rust std's integers + let i32s = [i32::MIN, -1, 0, 1, 42, i32::MAX]; + for i in i32s { + assert_eq!(grow_be_int(i.to_be_bytes()), (i as i64).to_be_bytes()); + assert_eq!(grow_be_int(i.to_be_bytes()), (i as i128).to_be_bytes()); + } + let i8s = [i8::MIN, -1, 0, 1, 42, i8::MAX]; + for i in i8s { + assert_eq!(grow_be_int(i.to_be_bytes()), (i as i16).to_be_bytes()); + assert_eq!(grow_be_int(i.to_be_bytes()), (i as i32).to_be_bytes()); + assert_eq!(grow_be_int(i.to_be_bytes()), (i as i64).to_be_bytes()); + assert_eq!(grow_be_int(i.to_be_bytes()), (i as i128).to_be_bytes()); + } + } +} From 60efcea5560c7cbd5d2574e4a253a2a4846d768e Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 5 Sep 2023 14:55:01 +0200 Subject: [PATCH 0701/2372] Add TryFrom impl to convert bigger to smaller ints --- packages/std/src/math/conversion.rs | 56 +++++++++++++++++++++++++++++ packages/std/src/math/int128.rs | 16 ++++++++- packages/std/src/math/int256.rs | 17 +++++++-- packages/std/src/math/int64.rs | 14 +++++++- 4 files changed, 99 insertions(+), 4 deletions(-) diff --git a/packages/std/src/math/conversion.rs b/packages/std/src/math/conversion.rs index 135bed4241..c9305ab1f4 100644 --- a/packages/std/src/math/conversion.rs +++ b/packages/std/src/math/conversion.rs @@ -21,6 +21,33 @@ pub const fn grow_be_int( output } +/// Shrinks a big endian signed integer to a smaller size. +pub fn shrink_be_int( + input: [u8; INPUT_SIZE], +) -> Option<[u8; OUTPUT_SIZE]> { + debug_assert!(INPUT_SIZE >= OUTPUT_SIZE); + + // A positive number should start with only 0s and a negative one with only 1s until + // the size we want to look at. + // If this is not the case, then the value is too large / small for the target type + let ignored_byte = if input[0] & 0b10000000 != 0 { + 0b11111111u8 + } else { + 0u8 + }; + // Rust doesn't allow us to create an array of size `OUTPUT_SIZE - INPUT_SIZE`, + // so we work around this by taking a slice of a bigger array + let ignore_bytes = [ignored_byte; INPUT_SIZE]; + if input[0..(INPUT_SIZE - OUTPUT_SIZE)] != ignore_bytes[0..(INPUT_SIZE - OUTPUT_SIZE)] { + return None; + } + + // Now, we can just copy the last bytes + let mut output = [0u8; OUTPUT_SIZE]; + output.copy_from_slice(&input[(INPUT_SIZE - OUTPUT_SIZE)..]); + Some(output) +} + #[cfg(test)] mod tests { use super::*; @@ -41,4 +68,33 @@ mod tests { assert_eq!(grow_be_int(i.to_be_bytes()), (i as i128).to_be_bytes()); } } + + #[test] + fn shrink_be_int_works() { + // test against rust std's integers + let i32s = [-42, -1, 0i32, 1, 42]; + for i in i32s { + assert_eq!( + shrink_be_int(i.to_be_bytes()), + Some((i as i16).to_be_bytes()) + ); + assert_eq!( + shrink_be_int(i.to_be_bytes()), + Some((i as i8).to_be_bytes()) + ); + } + // these should be too big to fit into an i16 or i8 + let oob = [ + i32::MIN, + i32::MIN + 10, + i32::MIN + 1234, + i32::MAX - 1234, + i32::MAX - 10, + i32::MAX, + ]; + for i in oob { + assert_eq!(shrink_be_int::<4, 2>(i.to_be_bytes()), None); + assert_eq!(shrink_be_int::<4, 1>(i.to_be_bytes()), None); + } + } } diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index 1eb62c3f10..5529fad94f 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -9,7 +9,11 @@ use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; -use crate::{forward_ref_partial_eq, Int64, Uint128, Uint64}; +use crate::{ + forward_ref_partial_eq, ConversionOverflowError, Int256, Int512, Int64, Uint128, Uint64, +}; + +use super::conversion::shrink_be_int; /// An implementation of i128 that is using strings for JSON encoding/decoding, /// such that the full i128 range can be used for clients that convert JSON numbers to floats, @@ -287,6 +291,16 @@ impl From for Int128 { } } +impl TryFrom for Int128 { + type Error = ConversionOverflowError; + + fn try_from(value: Int256) -> Result { + shrink_be_int(value.to_be_bytes()) + .ok_or_else(|| ConversionOverflowError::new("Int256", "Int128", value)) + .map(Self::from_be_bytes) + } +} + impl TryFrom<&str> for Int128 { type Error = StdError; diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index 3b01cfe549..b53680f723 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -9,13 +9,16 @@ use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; -use crate::{forward_ref_partial_eq, Int128, Int64, Uint128, Uint256, Uint64}; +use crate::{ + forward_ref_partial_eq, ConversionOverflowError, Int128, Int512, Int64, Uint128, Uint256, + Uint64, +}; /// Used internally - we don't want to leak this type since we might change /// the implementation in the future. use bnum::types::{I256, U256}; -use super::conversion::grow_be_int; +use super::conversion::{grow_be_int, shrink_be_int}; /// An implementation of i256 that is using strings for JSON encoding/decoding, /// such that the full i256 range can be used for clients that convert JSON numbers to floats, @@ -362,6 +365,16 @@ impl From for Int256 { } } +impl TryFrom for Int256 { + type Error = ConversionOverflowError; + + fn try_from(value: Int512) -> Result { + shrink_be_int(value.to_be_bytes()) + .ok_or_else(|| ConversionOverflowError::new("Int512", "Int256", value)) + .map(Self::from_be_bytes) + } +} + impl TryFrom<&str> for Int256 { type Error = StdError; diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index da4bc4f160..a44cca2b43 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -9,7 +9,9 @@ use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; -use crate::{forward_ref_partial_eq, Uint64}; +use crate::{forward_ref_partial_eq, ConversionOverflowError, Int128, Uint64}; + +use super::conversion::shrink_be_int; /// An implementation of i64 that is using strings for JSON encoding/decoding, /// such that the full i64 range can be used for clients that convert JSON numbers to floats, @@ -263,6 +265,16 @@ impl From for Int64 { } } +impl TryFrom for Int64 { + type Error = ConversionOverflowError; + + fn try_from(value: Int128) -> Result { + shrink_be_int(value.to_be_bytes()) + .ok_or_else(|| ConversionOverflowError::new("Int128", "Int64", value)) + .map(Self::from_be_bytes) + } +} + impl TryFrom<&str> for Int64 { type Error = StdError; From 5f7df5b17bee662b42a2f88145dc5e64c4fe333f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 5 Sep 2023 15:42:56 +0200 Subject: [PATCH 0702/2372] Fix clippy --- packages/std/src/math/int128.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index 5529fad94f..c21b66dd03 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -9,9 +9,7 @@ use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; -use crate::{ - forward_ref_partial_eq, ConversionOverflowError, Int256, Int512, Int64, Uint128, Uint64, -}; +use crate::{forward_ref_partial_eq, ConversionOverflowError, Int256, Int64, Uint128, Uint64}; use super::conversion::shrink_be_int; From 345d561e78ac1e927173f7c86207cf4939e0dceb Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 5 Sep 2023 16:23:43 +0200 Subject: [PATCH 0703/2372] Improve shrink_be_int readability --- packages/std/src/math/conversion.rs | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/packages/std/src/math/conversion.rs b/packages/std/src/math/conversion.rs index c9305ab1f4..d83fbca5e6 100644 --- a/packages/std/src/math/conversion.rs +++ b/packages/std/src/math/conversion.rs @@ -27,19 +27,21 @@ pub fn shrink_be_int( ) -> Option<[u8; OUTPUT_SIZE]> { debug_assert!(INPUT_SIZE >= OUTPUT_SIZE); - // A positive number should start with only 0s and a negative one with only 1s until - // the size we want to look at. - // If this is not the case, then the value is too large / small for the target type - let ignored_byte = if input[0] & 0b10000000 != 0 { - 0b11111111u8 + // check bounds + if input[0] & 0b10000000 != 0 { + // a negative number should start with only 1s, otherwise it's too small + for i in &input[0..(INPUT_SIZE - OUTPUT_SIZE)] { + if *i != 0b11111111u8 { + return None; + } + } } else { - 0u8 - }; - // Rust doesn't allow us to create an array of size `OUTPUT_SIZE - INPUT_SIZE`, - // so we work around this by taking a slice of a bigger array - let ignore_bytes = [ignored_byte; INPUT_SIZE]; - if input[0..(INPUT_SIZE - OUTPUT_SIZE)] != ignore_bytes[0..(INPUT_SIZE - OUTPUT_SIZE)] { - return None; + // a positive number should start with only 0s, otherwise it's too large + for i in &input[0..(INPUT_SIZE - OUTPUT_SIZE)] { + if *i != 0u8 { + return None; + } + } } // Now, we can just copy the last bytes From a77b0fd95693939387f46a22a14390c9aaee0028 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 5 Sep 2023 16:24:57 +0200 Subject: [PATCH 0704/2372] Improve docs Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/std/src/math/conversion.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/std/src/math/conversion.rs b/packages/std/src/math/conversion.rs index d83fbca5e6..f7cb353c04 100644 --- a/packages/std/src/math/conversion.rs +++ b/packages/std/src/math/conversion.rs @@ -1,4 +1,5 @@ /// Grows a big endian signed integer to a bigger size. +/// See pub const fn grow_be_int( input: [u8; INPUT_SIZE], ) -> [u8; OUTPUT_SIZE] { @@ -22,6 +23,7 @@ pub const fn grow_be_int( } /// Shrinks a big endian signed integer to a smaller size. +/// This is the opposite operation of sign extension. pub fn shrink_be_int( input: [u8; INPUT_SIZE], ) -> Option<[u8; OUTPUT_SIZE]> { From 9d66dcd64fce7e8b4772249e1f92e4f2eb9aa602 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 5 Sep 2023 16:29:31 +0200 Subject: [PATCH 0705/2372] Add missing TryFrom integer conversions --- packages/std/src/math/int128.rs | 14 +++++++++++++- packages/std/src/math/int64.rs | 22 +++++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index c21b66dd03..51943b08da 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -9,7 +9,9 @@ use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; -use crate::{forward_ref_partial_eq, ConversionOverflowError, Int256, Int64, Uint128, Uint64}; +use crate::{ + forward_ref_partial_eq, ConversionOverflowError, Int256, Int512, Int64, Uint128, Uint64, +}; use super::conversion::shrink_be_int; @@ -299,6 +301,16 @@ impl TryFrom for Int128 { } } +impl TryFrom for Int128 { + type Error = ConversionOverflowError; + + fn try_from(value: Int512) -> Result { + shrink_be_int(value.to_be_bytes()) + .ok_or_else(|| ConversionOverflowError::new("Int512", "Int128", value)) + .map(Self::from_be_bytes) + } +} + impl TryFrom<&str> for Int128 { type Error = StdError; diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index a44cca2b43..057b0f3405 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -9,7 +9,7 @@ use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; -use crate::{forward_ref_partial_eq, ConversionOverflowError, Int128, Uint64}; +use crate::{forward_ref_partial_eq, ConversionOverflowError, Int128, Int256, Int512, Uint64}; use super::conversion::shrink_be_int; @@ -275,6 +275,26 @@ impl TryFrom for Int64 { } } +impl TryFrom for Int64 { + type Error = ConversionOverflowError; + + fn try_from(value: Int256) -> Result { + shrink_be_int(value.to_be_bytes()) + .ok_or_else(|| ConversionOverflowError::new("Int256", "Int64", value)) + .map(Self::from_be_bytes) + } +} + +impl TryFrom for Int64 { + type Error = ConversionOverflowError; + + fn try_from(value: Int512) -> Result { + shrink_be_int(value.to_be_bytes()) + .ok_or_else(|| ConversionOverflowError::new("Int512", "Int64", value)) + .map(Self::from_be_bytes) + } +} + impl TryFrom<&str> for Int64 { type Error = StdError; From 167f48ca7b1bccd17cce84f700c2e982febe00da Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 5 Sep 2023 16:38:17 +0200 Subject: [PATCH 0706/2372] Add changelog entry --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e15bac5a8c..68ce49e7b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,8 +10,13 @@ and this project adheres to - cosmwasm-std: Add `abs` and `unsigned_abs` for `Int{64,128,256,512}` ([#1854]). +- cosmwasm-std: Add `From` for `Int512`, + `TryFrom` for `Int64`, `TryFrom` for `Int128`, + `TryFrom` for `Int256` and `Int256::from_i128` for const contexts + ([#1861]). [#1854]: https://github.com/CosmWasm/cosmwasm/pull/1854 +[#1861]: https://github.com/CosmWasm/cosmwasm/pull/1861 ## [1.4.0] - 2023-09-04 From 9b1125872278e943e800cd3812c0a08e8d84ccad Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 5 Sep 2023 00:20:40 +0200 Subject: [PATCH 0707/2372] Require cosmwasm-vm and cosmwasm-std to match cosmwasm-check version --- CHANGELOG.md | 12 ++++++++++++ packages/check/Cargo.toml | 4 ++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4123a67dd..1011c1a908 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,18 @@ and this project adheres to ## [Unreleased] +### Changed + +- cosmwasm-check: Use "=" for pinning the versions of cosmwasm-vm and + cosmwasm-std dependencies. This ensures that you can use an older version of + cosmwasm-check together with the VM of the same version by doing + `cargo install cosmwasm-check@1.4.1`. A typical use case would be to check a + contract with CosmWasm 1.4, 1.5 and 2.0. Note that other dependencies are + still upgraded when using `cargo install` which may lead to API, behavioural + or compiler incompatibilities. The + [--locked](https://doc.rust-lang.org/cargo/commands/cargo-install.html#dealing-with-the-lockfile) + feature allows you use the versions locked when the release was created. + ## [1.4.0] - 2023-09-04 ### Added diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index eb12f16401..507eceb8cb 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -11,8 +11,8 @@ license = "Apache-2.0" anyhow = "1.0.57" clap = "4" colored = "2" -cosmwasm-vm = { path = "../vm", version = "1.4.0" } -cosmwasm-std = { path = "../std", version = "1.4.0" } +cosmwasm-vm = { path = "../vm", version = "=1.4.0" } +cosmwasm-std = { path = "../std", version = "=1.4.0" } [dev-dependencies] assert_cmd = "=2.0.10" # 2.0.11+ requires Rust 1.65.0 which we currently don't want to make the minimum if possible From 3d83a6026ecb0405999661e5dbc70b4e7544e58b Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 6 Sep 2023 12:08:08 +0200 Subject: [PATCH 0708/2372] Move pre 1.0.0 CHANGELOG to separate file --- CHANGELOG-pre1.0.0.md | 1363 +++++++++++++++++++++++++++++++++++++++++ CHANGELOG.md | 1358 +--------------------------------------- 2 files changed, 1366 insertions(+), 1355 deletions(-) create mode 100644 CHANGELOG-pre1.0.0.md diff --git a/CHANGELOG-pre1.0.0.md b/CHANGELOG-pre1.0.0.md new file mode 100644 index 0000000000..36b2a3bb60 --- /dev/null +++ b/CHANGELOG-pre1.0.0.md @@ -0,0 +1,1363 @@ +# CHANGELOG of versions before 1.0.0 + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to +[Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [1.0.0-rc.0] - 2022-05-05 + +### Fixed + +- cosmwasm-std: Upgrade `serde-json-wasm` to 0.4.0 to fix u128/i128 + serialization of `to_vec`/`to_binary` in some cases ([#1297]). + +[#1297]: https://github.com/CosmWasm/cosmwasm/pull/1297 + +### Added + +- cosmwasm-std: Implement `checked_multiply_ratio` for + `Uint64`/`Uint128`/`Uint256` +- cosmwasm-std: Implement `checked_from_ratio` for `Decimal`/`Decimal256` +- cosmwasm-std: Implement `Div`/`DivAssign` for `Decimal`/`Decimal256`. +- cosmwasm-vm: Add feature `allow_interface_version_7` to run CosmWasm 0.16 + contracts in modern hosts. Be careful if you consider using this! + +### Changed + +- all: Updated Rust edition to 2021 +- cosmwasm-std: Rename `SubMsgExecutionResponse` to `SubMsgResponse`. +- cosmwasm-crypto: Update dependency `k256` to ^0.10.4. +- cosmwasm-vm: `BackendError` was changed to `non_exhaustive` for future + extension; `BackendError` now implements `PartialEq` for easier test code; the + `msg` in `BackendError::Unknown` became non-optional because it was always + set; the argument in `BackendError::unknown`/`::user_err` was change to + `impl Into` to avoid unnecessary clones. + +### Deprecated + +- cosmwasm-std: `SubMsgExecutionResponse` is deprecated in favor of the new + `SubMsgResponse`. + +### Removed + +- cosmwasm-std: Remove `Pair` which was previously deprecated. Use `Record` + instead. ([#1282]) + +[#1282]: https://github.com/CosmWasm/cosmwasm/issues/1282 + +## [1.0.0-beta8] - 2022-04-06 + +### Added + +- cosmwasm-std: Implement `MulAssign` for `Decimal`/`Decimal256`. +- cosmwasm-std: Implement `is_zero`/`atomics`/`decimal_places` as const for Uint + and Decimal types. +- cosmwasm-std: Implement `new` and `raw` const constructors for + `Decimal`/`Decimal256`. + +### Changed + +- all: Drop support for Rust versions lower than 1.56.1. +- cosmwasm-std: `MockQuerier` now supports adding custom behaviour for handling + Wasm queries via `MockQuerier::update_wasm` ([#1050]). + +[#1050]: https://github.com/CosmWasm/cosmwasm/pull/1050 + +### Fixed + +- cosmwasm-std: `Api::addr_validate` now requires inputs to be normalized. +- cosmwasm-vm: The `addr_validate` import now requires inputs to be normalized. + +## [1.0.0-beta7] - 2022-03-22 + +### Added + +- cosmwasm-std: Implement `Decimal{,256}::checked_mul` and + `Decimal{,256}::checked_pow`. +- cosmwasm-std: Implement `Sub`/`SubAssign` for `Uint64`. +- cosmwasm-std: Implement `Mul`/`MulAssign` for `Uint64`. +- cosmwasm-std: Implement `RemAssign` for + `Uint64`/`Uint128`/`Uint256`/`Uint512`. +- cosmwasm-std: Implement `pow`/`checked_pow` for `Uint64`/`Uint128`/`Uint512`. +- cosmwasm-std: Implement `SubAssign`/`AddAssign` for `Decimal`/`Decimal256`. +- cosmwasm-crypto: Upgrade ed25519-zebra to version 3. + +### Changed + +- cosmwasm-vm: Upgrade Wasmer to 2.2.1. + +## [1.0.0-beta6] - 2022-03-07 + +### Added + +- cosmwasm-std: Implement `ops::Rem` for `Uint{64,128,256,512}`. + +### Changed + +- cosmwasm-std: Change type of `Reply::result` from `ContractResult` to the new + `SubMsgResult`. Both types are equal when serialized but `ContractResult` is + documented to be the result of a contract execution, which is not the case + here. ([#1232]) +- cosmwasm-vm: Upgrade Wasmer to 2.2.0 and bump `MODULE_SERIALIZATION_VERSION` + to "v3-wasmer1". ([#1224]) + +[#1224]: https://github.com/CosmWasm/cosmwasm/pull/1224 +[#1232]: https://github.com/CosmWasm/cosmwasm/pull/1232 + +## [1.0.0-beta5] - 2022-02-08 + +### Changed + +- all: Drop support for Rust versions lower than 1.54.0. +- cosmwasm-std: The `Debug` implementation of `Binary` now produces a hex string + instead of a list of bytes ([#1199]). +- cosmwasm-std: Pin uint version to 0.9.1 in order to maintain a reasonably low + MSRV. +- cosmwasm-std: Add missing `Isqrt` export ([#1214]). + +[#1199]: https://github.com/CosmWasm/cosmwasm/issues/1199 +[#1214]: https://github.com/CosmWasm/cosmwasm/issues/1214 + +### Fixed + +- cosmwasm-vm: Fix `AddAssign` implementation of `GasInfo`. +- cosmwasm-vm: Bump `MODULE_SERIALIZATION_VERSION` to "v2" because the module + serialization format changed between Wasmer 2.0.0 and 2.1.x. + +## [1.0.0-beta4] - 2021-12-23 + +### Changed + +- cosmwasm-vm: `wasmer` version bumped `2.1.0 -> 2.1.1` + +### Fixed + +- cosmwasm-vm: Remove system-dependent stacktrace from `VmError::RuntimeErr` + (fixes CWA-2021-003). + +## [1.0.0-beta3] + +### Added + +- cosmwasm-std: New const methods `Uint64::to_be_bytes`/`::to_le_bytes`. +- cosmwasm-vm: The check_contracts tool now has a `--supported-features` option + that defaults to "iterator,staking,stargate". +- cosmwasm-vm: The default `singlepass` compiler is now supported on 64-bit + Windows. +- cosmwasm-std: Add missing `DivideByZeroError` export. +- cosmwasm-std: Implement `std::iter::Sum` for `Decimal` and `Decimal256`. + +### Changed + +- all: Drop support for Rust versions lower than 1.53.0. +- cosmwasm-std: The balance argument from `mock_dependencies` was removed. + Remove `&[]` if you don't need a contract balance or use the new + `mock_dependencies_with_balance` if you need a balance. +- cosmwasm-vm: Unlock cache mutex before module instantiation. +- cosmwasm-vm: `wasmer` version bumped `2.0.0 -> 2.1.0` + +### Removed + +- cosmwasm-std: Remove the macros `create_entry_points` and + `create_entry_points_with_migration` in favour of the new, more flexible entry + point system introduced in CosmWasm 0.14. + +## [1.0.0-beta] - 2021-10-11 + +### Added + +- cosmwasm-std: Add new `WasmQuery::ContractInfo` variant to get metadata about + the contract, like `code_id` and `admin`. +- cosmwasm-std: New field `Env::transaction` containing info of the transaction + the contract call was executed in. +- cosmwasm-std: Implement `ops::Mul` for `Decimal` and `Decimal256`. +- cosmwasm-std: New const methods `Uint128::to_be_bytes`/`::to_le_bytes`. +- cosmwasm-std: New const conversion methods `Uint256::from_uint128` and + `Uint512::from_uint256`. +- cosmwasm-std: New getters `Decimal{,256}::atomics()` and + `Decimal{,256}::decimal_places()`. +- cosmwasm-std: New constructors `Decimal{,256}::from_atomics`. +- cosmwasm-std: New `Uint128::checked_pow`. +- cosmwasm-std: New macros `ensure!`, `ensure_eq!` and `ensure_ne!` allow + requirement checking that return errors instead of panicking ([#1103]). + +[#1103]: https://github.com/CosmWasm/cosmwasm/issues/1103 + +### Changed + +- cosmwasm-std: Make `iterator` a required feature if the `iterator` feature + flag is set (enabled by default). +- cosmwasm-vm: Increase `MAX_LENGTH_HUMAN_ADDRESS` from 90 to 256 in order to + support longer address formats than bech32. +- cosmwasm-std: Make `CustomQuery` a subtrait of `Clone`, i.e. types that + implement `CustomQuery` need to be `Clone`able. +- cosmwasm-std: Add generic for custom query type to `QuerierWrapper`, `Deps`, + `DepsMut` and `OwnedDeps`. Merge `QuerierWrapper::custom_query` into the now + fully typed `QuerierWrapper::query`. +- cosmwasm-std: Add generic type `Q` for the custom query request type to + `do_instantiate`, `do_execute`, `do_migrate`, `do_sudo`, `do_reply`, + `do_query`, `ibc_channel_open`, `ibc_channel_connect`, `ibc_channel_close`, + `ibc_packet_receive`, `ibc_packet_ack` and `ibc_packet_timeout`. +- cosmwasm-std: In `Decimal` change `Fraction` to `Fraction`, + such that `Decimal::numerator` and `::denominator` now return `Uint128`. +- cosmwasm-std: Make methods `Uint256::to_be_bytes`/`::to_le_bytes` const. +- cosmwasm-std: Make methods `Uint512::to_be_bytes`/`::to_le_bytes` const. +- cosmwasm-std: Make method `Uint512::from_le_bytes` const. +- cosmwasm-std: Rename `Pair` to `Record`. `Pair` is now an alias for `Record` + and deprecated. ([#1108]) +- cosmwasm-vm: Bump required marker export `interface_version_7` to + `interface_version_8`. +- cosmwasm-vm: Increase cost per Wasm operation from 1 to 150_000 and adjust + crypto API gas cost based on the target of 1 Teragas per millisecond. +- cosmwasm-std: Deprecate the macros `create_entry_points` and + `create_entry_points_with_migration` in favour of the new, more flexible entry + point system introduced in CosmWasm 0.14. + +### Removed + +- cosmwasm-std: Remove `HumanAddr` (deprecated since 0.14). Use `String` + instead. +- cosmwasm-std: Remove `KV` (deprecated since 0.14). Use `Pair` instead. + +[#1108]: https://github.com/CosmWasm/cosmwasm/issues/1108 + +## [0.16.2] - 2021-09-07 + +### Added + +- cosmwasm-std: Implement `Mul` and `MulAssign` for `Uint128`. +- cosmwasm-std: Implement `FromStr` for `Uint128`, `Uint256`, and `Uint512`. +- cosmwasm-std: Make `Uint256::from_le_bytes`, `::from_be_bytes` and `::new` + const. +- cosmwasm-std: Added the `Decimal256` type with 18 decimal places. + +### Changed + +- cosmwasm-std: Implement `Decimal::from_ratio` using full uint128 + multiplication to support a wider range of input values. +- cosmwasm-std: `Decimal::from_ratio` now accepts any types that implement + `Into` rather than `Into`. +- cosmwasm-crypto: Update dependency `k256` to ^0.9.6. +- cosmwasm-std: Add enum cases `Shl` to `OverflowOperation` (breaking; [#1071]). + +[#1071]: https://github.com/CosmWasm/cosmwasm/pull/1071 + +### Fixed + +- cosmwasm-std: Fixed a bug where `Uint*` types wouldn't handle formatting + options when formatted with `std::fmt::Display`. + +## [0.16.1] - 2021-08-31 + +### Added + +- cosmwasm-std: Added `From` and `From<&Addr>` conversions for + `Cow`. +- cosmwasm-std: Added new `Uint256` and `Uint512` types. +- cosmwasm-std: Added implementations of `Isqrt` (integer square root) for + `Uint64`, `Uint128`, `Uint256`, and `Uint512`. +- cosmwasm-std: Exposed `Uint{64, 128, 256}::full_mul` for full multiplication + that cannot overflow. + +### Changed + +- cosmwasm-std: In `ExternalApi::addr_validate` and `::addr_canonicalize` do not + send too long inputs to VM to avoid terminating contract execution. Errors are + returned instead now. +- cosmwasm-std: Add enum cases `Shr` to `OverflowOperation` (breaking; [#1059]). + +[#1059]: https://github.com/CosmWasm/cosmwasm/pull/1059 + +## [0.16.0] - 2021-08-05 + +### Added + +- cosmwasm-std: Added the `IbcChannelOpenMsg`, `IbcChannelConnectMsg`, + `IbcChannelCloseMsg`, `IbcPacketReceiveMsg`, `IbcPacketAckMsg`, and + `IbcPacketTimeoutMsg` types for use with corresponding IBC entrypoints. +- cosmwasm-std::testing: New mocking helpers for IBC channel msg types: + `mock_ibc_channel_open_init`, `mock_ibc_channel_open_try`, + `mock_ibc_channel_connect_ack`, `mock_ibc_channel_connect_confirm`, + `mock_ibc_channel_close_init`, `mock_ibc_channel_close_confirm`. +- cosmwasm-std::testing: Added `mock_ibc_packet_timeout` since + `mock_ibc_packet_ack` is no longer usable for creating mock data for + `ibc_packet_timeout`. +- cosmwasm-std: New `Attribute::new` constructor that does the same thing as + `attr`. +- cosmwasm-std::testing: Added `mock_wasm_attr` when you really need to create + an `Attribute` with a key starting with `_` in test code. +- cosmwasm-std: Renamed `IBCAcknowledgementWithPacket` -> `IbcPacketAckMsg` to + remove an unneeded level of indirection. +- cosmwasm-std: Added `Event::add_attributes` for bulk adding attributes to an + `Event` struct. +- cosmwasm-std: Added `Addr::into_string` for explicit conversion + +### Changed + +- cosmwasm-vm: The `Checksum::to_hex` function signature was changed from + `to_hex(&self) -> String` to `to_hex(self) -> String`. +- cosmwasm-std: The `attr` function now accepts types that implement + `Into` rather than `ToString`. +- cosmwasm-std, cosmwasm-vm, cosmwasm-storage: The `iterator` feature is now + enabled by default. +- cosmwasm-std: Make `MockApi::canonical_length` private. +- cosmwasm-vm: Make `MockApi::canonical_length` private. +- cosmwasm-vm: Bump required marker export `interface_version_6` to + `interface_version_7`. +- cosmwasm-std, cosmwasm-vm: Entrypoints `ibc_channel_open`, + `ibc_channel_connect`, `ibc_channel_close`, `ibc_packet_receive`, + `ibc_packet_ack`, `ibc_packet_timeout` now each accept a corresponding `Msg` + value that wraps around channels, packets and acknowledgements. +- cosmwasm-std/cosmwasm-vm: Increase canonical address lengths up to 64 bytes. +- cosmwasm-std/cosmwasm-vm: In `MockApi`, increase max length of supported human + addresses from 24 bytes to 54 bytes by using a longer canonical + representation. This allows you to insert typical bech32 addresses in tests. + ([#995]) +- cosmwasm-std::testing: `mock_ibc_packet_recv` function now returns an + `IbcPacketReceiveMsg`, `mock_ibc_packet_ack` requires an acknowledgement to be + passed and returns an `IbcPacketAckMsg`. +- cosmwasm-std: `IbcBasicResponse` and `IbcReceiveResponse` now both support + custom events via the `events` field. +- cosmwasm-std: `attr` (and `Attribute::new`) will now panic in debug builds if + the attribute's key starts with an underscore. These names are reserved and + could cause problems further down the line. +- cosmwasm-std: `Response`, `IbcBasicResponse` and `IbcReceiveResponse` can no + longer be constructed using struct literals. Use constructors like + `Response::new` to construct empty structs and appropriate builder-style + methods to set fields (`response.add_message`, `response.set_data`, etc). +- cosmwasm-std: `Event`, `IbcChannel`, `IbcPacket`, `IbcAcknowledgement` have + been marked `non_exhaustive` (can't be constructed using a struct literal by + downstream code). +- cosmwasm-std: `Event::attr` has been renamed to `Event::add_attribute` for + consistency with other types like `Response`. +- cosmwasm-vm: `Instance::required_features` changed from a property to a getter + method. +- cosmwasm-vm: Add `required_features` field to `AnalysisReport` which is + returned by `Cache::analyze`. +- cosmwasm-vm: The VM now checks that exactly one `interface_version_*` marker + export is set. For `interface_version_5` and `interface_version_6` (CosmWasm + 0.14–0.15) more specific error messages were added. + +[#995]: https://github.com/CosmWasm/cosmwasm/pull/995 + +### Removed + +- cosmwasm-std::testing: `mock_ibc_channel` is now private. Use + `mock_ibc_channel_open`, `mock_ibc_channel_connect`, or + `mock_ibc_channel_close` instead. + +## [0.15.2] - 2021-07-21 + +### Fixed + +- cosmwasm-std: Export `VoteOption` as a top-level type. + +## [0.15.1] - 2021-07-20 + +### Fixed + +- cosmwasm-std: Export `GovMsg` as a top-level type of the crate. + +## [0.15.0] - 2021-06-24 + +### Added + +- cosmwasm-std: Implement `Sub` and `SubAssign` for `Uint128` +- cosmwasm-std: Implement custom events for contract execution results +- cosmwasm-std: Add `CosmosMsg::Gov` for voting on governance proposals. +- cosmwasm-storage: Implement `Storage` for `PrefixedStorage` and + `ReadonlyPrefixedStorage`. NOTE: Calling `set` or `remove` on + `ReadonlyPrefixedStorage` will panic! + +### Removed + +- cosmwasm-std: Make `Uint128` inner field private ([#905]) +- cosmwasm-std: Remove `Context` - deprecated in previous release +- cosmwasm-std: Remove `HandleResponse`, `InitResponse`, and `MigrateResponse` - + deprecated in previous release +- cosmwasm-crypto: Remove `ed25519::MESSAGE_MAX_LEN`, `ed25519::BATCH_MAX_LEN` + and message length verification as this should not be a concern of + `cosmwasm-crypto`. + +[#905]: https://github.com/CosmWasm/cosmwasm/issues/905 + +### Changed + +- cosmwasm-std: Rename the `send` function parameter to `funds` in `WasmMsg` for + consistency with the wasmd message types. +- cosmwasm-vm: Increase read limit of contract execution results from 100,000 + bytes to 64 MiB. JSON deserializers should have their own limit to protect + against large deserializations. +- cosmwasm-vm: Create `VmError::DeserializationLimitExceeded`; Add limit + argument to `from_slice`; Increase deserialization limit of contract execution + results from 100,000 bytes to 256 KiB. This probably only affects internal + testing as well as integration tests of smart contracts. +- cosmwasm-vm: More accurate error messages for op codes related to bulk memory + operations, reference types, SIMD and the Threads extension. +- cosmwasm-vm: Update `wasmer` to `2.0.0` +- cosmwasm-vm: ED25519 message length and batch length limits are now hardcoded + in `cosmwasm-vm` itself instead of being imported from `cosmwasm-crypto`. +- cosmwasm-vm: Filesystem storage layout now distinguishes clearly between state + and cache. +- cosmwasm-std: Add enum case `ReplyOn::Never`; Remove default implementation of + `ReplyOn` as there is no natural default case anymore ([#961]). +- cosmwasm-std: Merge `messages` and `submessages` into one list, using + `ReplyOn::Never` to model the "fire and forget" semantics ([#961]). +- cosmwasm-std: Add `SubMsg` constructors: `::new()`, `::reply_on_error()`, + `::reply_on_success()`, `::reply_always()`; Add `with_gas_limit` to add a gas + limit to any those constructors ([#961]). +- cosmwasm-std: Change `Event`'s constructor - it no longer takes a vector of + attributes and instead constructs an empty one +- cosmwasm-std: Rename `Event.kind` to `Event.ty`. +- cosmwasm-std: Rename `SubcallResponse` to `SubMsgExecutionResponse`. +- contracts: Rename `ReflectSubCall` to `ReflectSubMsg` and `SubCallResult` to + `SubCallMsg` in the `reflect` contract. +- cosmwasm-std: Rename the `subcall` module to `submessages`. +- cosmwasm-vm: Bump required marker export `cosmwasm_vm_version_5` to + `interface_version_6`. +- cosmwasm-std: `IbcAcknowledgement` is renamed to + `IbcAcknowledgementWithPacket` as it contains both data elements. ([#975]) +- cosmwasm-std: `IbcAcknowledgementWithPacket.acknowledgement` is no longer + simply `Binary`, but a new `IbcAcknowledgement` structure, which contains one + field - `data: Binary`. This change was made to allow us to handle future + changes to IBC in a non-contract-breaking way. ([#975]) + +[#961]: https://github.com/CosmWasm/cosmwasm/pull/961 +[#975]: https://github.com/CosmWasm/cosmwasm/pull/975 + +### Fixed + +- comswasm-vm: Whitelisted the `i64.extend32_s` operation. + +## [0.14.1] - 2021-06-14 + +### Added + +- cosmwasm-std: Add `Timestamp::minus_seconds` and `::minus_nanos`. +- cosmwasm-std: Add `Addr::as_bytes` +- cosmwasm-std: Implement `std::ops::Sub` for `math::Decimal` +- cosmwasm-std: Add `Timestamp::seconds` and `Timestamp::subsec_nanos`. +- cosmwasm-std: Implement division for `Decimal / Uint128` +- cosmwasm-std: Add `math::Decimal::sqrt` + +### Fixed + +- cosmwasm-std: Fix `Uint64::multiply_ratio` and `Uint128::multiply_ratio` so + that internal multiplication cannot cause an unnecessary overflow. ([#920]) + +[#920]: https://github.com/CosmWasm/cosmwasm/issues/920 + +## [0.14.0] - 2021-05-03 + +### Added + +- cosmwasm-crypto: Add `ed25519_batch_verify`, EdDSA ed25519 batch signature + verification scheme for Tendermint signatures and public keys formats. + ([#788]) +- cosmwasm-crypto: Add `ed25519_verify`, EdDSA ed25519 signature verification + scheme for Tendermint signature and public key formats. ([#771]) +- cosmwasm-crypto: New crypto-related crate. Add `secp256k1_verify`, ECDSA + secp256k1 signature verification scheme for Cosmos signature and public key + formats. ([#780]) +- cosmwasm-vm: Add PinnedMemoryCache. ([#696]) +- cosmwasm-vm: The new `Cache::analyze` provides a static analyzis of the Wasm + bytecode. This is used to tell the caller if the contract exposes IBC entry + points. ([#736]) +- cosmwasm-vm: Added new `stargate` feature flag to enable new stargate and ibc + features ([#692], [#716]) +- cosmwasm-vm: (requires `stargate`) call into 6 new ibc entry points if exposed + by contract ([#692], [#716]) +- cosmwasm-std: Added new `stargate` feature flag to enable new stargate and ibc + features ([#692], [#706]) +- cosmwasm-std: (requires `stargate`) Added new `CosmosMsg::Stargate` message + type to dispatch protobuf-encoded message (contract must know proto schema) + ([#706]) +- cosmwasm-std: (requires `stargate`) Added new `QueryRequest::Stargate` message + type to dispatch protobuf-encoded queries (contract must know proto schema for + request and response) ([#706]) +- cosmwasm-std: (requires `stargate`) Added new `CosmosMsg::Ibc(IbcMsg)` message + type to use ibctransfer app or send raw ics packets (if contract has ibc entry + points) ([#692], [#710]) +- cosmwasm-std: Add mutable helper methods to `InitResponse`, `MigrateResponse` + and `HandleResponse` which make `Context` obsolete. +- contracts: added new `ibc-reflect` contract that receives channels and assigns + each an account to redispatch. Similar idea to ICS27/Interchain Accounts (but + different implementation) ([#692], [#711], [#714]) +- cosmwasm-std: Added new `WasmMsg::Migrate` variant that allows one contract + (eg. multisig) be the admin and migrate another contract ([#768]) +- cosmwasm-std: Added optional `system` entry point that can only be called by + native (blockchain) modules to expose admin functionality if desired. ([#793]) +- cosmwasm-std: Add extra field `submessages` to `Response`, such that you can + get a callback from these messages after their execution (success or failure). + ([#796]) +- cosmwasm-std: Added `reply` entry point that will receive all callbacks from + submessages dispatched by this contract. This is only required if contract + returns "submessages" (above). ([#796]) +- cosmwasm-std: Implement `From for String`, `From for u128` + as well as `From for Uint128`. +- cosmwasm-std: Create new address type `Addr`. This is human readable (like + `HumanAddr`) but is immutable and always contains a valid address ([#802]). +- cosmwasm-vm: Add import `addr_validate` ([#802]). +- cosmwasm-std: Add `BankMsg::Burn` variant when you want the tokens to + disappear ([#860]) +- cosmwasm-std: Create `Fraction` trait to represent a fraction `p`/`q` with + integers `p` and `q`. `Decimal` now implements `Fraction`, which + provides public getters `::numerator()` and `::denominator()`. +- cosmwasm-std: Add `Decimal::inv` that returns `1/d` for decimal `d`. +- cosmwasm-vm: Add `Cache::metrics` to expose internal data for monitoring + purposes ([#763]). +- cosmwasm-std: Implement `PartialOrd` and `Ord` for `Binary` using the same + lexicographical ordering as implemented by `Vec`. +- cosmwasm-std: Implement `PartialOrd` and `Ord` for `Addr` using the same + lexicographical ordering as implemented by `String`. +- cosmwasm-std: Added new `WasmMsg::UpdateAdmin` variant that allows an admin + contract (eg. multisig) to set another admin ([#900]) +- cosmwasm-std: Added new `WasmMsg::ClearAdmin` variant that allows an admin + contract (eg. multisig) to clear the admin, to prevent future migrations + ([#900]) +- cosmwasm-std: Implement `Display for Coin` ([#901]). +- cosmwasm-std: Create `Uint64` analogously to `Uint128` with string + serialization allowing the use of the full uint64 range in JSON clients that + use float numbers, such as JavaScript and jq. +- cosmwasm-std: Create const functions `Uint64::new` and `Uint128::new` to + create instances in a const context. + +[#692]: https://github.com/CosmWasm/cosmwasm/issues/692 +[#706]: https://github.com/CosmWasm/cosmwasm/pull/706 +[#710]: https://github.com/CosmWasm/cosmwasm/pull/710 +[#711]: https://github.com/CosmWasm/cosmwasm/pull/711 +[#714]: https://github.com/CosmWasm/cosmwasm/pull/714 +[#716]: https://github.com/CosmWasm/cosmwasm/pull/716 +[#763]: https://github.com/CosmWasm/cosmwasm/issues/763 +[#768]: https://github.com/CosmWasm/cosmwasm/pull/768 +[#793]: https://github.com/CosmWasm/cosmwasm/pull/793 +[#796]: https://github.com/CosmWasm/cosmwasm/pull/796 +[#802]: https://github.com/CosmWasm/cosmwasm/pull/802 +[#860]: https://github.com/CosmWasm/cosmwasm/pull/860 +[#900]: https://github.com/CosmWasm/cosmwasm/pull/900 +[#901]: https://github.com/CosmWasm/cosmwasm/pull/901 + +### Changed + +- contracts: Rename `HandleMsg` to `ExecuteMsg`. +- all: Rename `handle` entry point to `execute`. +- all: Rename `init` entry point to `instantiate`. +- all: Rename `system` entry point to `sudo`. +- all: Drop support for Rust versions lower than 1.51.0. +- all: The `query` and `execute` entry points are now optional. It is still + highly recommended to implement and expose them in almost any use case though. +- all: Change the encoding of the key/value region of the `db_next` import to a + more generic encoding that supports an arbitrary number of sections. This + encoding can then be reused for other multi value regions. +- all: Remove the `info: MessageInfo` argument from the `migrate` entry point + ([#690]). +- cosmwasm-std: Remove `from_address` from `BankMsg::Send`, as it always sends + from the contract address, and this is consistent with other `CosmosMsg` + variants. +- cosmwasm-std: Remove the previously deprecated `InitResult`, `HandleResult`, + `MigrateResult` and `QueryResult` in order to make error type explicit and + encourage migration to custom errors. +- cosmwasm-std: Add a `data` field to `InitResponse` the same way as in + `MigrateResponse` and `HandleResponse`. +- cosmwasm-std: Rename `MessageInfo::sent_funds` to `MessageInfo::funds`. +- cosmwasm-std: Merge response types `InitResponse`, `HandleResponse` and + `MigrateResponse` into the new `Response`. +- cosmwasm-std: Remove `Default` implementation from `HumanAddr`, + `CanonicalAddr`, `ContractInfo`, `MessageInfo`, `BlockInfo` and `Env`. If you + need one of those, you're probably doing something wrong. +- cosmwasm-std: Make `label` in `WasmMsg::Instantiate` non-optional to better + match the Go/database format. +- cosmwasm-std: Add new field `admin` to `WasmMsg::Instantiate` to fully support + `MsgInstantiateContract` from `x/wasm` ([#861]). +- cosmwasm-std: `Binary::to_array` is now generic over the array length instead + of the output type. As a consequence the obsolete type `ByteArray` was + removed. The array length is not restricted to 0-64 anymore. +- cosmwasm-std: Use const generics to implement `From<&[u8; LENGTH]> for Binary` + and `From<[u8; LENGTH]> for Binary`, such that the array length is not + restricted to 0-64 anymore. +- cosmwasm-vm: Avoid serialization of Modules in `InMemoryCache`, for + performance. Also, remove `memory_limit` from `InstanceOptions`, and define it + instead at `Cache` level (same memory limit for all cached instances). + ([#697]) +- cosmwasm-std: Rename type `KV` to `Pair` in order to comply to naming + convention as enforced by clippy rule `upper_case_acronyms` from Rust 1.51.0 + on. +- cosmwasm-std: `ContractInfo::address` and `MessageInfo::sender` are now of + type `Addr`. The value of those fields is created by the host and thus valid. +- cosmwasm-vm: Bump required marker export `cosmwasm_vm_version_4` to + `interface_version_5`. +- cosmwasm-vm: Rename trait `Api` to `BackendApi` to better express this is the + API provided by the VM's backend (i.e. the blockchain). +- cosmwasm-vm: Rename imports to `addr_canonicalize` and `addr_humanize` + ([#802]). +- cosmwasm-vm: Replace types `HumanAddr`/`CanonicalAddr` with + `&str`/`String`/`&[u8]`/`Vec` in the methods of `BackendApi`. The address + types belong in the contract development and the backend operates on raw + strings and binary anyways. +- contracts: `reflect` contract requires `stargate` feature and supports + redispatching `Stargate` and `IbcMsg::Transfer` messages ([#692]) +- cosmwasm-std: The arithmetic methods of `Uint128` got a huge overhaul, making + them more consistent with the behaviour of the Rust primitive types. Thank you + [@yihuang] for bringing this up and for the great implementation. ([#853]) + 1. `Uint128` got the new functions `checked_add`, `checked_sub`, + `checked_mul`, `checked_div`, `checked_div_euclid`, `checked_rem`, + `wrapping_add`, `wrapping_sub`, `wrapping_mul`, `wrapping_pow`, + `saturating_add`, `saturating_sub`, `saturating_mul` and `saturating_pow` + which match their equivalent in [u128] except that instead of `Option` the + checked methods return a `Result` with an `OverflowError` or + `DivideByZeroError` that carries a few debug information and can directly + be converted to `StdError`/`StdResult` by using the `?` operator. + 2. `StdError::Underflow` and `StdError::underflow` were removed in favour of + `StdError::Overflow`. `StdError::DivideByZeroError` was added. + 3. The `-` operator (`impl ops::Sub for Uint128`) was removed + because it returned a `StdResult` instead of panicking in the case of an + overflow. This behaviour was inconsistent with `+` and the Rust standard + library. Please use the explicit `*_sub` methods introduced above. In a + couple of releases from now, we want to introduce the operator again with + panicking overflow behaviour ([#858]). +- cosmwasm-std: Replace `HumanAddr` with `String` in `BankQuery`, `StakingQuery` + and `WasmQuery` query requests ([#802]). +- cosmwasm-std: In staking query response types `Delegation`, `FullDelegation` + and `Validator` the validator address fields were changed from `HumanAddr` to + `String`. The new `Addr` type cannot be used here because it only supports + standard account addresses via `Api::addr_*` ([#871]). +- cosmwasm-std: Change address types in `BankMsg`, `IbcMsg` and `WasmMsg` from + `HumanAddr` to `String` ([#802]). +- cosmwasm-std: `Api::addr_humanize` now returns `Addr` instead of `HumanAddr` + ([#802]). +- cosmwasm-std: Hide `StakingMsg`, `CosmosMsg::Staking`, + `AllDelegationsResponse`, `BondedDenomResponse`, `Delegation`, + `FullDelegation`, `StakingQuery`, `Validator`, `ValidatorsResponse` and + `testing::StakingQuerier` behind the `staking` feature flag to make those only + available in contracts built for PoS chains. +- cosmwasm-std: Remove `StakingMsg::Withdraw` in favour of + `DistributionMsg::SetWithdrawAddress` and + `DistributionMsg::WithdrawDelegatorReward` ([#848]). +- cosmwasm-std: Rename `StakingQuery::Validators`, `ValidatorsResponse` and + `QuerierWrapper::query_validators` to `StakingQuery::AllValidators`, + `AllValidatorsResponse` and `QuerierWrapper.query_all_validators`. Add + `StakingQuery::Validator`, `ValidatorResponse` and + `QuerierWrapper::query_validator` to allow querying a single validator. + ([#879]) +- cosmwasm-schema: Make first argument non-mutable in `export_schema_with_title` + for consistency with `export_schema`. +- cosmwasm-std: The block time in `BlockInfo::time` is now a `Timestamp`. + `BlockInfo::time_nanos` was removed. + +[#696]: https://github.com/CosmWasm/cosmwasm/issues/696 +[#697]: https://github.com/CosmWasm/cosmwasm/issues/697 +[#736]: https://github.com/CosmWasm/cosmwasm/pull/736 +[#690]: https://github.com/CosmWasm/cosmwasm/issues/690 +[@yihuang]: https://github.com/yihuang +[#853]: https://github.com/CosmWasm/cosmwasm/pull/853 +[#858]: https://github.com/CosmWasm/cosmwasm/issues/858 +[u128]: https://doc.rust-lang.org/std/primitive.u128.html +[#802]: https://github.com/CosmWasm/cosmwasm/pull/802 +[#871]: https://github.com/CosmWasm/cosmwasm/issues/871 +[#861]: https://github.com/CosmWasm/cosmwasm/issues/861 +[#848]: https://github.com/CosmWasm/cosmwasm/issues/848 +[#879]: https://github.com/CosmWasm/cosmwasm/pull/879 + +### Deprecated + +- cosmwasm-std: `InitResponse`, `MigrateResponse` and `HandleResponse` are + deprecated in favour of the new `Response`. +- cosmwasm-std: `Context` is deprecated in favour of the new mutable helpers in + `Response`. +- cosmwasm-std: `HumanAddr` is not much more than an alias to `String` and it + does not provide significant safety advantages. With CosmWasm 0.14, we now use + `String` when there was `HumanAddr` before. There is also the new `Addr`, + which holds a validated immutable human readable address. ([#802]) + +[#802]: https://github.com/CosmWasm/cosmwasm/pull/802 + +## [0.13.2] - 2021-01-14 + +## Changed + +- cosmwasm-vm: Update Wasmer to 1.0.1. + +## [0.13.1] - 2021-01-12 + +### Added + +- cosmwasm-std: Add the new `#[entry_point]` macro attribute that serves as an + alternative implementation to `cosmwasm_std::create_entry_points!(contract)` + and `cosmwasm_std::create_entry_points_with_migration!(contract)`. Both ways + are supported in the 0.13 series. + +## [0.13.0] – 2021-01-06 + +## Added + +- cosmwasm-std: Extend binary to array support to 64 bytes. + +## Changed + +- all: Drop support for Rust versions lower than 1.47.0. +- cosmwasm-std: Remove `cosmwasm_std::testing::MockApi::new`. Use + `MockApi::default` instead. +- cosmwasm-vm: Upgrade Wasmer to 1.0 and adapt all the internal workings + accordingly. +- cosmwasm-vm: Export method `cosmwasm_vm::Cache::stats` and response type + `Stats`. +- cosmwasm-vm: Remove `cosmwasm_vm::testing::MockApi::new`. Use + `MockApi::default` instead. +- cosmwasm-vm: Convert field `Instance::api` to a method. +- cosmwasm-vm: Change order of generic arguments for consistency in `Instance`, + `Cache` and `Backend` to always match ``. +- cosmwasm-vm: Remove `Instance::get_memory_size`. Use `Instance::memory_pages` + instead. + +## 0.12.2 (2020-12-14) + +**cosmwasm-std** + +- `StdError` now implements `PartialEq` (ignoring backtrace if any). This allows + simpler `assert_eq!()` when testing error conditions (rather than match + statements as now). + +## 0.12.1 (2020-12-09) + +**cosmwasm-std** + +- Deprecate `InitResult`, `HandleResult`, `MigrateResult` and `QueryResult` in + order to make error type explicit and encourage migration to custom errors. +- Implement `Deref` for `QuerierWrapper`, such that `QuerierWrapper` behaves + like a smart pointer to `Querier` allowing you to access `Querier` methods + directly. + +## 0.12.0 (2020-11-19) + +**cosmwasm-std** + +- Remove the previously deprecated `StdError::Unauthorized`. Contract specific + errors should be implemented using custom error types now (see + [migration guide](./MIGRATING.md) 0.10 -> 0.11). +- Use dependency `thiserror` instead of `snafu` to implement `StdError`. Along + with this change, the `backtraces` feature now requires Rust nightly. +- Rename `StdError::ParseErr::source` to `StdError::ParseErr::source_type` and + `StdError::SerializeErr::target` to `StdError::SerializeErr::target_type` to + work around speacial treatment of the field name `source` in thiserror. +- Rename `Extern` to `Deps` to unify naming. +- Simplify ownership of calling `handle`, etc. with `Deps` and `DepsMut` struct + that just contains references (`DepsMut` has `&mut Storage` otherwise the + same) +- Remove unused `Deps::change_querier`. If you need this or similar + functionality, create a new struct with the right querier. +- Remove `ReadonlyStorage`. You can just use `Storage` everywhere. And use + `&Storage` to provide readonly access. This was only needed to let + `PrefixedStorage`/`ReadonlyPrefixedStorage` implement the common interface, + which is something we don't need. + +**cosmwasm-storage** + +- `PrefixedStorage`/`ReadonlyPrefixedStorage` do not implement the + `Storage`/`ReadonlyStorage` traits anymore. If you need nested prefixes, you + need to construct them directly via `PrefixedStorage::multilevel` and + `ReadonlyPrefixedStorage::multilevel`. +- Remove unused `TypedStorage`. If you need this or similar functionality, you + probably want to use `Bucket` or `Singleton`. If you really need it, please + copy the v0.11 code into your project. +- Remove `StorageTransaction` along with `transactional` and `RepLog`. This has + not been used actively for contract development and is now maintained in a + contract testing framework. + +**cosmwasm-vm** + +- Remove `Storage::range` and `StorageIterator`. The storage implementation is + now responsible for maintaining iterators internally and make them accessible + via the new `Storage::scan` and `Storage::next` methods. +- Add `FfiError::IteratorDoesNotExist`. Looking at this, `FfiError` should + probably be renamed to something that includes before, on and behind the FFI + boundary to Go. +- `MockStorage` now implements the new `Storage` trait and has an additional + `MockStorage::all` for getting all elements of an iterator in tests. +- Remove unused `Extern::change_querier`. If you need this or similar + functionality, create a new struct with the right querier. +- Let `Instance::from_code` and `CosmCache::get_instance` take options as an + `InstanceOptions` struct. This contains `gas_limit` and `print_debug` for now + and can easily be extended. `cosmwasm_vm::testing::mock_instance_options` can + be used for creating such a struct in integration tests. +- Make `FileSystemCache` crate internal. This should be used via `CosmCache`. +- Fix return type of `FileSystemCache::load` to `VmResult>` in + order to differentiate missing files from errors. +- Add in-memory caching for recently used Wasm modules. +- Rename `CosmCache` to just `cosmwasm_vm::Cache` and add `CacheOptions` to + configure it. +- Rename `Extern` to `Backend`. +- Rename `mock_dependencies` to `mock_backend` and + `mock_dependencies_with_balances` to `mock_backend_with_balances`. +- Rename `FfiError`/`FfiResult` to `BackendError`/`BackendResult` and adapt + `VmError` accordingly. + +## 0.11.2 (2020-10-26) + +**cosmwasm-std** + +- Implement `From` and `From` + for `StdError`. +- Generalize denom argument from `&str` to `S: Into` in `coin`, `coins` + and `Coin::new`. +- Implement `PartialEq` between `Binary` and `Vec`/`&[u8]`. +- Add missing `PartialEq` implementations between `HumanAddr` and `str`/`&str`. +- Add `Binary::to_array`, which allows you to copy binary content into a + fixed-length `u8` array. This is especially useful for creating integers from + binary data. + +## 0.11.1 (2020-10-12) + +**cosmwasm-std** + +- Implement `Hash` and `Eq` for `Binary` to allow using `Binary` in `HashSet` + and `HashMap`. +- Implement `Hash` and `Eq` for `CanonicalAddr` to allow using `CanonicalAddr` + in `HashSet` and `HashMap`. +- Implement `Add`, `AddAssign` and `Sub` with references on the right hand side + for `Uint128`. +- Implement `Sum` and `Sum<&'a Uint128>` for `Uint128`. + +## 0.11.0 (2020-10-08) + +**all** + +- Drop support for Rust versions lower than 1.45.2. +- The serialization of the result from `init`/`migrate`/`handle`/`query` changed + in an incompatible way. See the new `ContractResult` and `SystemResult` types + and their documentation. +- Pass `Env` into `query` as well. As this doesn't have `MessageInfo`, we + removed `MessageInfo` from `Env` and pass that as a separate argument to + `init`, `handle`, and `query`. See the example + [type definitions in the README](README.md#implementing-the-smart-contract) to + see how to update your contract exports (just add one extra arg each). + +**cosmwasm-std** + +- Add `time_nanos` to `BlockInfo` allowing access to high precision block times. +- Change `FullDelegation::accumulated_rewards` from `Coin` to `Vec`. +- Rename `InitResponse::log`, `MigrateResponse::log` and `HandleResponse::log` + to `InitResponse::attributes`, `MigrateResponse::attributes` and + `HandleResponse::attributes`. +- Rename `LogAttribute` to `Attribute`. +- Rename `log` to `attr`. +- Rename `Context::add_log` to `Context::add_attribute`. +- Add `Api::debug` for emitting debug messages during development. +- Fix error type for response parsing errors in `ExternalQuerier::raw_query`. + This was `Ok(Err(StdError::ParseErr))` instead of + `Err(SystemError::InvalidResponse)`, implying an error created in the target + contract. +- Deprecate `StdError::Unauthorized` and `StdError::unauthorized` in favour of + custom errors. From now on `StdError` should only be created by the standard + library and should only contain cases the standard library needs. +- Let `impl Display for CanonicalAddr` use upper case hex instead of base64. + This also affects `CanonicalAddr::to_string`. +- Create trait `CustomQuery` for the generic argument in + `QueryRequest`. This allows us to provide + `impl From for QueryRequest` for any custom query. +- Implement `From for Vec`. +- Implement `From for Vec`. +- Add `Binary::into_vec` and `CanonicalAddr::into_vec`. +- The `canonical_length` argument was removed from `mock_dependencies`, + `mock_dependencies_with_balances`. In the now deprecated `MockApi::new`, the + argument is unused. Contracts should not need to set this value and usually + should not make assumptions about the value. +- The canonical address encoding in `MockApi::canonical_address` and + `MockApi::human_address` was changed to an unpredictable representation of + non-standard length that aims to destroy most of the input structure. + +**cosmwasm-storage** + +- Change order of arguments such that `storage` is always first followed by + namespace in `Bucket::new`, `Bucket::multilevel`, `ReadonlyBucket::new`, + `ReadonlyBucket::multilevel`, `bucket` and `bucket_read`. +- Change order of arguments such that `storage` is always first followed by + namespace in `PrefixedStorage::new`, `PrefixedStorage::multilevel`, + `ReadonlyPrefixedStorage::new`, `ReadonlyPrefixedStorage::multilevel`, + `prefixed` and `prefixed_read`. + +**cosmwasm-vm** + +- `CosmCache::new`, `Instance::from_code` and `Instance::from_module` now take + an additional argument to enable/disable printing debug logs from contracts. +- Bump required export `cosmwasm_vm_version_3` to `cosmwasm_vm_version_4`. +- The `canonical_length` argument was removed from `mock_dependencies`, + `mock_dependencies_with_balances` and `MockApi::new_failing`. In the now + deprecated `MockApi::new`, the argument is unused. Contracts should not need + to set this value and usually should not make assumptions about the value. +- The canonical address encoding in `MockApi::canonical_address` and + `MockApi::human_address` was changed to an unpredictable representation of + non-standard length that aims to destroy most of the input structure. + +## 0.10.1 (2020-08-25) + +**cosmwasm-std** + +- Fix bug where `ExternalStorage.range()` would cause VM error if either lower + or upper bound was set + ([#508](https://github.com/CosmWasm/cosmwasm/issues/508)) + +## 0.10.0 (2020-07-30) + +**all** + +- Drop support for Rust versions lower than 1.44.1. + +**cosmwasm-std** + +- Remove error helpers `generic_err`, `invalid_base64`, `invalid_utf8`, + `not_found`, `parse_err`, `serialize_err`, `underflow`, `unauthorized` in + favour of `StdError::generic_err` and friends. +- Implement `From<&[u8; $N]> for Binary` and `From<[u8; $N]> for Binary` for all + `$N <= 32`. +- Add `Context` object that can be used to build Init/Handle/Migrate response + via `add_log`, `add_message`, `set_data` and then convert to the proper type + via `into` or `try_into`. Option to simplify response construction. +- Env uses `HumanAddr` for `message.sender` and `contract_address` +- Remove `Api` argument from `mock_env` +- Implement `From<&[u8]>` and `From>` for `CanonicalAddr` + +**cosmwasm-vm** + +- Remove unused cache size argument from `CosmCache`. +- `set_gas_limit` now panics if the given gas limit exceeds the max. supported + value. +- Increase the max. supported value for gas limit from 10_000_000_000 to + 0x7FFFFFFFFFFFFFFF. +- Add checks to `get_region` for failing early when the contract sends a Region + pointer to the VM that is not backed by a plausible Region. This helps + development of standard libraries. +- Create dedicated `RegionValidationError` and `RegionValidationResult`. +- `Api::human_address` and `Api::canonical_address` now return a pair of return + data and gas usage. +- Remove `NextItem` in favour of a more advanced `FfiResult`, which is used + to store the return result and the gas information consistently across all + APIs. `FfiResult` was changed to `(Result, GasInfo)`. +- Create error type `FfiError::InvalidUtf8` for the cases where the backend + sends invalid UTF-8 in places that expect strings. +- Remove `FfiError::Other` in favour of `FfiError::UserErr` and + `FfiError::Unknown`. +- The `canonicalize_address` and `humanize_address` imports now report user + errors to the contract. +- Bump `cosmwasm_vm_version_2` to `cosmwasm_vm_version_3`. +- `Querier::raw_query` and `QuerierResult` were removed in favour of the new + `Querier::query_raw`, which includes a gas limit parameter for the query. + +## 0.9.4 (2020-07-16) + +**cosmwasm-vm** + +- Add `Instance::create_gas_report` returning a gas report including the + original limit, the remaining gas and the internally/externally used gas. + +## 0.9.3 (2020-07-08) + +**cosmwasm-storage** + +- Add `.remove()` method to `Bucket` and `Singleton`. + +## 0.9.2 (2020-06-29) + +- Downgrade wasmer to 0.17.0. + +## 0.9.1 (2020-06-25) + +**cosmwasm-std** + +- Replace type `Never` with `Empty` because enums with no cases cannot be + expressed in valid JSON Schema. + +## 0.9.0 (2020-06-25) + +Note: this version contains an API bug and should not be used (see +https://github.com/CosmWasm/cosmwasm/issues/451). + +**all** + +- Upgrade wasmer to 0.17.1. +- Drop support for Rust versions lower than 1.43.1 + +**cosmwasm-std** + +- `ReadonlyStorage::get` and all its implementations now return + `Option>`. +- `ReadonlyStorage::range` and all its implementations now always succeed and + return an iterator instead of a result. This is now an iterator over + `Option` instead of `Option>`. +- `Storage::{set, remove}` and all their implementations no longer have a return + value. Previously they returned `StdResult<()>`. +- Trait `Querier` is not `Clone` and `Send` anymore. +- `consume_region` panics on null pointers and returns `Vec` instead of + `StdResult>`. +- Added contract migration mechanism. Contracts can now optionally export a + `migrate` function with the following definition: + ```rust + extern "C" fn migrate(env_ptr: u32, msg_ptr: u32) -> u32; + ``` +- InitResponse no longer has a data field. We always return the contract address + in the data field in the blockchain and don't allow you to override. `handle` + can still make use of the field. +- Rename `MockQuerier::with_staking` to `MockQuerier::update_staking` to match + `::update_balance`. +- The obsolete `StdError::NullPointer` and `null_pointer` were removed. +- Error creator functions are now in type itself, e.g. + `StdError::invalid_base64` instead of `invalid_base64`. The free functions are + deprecated and will be removed before 1.0. + +**cosmwasm-storage** + +- Remove `transactional_deps`. Use `transactional` that just provides a + transactional storage instead. +- `get_with_prefix` returns `Option>` instead of + `StdResult>>`. +- `set_with_prefix` and `remove_with_prefix` return nothing instead of + `StdResult<()>`. +- `RepLog::commit` no longer returns any value (always succeeds). +- `Op::apply` no longer returns any value (always succeeds). + +**cosmwasm-vm** + +- The export `allocate` must not return 0 as a valid address. The contract is + responsible for avoiding this offset in the linear memory. +- The import `db_read` now allocates memory for the return value as part of the + call and returns a pointer to the value as `u32`. The return value 0 means + _key does not exist_. +- The import `db_next` now allocates a memory region for the return key and + value as part of the call and returns a pointer to the region as `u32`. The + data in the region is stored in the format `value || key || keylen`. As + before, an empty key means _no more value_. +- Remove `Instance::get_gas` in favour of `Instance::get_gas_left`. +- All calls from the VM layer to the chain layer also return the amount of gas + used on success. (This is represented by replacing the return value with + `(value, used_gas)`). Gas usage across the system is then tracked in the VM + layer, which allows us to halt the contract during an import, as soon as we + can prove that we used all allocated gas. +- Remove instance caching, which is disabled since 0.8.1 as it is not stable. + Remove `CosmCache::store_instance`; you can not call `Instance::recylce` + directly to get back the external dependencies. +- Rename `MockQuerier::with_staking` to `MockQuerier::update_staking` to match + `::update_balance`. +- Instead of panicking, `read_region`/`write_region`/`get_region`/`set_region` + now return a new `CommunicationError::DerefErr` when dereferencing a pointer + provided by the contract fails. +- `FfiError::set_message` was removed because errors should be immutable. Use + `FfiError::other` to create an error with the desired error message. +- The import implementation of `db_scan` now errors instead of returning an + error code for an invalid order value. The return type was changed to `u32`. +- Remove `StorageIteratorItem` in favour of the new types `StorageIterator` and + `NextItem`. `StorageIterator` is a custom iterator type that does not + implement Rust's `Iterator` trait, allowing it to communicate the used gas + value of the last `next` call to the VM. +- Don't report any `VmError` back to the contract in `canonicalize_address` and + `humanize_address`. Only invalid inputs should be reported. +- Move error cases `VmError::RegionLengthTooBig` and `VmError::RegionTooSmall` + into `CommunicationError`. +- In the `canonicalize_address` implementation, invalid UTF-8 inputs now result + in `CommunicationError::InvalidUtf8`, which is not reported back to the + contract. A standard library should ensure this never happens by correctly + encoding string input values. +- Merge trait `ReadonlyStorage` into `Storage`. +- The imports `canonicalize_address` and `humanize_address` now return a memory + address to an error `Region`. If this address is 0, the call succeeded. +- Bump `cosmwasm_vm_version_1` to `cosmwasm_vm_version_2`. + +## 0.8.1 (2020-06-08) + +**cosmwasm-std** + +- The arguments of `log` changed from `&str` to `ToString`, allowing to pass + various types like `String`, `HumanAddr`, `Uint128` or primitive integers + directly. +- Add `From>` and `Into>` implementations for `Binary` for + zero-copy conversions. + +**cosmwasm-vm** + +- Deprecated `Instance::get_gas` in favour of `Instance::get_gas_left`. The old + method will remain available for a while but will issue a deprecation warning + when used. +- Disable instance caching by treating every cache size as 0. Instance caching + is not safe as the same Wasm memory is reused across multiple executions. +- The storage of an `Instance` can now be set into readonly mode, which is + checked by the writing storage imports `db_write` and `db_remove`. Read-only + mode is off by default for backwards compatibility. `call_query_raw` now sets + the instance's storage to readonly. +- The new error case `VmError::WriteAccessDenied` is returned when a contract + calls an import that potentially writes to storage during a query. + +## 0.8.0 (2020-05-25) + +**all** + +- Upgrade schemars to 0.7. +- Upgrade wasmer to 0.17. +- Update snafu to 0.6. +- Minimal supported Rust version is 1.41. +- Split `Region.len` into `Region.capacity` and `Region.length`, where the new + capacity is the number of bytes available and `length` is the number of bytes + used. This is a breaking change in the contract-vm interface, which requires + the same memory layout of the `Region` struct on both sides. +- Add `remove` method to `Storage` trait. +- (feature-flagged) Add `range` method to `ReadonlyStorage` trait. This returns + an iterator that covers all or a subset of the items in the db ordered + ascending or descending by key. +- Add new feature flag `iterator` to both packages to enable `range` + functionality. This is used to allow potential porting to chains that use + Merkle Tries (which don't allow iterating over ranges). +- All serialized JSON types now use snake_case mappings for names. This means + enum fields like `ChangeOwner` will map to `change_owner` in the underlying + JSON, not `changeowner`. This is a breaking change for the clients. +- Public interface between contract and runtime no longer uses `String` to + represent an error, but rather serializes `ApiError` as a rich JSON error. +- Return value from `env.write_db` and `env.remove_db` to allow error reporting. +- Query responses are now required to contain valid JSON. +- Renamed all `*_db` wasm imports to `db_*` +- Merge `cw-storage` repo as subpackage, now `cosmwasm-storage` +- Add iterator support to `cosmwasm-storage` +- `Coin.amount` is now `Uint128` rather than `String`. Uint128 serializes as a + string in JSON, but parses into a u128 data in memory. It also has some + operator overloads to allow easy math operations on `Coin` types, as well as + enforcing valid amounts. +- `Env` no longer has a `contract.balance` element. If you need this info, + please use the `Querier` to get this info. As of Cosmos-SDK 0.39 this needs + extra storage queries to get the balance, so we only do those queries when + needed. +- `Env.message.sent_funds` is a `Vec` not `Option>`. We will + normalize the go response in `go-cosmwasm` before sending it to the contract. +- `Env.message.signer` was renamed to `Env.message.sender`. +- `Env.block.{height,time}` are now `u64` rather than `i64`. + +**cosmwasm-schema** + +- This new crate now contains the implementations for generating JSON Schema + files from interface types. It exposes the functions `export_schema`, + `export_schema_with_title`, and `schema_for`. + +**cosmwasm-std** + +- Make all symbols from `cosmwasm::memory` crate internal, as those symbols are + not needed by users of the library. +- Rename `cosmwasm::mock::dependencies` -> `cosmwasm::mock::mock_dependencies` + to differentiate between testing and production `External`. +- Export all symbols from `cosmwasm::mock` as the new non-wasm32 module + `cosmwasm::testing`. Export all remaining symbols at top level (e.g. + `use cosmwasm::traits::{Api, Storage};` + `use cosmwasm::encoding::Binary;` + becomes `use cosmwasm::{Api, Binary, Storage};`). +- Rename package `cosmwasm` to `cosmwasm-std`. +- The export `allocate` does not zero-fill the allocated memory anymore. +- Add `remove_db` to the required imports of a contract. +- (feature-flagged) add `scan_db` and `next_db` callbacks from wasm contract to + VM. +- `serde::{from_slice, to_vec}` return `cosmwasm_std::Result`, no more need to + use `.context(...)` when calling these functions +- Split `Response` into `InitResponse` and `HandleResponse`; split + `ContractResult` into `InitResult` and `HandleResult`. +- Create explicit `QueryResponse`, analogue to `InitResponse` and + `HandleResponse`. +- The exports `cosmwasm_vm_version_1`, `allocate` and `deallocate` are now + private and can only be called via the Wasm export. Make sure to `use` + `cosmwasm_std` at least once in the contract to pull in the C exports. +- Add `Querier` trait and `QueryRequest` for query callbacks from the contract, + along with `SystemError` type for the runtime rejecting messages. +- `QueryRequest` takes a generic `Custom(T)` type that is passed opaquely to the + end consumer (`wasmd` or integration test stubs), allowing custom queries to + native code. +- `{Init,Handle,Query}Result` are now just aliases for a concrete `ApiResult` + type. +- Support results up to 128 KiB in `ExternalStorage.get`. +- The `Storage` trait's `.get`, `.set` and `.remove` now return a `Result` to + allow propagation of errors. +- Move `transactional`, `transactional_deps`, `RepLog`, `StorageTransaction` + into crate `cosmwasm-storage`. +- Rename `Result` to `StdResult` to differentiate between the auto-`use`d + `core::result::Result`. Fix error argument to `Error`. +- Complete overhaul of `Error` into `StdError`: + - The `StdError` enum can now be serialized and deserialized (losing its + backtrace), which allows us to pass them over the Wasm/VM boundary. This + allows using fully structured errors in e.g. integration tests. + - Auto generated snafu error constructor structs like `NotFound`/`ParseErr`/… + have been intenalized in favour of error generation helpers like + `not_found`/`parse_err`/… + - All error generator functions now return errors instead of results. + - Error cases don't contain `source` fields anymore. Instead source errors are + converted to standard types like `String`. For this reason, both + `snafu::ResultExt` and `snafu::OptionExt` cannot be used anymore. + - Backtraces became optional. Use `RUST_BACKTRACE=1` to enable them. + - `Utf8Err`/`Utf8StringErr` merged into `StdError::InvalidUtf8` + - `Base64Err` renamed into `StdError::InvalidBase64` + - `ContractErr`/`DynContractErr` merged into `StdError::GeneralErr` + - The unused `ValidationErr` was removed + - `StdError` is now + [non_exhaustive](https://doc.rust-lang.org/1.35.0/unstable-book/language-features/non-exhaustive.html), + making new error cases non-breaking changes. +- `ExternalStorage.get` now returns an empty vector if a storage entry exists + but has an empty value. Before, this was normalized to `None`. +- Reorganize `CosmosMsg` enum types. They are now split by modules: + `CosmosMsg::Bank(BankMsg)`, `CosmosMsg::Custom(T)`, `CosmosMsg::Wasm(WasmMsg)` +- CosmosMsg is now generic over the content of `Custom` variant. This allows + blockchains to support custom native calls in their Cosmos-SDK apps and + developers to make use of them in CosmWasm apps without forking the + `cosmwasm-vm` and `go-cosmwasm` runtime. +- Add `staking` feature flag to expose new `StakingMsg` types under `CosmosMsg` + and new `StakingRequest` types under `QueryRequest`. +- Add support for mocking-out staking queries via `MockQuerier.with_staking` +- `from_slice`/`from_binary` now require result type to be `DeserializeOwned`, + i.e. the result must not contain references such as `&str`. + +**cosmwasm-vm** + +- Make `Instance.memory`/`.allocate`/`.deallocate`/`.func` crate internal. A + user of the VM must not access the instance's memory directly. +- The imports `env.canonicalize_address`, `env.humanize_address` and + `env.read_db` don't return the number of bytes written anymore. This value is + now available in the resulting regions. Negative return values are errors, 0 + is success and values greater than 0 are reserved for future use. +- Change the required interface version guard export from `cosmwasm_api_0_6` to + `cosmwasm_vm_version_1`. +- Provide implementations for `remove_db` and (feature-flagged) `scan_db` and + `next_db` +- Provide custom `serde::{from_slice, to_vec}` implementation separate from + `cosmwasm_std`, so we can return cosmwasm-vm specific `Result` (only used + internally). +- `call_{init,handle,query}` and the `cosmwasm_vm::testing` wrappers return + standard `Result` types now, eg. `Result`. +- Add length limit when reading memory from the instance to protect against + malicious contracts creating overly large `Region`s. +- Add `Instance.get_memory_size`, giving you the peak memory consumption of an + instance. +- Remove `cosmwasm_vm::errors::CacheExt`. +- Move `cosmwasm_vm::errors::{Error, Result}` to + `cosmwasm_vm::{VmError, VmResult}` and remove generic error type from result. +- The import `db_read` now returns an error code if the storage key does not + exist. The latest standard library converts this error code back to a `None` + value. This allows differentiating non-existent and empty storage entries. +- Make `Instance::from_module`, `::from_wasmer` and `::recycle` crate-internal. +- Create explicit, public `Checksum` type to identify Wasm blobs. +- `CosmCache::new` now takes supported features as an argument. +- Rename `VmError::RegionTooSmallErr` to `VmError::RegionTooSmall`. +- Rename `VmError::RegionLengthTooBigErr` to `VmError::RegionLengthTooBig`. +- Change property types to owned string in `VmError::UninitializedContextData`, + `VmError::ConversionErr`, `VmError::ParseErr` and `VmError::SerializeErr`. +- Remove `VmError::IoErr` in favour of `VmError::CacheErr`. +- Simplify `VmError::CompileErr`, `VmError::ResolveErr` and + `VmError::WasmerRuntimeErr` to just hold a string with the details instead of + the source error. +- Remove `VmError::WasmerErr` in favour of the new `VmError::InstantiationErr`. +- The snafu error builders from `VmError` are now private, i.e. callers can only + use the errors, not create them. +- `VmError` is now `#[non_exhaustive]`. +- Split `VmError::RuntimeErr` in `VmError::BackendErr` and + `VmError::GenericErr`; rename `VmError::WasmerRuntimeErr` to + `VmError::RuntimeErr`. +- Add `Instance.with_querier` analogue to `Instance.with_storage`. + +## 0.7.2 (2020-03-23) + +**cosmwasm** + +- Fix JSON schema type of `Binary` from int array (wrong) to string (right). +- Make `Extern` not `Clone`able anymore. Before cloning led to copying the data + for mock storage and copying a stateless bridge for the external storage, + which are different semantics. +- Remove public `cosmwasm::imports::dependencies`. A user of this library does + not need to call this explicitely. Dependencies are created internally and + passed as an argument in `exports::do_init`, `exports::do_handle` and + `exports::do_query`. +- Make `ExternalStorage` not `Clone`able anymore. This does not copy any data, + so a clone could lead to unexpected results. + +## 0.7.1 (2020-03-11) + +**cosmwasm_vm** + +- Avoid unnecessary panic when checking corrupted wasm file. +- Support saving the same wasm to cache multiple times. + +## 0.7.0 (2020-02-26) + +**cosmwasm** + +- Rename `Slice` to `Region` to simplify differentiation between Wasm memory + region and serde's `from_slice` +- Rename `Params` to `Env`, `mock_params` to `mock_env` for clearer naming (this + is information on the execution environment) +- `Response.log` is not a vector of key/value pairs that can later be indexed by + Tendermint. + +**cosmwasm_vm** + +- Remove export `cosmwasm_vm::read_memory`. Using this indicates an + architectural flaw, since this is a method for host to guest communication + inside the VM and not needed for users of the VM. +- Create new type `cosmwasm_vm:errors::Error::RegionTooSmallErr`. +- Change return type of `cosmwasm_vm::write_memory` to `Result` to + make it harder to forget handling errors. +- Fix missing error propagation in `do_canonical_address`, `do_human_address` + and `allocate`. +- Update error return codes in import `c_read`. +- Rename imports `c_read`/`c_write` to `read_db`/`write_db`. +- Rename imports `c_canonical_address`/`c_human_address` to + `canonicalize_address`/`humanize_address`. +- Add `cosmwasm_vm::testing::test_io` for basic memory allocation/deallocation + testing between host and guest. +- Make `ValidationErr.msg` a dynamic `String` including relevant runtime + information. +- Remove export `check_api_compatibility`. The VM will take care of calling it. +- Let `check_api_compatibility` check imports by fully qualified identifier + `.`. +- Make gas limit immutable in `cosmwasm_vm::instance::Instance`. It is passed + once at construction time and cannot publicly be manipulated anymore. +- Remove `take_storage`/`leave_storage` from `cosmwasm_vm::Instance`. + +## 0.6 + +[Define canonical address callbacks](https://github.com/confio/cosmwasm/issues/73) + +- Use `&[u8]` for addresses in params +- Allow contracts to resolve human readable addresses (`&str`) in their json + into a fixed-size binary representation +- Provide mocks for unit testing and integration tests + +- Separate out `Storage` from `ReadOnlyStorage` as separate traits + +## 0.5 + +### 0.5.2 + +This is the first documented and supported implementation. It contains the basic +feature set. `init` and `handle` supported for modules and can return messages. +A stub implementation of `query` is done, which is likely to be deprecated soon. +Some main points: + +- The build-system and unit/integration-test setup is all stabilized. +- Cosmwasm-vm supports singlepass and cranelift backends, and caches modules on + disk and instances in memory (lru cache). +- JSON Schema output works + +All future Changelog entries will reference this base + +[1.0.0-rc.0]: + https://github.com/CosmWasm/cosmwasm/compare/v1.0.0-beta8...v1.0.0-rc.0 +[1.0.0-beta8]: + https://github.com/CosmWasm/cosmwasm/compare/v1.0.0-beta7...v1.0.0-beta8 +[1.0.0-beta7]: + https://github.com/CosmWasm/cosmwasm/compare/v1.0.0-beta6...v1.0.0-beta7 +[1.0.0-beta6]: + https://github.com/CosmWasm/cosmwasm/compare/v1.0.0-beta5...v1.0.0-beta6 +[1.0.0-beta5]: + https://github.com/CosmWasm/cosmwasm/compare/v1.0.0-beta4...v1.0.0-beta5 +[1.0.0-beta4]: + https://github.com/CosmWasm/cosmwasm/compare/v1.0.0-beta3...v1.0.0-beta4 +[1.0.0-beta3]: + https://github.com/CosmWasm/cosmwasm/compare/v1.0.0-beta...v1.0.0-beta3 +[1.0.0-beta]: https://github.com/CosmWasm/cosmwasm/compare/v0.16.2...v1.0.0-beta +[0.16.2]: https://github.com/CosmWasm/cosmwasm/compare/v0.16.1...v0.16.2 +[0.16.1]: https://github.com/CosmWasm/cosmwasm/compare/v0.16.0...v0.16.1 +[0.16.0]: https://github.com/CosmWasm/cosmwasm/compare/v0.15.2...v0.16.0 +[0.15.2]: https://github.com/CosmWasm/cosmwasm/compare/v0.15.1...v0.15.2 +[0.15.1]: https://github.com/CosmWasm/cosmwasm/compare/v0.15.0...v0.15.1 +[0.15.0]: https://github.com/CosmWasm/cosmwasm/compare/v0.14.1...v0.15.0 +[0.14.1]: https://github.com/CosmWasm/cosmwasm/compare/v0.14.0...v0.14.1 +[0.14.0]: https://github.com/CosmWasm/cosmwasm/compare/v0.13.1...v0.14.0 +[0.13.2]: https://github.com/CosmWasm/cosmwasm/compare/v0.13.1...v0.13.2 +[0.13.1]: https://github.com/CosmWasm/cosmwasm/compare/v0.13.0...v0.13.1 +[0.13.0]: https://github.com/CosmWasm/cosmwasm/compare/v0.12.0...v0.13.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index 68ce49e7b4..c96fc7e148 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -538,1336 +538,10 @@ and this project adheres to [#1301]: https://github.com/CosmWasm/cosmwasm/pull/1301 [#1302]: https://github.com/CosmWasm/cosmwasm/pull/1302 -## [1.0.0-rc.0] - 2022-05-05 +--- -### Fixed - -- cosmwasm-std: Upgrade `serde-json-wasm` to 0.4.0 to fix u128/i128 - serialization of `to_vec`/`to_binary` in some cases ([#1297]). - -[#1297]: https://github.com/CosmWasm/cosmwasm/pull/1297 - -### Added - -- cosmwasm-std: Implement `checked_multiply_ratio` for - `Uint64`/`Uint128`/`Uint256` -- cosmwasm-std: Implement `checked_from_ratio` for `Decimal`/`Decimal256` -- cosmwasm-std: Implement `Div`/`DivAssign` for `Decimal`/`Decimal256`. -- cosmwasm-vm: Add feature `allow_interface_version_7` to run CosmWasm 0.16 - contracts in modern hosts. Be careful if you consider using this! - -### Changed - -- all: Updated Rust edition to 2021 -- cosmwasm-std: Rename `SubMsgExecutionResponse` to `SubMsgResponse`. -- cosmwasm-crypto: Update dependency `k256` to ^0.10.4. -- cosmwasm-vm: `BackendError` was changed to `non_exhaustive` for future - extension; `BackendError` now implements `PartialEq` for easier test code; the - `msg` in `BackendError::Unknown` became non-optional because it was always - set; the argument in `BackendError::unknown`/`::user_err` was change to - `impl Into` to avoid unnecessary clones. - -### Deprecated - -- cosmwasm-std: `SubMsgExecutionResponse` is deprecated in favor of the new - `SubMsgResponse`. - -### Removed - -- cosmwasm-std: Remove `Pair` which was previously deprecated. Use `Record` - instead. ([#1282]) - -[#1282]: https://github.com/CosmWasm/cosmwasm/issues/1282 - -## [1.0.0-beta8] - 2022-04-06 - -### Added - -- cosmwasm-std: Implement `MulAssign` for `Decimal`/`Decimal256`. -- cosmwasm-std: Implement `is_zero`/`atomics`/`decimal_places` as const for Uint - and Decimal types. -- cosmwasm-std: Implement `new` and `raw` const constructors for - `Decimal`/`Decimal256`. - -### Changed - -- all: Drop support for Rust versions lower than 1.56.1. -- cosmwasm-std: `MockQuerier` now supports adding custom behaviour for handling - Wasm queries via `MockQuerier::update_wasm` ([#1050]). - -[#1050]: https://github.com/CosmWasm/cosmwasm/pull/1050 - -### Fixed - -- cosmwasm-std: `Api::addr_validate` now requires inputs to be normalized. -- cosmwasm-vm: The `addr_validate` import now requires inputs to be normalized. - -## [1.0.0-beta7] - 2022-03-22 - -### Added - -- cosmwasm-std: Implement `Decimal{,256}::checked_mul` and - `Decimal{,256}::checked_pow`. -- cosmwasm-std: Implement `Sub`/`SubAssign` for `Uint64`. -- cosmwasm-std: Implement `Mul`/`MulAssign` for `Uint64`. -- cosmwasm-std: Implement `RemAssign` for - `Uint64`/`Uint128`/`Uint256`/`Uint512`. -- cosmwasm-std: Implement `pow`/`checked_pow` for `Uint64`/`Uint128`/`Uint512`. -- cosmwasm-std: Implement `SubAssign`/`AddAssign` for `Decimal`/`Decimal256`. -- cosmwasm-crypto: Upgrade ed25519-zebra to version 3. - -### Changed - -- cosmwasm-vm: Upgrade Wasmer to 2.2.1. - -## [1.0.0-beta6] - 2022-03-07 - -### Added - -- cosmwasm-std: Implement `ops::Rem` for `Uint{64,128,256,512}`. - -### Changed - -- cosmwasm-std: Change type of `Reply::result` from `ContractResult` to the new - `SubMsgResult`. Both types are equal when serialized but `ContractResult` is - documented to be the result of a contract execution, which is not the case - here. ([#1232]) -- cosmwasm-vm: Upgrade Wasmer to 2.2.0 and bump `MODULE_SERIALIZATION_VERSION` - to "v3-wasmer1". ([#1224]) - -[#1224]: https://github.com/CosmWasm/cosmwasm/pull/1224 -[#1232]: https://github.com/CosmWasm/cosmwasm/pull/1232 - -## [1.0.0-beta5] - 2022-02-08 - -### Changed - -- all: Drop support for Rust versions lower than 1.54.0. -- cosmwasm-std: The `Debug` implementation of `Binary` now produces a hex string - instead of a list of bytes ([#1199]). -- cosmwasm-std: Pin uint version to 0.9.1 in order to maintain a reasonably low - MSRV. -- cosmwasm-std: Add missing `Isqrt` export ([#1214]). - -[#1199]: https://github.com/CosmWasm/cosmwasm/issues/1199 -[#1214]: https://github.com/CosmWasm/cosmwasm/issues/1214 - -### Fixed - -- cosmwasm-vm: Fix `AddAssign` implementation of `GasInfo`. -- cosmwasm-vm: Bump `MODULE_SERIALIZATION_VERSION` to "v2" because the module - serialization format changed between Wasmer 2.0.0 and 2.1.x. - -## [1.0.0-beta4] - 2021-12-23 - -### Changed - -- cosmwasm-vm: `wasmer` version bumped `2.1.0 -> 2.1.1` - -### Fixed - -- cosmwasm-vm: Remove system-dependent stacktrace from `VmError::RuntimeErr` - (fixes CWA-2021-003). - -## [1.0.0-beta3] - -### Added - -- cosmwasm-std: New const methods `Uint64::to_be_bytes`/`::to_le_bytes`. -- cosmwasm-vm: The check_contracts tool now has a `--supported-features` option - that defaults to "iterator,staking,stargate". -- cosmwasm-vm: The default `singlepass` compiler is now supported on 64-bit - Windows. -- cosmwasm-std: Add missing `DivideByZeroError` export. -- cosmwasm-std: Implement `std::iter::Sum` for `Decimal` and `Decimal256`. - -### Changed - -- all: Drop support for Rust versions lower than 1.53.0. -- cosmwasm-std: The balance argument from `mock_dependencies` was removed. - Remove `&[]` if you don't need a contract balance or use the new - `mock_dependencies_with_balance` if you need a balance. -- cosmwasm-vm: Unlock cache mutex before module instantiation. -- cosmwasm-vm: `wasmer` version bumped `2.0.0 -> 2.1.0` - -### Removed - -- cosmwasm-std: Remove the macros `create_entry_points` and - `create_entry_points_with_migration` in favour of the new, more flexible entry - point system introduced in CosmWasm 0.14. - -## [1.0.0-beta] - 2021-10-11 - -### Added - -- cosmwasm-std: Add new `WasmQuery::ContractInfo` variant to get metadata about - the contract, like `code_id` and `admin`. -- cosmwasm-std: New field `Env::transaction` containing info of the transaction - the contract call was executed in. -- cosmwasm-std: Implement `ops::Mul` for `Decimal` and `Decimal256`. -- cosmwasm-std: New const methods `Uint128::to_be_bytes`/`::to_le_bytes`. -- cosmwasm-std: New const conversion methods `Uint256::from_uint128` and - `Uint512::from_uint256`. -- cosmwasm-std: New getters `Decimal{,256}::atomics()` and - `Decimal{,256}::decimal_places()`. -- cosmwasm-std: New constructors `Decimal{,256}::from_atomics`. -- cosmwasm-std: New `Uint128::checked_pow`. -- cosmwasm-std: New macros `ensure!`, `ensure_eq!` and `ensure_ne!` allow - requirement checking that return errors instead of panicking ([#1103]). - -[#1103]: https://github.com/CosmWasm/cosmwasm/issues/1103 - -### Changed - -- cosmwasm-std: Make `iterator` a required feature if the `iterator` feature - flag is set (enabled by default). -- cosmwasm-vm: Increase `MAX_LENGTH_HUMAN_ADDRESS` from 90 to 256 in order to - support longer address formats than bech32. -- cosmwasm-std: Make `CustomQuery` a subtrait of `Clone`, i.e. types that - implement `CustomQuery` need to be `Clone`able. -- cosmwasm-std: Add generic for custom query type to `QuerierWrapper`, `Deps`, - `DepsMut` and `OwnedDeps`. Merge `QuerierWrapper::custom_query` into the now - fully typed `QuerierWrapper::query`. -- cosmwasm-std: Add generic type `Q` for the custom query request type to - `do_instantiate`, `do_execute`, `do_migrate`, `do_sudo`, `do_reply`, - `do_query`, `ibc_channel_open`, `ibc_channel_connect`, `ibc_channel_close`, - `ibc_packet_receive`, `ibc_packet_ack` and `ibc_packet_timeout`. -- cosmwasm-std: In `Decimal` change `Fraction` to `Fraction`, - such that `Decimal::numerator` and `::denominator` now return `Uint128`. -- cosmwasm-std: Make methods `Uint256::to_be_bytes`/`::to_le_bytes` const. -- cosmwasm-std: Make methods `Uint512::to_be_bytes`/`::to_le_bytes` const. -- cosmwasm-std: Make method `Uint512::from_le_bytes` const. -- cosmwasm-std: Rename `Pair` to `Record`. `Pair` is now an alias for `Record` - and deprecated. ([#1108]) -- cosmwasm-vm: Bump required marker export `interface_version_7` to - `interface_version_8`. -- cosmwasm-vm: Increase cost per Wasm operation from 1 to 150_000 and adjust - crypto API gas cost based on the target of 1 Teragas per millisecond. -- cosmwasm-std: Deprecate the macros `create_entry_points` and - `create_entry_points_with_migration` in favour of the new, more flexible entry - point system introduced in CosmWasm 0.14. - -### Removed - -- cosmwasm-std: Remove `HumanAddr` (deprecated since 0.14). Use `String` - instead. -- cosmwasm-std: Remove `KV` (deprecated since 0.14). Use `Pair` instead. - -[#1108]: https://github.com/CosmWasm/cosmwasm/issues/1108 - -## [0.16.2] - 2021-09-07 - -### Added - -- cosmwasm-std: Implement `Mul` and `MulAssign` for `Uint128`. -- cosmwasm-std: Implement `FromStr` for `Uint128`, `Uint256`, and `Uint512`. -- cosmwasm-std: Make `Uint256::from_le_bytes`, `::from_be_bytes` and `::new` - const. -- cosmwasm-std: Added the `Decimal256` type with 18 decimal places. - -### Changed - -- cosmwasm-std: Implement `Decimal::from_ratio` using full uint128 - multiplication to support a wider range of input values. -- cosmwasm-std: `Decimal::from_ratio` now accepts any types that implement - `Into` rather than `Into`. -- cosmwasm-crypto: Update dependency `k256` to ^0.9.6. -- cosmwasm-std: Add enum cases `Shl` to `OverflowOperation` (breaking; [#1071]). - -[#1071]: https://github.com/CosmWasm/cosmwasm/pull/1071 - -### Fixed - -- cosmwasm-std: Fixed a bug where `Uint*` types wouldn't handle formatting - options when formatted with `std::fmt::Display`. - -## [0.16.1] - 2021-08-31 - -### Added - -- cosmwasm-std: Added `From` and `From<&Addr>` conversions for - `Cow`. -- cosmwasm-std: Added new `Uint256` and `Uint512` types. -- cosmwasm-std: Added implementations of `Isqrt` (integer square root) for - `Uint64`, `Uint128`, `Uint256`, and `Uint512`. -- cosmwasm-std: Exposed `Uint{64, 128, 256}::full_mul` for full multiplication - that cannot overflow. - -### Changed - -- cosmwasm-std: In `ExternalApi::addr_validate` and `::addr_canonicalize` do not - send too long inputs to VM to avoid terminating contract execution. Errors are - returned instead now. -- cosmwasm-std: Add enum cases `Shr` to `OverflowOperation` (breaking; [#1059]). - -[#1059]: https://github.com/CosmWasm/cosmwasm/pull/1059 - -## [0.16.0] - 2021-08-05 - -### Added - -- cosmwasm-std: Added the `IbcChannelOpenMsg`, `IbcChannelConnectMsg`, - `IbcChannelCloseMsg`, `IbcPacketReceiveMsg`, `IbcPacketAckMsg`, and - `IbcPacketTimeoutMsg` types for use with corresponding IBC entrypoints. -- cosmwasm-std::testing: New mocking helpers for IBC channel msg types: - `mock_ibc_channel_open_init`, `mock_ibc_channel_open_try`, - `mock_ibc_channel_connect_ack`, `mock_ibc_channel_connect_confirm`, - `mock_ibc_channel_close_init`, `mock_ibc_channel_close_confirm`. -- cosmwasm-std::testing: Added `mock_ibc_packet_timeout` since - `mock_ibc_packet_ack` is no longer usable for creating mock data for - `ibc_packet_timeout`. -- cosmwasm-std: New `Attribute::new` constructor that does the same thing as - `attr`. -- cosmwasm-std::testing: Added `mock_wasm_attr` when you really need to create - an `Attribute` with a key starting with `_` in test code. -- cosmwasm-std: Renamed `IBCAcknowledgementWithPacket` -> `IbcPacketAckMsg` to - remove an unneeded level of indirection. -- cosmwasm-std: Added `Event::add_attributes` for bulk adding attributes to an - `Event` struct. -- cosmwasm-std: Added `Addr::into_string` for explicit conversion - -### Changed - -- cosmwasm-vm: The `Checksum::to_hex` function signature was changed from - `to_hex(&self) -> String` to `to_hex(self) -> String`. -- cosmwasm-std: The `attr` function now accepts types that implement - `Into` rather than `ToString`. -- cosmwasm-std, cosmwasm-vm, cosmwasm-storage: The `iterator` feature is now - enabled by default. -- cosmwasm-std: Make `MockApi::canonical_length` private. -- cosmwasm-vm: Make `MockApi::canonical_length` private. -- cosmwasm-vm: Bump required marker export `interface_version_6` to - `interface_version_7`. -- cosmwasm-std, cosmwasm-vm: Entrypoints `ibc_channel_open`, - `ibc_channel_connect`, `ibc_channel_close`, `ibc_packet_receive`, - `ibc_packet_ack`, `ibc_packet_timeout` now each accept a corresponding `Msg` - value that wraps around channels, packets and acknowledgements. -- cosmwasm-std/cosmwasm-vm: Increase canonical address lengths up to 64 bytes. -- cosmwasm-std/cosmwasm-vm: In `MockApi`, increase max length of supported human - addresses from 24 bytes to 54 bytes by using a longer canonical - representation. This allows you to insert typical bech32 addresses in tests. - ([#995]) -- cosmwasm-std::testing: `mock_ibc_packet_recv` function now returns an - `IbcPacketReceiveMsg`, `mock_ibc_packet_ack` requires an acknowledgement to be - passed and returns an `IbcPacketAckMsg`. -- cosmwasm-std: `IbcBasicResponse` and `IbcReceiveResponse` now both support - custom events via the `events` field. -- cosmwasm-std: `attr` (and `Attribute::new`) will now panic in debug builds if - the attribute's key starts with an underscore. These names are reserved and - could cause problems further down the line. -- cosmwasm-std: `Response`, `IbcBasicResponse` and `IbcReceiveResponse` can no - longer be constructed using struct literals. Use constructors like - `Response::new` to construct empty structs and appropriate builder-style - methods to set fields (`response.add_message`, `response.set_data`, etc). -- cosmwasm-std: `Event`, `IbcChannel`, `IbcPacket`, `IbcAcknowledgement` have - been marked `non_exhaustive` (can't be constructed using a struct literal by - downstream code). -- cosmwasm-std: `Event::attr` has been renamed to `Event::add_attribute` for - consistency with other types like `Response`. -- cosmwasm-vm: `Instance::required_features` changed from a property to a getter - method. -- cosmwasm-vm: Add `required_features` field to `AnalysisReport` which is - returned by `Cache::analyze`. -- cosmwasm-vm: The VM now checks that exactly one `interface_version_*` marker - export is set. For `interface_version_5` and `interface_version_6` (CosmWasm - 0.14–0.15) more specific error messages were added. - -[#995]: https://github.com/CosmWasm/cosmwasm/pull/995 - -### Removed - -- cosmwasm-std::testing: `mock_ibc_channel` is now private. Use - `mock_ibc_channel_open`, `mock_ibc_channel_connect`, or - `mock_ibc_channel_close` instead. - -## [0.15.2] - 2021-07-21 - -### Fixed - -- cosmwasm-std: Export `VoteOption` as a top-level type. - -## [0.15.1] - 2021-07-20 - -### Fixed - -- cosmwasm-std: Export `GovMsg` as a top-level type of the crate. - -## [0.15.0] - 2021-06-24 - -### Added - -- cosmwasm-std: Implement `Sub` and `SubAssign` for `Uint128` -- cosmwasm-std: Implement custom events for contract execution results -- cosmwasm-std: Add `CosmosMsg::Gov` for voting on governance proposals. -- cosmwasm-storage: Implement `Storage` for `PrefixedStorage` and - `ReadonlyPrefixedStorage`. NOTE: Calling `set` or `remove` on - `ReadonlyPrefixedStorage` will panic! - -### Removed - -- cosmwasm-std: Make `Uint128` inner field private ([#905]) -- cosmwasm-std: Remove `Context` - deprecated in previous release -- cosmwasm-std: Remove `HandleResponse`, `InitResponse`, and `MigrateResponse` - - deprecated in previous release -- cosmwasm-crypto: Remove `ed25519::MESSAGE_MAX_LEN`, `ed25519::BATCH_MAX_LEN` - and message length verification as this should not be a concern of - `cosmwasm-crypto`. - -[#905]: https://github.com/CosmWasm/cosmwasm/issues/905 - -### Changed - -- cosmwasm-std: Rename the `send` function parameter to `funds` in `WasmMsg` for - consistency with the wasmd message types. -- cosmwasm-vm: Increase read limit of contract execution results from 100,000 - bytes to 64 MiB. JSON deserializers should have their own limit to protect - against large deserializations. -- cosmwasm-vm: Create `VmError::DeserializationLimitExceeded`; Add limit - argument to `from_slice`; Increase deserialization limit of contract execution - results from 100,000 bytes to 256 KiB. This probably only affects internal - testing as well as integration tests of smart contracts. -- cosmwasm-vm: More accurate error messages for op codes related to bulk memory - operations, reference types, SIMD and the Threads extension. -- cosmwasm-vm: Update `wasmer` to `2.0.0` -- cosmwasm-vm: ED25519 message length and batch length limits are now hardcoded - in `cosmwasm-vm` itself instead of being imported from `cosmwasm-crypto`. -- cosmwasm-vm: Filesystem storage layout now distinguishes clearly between state - and cache. -- cosmwasm-std: Add enum case `ReplyOn::Never`; Remove default implementation of - `ReplyOn` as there is no natural default case anymore ([#961]). -- cosmwasm-std: Merge `messages` and `submessages` into one list, using - `ReplyOn::Never` to model the "fire and forget" semantics ([#961]). -- cosmwasm-std: Add `SubMsg` constructors: `::new()`, `::reply_on_error()`, - `::reply_on_success()`, `::reply_always()`; Add `with_gas_limit` to add a gas - limit to any those constructors ([#961]). -- cosmwasm-std: Change `Event`'s constructor - it no longer takes a vector of - attributes and instead constructs an empty one -- cosmwasm-std: Rename `Event.kind` to `Event.ty`. -- cosmwasm-std: Rename `SubcallResponse` to `SubMsgExecutionResponse`. -- contracts: Rename `ReflectSubCall` to `ReflectSubMsg` and `SubCallResult` to - `SubCallMsg` in the `reflect` contract. -- cosmwasm-std: Rename the `subcall` module to `submessages`. -- cosmwasm-vm: Bump required marker export `cosmwasm_vm_version_5` to - `interface_version_6`. -- cosmwasm-std: `IbcAcknowledgement` is renamed to - `IbcAcknowledgementWithPacket` as it contains both data elements. ([#975]) -- cosmwasm-std: `IbcAcknowledgementWithPacket.acknowledgement` is no longer - simply `Binary`, but a new `IbcAcknowledgement` structure, which contains one - field - `data: Binary`. This change was made to allow us to handle future - changes to IBC in a non-contract-breaking way. ([#975]) - -[#961]: https://github.com/CosmWasm/cosmwasm/pull/961 -[#975]: https://github.com/CosmWasm/cosmwasm/pull/975 - -### Fixed - -- comswasm-vm: Whitelisted the `i64.extend32_s` operation. - -## [0.14.1] - 2021-06-14 - -### Added - -- cosmwasm-std: Add `Timestamp::minus_seconds` and `::minus_nanos`. -- cosmwasm-std: Add `Addr::as_bytes` -- cosmwasm-std: Implement `std::ops::Sub` for `math::Decimal` -- cosmwasm-std: Add `Timestamp::seconds` and `Timestamp::subsec_nanos`. -- cosmwasm-std: Implement division for `Decimal / Uint128` -- cosmwasm-std: Add `math::Decimal::sqrt` - -### Fixed - -- cosmwasm-std: Fix `Uint64::multiply_ratio` and `Uint128::multiply_ratio` so - that internal multiplication cannot cause an unnecessary overflow. ([#920]) - -[#920]: https://github.com/CosmWasm/cosmwasm/issues/920 - -## [0.14.0] - 2021-05-03 - -### Added - -- cosmwasm-crypto: Add `ed25519_batch_verify`, EdDSA ed25519 batch signature - verification scheme for Tendermint signatures and public keys formats. - ([#788]) -- cosmwasm-crypto: Add `ed25519_verify`, EdDSA ed25519 signature verification - scheme for Tendermint signature and public key formats. ([#771]) -- cosmwasm-crypto: New crypto-related crate. Add `secp256k1_verify`, ECDSA - secp256k1 signature verification scheme for Cosmos signature and public key - formats. ([#780]) -- cosmwasm-vm: Add PinnedMemoryCache. ([#696]) -- cosmwasm-vm: The new `Cache::analyze` provides a static analyzis of the Wasm - bytecode. This is used to tell the caller if the contract exposes IBC entry - points. ([#736]) -- cosmwasm-vm: Added new `stargate` feature flag to enable new stargate and ibc - features ([#692], [#716]) -- cosmwasm-vm: (requires `stargate`) call into 6 new ibc entry points if exposed - by contract ([#692], [#716]) -- cosmwasm-std: Added new `stargate` feature flag to enable new stargate and ibc - features ([#692], [#706]) -- cosmwasm-std: (requires `stargate`) Added new `CosmosMsg::Stargate` message - type to dispatch protobuf-encoded message (contract must know proto schema) - ([#706]) -- cosmwasm-std: (requires `stargate`) Added new `QueryRequest::Stargate` message - type to dispatch protobuf-encoded queries (contract must know proto schema for - request and response) ([#706]) -- cosmwasm-std: (requires `stargate`) Added new `CosmosMsg::Ibc(IbcMsg)` message - type to use ibctransfer app or send raw ics packets (if contract has ibc entry - points) ([#692], [#710]) -- cosmwasm-std: Add mutable helper methods to `InitResponse`, `MigrateResponse` - and `HandleResponse` which make `Context` obsolete. -- contracts: added new `ibc-reflect` contract that receives channels and assigns - each an account to redispatch. Similar idea to ICS27/Interchain Accounts (but - different implementation) ([#692], [#711], [#714]) -- cosmwasm-std: Added new `WasmMsg::Migrate` variant that allows one contract - (eg. multisig) be the admin and migrate another contract ([#768]) -- cosmwasm-std: Added optional `system` entry point that can only be called by - native (blockchain) modules to expose admin functionality if desired. ([#793]) -- cosmwasm-std: Add extra field `submessages` to `Response`, such that you can - get a callback from these messages after their execution (success or failure). - ([#796]) -- cosmwasm-std: Added `reply` entry point that will receive all callbacks from - submessages dispatched by this contract. This is only required if contract - returns "submessages" (above). ([#796]) -- cosmwasm-std: Implement `From for String`, `From for u128` - as well as `From for Uint128`. -- cosmwasm-std: Create new address type `Addr`. This is human readable (like - `HumanAddr`) but is immutable and always contains a valid address ([#802]). -- cosmwasm-vm: Add import `addr_validate` ([#802]). -- cosmwasm-std: Add `BankMsg::Burn` variant when you want the tokens to - disappear ([#860]) -- cosmwasm-std: Create `Fraction` trait to represent a fraction `p`/`q` with - integers `p` and `q`. `Decimal` now implements `Fraction`, which - provides public getters `::numerator()` and `::denominator()`. -- cosmwasm-std: Add `Decimal::inv` that returns `1/d` for decimal `d`. -- cosmwasm-vm: Add `Cache::metrics` to expose internal data for monitoring - purposes ([#763]). -- cosmwasm-std: Implement `PartialOrd` and `Ord` for `Binary` using the same - lexicographical ordering as implemented by `Vec`. -- cosmwasm-std: Implement `PartialOrd` and `Ord` for `Addr` using the same - lexicographical ordering as implemented by `String`. -- cosmwasm-std: Added new `WasmMsg::UpdateAdmin` variant that allows an admin - contract (eg. multisig) to set another admin ([#900]) -- cosmwasm-std: Added new `WasmMsg::ClearAdmin` variant that allows an admin - contract (eg. multisig) to clear the admin, to prevent future migrations - ([#900]) -- cosmwasm-std: Implement `Display for Coin` ([#901]). -- cosmwasm-std: Create `Uint64` analogously to `Uint128` with string - serialization allowing the use of the full uint64 range in JSON clients that - use float numbers, such as JavaScript and jq. -- cosmwasm-std: Create const functions `Uint64::new` and `Uint128::new` to - create instances in a const context. - -[#692]: https://github.com/CosmWasm/cosmwasm/issues/692 -[#706]: https://github.com/CosmWasm/cosmwasm/pull/706 -[#710]: https://github.com/CosmWasm/cosmwasm/pull/710 -[#711]: https://github.com/CosmWasm/cosmwasm/pull/711 -[#714]: https://github.com/CosmWasm/cosmwasm/pull/714 -[#716]: https://github.com/CosmWasm/cosmwasm/pull/716 -[#763]: https://github.com/CosmWasm/cosmwasm/issues/763 -[#768]: https://github.com/CosmWasm/cosmwasm/pull/768 -[#793]: https://github.com/CosmWasm/cosmwasm/pull/793 -[#796]: https://github.com/CosmWasm/cosmwasm/pull/796 -[#802]: https://github.com/CosmWasm/cosmwasm/pull/802 -[#860]: https://github.com/CosmWasm/cosmwasm/pull/860 -[#900]: https://github.com/CosmWasm/cosmwasm/pull/900 -[#901]: https://github.com/CosmWasm/cosmwasm/pull/901 - -### Changed - -- contracts: Rename `HandleMsg` to `ExecuteMsg`. -- all: Rename `handle` entry point to `execute`. -- all: Rename `init` entry point to `instantiate`. -- all: Rename `system` entry point to `sudo`. -- all: Drop support for Rust versions lower than 1.51.0. -- all: The `query` and `execute` entry points are now optional. It is still - highly recommended to implement and expose them in almost any use case though. -- all: Change the encoding of the key/value region of the `db_next` import to a - more generic encoding that supports an arbitrary number of sections. This - encoding can then be reused for other multi value regions. -- all: Remove the `info: MessageInfo` argument from the `migrate` entry point - ([#690]). -- cosmwasm-std: Remove `from_address` from `BankMsg::Send`, as it always sends - from the contract address, and this is consistent with other `CosmosMsg` - variants. -- cosmwasm-std: Remove the previously deprecated `InitResult`, `HandleResult`, - `MigrateResult` and `QueryResult` in order to make error type explicit and - encourage migration to custom errors. -- cosmwasm-std: Add a `data` field to `InitResponse` the same way as in - `MigrateResponse` and `HandleResponse`. -- cosmwasm-std: Rename `MessageInfo::sent_funds` to `MessageInfo::funds`. -- cosmwasm-std: Merge response types `InitResponse`, `HandleResponse` and - `MigrateResponse` into the new `Response`. -- cosmwasm-std: Remove `Default` implementation from `HumanAddr`, - `CanonicalAddr`, `ContractInfo`, `MessageInfo`, `BlockInfo` and `Env`. If you - need one of those, you're probably doing something wrong. -- cosmwasm-std: Make `label` in `WasmMsg::Instantiate` non-optional to better - match the Go/database format. -- cosmwasm-std: Add new field `admin` to `WasmMsg::Instantiate` to fully support - `MsgInstantiateContract` from `x/wasm` ([#861]). -- cosmwasm-std: `Binary::to_array` is now generic over the array length instead - of the output type. As a consequence the obsolete type `ByteArray` was - removed. The array length is not restricted to 0-64 anymore. -- cosmwasm-std: Use const generics to implement `From<&[u8; LENGTH]> for Binary` - and `From<[u8; LENGTH]> for Binary`, such that the array length is not - restricted to 0-64 anymore. -- cosmwasm-vm: Avoid serialization of Modules in `InMemoryCache`, for - performance. Also, remove `memory_limit` from `InstanceOptions`, and define it - instead at `Cache` level (same memory limit for all cached instances). - ([#697]) -- cosmwasm-std: Rename type `KV` to `Pair` in order to comply to naming - convention as enforced by clippy rule `upper_case_acronyms` from Rust 1.51.0 - on. -- cosmwasm-std: `ContractInfo::address` and `MessageInfo::sender` are now of - type `Addr`. The value of those fields is created by the host and thus valid. -- cosmwasm-vm: Bump required marker export `cosmwasm_vm_version_4` to - `interface_version_5`. -- cosmwasm-vm: Rename trait `Api` to `BackendApi` to better express this is the - API provided by the VM's backend (i.e. the blockchain). -- cosmwasm-vm: Rename imports to `addr_canonicalize` and `addr_humanize` - ([#802]). -- cosmwasm-vm: Replace types `HumanAddr`/`CanonicalAddr` with - `&str`/`String`/`&[u8]`/`Vec` in the methods of `BackendApi`. The address - types belong in the contract development and the backend operates on raw - strings and binary anyways. -- contracts: `reflect` contract requires `stargate` feature and supports - redispatching `Stargate` and `IbcMsg::Transfer` messages ([#692]) -- cosmwasm-std: The arithmetic methods of `Uint128` got a huge overhaul, making - them more consistent with the behaviour of the Rust primitive types. Thank you - [@yihuang] for bringing this up and for the great implementation. ([#853]) - 1. `Uint128` got the new functions `checked_add`, `checked_sub`, - `checked_mul`, `checked_div`, `checked_div_euclid`, `checked_rem`, - `wrapping_add`, `wrapping_sub`, `wrapping_mul`, `wrapping_pow`, - `saturating_add`, `saturating_sub`, `saturating_mul` and `saturating_pow` - which match their equivalent in [u128] except that instead of `Option` the - checked methods return a `Result` with an `OverflowError` or - `DivideByZeroError` that carries a few debug information and can directly - be converted to `StdError`/`StdResult` by using the `?` operator. - 2. `StdError::Underflow` and `StdError::underflow` were removed in favour of - `StdError::Overflow`. `StdError::DivideByZeroError` was added. - 3. The `-` operator (`impl ops::Sub for Uint128`) was removed - because it returned a `StdResult` instead of panicking in the case of an - overflow. This behaviour was inconsistent with `+` and the Rust standard - library. Please use the explicit `*_sub` methods introduced above. In a - couple of releases from now, we want to introduce the operator again with - panicking overflow behaviour ([#858]). -- cosmwasm-std: Replace `HumanAddr` with `String` in `BankQuery`, `StakingQuery` - and `WasmQuery` query requests ([#802]). -- cosmwasm-std: In staking query response types `Delegation`, `FullDelegation` - and `Validator` the validator address fields were changed from `HumanAddr` to - `String`. The new `Addr` type cannot be used here because it only supports - standard account addresses via `Api::addr_*` ([#871]). -- cosmwasm-std: Change address types in `BankMsg`, `IbcMsg` and `WasmMsg` from - `HumanAddr` to `String` ([#802]). -- cosmwasm-std: `Api::addr_humanize` now returns `Addr` instead of `HumanAddr` - ([#802]). -- cosmwasm-std: Hide `StakingMsg`, `CosmosMsg::Staking`, - `AllDelegationsResponse`, `BondedDenomResponse`, `Delegation`, - `FullDelegation`, `StakingQuery`, `Validator`, `ValidatorsResponse` and - `testing::StakingQuerier` behind the `staking` feature flag to make those only - available in contracts built for PoS chains. -- cosmwasm-std: Remove `StakingMsg::Withdraw` in favour of - `DistributionMsg::SetWithdrawAddress` and - `DistributionMsg::WithdrawDelegatorReward` ([#848]). -- cosmwasm-std: Rename `StakingQuery::Validators`, `ValidatorsResponse` and - `QuerierWrapper::query_validators` to `StakingQuery::AllValidators`, - `AllValidatorsResponse` and `QuerierWrapper.query_all_validators`. Add - `StakingQuery::Validator`, `ValidatorResponse` and - `QuerierWrapper::query_validator` to allow querying a single validator. - ([#879]) -- cosmwasm-schema: Make first argument non-mutable in `export_schema_with_title` - for consistency with `export_schema`. -- cosmwasm-std: The block time in `BlockInfo::time` is now a `Timestamp`. - `BlockInfo::time_nanos` was removed. - -[#696]: https://github.com/CosmWasm/cosmwasm/issues/696 -[#697]: https://github.com/CosmWasm/cosmwasm/issues/697 -[#736]: https://github.com/CosmWasm/cosmwasm/pull/736 -[#690]: https://github.com/CosmWasm/cosmwasm/issues/690 -[@yihuang]: https://github.com/yihuang -[#853]: https://github.com/CosmWasm/cosmwasm/pull/853 -[#858]: https://github.com/CosmWasm/cosmwasm/issues/858 -[u128]: https://doc.rust-lang.org/std/primitive.u128.html -[#802]: https://github.com/CosmWasm/cosmwasm/pull/802 -[#871]: https://github.com/CosmWasm/cosmwasm/issues/871 -[#861]: https://github.com/CosmWasm/cosmwasm/issues/861 -[#848]: https://github.com/CosmWasm/cosmwasm/issues/848 -[#879]: https://github.com/CosmWasm/cosmwasm/pull/879 - -### Deprecated - -- cosmwasm-std: `InitResponse`, `MigrateResponse` and `HandleResponse` are - deprecated in favour of the new `Response`. -- cosmwasm-std: `Context` is deprecated in favour of the new mutable helpers in - `Response`. -- cosmwasm-std: `HumanAddr` is not much more than an alias to `String` and it - does not provide significant safety advantages. With CosmWasm 0.14, we now use - `String` when there was `HumanAddr` before. There is also the new `Addr`, - which holds a validated immutable human readable address. ([#802]) - -[#802]: https://github.com/CosmWasm/cosmwasm/pull/802 - -## [0.13.2] - 2021-01-14 - -## Changed - -- cosmwasm-vm: Update Wasmer to 1.0.1. - -## [0.13.1] - 2021-01-12 - -### Added - -- cosmwasm-std: Add the new `#[entry_point]` macro attribute that serves as an - alternative implementation to `cosmwasm_std::create_entry_points!(contract)` - and `cosmwasm_std::create_entry_points_with_migration!(contract)`. Both ways - are supported in the 0.13 series. - -## [0.13.0] – 2021-01-06 - -## Added - -- cosmwasm-std: Extend binary to array support to 64 bytes. - -## Changed - -- all: Drop support for Rust versions lower than 1.47.0. -- cosmwasm-std: Remove `cosmwasm_std::testing::MockApi::new`. Use - `MockApi::default` instead. -- cosmwasm-vm: Upgrade Wasmer to 1.0 and adapt all the internal workings - accordingly. -- cosmwasm-vm: Export method `cosmwasm_vm::Cache::stats` and response type - `Stats`. -- cosmwasm-vm: Remove `cosmwasm_vm::testing::MockApi::new`. Use - `MockApi::default` instead. -- cosmwasm-vm: Convert field `Instance::api` to a method. -- cosmwasm-vm: Change order of generic arguments for consistency in `Instance`, - `Cache` and `Backend` to always match ``. -- cosmwasm-vm: Remove `Instance::get_memory_size`. Use `Instance::memory_pages` - instead. - -## 0.12.2 (2020-12-14) - -**cosmwasm-std** - -- `StdError` now implements `PartialEq` (ignoring backtrace if any). This allows - simpler `assert_eq!()` when testing error conditions (rather than match - statements as now). - -## 0.12.1 (2020-12-09) - -**cosmwasm-std** - -- Deprecate `InitResult`, `HandleResult`, `MigrateResult` and `QueryResult` in - order to make error type explicit and encourage migration to custom errors. -- Implement `Deref` for `QuerierWrapper`, such that `QuerierWrapper` behaves - like a smart pointer to `Querier` allowing you to access `Querier` methods - directly. - -## 0.12.0 (2020-11-19) - -**cosmwasm-std** - -- Remove the previously deprecated `StdError::Unauthorized`. Contract specific - errors should be implemented using custom error types now (see - [migration guide](./MIGRATING.md) 0.10 -> 0.11). -- Use dependency `thiserror` instead of `snafu` to implement `StdError`. Along - with this change, the `backtraces` feature now requires Rust nightly. -- Rename `StdError::ParseErr::source` to `StdError::ParseErr::source_type` and - `StdError::SerializeErr::target` to `StdError::SerializeErr::target_type` to - work around speacial treatment of the field name `source` in thiserror. -- Rename `Extern` to `Deps` to unify naming. -- Simplify ownership of calling `handle`, etc. with `Deps` and `DepsMut` struct - that just contains references (`DepsMut` has `&mut Storage` otherwise the - same) -- Remove unused `Deps::change_querier`. If you need this or similar - functionality, create a new struct with the right querier. -- Remove `ReadonlyStorage`. You can just use `Storage` everywhere. And use - `&Storage` to provide readonly access. This was only needed to let - `PrefixedStorage`/`ReadonlyPrefixedStorage` implement the common interface, - which is something we don't need. - -**cosmwasm-storage** - -- `PrefixedStorage`/`ReadonlyPrefixedStorage` do not implement the - `Storage`/`ReadonlyStorage` traits anymore. If you need nested prefixes, you - need to construct them directly via `PrefixedStorage::multilevel` and - `ReadonlyPrefixedStorage::multilevel`. -- Remove unused `TypedStorage`. If you need this or similar functionality, you - probably want to use `Bucket` or `Singleton`. If you really need it, please - copy the v0.11 code into your project. -- Remove `StorageTransaction` along with `transactional` and `RepLog`. This has - not been used actively for contract development and is now maintained in a - contract testing framework. - -**cosmwasm-vm** - -- Remove `Storage::range` and `StorageIterator`. The storage implementation is - now responsible for maintaining iterators internally and make them accessible - via the new `Storage::scan` and `Storage::next` methods. -- Add `FfiError::IteratorDoesNotExist`. Looking at this, `FfiError` should - probably be renamed to something that includes before, on and behind the FFI - boundary to Go. -- `MockStorage` now implements the new `Storage` trait and has an additional - `MockStorage::all` for getting all elements of an iterator in tests. -- Remove unused `Extern::change_querier`. If you need this or similar - functionality, create a new struct with the right querier. -- Let `Instance::from_code` and `CosmCache::get_instance` take options as an - `InstanceOptions` struct. This contains `gas_limit` and `print_debug` for now - and can easily be extended. `cosmwasm_vm::testing::mock_instance_options` can - be used for creating such a struct in integration tests. -- Make `FileSystemCache` crate internal. This should be used via `CosmCache`. -- Fix return type of `FileSystemCache::load` to `VmResult>` in - order to differentiate missing files from errors. -- Add in-memory caching for recently used Wasm modules. -- Rename `CosmCache` to just `cosmwasm_vm::Cache` and add `CacheOptions` to - configure it. -- Rename `Extern` to `Backend`. -- Rename `mock_dependencies` to `mock_backend` and - `mock_dependencies_with_balances` to `mock_backend_with_balances`. -- Rename `FfiError`/`FfiResult` to `BackendError`/`BackendResult` and adapt - `VmError` accordingly. - -## 0.11.2 (2020-10-26) - -**cosmwasm-std** - -- Implement `From` and `From` - for `StdError`. -- Generalize denom argument from `&str` to `S: Into` in `coin`, `coins` - and `Coin::new`. -- Implement `PartialEq` between `Binary` and `Vec`/`&[u8]`. -- Add missing `PartialEq` implementations between `HumanAddr` and `str`/`&str`. -- Add `Binary::to_array`, which allows you to copy binary content into a - fixed-length `u8` array. This is especially useful for creating integers from - binary data. - -## 0.11.1 (2020-10-12) - -**cosmwasm-std** - -- Implement `Hash` and `Eq` for `Binary` to allow using `Binary` in `HashSet` - and `HashMap`. -- Implement `Hash` and `Eq` for `CanonicalAddr` to allow using `CanonicalAddr` - in `HashSet` and `HashMap`. -- Implement `Add`, `AddAssign` and `Sub` with references on the right hand side - for `Uint128`. -- Implement `Sum` and `Sum<&'a Uint128>` for `Uint128`. - -## 0.11.0 (2020-10-08) - -**all** - -- Drop support for Rust versions lower than 1.45.2. -- The serialization of the result from `init`/`migrate`/`handle`/`query` changed - in an incompatible way. See the new `ContractResult` and `SystemResult` types - and their documentation. -- Pass `Env` into `query` as well. As this doesn't have `MessageInfo`, we - removed `MessageInfo` from `Env` and pass that as a separate argument to - `init`, `handle`, and `query`. See the example - [type definitions in the README](README.md#implementing-the-smart-contract) to - see how to update your contract exports (just add one extra arg each). - -**cosmwasm-std** - -- Add `time_nanos` to `BlockInfo` allowing access to high precision block times. -- Change `FullDelegation::accumulated_rewards` from `Coin` to `Vec`. -- Rename `InitResponse::log`, `MigrateResponse::log` and `HandleResponse::log` - to `InitResponse::attributes`, `MigrateResponse::attributes` and - `HandleResponse::attributes`. -- Rename `LogAttribute` to `Attribute`. -- Rename `log` to `attr`. -- Rename `Context::add_log` to `Context::add_attribute`. -- Add `Api::debug` for emitting debug messages during development. -- Fix error type for response parsing errors in `ExternalQuerier::raw_query`. - This was `Ok(Err(StdError::ParseErr))` instead of - `Err(SystemError::InvalidResponse)`, implying an error created in the target - contract. -- Deprecate `StdError::Unauthorized` and `StdError::unauthorized` in favour of - custom errors. From now on `StdError` should only be created by the standard - library and should only contain cases the standard library needs. -- Let `impl Display for CanonicalAddr` use upper case hex instead of base64. - This also affects `CanonicalAddr::to_string`. -- Create trait `CustomQuery` for the generic argument in - `QueryRequest`. This allows us to provide - `impl From for QueryRequest` for any custom query. -- Implement `From for Vec`. -- Implement `From for Vec`. -- Add `Binary::into_vec` and `CanonicalAddr::into_vec`. -- The `canonical_length` argument was removed from `mock_dependencies`, - `mock_dependencies_with_balances`. In the now deprecated `MockApi::new`, the - argument is unused. Contracts should not need to set this value and usually - should not make assumptions about the value. -- The canonical address encoding in `MockApi::canonical_address` and - `MockApi::human_address` was changed to an unpredictable representation of - non-standard length that aims to destroy most of the input structure. - -**cosmwasm-storage** - -- Change order of arguments such that `storage` is always first followed by - namespace in `Bucket::new`, `Bucket::multilevel`, `ReadonlyBucket::new`, - `ReadonlyBucket::multilevel`, `bucket` and `bucket_read`. -- Change order of arguments such that `storage` is always first followed by - namespace in `PrefixedStorage::new`, `PrefixedStorage::multilevel`, - `ReadonlyPrefixedStorage::new`, `ReadonlyPrefixedStorage::multilevel`, - `prefixed` and `prefixed_read`. - -**cosmwasm-vm** - -- `CosmCache::new`, `Instance::from_code` and `Instance::from_module` now take - an additional argument to enable/disable printing debug logs from contracts. -- Bump required export `cosmwasm_vm_version_3` to `cosmwasm_vm_version_4`. -- The `canonical_length` argument was removed from `mock_dependencies`, - `mock_dependencies_with_balances` and `MockApi::new_failing`. In the now - deprecated `MockApi::new`, the argument is unused. Contracts should not need - to set this value and usually should not make assumptions about the value. -- The canonical address encoding in `MockApi::canonical_address` and - `MockApi::human_address` was changed to an unpredictable representation of - non-standard length that aims to destroy most of the input structure. - -## 0.10.1 (2020-08-25) - -**cosmwasm-std** - -- Fix bug where `ExternalStorage.range()` would cause VM error if either lower - or upper bound was set - ([#508](https://github.com/CosmWasm/cosmwasm/issues/508)) - -## 0.10.0 (2020-07-30) - -**all** - -- Drop support for Rust versions lower than 1.44.1. - -**cosmwasm-std** - -- Remove error helpers `generic_err`, `invalid_base64`, `invalid_utf8`, - `not_found`, `parse_err`, `serialize_err`, `underflow`, `unauthorized` in - favour of `StdError::generic_err` and friends. -- Implement `From<&[u8; $N]> for Binary` and `From<[u8; $N]> for Binary` for all - `$N <= 32`. -- Add `Context` object that can be used to build Init/Handle/Migrate response - via `add_log`, `add_message`, `set_data` and then convert to the proper type - via `into` or `try_into`. Option to simplify response construction. -- Env uses `HumanAddr` for `message.sender` and `contract_address` -- Remove `Api` argument from `mock_env` -- Implement `From<&[u8]>` and `From>` for `CanonicalAddr` - -**cosmwasm-vm** - -- Remove unused cache size argument from `CosmCache`. -- `set_gas_limit` now panics if the given gas limit exceeds the max. supported - value. -- Increase the max. supported value for gas limit from 10_000_000_000 to - 0x7FFFFFFFFFFFFFFF. -- Add checks to `get_region` for failing early when the contract sends a Region - pointer to the VM that is not backed by a plausible Region. This helps - development of standard libraries. -- Create dedicated `RegionValidationError` and `RegionValidationResult`. -- `Api::human_address` and `Api::canonical_address` now return a pair of return - data and gas usage. -- Remove `NextItem` in favour of a more advanced `FfiResult`, which is used - to store the return result and the gas information consistently across all - APIs. `FfiResult` was changed to `(Result, GasInfo)`. -- Create error type `FfiError::InvalidUtf8` for the cases where the backend - sends invalid UTF-8 in places that expect strings. -- Remove `FfiError::Other` in favour of `FfiError::UserErr` and - `FfiError::Unknown`. -- The `canonicalize_address` and `humanize_address` imports now report user - errors to the contract. -- Bump `cosmwasm_vm_version_2` to `cosmwasm_vm_version_3`. -- `Querier::raw_query` and `QuerierResult` were removed in favour of the new - `Querier::query_raw`, which includes a gas limit parameter for the query. - -## 0.9.4 (2020-07-16) - -**cosmwasm-vm** - -- Add `Instance::create_gas_report` returning a gas report including the - original limit, the remaining gas and the internally/externally used gas. - -## 0.9.3 (2020-07-08) - -**cosmwasm-storage** - -- Add `.remove()` method to `Bucket` and `Singleton`. - -## 0.9.2 (2020-06-29) - -- Downgrade wasmer to 0.17.0. - -## 0.9.1 (2020-06-25) - -**cosmwasm-std** - -- Replace type `Never` with `Empty` because enums with no cases cannot be - expressed in valid JSON Schema. - -## 0.9.0 (2020-06-25) - -Note: this version contains an API bug and should not be used (see -https://github.com/CosmWasm/cosmwasm/issues/451). - -**all** - -- Upgrade wasmer to 0.17.1. -- Drop support for Rust versions lower than 1.43.1 - -**cosmwasm-std** - -- `ReadonlyStorage::get` and all its implementations now return - `Option>`. -- `ReadonlyStorage::range` and all its implementations now always succeed and - return an iterator instead of a result. This is now an iterator over - `Option` instead of `Option>`. -- `Storage::{set, remove}` and all their implementations no longer have a return - value. Previously they returned `StdResult<()>`. -- Trait `Querier` is not `Clone` and `Send` anymore. -- `consume_region` panics on null pointers and returns `Vec` instead of - `StdResult>`. -- Added contract migration mechanism. Contracts can now optionally export a - `migrate` function with the following definition: - ```rust - extern "C" fn migrate(env_ptr: u32, msg_ptr: u32) -> u32; - ``` -- InitResponse no longer has a data field. We always return the contract address - in the data field in the blockchain and don't allow you to override. `handle` - can still make use of the field. -- Rename `MockQuerier::with_staking` to `MockQuerier::update_staking` to match - `::update_balance`. -- The obsolete `StdError::NullPointer` and `null_pointer` were removed. -- Error creator functions are now in type itself, e.g. - `StdError::invalid_base64` instead of `invalid_base64`. The free functions are - deprecated and will be removed before 1.0. - -**cosmwasm-storage** - -- Remove `transactional_deps`. Use `transactional` that just provides a - transactional storage instead. -- `get_with_prefix` returns `Option>` instead of - `StdResult>>`. -- `set_with_prefix` and `remove_with_prefix` return nothing instead of - `StdResult<()>`. -- `RepLog::commit` no longer returns any value (always succeeds). -- `Op::apply` no longer returns any value (always succeeds). - -**cosmwasm-vm** - -- The export `allocate` must not return 0 as a valid address. The contract is - responsible for avoiding this offset in the linear memory. -- The import `db_read` now allocates memory for the return value as part of the - call and returns a pointer to the value as `u32`. The return value 0 means - _key does not exist_. -- The import `db_next` now allocates a memory region for the return key and - value as part of the call and returns a pointer to the region as `u32`. The - data in the region is stored in the format `value || key || keylen`. As - before, an empty key means _no more value_. -- Remove `Instance::get_gas` in favour of `Instance::get_gas_left`. -- All calls from the VM layer to the chain layer also return the amount of gas - used on success. (This is represented by replacing the return value with - `(value, used_gas)`). Gas usage across the system is then tracked in the VM - layer, which allows us to halt the contract during an import, as soon as we - can prove that we used all allocated gas. -- Remove instance caching, which is disabled since 0.8.1 as it is not stable. - Remove `CosmCache::store_instance`; you can not call `Instance::recylce` - directly to get back the external dependencies. -- Rename `MockQuerier::with_staking` to `MockQuerier::update_staking` to match - `::update_balance`. -- Instead of panicking, `read_region`/`write_region`/`get_region`/`set_region` - now return a new `CommunicationError::DerefErr` when dereferencing a pointer - provided by the contract fails. -- `FfiError::set_message` was removed because errors should be immutable. Use - `FfiError::other` to create an error with the desired error message. -- The import implementation of `db_scan` now errors instead of returning an - error code for an invalid order value. The return type was changed to `u32`. -- Remove `StorageIteratorItem` in favour of the new types `StorageIterator` and - `NextItem`. `StorageIterator` is a custom iterator type that does not - implement Rust's `Iterator` trait, allowing it to communicate the used gas - value of the last `next` call to the VM. -- Don't report any `VmError` back to the contract in `canonicalize_address` and - `humanize_address`. Only invalid inputs should be reported. -- Move error cases `VmError::RegionLengthTooBig` and `VmError::RegionTooSmall` - into `CommunicationError`. -- In the `canonicalize_address` implementation, invalid UTF-8 inputs now result - in `CommunicationError::InvalidUtf8`, which is not reported back to the - contract. A standard library should ensure this never happens by correctly - encoding string input values. -- Merge trait `ReadonlyStorage` into `Storage`. -- The imports `canonicalize_address` and `humanize_address` now return a memory - address to an error `Region`. If this address is 0, the call succeeded. -- Bump `cosmwasm_vm_version_1` to `cosmwasm_vm_version_2`. - -## 0.8.1 (2020-06-08) - -**cosmwasm-std** - -- The arguments of `log` changed from `&str` to `ToString`, allowing to pass - various types like `String`, `HumanAddr`, `Uint128` or primitive integers - directly. -- Add `From>` and `Into>` implementations for `Binary` for - zero-copy conversions. - -**cosmwasm-vm** - -- Deprecated `Instance::get_gas` in favour of `Instance::get_gas_left`. The old - method will remain available for a while but will issue a deprecation warning - when used. -- Disable instance caching by treating every cache size as 0. Instance caching - is not safe as the same Wasm memory is reused across multiple executions. -- The storage of an `Instance` can now be set into readonly mode, which is - checked by the writing storage imports `db_write` and `db_remove`. Read-only - mode is off by default for backwards compatibility. `call_query_raw` now sets - the instance's storage to readonly. -- The new error case `VmError::WriteAccessDenied` is returned when a contract - calls an import that potentially writes to storage during a query. - -## 0.8.0 (2020-05-25) - -**all** - -- Upgrade schemars to 0.7. -- Upgrade wasmer to 0.17. -- Update snafu to 0.6. -- Minimal supported Rust version is 1.41. -- Split `Region.len` into `Region.capacity` and `Region.length`, where the new - capacity is the number of bytes available and `length` is the number of bytes - used. This is a breaking change in the contract-vm interface, which requires - the same memory layout of the `Region` struct on both sides. -- Add `remove` method to `Storage` trait. -- (feature-flagged) Add `range` method to `ReadonlyStorage` trait. This returns - an iterator that covers all or a subset of the items in the db ordered - ascending or descending by key. -- Add new feature flag `iterator` to both packages to enable `range` - functionality. This is used to allow potential porting to chains that use - Merkle Tries (which don't allow iterating over ranges). -- All serialized JSON types now use snake_case mappings for names. This means - enum fields like `ChangeOwner` will map to `change_owner` in the underlying - JSON, not `changeowner`. This is a breaking change for the clients. -- Public interface between contract and runtime no longer uses `String` to - represent an error, but rather serializes `ApiError` as a rich JSON error. -- Return value from `env.write_db` and `env.remove_db` to allow error reporting. -- Query responses are now required to contain valid JSON. -- Renamed all `*_db` wasm imports to `db_*` -- Merge `cw-storage` repo as subpackage, now `cosmwasm-storage` -- Add iterator support to `cosmwasm-storage` -- `Coin.amount` is now `Uint128` rather than `String`. Uint128 serializes as a - string in JSON, but parses into a u128 data in memory. It also has some - operator overloads to allow easy math operations on `Coin` types, as well as - enforcing valid amounts. -- `Env` no longer has a `contract.balance` element. If you need this info, - please use the `Querier` to get this info. As of Cosmos-SDK 0.39 this needs - extra storage queries to get the balance, so we only do those queries when - needed. -- `Env.message.sent_funds` is a `Vec` not `Option>`. We will - normalize the go response in `go-cosmwasm` before sending it to the contract. -- `Env.message.signer` was renamed to `Env.message.sender`. -- `Env.block.{height,time}` are now `u64` rather than `i64`. - -**cosmwasm-schema** - -- This new crate now contains the implementations for generating JSON Schema - files from interface types. It exposes the functions `export_schema`, - `export_schema_with_title`, and `schema_for`. - -**cosmwasm-std** - -- Make all symbols from `cosmwasm::memory` crate internal, as those symbols are - not needed by users of the library. -- Rename `cosmwasm::mock::dependencies` -> `cosmwasm::mock::mock_dependencies` - to differentiate between testing and production `External`. -- Export all symbols from `cosmwasm::mock` as the new non-wasm32 module - `cosmwasm::testing`. Export all remaining symbols at top level (e.g. - `use cosmwasm::traits::{Api, Storage};` + `use cosmwasm::encoding::Binary;` - becomes `use cosmwasm::{Api, Binary, Storage};`). -- Rename package `cosmwasm` to `cosmwasm-std`. -- The export `allocate` does not zero-fill the allocated memory anymore. -- Add `remove_db` to the required imports of a contract. -- (feature-flagged) add `scan_db` and `next_db` callbacks from wasm contract to - VM. -- `serde::{from_slice, to_vec}` return `cosmwasm_std::Result`, no more need to - use `.context(...)` when calling these functions -- Split `Response` into `InitResponse` and `HandleResponse`; split - `ContractResult` into `InitResult` and `HandleResult`. -- Create explicit `QueryResponse`, analogue to `InitResponse` and - `HandleResponse`. -- The exports `cosmwasm_vm_version_1`, `allocate` and `deallocate` are now - private and can only be called via the Wasm export. Make sure to `use` - `cosmwasm_std` at least once in the contract to pull in the C exports. -- Add `Querier` trait and `QueryRequest` for query callbacks from the contract, - along with `SystemError` type for the runtime rejecting messages. -- `QueryRequest` takes a generic `Custom(T)` type that is passed opaquely to the - end consumer (`wasmd` or integration test stubs), allowing custom queries to - native code. -- `{Init,Handle,Query}Result` are now just aliases for a concrete `ApiResult` - type. -- Support results up to 128 KiB in `ExternalStorage.get`. -- The `Storage` trait's `.get`, `.set` and `.remove` now return a `Result` to - allow propagation of errors. -- Move `transactional`, `transactional_deps`, `RepLog`, `StorageTransaction` - into crate `cosmwasm-storage`. -- Rename `Result` to `StdResult` to differentiate between the auto-`use`d - `core::result::Result`. Fix error argument to `Error`. -- Complete overhaul of `Error` into `StdError`: - - The `StdError` enum can now be serialized and deserialized (losing its - backtrace), which allows us to pass them over the Wasm/VM boundary. This - allows using fully structured errors in e.g. integration tests. - - Auto generated snafu error constructor structs like `NotFound`/`ParseErr`/… - have been intenalized in favour of error generation helpers like - `not_found`/`parse_err`/… - - All error generator functions now return errors instead of results. - - Error cases don't contain `source` fields anymore. Instead source errors are - converted to standard types like `String`. For this reason, both - `snafu::ResultExt` and `snafu::OptionExt` cannot be used anymore. - - Backtraces became optional. Use `RUST_BACKTRACE=1` to enable them. - - `Utf8Err`/`Utf8StringErr` merged into `StdError::InvalidUtf8` - - `Base64Err` renamed into `StdError::InvalidBase64` - - `ContractErr`/`DynContractErr` merged into `StdError::GeneralErr` - - The unused `ValidationErr` was removed - - `StdError` is now - [non_exhaustive](https://doc.rust-lang.org/1.35.0/unstable-book/language-features/non-exhaustive.html), - making new error cases non-breaking changes. -- `ExternalStorage.get` now returns an empty vector if a storage entry exists - but has an empty value. Before, this was normalized to `None`. -- Reorganize `CosmosMsg` enum types. They are now split by modules: - `CosmosMsg::Bank(BankMsg)`, `CosmosMsg::Custom(T)`, `CosmosMsg::Wasm(WasmMsg)` -- CosmosMsg is now generic over the content of `Custom` variant. This allows - blockchains to support custom native calls in their Cosmos-SDK apps and - developers to make use of them in CosmWasm apps without forking the - `cosmwasm-vm` and `go-cosmwasm` runtime. -- Add `staking` feature flag to expose new `StakingMsg` types under `CosmosMsg` - and new `StakingRequest` types under `QueryRequest`. -- Add support for mocking-out staking queries via `MockQuerier.with_staking` -- `from_slice`/`from_binary` now require result type to be `DeserializeOwned`, - i.e. the result must not contain references such as `&str`. - -**cosmwasm-vm** - -- Make `Instance.memory`/`.allocate`/`.deallocate`/`.func` crate internal. A - user of the VM must not access the instance's memory directly. -- The imports `env.canonicalize_address`, `env.humanize_address` and - `env.read_db` don't return the number of bytes written anymore. This value is - now available in the resulting regions. Negative return values are errors, 0 - is success and values greater than 0 are reserved for future use. -- Change the required interface version guard export from `cosmwasm_api_0_6` to - `cosmwasm_vm_version_1`. -- Provide implementations for `remove_db` and (feature-flagged) `scan_db` and - `next_db` -- Provide custom `serde::{from_slice, to_vec}` implementation separate from - `cosmwasm_std`, so we can return cosmwasm-vm specific `Result` (only used - internally). -- `call_{init,handle,query}` and the `cosmwasm_vm::testing` wrappers return - standard `Result` types now, eg. `Result`. -- Add length limit when reading memory from the instance to protect against - malicious contracts creating overly large `Region`s. -- Add `Instance.get_memory_size`, giving you the peak memory consumption of an - instance. -- Remove `cosmwasm_vm::errors::CacheExt`. -- Move `cosmwasm_vm::errors::{Error, Result}` to - `cosmwasm_vm::{VmError, VmResult}` and remove generic error type from result. -- The import `db_read` now returns an error code if the storage key does not - exist. The latest standard library converts this error code back to a `None` - value. This allows differentiating non-existent and empty storage entries. -- Make `Instance::from_module`, `::from_wasmer` and `::recycle` crate-internal. -- Create explicit, public `Checksum` type to identify Wasm blobs. -- `CosmCache::new` now takes supported features as an argument. -- Rename `VmError::RegionTooSmallErr` to `VmError::RegionTooSmall`. -- Rename `VmError::RegionLengthTooBigErr` to `VmError::RegionLengthTooBig`. -- Change property types to owned string in `VmError::UninitializedContextData`, - `VmError::ConversionErr`, `VmError::ParseErr` and `VmError::SerializeErr`. -- Remove `VmError::IoErr` in favour of `VmError::CacheErr`. -- Simplify `VmError::CompileErr`, `VmError::ResolveErr` and - `VmError::WasmerRuntimeErr` to just hold a string with the details instead of - the source error. -- Remove `VmError::WasmerErr` in favour of the new `VmError::InstantiationErr`. -- The snafu error builders from `VmError` are now private, i.e. callers can only - use the errors, not create them. -- `VmError` is now `#[non_exhaustive]`. -- Split `VmError::RuntimeErr` in `VmError::BackendErr` and - `VmError::GenericErr`; rename `VmError::WasmerRuntimeErr` to - `VmError::RuntimeErr`. -- Add `Instance.with_querier` analogue to `Instance.with_storage`. - -## 0.7.2 (2020-03-23) - -**cosmwasm** - -- Fix JSON schema type of `Binary` from int array (wrong) to string (right). -- Make `Extern` not `Clone`able anymore. Before cloning led to copying the data - for mock storage and copying a stateless bridge for the external storage, - which are different semantics. -- Remove public `cosmwasm::imports::dependencies`. A user of this library does - not need to call this explicitely. Dependencies are created internally and - passed as an argument in `exports::do_init`, `exports::do_handle` and - `exports::do_query`. -- Make `ExternalStorage` not `Clone`able anymore. This does not copy any data, - so a clone could lead to unexpected results. - -## 0.7.1 (2020-03-11) - -**cosmwasm_vm** - -- Avoid unnecessary panic when checking corrupted wasm file. -- Support saving the same wasm to cache multiple times. - -## 0.7.0 (2020-02-26) - -**cosmwasm** - -- Rename `Slice` to `Region` to simplify differentiation between Wasm memory - region and serde's `from_slice` -- Rename `Params` to `Env`, `mock_params` to `mock_env` for clearer naming (this - is information on the execution environment) -- `Response.log` is not a vector of key/value pairs that can later be indexed by - Tendermint. - -**cosmwasm_vm** - -- Remove export `cosmwasm_vm::read_memory`. Using this indicates an - architectural flaw, since this is a method for host to guest communication - inside the VM and not needed for users of the VM. -- Create new type `cosmwasm_vm:errors::Error::RegionTooSmallErr`. -- Change return type of `cosmwasm_vm::write_memory` to `Result` to - make it harder to forget handling errors. -- Fix missing error propagation in `do_canonical_address`, `do_human_address` - and `allocate`. -- Update error return codes in import `c_read`. -- Rename imports `c_read`/`c_write` to `read_db`/`write_db`. -- Rename imports `c_canonical_address`/`c_human_address` to - `canonicalize_address`/`humanize_address`. -- Add `cosmwasm_vm::testing::test_io` for basic memory allocation/deallocation - testing between host and guest. -- Make `ValidationErr.msg` a dynamic `String` including relevant runtime - information. -- Remove export `check_api_compatibility`. The VM will take care of calling it. -- Let `check_api_compatibility` check imports by fully qualified identifier - `.`. -- Make gas limit immutable in `cosmwasm_vm::instance::Instance`. It is passed - once at construction time and cannot publicly be manipulated anymore. -- Remove `take_storage`/`leave_storage` from `cosmwasm_vm::Instance`. - -## 0.6 - -[Define canonical address callbacks](https://github.com/confio/cosmwasm/issues/73) - -- Use `&[u8]` for addresses in params -- Allow contracts to resolve human readable addresses (`&str`) in their json - into a fixed-size binary representation -- Provide mocks for unit testing and integration tests - -- Separate out `Storage` from `ReadOnlyStorage` as separate traits - -## 0.5 - -### 0.5.2 - -This is the first documented and supported implementation. It contains the basic -feature set. `init` and `handle` supported for modules and can return messages. -A stub implementation of `query` is done, which is likely to be deprecated soon. -Some main points: - -- The build-system and unit/integration-test setup is all stabilized. -- Cosmwasm-vm supports singlepass and cranelift backends, and caches modules on - disk and instances in memory (lru cache). -- JSON Schema output works - -All future Changelog entries will reference this base +The CHANGELOG for versions before 1.0.0 was moved to +[CHANGELOG-pre1.0.0.md](./CHANGELOG-pre1.0.0.md). [unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.4.0...HEAD [1.4.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.3...v1.4.0 @@ -1893,29 +567,3 @@ All future Changelog entries will reference this base [1.1.1]: https://github.com/CosmWasm/cosmwasm/compare/v1.1.0...v1.1.1 [1.1.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.0.0...v1.1.0 [1.0.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.0.0-rc.0...v1.0.0 -[1.0.0-rc.0]: - https://github.com/CosmWasm/cosmwasm/compare/v1.0.0-beta8...v1.0.0-rc.0 -[1.0.0-beta8]: - https://github.com/CosmWasm/cosmwasm/compare/v1.0.0-beta7...v1.0.0-beta8 -[1.0.0-beta7]: - https://github.com/CosmWasm/cosmwasm/compare/v1.0.0-beta6...v1.0.0-beta7 -[1.0.0-beta6]: - https://github.com/CosmWasm/cosmwasm/compare/v1.0.0-beta5...v1.0.0-beta6 -[1.0.0-beta5]: - https://github.com/CosmWasm/cosmwasm/compare/v1.0.0-beta4...v1.0.0-beta5 -[1.0.0-beta4]: - https://github.com/CosmWasm/cosmwasm/compare/v1.0.0-beta3...v1.0.0-beta4 -[1.0.0-beta3]: - https://github.com/CosmWasm/cosmwasm/compare/v1.0.0-beta...v1.0.0-beta3 -[1.0.0-beta]: https://github.com/CosmWasm/cosmwasm/compare/v0.16.2...v1.0.0-beta -[0.16.2]: https://github.com/CosmWasm/cosmwasm/compare/v0.16.1...v0.16.2 -[0.16.1]: https://github.com/CosmWasm/cosmwasm/compare/v0.16.0...v0.16.1 -[0.16.0]: https://github.com/CosmWasm/cosmwasm/compare/v0.15.2...v0.16.0 -[0.15.2]: https://github.com/CosmWasm/cosmwasm/compare/v0.15.1...v0.15.2 -[0.15.1]: https://github.com/CosmWasm/cosmwasm/compare/v0.15.0...v0.15.1 -[0.15.0]: https://github.com/CosmWasm/cosmwasm/compare/v0.14.1...v0.15.0 -[0.14.1]: https://github.com/CosmWasm/cosmwasm/compare/v0.14.0...v0.14.1 -[0.14.0]: https://github.com/CosmWasm/cosmwasm/compare/v0.13.1...v0.14.0 -[0.13.2]: https://github.com/CosmWasm/cosmwasm/compare/v0.13.1...v0.13.2 -[0.13.1]: https://github.com/CosmWasm/cosmwasm/compare/v0.13.0...v0.13.1 -[0.13.0]: https://github.com/CosmWasm/cosmwasm/compare/v0.12.0...v0.13.0 From dddbcc790f2685a3e3399febf079a437d2df7053 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 7 Sep 2023 15:40:49 +0200 Subject: [PATCH 0709/2372] Fix shrink_be_int bounds check --- packages/std/src/math/conversion.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/packages/std/src/math/conversion.rs b/packages/std/src/math/conversion.rs index f7cb353c04..7d3c9dfdb3 100644 --- a/packages/std/src/math/conversion.rs +++ b/packages/std/src/math/conversion.rs @@ -37,6 +37,10 @@ pub fn shrink_be_int( return None; } } + // the sign bit also has to be 1 + if input[INPUT_SIZE - OUTPUT_SIZE] & 0b10000000 == 0 { + return None; + } } else { // a positive number should start with only 0s, otherwise it's too large for i in &input[0..(INPUT_SIZE - OUTPUT_SIZE)] { @@ -44,6 +48,10 @@ pub fn shrink_be_int( return None; } } + // the sign bit also has to be 0 + if input[INPUT_SIZE - OUTPUT_SIZE] & 0b10000000 != 0 { + return None; + } } // Now, we can just copy the last bytes @@ -97,8 +105,25 @@ mod tests { i32::MAX, ]; for i in oob { + // 32 -> 16 bit assert_eq!(shrink_be_int::<4, 2>(i.to_be_bytes()), None); + // 32 -> 8 bit assert_eq!(shrink_be_int::<4, 1>(i.to_be_bytes()), None); } + + // compare against whole i16 range + for i in i16::MIN..=i16::MAX { + let cast = i as i8 as i16; + if i == cast { + // if the cast is lossless, `shrink_be_int` should get the same result + assert_eq!( + shrink_be_int::<2, 1>(i.to_be_bytes()), + Some((i as i8).to_be_bytes()) + ); + } else { + // otherwise, we should get None + assert_eq!(shrink_be_int::<2, 1>(i.to_be_bytes()), None); + } + } } } From 7f97d432ef4c742c6cac8d5de88eea5c17d1923e Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 7 Sep 2023 17:37:37 +0200 Subject: [PATCH 0710/2372] Add is_negative fn to signed ints --- packages/std/src/math/int128.rs | 15 +++++++++++++++ packages/std/src/math/int256.rs | 15 +++++++++++++++ packages/std/src/math/int512.rs | 15 +++++++++++++++ packages/std/src/math/int64.rs | 15 +++++++++++++++ 4 files changed, 60 insertions(+) diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index 51943b08da..dcb13ee8c5 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -89,6 +89,11 @@ impl Int128 { self.0 == 0 } + #[must_use] + pub const fn is_negative(&self) -> bool { + self.0.is_negative() + } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn pow(self, exp: u32) -> Self { Self(self.0.pow(exp)) @@ -728,6 +733,16 @@ mod tests { assert!(!Int128::from(-123i32).is_zero()); } + #[test] + fn int128_is_negative_works() { + assert!(Int128::MIN.is_negative()); + assert!(Int128::from(-123i32).is_negative()); + + assert!(!Int128::MAX.is_negative()); + assert!(!Int128::zero().is_negative()); + assert!(!Int128::from(123u32).is_negative()); + } + #[test] fn int128_wrapping_methods() { // wrapping_add diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index b53680f723..1c83944953 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -145,6 +145,11 @@ impl Int256 { self.0.is_zero() } + #[must_use] + pub const fn is_negative(&self) -> bool { + self.0.is_negative() + } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn pow(self, exp: u32) -> Self { Self(self.0.pow(exp)) @@ -825,6 +830,16 @@ mod tests { assert!(!Int256::from(-123i32).is_zero()); } + #[test] + fn int256_is_negative_works() { + assert!(Int256::MIN.is_negative()); + assert!(Int256::from(-123i32).is_negative()); + + assert!(!Int256::MAX.is_negative()); + assert!(!Int256::zero().is_negative()); + assert!(!Int256::from(123u32).is_negative()); + } + #[test] fn int256_wrapping_methods() { // wrapping_add diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index b09fb0c725..bc6919d5d6 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -172,6 +172,11 @@ impl Int512 { self.0.is_zero() } + #[must_use] + pub const fn is_negative(&self) -> bool { + self.0.is_negative() + } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn pow(self, exp: u32) -> Self { Self(self.0.pow(exp)) @@ -888,6 +893,16 @@ mod tests { assert!(!Int512::from(-123i32).is_zero()); } + #[test] + fn int512_is_negative_works() { + assert!(Int512::MIN.is_negative()); + assert!(Int512::from(-123i32).is_negative()); + + assert!(!Int512::MAX.is_negative()); + assert!(!Int512::zero().is_negative()); + assert!(!Int512::from(123u32).is_negative()); + } + #[test] fn int512_wrapping_methods() { // wrapping_add diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index 057b0f3405..f4bcd8c373 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -87,6 +87,11 @@ impl Int64 { self.0 == 0 } + #[must_use] + pub const fn is_negative(&self) -> bool { + self.0.is_negative() + } + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn pow(self, exp: u32) -> Self { Self(self.0.pow(exp)) @@ -704,6 +709,16 @@ mod tests { assert!(!Int64::from(-123i32).is_zero()); } + #[test] + fn int64_is_negative_works() { + assert!(Int64::MIN.is_negative()); + assert!(Int64::from(-123i32).is_negative()); + + assert!(!Int64::MAX.is_negative()); + assert!(!Int64::zero().is_negative()); + assert!(!Int64::from(123u32).is_negative()); + } + #[test] fn int64_wrapping_methods() { // wrapping_add From 8be72bb7f86f16c3beb21062fdf94dbe871344ae Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 7 Sep 2023 18:03:01 +0200 Subject: [PATCH 0711/2372] Add changelog entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c96fc7e148..f90f249264 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,9 +14,11 @@ and this project adheres to `TryFrom` for `Int64`, `TryFrom` for `Int128`, `TryFrom` for `Int256` and `Int256::from_i128` for const contexts ([#1861]). +- cosmwasm-std: Add `is_negative` for `Int{64,128,256,512}` ([#1867]). [#1854]: https://github.com/CosmWasm/cosmwasm/pull/1854 [#1861]: https://github.com/CosmWasm/cosmwasm/pull/1861 +[#1867]: https://github.com/CosmWasm/cosmwasm/pull/1867 ## [1.4.0] - 2023-09-04 From e8dce0ca1740db44bd73f66b2b1bf04c5be11d94 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 7 Sep 2023 16:39:11 +0200 Subject: [PATCH 0712/2372] Add missing checked_multiply_ratio implementations --- packages/std/src/math/int128.rs | 101 +++++++++++++++++++++++++++++- packages/std/src/math/int256.rs | 105 +++++++++++++++++++++++++++++++- packages/std/src/math/int64.rs | 94 +++++++++++++++++++++++++++- 3 files changed, 296 insertions(+), 4 deletions(-) diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index dcb13ee8c5..6454672e25 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -10,7 +10,8 @@ use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; use crate::{ - forward_ref_partial_eq, ConversionOverflowError, Int256, Int512, Int64, Uint128, Uint64, + forward_ref_partial_eq, CheckedMultiplyRatioError, ConversionOverflowError, Int256, Int512, + Int64, Uint128, Uint64, }; use super::conversion::shrink_be_int; @@ -99,6 +100,45 @@ impl Int128 { Self(self.0.pow(exp)) } + /// Returns `self * numerator / denominator`. + /// + /// Due to the nature of the integer division involved, the result is always floored. + /// E.g. 5 * 99/100 = 4. + pub fn checked_multiply_ratio, B: Into>( + &self, + numerator: A, + denominator: B, + ) -> Result { + let numerator = numerator.into(); + let denominator = denominator.into(); + if denominator.is_zero() { + return Err(CheckedMultiplyRatioError::DivideByZero); + } + match (self.full_mul(numerator) / Int256::from(denominator)).try_into() { + Ok(ratio) => Ok(ratio), + Err(_) => Err(CheckedMultiplyRatioError::Overflow), + } + } + + /// Multiplies two [`Int128`] values without overflow, producing an + /// [`Int256`]. + /// + /// # Examples + /// + /// ``` + /// use cosmwasm_std::Int128; + /// + /// let a = Int128::MAX; + /// let result = a.full_mul(2i32); + /// assert_eq!(result.to_string(), "340282366920938463463374607431768211454"); + /// ``` + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn full_mul(self, rhs: impl Into) -> Int256 { + Int256::from(self.i128()) + .checked_mul(Int256::from(rhs.into())) + .unwrap() + } + pub fn checked_add(self, other: Self) -> Result { self.0 .checked_add(other.0) @@ -912,6 +952,65 @@ mod tests { _ = Int128::MAX.pow(2u32); } + #[test] + fn int128_checked_multiply_ratio_works() { + let base = Int128(500); + + // factor 1/1 + assert_eq!(base.checked_multiply_ratio(1i128, 1i128).unwrap(), base); + assert_eq!(base.checked_multiply_ratio(3i128, 3i128).unwrap(), base); + assert_eq!( + base.checked_multiply_ratio(654321i128, 654321i128).unwrap(), + base + ); + assert_eq!( + base.checked_multiply_ratio(i128::MAX, i128::MAX).unwrap(), + base + ); + + // factor 3/2 + assert_eq!( + base.checked_multiply_ratio(3i128, 2i128).unwrap(), + Int128(750) + ); + assert_eq!( + base.checked_multiply_ratio(333333i128, 222222i128).unwrap(), + Int128(750) + ); + + // factor 2/3 (integer devision always floors the result) + assert_eq!( + base.checked_multiply_ratio(2i128, 3i128).unwrap(), + Int128(333) + ); + assert_eq!( + base.checked_multiply_ratio(222222i128, 333333i128).unwrap(), + Int128(333) + ); + + // factor 5/6 (integer devision always floors the result) + assert_eq!( + base.checked_multiply_ratio(5i128, 6i128).unwrap(), + Int128(416) + ); + assert_eq!( + base.checked_multiply_ratio(100i128, 120i128).unwrap(), + Int128(416) + ); + } + + #[test] + fn int128_checked_multiply_ratio_does_not_panic() { + assert_eq!( + Int128(500i128).checked_multiply_ratio(1i128, 0i128), + Err(CheckedMultiplyRatioError::DivideByZero), + ); + assert_eq!( + Int128(500i128).checked_multiply_ratio(i128::MAX, 1i128), + Err(CheckedMultiplyRatioError::Overflow), + ); + } + #[test] fn int128_shr_works() { let original = Int128::from_be_bytes([ diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index 1c83944953..30fccbb6e6 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -10,8 +10,8 @@ use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; use crate::{ - forward_ref_partial_eq, ConversionOverflowError, Int128, Int512, Int64, Uint128, Uint256, - Uint64, + forward_ref_partial_eq, CheckedMultiplyRatioError, ConversionOverflowError, Int128, Int512, + Int64, Uint128, Uint256, Uint64, }; /// Used internally - we don't want to leak this type since we might change @@ -155,6 +155,48 @@ impl Int256 { Self(self.0.pow(exp)) } + /// Returns `self * numerator / denominator`. + /// + /// Due to the nature of the integer division involved, the result is always floored. + /// E.g. 5 * 99/100 = 4. + pub fn checked_multiply_ratio, B: Into>( + &self, + numerator: A, + denominator: B, + ) -> Result { + let numerator = numerator.into(); + let denominator = denominator.into(); + if denominator.is_zero() { + return Err(CheckedMultiplyRatioError::DivideByZero); + } + match (self.full_mul(numerator) / Int512::from(denominator)).try_into() { + Ok(ratio) => Ok(ratio), + Err(_) => Err(CheckedMultiplyRatioError::Overflow), + } + } + + /// Multiplies two [`Int256`] values without overflow, producing an + /// [`Int512`]. + /// + /// # Examples + /// + /// ``` + /// use cosmwasm_std::Int256; + /// + /// let a = Int256::MAX; + /// let result = a.full_mul(2i32); + /// assert_eq!( + /// result.to_string(), + /// "115792089237316195423570985008687907853269984665640564039457584007913129639934" + /// ); + /// ``` + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn full_mul(self, rhs: impl Into) -> Int512 { + Int512::from(self) + .checked_mul(Int512::from(rhs.into())) + .unwrap() + } + pub fn checked_add(self, other: Self) -> Result { self.0 .checked_add(other.0) @@ -1009,6 +1051,65 @@ mod tests { _ = Int256::MAX.pow(2u32); } + #[test] + fn int256_checked_multiply_ratio_works() { + let base = Int256::from_i128(500); + + // factor 1/1 + assert_eq!(base.checked_multiply_ratio(1i128, 1i128).unwrap(), base); + assert_eq!(base.checked_multiply_ratio(3i128, 3i128).unwrap(), base); + assert_eq!( + base.checked_multiply_ratio(654321i128, 654321i128).unwrap(), + base + ); + assert_eq!( + base.checked_multiply_ratio(i128::MAX, i128::MAX).unwrap(), + base + ); + + // factor 3/2 + assert_eq!( + base.checked_multiply_ratio(3i128, 2i128).unwrap(), + Int256::from_i128(750) + ); + assert_eq!( + base.checked_multiply_ratio(333333i128, 222222i128).unwrap(), + Int256::from_i128(750) + ); + + // factor 2/3 (integer devision always floors the result) + assert_eq!( + base.checked_multiply_ratio(2i128, 3i128).unwrap(), + Int256::from_i128(333) + ); + assert_eq!( + base.checked_multiply_ratio(222222i128, 333333i128).unwrap(), + Int256::from_i128(333) + ); + + // factor 5/6 (integer devision always floors the result) + assert_eq!( + base.checked_multiply_ratio(5i128, 6i128).unwrap(), + Int256::from_i128(416) + ); + assert_eq!( + base.checked_multiply_ratio(100i128, 120i128).unwrap(), + Int256::from_i128(416) + ); + } + + #[test] + fn int256_checked_multiply_ratio_does_not_panic() { + assert_eq!( + Int256::from_i128(500i128).checked_multiply_ratio(1i128, 0i128), + Err(CheckedMultiplyRatioError::DivideByZero), + ); + assert_eq!( + Int256::MAX.checked_multiply_ratio(Int256::MAX, 1i128), + Err(CheckedMultiplyRatioError::Overflow), + ); + } + #[test] fn int256_shr_works() { let original = Int256::new([ diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index f4bcd8c373..dabb8be22a 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -9,7 +9,10 @@ use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; -use crate::{forward_ref_partial_eq, ConversionOverflowError, Int128, Int256, Int512, Uint64}; +use crate::{ + forward_ref_partial_eq, CheckedMultiplyRatioError, ConversionOverflowError, Int128, Int256, + Int512, Uint64, +}; use super::conversion::shrink_be_int; @@ -97,6 +100,45 @@ impl Int64 { Self(self.0.pow(exp)) } + /// Returns `self * numerator / denominator`. + /// + /// Due to the nature of the integer division involved, the result is always floored. + /// E.g. 5 * 99/100 = 4. + pub fn checked_multiply_ratio, B: Into>( + &self, + numerator: A, + denominator: B, + ) -> Result { + let numerator = numerator.into(); + let denominator = denominator.into(); + if denominator.is_zero() { + return Err(CheckedMultiplyRatioError::DivideByZero); + } + match (self.full_mul(numerator) / Int128::from(denominator)).try_into() { + Ok(ratio) => Ok(ratio), + Err(_) => Err(CheckedMultiplyRatioError::Overflow), + } + } + + /// Multiplies two [`Int64`] values without overflow, producing an + /// [`Int128`]. + /// + /// # Examples + /// + /// ``` + /// use cosmwasm_std::Int64; + /// + /// let a = Int64::MAX; + /// let result = a.full_mul(2i32); + /// assert_eq!(result.to_string(), "18446744073709551614"); + /// ``` + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn full_mul(self, rhs: impl Into) -> Int128 { + Int128::from(self) + .checked_mul(Int128::from(rhs.into())) + .unwrap() + } + pub fn checked_add(self, other: Self) -> Result { self.0 .checked_add(other.0) @@ -888,6 +930,56 @@ mod tests { _ = Int64::MAX.pow(2u32); } + #[test] + fn int64_checked_multiply_ratio_works() { + let base = Int64(500); + + // factor 1/1 + assert_eq!(base.checked_multiply_ratio(1i64, 1i64).unwrap(), base); + assert_eq!(base.checked_multiply_ratio(3i64, 3i64).unwrap(), base); + assert_eq!( + base.checked_multiply_ratio(654321i64, 654321i64).unwrap(), + base + ); + assert_eq!( + base.checked_multiply_ratio(i64::MAX, i64::MAX).unwrap(), + base + ); + + // factor 3/2 + assert_eq!(base.checked_multiply_ratio(3i64, 2i64).unwrap(), Int64(750)); + assert_eq!( + base.checked_multiply_ratio(333333i64, 222222i64).unwrap(), + Int64(750) + ); + + // factor 2/3 (integer devision always floors the result) + assert_eq!(base.checked_multiply_ratio(2i64, 3i64).unwrap(), Int64(333)); + assert_eq!( + base.checked_multiply_ratio(222222i64, 333333i64).unwrap(), + Int64(333) + ); + + // factor 5/6 (integer devision always floors the result) + assert_eq!(base.checked_multiply_ratio(5i64, 6i64).unwrap(), Int64(416)); + assert_eq!( + base.checked_multiply_ratio(100i64, 120i64).unwrap(), + Int64(416) + ); + } + + #[test] + fn int64_checked_multiply_ratio_does_not_panic() { + assert_eq!( + Int64(500i64).checked_multiply_ratio(1i64, 0i64), + Err(CheckedMultiplyRatioError::DivideByZero), + ); + assert_eq!( + Int64(500i64).checked_multiply_ratio(i64::MAX, 1i64), + Err(CheckedMultiplyRatioError::Overflow), + ); + } + #[test] fn int64_shr_works() { let original = Int64::from_be_bytes([0u8, 0u8, 0u8, 0u8, 2u8, 0u8, 4u8, 2u8]); From 06fa3d4bffab9511f679426e7bf88a005951192f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 7 Sep 2023 18:10:18 +0200 Subject: [PATCH 0713/2372] Add changelog entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f90f249264..3572dfa0fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,10 +14,13 @@ and this project adheres to `TryFrom` for `Int64`, `TryFrom` for `Int128`, `TryFrom` for `Int256` and `Int256::from_i128` for const contexts ([#1861]). +- cosmwasm-std: Add `Int{64,128,256}::{checked_multiply_ratio, full_mul}` + ([#1866]) - cosmwasm-std: Add `is_negative` for `Int{64,128,256,512}` ([#1867]). [#1854]: https://github.com/CosmWasm/cosmwasm/pull/1854 [#1861]: https://github.com/CosmWasm/cosmwasm/pull/1861 +[#1866]: https://github.com/CosmWasm/cosmwasm/pull/1866 [#1867]: https://github.com/CosmWasm/cosmwasm/pull/1867 ## [1.4.0] - 2023-09-04 From 9e46f46d17e1460e60a05d8c393f9ab4a8514870 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 11 Sep 2023 10:53:01 +0200 Subject: [PATCH 0714/2372] Add missing TryFrom impls for Uint64 --- packages/std/src/math/uint128.rs | 12 +++++++++++ packages/std/src/math/uint256.rs | 28 ++++++++++++++++++++++++++ packages/std/src/math/uint512.rs | 34 ++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+) diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 0aebf6b992..06e9549929 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -677,6 +677,18 @@ mod tests { assert!(result.is_err()); } + #[test] + fn uint128_try_into() { + assert!(Uint64::try_from(Uint128::MAX).is_err()); + + assert_eq!(Uint64::try_from(Uint128::zero()), Ok(Uint64::zero())); + + assert_eq!( + Uint64::try_from(Uint128::from(42u64)), + Ok(Uint64::from(42u64)) + ); + } + #[test] fn uint128_implements_display() { let a = Uint128(12345); diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 6422dee764..b9de472435 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -389,6 +389,16 @@ impl TryFrom for Uint128 { } } +impl TryFrom for Uint64 { + type Error = ConversionOverflowError; + + fn try_from(value: Uint256) -> Result { + Ok(Uint64::new(value.0.try_into().map_err(|_| { + ConversionOverflowError::new("Uint256", "Uint64", value.to_string()) + })?)) + } +} + impl TryFrom<&str> for Uint256 { type Error = StdError; @@ -1062,6 +1072,24 @@ mod tests { assert!(result.is_err()); } + #[test] + fn uint256_try_into() { + assert!(Uint64::try_from(Uint256::MAX).is_err()); + assert!(Uint128::try_from(Uint256::MAX).is_err()); + + assert_eq!(Uint64::try_from(Uint256::zero()), Ok(Uint64::zero())); + assert_eq!(Uint128::try_from(Uint256::zero()), Ok(Uint128::zero())); + + assert_eq!( + Uint64::try_from(Uint256::from(42u64)), + Ok(Uint64::from(42u64)) + ); + assert_eq!( + Uint128::try_from(Uint256::from(42u128)), + Ok(Uint128::from(42u128)) + ); + } + #[test] fn uint256_convert_to_uint128() { let source = Uint256::from(42u128); diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index c4dd9e3f52..dd5a1e9aa0 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -380,6 +380,16 @@ impl TryFrom for Uint128 { } } +impl TryFrom for Uint64 { + type Error = ConversionOverflowError; + + fn try_from(value: Uint512) -> Result { + Ok(Uint64::new(value.0.try_into().map_err(|_| { + ConversionOverflowError::new("Uint512", "Uint64", value.to_string()) + })?)) + } +} + impl TryFrom<&str> for Uint512 { type Error = StdError; @@ -748,6 +758,30 @@ mod tests { assert!(result.is_err()); } + #[test] + fn uint512_try_into() { + assert!(Uint64::try_from(Uint512::MAX).is_err()); + assert!(Uint128::try_from(Uint512::MAX).is_err()); + assert!(Uint256::try_from(Uint512::MAX).is_err()); + + assert_eq!(Uint64::try_from(Uint512::zero()), Ok(Uint64::zero())); + assert_eq!(Uint128::try_from(Uint512::zero()), Ok(Uint128::zero())); + assert_eq!(Uint256::try_from(Uint512::zero()), Ok(Uint256::zero())); + + assert_eq!( + Uint64::try_from(Uint512::from(42u64)), + Ok(Uint64::from(42u64)) + ); + assert_eq!( + Uint128::try_from(Uint512::from(42u128)), + Ok(Uint128::from(42u128)) + ); + assert_eq!( + Uint256::try_from(Uint512::from(42u128)), + Ok(Uint256::from(42u128)) + ); + } + #[test] fn uint512_convert_to_uint128() { let source = Uint512::from(42u128); From 624f437ab8203a4c0c114c0d09dd2828b49bffcc Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 12 Sep 2023 16:49:37 +0200 Subject: [PATCH 0715/2372] Add missing unsigned int to signed int conversions --- packages/std/src/math/int128.rs | 82 ++++++++++++++++++++++++--------- packages/std/src/math/int256.rs | 55 +++++++++++++++++----- packages/std/src/math/int512.rs | 24 +++++++++- packages/std/src/math/int64.rs | 54 +++++++++++++++++++++- 4 files changed, 181 insertions(+), 34 deletions(-) diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index 6454672e25..82425376f0 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -11,7 +11,7 @@ use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; use crate::{ forward_ref_partial_eq, CheckedMultiplyRatioError, ConversionOverflowError, Int256, Int512, - Int64, Uint128, Uint64, + Int64, Uint128, Uint256, Uint512, Uint64, }; use super::conversion::shrink_be_int; @@ -270,12 +270,50 @@ impl Int128 { } } +// Uint to Int impl From for Int128 { fn from(val: Uint64) -> Self { val.u64().into() } } +impl TryFrom for Int128 { + type Error = ConversionOverflowError; + + fn try_from(value: Uint128) -> Result { + value + .u128() + .try_into() // convert to i128 + .map(Self::new) + .map_err(|_| ConversionOverflowError::new("Uint128", "Int128", value)) + } +} + +impl TryFrom for Int128 { + type Error = ConversionOverflowError; + + fn try_from(value: Uint256) -> Result { + value + .0 + .try_into() // convert to i128 + .map(Self::new) + .map_err(|_| ConversionOverflowError::new("Uint256", "Int128", value)) + } +} + +impl TryFrom for Int128 { + type Error = ConversionOverflowError; + + fn try_from(value: Uint512) -> Result { + value + .0 + .try_into() // convert to i128 + .map(Self::new) + .map_err(|_| ConversionOverflowError::new("Uint512", "Int128", value)) + } +} + +// uint to Int impl From for Int128 { fn from(val: u64) -> Self { Int128(val.into()) @@ -300,12 +338,34 @@ impl From for Int128 { } } +// Int to Int impl From for Int128 { fn from(val: Int64) -> Self { val.i64().into() } } +impl TryFrom for Int128 { + type Error = ConversionOverflowError; + + fn try_from(value: Int256) -> Result { + shrink_be_int(value.to_be_bytes()) + .ok_or_else(|| ConversionOverflowError::new("Int256", "Int128", value)) + .map(Self::from_be_bytes) + } +} + +impl TryFrom for Int128 { + type Error = ConversionOverflowError; + + fn try_from(value: Int512) -> Result { + shrink_be_int(value.to_be_bytes()) + .ok_or_else(|| ConversionOverflowError::new("Int512", "Int128", value)) + .map(Self::from_be_bytes) + } +} + +// int to Int impl From for Int128 { fn from(val: i128) -> Self { Int128(val) @@ -336,26 +396,6 @@ impl From for Int128 { } } -impl TryFrom for Int128 { - type Error = ConversionOverflowError; - - fn try_from(value: Int256) -> Result { - shrink_be_int(value.to_be_bytes()) - .ok_or_else(|| ConversionOverflowError::new("Int256", "Int128", value)) - .map(Self::from_be_bytes) - } -} - -impl TryFrom for Int128 { - type Error = ConversionOverflowError; - - fn try_from(value: Int512) -> Result { - shrink_be_int(value.to_be_bytes()) - .ok_or_else(|| ConversionOverflowError::new("Int512", "Int128", value)) - .map(Self::from_be_bytes) - } -} - impl TryFrom<&str> for Int128 { type Error = StdError; diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index 30fccbb6e6..1dfb89ca0c 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -1,3 +1,4 @@ +use bnum::prelude::As; use core::fmt; use core::ops::{ Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Not, Rem, RemAssign, Shl, ShlAssign, Shr, @@ -11,7 +12,7 @@ use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; use crate::{ forward_ref_partial_eq, CheckedMultiplyRatioError, ConversionOverflowError, Int128, Int512, - Int64, Uint128, Uint256, Uint64, + Int64, Uint128, Uint256, Uint512, Uint64, }; /// Used internally - we don't want to leak this type since we might change @@ -328,6 +329,35 @@ impl Int256 { } } +// Uint to Int +impl TryFrom for Int256 { + type Error = ConversionOverflowError; + + fn try_from(value: Uint512) -> Result { + // Self::MAX fits into Uint512, so we can just cast it + if value.0 > Self::MAX.0.as_() { + return Err(ConversionOverflowError::new("Uint512", "Int256", value)); + } + + // at this point we know it fits + Ok(Self(value.0.as_())) + } +} + +impl TryFrom for Int256 { + type Error = ConversionOverflowError; + + fn try_from(value: Uint256) -> Result { + // Self::MAX fits into Uint256, so we can just cast it + if value.0 > Self::MAX.0.as_() { + return Err(ConversionOverflowError::new("Uint256", "Int256", value)); + } + + // at this point we know it fits + Ok(Self(value.0.as_())) + } +} + impl From for Int256 { fn from(val: Uint128) -> Self { val.u128().into() @@ -340,6 +370,7 @@ impl From for Int256 { } } +// uint to Int impl From for Int256 { fn from(val: u128) -> Self { Int256(val.into()) @@ -370,6 +401,17 @@ impl From for Int256 { } } +// Int to Int +impl TryFrom for Int256 { + type Error = ConversionOverflowError; + + fn try_from(value: Int512) -> Result { + shrink_be_int(value.to_be_bytes()) + .ok_or_else(|| ConversionOverflowError::new("Int512", "Int256", value)) + .map(Self::from_be_bytes) + } +} + impl From for Int256 { fn from(val: Int128) -> Self { val.i128().into() @@ -382,6 +424,7 @@ impl From for Int256 { } } +// int to Int impl From for Int256 { fn from(val: i128) -> Self { Int256(val.into()) @@ -412,16 +455,6 @@ impl From for Int256 { } } -impl TryFrom for Int256 { - type Error = ConversionOverflowError; - - fn try_from(value: Int512) -> Result { - shrink_be_int(value.to_be_bytes()) - .ok_or_else(|| ConversionOverflowError::new("Int512", "Int256", value)) - .map(Self::from_be_bytes) - } -} - impl TryFrom<&str> for Int256 { type Error = StdError; diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index bc6919d5d6..2308b8d518 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -1,3 +1,4 @@ +use bnum::prelude::As; use core::fmt; use core::ops::{ Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Not, Rem, RemAssign, Shl, ShlAssign, Shr, @@ -9,7 +10,10 @@ use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; -use crate::{forward_ref_partial_eq, Int128, Int256, Int64, Uint128, Uint256, Uint512, Uint64}; +use crate::{ + forward_ref_partial_eq, ConversionOverflowError, Int128, Int256, Int64, Uint128, Uint256, + Uint512, Uint64, +}; /// Used internally - we don't want to leak this type since we might change /// the implementation in the future. @@ -313,6 +317,21 @@ impl Int512 { } } +// Uint to Int +impl TryFrom for Int512 { + type Error = ConversionOverflowError; + + fn try_from(value: Uint512) -> Result { + // Self::MAX fits into Uint512, so we can just cast it + if value.0 > Self::MAX.0.as_() { + return Err(ConversionOverflowError::new("Uint512", "Int512", value)); + } + + // at this point we know it fits + Ok(Self(value.0.as_())) + } +} + impl From for Int512 { fn from(val: Uint256) -> Self { let mut bytes = [0u8; 64]; @@ -334,6 +353,7 @@ impl From for Int512 { } } +// uint to Int impl From for Int512 { fn from(val: u128) -> Self { Int512(val.into()) @@ -364,6 +384,7 @@ impl From for Int512 { } } +// int to Int impl From for Int512 { fn from(val: i128) -> Self { Int512(val.into()) @@ -394,6 +415,7 @@ impl From for Int512 { } } +// Int to Int impl From for Int512 { fn from(val: Int64) -> Self { Int512(val.i64().into()) diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index dabb8be22a..e53c0d36bb 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -11,7 +11,7 @@ use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; use crate::{ forward_ref_partial_eq, CheckedMultiplyRatioError, ConversionOverflowError, Int128, Int256, - Int512, Uint64, + Int512, Uint128, Uint256, Uint512, Uint64, }; use super::conversion::shrink_be_int; @@ -270,6 +270,7 @@ impl Int64 { } } +// uint to Int impl From for Int64 { fn from(val: u32) -> Self { Int64(val.into()) @@ -288,6 +289,7 @@ impl From for Int64 { } } +// int to Int impl From for Int64 { fn from(val: i64) -> Self { Int64(val) @@ -312,6 +314,7 @@ impl From for Int64 { } } +// Int to Int impl TryFrom for Int64 { type Error = ConversionOverflowError; @@ -342,6 +345,55 @@ impl TryFrom for Int64 { } } +// Uint to Int +impl TryFrom for Int64 { + type Error = ConversionOverflowError; + + fn try_from(value: Uint64) -> Result { + value + .u64() + .try_into() // convert to i64 + .map(Self::new) + .map_err(|_| ConversionOverflowError::new("Uint64", "Int64", value)) + } +} + +impl TryFrom for Int64 { + type Error = ConversionOverflowError; + + fn try_from(value: Uint128) -> Result { + value + .u128() + .try_into() // convert to i64 + .map(Self::new) + .map_err(|_| ConversionOverflowError::new("Uint64", "Int64", value)) + } +} + +impl TryFrom for Int64 { + type Error = ConversionOverflowError; + + fn try_from(value: Uint256) -> Result { + value + .0 + .try_into() + .map(Int64) + .map_err(|_| ConversionOverflowError::new("Uint256", "Int64", value)) + } +} + +impl TryFrom for Int64 { + type Error = ConversionOverflowError; + + fn try_from(value: Uint512) -> Result { + value + .0 + .try_into() + .map(Int64) + .map_err(|_| ConversionOverflowError::new("Uint512", "Int64", value)) + } +} + impl TryFrom<&str> for Int64 { type Error = StdError; From d170bb643dbcbcd4b8562f487b8f1049f123758a Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 13 Sep 2023 14:15:12 +0200 Subject: [PATCH 0716/2372] Simplify TryFrom impls --- packages/std/src/math/conversion.rs | 65 +++++++++++++++++++++ packages/std/src/math/int128.rs | 64 +++------------------ packages/std/src/math/int256.rs | 44 ++------------- packages/std/src/math/int512.rs | 19 +------ packages/std/src/math/int64.rs | 87 +++-------------------------- packages/std/src/math/uint128.rs | 19 ++++--- packages/std/src/math/uint256.rs | 12 +--- packages/std/src/math/uint512.rs | 12 +--- packages/std/src/math/uint64.rs | 14 ++++- 9 files changed, 118 insertions(+), 218 deletions(-) diff --git a/packages/std/src/math/conversion.rs b/packages/std/src/math/conversion.rs index 7d3c9dfdb3..1872a3e2df 100644 --- a/packages/std/src/math/conversion.rs +++ b/packages/std/src/math/conversion.rs @@ -60,6 +60,71 @@ pub fn shrink_be_int( Some(output) } +/// Helper macro to implement `TryFrom` for a type that is just a wrapper around another type. +/// This can be used for all our integer conversions where `bint` implements `TryFrom`. +macro_rules! forward_try_from { + ($input: ty, $output: ty) => { + impl TryFrom<$input> for $output { + type Error = ConversionOverflowError; + + fn try_from(value: $input) -> Result { + value.0.try_into().map(Self).map_err(|_| { + ConversionOverflowError::new(stringify!($input), stringify!($output), value) + }) + } + } + }; +} +pub(crate) use forward_try_from; + +// TODO: assert statically that input is bigger than output and that both are ints +/// Helper macro to implement `TryFrom` for a conversion from a bigger signed int to a smaller one. +/// This is needed because `bint` does not implement `TryFrom` for those conversions +/// because of limitations of const generics. +macro_rules! try_from_int_to_int { + ($input: ty, $output: ty) => { + impl TryFrom<$input> for $output { + type Error = ConversionOverflowError; + + fn try_from(value: $input) -> Result { + $crate::math::conversion::shrink_be_int(value.to_be_bytes()) + .ok_or_else(|| { + ConversionOverflowError::new(stringify!($input), stringify!($output), value) + }) + .map(Self::from_be_bytes) + } + } + }; +} +pub(crate) use try_from_int_to_int; + +// TODO: assert statically that input is bigger than output and that both are ints +macro_rules! try_from_uint_to_int { + ($input: ty, $output: ty) => { + impl TryFrom<$input> for $output { + type Error = ConversionOverflowError; + + fn try_from(value: $input) -> Result { + // $input has to be bigger than $output, + // otherwise we would not need a `TryFrom` impl, so we can just cast it + use bnum::prelude::As; + if value.0 > Self::MAX.0.as_() { + return Err(ConversionOverflowError::new( + stringify!($input), + stringify!($output), + value, + )); + } + + // at this point we know it fits + Ok(Self(value.0.as_())) + } + } + }; +} + +pub(crate) use try_from_uint_to_int; + #[cfg(test)] mod tests { use super::*; diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index 82425376f0..56e2b7cab8 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -14,7 +14,7 @@ use crate::{ Int64, Uint128, Uint256, Uint512, Uint64, }; -use super::conversion::shrink_be_int; +use super::conversion::{forward_try_from, try_from_int_to_int}; /// An implementation of i128 that is using strings for JSON encoding/decoding, /// such that the full i128 range can be used for clients that convert JSON numbers to floats, @@ -30,7 +30,7 @@ use super::conversion::shrink_be_int; /// assert_eq!(a.i128(), 258); /// ``` #[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] -pub struct Int128(#[schemars(with = "String")] i128); +pub struct Int128(#[schemars(with = "String")] pub(crate) i128); forward_ref_partial_eq!(Int128, Int128); @@ -276,42 +276,9 @@ impl From for Int128 { val.u64().into() } } - -impl TryFrom for Int128 { - type Error = ConversionOverflowError; - - fn try_from(value: Uint128) -> Result { - value - .u128() - .try_into() // convert to i128 - .map(Self::new) - .map_err(|_| ConversionOverflowError::new("Uint128", "Int128", value)) - } -} - -impl TryFrom for Int128 { - type Error = ConversionOverflowError; - - fn try_from(value: Uint256) -> Result { - value - .0 - .try_into() // convert to i128 - .map(Self::new) - .map_err(|_| ConversionOverflowError::new("Uint256", "Int128", value)) - } -} - -impl TryFrom for Int128 { - type Error = ConversionOverflowError; - - fn try_from(value: Uint512) -> Result { - value - .0 - .try_into() // convert to i128 - .map(Self::new) - .map_err(|_| ConversionOverflowError::new("Uint512", "Int128", value)) - } -} +forward_try_from!(Uint128, Int128); +forward_try_from!(Uint256, Int128); +forward_try_from!(Uint512, Int128); // uint to Int impl From for Int128 { @@ -345,25 +312,8 @@ impl From for Int128 { } } -impl TryFrom for Int128 { - type Error = ConversionOverflowError; - - fn try_from(value: Int256) -> Result { - shrink_be_int(value.to_be_bytes()) - .ok_or_else(|| ConversionOverflowError::new("Int256", "Int128", value)) - .map(Self::from_be_bytes) - } -} - -impl TryFrom for Int128 { - type Error = ConversionOverflowError; - - fn try_from(value: Int512) -> Result { - shrink_be_int(value.to_be_bytes()) - .ok_or_else(|| ConversionOverflowError::new("Int512", "Int128", value)) - .map(Self::from_be_bytes) - } -} +try_from_int_to_int!(Int256, Int128); +try_from_int_to_int!(Int512, Int128); // int to Int impl From for Int128 { diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index 1dfb89ca0c..9c5f8707be 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -1,4 +1,3 @@ -use bnum::prelude::As; use core::fmt; use core::ops::{ Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Not, Rem, RemAssign, Shl, ShlAssign, Shr, @@ -19,7 +18,7 @@ use crate::{ /// the implementation in the future. use bnum::types::{I256, U256}; -use super::conversion::{grow_be_int, shrink_be_int}; +use super::conversion::{grow_be_int, try_from_int_to_int, try_from_uint_to_int}; /// An implementation of i256 that is using strings for JSON encoding/decoding, /// such that the full i256 range can be used for clients that convert JSON numbers to floats, @@ -42,7 +41,7 @@ use super::conversion::{grow_be_int, shrink_be_int}; /// assert_eq!(a, b); /// ``` #[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] -pub struct Int256(#[schemars(with = "String")] I256); +pub struct Int256(#[schemars(with = "String")] pub(crate) I256); forward_ref_partial_eq!(Int256, Int256); @@ -330,33 +329,8 @@ impl Int256 { } // Uint to Int -impl TryFrom for Int256 { - type Error = ConversionOverflowError; - - fn try_from(value: Uint512) -> Result { - // Self::MAX fits into Uint512, so we can just cast it - if value.0 > Self::MAX.0.as_() { - return Err(ConversionOverflowError::new("Uint512", "Int256", value)); - } - - // at this point we know it fits - Ok(Self(value.0.as_())) - } -} - -impl TryFrom for Int256 { - type Error = ConversionOverflowError; - - fn try_from(value: Uint256) -> Result { - // Self::MAX fits into Uint256, so we can just cast it - if value.0 > Self::MAX.0.as_() { - return Err(ConversionOverflowError::new("Uint256", "Int256", value)); - } - - // at this point we know it fits - Ok(Self(value.0.as_())) - } -} +try_from_uint_to_int!(Uint512, Int256); +try_from_uint_to_int!(Uint256, Int256); impl From for Int256 { fn from(val: Uint128) -> Self { @@ -402,15 +376,7 @@ impl From for Int256 { } // Int to Int -impl TryFrom for Int256 { - type Error = ConversionOverflowError; - - fn try_from(value: Int512) -> Result { - shrink_be_int(value.to_be_bytes()) - .ok_or_else(|| ConversionOverflowError::new("Int512", "Int256", value)) - .map(Self::from_be_bytes) - } -} +try_from_int_to_int!(Int512, Int256); impl From for Int256 { fn from(val: Int128) -> Self { diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index 2308b8d518..c58904069f 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -1,4 +1,3 @@ -use bnum::prelude::As; use core::fmt; use core::ops::{ Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Not, Rem, RemAssign, Shl, ShlAssign, Shr, @@ -19,7 +18,7 @@ use crate::{ /// the implementation in the future. use bnum::types::{I512, U512}; -use super::conversion::grow_be_int; +use super::conversion::{grow_be_int, try_from_uint_to_int}; /// An implementation of i512 that is using strings for JSON encoding/decoding, /// such that the full i512 range can be used for clients that convert JSON numbers to floats, @@ -46,7 +45,7 @@ use super::conversion::grow_be_int; /// assert_eq!(a, b); /// ``` #[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] -pub struct Int512(#[schemars(with = "String")] I512); +pub struct Int512(#[schemars(with = "String")] pub(crate) I512); forward_ref_partial_eq!(Int512, Int512); @@ -318,19 +317,7 @@ impl Int512 { } // Uint to Int -impl TryFrom for Int512 { - type Error = ConversionOverflowError; - - fn try_from(value: Uint512) -> Result { - // Self::MAX fits into Uint512, so we can just cast it - if value.0 > Self::MAX.0.as_() { - return Err(ConversionOverflowError::new("Uint512", "Int512", value)); - } - - // at this point we know it fits - Ok(Self(value.0.as_())) - } -} +try_from_uint_to_int!(Uint512, Int512); impl From for Int512 { fn from(val: Uint256) -> Self { diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index e53c0d36bb..ed5f8f4a70 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -14,7 +14,7 @@ use crate::{ Int512, Uint128, Uint256, Uint512, Uint64, }; -use super::conversion::shrink_be_int; +use super::conversion::{forward_try_from, try_from_int_to_int}; /// An implementation of i64 that is using strings for JSON encoding/decoding, /// such that the full i64 range can be used for clients that convert JSON numbers to floats, @@ -30,7 +30,7 @@ use super::conversion::shrink_be_int; /// assert_eq!(a.i64(), 258); /// ``` #[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] -pub struct Int64(#[schemars(with = "String")] i64); +pub struct Int64(#[schemars(with = "String")] pub(crate) i64); forward_ref_partial_eq!(Int64, Int64); @@ -315,84 +315,15 @@ impl From for Int64 { } // Int to Int -impl TryFrom for Int64 { - type Error = ConversionOverflowError; - - fn try_from(value: Int128) -> Result { - shrink_be_int(value.to_be_bytes()) - .ok_or_else(|| ConversionOverflowError::new("Int128", "Int64", value)) - .map(Self::from_be_bytes) - } -} - -impl TryFrom for Int64 { - type Error = ConversionOverflowError; - - fn try_from(value: Int256) -> Result { - shrink_be_int(value.to_be_bytes()) - .ok_or_else(|| ConversionOverflowError::new("Int256", "Int64", value)) - .map(Self::from_be_bytes) - } -} - -impl TryFrom for Int64 { - type Error = ConversionOverflowError; - - fn try_from(value: Int512) -> Result { - shrink_be_int(value.to_be_bytes()) - .ok_or_else(|| ConversionOverflowError::new("Int512", "Int64", value)) - .map(Self::from_be_bytes) - } -} +try_from_int_to_int!(Int128, Int64); +try_from_int_to_int!(Int256, Int64); +try_from_int_to_int!(Int512, Int64); // Uint to Int -impl TryFrom for Int64 { - type Error = ConversionOverflowError; - - fn try_from(value: Uint64) -> Result { - value - .u64() - .try_into() // convert to i64 - .map(Self::new) - .map_err(|_| ConversionOverflowError::new("Uint64", "Int64", value)) - } -} - -impl TryFrom for Int64 { - type Error = ConversionOverflowError; - - fn try_from(value: Uint128) -> Result { - value - .u128() - .try_into() // convert to i64 - .map(Self::new) - .map_err(|_| ConversionOverflowError::new("Uint64", "Int64", value)) - } -} - -impl TryFrom for Int64 { - type Error = ConversionOverflowError; - - fn try_from(value: Uint256) -> Result { - value - .0 - .try_into() - .map(Int64) - .map_err(|_| ConversionOverflowError::new("Uint256", "Int64", value)) - } -} - -impl TryFrom for Int64 { - type Error = ConversionOverflowError; - - fn try_from(value: Uint512) -> Result { - value - .0 - .try_into() - .map(Int64) - .map_err(|_| ConversionOverflowError::new("Uint512", "Int64", value)) - } -} +forward_try_from!(Uint64, Int64); +forward_try_from!(Uint128, Int64); +forward_try_from!(Uint256, Int64); +forward_try_from!(Uint512, Int64); impl TryFrom<&str> for Int64 { type Error = StdError; diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 06e9549929..009c059222 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -15,9 +15,12 @@ use crate::errors::{ OverflowOperation, StdError, }; use crate::{ - forward_ref_partial_eq, impl_mul_fraction, ConversionOverflowError, Fraction, Uint256, Uint64, + forward_ref_partial_eq, impl_mul_fraction, ConversionOverflowError, Fraction, Int128, Int256, + Int512, Int64, Uint256, Uint64, }; +use super::conversion::forward_try_from; + /// A thin wrapper around u128 that is using strings for JSON encoding/decoding, /// such that the full u128 range can be used for clients that convert JSON numbers to floats, /// like JavaScript and jq. @@ -312,15 +315,13 @@ impl From for Uint128 { } } -impl TryFrom for Uint64 { - type Error = ConversionOverflowError; +forward_try_from!(Uint128, Uint64); - fn try_from(value: Uint128) -> Result { - Ok(Uint64::new(value.0.try_into().map_err(|_| { - ConversionOverflowError::new("Uint128", "Uint64", value.to_string()) - })?)) - } -} +// Int to Uint +forward_try_from!(Int64, Uint128); +forward_try_from!(Int128, Uint128); +forward_try_from!(Int256, Uint128); +forward_try_from!(Int512, Uint128); impl TryFrom<&str> for Uint128 { type Error = StdError; diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index b9de472435..1c6e7f9def 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -19,6 +19,8 @@ use crate::{forward_ref_partial_eq, impl_mul_fraction, Fraction, Uint128, Uint51 /// the implementation in the future. use bnum::types::U256; +use super::conversion::forward_try_from; + /// An implementation of u256 that is using strings for JSON encoding/decoding, /// such that the full u256 range can be used for clients that convert JSON numbers to floats, /// like JavaScript and jq. @@ -379,15 +381,7 @@ impl From for Uint256 { } } -impl TryFrom for Uint128 { - type Error = ConversionOverflowError; - - fn try_from(value: Uint256) -> Result { - Ok(Uint128::new(value.0.try_into().map_err(|_| { - ConversionOverflowError::new("Uint256", "Uint128", value.to_string()) - })?)) - } -} +forward_try_from!(Uint256, Uint128); impl TryFrom for Uint64 { type Error = ConversionOverflowError; diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index dd5a1e9aa0..7f418afb11 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -17,6 +17,8 @@ use crate::{forward_ref_partial_eq, Uint128, Uint256, Uint64}; /// the implementation in the future. use bnum::types::U512; +use super::conversion::forward_try_from; + /// An implementation of u512 that is using strings for JSON encoding/decoding, /// such that the full u512 range can be used for clients that convert JSON numbers to floats, /// like JavaScript and jq. @@ -370,15 +372,7 @@ impl TryFrom for Uint256 { } } -impl TryFrom for Uint128 { - type Error = ConversionOverflowError; - - fn try_from(value: Uint512) -> Result { - Ok(Uint128::new(value.0.try_into().map_err(|_| { - ConversionOverflowError::new("Uint512", "Uint128", value.to_string()) - })?)) - } -} +forward_try_from!(Uint512, Uint128); impl TryFrom for Uint64 { type Error = ConversionOverflowError; diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index f405b23643..0881952110 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -12,7 +12,12 @@ use crate::errors::{ CheckedMultiplyFractionError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, OverflowOperation, StdError, }; -use crate::{forward_ref_partial_eq, impl_mul_fraction, Fraction, Uint128}; +use crate::{ + forward_ref_partial_eq, impl_mul_fraction, ConversionOverflowError, Fraction, Int128, Int256, + Int512, Int64, Uint128, +}; + +use super::conversion::forward_try_from; /// A thin wrapper around u64 that is using strings for JSON encoding/decoding, /// such that the full u64 range can be used for clients that convert JSON numbers to floats, @@ -269,6 +274,7 @@ impl_mul_fraction!(Uint64); // of the conflict with `TryFrom<&str>` as described here // https://stackoverflow.com/questions/63136970/how-do-i-work-around-the-upstream-crates-may-add-a-new-impl-of-trait-error +// uint to Uint impl From for Uint64 { fn from(val: u64) -> Self { Uint64(val) @@ -293,6 +299,12 @@ impl From for Uint64 { } } +// Int to Uint +forward_try_from!(Int64, Uint64); +forward_try_from!(Int128, Uint64); +forward_try_from!(Int256, Uint64); +forward_try_from!(Int512, Uint64); + impl TryFrom<&str> for Uint64 { type Error = StdError; From e0171af4a85da22e365ab2a035240d0eee03536f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 13 Sep 2023 16:41:36 +0200 Subject: [PATCH 0717/2372] Add signed to unsigned TryFroms --- packages/std/src/math/conversion.rs | 73 +++++++++++++++++++++++------ packages/std/src/math/int512.rs | 5 +- packages/std/src/math/uint256.rs | 22 ++++----- packages/std/src/math/uint512.rs | 19 ++++---- 4 files changed, 79 insertions(+), 40 deletions(-) diff --git a/packages/std/src/math/conversion.rs b/packages/std/src/math/conversion.rs index 1872a3e2df..15f2602803 100644 --- a/packages/std/src/math/conversion.rs +++ b/packages/std/src/math/conversion.rs @@ -61,16 +61,18 @@ pub fn shrink_be_int( } /// Helper macro to implement `TryFrom` for a type that is just a wrapper around another type. -/// This can be used for all our integer conversions where `bint` implements `TryFrom`. +/// This can be used for all our integer conversions where `bnum` implements `TryFrom`. macro_rules! forward_try_from { ($input: ty, $output: ty) => { impl TryFrom<$input> for $output { - type Error = ConversionOverflowError; + type Error = $crate::ConversionOverflowError; fn try_from(value: $input) -> Result { - value.0.try_into().map(Self).map_err(|_| { - ConversionOverflowError::new(stringify!($input), stringify!($output), value) - }) + value + .0 + .try_into() + .map(Self) + .map_err(|_| Self::Error::new(stringify!($input), stringify!($output), value)) } } }; @@ -79,18 +81,16 @@ pub(crate) use forward_try_from; // TODO: assert statically that input is bigger than output and that both are ints /// Helper macro to implement `TryFrom` for a conversion from a bigger signed int to a smaller one. -/// This is needed because `bint` does not implement `TryFrom` for those conversions +/// This is needed because `bnum` does not implement `TryFrom` for those conversions /// because of limitations of const generics. macro_rules! try_from_int_to_int { ($input: ty, $output: ty) => { impl TryFrom<$input> for $output { - type Error = ConversionOverflowError; + type Error = $crate::ConversionOverflowError; fn try_from(value: $input) -> Result { $crate::math::conversion::shrink_be_int(value.to_be_bytes()) - .ok_or_else(|| { - ConversionOverflowError::new(stringify!($input), stringify!($output), value) - }) + .ok_or_else(|| Self::Error::new(stringify!($input), stringify!($output), value)) .map(Self::from_be_bytes) } } @@ -98,18 +98,20 @@ macro_rules! try_from_int_to_int { } pub(crate) use try_from_int_to_int; -// TODO: assert statically that input is bigger than output and that both are ints +/// Helper macro to implement `TryFrom` for a conversion from a unsigned int to a smaller or +/// equal sized signed int. +/// This is needed because `bnum` does not implement `TryFrom` for all of those conversions. macro_rules! try_from_uint_to_int { ($input: ty, $output: ty) => { impl TryFrom<$input> for $output { - type Error = ConversionOverflowError; + type Error = $crate::ConversionOverflowError; fn try_from(value: $input) -> Result { - // $input has to be bigger than $output, + // $input::MAX has to be bigger than $output::MAX, // otherwise we would not need a `TryFrom` impl, so we can just cast it use bnum::prelude::As; if value.0 > Self::MAX.0.as_() { - return Err(ConversionOverflowError::new( + return Err(Self::Error::new( stringify!($input), stringify!($output), value, @@ -125,6 +127,49 @@ macro_rules! try_from_uint_to_int { pub(crate) use try_from_uint_to_int; +/// Helper macro to implement `TryFrom` for a conversion from a signed int to an unsigned int. +/// This is needed because `bnum` does not implement `TryFrom` for all of those conversions. +macro_rules! try_from_int_to_uint { + ($input: ty, $output: ty) => { + impl TryFrom<$input> for $output { + type Error = ConversionOverflowError; + + fn try_from(value: $input) -> Result { + use bnum::prelude::As; + // if $input::MAX is smaller than $output::MAX, we only need to check the sign + if core::mem::size_of::<$input>() <= core::mem::size_of::<$output>() { + if value.is_negative() { + return Err(ConversionOverflowError::new( + stringify!($input), + stringify!($output), + value, + )); + } + + // otherwise we can just cast it + Ok(Self(value.0.as_())) + } else { + // $output::MAX is smaller than $input::MAX. + // If it is negative or too big, we error. + // We can safely cast $output::MAX to $input size + if value.is_negative() || value.0 > <$output>::MAX.0.as_() { + return Err(ConversionOverflowError::new( + stringify!($input), + stringify!($output), + value, + )); + } + + // at this point we know it fits + Ok(Self(value.0.as_())) + } + } + } + }; +} + +pub(crate) use try_from_int_to_uint; + #[cfg(test)] mod tests { use super::*; diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index c58904069f..318204408a 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -9,10 +9,7 @@ use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; -use crate::{ - forward_ref_partial_eq, ConversionOverflowError, Int128, Int256, Int64, Uint128, Uint256, - Uint512, Uint64, -}; +use crate::{forward_ref_partial_eq, Int128, Int256, Int64, Uint128, Uint256, Uint512, Uint64}; /// Used internally - we don't want to leak this type since we might change /// the implementation in the future. diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 1c6e7f9def..4d08268c63 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -13,13 +13,16 @@ use crate::errors::{ CheckedMultiplyFractionError, CheckedMultiplyRatioError, ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, StdError, }; -use crate::{forward_ref_partial_eq, impl_mul_fraction, Fraction, Uint128, Uint512, Uint64}; +use crate::{ + forward_ref_partial_eq, impl_mul_fraction, Fraction, Int128, Int256, Int512, Int64, Uint128, + Uint512, Uint64, +}; /// Used internally - we don't want to leak this type since we might change /// the implementation in the future. use bnum::types::U256; -use super::conversion::forward_try_from; +use super::conversion::{forward_try_from, try_from_int_to_uint}; /// An implementation of u256 that is using strings for JSON encoding/decoding, /// such that the full u256 range can be used for clients that convert JSON numbers to floats, @@ -382,16 +385,13 @@ impl From for Uint256 { } forward_try_from!(Uint256, Uint128); +forward_try_from!(Uint256, Uint64); -impl TryFrom for Uint64 { - type Error = ConversionOverflowError; - - fn try_from(value: Uint256) -> Result { - Ok(Uint64::new(value.0.try_into().map_err(|_| { - ConversionOverflowError::new("Uint256", "Uint64", value.to_string()) - })?)) - } -} +// Int to Uint +try_from_int_to_uint!(Int64, Uint256); +try_from_int_to_uint!(Int128, Uint256); +try_from_int_to_uint!(Int256, Uint256); +try_from_int_to_uint!(Int512, Uint256); impl TryFrom<&str> for Uint256 { type Error = StdError; diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index 7f418afb11..424997dbcf 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -11,13 +11,13 @@ use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{ ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, StdError, }; -use crate::{forward_ref_partial_eq, Uint128, Uint256, Uint64}; +use crate::{forward_ref_partial_eq, Int128, Int256, Int512, Int64, Uint128, Uint256, Uint64}; /// Used internally - we don't want to leak this type since we might change /// the implementation in the future. use bnum::types::U512; -use super::conversion::forward_try_from; +use super::conversion::{forward_try_from, try_from_int_to_uint}; /// An implementation of u512 that is using strings for JSON encoding/decoding, /// such that the full u512 range can be used for clients that convert JSON numbers to floats, @@ -373,16 +373,13 @@ impl TryFrom for Uint256 { } forward_try_from!(Uint512, Uint128); +forward_try_from!(Uint512, Uint64); -impl TryFrom for Uint64 { - type Error = ConversionOverflowError; - - fn try_from(value: Uint512) -> Result { - Ok(Uint64::new(value.0.try_into().map_err(|_| { - ConversionOverflowError::new("Uint512", "Uint64", value.to_string()) - })?)) - } -} +// Int to Uint +try_from_int_to_uint!(Int64, Uint512); +try_from_int_to_uint!(Int128, Uint512); +try_from_int_to_uint!(Int256, Uint512); +try_from_int_to_uint!(Int512, Uint512); impl TryFrom<&str> for Uint512 { type Error = StdError; From 0249e687ae1e2ae1ce99fde329ee9c81fa0fbb80 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 13 Sep 2023 16:45:25 +0200 Subject: [PATCH 0718/2372] Fix unused imports --- packages/std/src/math/int128.rs | 4 ++-- packages/std/src/math/int256.rs | 4 ++-- packages/std/src/math/int64.rs | 4 ++-- packages/std/src/math/uint128.rs | 4 ++-- packages/std/src/math/uint64.rs | 3 +-- 5 files changed, 9 insertions(+), 10 deletions(-) diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index 56e2b7cab8..ecce5948d3 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -10,8 +10,8 @@ use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; use crate::{ - forward_ref_partial_eq, CheckedMultiplyRatioError, ConversionOverflowError, Int256, Int512, - Int64, Uint128, Uint256, Uint512, Uint64, + forward_ref_partial_eq, CheckedMultiplyRatioError, Int256, Int512, Int64, Uint128, Uint256, + Uint512, Uint64, }; use super::conversion::{forward_try_from, try_from_int_to_int}; diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index 9c5f8707be..2e7dcb9206 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -10,8 +10,8 @@ use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; use crate::{ - forward_ref_partial_eq, CheckedMultiplyRatioError, ConversionOverflowError, Int128, Int512, - Int64, Uint128, Uint256, Uint512, Uint64, + forward_ref_partial_eq, CheckedMultiplyRatioError, Int128, Int512, Int64, Uint128, Uint256, + Uint512, Uint64, }; /// Used internally - we don't want to leak this type since we might change diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index ed5f8f4a70..006259b305 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -10,8 +10,8 @@ use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; use crate::{ - forward_ref_partial_eq, CheckedMultiplyRatioError, ConversionOverflowError, Int128, Int256, - Int512, Uint128, Uint256, Uint512, Uint64, + forward_ref_partial_eq, CheckedMultiplyRatioError, Int128, Int256, Int512, Uint128, Uint256, + Uint512, Uint64, }; use super::conversion::{forward_try_from, try_from_int_to_int}; diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 009c059222..e19decc205 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -15,8 +15,8 @@ use crate::errors::{ OverflowOperation, StdError, }; use crate::{ - forward_ref_partial_eq, impl_mul_fraction, ConversionOverflowError, Fraction, Int128, Int256, - Int512, Int64, Uint256, Uint64, + forward_ref_partial_eq, impl_mul_fraction, Fraction, Int128, Int256, Int512, Int64, Uint256, + Uint64, }; use super::conversion::forward_try_from; diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index 0881952110..bcc46b6e37 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -13,8 +13,7 @@ use crate::errors::{ OverflowOperation, StdError, }; use crate::{ - forward_ref_partial_eq, impl_mul_fraction, ConversionOverflowError, Fraction, Int128, Int256, - Int512, Int64, Uint128, + forward_ref_partial_eq, impl_mul_fraction, Fraction, Int128, Int256, Int512, Int64, Uint128, }; use super::conversion::forward_try_from; From 56887586a26f75b42e54a95d9206f67215a1779c Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 13 Sep 2023 17:12:34 +0200 Subject: [PATCH 0719/2372] Fix test --- packages/std/src/math/uint128.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index e19decc205..99f811158f 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -608,7 +608,7 @@ where #[cfg(test)] mod tests { use crate::errors::CheckedMultiplyFractionError::{ConversionOverflow, DivideByZero}; - use crate::{from_slice, to_vec, Decimal}; + use crate::{from_slice, to_vec, ConversionOverflowError, Decimal}; use super::*; From 4a2cd85cdb2ccdae044ad5dc416118945bfda293 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 13 Sep 2023 17:23:13 +0200 Subject: [PATCH 0720/2372] Add static assertions --- Cargo.lock | 7 +++++++ packages/std/Cargo.toml | 1 + packages/std/src/math/conversion.rs | 24 +++++++++++++++++++++--- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d23defb584..83ac5a0c44 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -502,6 +502,7 @@ dependencies = [ "serde-json-wasm", "serde_json", "sha2 0.10.6", + "static_assertions", "thiserror", ] @@ -2034,6 +2035,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "strsim" version = "0.10.0" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 13b12083f3..323b73b70c 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -61,6 +61,7 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " serde-json-wasm = { version = "0.5.0" } thiserror = "1.0.26" bnum = "0.8.0" +static_assertions = "1.1.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] cosmwasm-crypto = { path = "../crypto", version = "1.4.0" } diff --git a/packages/std/src/math/conversion.rs b/packages/std/src/math/conversion.rs index 15f2602803..f1292d4fb7 100644 --- a/packages/std/src/math/conversion.rs +++ b/packages/std/src/math/conversion.rs @@ -79,12 +79,15 @@ macro_rules! forward_try_from { } pub(crate) use forward_try_from; -// TODO: assert statically that input is bigger than output and that both are ints /// Helper macro to implement `TryFrom` for a conversion from a bigger signed int to a smaller one. /// This is needed because `bnum` does not implement `TryFrom` for those conversions /// because of limitations of const generics. macro_rules! try_from_int_to_int { ($input: ty, $output: ty) => { + // statically assert that the input is bigger than the output + static_assertions::const_assert!( + core::mem::size_of::<$input>() > core::mem::size_of::<$output>() + ); impl TryFrom<$input> for $output { type Error = $crate::ConversionOverflowError; @@ -103,13 +106,22 @@ pub(crate) use try_from_int_to_int; /// This is needed because `bnum` does not implement `TryFrom` for all of those conversions. macro_rules! try_from_uint_to_int { ($input: ty, $output: ty) => { + // statically assert that... + // input is unsigned + static_assertions::const_assert_eq!(stringify!($input).as_bytes()[0], b'U'); + // output is signed + static_assertions::const_assert_eq!(stringify!($output).as_bytes()[0], b'I'); + // input is bigger than output (otherwise we would not need a `TryFrom` impl) + static_assertions::const_assert!( + core::mem::size_of::<$input>() >= core::mem::size_of::<$output>() + ); + impl TryFrom<$input> for $output { type Error = $crate::ConversionOverflowError; fn try_from(value: $input) -> Result { - // $input::MAX has to be bigger than $output::MAX, - // otherwise we would not need a `TryFrom` impl, so we can just cast it use bnum::prelude::As; + // $input::MAX has to be bigger than $output::MAX, so we can just cast it if value.0 > Self::MAX.0.as_() { return Err(Self::Error::new( stringify!($input), @@ -131,6 +143,12 @@ pub(crate) use try_from_uint_to_int; /// This is needed because `bnum` does not implement `TryFrom` for all of those conversions. macro_rules! try_from_int_to_uint { ($input: ty, $output: ty) => { + // statically assert that... + // input is signed + static_assertions::const_assert_eq!(stringify!($input).as_bytes()[0], b'I'); + // output is unsigned + static_assertions::const_assert_eq!(stringify!($output).as_bytes()[0], b'U'); + impl TryFrom<$input> for $output { type Error = ConversionOverflowError; From 00746b5e21642a521d6bcdd2ddf22edcb8deda09 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 13 Sep 2023 17:53:18 +0200 Subject: [PATCH 0721/2372] Fix Cargo.lock files --- contracts/burner/Cargo.lock | 7 +++++++ contracts/crypto-verify/Cargo.lock | 7 +++++++ contracts/cyberpunk/Cargo.lock | 7 +++++++ contracts/floaty/Cargo.lock | 7 +++++++ contracts/hackatom/Cargo.lock | 7 +++++++ contracts/ibc-reflect-send/Cargo.lock | 7 +++++++ contracts/ibc-reflect/Cargo.lock | 7 +++++++ contracts/queue/Cargo.lock | 7 +++++++ contracts/reflect/Cargo.lock | 7 +++++++ contracts/staking/Cargo.lock | 7 +++++++ contracts/virus/Cargo.lock | 7 +++++++ 11 files changed, 77 insertions(+) diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index fd095ac5a3..7fa350f505 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -244,6 +244,7 @@ dependencies = [ "serde", "serde-json-wasm", "sha2 0.10.3", + "static_assertions", "thiserror", ] @@ -1407,6 +1408,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "strsim" version = "0.10.0" diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 953bf83a64..5636fa7796 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -233,6 +233,7 @@ dependencies = [ "serde", "serde-json-wasm", "sha2 0.10.3", + "static_assertions", "thiserror", ] @@ -1450,6 +1451,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "strsim" version = "0.10.0" diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 4d37fda836..8e57b58a64 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -268,6 +268,7 @@ dependencies = [ "serde", "serde-json-wasm", "sha2 0.10.3", + "static_assertions", "thiserror", ] @@ -1531,6 +1532,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "strsim" version = "0.10.0" diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index d3e15072a0..37e0fc6474 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -233,6 +233,7 @@ dependencies = [ "serde", "serde-json-wasm", "sha2 0.10.3", + "static_assertions", "thiserror", ] @@ -1408,6 +1409,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "strsim" version = "0.10.0" diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 1a9c1f9dff..f83083cc8f 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -233,6 +233,7 @@ dependencies = [ "serde", "serde-json-wasm", "sha2 0.10.3", + "static_assertions", "thiserror", ] @@ -1409,6 +1410,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "strsim" version = "0.10.0" diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 47e48de0e0..81954a09e6 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -233,6 +233,7 @@ dependencies = [ "serde", "serde-json-wasm", "sha2 0.10.3", + "static_assertions", "thiserror", ] @@ -1407,6 +1408,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "strsim" version = "0.10.0" diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 1408955925..6a64201229 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -233,6 +233,7 @@ dependencies = [ "serde", "serde-json-wasm", "sha2 0.10.3", + "static_assertions", "thiserror", ] @@ -1407,6 +1408,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "strsim" version = "0.10.0" diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 73f7809bc4..1bd7277f4b 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -233,6 +233,7 @@ dependencies = [ "serde", "serde-json-wasm", "sha2 0.10.3", + "static_assertions", "thiserror", ] @@ -1407,6 +1408,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "strsim" version = "0.10.0" diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index cd1189d134..b144d43571 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -233,6 +233,7 @@ dependencies = [ "serde", "serde-json-wasm", "sha2 0.10.3", + "static_assertions", "thiserror", ] @@ -1408,6 +1409,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "strsim" version = "0.10.0" diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 884ee8dbae..4197746d30 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -233,6 +233,7 @@ dependencies = [ "serde", "serde-json-wasm", "sha2 0.10.3", + "static_assertions", "thiserror", ] @@ -1435,6 +1436,12 @@ dependencies = [ "snafu", ] +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "strsim" version = "0.10.0" diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 767054387a..0727cbeb83 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -233,6 +233,7 @@ dependencies = [ "serde", "serde-json-wasm", "sha2 0.10.3", + "static_assertions", "thiserror", ] @@ -1396,6 +1397,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "strsim" version = "0.10.0" From 47bb0cb5c2de3f37baf47eb95934ffb43e9d83e2 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 14 Sep 2023 11:51:36 +0200 Subject: [PATCH 0722/2372] Add TryFrom tests --- packages/std/src/math/conversion.rs | 134 +++++++++++++++++++++++++++- packages/std/src/math/int128.rs | 17 +++- packages/std/src/math/int256.rs | 16 +++- packages/std/src/math/int512.rs | 16 +++- packages/std/src/math/int64.rs | 18 +++- packages/std/src/math/mod.rs | 2 + packages/std/src/math/num_consts.rs | 7 ++ packages/std/src/math/uint128.rs | 17 ++++ packages/std/src/math/uint256.rs | 17 ++++ packages/std/src/math/uint512.rs | 18 +++- packages/std/src/math/uint64.rs | 17 ++++ 11 files changed, 272 insertions(+), 7 deletions(-) create mode 100644 packages/std/src/math/num_consts.rs diff --git a/packages/std/src/math/conversion.rs b/packages/std/src/math/conversion.rs index f1292d4fb7..cf889642ae 100644 --- a/packages/std/src/math/conversion.rs +++ b/packages/std/src/math/conversion.rs @@ -136,9 +136,138 @@ macro_rules! try_from_uint_to_int { } }; } - pub(crate) use try_from_uint_to_int; +#[cfg(test)] +pub(crate) fn test_try_from_uint_to_int(input_type: &'static str, output_type: &'static str) +where + I: super::num_consts::NumConsts + + From + + Copy + + TryFrom + + core::fmt::Debug + + core::ops::Add, + O: TryFrom + + From + + NumConsts + + core::cmp::PartialEq + + core::fmt::Debug, + String: From, +{ + let v = I::MAX; + assert_eq!( + O::try_from(v), + Err(crate::ConversionOverflowError::new( + input_type, + output_type, + v + )), + "input::MAX value should not fit" + ); + + let max = I::try_from(O::MAX).unwrap(); + assert_eq!(O::try_from(max), Ok(O::MAX), "output::MAX value should fit"); + + // but $output::MAX + 1 should not fit + let v = max + I::ONE; + assert_eq!( + O::try_from(v), + Err(crate::ConversionOverflowError::new( + input_type, + output_type, + v + )), + "output::MAX + 1 should not fit" + ); + + // zero should work + let v = I::ZERO; + assert_eq!(O::try_from(v), Ok(O::ZERO), "zero should fit"); + + // 42 should work + assert_eq!( + O::try_from(I::from(42u32)), + Ok(O::from(42u32)), + "42 should fit" + ) +} + +#[cfg(test)] +pub(crate) fn test_try_from_int_to_uint(input_type: &'static str, output_type: &'static str) +where + I: NumConsts + From + Copy + TryFrom + core::fmt::Debug + core::ops::Add, + O: TryFrom + + From + + NumConsts + + core::cmp::PartialEq + + core::fmt::Debug, + String: From, + >::Error: std::fmt::Debug, +{ + if core::mem::size_of::() <= core::mem::size_of::() { + // if the input type is smaller than the output type, then `I::MAX` should fit into `O` + let v = I::MAX; + assert_eq!( + O::try_from(v), + Ok(O::try_from(v).unwrap()), + "input::MAX value should fit" + ); + } else { + // if the input is bigger than the output, then `I::MAX` should not fit into `O` + let v = I::MAX; + assert_eq!( + O::try_from(v), + Err(crate::ConversionOverflowError::new( + input_type, + output_type, + v + )), + "input::MAX value should not fit" + ); + // but `O::MAX` should fit + let max = I::try_from(O::MAX).unwrap(); + assert_eq!( + O::try_from(max), + Ok(O::try_from(max).unwrap()), + "output::MAX value should fit" + ); + // while `O::MAX + 1` should not + let v = max + I::ONE; + assert_eq!( + O::try_from(v), + Err(crate::ConversionOverflowError::new( + input_type, + output_type, + v + )), + "output::MAX + 1 should not fit" + ); + } + + // negative numbers should fail + let v = I::from(-42i32); + assert_eq!( + O::try_from(v), + Err(crate::ConversionOverflowError::new( + input_type, + output_type, + v + )), + "negative numbers should not fit" + ); + + // zero should work + let v = I::ZERO; + assert_eq!(O::try_from(v), Ok(O::ZERO), "zero should fit"); + + // 42 should work + assert_eq!( + O::try_from(I::from(42i32)), + Ok(O::from(42u32)), + "42 should fit" + ) +} + /// Helper macro to implement `TryFrom` for a conversion from a signed int to an unsigned int. /// This is needed because `bnum` does not implement `TryFrom` for all of those conversions. macro_rules! try_from_int_to_uint { @@ -185,9 +314,10 @@ macro_rules! try_from_int_to_uint { } }; } - pub(crate) use try_from_int_to_uint; +use super::num_consts::NumConsts; + #[cfg(test)] mod tests { use super::*; diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index ecce5948d3..e764e0c6d3 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -15,6 +15,7 @@ use crate::{ }; use super::conversion::{forward_try_from, try_from_int_to_int}; +use super::num_consts::NumConsts; /// An implementation of i128 that is using strings for JSON encoding/decoding, /// such that the full i128 range can be used for clients that convert JSON numbers to floats, @@ -270,6 +271,13 @@ impl Int128 { } } +impl NumConsts for Int128 { + const ZERO: Self = Self::zero(); + const ONE: Self = Self::one(); + const MAX: Self = Self::MAX; + const MIN: Self = Self::MIN; +} + // Uint to Int impl From for Int128 { fn from(val: Uint64) -> Self { @@ -562,7 +570,7 @@ where #[cfg(test)] mod tests { use super::*; - use crate::{from_slice, to_vec}; + use crate::{from_slice, math::conversion::test_try_from_uint_to_int, to_vec}; #[test] fn size_of_works() { @@ -677,6 +685,13 @@ mod tests { assert!(result.is_err()); } + #[test] + fn int128_try_from_unsigned_works() { + test_try_from_uint_to_int::("Uint128", "Int128"); + test_try_from_uint_to_int::("Uint256", "Int128"); + test_try_from_uint_to_int::("Uint512", "Int128"); + } + #[test] fn int128_implements_display() { let a = Int128::from(12345u32); diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index 2e7dcb9206..26ca8dfd5e 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -19,6 +19,7 @@ use crate::{ use bnum::types::{I256, U256}; use super::conversion::{grow_be_int, try_from_int_to_int, try_from_uint_to_int}; +use super::num_consts::NumConsts; /// An implementation of i256 that is using strings for JSON encoding/decoding, /// such that the full i256 range can be used for clients that convert JSON numbers to floats, @@ -328,6 +329,13 @@ impl Int256 { } } +impl NumConsts for Int256 { + const ZERO: Self = Self::zero(); + const ONE: Self = Self::one(); + const MAX: Self = Self::MAX; + const MIN: Self = Self::MIN; +} + // Uint to Int try_from_uint_to_int!(Uint512, Int256); try_from_uint_to_int!(Uint256, Int256); @@ -637,7 +645,7 @@ where #[cfg(test)] mod tests { use super::*; - use crate::{from_slice, to_vec}; + use crate::{from_slice, math::conversion::test_try_from_uint_to_int, to_vec}; #[test] fn size_of_works() { @@ -748,6 +756,12 @@ mod tests { assert!(result.is_err()); } + #[test] + fn int256_try_from_unsigned_works() { + test_try_from_uint_to_int::("Uint256", "Int256"); + test_try_from_uint_to_int::("Uint512", "Int256"); + } + #[test] fn int256_from_i128() { assert_eq!(Int256::from_i128(123i128), Int256::from_str("123").unwrap()); diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index 318204408a..9824c63eb2 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -16,6 +16,7 @@ use crate::{forward_ref_partial_eq, Int128, Int256, Int64, Uint128, Uint256, Uin use bnum::types::{I512, U512}; use super::conversion::{grow_be_int, try_from_uint_to_int}; +use super::num_consts::NumConsts; /// An implementation of i512 that is using strings for JSON encoding/decoding, /// such that the full i512 range can be used for clients that convert JSON numbers to floats, @@ -313,6 +314,13 @@ impl Int512 { } } +impl NumConsts for Int512 { + const ZERO: Self = Self::zero(); + const ONE: Self = Self::one(); + const MAX: Self = Self::MAX; + const MIN: Self = Self::MIN; +} + // Uint to Int try_from_uint_to_int!(Uint512, Int512); @@ -634,7 +642,7 @@ where #[cfg(test)] mod tests { use super::*; - use crate::{from_slice, to_vec}; + use crate::{from_slice, math::conversion::test_try_from_uint_to_int, to_vec}; #[test] fn size_of_works() { @@ -785,6 +793,12 @@ mod tests { assert!(result.is_err()); } + #[test] + fn int512_try_from_unsigned_works() { + test_try_from_uint_to_int::("Uint256", "Int256"); + test_try_from_uint_to_int::("Uint512", "Int256"); + } + #[test] fn int512_implements_display() { let a = Int512::from(12345u32); diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index 006259b305..2a0c651500 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -15,6 +15,7 @@ use crate::{ }; use super::conversion::{forward_try_from, try_from_int_to_int}; +use super::num_consts::NumConsts; /// An implementation of i64 that is using strings for JSON encoding/decoding, /// such that the full i64 range can be used for clients that convert JSON numbers to floats, @@ -270,6 +271,13 @@ impl Int64 { } } +impl NumConsts for Int64 { + const ZERO: Self = Self::zero(); + const ONE: Self = Self::one(); + const MAX: Self = Self::MAX; + const MIN: Self = Self::MIN; +} + // uint to Int impl From for Int64 { fn from(val: u32) -> Self { @@ -541,7 +549,7 @@ where #[cfg(test)] mod tests { use super::*; - use crate::{from_slice, to_vec}; + use crate::{from_slice, math::conversion::test_try_from_uint_to_int, to_vec}; #[test] fn size_of_works() { @@ -650,6 +658,14 @@ mod tests { assert!(result.is_err()); } + #[test] + fn int64_try_from_unsigned_works() { + test_try_from_uint_to_int::("Uint64", "Int64"); + test_try_from_uint_to_int::("Uint128", "Int64"); + test_try_from_uint_to_int::("Uint256", "Int64"); + test_try_from_uint_to_int::("Uint512", "Int64"); + } + #[test] fn int64_implements_display() { let a = Int64::from(12345u32); diff --git a/packages/std/src/math/mod.rs b/packages/std/src/math/mod.rs index 9b27fd859a..fdff7647f8 100644 --- a/packages/std/src/math/mod.rs +++ b/packages/std/src/math/mod.rs @@ -7,6 +7,7 @@ mod int256; mod int512; mod int64; mod isqrt; +mod num_consts; mod uint128; mod uint256; mod uint512; @@ -71,6 +72,7 @@ mod tests { + ShrAssign + ShrAssign<&'a u32> + Not + + super::num_consts::NumConsts { } diff --git a/packages/std/src/math/num_consts.rs b/packages/std/src/math/num_consts.rs new file mode 100644 index 0000000000..b539542303 --- /dev/null +++ b/packages/std/src/math/num_consts.rs @@ -0,0 +1,7 @@ +/// Crate internal trait for all our signed and unsigned number types +pub(crate) trait NumConsts { + const MAX: Self; + const MIN: Self; + const ZERO: Self; + const ONE: Self; +} diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 99f811158f..b51f340001 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -20,6 +20,7 @@ use crate::{ }; use super::conversion::forward_try_from; +use super::num_consts::NumConsts; /// A thin wrapper around u128 that is using strings for JSON encoding/decoding, /// such that the full u128 range can be used for clients that convert JSON numbers to floats, @@ -272,6 +273,13 @@ impl Uint128 { } } +impl NumConsts for Uint128 { + const ZERO: Self = Self::zero(); + const ONE: Self = Self::one(); + const MAX: Self = Self::MAX; + const MIN: Self = Self::MIN; +} + impl_mul_fraction!(Uint128); // `From` is implemented manually instead of @@ -608,6 +616,7 @@ where #[cfg(test)] mod tests { use crate::errors::CheckedMultiplyFractionError::{ConversionOverflow, DivideByZero}; + use crate::math::conversion::test_try_from_int_to_uint; use crate::{from_slice, to_vec, ConversionOverflowError, Decimal}; use super::*; @@ -678,6 +687,14 @@ mod tests { assert!(result.is_err()); } + #[test] + fn uint128_try_from_signed_works() { + test_try_from_int_to_uint::("Int64", "Uint128"); + test_try_from_int_to_uint::("Int128", "Uint128"); + test_try_from_int_to_uint::("Int256", "Uint128"); + test_try_from_int_to_uint::("Int512", "Uint128"); + } + #[test] fn uint128_try_into() { assert!(Uint64::try_from(Uint128::MAX).is_err()); diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 4d08268c63..bd6745eca2 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -23,6 +23,7 @@ use crate::{ use bnum::types::U256; use super::conversion::{forward_try_from, try_from_int_to_uint}; +use super::num_consts::NumConsts; /// An implementation of u256 that is using strings for JSON encoding/decoding, /// such that the full u256 range can be used for clients that convert JSON numbers to floats, @@ -340,6 +341,13 @@ impl Uint256 { } } +impl NumConsts for Uint256 { + const ZERO: Self = Self::zero(); + const ONE: Self = Self::one(); + const MAX: Self = Self::MAX; + const MIN: Self = Self::MIN; +} + impl_mul_fraction!(Uint256); impl From for Uint256 { @@ -671,6 +679,7 @@ where mod tests { use super::*; use crate::errors::CheckedMultiplyFractionError::{ConversionOverflow, DivideByZero}; + use crate::math::conversion::test_try_from_int_to_uint; use crate::{from_slice, to_vec, Decimal, Decimal256}; #[test] @@ -1066,6 +1075,14 @@ mod tests { assert!(result.is_err()); } + #[test] + fn uint256_try_from_signed_works() { + test_try_from_int_to_uint::("Int64", "Uint256"); + test_try_from_int_to_uint::("Int128", "Uint256"); + test_try_from_int_to_uint::("Int256", "Uint256"); + test_try_from_int_to_uint::("Int512", "Uint256"); + } + #[test] fn uint256_try_into() { assert!(Uint64::try_from(Uint256::MAX).is_err()); diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index 424997dbcf..3f4db01469 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -18,6 +18,7 @@ use crate::{forward_ref_partial_eq, Int128, Int256, Int512, Int64, Uint128, Uint use bnum::types::U512; use super::conversion::{forward_try_from, try_from_int_to_uint}; +use super::num_consts::NumConsts; /// An implementation of u512 that is using strings for JSON encoding/decoding, /// such that the full u512 range can be used for clients that convert JSON numbers to floats, @@ -302,6 +303,13 @@ impl Uint512 { } } +impl NumConsts for Uint512 { + const ZERO: Self = Self::zero(); + const ONE: Self = Self::one(); + const MAX: Self = Self::MAX; + const MIN: Self = Self::MIN; +} + impl From for Uint512 { fn from(val: Uint256) -> Self { let mut bytes = [0u8; 64]; @@ -638,7 +646,7 @@ where #[cfg(test)] mod tests { use super::*; - use crate::{from_slice, to_vec}; + use crate::{from_slice, math::conversion::test_try_from_int_to_uint, to_vec}; #[test] fn size_of_works() { @@ -749,6 +757,14 @@ mod tests { assert!(result.is_err()); } + #[test] + fn uint512_try_from_signed_works() { + test_try_from_int_to_uint::("Int64", "Uint512"); + test_try_from_int_to_uint::("Int128", "Uint512"); + test_try_from_int_to_uint::("Int256", "Uint512"); + test_try_from_int_to_uint::("Int512", "Uint512"); + } + #[test] fn uint512_try_into() { assert!(Uint64::try_from(Uint512::MAX).is_err()); diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index bcc46b6e37..961f46ef17 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -17,6 +17,7 @@ use crate::{ }; use super::conversion::forward_try_from; +use super::num_consts::NumConsts; /// A thin wrapper around u64 that is using strings for JSON encoding/decoding, /// such that the full u64 range can be used for clients that convert JSON numbers to floats, @@ -266,6 +267,13 @@ impl Uint64 { } } +impl NumConsts for Uint64 { + const ZERO: Self = Self::zero(); + const ONE: Self = Self::one(); + const MAX: Self = Self::MAX; + const MIN: Self = Self::MIN; +} + impl_mul_fraction!(Uint64); // `From` is implemented manually instead of @@ -570,6 +578,7 @@ where mod tests { use super::*; use crate::errors::CheckedMultiplyFractionError::{ConversionOverflow, DivideByZero}; + use crate::math::conversion::test_try_from_int_to_uint; use crate::{from_slice, to_vec, ConversionOverflowError}; #[test] @@ -629,6 +638,14 @@ mod tests { assert!(result.is_err()); } + #[test] + fn uint64_try_from_signed_works() { + test_try_from_int_to_uint::("Int64", "Uint64"); + test_try_from_int_to_uint::("Int128", "Uint64"); + test_try_from_int_to_uint::("Int256", "Uint64"); + test_try_from_int_to_uint::("Int512", "Uint64"); + } + #[test] fn uint64_implements_display() { let a = Uint64(12345); From 7694f7fd889cccb9f8cbb1f189e3f5ce73ca3613 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 14 Sep 2023 12:15:33 +0200 Subject: [PATCH 0723/2372] Fix import --- packages/std/src/math/conversion.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/std/src/math/conversion.rs b/packages/std/src/math/conversion.rs index cf889642ae..240cbf8650 100644 --- a/packages/std/src/math/conversion.rs +++ b/packages/std/src/math/conversion.rs @@ -149,7 +149,7 @@ where + core::ops::Add, O: TryFrom + From - + NumConsts + + super::num_consts::NumConsts + core::cmp::PartialEq + core::fmt::Debug, String: From, @@ -195,10 +195,15 @@ where #[cfg(test)] pub(crate) fn test_try_from_int_to_uint(input_type: &'static str, output_type: &'static str) where - I: NumConsts + From + Copy + TryFrom + core::fmt::Debug + core::ops::Add, + I: super::num_consts::NumConsts + + From + + Copy + + TryFrom + + core::fmt::Debug + + core::ops::Add, O: TryFrom + From - + NumConsts + + super::num_consts::NumConsts + core::cmp::PartialEq + core::fmt::Debug, String: From, @@ -316,8 +321,6 @@ macro_rules! try_from_int_to_uint { } pub(crate) use try_from_int_to_uint; -use super::num_consts::NumConsts; - #[cfg(test)] mod tests { use super::*; From c1131cc92d3a354668a9f279df350ff33624c541 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 18 Sep 2023 15:12:02 +0200 Subject: [PATCH 0724/2372] Add changelog entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3572dfa0fd..c51eaa7d0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,11 +17,14 @@ and this project adheres to - cosmwasm-std: Add `Int{64,128,256}::{checked_multiply_ratio, full_mul}` ([#1866]) - cosmwasm-std: Add `is_negative` for `Int{64,128,256,512}` ([#1867]). +- cosmwasm-std: Add `TryFrom for Uint64` and + `TryFrom for Int{B}` where `A >= B` ([#1870]). [#1854]: https://github.com/CosmWasm/cosmwasm/pull/1854 [#1861]: https://github.com/CosmWasm/cosmwasm/pull/1861 [#1866]: https://github.com/CosmWasm/cosmwasm/pull/1866 [#1867]: https://github.com/CosmWasm/cosmwasm/pull/1867 +[#1870]: https://github.com/CosmWasm/cosmwasm/pull/1870 ## [1.4.0] - 2023-09-04 From 0c1a151d98729881b2e84429ded036721c379e6a Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 19 Sep 2023 11:23:08 +0200 Subject: [PATCH 0725/2372] Add link to CHANGELOG from GitHub Release notes --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index bae052e68f..ddc969c61d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1043,7 +1043,7 @@ jobs: command: | TAG="$CIRCLE_TAG" TITLE="$TAG" - BODY="Attached there are some build artifacts generated at this tag. Those are for development purposes only! Please use crates.io to find the packages of this release." + BODY="The release notes are available in [CHANGELOG.md](https://github.com/CosmWasm/cosmwasm/blob/$TAG/CHANGELOG.md). For upgrading contracts also consult [MIGRATING.md](https://github.com/CosmWasm/cosmwasm/blob/$TAG/MIGRATING.md).\n\nAttached there are some build artifacts generated at this tag. Those are for development purposes only! Please use crates.io to find the packages of this release." ghr -t "$GITHUB_TOKEN" \ -u "$CIRCLE_PROJECT_USERNAME" -r "$CIRCLE_PROJECT_REPONAME" \ -c "$CIRCLE_SHA1" \ From f37be33a3331814022d3fd2485a62b1b81b2a9e5 Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Tue, 19 Sep 2023 13:05:03 +0200 Subject: [PATCH 0726/2372] Fixed clippy warnings. --- packages/vm/benches/main.rs | 1 - packages/vm/examples/multi_threaded_cache.rs | 1 - packages/vm/src/environment.rs | 2 +- packages/vm/src/imports.rs | 170 +++++++++---------- packages/vm/src/instance.rs | 16 +- 5 files changed, 88 insertions(+), 102 deletions(-) diff --git a/packages/vm/benches/main.rs b/packages/vm/benches/main.rs index e0911e3804..afefe5d3cb 100644 --- a/packages/vm/benches/main.rs +++ b/packages/vm/benches/main.rs @@ -318,7 +318,6 @@ pub fn bench_instance_threads(c: &mut Criterion) { let checksum = random_checksum(); thread::spawn(move || { - let checksum = checksum; // Perform measurement internally let t = SystemTime::now(); black_box( diff --git a/packages/vm/examples/multi_threaded_cache.rs b/packages/vm/examples/multi_threaded_cache.rs index 7be56be405..fd8c145f25 100644 --- a/packages/vm/examples/multi_threaded_cache.rs +++ b/packages/vm/examples/multi_threaded_cache.rs @@ -51,7 +51,6 @@ pub fn main() { let cache = Arc::clone(&cache); threads.push(thread::spawn(move || { - let checksum = checksum; let mut instance = cache .get_instance(&checksum, mock_backend(&[]), DEFAULT_INSTANCE_OPTIONS) .unwrap(); diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index 746126f1fe..e358723372 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -368,7 +368,7 @@ impl Environment { /// Creates a MemoryView. /// This must be short living and not be used after the memory was grown. - pub fn memory<'a>(&self, store: &'a mut impl AsStoreMut) -> MemoryView<'a> { + pub fn memory<'a>(&self, store: &'a impl AsStoreMut) -> MemoryView<'a> { self.memory .as_ref() .expect("Memory is not set. This is a bug in the lifecycle.") diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 4924c888d8..ca4db76a36 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -45,11 +45,11 @@ const MAX_LENGTH_QUERY_CHAIN_REQUEST: usize = 64 * KI; /// Length of a serialized Ed25519 signature const MAX_LENGTH_ED25519_SIGNATURE: usize = 64; /// Max length of a Ed25519 message in bytes. -/// This is an arbitrary value, for performance / memory contraints. If you need to verify larger +/// This is an arbitrary value, for performance / memory constraints. If you need to verify larger /// messages, let us know. const MAX_LENGTH_ED25519_MESSAGE: usize = 128 * 1024; /// Max number of batch Ed25519 messages / signatures / public_keys. -/// This is an arbitrary value, for performance / memory contraints. If you need to batch-verify a +/// This is an arbitrary value, for performance / memory constraints. If you need to batch-verify a /// larger number of signatures, let us know. const MAX_COUNT_ED25519_BATCH: usize = 256; @@ -73,7 +73,7 @@ pub fn do_db_read VmResult { let (data, mut store) = env.data_and_store_mut(); - let key = read_region(&data.memory(&mut store), key_ptr, MAX_LENGTH_DB_KEY)?; + let key = read_region(&data.memory(&store), key_ptr, MAX_LENGTH_DB_KEY)?; let (result, gas_info) = data.with_storage_from_context::<_, _>(|store| Ok(store.get(&key)))?; process_gas_info(data, &mut store, gas_info)?; @@ -98,8 +98,8 @@ pub fn do_db_write(|store| Ok(store.set(&key, &value)))?; @@ -119,7 +119,7 @@ pub fn do_db_remove(|store| Ok(store.remove(&key)))?; @@ -135,11 +135,7 @@ pub fn do_addr_validate VmResult { let (data, mut store) = env.data_and_store_mut(); - let source_data = read_region( - &data.memory(&mut store), - source_ptr, - MAX_LENGTH_HUMAN_ADDRESS, - )?; + let source_data = read_region(&data.memory(&store), source_ptr, MAX_LENGTH_HUMAN_ADDRESS)?; if source_data.is_empty() { return write_to_contract(data, &mut store, b"Input is empty"); } @@ -183,11 +179,7 @@ pub fn do_addr_canonicalize VmResult { let (data, mut store) = env.data_and_store_mut(); - let source_data = read_region( - &data.memory(&mut store), - source_ptr, - MAX_LENGTH_HUMAN_ADDRESS, - )?; + let source_data = read_region(&data.memory(&store), source_ptr, MAX_LENGTH_HUMAN_ADDRESS)?; if source_data.is_empty() { return write_to_contract(data, &mut store, b"Input is empty"); } @@ -201,11 +193,7 @@ pub fn do_addr_canonicalize { - write_region( - &data.memory(&mut store), - destination_ptr, - canonical.as_slice(), - )?; + write_region(&data.memory(&store), destination_ptr, canonical.as_slice())?; Ok(0) } Err(BackendError::UserErr { msg, .. }) => { @@ -223,7 +211,7 @@ pub fn do_addr_humanize { - write_region(&data.memory(&mut store), destination_ptr, human.as_bytes())?; + write_region(&data.memory(&store), destination_ptr, human.as_bytes())?; Ok(0) } Err(BackendError::UserErr { msg, .. }) => { @@ -256,9 +244,9 @@ pub fn do_secp256k1_verify VmResult { let (data, mut store) = env.data_and_store_mut(); - let hash = read_region(&data.memory(&mut store), hash_ptr, MESSAGE_HASH_MAX_LEN)?; - let signature = read_region(&data.memory(&mut store), signature_ptr, ECDSA_SIGNATURE_LEN)?; - let pubkey = read_region(&data.memory(&mut store), pubkey_ptr, ECDSA_PUBKEY_MAX_LEN)?; + let hash = read_region(&data.memory(&store), hash_ptr, MESSAGE_HASH_MAX_LEN)?; + let signature = read_region(&data.memory(&store), signature_ptr, ECDSA_SIGNATURE_LEN)?; + let pubkey = read_region(&data.memory(&store), pubkey_ptr, ECDSA_PUBKEY_MAX_LEN)?; let gas_info = GasInfo::with_cost(data.gas_config.secp256k1_verify_cost); process_gas_info(data, &mut store, gas_info)?; @@ -296,8 +284,8 @@ pub fn do_secp256k1_recover_pubkey< ) -> VmResult { let (data, mut store) = env.data_and_store_mut(); - let hash = read_region(&data.memory(&mut store), hash_ptr, MESSAGE_HASH_MAX_LEN)?; - let signature = read_region(&data.memory(&mut store), signature_ptr, ECDSA_SIGNATURE_LEN)?; + let hash = read_region(&data.memory(&store), hash_ptr, MESSAGE_HASH_MAX_LEN)?; + let signature = read_region(&data.memory(&store), signature_ptr, ECDSA_SIGNATURE_LEN)?; let recover_param: u8 = match recover_param.try_into() { Ok(rp) => rp, Err(_) => return Ok((CryptoError::invalid_recovery_param().code() as u64) << 32), @@ -338,16 +326,16 @@ pub fn do_ed25519_verify>, message_ptr: u32, ) -> VmResult<()> { - let (data, mut store) = env.data_and_store_mut(); + let (data, store) = env.data_and_store_mut(); - let message_data = read_region(&data.memory(&mut store), message_ptr, MAX_LENGTH_ABORT)?; + let message_data = read_region(&data.memory(&store), message_ptr, MAX_LENGTH_ABORT)?; let msg = String::from_utf8_lossy(&message_data); Err(VmError::aborted(msg)) } @@ -477,7 +465,7 @@ pub fn do_query_chain VmResult { let (data, mut store) = env.data_and_store_mut(); - let start = maybe_read_region(&data.memory(&mut store), start_ptr, MAX_LENGTH_DB_KEY)?; - let end = maybe_read_region(&data.memory(&mut store), end_ptr, MAX_LENGTH_DB_KEY)?; + let start = maybe_read_region(&data.memory(&store), start_ptr, MAX_LENGTH_DB_KEY)?; + let end = maybe_read_region(&data.memory(&store), end_ptr, MAX_LENGTH_DB_KEY)?; let order: Order = order .try_into() .map_err(|_| CommunicationError::invalid_order(order))?; @@ -715,7 +703,7 @@ mod tests { fn leave_default_data( fe_mut: &mut FunctionEnvMut>, ) { - let (env, mut _store) = fe_mut.data_and_store_mut(); + let (env, _store) = fe_mut.data_and_store_mut(); // create some mock data let mut storage = MockStorage::new(); @@ -736,12 +724,12 @@ mod tests { .call_function1(&mut store, "allocate", &[(data.len() as u32).into()]) .unwrap(); let region_ptr = ref_to_u32(&result).unwrap(); - write_region(&env.memory(&mut store), region_ptr, data).expect("error writing"); + write_region(&env.memory(&store), region_ptr, data).expect("error writing"); region_ptr } fn create_empty( - wasmer_instance: &mut WasmerInstance, + wasmer_instance: &WasmerInstance, fe_mut: &mut FunctionEnvMut>, capacity: u32, ) -> u32 { @@ -761,9 +749,9 @@ mod tests { fe_mut: &mut FunctionEnvMut>, region_ptr: u32, ) -> Vec { - let (env, mut store) = fe_mut.data_and_store_mut(); + let (env, store) = fe_mut.data_and_store_mut(); - read_region(&env.memory(&mut store), region_ptr, 5000).unwrap() + read_region(&env.memory(&store), region_ptr, 5000).unwrap() } #[test] @@ -1005,7 +993,7 @@ mod tests { leave_default_data(&mut fe_mut); - // Note: right now we cannot differnetiate between an existent and a non-existent key + // Note: right now we cannot differentiate between an existent and a non-existent key do_db_remove(fe_mut.as_mut(), key_ptr).unwrap(); let value = fe_mut @@ -1160,12 +1148,12 @@ mod tests { #[test] fn do_addr_canonicalize_works() { let api = MockApi::default(); - let (fe, mut store, mut instance) = make_instance(api); + let (fe, mut store, instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let api = MockApi::default(); let source_ptr = write_data(&mut fe_mut, b"foo"); - let dest_ptr = create_empty(&mut instance, &mut fe_mut, api.canonical_length() as u32); + let dest_ptr = create_empty(&instance, &mut fe_mut, api.canonical_length() as u32); leave_default_data(&mut fe_mut); @@ -1179,13 +1167,13 @@ mod tests { #[test] fn do_addr_canonicalize_reports_invalid_input_back_to_contract() { let api = MockApi::default(); - let (fe, mut store, mut instance) = make_instance(api); + let (fe, mut store, instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let source_ptr1 = write_data(&mut fe_mut, b"fo\x80o"); // invalid UTF-8 (fo�o) let source_ptr2 = write_data(&mut fe_mut, b""); // empty let source_ptr3 = write_data(&mut fe_mut, b"addressexceedingaddressspacesuperlongreallylongiamensuringthatitislongerthaneverything"); // too long - let dest_ptr = create_empty(&mut instance, &mut fe_mut, 70); + let dest_ptr = create_empty(&instance, &mut fe_mut, 70); leave_default_data(&mut fe_mut); @@ -1211,11 +1199,11 @@ mod tests { #[test] fn do_addr_canonicalize_fails_for_broken_backend() { let api = MockApi::new_failing("Temporarily unavailable"); - let (fe, mut store, mut instance) = make_instance(api); + let (fe, mut store, instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let source_ptr = write_data(&mut fe_mut, b"foo"); - let dest_ptr = create_empty(&mut instance, &mut fe_mut, 7); + let dest_ptr = create_empty(&instance, &mut fe_mut, 7); leave_default_data(&mut fe_mut); @@ -1232,11 +1220,11 @@ mod tests { #[test] fn do_addr_canonicalize_fails_for_large_inputs() { let api = MockApi::default(); - let (fe, mut store, mut instance) = make_instance(api); + let (fe, mut store, instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let source_ptr = write_data(&mut fe_mut, &[61; 333]); - let dest_ptr = create_empty(&mut instance, &mut fe_mut, 8); + let dest_ptr = create_empty(&instance, &mut fe_mut, 8); leave_default_data(&mut fe_mut); @@ -1259,11 +1247,11 @@ mod tests { #[test] fn do_addr_canonicalize_fails_for_small_destination_region() { let api = MockApi::default(); - let (fe, mut store, mut instance) = make_instance(api); + let (fe, mut store, instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let source_ptr = write_data(&mut fe_mut, b"foo"); - let dest_ptr = create_empty(&mut instance, &mut fe_mut, 7); + let dest_ptr = create_empty(&instance, &mut fe_mut, 7); leave_default_data(&mut fe_mut); @@ -1283,13 +1271,13 @@ mod tests { #[test] fn do_addr_humanize_works() { let api = MockApi::default(); - let (fe, mut store, mut instance) = make_instance(api); + let (fe, mut store, instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let api = MockApi::default(); let source_data = vec![0x22; api.canonical_length()]; let source_ptr = write_data(&mut fe_mut, &source_data); - let dest_ptr = create_empty(&mut instance, &mut fe_mut, 70); + let dest_ptr = create_empty(&instance, &mut fe_mut, 70); leave_default_data(&mut fe_mut); @@ -1301,11 +1289,11 @@ mod tests { #[test] fn do_addr_humanize_reports_invalid_input_back_to_contract() { let api = MockApi::default(); - let (fe, mut store, mut instance) = make_instance(api); + let (fe, mut store, instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let source_ptr = write_data(&mut fe_mut, b"foo"); // too short - let dest_ptr = create_empty(&mut instance, &mut fe_mut, 70); + let dest_ptr = create_empty(&instance, &mut fe_mut, 70); leave_default_data(&mut fe_mut); @@ -1318,11 +1306,11 @@ mod tests { #[test] fn do_addr_humanize_fails_for_broken_backend() { let api = MockApi::new_failing("Temporarily unavailable"); - let (fe, mut store, mut instance) = make_instance(api); + let (fe, mut store, instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let source_ptr = write_data(&mut fe_mut, b"foo\0\0\0\0\0"); - let dest_ptr = create_empty(&mut instance, &mut fe_mut, 70); + let dest_ptr = create_empty(&instance, &mut fe_mut, 70); leave_default_data(&mut fe_mut); @@ -1339,11 +1327,11 @@ mod tests { #[test] fn do_addr_humanize_fails_for_input_too_long() { let api = MockApi::default(); - let (fe, mut store, mut instance) = make_instance(api); + let (fe, mut store, instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let source_ptr = write_data(&mut fe_mut, &[61; 65]); - let dest_ptr = create_empty(&mut instance, &mut fe_mut, 70); + let dest_ptr = create_empty(&instance, &mut fe_mut, 70); leave_default_data(&mut fe_mut); @@ -1366,13 +1354,13 @@ mod tests { #[test] fn do_addr_humanize_fails_for_destination_region_too_small() { let api = MockApi::default(); - let (fe, mut store, mut instance) = make_instance(api); + let (fe, mut store, instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let api = MockApi::default(); let source_data = vec![0x22; api.canonical_length()]; let source_ptr = write_data(&mut fe_mut, &source_data); - let dest_ptr = create_empty(&mut instance, &mut fe_mut, 2); + let dest_ptr = create_empty(&instance, &mut fe_mut, 2); leave_default_data(&mut fe_mut); @@ -1392,7 +1380,7 @@ mod tests { #[test] fn do_secp256k1_verify_works() { let api = MockApi::default(); - let (fe, mut store, mut _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); @@ -1411,7 +1399,7 @@ mod tests { #[test] fn do_secp256k1_verify_wrong_hash_verify_fails() { let api = MockApi::default(); - let (fe, mut store, mut _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let mut hash = hex::decode(ECDSA_HASH_HEX).unwrap(); @@ -1432,7 +1420,7 @@ mod tests { #[test] fn do_secp256k1_verify_larger_hash_fails() { let api = MockApi::default(); - let (fe, mut store, mut _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let mut hash = hex::decode(ECDSA_HASH_HEX).unwrap(); @@ -1457,7 +1445,7 @@ mod tests { #[test] fn do_secp256k1_verify_shorter_hash_fails() { let api = MockApi::default(); - let (fe, mut store, mut _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let mut hash = hex::decode(ECDSA_HASH_HEX).unwrap(); @@ -1478,7 +1466,7 @@ mod tests { #[test] fn do_secp256k1_verify_wrong_sig_verify_fails() { let api = MockApi::default(); - let (fe, mut store, mut _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); @@ -1499,7 +1487,7 @@ mod tests { #[test] fn do_secp256k1_verify_larger_sig_fails() { let api = MockApi::default(); - let (fe, mut store, mut _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); @@ -1524,7 +1512,7 @@ mod tests { #[test] fn do_secp256k1_verify_shorter_sig_fails() { let api = MockApi::default(); - let (fe, mut store, mut _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); @@ -1545,7 +1533,7 @@ mod tests { #[test] fn do_secp256k1_verify_wrong_pubkey_format_fails() { let api = MockApi::default(); - let (fe, mut store, mut _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); @@ -1566,7 +1554,7 @@ mod tests { #[test] fn do_secp256k1_verify_wrong_pubkey_fails() { let api = MockApi::default(); - let (fe, mut store, mut _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); @@ -1587,7 +1575,7 @@ mod tests { #[test] fn do_secp256k1_verify_larger_pubkey_fails() { let api = MockApi::default(); - let (fe, mut store, mut _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); @@ -1612,7 +1600,7 @@ mod tests { #[test] fn do_secp256k1_verify_shorter_pubkey_fails() { let api = MockApi::default(); - let (fe, mut store, mut _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); @@ -1633,7 +1621,7 @@ mod tests { #[test] fn do_secp256k1_verify_empty_pubkey_fails() { let api = MockApi::default(); - let (fe, mut store, mut _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); @@ -1652,7 +1640,7 @@ mod tests { #[test] fn do_secp256k1_verify_wrong_data_fails() { let api = MockApi::default(); - let (fe, mut store, mut _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let hash = vec![0x22; MESSAGE_HASH_MAX_LEN]; @@ -1671,7 +1659,7 @@ mod tests { #[test] fn do_secp256k1_recover_pubkey_works() { let api = MockApi::default(); - let (fe, mut store, mut _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); // https://gist.github.com/webmaster128/130b628d83621a33579751846699ed15 @@ -1694,7 +1682,7 @@ mod tests { #[test] fn do_ed25519_verify_works() { let api = MockApi::default(); - let (fe, mut store, mut _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let msg = hex::decode(EDDSA_MSG_HEX).unwrap(); @@ -1713,7 +1701,7 @@ mod tests { #[test] fn do_ed25519_verify_wrong_msg_verify_fails() { let api = MockApi::default(); - let (fe, mut store, mut _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let mut msg = hex::decode(EDDSA_MSG_HEX).unwrap(); @@ -1734,7 +1722,7 @@ mod tests { #[test] fn do_ed25519_verify_larger_msg_fails() { let api = MockApi::default(); - let (fe, mut store, mut _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let mut msg = hex::decode(EDDSA_MSG_HEX).unwrap(); @@ -1759,7 +1747,7 @@ mod tests { #[test] fn do_ed25519_verify_wrong_sig_verify_fails() { let api = MockApi::default(); - let (fe, mut store, mut _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let msg = hex::decode(EDDSA_MSG_HEX).unwrap(); @@ -1780,7 +1768,7 @@ mod tests { #[test] fn do_ed25519_verify_larger_sig_fails() { let api = MockApi::default(); - let (fe, mut store, mut _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let msg = hex::decode(EDDSA_MSG_HEX).unwrap(); @@ -1805,7 +1793,7 @@ mod tests { #[test] fn do_ed25519_verify_shorter_sig_fails() { let api = MockApi::default(); - let (fe, mut store, mut _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let msg = hex::decode(EDDSA_MSG_HEX).unwrap(); @@ -1826,7 +1814,7 @@ mod tests { #[test] fn do_ed25519_verify_wrong_pubkey_verify_fails() { let api = MockApi::default(); - let (fe, mut store, mut _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let msg = hex::decode(EDDSA_MSG_HEX).unwrap(); @@ -1847,7 +1835,7 @@ mod tests { #[test] fn do_ed25519_verify_larger_pubkey_fails() { let api = MockApi::default(); - let (fe, mut store, mut _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let msg = hex::decode(EDDSA_MSG_HEX).unwrap(); @@ -1872,7 +1860,7 @@ mod tests { #[test] fn do_ed25519_verify_shorter_pubkey_fails() { let api = MockApi::default(); - let (fe, mut store, mut _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let msg = hex::decode(EDDSA_MSG_HEX).unwrap(); @@ -1893,7 +1881,7 @@ mod tests { #[test] fn do_ed25519_verify_empty_pubkey_fails() { let api = MockApi::default(); - let (fe, mut store, mut _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let msg = hex::decode(EDDSA_MSG_HEX).unwrap(); @@ -1912,7 +1900,7 @@ mod tests { #[test] fn do_ed25519_verify_wrong_data_fails() { let api = MockApi::default(); - let (fe, mut store, mut _instance) = make_instance(api); + let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); let msg = vec![0x22; MESSAGE_HASH_MAX_LEN]; diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index cd9efe65de..f35997e5b3 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -341,7 +341,7 @@ where /// Returns the features required by this contract. /// /// This is not needed for production because we can do static analysis - /// on the Wasm file before instatiation to obtain this information. It's + /// on the Wasm file before instantiation to obtain this information. It's /// only kept because it can be handy for integration testing. pub fn required_capabilities(&self) -> HashSet { required_capabilities_from_module(self._inner.module()) @@ -353,9 +353,9 @@ where /// (https://github.com/WebAssembly/design/issues/1300#issuecomment-573867836). pub fn memory_pages(&mut self) -> usize { let mut fe_mut = self.fe.clone().into_mut(&mut self.store); - let (env, mut store) = fe_mut.data_and_store_mut(); + let (env, store) = fe_mut.data_and_store_mut(); - env.memory(&mut store).size().0 as _ + env.memory(&store).size().0 as _ } /// Returns the currently remaining gas. @@ -440,17 +440,17 @@ where /// Copies all data described by the Region at the given pointer from Wasm to the caller. pub(crate) fn read_memory(&mut self, region_ptr: u32, max_length: usize) -> VmResult> { let mut fe_mut = self.fe.clone().into_mut(&mut self.store); - let (env, mut store) = fe_mut.data_and_store_mut(); + let (env, store) = fe_mut.data_and_store_mut(); - read_region(&env.memory(&mut store), region_ptr, max_length) + read_region(&env.memory(&store), region_ptr, max_length) } /// Copies data to the memory region that was created before using allocate. pub(crate) fn write_memory(&mut self, region_ptr: u32, data: &[u8]) -> VmResult<()> { let mut fe_mut = self.fe.clone().into_mut(&mut self.store); - let (env, mut store) = fe_mut.data_and_store_mut(); + let (env, store) = fe_mut.data_and_store_mut(); - write_region(&env.memory(&mut store), region_ptr, data)?; + write_region(&env.memory(&store), region_ptr, data)?; Ok(()) } @@ -1004,7 +1004,7 @@ mod tests { .unwrap(); } - /// This is needed for writing intagration tests in which the balance of a contract changes over time + /// This is needed for writing integration tests in which the balance of a contract changes over time. #[test] fn with_querier_allows_updating_balances() { let rich_addr = String::from("foobar"); From 0794fecb0859e5c6d9d50308f00298ad2cf6199f Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Tue, 19 Sep 2023 13:19:23 +0200 Subject: [PATCH 0727/2372] Fixed clippy warnings. --- packages/go-gen/src/schema.rs | 1 + packages/std/src/addresses.rs | 6 +++--- packages/std/src/testing/mock.rs | 6 +++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/go-gen/src/schema.rs b/packages/go-gen/src/schema.rs index 9d9a3fa866..56a22f2963 100644 --- a/packages/go-gen/src/schema.rs +++ b/packages/go-gen/src/schema.rs @@ -85,6 +85,7 @@ pub fn schema_object_type( /// Tries to extract the type of the non-null variant of an anyOf schema. /// /// Returns `Ok(None)` if the type is not nullable. +#[allow(clippy::manual_try_fold)] pub fn nullable_type(subschemas: &[Schema]) -> Result, anyhow::Error> { let (found_null, nullable_type): (bool, Option<&SchemaObject>) = subschemas .iter() diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index 39bc8bc06b..f05702e4d9 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -167,7 +167,7 @@ impl<'a> From<&'a Addr> for Cow<'a, Addr> { /// /// The safe way to obtain a valid `CanonicalAddr` is using `Api::addr_canonicalize`. In /// addition to that there are many unsafe ways to convert any binary data into an instance. -/// So the type shoud be treated as a marker to express the intended data type, not as +/// So the type should be treated as a marker to express the intended data type, not as /// a validity guarantee of any sort. #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Hash, JsonSchema)] pub struct CanonicalAddr(pub Binary); @@ -358,7 +358,7 @@ pub fn instantiate2_address( } /// The instantiate2 address derivation implementation. This API is used for -/// testing puposes only. The `msg` field is discouraged and should not be used. +/// testing purposes only. The `msg` field is discouraged and should not be used. /// Use [`instantiate2_address`]. #[doc(hidden)] fn instantiate2_address_impl( @@ -751,7 +751,7 @@ mod tests { } #[test] - fn instantiate2_address_impl_works_for_cosmjs_testvectors() { + fn instantiate2_address_impl_works_for_cosmjs_test_vectors() { // Test data from https://github.com/cosmos/cosmjs/pull/1253 const COSMOS_ED25519_TESTS_JSON: &str = "./testdata/instantiate2_addresses.json"; diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 305af4afb1..ebd4199028 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -106,9 +106,9 @@ const CANONICAL_LENGTH: usize = 90; // n = 45 const SHUFFLES_ENCODE: usize = 10; const SHUFFLES_DECODE: usize = 2; -// MockPrecompiles zero pads all human addresses to make them fit the canonical_length +// Mock precompiles zero pads all human addresses to make them fit the canonical_length // it trims off zeros for the reverse operation. -// not really smart, but allows us to see a difference (and consistent length for canonical adddresses) +// not really smart, but allows us to see a difference (and consistent length for canonical addresses) #[derive(Copy, Clone)] pub struct MockApi { /// Length of canonical addresses created with this API. Contracts should not make any assumptions @@ -152,7 +152,7 @@ impl Api for MockApi { )); } - // mimicks formats like hex or bech32 where different casings are valid for one address + // mimics formats like hex or bech32 where different casings are valid for one address let normalized = input.to_lowercase(); let mut out = Vec::from(normalized); From 10ae95348d26e1133f5a39a98175ea94cb931f43 Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Tue, 19 Sep 2023 13:55:53 +0200 Subject: [PATCH 0728/2372] Spellings. --- packages/std/src/errors/system_error.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/errors/system_error.rs b/packages/std/src/errors/system_error.rs index 98dc6f6707..94790295bb 100644 --- a/packages/std/src/errors/system_error.rs +++ b/packages/std/src/errors/system_error.rs @@ -7,7 +7,7 @@ use crate::Binary; /// /// This is used on return values for Querier as a nested result: Result, SystemError> /// The first wrap (SystemError) will trigger if the contract address doesn't exist, -/// the QueryRequest is malformated, etc. The second wrap will be an error message from +/// the QueryRequest is malformed, etc. The second wrap will be an error message from /// the contract itself. /// /// Such errors are only created by the VM. The error type is defined in the standard library, to ensure From 9d78a99d2453605baf8c86cc88bbde25c6a18404 Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Tue, 19 Sep 2023 14:30:45 +0200 Subject: [PATCH 0729/2372] Applied lint suggestions. --- packages/go-gen/src/schema.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/go-gen/src/schema.rs b/packages/go-gen/src/schema.rs index 56a22f2963..496d0954c2 100644 --- a/packages/go-gen/src/schema.rs +++ b/packages/go-gen/src/schema.rs @@ -85,22 +85,21 @@ pub fn schema_object_type( /// Tries to extract the type of the non-null variant of an anyOf schema. /// /// Returns `Ok(None)` if the type is not nullable. -#[allow(clippy::manual_try_fold)] pub fn nullable_type(subschemas: &[Schema]) -> Result, anyhow::Error> { let (found_null, nullable_type): (bool, Option<&SchemaObject>) = subschemas .iter() - .fold(Ok((false, None)), |result: Result<_>, subschema| { - result.and_then(|(nullable, not_null)| { + .try_fold( + (false, None), + |(nullable, not_null), subschema| -> Result<_> { let subschema = subschema.object()?; if is_null(subschema) { Ok((true, not_null)) } else { Ok((nullable, Some(subschema))) } - }) - }) + }, + ) .context("failed to get anyOf subschemas")?; - Ok(if found_null { nullable_type } else { None }) } From ea51d4515abe44e6be3253e45f8f3ecae905cbb9 Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Tue, 19 Sep 2023 14:32:44 +0200 Subject: [PATCH 0730/2372] Fixed Description. --- packages/std/src/testing/mock.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index ebd4199028..400981f0f9 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -106,7 +106,7 @@ const CANONICAL_LENGTH: usize = 90; // n = 45 const SHUFFLES_ENCODE: usize = 10; const SHUFFLES_DECODE: usize = 2; -// Mock precompiles zero pads all human addresses to make them fit the canonical_length +// Mock zero pads all human addresses to make them fit the canonical_length // it trims off zeros for the reverse operation. // not really smart, but allows us to see a difference (and consistent length for canonical addresses) #[derive(Copy, Clone)] From 4a2d720b516460e98275acb312d722e41fd320bf Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Tue, 19 Sep 2023 14:33:50 +0200 Subject: [PATCH 0731/2372] Fixed description. --- packages/std/src/testing/mock.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 400981f0f9..8d8d785e5e 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -106,7 +106,7 @@ const CANONICAL_LENGTH: usize = 90; // n = 45 const SHUFFLES_ENCODE: usize = 10; const SHUFFLES_DECODE: usize = 2; -// Mock zero pads all human addresses to make them fit the canonical_length +// MockApi zero pads all human addresses to make them fit the canonical_length // it trims off zeros for the reverse operation. // not really smart, but allows us to see a difference (and consistent length for canonical addresses) #[derive(Copy, Clone)] From f84b249e0959d736ebfbf86fb5e7e97eb7c8a949 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 22 Sep 2023 12:25:04 +0200 Subject: [PATCH 0732/2372] Add json string serialize and deserialize --- packages/std/src/lib.rs | 6 +- packages/std/src/serde.rs | 125 ++++++++++++++++++++++++++++++++------ 2 files changed, 112 insertions(+), 19 deletions(-) diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 99706aa22b..8a99c40431 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -88,7 +88,11 @@ pub use crate::results::{ pub use crate::results::{DistributionMsg, StakingMsg}; #[cfg(feature = "stargate")] pub use crate::results::{GovMsg, VoteOption}; -pub use crate::serde::{from_binary, from_slice, to_binary, to_vec}; +#[allow(deprecated)] +pub use crate::serde::{ + from_binary, from_json_binary, from_json_slice, from_json_str, from_slice, to_binary_replace, + to_json_binary, to_json_string, to_json_vec, to_vec, +}; pub use crate::stdack::StdAck; pub use crate::storage::MemoryStorage; pub use crate::timestamp::Timestamp; diff --git a/packages/std/src/serde.rs b/packages/std/src/serde.rs index 5b258fd1f3..366b9d93f6 100644 --- a/packages/std/src/serde.rs +++ b/packages/std/src/serde.rs @@ -8,26 +8,75 @@ use serde::{de::DeserializeOwned, Serialize}; use crate::binary::Binary; use crate::errors::{StdError, StdResult}; +#[deprecated = "use from_json_slice instead"] pub fn from_slice(value: &[u8]) -> StdResult { - serde_json_wasm::from_slice(value).map_err(|e| StdError::parse_err(type_name::(), e)) + from_json_slice(value) } +#[deprecated = "use from_json_binary instead"] pub fn from_binary(value: &Binary) -> StdResult { - from_slice(value.as_slice()) + from_json_binary(value) +} + +/// Deserializes the given JSON byte vector to a data structure. +/// +/// Errors if the input is not valid JSON or cannot be deserialized to the given type. +pub fn from_json_slice(value: &[u8]) -> StdResult { + serde_json_wasm::from_slice(value).map_err(|e| StdError::parse_err(type_name::(), e)) +} + +/// Deserializes the given JSON bytes to a data structure. +/// +/// Errors if the input is not valid JSON or cannot be deserialized to the given type. +pub fn from_json_str(value: &str) -> StdResult { + serde_json_wasm::from_str(value).map_err(|e| StdError::parse_err(type_name::(), e)) +} + +/// Deserializes the given JSON bytes to a data structure. +/// +/// Errors if the input is not valid JSON or cannot be deserialized to the given type. +pub fn from_json_binary(value: &Binary) -> StdResult { + from_json_slice(value.as_slice()) } +#[deprecated = "use to_json_vec instead"] pub fn to_vec(data: &T) -> StdResult> +where + T: Serialize + ?Sized, +{ + to_json_vec(data) +} + +#[deprecated = "use to_json_binary instead"] +pub fn to_binary_replace(data: &T) -> StdResult +where + T: Serialize + ?Sized, +{ + to_json_binary(data) +} + +/// Serializes the given data structure as a JSON byte vector. +pub fn to_json_vec(data: &T) -> StdResult> where T: Serialize + ?Sized, { serde_json_wasm::to_vec(data).map_err(|e| StdError::serialize_err(type_name::(), e)) } -pub fn to_binary(data: &T) -> StdResult +/// Serializes the given data structure as a JSON string. +pub fn to_json_string(data: &T) -> StdResult +where + T: Serialize + ?Sized, +{ + serde_json_wasm::to_string(data).map_err(|e| StdError::serialize_err(type_name::(), e)) +} + +/// Serializes the given data structure as JSON bytes. +pub fn to_json_binary(data: &T) -> StdResult where T: Serialize + ?Sized, { - to_vec(data).map(Binary) + to_json_vec(data).map(Binary) } #[cfg(test)] @@ -51,9 +100,9 @@ mod tests { } #[test] - fn to_vec_works() { + fn to_json_vec_works() { let msg = SomeMsg::Refund {}; - let serialized = to_vec(&msg).unwrap(); + let serialized = to_json_vec(&msg).unwrap(); assert_eq!(serialized, br#"{"refund":{}}"#); let msg = SomeMsg::ReleaseAll { @@ -62,7 +111,7 @@ mod tests { time: 9007199254740999, // Number.MAX_SAFE_INTEGER + 7 karma: -17, }; - let serialized = String::from_utf8(to_vec(&msg).unwrap()).unwrap(); + let serialized = String::from_utf8(to_json_vec(&msg).unwrap()).unwrap(); assert_eq!( serialized, r#"{"release_all":{"image":"foo","amount":42,"time":9007199254740999,"karma":-17}}"# @@ -70,11 +119,11 @@ mod tests { } #[test] - fn from_slice_works() { - let deserialized: SomeMsg = from_slice(br#"{"refund":{}}"#).unwrap(); + fn from_json_slice_works() { + let deserialized: SomeMsg = from_json_slice(br#"{"refund":{}}"#).unwrap(); assert_eq!(deserialized, SomeMsg::Refund {}); - let deserialized: SomeMsg = from_slice( + let deserialized: SomeMsg = from_json_slice( br#"{"release_all":{"image":"foo","amount":42,"time":18446744073709551615,"karma":-17}}"#, ) .unwrap(); @@ -90,30 +139,30 @@ mod tests { } #[test] - fn from_slice_or_binary() { + fn from_json_slice_or_binary() { let msg = SomeMsg::Refund {}; - let serialized: Binary = to_binary(&msg).unwrap(); + let serialized: Binary = to_json_binary(&msg).unwrap(); - let parse_binary: SomeMsg = from_binary(&serialized).unwrap(); + let parse_binary: SomeMsg = from_json_binary(&serialized).unwrap(); assert_eq!(parse_binary, msg); - let parse_slice: SomeMsg = from_slice(&serialized).unwrap(); + let parse_slice: SomeMsg = from_json_slice(&serialized).unwrap(); assert_eq!(parse_slice, msg); } #[test] - fn to_vec_works_for_special_chars() { + fn to_json_vec_works_for_special_chars() { let msg = SomeMsg::Cowsay { text: "foo\"bar\\\"bla".to_string(), }; - let serialized = String::from_utf8(to_vec(&msg).unwrap()).unwrap(); + let serialized = String::from_utf8(to_json_vec(&msg).unwrap()).unwrap(); assert_eq!(serialized, r#"{"cowsay":{"text":"foo\"bar\\\"bla"}}"#); } #[test] - fn from_slice_works_for_special_chars() { + fn from_json_slice_works_for_special_chars() { let deserialized: SomeMsg = - from_slice(br#"{"cowsay":{"text":"foo\"bar\\\"bla"}}"#).unwrap(); + from_json_slice(br#"{"cowsay":{"text":"foo\"bar\\\"bla"}}"#).unwrap(); assert_eq!( deserialized, SomeMsg::Cowsay { @@ -121,4 +170,44 @@ mod tests { } ); } + + #[test] + fn from_json_str_works() { + let deserialized: SomeMsg = from_json_str(r#"{"refund":{}}"#).unwrap(); + assert_eq!(deserialized, SomeMsg::Refund {}); + + let deserialized: SomeMsg = from_json_str( + r#"{"release_all":{"image":"foo","amount":42,"time":18446744073709551615,"karma":-17}}"#, + ) + .unwrap(); + + assert_eq!( + deserialized, + SomeMsg::ReleaseAll { + image: "foo".to_string(), + amount: 42, + time: 18446744073709551615, + karma: -17 + } + ); + } + + #[test] + fn to_json_string_works() { + let msg = SomeMsg::Refund {}; + let serialized = to_json_string(&msg).unwrap(); + assert_eq!(serialized, r#"{"refund":{}}"#); + + let msg = SomeMsg::ReleaseAll { + image: "foo".to_string(), + amount: 42, + time: 9007199254740999, // Number.MAX_SAFE_INTEGER + 7 + karma: -17, + }; + let serialized = to_json_string(&msg).unwrap(); + assert_eq!( + serialized, + r#"{"release_all":{"image":"foo","amount":42,"time":9007199254740999,"karma":-17}}"# + ); + } } From c7e10cb7221ab72d7b50ff1b7a94dc354819f1f5 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 22 Sep 2023 13:07:25 +0200 Subject: [PATCH 0733/2372] Replace all usages of deprecated serialization fns --- contracts/crypto-verify/src/contract.rs | 42 +++---- contracts/cyberpunk/src/contract.rs | 19 ++-- contracts/cyberpunk/tests/integration.rs | 6 +- contracts/floaty/src/contract.rs | 18 +-- contracts/hackatom/src/contract.rs | 32 +++--- contracts/hackatom/tests/integration.rs | 16 +-- contracts/ibc-reflect-send/src/contract.rs | 12 +- contracts/ibc-reflect-send/src/ibc.rs | 21 ++-- contracts/ibc-reflect-send/src/state.rs | 14 +-- contracts/ibc-reflect/src/contract.rs | 44 ++++---- contracts/ibc-reflect/src/state.rs | 14 +-- contracts/queue/src/contract.rs | 28 ++--- contracts/queue/tests/integration.rs | 13 ++- contracts/reflect/src/contract.rs | 30 ++--- contracts/reflect/src/state.rs | 12 +- contracts/reflect/src/testing.rs | 10 +- contracts/reflect/tests/integration.rs | 14 +-- contracts/staking/src/contract.rs | 12 +- contracts/staking/src/state.rs | 12 +- contracts/staking/tests/integration.rs | 10 +- contracts/virus/src/contract.rs | 6 +- packages/std/src/binary.rs | 14 +-- packages/std/src/errors/system_error.rs | 10 +- packages/std/src/exports.rs | 78 ++++++------- packages/std/src/hex_binary.rs | 16 +-- packages/std/src/ibc.rs | 4 +- packages/std/src/imports.rs | 4 +- packages/std/src/math/decimal.rs | 42 ++++--- packages/std/src/math/decimal256.rs | 36 +++--- packages/std/src/math/int128.rs | 6 +- packages/std/src/math/int256.rs | 6 +- packages/std/src/math/int512.rs | 6 +- packages/std/src/math/int64.rs | 6 +- packages/std/src/math/uint128.rs | 6 +- packages/std/src/math/uint256.rs | 6 +- packages/std/src/math/uint512.rs | 6 +- packages/std/src/math/uint64.rs | 6 +- packages/std/src/query/wasm.rs | 10 +- packages/std/src/results/contract_result.rs | 28 ++--- packages/std/src/results/cosmos_msg.rs | 26 ++--- packages/std/src/results/empty.rs | 8 +- packages/std/src/results/response.rs | 6 +- packages/std/src/results/submessages.rs | 20 ++-- packages/std/src/stdack.rs | 4 +- packages/std/src/testing/mock.rs | 116 ++++++++++---------- packages/std/src/traits.rs | 20 ++-- packages/storage/src/bucket.rs | 6 +- packages/storage/src/singleton.rs | 6 +- packages/storage/src/type_helpers.rs | 6 +- packages/vm/src/environment.rs | 6 +- packages/vm/src/imports.rs | 14 +-- packages/vm/src/instance.rs | 10 +- packages/vm/src/testing/querier.rs | 20 ++-- 53 files changed, 487 insertions(+), 456 deletions(-) diff --git a/contracts/crypto-verify/src/contract.rs b/contracts/crypto-verify/src/contract.rs index b2917a90c9..20a6d02f72 100644 --- a/contracts/crypto-verify/src/contract.rs +++ b/contracts/crypto-verify/src/contract.rs @@ -1,5 +1,5 @@ use cosmwasm_std::{ - entry_point, to_binary, Binary, Deps, DepsMut, Env, MessageInfo, QueryResponse, Response, + entry_point, to_json_binary, Binary, Deps, DepsMut, Env, MessageInfo, QueryResponse, Response, StdError, StdResult, Uint128, }; use sha2::{Digest, Sha256}; @@ -32,7 +32,7 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { message, signature, public_key, - } => to_binary(&query_verify_cosmos( + } => to_json_binary(&query_verify_cosmos( deps, &message.0, &signature.0, @@ -42,7 +42,7 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { message, signature, signer_address, - } => to_binary(&query_verify_ethereum_text( + } => to_json_binary(&query_verify_ethereum_text( deps, &message, &signature, @@ -60,14 +60,14 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { r, s, v, - } => to_binary(&query_verify_ethereum_transaction( + } => to_json_binary(&query_verify_ethereum_transaction( deps, from, to, nonce, gas_limit, gas_price, value, data, chain_id, r, s, v, )?), QueryMsg::VerifyTendermintSignature { message, signature, public_key, - } => to_binary(&query_verify_tendermint( + } => to_json_binary(&query_verify_tendermint( deps, &message.0, &signature.0, @@ -77,13 +77,13 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { messages, signatures, public_keys, - } => to_binary(&query_verify_tendermint_batch( + } => to_json_binary(&query_verify_tendermint_batch( deps, &messages, &signatures, &public_keys, )?), - QueryMsg::ListVerificationSchemes {} => to_binary(&query_list_verifications(deps)?), + QueryMsg::ListVerificationSchemes {} => to_json_binary(&query_list_verifications(deps)?), } } @@ -218,7 +218,7 @@ mod tests { mock_dependencies, mock_env, mock_info, MockApi, MockQuerier, MockStorage, }; use cosmwasm_std::{ - from_slice, Binary, OwnedDeps, RecoverPubkeyError, StdError, VerificationError, + from_json_slice, Binary, OwnedDeps, RecoverPubkeyError, StdError, VerificationError, }; use hex_literal::hex; @@ -274,7 +274,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_slice(&raw).unwrap(); + let res: VerifyResponse = from_json_slice(&raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -296,7 +296,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_slice(&raw).unwrap(); + let res: VerifyResponse = from_json_slice(&raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: false }); } @@ -339,7 +339,7 @@ mod tests { signer_address: signer_address.into(), }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_slice(&raw).unwrap(); + let res: VerifyResponse = from_json_slice(&raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -360,7 +360,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_slice(&raw).unwrap(); + let res: VerifyResponse = from_json_slice(&raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: false }); } @@ -380,7 +380,7 @@ mod tests { signer_address: signer_address.into(), }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_slice(&raw).unwrap(); + let res: VerifyResponse = from_json_slice(&raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: false }); // Broken signature @@ -447,7 +447,7 @@ mod tests { v, }; let raw = query(deps.as_ref(), mock_env(), msg).unwrap(); - let res: VerifyResponse = from_slice(&raw).unwrap(); + let res: VerifyResponse = from_json_slice(&raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -475,7 +475,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_slice(&raw).unwrap(); + let res: VerifyResponse = from_json_slice(&raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -508,7 +508,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_slice(&raw).unwrap(); + let res: VerifyResponse = from_json_slice(&raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -542,7 +542,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_slice(&raw).unwrap(); + let res: VerifyResponse = from_json_slice(&raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -573,7 +573,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_slice(&raw).unwrap(); + let res: VerifyResponse = from_json_slice(&raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: false }); } @@ -626,7 +626,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_slice(&raw).unwrap(); + let res: VerifyResponse = from_json_slice(&raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -648,7 +648,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_slice(&raw).unwrap(); + let res: VerifyResponse = from_json_slice(&raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: false }); } @@ -683,7 +683,7 @@ mod tests { let query_msg = QueryMsg::ListVerificationSchemes {}; let raw = query(deps.as_ref(), mock_env(), query_msg).unwrap(); - let res: ListVerificationsResponse = from_slice(&raw).unwrap(); + let res: ListVerificationsResponse = from_json_slice(&raw).unwrap(); assert_eq!( res, diff --git a/contracts/cyberpunk/src/contract.rs b/contracts/cyberpunk/src/contract.rs index 0374a06a86..45ee27c1e4 100644 --- a/contracts/cyberpunk/src/contract.rs +++ b/contracts/cyberpunk/src/contract.rs @@ -1,5 +1,5 @@ use cosmwasm_std::{ - entry_point, to_binary, Api, DenomMetadata, Deps, DepsMut, Empty, Env, MessageInfo, + entry_point, to_json_binary, Api, DenomMetadata, Deps, DepsMut, Empty, Env, MessageInfo, PageRequest, QueryResponse, Response, StdError, StdResult, WasmMsg, }; @@ -94,7 +94,7 @@ fn execute_memory_loop() -> Result { fn execute_message_loop(env: Env) -> Result { let resp = Response::new().add_message(WasmMsg::Execute { contract_addr: env.contract.address.into(), - msg: to_binary(&ExecuteMsg::MessageLoop {})?, + msg: to_json_binary(&ExecuteMsg::MessageLoop {})?, funds: vec![], }); Ok(resp) @@ -148,7 +148,7 @@ fn execute_unreachable() -> Result { } fn execute_mirror_env(env: Env) -> Result { - Ok(Response::new().set_data(to_binary(&env)?)) + Ok(Response::new().set_data(to_json_binary(&env)?)) } fn execute_debug(api: &dyn Api) -> Result { @@ -183,9 +183,9 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { use QueryMsg::*; match msg { - MirrorEnv {} => to_binary(&query_mirror_env(env)), - Denoms {} => to_binary(&query_denoms(deps)?), - Denom { denom } => to_binary(&query_denom(deps, denom)?), + MirrorEnv {} => to_json_binary(&query_mirror_env(env)), + Denoms {} => to_json_binary(&query_denoms(deps)?), + Denom { denom } => to_json_binary(&query_denom(deps, denom)?), } } @@ -226,7 +226,7 @@ mod tests { use cosmwasm_std::testing::{ mock_dependencies, mock_env, mock_info, MockApi, MockQuerier, MockStorage, }; - use cosmwasm_std::{from_binary, DenomMetadata, DenomUnit, OwnedDeps}; + use cosmwasm_std::{from_json_binary, DenomMetadata, DenomUnit, OwnedDeps}; fn setup() -> OwnedDeps { let mut deps = mock_dependencies(); @@ -274,11 +274,12 @@ mod tests { ); let symbols: Vec = - from_binary(&query(deps.as_ref(), mock_env(), QueryMsg::Denoms {}).unwrap()).unwrap(); + from_json_binary(&query(deps.as_ref(), mock_env(), QueryMsg::Denoms {}).unwrap()) + .unwrap(); assert_eq!(symbols.len(), 98); - let denom: DenomMetadata = from_binary( + let denom: DenomMetadata = from_json_binary( &query( deps.as_ref(), mock_env(), diff --git a/contracts/cyberpunk/tests/integration.rs b/contracts/cyberpunk/tests/integration.rs index 8abdc74f59..1826cf0bf8 100644 --- a/contracts/cyberpunk/tests/integration.rs +++ b/contracts/cyberpunk/tests/integration.rs @@ -17,7 +17,7 @@ //! }); //! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) -use cosmwasm_std::{from_binary, Empty, Env, Response}; +use cosmwasm_std::{from_json_binary, Empty, Env, Response}; use cosmwasm_vm::testing::{ execute, instantiate, mock_env, mock_info, mock_instance, mock_instance_with_gas_limit, query, }; @@ -152,13 +152,13 @@ fn test_env() { ) .unwrap(); - let received_env: Env = from_binary(&res.data.unwrap()).unwrap(); + let received_env: Env = from_json_binary(&res.data.unwrap()).unwrap(); assert_eq!(received_env, env); let env = mock_env(); let received_env: Env = - from_binary(&query(&mut deps, env.clone(), QueryMsg::MirrorEnv {}).unwrap()).unwrap(); + from_json_binary(&query(&mut deps, env.clone(), QueryMsg::MirrorEnv {}).unwrap()).unwrap(); assert_eq!(received_env, env); } diff --git a/contracts/floaty/src/contract.rs b/contracts/floaty/src/contract.rs index bff2397899..644c9d1ca9 100644 --- a/contracts/floaty/src/contract.rs +++ b/contracts/floaty/src/contract.rs @@ -1,6 +1,6 @@ use cosmwasm_std::{ - entry_point, from_slice, to_binary, to_vec, AllBalanceResponse, BankMsg, Deps, DepsMut, Env, - Event, MessageInfo, QueryResponse, Response, StdError, StdResult, + entry_point, from_json_slice, to_json_binary, to_json_vec, AllBalanceResponse, BankMsg, Deps, + DepsMut, Env, Event, MessageInfo, QueryResponse, Response, StdError, StdResult, }; use crate::errors::HackError; @@ -18,7 +18,7 @@ pub fn instantiate( deps.storage.set( CONFIG_KEY, - &to_vec(&State { + &to_json_vec(&State { verifier: deps.api.addr_validate(&msg.verifier)?, beneficiary: deps.api.addr_validate(&msg.beneficiary)?, funder: info.sender, @@ -40,7 +40,7 @@ pub fn execute( .storage .get(CONFIG_KEY) .ok_or_else(|| StdError::not_found("State"))?; - let state: State = from_slice(&data)?; + let state: State = from_json_slice(&data)?; if info.sender == state.verifier { let to_addr = state.beneficiary; @@ -67,8 +67,8 @@ pub fn execute( pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { match msg { - QueryMsg::Verifier {} => to_binary(&query_verifier(deps)?), - QueryMsg::OtherBalance { address } => to_binary(&query_other_balance(deps, address)?), + QueryMsg::Verifier {} => to_json_binary(&query_verifier(deps)?), + QueryMsg::OtherBalance { address } => to_json_binary(&query_other_balance(deps, address)?), } } @@ -77,7 +77,7 @@ fn query_verifier(deps: Deps) -> StdResult { .storage .get(CONFIG_KEY) .ok_or_else(|| StdError::not_found("State"))?; - let state: State = from_slice(&data)?; + let state: State = from_json_slice(&data)?; Ok(VerifierResponse { verifier: state.verifier.into(), }) @@ -124,7 +124,7 @@ mod tests { // it worked, let's check the state let data = deps.storage.get(CONFIG_KEY).expect("no data stored"); - let state: State = from_slice(&data).unwrap(); + let state: State = from_json_slice(&data).unwrap(); assert_eq!(state, expected_state); } @@ -246,7 +246,7 @@ mod tests { // state should not change let data = deps.storage.get(CONFIG_KEY).expect("no data stored"); - let state: State = from_slice(&data).unwrap(); + let state: State = from_json_slice(&data).unwrap(); assert_eq!( state, State { diff --git a/contracts/hackatom/src/contract.rs b/contracts/hackatom/src/contract.rs index 6de12ab53e..ba578792e0 100644 --- a/contracts/hackatom/src/contract.rs +++ b/contracts/hackatom/src/contract.rs @@ -1,9 +1,9 @@ use sha2::{Digest, Sha256}; use cosmwasm_std::{ - entry_point, from_slice, to_binary, to_vec, Addr, AllBalanceResponse, Api, BankMsg, - CanonicalAddr, Deps, DepsMut, Env, Event, MessageInfo, QueryRequest, QueryResponse, Response, - StdError, StdResult, WasmMsg, WasmQuery, + entry_point, from_json_slice, to_json_binary, to_json_vec, Addr, AllBalanceResponse, Api, + BankMsg, CanonicalAddr, Deps, DepsMut, Env, Event, MessageInfo, QueryRequest, QueryResponse, + Response, StdError, StdResult, WasmMsg, WasmQuery, }; use crate::errors::HackError; @@ -24,7 +24,7 @@ pub fn instantiate( deps.storage.set( CONFIG_KEY, - &to_vec(&State { + &to_json_vec(&State { verifier: deps.api.addr_validate(&msg.verifier)?, beneficiary: deps.api.addr_validate(&msg.beneficiary)?, funder: info.sender, @@ -41,9 +41,9 @@ pub fn migrate(deps: DepsMut, _env: Env, msg: MigrateMsg) -> Result Result Result { fn do_message_loop(env: Env) -> Result { let resp = Response::new().add_message(WasmMsg::Execute { contract_addr: env.contract.address.into(), - msg: to_binary(&ExecuteMsg::MessageLoop {})?, + msg: to_json_binary(&ExecuteMsg::MessageLoop {})?, funds: vec![], }); Ok(resp) @@ -248,12 +248,12 @@ fn do_user_errors_in_api_calls(api: &dyn Api) -> Result { #[entry_point] pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { match msg { - QueryMsg::Verifier {} => to_binary(&query_verifier(deps)?), - QueryMsg::OtherBalance { address } => to_binary(&query_other_balance(deps, address)?), + QueryMsg::Verifier {} => to_json_binary(&query_verifier(deps)?), + QueryMsg::OtherBalance { address } => to_json_binary(&query_other_balance(deps, address)?), QueryMsg::Recurse { depth, work } => { - to_binary(&query_recurse(deps, depth, work, env.contract.address)?) + to_json_binary(&query_recurse(deps, depth, work, env.contract.address)?) } - QueryMsg::GetInt {} => to_binary(&query_int()), + QueryMsg::GetInt {} => to_json_binary(&query_int()), } } @@ -262,7 +262,7 @@ fn query_verifier(deps: Deps) -> StdResult { .storage .get(CONFIG_KEY) .ok_or_else(|| StdError::not_found("State"))?; - let state: State = from_slice(&data)?; + let state: State = from_json_slice(&data)?; Ok(VerifierResponse { verifier: state.verifier.into(), }) @@ -293,7 +293,7 @@ fn query_recurse(deps: Deps, depth: u32, work: u32, contract: Addr) -> StdResult }; let query = QueryRequest::Wasm(WasmQuery::Smart { contract_addr: contract.into(), - msg: to_binary(&req)?, + msg: to_json_binary(&req)?, }); deps.querier.query(&query) } @@ -336,7 +336,7 @@ mod tests { // it worked, let's check the state let data = deps.storage.get(CONFIG_KEY).expect("no data stored"); - let state: State = from_slice(&data).unwrap(); + let state: State = from_json_slice(&data).unwrap(); assert_eq!(state, expected_state); } @@ -514,7 +514,7 @@ mod tests { // state should not change let data = deps.storage.get(CONFIG_KEY).expect("no data stored"); - let state: State = from_slice(&data).unwrap(); + let state: State = from_json_slice(&data).unwrap(); assert_eq!( state, State { diff --git a/contracts/hackatom/tests/integration.rs b/contracts/hackatom/tests/integration.rs index 10f77d091c..f91f2d54db 100644 --- a/contracts/hackatom/tests/integration.rs +++ b/contracts/hackatom/tests/integration.rs @@ -18,8 +18,8 @@ //! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) use cosmwasm_std::{ - assert_approx_eq, coins, from_binary, to_vec, Addr, AllBalanceResponse, BankMsg, Binary, - ContractResult, Empty, Response, SubMsg, + assert_approx_eq, coins, from_json_binary, to_json_vec, Addr, AllBalanceResponse, BankMsg, + Binary, ContractResult, Empty, Response, SubMsg, }; use cosmwasm_vm::{ call_execute, from_slice, @@ -183,7 +183,7 @@ fn querier_callbacks_work() { // querying with balance gets the balance let query_msg = QueryMsg::OtherBalance { address: rich_addr }; let query_response = query(&mut deps, mock_env(), query_msg).unwrap(); - let bal: AllBalanceResponse = from_binary(&query_response).unwrap(); + let bal: AllBalanceResponse = from_json_binary(&query_response).unwrap(); assert_eq!(bal.amount, rich_balance); // querying other accounts gets none @@ -191,7 +191,7 @@ fn querier_callbacks_work() { address: String::from("someone else"), }; let query_response = query(&mut deps, mock_env(), query_msg).unwrap(); - let bal: AllBalanceResponse = from_binary(&query_response).unwrap(); + let bal: AllBalanceResponse = from_json_binary(&query_response).unwrap(); assert_eq!(bal.amount, vec![]); } @@ -322,7 +322,7 @@ fn execute_cpu_loop() { &mut deps, &mock_env(), &execute_info, - &to_vec(&ExecuteMsg::CpuLoop {}).unwrap(), + &to_json_vec(&ExecuteMsg::CpuLoop {}).unwrap(), ); assert!(execute_res.is_err()); assert_eq!(deps.get_gas_left(), 0); @@ -344,7 +344,7 @@ fn execute_storage_loop() { &mut deps, &mock_env(), &execute_info, - &to_vec(&ExecuteMsg::StorageLoop {}).unwrap(), + &to_json_vec(&ExecuteMsg::StorageLoop {}).unwrap(), ); assert!(execute_res.is_err()); assert_eq!(deps.get_gas_left(), 0); @@ -366,7 +366,7 @@ fn execute_memory_loop() { &mut deps, &mock_env(), &execute_info, - &to_vec(&ExecuteMsg::MemoryLoop {}).unwrap(), + &to_json_vec(&ExecuteMsg::MemoryLoop {}).unwrap(), ); assert!(execute_res.is_err()); assert_eq!(deps.get_gas_left(), 0); @@ -448,7 +448,7 @@ fn execute_panic() { &mut deps, &mock_env(), &execute_info, - &to_vec(&ExecuteMsg::Panic {}).unwrap(), + &to_json_vec(&ExecuteMsg::Panic {}).unwrap(), ); match execute_res.unwrap_err() { VmError::RuntimeErr { msg, .. } => { diff --git a/contracts/ibc-reflect-send/src/contract.rs b/contracts/ibc-reflect-send/src/contract.rs index 50d074f3a8..23adc82b89 100644 --- a/contracts/ibc-reflect-send/src/contract.rs +++ b/contracts/ibc-reflect-send/src/contract.rs @@ -1,5 +1,5 @@ use cosmwasm_std::{ - entry_point, to_binary, CosmosMsg, Deps, DepsMut, Env, IbcMsg, MessageInfo, QueryResponse, + entry_point, to_json_binary, CosmosMsg, Deps, DepsMut, Env, IbcMsg, MessageInfo, QueryResponse, Response, StdError, StdResult, }; @@ -79,7 +79,7 @@ pub fn handle_send_msgs( let packet = PacketMsg::Dispatch { msgs }; let msg = IbcMsg::SendPacket { channel_id, - data: to_binary(&packet)?, + data: to_json_binary(&packet)?, timeout: env.block.time.plus_seconds(PACKET_LIFETIME).into(), }; @@ -107,7 +107,7 @@ pub fn handle_check_remote_balance( let packet = PacketMsg::Balances {}; let msg = IbcMsg::SendPacket { channel_id, - data: to_binary(&packet)?, + data: to_json_binary(&packet)?, timeout: env.block.time.plus_seconds(PACKET_LIFETIME).into(), }; @@ -168,9 +168,9 @@ pub fn handle_send_funds( #[entry_point] pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { match msg { - QueryMsg::Admin {} => to_binary(&query_admin(deps)?), - QueryMsg::Account { channel_id } => to_binary(&query_account(deps, channel_id)?), - QueryMsg::ListAccounts {} => to_binary(&query_list_accounts(deps)?), + QueryMsg::Admin {} => to_json_binary(&query_admin(deps)?), + QueryMsg::Account { channel_id } => to_json_binary(&query_account(deps, channel_id)?), + QueryMsg::ListAccounts {} => to_json_binary(&query_list_accounts(deps)?), } } diff --git a/contracts/ibc-reflect-send/src/ibc.rs b/contracts/ibc-reflect-send/src/ibc.rs index 634fed3e81..f29cabdb68 100644 --- a/contracts/ibc-reflect-send/src/ibc.rs +++ b/contracts/ibc-reflect-send/src/ibc.rs @@ -1,6 +1,6 @@ use cosmwasm_std::{ - entry_point, from_slice, to_binary, DepsMut, Env, IbcBasicResponse, IbcChannelCloseMsg, - IbcChannelConnectMsg, IbcChannelOpenMsg, IbcMsg, IbcOrder, IbcPacketAckMsg, + entry_point, from_json_slice, to_json_binary, DepsMut, Env, IbcBasicResponse, + IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcMsg, IbcOrder, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, Never, StdError, StdResult, }; @@ -59,7 +59,7 @@ pub fn ibc_channel_connect( let packet = PacketMsg::WhoAmI {}; let msg = IbcMsg::SendPacket { channel_id: channel_id.clone(), - data: to_binary(&packet)?, + data: to_json_binary(&packet)?, timeout: env.block.time.plus_seconds(PACKET_LIFETIME).into(), }; @@ -108,18 +108,21 @@ pub fn ibc_packet_ack( // which local channel was this packet send from let caller = msg.original_packet.src.channel_id; // we need to parse the ack based on our request - let packet: PacketMsg = from_slice(&msg.original_packet.data)?; + let packet: PacketMsg = from_json_slice(&msg.original_packet.data)?; match packet { PacketMsg::Dispatch { .. } => { - let res: AcknowledgementMsg = from_slice(&msg.acknowledgement.data)?; + let res: AcknowledgementMsg = + from_json_slice(&msg.acknowledgement.data)?; acknowledge_dispatch(deps, caller, res) } PacketMsg::WhoAmI {} => { - let res: AcknowledgementMsg = from_slice(&msg.acknowledgement.data)?; + let res: AcknowledgementMsg = + from_json_slice(&msg.acknowledgement.data)?; acknowledge_who_am_i(deps, caller, res) } PacketMsg::Balances {} => { - let res: AcknowledgementMsg = from_slice(&msg.acknowledgement.data)?; + let res: AcknowledgementMsg = + from_json_slice(&msg.acknowledgement.data)?; acknowledge_balances(deps, env, caller, res) } } @@ -305,7 +308,7 @@ mod tests { channel_id: channel_id.into(), }; let r = query(deps.as_ref(), mock_env(), q).unwrap(); - let acct: AccountResponse = from_slice(&r).unwrap(); + let acct: AccountResponse = from_json_slice(&r).unwrap(); assert!(acct.remote_addr.is_none()); assert!(acct.remote_balance.is_empty()); assert_eq!(0, acct.last_update_time.nanos()); @@ -319,7 +322,7 @@ mod tests { channel_id: channel_id.into(), }; let r = query(deps.as_ref(), mock_env(), q).unwrap(); - let acct: AccountResponse = from_slice(&r).unwrap(); + let acct: AccountResponse = from_json_slice(&r).unwrap(); assert_eq!(acct.remote_addr.unwrap(), remote_addr); assert!(acct.remote_balance.is_empty()); assert_eq!(0, acct.last_update_time.nanos()); diff --git a/contracts/ibc-reflect-send/src/state.rs b/contracts/ibc-reflect-send/src/state.rs index 062ff187e4..7e5a693797 100644 --- a/contracts/ibc-reflect-send/src/state.rs +++ b/contracts/ibc-reflect-send/src/state.rs @@ -1,9 +1,9 @@ use serde::{Deserialize, Serialize}; use cosmwasm_std::{ - from_slice, + from_json_slice, storage_keys::{namespace_with_key, to_length_prefixed}, - to_vec, Addr, Coin, Order, StdError, StdResult, Storage, Timestamp, + to_json_vec, Addr, Coin, Order, StdError, StdResult, Storage, Timestamp, }; pub const KEY_CONFIG: &[u8] = b"config"; @@ -33,7 +33,7 @@ pub struct AccountData { pub fn may_load_account(storage: &dyn Storage, id: &str) -> StdResult> { storage .get(&namespace_with_key(&[PREFIX_ACCOUNTS], id.as_bytes())) - .map(|v| from_slice(&v)) + .map(|v| from_json_slice(&v)) .transpose() } @@ -44,7 +44,7 @@ pub fn load_account(storage: &dyn Storage, id: &str) -> StdResult { pub fn save_account(storage: &mut dyn Storage, id: &str, account: &AccountData) -> StdResult<()> { storage.set( &namespace_with_key(&[PREFIX_ACCOUNTS], id.as_bytes()), - &to_vec(account)?, + &to_json_vec(account)?, ); Ok(()) } @@ -63,7 +63,7 @@ pub fn range_accounts( .map(|(key, val)| { Ok(( String::from_utf8(key[PREFIX_ACCOUNTS.len() + 2..].to_vec())?, - from_slice(&val)?, + from_json_slice(&val)?, )) }) } @@ -72,10 +72,10 @@ pub fn load_config(storage: &dyn Storage) -> StdResult { storage .get(&to_length_prefixed(KEY_CONFIG)) .ok_or_else(|| StdError::not_found("config")) - .and_then(|v| from_slice(&v)) + .and_then(|v| from_json_slice(&v)) } pub fn save_config(storage: &mut dyn Storage, item: &Config) -> StdResult<()> { - storage.set(&to_length_prefixed(KEY_CONFIG), &to_vec(item)?); + storage.set(&to_length_prefixed(KEY_CONFIG), &to_json_vec(item)?); Ok(()) } diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 1af5d90e91..2777363867 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -1,6 +1,6 @@ use cosmwasm_std::{ - entry_point, from_slice, to_binary, wasm_execute, BankMsg, Binary, CosmosMsg, Deps, DepsMut, - Empty, Env, Event, Ibc3ChannelOpenResponse, IbcBasicResponse, IbcChannelCloseMsg, + entry_point, from_json_slice, to_json_binary, wasm_execute, BankMsg, Binary, CosmosMsg, Deps, + DepsMut, Empty, Env, Event, Ibc3ChannelOpenResponse, IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcChannelOpenResponse, IbcOrder, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, MessageInfo, Never, QueryResponse, Reply, Response, StdError, StdResult, SubMsg, SubMsgResponse, SubMsgResult, @@ -91,8 +91,8 @@ pub fn handle_init_callback(deps: DepsMut, response: SubMsgResponse) -> StdResul #[entry_point] pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { match msg { - QueryMsg::Account { channel_id } => to_binary(&query_account(deps, channel_id)?), - QueryMsg::ListAccounts {} => to_binary(&query_list_accounts(deps)?), + QueryMsg::Account { channel_id } => to_json_binary(&query_account(deps, channel_id)?), + QueryMsg::ListAccounts {} => to_json_binary(&query_list_accounts(deps)?), } } @@ -224,7 +224,7 @@ pub fn migrate(_deps: DepsMut, _env: Env, _msg: Empty) -> StdResult { // this encode an error or error message into a proper acknowledgement to the recevier fn encode_ibc_error(msg: impl Into) -> Binary { // this cannot error, unwrap to keep the interface simple - to_binary(&AcknowledgementMsg::<()>::Error(msg.into())).unwrap() + to_json_binary(&AcknowledgementMsg::<()>::Error(msg.into())).unwrap() } #[entry_point] @@ -241,7 +241,7 @@ pub fn ibc_packet_receive( let packet = msg.packet; // which local channel did this packet come on let caller = packet.dest.channel_id; - let msg: PacketMsg = from_slice(&packet.data)?; + let msg: PacketMsg = from_json_slice(&packet.data)?; match msg { PacketMsg::Dispatch { msgs } => receive_dispatch(deps, caller, msgs), PacketMsg::WhoAmI {} => receive_who_am_i(deps, caller), @@ -267,7 +267,7 @@ fn receive_who_am_i(deps: DepsMut, caller: String) -> StdResult StdResult::Ok(()))?; + let acknowledgement = to_json_binary(&AcknowledgementMsg::::Ok(()))?; // create the message to re-dispatch to the reflect contract let reflect_msg = ReflectExecuteMsg::ReflectMsg { msgs }; let wasm_msg = wasm_execute(reflect_addr, &reflect_msg, vec![])?; @@ -322,7 +322,7 @@ fn execute_error(text: String) -> StdResult { } fn execute_return_msgs(msgs: Vec) -> StdResult { - let acknowledgement = to_binary(&AcknowledgementMsg::::Ok(()))?; + let acknowledgement = to_json_binary(&AcknowledgementMsg::::Ok(()))?; Ok(IbcReceiveResponse::new() .set_ack(acknowledgement) @@ -358,7 +358,7 @@ mod tests { mock_ibc_channel_open_init, mock_ibc_channel_open_try, mock_ibc_packet_recv, mock_info, mock_wasmd_attr, MockApi, MockQuerier, MockStorage, MOCK_CONTRACT_ADDR, }; - use cosmwasm_std::{attr, coin, coins, from_slice, BankMsg, OwnedDeps, WasmMsg}; + use cosmwasm_std::{attr, coin, coins, from_json_slice, BankMsg, OwnedDeps, WasmMsg}; const CREATOR: &str = "creator"; // code id of the reflect contract @@ -482,7 +482,7 @@ mod tests { // no accounts set yet let raw = query(deps.as_ref(), mock_env(), QueryMsg::ListAccounts {}).unwrap(); - let res: ListAccountsResponse = from_slice(&raw).unwrap(); + let res: ListAccountsResponse = from_json_slice(&raw).unwrap(); assert_eq!(0, res.accounts.len()); // fake a reply and ensure this works @@ -497,7 +497,7 @@ mod tests { // ensure this is now registered let raw = query(deps.as_ref(), mock_env(), QueryMsg::ListAccounts {}).unwrap(); - let res: ListAccountsResponse = from_slice(&raw).unwrap(); + let res: ListAccountsResponse = from_json_slice(&raw).unwrap(); assert_eq!(1, res.accounts.len()); assert_eq!( &res.accounts[0], @@ -516,7 +516,7 @@ mod tests { }, ) .unwrap(); - let res: AccountResponse = from_slice(&raw).unwrap(); + let res: AccountResponse = from_json_slice(&raw).unwrap(); assert_eq!(res.account.unwrap(), REFLECT_ADDR); } @@ -546,7 +546,8 @@ mod tests { res.events[0] ); // acknowledgement is an error - let ack: AcknowledgementMsg = from_slice(&res.acknowledgement).unwrap(); + let ack: AcknowledgementMsg = + from_json_slice(&res.acknowledgement).unwrap(); assert_eq!( ack.unwrap_err(), "invalid packet: account channel-123 not found" @@ -560,7 +561,7 @@ mod tests { let res = ibc_packet_receive(deps.as_mut(), mock_env(), msg).unwrap(); // assert app-level success - let ack: AcknowledgementMsg<()> = from_slice(&res.acknowledgement).unwrap(); + let ack: AcknowledgementMsg<()> = from_json_slice(&res.acknowledgement).unwrap(); ack.unwrap(); // and we dispatch the BankMsg via submessage @@ -577,7 +578,7 @@ mod tests { assert_eq!(account, contract_addr.as_str()); assert_eq!(0, funds.len()); // parse the message - should callback with proper channel_id - let rmsg: ReflectExecuteMsg = from_slice(msg).unwrap(); + let rmsg: ReflectExecuteMsg = from_json_slice(msg).unwrap(); assert_eq!( rmsg, ReflectExecuteMsg::ReflectMsg { @@ -597,7 +598,8 @@ mod tests { // we didn't dispatch anything assert_eq!(0, res.messages.len()); // acknowledgement is an error - let ack: AcknowledgementMsg = from_slice(&res.acknowledgement).unwrap(); + let ack: AcknowledgementMsg = + from_json_slice(&res.acknowledgement).unwrap(); assert_eq!(ack.unwrap_err(), "invalid packet: Error parsing into type ibc_reflect::msg::PacketMsg: unknown variant `reflect_code_id`, expected one of `dispatch`, `who_am_i`, `balances`, `panic`, `return_err`, `return_msgs`"); } @@ -616,7 +618,7 @@ mod tests { // channel should be listed and have balance let raw = query(deps.as_ref(), mock_env(), QueryMsg::ListAccounts {}).unwrap(); - let res: ListAccountsResponse = from_slice(&raw).unwrap(); + let res: ListAccountsResponse = from_json_slice(&raw).unwrap(); assert_eq!(1, res.accounts.len()); let balance = deps.as_ref().querier.query_all_balances(account).unwrap(); assert_eq!(funds, balance); @@ -632,7 +634,7 @@ mod tests { }) = &res.messages[0].msg { assert_eq!(contract_addr.as_str(), account); - let reflect: ReflectExecuteMsg = from_slice(msg).unwrap(); + let reflect: ReflectExecuteMsg = from_json_slice(msg).unwrap(); match reflect { ReflectExecuteMsg::ReflectMsg { msgs } => { assert_eq!(1, msgs.len()); @@ -652,7 +654,7 @@ mod tests { // and removes the account lookup let raw = query(deps.as_ref(), mock_env(), QueryMsg::ListAccounts {}).unwrap(); - let res: ListAccountsResponse = from_slice(&raw).unwrap(); + let res: ListAccountsResponse = from_json_slice(&raw).unwrap(); assert_eq!(0, res.accounts.len()); } } diff --git a/contracts/ibc-reflect/src/state.rs b/contracts/ibc-reflect/src/state.rs index bbb1fdaaa1..a229960d5e 100644 --- a/contracts/ibc-reflect/src/state.rs +++ b/contracts/ibc-reflect/src/state.rs @@ -1,9 +1,9 @@ use std::any::type_name; use cosmwasm_std::{ - from_slice, + from_json_slice, storage_keys::{namespace_with_key, to_length_prefixed}, - to_vec, Addr, Order, StdError, StdResult, Storage, + to_json_vec, Addr, Order, StdError, StdResult, Storage, }; use schemars::JsonSchema; use serde::{de::DeserializeOwned, Deserialize, Serialize}; @@ -22,7 +22,7 @@ pub struct Config { pub fn may_load_account(storage: &dyn Storage, id: &str) -> StdResult> { storage .get(&namespace_with_key(&[PREFIX_ACCOUNTS], id.as_bytes())) - .map(|v| from_slice(&v)) + .map(|v| from_json_slice(&v)) .transpose() } @@ -33,7 +33,7 @@ pub fn load_account(storage: &dyn Storage, id: &str) -> StdResult { pub fn save_account(storage: &mut dyn Storage, id: &str, account: &Addr) -> StdResult<()> { storage.set( &namespace_with_key(&[PREFIX_ACCOUNTS], id.as_bytes()), - &to_vec(account)?, + &to_json_vec(account)?, ); Ok(()) } @@ -52,7 +52,7 @@ pub fn range_accounts( .map(|(key, val)| { Ok(( String::from_utf8(key[PREFIX_ACCOUNTS.len() + 2..].to_vec())?, - from_slice(&val)?, + from_json_slice(&val)?, )) }) } @@ -61,10 +61,10 @@ pub fn load_item(storage: &dyn Storage, key: &[u8]) -> StdR storage .get(&to_length_prefixed(key)) .ok_or_else(|| StdError::not_found(type_name::())) - .and_then(|v| from_slice(&v)) + .and_then(|v| from_json_slice(&v)) } pub fn save_item(storage: &mut dyn Storage, key: &[u8], item: &T) -> StdResult<()> { - storage.set(&to_length_prefixed(key), &to_vec(item)?); + storage.set(&to_length_prefixed(key), &to_json_vec(item)?); Ok(()) } diff --git a/contracts/queue/src/contract.rs b/contracts/queue/src/contract.rs index 63c1769ec7..33405decfe 100644 --- a/contracts/queue/src/contract.rs +++ b/contracts/queue/src/contract.rs @@ -1,6 +1,6 @@ use cosmwasm_std::{ - entry_point, from_slice, to_binary, to_vec, Binary, Deps, DepsMut, Empty, Env, MessageInfo, - Order, QueryResponse, Response, StdResult, Storage, + entry_point, from_json_slice, to_json_binary, to_json_vec, Binary, Deps, DepsMut, Empty, Env, + MessageInfo, Order, QueryResponse, Response, StdResult, Storage, }; use crate::msg::{ @@ -51,7 +51,7 @@ fn enqueue(storage: &mut dyn Storage, value: i32) -> StdResult<()> { (last_key + 1).to_be_bytes() } }; - let new_value = to_vec(&Item { value })?; + let new_value = to_json_vec(&Item { value })?; storage.set(&new_key, &new_value); Ok(()) @@ -92,11 +92,11 @@ pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> StdResult StdResult { match msg { - QueryMsg::Count {} => to_binary(&query_count(deps)), - QueryMsg::Sum {} => to_binary(&query_sum(deps)?), - QueryMsg::Reducer {} => to_binary(&query_reducer(deps)?), - QueryMsg::List {} => to_binary(&query_list(deps)), - QueryMsg::OpenIterators { count } => to_binary(&query_open_iterators(deps, count)), + QueryMsg::Count {} => to_json_binary(&query_count(deps)), + QueryMsg::Sum {} => to_json_binary(&query_sum(deps)?), + QueryMsg::Reducer {} => to_json_binary(&query_reducer(deps)?), + QueryMsg::List {} => to_json_binary(&query_list(deps)), + QueryMsg::OpenIterators { count } => to_json_binary(&query_open_iterators(deps, count)), } } @@ -112,7 +112,7 @@ fn query_sum(deps: Deps) -> StdResult { let values: StdResult> = deps .storage .range_values(None, None, Order::Ascending) - .map(|v| from_slice(&v)) + .map(|v| from_json_slice(&v)) .collect(); let sum = values?.iter().fold(0, |s, v| s + v.value); Ok(SumResponse { sum }) @@ -124,7 +124,7 @@ fn query_reducer(deps: Deps) -> StdResult { for val in deps .storage .range_values(None, None, Order::Ascending) - .map(|v| from_slice::(&v)) + .map(|v| from_json_slice::(&v)) { // this returns error on parse error let my_val = val?.value; @@ -134,7 +134,7 @@ fn query_reducer(deps: Deps) -> StdResult { .range_values(None, None, Order::Ascending) // get value. ignore parse errors, just count as 0 .map(|v| { - from_slice::(&v) + from_json_slice::(&v) .map(|v| v.value) .expect("error in item") }) @@ -181,7 +181,7 @@ mod tests { use cosmwasm_std::testing::{ mock_dependencies_with_balance, mock_env, mock_info, MockApi, MockQuerier, MockStorage, }; - use cosmwasm_std::{coins, from_binary, OwnedDeps}; + use cosmwasm_std::{coins, from_json_binary, OwnedDeps}; /// Instantiates a contract with no elements fn create_contract() -> (OwnedDeps, MessageInfo) { @@ -270,7 +270,7 @@ mod tests { // ensure we popped properly assert!(res.data.is_some()); let data = res.data.unwrap(); - let state: Item = from_slice(data.as_slice()).unwrap(); + let state: Item = from_json_slice(data.as_slice()).unwrap(); assert_eq!(state.value, 25); assert_eq!(get_count(deps.as_ref()), 1); @@ -340,7 +340,7 @@ mod tests { let query_msg = QueryMsg::List {}; let ids: ListResponse = - from_binary(&query(deps.as_ref(), mock_env(), query_msg).unwrap()).unwrap(); + from_json_binary(&query(deps.as_ref(), mock_env(), query_msg).unwrap()).unwrap(); assert_eq!(ids.empty, Vec::::new()); assert_eq!(ids.early, vec![0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f]); assert_eq!(ids.late, vec![0x20, 0x21, 0x22, 0x23, 0x24]); diff --git a/contracts/queue/tests/integration.rs b/contracts/queue/tests/integration.rs index 98a5b21f54..d5670167c8 100644 --- a/contracts/queue/tests/integration.rs +++ b/contracts/queue/tests/integration.rs @@ -17,7 +17,7 @@ //! }); //! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) -use cosmwasm_std::{from_binary, from_slice, MessageInfo, Response}; +use cosmwasm_std::{from_json_binary, MessageInfo, Response}; use cosmwasm_vm::{ testing::{ execute, instantiate, migrate, mock_env, mock_info, mock_instance_with_gas_limit, query, @@ -48,13 +48,13 @@ fn create_contract() -> (Instance, MessageInf fn get_count(deps: &mut Instance) -> u32 { let data = query(deps, mock_env(), QueryMsg::Count {}).unwrap(); - let res: CountResponse = from_binary(&data).unwrap(); + let res: CountResponse = from_json_binary(&data).unwrap(); res.count } fn get_sum(deps: &mut Instance) -> i32 { let data = query(deps, mock_env(), QueryMsg::Sum {}).unwrap(); - let res: SumResponse = from_binary(&data).unwrap(); + let res: SumResponse = from_json_binary(&data).unwrap(); res.sum } @@ -128,7 +128,7 @@ fn push_and_pop() { // ensure we popped properly assert!(res.data.is_some()); let data = res.data.unwrap(); - let item: Item = from_slice(data.as_slice()).unwrap(); + let item: Item = from_json_binary(&data).unwrap(); assert_eq!(item.value, 25); assert_eq!(get_count(&mut deps), 1); @@ -169,7 +169,7 @@ fn push_and_reduce() { assert_eq!(get_count(&mut deps), 4); assert_eq!(get_sum(&mut deps), 130); let data = query(&mut deps, mock_env(), QueryMsg::Reducer {}).unwrap(); - let counters = from_binary::(&data).unwrap().counters; + let counters = from_json_binary::(&data).unwrap().counters; assert_eq!(counters, vec![(40, 85), (15, 125), (85, 0), (-10, 140)]); } @@ -223,7 +223,8 @@ fn query_list() { // since we count up to 0x20 in early, we get early and late both with data let query_msg = QueryMsg::List {}; - let ids: ListResponse = from_binary(&query(&mut deps, mock_env(), query_msg).unwrap()).unwrap(); + let ids: ListResponse = + from_json_binary(&query(&mut deps, mock_env(), query_msg).unwrap()).unwrap(); assert_eq!(ids.empty, Vec::::new()); assert_eq!(ids.early, vec![0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f]); assert_eq!(ids.late, vec![0x20, 0x21, 0x22, 0x23, 0x24]); diff --git a/contracts/reflect/src/contract.rs b/contracts/reflect/src/contract.rs index 2213bd4b92..3f1196cd67 100644 --- a/contracts/reflect/src/contract.rs +++ b/contracts/reflect/src/contract.rs @@ -1,6 +1,6 @@ use cosmwasm_std::{ - entry_point, to_binary, to_vec, Binary, ContractResult, CosmosMsg, Deps, DepsMut, Env, - MessageInfo, QueryRequest, QueryResponse, Reply, Response, StdError, StdResult, SubMsg, + entry_point, to_json_binary, to_json_vec, Binary, ContractResult, CosmosMsg, Deps, DepsMut, + Env, MessageInfo, QueryRequest, QueryResponse, Reply, Response, StdError, StdResult, SubMsg, SystemResult, }; @@ -119,11 +119,11 @@ pub fn reply(deps: DepsMut, _env: Env, msg: Reply) -> Result, _env: Env, msg: QueryMsg) -> StdResult { match msg { - QueryMsg::Owner {} => to_binary(&query_owner(deps)?), - QueryMsg::Capitalized { text } => to_binary(&query_capitalized(deps, text)?), - QueryMsg::Chain { request } => to_binary(&query_chain(deps, &request)?), - QueryMsg::Raw { contract, key } => to_binary(&query_raw(deps, contract, key)?), - QueryMsg::SubMsgResult { id } => to_binary(&query_subcall(deps, id)?), + QueryMsg::Owner {} => to_json_binary(&query_owner(deps)?), + QueryMsg::Capitalized { text } => to_json_binary(&query_capitalized(deps, text)?), + QueryMsg::Chain { request } => to_json_binary(&query_chain(deps, &request)?), + QueryMsg::Raw { contract, key } => to_json_binary(&query_raw(deps, contract, key)?), + QueryMsg::SubMsgResult { id } => to_json_binary(&query_subcall(deps, id)?), } } @@ -149,7 +149,7 @@ fn query_chain( deps: Deps, request: &QueryRequest, ) -> StdResult { - let raw = to_vec(request).map_err(|serialize_err| { + let raw = to_json_vec(request).map_err(|serialize_err| { StdError::generic_err(format!("Serializing QueryRequest: {serialize_err}")) })?; match deps.querier.raw_query(&raw) { @@ -176,7 +176,7 @@ mod tests { use crate::testing::mock_dependencies_with_custom_querier; use cosmwasm_std::testing::{mock_env, mock_info, MOCK_CONTRACT_ADDR}; use cosmwasm_std::{ - coin, coins, from_binary, AllBalanceResponse, BankMsg, BankQuery, Binary, Event, + coin, coins, from_json_binary, AllBalanceResponse, BankMsg, BankQuery, Binary, Event, StakingMsg, StdError, SubMsgResponse, SubMsgResult, }; @@ -365,7 +365,7 @@ mod tests { text: "demo one".to_string(), }; let response = query(deps.as_ref(), mock_env(), msg).unwrap(); - let value: CapitalizedResponse = from_binary(&response).unwrap(); + let value: CapitalizedResponse = from_json_binary(&response).unwrap(); assert_eq!(value.text, "DEMO ONE"); } @@ -381,8 +381,8 @@ mod tests { .into(), }; let response = query(deps.as_ref(), mock_env(), msg).unwrap(); - let outer: ChainResponse = from_binary(&response).unwrap(); - let inner: AllBalanceResponse = from_binary(&outer.data).unwrap(); + let outer: ChainResponse = from_json_binary(&response).unwrap(); + let inner: AllBalanceResponse = from_json_binary(&outer.data).unwrap(); assert_eq!(inner.amount, coins(123, "ucosm")); // with custom query @@ -390,8 +390,8 @@ mod tests { request: SpecialQuery::Ping {}.into(), }; let response = query(deps.as_ref(), mock_env(), msg).unwrap(); - let outer: ChainResponse = from_binary(&response).unwrap(); - let inner: SpecialResponse = from_binary(&outer.data).unwrap(); + let outer: ChainResponse = from_json_binary(&response).unwrap(); + let inner: SpecialResponse = from_json_binary(&outer.data).unwrap(); assert_eq!(inner.msg, "pong"); } @@ -452,7 +452,7 @@ mod tests { // query for the real id let raw = query(deps.as_ref(), mock_env(), QueryMsg::SubMsgResult { id }).unwrap(); - let qres: Reply = from_binary(&raw).unwrap(); + let qres: Reply = from_json_binary(&raw).unwrap(); assert_eq!(qres.id, id); let result = qres.result.unwrap(); assert_eq!(result.data, Some(data)); diff --git a/contracts/reflect/src/state.rs b/contracts/reflect/src/state.rs index 417c76315e..bad478e3c2 100644 --- a/contracts/reflect/src/state.rs +++ b/contracts/reflect/src/state.rs @@ -2,9 +2,9 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use cosmwasm_std::{ - from_slice, + from_json_slice, storage_keys::{namespace_with_key, to_length_prefixed}, - to_vec, Addr, Reply, StdError, StdResult, Storage, + to_json_vec, Addr, Reply, StdError, StdResult, Storage, }; const CONFIG_KEY: &[u8] = b"config"; @@ -19,13 +19,13 @@ pub fn load_reply(storage: &dyn Storage, id: u64) -> StdResult { storage .get(&namespace_with_key(&[RESULT_PREFIX], &id.to_be_bytes())) .ok_or_else(|| StdError::not_found(format!("reply {id}"))) - .and_then(|v| from_slice(&v)) + .and_then(|v| from_json_slice(&v)) } pub fn save_reply(storage: &mut dyn Storage, id: u64, reply: &Reply) -> StdResult<()> { storage.set( &namespace_with_key(&[RESULT_PREFIX], &id.to_be_bytes()), - &to_vec(reply)?, + &to_json_vec(reply)?, ); Ok(()) } @@ -38,10 +38,10 @@ pub fn load_config(storage: &dyn Storage) -> StdResult { storage .get(&to_length_prefixed(CONFIG_KEY)) .ok_or_else(|| StdError::not_found("config")) - .and_then(|v| from_slice(&v)) + .and_then(|v| from_json_slice(&v)) } pub fn save_config(storage: &mut dyn Storage, item: &State) -> StdResult<()> { - storage.set(&to_length_prefixed(CONFIG_KEY), &to_vec(item)?); + storage.set(&to_length_prefixed(CONFIG_KEY), &to_json_vec(item)?); Ok(()) } diff --git a/contracts/reflect/src/testing.rs b/contracts/reflect/src/testing.rs index 8f6ce714b1..d8643a030a 100644 --- a/contracts/reflect/src/testing.rs +++ b/contracts/reflect/src/testing.rs @@ -3,7 +3,7 @@ use std::marker::PhantomData; use crate::msg::{SpecialQuery, SpecialResponse}; use cosmwasm_std::testing::{MockApi, MockQuerier, MockStorage, MOCK_CONTRACT_ADDR}; -use cosmwasm_std::{to_binary, Binary, Coin, ContractResult, OwnedDeps, SystemResult}; +use cosmwasm_std::{to_json_binary, Binary, Coin, ContractResult, OwnedDeps, SystemResult}; /// A drop-in replacement for cosmwasm_std::testing::mock_dependencies /// this uses our CustomQuerier. @@ -26,18 +26,18 @@ pub fn custom_query_execute(query: &SpecialQuery) -> ContractResult { SpecialQuery::Ping {} => "pong".to_string(), SpecialQuery::Capitalized { text } => text.to_uppercase(), }; - to_binary(&SpecialResponse { msg }).into() + to_json_binary(&SpecialResponse { msg }).into() } #[cfg(test)] mod tests { use super::*; - use cosmwasm_std::{from_binary, QuerierWrapper, QueryRequest}; + use cosmwasm_std::{from_json_binary, QuerierWrapper, QueryRequest}; #[test] fn custom_query_execute_ping() { let res = custom_query_execute(&SpecialQuery::Ping {}).unwrap(); - let response: SpecialResponse = from_binary(&res).unwrap(); + let response: SpecialResponse = from_json_binary(&res).unwrap(); assert_eq!(response.msg, "pong"); } @@ -47,7 +47,7 @@ mod tests { text: "fOObaR".to_string(), }) .unwrap(); - let response: SpecialResponse = from_binary(&res).unwrap(); + let response: SpecialResponse = from_json_binary(&res).unwrap(); assert_eq!(response.msg, "FOOBAR"); } diff --git a/contracts/reflect/tests/integration.rs b/contracts/reflect/tests/integration.rs index 4df7685dc8..48e8a77c10 100644 --- a/contracts/reflect/tests/integration.rs +++ b/contracts/reflect/tests/integration.rs @@ -18,7 +18,7 @@ //! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) use cosmwasm_std::{ - coin, coins, from_binary, BankMsg, BankQuery, Binary, Coin, ContractResult, Event, + coin, coins, from_json_binary, BankMsg, BankQuery, Binary, Coin, ContractResult, Event, QueryRequest, Reply, Response, StakingMsg, SubMsg, SubMsgResponse, SubMsgResult, SupplyResponse, SystemResult, }; @@ -83,7 +83,7 @@ fn proper_initialization() { // it worked, let's query the state let res = query(&mut deps, mock_env(), QueryMsg::Owner {}).unwrap(); - let value: OwnerResponse = from_binary(&res).unwrap(); + let value: OwnerResponse = from_json_binary(&res).unwrap(); assert_eq!("creator", value.owner.as_str()); } @@ -159,7 +159,7 @@ fn transfer() { // should change state assert_eq!(0, res.messages.len()); let res = query(&mut deps, mock_env(), QueryMsg::Owner {}).unwrap(); - let value: OwnerResponse = from_binary(&res).unwrap(); + let value: OwnerResponse = from_json_binary(&res).unwrap(); assert_eq!("friend", value.owner.as_str()); } @@ -203,8 +203,8 @@ fn supply_query() { ) .unwrap(); - let res: ChainResponse = from_binary(&res).unwrap(); - let res: SupplyResponse = from_binary(&res.data).unwrap(); + let res: ChainResponse = from_json_binary(&res).unwrap(); + let res: SupplyResponse = from_json_binary(&res.data).unwrap(); assert_eq!(res.amount, coin(25, "OSMO")); } @@ -225,7 +225,7 @@ fn dispatch_custom_query() { }, ) .unwrap(); - let value: CapitalizedResponse = from_binary(&res).unwrap(); + let value: CapitalizedResponse = from_json_binary(&res).unwrap(); assert_eq!(value.text, "DEMO ONE"); } @@ -282,7 +282,7 @@ fn reply_and_query() { // query for the real id let raw = query(&mut deps, mock_env(), QueryMsg::SubMsgResult { id }).unwrap(); - let qres: Reply = from_binary(&raw).unwrap(); + let qres: Reply = from_json_binary(&raw).unwrap(); assert_eq!(qres.id, id); let result = qres.result.unwrap(); assert_eq!(result.data, Some(data)); diff --git a/contracts/staking/src/contract.rs b/contracts/staking/src/contract.rs index 19295f8efd..72b20818e6 100644 --- a/contracts/staking/src/contract.rs +++ b/contracts/staking/src/contract.rs @@ -1,5 +1,5 @@ use cosmwasm_std::{ - coin, entry_point, to_binary, BankMsg, Decimal, Deps, DepsMut, DistributionMsg, Env, + coin, entry_point, to_json_binary, BankMsg, Decimal, Deps, DepsMut, DistributionMsg, Env, MessageInfo, QuerierWrapper, QueryResponse, Response, StakingMsg, StdError, StdResult, Uint128, WasmMsg, }; @@ -289,7 +289,7 @@ pub fn claim(deps: DepsMut, env: Env, info: MessageInfo) -> StdResult pub fn reinvest(deps: DepsMut, env: Env, _info: MessageInfo) -> StdResult { let contract_addr = env.contract.address; let invest: InvestmentInfo = load_item(deps.storage, KEY_INVESTMENT)?; - let msg = to_binary(&ExecuteMsg::_BondAllTokens {})?; + let msg = to_json_binary(&ExecuteMsg::_BondAllTokens {})?; // and bond them to the validator let res = Response::new() @@ -349,10 +349,10 @@ pub fn _bond_all_tokens( #[entry_point] pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { match msg { - QueryMsg::TokenInfo {} => to_binary(&query_token_info(deps)?), - QueryMsg::Investment {} => to_binary(&query_investment(deps)?), - QueryMsg::Balance { address } => to_binary(&query_balance(deps, &address)?), - QueryMsg::Claims { address } => to_binary(&query_claims(deps, &address)?), + QueryMsg::TokenInfo {} => to_json_binary(&query_token_info(deps)?), + QueryMsg::Investment {} => to_json_binary(&query_investment(deps)?), + QueryMsg::Balance { address } => to_json_binary(&query_balance(deps, &address)?), + QueryMsg::Claims { address } => to_json_binary(&query_claims(deps, &address)?), } } diff --git a/contracts/staking/src/state.rs b/contracts/staking/src/state.rs index 40e875db29..41f7d2fb7b 100644 --- a/contracts/staking/src/state.rs +++ b/contracts/staking/src/state.rs @@ -4,9 +4,9 @@ use schemars::JsonSchema; use serde::{de::DeserializeOwned, Deserialize, Serialize}; use cosmwasm_std::{ - from_slice, + from_json_slice, storage_keys::{namespace_with_key, to_length_prefixed}, - to_vec, Addr, CanonicalAddr, Decimal, StdError, StdResult, Storage, Uint128, + to_json_vec, Addr, CanonicalAddr, Decimal, StdError, StdResult, Storage, Uint128, }; pub const KEY_INVESTMENT: &[u8] = b"invest"; @@ -23,7 +23,7 @@ pub fn may_load_map( ) -> StdResult> { storage .get(&namespace_with_key(&[prefix], key)) - .map(|v| from_slice(&v)) + .map(|v| from_json_slice(&v)) .transpose() } @@ -33,7 +33,7 @@ pub fn save_map( key: &CanonicalAddr, value: Uint128, ) -> StdResult<()> { - storage.set(&namespace_with_key(&[prefix], key), &to_vec(&value)?); + storage.set(&namespace_with_key(&[prefix], key), &to_json_vec(&value)?); Ok(()) } @@ -85,11 +85,11 @@ pub fn load_item(storage: &dyn Storage, key: &[u8]) -> StdR storage .get(&to_length_prefixed(key)) .ok_or_else(|| StdError::not_found(type_name::())) - .and_then(|v| from_slice(&v)) + .and_then(|v| from_json_slice(&v)) } pub fn save_item(storage: &mut dyn Storage, key: &[u8], item: &T) -> StdResult<()> { - storage.set(&to_length_prefixed(key), &to_vec(item)?); + storage.set(&to_length_prefixed(key), &to_json_vec(item)?); Ok(()) } diff --git a/contracts/staking/tests/integration.rs b/contracts/staking/tests/integration.rs index cec0aba128..6bb06b0f8c 100644 --- a/contracts/staking/tests/integration.rs +++ b/contracts/staking/tests/integration.rs @@ -17,7 +17,7 @@ //! }); //! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) -use cosmwasm_std::{coin, from_binary, ContractResult, Decimal, Response, Uint128, Validator}; +use cosmwasm_std::{coin, from_json_binary, ContractResult, Decimal, Response, Uint128, Validator}; use cosmwasm_vm::testing::{ instantiate, mock_backend, mock_env, mock_info, mock_instance_options, query, }; @@ -106,7 +106,7 @@ fn proper_initialization() { // token info is proper let res = query(&mut deps, mock_env(), QueryMsg::TokenInfo {}).unwrap(); - let token: TokenInfoResponse = from_binary(&res).unwrap(); + let token: TokenInfoResponse = from_json_binary(&res).unwrap(); assert_eq!(&token.name, &msg.name); assert_eq!(&token.symbol, &msg.symbol); assert_eq!(token.decimals, msg.decimals); @@ -120,7 +120,7 @@ fn proper_initialization() { }, ) .unwrap(); - let bal: BalanceResponse = from_binary(&res).unwrap(); + let bal: BalanceResponse = from_json_binary(&res).unwrap(); assert_eq!(bal.balance, Uint128::new(0)); // no claims @@ -132,12 +132,12 @@ fn proper_initialization() { }, ) .unwrap(); - let claim: ClaimsResponse = from_binary(&res).unwrap(); + let claim: ClaimsResponse = from_json_binary(&res).unwrap(); assert_eq!(claim.claims, Uint128::new(0)); // investment info correct let res = query(&mut deps, mock_env(), QueryMsg::Investment {}).unwrap(); - let invest: InvestmentResponse = from_binary(&res).unwrap(); + let invest: InvestmentResponse = from_json_binary(&res).unwrap(); assert_eq!(&invest.owner, &creator); assert_eq!(&invest.validator, &msg.validator); assert_eq!(invest.exit_tax, msg.exit_tax); diff --git a/contracts/virus/src/contract.rs b/contracts/virus/src/contract.rs index 202881b346..0a1235751a 100644 --- a/contracts/virus/src/contract.rs +++ b/contracts/virus/src/contract.rs @@ -1,5 +1,5 @@ use cosmwasm_std::{ - entry_point, instantiate2_address, to_binary, Attribute, Binary, CodeInfoResponse, + entry_point, instantiate2_address, to_json_binary, Attribute, Binary, CodeInfoResponse, ContractInfoResponse, DepsMut, Env, MessageInfo, Response, StdResult, WasmMsg, }; @@ -72,7 +72,7 @@ pub fn execute_spread( admin: None, code_id, label, - msg: to_binary(&InstantiateMsg {})?, + msg: to_json_binary(&InstantiateMsg {})?, funds: vec![], salt, }); @@ -80,7 +80,7 @@ pub fn execute_spread( // we know the address of the newly instantiated contract, so let's execute it right away msgs.push(WasmMsg::Execute { contract_addr: address.into(), - msg: to_binary(&ExecuteMsg::Spread { + msg: to_json_binary(&ExecuteMsg::Spread { parent_path: path, levels: levels - 1, })?, diff --git a/packages/std/src/binary.rs b/packages/std/src/binary.rs index ec5954aeb0..ef98b30ef0 100644 --- a/packages/std/src/binary.rs +++ b/packages/std/src/binary.rs @@ -253,7 +253,7 @@ mod tests { use super::*; use crate::assert_hash_works; use crate::errors::StdError; - use crate::serde::{from_slice, to_vec}; + use crate::serde::{from_json_slice, to_json_vec}; #[test] fn to_array_works() { @@ -450,8 +450,8 @@ mod tests { fn serialization_works() { let binary = Binary(vec![0u8, 187, 61, 11, 250, 0]); - let json = to_vec(&binary).unwrap(); - let deserialized: Binary = from_slice(&json).unwrap(); + let json = to_json_vec(&binary).unwrap(); + let deserialized: Binary = from_json_slice(&json).unwrap(); assert_eq!(binary, deserialized); } @@ -462,16 +462,16 @@ mod tests { // this is the binary behind above string let expected = vec![0u8, 187, 61, 11, 250, 0]; - let serialized = to_vec(&b64_str).unwrap(); - let deserialized: Binary = from_slice(&serialized).unwrap(); + let serialized = to_json_vec(&b64_str).unwrap(); + let deserialized: Binary = from_json_slice(&serialized).unwrap(); assert_eq!(expected, deserialized.as_slice()); } #[test] fn deserialize_from_invalid_string() { let invalid_str = "**BAD!**"; - let serialized = to_vec(&invalid_str).unwrap(); - let res = from_slice::(&serialized); + let serialized = to_json_vec(&invalid_str).unwrap(); + let res = from_json_slice::(&serialized); assert!(res.is_err()); } diff --git a/packages/std/src/errors/system_error.rs b/packages/std/src/errors/system_error.rs index 94790295bb..e67a99baa4 100644 --- a/packages/std/src/errors/system_error.rs +++ b/packages/std/src/errors/system_error.rs @@ -69,7 +69,7 @@ impl core::fmt::Display for SystemError { #[cfg(test)] mod tests { use super::*; - use crate::{from_slice, to_vec}; + use crate::{from_json_slice, to_json_vec}; #[test] fn system_error_no_such_contract_serialization() { @@ -78,14 +78,14 @@ mod tests { }; // ser - let json = to_vec(&err).unwrap(); + let json = to_json_vec(&err).unwrap(); assert_eq!( String::from_utf8_lossy(&json), r#"{"no_such_contract":{"addr":"gibtsnicht"}}"#, ); // de - let err: SystemError = from_slice(br#"{"no_such_contract":{"addr":"nada"}}"#).unwrap(); + let err: SystemError = from_json_slice(br#"{"no_such_contract":{"addr":"nada"}}"#).unwrap(); assert_eq!( err, SystemError::NoSuchContract { @@ -99,14 +99,14 @@ mod tests { let err = SystemError::NoSuchCode { code_id: 13 }; // ser - let json = to_vec(&err).unwrap(); + let json = to_json_vec(&err).unwrap(); assert_eq!( String::from_utf8_lossy(&json), r#"{"no_such_code":{"code_id":13}}"#, ); // de - let err: SystemError = from_slice(br#"{"no_such_code":{"code_id":987}}"#).unwrap(); + let err: SystemError = from_json_slice(br#"{"no_such_code":{"code_id":987}}"#).unwrap(); assert_eq!(err, SystemError::NoSuchCode { code_id: 987 },); } } diff --git a/packages/std/src/exports.rs b/packages/std/src/exports.rs index 8f057712d4..53842ad00e 100644 --- a/packages/std/src/exports.rs +++ b/packages/std/src/exports.rs @@ -25,7 +25,7 @@ use crate::memory::{alloc, consume_region, release_buffer, Region}; use crate::panic::install_panic_handler; use crate::query::CustomQuery; use crate::results::{ContractResult, QueryResponse, Reply, Response}; -use crate::serde::{from_slice, to_vec}; +use crate::serde::{from_json_slice, to_json_vec}; use crate::types::Env; use crate::{CustomMsg, Deps, DepsMut, MessageInfo}; @@ -120,7 +120,7 @@ where info_ptr as *mut Region, msg_ptr as *mut Region, ); - let v = to_vec(&res).unwrap(); + let v = to_json_vec(&res).unwrap(); release_buffer(v) as u32 } @@ -150,7 +150,7 @@ where info_ptr as *mut Region, msg_ptr as *mut Region, ); - let v = to_vec(&res).unwrap(); + let v = to_json_vec(&res).unwrap(); release_buffer(v) as u32 } @@ -174,7 +174,7 @@ where #[cfg(feature = "abort")] install_panic_handler(); let res = _do_migrate(migrate_fn, env_ptr as *mut Region, msg_ptr as *mut Region); - let v = to_vec(&res).unwrap(); + let v = to_json_vec(&res).unwrap(); release_buffer(v) as u32 } @@ -198,7 +198,7 @@ where #[cfg(feature = "abort")] install_panic_handler(); let res = _do_sudo(sudo_fn, env_ptr as *mut Region, msg_ptr as *mut Region); - let v = to_vec(&res).unwrap(); + let v = to_json_vec(&res).unwrap(); release_buffer(v) as u32 } @@ -221,7 +221,7 @@ where #[cfg(feature = "abort")] install_panic_handler(); let res = _do_reply(reply_fn, env_ptr as *mut Region, msg_ptr as *mut Region); - let v = to_vec(&res).unwrap(); + let v = to_json_vec(&res).unwrap(); release_buffer(v) as u32 } @@ -243,7 +243,7 @@ where #[cfg(feature = "abort")] install_panic_handler(); let res = _do_query(query_fn, env_ptr as *mut Region, msg_ptr as *mut Region); - let v = to_vec(&res).unwrap(); + let v = to_json_vec(&res).unwrap(); release_buffer(v) as u32 } @@ -266,7 +266,7 @@ where #[cfg(feature = "abort")] install_panic_handler(); let res = _do_ibc_channel_open(contract_fn, env_ptr as *mut Region, msg_ptr as *mut Region); - let v = to_vec(&res).unwrap(); + let v = to_json_vec(&res).unwrap(); release_buffer(v) as u32 } @@ -291,7 +291,7 @@ where #[cfg(feature = "abort")] install_panic_handler(); let res = _do_ibc_channel_connect(contract_fn, env_ptr as *mut Region, msg_ptr as *mut Region); - let v = to_vec(&res).unwrap(); + let v = to_json_vec(&res).unwrap(); release_buffer(v) as u32 } @@ -316,7 +316,7 @@ where #[cfg(feature = "abort")] install_panic_handler(); let res = _do_ibc_channel_close(contract_fn, env_ptr as *mut Region, msg_ptr as *mut Region); - let v = to_vec(&res).unwrap(); + let v = to_json_vec(&res).unwrap(); release_buffer(v) as u32 } @@ -342,7 +342,7 @@ where #[cfg(feature = "abort")] install_panic_handler(); let res = _do_ibc_packet_receive(contract_fn, env_ptr as *mut Region, msg_ptr as *mut Region); - let v = to_vec(&res).unwrap(); + let v = to_json_vec(&res).unwrap(); release_buffer(v) as u32 } @@ -368,7 +368,7 @@ where #[cfg(feature = "abort")] install_panic_handler(); let res = _do_ibc_packet_ack(contract_fn, env_ptr as *mut Region, msg_ptr as *mut Region); - let v = to_vec(&res).unwrap(); + let v = to_json_vec(&res).unwrap(); release_buffer(v) as u32 } @@ -395,7 +395,7 @@ where #[cfg(feature = "abort")] install_panic_handler(); let res = _do_ibc_packet_timeout(contract_fn, env_ptr as *mut Region, msg_ptr as *mut Region); - let v = to_vec(&res).unwrap(); + let v = to_json_vec(&res).unwrap(); release_buffer(v) as u32 } @@ -415,9 +415,9 @@ where let info: Vec = unsafe { consume_region(info_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_slice(&env)); - let info: MessageInfo = try_into_contract_result!(from_slice(&info)); - let msg: M = try_into_contract_result!(from_slice(&msg)); + let env: Env = try_into_contract_result!(from_json_slice(&env)); + let info: MessageInfo = try_into_contract_result!(from_json_slice(&info)); + let msg: M = try_into_contract_result!(from_json_slice(&msg)); let mut deps = make_dependencies(); instantiate_fn(deps.as_mut(), env, info, msg).into() @@ -439,9 +439,9 @@ where let info: Vec = unsafe { consume_region(info_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_slice(&env)); - let info: MessageInfo = try_into_contract_result!(from_slice(&info)); - let msg: M = try_into_contract_result!(from_slice(&msg)); + let env: Env = try_into_contract_result!(from_json_slice(&env)); + let info: MessageInfo = try_into_contract_result!(from_json_slice(&info)); + let msg: M = try_into_contract_result!(from_json_slice(&msg)); let mut deps = make_dependencies(); execute_fn(deps.as_mut(), env, info, msg).into() @@ -461,8 +461,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_slice(&env)); - let msg: M = try_into_contract_result!(from_slice(&msg)); + let env: Env = try_into_contract_result!(from_json_slice(&env)); + let msg: M = try_into_contract_result!(from_json_slice(&msg)); let mut deps = make_dependencies(); migrate_fn(deps.as_mut(), env, msg).into() @@ -482,8 +482,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_slice(&env)); - let msg: M = try_into_contract_result!(from_slice(&msg)); + let env: Env = try_into_contract_result!(from_json_slice(&env)); + let msg: M = try_into_contract_result!(from_json_slice(&msg)); let mut deps = make_dependencies(); sudo_fn(deps.as_mut(), env, msg).into() @@ -502,8 +502,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_slice(&env)); - let msg: Reply = try_into_contract_result!(from_slice(&msg)); + let env: Env = try_into_contract_result!(from_json_slice(&env)); + let msg: Reply = try_into_contract_result!(from_json_slice(&msg)); let mut deps = make_dependencies(); reply_fn(deps.as_mut(), env, msg).into() @@ -522,8 +522,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_slice(&env)); - let msg: M = try_into_contract_result!(from_slice(&msg)); + let env: Env = try_into_contract_result!(from_json_slice(&env)); + let msg: M = try_into_contract_result!(from_json_slice(&msg)); let deps = make_dependencies(); query_fn(deps.as_ref(), env, msg).into() @@ -542,8 +542,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_slice(&env)); - let msg: IbcChannelOpenMsg = try_into_contract_result!(from_slice(&msg)); + let env: Env = try_into_contract_result!(from_json_slice(&env)); + let msg: IbcChannelOpenMsg = try_into_contract_result!(from_json_slice(&msg)); let mut deps = make_dependencies(); contract_fn(deps.as_mut(), env, msg).into() @@ -563,8 +563,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_slice(&env)); - let msg: IbcChannelConnectMsg = try_into_contract_result!(from_slice(&msg)); + let env: Env = try_into_contract_result!(from_json_slice(&env)); + let msg: IbcChannelConnectMsg = try_into_contract_result!(from_json_slice(&msg)); let mut deps = make_dependencies(); contract_fn(deps.as_mut(), env, msg).into() @@ -584,8 +584,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_slice(&env)); - let msg: IbcChannelCloseMsg = try_into_contract_result!(from_slice(&msg)); + let env: Env = try_into_contract_result!(from_json_slice(&env)); + let msg: IbcChannelCloseMsg = try_into_contract_result!(from_json_slice(&msg)); let mut deps = make_dependencies(); contract_fn(deps.as_mut(), env, msg).into() @@ -605,8 +605,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_slice(&env)); - let msg: IbcPacketReceiveMsg = try_into_contract_result!(from_slice(&msg)); + let env: Env = try_into_contract_result!(from_json_slice(&env)); + let msg: IbcPacketReceiveMsg = try_into_contract_result!(from_json_slice(&msg)); let mut deps = make_dependencies(); contract_fn(deps.as_mut(), env, msg).into() @@ -626,8 +626,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_slice(&env)); - let msg: IbcPacketAckMsg = try_into_contract_result!(from_slice(&msg)); + let env: Env = try_into_contract_result!(from_json_slice(&env)); + let msg: IbcPacketAckMsg = try_into_contract_result!(from_json_slice(&msg)); let mut deps = make_dependencies(); contract_fn(deps.as_mut(), env, msg).into() @@ -647,8 +647,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_slice(&env)); - let msg: IbcPacketTimeoutMsg = try_into_contract_result!(from_slice(&msg)); + let env: Env = try_into_contract_result!(from_json_slice(&env)); + let msg: IbcPacketTimeoutMsg = try_into_contract_result!(from_json_slice(&msg)); let mut deps = make_dependencies(); contract_fn(deps.as_mut(), env, msg).into() diff --git a/packages/std/src/hex_binary.rs b/packages/std/src/hex_binary.rs index 0def99b36a..7c6074b818 100644 --- a/packages/std/src/hex_binary.rs +++ b/packages/std/src/hex_binary.rs @@ -247,7 +247,7 @@ impl<'de> de::Visitor<'de> for HexVisitor { mod tests { use super::*; - use crate::{assert_hash_works, from_slice, to_vec, StdError}; + use crate::{assert_hash_works, from_json_slice, to_json_vec, StdError}; #[test] fn from_hex_works() { @@ -376,7 +376,7 @@ mod tests { } #[test] - fn from_slice_works() { + fn from_json_slice_works() { let original: &[u8] = &[0u8, 187, 61, 11, 250, 0]; let binary: HexBinary = original.into(); assert_eq!(binary.as_slice(), [0u8, 187, 61, 11, 250, 0]); @@ -515,8 +515,8 @@ mod tests { fn serialization_works() { let binary = HexBinary(vec![0u8, 187, 61, 11, 250, 0]); - let json = to_vec(&binary).unwrap(); - let deserialized: HexBinary = from_slice(&json).unwrap(); + let json = to_json_vec(&binary).unwrap(); + let deserialized: HexBinary = from_json_slice(&json).unwrap(); assert_eq!(binary, deserialized); } @@ -527,16 +527,16 @@ mod tests { // this is the binary behind above string let expected = vec![0u8, 187, 61, 11, 250, 0]; - let serialized = to_vec(&hex).unwrap(); - let deserialized: HexBinary = from_slice(&serialized).unwrap(); + let serialized = to_json_vec(&hex).unwrap(); + let deserialized: HexBinary = from_json_slice(&serialized).unwrap(); assert_eq!(expected, deserialized.as_slice()); } #[test] fn deserialize_from_invalid_string() { let invalid_str = "**BAD!**"; - let serialized = to_vec(&invalid_str).unwrap(); - let res = from_slice::(&serialized); + let serialized = to_json_vec(&invalid_str).unwrap(); + let res = from_json_slice::(&serialized); assert!(res.is_err()); } diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index dab621b71b..2c3965f7b7 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -11,7 +11,7 @@ use crate::binary::Binary; use crate::coin::Coin; use crate::errors::StdResult; use crate::results::{Attribute, CosmosMsg, Empty, Event, SubMsg}; -use crate::serde::to_binary; +use crate::serde::to_json_binary; use crate::timestamp::Timestamp; /// These are messages in the IBC lifecycle. Only usable by IBC-enabled contracts @@ -240,7 +240,7 @@ impl IbcAcknowledgement { pub fn encode_json(data: &impl Serialize) -> StdResult { Ok(IbcAcknowledgement { - data: to_binary(data)?, + data: to_json_binary(data)?, }) } } diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index 7df3f22c95..d281e89e25 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -8,7 +8,7 @@ use crate::results::SystemResult; #[cfg(feature = "iterator")] use crate::sections::decode_sections2; use crate::sections::encode_sections; -use crate::serde::from_slice; +use crate::serde::from_json_slice; use crate::traits::{Api, Querier, QuerierResult, Storage}; #[cfg(feature = "iterator")] use crate::{ @@ -498,7 +498,7 @@ impl Querier for ExternalQuerier { let response_ptr = unsafe { query_chain(request_ptr) }; let response = unsafe { consume_region(response_ptr as *mut Region) }; - from_slice(&response).unwrap_or_else(|parsing_err| { + from_json_slice(&response).unwrap_or_else(|parsing_err| { SystemResult::Err(SystemError::InvalidResponse { error: parsing_err.to_string(), response: response.into(), diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index b8de3e90bc..cd1364eff4 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -781,7 +781,7 @@ impl<'de> de::Visitor<'de> for DecimalVisitor { #[cfg(test)] mod tests { use super::*; - use crate::{from_slice, to_vec}; + use crate::{from_json_slice, to_json_vec}; fn dec(input: &str) -> Decimal { Decimal::from_str(input).unwrap() @@ -1908,35 +1908,47 @@ mod tests { #[test] fn decimal_serialize() { - assert_eq!(to_vec(&Decimal::zero()).unwrap(), br#""0""#); - assert_eq!(to_vec(&Decimal::one()).unwrap(), br#""1""#); - assert_eq!(to_vec(&Decimal::percent(8)).unwrap(), br#""0.08""#); - assert_eq!(to_vec(&Decimal::percent(87)).unwrap(), br#""0.87""#); - assert_eq!(to_vec(&Decimal::percent(876)).unwrap(), br#""8.76""#); - assert_eq!(to_vec(&Decimal::percent(8765)).unwrap(), br#""87.65""#); + assert_eq!(to_json_vec(&Decimal::zero()).unwrap(), br#""0""#); + assert_eq!(to_json_vec(&Decimal::one()).unwrap(), br#""1""#); + assert_eq!(to_json_vec(&Decimal::percent(8)).unwrap(), br#""0.08""#); + assert_eq!(to_json_vec(&Decimal::percent(87)).unwrap(), br#""0.87""#); + assert_eq!(to_json_vec(&Decimal::percent(876)).unwrap(), br#""8.76""#); + assert_eq!(to_json_vec(&Decimal::percent(8765)).unwrap(), br#""87.65""#); } #[test] fn decimal_deserialize() { - assert_eq!(from_slice::(br#""0""#).unwrap(), Decimal::zero()); - assert_eq!(from_slice::(br#""1""#).unwrap(), Decimal::one()); - assert_eq!(from_slice::(br#""000""#).unwrap(), Decimal::zero()); - assert_eq!(from_slice::(br#""001""#).unwrap(), Decimal::one()); + assert_eq!( + from_json_slice::(br#""0""#).unwrap(), + Decimal::zero() + ); + assert_eq!( + from_json_slice::(br#""1""#).unwrap(), + Decimal::one() + ); + assert_eq!( + from_json_slice::(br#""000""#).unwrap(), + Decimal::zero() + ); + assert_eq!( + from_json_slice::(br#""001""#).unwrap(), + Decimal::one() + ); assert_eq!( - from_slice::(br#""0.08""#).unwrap(), + from_json_slice::(br#""0.08""#).unwrap(), Decimal::percent(8) ); assert_eq!( - from_slice::(br#""0.87""#).unwrap(), + from_json_slice::(br#""0.87""#).unwrap(), Decimal::percent(87) ); assert_eq!( - from_slice::(br#""8.76""#).unwrap(), + from_json_slice::(br#""8.76""#).unwrap(), Decimal::percent(876) ); assert_eq!( - from_slice::(br#""87.65""#).unwrap(), + from_json_slice::(br#""87.65""#).unwrap(), Decimal::percent(8765) ); } diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index f3fea968cd..91f44d46bc 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -797,7 +797,7 @@ impl<'de> de::Visitor<'de> for Decimal256Visitor { mod tests { use super::*; use crate::errors::StdError; - use crate::{from_slice, to_vec}; + use crate::{from_json_slice, to_json_vec}; fn dec(input: &str) -> Decimal256 { Decimal256::from_str(input).unwrap() @@ -2020,47 +2020,53 @@ mod tests { #[test] fn decimal256_serialize() { - assert_eq!(to_vec(&Decimal256::zero()).unwrap(), br#""0""#); - assert_eq!(to_vec(&Decimal256::one()).unwrap(), br#""1""#); - assert_eq!(to_vec(&Decimal256::percent(8)).unwrap(), br#""0.08""#); - assert_eq!(to_vec(&Decimal256::percent(87)).unwrap(), br#""0.87""#); - assert_eq!(to_vec(&Decimal256::percent(876)).unwrap(), br#""8.76""#); - assert_eq!(to_vec(&Decimal256::percent(8765)).unwrap(), br#""87.65""#); + assert_eq!(to_json_vec(&Decimal256::zero()).unwrap(), br#""0""#); + assert_eq!(to_json_vec(&Decimal256::one()).unwrap(), br#""1""#); + assert_eq!(to_json_vec(&Decimal256::percent(8)).unwrap(), br#""0.08""#); + assert_eq!(to_json_vec(&Decimal256::percent(87)).unwrap(), br#""0.87""#); + assert_eq!( + to_json_vec(&Decimal256::percent(876)).unwrap(), + br#""8.76""# + ); + assert_eq!( + to_json_vec(&Decimal256::percent(8765)).unwrap(), + br#""87.65""# + ); } #[test] fn decimal256_deserialize() { assert_eq!( - from_slice::(br#""0""#).unwrap(), + from_json_slice::(br#""0""#).unwrap(), Decimal256::zero() ); assert_eq!( - from_slice::(br#""1""#).unwrap(), + from_json_slice::(br#""1""#).unwrap(), Decimal256::one() ); assert_eq!( - from_slice::(br#""000""#).unwrap(), + from_json_slice::(br#""000""#).unwrap(), Decimal256::zero() ); assert_eq!( - from_slice::(br#""001""#).unwrap(), + from_json_slice::(br#""001""#).unwrap(), Decimal256::one() ); assert_eq!( - from_slice::(br#""0.08""#).unwrap(), + from_json_slice::(br#""0.08""#).unwrap(), Decimal256::percent(8) ); assert_eq!( - from_slice::(br#""0.87""#).unwrap(), + from_json_slice::(br#""0.87""#).unwrap(), Decimal256::percent(87) ); assert_eq!( - from_slice::(br#""8.76""#).unwrap(), + from_json_slice::(br#""8.76""#).unwrap(), Decimal256::percent(876) ); assert_eq!( - from_slice::(br#""87.65""#).unwrap(), + from_json_slice::(br#""87.65""#).unwrap(), Decimal256::percent(8765) ); } diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index e764e0c6d3..81944fcd65 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -570,7 +570,7 @@ where #[cfg(test)] mod tests { use super::*; - use crate::{from_slice, math::conversion::test_try_from_uint_to_int, to_vec}; + use crate::{from_json_slice, math::conversion::test_try_from_uint_to_int, to_json_vec}; #[test] fn size_of_works() { @@ -822,9 +822,9 @@ mod tests { #[test] fn int128_json() { let orig = Int128::from(1234567890987654321i128); - let serialized = to_vec(&orig).unwrap(); + let serialized = to_json_vec(&orig).unwrap(); assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); - let parsed: Int128 = from_slice(&serialized).unwrap(); + let parsed: Int128 = from_json_slice(&serialized).unwrap(); assert_eq!(parsed, orig); } diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index 26ca8dfd5e..060f99b283 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -645,7 +645,7 @@ where #[cfg(test)] mod tests { use super::*; - use crate::{from_slice, math::conversion::test_try_from_uint_to_int, to_vec}; + use crate::{from_json_slice, math::conversion::test_try_from_uint_to_int, to_json_vec}; #[test] fn size_of_works() { @@ -929,9 +929,9 @@ mod tests { #[test] fn int256_json() { let orig = Int256::from(1234567890987654321u128); - let serialized = to_vec(&orig).unwrap(); + let serialized = to_json_vec(&orig).unwrap(); assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); - let parsed: Int256 = from_slice(&serialized).unwrap(); + let parsed: Int256 = from_json_slice(&serialized).unwrap(); assert_eq!(parsed, orig); } diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index 9824c63eb2..3209748a4b 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -642,7 +642,7 @@ where #[cfg(test)] mod tests { use super::*; - use crate::{from_slice, math::conversion::test_try_from_uint_to_int, to_vec}; + use crate::{from_json_slice, math::conversion::test_try_from_uint_to_int, to_json_vec}; #[test] fn size_of_works() { @@ -957,9 +957,9 @@ mod tests { #[test] fn int512_json() { let orig = Int512::from(1234567890987654321u128); - let serialized = to_vec(&orig).unwrap(); + let serialized = to_json_vec(&orig).unwrap(); assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); - let parsed: Int512 = from_slice(&serialized).unwrap(); + let parsed: Int512 = from_json_slice(&serialized).unwrap(); assert_eq!(parsed, orig); } diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index 2a0c651500..6c8367b279 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -549,7 +549,7 @@ where #[cfg(test)] mod tests { use super::*; - use crate::{from_slice, math::conversion::test_try_from_uint_to_int, to_vec}; + use crate::{from_json_slice, math::conversion::test_try_from_uint_to_int, to_json_vec}; #[test] fn size_of_works() { @@ -794,9 +794,9 @@ mod tests { #[test] fn int64_json() { let orig = Int64::from(1234567890987654321i64); - let serialized = to_vec(&orig).unwrap(); + let serialized = to_json_vec(&orig).unwrap(); assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); - let parsed: Int64 = from_slice(&serialized).unwrap(); + let parsed: Int64 = from_json_slice(&serialized).unwrap(); assert_eq!(parsed, orig); } diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index b51f340001..f06315ac33 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -617,7 +617,7 @@ where mod tests { use crate::errors::CheckedMultiplyFractionError::{ConversionOverflow, DivideByZero}; use crate::math::conversion::test_try_from_int_to_uint; - use crate::{from_slice, to_vec, ConversionOverflowError, Decimal}; + use crate::{from_json_slice, to_json_vec, ConversionOverflowError, Decimal}; use super::*; @@ -789,9 +789,9 @@ mod tests { #[test] fn uint128_json() { let orig = Uint128(1234567890987654321); - let serialized = to_vec(&orig).unwrap(); + let serialized = to_json_vec(&orig).unwrap(); assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); - let parsed: Uint128 = from_slice(&serialized).unwrap(); + let parsed: Uint128 = from_json_slice(&serialized).unwrap(); assert_eq!(parsed, orig); } diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index bd6745eca2..55da7e6364 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -680,7 +680,7 @@ mod tests { use super::*; use crate::errors::CheckedMultiplyFractionError::{ConversionOverflow, DivideByZero}; use crate::math::conversion::test_try_from_int_to_uint; - use crate::{from_slice, to_vec, Decimal, Decimal256}; + use crate::{from_json_slice, to_json_vec, Decimal, Decimal256}; #[test] fn size_of_works() { @@ -1306,9 +1306,9 @@ mod tests { #[test] fn uint256_json() { let orig = Uint256::from(1234567890987654321u128); - let serialized = to_vec(&orig).unwrap(); + let serialized = to_json_vec(&orig).unwrap(); assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); - let parsed: Uint256 = from_slice(&serialized).unwrap(); + let parsed: Uint256 = from_json_slice(&serialized).unwrap(); assert_eq!(parsed, orig); } diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index 3f4db01469..0096d2f6d3 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -646,7 +646,7 @@ where #[cfg(test)] mod tests { use super::*; - use crate::{from_slice, math::conversion::test_try_from_int_to_uint, to_vec}; + use crate::{from_json_slice, math::conversion::test_try_from_int_to_uint, to_json_vec}; #[test] fn size_of_works() { @@ -1012,9 +1012,9 @@ mod tests { #[test] fn uint512_json() { let orig = Uint512::from(1234567890987654321u128); - let serialized = to_vec(&orig).unwrap(); + let serialized = to_json_vec(&orig).unwrap(); assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); - let parsed: Uint512 = from_slice(&serialized).unwrap(); + let parsed: Uint512 = from_json_slice(&serialized).unwrap(); assert_eq!(parsed, orig); } diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index 961f46ef17..1d59580a82 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -579,7 +579,7 @@ mod tests { use super::*; use crate::errors::CheckedMultiplyFractionError::{ConversionOverflow, DivideByZero}; use crate::math::conversion::test_try_from_int_to_uint; - use crate::{from_slice, to_vec, ConversionOverflowError}; + use crate::{from_json_slice, to_json_vec, ConversionOverflowError}; #[test] fn size_of_works() { @@ -710,9 +710,9 @@ mod tests { #[test] fn uint64_json() { let orig = Uint64(1234567890987654321); - let serialized = to_vec(&orig).unwrap(); + let serialized = to_json_vec(&orig).unwrap(); assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); - let parsed: Uint64 = from_slice(&serialized).unwrap(); + let parsed: Uint64 = from_json_slice(&serialized).unwrap(); assert_eq!(parsed, orig); } diff --git a/packages/std/src/query/wasm.rs b/packages/std/src/query/wasm.rs index 9487ff592d..a80008e29e 100644 --- a/packages/std/src/query/wasm.rs +++ b/packages/std/src/query/wasm.rs @@ -94,14 +94,14 @@ impl QueryResponseType for CodeInfoResponse {} #[cfg(test)] mod tests { use super::*; - use crate::to_binary; + use crate::to_json_binary; #[test] fn wasm_query_contract_info_serialization() { let query = WasmQuery::ContractInfo { contract_addr: "aabbccdd456".into(), }; - let json = to_binary(&query).unwrap(); + let json = to_json_binary(&query).unwrap(); assert_eq!( String::from_utf8_lossy(&json), r#"{"contract_info":{"contract_addr":"aabbccdd456"}}"#, @@ -112,7 +112,7 @@ mod tests { #[cfg(feature = "cosmwasm_1_2")] fn wasm_query_code_info_serialization() { let query = WasmQuery::CodeInfo { code_id: 70 }; - let json = to_binary(&query).unwrap(); + let json = to_json_binary(&query).unwrap(); assert_eq!( String::from_utf8_lossy(&json), r#"{"code_info":{"code_id":70}}"#, @@ -128,7 +128,7 @@ mod tests { pinned: true, ibc_port: Some("wasm.123".to_string()), }; - let json = to_binary(&response).unwrap(); + let json = to_json_binary(&response).unwrap(); assert_eq!( String::from_utf8_lossy(&json), r#"{"code_id":67,"creator":"jane","admin":"king","pinned":true,"ibc_port":"wasm.123"}"#, @@ -148,7 +148,7 @@ mod tests { ) .unwrap(), }; - let json = to_binary(&response).unwrap(); + let json = to_json_binary(&response).unwrap(); assert_eq!( String::from_utf8_lossy(&json), r#"{"code_id":67,"creator":"jane","checksum":"f7bb7b18fb01bbf425cf4ed2cd4b7fb26a019a7fc75a4dc87e8a0b768c501f00"}"#, diff --git a/packages/std/src/results/contract_result.rs b/packages/std/src/results/contract_result.rs index 343da57c85..69996389a4 100644 --- a/packages/std/src/results/contract_result.rs +++ b/packages/std/src/results/contract_result.rs @@ -88,59 +88,61 @@ impl From> for Result { #[cfg(test)] mod tests { use super::*; - use crate::{from_slice, to_vec, Response, StdError, StdResult}; + use crate::{from_json_slice, to_json_vec, Response, StdError, StdResult}; #[test] fn contract_result_serialization_works() { let result = ContractResult::Ok(12); - assert_eq!(&to_vec(&result).unwrap(), b"{\"ok\":12}"); + assert_eq!(&to_json_vec(&result).unwrap(), b"{\"ok\":12}"); let result = ContractResult::Ok("foo"); - assert_eq!(&to_vec(&result).unwrap(), b"{\"ok\":\"foo\"}"); + assert_eq!(&to_json_vec(&result).unwrap(), b"{\"ok\":\"foo\"}"); let result: ContractResult = ContractResult::Ok(Response::default()); assert_eq!( - to_vec(&result).unwrap(), + to_json_vec(&result).unwrap(), br#"{"ok":{"messages":[],"attributes":[],"events":[],"data":null}}"# ); let result: ContractResult = ContractResult::Err("broken".to_string()); - assert_eq!(&to_vec(&result).unwrap(), b"{\"error\":\"broken\"}"); + assert_eq!(&to_json_vec(&result).unwrap(), b"{\"error\":\"broken\"}"); } #[test] fn contract_result_deserialization_works() { - let result: ContractResult = from_slice(br#"{"ok":12}"#).unwrap(); + let result: ContractResult = from_json_slice(br#"{"ok":12}"#).unwrap(); assert_eq!(result, ContractResult::Ok(12)); - let result: ContractResult = from_slice(br#"{"ok":"foo"}"#).unwrap(); + let result: ContractResult = from_json_slice(br#"{"ok":"foo"}"#).unwrap(); assert_eq!(result, ContractResult::Ok("foo".to_string())); let result: ContractResult = - from_slice(br#"{"ok":{"messages":[],"attributes":[],"events":[],"data":null}}"#) + from_json_slice(br#"{"ok":{"messages":[],"attributes":[],"events":[],"data":null}}"#) .unwrap(); assert_eq!(result, ContractResult::Ok(Response::default())); - let result: ContractResult = from_slice(br#"{"error":"broken"}"#).unwrap(); + let result: ContractResult = from_json_slice(br#"{"error":"broken"}"#).unwrap(); assert_eq!(result, ContractResult::Err("broken".to_string())); // ignores whitespace - let result: ContractResult = from_slice(b" {\n\t \"ok\": 5898\n} ").unwrap(); + let result: ContractResult = from_json_slice(b" {\n\t \"ok\": 5898\n} ").unwrap(); assert_eq!(result, ContractResult::Ok(5898)); // fails for additional attributes - let parse: StdResult> = from_slice(br#"{"unrelated":321,"ok":4554}"#); + let parse: StdResult> = + from_json_slice(br#"{"unrelated":321,"ok":4554}"#); match parse.unwrap_err() { StdError::ParseErr { .. } => {} err => panic!("Unexpected error: {err:?}"), } - let parse: StdResult> = from_slice(br#"{"ok":4554,"unrelated":321}"#); + let parse: StdResult> = + from_json_slice(br#"{"ok":4554,"unrelated":321}"#); match parse.unwrap_err() { StdError::ParseErr { .. } => {} err => panic!("Unexpected error: {err:?}"), } let parse: StdResult> = - from_slice(br#"{"ok":4554,"error":"What's up now?"}"#); + from_json_slice(br#"{"ok":4554,"error":"What's up now?"}"#); match parse.unwrap_err() { StdError::ParseErr { .. } => {} err => panic!("Unexpected error: {err:?}"), diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index 36e2d17007..27ebd8249b 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -8,7 +8,7 @@ use crate::coin::Coin; use crate::errors::StdResult; #[cfg(feature = "stargate")] use crate::ibc::IbcMsg; -use crate::serde::to_binary; +use crate::serde::to_json_binary; #[cfg(all(feature = "stargate", feature = "cosmwasm_1_2"))] use crate::Decimal; @@ -336,7 +336,7 @@ pub fn wasm_instantiate( funds: Vec, label: String, ) -> StdResult { - let payload = to_binary(msg)?; + let payload = to_json_binary(msg)?; Ok(WasmMsg::Instantiate { admin: None, code_id, @@ -352,7 +352,7 @@ pub fn wasm_execute( msg: &impl Serialize, funds: Vec, ) -> StdResult { - let payload = to_binary(msg)?; + let payload = to_json_binary(msg)?; Ok(WasmMsg::Execute { contract_addr: contract_addr.into(), msg: payload, @@ -427,7 +427,7 @@ mod tests { funds: vec![], label: "my instance".to_string(), }; - let json = to_binary(&msg).unwrap(); + let json = to_json_binary(&msg).unwrap(); assert_eq!( String::from_utf8_lossy(&json), r#"{"instantiate":{"admin":"king","code_id":7897,"msg":"eyJjbGFpbSI6e319","funds":[],"label":"my instance"}}"#, @@ -441,7 +441,7 @@ mod tests { funds: vec![], label: "my instance".to_string(), }; - let json = to_binary(&msg).unwrap(); + let json = to_json_binary(&msg).unwrap(); assert_eq!( String::from_utf8_lossy(&json), r#"{"instantiate":{"admin":null,"code_id":7897,"msg":"eyJjbGFpbSI6e319","funds":[],"label":"my instance"}}"#, @@ -455,7 +455,7 @@ mod tests { funds: vec![coin(321, "stones")], label: "my instance".to_string(), }; - let json = to_binary(&msg).unwrap(); + let json = to_json_binary(&msg).unwrap(); assert_eq!( String::from_utf8_lossy(&json), r#"{"instantiate":{"admin":null,"code_id":7897,"msg":"eyJjbGFpbSI6e319","funds":[{"denom":"stones","amount":"321"}],"label":"my instance"}}"#, @@ -472,7 +472,7 @@ mod tests { funds: vec![coin(321, "stones")], salt: Binary::from_base64("UkOVazhiwoo=").unwrap(), }; - let json = to_binary(&msg).unwrap(); + let json = to_json_binary(&msg).unwrap(); assert_eq!( String::from_utf8_lossy(&json), r#"{"instantiate2":{"admin":null,"code_id":7897,"label":"my instance","msg":"eyJjbGFpbSI6e319","funds":[{"denom":"stones","amount":"321"}],"salt":"UkOVazhiwoo="}}"#, @@ -486,7 +486,7 @@ mod tests { // FundCommunityPool let fund_coins = vec![coin(200, "feathers"), coin(200, "stones")]; let fund_msg = DistributionMsg::FundCommunityPool { amount: fund_coins }; - let fund_json = to_binary(&fund_msg).unwrap(); + let fund_json = to_json_binary(&fund_msg).unwrap(); assert_eq!( String::from_utf8_lossy(&fund_json), r#"{"fund_community_pool":{"amount":[{"denom":"feathers","amount":"200"},{"denom":"stones","amount":"200"}]}}"#, @@ -496,7 +496,7 @@ mod tests { let set_msg = DistributionMsg::SetWithdrawAddress { address: String::from("withdrawer"), }; - let set_json = to_binary(&set_msg).unwrap(); + let set_json = to_json_binary(&set_msg).unwrap(); assert_eq!( String::from_utf8_lossy(&set_json), r#"{"set_withdraw_address":{"address":"withdrawer"}}"#, @@ -506,7 +506,7 @@ mod tests { let withdraw_msg = DistributionMsg::WithdrawDelegatorReward { validator: String::from("fancyoperator"), }; - let withdraw_json = to_binary(&withdraw_msg).unwrap(); + let withdraw_json = to_json_binary(&withdraw_msg).unwrap(); assert_eq!( String::from_utf8_lossy(&withdraw_json), r#"{"withdraw_delegator_reward":{"validator":"fancyoperator"}}"# @@ -522,7 +522,7 @@ mod tests { let msg = WasmMsg::Execute { contract_addr: "joe".to_string(), - msg: to_binary(&ExecuteMsg::Mint { + msg: to_json_binary(&ExecuteMsg::Mint { coin: coin(10, "BTC"), }) .unwrap(), @@ -557,7 +557,7 @@ mod tests { proposal_id: 4, vote: VoteOption::NoWithVeto, }; - let json = to_binary(&msg).unwrap(); + let json = to_json_binary(&msg).unwrap(); assert_eq!( String::from_utf8_lossy(&json), r#"{"vote":{"proposal_id":4,"vote":"no_with_veto"}}"#, @@ -584,7 +584,7 @@ mod tests { ], }; - let json = to_binary(&msg).unwrap(); + let json = to_json_binary(&msg).unwrap(); assert_eq!( String::from_utf8_lossy(&json), r#"{"vote_weighted":{"proposal_id":25,"options":[{"option":"yes","weight":"0.25"},{"option":"no","weight":"0.25"},{"option":"abstain","weight":"0.5"}]}}"#, diff --git a/packages/std/src/results/empty.rs b/packages/std/src/results/empty.rs index 56ccf35868..21cf6f26af 100644 --- a/packages/std/src/results/empty.rs +++ b/packages/std/src/results/empty.rs @@ -14,7 +14,7 @@ pub struct Empty {} mod tests { use super::*; - use crate::serde::{from_slice, to_vec}; + use crate::serde::{from_json_slice, to_json_vec}; #[test] fn empty_can_be_instantiated() { @@ -25,13 +25,13 @@ mod tests { #[test] fn empty_can_be_instantiated_serialized_and_deserialized() { let instance = Empty {}; - let serialized = to_vec(&instance).unwrap(); + let serialized = to_json_vec(&instance).unwrap(); assert_eq!(serialized, b"{}"); - let deserialized: Empty = from_slice(b"{}").unwrap(); + let deserialized: Empty = from_json_slice(b"{}").unwrap(); assert_eq!(deserialized, instance); - let deserialized: Empty = from_slice(b"{\"stray\":\"data\"}").unwrap(); + let deserialized: Empty = from_json_slice(b"{\"stray\":\"data\"}").unwrap(); assert_eq!(deserialized, instance); } } diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index 41de24fc67..9c4228aeee 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -235,7 +235,7 @@ mod tests { use super::super::BankMsg; use super::*; use crate::results::submessages::{ReplyOn, UNUSED_MSG_ID}; - use crate::{coins, from_slice, to_vec, ContractResult}; + use crate::{coins, from_json_slice, to_json_vec, ContractResult}; #[test] fn response_add_attributes_works() { @@ -308,8 +308,8 @@ mod tests { events: vec![], data: Some(Binary::from([0xAA, 0xBB])), }; - let serialized = to_vec(&original).expect("encode contract result"); - let deserialized: Response = from_slice(&serialized).expect("decode contract result"); + let serialized = to_json_vec(&original).expect("encode contract result"); + let deserialized: Response = from_json_slice(&serialized).expect("decode contract result"); assert_eq!(deserialized, original); } diff --git a/packages/std/src/results/submessages.rs b/packages/std/src/results/submessages.rs index 0a89efef1c..4892b19009 100644 --- a/packages/std/src/results/submessages.rs +++ b/packages/std/src/results/submessages.rs @@ -205,7 +205,7 @@ pub type SubMsgExecutionResponse = SubMsgResponse; #[cfg(test)] mod tests { use super::*; - use crate::{from_slice, to_vec, StdError, StdResult}; + use crate::{from_json_slice, to_json_vec, StdError, StdResult}; #[test] fn sub_msg_result_serialization_works() { @@ -214,7 +214,7 @@ mod tests { events: vec![], }); assert_eq!( - &to_vec(&result).unwrap(), + &to_json_vec(&result).unwrap(), br#"{"ok":{"events":[],"data":null}}"# ); @@ -223,17 +223,17 @@ mod tests { events: vec![Event::new("wasm").add_attribute("fo", "ba")], }); assert_eq!( - &to_vec(&result).unwrap(), + &to_json_vec(&result).unwrap(), br#"{"ok":{"events":[{"type":"wasm","attributes":[{"key":"fo","value":"ba"}]}],"data":"MTIzCg=="}}"# ); let result: SubMsgResult = SubMsgResult::Err("broken".to_string()); - assert_eq!(&to_vec(&result).unwrap(), b"{\"error\":\"broken\"}"); + assert_eq!(&to_json_vec(&result).unwrap(), b"{\"error\":\"broken\"}"); } #[test] fn sub_msg_result_deserialization_works() { - let result: SubMsgResult = from_slice(br#"{"ok":{"events":[],"data":null}}"#).unwrap(); + let result: SubMsgResult = from_json_slice(br#"{"ok":{"events":[],"data":null}}"#).unwrap(); assert_eq!( result, SubMsgResult::Ok(SubMsgResponse { @@ -242,7 +242,7 @@ mod tests { }) ); - let result: SubMsgResult = from_slice( + let result: SubMsgResult = from_json_slice( br#"{"ok":{"events":[{"type":"wasm","attributes":[{"key":"fo","value":"ba"}]}],"data":"MTIzCg=="}}"#).unwrap(); assert_eq!( result, @@ -252,16 +252,18 @@ mod tests { }) ); - let result: SubMsgResult = from_slice(br#"{"error":"broken"}"#).unwrap(); + let result: SubMsgResult = from_json_slice(br#"{"error":"broken"}"#).unwrap(); assert_eq!(result, SubMsgResult::Err("broken".to_string())); // fails for additional attributes - let parse: StdResult = from_slice(br#"{"unrelated":321,"error":"broken"}"#); + let parse: StdResult = + from_json_slice(br#"{"unrelated":321,"error":"broken"}"#); match parse.unwrap_err() { StdError::ParseErr { .. } => {} err => panic!("Unexpected error: {err:?}"), } - let parse: StdResult = from_slice(br#"{"error":"broken","unrelated":321}"#); + let parse: StdResult = + from_json_slice(br#"{"error":"broken","unrelated":321}"#); match parse.unwrap_err() { StdError::ParseErr { .. } => {} err => panic!("Unexpected error: {err:?}"), diff --git a/packages/std/src/stdack.rs b/packages/std/src/stdack.rs index e933257a08..64c711ef51 100644 --- a/packages/std/src/stdack.rs +++ b/packages/std/src/stdack.rs @@ -2,7 +2,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use crate::binary::Binary; -use crate::to_binary; +use crate::to_json_binary; /// This is a standard IBC acknowledgement type. IBC application are free /// to use any acknowledgement format they want. However, for compatibility @@ -94,7 +94,7 @@ impl StdAck { // We need a non-failing StdAck -> Binary conversion to allow using StdAck in // `impl Into` arguments. // Pretty sure this cannot fail. If that changes we can create a non-failing implementation here. - to_binary(&self).unwrap() + to_json_binary(&self).unwrap() } pub fn unwrap(self) -> Binary { diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 8d8d785e5e..a635a07b9a 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -34,7 +34,7 @@ use crate::query::{ #[cfg(feature = "cosmwasm_1_3")] use crate::query::{DelegatorWithdrawAddressResponse, DistributionQuery}; use crate::results::{ContractResult, Empty, SystemResult}; -use crate::serde::{from_slice, to_binary}; +use crate::serde::{from_json_slice, to_json_binary}; use crate::storage::MemoryStorage; use crate::timestamp::Timestamp; use crate::traits::{Api, Querier, QuerierResult}; @@ -360,7 +360,7 @@ pub fn mock_ibc_packet_recv( ) -> StdResult { Ok(IbcPacketReceiveMsg::new( IbcPacket { - data: to_binary(data)?, + data: to_json_binary(data)?, src: IbcEndpoint { port_id: "their-port".to_string(), channel_id: "channel-1234".to_string(), @@ -387,7 +387,7 @@ pub fn mock_ibc_packet_recv( #[cfg(feature = "stargate")] fn mock_ibc_packet(my_channel_id: &str, data: &impl Serialize) -> StdResult { Ok(IbcPacket { - data: to_binary(data)?, + data: to_json_binary(data)?, src: IbcEndpoint { port_id: "their-port".to_string(), channel_id: my_channel_id.into(), @@ -561,7 +561,7 @@ impl Default for MockQuerier { impl Querier for MockQuerier { fn raw_query(&self, bin_request: &[u8]) -> QuerierResult { - let request: QueryRequest = match from_slice(bin_request) { + let request: QueryRequest = match from_json_slice(bin_request) { Ok(v) => v, Err(e) => { return SystemResult::Err(SystemError::InvalidRequest { @@ -717,7 +717,7 @@ impl BankQuerier { denom: denom.to_string(), }, }; - to_binary(&bank_res).into() + to_json_binary(&bank_res).into() } BankQuery::Balance { address, denom } => { // proper error on not found, serialize result on found @@ -732,14 +732,14 @@ impl BankQuerier { denom: denom.to_string(), }, }; - to_binary(&bank_res).into() + to_json_binary(&bank_res).into() } BankQuery::AllBalances { address } => { // proper error on not found, serialize result on found let bank_res = AllBalanceResponse { amount: self.balances.get(address).cloned().unwrap_or_default(), }; - to_binary(&bank_res).into() + to_json_binary(&bank_res).into() } #[cfg(feature = "cosmwasm_1_3")] BankQuery::DenomMetadata { denom } => { @@ -749,7 +749,7 @@ impl BankQuerier { let metadata_res = DenomMetadataResponse { metadata: m.clone(), }; - to_binary(&metadata_res).into() + to_json_binary(&metadata_res).into() } None => return SystemResult::Err(SystemError::Unknown {}), } @@ -792,7 +792,7 @@ impl BankQuerier { }; let metadata_res = AllDenomMetadataResponse { metadata, next_key }; - to_binary(&metadata_res).into() + to_json_binary(&metadata_res).into() } }; // system result is always ok in the mock implementation @@ -837,7 +837,7 @@ impl IbcQuerier { }) .cloned(); let res = ChannelResponse { channel }; - to_binary(&res).into() + to_json_binary(&res).into() } IbcQuery::ListChannels { port_id } => { let channels = self @@ -850,13 +850,13 @@ impl IbcQuerier { .cloned() .collect(); let res = ListChannelsResponse { channels }; - to_binary(&res).into() + to_json_binary(&res).into() } IbcQuery::PortId {} => { let res = PortIdResponse { port_id: self.port_id.clone(), }; - to_binary(&res).into() + to_json_binary(&res).into() } }; // system result is always ok in the mock implementation @@ -888,13 +888,13 @@ impl StakingQuerier { let res = BondedDenomResponse { denom: self.denom.clone(), }; - to_binary(&res).into() + to_json_binary(&res).into() } StakingQuery::AllValidators {} => { let res = AllValidatorsResponse { validators: self.validators.clone(), }; - to_binary(&res).into() + to_json_binary(&res).into() } StakingQuery::Validator { address } => { let validator: Option = self @@ -903,7 +903,7 @@ impl StakingQuerier { .find(|validator| validator.address == *address) .cloned(); let res = ValidatorResponse { validator }; - to_binary(&res).into() + to_json_binary(&res).into() } StakingQuery::AllDelegations { delegator } => { let delegations: Vec<_> = self @@ -914,7 +914,7 @@ impl StakingQuerier { .map(|d| d.into()) .collect(); let res = AllDelegationsResponse { delegations }; - to_binary(&res).into() + to_json_binary(&res).into() } StakingQuery::Delegation { delegator, @@ -927,7 +927,7 @@ impl StakingQuerier { let res = DelegationResponse { delegation: delegation.cloned(), }; - to_binary(&res).into() + to_json_binary(&res).into() } }; // system result is always ok in the mock implementation @@ -1015,7 +1015,7 @@ impl DistributionQuerier { .unwrap_or(delegator_address), ), }; - to_binary(&res).into() + to_json_binary(&res).into() } #[cfg(feature = "cosmwasm_1_4")] DistributionQuery::DelegationRewards { @@ -1030,7 +1030,7 @@ impl DistributionQuerier { .cloned() .unwrap_or_default(), }; - to_binary(&res).into() + to_json_binary(&res).into() } #[cfg(feature = "cosmwasm_1_4")] DistributionQuery::DelegationTotalRewards { delegator_address } => { @@ -1056,7 +1056,7 @@ impl DistributionQuerier { .collect(), rewards: validator_rewards, }; - to_binary(&res).into() + to_json_binary(&res).into() } #[cfg(feature = "cosmwasm_1_4")] DistributionQuery::DelegatorValidators { delegator_address } => { @@ -1067,7 +1067,7 @@ impl DistributionQuerier { .map(|set| set.iter().cloned().collect()) .unwrap_or_default(), }; - to_binary(&res).into() + to_json_binary(&res).into() } }; // system result is always ok in the mock implementation @@ -1109,7 +1109,7 @@ mod tests { use super::*; #[cfg(feature = "cosmwasm_1_3")] use crate::DenomUnit; - use crate::{coin, coins, from_binary, to_binary, ContractInfoResponse, Response}; + use crate::{coin, coins, from_json_binary, to_json_binary, ContractInfoResponse, Response}; #[cfg(feature = "staking")] use crate::{Decimal, Delegation}; use hex_literal::hex; @@ -1442,7 +1442,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: SupplyResponse = from_binary(&elf).unwrap(); + let res: SupplyResponse = from_json_binary(&elf).unwrap(); assert_eq!(res.amount, coin(444, "ELF")); let fly = bank @@ -1451,7 +1451,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: SupplyResponse = from_binary(&fly).unwrap(); + let res: SupplyResponse = from_json_binary(&fly).unwrap(); assert_eq!(res.amount, coin(777, "FLY")); // if a denom does not exist, should return zero amount, instead of throwing an error @@ -1461,7 +1461,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: SupplyResponse = from_binary(&atom).unwrap(); + let res: SupplyResponse = from_json_binary(&atom).unwrap(); assert_eq!(res.amount, coin(0, "ATOM")); } @@ -1475,7 +1475,7 @@ mod tests { .query(&BankQuery::AllBalances { address: addr }) .unwrap() .unwrap(); - let res: AllBalanceResponse = from_binary(&all).unwrap(); + let res: AllBalanceResponse = from_json_binary(&all).unwrap(); assert_eq!(&res.amount, &balance); } @@ -1493,7 +1493,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: BalanceResponse = from_binary(&fly).unwrap(); + let res: BalanceResponse = from_json_binary(&fly).unwrap(); assert_eq!(res.amount, coin(777, "FLY")); // missing denom @@ -1504,7 +1504,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: BalanceResponse = from_binary(&miss).unwrap(); + let res: BalanceResponse = from_json_binary(&miss).unwrap(); assert_eq!(res.amount, coin(0, "MISS")); } @@ -1521,7 +1521,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: AllBalanceResponse = from_binary(&all).unwrap(); + let res: AllBalanceResponse = from_json_binary(&all).unwrap(); assert_eq!(res.amount, vec![]); // any denom on balances on empty account is empty coin @@ -1532,7 +1532,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: BalanceResponse = from_binary(&miss).unwrap(); + let res: BalanceResponse = from_json_binary(&miss).unwrap(); assert_eq!(res.amount, coin(0, "ELF")); } @@ -1570,7 +1570,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: AllDenomMetadataResponse = from_binary(&res).unwrap(); + let res: AllDenomMetadataResponse = from_json_binary(&res).unwrap(); assert_eq!(res.metadata.len(), 10); assert!(res.next_key.is_some()); @@ -1585,7 +1585,7 @@ mod tests { }) .unwrap() .unwrap(); - let res2: AllDenomMetadataResponse = from_binary(&res2).unwrap(); + let res2: AllDenomMetadataResponse = from_json_binary(&res2).unwrap(); assert_eq!(res2.metadata.len(), 10); assert_ne!(res.metadata.last(), res2.metadata.first()); // should have no overlap @@ -1604,7 +1604,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: AllDenomMetadataResponse = from_binary(&res).unwrap(); + let res: AllDenomMetadataResponse = from_json_binary(&res).unwrap(); assert_eq!(res.metadata.len(), 100); assert!(res.next_key.is_none(), "no more data should be available"); assert_eq!(res.metadata[0].symbol, "FOO99", "should have been reversed"); @@ -1619,7 +1619,7 @@ mod tests { }) .unwrap() .unwrap(); - let more_res: AllDenomMetadataResponse = from_binary(&more_res).unwrap(); + let more_res: AllDenomMetadataResponse = from_json_binary(&more_res).unwrap(); assert_eq!( more_res.metadata, res.metadata, "should be same as previous query" @@ -1637,7 +1637,7 @@ mod tests { }; let res = distribution.query(&query).unwrap().unwrap(); - let res: DelegatorWithdrawAddressResponse = from_binary(&res).unwrap(); + let res: DelegatorWithdrawAddressResponse = from_json_binary(&res).unwrap(); assert_eq!(res.withdraw_address, "withdraw0"); let query = DistributionQuery::DelegatorWithdrawAddress { @@ -1645,7 +1645,7 @@ mod tests { }; let res = distribution.query(&query).unwrap().unwrap(); - let res: DelegatorWithdrawAddressResponse = from_binary(&res).unwrap(); + let res: DelegatorWithdrawAddressResponse = from_json_binary(&res).unwrap(); assert_eq!(res.withdraw_address, "addr1"); } @@ -1660,7 +1660,7 @@ mod tests { }; let res = distribution.query(&query).unwrap().unwrap(); - let res: DelegatorValidatorsResponse = from_binary(&res).unwrap(); + let res: DelegatorValidatorsResponse = from_json_binary(&res).unwrap(); assert_eq!(res.validators, ["valoper1", "valoper2"]); let query = DistributionQuery::DelegatorValidators { @@ -1668,7 +1668,7 @@ mod tests { }; let res = distribution.query(&query).unwrap().unwrap(); - let res: DelegatorValidatorsResponse = from_binary(&res).unwrap(); + let res: DelegatorValidatorsResponse = from_json_binary(&res).unwrap(); assert_eq!(res.validators, ([] as [String; 0])); } @@ -1690,7 +1690,7 @@ mod tests { validator_address: "valoper0".to_string(), }; let res = distribution.query(&query).unwrap().unwrap(); - let res: DelegationRewardsResponse = from_binary(&res).unwrap(); + let res: DelegationRewardsResponse = from_json_binary(&res).unwrap(); assert_eq!(res.rewards, valoper0_rewards); // delegator does not exist @@ -1699,7 +1699,7 @@ mod tests { validator_address: "valoper0".to_string(), }; let res = distribution.query(&query).unwrap().unwrap(); - let res: DelegationRewardsResponse = from_binary(&res).unwrap(); + let res: DelegationRewardsResponse = from_json_binary(&res).unwrap(); assert_eq!(res.rewards.len(), 0); // validator does not exist @@ -1708,7 +1708,7 @@ mod tests { validator_address: "valopernonexistent".to_string(), }; let res = distribution.query(&query).unwrap().unwrap(); - let res: DelegationRewardsResponse = from_binary(&res).unwrap(); + let res: DelegationRewardsResponse = from_json_binary(&res).unwrap(); assert_eq!(res.rewards.len(), 0); // add one more validator @@ -1720,7 +1720,7 @@ mod tests { delegator_address: "addr0".to_string(), }; let res = distribution.query(&query).unwrap().unwrap(); - let res: DelegationTotalRewardsResponse = from_binary(&res).unwrap(); + let res: DelegationTotalRewardsResponse = from_json_binary(&res).unwrap(); assert_eq!( res.rewards, vec![ @@ -1761,7 +1761,7 @@ mod tests { port_id: Some("my_port".to_string()), }; let raw = ibc.query(query).unwrap().unwrap(); - let chan: ChannelResponse = from_binary(&raw).unwrap(); + let chan: ChannelResponse = from_json_binary(&raw).unwrap(); assert_eq!(chan.channel, Some(chan1)); } @@ -1791,7 +1791,7 @@ mod tests { port_id: Some("myport".to_string()), }; let raw = ibc.query(query).unwrap().unwrap(); - let chan: ChannelResponse = from_binary(&raw).unwrap(); + let chan: ChannelResponse = from_json_binary(&raw).unwrap(); assert_eq!(chan.channel, Some(chan1)); } @@ -1809,7 +1809,7 @@ mod tests { port_id: None, }; let raw = ibc.query(query).unwrap().unwrap(); - let chan: ChannelResponse = from_binary(&raw).unwrap(); + let chan: ChannelResponse = from_json_binary(&raw).unwrap(); assert_eq!(chan.channel, None); } @@ -1826,7 +1826,7 @@ mod tests { port_id: Some("my_port".to_string()), }; let raw = ibc.query(query).unwrap().unwrap(); - let res: ListChannelsResponse = from_binary(&raw).unwrap(); + let res: ListChannelsResponse = from_json_binary(&raw).unwrap(); assert_eq!(res.channels, vec![chan1, chan2]); } @@ -1841,7 +1841,7 @@ mod tests { // query channels matching "myport" (should be none) let query = &IbcQuery::ListChannels { port_id: None }; let raw = ibc.query(query).unwrap().unwrap(); - let res: ListChannelsResponse = from_binary(&raw).unwrap(); + let res: ListChannelsResponse = from_json_binary(&raw).unwrap(); assert_eq!(res.channels, vec![]); } @@ -1855,7 +1855,7 @@ mod tests { // query channels matching "myport" (should be none) let query = &IbcQuery::PortId {}; let raw = ibc.query(query).unwrap().unwrap(); - let res: PortIdResponse = from_binary(&raw).unwrap(); + let res: PortIdResponse = from_json_binary(&raw).unwrap(); assert_eq!(res.port_id, "myport"); } @@ -1882,7 +1882,7 @@ mod tests { .query(&StakingQuery::AllValidators {}) .unwrap() .unwrap(); - let vals: AllValidatorsResponse = from_binary(&raw).unwrap(); + let vals: AllValidatorsResponse = from_json_binary(&raw).unwrap(); assert_eq!(vals.validators, vec![val1, val2]); } @@ -1913,7 +1913,7 @@ mod tests { .query(&StakingQuery::Validator { address: address1 }) .unwrap() .unwrap(); - let res: ValidatorResponse = from_binary(&raw).unwrap(); + let res: ValidatorResponse = from_json_binary(&raw).unwrap(); assert_eq!(res.validator, Some(val1)); // query 2 @@ -1921,7 +1921,7 @@ mod tests { .query(&StakingQuery::Validator { address: address2 }) .unwrap() .unwrap(); - let res: ValidatorResponse = from_binary(&raw).unwrap(); + let res: ValidatorResponse = from_json_binary(&raw).unwrap(); assert_eq!(res.validator, Some(val2)); // query non-existent @@ -1931,7 +1931,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: ValidatorResponse = from_binary(&raw).unwrap(); + let res: ValidatorResponse = from_json_binary(&raw).unwrap(); assert_eq!(res.validator, None); } @@ -1947,7 +1947,7 @@ mod tests { }) .unwrap() .unwrap(); - let dels: AllDelegationsResponse = from_binary(&raw).unwrap(); + let dels: AllDelegationsResponse = from_json_binary(&raw).unwrap(); dels.delegations } @@ -1965,7 +1965,7 @@ mod tests { }) .unwrap() .unwrap(); - let dels: DelegationResponse = from_binary(&raw).unwrap(); + let dels: DelegationResponse = from_json_binary(&raw).unwrap(); dels.delegation } @@ -2130,14 +2130,14 @@ mod tests { if *contract_addr == constract1 { #[derive(Deserialize)] struct MyMsg {} - let _msg: MyMsg = match from_binary(msg) { + let _msg: MyMsg = match from_json_binary(msg) { Ok(msg) => msg, Err(err) => { return SystemResult::Ok(ContractResult::Err(err.to_string())) } }; let response: Response = Response::new().set_data(b"good"); - SystemResult::Ok(ContractResult::Ok(to_binary(&response).unwrap())) + SystemResult::Ok(ContractResult::Ok(to_json_binary(&response).unwrap())) } else { SystemResult::Err(SystemError::NoSuchContract { addr: contract_addr.clone(), @@ -2153,7 +2153,7 @@ mod tests { pinned: false, ibc_port: None, }; - SystemResult::Ok(ContractResult::Ok(to_binary(&response).unwrap())) + SystemResult::Ok(ContractResult::Ok(to_json_binary(&response).unwrap())) } else { SystemResult::Err(SystemError::NoSuchContract { addr: contract_addr.clone(), @@ -2173,7 +2173,7 @@ mod tests { ) .unwrap(), }; - SystemResult::Ok(ContractResult::Ok(to_binary(&response).unwrap())) + SystemResult::Ok(ContractResult::Ok(to_json_binary(&response).unwrap())) } else { SystemResult::Err(SystemError::NoSuchCode { code_id }) } diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index a5402660d1..2a0f22b9d4 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -26,7 +26,7 @@ use crate::query::{ DistributionQuery, }; use crate::results::{ContractResult, Empty, SystemResult}; -use crate::serde::{from_binary, to_binary, to_vec}; +use crate::serde::{from_json_binary, to_json_binary, to_json_vec}; use crate::ContractInfoResponse; #[cfg(feature = "cosmwasm_1_3")] use crate::{DenomMetadata, PageRequest}; @@ -240,7 +240,7 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { /// one level. Only use this if you don't need to check the SystemError /// eg. If you don't differentiate between contract missing and contract returned error pub fn query(&self, request: &QueryRequest) -> StdResult { - let raw = to_vec(request).map_err(|serialize_err| { + let raw = to_json_vec(request).map_err(|serialize_err| { StdError::generic_err(format!("Serializing QueryRequest: {serialize_err}")) })?; match self.raw_query(&raw) { @@ -250,7 +250,7 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { SystemResult::Ok(ContractResult::Err(contract_err)) => Err(StdError::generic_err( format!("Querier contract error: {contract_err}"), )), - SystemResult::Ok(ContractResult::Ok(value)) => from_binary(&value), + SystemResult::Ok(ContractResult::Ok(value)) => from_json_binary(&value), } } @@ -376,7 +376,7 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { ) -> StdResult { let request = WasmQuery::Smart { contract_addr: contract_addr.into(), - msg: to_binary(msg)?, + msg: to_json_binary(msg)?, } .into(); self.query(&request) @@ -402,7 +402,7 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { .into(); // we cannot use query, as it will try to parse the binary data, when we just want to return it, // so a bit of code copy here... - let raw = to_vec(&request).map_err(|serialize_err| { + let raw = to_json_vec(&request).map_err(|serialize_err| { StdError::generic_err(format!("Serializing QueryRequest: {serialize_err}")) })?; match self.raw_query(&raw) { @@ -500,7 +500,7 @@ mod tests { use super::*; use crate::testing::MockQuerier; - use crate::{coins, from_slice, Uint128}; + use crate::{coins, from_json_slice, Uint128}; // this is a simple demo helper to prove we can use it fn demo_helper(_querier: &dyn Querier) -> u64 { @@ -533,10 +533,10 @@ mod tests { }); let raw = wrapper - .raw_query(&to_vec(&query).unwrap()) + .raw_query(&to_json_vec(&query).unwrap()) .unwrap() .unwrap(); - let balance: BalanceResponse = from_slice(&raw).unwrap(); + let balance: BalanceResponse = from_json_slice(&raw).unwrap(); assert_eq!(balance.amount.amount, Uint128::new(5)); } @@ -579,7 +579,7 @@ mod tests { if q == &(WasmQuery::ContractInfo { contract_addr: ACCT.to_string(), }) { - SystemResult::Ok(ContractResult::Ok(to_binary(&mock_resp()).unwrap())) + SystemResult::Ok(ContractResult::Ok(to_json_binary(&mock_resp()).unwrap())) } else { SystemResult::Err(crate::SystemError::NoSuchContract { addr: ACCT.to_string(), @@ -610,7 +610,7 @@ mod tests { if q == &(WasmQuery::ContractInfo { contract_addr: ACCT.to_string(), }) { - SystemResult::Ok(ContractResult::Ok(to_binary(&mock_resp()).unwrap())) + SystemResult::Ok(ContractResult::Ok(to_json_binary(&mock_resp()).unwrap())) } else { SystemResult::Err(crate::SystemError::NoSuchContract { addr: ACCT.to_string(), diff --git a/packages/storage/src/bucket.rs b/packages/storage/src/bucket.rs index a870dfac4d..81c7a65c33 100644 --- a/packages/storage/src/bucket.rs +++ b/packages/storage/src/bucket.rs @@ -3,7 +3,7 @@ use std::marker::PhantomData; use cosmwasm_std::{ storage_keys::{to_length_prefixed, to_length_prefixed_nested}, - to_vec, StdError, StdResult, Storage, + to_json_vec, StdError, StdResult, Storage, }; #[cfg(feature = "iterator")] use cosmwasm_std::{Order, Record}; @@ -72,7 +72,7 @@ where /// save will serialize the model and store, returns an error on serialization issues pub fn save(&mut self, key: &[u8], data: &T) -> StdResult<()> { - set_with_prefix(self.storage, &self.prefix, key, &to_vec(data)?); + set_with_prefix(self.storage, &self.prefix, key, &to_json_vec(data)?); Ok(()) } @@ -399,7 +399,7 @@ mod tests { return Err(StdError::generic_err("Current age is negative").into()); } if data.age > 10 { - to_vec(&data)?; // Uses From to convert StdError to MyError + to_json_vec(&data)?; // Uses From to convert StdError to MyError } data.age += 1; Ok(data) diff --git a/packages/storage/src/singleton.rs b/packages/storage/src/singleton.rs index 3d5e5c9567..41fbda7d62 100644 --- a/packages/storage/src/singleton.rs +++ b/packages/storage/src/singleton.rs @@ -1,7 +1,7 @@ use serde::{de::DeserializeOwned, ser::Serialize}; use std::marker::PhantomData; -use cosmwasm_std::{storage_keys::to_length_prefixed, to_vec, StdError, StdResult, Storage}; +use cosmwasm_std::{storage_keys::to_length_prefixed, to_json_vec, StdError, StdResult, Storage}; use crate::type_helpers::{may_deserialize, must_deserialize}; @@ -58,7 +58,7 @@ where /// save will serialize the model and store, returns an error on serialization issues pub fn save(&mut self, data: &T) -> StdResult<()> { - self.storage.set(&self.key, &to_vec(data)?); + self.storage.set(&self.key, &to_json_vec(data)?); Ok(()) } @@ -307,7 +307,7 @@ mod tests { return Err(StdError::generic_err("broken stuff").into()); // Uses Into to convert StdError to MyError } if c.max_tokens > 10 { - to_vec(&c)?; // Uses From to convert StdError to MyError + to_json_vec(&c)?; // Uses From to convert StdError to MyError } c.max_tokens += 20; Ok(c) diff --git a/packages/storage/src/type_helpers.rs b/packages/storage/src/type_helpers.rs index 233d2b1463..98855de1bc 100644 --- a/packages/storage/src/type_helpers.rs +++ b/packages/storage/src/type_helpers.rs @@ -36,7 +36,7 @@ pub(crate) fn deserialize_kv(kv: Record>) -> StdRes #[cfg(test)] mod tests { use super::*; - use cosmwasm_std::{to_vec, StdError}; + use cosmwasm_std::{to_json_vec, StdError}; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, PartialEq, Debug)] @@ -51,7 +51,7 @@ mod tests { name: "Maria".to_string(), age: 42, }; - let value = to_vec(&person).unwrap(); + let value = to_json_vec(&person).unwrap(); let may_parse: Option = may_deserialize(&Some(value)).unwrap(); assert_eq!(may_parse, Some(person)); @@ -69,7 +69,7 @@ mod tests { name: "Maria".to_string(), age: 42, }; - let value = to_vec(&person).unwrap(); + let value = to_json_vec(&person).unwrap(); let loaded = Some(value); let parsed: Person = must_deserialize(&loaded).unwrap(); diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index e358723372..f9f37e2a97 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -454,7 +454,7 @@ mod tests { use crate::testing::{MockApi, MockQuerier, MockStorage}; use crate::wasm_backend::{compile, make_compiling_engine}; use cosmwasm_std::{ - coins, from_binary, to_vec, AllBalanceResponse, BankQuery, Empty, QueryRequest, + coins, from_json_binary, to_json_vec, AllBalanceResponse, BankQuery, Empty, QueryRequest, }; use wasmer::{imports, Function, Instance as WasmerInstance, Store}; @@ -893,13 +893,13 @@ mod tests { address: INIT_ADDR.to_string(), }); let (result, _gas_info) = - querier.query_raw(&to_vec(&req).unwrap(), DEFAULT_QUERY_GAS_LIMIT); + querier.query_raw(&to_json_vec(&req).unwrap(), DEFAULT_QUERY_GAS_LIMIT); Ok(result.unwrap()) }) .unwrap() .unwrap() .unwrap(); - let balance: AllBalanceResponse = from_binary(&res).unwrap(); + let balance: AllBalanceResponse = from_json_binary(&res).unwrap(); assert_eq!(balance.amount, coins(INIT_AMOUNT, INIT_DENOM)); } diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index ca4db76a36..af50a4e9fb 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -601,7 +601,7 @@ fn to_low_half(data: u32) -> u64 { mod tests { use super::*; use cosmwasm_std::{ - coins, from_binary, AllBalanceResponse, BankQuery, Binary, Empty, QueryRequest, + coins, from_json_binary, AllBalanceResponse, BankQuery, Binary, Empty, QueryRequest, SystemError, SystemResult, WasmQuery, }; use hex_literal::hex; @@ -1925,7 +1925,7 @@ mod tests { let request: QueryRequest = QueryRequest::Bank(BankQuery::AllBalances { address: INIT_ADDR.to_string(), }); - let request_data = cosmwasm_std::to_vec(&request).unwrap(); + let request_data = cosmwasm_std::to_json_vec(&request).unwrap(); let request_ptr = write_data(&mut fe_mut, &request_data); leave_default_data(&mut fe_mut); @@ -1934,10 +1934,10 @@ mod tests { let response = force_read(&mut fe_mut, response_ptr); let query_result: cosmwasm_std::QuerierResult = - cosmwasm_std::from_slice(&response).unwrap(); + cosmwasm_std::from_json_slice(&response).unwrap(); let query_result_inner = query_result.unwrap(); let query_result_inner_inner = query_result_inner.unwrap(); - let parsed_again: AllBalanceResponse = from_binary(&query_result_inner_inner).unwrap(); + let parsed_again: AllBalanceResponse = from_json_binary(&query_result_inner_inner).unwrap(); assert_eq!(parsed_again.amount, coins(INIT_AMOUNT, INIT_DENOM)); } @@ -1956,7 +1956,7 @@ mod tests { let response = force_read(&mut fe_mut, response_ptr); let query_result: cosmwasm_std::QuerierResult = - cosmwasm_std::from_slice(&response).unwrap(); + cosmwasm_std::from_json_slice(&response).unwrap(); match query_result { SystemResult::Ok(_) => panic!("This must not succeed"), SystemResult::Err(SystemError::InvalidRequest { request: err, .. }) => { @@ -1976,7 +1976,7 @@ mod tests { contract_addr: String::from("non-existent"), msg: Binary::from(b"{}" as &[u8]), }); - let request_data = cosmwasm_std::to_vec(&request).unwrap(); + let request_data = cosmwasm_std::to_json_vec(&request).unwrap(); let request_ptr = write_data(&mut fe_mut, &request_data); leave_default_data(&mut fe_mut); @@ -1985,7 +1985,7 @@ mod tests { let response = force_read(&mut fe_mut, response_ptr); let query_result: cosmwasm_std::QuerierResult = - cosmwasm_std::from_slice(&response).unwrap(); + cosmwasm_std::from_json_slice(&response).unwrap(); match query_result { SystemResult::Ok(_) => panic!("This must not succeed"), SystemResult::Err(SystemError::NoSuchContract { addr }) => { diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index f35997e5b3..02d55ef364 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -515,7 +515,7 @@ mod tests { mock_instance_with_options, MockInstanceOptions, }; use cosmwasm_std::{ - coin, coins, from_binary, AllBalanceResponse, BalanceResponse, BankQuery, Empty, + coin, coins, from_json_binary, AllBalanceResponse, BalanceResponse, BankQuery, Empty, QueryRequest, }; use wasmer::{FunctionEnv, FunctionEnvMut}; @@ -971,7 +971,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let BalanceResponse { amount } = from_binary(&response).unwrap(); + let BalanceResponse { amount } = from_json_binary(&response).unwrap(); assert_eq!(amount.amount.u128(), 8000); assert_eq!(amount.denom, "silver"); Ok(()) @@ -992,7 +992,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let AllBalanceResponse { amount } = from_binary(&response).unwrap(); + let AllBalanceResponse { amount } = from_json_binary(&response).unwrap(); assert_eq!(amount.len(), 2); assert_eq!(amount[0].amount.u128(), 10000); assert_eq!(amount[0].denom, "gold"); @@ -1027,7 +1027,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let BalanceResponse { amount } = from_binary(&response).unwrap(); + let BalanceResponse { amount } = from_json_binary(&response).unwrap(); assert_eq!(amount.amount.u128(), 500); Ok(()) }) @@ -1056,7 +1056,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let BalanceResponse { amount } = from_binary(&response).unwrap(); + let BalanceResponse { amount } = from_json_binary(&response).unwrap(); assert_eq!(amount.amount.u128(), 8000); Ok(()) }) diff --git a/packages/vm/src/testing/querier.rs b/packages/vm/src/testing/querier.rs index 3f86e2d264..b3aa185d1a 100644 --- a/packages/vm/src/testing/querier.rs +++ b/packages/vm/src/testing/querier.rs @@ -2,7 +2,7 @@ use serde::de::DeserializeOwned; use cosmwasm_std::testing::{MockQuerier as StdMockQuerier, MockQuerierCustomHandlerResult}; use cosmwasm_std::{ - to_binary, to_vec, Binary, Coin, ContractResult, CustomQuery, Empty, Querier as _, + to_json_binary, to_json_vec, Binary, Coin, ContractResult, CustomQuery, Empty, Querier as _, QueryRequest, SystemError, SystemResult, }; @@ -72,7 +72,7 @@ impl Querier for MockQuerier { GAS_COST_QUERY_FLAT + (GAS_COST_QUERY_REQUEST_MULTIPLIER * (bin_request.len() as u64)) + (GAS_COST_QUERY_RESPONSE_MULTIPLIER - * (to_binary(&response).unwrap().len() as u64)), + * (to_json_binary(&response).unwrap().len() as u64)), ); // In a production implementation, this should stop the query execution in the middle of the computation. @@ -93,7 +93,7 @@ impl MockQuerier { gas_limit: u64, ) -> BackendResult>> { // encode the request, then call raw_query - let request_binary = match to_vec(request) { + let request_binary = match to_json_vec(request) { Ok(raw) => raw, Err(err) => { let gas_info = GasInfo::with_externally_used(err.to_string().len() as u64); @@ -113,7 +113,9 @@ impl MockQuerier { #[cfg(test)] mod tests { use super::*; - use cosmwasm_std::{coin, from_binary, AllBalanceResponse, BalanceResponse, BankQuery, Empty}; + use cosmwasm_std::{ + coin, from_json_binary, AllBalanceResponse, BalanceResponse, BankQuery, Empty, + }; const DEFAULT_QUERY_GAS_LIMIT: u64 = 300_000; @@ -147,7 +149,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let res: AllBalanceResponse = from_binary(&all).unwrap(); + let res: AllBalanceResponse = from_json_binary(&all).unwrap(); assert_eq!(&res.amount, &balance); } @@ -171,7 +173,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let res: BalanceResponse = from_binary(&fly).unwrap(); + let res: BalanceResponse = from_json_binary(&fly).unwrap(); assert_eq!(res.amount, coin(777, "FLY")); // missing denom @@ -188,7 +190,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let res: BalanceResponse = from_binary(&miss).unwrap(); + let res: BalanceResponse = from_json_binary(&miss).unwrap(); assert_eq!(res.amount, coin(0, "MISS")); } @@ -211,7 +213,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let res: AllBalanceResponse = from_binary(&all).unwrap(); + let res: AllBalanceResponse = from_json_binary(&all).unwrap(); assert_eq!(res.amount, vec![]); // any denom on balances on empty account is empty coin @@ -228,7 +230,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let res: BalanceResponse = from_binary(&miss).unwrap(); + let res: BalanceResponse = from_json_binary(&miss).unwrap(); assert_eq!(res.amount, coin(0, "ELF")); } } From 87ffedf16a4a3c921d45848baf4c18b9ee3be222 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 22 Sep 2023 13:29:03 +0200 Subject: [PATCH 0734/2372] Add changelog entry --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c51eaa7d0b..a3a990c957 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,12 +19,17 @@ and this project adheres to - cosmwasm-std: Add `is_negative` for `Int{64,128,256,512}` ([#1867]). - cosmwasm-std: Add `TryFrom for Uint64` and `TryFrom for Int{B}` where `A >= B` ([#1870]). +- cosmwasm-std: Add `to_json_{vec,binary,string}` and + `from_json_{slice,binary,str}` and deprecate `to_{vec,binary}` in favor of + `to_json_{vec,binary}` and `from_{slice,binary}` in favor of + `from_json_{slice,binary}`. ([#1886]) [#1854]: https://github.com/CosmWasm/cosmwasm/pull/1854 [#1861]: https://github.com/CosmWasm/cosmwasm/pull/1861 [#1866]: https://github.com/CosmWasm/cosmwasm/pull/1866 [#1867]: https://github.com/CosmWasm/cosmwasm/pull/1867 [#1870]: https://github.com/CosmWasm/cosmwasm/pull/1870 +[#1886]: https://github.com/CosmWasm/cosmwasm/pull/1886 ## [1.4.0] - 2023-09-04 From 91bc9af4ee7e198dd89c766697190b1c1796c0bb Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 22 Sep 2023 14:35:09 +0200 Subject: [PATCH 0735/2372] Fix to_binary name --- packages/std/src/lib.rs | 2 +- packages/std/src/serde.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 8a99c40431..9dd0bd1598 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -90,7 +90,7 @@ pub use crate::results::{DistributionMsg, StakingMsg}; pub use crate::results::{GovMsg, VoteOption}; #[allow(deprecated)] pub use crate::serde::{ - from_binary, from_json_binary, from_json_slice, from_json_str, from_slice, to_binary_replace, + from_binary, from_json_binary, from_json_slice, from_json_str, from_slice, to_binary, to_json_binary, to_json_string, to_json_vec, to_vec, }; pub use crate::stdack::StdAck; diff --git a/packages/std/src/serde.rs b/packages/std/src/serde.rs index 366b9d93f6..13da4428b1 100644 --- a/packages/std/src/serde.rs +++ b/packages/std/src/serde.rs @@ -48,7 +48,7 @@ where } #[deprecated = "use to_json_binary instead"] -pub fn to_binary_replace(data: &T) -> StdResult +pub fn to_binary(data: &T) -> StdResult where T: Serialize + ?Sized, { From 9ae13841d2d4095956179d635452f70be8846de2 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 22 Sep 2023 14:49:20 +0200 Subject: [PATCH 0736/2372] Use single json deserialize function --- CHANGELOG.md | 7 +- contracts/crypto-verify/src/contract.rs | 28 +++---- contracts/cyberpunk/src/contract.rs | 7 +- contracts/cyberpunk/tests/integration.rs | 6 +- contracts/floaty/src/contract.rs | 10 +-- contracts/hackatom/src/contract.rs | 16 ++-- contracts/hackatom/tests/integration.rs | 8 +- contracts/ibc-reflect-send/src/ibc.rs | 19 ++--- contracts/ibc-reflect-send/src/state.rs | 8 +- contracts/ibc-reflect/src/contract.rs | 28 +++---- contracts/ibc-reflect/src/state.rs | 8 +- contracts/queue/src/contract.rs | 14 ++-- contracts/queue/tests/integration.rs | 13 ++- contracts/reflect/src/contract.rs | 16 ++-- contracts/reflect/src/state.rs | 6 +- contracts/reflect/src/testing.rs | 6 +- contracts/reflect/tests/integration.rs | 18 ++--- contracts/staking/src/state.rs | 6 +- contracts/staking/tests/integration.rs | 10 +-- packages/std/src/binary.rs | 8 +- packages/std/src/errors/system_error.rs | 6 +- packages/std/src/exports.rs | 54 ++++++------- packages/std/src/hex_binary.rs | 10 +-- packages/std/src/imports.rs | 4 +- packages/std/src/lib.rs | 4 +- packages/std/src/math/decimal.rs | 30 +++---- packages/std/src/math/decimal256.rs | 18 ++--- packages/std/src/math/int128.rs | 4 +- packages/std/src/math/int256.rs | 4 +- packages/std/src/math/int512.rs | 4 +- packages/std/src/math/int64.rs | 4 +- packages/std/src/math/uint128.rs | 4 +- packages/std/src/math/uint256.rs | 4 +- packages/std/src/math/uint512.rs | 4 +- packages/std/src/math/uint64.rs | 4 +- packages/std/src/results/contract_result.rs | 20 +++-- packages/std/src/results/empty.rs | 6 +- packages/std/src/results/response.rs | 4 +- packages/std/src/results/submessages.rs | 14 ++-- packages/std/src/serde.rs | 89 +++++++-------------- packages/std/src/testing/mock.rs | 72 ++++++++--------- packages/std/src/traits.rs | 8 +- packages/vm/src/environment.rs | 4 +- packages/vm/src/imports.rs | 15 ++-- packages/vm/src/instance.rs | 11 ++- packages/vm/src/testing/querier.rs | 14 ++-- 46 files changed, 299 insertions(+), 358 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a3a990c957..9d1e7575a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,10 +19,9 @@ and this project adheres to - cosmwasm-std: Add `is_negative` for `Int{64,128,256,512}` ([#1867]). - cosmwasm-std: Add `TryFrom for Uint64` and `TryFrom for Int{B}` where `A >= B` ([#1870]). -- cosmwasm-std: Add `to_json_{vec,binary,string}` and - `from_json_{slice,binary,str}` and deprecate `to_{vec,binary}` in favor of - `to_json_{vec,binary}` and `from_{slice,binary}` in favor of - `from_json_{slice,binary}`. ([#1886]) +- cosmwasm-std: Add `to_json_{vec,binary,string}` and `from_json` and deprecate + `to_{vec,binary}` in favor of `to_json_{vec,binary}` and `from_{slice,binary}` + in favor of `from_json`. ([#1886]) [#1854]: https://github.com/CosmWasm/cosmwasm/pull/1854 [#1861]: https://github.com/CosmWasm/cosmwasm/pull/1861 diff --git a/contracts/crypto-verify/src/contract.rs b/contracts/crypto-verify/src/contract.rs index 20a6d02f72..e2601d47d4 100644 --- a/contracts/crypto-verify/src/contract.rs +++ b/contracts/crypto-verify/src/contract.rs @@ -218,7 +218,7 @@ mod tests { mock_dependencies, mock_env, mock_info, MockApi, MockQuerier, MockStorage, }; use cosmwasm_std::{ - from_json_slice, Binary, OwnedDeps, RecoverPubkeyError, StdError, VerificationError, + from_json, Binary, OwnedDeps, RecoverPubkeyError, StdError, VerificationError, }; use hex_literal::hex; @@ -274,7 +274,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_json_slice(&raw).unwrap(); + let res: VerifyResponse = from_json(&raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -296,7 +296,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_json_slice(&raw).unwrap(); + let res: VerifyResponse = from_json(&raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: false }); } @@ -339,7 +339,7 @@ mod tests { signer_address: signer_address.into(), }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_json_slice(&raw).unwrap(); + let res: VerifyResponse = from_json(&raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -360,7 +360,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_json_slice(&raw).unwrap(); + let res: VerifyResponse = from_json(&raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: false }); } @@ -380,7 +380,7 @@ mod tests { signer_address: signer_address.into(), }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_json_slice(&raw).unwrap(); + let res: VerifyResponse = from_json(&raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: false }); // Broken signature @@ -447,7 +447,7 @@ mod tests { v, }; let raw = query(deps.as_ref(), mock_env(), msg).unwrap(); - let res: VerifyResponse = from_json_slice(&raw).unwrap(); + let res: VerifyResponse = from_json(&raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -475,7 +475,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_json_slice(&raw).unwrap(); + let res: VerifyResponse = from_json(&raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -508,7 +508,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_json_slice(&raw).unwrap(); + let res: VerifyResponse = from_json(&raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -542,7 +542,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_json_slice(&raw).unwrap(); + let res: VerifyResponse = from_json(&raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -573,7 +573,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_json_slice(&raw).unwrap(); + let res: VerifyResponse = from_json(&raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: false }); } @@ -626,7 +626,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_json_slice(&raw).unwrap(); + let res: VerifyResponse = from_json(&raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -648,7 +648,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_json_slice(&raw).unwrap(); + let res: VerifyResponse = from_json(&raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: false }); } @@ -683,7 +683,7 @@ mod tests { let query_msg = QueryMsg::ListVerificationSchemes {}; let raw = query(deps.as_ref(), mock_env(), query_msg).unwrap(); - let res: ListVerificationsResponse = from_json_slice(&raw).unwrap(); + let res: ListVerificationsResponse = from_json(&raw).unwrap(); assert_eq!( res, diff --git a/contracts/cyberpunk/src/contract.rs b/contracts/cyberpunk/src/contract.rs index 45ee27c1e4..4e2106aa7c 100644 --- a/contracts/cyberpunk/src/contract.rs +++ b/contracts/cyberpunk/src/contract.rs @@ -226,7 +226,7 @@ mod tests { use cosmwasm_std::testing::{ mock_dependencies, mock_env, mock_info, MockApi, MockQuerier, MockStorage, }; - use cosmwasm_std::{from_json_binary, DenomMetadata, DenomUnit, OwnedDeps}; + use cosmwasm_std::{from_json, DenomMetadata, DenomUnit, OwnedDeps}; fn setup() -> OwnedDeps { let mut deps = mock_dependencies(); @@ -274,12 +274,11 @@ mod tests { ); let symbols: Vec = - from_json_binary(&query(deps.as_ref(), mock_env(), QueryMsg::Denoms {}).unwrap()) - .unwrap(); + from_json(&query(deps.as_ref(), mock_env(), QueryMsg::Denoms {}).unwrap()).unwrap(); assert_eq!(symbols.len(), 98); - let denom: DenomMetadata = from_json_binary( + let denom: DenomMetadata = from_json( &query( deps.as_ref(), mock_env(), diff --git a/contracts/cyberpunk/tests/integration.rs b/contracts/cyberpunk/tests/integration.rs index 1826cf0bf8..0140b40cf6 100644 --- a/contracts/cyberpunk/tests/integration.rs +++ b/contracts/cyberpunk/tests/integration.rs @@ -17,7 +17,7 @@ //! }); //! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) -use cosmwasm_std::{from_json_binary, Empty, Env, Response}; +use cosmwasm_std::{from_json, Empty, Env, Response}; use cosmwasm_vm::testing::{ execute, instantiate, mock_env, mock_info, mock_instance, mock_instance_with_gas_limit, query, }; @@ -152,13 +152,13 @@ fn test_env() { ) .unwrap(); - let received_env: Env = from_json_binary(&res.data.unwrap()).unwrap(); + let received_env: Env = from_json(&res.data.unwrap()).unwrap(); assert_eq!(received_env, env); let env = mock_env(); let received_env: Env = - from_json_binary(&query(&mut deps, env.clone(), QueryMsg::MirrorEnv {}).unwrap()).unwrap(); + from_json(&query(&mut deps, env.clone(), QueryMsg::MirrorEnv {}).unwrap()).unwrap(); assert_eq!(received_env, env); } diff --git a/contracts/floaty/src/contract.rs b/contracts/floaty/src/contract.rs index 644c9d1ca9..15b824bf25 100644 --- a/contracts/floaty/src/contract.rs +++ b/contracts/floaty/src/contract.rs @@ -1,5 +1,5 @@ use cosmwasm_std::{ - entry_point, from_json_slice, to_json_binary, to_json_vec, AllBalanceResponse, BankMsg, Deps, + entry_point, from_json, to_json_binary, to_json_vec, AllBalanceResponse, BankMsg, Deps, DepsMut, Env, Event, MessageInfo, QueryResponse, Response, StdError, StdResult, }; @@ -40,7 +40,7 @@ pub fn execute( .storage .get(CONFIG_KEY) .ok_or_else(|| StdError::not_found("State"))?; - let state: State = from_json_slice(&data)?; + let state: State = from_json(&data)?; if info.sender == state.verifier { let to_addr = state.beneficiary; @@ -77,7 +77,7 @@ fn query_verifier(deps: Deps) -> StdResult { .storage .get(CONFIG_KEY) .ok_or_else(|| StdError::not_found("State"))?; - let state: State = from_json_slice(&data)?; + let state: State = from_json(&data)?; Ok(VerifierResponse { verifier: state.verifier.into(), }) @@ -124,7 +124,7 @@ mod tests { // it worked, let's check the state let data = deps.storage.get(CONFIG_KEY).expect("no data stored"); - let state: State = from_json_slice(&data).unwrap(); + let state: State = from_json(&data).unwrap(); assert_eq!(state, expected_state); } @@ -246,7 +246,7 @@ mod tests { // state should not change let data = deps.storage.get(CONFIG_KEY).expect("no data stored"); - let state: State = from_json_slice(&data).unwrap(); + let state: State = from_json(&data).unwrap(); assert_eq!( state, State { diff --git a/contracts/hackatom/src/contract.rs b/contracts/hackatom/src/contract.rs index ba578792e0..463ebbab90 100644 --- a/contracts/hackatom/src/contract.rs +++ b/contracts/hackatom/src/contract.rs @@ -1,9 +1,9 @@ use sha2::{Digest, Sha256}; use cosmwasm_std::{ - entry_point, from_json_slice, to_json_binary, to_json_vec, Addr, AllBalanceResponse, Api, - BankMsg, CanonicalAddr, Deps, DepsMut, Env, Event, MessageInfo, QueryRequest, QueryResponse, - Response, StdError, StdResult, WasmMsg, WasmQuery, + entry_point, from_json, to_json_binary, to_json_vec, Addr, AllBalanceResponse, Api, BankMsg, + CanonicalAddr, Deps, DepsMut, Env, Event, MessageInfo, QueryRequest, QueryResponse, Response, + StdError, StdResult, WasmMsg, WasmQuery, }; use crate::errors::HackError; @@ -41,7 +41,7 @@ pub fn migrate(deps: DepsMut, _env: Env, msg: MigrateMsg) -> Result Result StdResult { .storage .get(CONFIG_KEY) .ok_or_else(|| StdError::not_found("State"))?; - let state: State = from_json_slice(&data)?; + let state: State = from_json(&data)?; Ok(VerifierResponse { verifier: state.verifier.into(), }) @@ -336,7 +336,7 @@ mod tests { // it worked, let's check the state let data = deps.storage.get(CONFIG_KEY).expect("no data stored"); - let state: State = from_json_slice(&data).unwrap(); + let state: State = from_json(&data).unwrap(); assert_eq!(state, expected_state); } @@ -514,7 +514,7 @@ mod tests { // state should not change let data = deps.storage.get(CONFIG_KEY).expect("no data stored"); - let state: State = from_json_slice(&data).unwrap(); + let state: State = from_json(&data).unwrap(); assert_eq!( state, State { diff --git a/contracts/hackatom/tests/integration.rs b/contracts/hackatom/tests/integration.rs index f91f2d54db..68920da908 100644 --- a/contracts/hackatom/tests/integration.rs +++ b/contracts/hackatom/tests/integration.rs @@ -18,8 +18,8 @@ //! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) use cosmwasm_std::{ - assert_approx_eq, coins, from_json_binary, to_json_vec, Addr, AllBalanceResponse, BankMsg, - Binary, ContractResult, Empty, Response, SubMsg, + assert_approx_eq, coins, from_json, to_json_vec, Addr, AllBalanceResponse, BankMsg, Binary, + ContractResult, Empty, Response, SubMsg, }; use cosmwasm_vm::{ call_execute, from_slice, @@ -183,7 +183,7 @@ fn querier_callbacks_work() { // querying with balance gets the balance let query_msg = QueryMsg::OtherBalance { address: rich_addr }; let query_response = query(&mut deps, mock_env(), query_msg).unwrap(); - let bal: AllBalanceResponse = from_json_binary(&query_response).unwrap(); + let bal: AllBalanceResponse = from_json(&query_response).unwrap(); assert_eq!(bal.amount, rich_balance); // querying other accounts gets none @@ -191,7 +191,7 @@ fn querier_callbacks_work() { address: String::from("someone else"), }; let query_response = query(&mut deps, mock_env(), query_msg).unwrap(); - let bal: AllBalanceResponse = from_json_binary(&query_response).unwrap(); + let bal: AllBalanceResponse = from_json(&query_response).unwrap(); assert_eq!(bal.amount, vec![]); } diff --git a/contracts/ibc-reflect-send/src/ibc.rs b/contracts/ibc-reflect-send/src/ibc.rs index f29cabdb68..8086e103c2 100644 --- a/contracts/ibc-reflect-send/src/ibc.rs +++ b/contracts/ibc-reflect-send/src/ibc.rs @@ -1,6 +1,6 @@ use cosmwasm_std::{ - entry_point, from_json_slice, to_json_binary, DepsMut, Env, IbcBasicResponse, - IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcMsg, IbcOrder, IbcPacketAckMsg, + entry_point, from_json, to_json_binary, DepsMut, Env, IbcBasicResponse, IbcChannelCloseMsg, + IbcChannelConnectMsg, IbcChannelOpenMsg, IbcMsg, IbcOrder, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, Never, StdError, StdResult, }; @@ -108,21 +108,18 @@ pub fn ibc_packet_ack( // which local channel was this packet send from let caller = msg.original_packet.src.channel_id; // we need to parse the ack based on our request - let packet: PacketMsg = from_json_slice(&msg.original_packet.data)?; + let packet: PacketMsg = from_json(&msg.original_packet.data)?; match packet { PacketMsg::Dispatch { .. } => { - let res: AcknowledgementMsg = - from_json_slice(&msg.acknowledgement.data)?; + let res: AcknowledgementMsg = from_json(&msg.acknowledgement.data)?; acknowledge_dispatch(deps, caller, res) } PacketMsg::WhoAmI {} => { - let res: AcknowledgementMsg = - from_json_slice(&msg.acknowledgement.data)?; + let res: AcknowledgementMsg = from_json(&msg.acknowledgement.data)?; acknowledge_who_am_i(deps, caller, res) } PacketMsg::Balances {} => { - let res: AcknowledgementMsg = - from_json_slice(&msg.acknowledgement.data)?; + let res: AcknowledgementMsg = from_json(&msg.acknowledgement.data)?; acknowledge_balances(deps, env, caller, res) } } @@ -308,7 +305,7 @@ mod tests { channel_id: channel_id.into(), }; let r = query(deps.as_ref(), mock_env(), q).unwrap(); - let acct: AccountResponse = from_json_slice(&r).unwrap(); + let acct: AccountResponse = from_json(&r).unwrap(); assert!(acct.remote_addr.is_none()); assert!(acct.remote_balance.is_empty()); assert_eq!(0, acct.last_update_time.nanos()); @@ -322,7 +319,7 @@ mod tests { channel_id: channel_id.into(), }; let r = query(deps.as_ref(), mock_env(), q).unwrap(); - let acct: AccountResponse = from_json_slice(&r).unwrap(); + let acct: AccountResponse = from_json(&r).unwrap(); assert_eq!(acct.remote_addr.unwrap(), remote_addr); assert!(acct.remote_balance.is_empty()); assert_eq!(0, acct.last_update_time.nanos()); diff --git a/contracts/ibc-reflect-send/src/state.rs b/contracts/ibc-reflect-send/src/state.rs index 7e5a693797..e9c024b0ae 100644 --- a/contracts/ibc-reflect-send/src/state.rs +++ b/contracts/ibc-reflect-send/src/state.rs @@ -1,7 +1,7 @@ use serde::{Deserialize, Serialize}; use cosmwasm_std::{ - from_json_slice, + from_json, storage_keys::{namespace_with_key, to_length_prefixed}, to_json_vec, Addr, Coin, Order, StdError, StdResult, Storage, Timestamp, }; @@ -33,7 +33,7 @@ pub struct AccountData { pub fn may_load_account(storage: &dyn Storage, id: &str) -> StdResult> { storage .get(&namespace_with_key(&[PREFIX_ACCOUNTS], id.as_bytes())) - .map(|v| from_json_slice(&v)) + .map(|v| from_json(&v)) .transpose() } @@ -63,7 +63,7 @@ pub fn range_accounts( .map(|(key, val)| { Ok(( String::from_utf8(key[PREFIX_ACCOUNTS.len() + 2..].to_vec())?, - from_json_slice(&val)?, + from_json(&val)?, )) }) } @@ -72,7 +72,7 @@ pub fn load_config(storage: &dyn Storage) -> StdResult { storage .get(&to_length_prefixed(KEY_CONFIG)) .ok_or_else(|| StdError::not_found("config")) - .and_then(|v| from_json_slice(&v)) + .and_then(|v| from_json(&v)) } pub fn save_config(storage: &mut dyn Storage, item: &Config) -> StdResult<()> { diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 2777363867..e3b59f10d3 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -1,5 +1,5 @@ use cosmwasm_std::{ - entry_point, from_json_slice, to_json_binary, wasm_execute, BankMsg, Binary, CosmosMsg, Deps, + entry_point, from_json, to_json_binary, wasm_execute, BankMsg, Binary, CosmosMsg, Deps, DepsMut, Empty, Env, Event, Ibc3ChannelOpenResponse, IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcChannelOpenResponse, IbcOrder, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, MessageInfo, Never, @@ -241,7 +241,7 @@ pub fn ibc_packet_receive( let packet = msg.packet; // which local channel did this packet come on let caller = packet.dest.channel_id; - let msg: PacketMsg = from_json_slice(&packet.data)?; + let msg: PacketMsg = from_json(&packet.data)?; match msg { PacketMsg::Dispatch { msgs } => receive_dispatch(deps, caller, msgs), PacketMsg::WhoAmI {} => receive_who_am_i(deps, caller), @@ -358,7 +358,7 @@ mod tests { mock_ibc_channel_open_init, mock_ibc_channel_open_try, mock_ibc_packet_recv, mock_info, mock_wasmd_attr, MockApi, MockQuerier, MockStorage, MOCK_CONTRACT_ADDR, }; - use cosmwasm_std::{attr, coin, coins, from_json_slice, BankMsg, OwnedDeps, WasmMsg}; + use cosmwasm_std::{attr, coin, coins, from_json, BankMsg, OwnedDeps, WasmMsg}; const CREATOR: &str = "creator"; // code id of the reflect contract @@ -482,7 +482,7 @@ mod tests { // no accounts set yet let raw = query(deps.as_ref(), mock_env(), QueryMsg::ListAccounts {}).unwrap(); - let res: ListAccountsResponse = from_json_slice(&raw).unwrap(); + let res: ListAccountsResponse = from_json(&raw).unwrap(); assert_eq!(0, res.accounts.len()); // fake a reply and ensure this works @@ -497,7 +497,7 @@ mod tests { // ensure this is now registered let raw = query(deps.as_ref(), mock_env(), QueryMsg::ListAccounts {}).unwrap(); - let res: ListAccountsResponse = from_json_slice(&raw).unwrap(); + let res: ListAccountsResponse = from_json(&raw).unwrap(); assert_eq!(1, res.accounts.len()); assert_eq!( &res.accounts[0], @@ -516,7 +516,7 @@ mod tests { }, ) .unwrap(); - let res: AccountResponse = from_json_slice(&raw).unwrap(); + let res: AccountResponse = from_json(&raw).unwrap(); assert_eq!(res.account.unwrap(), REFLECT_ADDR); } @@ -546,8 +546,7 @@ mod tests { res.events[0] ); // acknowledgement is an error - let ack: AcknowledgementMsg = - from_json_slice(&res.acknowledgement).unwrap(); + let ack: AcknowledgementMsg = from_json(&res.acknowledgement).unwrap(); assert_eq!( ack.unwrap_err(), "invalid packet: account channel-123 not found" @@ -561,7 +560,7 @@ mod tests { let res = ibc_packet_receive(deps.as_mut(), mock_env(), msg).unwrap(); // assert app-level success - let ack: AcknowledgementMsg<()> = from_json_slice(&res.acknowledgement).unwrap(); + let ack: AcknowledgementMsg<()> = from_json(&res.acknowledgement).unwrap(); ack.unwrap(); // and we dispatch the BankMsg via submessage @@ -578,7 +577,7 @@ mod tests { assert_eq!(account, contract_addr.as_str()); assert_eq!(0, funds.len()); // parse the message - should callback with proper channel_id - let rmsg: ReflectExecuteMsg = from_json_slice(msg).unwrap(); + let rmsg: ReflectExecuteMsg = from_json(msg).unwrap(); assert_eq!( rmsg, ReflectExecuteMsg::ReflectMsg { @@ -598,8 +597,7 @@ mod tests { // we didn't dispatch anything assert_eq!(0, res.messages.len()); // acknowledgement is an error - let ack: AcknowledgementMsg = - from_json_slice(&res.acknowledgement).unwrap(); + let ack: AcknowledgementMsg = from_json(&res.acknowledgement).unwrap(); assert_eq!(ack.unwrap_err(), "invalid packet: Error parsing into type ibc_reflect::msg::PacketMsg: unknown variant `reflect_code_id`, expected one of `dispatch`, `who_am_i`, `balances`, `panic`, `return_err`, `return_msgs`"); } @@ -618,7 +616,7 @@ mod tests { // channel should be listed and have balance let raw = query(deps.as_ref(), mock_env(), QueryMsg::ListAccounts {}).unwrap(); - let res: ListAccountsResponse = from_json_slice(&raw).unwrap(); + let res: ListAccountsResponse = from_json(&raw).unwrap(); assert_eq!(1, res.accounts.len()); let balance = deps.as_ref().querier.query_all_balances(account).unwrap(); assert_eq!(funds, balance); @@ -634,7 +632,7 @@ mod tests { }) = &res.messages[0].msg { assert_eq!(contract_addr.as_str(), account); - let reflect: ReflectExecuteMsg = from_json_slice(msg).unwrap(); + let reflect: ReflectExecuteMsg = from_json(msg).unwrap(); match reflect { ReflectExecuteMsg::ReflectMsg { msgs } => { assert_eq!(1, msgs.len()); @@ -654,7 +652,7 @@ mod tests { // and removes the account lookup let raw = query(deps.as_ref(), mock_env(), QueryMsg::ListAccounts {}).unwrap(); - let res: ListAccountsResponse = from_json_slice(&raw).unwrap(); + let res: ListAccountsResponse = from_json(&raw).unwrap(); assert_eq!(0, res.accounts.len()); } } diff --git a/contracts/ibc-reflect/src/state.rs b/contracts/ibc-reflect/src/state.rs index a229960d5e..3321731f5a 100644 --- a/contracts/ibc-reflect/src/state.rs +++ b/contracts/ibc-reflect/src/state.rs @@ -1,7 +1,7 @@ use std::any::type_name; use cosmwasm_std::{ - from_json_slice, + from_json, storage_keys::{namespace_with_key, to_length_prefixed}, to_json_vec, Addr, Order, StdError, StdResult, Storage, }; @@ -22,7 +22,7 @@ pub struct Config { pub fn may_load_account(storage: &dyn Storage, id: &str) -> StdResult> { storage .get(&namespace_with_key(&[PREFIX_ACCOUNTS], id.as_bytes())) - .map(|v| from_json_slice(&v)) + .map(|v| from_json(&v)) .transpose() } @@ -52,7 +52,7 @@ pub fn range_accounts( .map(|(key, val)| { Ok(( String::from_utf8(key[PREFIX_ACCOUNTS.len() + 2..].to_vec())?, - from_json_slice(&val)?, + from_json(&val)?, )) }) } @@ -61,7 +61,7 @@ pub fn load_item(storage: &dyn Storage, key: &[u8]) -> StdR storage .get(&to_length_prefixed(key)) .ok_or_else(|| StdError::not_found(type_name::())) - .and_then(|v| from_json_slice(&v)) + .and_then(|v| from_json(&v)) } pub fn save_item(storage: &mut dyn Storage, key: &[u8], item: &T) -> StdResult<()> { diff --git a/contracts/queue/src/contract.rs b/contracts/queue/src/contract.rs index 33405decfe..1e1334154c 100644 --- a/contracts/queue/src/contract.rs +++ b/contracts/queue/src/contract.rs @@ -1,5 +1,5 @@ use cosmwasm_std::{ - entry_point, from_json_slice, to_json_binary, to_json_vec, Binary, Deps, DepsMut, Empty, Env, + entry_point, from_json, to_json_binary, to_json_vec, Binary, Deps, DepsMut, Empty, Env, MessageInfo, Order, QueryResponse, Response, StdResult, Storage, }; @@ -112,7 +112,7 @@ fn query_sum(deps: Deps) -> StdResult { let values: StdResult> = deps .storage .range_values(None, None, Order::Ascending) - .map(|v| from_json_slice(&v)) + .map(|v| from_json(&v)) .collect(); let sum = values?.iter().fold(0, |s, v| s + v.value); Ok(SumResponse { sum }) @@ -124,7 +124,7 @@ fn query_reducer(deps: Deps) -> StdResult { for val in deps .storage .range_values(None, None, Order::Ascending) - .map(|v| from_json_slice::(&v)) + .map(|v| from_json::(&v)) { // this returns error on parse error let my_val = val?.value; @@ -134,7 +134,7 @@ fn query_reducer(deps: Deps) -> StdResult { .range_values(None, None, Order::Ascending) // get value. ignore parse errors, just count as 0 .map(|v| { - from_json_slice::(&v) + from_json::(&v) .map(|v| v.value) .expect("error in item") }) @@ -181,7 +181,7 @@ mod tests { use cosmwasm_std::testing::{ mock_dependencies_with_balance, mock_env, mock_info, MockApi, MockQuerier, MockStorage, }; - use cosmwasm_std::{coins, from_json_binary, OwnedDeps}; + use cosmwasm_std::{coins, from_json, OwnedDeps}; /// Instantiates a contract with no elements fn create_contract() -> (OwnedDeps, MessageInfo) { @@ -270,7 +270,7 @@ mod tests { // ensure we popped properly assert!(res.data.is_some()); let data = res.data.unwrap(); - let state: Item = from_json_slice(data.as_slice()).unwrap(); + let state: Item = from_json(data.as_slice()).unwrap(); assert_eq!(state.value, 25); assert_eq!(get_count(deps.as_ref()), 1); @@ -340,7 +340,7 @@ mod tests { let query_msg = QueryMsg::List {}; let ids: ListResponse = - from_json_binary(&query(deps.as_ref(), mock_env(), query_msg).unwrap()).unwrap(); + from_json(&query(deps.as_ref(), mock_env(), query_msg).unwrap()).unwrap(); assert_eq!(ids.empty, Vec::::new()); assert_eq!(ids.early, vec![0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f]); assert_eq!(ids.late, vec![0x20, 0x21, 0x22, 0x23, 0x24]); diff --git a/contracts/queue/tests/integration.rs b/contracts/queue/tests/integration.rs index d5670167c8..66b0117480 100644 --- a/contracts/queue/tests/integration.rs +++ b/contracts/queue/tests/integration.rs @@ -17,7 +17,7 @@ //! }); //! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) -use cosmwasm_std::{from_json_binary, MessageInfo, Response}; +use cosmwasm_std::{from_json, MessageInfo, Response}; use cosmwasm_vm::{ testing::{ execute, instantiate, migrate, mock_env, mock_info, mock_instance_with_gas_limit, query, @@ -48,13 +48,13 @@ fn create_contract() -> (Instance, MessageInf fn get_count(deps: &mut Instance) -> u32 { let data = query(deps, mock_env(), QueryMsg::Count {}).unwrap(); - let res: CountResponse = from_json_binary(&data).unwrap(); + let res: CountResponse = from_json(&data).unwrap(); res.count } fn get_sum(deps: &mut Instance) -> i32 { let data = query(deps, mock_env(), QueryMsg::Sum {}).unwrap(); - let res: SumResponse = from_json_binary(&data).unwrap(); + let res: SumResponse = from_json(&data).unwrap(); res.sum } @@ -128,7 +128,7 @@ fn push_and_pop() { // ensure we popped properly assert!(res.data.is_some()); let data = res.data.unwrap(); - let item: Item = from_json_binary(&data).unwrap(); + let item: Item = from_json(&data).unwrap(); assert_eq!(item.value, 25); assert_eq!(get_count(&mut deps), 1); @@ -169,7 +169,7 @@ fn push_and_reduce() { assert_eq!(get_count(&mut deps), 4); assert_eq!(get_sum(&mut deps), 130); let data = query(&mut deps, mock_env(), QueryMsg::Reducer {}).unwrap(); - let counters = from_json_binary::(&data).unwrap().counters; + let counters = from_json::(&data).unwrap().counters; assert_eq!(counters, vec![(40, 85), (15, 125), (85, 0), (-10, 140)]); } @@ -223,8 +223,7 @@ fn query_list() { // since we count up to 0x20 in early, we get early and late both with data let query_msg = QueryMsg::List {}; - let ids: ListResponse = - from_json_binary(&query(&mut deps, mock_env(), query_msg).unwrap()).unwrap(); + let ids: ListResponse = from_json(&query(&mut deps, mock_env(), query_msg).unwrap()).unwrap(); assert_eq!(ids.empty, Vec::::new()); assert_eq!(ids.early, vec![0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f]); assert_eq!(ids.late, vec![0x20, 0x21, 0x22, 0x23, 0x24]); diff --git a/contracts/reflect/src/contract.rs b/contracts/reflect/src/contract.rs index 3f1196cd67..f4b848d8d4 100644 --- a/contracts/reflect/src/contract.rs +++ b/contracts/reflect/src/contract.rs @@ -176,8 +176,8 @@ mod tests { use crate::testing::mock_dependencies_with_custom_querier; use cosmwasm_std::testing::{mock_env, mock_info, MOCK_CONTRACT_ADDR}; use cosmwasm_std::{ - coin, coins, from_json_binary, AllBalanceResponse, BankMsg, BankQuery, Binary, Event, - StakingMsg, StdError, SubMsgResponse, SubMsgResult, + coin, coins, from_json, AllBalanceResponse, BankMsg, BankQuery, Binary, Event, StakingMsg, + StdError, SubMsgResponse, SubMsgResult, }; #[test] @@ -365,7 +365,7 @@ mod tests { text: "demo one".to_string(), }; let response = query(deps.as_ref(), mock_env(), msg).unwrap(); - let value: CapitalizedResponse = from_json_binary(&response).unwrap(); + let value: CapitalizedResponse = from_json(&response).unwrap(); assert_eq!(value.text, "DEMO ONE"); } @@ -381,8 +381,8 @@ mod tests { .into(), }; let response = query(deps.as_ref(), mock_env(), msg).unwrap(); - let outer: ChainResponse = from_json_binary(&response).unwrap(); - let inner: AllBalanceResponse = from_json_binary(&outer.data).unwrap(); + let outer: ChainResponse = from_json(&response).unwrap(); + let inner: AllBalanceResponse = from_json(&outer.data).unwrap(); assert_eq!(inner.amount, coins(123, "ucosm")); // with custom query @@ -390,8 +390,8 @@ mod tests { request: SpecialQuery::Ping {}.into(), }; let response = query(deps.as_ref(), mock_env(), msg).unwrap(); - let outer: ChainResponse = from_json_binary(&response).unwrap(); - let inner: SpecialResponse = from_json_binary(&outer.data).unwrap(); + let outer: ChainResponse = from_json(&response).unwrap(); + let inner: SpecialResponse = from_json(&outer.data).unwrap(); assert_eq!(inner.msg, "pong"); } @@ -452,7 +452,7 @@ mod tests { // query for the real id let raw = query(deps.as_ref(), mock_env(), QueryMsg::SubMsgResult { id }).unwrap(); - let qres: Reply = from_json_binary(&raw).unwrap(); + let qres: Reply = from_json(&raw).unwrap(); assert_eq!(qres.id, id); let result = qres.result.unwrap(); assert_eq!(result.data, Some(data)); diff --git a/contracts/reflect/src/state.rs b/contracts/reflect/src/state.rs index bad478e3c2..7afa6ac455 100644 --- a/contracts/reflect/src/state.rs +++ b/contracts/reflect/src/state.rs @@ -2,7 +2,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use cosmwasm_std::{ - from_json_slice, + from_json, storage_keys::{namespace_with_key, to_length_prefixed}, to_json_vec, Addr, Reply, StdError, StdResult, Storage, }; @@ -19,7 +19,7 @@ pub fn load_reply(storage: &dyn Storage, id: u64) -> StdResult { storage .get(&namespace_with_key(&[RESULT_PREFIX], &id.to_be_bytes())) .ok_or_else(|| StdError::not_found(format!("reply {id}"))) - .and_then(|v| from_json_slice(&v)) + .and_then(|v| from_json(&v)) } pub fn save_reply(storage: &mut dyn Storage, id: u64, reply: &Reply) -> StdResult<()> { @@ -38,7 +38,7 @@ pub fn load_config(storage: &dyn Storage) -> StdResult { storage .get(&to_length_prefixed(CONFIG_KEY)) .ok_or_else(|| StdError::not_found("config")) - .and_then(|v| from_json_slice(&v)) + .and_then(|v| from_json(&v)) } pub fn save_config(storage: &mut dyn Storage, item: &State) -> StdResult<()> { diff --git a/contracts/reflect/src/testing.rs b/contracts/reflect/src/testing.rs index d8643a030a..b67a6a680c 100644 --- a/contracts/reflect/src/testing.rs +++ b/contracts/reflect/src/testing.rs @@ -32,12 +32,12 @@ pub fn custom_query_execute(query: &SpecialQuery) -> ContractResult { #[cfg(test)] mod tests { use super::*; - use cosmwasm_std::{from_json_binary, QuerierWrapper, QueryRequest}; + use cosmwasm_std::{from_json, QuerierWrapper, QueryRequest}; #[test] fn custom_query_execute_ping() { let res = custom_query_execute(&SpecialQuery::Ping {}).unwrap(); - let response: SpecialResponse = from_json_binary(&res).unwrap(); + let response: SpecialResponse = from_json(&res).unwrap(); assert_eq!(response.msg, "pong"); } @@ -47,7 +47,7 @@ mod tests { text: "fOObaR".to_string(), }) .unwrap(); - let response: SpecialResponse = from_json_binary(&res).unwrap(); + let response: SpecialResponse = from_json(&res).unwrap(); assert_eq!(response.msg, "FOOBAR"); } diff --git a/contracts/reflect/tests/integration.rs b/contracts/reflect/tests/integration.rs index 48e8a77c10..6ab20d5aa5 100644 --- a/contracts/reflect/tests/integration.rs +++ b/contracts/reflect/tests/integration.rs @@ -18,9 +18,9 @@ //! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) use cosmwasm_std::{ - coin, coins, from_json_binary, BankMsg, BankQuery, Binary, Coin, ContractResult, Event, - QueryRequest, Reply, Response, StakingMsg, SubMsg, SubMsgResponse, SubMsgResult, - SupplyResponse, SystemResult, + coin, coins, from_json, BankMsg, BankQuery, Binary, Coin, ContractResult, Event, QueryRequest, + Reply, Response, StakingMsg, SubMsg, SubMsgResponse, SubMsgResult, SupplyResponse, + SystemResult, }; use cosmwasm_vm::{ testing::{ @@ -83,7 +83,7 @@ fn proper_initialization() { // it worked, let's query the state let res = query(&mut deps, mock_env(), QueryMsg::Owner {}).unwrap(); - let value: OwnerResponse = from_json_binary(&res).unwrap(); + let value: OwnerResponse = from_json(&res).unwrap(); assert_eq!("creator", value.owner.as_str()); } @@ -159,7 +159,7 @@ fn transfer() { // should change state assert_eq!(0, res.messages.len()); let res = query(&mut deps, mock_env(), QueryMsg::Owner {}).unwrap(); - let value: OwnerResponse = from_json_binary(&res).unwrap(); + let value: OwnerResponse = from_json(&res).unwrap(); assert_eq!("friend", value.owner.as_str()); } @@ -203,8 +203,8 @@ fn supply_query() { ) .unwrap(); - let res: ChainResponse = from_json_binary(&res).unwrap(); - let res: SupplyResponse = from_json_binary(&res.data).unwrap(); + let res: ChainResponse = from_json(&res).unwrap(); + let res: SupplyResponse = from_json(&res.data).unwrap(); assert_eq!(res.amount, coin(25, "OSMO")); } @@ -225,7 +225,7 @@ fn dispatch_custom_query() { }, ) .unwrap(); - let value: CapitalizedResponse = from_json_binary(&res).unwrap(); + let value: CapitalizedResponse = from_json(&res).unwrap(); assert_eq!(value.text, "DEMO ONE"); } @@ -282,7 +282,7 @@ fn reply_and_query() { // query for the real id let raw = query(&mut deps, mock_env(), QueryMsg::SubMsgResult { id }).unwrap(); - let qres: Reply = from_json_binary(&raw).unwrap(); + let qres: Reply = from_json(&raw).unwrap(); assert_eq!(qres.id, id); let result = qres.result.unwrap(); assert_eq!(result.data, Some(data)); diff --git a/contracts/staking/src/state.rs b/contracts/staking/src/state.rs index 41f7d2fb7b..759ccfc145 100644 --- a/contracts/staking/src/state.rs +++ b/contracts/staking/src/state.rs @@ -4,7 +4,7 @@ use schemars::JsonSchema; use serde::{de::DeserializeOwned, Deserialize, Serialize}; use cosmwasm_std::{ - from_json_slice, + from_json, storage_keys::{namespace_with_key, to_length_prefixed}, to_json_vec, Addr, CanonicalAddr, Decimal, StdError, StdResult, Storage, Uint128, }; @@ -23,7 +23,7 @@ pub fn may_load_map( ) -> StdResult> { storage .get(&namespace_with_key(&[prefix], key)) - .map(|v| from_json_slice(&v)) + .map(|v| from_json(&v)) .transpose() } @@ -85,7 +85,7 @@ pub fn load_item(storage: &dyn Storage, key: &[u8]) -> StdR storage .get(&to_length_prefixed(key)) .ok_or_else(|| StdError::not_found(type_name::())) - .and_then(|v| from_json_slice(&v)) + .and_then(|v| from_json(&v)) } pub fn save_item(storage: &mut dyn Storage, key: &[u8], item: &T) -> StdResult<()> { diff --git a/contracts/staking/tests/integration.rs b/contracts/staking/tests/integration.rs index 6bb06b0f8c..3b68b55a2e 100644 --- a/contracts/staking/tests/integration.rs +++ b/contracts/staking/tests/integration.rs @@ -17,7 +17,7 @@ //! }); //! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) -use cosmwasm_std::{coin, from_json_binary, ContractResult, Decimal, Response, Uint128, Validator}; +use cosmwasm_std::{coin, from_json, ContractResult, Decimal, Response, Uint128, Validator}; use cosmwasm_vm::testing::{ instantiate, mock_backend, mock_env, mock_info, mock_instance_options, query, }; @@ -106,7 +106,7 @@ fn proper_initialization() { // token info is proper let res = query(&mut deps, mock_env(), QueryMsg::TokenInfo {}).unwrap(); - let token: TokenInfoResponse = from_json_binary(&res).unwrap(); + let token: TokenInfoResponse = from_json(&res).unwrap(); assert_eq!(&token.name, &msg.name); assert_eq!(&token.symbol, &msg.symbol); assert_eq!(token.decimals, msg.decimals); @@ -120,7 +120,7 @@ fn proper_initialization() { }, ) .unwrap(); - let bal: BalanceResponse = from_json_binary(&res).unwrap(); + let bal: BalanceResponse = from_json(&res).unwrap(); assert_eq!(bal.balance, Uint128::new(0)); // no claims @@ -132,12 +132,12 @@ fn proper_initialization() { }, ) .unwrap(); - let claim: ClaimsResponse = from_json_binary(&res).unwrap(); + let claim: ClaimsResponse = from_json(&res).unwrap(); assert_eq!(claim.claims, Uint128::new(0)); // investment info correct let res = query(&mut deps, mock_env(), QueryMsg::Investment {}).unwrap(); - let invest: InvestmentResponse = from_json_binary(&res).unwrap(); + let invest: InvestmentResponse = from_json(&res).unwrap(); assert_eq!(&invest.owner, &creator); assert_eq!(&invest.validator, &msg.validator); assert_eq!(invest.exit_tax, msg.exit_tax); diff --git a/packages/std/src/binary.rs b/packages/std/src/binary.rs index ef98b30ef0..7030ee02aa 100644 --- a/packages/std/src/binary.rs +++ b/packages/std/src/binary.rs @@ -253,7 +253,7 @@ mod tests { use super::*; use crate::assert_hash_works; use crate::errors::StdError; - use crate::serde::{from_json_slice, to_json_vec}; + use crate::serde::{from_json, to_json_vec}; #[test] fn to_array_works() { @@ -451,7 +451,7 @@ mod tests { let binary = Binary(vec![0u8, 187, 61, 11, 250, 0]); let json = to_json_vec(&binary).unwrap(); - let deserialized: Binary = from_json_slice(&json).unwrap(); + let deserialized: Binary = from_json(&json).unwrap(); assert_eq!(binary, deserialized); } @@ -463,7 +463,7 @@ mod tests { let expected = vec![0u8, 187, 61, 11, 250, 0]; let serialized = to_json_vec(&b64_str).unwrap(); - let deserialized: Binary = from_json_slice(&serialized).unwrap(); + let deserialized: Binary = from_json(&serialized).unwrap(); assert_eq!(expected, deserialized.as_slice()); } @@ -471,7 +471,7 @@ mod tests { fn deserialize_from_invalid_string() { let invalid_str = "**BAD!**"; let serialized = to_json_vec(&invalid_str).unwrap(); - let res = from_json_slice::(&serialized); + let res = from_json::(&serialized); assert!(res.is_err()); } diff --git a/packages/std/src/errors/system_error.rs b/packages/std/src/errors/system_error.rs index e67a99baa4..8d560c4132 100644 --- a/packages/std/src/errors/system_error.rs +++ b/packages/std/src/errors/system_error.rs @@ -69,7 +69,7 @@ impl core::fmt::Display for SystemError { #[cfg(test)] mod tests { use super::*; - use crate::{from_json_slice, to_json_vec}; + use crate::{from_json, to_json_vec}; #[test] fn system_error_no_such_contract_serialization() { @@ -85,7 +85,7 @@ mod tests { ); // de - let err: SystemError = from_json_slice(br#"{"no_such_contract":{"addr":"nada"}}"#).unwrap(); + let err: SystemError = from_json(br#"{"no_such_contract":{"addr":"nada"}}"#).unwrap(); assert_eq!( err, SystemError::NoSuchContract { @@ -106,7 +106,7 @@ mod tests { ); // de - let err: SystemError = from_json_slice(br#"{"no_such_code":{"code_id":987}}"#).unwrap(); + let err: SystemError = from_json(br#"{"no_such_code":{"code_id":987}}"#).unwrap(); assert_eq!(err, SystemError::NoSuchCode { code_id: 987 },); } } diff --git a/packages/std/src/exports.rs b/packages/std/src/exports.rs index 53842ad00e..ad33a91814 100644 --- a/packages/std/src/exports.rs +++ b/packages/std/src/exports.rs @@ -25,7 +25,7 @@ use crate::memory::{alloc, consume_region, release_buffer, Region}; use crate::panic::install_panic_handler; use crate::query::CustomQuery; use crate::results::{ContractResult, QueryResponse, Reply, Response}; -use crate::serde::{from_json_slice, to_json_vec}; +use crate::serde::{from_json, to_json_vec}; use crate::types::Env; use crate::{CustomMsg, Deps, DepsMut, MessageInfo}; @@ -415,9 +415,9 @@ where let info: Vec = unsafe { consume_region(info_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_json_slice(&env)); - let info: MessageInfo = try_into_contract_result!(from_json_slice(&info)); - let msg: M = try_into_contract_result!(from_json_slice(&msg)); + let env: Env = try_into_contract_result!(from_json(&env)); + let info: MessageInfo = try_into_contract_result!(from_json(&info)); + let msg: M = try_into_contract_result!(from_json(&msg)); let mut deps = make_dependencies(); instantiate_fn(deps.as_mut(), env, info, msg).into() @@ -439,9 +439,9 @@ where let info: Vec = unsafe { consume_region(info_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_json_slice(&env)); - let info: MessageInfo = try_into_contract_result!(from_json_slice(&info)); - let msg: M = try_into_contract_result!(from_json_slice(&msg)); + let env: Env = try_into_contract_result!(from_json(&env)); + let info: MessageInfo = try_into_contract_result!(from_json(&info)); + let msg: M = try_into_contract_result!(from_json(&msg)); let mut deps = make_dependencies(); execute_fn(deps.as_mut(), env, info, msg).into() @@ -461,8 +461,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_json_slice(&env)); - let msg: M = try_into_contract_result!(from_json_slice(&msg)); + let env: Env = try_into_contract_result!(from_json(&env)); + let msg: M = try_into_contract_result!(from_json(&msg)); let mut deps = make_dependencies(); migrate_fn(deps.as_mut(), env, msg).into() @@ -482,8 +482,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_json_slice(&env)); - let msg: M = try_into_contract_result!(from_json_slice(&msg)); + let env: Env = try_into_contract_result!(from_json(&env)); + let msg: M = try_into_contract_result!(from_json(&msg)); let mut deps = make_dependencies(); sudo_fn(deps.as_mut(), env, msg).into() @@ -502,8 +502,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_json_slice(&env)); - let msg: Reply = try_into_contract_result!(from_json_slice(&msg)); + let env: Env = try_into_contract_result!(from_json(&env)); + let msg: Reply = try_into_contract_result!(from_json(&msg)); let mut deps = make_dependencies(); reply_fn(deps.as_mut(), env, msg).into() @@ -522,8 +522,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_json_slice(&env)); - let msg: M = try_into_contract_result!(from_json_slice(&msg)); + let env: Env = try_into_contract_result!(from_json(&env)); + let msg: M = try_into_contract_result!(from_json(&msg)); let deps = make_dependencies(); query_fn(deps.as_ref(), env, msg).into() @@ -542,8 +542,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_json_slice(&env)); - let msg: IbcChannelOpenMsg = try_into_contract_result!(from_json_slice(&msg)); + let env: Env = try_into_contract_result!(from_json(&env)); + let msg: IbcChannelOpenMsg = try_into_contract_result!(from_json(&msg)); let mut deps = make_dependencies(); contract_fn(deps.as_mut(), env, msg).into() @@ -563,8 +563,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_json_slice(&env)); - let msg: IbcChannelConnectMsg = try_into_contract_result!(from_json_slice(&msg)); + let env: Env = try_into_contract_result!(from_json(&env)); + let msg: IbcChannelConnectMsg = try_into_contract_result!(from_json(&msg)); let mut deps = make_dependencies(); contract_fn(deps.as_mut(), env, msg).into() @@ -584,8 +584,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_json_slice(&env)); - let msg: IbcChannelCloseMsg = try_into_contract_result!(from_json_slice(&msg)); + let env: Env = try_into_contract_result!(from_json(&env)); + let msg: IbcChannelCloseMsg = try_into_contract_result!(from_json(&msg)); let mut deps = make_dependencies(); contract_fn(deps.as_mut(), env, msg).into() @@ -605,8 +605,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_json_slice(&env)); - let msg: IbcPacketReceiveMsg = try_into_contract_result!(from_json_slice(&msg)); + let env: Env = try_into_contract_result!(from_json(&env)); + let msg: IbcPacketReceiveMsg = try_into_contract_result!(from_json(&msg)); let mut deps = make_dependencies(); contract_fn(deps.as_mut(), env, msg).into() @@ -626,8 +626,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_json_slice(&env)); - let msg: IbcPacketAckMsg = try_into_contract_result!(from_json_slice(&msg)); + let env: Env = try_into_contract_result!(from_json(&env)); + let msg: IbcPacketAckMsg = try_into_contract_result!(from_json(&msg)); let mut deps = make_dependencies(); contract_fn(deps.as_mut(), env, msg).into() @@ -647,8 +647,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_json_slice(&env)); - let msg: IbcPacketTimeoutMsg = try_into_contract_result!(from_json_slice(&msg)); + let env: Env = try_into_contract_result!(from_json(&env)); + let msg: IbcPacketTimeoutMsg = try_into_contract_result!(from_json(&msg)); let mut deps = make_dependencies(); contract_fn(deps.as_mut(), env, msg).into() diff --git a/packages/std/src/hex_binary.rs b/packages/std/src/hex_binary.rs index 7c6074b818..223fae6a4c 100644 --- a/packages/std/src/hex_binary.rs +++ b/packages/std/src/hex_binary.rs @@ -247,7 +247,7 @@ impl<'de> de::Visitor<'de> for HexVisitor { mod tests { use super::*; - use crate::{assert_hash_works, from_json_slice, to_json_vec, StdError}; + use crate::{assert_hash_works, from_json, to_json_vec, StdError}; #[test] fn from_hex_works() { @@ -376,7 +376,7 @@ mod tests { } #[test] - fn from_json_slice_works() { + fn from_json_works() { let original: &[u8] = &[0u8, 187, 61, 11, 250, 0]; let binary: HexBinary = original.into(); assert_eq!(binary.as_slice(), [0u8, 187, 61, 11, 250, 0]); @@ -516,7 +516,7 @@ mod tests { let binary = HexBinary(vec![0u8, 187, 61, 11, 250, 0]); let json = to_json_vec(&binary).unwrap(); - let deserialized: HexBinary = from_json_slice(&json).unwrap(); + let deserialized: HexBinary = from_json(&json).unwrap(); assert_eq!(binary, deserialized); } @@ -528,7 +528,7 @@ mod tests { let expected = vec![0u8, 187, 61, 11, 250, 0]; let serialized = to_json_vec(&hex).unwrap(); - let deserialized: HexBinary = from_json_slice(&serialized).unwrap(); + let deserialized: HexBinary = from_json(&serialized).unwrap(); assert_eq!(expected, deserialized.as_slice()); } @@ -536,7 +536,7 @@ mod tests { fn deserialize_from_invalid_string() { let invalid_str = "**BAD!**"; let serialized = to_json_vec(&invalid_str).unwrap(); - let res = from_json_slice::(&serialized); + let res = from_json::(&serialized); assert!(res.is_err()); } diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index d281e89e25..fbe891c8ca 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -8,7 +8,7 @@ use crate::results::SystemResult; #[cfg(feature = "iterator")] use crate::sections::decode_sections2; use crate::sections::encode_sections; -use crate::serde::from_json_slice; +use crate::serde::from_json; use crate::traits::{Api, Querier, QuerierResult, Storage}; #[cfg(feature = "iterator")] use crate::{ @@ -498,7 +498,7 @@ impl Querier for ExternalQuerier { let response_ptr = unsafe { query_chain(request_ptr) }; let response = unsafe { consume_region(response_ptr as *mut Region) }; - from_json_slice(&response).unwrap_or_else(|parsing_err| { + from_json(&response).unwrap_or_else(|parsing_err| { SystemResult::Err(SystemError::InvalidResponse { error: parsing_err.to_string(), response: response.into(), diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 9dd0bd1598..ac4b9d696c 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -90,8 +90,8 @@ pub use crate::results::{DistributionMsg, StakingMsg}; pub use crate::results::{GovMsg, VoteOption}; #[allow(deprecated)] pub use crate::serde::{ - from_binary, from_json_binary, from_json_slice, from_json_str, from_slice, to_binary, - to_json_binary, to_json_string, to_json_vec, to_vec, + from_binary, from_json, from_slice, to_binary, to_json_binary, to_json_string, to_json_vec, + to_vec, }; pub use crate::stdack::StdAck; pub use crate::storage::MemoryStorage; diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index cd1364eff4..f402613621 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -781,7 +781,7 @@ impl<'de> de::Visitor<'de> for DecimalVisitor { #[cfg(test)] mod tests { use super::*; - use crate::{from_json_slice, to_json_vec}; + use crate::{from_json, to_json_vec}; fn dec(input: &str) -> Decimal { Decimal::from_str(input).unwrap() @@ -1918,37 +1918,25 @@ mod tests { #[test] fn decimal_deserialize() { - assert_eq!( - from_json_slice::(br#""0""#).unwrap(), - Decimal::zero() - ); - assert_eq!( - from_json_slice::(br#""1""#).unwrap(), - Decimal::one() - ); - assert_eq!( - from_json_slice::(br#""000""#).unwrap(), - Decimal::zero() - ); - assert_eq!( - from_json_slice::(br#""001""#).unwrap(), - Decimal::one() - ); + assert_eq!(from_json::(br#""0""#).unwrap(), Decimal::zero()); + assert_eq!(from_json::(br#""1""#).unwrap(), Decimal::one()); + assert_eq!(from_json::(br#""000""#).unwrap(), Decimal::zero()); + assert_eq!(from_json::(br#""001""#).unwrap(), Decimal::one()); assert_eq!( - from_json_slice::(br#""0.08""#).unwrap(), + from_json::(br#""0.08""#).unwrap(), Decimal::percent(8) ); assert_eq!( - from_json_slice::(br#""0.87""#).unwrap(), + from_json::(br#""0.87""#).unwrap(), Decimal::percent(87) ); assert_eq!( - from_json_slice::(br#""8.76""#).unwrap(), + from_json::(br#""8.76""#).unwrap(), Decimal::percent(876) ); assert_eq!( - from_json_slice::(br#""87.65""#).unwrap(), + from_json::(br#""87.65""#).unwrap(), Decimal::percent(8765) ); } diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 91f44d46bc..cfa58f8211 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -797,7 +797,7 @@ impl<'de> de::Visitor<'de> for Decimal256Visitor { mod tests { use super::*; use crate::errors::StdError; - use crate::{from_json_slice, to_json_vec}; + use crate::{from_json, to_json_vec}; fn dec(input: &str) -> Decimal256 { Decimal256::from_str(input).unwrap() @@ -2037,36 +2037,36 @@ mod tests { #[test] fn decimal256_deserialize() { assert_eq!( - from_json_slice::(br#""0""#).unwrap(), + from_json::(br#""0""#).unwrap(), Decimal256::zero() ); assert_eq!( - from_json_slice::(br#""1""#).unwrap(), + from_json::(br#""1""#).unwrap(), Decimal256::one() ); assert_eq!( - from_json_slice::(br#""000""#).unwrap(), + from_json::(br#""000""#).unwrap(), Decimal256::zero() ); assert_eq!( - from_json_slice::(br#""001""#).unwrap(), + from_json::(br#""001""#).unwrap(), Decimal256::one() ); assert_eq!( - from_json_slice::(br#""0.08""#).unwrap(), + from_json::(br#""0.08""#).unwrap(), Decimal256::percent(8) ); assert_eq!( - from_json_slice::(br#""0.87""#).unwrap(), + from_json::(br#""0.87""#).unwrap(), Decimal256::percent(87) ); assert_eq!( - from_json_slice::(br#""8.76""#).unwrap(), + from_json::(br#""8.76""#).unwrap(), Decimal256::percent(876) ); assert_eq!( - from_json_slice::(br#""87.65""#).unwrap(), + from_json::(br#""87.65""#).unwrap(), Decimal256::percent(8765) ); } diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index 81944fcd65..a0e28019c1 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -570,7 +570,7 @@ where #[cfg(test)] mod tests { use super::*; - use crate::{from_json_slice, math::conversion::test_try_from_uint_to_int, to_json_vec}; + use crate::{from_json, math::conversion::test_try_from_uint_to_int, to_json_vec}; #[test] fn size_of_works() { @@ -824,7 +824,7 @@ mod tests { let orig = Int128::from(1234567890987654321i128); let serialized = to_json_vec(&orig).unwrap(); assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); - let parsed: Int128 = from_json_slice(&serialized).unwrap(); + let parsed: Int128 = from_json(&serialized).unwrap(); assert_eq!(parsed, orig); } diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index 060f99b283..77f9878722 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -645,7 +645,7 @@ where #[cfg(test)] mod tests { use super::*; - use crate::{from_json_slice, math::conversion::test_try_from_uint_to_int, to_json_vec}; + use crate::{from_json, math::conversion::test_try_from_uint_to_int, to_json_vec}; #[test] fn size_of_works() { @@ -931,7 +931,7 @@ mod tests { let orig = Int256::from(1234567890987654321u128); let serialized = to_json_vec(&orig).unwrap(); assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); - let parsed: Int256 = from_json_slice(&serialized).unwrap(); + let parsed: Int256 = from_json(&serialized).unwrap(); assert_eq!(parsed, orig); } diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index 3209748a4b..ceb7829b5a 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -642,7 +642,7 @@ where #[cfg(test)] mod tests { use super::*; - use crate::{from_json_slice, math::conversion::test_try_from_uint_to_int, to_json_vec}; + use crate::{from_json, math::conversion::test_try_from_uint_to_int, to_json_vec}; #[test] fn size_of_works() { @@ -959,7 +959,7 @@ mod tests { let orig = Int512::from(1234567890987654321u128); let serialized = to_json_vec(&orig).unwrap(); assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); - let parsed: Int512 = from_json_slice(&serialized).unwrap(); + let parsed: Int512 = from_json(&serialized).unwrap(); assert_eq!(parsed, orig); } diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index 6c8367b279..2763d68a59 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -549,7 +549,7 @@ where #[cfg(test)] mod tests { use super::*; - use crate::{from_json_slice, math::conversion::test_try_from_uint_to_int, to_json_vec}; + use crate::{from_json, math::conversion::test_try_from_uint_to_int, to_json_vec}; #[test] fn size_of_works() { @@ -796,7 +796,7 @@ mod tests { let orig = Int64::from(1234567890987654321i64); let serialized = to_json_vec(&orig).unwrap(); assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); - let parsed: Int64 = from_json_slice(&serialized).unwrap(); + let parsed: Int64 = from_json(&serialized).unwrap(); assert_eq!(parsed, orig); } diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index f06315ac33..93e47ab95a 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -617,7 +617,7 @@ where mod tests { use crate::errors::CheckedMultiplyFractionError::{ConversionOverflow, DivideByZero}; use crate::math::conversion::test_try_from_int_to_uint; - use crate::{from_json_slice, to_json_vec, ConversionOverflowError, Decimal}; + use crate::{from_json, to_json_vec, ConversionOverflowError, Decimal}; use super::*; @@ -791,7 +791,7 @@ mod tests { let orig = Uint128(1234567890987654321); let serialized = to_json_vec(&orig).unwrap(); assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); - let parsed: Uint128 = from_json_slice(&serialized).unwrap(); + let parsed: Uint128 = from_json(&serialized).unwrap(); assert_eq!(parsed, orig); } diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 55da7e6364..f12e327e33 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -680,7 +680,7 @@ mod tests { use super::*; use crate::errors::CheckedMultiplyFractionError::{ConversionOverflow, DivideByZero}; use crate::math::conversion::test_try_from_int_to_uint; - use crate::{from_json_slice, to_json_vec, Decimal, Decimal256}; + use crate::{from_json, to_json_vec, Decimal, Decimal256}; #[test] fn size_of_works() { @@ -1308,7 +1308,7 @@ mod tests { let orig = Uint256::from(1234567890987654321u128); let serialized = to_json_vec(&orig).unwrap(); assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); - let parsed: Uint256 = from_json_slice(&serialized).unwrap(); + let parsed: Uint256 = from_json(&serialized).unwrap(); assert_eq!(parsed, orig); } diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index 0096d2f6d3..18583d1f4e 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -646,7 +646,7 @@ where #[cfg(test)] mod tests { use super::*; - use crate::{from_json_slice, math::conversion::test_try_from_int_to_uint, to_json_vec}; + use crate::{from_json, math::conversion::test_try_from_int_to_uint, to_json_vec}; #[test] fn size_of_works() { @@ -1014,7 +1014,7 @@ mod tests { let orig = Uint512::from(1234567890987654321u128); let serialized = to_json_vec(&orig).unwrap(); assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); - let parsed: Uint512 = from_json_slice(&serialized).unwrap(); + let parsed: Uint512 = from_json(&serialized).unwrap(); assert_eq!(parsed, orig); } diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index 1d59580a82..b047c3e6a4 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -579,7 +579,7 @@ mod tests { use super::*; use crate::errors::CheckedMultiplyFractionError::{ConversionOverflow, DivideByZero}; use crate::math::conversion::test_try_from_int_to_uint; - use crate::{from_json_slice, to_json_vec, ConversionOverflowError}; + use crate::{from_json, to_json_vec, ConversionOverflowError}; #[test] fn size_of_works() { @@ -712,7 +712,7 @@ mod tests { let orig = Uint64(1234567890987654321); let serialized = to_json_vec(&orig).unwrap(); assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); - let parsed: Uint64 = from_json_slice(&serialized).unwrap(); + let parsed: Uint64 = from_json(&serialized).unwrap(); assert_eq!(parsed, orig); } diff --git a/packages/std/src/results/contract_result.rs b/packages/std/src/results/contract_result.rs index 69996389a4..a55c32e3c4 100644 --- a/packages/std/src/results/contract_result.rs +++ b/packages/std/src/results/contract_result.rs @@ -88,7 +88,7 @@ impl From> for Result { #[cfg(test)] mod tests { use super::*; - use crate::{from_json_slice, to_json_vec, Response, StdError, StdResult}; + use crate::{from_json, to_json_vec, Response, StdError, StdResult}; #[test] fn contract_result_serialization_works() { @@ -110,39 +110,37 @@ mod tests { #[test] fn contract_result_deserialization_works() { - let result: ContractResult = from_json_slice(br#"{"ok":12}"#).unwrap(); + let result: ContractResult = from_json(br#"{"ok":12}"#).unwrap(); assert_eq!(result, ContractResult::Ok(12)); - let result: ContractResult = from_json_slice(br#"{"ok":"foo"}"#).unwrap(); + let result: ContractResult = from_json(br#"{"ok":"foo"}"#).unwrap(); assert_eq!(result, ContractResult::Ok("foo".to_string())); let result: ContractResult = - from_json_slice(br#"{"ok":{"messages":[],"attributes":[],"events":[],"data":null}}"#) + from_json(br#"{"ok":{"messages":[],"attributes":[],"events":[],"data":null}}"#) .unwrap(); assert_eq!(result, ContractResult::Ok(Response::default())); - let result: ContractResult = from_json_slice(br#"{"error":"broken"}"#).unwrap(); + let result: ContractResult = from_json(br#"{"error":"broken"}"#).unwrap(); assert_eq!(result, ContractResult::Err("broken".to_string())); // ignores whitespace - let result: ContractResult = from_json_slice(b" {\n\t \"ok\": 5898\n} ").unwrap(); + let result: ContractResult = from_json(b" {\n\t \"ok\": 5898\n} ").unwrap(); assert_eq!(result, ContractResult::Ok(5898)); // fails for additional attributes - let parse: StdResult> = - from_json_slice(br#"{"unrelated":321,"ok":4554}"#); + let parse: StdResult> = from_json(br#"{"unrelated":321,"ok":4554}"#); match parse.unwrap_err() { StdError::ParseErr { .. } => {} err => panic!("Unexpected error: {err:?}"), } - let parse: StdResult> = - from_json_slice(br#"{"ok":4554,"unrelated":321}"#); + let parse: StdResult> = from_json(br#"{"ok":4554,"unrelated":321}"#); match parse.unwrap_err() { StdError::ParseErr { .. } => {} err => panic!("Unexpected error: {err:?}"), } let parse: StdResult> = - from_json_slice(br#"{"ok":4554,"error":"What's up now?"}"#); + from_json(br#"{"ok":4554,"error":"What's up now?"}"#); match parse.unwrap_err() { StdError::ParseErr { .. } => {} err => panic!("Unexpected error: {err:?}"), diff --git a/packages/std/src/results/empty.rs b/packages/std/src/results/empty.rs index 21cf6f26af..91e3b581bf 100644 --- a/packages/std/src/results/empty.rs +++ b/packages/std/src/results/empty.rs @@ -14,7 +14,7 @@ pub struct Empty {} mod tests { use super::*; - use crate::serde::{from_json_slice, to_json_vec}; + use crate::serde::{from_json, to_json_vec}; #[test] fn empty_can_be_instantiated() { @@ -28,10 +28,10 @@ mod tests { let serialized = to_json_vec(&instance).unwrap(); assert_eq!(serialized, b"{}"); - let deserialized: Empty = from_json_slice(b"{}").unwrap(); + let deserialized: Empty = from_json(b"{}").unwrap(); assert_eq!(deserialized, instance); - let deserialized: Empty = from_json_slice(b"{\"stray\":\"data\"}").unwrap(); + let deserialized: Empty = from_json(b"{\"stray\":\"data\"}").unwrap(); assert_eq!(deserialized, instance); } } diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index 9c4228aeee..300066b8a5 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -235,7 +235,7 @@ mod tests { use super::super::BankMsg; use super::*; use crate::results::submessages::{ReplyOn, UNUSED_MSG_ID}; - use crate::{coins, from_json_slice, to_json_vec, ContractResult}; + use crate::{coins, from_json, to_json_vec, ContractResult}; #[test] fn response_add_attributes_works() { @@ -309,7 +309,7 @@ mod tests { data: Some(Binary::from([0xAA, 0xBB])), }; let serialized = to_json_vec(&original).expect("encode contract result"); - let deserialized: Response = from_json_slice(&serialized).expect("decode contract result"); + let deserialized: Response = from_json(&serialized).expect("decode contract result"); assert_eq!(deserialized, original); } diff --git a/packages/std/src/results/submessages.rs b/packages/std/src/results/submessages.rs index 4892b19009..df340d7995 100644 --- a/packages/std/src/results/submessages.rs +++ b/packages/std/src/results/submessages.rs @@ -205,7 +205,7 @@ pub type SubMsgExecutionResponse = SubMsgResponse; #[cfg(test)] mod tests { use super::*; - use crate::{from_json_slice, to_json_vec, StdError, StdResult}; + use crate::{from_json, to_json_vec, StdError, StdResult}; #[test] fn sub_msg_result_serialization_works() { @@ -233,7 +233,7 @@ mod tests { #[test] fn sub_msg_result_deserialization_works() { - let result: SubMsgResult = from_json_slice(br#"{"ok":{"events":[],"data":null}}"#).unwrap(); + let result: SubMsgResult = from_json(br#"{"ok":{"events":[],"data":null}}"#).unwrap(); assert_eq!( result, SubMsgResult::Ok(SubMsgResponse { @@ -242,7 +242,7 @@ mod tests { }) ); - let result: SubMsgResult = from_json_slice( + let result: SubMsgResult = from_json( br#"{"ok":{"events":[{"type":"wasm","attributes":[{"key":"fo","value":"ba"}]}],"data":"MTIzCg=="}}"#).unwrap(); assert_eq!( result, @@ -252,18 +252,16 @@ mod tests { }) ); - let result: SubMsgResult = from_json_slice(br#"{"error":"broken"}"#).unwrap(); + let result: SubMsgResult = from_json(br#"{"error":"broken"}"#).unwrap(); assert_eq!(result, SubMsgResult::Err("broken".to_string())); // fails for additional attributes - let parse: StdResult = - from_json_slice(br#"{"unrelated":321,"error":"broken"}"#); + let parse: StdResult = from_json(br#"{"unrelated":321,"error":"broken"}"#); match parse.unwrap_err() { StdError::ParseErr { .. } => {} err => panic!("Unexpected error: {err:?}"), } - let parse: StdResult = - from_json_slice(br#"{"error":"broken","unrelated":321}"#); + let parse: StdResult = from_json(br#"{"error":"broken","unrelated":321}"#); match parse.unwrap_err() { StdError::ParseErr { .. } => {} err => panic!("Unexpected error: {err:?}"), diff --git a/packages/std/src/serde.rs b/packages/std/src/serde.rs index 13da4428b1..23793698b6 100644 --- a/packages/std/src/serde.rs +++ b/packages/std/src/serde.rs @@ -8,35 +8,22 @@ use serde::{de::DeserializeOwned, Serialize}; use crate::binary::Binary; use crate::errors::{StdError, StdResult}; -#[deprecated = "use from_json_slice instead"] +#[deprecated = "use from_json instead"] pub fn from_slice(value: &[u8]) -> StdResult { - from_json_slice(value) + from_json(value) } -#[deprecated = "use from_json_binary instead"] +#[deprecated = "use from_json instead"] pub fn from_binary(value: &Binary) -> StdResult { - from_json_binary(value) -} - -/// Deserializes the given JSON byte vector to a data structure. -/// -/// Errors if the input is not valid JSON or cannot be deserialized to the given type. -pub fn from_json_slice(value: &[u8]) -> StdResult { - serde_json_wasm::from_slice(value).map_err(|e| StdError::parse_err(type_name::(), e)) -} - -/// Deserializes the given JSON bytes to a data structure. -/// -/// Errors if the input is not valid JSON or cannot be deserialized to the given type. -pub fn from_json_str(value: &str) -> StdResult { - serde_json_wasm::from_str(value).map_err(|e| StdError::parse_err(type_name::(), e)) + from_json(value) } /// Deserializes the given JSON bytes to a data structure. /// /// Errors if the input is not valid JSON or cannot be deserialized to the given type. -pub fn from_json_binary(value: &Binary) -> StdResult { - from_json_slice(value.as_slice()) +pub fn from_json(value: impl AsRef<[u8]>) -> StdResult { + serde_json_wasm::from_slice(value.as_ref()) + .map_err(|e| StdError::parse_err(type_name::(), e)) } #[deprecated = "use to_json_vec instead"] @@ -119,34 +106,40 @@ mod tests { } #[test] - fn from_json_slice_works() { - let deserialized: SomeMsg = from_json_slice(br#"{"refund":{}}"#).unwrap(); + fn from_json_works() { + let deserialized: SomeMsg = from_json(br#"{"refund":{}}"#).unwrap(); assert_eq!(deserialized, SomeMsg::Refund {}); - let deserialized: SomeMsg = from_json_slice( + let expected = SomeMsg::ReleaseAll { + image: "foo".to_string(), + amount: 42, + time: 18446744073709551615, + karma: -17, + }; + // &[u8] + let deserialized: SomeMsg = from_json( br#"{"release_all":{"image":"foo","amount":42,"time":18446744073709551615,"karma":-17}}"#, ) .unwrap(); - assert_eq!( - deserialized, - SomeMsg::ReleaseAll { - image: "foo".to_string(), - amount: 42, - time: 18446744073709551615, - karma: -17 - } - ); + assert_eq!(deserialized, expected); + + // &str + let deserialized: SomeMsg = from_json( + r#"{"release_all":{"image":"foo","amount":42,"time":18446744073709551615,"karma":-17}}"#, + ) + .unwrap(); + assert_eq!(deserialized, expected); } #[test] - fn from_json_slice_or_binary() { + fn from_json_or_binary() { let msg = SomeMsg::Refund {}; let serialized: Binary = to_json_binary(&msg).unwrap(); - let parse_binary: SomeMsg = from_json_binary(&serialized).unwrap(); + let parse_binary: SomeMsg = from_json(&serialized).unwrap(); assert_eq!(parse_binary, msg); - let parse_slice: SomeMsg = from_json_slice(&serialized).unwrap(); + let parse_slice: SomeMsg = from_json(serialized.as_slice()).unwrap(); assert_eq!(parse_slice, msg); } @@ -160,9 +153,8 @@ mod tests { } #[test] - fn from_json_slice_works_for_special_chars() { - let deserialized: SomeMsg = - from_json_slice(br#"{"cowsay":{"text":"foo\"bar\\\"bla"}}"#).unwrap(); + fn from_json_works_for_special_chars() { + let deserialized: SomeMsg = from_json(br#"{"cowsay":{"text":"foo\"bar\\\"bla"}}"#).unwrap(); assert_eq!( deserialized, SomeMsg::Cowsay { @@ -171,27 +163,6 @@ mod tests { ); } - #[test] - fn from_json_str_works() { - let deserialized: SomeMsg = from_json_str(r#"{"refund":{}}"#).unwrap(); - assert_eq!(deserialized, SomeMsg::Refund {}); - - let deserialized: SomeMsg = from_json_str( - r#"{"release_all":{"image":"foo","amount":42,"time":18446744073709551615,"karma":-17}}"#, - ) - .unwrap(); - - assert_eq!( - deserialized, - SomeMsg::ReleaseAll { - image: "foo".to_string(), - amount: 42, - time: 18446744073709551615, - karma: -17 - } - ); - } - #[test] fn to_json_string_works() { let msg = SomeMsg::Refund {}; diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index a635a07b9a..3aea470caa 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -34,7 +34,7 @@ use crate::query::{ #[cfg(feature = "cosmwasm_1_3")] use crate::query::{DelegatorWithdrawAddressResponse, DistributionQuery}; use crate::results::{ContractResult, Empty, SystemResult}; -use crate::serde::{from_json_slice, to_json_binary}; +use crate::serde::{from_json, to_json_binary}; use crate::storage::MemoryStorage; use crate::timestamp::Timestamp; use crate::traits::{Api, Querier, QuerierResult}; @@ -561,7 +561,7 @@ impl Default for MockQuerier { impl Querier for MockQuerier { fn raw_query(&self, bin_request: &[u8]) -> QuerierResult { - let request: QueryRequest = match from_json_slice(bin_request) { + let request: QueryRequest = match from_json(bin_request) { Ok(v) => v, Err(e) => { return SystemResult::Err(SystemError::InvalidRequest { @@ -1109,7 +1109,7 @@ mod tests { use super::*; #[cfg(feature = "cosmwasm_1_3")] use crate::DenomUnit; - use crate::{coin, coins, from_json_binary, to_json_binary, ContractInfoResponse, Response}; + use crate::{coin, coins, from_json, to_json_binary, ContractInfoResponse, Response}; #[cfg(feature = "staking")] use crate::{Decimal, Delegation}; use hex_literal::hex; @@ -1442,7 +1442,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: SupplyResponse = from_json_binary(&elf).unwrap(); + let res: SupplyResponse = from_json(&elf).unwrap(); assert_eq!(res.amount, coin(444, "ELF")); let fly = bank @@ -1451,7 +1451,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: SupplyResponse = from_json_binary(&fly).unwrap(); + let res: SupplyResponse = from_json(&fly).unwrap(); assert_eq!(res.amount, coin(777, "FLY")); // if a denom does not exist, should return zero amount, instead of throwing an error @@ -1461,7 +1461,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: SupplyResponse = from_json_binary(&atom).unwrap(); + let res: SupplyResponse = from_json(&atom).unwrap(); assert_eq!(res.amount, coin(0, "ATOM")); } @@ -1475,7 +1475,7 @@ mod tests { .query(&BankQuery::AllBalances { address: addr }) .unwrap() .unwrap(); - let res: AllBalanceResponse = from_json_binary(&all).unwrap(); + let res: AllBalanceResponse = from_json(&all).unwrap(); assert_eq!(&res.amount, &balance); } @@ -1493,7 +1493,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: BalanceResponse = from_json_binary(&fly).unwrap(); + let res: BalanceResponse = from_json(&fly).unwrap(); assert_eq!(res.amount, coin(777, "FLY")); // missing denom @@ -1504,7 +1504,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: BalanceResponse = from_json_binary(&miss).unwrap(); + let res: BalanceResponse = from_json(&miss).unwrap(); assert_eq!(res.amount, coin(0, "MISS")); } @@ -1521,7 +1521,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: AllBalanceResponse = from_json_binary(&all).unwrap(); + let res: AllBalanceResponse = from_json(&all).unwrap(); assert_eq!(res.amount, vec![]); // any denom on balances on empty account is empty coin @@ -1532,7 +1532,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: BalanceResponse = from_json_binary(&miss).unwrap(); + let res: BalanceResponse = from_json(&miss).unwrap(); assert_eq!(res.amount, coin(0, "ELF")); } @@ -1570,7 +1570,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: AllDenomMetadataResponse = from_json_binary(&res).unwrap(); + let res: AllDenomMetadataResponse = from_json(&res).unwrap(); assert_eq!(res.metadata.len(), 10); assert!(res.next_key.is_some()); @@ -1585,7 +1585,7 @@ mod tests { }) .unwrap() .unwrap(); - let res2: AllDenomMetadataResponse = from_json_binary(&res2).unwrap(); + let res2: AllDenomMetadataResponse = from_json(&res2).unwrap(); assert_eq!(res2.metadata.len(), 10); assert_ne!(res.metadata.last(), res2.metadata.first()); // should have no overlap @@ -1604,7 +1604,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: AllDenomMetadataResponse = from_json_binary(&res).unwrap(); + let res: AllDenomMetadataResponse = from_json(&res).unwrap(); assert_eq!(res.metadata.len(), 100); assert!(res.next_key.is_none(), "no more data should be available"); assert_eq!(res.metadata[0].symbol, "FOO99", "should have been reversed"); @@ -1619,7 +1619,7 @@ mod tests { }) .unwrap() .unwrap(); - let more_res: AllDenomMetadataResponse = from_json_binary(&more_res).unwrap(); + let more_res: AllDenomMetadataResponse = from_json(&more_res).unwrap(); assert_eq!( more_res.metadata, res.metadata, "should be same as previous query" @@ -1637,7 +1637,7 @@ mod tests { }; let res = distribution.query(&query).unwrap().unwrap(); - let res: DelegatorWithdrawAddressResponse = from_json_binary(&res).unwrap(); + let res: DelegatorWithdrawAddressResponse = from_json(&res).unwrap(); assert_eq!(res.withdraw_address, "withdraw0"); let query = DistributionQuery::DelegatorWithdrawAddress { @@ -1645,7 +1645,7 @@ mod tests { }; let res = distribution.query(&query).unwrap().unwrap(); - let res: DelegatorWithdrawAddressResponse = from_json_binary(&res).unwrap(); + let res: DelegatorWithdrawAddressResponse = from_json(&res).unwrap(); assert_eq!(res.withdraw_address, "addr1"); } @@ -1660,7 +1660,7 @@ mod tests { }; let res = distribution.query(&query).unwrap().unwrap(); - let res: DelegatorValidatorsResponse = from_json_binary(&res).unwrap(); + let res: DelegatorValidatorsResponse = from_json(&res).unwrap(); assert_eq!(res.validators, ["valoper1", "valoper2"]); let query = DistributionQuery::DelegatorValidators { @@ -1668,7 +1668,7 @@ mod tests { }; let res = distribution.query(&query).unwrap().unwrap(); - let res: DelegatorValidatorsResponse = from_json_binary(&res).unwrap(); + let res: DelegatorValidatorsResponse = from_json(&res).unwrap(); assert_eq!(res.validators, ([] as [String; 0])); } @@ -1690,7 +1690,7 @@ mod tests { validator_address: "valoper0".to_string(), }; let res = distribution.query(&query).unwrap().unwrap(); - let res: DelegationRewardsResponse = from_json_binary(&res).unwrap(); + let res: DelegationRewardsResponse = from_json(&res).unwrap(); assert_eq!(res.rewards, valoper0_rewards); // delegator does not exist @@ -1699,7 +1699,7 @@ mod tests { validator_address: "valoper0".to_string(), }; let res = distribution.query(&query).unwrap().unwrap(); - let res: DelegationRewardsResponse = from_json_binary(&res).unwrap(); + let res: DelegationRewardsResponse = from_json(&res).unwrap(); assert_eq!(res.rewards.len(), 0); // validator does not exist @@ -1708,7 +1708,7 @@ mod tests { validator_address: "valopernonexistent".to_string(), }; let res = distribution.query(&query).unwrap().unwrap(); - let res: DelegationRewardsResponse = from_json_binary(&res).unwrap(); + let res: DelegationRewardsResponse = from_json(&res).unwrap(); assert_eq!(res.rewards.len(), 0); // add one more validator @@ -1720,7 +1720,7 @@ mod tests { delegator_address: "addr0".to_string(), }; let res = distribution.query(&query).unwrap().unwrap(); - let res: DelegationTotalRewardsResponse = from_json_binary(&res).unwrap(); + let res: DelegationTotalRewardsResponse = from_json(&res).unwrap(); assert_eq!( res.rewards, vec![ @@ -1761,7 +1761,7 @@ mod tests { port_id: Some("my_port".to_string()), }; let raw = ibc.query(query).unwrap().unwrap(); - let chan: ChannelResponse = from_json_binary(&raw).unwrap(); + let chan: ChannelResponse = from_json(&raw).unwrap(); assert_eq!(chan.channel, Some(chan1)); } @@ -1791,7 +1791,7 @@ mod tests { port_id: Some("myport".to_string()), }; let raw = ibc.query(query).unwrap().unwrap(); - let chan: ChannelResponse = from_json_binary(&raw).unwrap(); + let chan: ChannelResponse = from_json(&raw).unwrap(); assert_eq!(chan.channel, Some(chan1)); } @@ -1809,7 +1809,7 @@ mod tests { port_id: None, }; let raw = ibc.query(query).unwrap().unwrap(); - let chan: ChannelResponse = from_json_binary(&raw).unwrap(); + let chan: ChannelResponse = from_json(&raw).unwrap(); assert_eq!(chan.channel, None); } @@ -1826,7 +1826,7 @@ mod tests { port_id: Some("my_port".to_string()), }; let raw = ibc.query(query).unwrap().unwrap(); - let res: ListChannelsResponse = from_json_binary(&raw).unwrap(); + let res: ListChannelsResponse = from_json(&raw).unwrap(); assert_eq!(res.channels, vec![chan1, chan2]); } @@ -1841,7 +1841,7 @@ mod tests { // query channels matching "myport" (should be none) let query = &IbcQuery::ListChannels { port_id: None }; let raw = ibc.query(query).unwrap().unwrap(); - let res: ListChannelsResponse = from_json_binary(&raw).unwrap(); + let res: ListChannelsResponse = from_json(&raw).unwrap(); assert_eq!(res.channels, vec![]); } @@ -1855,7 +1855,7 @@ mod tests { // query channels matching "myport" (should be none) let query = &IbcQuery::PortId {}; let raw = ibc.query(query).unwrap().unwrap(); - let res: PortIdResponse = from_json_binary(&raw).unwrap(); + let res: PortIdResponse = from_json(&raw).unwrap(); assert_eq!(res.port_id, "myport"); } @@ -1882,7 +1882,7 @@ mod tests { .query(&StakingQuery::AllValidators {}) .unwrap() .unwrap(); - let vals: AllValidatorsResponse = from_json_binary(&raw).unwrap(); + let vals: AllValidatorsResponse = from_json(&raw).unwrap(); assert_eq!(vals.validators, vec![val1, val2]); } @@ -1913,7 +1913,7 @@ mod tests { .query(&StakingQuery::Validator { address: address1 }) .unwrap() .unwrap(); - let res: ValidatorResponse = from_json_binary(&raw).unwrap(); + let res: ValidatorResponse = from_json(&raw).unwrap(); assert_eq!(res.validator, Some(val1)); // query 2 @@ -1921,7 +1921,7 @@ mod tests { .query(&StakingQuery::Validator { address: address2 }) .unwrap() .unwrap(); - let res: ValidatorResponse = from_json_binary(&raw).unwrap(); + let res: ValidatorResponse = from_json(&raw).unwrap(); assert_eq!(res.validator, Some(val2)); // query non-existent @@ -1931,7 +1931,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: ValidatorResponse = from_json_binary(&raw).unwrap(); + let res: ValidatorResponse = from_json(&raw).unwrap(); assert_eq!(res.validator, None); } @@ -1947,7 +1947,7 @@ mod tests { }) .unwrap() .unwrap(); - let dels: AllDelegationsResponse = from_json_binary(&raw).unwrap(); + let dels: AllDelegationsResponse = from_json(&raw).unwrap(); dels.delegations } @@ -1965,7 +1965,7 @@ mod tests { }) .unwrap() .unwrap(); - let dels: DelegationResponse = from_json_binary(&raw).unwrap(); + let dels: DelegationResponse = from_json(&raw).unwrap(); dels.delegation } @@ -2130,7 +2130,7 @@ mod tests { if *contract_addr == constract1 { #[derive(Deserialize)] struct MyMsg {} - let _msg: MyMsg = match from_json_binary(msg) { + let _msg: MyMsg = match from_json(msg) { Ok(msg) => msg, Err(err) => { return SystemResult::Ok(ContractResult::Err(err.to_string())) diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 2a0f22b9d4..56beac2c86 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -26,7 +26,7 @@ use crate::query::{ DistributionQuery, }; use crate::results::{ContractResult, Empty, SystemResult}; -use crate::serde::{from_json_binary, to_json_binary, to_json_vec}; +use crate::serde::{from_json, to_json_binary, to_json_vec}; use crate::ContractInfoResponse; #[cfg(feature = "cosmwasm_1_3")] use crate::{DenomMetadata, PageRequest}; @@ -250,7 +250,7 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { SystemResult::Ok(ContractResult::Err(contract_err)) => Err(StdError::generic_err( format!("Querier contract error: {contract_err}"), )), - SystemResult::Ok(ContractResult::Ok(value)) => from_json_binary(&value), + SystemResult::Ok(ContractResult::Ok(value)) => from_json(&value), } } @@ -500,7 +500,7 @@ mod tests { use super::*; use crate::testing::MockQuerier; - use crate::{coins, from_json_slice, Uint128}; + use crate::{coins, from_json, Uint128}; // this is a simple demo helper to prove we can use it fn demo_helper(_querier: &dyn Querier) -> u64 { @@ -536,7 +536,7 @@ mod tests { .raw_query(&to_json_vec(&query).unwrap()) .unwrap() .unwrap(); - let balance: BalanceResponse = from_json_slice(&raw).unwrap(); + let balance: BalanceResponse = from_json(&raw).unwrap(); assert_eq!(balance.amount.amount, Uint128::new(5)); } diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index f9f37e2a97..5463f11bf1 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -454,7 +454,7 @@ mod tests { use crate::testing::{MockApi, MockQuerier, MockStorage}; use crate::wasm_backend::{compile, make_compiling_engine}; use cosmwasm_std::{ - coins, from_json_binary, to_json_vec, AllBalanceResponse, BankQuery, Empty, QueryRequest, + coins, from_json, to_json_vec, AllBalanceResponse, BankQuery, Empty, QueryRequest, }; use wasmer::{imports, Function, Instance as WasmerInstance, Store}; @@ -899,7 +899,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let balance: AllBalanceResponse = from_json_binary(&res).unwrap(); + let balance: AllBalanceResponse = from_json(&res).unwrap(); assert_eq!(balance.amount, coins(INIT_AMOUNT, INIT_DENOM)); } diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index af50a4e9fb..0ae804f939 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -601,8 +601,8 @@ fn to_low_half(data: u32) -> u64 { mod tests { use super::*; use cosmwasm_std::{ - coins, from_json_binary, AllBalanceResponse, BankQuery, Binary, Empty, QueryRequest, - SystemError, SystemResult, WasmQuery, + coins, from_json, AllBalanceResponse, BankQuery, Binary, Empty, QueryRequest, SystemError, + SystemResult, WasmQuery, }; use hex_literal::hex; use std::ptr::NonNull; @@ -1933,11 +1933,10 @@ mod tests { let response_ptr = do_query_chain(fe_mut.as_mut(), request_ptr).unwrap(); let response = force_read(&mut fe_mut, response_ptr); - let query_result: cosmwasm_std::QuerierResult = - cosmwasm_std::from_json_slice(&response).unwrap(); + let query_result: cosmwasm_std::QuerierResult = cosmwasm_std::from_json(&response).unwrap(); let query_result_inner = query_result.unwrap(); let query_result_inner_inner = query_result_inner.unwrap(); - let parsed_again: AllBalanceResponse = from_json_binary(&query_result_inner_inner).unwrap(); + let parsed_again: AllBalanceResponse = from_json(&query_result_inner_inner).unwrap(); assert_eq!(parsed_again.amount, coins(INIT_AMOUNT, INIT_DENOM)); } @@ -1955,8 +1954,7 @@ mod tests { let response_ptr = do_query_chain(fe_mut.as_mut(), request_ptr).unwrap(); let response = force_read(&mut fe_mut, response_ptr); - let query_result: cosmwasm_std::QuerierResult = - cosmwasm_std::from_json_slice(&response).unwrap(); + let query_result: cosmwasm_std::QuerierResult = cosmwasm_std::from_json(&response).unwrap(); match query_result { SystemResult::Ok(_) => panic!("This must not succeed"), SystemResult::Err(SystemError::InvalidRequest { request: err, .. }) => { @@ -1984,8 +1982,7 @@ mod tests { let response_ptr = do_query_chain(fe_mut.as_mut(), request_ptr).unwrap(); let response = force_read(&mut fe_mut, response_ptr); - let query_result: cosmwasm_std::QuerierResult = - cosmwasm_std::from_json_slice(&response).unwrap(); + let query_result: cosmwasm_std::QuerierResult = cosmwasm_std::from_json(&response).unwrap(); match query_result { SystemResult::Ok(_) => panic!("This must not succeed"), SystemResult::Err(SystemError::NoSuchContract { addr }) => { diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 02d55ef364..677180ab17 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -515,8 +515,7 @@ mod tests { mock_instance_with_options, MockInstanceOptions, }; use cosmwasm_std::{ - coin, coins, from_json_binary, AllBalanceResponse, BalanceResponse, BankQuery, Empty, - QueryRequest, + coin, coins, from_json, AllBalanceResponse, BalanceResponse, BankQuery, Empty, QueryRequest, }; use wasmer::{FunctionEnv, FunctionEnvMut}; @@ -971,7 +970,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let BalanceResponse { amount } = from_json_binary(&response).unwrap(); + let BalanceResponse { amount } = from_json(&response).unwrap(); assert_eq!(amount.amount.u128(), 8000); assert_eq!(amount.denom, "silver"); Ok(()) @@ -992,7 +991,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let AllBalanceResponse { amount } = from_json_binary(&response).unwrap(); + let AllBalanceResponse { amount } = from_json(&response).unwrap(); assert_eq!(amount.len(), 2); assert_eq!(amount[0].amount.u128(), 10000); assert_eq!(amount[0].denom, "gold"); @@ -1027,7 +1026,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let BalanceResponse { amount } = from_json_binary(&response).unwrap(); + let BalanceResponse { amount } = from_json(&response).unwrap(); assert_eq!(amount.amount.u128(), 500); Ok(()) }) @@ -1056,7 +1055,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let BalanceResponse { amount } = from_json_binary(&response).unwrap(); + let BalanceResponse { amount } = from_json(&response).unwrap(); assert_eq!(amount.amount.u128(), 8000); Ok(()) }) diff --git a/packages/vm/src/testing/querier.rs b/packages/vm/src/testing/querier.rs index b3aa185d1a..e5933637dd 100644 --- a/packages/vm/src/testing/querier.rs +++ b/packages/vm/src/testing/querier.rs @@ -113,9 +113,7 @@ impl MockQuerier { #[cfg(test)] mod tests { use super::*; - use cosmwasm_std::{ - coin, from_json_binary, AllBalanceResponse, BalanceResponse, BankQuery, Empty, - }; + use cosmwasm_std::{coin, from_json, AllBalanceResponse, BalanceResponse, BankQuery, Empty}; const DEFAULT_QUERY_GAS_LIMIT: u64 = 300_000; @@ -149,7 +147,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let res: AllBalanceResponse = from_json_binary(&all).unwrap(); + let res: AllBalanceResponse = from_json(&all).unwrap(); assert_eq!(&res.amount, &balance); } @@ -173,7 +171,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let res: BalanceResponse = from_json_binary(&fly).unwrap(); + let res: BalanceResponse = from_json(&fly).unwrap(); assert_eq!(res.amount, coin(777, "FLY")); // missing denom @@ -190,7 +188,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let res: BalanceResponse = from_json_binary(&miss).unwrap(); + let res: BalanceResponse = from_json(&miss).unwrap(); assert_eq!(res.amount, coin(0, "MISS")); } @@ -213,7 +211,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let res: AllBalanceResponse = from_json_binary(&all).unwrap(); + let res: AllBalanceResponse = from_json(&all).unwrap(); assert_eq!(res.amount, vec![]); // any denom on balances on empty account is empty coin @@ -230,7 +228,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let res: BalanceResponse = from_json_binary(&miss).unwrap(); + let res: BalanceResponse = from_json(&miss).unwrap(); assert_eq!(res.amount, coin(0, "ELF")); } } From 2007e7adc1ca12461af58c2865764919b409c635 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 22 Sep 2023 14:55:03 +0200 Subject: [PATCH 0737/2372] Fix clippy --- contracts/crypto-verify/src/contract.rs | 26 +++++----- contracts/cyberpunk/src/contract.rs | 4 +- contracts/cyberpunk/tests/integration.rs | 4 +- contracts/floaty/src/contract.rs | 8 +-- contracts/hackatom/src/contract.rs | 10 ++-- contracts/hackatom/tests/integration.rs | 4 +- contracts/ibc-reflect-send/src/ibc.rs | 12 ++--- contracts/ibc-reflect-send/src/state.rs | 6 +-- contracts/ibc-reflect/src/contract.rs | 18 +++---- contracts/ibc-reflect/src/state.rs | 6 +-- contracts/queue/src/contract.rs | 4 +- contracts/queue/tests/integration.rs | 8 +-- contracts/reflect/src/contract.rs | 12 ++--- contracts/reflect/src/state.rs | 4 +- contracts/reflect/src/testing.rs | 4 +- contracts/reflect/tests/integration.rs | 12 ++--- contracts/staking/src/state.rs | 4 +- contracts/staking/tests/integration.rs | 8 +-- packages/std/src/binary.rs | 4 +- packages/std/src/exports.rs | 52 +++++++++---------- packages/std/src/hex_binary.rs | 4 +- packages/std/src/math/int128.rs | 2 +- packages/std/src/math/int256.rs | 2 +- packages/std/src/math/int512.rs | 2 +- packages/std/src/math/int64.rs | 2 +- packages/std/src/math/uint128.rs | 2 +- packages/std/src/math/uint256.rs | 2 +- packages/std/src/math/uint512.rs | 2 +- packages/std/src/math/uint64.rs | 2 +- packages/std/src/results/response.rs | 2 +- packages/std/src/testing/mock.rs | 64 ++++++++++++------------ packages/std/src/traits.rs | 4 +- packages/vm/src/environment.rs | 2 +- packages/vm/src/imports.rs | 8 +-- packages/vm/src/instance.rs | 8 +-- packages/vm/src/testing/querier.rs | 10 ++-- 36 files changed, 164 insertions(+), 164 deletions(-) diff --git a/contracts/crypto-verify/src/contract.rs b/contracts/crypto-verify/src/contract.rs index e2601d47d4..41fe879201 100644 --- a/contracts/crypto-verify/src/contract.rs +++ b/contracts/crypto-verify/src/contract.rs @@ -274,7 +274,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_json(&raw).unwrap(); + let res: VerifyResponse = from_json(raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -296,7 +296,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_json(&raw).unwrap(); + let res: VerifyResponse = from_json(raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: false }); } @@ -339,7 +339,7 @@ mod tests { signer_address: signer_address.into(), }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_json(&raw).unwrap(); + let res: VerifyResponse = from_json(raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -360,7 +360,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_json(&raw).unwrap(); + let res: VerifyResponse = from_json(raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: false }); } @@ -380,7 +380,7 @@ mod tests { signer_address: signer_address.into(), }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_json(&raw).unwrap(); + let res: VerifyResponse = from_json(raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: false }); // Broken signature @@ -447,7 +447,7 @@ mod tests { v, }; let raw = query(deps.as_ref(), mock_env(), msg).unwrap(); - let res: VerifyResponse = from_json(&raw).unwrap(); + let res: VerifyResponse = from_json(raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -475,7 +475,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_json(&raw).unwrap(); + let res: VerifyResponse = from_json(raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -508,7 +508,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_json(&raw).unwrap(); + let res: VerifyResponse = from_json(raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -542,7 +542,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_json(&raw).unwrap(); + let res: VerifyResponse = from_json(raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -573,7 +573,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_json(&raw).unwrap(); + let res: VerifyResponse = from_json(raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: false }); } @@ -626,7 +626,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_json(&raw).unwrap(); + let res: VerifyResponse = from_json(raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -648,7 +648,7 @@ mod tests { }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_json(&raw).unwrap(); + let res: VerifyResponse = from_json(raw).unwrap(); assert_eq!(res, VerifyResponse { verifies: false }); } @@ -683,7 +683,7 @@ mod tests { let query_msg = QueryMsg::ListVerificationSchemes {}; let raw = query(deps.as_ref(), mock_env(), query_msg).unwrap(); - let res: ListVerificationsResponse = from_json(&raw).unwrap(); + let res: ListVerificationsResponse = from_json(raw).unwrap(); assert_eq!( res, diff --git a/contracts/cyberpunk/src/contract.rs b/contracts/cyberpunk/src/contract.rs index 4e2106aa7c..2084f630df 100644 --- a/contracts/cyberpunk/src/contract.rs +++ b/contracts/cyberpunk/src/contract.rs @@ -274,12 +274,12 @@ mod tests { ); let symbols: Vec = - from_json(&query(deps.as_ref(), mock_env(), QueryMsg::Denoms {}).unwrap()).unwrap(); + from_json(query(deps.as_ref(), mock_env(), QueryMsg::Denoms {}).unwrap()).unwrap(); assert_eq!(symbols.len(), 98); let denom: DenomMetadata = from_json( - &query( + query( deps.as_ref(), mock_env(), QueryMsg::Denom { diff --git a/contracts/cyberpunk/tests/integration.rs b/contracts/cyberpunk/tests/integration.rs index 0140b40cf6..539a53eb2a 100644 --- a/contracts/cyberpunk/tests/integration.rs +++ b/contracts/cyberpunk/tests/integration.rs @@ -152,13 +152,13 @@ fn test_env() { ) .unwrap(); - let received_env: Env = from_json(&res.data.unwrap()).unwrap(); + let received_env: Env = from_json(res.data.unwrap()).unwrap(); assert_eq!(received_env, env); let env = mock_env(); let received_env: Env = - from_json(&query(&mut deps, env.clone(), QueryMsg::MirrorEnv {}).unwrap()).unwrap(); + from_json(query(&mut deps, env.clone(), QueryMsg::MirrorEnv {}).unwrap()).unwrap(); assert_eq!(received_env, env); } diff --git a/contracts/floaty/src/contract.rs b/contracts/floaty/src/contract.rs index 15b824bf25..157dcf5765 100644 --- a/contracts/floaty/src/contract.rs +++ b/contracts/floaty/src/contract.rs @@ -40,7 +40,7 @@ pub fn execute( .storage .get(CONFIG_KEY) .ok_or_else(|| StdError::not_found("State"))?; - let state: State = from_json(&data)?; + let state: State = from_json(data)?; if info.sender == state.verifier { let to_addr = state.beneficiary; @@ -77,7 +77,7 @@ fn query_verifier(deps: Deps) -> StdResult { .storage .get(CONFIG_KEY) .ok_or_else(|| StdError::not_found("State"))?; - let state: State = from_json(&data)?; + let state: State = from_json(data)?; Ok(VerifierResponse { verifier: state.verifier.into(), }) @@ -124,7 +124,7 @@ mod tests { // it worked, let's check the state let data = deps.storage.get(CONFIG_KEY).expect("no data stored"); - let state: State = from_json(&data).unwrap(); + let state: State = from_json(data).unwrap(); assert_eq!(state, expected_state); } @@ -246,7 +246,7 @@ mod tests { // state should not change let data = deps.storage.get(CONFIG_KEY).expect("no data stored"); - let state: State = from_json(&data).unwrap(); + let state: State = from_json(data).unwrap(); assert_eq!( state, State { diff --git a/contracts/hackatom/src/contract.rs b/contracts/hackatom/src/contract.rs index 463ebbab90..f62ffcb319 100644 --- a/contracts/hackatom/src/contract.rs +++ b/contracts/hackatom/src/contract.rs @@ -41,7 +41,7 @@ pub fn migrate(deps: DepsMut, _env: Env, msg: MigrateMsg) -> Result Result StdResult { .storage .get(CONFIG_KEY) .ok_or_else(|| StdError::not_found("State"))?; - let state: State = from_json(&data)?; + let state: State = from_json(data)?; Ok(VerifierResponse { verifier: state.verifier.into(), }) @@ -336,7 +336,7 @@ mod tests { // it worked, let's check the state let data = deps.storage.get(CONFIG_KEY).expect("no data stored"); - let state: State = from_json(&data).unwrap(); + let state: State = from_json(data).unwrap(); assert_eq!(state, expected_state); } @@ -514,7 +514,7 @@ mod tests { // state should not change let data = deps.storage.get(CONFIG_KEY).expect("no data stored"); - let state: State = from_json(&data).unwrap(); + let state: State = from_json(data).unwrap(); assert_eq!( state, State { diff --git a/contracts/hackatom/tests/integration.rs b/contracts/hackatom/tests/integration.rs index 68920da908..890309ffd6 100644 --- a/contracts/hackatom/tests/integration.rs +++ b/contracts/hackatom/tests/integration.rs @@ -183,7 +183,7 @@ fn querier_callbacks_work() { // querying with balance gets the balance let query_msg = QueryMsg::OtherBalance { address: rich_addr }; let query_response = query(&mut deps, mock_env(), query_msg).unwrap(); - let bal: AllBalanceResponse = from_json(&query_response).unwrap(); + let bal: AllBalanceResponse = from_json(query_response).unwrap(); assert_eq!(bal.amount, rich_balance); // querying other accounts gets none @@ -191,7 +191,7 @@ fn querier_callbacks_work() { address: String::from("someone else"), }; let query_response = query(&mut deps, mock_env(), query_msg).unwrap(); - let bal: AllBalanceResponse = from_json(&query_response).unwrap(); + let bal: AllBalanceResponse = from_json(query_response).unwrap(); assert_eq!(bal.amount, vec![]); } diff --git a/contracts/ibc-reflect-send/src/ibc.rs b/contracts/ibc-reflect-send/src/ibc.rs index 8086e103c2..6faabd5c10 100644 --- a/contracts/ibc-reflect-send/src/ibc.rs +++ b/contracts/ibc-reflect-send/src/ibc.rs @@ -108,18 +108,18 @@ pub fn ibc_packet_ack( // which local channel was this packet send from let caller = msg.original_packet.src.channel_id; // we need to parse the ack based on our request - let packet: PacketMsg = from_json(&msg.original_packet.data)?; + let packet: PacketMsg = from_json(msg.original_packet.data)?; match packet { PacketMsg::Dispatch { .. } => { - let res: AcknowledgementMsg = from_json(&msg.acknowledgement.data)?; + let res: AcknowledgementMsg = from_json(msg.acknowledgement.data)?; acknowledge_dispatch(deps, caller, res) } PacketMsg::WhoAmI {} => { - let res: AcknowledgementMsg = from_json(&msg.acknowledgement.data)?; + let res: AcknowledgementMsg = from_json(msg.acknowledgement.data)?; acknowledge_who_am_i(deps, caller, res) } PacketMsg::Balances {} => { - let res: AcknowledgementMsg = from_json(&msg.acknowledgement.data)?; + let res: AcknowledgementMsg = from_json(msg.acknowledgement.data)?; acknowledge_balances(deps, env, caller, res) } } @@ -305,7 +305,7 @@ mod tests { channel_id: channel_id.into(), }; let r = query(deps.as_ref(), mock_env(), q).unwrap(); - let acct: AccountResponse = from_json(&r).unwrap(); + let acct: AccountResponse = from_json(r).unwrap(); assert!(acct.remote_addr.is_none()); assert!(acct.remote_balance.is_empty()); assert_eq!(0, acct.last_update_time.nanos()); @@ -319,7 +319,7 @@ mod tests { channel_id: channel_id.into(), }; let r = query(deps.as_ref(), mock_env(), q).unwrap(); - let acct: AccountResponse = from_json(&r).unwrap(); + let acct: AccountResponse = from_json(r).unwrap(); assert_eq!(acct.remote_addr.unwrap(), remote_addr); assert!(acct.remote_balance.is_empty()); assert_eq!(0, acct.last_update_time.nanos()); diff --git a/contracts/ibc-reflect-send/src/state.rs b/contracts/ibc-reflect-send/src/state.rs index e9c024b0ae..44f78f4e08 100644 --- a/contracts/ibc-reflect-send/src/state.rs +++ b/contracts/ibc-reflect-send/src/state.rs @@ -33,7 +33,7 @@ pub struct AccountData { pub fn may_load_account(storage: &dyn Storage, id: &str) -> StdResult> { storage .get(&namespace_with_key(&[PREFIX_ACCOUNTS], id.as_bytes())) - .map(|v| from_json(&v)) + .map(from_json) .transpose() } @@ -63,7 +63,7 @@ pub fn range_accounts( .map(|(key, val)| { Ok(( String::from_utf8(key[PREFIX_ACCOUNTS.len() + 2..].to_vec())?, - from_json(&val)?, + from_json(val)?, )) }) } @@ -72,7 +72,7 @@ pub fn load_config(storage: &dyn Storage) -> StdResult { storage .get(&to_length_prefixed(KEY_CONFIG)) .ok_or_else(|| StdError::not_found("config")) - .and_then(|v| from_json(&v)) + .and_then(from_json) } pub fn save_config(storage: &mut dyn Storage, item: &Config) -> StdResult<()> { diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index e3b59f10d3..7d8efb44c2 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -241,7 +241,7 @@ pub fn ibc_packet_receive( let packet = msg.packet; // which local channel did this packet come on let caller = packet.dest.channel_id; - let msg: PacketMsg = from_json(&packet.data)?; + let msg: PacketMsg = from_json(packet.data)?; match msg { PacketMsg::Dispatch { msgs } => receive_dispatch(deps, caller, msgs), PacketMsg::WhoAmI {} => receive_who_am_i(deps, caller), @@ -482,7 +482,7 @@ mod tests { // no accounts set yet let raw = query(deps.as_ref(), mock_env(), QueryMsg::ListAccounts {}).unwrap(); - let res: ListAccountsResponse = from_json(&raw).unwrap(); + let res: ListAccountsResponse = from_json(raw).unwrap(); assert_eq!(0, res.accounts.len()); // fake a reply and ensure this works @@ -497,7 +497,7 @@ mod tests { // ensure this is now registered let raw = query(deps.as_ref(), mock_env(), QueryMsg::ListAccounts {}).unwrap(); - let res: ListAccountsResponse = from_json(&raw).unwrap(); + let res: ListAccountsResponse = from_json(raw).unwrap(); assert_eq!(1, res.accounts.len()); assert_eq!( &res.accounts[0], @@ -516,7 +516,7 @@ mod tests { }, ) .unwrap(); - let res: AccountResponse = from_json(&raw).unwrap(); + let res: AccountResponse = from_json(raw).unwrap(); assert_eq!(res.account.unwrap(), REFLECT_ADDR); } @@ -546,7 +546,7 @@ mod tests { res.events[0] ); // acknowledgement is an error - let ack: AcknowledgementMsg = from_json(&res.acknowledgement).unwrap(); + let ack: AcknowledgementMsg = from_json(res.acknowledgement).unwrap(); assert_eq!( ack.unwrap_err(), "invalid packet: account channel-123 not found" @@ -560,7 +560,7 @@ mod tests { let res = ibc_packet_receive(deps.as_mut(), mock_env(), msg).unwrap(); // assert app-level success - let ack: AcknowledgementMsg<()> = from_json(&res.acknowledgement).unwrap(); + let ack: AcknowledgementMsg<()> = from_json(res.acknowledgement).unwrap(); ack.unwrap(); // and we dispatch the BankMsg via submessage @@ -597,7 +597,7 @@ mod tests { // we didn't dispatch anything assert_eq!(0, res.messages.len()); // acknowledgement is an error - let ack: AcknowledgementMsg = from_json(&res.acknowledgement).unwrap(); + let ack: AcknowledgementMsg = from_json(res.acknowledgement).unwrap(); assert_eq!(ack.unwrap_err(), "invalid packet: Error parsing into type ibc_reflect::msg::PacketMsg: unknown variant `reflect_code_id`, expected one of `dispatch`, `who_am_i`, `balances`, `panic`, `return_err`, `return_msgs`"); } @@ -616,7 +616,7 @@ mod tests { // channel should be listed and have balance let raw = query(deps.as_ref(), mock_env(), QueryMsg::ListAccounts {}).unwrap(); - let res: ListAccountsResponse = from_json(&raw).unwrap(); + let res: ListAccountsResponse = from_json(raw).unwrap(); assert_eq!(1, res.accounts.len()); let balance = deps.as_ref().querier.query_all_balances(account).unwrap(); assert_eq!(funds, balance); @@ -652,7 +652,7 @@ mod tests { // and removes the account lookup let raw = query(deps.as_ref(), mock_env(), QueryMsg::ListAccounts {}).unwrap(); - let res: ListAccountsResponse = from_json(&raw).unwrap(); + let res: ListAccountsResponse = from_json(raw).unwrap(); assert_eq!(0, res.accounts.len()); } } diff --git a/contracts/ibc-reflect/src/state.rs b/contracts/ibc-reflect/src/state.rs index 3321731f5a..112f0227d6 100644 --- a/contracts/ibc-reflect/src/state.rs +++ b/contracts/ibc-reflect/src/state.rs @@ -22,7 +22,7 @@ pub struct Config { pub fn may_load_account(storage: &dyn Storage, id: &str) -> StdResult> { storage .get(&namespace_with_key(&[PREFIX_ACCOUNTS], id.as_bytes())) - .map(|v| from_json(&v)) + .map(from_json) .transpose() } @@ -52,7 +52,7 @@ pub fn range_accounts( .map(|(key, val)| { Ok(( String::from_utf8(key[PREFIX_ACCOUNTS.len() + 2..].to_vec())?, - from_json(&val)?, + from_json(val)?, )) }) } @@ -61,7 +61,7 @@ pub fn load_item(storage: &dyn Storage, key: &[u8]) -> StdR storage .get(&to_length_prefixed(key)) .ok_or_else(|| StdError::not_found(type_name::())) - .and_then(|v| from_json(&v)) + .and_then(from_json) } pub fn save_item(storage: &mut dyn Storage, key: &[u8], item: &T) -> StdResult<()> { diff --git a/contracts/queue/src/contract.rs b/contracts/queue/src/contract.rs index 1e1334154c..536921a4e4 100644 --- a/contracts/queue/src/contract.rs +++ b/contracts/queue/src/contract.rs @@ -112,7 +112,7 @@ fn query_sum(deps: Deps) -> StdResult { let values: StdResult> = deps .storage .range_values(None, None, Order::Ascending) - .map(|v| from_json(&v)) + .map(from_json) .collect(); let sum = values?.iter().fold(0, |s, v| s + v.value); Ok(SumResponse { sum }) @@ -340,7 +340,7 @@ mod tests { let query_msg = QueryMsg::List {}; let ids: ListResponse = - from_json(&query(deps.as_ref(), mock_env(), query_msg).unwrap()).unwrap(); + from_json(query(deps.as_ref(), mock_env(), query_msg).unwrap()).unwrap(); assert_eq!(ids.empty, Vec::::new()); assert_eq!(ids.early, vec![0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f]); assert_eq!(ids.late, vec![0x20, 0x21, 0x22, 0x23, 0x24]); diff --git a/contracts/queue/tests/integration.rs b/contracts/queue/tests/integration.rs index 66b0117480..b0a86ae1d5 100644 --- a/contracts/queue/tests/integration.rs +++ b/contracts/queue/tests/integration.rs @@ -48,13 +48,13 @@ fn create_contract() -> (Instance, MessageInf fn get_count(deps: &mut Instance) -> u32 { let data = query(deps, mock_env(), QueryMsg::Count {}).unwrap(); - let res: CountResponse = from_json(&data).unwrap(); + let res: CountResponse = from_json(data).unwrap(); res.count } fn get_sum(deps: &mut Instance) -> i32 { let data = query(deps, mock_env(), QueryMsg::Sum {}).unwrap(); - let res: SumResponse = from_json(&data).unwrap(); + let res: SumResponse = from_json(data).unwrap(); res.sum } @@ -128,7 +128,7 @@ fn push_and_pop() { // ensure we popped properly assert!(res.data.is_some()); let data = res.data.unwrap(); - let item: Item = from_json(&data).unwrap(); + let item: Item = from_json(data).unwrap(); assert_eq!(item.value, 25); assert_eq!(get_count(&mut deps), 1); @@ -223,7 +223,7 @@ fn query_list() { // since we count up to 0x20 in early, we get early and late both with data let query_msg = QueryMsg::List {}; - let ids: ListResponse = from_json(&query(&mut deps, mock_env(), query_msg).unwrap()).unwrap(); + let ids: ListResponse = from_json(query(&mut deps, mock_env(), query_msg).unwrap()).unwrap(); assert_eq!(ids.empty, Vec::::new()); assert_eq!(ids.early, vec![0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f]); assert_eq!(ids.late, vec![0x20, 0x21, 0x22, 0x23, 0x24]); diff --git a/contracts/reflect/src/contract.rs b/contracts/reflect/src/contract.rs index f4b848d8d4..fbe9076ec7 100644 --- a/contracts/reflect/src/contract.rs +++ b/contracts/reflect/src/contract.rs @@ -365,7 +365,7 @@ mod tests { text: "demo one".to_string(), }; let response = query(deps.as_ref(), mock_env(), msg).unwrap(); - let value: CapitalizedResponse = from_json(&response).unwrap(); + let value: CapitalizedResponse = from_json(response).unwrap(); assert_eq!(value.text, "DEMO ONE"); } @@ -381,8 +381,8 @@ mod tests { .into(), }; let response = query(deps.as_ref(), mock_env(), msg).unwrap(); - let outer: ChainResponse = from_json(&response).unwrap(); - let inner: AllBalanceResponse = from_json(&outer.data).unwrap(); + let outer: ChainResponse = from_json(response).unwrap(); + let inner: AllBalanceResponse = from_json(outer.data).unwrap(); assert_eq!(inner.amount, coins(123, "ucosm")); // with custom query @@ -390,8 +390,8 @@ mod tests { request: SpecialQuery::Ping {}.into(), }; let response = query(deps.as_ref(), mock_env(), msg).unwrap(); - let outer: ChainResponse = from_json(&response).unwrap(); - let inner: SpecialResponse = from_json(&outer.data).unwrap(); + let outer: ChainResponse = from_json(response).unwrap(); + let inner: SpecialResponse = from_json(outer.data).unwrap(); assert_eq!(inner.msg, "pong"); } @@ -452,7 +452,7 @@ mod tests { // query for the real id let raw = query(deps.as_ref(), mock_env(), QueryMsg::SubMsgResult { id }).unwrap(); - let qres: Reply = from_json(&raw).unwrap(); + let qres: Reply = from_json(raw).unwrap(); assert_eq!(qres.id, id); let result = qres.result.unwrap(); assert_eq!(result.data, Some(data)); diff --git a/contracts/reflect/src/state.rs b/contracts/reflect/src/state.rs index 7afa6ac455..2fc752b225 100644 --- a/contracts/reflect/src/state.rs +++ b/contracts/reflect/src/state.rs @@ -19,7 +19,7 @@ pub fn load_reply(storage: &dyn Storage, id: u64) -> StdResult { storage .get(&namespace_with_key(&[RESULT_PREFIX], &id.to_be_bytes())) .ok_or_else(|| StdError::not_found(format!("reply {id}"))) - .and_then(|v| from_json(&v)) + .and_then(from_json) } pub fn save_reply(storage: &mut dyn Storage, id: u64, reply: &Reply) -> StdResult<()> { @@ -38,7 +38,7 @@ pub fn load_config(storage: &dyn Storage) -> StdResult { storage .get(&to_length_prefixed(CONFIG_KEY)) .ok_or_else(|| StdError::not_found("config")) - .and_then(|v| from_json(&v)) + .and_then(from_json) } pub fn save_config(storage: &mut dyn Storage, item: &State) -> StdResult<()> { diff --git a/contracts/reflect/src/testing.rs b/contracts/reflect/src/testing.rs index b67a6a680c..f46dac69ed 100644 --- a/contracts/reflect/src/testing.rs +++ b/contracts/reflect/src/testing.rs @@ -37,7 +37,7 @@ mod tests { #[test] fn custom_query_execute_ping() { let res = custom_query_execute(&SpecialQuery::Ping {}).unwrap(); - let response: SpecialResponse = from_json(&res).unwrap(); + let response: SpecialResponse = from_json(res).unwrap(); assert_eq!(response.msg, "pong"); } @@ -47,7 +47,7 @@ mod tests { text: "fOObaR".to_string(), }) .unwrap(); - let response: SpecialResponse = from_json(&res).unwrap(); + let response: SpecialResponse = from_json(res).unwrap(); assert_eq!(response.msg, "FOOBAR"); } diff --git a/contracts/reflect/tests/integration.rs b/contracts/reflect/tests/integration.rs index 6ab20d5aa5..1333ad53bb 100644 --- a/contracts/reflect/tests/integration.rs +++ b/contracts/reflect/tests/integration.rs @@ -83,7 +83,7 @@ fn proper_initialization() { // it worked, let's query the state let res = query(&mut deps, mock_env(), QueryMsg::Owner {}).unwrap(); - let value: OwnerResponse = from_json(&res).unwrap(); + let value: OwnerResponse = from_json(res).unwrap(); assert_eq!("creator", value.owner.as_str()); } @@ -159,7 +159,7 @@ fn transfer() { // should change state assert_eq!(0, res.messages.len()); let res = query(&mut deps, mock_env(), QueryMsg::Owner {}).unwrap(); - let value: OwnerResponse = from_json(&res).unwrap(); + let value: OwnerResponse = from_json(res).unwrap(); assert_eq!("friend", value.owner.as_str()); } @@ -203,8 +203,8 @@ fn supply_query() { ) .unwrap(); - let res: ChainResponse = from_json(&res).unwrap(); - let res: SupplyResponse = from_json(&res.data).unwrap(); + let res: ChainResponse = from_json(res).unwrap(); + let res: SupplyResponse = from_json(res.data).unwrap(); assert_eq!(res.amount, coin(25, "OSMO")); } @@ -225,7 +225,7 @@ fn dispatch_custom_query() { }, ) .unwrap(); - let value: CapitalizedResponse = from_json(&res).unwrap(); + let value: CapitalizedResponse = from_json(res).unwrap(); assert_eq!(value.text, "DEMO ONE"); } @@ -282,7 +282,7 @@ fn reply_and_query() { // query for the real id let raw = query(&mut deps, mock_env(), QueryMsg::SubMsgResult { id }).unwrap(); - let qres: Reply = from_json(&raw).unwrap(); + let qres: Reply = from_json(raw).unwrap(); assert_eq!(qres.id, id); let result = qres.result.unwrap(); assert_eq!(result.data, Some(data)); diff --git a/contracts/staking/src/state.rs b/contracts/staking/src/state.rs index 759ccfc145..6af6670213 100644 --- a/contracts/staking/src/state.rs +++ b/contracts/staking/src/state.rs @@ -23,7 +23,7 @@ pub fn may_load_map( ) -> StdResult> { storage .get(&namespace_with_key(&[prefix], key)) - .map(|v| from_json(&v)) + .map(from_json) .transpose() } @@ -85,7 +85,7 @@ pub fn load_item(storage: &dyn Storage, key: &[u8]) -> StdR storage .get(&to_length_prefixed(key)) .ok_or_else(|| StdError::not_found(type_name::())) - .and_then(|v| from_json(&v)) + .and_then(from_json) } pub fn save_item(storage: &mut dyn Storage, key: &[u8], item: &T) -> StdResult<()> { diff --git a/contracts/staking/tests/integration.rs b/contracts/staking/tests/integration.rs index 3b68b55a2e..cca65a9db4 100644 --- a/contracts/staking/tests/integration.rs +++ b/contracts/staking/tests/integration.rs @@ -106,7 +106,7 @@ fn proper_initialization() { // token info is proper let res = query(&mut deps, mock_env(), QueryMsg::TokenInfo {}).unwrap(); - let token: TokenInfoResponse = from_json(&res).unwrap(); + let token: TokenInfoResponse = from_json(res).unwrap(); assert_eq!(&token.name, &msg.name); assert_eq!(&token.symbol, &msg.symbol); assert_eq!(token.decimals, msg.decimals); @@ -120,7 +120,7 @@ fn proper_initialization() { }, ) .unwrap(); - let bal: BalanceResponse = from_json(&res).unwrap(); + let bal: BalanceResponse = from_json(res).unwrap(); assert_eq!(bal.balance, Uint128::new(0)); // no claims @@ -132,12 +132,12 @@ fn proper_initialization() { }, ) .unwrap(); - let claim: ClaimsResponse = from_json(&res).unwrap(); + let claim: ClaimsResponse = from_json(res).unwrap(); assert_eq!(claim.claims, Uint128::new(0)); // investment info correct let res = query(&mut deps, mock_env(), QueryMsg::Investment {}).unwrap(); - let invest: InvestmentResponse = from_json(&res).unwrap(); + let invest: InvestmentResponse = from_json(res).unwrap(); assert_eq!(&invest.owner, &creator); assert_eq!(&invest.validator, &msg.validator); assert_eq!(invest.exit_tax, msg.exit_tax); diff --git a/packages/std/src/binary.rs b/packages/std/src/binary.rs index 7030ee02aa..bb65eea8db 100644 --- a/packages/std/src/binary.rs +++ b/packages/std/src/binary.rs @@ -451,7 +451,7 @@ mod tests { let binary = Binary(vec![0u8, 187, 61, 11, 250, 0]); let json = to_json_vec(&binary).unwrap(); - let deserialized: Binary = from_json(&json).unwrap(); + let deserialized: Binary = from_json(json).unwrap(); assert_eq!(binary, deserialized); } @@ -463,7 +463,7 @@ mod tests { let expected = vec![0u8, 187, 61, 11, 250, 0]; let serialized = to_json_vec(&b64_str).unwrap(); - let deserialized: Binary = from_json(&serialized).unwrap(); + let deserialized: Binary = from_json(serialized).unwrap(); assert_eq!(expected, deserialized.as_slice()); } diff --git a/packages/std/src/exports.rs b/packages/std/src/exports.rs index ad33a91814..c745bc82e7 100644 --- a/packages/std/src/exports.rs +++ b/packages/std/src/exports.rs @@ -415,9 +415,9 @@ where let info: Vec = unsafe { consume_region(info_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_json(&env)); - let info: MessageInfo = try_into_contract_result!(from_json(&info)); - let msg: M = try_into_contract_result!(from_json(&msg)); + let env: Env = try_into_contract_result!(from_json(env)); + let info: MessageInfo = try_into_contract_result!(from_json(info)); + let msg: M = try_into_contract_result!(from_json(msg)); let mut deps = make_dependencies(); instantiate_fn(deps.as_mut(), env, info, msg).into() @@ -439,9 +439,9 @@ where let info: Vec = unsafe { consume_region(info_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_json(&env)); - let info: MessageInfo = try_into_contract_result!(from_json(&info)); - let msg: M = try_into_contract_result!(from_json(&msg)); + let env: Env = try_into_contract_result!(from_json(env)); + let info: MessageInfo = try_into_contract_result!(from_json(info)); + let msg: M = try_into_contract_result!(from_json(msg)); let mut deps = make_dependencies(); execute_fn(deps.as_mut(), env, info, msg).into() @@ -461,8 +461,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_json(&env)); - let msg: M = try_into_contract_result!(from_json(&msg)); + let env: Env = try_into_contract_result!(from_json(env)); + let msg: M = try_into_contract_result!(from_json(msg)); let mut deps = make_dependencies(); migrate_fn(deps.as_mut(), env, msg).into() @@ -482,8 +482,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_json(&env)); - let msg: M = try_into_contract_result!(from_json(&msg)); + let env: Env = try_into_contract_result!(from_json(env)); + let msg: M = try_into_contract_result!(from_json(msg)); let mut deps = make_dependencies(); sudo_fn(deps.as_mut(), env, msg).into() @@ -502,8 +502,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_json(&env)); - let msg: Reply = try_into_contract_result!(from_json(&msg)); + let env: Env = try_into_contract_result!(from_json(env)); + let msg: Reply = try_into_contract_result!(from_json(msg)); let mut deps = make_dependencies(); reply_fn(deps.as_mut(), env, msg).into() @@ -522,8 +522,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_json(&env)); - let msg: M = try_into_contract_result!(from_json(&msg)); + let env: Env = try_into_contract_result!(from_json(env)); + let msg: M = try_into_contract_result!(from_json(msg)); let deps = make_dependencies(); query_fn(deps.as_ref(), env, msg).into() @@ -542,8 +542,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_json(&env)); - let msg: IbcChannelOpenMsg = try_into_contract_result!(from_json(&msg)); + let env: Env = try_into_contract_result!(from_json(env)); + let msg: IbcChannelOpenMsg = try_into_contract_result!(from_json(msg)); let mut deps = make_dependencies(); contract_fn(deps.as_mut(), env, msg).into() @@ -563,8 +563,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_json(&env)); - let msg: IbcChannelConnectMsg = try_into_contract_result!(from_json(&msg)); + let env: Env = try_into_contract_result!(from_json(env)); + let msg: IbcChannelConnectMsg = try_into_contract_result!(from_json(msg)); let mut deps = make_dependencies(); contract_fn(deps.as_mut(), env, msg).into() @@ -584,8 +584,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_json(&env)); - let msg: IbcChannelCloseMsg = try_into_contract_result!(from_json(&msg)); + let env: Env = try_into_contract_result!(from_json(env)); + let msg: IbcChannelCloseMsg = try_into_contract_result!(from_json(msg)); let mut deps = make_dependencies(); contract_fn(deps.as_mut(), env, msg).into() @@ -605,8 +605,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_json(&env)); - let msg: IbcPacketReceiveMsg = try_into_contract_result!(from_json(&msg)); + let env: Env = try_into_contract_result!(from_json(env)); + let msg: IbcPacketReceiveMsg = try_into_contract_result!(from_json(msg)); let mut deps = make_dependencies(); contract_fn(deps.as_mut(), env, msg).into() @@ -626,8 +626,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_json(&env)); - let msg: IbcPacketAckMsg = try_into_contract_result!(from_json(&msg)); + let env: Env = try_into_contract_result!(from_json(env)); + let msg: IbcPacketAckMsg = try_into_contract_result!(from_json(msg)); let mut deps = make_dependencies(); contract_fn(deps.as_mut(), env, msg).into() @@ -647,8 +647,8 @@ where let env: Vec = unsafe { consume_region(env_ptr) }; let msg: Vec = unsafe { consume_region(msg_ptr) }; - let env: Env = try_into_contract_result!(from_json(&env)); - let msg: IbcPacketTimeoutMsg = try_into_contract_result!(from_json(&msg)); + let env: Env = try_into_contract_result!(from_json(env)); + let msg: IbcPacketTimeoutMsg = try_into_contract_result!(from_json(msg)); let mut deps = make_dependencies(); contract_fn(deps.as_mut(), env, msg).into() diff --git a/packages/std/src/hex_binary.rs b/packages/std/src/hex_binary.rs index 223fae6a4c..aeb30b4c48 100644 --- a/packages/std/src/hex_binary.rs +++ b/packages/std/src/hex_binary.rs @@ -516,7 +516,7 @@ mod tests { let binary = HexBinary(vec![0u8, 187, 61, 11, 250, 0]); let json = to_json_vec(&binary).unwrap(); - let deserialized: HexBinary = from_json(&json).unwrap(); + let deserialized: HexBinary = from_json(json).unwrap(); assert_eq!(binary, deserialized); } @@ -528,7 +528,7 @@ mod tests { let expected = vec![0u8, 187, 61, 11, 250, 0]; let serialized = to_json_vec(&hex).unwrap(); - let deserialized: HexBinary = from_json(&serialized).unwrap(); + let deserialized: HexBinary = from_json(serialized).unwrap(); assert_eq!(expected, deserialized.as_slice()); } diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index a0e28019c1..bc5cd241fc 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -824,7 +824,7 @@ mod tests { let orig = Int128::from(1234567890987654321i128); let serialized = to_json_vec(&orig).unwrap(); assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); - let parsed: Int128 = from_json(&serialized).unwrap(); + let parsed: Int128 = from_json(serialized).unwrap(); assert_eq!(parsed, orig); } diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index 77f9878722..70d17417d7 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -931,7 +931,7 @@ mod tests { let orig = Int256::from(1234567890987654321u128); let serialized = to_json_vec(&orig).unwrap(); assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); - let parsed: Int256 = from_json(&serialized).unwrap(); + let parsed: Int256 = from_json(serialized).unwrap(); assert_eq!(parsed, orig); } diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index ceb7829b5a..86b4a93b3a 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -959,7 +959,7 @@ mod tests { let orig = Int512::from(1234567890987654321u128); let serialized = to_json_vec(&orig).unwrap(); assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); - let parsed: Int512 = from_json(&serialized).unwrap(); + let parsed: Int512 = from_json(serialized).unwrap(); assert_eq!(parsed, orig); } diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index 2763d68a59..86a9bc4778 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -796,7 +796,7 @@ mod tests { let orig = Int64::from(1234567890987654321i64); let serialized = to_json_vec(&orig).unwrap(); assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); - let parsed: Int64 = from_json(&serialized).unwrap(); + let parsed: Int64 = from_json(serialized).unwrap(); assert_eq!(parsed, orig); } diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 93e47ab95a..28081a9473 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -791,7 +791,7 @@ mod tests { let orig = Uint128(1234567890987654321); let serialized = to_json_vec(&orig).unwrap(); assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); - let parsed: Uint128 = from_json(&serialized).unwrap(); + let parsed: Uint128 = from_json(serialized).unwrap(); assert_eq!(parsed, orig); } diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index f12e327e33..a4a672ad80 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -1308,7 +1308,7 @@ mod tests { let orig = Uint256::from(1234567890987654321u128); let serialized = to_json_vec(&orig).unwrap(); assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); - let parsed: Uint256 = from_json(&serialized).unwrap(); + let parsed: Uint256 = from_json(serialized).unwrap(); assert_eq!(parsed, orig); } diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index 18583d1f4e..30be022a62 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -1014,7 +1014,7 @@ mod tests { let orig = Uint512::from(1234567890987654321u128); let serialized = to_json_vec(&orig).unwrap(); assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); - let parsed: Uint512 = from_json(&serialized).unwrap(); + let parsed: Uint512 = from_json(serialized).unwrap(); assert_eq!(parsed, orig); } diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index b047c3e6a4..f168f893c2 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -712,7 +712,7 @@ mod tests { let orig = Uint64(1234567890987654321); let serialized = to_json_vec(&orig).unwrap(); assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); - let parsed: Uint64 = from_json(&serialized).unwrap(); + let parsed: Uint64 = from_json(serialized).unwrap(); assert_eq!(parsed, orig); } diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index 300066b8a5..a728675f40 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -309,7 +309,7 @@ mod tests { data: Some(Binary::from([0xAA, 0xBB])), }; let serialized = to_json_vec(&original).expect("encode contract result"); - let deserialized: Response = from_json(&serialized).expect("decode contract result"); + let deserialized: Response = from_json(serialized).expect("decode contract result"); assert_eq!(deserialized, original); } diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 3aea470caa..d2ca6d65f6 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -1442,7 +1442,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: SupplyResponse = from_json(&elf).unwrap(); + let res: SupplyResponse = from_json(elf).unwrap(); assert_eq!(res.amount, coin(444, "ELF")); let fly = bank @@ -1451,7 +1451,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: SupplyResponse = from_json(&fly).unwrap(); + let res: SupplyResponse = from_json(fly).unwrap(); assert_eq!(res.amount, coin(777, "FLY")); // if a denom does not exist, should return zero amount, instead of throwing an error @@ -1461,7 +1461,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: SupplyResponse = from_json(&atom).unwrap(); + let res: SupplyResponse = from_json(atom).unwrap(); assert_eq!(res.amount, coin(0, "ATOM")); } @@ -1475,7 +1475,7 @@ mod tests { .query(&BankQuery::AllBalances { address: addr }) .unwrap() .unwrap(); - let res: AllBalanceResponse = from_json(&all).unwrap(); + let res: AllBalanceResponse = from_json(all).unwrap(); assert_eq!(&res.amount, &balance); } @@ -1493,7 +1493,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: BalanceResponse = from_json(&fly).unwrap(); + let res: BalanceResponse = from_json(fly).unwrap(); assert_eq!(res.amount, coin(777, "FLY")); // missing denom @@ -1504,7 +1504,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: BalanceResponse = from_json(&miss).unwrap(); + let res: BalanceResponse = from_json(miss).unwrap(); assert_eq!(res.amount, coin(0, "MISS")); } @@ -1521,7 +1521,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: AllBalanceResponse = from_json(&all).unwrap(); + let res: AllBalanceResponse = from_json(all).unwrap(); assert_eq!(res.amount, vec![]); // any denom on balances on empty account is empty coin @@ -1532,7 +1532,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: BalanceResponse = from_json(&miss).unwrap(); + let res: BalanceResponse = from_json(miss).unwrap(); assert_eq!(res.amount, coin(0, "ELF")); } @@ -1570,7 +1570,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: AllDenomMetadataResponse = from_json(&res).unwrap(); + let res: AllDenomMetadataResponse = from_json(res).unwrap(); assert_eq!(res.metadata.len(), 10); assert!(res.next_key.is_some()); @@ -1585,7 +1585,7 @@ mod tests { }) .unwrap() .unwrap(); - let res2: AllDenomMetadataResponse = from_json(&res2).unwrap(); + let res2: AllDenomMetadataResponse = from_json(res2).unwrap(); assert_eq!(res2.metadata.len(), 10); assert_ne!(res.metadata.last(), res2.metadata.first()); // should have no overlap @@ -1604,7 +1604,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: AllDenomMetadataResponse = from_json(&res).unwrap(); + let res: AllDenomMetadataResponse = from_json(res).unwrap(); assert_eq!(res.metadata.len(), 100); assert!(res.next_key.is_none(), "no more data should be available"); assert_eq!(res.metadata[0].symbol, "FOO99", "should have been reversed"); @@ -1619,7 +1619,7 @@ mod tests { }) .unwrap() .unwrap(); - let more_res: AllDenomMetadataResponse = from_json(&more_res).unwrap(); + let more_res: AllDenomMetadataResponse = from_json(more_res).unwrap(); assert_eq!( more_res.metadata, res.metadata, "should be same as previous query" @@ -1637,7 +1637,7 @@ mod tests { }; let res = distribution.query(&query).unwrap().unwrap(); - let res: DelegatorWithdrawAddressResponse = from_json(&res).unwrap(); + let res: DelegatorWithdrawAddressResponse = from_json(res).unwrap(); assert_eq!(res.withdraw_address, "withdraw0"); let query = DistributionQuery::DelegatorWithdrawAddress { @@ -1645,7 +1645,7 @@ mod tests { }; let res = distribution.query(&query).unwrap().unwrap(); - let res: DelegatorWithdrawAddressResponse = from_json(&res).unwrap(); + let res: DelegatorWithdrawAddressResponse = from_json(res).unwrap(); assert_eq!(res.withdraw_address, "addr1"); } @@ -1660,7 +1660,7 @@ mod tests { }; let res = distribution.query(&query).unwrap().unwrap(); - let res: DelegatorValidatorsResponse = from_json(&res).unwrap(); + let res: DelegatorValidatorsResponse = from_json(res).unwrap(); assert_eq!(res.validators, ["valoper1", "valoper2"]); let query = DistributionQuery::DelegatorValidators { @@ -1668,7 +1668,7 @@ mod tests { }; let res = distribution.query(&query).unwrap().unwrap(); - let res: DelegatorValidatorsResponse = from_json(&res).unwrap(); + let res: DelegatorValidatorsResponse = from_json(res).unwrap(); assert_eq!(res.validators, ([] as [String; 0])); } @@ -1690,7 +1690,7 @@ mod tests { validator_address: "valoper0".to_string(), }; let res = distribution.query(&query).unwrap().unwrap(); - let res: DelegationRewardsResponse = from_json(&res).unwrap(); + let res: DelegationRewardsResponse = from_json(res).unwrap(); assert_eq!(res.rewards, valoper0_rewards); // delegator does not exist @@ -1699,7 +1699,7 @@ mod tests { validator_address: "valoper0".to_string(), }; let res = distribution.query(&query).unwrap().unwrap(); - let res: DelegationRewardsResponse = from_json(&res).unwrap(); + let res: DelegationRewardsResponse = from_json(res).unwrap(); assert_eq!(res.rewards.len(), 0); // validator does not exist @@ -1708,7 +1708,7 @@ mod tests { validator_address: "valopernonexistent".to_string(), }; let res = distribution.query(&query).unwrap().unwrap(); - let res: DelegationRewardsResponse = from_json(&res).unwrap(); + let res: DelegationRewardsResponse = from_json(res).unwrap(); assert_eq!(res.rewards.len(), 0); // add one more validator @@ -1720,7 +1720,7 @@ mod tests { delegator_address: "addr0".to_string(), }; let res = distribution.query(&query).unwrap().unwrap(); - let res: DelegationTotalRewardsResponse = from_json(&res).unwrap(); + let res: DelegationTotalRewardsResponse = from_json(res).unwrap(); assert_eq!( res.rewards, vec![ @@ -1761,7 +1761,7 @@ mod tests { port_id: Some("my_port".to_string()), }; let raw = ibc.query(query).unwrap().unwrap(); - let chan: ChannelResponse = from_json(&raw).unwrap(); + let chan: ChannelResponse = from_json(raw).unwrap(); assert_eq!(chan.channel, Some(chan1)); } @@ -1791,7 +1791,7 @@ mod tests { port_id: Some("myport".to_string()), }; let raw = ibc.query(query).unwrap().unwrap(); - let chan: ChannelResponse = from_json(&raw).unwrap(); + let chan: ChannelResponse = from_json(raw).unwrap(); assert_eq!(chan.channel, Some(chan1)); } @@ -1809,7 +1809,7 @@ mod tests { port_id: None, }; let raw = ibc.query(query).unwrap().unwrap(); - let chan: ChannelResponse = from_json(&raw).unwrap(); + let chan: ChannelResponse = from_json(raw).unwrap(); assert_eq!(chan.channel, None); } @@ -1826,7 +1826,7 @@ mod tests { port_id: Some("my_port".to_string()), }; let raw = ibc.query(query).unwrap().unwrap(); - let res: ListChannelsResponse = from_json(&raw).unwrap(); + let res: ListChannelsResponse = from_json(raw).unwrap(); assert_eq!(res.channels, vec![chan1, chan2]); } @@ -1841,7 +1841,7 @@ mod tests { // query channels matching "myport" (should be none) let query = &IbcQuery::ListChannels { port_id: None }; let raw = ibc.query(query).unwrap().unwrap(); - let res: ListChannelsResponse = from_json(&raw).unwrap(); + let res: ListChannelsResponse = from_json(raw).unwrap(); assert_eq!(res.channels, vec![]); } @@ -1855,7 +1855,7 @@ mod tests { // query channels matching "myport" (should be none) let query = &IbcQuery::PortId {}; let raw = ibc.query(query).unwrap().unwrap(); - let res: PortIdResponse = from_json(&raw).unwrap(); + let res: PortIdResponse = from_json(raw).unwrap(); assert_eq!(res.port_id, "myport"); } @@ -1882,7 +1882,7 @@ mod tests { .query(&StakingQuery::AllValidators {}) .unwrap() .unwrap(); - let vals: AllValidatorsResponse = from_json(&raw).unwrap(); + let vals: AllValidatorsResponse = from_json(raw).unwrap(); assert_eq!(vals.validators, vec![val1, val2]); } @@ -1913,7 +1913,7 @@ mod tests { .query(&StakingQuery::Validator { address: address1 }) .unwrap() .unwrap(); - let res: ValidatorResponse = from_json(&raw).unwrap(); + let res: ValidatorResponse = from_json(raw).unwrap(); assert_eq!(res.validator, Some(val1)); // query 2 @@ -1921,7 +1921,7 @@ mod tests { .query(&StakingQuery::Validator { address: address2 }) .unwrap() .unwrap(); - let res: ValidatorResponse = from_json(&raw).unwrap(); + let res: ValidatorResponse = from_json(raw).unwrap(); assert_eq!(res.validator, Some(val2)); // query non-existent @@ -1931,7 +1931,7 @@ mod tests { }) .unwrap() .unwrap(); - let res: ValidatorResponse = from_json(&raw).unwrap(); + let res: ValidatorResponse = from_json(raw).unwrap(); assert_eq!(res.validator, None); } @@ -1947,7 +1947,7 @@ mod tests { }) .unwrap() .unwrap(); - let dels: AllDelegationsResponse = from_json(&raw).unwrap(); + let dels: AllDelegationsResponse = from_json(raw).unwrap(); dels.delegations } @@ -1965,7 +1965,7 @@ mod tests { }) .unwrap() .unwrap(); - let dels: DelegationResponse = from_json(&raw).unwrap(); + let dels: DelegationResponse = from_json(raw).unwrap(); dels.delegation } diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 56beac2c86..de44b1bd87 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -250,7 +250,7 @@ impl<'a, C: CustomQuery> QuerierWrapper<'a, C> { SystemResult::Ok(ContractResult::Err(contract_err)) => Err(StdError::generic_err( format!("Querier contract error: {contract_err}"), )), - SystemResult::Ok(ContractResult::Ok(value)) => from_json(&value), + SystemResult::Ok(ContractResult::Ok(value)) => from_json(value), } } @@ -536,7 +536,7 @@ mod tests { .raw_query(&to_json_vec(&query).unwrap()) .unwrap() .unwrap(); - let balance: BalanceResponse = from_json(&raw).unwrap(); + let balance: BalanceResponse = from_json(raw).unwrap(); assert_eq!(balance.amount.amount, Uint128::new(5)); } diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index 5463f11bf1..5dfd268166 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -899,7 +899,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let balance: AllBalanceResponse = from_json(&res).unwrap(); + let balance: AllBalanceResponse = from_json(res).unwrap(); assert_eq!(balance.amount, coins(INIT_AMOUNT, INIT_DENOM)); } diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 0ae804f939..b2c24a7ba1 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -1933,10 +1933,10 @@ mod tests { let response_ptr = do_query_chain(fe_mut.as_mut(), request_ptr).unwrap(); let response = force_read(&mut fe_mut, response_ptr); - let query_result: cosmwasm_std::QuerierResult = cosmwasm_std::from_json(&response).unwrap(); + let query_result: cosmwasm_std::QuerierResult = cosmwasm_std::from_json(response).unwrap(); let query_result_inner = query_result.unwrap(); let query_result_inner_inner = query_result_inner.unwrap(); - let parsed_again: AllBalanceResponse = from_json(&query_result_inner_inner).unwrap(); + let parsed_again: AllBalanceResponse = from_json(query_result_inner_inner).unwrap(); assert_eq!(parsed_again.amount, coins(INIT_AMOUNT, INIT_DENOM)); } @@ -1954,7 +1954,7 @@ mod tests { let response_ptr = do_query_chain(fe_mut.as_mut(), request_ptr).unwrap(); let response = force_read(&mut fe_mut, response_ptr); - let query_result: cosmwasm_std::QuerierResult = cosmwasm_std::from_json(&response).unwrap(); + let query_result: cosmwasm_std::QuerierResult = cosmwasm_std::from_json(response).unwrap(); match query_result { SystemResult::Ok(_) => panic!("This must not succeed"), SystemResult::Err(SystemError::InvalidRequest { request: err, .. }) => { @@ -1982,7 +1982,7 @@ mod tests { let response_ptr = do_query_chain(fe_mut.as_mut(), request_ptr).unwrap(); let response = force_read(&mut fe_mut, response_ptr); - let query_result: cosmwasm_std::QuerierResult = cosmwasm_std::from_json(&response).unwrap(); + let query_result: cosmwasm_std::QuerierResult = cosmwasm_std::from_json(response).unwrap(); match query_result { SystemResult::Ok(_) => panic!("This must not succeed"), SystemResult::Err(SystemError::NoSuchContract { addr }) => { diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 677180ab17..c4be57cdbc 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -970,7 +970,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let BalanceResponse { amount } = from_json(&response).unwrap(); + let BalanceResponse { amount } = from_json(response).unwrap(); assert_eq!(amount.amount.u128(), 8000); assert_eq!(amount.denom, "silver"); Ok(()) @@ -991,7 +991,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let AllBalanceResponse { amount } = from_json(&response).unwrap(); + let AllBalanceResponse { amount } = from_json(response).unwrap(); assert_eq!(amount.len(), 2); assert_eq!(amount[0].amount.u128(), 10000); assert_eq!(amount[0].denom, "gold"); @@ -1026,7 +1026,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let BalanceResponse { amount } = from_json(&response).unwrap(); + let BalanceResponse { amount } = from_json(response).unwrap(); assert_eq!(amount.amount.u128(), 500); Ok(()) }) @@ -1055,7 +1055,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let BalanceResponse { amount } = from_json(&response).unwrap(); + let BalanceResponse { amount } = from_json(response).unwrap(); assert_eq!(amount.amount.u128(), 8000); Ok(()) }) diff --git a/packages/vm/src/testing/querier.rs b/packages/vm/src/testing/querier.rs index e5933637dd..cf516bceca 100644 --- a/packages/vm/src/testing/querier.rs +++ b/packages/vm/src/testing/querier.rs @@ -147,7 +147,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let res: AllBalanceResponse = from_json(&all).unwrap(); + let res: AllBalanceResponse = from_json(all).unwrap(); assert_eq!(&res.amount, &balance); } @@ -171,7 +171,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let res: BalanceResponse = from_json(&fly).unwrap(); + let res: BalanceResponse = from_json(fly).unwrap(); assert_eq!(res.amount, coin(777, "FLY")); // missing denom @@ -188,7 +188,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let res: BalanceResponse = from_json(&miss).unwrap(); + let res: BalanceResponse = from_json(miss).unwrap(); assert_eq!(res.amount, coin(0, "MISS")); } @@ -211,7 +211,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let res: AllBalanceResponse = from_json(&all).unwrap(); + let res: AllBalanceResponse = from_json(all).unwrap(); assert_eq!(res.amount, vec![]); // any denom on balances on empty account is empty coin @@ -228,7 +228,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let res: BalanceResponse = from_json(&miss).unwrap(); + let res: BalanceResponse = from_json(miss).unwrap(); assert_eq!(res.amount, coin(0, "ELF")); } } From ad72e62c1b1b044bf90f7fbeade9b1b29103c0a4 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 4 Aug 2023 12:41:47 +0200 Subject: [PATCH 0738/2372] Implement signed decimal --- packages/std/src/math/mod.rs | 2 + packages/std/src/math/signed_decimal.rs | 2265 +++++++++++++++++++++++ 2 files changed, 2267 insertions(+) create mode 100644 packages/std/src/math/signed_decimal.rs diff --git a/packages/std/src/math/mod.rs b/packages/std/src/math/mod.rs index fdff7647f8..5defdb142b 100644 --- a/packages/std/src/math/mod.rs +++ b/packages/std/src/math/mod.rs @@ -8,6 +8,7 @@ mod int512; mod int64; mod isqrt; mod num_consts; +mod signed_decimal; mod uint128; mod uint256; mod uint512; @@ -21,6 +22,7 @@ pub use int256::Int256; pub use int512::Int512; pub use int64::Int64; pub use isqrt::Isqrt; +pub use signed_decimal::{SignedDecimal, SignedDecimalRangeExceeded}; pub use uint128::Uint128; pub use uint256::Uint256; pub use uint512::Uint512; diff --git a/packages/std/src/math/signed_decimal.rs b/packages/std/src/math/signed_decimal.rs new file mode 100644 index 0000000000..ecce917b70 --- /dev/null +++ b/packages/std/src/math/signed_decimal.rs @@ -0,0 +1,2265 @@ +use core::cmp::Ordering; +use core::fmt::{self, Write}; +use core::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Rem, RemAssign, Sub, SubAssign}; +use core::str::FromStr; +use forward_ref::{forward_ref_binop, forward_ref_op_assign}; +use schemars::JsonSchema; +use serde::{de, ser, Deserialize, Deserializer, Serialize}; +use thiserror::Error; + +use crate::errors::{ + CheckedFromRatioError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, + OverflowOperation, RoundUpOverflowError, StdError, +}; +use crate::{forward_ref_partial_eq, Decimal, Int256}; + +use super::Fraction; +use super::Int128; + +/// A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0 +/// +/// The greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18) +#[derive(Copy, Clone, Default, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] +pub struct SignedDecimal(#[schemars(with = "String")] Int128); + +forward_ref_partial_eq!(SignedDecimal, SignedDecimal); + +#[derive(Error, Debug, PartialEq, Eq)] +#[error("SignedDecimal range exceeded")] +pub struct SignedDecimalRangeExceeded; + +impl SignedDecimal { + const DECIMAL_FRACTIONAL: Int128 = Int128::new(1_000_000_000_000_000_000i128); // 1*10**18 + const DECIMAL_FRACTIONAL_SQUARED: Int128 = + Int128::new(1_000_000_000_000_000_000_000_000_000_000_000_000i128); // (1*10**18)**2 = 1*10**36 + + /// The number of decimal places. Since decimal types are fixed-point rather than + /// floating-point, this is a constant. + pub const DECIMAL_PLACES: u32 = 18; // This needs to be an even number. + /// The largest value that can be represented by this decimal type. + pub const MAX: Self = Self(Int128::MAX); + /// The smallest value that can be represented by this decimal type. + pub const MIN: Self = Self(Int128::MIN); + + /// Creates a Decimal(value) + /// This is equivalent to `Decimal::from_atomics(value, 18)` but usable in a const context. + pub const fn new(value: Int128) -> Self { + Self(value) + } + + /// Creates a Decimal(Int128(value)) + /// This is equivalent to `Decimal::from_atomics(value, 18)` but usable in a const context. + pub const fn raw(value: i128) -> Self { + Self(Int128::new(value)) + } + + /// Create a 1.0 Decimal + #[inline] + pub const fn one() -> Self { + Self(Self::DECIMAL_FRACTIONAL) + } + + /// Create a 0.0 Decimal + #[inline] + pub const fn zero() -> Self { + Self(Int128::zero()) + } + + /// Convert x% into Decimal + pub fn percent(x: i64) -> Self { + Self(((x as i128) * 10_000_000_000_000_000).into()) + } + + /// Convert permille (x/1000) into Decimal + pub fn permille(x: i64) -> Self { + Self(((x as i128) * 1_000_000_000_000_000).into()) + } + + /// Convert basis points (x/10000) into Decimal + pub fn bps(x: i64) -> Self { + Self(((x as i128) * 100_000_000_000_000).into()) + } + + /// Creates a decimal from a number of atomic units and the number + /// of decimal places. The inputs will be converted internally to form + /// a decimal with 18 decimal places. So the input 123 and 2 will create + /// the decimal 1.23. + /// + /// Using 18 decimal places is slightly more efficient than other values + /// as no internal conversion is necessary. + /// + /// ## Examples + /// + /// ``` + /// # use cosmwasm_std::{Decimal, Int128}; + /// let a = Decimal::from_atomics(Int128::new(1234), 3).unwrap(); + /// assert_eq!(a.to_string(), "1.234"); + /// + /// let a = Decimal::from_atomics(1234i128, 0).unwrap(); + /// assert_eq!(a.to_string(), "1234"); + /// + /// let a = Decimal::from_atomics(1i64, 18).unwrap(); + /// assert_eq!(a.to_string(), "0.000000000000000001"); + /// ``` + pub fn from_atomics( + atomics: impl Into, + decimal_places: u32, + ) -> Result { + let atomics = atomics.into(); + const TEN: Int128 = Int128::new(10); + Ok(match decimal_places.cmp(&(Self::DECIMAL_PLACES)) { + Ordering::Less => { + let digits = (Self::DECIMAL_PLACES) - decimal_places; // No overflow because decimal_places < DECIMAL_PLACES + let factor = TEN.checked_pow(digits).unwrap(); // Safe because digits <= 17 + Self( + atomics + .checked_mul(factor) + .map_err(|_| SignedDecimalRangeExceeded)?, + ) + } + Ordering::Equal => Self(atomics), + Ordering::Greater => { + let digits = decimal_places - (Self::DECIMAL_PLACES); // No overflow because decimal_places > DECIMAL_PLACES + if let Ok(factor) = TEN.checked_pow(digits) { + Self(atomics.checked_div(factor).unwrap()) // Safe because factor cannot be zero + } else { + // In this case `factor` exceeds the Int128 range. + // Any Int128 `x` divided by `factor` with `factor > Int128::MAX` is 0. + // Try e.g. Python3: `(2**128-1) // 2**128` + Self(Int128::zero()) + } + } + }) + } + + /// Returns the ratio (numerator / denominator) as a Decimal + pub fn from_ratio(numerator: impl Into, denominator: impl Into) -> Self { + match SignedDecimal::checked_from_ratio(numerator, denominator) { + Ok(value) => value, + Err(CheckedFromRatioError::DivideByZero) => { + panic!("Denominator must not be zero") + } + Err(CheckedFromRatioError::Overflow) => panic!("Multiplication overflow"), + } + } + + /// Returns the ratio (numerator / denominator) as a Decimal + pub fn checked_from_ratio( + numerator: impl Into, + denominator: impl Into, + ) -> Result { + let numerator: Int128 = numerator.into(); + let denominator: Int128 = denominator.into(); + match numerator.checked_multiply_ratio(Self::DECIMAL_FRACTIONAL, denominator) { + Ok(ratio) => { + // numerator * DECIMAL_FRACTIONAL / denominator + Ok(SignedDecimal(ratio)) + } + Err(CheckedMultiplyRatioError::Overflow) => Err(CheckedFromRatioError::Overflow), + Err(CheckedMultiplyRatioError::DivideByZero) => { + Err(CheckedFromRatioError::DivideByZero) + } + } + } + + #[must_use] + pub const fn is_zero(&self) -> bool { + self.0.is_zero() + } + + /// A decimal is an integer of atomic units plus a number that specifies the + /// position of the decimal dot. So any decimal can be expressed as two numbers. + /// + /// ## Examples + /// + /// ``` + /// # use cosmwasm_std::{Decimal, Int128}; + /// # use core::str::FromStr; + /// // Value with whole and fractional part + /// let a = Decimal::from_str("1.234").unwrap(); + /// assert_eq!(a.decimal_places(), 18); + /// assert_eq!(a.atomics(), Int128::new(1234000000000000000)); + /// + /// // Smallest possible value + /// let b = Decimal::from_str("0.000000000000000001").unwrap(); + /// assert_eq!(b.decimal_places(), 18); + /// assert_eq!(b.atomics(), Int128::new(1)); + /// ``` + #[must_use] + #[inline] + pub const fn atomics(&self) -> Int128 { + self.0 + } + + /// The number of decimal places. This is a constant value for now + /// but this could potentially change as the type evolves. + /// + /// See also [`Decimal::atomics()`]. + #[must_use] + #[inline] + pub const fn decimal_places(&self) -> u32 { + Self::DECIMAL_PLACES + } + + /// Rounds value down after decimal places. + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn floor(&self) -> Self { + Self((self.0 / Self::DECIMAL_FRACTIONAL) * Self::DECIMAL_FRACTIONAL) + } + + /// Rounds value up after decimal places. Panics on overflow. + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn ceil(&self) -> Self { + match self.checked_ceil() { + Ok(value) => value, + Err(_) => panic!("attempt to ceil with overflow"), + } + } + + /// Rounds value up after decimal places. Returns OverflowError on overflow. + pub fn checked_ceil(&self) -> Result { + let floor = self.floor(); + if floor == self { + Ok(floor) + } else { + floor + .checked_add(SignedDecimal::one()) + .map_err(|_| RoundUpOverflowError) + } + } + + pub fn checked_add(self, other: Self) -> Result { + self.0 + .checked_add(other.0) + .map(Self) + .map_err(|_| OverflowError::new(OverflowOperation::Add, self, other)) + } + + pub fn checked_sub(self, other: Self) -> Result { + self.0 + .checked_sub(other.0) + .map(Self) + .map_err(|_| OverflowError::new(OverflowOperation::Sub, self, other)) + } + + /// Multiplies one `Decimal` by another, returning an `OverflowError` if an overflow occurred. + pub fn checked_mul(self, other: Self) -> Result { + let result_as_int256 = + self.numerator().full_mul(other.numerator()) / Int256::from(Self::DECIMAL_FRACTIONAL); + result_as_int256 + .try_into() + .map(Self) + .map_err(|_| OverflowError { + operation: crate::OverflowOperation::Mul, + operand1: self.to_string(), + operand2: other.to_string(), + }) + } + + /// Raises a value to the power of `exp`, panics if an overflow occurred. + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn pow(self, exp: u32) -> Self { + match self.checked_pow(exp) { + Ok(value) => value, + Err(_) => panic!("Multiplication overflow"), + } + } + + /// Raises a value to the power of `exp`, returning an `OverflowError` if an overflow occurred. + pub fn checked_pow(self, exp: u32) -> Result { + // This uses the exponentiation by squaring algorithm: + // https://en.wikipedia.org/wiki/Exponentiation_by_squaring#Basic_method + + fn inner(mut x: SignedDecimal, mut n: u32) -> Result { + if n == 0 { + return Ok(SignedDecimal::one()); + } + + let mut y = SignedDecimal::one(); + + while n > 1 { + if n % 2 == 0 { + x = x.checked_mul(x)?; + n /= 2; + } else { + y = x.checked_mul(y)?; + x = x.checked_mul(x)?; + n = (n - 1) / 2; + } + } + + Ok(x * y) + } + + inner(self, exp).map_err(|_| OverflowError { + operation: crate::OverflowOperation::Pow, + operand1: self.to_string(), + operand2: exp.to_string(), + }) + } + + pub fn checked_div(self, other: Self) -> Result { + SignedDecimal::checked_from_ratio(self.numerator(), other.numerator()) + } + + pub fn checked_rem(self, other: Self) -> Result { + self.0 + .checked_rem(other.0) + .map(Self) + .map_err(|_| DivideByZeroError::new(self)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub const fn abs_diff(self, other: Self) -> Decimal { + Decimal::new(self.0.abs_diff(other.0)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn saturating_add(self, other: Self) -> Self { + match self.checked_add(other) { + Ok(value) => value, + Err(_) => Self::MAX, + } + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn saturating_sub(self, other: Self) -> Self { + match self.checked_sub(other) { + Ok(value) => value, + Err(_) => Self::zero(), + } + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn saturating_mul(self, other: Self) -> Self { + match self.checked_mul(other) { + Ok(value) => value, + Err(_) => Self::MAX, + } + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn saturating_pow(self, exp: u32) -> Self { + match self.checked_pow(exp) { + Ok(value) => value, + Err(_) => Self::MAX, + } + } + + /// Converts this decimal to an unsigned integer by truncating + /// the fractional part, e.g. 22.5 becomes 22. + /// + /// ## Examples + /// + /// ``` + /// use core::str::FromStr; + /// use cosmwasm_std::{Decimal, Int128}; + /// + /// let d = Decimal::from_str("12.345").unwrap(); + /// assert_eq!(d.to_int_floor(), Int128::new(12)); + /// + /// let d = Decimal::from_str("12.999").unwrap(); + /// assert_eq!(d.to_int_floor(), Int128::new(12)); + /// + /// let d = Decimal::from_str("75.0").unwrap(); + /// assert_eq!(d.to_int_floor(), Int128::new(75)); + /// ``` + #[must_use] + pub fn to_int_floor(self) -> Int128 { + self.0 / Self::DECIMAL_FRACTIONAL + } + + /// Converts this decimal to an unsigned integer by rounting up + /// to the next integer, e.g. 22.3 becomes 23. + /// + /// ## Examples + /// + /// ``` + /// use core::str::FromStr; + /// use cosmwasm_std::{Decimal, Int128}; + /// + /// let d = Decimal::from_str("12.345").unwrap(); + /// assert_eq!(d.to_int_ceil(), Int128::new(13)); + /// + /// let d = Decimal::from_str("12.999").unwrap(); + /// assert_eq!(d.to_int_ceil(), Int128::new(13)); + /// + /// let d = Decimal::from_str("75.0").unwrap(); + /// assert_eq!(d.to_int_ceil(), Int128::new(75)); + /// ``` + #[must_use] + pub fn to_int_ceil(self) -> Int128 { + // Using `q = 1 + ((x - 1) / y); // if x != 0` with unsigned integers x, y, q + // from https://stackoverflow.com/a/2745086/2013738. We know `x + y` CAN overflow. + let x = self.0; + let y = Self::DECIMAL_FRACTIONAL; + if x.is_zero() { + Int128::zero() + } else { + Int128::one() + ((x - Int128::one()) / y) + } + } +} + +impl Fraction for SignedDecimal { + #[inline] + fn numerator(&self) -> Int128 { + self.0 + } + + #[inline] + fn denominator(&self) -> Int128 { + Self::DECIMAL_FRACTIONAL + } + + /// Returns the multiplicative inverse `1/d` for decimal `d`. + /// + /// If `d` is zero, none is returned. + fn inv(&self) -> Option { + if self.is_zero() { + None + } else { + // Let self be p/q with p = self.0 and q = DECIMAL_FRACTIONAL. + // Now we calculate the inverse a/b = q/p such that b = DECIMAL_FRACTIONAL. Then + // `a = DECIMAL_FRACTIONAL*DECIMAL_FRACTIONAL / self.0`. + Some(SignedDecimal(Self::DECIMAL_FRACTIONAL_SQUARED / self.0)) + } + } +} + +impl FromStr for SignedDecimal { + type Err = StdError; + + /// Converts the decimal string to a Decimal + /// Possible inputs: "1.23", "1", "000012", "1.123000000" + /// Disallowed: "", ".23" + /// + /// This never performs any kind of rounding. + /// More than DECIMAL_PLACES fractional digits, even zeros, result in an error. + fn from_str(input: &str) -> Result { + let mut parts_iter = input.split('.'); + + let whole_part = parts_iter.next().unwrap(); // split always returns at least one element + let whole = whole_part + .parse::() + .map_err(|_| StdError::generic_err("Error parsing whole"))?; + let mut atomics = whole + .checked_mul(Self::DECIMAL_FRACTIONAL) + .map_err(|_| StdError::generic_err("Value too big"))?; + + if let Some(fractional_part) = parts_iter.next() { + let fractional = fractional_part + .parse::() + .map_err(|_| StdError::generic_err("Error parsing fractional"))?; + let exp = (Self::DECIMAL_PLACES.checked_sub(fractional_part.len() as u32)).ok_or_else( + || { + StdError::generic_err(format!( + "Cannot parse more than {} fractional digits", + Self::DECIMAL_PLACES + )) + }, + )?; + debug_assert!(exp <= Self::DECIMAL_PLACES); + let fractional_factor = Int128::from(10i128.pow(exp)); + atomics = atomics + .checked_add( + // The inner multiplication can't overflow because + // fractional < 10^DECIMAL_PLACES && fractional_factor <= 10^DECIMAL_PLACES + fractional.checked_mul(fractional_factor).unwrap(), + ) + .map_err(|_| StdError::generic_err("Value too big"))?; + } + + if parts_iter.next().is_some() { + return Err(StdError::generic_err("Unexpected number of dots")); + } + + Ok(SignedDecimal(atomics)) + } +} + +impl fmt::Display for SignedDecimal { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let whole = (self.0) / Self::DECIMAL_FRACTIONAL; + let fractional = (self.0).checked_rem(Self::DECIMAL_FRACTIONAL).unwrap(); + + if fractional.is_zero() { + write!(f, "{whole}") + } else { + let fractional_string = format!( + "{:0>padding$}", + fractional, + padding = Self::DECIMAL_PLACES as usize + ); + f.write_str(&whole.to_string())?; + f.write_char('.')?; + f.write_str(fractional_string.trim_end_matches('0'))?; + Ok(()) + } + } +} + +impl fmt::Debug for SignedDecimal { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "Decimal({self})") + } +} + +impl Add for SignedDecimal { + type Output = Self; + + fn add(self, other: Self) -> Self { + SignedDecimal(self.0 + other.0) + } +} +forward_ref_binop!(impl Add, add for SignedDecimal, SignedDecimal); + +impl AddAssign for SignedDecimal { + fn add_assign(&mut self, rhs: SignedDecimal) { + *self = *self + rhs; + } +} +forward_ref_op_assign!(impl AddAssign, add_assign for SignedDecimal, SignedDecimal); + +impl Sub for SignedDecimal { + type Output = Self; + + fn sub(self, other: Self) -> Self { + SignedDecimal(self.0 - other.0) + } +} +forward_ref_binop!(impl Sub, sub for SignedDecimal, SignedDecimal); + +impl SubAssign for SignedDecimal { + fn sub_assign(&mut self, rhs: SignedDecimal) { + *self = *self - rhs; + } +} +forward_ref_op_assign!(impl SubAssign, sub_assign for SignedDecimal, SignedDecimal); + +impl Mul for SignedDecimal { + type Output = Self; + + #[allow(clippy::suspicious_arithmetic_impl)] + fn mul(self, other: Self) -> Self { + // Decimals are fractions. We can multiply two decimals a and b + // via + // (a.numerator() * b.numerator()) / (a.denominator() * b.denominator()) + // = (a.numerator() * b.numerator()) / a.denominator() / b.denominator() + + let result_as_int256 = + self.numerator().full_mul(other.numerator()) / Int256::from(Self::DECIMAL_FRACTIONAL); + match result_as_int256.try_into() { + Ok(result) => Self(result), + Err(_) => panic!("attempt to multiply with overflow"), + } + } +} +forward_ref_binop!(impl Mul, mul for SignedDecimal, SignedDecimal); + +impl MulAssign for SignedDecimal { + fn mul_assign(&mut self, rhs: SignedDecimal) { + *self = *self * rhs; + } +} +forward_ref_op_assign!(impl MulAssign, mul_assign for SignedDecimal, SignedDecimal); + +impl Div for SignedDecimal { + type Output = Self; + + fn div(self, other: Self) -> Self { + match SignedDecimal::checked_from_ratio(self.numerator(), other.numerator()) { + Ok(ratio) => ratio, + Err(CheckedFromRatioError::DivideByZero) => { + panic!("Division failed - denominator must not be zero") + } + Err(CheckedFromRatioError::Overflow) => { + panic!("Division failed - multiplication overflow") + } + } + } +} +forward_ref_binop!(impl Div, div for SignedDecimal, SignedDecimal); + +impl DivAssign for SignedDecimal { + fn div_assign(&mut self, rhs: SignedDecimal) { + *self = *self / rhs; + } +} +forward_ref_op_assign!(impl DivAssign, div_assign for SignedDecimal, SignedDecimal); + +impl Div for SignedDecimal { + type Output = Self; + + fn div(self, rhs: Int128) -> Self::Output { + SignedDecimal(self.0 / rhs) + } +} + +impl DivAssign for SignedDecimal { + fn div_assign(&mut self, rhs: Int128) { + self.0 /= rhs; + } +} + +impl Rem for SignedDecimal { + type Output = Self; + + /// # Panics + /// + /// This operation will panic if `rhs` is zero + #[inline] + fn rem(self, rhs: Self) -> Self { + Self(self.0.rem(rhs.0)) + } +} +forward_ref_binop!(impl Rem, rem for SignedDecimal, SignedDecimal); + +impl RemAssign for SignedDecimal { + fn rem_assign(&mut self, rhs: SignedDecimal) { + *self = *self % rhs; + } +} +forward_ref_op_assign!(impl RemAssign, rem_assign for SignedDecimal, SignedDecimal); + +impl
core::iter::Sum for SignedDecimal +where + Self: Add, +{ + fn sum>(iter: I) -> Self { + iter.fold(Self::zero(), Add::add) + } +} + +/// Serializes as a decimal string +impl Serialize for SignedDecimal { + fn serialize(&self, serializer: S) -> Result + where + S: ser::Serializer, + { + serializer.serialize_str(&self.to_string()) + } +} + +/// Deserializes as a base64 string +impl<'de> Deserialize<'de> for SignedDecimal { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_str(DecimalVisitor) + } +} + +struct DecimalVisitor; + +impl<'de> de::Visitor<'de> for DecimalVisitor { + type Value = SignedDecimal; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("string-encoded decimal") + } + + fn visit_str(self, v: &str) -> Result + where + E: de::Error, + { + match SignedDecimal::from_str(v) { + Ok(d) => Ok(d), + Err(e) => Err(E::custom(format!("Error parsing decimal '{v}': {e}"))), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{from_slice, to_vec}; + + fn dec(input: &str) -> SignedDecimal { + SignedDecimal::from_str(input).unwrap() + } + + #[test] + fn decimal_new() { + let expected = Int128::from(300i128); + assert_eq!(SignedDecimal::new(expected).0, expected); + } + + #[test] + fn decimal_raw() { + let value = 300i128; + assert_eq!(SignedDecimal::raw(value).0.i128(), value); + } + + #[test] + fn decimal_one() { + let value = SignedDecimal::one(); + assert_eq!(value.0, SignedDecimal::DECIMAL_FRACTIONAL); + } + + #[test] + fn decimal_zero() { + let value = SignedDecimal::zero(); + assert!(value.0.is_zero()); + } + + #[test] + fn decimal_percent() { + let value = SignedDecimal::percent(50); + assert_eq!( + value.0, + SignedDecimal::DECIMAL_FRACTIONAL / Int128::from(2u8) + ); + } + + #[test] + fn decimal_permille() { + let value = SignedDecimal::permille(125); + assert_eq!( + value.0, + SignedDecimal::DECIMAL_FRACTIONAL / Int128::from(8u8) + ); + } + + #[test] + fn decimal_bps() { + let value = SignedDecimal::bps(125); + assert_eq!( + value.0, + SignedDecimal::DECIMAL_FRACTIONAL / Int128::from(80u8) + ); + } + + #[test] + fn decimal_from_atomics_works() { + let one = SignedDecimal::one(); + let two = one + one; + + assert_eq!(SignedDecimal::from_atomics(1i128, 0).unwrap(), one); + assert_eq!(SignedDecimal::from_atomics(10i128, 1).unwrap(), one); + assert_eq!(SignedDecimal::from_atomics(100i128, 2).unwrap(), one); + assert_eq!(SignedDecimal::from_atomics(1000i128, 3).unwrap(), one); + assert_eq!( + SignedDecimal::from_atomics(1000000000000000000i128, 18).unwrap(), + one + ); + assert_eq!( + SignedDecimal::from_atomics(10000000000000000000i128, 19).unwrap(), + one + ); + assert_eq!( + SignedDecimal::from_atomics(100000000000000000000i128, 20).unwrap(), + one + ); + + assert_eq!(SignedDecimal::from_atomics(2i128, 0).unwrap(), two); + assert_eq!(SignedDecimal::from_atomics(20i128, 1).unwrap(), two); + assert_eq!(SignedDecimal::from_atomics(200i128, 2).unwrap(), two); + assert_eq!(SignedDecimal::from_atomics(2000i128, 3).unwrap(), two); + assert_eq!( + SignedDecimal::from_atomics(2000000000000000000i128, 18).unwrap(), + two + ); + assert_eq!( + SignedDecimal::from_atomics(20000000000000000000i128, 19).unwrap(), + two + ); + assert_eq!( + SignedDecimal::from_atomics(200000000000000000000i128, 20).unwrap(), + two + ); + + // Cuts decimal digits (20 provided but only 18 can be stored) + assert_eq!( + SignedDecimal::from_atomics(4321i128, 20).unwrap(), + SignedDecimal::from_str("0.000000000000000043").unwrap() + ); + assert_eq!( + SignedDecimal::from_atomics(6789i128, 20).unwrap(), + SignedDecimal::from_str("0.000000000000000067").unwrap() + ); + assert_eq!( + SignedDecimal::from_atomics(i128::MAX, 38).unwrap(), + SignedDecimal::from_str("3.402823669209384634").unwrap() + ); + assert_eq!( + SignedDecimal::from_atomics(i128::MAX, 39).unwrap(), + SignedDecimal::from_str("0.340282366920938463").unwrap() + ); + assert_eq!( + SignedDecimal::from_atomics(i128::MAX, 45).unwrap(), + SignedDecimal::from_str("0.000000340282366920").unwrap() + ); + assert_eq!( + SignedDecimal::from_atomics(i128::MAX, 51).unwrap(), + SignedDecimal::from_str("0.000000000000340282").unwrap() + ); + assert_eq!( + SignedDecimal::from_atomics(i128::MAX, 56).unwrap(), + SignedDecimal::from_str("0.000000000000000003").unwrap() + ); + assert_eq!( + SignedDecimal::from_atomics(i128::MAX, 57).unwrap(), + SignedDecimal::from_str("0.000000000000000000").unwrap() + ); + assert_eq!( + SignedDecimal::from_atomics(i128::MAX, u32::MAX).unwrap(), + SignedDecimal::from_str("0.000000000000000000").unwrap() + ); + + // Can be used with max value + let max = SignedDecimal::MAX; + assert_eq!( + SignedDecimal::from_atomics(max.atomics(), max.decimal_places()).unwrap(), + max + ); + + // Overflow is only possible with digits < 18 + let result = SignedDecimal::from_atomics(i128::MAX, 17); + assert_eq!(result.unwrap_err(), SignedDecimalRangeExceeded); + } + + #[test] + fn decimal_from_ratio_works() { + // 1.0 + assert_eq!( + SignedDecimal::from_ratio(1i128, 1i128), + SignedDecimal::one() + ); + assert_eq!( + SignedDecimal::from_ratio(53i128, 53i128), + SignedDecimal::one() + ); + assert_eq!( + SignedDecimal::from_ratio(125i128, 125i128), + SignedDecimal::one() + ); + + // 1.5 + assert_eq!( + SignedDecimal::from_ratio(3i128, 2i128), + SignedDecimal::percent(150) + ); + assert_eq!( + SignedDecimal::from_ratio(150i128, 100i128), + SignedDecimal::percent(150) + ); + assert_eq!( + SignedDecimal::from_ratio(333i128, 222i128), + SignedDecimal::percent(150) + ); + + // 0.125 + assert_eq!( + SignedDecimal::from_ratio(1i64, 8i64), + SignedDecimal::permille(125) + ); + assert_eq!( + SignedDecimal::from_ratio(125i64, 1000i64), + SignedDecimal::permille(125) + ); + + // 1/3 (result floored) + assert_eq!( + SignedDecimal::from_ratio(1i64, 3i64), + SignedDecimal(Int128::from(333_333_333_333_333_333i128)) + ); + + // 2/3 (result floored) + assert_eq!( + SignedDecimal::from_ratio(2i64, 3i64), + SignedDecimal(Int128::from(666_666_666_666_666_666i128)) + ); + + // large inputs + assert_eq!( + SignedDecimal::from_ratio(0i128, i128::MAX), + SignedDecimal::zero() + ); + assert_eq!( + SignedDecimal::from_ratio(i128::MAX, i128::MAX), + SignedDecimal::one() + ); + // 340282366920938463463 is the largest integer <= Decimal::MAX + assert_eq!( + SignedDecimal::from_ratio(340282366920938463463i128, 1i128), + SignedDecimal::from_str("340282366920938463463").unwrap() + ); + } + + #[test] + #[should_panic(expected = "Denominator must not be zero")] + fn decimal_from_ratio_panics_for_zero_denominator() { + SignedDecimal::from_ratio(1i128, 0i128); + } + + #[test] + #[should_panic(expected = "Multiplication overflow")] + fn decimal_from_ratio_panics_for_mul_overflow() { + SignedDecimal::from_ratio(i128::MAX, 1i128); + } + + #[test] + fn decimal_checked_from_ratio_does_not_panic() { + assert_eq!( + SignedDecimal::checked_from_ratio(1i128, 0i128), + Err(CheckedFromRatioError::DivideByZero) + ); + + assert_eq!( + SignedDecimal::checked_from_ratio(i128::MAX, 1i128), + Err(CheckedFromRatioError::Overflow) + ); + } + + #[test] + fn decimal_implements_fraction() { + let fraction = SignedDecimal::from_str("1234.567").unwrap(); + assert_eq!( + fraction.numerator(), + Int128::from(1_234_567_000_000_000_000_000i128) + ); + assert_eq!( + fraction.denominator(), + Int128::from(1_000_000_000_000_000_000i128) + ); + } + + #[test] + fn decimal_from_str_works() { + // Integers + assert_eq!( + SignedDecimal::from_str("0").unwrap(), + SignedDecimal::percent(0) + ); + assert_eq!( + SignedDecimal::from_str("1").unwrap(), + SignedDecimal::percent(100) + ); + assert_eq!( + SignedDecimal::from_str("5").unwrap(), + SignedDecimal::percent(500) + ); + assert_eq!( + SignedDecimal::from_str("42").unwrap(), + SignedDecimal::percent(4200) + ); + assert_eq!( + SignedDecimal::from_str("000").unwrap(), + SignedDecimal::percent(0) + ); + assert_eq!( + SignedDecimal::from_str("001").unwrap(), + SignedDecimal::percent(100) + ); + assert_eq!( + SignedDecimal::from_str("005").unwrap(), + SignedDecimal::percent(500) + ); + assert_eq!( + SignedDecimal::from_str("0042").unwrap(), + SignedDecimal::percent(4200) + ); + + // Decimals + assert_eq!( + SignedDecimal::from_str("1.0").unwrap(), + SignedDecimal::percent(100) + ); + assert_eq!( + SignedDecimal::from_str("1.5").unwrap(), + SignedDecimal::percent(150) + ); + assert_eq!( + SignedDecimal::from_str("0.5").unwrap(), + SignedDecimal::percent(50) + ); + assert_eq!( + SignedDecimal::from_str("0.123").unwrap(), + SignedDecimal::permille(123) + ); + + assert_eq!( + SignedDecimal::from_str("40.00").unwrap(), + SignedDecimal::percent(4000) + ); + assert_eq!( + SignedDecimal::from_str("04.00").unwrap(), + SignedDecimal::percent(400) + ); + assert_eq!( + SignedDecimal::from_str("00.40").unwrap(), + SignedDecimal::percent(40) + ); + assert_eq!( + SignedDecimal::from_str("00.04").unwrap(), + SignedDecimal::percent(4) + ); + + // Can handle DECIMAL_PLACES fractional digits + assert_eq!( + SignedDecimal::from_str("7.123456789012345678").unwrap(), + SignedDecimal(Int128::from(7123456789012345678i128)) + ); + assert_eq!( + SignedDecimal::from_str("7.999999999999999999").unwrap(), + SignedDecimal(Int128::from(7999999999999999999i128)) + ); + + // Works for documented max value + assert_eq!( + SignedDecimal::from_str("340282366920938463463.374607431768211455").unwrap(), + SignedDecimal::MAX + ); + } + + #[test] + fn decimal_from_str_errors_for_broken_whole_part() { + match SignedDecimal::from_str("").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing whole"), + e => panic!("Unexpected error: {e:?}"), + } + + match SignedDecimal::from_str(" ").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing whole"), + e => panic!("Unexpected error: {e:?}"), + } + + match SignedDecimal::from_str("-1").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing whole"), + e => panic!("Unexpected error: {e:?}"), + } + } + + #[test] + fn decimal_from_str_errors_for_broken_fractinal_part() { + match SignedDecimal::from_str("1.").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), + e => panic!("Unexpected error: {e:?}"), + } + + match SignedDecimal::from_str("1. ").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), + e => panic!("Unexpected error: {e:?}"), + } + + match SignedDecimal::from_str("1.e").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), + e => panic!("Unexpected error: {e:?}"), + } + + match SignedDecimal::from_str("1.2e3").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), + e => panic!("Unexpected error: {e:?}"), + } + } + + #[test] + fn decimal_from_str_errors_for_more_than_18_fractional_digits() { + match SignedDecimal::from_str("7.1234567890123456789").unwrap_err() { + StdError::GenericErr { msg, .. } => { + assert_eq!(msg, "Cannot parse more than 18 fractional digits",) + } + e => panic!("Unexpected error: {e:?}"), + } + + // No special rules for trailing zeros. This could be changed but adds gas cost for the happy path. + match SignedDecimal::from_str("7.1230000000000000000").unwrap_err() { + StdError::GenericErr { msg, .. } => { + assert_eq!(msg, "Cannot parse more than 18 fractional digits") + } + e => panic!("Unexpected error: {e:?}"), + } + } + + #[test] + fn decimal_from_str_errors_for_invalid_number_of_dots() { + match SignedDecimal::from_str("1.2.3").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Unexpected number of dots"), + e => panic!("Unexpected error: {e:?}"), + } + + match SignedDecimal::from_str("1.2.3.4").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Unexpected number of dots"), + e => panic!("Unexpected error: {e:?}"), + } + } + + #[test] + fn decimal_from_str_errors_for_more_than_max_value() { + // Integer + match SignedDecimal::from_str("340282366920938463464").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), + e => panic!("Unexpected error: {e:?}"), + } + + // Decimal + match SignedDecimal::from_str("340282366920938463464.0").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), + e => panic!("Unexpected error: {e:?}"), + } + match SignedDecimal::from_str("340282366920938463463.374607431768211456").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), + e => panic!("Unexpected error: {e:?}"), + } + } + + #[test] + fn decimal_atomics_works() { + let zero = SignedDecimal::zero(); + let one = SignedDecimal::one(); + let half = SignedDecimal::percent(50); + let two = SignedDecimal::percent(200); + let max = SignedDecimal::MAX; + + assert_eq!(zero.atomics(), Int128::new(0)); + assert_eq!(one.atomics(), Int128::new(1000000000000000000)); + assert_eq!(half.atomics(), Int128::new(500000000000000000)); + assert_eq!(two.atomics(), Int128::new(2000000000000000000)); + assert_eq!(max.atomics(), Int128::MAX); + } + + #[test] + fn decimal_decimal_places_works() { + let zero = SignedDecimal::zero(); + let one = SignedDecimal::one(); + let half = SignedDecimal::percent(50); + let two = SignedDecimal::percent(200); + let max = SignedDecimal::MAX; + + assert_eq!(zero.decimal_places(), 18); + assert_eq!(one.decimal_places(), 18); + assert_eq!(half.decimal_places(), 18); + assert_eq!(two.decimal_places(), 18); + assert_eq!(max.decimal_places(), 18); + } + + #[test] + fn decimal_is_zero_works() { + assert!(SignedDecimal::zero().is_zero()); + assert!(SignedDecimal::percent(0).is_zero()); + assert!(SignedDecimal::permille(0).is_zero()); + + assert!(!SignedDecimal::one().is_zero()); + assert!(!SignedDecimal::percent(123).is_zero()); + assert!(!SignedDecimal::permille(1234).is_zero()); + } + + #[test] + fn decimal_inv_works() { + // d = 0 + assert_eq!(SignedDecimal::zero().inv(), None); + + // d == 1 + assert_eq!(SignedDecimal::one().inv(), Some(SignedDecimal::one())); + + // d > 1 exact + assert_eq!( + SignedDecimal::from_str("2").unwrap().inv(), + Some(SignedDecimal::from_str("0.5").unwrap()) + ); + assert_eq!( + SignedDecimal::from_str("20").unwrap().inv(), + Some(SignedDecimal::from_str("0.05").unwrap()) + ); + assert_eq!( + SignedDecimal::from_str("200").unwrap().inv(), + Some(SignedDecimal::from_str("0.005").unwrap()) + ); + assert_eq!( + SignedDecimal::from_str("2000").unwrap().inv(), + Some(SignedDecimal::from_str("0.0005").unwrap()) + ); + + // d > 1 rounded + assert_eq!( + SignedDecimal::from_str("3").unwrap().inv(), + Some(SignedDecimal::from_str("0.333333333333333333").unwrap()) + ); + assert_eq!( + SignedDecimal::from_str("6").unwrap().inv(), + Some(SignedDecimal::from_str("0.166666666666666666").unwrap()) + ); + + // d < 1 exact + assert_eq!( + SignedDecimal::from_str("0.5").unwrap().inv(), + Some(SignedDecimal::from_str("2").unwrap()) + ); + assert_eq!( + SignedDecimal::from_str("0.05").unwrap().inv(), + Some(SignedDecimal::from_str("20").unwrap()) + ); + assert_eq!( + SignedDecimal::from_str("0.005").unwrap().inv(), + Some(SignedDecimal::from_str("200").unwrap()) + ); + assert_eq!( + SignedDecimal::from_str("0.0005").unwrap().inv(), + Some(SignedDecimal::from_str("2000").unwrap()) + ); + } + + #[test] + #[allow(clippy::op_ref)] + fn decimal_add_works() { + let value = SignedDecimal::one() + SignedDecimal::percent(50); // 1.5 + assert_eq!( + value.0, + SignedDecimal::DECIMAL_FRACTIONAL * Int128::from(3u8) / Int128::from(2u8) + ); + + assert_eq!( + SignedDecimal::percent(5) + SignedDecimal::percent(4), + SignedDecimal::percent(9) + ); + assert_eq!( + SignedDecimal::percent(5) + SignedDecimal::zero(), + SignedDecimal::percent(5) + ); + assert_eq!( + SignedDecimal::zero() + SignedDecimal::zero(), + SignedDecimal::zero() + ); + + // works for refs + let a = SignedDecimal::percent(15); + let b = SignedDecimal::percent(25); + let expected = SignedDecimal::percent(40); + assert_eq!(a + b, expected); + assert_eq!(&a + b, expected); + assert_eq!(a + &b, expected); + assert_eq!(&a + &b, expected); + } + + #[test] + #[should_panic(expected = "attempt to add with overflow")] + fn decimal_add_overflow_panics() { + let _value = SignedDecimal::MAX + SignedDecimal::percent(50); + } + + #[test] + fn decimal_add_assign_works() { + let mut a = SignedDecimal::percent(30); + a += SignedDecimal::percent(20); + assert_eq!(a, SignedDecimal::percent(50)); + + // works for refs + let mut a = SignedDecimal::percent(15); + let b = SignedDecimal::percent(3); + let expected = SignedDecimal::percent(18); + a += &b; + assert_eq!(a, expected); + } + + #[test] + #[allow(clippy::op_ref)] + fn decimal_sub_works() { + let value = SignedDecimal::one() - SignedDecimal::percent(50); // 0.5 + assert_eq!( + value.0, + SignedDecimal::DECIMAL_FRACTIONAL / Int128::from(2u8) + ); + + assert_eq!( + SignedDecimal::percent(9) - SignedDecimal::percent(4), + SignedDecimal::percent(5) + ); + assert_eq!( + SignedDecimal::percent(16) - SignedDecimal::zero(), + SignedDecimal::percent(16) + ); + assert_eq!( + SignedDecimal::percent(16) - SignedDecimal::percent(16), + SignedDecimal::zero() + ); + assert_eq!( + SignedDecimal::zero() - SignedDecimal::zero(), + SignedDecimal::zero() + ); + + // works for refs + let a = SignedDecimal::percent(13); + let b = SignedDecimal::percent(6); + let expected = SignedDecimal::percent(7); + assert_eq!(a - b, expected); + assert_eq!(&a - b, expected); + assert_eq!(a - &b, expected); + assert_eq!(&a - &b, expected); + } + + #[test] + #[should_panic(expected = "attempt to subtract with overflow")] + fn decimal_sub_overflow_panics() { + let _value = SignedDecimal::zero() - SignedDecimal::percent(50); + } + + #[test] + fn decimal_sub_assign_works() { + let mut a = SignedDecimal::percent(20); + a -= SignedDecimal::percent(2); + assert_eq!(a, SignedDecimal::percent(18)); + + // works for refs + let mut a = SignedDecimal::percent(33); + let b = SignedDecimal::percent(13); + let expected = SignedDecimal::percent(20); + a -= &b; + assert_eq!(a, expected); + } + + #[test] + #[allow(clippy::op_ref)] + fn decimal_implements_mul() { + let one = SignedDecimal::one(); + let two = one + one; + let half = SignedDecimal::percent(50); + + // 1*x and x*1 + assert_eq!(one * SignedDecimal::percent(0), SignedDecimal::percent(0)); + assert_eq!(one * SignedDecimal::percent(1), SignedDecimal::percent(1)); + assert_eq!(one * SignedDecimal::percent(10), SignedDecimal::percent(10)); + assert_eq!( + one * SignedDecimal::percent(100), + SignedDecimal::percent(100) + ); + assert_eq!( + one * SignedDecimal::percent(1000), + SignedDecimal::percent(1000) + ); + assert_eq!(one * SignedDecimal::MAX, SignedDecimal::MAX); + assert_eq!(SignedDecimal::percent(0) * one, SignedDecimal::percent(0)); + assert_eq!(SignedDecimal::percent(1) * one, SignedDecimal::percent(1)); + assert_eq!(SignedDecimal::percent(10) * one, SignedDecimal::percent(10)); + assert_eq!( + SignedDecimal::percent(100) * one, + SignedDecimal::percent(100) + ); + assert_eq!( + SignedDecimal::percent(1000) * one, + SignedDecimal::percent(1000) + ); + assert_eq!(SignedDecimal::MAX * one, SignedDecimal::MAX); + + // double + assert_eq!(two * SignedDecimal::percent(0), SignedDecimal::percent(0)); + assert_eq!(two * SignedDecimal::percent(1), SignedDecimal::percent(2)); + assert_eq!(two * SignedDecimal::percent(10), SignedDecimal::percent(20)); + assert_eq!( + two * SignedDecimal::percent(100), + SignedDecimal::percent(200) + ); + assert_eq!( + two * SignedDecimal::percent(1000), + SignedDecimal::percent(2000) + ); + assert_eq!(SignedDecimal::percent(0) * two, SignedDecimal::percent(0)); + assert_eq!(SignedDecimal::percent(1) * two, SignedDecimal::percent(2)); + assert_eq!(SignedDecimal::percent(10) * two, SignedDecimal::percent(20)); + assert_eq!( + SignedDecimal::percent(100) * two, + SignedDecimal::percent(200) + ); + assert_eq!( + SignedDecimal::percent(1000) * two, + SignedDecimal::percent(2000) + ); + + // half + assert_eq!(half * SignedDecimal::percent(0), SignedDecimal::percent(0)); + assert_eq!(half * SignedDecimal::percent(1), SignedDecimal::permille(5)); + assert_eq!(half * SignedDecimal::percent(10), SignedDecimal::percent(5)); + assert_eq!( + half * SignedDecimal::percent(100), + SignedDecimal::percent(50) + ); + assert_eq!( + half * SignedDecimal::percent(1000), + SignedDecimal::percent(500) + ); + assert_eq!(SignedDecimal::percent(0) * half, SignedDecimal::percent(0)); + assert_eq!(SignedDecimal::percent(1) * half, SignedDecimal::permille(5)); + assert_eq!(SignedDecimal::percent(10) * half, SignedDecimal::percent(5)); + assert_eq!( + SignedDecimal::percent(100) * half, + SignedDecimal::percent(50) + ); + assert_eq!( + SignedDecimal::percent(1000) * half, + SignedDecimal::percent(500) + ); + + // Move left + let a = dec("123.127726548762582"); + assert_eq!(a * dec("1"), dec("123.127726548762582")); + assert_eq!(a * dec("10"), dec("1231.27726548762582")); + assert_eq!(a * dec("100"), dec("12312.7726548762582")); + assert_eq!(a * dec("1000"), dec("123127.726548762582")); + assert_eq!(a * dec("1000000"), dec("123127726.548762582")); + assert_eq!(a * dec("1000000000"), dec("123127726548.762582")); + assert_eq!(a * dec("1000000000000"), dec("123127726548762.582")); + assert_eq!(a * dec("1000000000000000"), dec("123127726548762582")); + assert_eq!(a * dec("1000000000000000000"), dec("123127726548762582000")); + assert_eq!(dec("1") * a, dec("123.127726548762582")); + assert_eq!(dec("10") * a, dec("1231.27726548762582")); + assert_eq!(dec("100") * a, dec("12312.7726548762582")); + assert_eq!(dec("1000") * a, dec("123127.726548762582")); + assert_eq!(dec("1000000") * a, dec("123127726.548762582")); + assert_eq!(dec("1000000000") * a, dec("123127726548.762582")); + assert_eq!(dec("1000000000000") * a, dec("123127726548762.582")); + assert_eq!(dec("1000000000000000") * a, dec("123127726548762582")); + assert_eq!(dec("1000000000000000000") * a, dec("123127726548762582000")); + + // Move right + let max = SignedDecimal::MAX; + assert_eq!( + max * dec("1.0"), + dec("340282366920938463463.374607431768211455") + ); + assert_eq!( + max * dec("0.1"), + dec("34028236692093846346.337460743176821145") + ); + assert_eq!( + max * dec("0.01"), + dec("3402823669209384634.633746074317682114") + ); + assert_eq!( + max * dec("0.001"), + dec("340282366920938463.463374607431768211") + ); + assert_eq!( + max * dec("0.000001"), + dec("340282366920938.463463374607431768") + ); + assert_eq!( + max * dec("0.000000001"), + dec("340282366920.938463463374607431") + ); + assert_eq!( + max * dec("0.000000000001"), + dec("340282366.920938463463374607") + ); + assert_eq!( + max * dec("0.000000000000001"), + dec("340282.366920938463463374") + ); + assert_eq!( + max * dec("0.000000000000000001"), + dec("340.282366920938463463") + ); + + // works for refs + let a = SignedDecimal::percent(20); + let b = SignedDecimal::percent(30); + let expected = SignedDecimal::percent(6); + assert_eq!(a * b, expected); + assert_eq!(&a * b, expected); + assert_eq!(a * &b, expected); + assert_eq!(&a * &b, expected); + } + + #[test] + fn decimal_mul_assign_works() { + let mut a = SignedDecimal::percent(15); + a *= SignedDecimal::percent(60); + assert_eq!(a, SignedDecimal::percent(9)); + + // works for refs + let mut a = SignedDecimal::percent(50); + let b = SignedDecimal::percent(20); + a *= &b; + assert_eq!(a, SignedDecimal::percent(10)); + } + + #[test] + #[should_panic(expected = "attempt to multiply with overflow")] + fn decimal_mul_overflow_panics() { + let _value = SignedDecimal::MAX * SignedDecimal::percent(101); + } + + #[test] + fn decimal_checked_mul() { + let test_data = [ + (SignedDecimal::zero(), SignedDecimal::zero()), + (SignedDecimal::zero(), SignedDecimal::one()), + (SignedDecimal::one(), SignedDecimal::zero()), + (SignedDecimal::percent(10), SignedDecimal::zero()), + (SignedDecimal::percent(10), SignedDecimal::percent(5)), + (SignedDecimal::MAX, SignedDecimal::one()), + ( + SignedDecimal::MAX / Int128::new(2), + SignedDecimal::percent(200), + ), + (SignedDecimal::permille(6), SignedDecimal::permille(13)), + ]; + + // The regular core::ops::Mul is our source of truth for these tests. + for (x, y) in test_data.into_iter() { + assert_eq!(x * y, x.checked_mul(y).unwrap()); + } + } + + #[test] + fn decimal_checked_mul_overflow() { + assert_eq!( + SignedDecimal::MAX.checked_mul(SignedDecimal::percent(200)), + Err(OverflowError { + operation: crate::OverflowOperation::Mul, + operand1: SignedDecimal::MAX.to_string(), + operand2: SignedDecimal::percent(200).to_string(), + }) + ); + } + + #[test] + #[allow(clippy::op_ref)] + fn decimal_implements_div() { + let one = SignedDecimal::one(); + let two = one + one; + let half = SignedDecimal::percent(50); + + // 1/x and x/1 + assert_eq!( + one / SignedDecimal::percent(1), + SignedDecimal::percent(10_000) + ); + assert_eq!( + one / SignedDecimal::percent(10), + SignedDecimal::percent(1_000) + ); + assert_eq!( + one / SignedDecimal::percent(100), + SignedDecimal::percent(100) + ); + assert_eq!( + one / SignedDecimal::percent(1000), + SignedDecimal::percent(10) + ); + assert_eq!(SignedDecimal::percent(0) / one, SignedDecimal::percent(0)); + assert_eq!(SignedDecimal::percent(1) / one, SignedDecimal::percent(1)); + assert_eq!(SignedDecimal::percent(10) / one, SignedDecimal::percent(10)); + assert_eq!( + SignedDecimal::percent(100) / one, + SignedDecimal::percent(100) + ); + assert_eq!( + SignedDecimal::percent(1000) / one, + SignedDecimal::percent(1000) + ); + + // double + assert_eq!( + two / SignedDecimal::percent(1), + SignedDecimal::percent(20_000) + ); + assert_eq!( + two / SignedDecimal::percent(10), + SignedDecimal::percent(2_000) + ); + assert_eq!( + two / SignedDecimal::percent(100), + SignedDecimal::percent(200) + ); + assert_eq!( + two / SignedDecimal::percent(1000), + SignedDecimal::percent(20) + ); + assert_eq!(SignedDecimal::percent(0) / two, SignedDecimal::percent(0)); + assert_eq!(SignedDecimal::percent(1) / two, dec("0.005")); + assert_eq!(SignedDecimal::percent(10) / two, SignedDecimal::percent(5)); + assert_eq!( + SignedDecimal::percent(100) / two, + SignedDecimal::percent(50) + ); + assert_eq!( + SignedDecimal::percent(1000) / two, + SignedDecimal::percent(500) + ); + + // half + assert_eq!( + half / SignedDecimal::percent(1), + SignedDecimal::percent(5_000) + ); + assert_eq!( + half / SignedDecimal::percent(10), + SignedDecimal::percent(500) + ); + assert_eq!( + half / SignedDecimal::percent(100), + SignedDecimal::percent(50) + ); + assert_eq!( + half / SignedDecimal::percent(1000), + SignedDecimal::percent(5) + ); + assert_eq!(SignedDecimal::percent(0) / half, SignedDecimal::percent(0)); + assert_eq!(SignedDecimal::percent(1) / half, SignedDecimal::percent(2)); + assert_eq!( + SignedDecimal::percent(10) / half, + SignedDecimal::percent(20) + ); + assert_eq!( + SignedDecimal::percent(100) / half, + SignedDecimal::percent(200) + ); + assert_eq!( + SignedDecimal::percent(1000) / half, + SignedDecimal::percent(2000) + ); + + // Move right + let a = dec("123127726548762582"); + assert_eq!(a / dec("1"), dec("123127726548762582")); + assert_eq!(a / dec("10"), dec("12312772654876258.2")); + assert_eq!(a / dec("100"), dec("1231277265487625.82")); + assert_eq!(a / dec("1000"), dec("123127726548762.582")); + assert_eq!(a / dec("1000000"), dec("123127726548.762582")); + assert_eq!(a / dec("1000000000"), dec("123127726.548762582")); + assert_eq!(a / dec("1000000000000"), dec("123127.726548762582")); + assert_eq!(a / dec("1000000000000000"), dec("123.127726548762582")); + assert_eq!(a / dec("1000000000000000000"), dec("0.123127726548762582")); + assert_eq!(dec("1") / a, dec("0.000000000000000008")); + assert_eq!(dec("10") / a, dec("0.000000000000000081")); + assert_eq!(dec("100") / a, dec("0.000000000000000812")); + assert_eq!(dec("1000") / a, dec("0.000000000000008121")); + assert_eq!(dec("1000000") / a, dec("0.000000000008121647")); + assert_eq!(dec("1000000000") / a, dec("0.000000008121647560")); + assert_eq!(dec("1000000000000") / a, dec("0.000008121647560868")); + assert_eq!(dec("1000000000000000") / a, dec("0.008121647560868164")); + assert_eq!(dec("1000000000000000000") / a, dec("8.121647560868164773")); + + // Move left + let a = dec("0.123127726548762582"); + assert_eq!(a / dec("1.0"), dec("0.123127726548762582")); + assert_eq!(a / dec("0.1"), dec("1.23127726548762582")); + assert_eq!(a / dec("0.01"), dec("12.3127726548762582")); + assert_eq!(a / dec("0.001"), dec("123.127726548762582")); + assert_eq!(a / dec("0.000001"), dec("123127.726548762582")); + assert_eq!(a / dec("0.000000001"), dec("123127726.548762582")); + assert_eq!(a / dec("0.000000000001"), dec("123127726548.762582")); + assert_eq!(a / dec("0.000000000000001"), dec("123127726548762.582")); + assert_eq!(a / dec("0.000000000000000001"), dec("123127726548762582")); + + assert_eq!( + SignedDecimal::percent(15) / SignedDecimal::percent(60), + SignedDecimal::percent(25) + ); + + // works for refs + let a = SignedDecimal::percent(100); + let b = SignedDecimal::percent(20); + let expected = SignedDecimal::percent(500); + assert_eq!(a / b, expected); + assert_eq!(&a / b, expected); + assert_eq!(a / &b, expected); + assert_eq!(&a / &b, expected); + } + + #[test] + fn decimal_div_assign_works() { + let mut a = SignedDecimal::percent(15); + a /= SignedDecimal::percent(20); + assert_eq!(a, SignedDecimal::percent(75)); + + // works for refs + let mut a = SignedDecimal::percent(50); + let b = SignedDecimal::percent(20); + a /= &b; + assert_eq!(a, SignedDecimal::percent(250)); + } + + #[test] + #[should_panic(expected = "Division failed - multiplication overflow")] + fn decimal_div_overflow_panics() { + let _value = SignedDecimal::MAX / SignedDecimal::percent(10); + } + + #[test] + #[should_panic(expected = "Division failed - denominator must not be zero")] + fn decimal_div_by_zero_panics() { + let _value = SignedDecimal::one() / SignedDecimal::zero(); + } + + #[test] + fn decimal_int128_division() { + // a/b + let left = SignedDecimal::percent(150); // 1.5 + let right = Int128::new(3); + assert_eq!(left / right, SignedDecimal::percent(50)); + + // 0/a + let left = SignedDecimal::zero(); + let right = Int128::new(300); + assert_eq!(left / right, SignedDecimal::zero()); + } + + #[test] + #[should_panic(expected = "attempt to divide by zero")] + fn decimal_int128_divide_by_zero() { + let left = SignedDecimal::percent(150); // 1.5 + let right = Int128::new(0); + let _result = left / right; + } + + #[test] + fn decimal_int128_div_assign() { + // a/b + let mut dec = SignedDecimal::percent(150); // 1.5 + dec /= Int128::new(3); + assert_eq!(dec, SignedDecimal::percent(50)); + + // 0/a + let mut dec = SignedDecimal::zero(); + dec /= Int128::new(300); + assert_eq!(dec, SignedDecimal::zero()); + } + + #[test] + #[should_panic(expected = "attempt to divide by zero")] + fn decimal_int128_div_assign_by_zero() { + // a/0 + let mut dec = SignedDecimal::percent(50); + dec /= Int128::new(0); + } + + #[test] + fn decimal_checked_pow() { + for exp in 0..10 { + assert_eq!( + SignedDecimal::one().checked_pow(exp).unwrap(), + SignedDecimal::one() + ); + } + + // This case is mathematically undefined but we ensure consistency with Rust stdandard types + // https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=20df6716048e77087acd40194b233494 + assert_eq!( + SignedDecimal::zero().checked_pow(0).unwrap(), + SignedDecimal::one() + ); + + for exp in 1..10 { + assert_eq!( + SignedDecimal::zero().checked_pow(exp).unwrap(), + SignedDecimal::zero() + ); + } + + for num in &[ + SignedDecimal::percent(50), + SignedDecimal::percent(99), + SignedDecimal::percent(200), + ] { + assert_eq!(num.checked_pow(0).unwrap(), SignedDecimal::one()) + } + + assert_eq!( + SignedDecimal::percent(20).checked_pow(2).unwrap(), + SignedDecimal::percent(4) + ); + + assert_eq!( + SignedDecimal::percent(20).checked_pow(3).unwrap(), + SignedDecimal::permille(8) + ); + + assert_eq!( + SignedDecimal::percent(200).checked_pow(4).unwrap(), + SignedDecimal::percent(1600) + ); + + assert_eq!( + SignedDecimal::percent(200).checked_pow(4).unwrap(), + SignedDecimal::percent(1600) + ); + + assert_eq!( + SignedDecimal::percent(700).checked_pow(5).unwrap(), + SignedDecimal::percent(1680700) + ); + + assert_eq!( + SignedDecimal::percent(700).checked_pow(8).unwrap(), + SignedDecimal::percent(576480100) + ); + + assert_eq!( + SignedDecimal::percent(700).checked_pow(10).unwrap(), + SignedDecimal::percent(28247524900) + ); + + assert_eq!( + SignedDecimal::percent(120).checked_pow(123).unwrap(), + SignedDecimal(5486473221892422150877397607i128.into()) + ); + + assert_eq!( + SignedDecimal::percent(10).checked_pow(2).unwrap(), + SignedDecimal(10000000000000000i128.into()) + ); + + assert_eq!( + SignedDecimal::percent(10).checked_pow(18).unwrap(), + SignedDecimal(1i128.into()) + ); + } + + #[test] + fn decimal_checked_pow_overflow() { + assert_eq!( + SignedDecimal::MAX.checked_pow(2), + Err(OverflowError { + operation: crate::OverflowOperation::Pow, + operand1: SignedDecimal::MAX.to_string(), + operand2: "2".to_string(), + }) + ); + } + + #[test] + fn decimal_to_string() { + // Integers + assert_eq!(SignedDecimal::zero().to_string(), "0"); + assert_eq!(SignedDecimal::one().to_string(), "1"); + assert_eq!(SignedDecimal::percent(500).to_string(), "5"); + + // Decimals + assert_eq!(SignedDecimal::percent(125).to_string(), "1.25"); + assert_eq!(SignedDecimal::percent(42638).to_string(), "426.38"); + assert_eq!(SignedDecimal::percent(3).to_string(), "0.03"); + assert_eq!(SignedDecimal::permille(987).to_string(), "0.987"); + + assert_eq!( + SignedDecimal(Int128::from(1i128)).to_string(), + "0.000000000000000001" + ); + assert_eq!( + SignedDecimal(Int128::from(10i128)).to_string(), + "0.00000000000000001" + ); + assert_eq!( + SignedDecimal(Int128::from(100i128)).to_string(), + "0.0000000000000001" + ); + assert_eq!( + SignedDecimal(Int128::from(1000i128)).to_string(), + "0.000000000000001" + ); + assert_eq!( + SignedDecimal(Int128::from(10000i128)).to_string(), + "0.00000000000001" + ); + assert_eq!( + SignedDecimal(Int128::from(100000i128)).to_string(), + "0.0000000000001" + ); + assert_eq!( + SignedDecimal(Int128::from(1000000i128)).to_string(), + "0.000000000001" + ); + assert_eq!( + SignedDecimal(Int128::from(10000000i128)).to_string(), + "0.00000000001" + ); + assert_eq!( + SignedDecimal(Int128::from(100000000i128)).to_string(), + "0.0000000001" + ); + assert_eq!( + SignedDecimal(Int128::from(1000000000i128)).to_string(), + "0.000000001" + ); + assert_eq!( + SignedDecimal(Int128::from(10000000000i128)).to_string(), + "0.00000001" + ); + assert_eq!( + SignedDecimal(Int128::from(100000000000i128)).to_string(), + "0.0000001" + ); + assert_eq!( + SignedDecimal(Int128::from(10000000000000i128)).to_string(), + "0.00001" + ); + assert_eq!( + SignedDecimal(Int128::from(100000000000000i128)).to_string(), + "0.0001" + ); + assert_eq!( + SignedDecimal(Int128::from(1000000000000000i128)).to_string(), + "0.001" + ); + assert_eq!( + SignedDecimal(Int128::from(10000000000000000i128)).to_string(), + "0.01" + ); + assert_eq!( + SignedDecimal(Int128::from(100000000000000000i128)).to_string(), + "0.1" + ); + } + + #[test] + fn decimal_iter_sum() { + let items = vec![ + SignedDecimal::zero(), + SignedDecimal(Int128::from(2i128)), + SignedDecimal(Int128::from(2i128)), + ]; + assert_eq!( + items.iter().sum::(), + SignedDecimal(Int128::from(4i128)) + ); + assert_eq!( + items.into_iter().sum::(), + SignedDecimal(Int128::from(4i128)) + ); + + let empty: Vec = vec![]; + assert_eq!(SignedDecimal::zero(), empty.iter().sum::()); + } + + #[test] + fn decimal_serialize() { + assert_eq!(to_vec(&SignedDecimal::zero()).unwrap(), br#""0""#); + assert_eq!(to_vec(&SignedDecimal::one()).unwrap(), br#""1""#); + assert_eq!(to_vec(&SignedDecimal::percent(8)).unwrap(), br#""0.08""#); + assert_eq!(to_vec(&SignedDecimal::percent(87)).unwrap(), br#""0.87""#); + assert_eq!(to_vec(&SignedDecimal::percent(876)).unwrap(), br#""8.76""#); + assert_eq!( + to_vec(&SignedDecimal::percent(8765)).unwrap(), + br#""87.65""# + ); + } + + #[test] + fn decimal_deserialize() { + assert_eq!( + from_slice::(br#""0""#).unwrap(), + SignedDecimal::zero() + ); + assert_eq!( + from_slice::(br#""1""#).unwrap(), + SignedDecimal::one() + ); + assert_eq!( + from_slice::(br#""000""#).unwrap(), + SignedDecimal::zero() + ); + assert_eq!( + from_slice::(br#""001""#).unwrap(), + SignedDecimal::one() + ); + + assert_eq!( + from_slice::(br#""0.08""#).unwrap(), + SignedDecimal::percent(8) + ); + assert_eq!( + from_slice::(br#""0.87""#).unwrap(), + SignedDecimal::percent(87) + ); + assert_eq!( + from_slice::(br#""8.76""#).unwrap(), + SignedDecimal::percent(876) + ); + assert_eq!( + from_slice::(br#""87.65""#).unwrap(), + SignedDecimal::percent(8765) + ); + } + + #[test] + fn decimal_abs_diff_works() { + let a = SignedDecimal::percent(285); + let b = SignedDecimal::percent(200); + let expected = Decimal::percent(85); + assert_eq!(a.abs_diff(b), expected); + assert_eq!(b.abs_diff(a), expected); + + let a = SignedDecimal::percent(-200); + let b = SignedDecimal::percent(200); + let expected = Decimal::percent(400); + assert_eq!(a.abs_diff(b), expected); + assert_eq!(b.abs_diff(a), expected); + } + + #[test] + #[allow(clippy::op_ref)] + fn decimal_rem_works() { + // 4.02 % 1.11 = 0.69 + assert_eq!( + SignedDecimal::percent(402) % SignedDecimal::percent(111), + SignedDecimal::percent(69) + ); + + // 15.25 % 4 = 3.25 + assert_eq!( + SignedDecimal::percent(1525) % SignedDecimal::percent(400), + SignedDecimal::percent(325) + ); + + let a = SignedDecimal::percent(318); + let b = SignedDecimal::percent(317); + let expected = SignedDecimal::percent(1); + assert_eq!(a % b, expected); + assert_eq!(a % &b, expected); + assert_eq!(&a % b, expected); + assert_eq!(&a % &b, expected); + } + + #[test] + fn decimal_rem_assign_works() { + let mut a = SignedDecimal::percent(17673); + a %= SignedDecimal::percent(2362); + assert_eq!(a, SignedDecimal::percent(1139)); // 176.73 % 23.62 = 11.39 + + let mut a = SignedDecimal::percent(4262); + let b = SignedDecimal::percent(1270); + a %= &b; + assert_eq!(a, SignedDecimal::percent(452)); // 42.62 % 12.7 = 4.52 + } + + #[test] + #[should_panic(expected = "divisor of zero")] + fn decimal_rem_panics_for_zero() { + let _ = SignedDecimal::percent(777) % SignedDecimal::zero(); + } + + #[test] + fn decimal_checked_methods() { + // checked add + assert_eq!( + SignedDecimal::percent(402) + .checked_add(SignedDecimal::percent(111)) + .unwrap(), + SignedDecimal::percent(513) + ); + assert!(matches!( + SignedDecimal::MAX.checked_add(SignedDecimal::percent(1)), + Err(OverflowError { .. }) + )); + + // checked sub + assert_eq!( + SignedDecimal::percent(1111) + .checked_sub(SignedDecimal::percent(111)) + .unwrap(), + SignedDecimal::percent(1000) + ); + assert!(matches!( + SignedDecimal::zero().checked_sub(SignedDecimal::percent(1)), + Err(OverflowError { .. }) + )); + + // checked div + assert_eq!( + SignedDecimal::percent(30) + .checked_div(SignedDecimal::percent(200)) + .unwrap(), + SignedDecimal::percent(15) + ); + assert_eq!( + SignedDecimal::percent(88) + .checked_div(SignedDecimal::percent(20)) + .unwrap(), + SignedDecimal::percent(440) + ); + assert!(matches!( + SignedDecimal::MAX.checked_div(SignedDecimal::zero()), + Err(CheckedFromRatioError::DivideByZero {}) + )); + assert!(matches!( + SignedDecimal::MAX.checked_div(SignedDecimal::percent(1)), + Err(CheckedFromRatioError::Overflow {}) + )); + + // checked rem + assert_eq!( + SignedDecimal::percent(402) + .checked_rem(SignedDecimal::percent(111)) + .unwrap(), + SignedDecimal::percent(69) + ); + assert_eq!( + SignedDecimal::percent(1525) + .checked_rem(SignedDecimal::percent(400)) + .unwrap(), + SignedDecimal::percent(325) + ); + assert!(matches!( + SignedDecimal::MAX.checked_rem(SignedDecimal::zero()), + Err(DivideByZeroError { .. }) + )); + } + + #[test] + fn decimal_pow_works() { + assert_eq!( + SignedDecimal::percent(200).pow(2), + SignedDecimal::percent(400) + ); + assert_eq!( + SignedDecimal::percent(200).pow(10), + SignedDecimal::percent(102400) + ); + } + + #[test] + #[should_panic] + fn decimal_pow_overflow_panics() { + _ = SignedDecimal::MAX.pow(2u32); + } + + #[test] + fn decimal_saturating_works() { + assert_eq!( + SignedDecimal::percent(200).saturating_add(SignedDecimal::percent(200)), + SignedDecimal::percent(400) + ); + assert_eq!( + SignedDecimal::MAX.saturating_add(SignedDecimal::percent(200)), + SignedDecimal::MAX + ); + assert_eq!( + SignedDecimal::percent(200).saturating_sub(SignedDecimal::percent(100)), + SignedDecimal::percent(100) + ); + assert_eq!( + SignedDecimal::zero().saturating_sub(SignedDecimal::percent(200)), + SignedDecimal::zero() + ); + assert_eq!( + SignedDecimal::percent(200).saturating_mul(SignedDecimal::percent(50)), + SignedDecimal::percent(100) + ); + assert_eq!( + SignedDecimal::MAX.saturating_mul(SignedDecimal::percent(200)), + SignedDecimal::MAX + ); + assert_eq!( + SignedDecimal::percent(400).saturating_pow(2u32), + SignedDecimal::percent(1600) + ); + assert_eq!(SignedDecimal::MAX.saturating_pow(2u32), SignedDecimal::MAX); + } + + #[test] + fn decimal_rounding() { + assert_eq!(SignedDecimal::one().floor(), SignedDecimal::one()); + assert_eq!(SignedDecimal::percent(150).floor(), SignedDecimal::one()); + assert_eq!(SignedDecimal::percent(199).floor(), SignedDecimal::one()); + assert_eq!( + SignedDecimal::percent(200).floor(), + SignedDecimal::percent(200) + ); + assert_eq!(SignedDecimal::percent(99).floor(), SignedDecimal::zero()); + + assert_eq!(SignedDecimal::one().ceil(), SignedDecimal::one()); + assert_eq!( + SignedDecimal::percent(150).ceil(), + SignedDecimal::percent(200) + ); + assert_eq!( + SignedDecimal::percent(199).ceil(), + SignedDecimal::percent(200) + ); + assert_eq!(SignedDecimal::percent(99).ceil(), SignedDecimal::one()); + assert_eq!( + SignedDecimal(Int128::from(1i128)).ceil(), + SignedDecimal::one() + ); + } + + #[test] + #[should_panic(expected = "attempt to ceil with overflow")] + fn decimal_ceil_panics() { + let _ = SignedDecimal::MAX.ceil(); + } + + #[test] + fn decimal_checked_ceil() { + assert_eq!( + SignedDecimal::percent(199).checked_ceil(), + Ok(SignedDecimal::percent(200)) + ); + assert!(matches!( + SignedDecimal::MAX.checked_ceil(), + Err(RoundUpOverflowError { .. }) + )); + } + + #[test] + fn decimal_to_int_floor_works() { + let d = SignedDecimal::from_str("12.000000000000000001").unwrap(); + assert_eq!(d.to_int_floor(), Int128::new(12)); + let d = SignedDecimal::from_str("12.345").unwrap(); + assert_eq!(d.to_int_floor(), Int128::new(12)); + let d = SignedDecimal::from_str("12.999").unwrap(); + assert_eq!(d.to_int_floor(), Int128::new(12)); + let d = SignedDecimal::from_str("0.98451384").unwrap(); + assert_eq!(d.to_int_floor(), Int128::new(0)); + + let d = SignedDecimal::from_str("75.0").unwrap(); + assert_eq!(d.to_int_floor(), Int128::new(75)); + let d = SignedDecimal::from_str("0.0").unwrap(); + assert_eq!(d.to_int_floor(), Int128::new(0)); + + let d = SignedDecimal::MAX; + assert_eq!(d.to_int_floor(), Int128::new(340282366920938463463)); + } + + #[test] + fn decimal_to_int_ceil_works() { + let d = SignedDecimal::from_str("12.000000000000000001").unwrap(); + assert_eq!(d.to_int_ceil(), Int128::new(13)); + let d = SignedDecimal::from_str("12.345").unwrap(); + assert_eq!(d.to_int_ceil(), Int128::new(13)); + let d = SignedDecimal::from_str("12.999").unwrap(); + assert_eq!(d.to_int_ceil(), Int128::new(13)); + + let d = SignedDecimal::from_str("75.0").unwrap(); + assert_eq!(d.to_int_ceil(), Int128::new(75)); + let d = SignedDecimal::from_str("0.0").unwrap(); + assert_eq!(d.to_int_ceil(), Int128::new(0)); + + let d = SignedDecimal::MAX; + assert_eq!(d.to_int_ceil(), Int128::new(340282366920938463464)); + } + + #[test] + fn decimal_partial_eq() { + let test_cases = [ + ("1", "1", true), + ("0.5", "0.5", true), + ("0.5", "0.51", false), + ("0", "0.00000", true), + ] + .into_iter() + .map(|(lhs, rhs, expected)| (dec(lhs), dec(rhs), expected)); + + #[allow(clippy::op_ref)] + for (lhs, rhs, expected) in test_cases { + assert_eq!(lhs == rhs, expected); + assert_eq!(&lhs == rhs, expected); + assert_eq!(lhs == &rhs, expected); + assert_eq!(&lhs == &rhs, expected); + } + } + + #[test] + fn decimal_implements_debug() { + let decimal = SignedDecimal::from_str("123.45").unwrap(); + assert_eq!(format!("{decimal:?}"), "Decimal(123.45)"); + + let test_cases = ["5", "5.01", "42", "0", "2"]; + for s in test_cases { + let decimal = SignedDecimal::from_str(s).unwrap(); + let expected = format!("Decimal({s})"); + assert_eq!(format!("{decimal:?}"), expected); + } + } +} From 4f4c88f2b97ca3a1f8dc77936bf0fa40be05b285 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 4 Aug 2023 18:14:16 +0200 Subject: [PATCH 0739/2372] Fix some tests --- packages/std/src/lib.rs | 3 +- packages/std/src/math/signed_decimal.rs | 266 +++++++++++++----------- 2 files changed, 148 insertions(+), 121 deletions(-) diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index ac4b9d696c..6c6454ffe2 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -61,7 +61,8 @@ pub use crate::ibc::{ pub use crate::iterator::{Order, Record}; pub use crate::math::{ Decimal, Decimal256, Decimal256RangeExceeded, DecimalRangeExceeded, Fraction, Int128, Int256, - Int512, Int64, Isqrt, Uint128, Uint256, Uint512, Uint64, + Int512, Int64, Isqrt, SignedDecimal, SignedDecimalRangeExceeded, Uint128, Uint256, Uint512, + Uint64, }; pub use crate::metadata::{DenomMetadata, DenomUnit}; pub use crate::never::Never; diff --git a/packages/std/src/math/signed_decimal.rs b/packages/std/src/math/signed_decimal.rs index ecce917b70..b2eadbef6b 100644 --- a/packages/std/src/math/signed_decimal.rs +++ b/packages/std/src/math/signed_decimal.rs @@ -1,6 +1,8 @@ use core::cmp::Ordering; use core::fmt::{self, Write}; -use core::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Rem, RemAssign, Sub, SubAssign}; +use core::ops::{ + Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Rem, RemAssign, Sub, SubAssign, +}; use core::str::FromStr; use forward_ref::{forward_ref_binop, forward_ref_op_assign}; use schemars::JsonSchema; @@ -16,9 +18,10 @@ use crate::{forward_ref_partial_eq, Decimal, Int256}; use super::Fraction; use super::Int128; -/// A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0 +/// A signed fixed-point decimal value with 18 fractional digits, i.e. SignedDecimal(1_000_000_000_000_000_000) == 1.0 /// -/// The greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18) +/// The greatest possible value that can be represented is 170141183460469231731.687303715884105727 (which is (2^127 - 1) / 10^18) +/// and the smallest is -170141183460469231731.687303715884105728 (which is -2^127 / 10^18). #[derive(Copy, Clone, Default, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] pub struct SignedDecimal(#[schemars(with = "String")] Int128); @@ -36,53 +39,59 @@ impl SignedDecimal { /// The number of decimal places. Since decimal types are fixed-point rather than /// floating-point, this is a constant. pub const DECIMAL_PLACES: u32 = 18; // This needs to be an even number. - /// The largest value that can be represented by this decimal type. + /// The largest value that can be represented by this signed decimal type. pub const MAX: Self = Self(Int128::MAX); - /// The smallest value that can be represented by this decimal type. + /// The smallest value that can be represented by this signed decimal type. pub const MIN: Self = Self(Int128::MIN); - /// Creates a Decimal(value) + /// Creates a SignedDecimal(value) /// This is equivalent to `Decimal::from_atomics(value, 18)` but usable in a const context. pub const fn new(value: Int128) -> Self { Self(value) } - /// Creates a Decimal(Int128(value)) - /// This is equivalent to `Decimal::from_atomics(value, 18)` but usable in a const context. + /// Creates a SignedDecimal(Int128(value)) + /// This is equivalent to `SignedDecimal::from_atomics(value, 18)` but usable in a const context. pub const fn raw(value: i128) -> Self { Self(Int128::new(value)) } - /// Create a 1.0 Decimal + /// Create a 1.0 SignedDecimal #[inline] pub const fn one() -> Self { Self(Self::DECIMAL_FRACTIONAL) } - /// Create a 0.0 Decimal + /// Create a -1.0 SignedDecimal + #[inline] + pub const fn negative_one() -> Self { + Self(Int128::new(-Self::DECIMAL_FRACTIONAL.i128())) + } + + /// Create a 0.0 SignedDecimal #[inline] pub const fn zero() -> Self { Self(Int128::zero()) } - /// Convert x% into Decimal + /// Convert x% into SignedDecimal pub fn percent(x: i64) -> Self { Self(((x as i128) * 10_000_000_000_000_000).into()) } - /// Convert permille (x/1000) into Decimal + /// Convert permille (x/1000) into SignedDecimal pub fn permille(x: i64) -> Self { Self(((x as i128) * 1_000_000_000_000_000).into()) } - /// Convert basis points (x/10000) into Decimal + /// Convert basis points (x/10000) into SignedDecimal pub fn bps(x: i64) -> Self { Self(((x as i128) * 100_000_000_000_000).into()) } - /// Creates a decimal from a number of atomic units and the number + /// Creates a signed decimal from a number of atomic units and the number /// of decimal places. The inputs will be converted internally to form - /// a decimal with 18 decimal places. So the input 123 and 2 will create + /// a signed decimal with 18 decimal places. So the input 123 and 2 will create /// the decimal 1.23. /// /// Using 18 decimal places is slightly more efficient than other values @@ -91,15 +100,18 @@ impl SignedDecimal { /// ## Examples /// /// ``` - /// # use cosmwasm_std::{Decimal, Int128}; - /// let a = Decimal::from_atomics(Int128::new(1234), 3).unwrap(); + /// # use cosmwasm_std::{SignedDecimal, Int128}; + /// let a = SignedDecimal::from_atomics(Int128::new(1234), 3).unwrap(); /// assert_eq!(a.to_string(), "1.234"); /// - /// let a = Decimal::from_atomics(1234i128, 0).unwrap(); + /// let a = SignedDecimal::from_atomics(1234i128, 0).unwrap(); /// assert_eq!(a.to_string(), "1234"); /// - /// let a = Decimal::from_atomics(1i64, 18).unwrap(); + /// let a = SignedDecimal::from_atomics(1i64, 18).unwrap(); /// assert_eq!(a.to_string(), "0.000000000000000001"); + /// + /// let a = SignedDecimal::from_atomics(-1i64, 18).unwrap(); + /// assert_eq!(a.to_string(), "-0.000000000000000001"); /// ``` pub fn from_atomics( atomics: impl Into, @@ -132,7 +144,7 @@ impl SignedDecimal { }) } - /// Returns the ratio (numerator / denominator) as a Decimal + /// Returns the ratio (numerator / denominator) as a SignedDecimal pub fn from_ratio(numerator: impl Into, denominator: impl Into) -> Self { match SignedDecimal::checked_from_ratio(numerator, denominator) { Ok(value) => value, @@ -143,7 +155,7 @@ impl SignedDecimal { } } - /// Returns the ratio (numerator / denominator) as a Decimal + /// Returns the ratio (numerator / denominator) as a SignedDecimal pub fn checked_from_ratio( numerator: impl Into, denominator: impl Into, @@ -173,15 +185,15 @@ impl SignedDecimal { /// ## Examples /// /// ``` - /// # use cosmwasm_std::{Decimal, Int128}; + /// # use cosmwasm_std::{SignedDecimal, Int128}; /// # use core::str::FromStr; /// // Value with whole and fractional part - /// let a = Decimal::from_str("1.234").unwrap(); + /// let a = SignedDecimal::from_str("1.234").unwrap(); /// assert_eq!(a.decimal_places(), 18); /// assert_eq!(a.atomics(), Int128::new(1234000000000000000)); /// /// // Smallest possible value - /// let b = Decimal::from_str("0.000000000000000001").unwrap(); + /// let b = SignedDecimal::from_str("0.000000000000000001").unwrap(); /// assert_eq!(b.decimal_places(), 18); /// assert_eq!(b.atomics(), Int128::new(1)); /// ``` @@ -194,7 +206,7 @@ impl SignedDecimal { /// The number of decimal places. This is a constant value for now /// but this could potentially change as the type evolves. /// - /// See also [`Decimal::atomics()`]. + /// See also [`SignedDecimal::atomics()`]. #[must_use] #[inline] pub const fn decimal_places(&self) -> u32 { @@ -355,13 +367,13 @@ impl SignedDecimal { /// use core::str::FromStr; /// use cosmwasm_std::{Decimal, Int128}; /// - /// let d = Decimal::from_str("12.345").unwrap(); + /// let d = SignedDecimal::from_str("12.345").unwrap(); /// assert_eq!(d.to_int_floor(), Int128::new(12)); /// - /// let d = Decimal::from_str("12.999").unwrap(); + /// let d = SignedDecimal::from_str("12.999").unwrap(); /// assert_eq!(d.to_int_floor(), Int128::new(12)); /// - /// let d = Decimal::from_str("75.0").unwrap(); + /// let d = SignedDecimal::from_str("75.0").unwrap(); /// assert_eq!(d.to_int_floor(), Int128::new(75)); /// ``` #[must_use] @@ -378,13 +390,13 @@ impl SignedDecimal { /// use core::str::FromStr; /// use cosmwasm_std::{Decimal, Int128}; /// - /// let d = Decimal::from_str("12.345").unwrap(); + /// let d = SignedDecimal::from_str("12.345").unwrap(); /// assert_eq!(d.to_int_ceil(), Int128::new(13)); /// - /// let d = Decimal::from_str("12.999").unwrap(); + /// let d = SignedDecimal::from_str("12.999").unwrap(); /// assert_eq!(d.to_int_ceil(), Int128::new(13)); /// - /// let d = Decimal::from_str("75.0").unwrap(); + /// let d = SignedDecimal::from_str("75.0").unwrap(); /// assert_eq!(d.to_int_ceil(), Int128::new(75)); /// ``` #[must_use] @@ -427,10 +439,18 @@ impl Fraction for SignedDecimal { } } +impl Neg for SignedDecimal { + type Output = Self; + + fn neg(self) -> Self::Output { + Self(-self.0) + } +} + impl FromStr for SignedDecimal { type Err = StdError; - /// Converts the decimal string to a Decimal + /// Converts the decimal string to a SignedDecimal /// Possible inputs: "1.23", "1", "000012", "1.123000000" /// Disallowed: "", ".23" /// @@ -542,7 +562,7 @@ impl Mul for SignedDecimal { #[allow(clippy::suspicious_arithmetic_impl)] fn mul(self, other: Self) -> Self { - // Decimals are fractions. We can multiply two decimals a and b + // SignedDecimals are fractions. We can multiply two decimals a and b // via // (a.numerator() * b.numerator()) / (a.denominator() * b.denominator()) // = (a.numerator() * b.numerator()) / a.denominator() / b.denominator() @@ -647,13 +667,13 @@ impl<'de> Deserialize<'de> for SignedDecimal { where D: Deserializer<'de>, { - deserializer.deserialize_str(DecimalVisitor) + deserializer.deserialize_str(SignedDecimalVisitor) } } -struct DecimalVisitor; +struct SignedDecimalVisitor; -impl<'de> de::Visitor<'de> for DecimalVisitor { +impl<'de> de::Visitor<'de> for SignedDecimalVisitor { type Value = SignedDecimal; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { @@ -681,31 +701,31 @@ mod tests { } #[test] - fn decimal_new() { + fn signed_decimal_new() { let expected = Int128::from(300i128); assert_eq!(SignedDecimal::new(expected).0, expected); } #[test] - fn decimal_raw() { + fn signed_decimal_raw() { let value = 300i128; assert_eq!(SignedDecimal::raw(value).0.i128(), value); } #[test] - fn decimal_one() { + fn signed_decimal_one() { let value = SignedDecimal::one(); assert_eq!(value.0, SignedDecimal::DECIMAL_FRACTIONAL); } #[test] - fn decimal_zero() { + fn signed_decimal_zero() { let value = SignedDecimal::zero(); assert!(value.0.is_zero()); } #[test] - fn decimal_percent() { + fn signed_decimal_percent() { let value = SignedDecimal::percent(50); assert_eq!( value.0, @@ -714,7 +734,7 @@ mod tests { } #[test] - fn decimal_permille() { + fn signed_decimal_permille() { let value = SignedDecimal::permille(125); assert_eq!( value.0, @@ -723,7 +743,7 @@ mod tests { } #[test] - fn decimal_bps() { + fn signed_decimal_bps() { let value = SignedDecimal::bps(125); assert_eq!( value.0, @@ -732,7 +752,7 @@ mod tests { } #[test] - fn decimal_from_atomics_works() { + fn signed_decimal_from_atomics_works() { let one = SignedDecimal::one(); let two = one + one; @@ -821,7 +841,7 @@ mod tests { } #[test] - fn decimal_from_ratio_works() { + fn signed_decimal_from_ratio_works() { // 1.0 assert_eq!( SignedDecimal::from_ratio(1i128, 1i128), @@ -881,27 +901,27 @@ mod tests { SignedDecimal::from_ratio(i128::MAX, i128::MAX), SignedDecimal::one() ); - // 340282366920938463463 is the largest integer <= Decimal::MAX + // 170141183460469231731 is the largest integer <= SignedDecimal::MAX assert_eq!( - SignedDecimal::from_ratio(340282366920938463463i128, 1i128), - SignedDecimal::from_str("340282366920938463463").unwrap() + SignedDecimal::from_ratio(170141183460469231731i128, 1i128), + SignedDecimal::from_str("170141183460469231731").unwrap() ); } #[test] #[should_panic(expected = "Denominator must not be zero")] - fn decimal_from_ratio_panics_for_zero_denominator() { + fn signed_decimal_from_ratio_panics_for_zero_denominator() { SignedDecimal::from_ratio(1i128, 0i128); } #[test] #[should_panic(expected = "Multiplication overflow")] - fn decimal_from_ratio_panics_for_mul_overflow() { + fn signed_decimal_from_ratio_panics_for_mul_overflow() { SignedDecimal::from_ratio(i128::MAX, 1i128); } #[test] - fn decimal_checked_from_ratio_does_not_panic() { + fn signed_decimal_checked_from_ratio_does_not_panic() { assert_eq!( SignedDecimal::checked_from_ratio(1i128, 0i128), Err(CheckedFromRatioError::DivideByZero) @@ -914,7 +934,7 @@ mod tests { } #[test] - fn decimal_implements_fraction() { + fn signed_decimal_implements_fraction() { let fraction = SignedDecimal::from_str("1234.567").unwrap(); assert_eq!( fraction.numerator(), @@ -927,7 +947,7 @@ mod tests { } #[test] - fn decimal_from_str_works() { + fn signed_decimal_from_str_works() { // Integers assert_eq!( SignedDecimal::from_str("0").unwrap(), @@ -962,7 +982,7 @@ mod tests { SignedDecimal::percent(4200) ); - // Decimals + // SignedDecimals assert_eq!( SignedDecimal::from_str("1.0").unwrap(), SignedDecimal::percent(100) @@ -1009,13 +1029,13 @@ mod tests { // Works for documented max value assert_eq!( - SignedDecimal::from_str("340282366920938463463.374607431768211455").unwrap(), + SignedDecimal::from_str("170141183460469231731.687303715884105727").unwrap(), SignedDecimal::MAX ); } #[test] - fn decimal_from_str_errors_for_broken_whole_part() { + fn signed_decimal_from_str_errors_for_broken_whole_part() { match SignedDecimal::from_str("").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing whole"), e => panic!("Unexpected error: {e:?}"), @@ -1033,7 +1053,7 @@ mod tests { } #[test] - fn decimal_from_str_errors_for_broken_fractinal_part() { + fn signed_decimal_from_str_errors_for_broken_fractinal_part() { match SignedDecimal::from_str("1.").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), e => panic!("Unexpected error: {e:?}"), @@ -1056,7 +1076,7 @@ mod tests { } #[test] - fn decimal_from_str_errors_for_more_than_18_fractional_digits() { + fn signed_decimal_from_str_errors_for_more_than_18_fractional_digits() { match SignedDecimal::from_str("7.1234567890123456789").unwrap_err() { StdError::GenericErr { msg, .. } => { assert_eq!(msg, "Cannot parse more than 18 fractional digits",) @@ -1074,7 +1094,7 @@ mod tests { } #[test] - fn decimal_from_str_errors_for_invalid_number_of_dots() { + fn signed_decimal_from_str_errors_for_invalid_number_of_dots() { match SignedDecimal::from_str("1.2.3").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Unexpected number of dots"), e => panic!("Unexpected error: {e:?}"), @@ -1087,26 +1107,26 @@ mod tests { } #[test] - fn decimal_from_str_errors_for_more_than_max_value() { + fn signed_decimal_from_str_errors_for_more_than_max_value() { // Integer - match SignedDecimal::from_str("340282366920938463464").unwrap_err() { + match SignedDecimal::from_str("170141183460469231732").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), e => panic!("Unexpected error: {e:?}"), } - // Decimal - match SignedDecimal::from_str("340282366920938463464.0").unwrap_err() { + // SignedDecimal + match SignedDecimal::from_str("170141183460469231732.0").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), e => panic!("Unexpected error: {e:?}"), } - match SignedDecimal::from_str("340282366920938463463.374607431768211456").unwrap_err() { + match SignedDecimal::from_str("170141183460469231731.687303715884105728").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), e => panic!("Unexpected error: {e:?}"), } } #[test] - fn decimal_atomics_works() { + fn signed_decimal_atomics_works() { let zero = SignedDecimal::zero(); let one = SignedDecimal::one(); let half = SignedDecimal::percent(50); @@ -1121,7 +1141,7 @@ mod tests { } #[test] - fn decimal_decimal_places_works() { + fn signed_decimal_decimal_places_works() { let zero = SignedDecimal::zero(); let one = SignedDecimal::one(); let half = SignedDecimal::percent(50); @@ -1136,7 +1156,7 @@ mod tests { } #[test] - fn decimal_is_zero_works() { + fn signed_decimal_is_zero_works() { assert!(SignedDecimal::zero().is_zero()); assert!(SignedDecimal::percent(0).is_zero()); assert!(SignedDecimal::permille(0).is_zero()); @@ -1147,7 +1167,7 @@ mod tests { } #[test] - fn decimal_inv_works() { + fn signed_decimal_inv_works() { // d = 0 assert_eq!(SignedDecimal::zero().inv(), None); @@ -1203,7 +1223,7 @@ mod tests { #[test] #[allow(clippy::op_ref)] - fn decimal_add_works() { + fn signed_decimal_add_works() { let value = SignedDecimal::one() + SignedDecimal::percent(50); // 1.5 assert_eq!( value.0, @@ -1235,12 +1255,12 @@ mod tests { #[test] #[should_panic(expected = "attempt to add with overflow")] - fn decimal_add_overflow_panics() { + fn signed_decimal_add_overflow_panics() { let _value = SignedDecimal::MAX + SignedDecimal::percent(50); } #[test] - fn decimal_add_assign_works() { + fn signed_decimal_add_assign_works() { let mut a = SignedDecimal::percent(30); a += SignedDecimal::percent(20); assert_eq!(a, SignedDecimal::percent(50)); @@ -1255,7 +1275,7 @@ mod tests { #[test] #[allow(clippy::op_ref)] - fn decimal_sub_works() { + fn signed_decimal_sub_works() { let value = SignedDecimal::one() - SignedDecimal::percent(50); // 0.5 assert_eq!( value.0, @@ -1291,12 +1311,12 @@ mod tests { #[test] #[should_panic(expected = "attempt to subtract with overflow")] - fn decimal_sub_overflow_panics() { + fn signed_decimal_sub_overflow_panics() { let _value = SignedDecimal::zero() - SignedDecimal::percent(50); } #[test] - fn decimal_sub_assign_works() { + fn signed_decimal_sub_assign_works() { let mut a = SignedDecimal::percent(20); a -= SignedDecimal::percent(2); assert_eq!(a, SignedDecimal::percent(18)); @@ -1311,7 +1331,7 @@ mod tests { #[test] #[allow(clippy::op_ref)] - fn decimal_implements_mul() { + fn signed_decimal_implements_mul() { let one = SignedDecimal::one(); let two = one + one; let half = SignedDecimal::percent(50); @@ -1415,39 +1435,39 @@ mod tests { let max = SignedDecimal::MAX; assert_eq!( max * dec("1.0"), - dec("340282366920938463463.374607431768211455") + dec("170141183460469231731.687303715884105727") ); assert_eq!( max * dec("0.1"), - dec("34028236692093846346.337460743176821145") + dec("17014118346046923173.168730371588410572") ); assert_eq!( max * dec("0.01"), - dec("3402823669209384634.633746074317682114") + dec("1701411834604692317.316873037158841057") ); assert_eq!( max * dec("0.001"), - dec("340282366920938463.463374607431768211") + dec("170141183460469231.731687303715884105") ); assert_eq!( max * dec("0.000001"), - dec("340282366920938.463463374607431768") + dec("170141183460469.231731687303715884") ); assert_eq!( max * dec("0.000000001"), - dec("340282366920.938463463374607431") + dec("170141183460.469231731687303715") ); assert_eq!( max * dec("0.000000000001"), - dec("340282366.920938463463374607") + dec("170141183.460469231731687303") ); assert_eq!( max * dec("0.000000000000001"), - dec("340282.366920938463463374") + dec("170141.183460469231731687") ); assert_eq!( max * dec("0.000000000000000001"), - dec("340.282366920938463463") + dec("170.141183460469231731") ); // works for refs @@ -1461,7 +1481,7 @@ mod tests { } #[test] - fn decimal_mul_assign_works() { + fn signed_decimal_mul_assign_works() { let mut a = SignedDecimal::percent(15); a *= SignedDecimal::percent(60); assert_eq!(a, SignedDecimal::percent(9)); @@ -1475,12 +1495,12 @@ mod tests { #[test] #[should_panic(expected = "attempt to multiply with overflow")] - fn decimal_mul_overflow_panics() { + fn signed_decimal_mul_overflow_panics() { let _value = SignedDecimal::MAX * SignedDecimal::percent(101); } #[test] - fn decimal_checked_mul() { + fn signed_decimal_checked_mul() { let test_data = [ (SignedDecimal::zero(), SignedDecimal::zero()), (SignedDecimal::zero(), SignedDecimal::one()), @@ -1502,7 +1522,7 @@ mod tests { } #[test] - fn decimal_checked_mul_overflow() { + fn signed_decimal_checked_mul_overflow() { assert_eq!( SignedDecimal::MAX.checked_mul(SignedDecimal::percent(200)), Err(OverflowError { @@ -1515,7 +1535,7 @@ mod tests { #[test] #[allow(clippy::op_ref)] - fn decimal_implements_div() { + fn signed_decimal_implements_div() { let one = SignedDecimal::one(); let two = one + one; let half = SignedDecimal::percent(50); @@ -1659,7 +1679,7 @@ mod tests { } #[test] - fn decimal_div_assign_works() { + fn signed_decimal_div_assign_works() { let mut a = SignedDecimal::percent(15); a /= SignedDecimal::percent(20); assert_eq!(a, SignedDecimal::percent(75)); @@ -1673,18 +1693,18 @@ mod tests { #[test] #[should_panic(expected = "Division failed - multiplication overflow")] - fn decimal_div_overflow_panics() { + fn signed_decimal_div_overflow_panics() { let _value = SignedDecimal::MAX / SignedDecimal::percent(10); } #[test] #[should_panic(expected = "Division failed - denominator must not be zero")] - fn decimal_div_by_zero_panics() { + fn signed_decimal_div_by_zero_panics() { let _value = SignedDecimal::one() / SignedDecimal::zero(); } #[test] - fn decimal_int128_division() { + fn signed_decimal_int128_division() { // a/b let left = SignedDecimal::percent(150); // 1.5 let right = Int128::new(3); @@ -1698,14 +1718,14 @@ mod tests { #[test] #[should_panic(expected = "attempt to divide by zero")] - fn decimal_int128_divide_by_zero() { + fn signed_decimal_int128_divide_by_zero() { let left = SignedDecimal::percent(150); // 1.5 let right = Int128::new(0); let _result = left / right; } #[test] - fn decimal_int128_div_assign() { + fn signed_decimal_int128_div_assign() { // a/b let mut dec = SignedDecimal::percent(150); // 1.5 dec /= Int128::new(3); @@ -1719,14 +1739,14 @@ mod tests { #[test] #[should_panic(expected = "attempt to divide by zero")] - fn decimal_int128_div_assign_by_zero() { + fn signed_decimal_int128_div_assign_by_zero() { // a/0 let mut dec = SignedDecimal::percent(50); dec /= Int128::new(0); } #[test] - fn decimal_checked_pow() { + fn signed_decimal_checked_pow() { for exp in 0..10 { assert_eq!( SignedDecimal::one().checked_pow(exp).unwrap(), @@ -1808,7 +1828,7 @@ mod tests { } #[test] - fn decimal_checked_pow_overflow() { + fn signed_decimal_checked_pow_overflow() { assert_eq!( SignedDecimal::MAX.checked_pow(2), Err(OverflowError { @@ -1820,13 +1840,13 @@ mod tests { } #[test] - fn decimal_to_string() { + fn signed_decimal_to_string() { // Integers assert_eq!(SignedDecimal::zero().to_string(), "0"); assert_eq!(SignedDecimal::one().to_string(), "1"); assert_eq!(SignedDecimal::percent(500).to_string(), "5"); - // Decimals + // SignedDecimals assert_eq!(SignedDecimal::percent(125).to_string(), "1.25"); assert_eq!(SignedDecimal::percent(42638).to_string(), "426.38"); assert_eq!(SignedDecimal::percent(3).to_string(), "0.03"); @@ -1903,7 +1923,7 @@ mod tests { } #[test] - fn decimal_iter_sum() { + fn signed_decimal_iter_sum() { let items = vec![ SignedDecimal::zero(), SignedDecimal(Int128::from(2i128)), @@ -1923,7 +1943,7 @@ mod tests { } #[test] - fn decimal_serialize() { + fn signed_decimal_serialize() { assert_eq!(to_vec(&SignedDecimal::zero()).unwrap(), br#""0""#); assert_eq!(to_vec(&SignedDecimal::one()).unwrap(), br#""1""#); assert_eq!(to_vec(&SignedDecimal::percent(8)).unwrap(), br#""0.08""#); @@ -1936,7 +1956,7 @@ mod tests { } #[test] - fn decimal_deserialize() { + fn signed_decimal_deserialize() { assert_eq!( from_slice::(br#""0""#).unwrap(), SignedDecimal::zero() @@ -1973,7 +1993,7 @@ mod tests { } #[test] - fn decimal_abs_diff_works() { + fn signed_decimal_abs_diff_works() { let a = SignedDecimal::percent(285); let b = SignedDecimal::percent(200); let expected = Decimal::percent(85); @@ -1989,7 +2009,7 @@ mod tests { #[test] #[allow(clippy::op_ref)] - fn decimal_rem_works() { + fn signed_decimal_rem_works() { // 4.02 % 1.11 = 0.69 assert_eq!( SignedDecimal::percent(402) % SignedDecimal::percent(111), @@ -2012,7 +2032,7 @@ mod tests { } #[test] - fn decimal_rem_assign_works() { + fn signed_decimal_rem_assign_works() { let mut a = SignedDecimal::percent(17673); a %= SignedDecimal::percent(2362); assert_eq!(a, SignedDecimal::percent(1139)); // 176.73 % 23.62 = 11.39 @@ -2025,12 +2045,12 @@ mod tests { #[test] #[should_panic(expected = "divisor of zero")] - fn decimal_rem_panics_for_zero() { + fn signed_decimal_rem_panics_for_zero() { let _ = SignedDecimal::percent(777) % SignedDecimal::zero(); } #[test] - fn decimal_checked_methods() { + fn signed_decimal_checked_methods() { // checked add assert_eq!( SignedDecimal::percent(402) @@ -2097,7 +2117,7 @@ mod tests { } #[test] - fn decimal_pow_works() { + fn signed_decimal_pow_works() { assert_eq!( SignedDecimal::percent(200).pow(2), SignedDecimal::percent(400) @@ -2110,12 +2130,12 @@ mod tests { #[test] #[should_panic] - fn decimal_pow_overflow_panics() { + fn signed_decimal_pow_overflow_panics() { _ = SignedDecimal::MAX.pow(2u32); } #[test] - fn decimal_saturating_works() { + fn signed_decimal_saturating_works() { assert_eq!( SignedDecimal::percent(200).saturating_add(SignedDecimal::percent(200)), SignedDecimal::percent(400) @@ -2148,7 +2168,7 @@ mod tests { } #[test] - fn decimal_rounding() { + fn signed_decimal_rounding() { assert_eq!(SignedDecimal::one().floor(), SignedDecimal::one()); assert_eq!(SignedDecimal::percent(150).floor(), SignedDecimal::one()); assert_eq!(SignedDecimal::percent(199).floor(), SignedDecimal::one()); @@ -2176,12 +2196,12 @@ mod tests { #[test] #[should_panic(expected = "attempt to ceil with overflow")] - fn decimal_ceil_panics() { + fn signed_decimal_ceil_panics() { let _ = SignedDecimal::MAX.ceil(); } #[test] - fn decimal_checked_ceil() { + fn signed_decimal_checked_ceil() { assert_eq!( SignedDecimal::percent(199).checked_ceil(), Ok(SignedDecimal::percent(200)) @@ -2193,7 +2213,7 @@ mod tests { } #[test] - fn decimal_to_int_floor_works() { + fn signed_decimal_to_int_floor_works() { let d = SignedDecimal::from_str("12.000000000000000001").unwrap(); assert_eq!(d.to_int_floor(), Int128::new(12)); let d = SignedDecimal::from_str("12.345").unwrap(); @@ -2209,11 +2229,11 @@ mod tests { assert_eq!(d.to_int_floor(), Int128::new(0)); let d = SignedDecimal::MAX; - assert_eq!(d.to_int_floor(), Int128::new(340282366920938463463)); + assert_eq!(d.to_int_floor(), Int128::new(170141183460469231731)); } #[test] - fn decimal_to_int_ceil_works() { + fn signed_decimal_to_int_ceil_works() { let d = SignedDecimal::from_str("12.000000000000000001").unwrap(); assert_eq!(d.to_int_ceil(), Int128::new(13)); let d = SignedDecimal::from_str("12.345").unwrap(); @@ -2227,11 +2247,17 @@ mod tests { assert_eq!(d.to_int_ceil(), Int128::new(0)); let d = SignedDecimal::MAX; - assert_eq!(d.to_int_ceil(), Int128::new(340282366920938463464)); + assert_eq!(d.to_int_ceil(), Int128::new(170141183460469231732)); + } + + #[test] + fn signed_decimal_neg_works() { + assert_eq!(-SignedDecimal::percent(50), SignedDecimal::percent(-50)); + assert_eq!(-SignedDecimal::one(), SignedDecimal::negative_one()); } #[test] - fn decimal_partial_eq() { + fn signed_decimal_partial_eq() { let test_cases = [ ("1", "1", true), ("0.5", "0.5", true), @@ -2251,7 +2277,7 @@ mod tests { } #[test] - fn decimal_implements_debug() { + fn signed_decimal_implements_debug() { let decimal = SignedDecimal::from_str("123.45").unwrap(); assert_eq!(format!("{decimal:?}"), "Decimal(123.45)"); From 340ea0d81b03a2f0a5be71c04bb7e3105139a7db Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 22 Aug 2023 15:36:52 +0200 Subject: [PATCH 0740/2372] Fix SignedDecimal::saturating_* math --- packages/std/src/math/signed_decimal.rs | 59 ++++++++++++++++++------- 1 file changed, 43 insertions(+), 16 deletions(-) diff --git a/packages/std/src/math/signed_decimal.rs b/packages/std/src/math/signed_decimal.rs index b2eadbef6b..2655f87391 100644 --- a/packages/std/src/math/signed_decimal.rs +++ b/packages/std/src/math/signed_decimal.rs @@ -179,6 +179,12 @@ impl SignedDecimal { self.0.is_zero() } + /// Returns `true` if the number is negative (< 0) + #[must_use] + pub const fn is_negative(&self) -> bool { + self.0.i128() < 0 + } + /// A decimal is an integer of atomic units plus a number that specifies the /// position of the decimal dot. So any decimal can be expressed as two numbers. /// @@ -328,25 +334,26 @@ impl SignedDecimal { #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_add(self, other: Self) -> Self { - match self.checked_add(other) { - Ok(value) => value, - Err(_) => Self::MAX, - } + Self(self.0.saturating_add(other.0)) } #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_sub(self, other: Self) -> Self { - match self.checked_sub(other) { - Ok(value) => value, - Err(_) => Self::zero(), - } + Self(self.0.saturating_sub(other.0)) } #[must_use = "this returns the result of the operation, without modifying the original"] pub fn saturating_mul(self, other: Self) -> Self { match self.checked_mul(other) { Ok(value) => value, - Err(_) => Self::MAX, + Err(_) => { + // both negative or both positive results in positive number, otherwise negative + if self.is_negative() == other.is_negative() { + Self::MAX + } else { + Self::MIN + } + } } } @@ -354,7 +361,15 @@ impl SignedDecimal { pub fn saturating_pow(self, exp: u32) -> Self { match self.checked_pow(exp) { Ok(value) => value, - Err(_) => Self::MAX, + Err(_) => { + // odd exponent of negative number results in negative number + // everything else results in positive number + if self.is_negative() && exp % 2 == 1 { + Self::MIN + } else { + Self::MAX + } + } } } @@ -801,23 +816,23 @@ mod tests { ); assert_eq!( SignedDecimal::from_atomics(i128::MAX, 38).unwrap(), - SignedDecimal::from_str("3.402823669209384634").unwrap() + SignedDecimal::from_str("1.701411834604692317").unwrap() ); assert_eq!( SignedDecimal::from_atomics(i128::MAX, 39).unwrap(), - SignedDecimal::from_str("0.340282366920938463").unwrap() + SignedDecimal::from_str("0.170141183460469231").unwrap() ); assert_eq!( SignedDecimal::from_atomics(i128::MAX, 45).unwrap(), - SignedDecimal::from_str("0.000000340282366920").unwrap() + SignedDecimal::from_str("0.000000170141183460").unwrap() ); assert_eq!( SignedDecimal::from_atomics(i128::MAX, 51).unwrap(), - SignedDecimal::from_str("0.000000000000340282").unwrap() + SignedDecimal::from_str("0.000000000000170141").unwrap() ); assert_eq!( SignedDecimal::from_atomics(i128::MAX, 56).unwrap(), - SignedDecimal::from_str("0.000000000000000003").unwrap() + SignedDecimal::from_str("0.000000000000000001").unwrap() ); assert_eq!( SignedDecimal::from_atomics(i128::MAX, 57).unwrap(), @@ -2150,7 +2165,11 @@ mod tests { ); assert_eq!( SignedDecimal::zero().saturating_sub(SignedDecimal::percent(200)), - SignedDecimal::zero() + SignedDecimal::from_str("-2").unwrap() + ); + assert_eq!( + SignedDecimal::MIN.saturating_sub(SignedDecimal::percent(200)), + SignedDecimal::MIN ); assert_eq!( SignedDecimal::percent(200).saturating_mul(SignedDecimal::percent(50)), @@ -2160,6 +2179,14 @@ mod tests { SignedDecimal::MAX.saturating_mul(SignedDecimal::percent(200)), SignedDecimal::MAX ); + assert_eq!( + SignedDecimal::MIN.saturating_mul(SignedDecimal::percent(200)), + SignedDecimal::MIN + ); + assert_eq!( + SignedDecimal::MIN.saturating_mul(SignedDecimal::percent(-200)), + SignedDecimal::MAX + ); assert_eq!( SignedDecimal::percent(400).saturating_pow(2u32), SignedDecimal::percent(1600) From 5fa9425401b5845040782c9c511fb4b5fc450fe6 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 30 Aug 2023 18:21:36 +0200 Subject: [PATCH 0741/2372] Fix SignedDecimal::from_str --- packages/std/src/math/signed_decimal.rs | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/packages/std/src/math/signed_decimal.rs b/packages/std/src/math/signed_decimal.rs index 2655f87391..3e2ac7a33c 100644 --- a/packages/std/src/math/signed_decimal.rs +++ b/packages/std/src/math/signed_decimal.rs @@ -475,6 +475,8 @@ impl FromStr for SignedDecimal { let mut parts_iter = input.split('.'); let whole_part = parts_iter.next().unwrap(); // split always returns at least one element + let is_neg = whole_part.starts_with('-'); + let whole = whole_part .parse::() .map_err(|_| StdError::generic_err("Error parsing whole"))?; @@ -484,7 +486,7 @@ impl FromStr for SignedDecimal { if let Some(fractional_part) = parts_iter.next() { let fractional = fractional_part - .parse::() + .parse::() // u64 is enough for 18 decimal places .map_err(|_| StdError::generic_err("Error parsing fractional"))?; let exp = (Self::DECIMAL_PLACES.checked_sub(fractional_part.len() as u32)).ok_or_else( || { @@ -496,13 +498,20 @@ impl FromStr for SignedDecimal { )?; debug_assert!(exp <= Self::DECIMAL_PLACES); let fractional_factor = Int128::from(10i128.pow(exp)); - atomics = atomics - .checked_add( - // The inner multiplication can't overflow because - // fractional < 10^DECIMAL_PLACES && fractional_factor <= 10^DECIMAL_PLACES - fractional.checked_mul(fractional_factor).unwrap(), - ) - .map_err(|_| StdError::generic_err("Value too big"))?; + + // This multiplication can't overflow because + // fractional < 10^DECIMAL_PLACES && fractional_factor <= 10^DECIMAL_PLACES + let fractional_part = Int128::from(fractional) + .checked_mul(fractional_factor) + .unwrap(); + + // for negative numbers, we need to subtract the fractional part + atomics = if is_neg { + atomics.checked_sub(fractional_part) + } else { + atomics.checked_add(fractional_part) + } + .map_err(|_| StdError::generic_err("Value too big"))?; } if parts_iter.next().is_some() { From e71a34f9118b5047aff134af2c069a6cf5f8520a Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 29 Aug 2023 15:59:07 +0200 Subject: [PATCH 0742/2372] Fix tests --- packages/std/src/math/signed_decimal.rs | 83 +++++++++++++++++++++---- 1 file changed, 72 insertions(+), 11 deletions(-) diff --git a/packages/std/src/math/signed_decimal.rs b/packages/std/src/math/signed_decimal.rs index 3e2ac7a33c..2f45934658 100644 --- a/packages/std/src/math/signed_decimal.rs +++ b/packages/std/src/math/signed_decimal.rs @@ -728,12 +728,18 @@ mod tests { fn signed_decimal_new() { let expected = Int128::from(300i128); assert_eq!(SignedDecimal::new(expected).0, expected); + + let expected = Int128::from(-300i128); + assert_eq!(SignedDecimal::new(expected).0, expected); } #[test] fn signed_decimal_raw() { let value = 300i128; assert_eq!(SignedDecimal::raw(value).0.i128(), value); + + let value = -300i128; + assert_eq!(SignedDecimal::raw(value).0.i128(), value); } #[test] @@ -755,6 +761,12 @@ mod tests { value.0, SignedDecimal::DECIMAL_FRACTIONAL / Int128::from(2u8) ); + + let value = SignedDecimal::percent(-50); + assert_eq!( + value.0, + SignedDecimal::DECIMAL_FRACTIONAL / Int128::from(-2i8) + ); } #[test] @@ -764,6 +776,12 @@ mod tests { value.0, SignedDecimal::DECIMAL_FRACTIONAL / Int128::from(8u8) ); + + let value = SignedDecimal::permille(-125); + assert_eq!( + value.0, + SignedDecimal::DECIMAL_FRACTIONAL / Int128::from(-8i8) + ); } #[test] @@ -773,12 +791,19 @@ mod tests { value.0, SignedDecimal::DECIMAL_FRACTIONAL / Int128::from(80u8) ); + + let value = SignedDecimal::bps(-125); + assert_eq!( + value.0, + SignedDecimal::DECIMAL_FRACTIONAL / Int128::from(-80i8) + ); } #[test] fn signed_decimal_from_atomics_works() { let one = SignedDecimal::one(); let two = one + one; + let neg_one = SignedDecimal::negative_one(); assert_eq!(SignedDecimal::from_atomics(1i128, 0).unwrap(), one); assert_eq!(SignedDecimal::from_atomics(10i128, 1).unwrap(), one); @@ -814,6 +839,13 @@ mod tests { two ); + assert_eq!(SignedDecimal::from_atomics(-1i128, 0).unwrap(), neg_one); + assert_eq!(SignedDecimal::from_atomics(-10i128, 1).unwrap(), neg_one); + assert_eq!( + SignedDecimal::from_atomics(-100000000000000000000i128, 20).unwrap(), + neg_one + ); + // Cuts decimal digits (20 provided but only 18 can be stored) assert_eq!( SignedDecimal::from_atomics(4321i128, 20).unwrap(), @@ -880,6 +912,20 @@ mod tests { SignedDecimal::one() ); + // -1.0 + assert_eq!( + SignedDecimal::from_ratio(-1i128, 1i128), + SignedDecimal::negative_one() + ); + assert_eq!( + SignedDecimal::from_ratio(-53i128, 53i128), + SignedDecimal::negative_one() + ); + assert_eq!( + SignedDecimal::from_ratio(125i128, -125i128), + SignedDecimal::negative_one() + ); + // 1.5 assert_eq!( SignedDecimal::from_ratio(3i128, 2i128), @@ -968,6 +1014,16 @@ mod tests { fraction.denominator(), Int128::from(1_000_000_000_000_000_000i128) ); + + let fraction = SignedDecimal::from_str("-1234.567").unwrap(); + assert_eq!( + fraction.numerator(), + Int128::from(-1_234_567_000_000_000_000_000i128) + ); + assert_eq!( + fraction.denominator(), + Int128::from(1_000_000_000_000_000_000i128) + ); } #[test] @@ -1056,6 +1112,10 @@ mod tests { SignedDecimal::from_str("170141183460469231731.687303715884105727").unwrap(), SignedDecimal::MAX ); + assert_eq!( + SignedDecimal::from_str("-1").unwrap(), + SignedDecimal::negative_one() + ); } #[test] @@ -1069,11 +1129,6 @@ mod tests { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing whole"), e => panic!("Unexpected error: {e:?}"), } - - match SignedDecimal::from_str("-1").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing whole"), - e => panic!("Unexpected error: {e:?}"), - } } #[test] @@ -1278,7 +1333,7 @@ mod tests { } #[test] - #[should_panic(expected = "attempt to add with overflow")] + #[should_panic] fn signed_decimal_add_overflow_panics() { let _value = SignedDecimal::MAX + SignedDecimal::percent(50); } @@ -1334,9 +1389,9 @@ mod tests { } #[test] - #[should_panic(expected = "attempt to subtract with overflow")] + #[should_panic] fn signed_decimal_sub_overflow_panics() { - let _value = SignedDecimal::zero() - SignedDecimal::percent(50); + let _value = SignedDecimal::MIN - SignedDecimal::percent(50); } #[test] @@ -1741,7 +1796,7 @@ mod tests { } #[test] - #[should_panic(expected = "attempt to divide by zero")] + #[should_panic] fn signed_decimal_int128_divide_by_zero() { let left = SignedDecimal::percent(150); // 1.5 let right = Int128::new(0); @@ -1762,7 +1817,7 @@ mod tests { } #[test] - #[should_panic(expected = "attempt to divide by zero")] + #[should_panic] fn signed_decimal_int128_div_assign_by_zero() { // a/0 let mut dec = SignedDecimal::percent(50); @@ -2094,8 +2149,14 @@ mod tests { .unwrap(), SignedDecimal::percent(1000) ); + assert_eq!( + SignedDecimal::zero() + .checked_sub(SignedDecimal::percent(1)) + .unwrap(), + SignedDecimal::percent(-1) + ); assert!(matches!( - SignedDecimal::zero().checked_sub(SignedDecimal::percent(1)), + SignedDecimal::MIN.checked_sub(SignedDecimal::percent(1)), Err(OverflowError { .. }) )); From 37ae96da3ca0f0e8d27d88ce6fa0a5cb81da4382 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 31 Aug 2023 10:46:19 +0200 Subject: [PATCH 0743/2372] Fix SignedDecimal Display impl --- packages/std/src/math/signed_decimal.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/std/src/math/signed_decimal.rs b/packages/std/src/math/signed_decimal.rs index 2f45934658..ceb344cb53 100644 --- a/packages/std/src/math/signed_decimal.rs +++ b/packages/std/src/math/signed_decimal.rs @@ -532,13 +532,18 @@ impl fmt::Display for SignedDecimal { } else { let fractional_string = format!( "{:0>padding$}", - fractional, + fractional.abs(), // fractional should always be printed as positive padding = Self::DECIMAL_PLACES as usize ); - f.write_str(&whole.to_string())?; - f.write_char('.')?; - f.write_str(fractional_string.trim_end_matches('0'))?; - Ok(()) + if self.is_negative() { + f.write_char('-')?; + } + write!( + f, + "{whole}.{fractional}", + whole = whole.abs(), + fractional = fractional_string.trim_end_matches('0') + ) } } } From b9cfb6dcd8829165c14976e46a14bc74478df0e0 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 31 Aug 2023 10:53:13 +0200 Subject: [PATCH 0744/2372] Fix SignedDecimal::to_int_{floor, ceil} --- packages/std/src/math/signed_decimal.rs | 76 +++++++++++++++++++------ 1 file changed, 58 insertions(+), 18 deletions(-) diff --git a/packages/std/src/math/signed_decimal.rs b/packages/std/src/math/signed_decimal.rs index ceb344cb53..ebab99b928 100644 --- a/packages/std/src/math/signed_decimal.rs +++ b/packages/std/src/math/signed_decimal.rs @@ -373,6 +373,42 @@ impl SignedDecimal { } } + /// Converts this decimal to an unsigned integer by rounding down + /// to the next integer, e.g. 22.5 becomes 22 and -1.2 becomes -2. + /// + /// ## Examples + /// + /// ``` + /// use core::str::FromStr; + /// use cosmwasm_std::{SignedDecimal, Int128}; + /// + /// let d = SignedDecimal::from_str("12.345").unwrap(); + /// assert_eq!(d.to_int_floor(), Int128::new(12)); + /// + /// let d = SignedDecimal::from_str("-12.999").unwrap(); + /// assert_eq!(d.to_int_floor(), Int128::new(-13)); + /// + /// let d = SignedDecimal::from_str("-0.05").unwrap(); + /// assert_eq!(d.to_int_floor(), Int128::new(-1)); + /// ``` + #[must_use] + pub fn to_int_floor(self) -> Int128 { + if self.is_negative() { + // Using `x.to_int_floor() = -(-x).to_int_ceil()` for a negative `x`, + // but avoiding overflow by implementing the formula from `to_int_ceil` directly. + let x = self.0; + let y = Self::DECIMAL_FRACTIONAL; + if x.is_zero() { + Int128::zero() + } else { + // making sure not to negate `x`, as this would overflow + -Int128::one() - ((-Int128::one() - x) / y) + } + } else { + self.to_int_trunc() + } + } + /// Converts this decimal to an unsigned integer by truncating /// the fractional part, e.g. 22.5 becomes 22. /// @@ -380,50 +416,54 @@ impl SignedDecimal { /// /// ``` /// use core::str::FromStr; - /// use cosmwasm_std::{Decimal, Int128}; + /// use cosmwasm_std::{SignedDecimal, Int128}; /// /// let d = SignedDecimal::from_str("12.345").unwrap(); - /// assert_eq!(d.to_int_floor(), Int128::new(12)); + /// assert_eq!(d.to_int_trunc(), Int128::new(12)); /// - /// let d = SignedDecimal::from_str("12.999").unwrap(); - /// assert_eq!(d.to_int_floor(), Int128::new(12)); + /// let d = SignedDecimal::from_str("-12.999").unwrap(); + /// assert_eq!(d.to_int_trunc(), Int128::new(-12)); /// /// let d = SignedDecimal::from_str("75.0").unwrap(); - /// assert_eq!(d.to_int_floor(), Int128::new(75)); + /// assert_eq!(d.to_int_trunc(), Int128::new(75)); /// ``` #[must_use] - pub fn to_int_floor(self) -> Int128 { + pub fn to_int_trunc(self) -> Int128 { self.0 / Self::DECIMAL_FRACTIONAL } - /// Converts this decimal to an unsigned integer by rounting up - /// to the next integer, e.g. 22.3 becomes 23. + /// Converts this decimal to an unsigned integer by rounding up + /// to the next integer, e.g. 22.3 becomes 23 and -1.2 becomes -1. /// /// ## Examples /// /// ``` /// use core::str::FromStr; - /// use cosmwasm_std::{Decimal, Int128}; + /// use cosmwasm_std::{SignedDecimal, Int128}; /// /// let d = SignedDecimal::from_str("12.345").unwrap(); /// assert_eq!(d.to_int_ceil(), Int128::new(13)); /// - /// let d = SignedDecimal::from_str("12.999").unwrap(); - /// assert_eq!(d.to_int_ceil(), Int128::new(13)); + /// let d = SignedDecimal::from_str("-12.999").unwrap(); + /// assert_eq!(d.to_int_ceil(), Int128::new(-12)); /// /// let d = SignedDecimal::from_str("75.0").unwrap(); /// assert_eq!(d.to_int_ceil(), Int128::new(75)); /// ``` #[must_use] pub fn to_int_ceil(self) -> Int128 { - // Using `q = 1 + ((x - 1) / y); // if x != 0` with unsigned integers x, y, q - // from https://stackoverflow.com/a/2745086/2013738. We know `x + y` CAN overflow. - let x = self.0; - let y = Self::DECIMAL_FRACTIONAL; - if x.is_zero() { - Int128::zero() + if self.is_negative() { + self.to_int_trunc() } else { - Int128::one() + ((x - Int128::one()) / y) + // Using `q = 1 + ((x - 1) / y); // if x != 0` with unsigned integers x, y, q + // from https://stackoverflow.com/a/2745086/2013738. We know `x + y` CAN overflow. + let x = self.0; + let y = Self::DECIMAL_FRACTIONAL; + if x.is_zero() { + Int128::zero() + } else { + Int128::one() + ((x - Int128::one()) / y) + } } } } From 17b906b7590a22ada25d02318913f3f5b6ecdb18 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 31 Aug 2023 16:28:02 +0200 Subject: [PATCH 0745/2372] Fix SignedDecimal::floor --- packages/std/src/errors/mod.rs | 3 ++- packages/std/src/errors/std_error.rs | 4 ++++ packages/std/src/math/signed_decimal.rs | 32 ++++++++++++++++++++++--- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/packages/std/src/errors/mod.rs b/packages/std/src/errors/mod.rs index 54422007d3..47555b5849 100644 --- a/packages/std/src/errors/mod.rs +++ b/packages/std/src/errors/mod.rs @@ -7,7 +7,8 @@ pub use recover_pubkey_error::RecoverPubkeyError; pub use std_error::{ CheckedFromRatioError, CheckedMultiplyFractionError, CheckedMultiplyRatioError, CoinFromStrError, CoinsError, ConversionOverflowError, DivideByZeroError, DivisionError, - OverflowError, OverflowOperation, RoundUpOverflowError, StdError, StdResult, + OverflowError, OverflowOperation, RoundDownOverflowError, RoundUpOverflowError, StdError, + StdResult, }; pub use system_error::SystemError; pub use verification_error::VerificationError; diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index f8b0c8275e..2900e65141 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -599,6 +599,10 @@ pub enum CheckedFromRatioError { #[error("Round up operation failed because of overflow")] pub struct RoundUpOverflowError; +#[derive(Error, Debug, PartialEq, Eq)] +#[error("Round down operation failed because of overflow")] +pub struct RoundDownOverflowError; + #[derive(Error, Debug, PartialEq, Eq)] pub enum CoinsError { #[error("Duplicate denom")] diff --git a/packages/std/src/math/signed_decimal.rs b/packages/std/src/math/signed_decimal.rs index ebab99b928..e8c9c67caf 100644 --- a/packages/std/src/math/signed_decimal.rs +++ b/packages/std/src/math/signed_decimal.rs @@ -11,7 +11,7 @@ use thiserror::Error; use crate::errors::{ CheckedFromRatioError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, - OverflowOperation, RoundUpOverflowError, StdError, + OverflowOperation, RoundDownOverflowError, RoundUpOverflowError, StdError, }; use crate::{forward_ref_partial_eq, Decimal, Int256}; @@ -219,12 +219,38 @@ impl SignedDecimal { Self::DECIMAL_PLACES } - /// Rounds value down after decimal places. + /// Rounds value by truncating the decimal places. #[must_use = "this returns the result of the operation, without modifying the original"] - pub fn floor(&self) -> Self { + pub fn trunc(&self) -> Self { Self((self.0 / Self::DECIMAL_FRACTIONAL) * Self::DECIMAL_FRACTIONAL) } + /// Rounds value down after decimal places. Panics on overflow. + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn floor(&self) -> Self { + match self.checked_floor() { + Ok(value) => value, + Err(_) => panic!("attempt to floor with overflow"), + } + } + + /// Rounds value down after decimal places. + pub fn checked_floor(&self) -> Result { + if self.is_negative() { + let truncated = self.trunc(); + + if truncated != self { + truncated + .checked_sub(SignedDecimal::one()) + .map_err(|_| RoundDownOverflowError) + } else { + Ok(truncated) + } + } else { + Ok(self.trunc()) + } + } + /// Rounds value up after decimal places. Panics on overflow. #[must_use = "this returns the result of the operation, without modifying the original"] pub fn ceil(&self) -> Self { From 40256aece752ad938c00aed736d99b9b90f4e264 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 31 Aug 2023 17:34:13 +0200 Subject: [PATCH 0746/2372] Improve SignedDecimal tests --- packages/std/src/math/signed_decimal.rs | 460 +++++++++++++++++++++++- 1 file changed, 447 insertions(+), 13 deletions(-) diff --git a/packages/std/src/math/signed_decimal.rs b/packages/std/src/math/signed_decimal.rs index e8c9c67caf..6f3f1a249f 100644 --- a/packages/std/src/math/signed_decimal.rs +++ b/packages/std/src/math/signed_decimal.rs @@ -532,7 +532,7 @@ impl FromStr for SignedDecimal { type Err = StdError; /// Converts the decimal string to a SignedDecimal - /// Possible inputs: "1.23", "1", "000012", "1.123000000" + /// Possible inputs: "1.23", "1", "000012", "1.123000000", "-1.12300" /// Disallowed: "", ".23" /// /// This never performs any kind of rounding. @@ -616,7 +616,7 @@ impl fmt::Display for SignedDecimal { impl fmt::Debug for SignedDecimal { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "Decimal({self})") + write!(f, "SignedDecimal({self})") } } @@ -922,6 +922,10 @@ mod tests { SignedDecimal::from_atomics(4321i128, 20).unwrap(), SignedDecimal::from_str("0.000000000000000043").unwrap() ); + assert_eq!( + SignedDecimal::from_atomics(-4321i128, 20).unwrap(), + SignedDecimal::from_str("-0.000000000000000043").unwrap() + ); assert_eq!( SignedDecimal::from_atomics(6789i128, 20).unwrap(), SignedDecimal::from_str("0.000000000000000067").unwrap() @@ -962,6 +966,13 @@ mod tests { max ); + // Can be used with min value + let min = SignedDecimal::MIN; + assert_eq!( + SignedDecimal::from_atomics(min.atomics(), min.decimal_places()).unwrap(), + min + ); + // Overflow is only possible with digits < 18 let result = SignedDecimal::from_atomics(i128::MAX, 17); assert_eq!(result.unwrap_err(), SignedDecimalRangeExceeded); @@ -1021,6 +1032,16 @@ mod tests { SignedDecimal::permille(125) ); + // -0.125 + assert_eq!( + SignedDecimal::from_ratio(-1i64, 8i64), + SignedDecimal::permille(-125) + ); + assert_eq!( + SignedDecimal::from_ratio(125i64, -1000i64), + SignedDecimal::permille(-125) + ); + // 1/3 (result floored) assert_eq!( SignedDecimal::from_ratio(1i64, 3i64), @@ -1133,7 +1154,7 @@ mod tests { SignedDecimal::percent(4200) ); - // SignedDecimals + // Positive decimals assert_eq!( SignedDecimal::from_str("1.0").unwrap(), SignedDecimal::percent(100) @@ -1167,6 +1188,19 @@ mod tests { SignedDecimal::from_str("00.04").unwrap(), SignedDecimal::percent(4) ); + // Negative decimals + assert_eq!( + SignedDecimal::from_str("-00.04").unwrap(), + SignedDecimal::percent(-4) + ); + assert_eq!( + SignedDecimal::from_str("-00.40").unwrap(), + SignedDecimal::percent(-40) + ); + assert_eq!( + SignedDecimal::from_str("-04.00").unwrap(), + SignedDecimal::percent(-400) + ); // Can handle DECIMAL_PLACES fractional digits assert_eq!( @@ -1183,6 +1217,11 @@ mod tests { SignedDecimal::from_str("170141183460469231731.687303715884105727").unwrap(), SignedDecimal::MAX ); + // Works for documented min value + assert_eq!( + SignedDecimal::from_str("-170141183460469231731.687303715884105728").unwrap(), + SignedDecimal::MIN + ); assert_eq!( SignedDecimal::from_str("-1").unwrap(), SignedDecimal::negative_one() @@ -1200,6 +1239,11 @@ mod tests { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing whole"), e => panic!("Unexpected error: {e:?}"), } + + match SignedDecimal::from_str("-").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing whole"), + e => panic!("Unexpected error: {e:?}"), + } } #[test] @@ -1223,6 +1267,11 @@ mod tests { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), e => panic!("Unexpected error: {e:?}"), } + + match SignedDecimal::from_str("1.-2").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), + e => panic!("Unexpected error: {e:?}"), + } } #[test] @@ -1263,6 +1312,10 @@ mod tests { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), e => panic!("Unexpected error: {e:?}"), } + match SignedDecimal::from_str("-170141183460469231732").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), + e => panic!("Unexpected error: {e:?}"), + } // SignedDecimal match SignedDecimal::from_str("170141183460469231732.0").unwrap_err() { @@ -1273,6 +1326,10 @@ mod tests { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), e => panic!("Unexpected error: {e:?}"), } + match SignedDecimal::from_str("-170141183460469231731.687303715884105729").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), + e => panic!("Unexpected error: {e:?}"), + } } #[test] @@ -1282,12 +1339,18 @@ mod tests { let half = SignedDecimal::percent(50); let two = SignedDecimal::percent(200); let max = SignedDecimal::MAX; + let neg_half = SignedDecimal::percent(-50); + let neg_two = SignedDecimal::percent(-200); + let min = SignedDecimal::MIN; assert_eq!(zero.atomics(), Int128::new(0)); assert_eq!(one.atomics(), Int128::new(1000000000000000000)); assert_eq!(half.atomics(), Int128::new(500000000000000000)); assert_eq!(two.atomics(), Int128::new(2000000000000000000)); assert_eq!(max.atomics(), Int128::MAX); + assert_eq!(neg_half.atomics(), Int128::new(-500000000000000000)); + assert_eq!(neg_two.atomics(), Int128::new(-2000000000000000000)); + assert_eq!(min.atomics(), Int128::MIN); } #[test] @@ -1297,12 +1360,14 @@ mod tests { let half = SignedDecimal::percent(50); let two = SignedDecimal::percent(200); let max = SignedDecimal::MAX; + let neg_one = SignedDecimal::negative_one(); assert_eq!(zero.decimal_places(), 18); assert_eq!(one.decimal_places(), 18); assert_eq!(half.decimal_places(), 18); assert_eq!(two.decimal_places(), 18); assert_eq!(max.decimal_places(), 18); + assert_eq!(neg_one.decimal_places(), 18); } #[test] @@ -1313,7 +1378,7 @@ mod tests { assert!(!SignedDecimal::one().is_zero()); assert!(!SignedDecimal::percent(123).is_zero()); - assert!(!SignedDecimal::permille(1234).is_zero()); + assert!(!SignedDecimal::permille(-1234).is_zero()); } #[test] @@ -1324,6 +1389,12 @@ mod tests { // d == 1 assert_eq!(SignedDecimal::one().inv(), Some(SignedDecimal::one())); + // d == -1 + assert_eq!( + SignedDecimal::negative_one().inv(), + Some(SignedDecimal::negative_one()) + ); + // d > 1 exact assert_eq!( SignedDecimal::from_str("2").unwrap().inv(), @@ -1369,6 +1440,17 @@ mod tests { SignedDecimal::from_str("0.0005").unwrap().inv(), Some(SignedDecimal::from_str("2000").unwrap()) ); + + // d < 0 + assert_eq!( + SignedDecimal::from_str("-0.5").unwrap().inv(), + Some(SignedDecimal::from_str("-2").unwrap()) + ); + // d < 0 rounded + assert_eq!( + SignedDecimal::from_str("-3").unwrap().inv(), + Some(SignedDecimal::from_str("-0.333333333333333333").unwrap()) + ); } #[test] @@ -1392,6 +1474,19 @@ mod tests { SignedDecimal::zero() + SignedDecimal::zero(), SignedDecimal::zero() ); + // negative numbers + assert_eq!( + SignedDecimal::percent(-5) + SignedDecimal::percent(-4), + SignedDecimal::percent(-9) + ); + assert_eq!( + SignedDecimal::percent(-5) + SignedDecimal::percent(4), + SignedDecimal::percent(-1) + ); + assert_eq!( + SignedDecimal::percent(5) + SignedDecimal::percent(-4), + SignedDecimal::percent(1) + ); // works for refs let a = SignedDecimal::percent(15); @@ -1449,6 +1544,20 @@ mod tests { SignedDecimal::zero() ); + // negative numbers + assert_eq!( + SignedDecimal::percent(-5) - SignedDecimal::percent(-4), + SignedDecimal::percent(-1) + ); + assert_eq!( + SignedDecimal::percent(-5) - SignedDecimal::percent(4), + SignedDecimal::percent(-9) + ); + assert_eq!( + SignedDecimal::percent(500) - SignedDecimal::percent(-4), + SignedDecimal::percent(504) + ); + // works for refs let a = SignedDecimal::percent(13); let b = SignedDecimal::percent(6); @@ -1511,6 +1620,11 @@ mod tests { SignedDecimal::percent(1000) ); assert_eq!(SignedDecimal::MAX * one, SignedDecimal::MAX); + assert_eq!(SignedDecimal::percent(-1) * one, SignedDecimal::percent(-1)); + assert_eq!( + one * SignedDecimal::percent(-10), + SignedDecimal::percent(-10) + ); // double assert_eq!(two * SignedDecimal::percent(0), SignedDecimal::percent(0)); @@ -1535,6 +1649,11 @@ mod tests { SignedDecimal::percent(1000) * two, SignedDecimal::percent(2000) ); + assert_eq!(SignedDecimal::percent(-1) * two, SignedDecimal::percent(-2)); + assert_eq!( + two * SignedDecimal::new(Int128::MIN / Int128::new(2)), + SignedDecimal::MIN + ); // half assert_eq!(half * SignedDecimal::percent(0), SignedDecimal::percent(0)); @@ -1580,6 +1699,10 @@ mod tests { assert_eq!(dec("1000000000000") * a, dec("123127726548762.582")); assert_eq!(dec("1000000000000000") * a, dec("123127726548762582")); assert_eq!(dec("1000000000000000000") * a, dec("123127726548762582000")); + assert_eq!( + dec("-1000000000000000000") * a, + dec("-123127726548762582000") + ); // Move right let max = SignedDecimal::MAX; @@ -1663,6 +1786,8 @@ mod tests { SignedDecimal::percent(200), ), (SignedDecimal::permille(6), SignedDecimal::permille(13)), + (SignedDecimal::permille(-6), SignedDecimal::permille(0)), + (SignedDecimal::MAX, SignedDecimal::negative_one()), ]; // The regular core::ops::Mul is our source of truth for these tests. @@ -1718,6 +1843,14 @@ mod tests { SignedDecimal::percent(1000) / one, SignedDecimal::percent(1000) ); + assert_eq!( + one / SignedDecimal::percent(-1), + SignedDecimal::percent(-10_000) + ); + assert_eq!( + one / SignedDecimal::percent(-10), + SignedDecimal::percent(-1_000) + ); // double assert_eq!( @@ -1747,6 +1880,14 @@ mod tests { SignedDecimal::percent(1000) / two, SignedDecimal::percent(500) ); + assert_eq!( + two / SignedDecimal::percent(-1), + SignedDecimal::percent(-20_000) + ); + assert_eq!( + SignedDecimal::percent(-10000) / two, + SignedDecimal::percent(-5000) + ); // half assert_eq!( @@ -1800,6 +1941,18 @@ mod tests { assert_eq!(dec("1000000000000") / a, dec("0.000008121647560868")); assert_eq!(dec("1000000000000000") / a, dec("0.008121647560868164")); assert_eq!(dec("1000000000000000000") / a, dec("8.121647560868164773")); + // negative + let a = dec("-123127726548762582"); + assert_eq!(a / dec("1"), dec("-123127726548762582")); + assert_eq!(a / dec("10"), dec("-12312772654876258.2")); + assert_eq!(a / dec("100"), dec("-1231277265487625.82")); + assert_eq!(a / dec("1000"), dec("-123127726548762.582")); + assert_eq!(a / dec("1000000"), dec("-123127726548.762582")); + assert_eq!(a / dec("1000000000"), dec("-123127726.548762582")); + assert_eq!(a / dec("1000000000000"), dec("-123127.726548762582")); + assert_eq!(a / dec("1000000000000000"), dec("-123.127726548762582")); + assert_eq!(a / dec("1000000000000000000"), dec("-0.123127726548762582")); + assert_eq!(dec("1") / a, dec("-0.000000000000000008")); // Move left let a = dec("0.123127726548762582"); @@ -1812,6 +1965,14 @@ mod tests { assert_eq!(a / dec("0.000000000001"), dec("123127726548.762582")); assert_eq!(a / dec("0.000000000000001"), dec("123127726548762.582")); assert_eq!(a / dec("0.000000000000000001"), dec("123127726548762582")); + // negative + let a = dec("-0.123127726548762582"); + assert_eq!(a / dec("1.0"), dec("-0.123127726548762582")); + assert_eq!(a / dec("0.1"), dec("-1.23127726548762582")); + assert_eq!(a / dec("0.01"), dec("-12.3127726548762582")); + assert_eq!(a / dec("0.001"), dec("-123.127726548762582")); + assert_eq!(a / dec("0.000001"), dec("-123127.726548762582")); + assert_eq!(a / dec("0.000000001"), dec("-123127726.548762582")); assert_eq!( SignedDecimal::percent(15) / SignedDecimal::percent(60), @@ -1860,6 +2021,11 @@ mod tests { let right = Int128::new(3); assert_eq!(left / right, SignedDecimal::percent(50)); + // negative + let left = SignedDecimal::percent(-150); // -1.5 + let right = Int128::new(3); + assert_eq!(left / right, SignedDecimal::percent(-50)); + // 0/a let left = SignedDecimal::zero(); let right = Int128::new(300); @@ -1918,6 +2084,18 @@ mod tests { ); } + for exp in 1..10 { + assert_eq!( + SignedDecimal::negative_one().checked_pow(exp).unwrap(), + // alternates between 1 and -1 + if exp % 2 == 0 { + SignedDecimal::one() + } else { + SignedDecimal::negative_one() + } + ) + } + for num in &[ SignedDecimal::percent(50), SignedDecimal::percent(99), @@ -1975,6 +2153,24 @@ mod tests { SignedDecimal::percent(10).checked_pow(18).unwrap(), SignedDecimal(1i128.into()) ); + + let decimals = [ + SignedDecimal::percent(-50), + SignedDecimal::percent(-99), + SignedDecimal::percent(-200), + ]; + let exponents = [1, 2, 3, 4, 5, 8, 10]; + + for d in decimals { + for e in exponents { + // use multiplication as source of truth + let mut mul = Ok(d); + for _ in 1..e { + mul = mul.and_then(|mul| mul.checked_mul(d)); + } + assert_eq!(mul, d.checked_pow(e)); + } + } } #[test] @@ -1995,12 +2191,17 @@ mod tests { assert_eq!(SignedDecimal::zero().to_string(), "0"); assert_eq!(SignedDecimal::one().to_string(), "1"); assert_eq!(SignedDecimal::percent(500).to_string(), "5"); + assert_eq!(SignedDecimal::percent(-500).to_string(), "-5"); // SignedDecimals assert_eq!(SignedDecimal::percent(125).to_string(), "1.25"); assert_eq!(SignedDecimal::percent(42638).to_string(), "426.38"); assert_eq!(SignedDecimal::percent(3).to_string(), "0.03"); assert_eq!(SignedDecimal::permille(987).to_string(), "0.987"); + assert_eq!(SignedDecimal::percent(-125).to_string(), "-1.25"); + assert_eq!(SignedDecimal::percent(-42638).to_string(), "-426.38"); + assert_eq!(SignedDecimal::percent(-3).to_string(), "-0.03"); + assert_eq!(SignedDecimal::permille(-987).to_string(), "-0.987"); assert_eq!( SignedDecimal(Int128::from(1i128)).to_string(), @@ -2070,6 +2271,18 @@ mod tests { SignedDecimal(Int128::from(100000000000000000i128)).to_string(), "0.1" ); + assert_eq!( + SignedDecimal(Int128::from(-1i128)).to_string(), + "-0.000000000000000001" + ); + assert_eq!( + SignedDecimal(Int128::from(-100000000000000i128)).to_string(), + "-0.0001" + ); + assert_eq!( + SignedDecimal(Int128::from(-100000000000000000i128)).to_string(), + "-0.1" + ); } #[test] @@ -2078,14 +2291,15 @@ mod tests { SignedDecimal::zero(), SignedDecimal(Int128::from(2i128)), SignedDecimal(Int128::from(2i128)), + SignedDecimal(Int128::from(-2i128)), ]; assert_eq!( items.iter().sum::(), - SignedDecimal(Int128::from(4i128)) + SignedDecimal(Int128::from(2i128)) ); assert_eq!( items.into_iter().sum::(), - SignedDecimal(Int128::from(4i128)) + SignedDecimal(Int128::from(2i128)) ); let empty: Vec = vec![]; @@ -2103,6 +2317,12 @@ mod tests { to_vec(&SignedDecimal::percent(8765)).unwrap(), br#""87.65""# ); + assert_eq!( + to_vec(&SignedDecimal::percent(-87654)).unwrap(), + br#""-876.54""# + ); + assert_eq!(to_vec(&SignedDecimal::negative_one()).unwrap(), br#""-1""#); + assert_eq!(to_vec(&-SignedDecimal::percent(8)).unwrap(), br#""-0.08""#); } #[test] @@ -2140,6 +2360,24 @@ mod tests { from_slice::(br#""87.65""#).unwrap(), SignedDecimal::percent(8765) ); + + // negative numbers + assert_eq!( + from_slice::(br#""-0""#).unwrap(), + SignedDecimal::zero() + ); + assert_eq!( + from_slice::(br#""-1""#).unwrap(), + SignedDecimal::negative_one() + ); + assert_eq!( + from_slice::(br#""-001""#).unwrap(), + SignedDecimal::negative_one() + ); + assert_eq!( + from_slice::(br#""-0.08""#).unwrap(), + SignedDecimal::percent(-8) + ); } #[test] @@ -2155,6 +2393,12 @@ mod tests { let expected = Decimal::percent(400); assert_eq!(a.abs_diff(b), expected); assert_eq!(b.abs_diff(a), expected); + + let a = SignedDecimal::percent(-200); + let b = SignedDecimal::percent(-240); + let expected = Decimal::percent(40); + assert_eq!(a.abs_diff(b), expected); + assert_eq!(b.abs_diff(a), expected); } #[test] @@ -2172,6 +2416,12 @@ mod tests { SignedDecimal::percent(325) ); + // -20.25 % 5 = -25 + assert_eq!( + SignedDecimal::percent(-2025) % SignedDecimal::percent(500), + SignedDecimal::percent(-25) + ); + let a = SignedDecimal::percent(318); let b = SignedDecimal::percent(317); let expected = SignedDecimal::percent(1); @@ -2191,6 +2441,11 @@ mod tests { let b = SignedDecimal::percent(1270); a %= &b; assert_eq!(a, SignedDecimal::percent(452)); // 42.62 % 12.7 = 4.52 + + let mut a = SignedDecimal::percent(-4262); + let b = SignedDecimal::percent(1270); + a %= &b; + assert_eq!(a, SignedDecimal::percent(-452)); // -42.62 % 12.7 = -4.52 } #[test] @@ -2212,6 +2467,10 @@ mod tests { SignedDecimal::MAX.checked_add(SignedDecimal::percent(1)), Err(OverflowError { .. }) )); + assert!(matches!( + SignedDecimal::MIN.checked_add(SignedDecimal::percent(-1)), + Err(OverflowError { .. }) + )); // checked sub assert_eq!( @@ -2230,6 +2489,10 @@ mod tests { SignedDecimal::MIN.checked_sub(SignedDecimal::percent(1)), Err(OverflowError { .. }) )); + assert!(matches!( + SignedDecimal::MAX.checked_sub(SignedDecimal::percent(-1)), + Err(OverflowError { .. }) + )); // checked div assert_eq!( @@ -2252,6 +2515,18 @@ mod tests { SignedDecimal::MAX.checked_div(SignedDecimal::percent(1)), Err(CheckedFromRatioError::Overflow {}) )); + assert_eq!( + SignedDecimal::percent(-88) + .checked_div(SignedDecimal::percent(20)) + .unwrap(), + SignedDecimal::percent(-440) + ); + assert_eq!( + SignedDecimal::percent(-88) + .checked_div(SignedDecimal::percent(-20)) + .unwrap(), + SignedDecimal::percent(440) + ); // checked rem assert_eq!( @@ -2266,6 +2541,18 @@ mod tests { .unwrap(), SignedDecimal::percent(325) ); + assert_eq!( + SignedDecimal::percent(-1525) + .checked_rem(SignedDecimal::percent(400)) + .unwrap(), + SignedDecimal::percent(-325) + ); + assert_eq!( + SignedDecimal::percent(-1525) + .checked_rem(SignedDecimal::percent(-400)) + .unwrap(), + SignedDecimal::percent(-325) + ); assert!(matches!( SignedDecimal::MAX.checked_rem(SignedDecimal::zero()), Err(DivideByZeroError { .. }) @@ -2278,6 +2565,14 @@ mod tests { SignedDecimal::percent(200).pow(2), SignedDecimal::percent(400) ); + assert_eq!( + SignedDecimal::percent(-200).pow(2), + SignedDecimal::percent(400) + ); + assert_eq!( + SignedDecimal::percent(-200).pow(3), + SignedDecimal::percent(-800) + ); assert_eq!( SignedDecimal::percent(200).pow(10), SignedDecimal::percent(102400) @@ -2296,14 +2591,34 @@ mod tests { SignedDecimal::percent(200).saturating_add(SignedDecimal::percent(200)), SignedDecimal::percent(400) ); + assert_eq!( + SignedDecimal::percent(-200).saturating_add(SignedDecimal::percent(200)), + SignedDecimal::zero() + ); + assert_eq!( + SignedDecimal::percent(-200).saturating_add(SignedDecimal::percent(-200)), + SignedDecimal::percent(-400) + ); assert_eq!( SignedDecimal::MAX.saturating_add(SignedDecimal::percent(200)), SignedDecimal::MAX ); + assert_eq!( + SignedDecimal::MIN.saturating_add(SignedDecimal::percent(-1)), + SignedDecimal::MIN + ); assert_eq!( SignedDecimal::percent(200).saturating_sub(SignedDecimal::percent(100)), SignedDecimal::percent(100) ); + assert_eq!( + SignedDecimal::percent(-200).saturating_sub(SignedDecimal::percent(100)), + SignedDecimal::percent(-300) + ); + assert_eq!( + SignedDecimal::percent(-200).saturating_sub(SignedDecimal::percent(-100)), + SignedDecimal::percent(-100) + ); assert_eq!( SignedDecimal::zero().saturating_sub(SignedDecimal::percent(200)), SignedDecimal::from_str("-2").unwrap() @@ -2312,10 +2627,22 @@ mod tests { SignedDecimal::MIN.saturating_sub(SignedDecimal::percent(200)), SignedDecimal::MIN ); + assert_eq!( + SignedDecimal::MAX.saturating_sub(SignedDecimal::percent(-200)), + SignedDecimal::MAX + ); assert_eq!( SignedDecimal::percent(200).saturating_mul(SignedDecimal::percent(50)), SignedDecimal::percent(100) ); + assert_eq!( + SignedDecimal::percent(-200).saturating_mul(SignedDecimal::percent(50)), + SignedDecimal::percent(-100) + ); + assert_eq!( + SignedDecimal::percent(-200).saturating_mul(SignedDecimal::percent(-50)), + SignedDecimal::percent(100) + ); assert_eq!( SignedDecimal::MAX.saturating_mul(SignedDecimal::percent(200)), SignedDecimal::MAX @@ -2345,6 +2672,18 @@ mod tests { SignedDecimal::percent(200) ); assert_eq!(SignedDecimal::percent(99).floor(), SignedDecimal::zero()); + assert_eq!( + SignedDecimal(Int128::from(1i128)).floor(), + SignedDecimal::zero() + ); + assert_eq!( + SignedDecimal(Int128::from(-1i128)).floor(), + SignedDecimal::negative_one() + ); + assert_eq!( + SignedDecimal::permille(-1234).floor(), + SignedDecimal::percent(-200) + ); assert_eq!(SignedDecimal::one().ceil(), SignedDecimal::one()); assert_eq!( @@ -2360,6 +2699,35 @@ mod tests { SignedDecimal(Int128::from(1i128)).ceil(), SignedDecimal::one() ); + assert_eq!( + SignedDecimal(Int128::from(-1i128)).ceil(), + SignedDecimal::zero() + ); + assert_eq!( + SignedDecimal::permille(-1234).ceil(), + SignedDecimal::negative_one() + ); + + assert_eq!(SignedDecimal::one().trunc(), SignedDecimal::one()); + assert_eq!(SignedDecimal::percent(150).trunc(), SignedDecimal::one()); + assert_eq!(SignedDecimal::percent(199).trunc(), SignedDecimal::one()); + assert_eq!( + SignedDecimal::percent(200).trunc(), + SignedDecimal::percent(200) + ); + assert_eq!(SignedDecimal::percent(99).trunc(), SignedDecimal::zero()); + assert_eq!( + SignedDecimal(Int128::from(1i128)).trunc(), + SignedDecimal::zero() + ); + assert_eq!( + SignedDecimal(Int128::from(-1i128)).trunc(), + SignedDecimal::zero() + ); + assert_eq!( + SignedDecimal::permille(-1234).trunc(), + SignedDecimal::negative_one() + ); } #[test] @@ -2368,16 +2736,35 @@ mod tests { let _ = SignedDecimal::MAX.ceil(); } + #[test] + #[should_panic(expected = "attempt to floor with overflow")] + fn signed_decimal_floor_panics() { + let _ = SignedDecimal::MIN.floor(); + } + #[test] fn signed_decimal_checked_ceil() { assert_eq!( SignedDecimal::percent(199).checked_ceil(), Ok(SignedDecimal::percent(200)) ); - assert!(matches!( - SignedDecimal::MAX.checked_ceil(), - Err(RoundUpOverflowError { .. }) - )); + assert_eq!(SignedDecimal::MAX.checked_ceil(), Err(RoundUpOverflowError)); + } + + #[test] + fn signed_decimal_checked_floor() { + assert_eq!( + SignedDecimal::percent(199).checked_floor(), + Ok(SignedDecimal::one()) + ); + assert_eq!( + SignedDecimal::percent(-199).checked_floor(), + Ok(SignedDecimal::percent(-200)) + ); + assert_eq!( + SignedDecimal::MIN.checked_floor(), + Err(RoundDownOverflowError) + ); } #[test] @@ -2390,14 +2777,22 @@ mod tests { assert_eq!(d.to_int_floor(), Int128::new(12)); let d = SignedDecimal::from_str("0.98451384").unwrap(); assert_eq!(d.to_int_floor(), Int128::new(0)); + let d = SignedDecimal::from_str("-12.000000000000000001").unwrap(); + assert_eq!(d.to_int_floor(), Int128::new(-13)); + let d = SignedDecimal::from_str("-12.345").unwrap(); + assert_eq!(d.to_int_floor(), Int128::new(-13)); let d = SignedDecimal::from_str("75.0").unwrap(); assert_eq!(d.to_int_floor(), Int128::new(75)); let d = SignedDecimal::from_str("0.0").unwrap(); assert_eq!(d.to_int_floor(), Int128::new(0)); + let d = SignedDecimal::from_str("-75.0").unwrap(); + assert_eq!(d.to_int_floor(), Int128::new(-75)); let d = SignedDecimal::MAX; assert_eq!(d.to_int_floor(), Int128::new(170141183460469231731)); + let d = SignedDecimal::MIN; + assert_eq!(d.to_int_floor(), Int128::new(-170141183460469231732)); } #[test] @@ -2408,14 +2803,48 @@ mod tests { assert_eq!(d.to_int_ceil(), Int128::new(13)); let d = SignedDecimal::from_str("12.999").unwrap(); assert_eq!(d.to_int_ceil(), Int128::new(13)); + let d = SignedDecimal::from_str("-12.000000000000000001").unwrap(); + assert_eq!(d.to_int_ceil(), Int128::new(-12)); + let d = SignedDecimal::from_str("-12.345").unwrap(); + assert_eq!(d.to_int_ceil(), Int128::new(-12)); let d = SignedDecimal::from_str("75.0").unwrap(); assert_eq!(d.to_int_ceil(), Int128::new(75)); let d = SignedDecimal::from_str("0.0").unwrap(); assert_eq!(d.to_int_ceil(), Int128::new(0)); + let d = SignedDecimal::from_str("-75.0").unwrap(); + assert_eq!(d.to_int_ceil(), Int128::new(-75)); let d = SignedDecimal::MAX; assert_eq!(d.to_int_ceil(), Int128::new(170141183460469231732)); + let d = SignedDecimal::MIN; + assert_eq!(d.to_int_ceil(), Int128::new(-170141183460469231731)); + } + + #[test] + fn signed_decimal_to_int_trunc_works() { + let d = SignedDecimal::from_str("12.000000000000000001").unwrap(); + assert_eq!(d.to_int_trunc(), Int128::new(12)); + let d = SignedDecimal::from_str("12.345").unwrap(); + assert_eq!(d.to_int_trunc(), Int128::new(12)); + let d = SignedDecimal::from_str("12.999").unwrap(); + assert_eq!(d.to_int_trunc(), Int128::new(12)); + let d = SignedDecimal::from_str("-12.000000000000000001").unwrap(); + assert_eq!(d.to_int_trunc(), Int128::new(-12)); + let d = SignedDecimal::from_str("-12.345").unwrap(); + assert_eq!(d.to_int_trunc(), Int128::new(-12)); + + let d = SignedDecimal::from_str("75.0").unwrap(); + assert_eq!(d.to_int_trunc(), Int128::new(75)); + let d = SignedDecimal::from_str("0.0").unwrap(); + assert_eq!(d.to_int_trunc(), Int128::new(0)); + let d = SignedDecimal::from_str("-75.0").unwrap(); + assert_eq!(d.to_int_trunc(), Int128::new(-75)); + + let d = SignedDecimal::MAX; + assert_eq!(d.to_int_trunc(), Int128::new(170141183460469231731)); + let d = SignedDecimal::MIN; + assert_eq!(d.to_int_trunc(), Int128::new(-170141183460469231731)); } #[test] @@ -2431,6 +2860,11 @@ mod tests { ("0.5", "0.5", true), ("0.5", "0.51", false), ("0", "0.00000", true), + ("-1", "-1", true), + ("-0.5", "-0.5", true), + ("-0.5", "0.5", false), + ("-0.5", "-0.51", false), + ("-0", "-0.00000", true), ] .into_iter() .map(|(lhs, rhs, expected)| (dec(lhs), dec(rhs), expected)); @@ -2447,12 +2881,12 @@ mod tests { #[test] fn signed_decimal_implements_debug() { let decimal = SignedDecimal::from_str("123.45").unwrap(); - assert_eq!(format!("{decimal:?}"), "Decimal(123.45)"); + assert_eq!(format!("{decimal:?}"), "SignedDecimal(123.45)"); - let test_cases = ["5", "5.01", "42", "0", "2"]; + let test_cases = ["5", "5.01", "42", "0", "2", "-0.000001"]; for s in test_cases { let decimal = SignedDecimal::from_str(s).unwrap(); - let expected = format!("Decimal({s})"); + let expected = format!("SignedDecimal({s})"); assert_eq!(format!("{decimal:?}"), expected); } } From 38733394809809ee89b4710eb1d26e4d9731aa06 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 5 Sep 2023 10:23:00 +0200 Subject: [PATCH 0747/2372] Improve SignedDecimal docs --- packages/std/src/math/signed_decimal.rs | 85 +++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/packages/std/src/math/signed_decimal.rs b/packages/std/src/math/signed_decimal.rs index 6f3f1a249f..e390c77f12 100644 --- a/packages/std/src/math/signed_decimal.rs +++ b/packages/std/src/math/signed_decimal.rs @@ -39,19 +39,49 @@ impl SignedDecimal { /// The number of decimal places. Since decimal types are fixed-point rather than /// floating-point, this is a constant. pub const DECIMAL_PLACES: u32 = 18; // This needs to be an even number. + /// The largest value that can be represented by this signed decimal type. + /// + /// # Examples + /// + /// ``` + /// # use cosmwasm_std::SignedDecimal; + /// assert_eq!(SignedDecimal::MAX.to_string(), "170141183460469231731.687303715884105727"); + /// ``` pub const MAX: Self = Self(Int128::MAX); + /// The smallest value that can be represented by this signed decimal type. + /// + /// # Examples + /// + /// ``` + /// # use cosmwasm_std::SignedDecimal; + /// assert_eq!(SignedDecimal::MIN.to_string(), "-170141183460469231731.687303715884105728"); + /// ``` pub const MIN: Self = Self(Int128::MIN); /// Creates a SignedDecimal(value) /// This is equivalent to `Decimal::from_atomics(value, 18)` but usable in a const context. + /// + /// # Examples + /// + /// ``` + /// # use cosmwasm_std::{SignedDecimal, Int128}; + /// assert_eq!(SignedDecimal::new(Int128::one()).to_string(), "0.000000000000000001"); + /// ``` pub const fn new(value: Int128) -> Self { Self(value) } /// Creates a SignedDecimal(Int128(value)) /// This is equivalent to `SignedDecimal::from_atomics(value, 18)` but usable in a const context. + /// + /// # Examples + /// + /// ``` + /// # use cosmwasm_std::SignedDecimal; + /// assert_eq!(SignedDecimal::raw(1234i128).to_string(), "0.000000000000001234"); + /// ``` pub const fn raw(value: i128) -> Self { Self(Int128::new(value)) } @@ -145,6 +175,16 @@ impl SignedDecimal { } /// Returns the ratio (numerator / denominator) as a SignedDecimal + /// + /// # Examples + /// + /// ``` + /// # use cosmwasm_std::SignedDecimal; + /// assert_eq!( + /// SignedDecimal::from_ratio(1, 3).to_string(), + /// "0.333333333333333333" + /// ); + /// ``` pub fn from_ratio(numerator: impl Into, denominator: impl Into) -> Self { match SignedDecimal::checked_from_ratio(numerator, denominator) { Ok(value) => value, @@ -156,6 +196,20 @@ impl SignedDecimal { } /// Returns the ratio (numerator / denominator) as a SignedDecimal + /// + /// # Examples + /// + /// ``` + /// # use cosmwasm_std::{SignedDecimal, CheckedFromRatioError}; + /// assert_eq!( + /// SignedDecimal::checked_from_ratio(1, 3).unwrap().to_string(), + /// "0.333333333333333333" + /// ); + /// assert_eq!( + /// SignedDecimal::checked_from_ratio(1, 0), + /// Err(CheckedFromRatioError::DivideByZero) + /// ); + /// ``` pub fn checked_from_ratio( numerator: impl Into, denominator: impl Into, @@ -174,6 +228,7 @@ impl SignedDecimal { } } + /// Returns `true` if the number is 0 #[must_use] pub const fn is_zero(&self) -> bool { self.0.is_zero() @@ -220,12 +275,30 @@ impl SignedDecimal { } /// Rounds value by truncating the decimal places. + /// + /// # Examples + /// + /// ``` + /// # use cosmwasm_std::SignedDecimal; + /// # use core::str::FromStr; + /// assert!(SignedDecimal::from_str("0.6").unwrap().trunc().is_zero()); + /// assert_eq!(SignedDecimal::from_str("-5.8").unwrap().trunc().to_string(), "-5"); + /// ``` #[must_use = "this returns the result of the operation, without modifying the original"] pub fn trunc(&self) -> Self { Self((self.0 / Self::DECIMAL_FRACTIONAL) * Self::DECIMAL_FRACTIONAL) } /// Rounds value down after decimal places. Panics on overflow. + /// + /// # Examples + /// + /// ``` + /// # use cosmwasm_std::SignedDecimal; + /// # use core::str::FromStr; + /// assert!(SignedDecimal::from_str("0.6").unwrap().floor().is_zero()); + /// assert_eq!(SignedDecimal::from_str("-5.2").unwrap().floor().to_string(), "-6"); + /// ``` #[must_use = "this returns the result of the operation, without modifying the original"] pub fn floor(&self) -> Self { match self.checked_floor() { @@ -252,6 +325,15 @@ impl SignedDecimal { } /// Rounds value up after decimal places. Panics on overflow. + /// + /// # Examples + /// + /// ``` + /// # use cosmwasm_std::SignedDecimal; + /// # use core::str::FromStr; + /// assert_eq!(SignedDecimal::from_str("0.2").unwrap().ceil(), SignedDecimal::one()); + /// assert_eq!(SignedDecimal::from_str("-5.8").unwrap().ceil().to_string(), "-5"); + /// ``` #[must_use = "this returns the result of the operation, without modifying the original"] pub fn ceil(&self) -> Self { match self.checked_ceil() { @@ -272,6 +354,7 @@ impl SignedDecimal { } } + /// Computes `self + other`, returning an `OverflowError` if an overflow occurred. pub fn checked_add(self, other: Self) -> Result { self.0 .checked_add(other.0) @@ -279,6 +362,7 @@ impl SignedDecimal { .map_err(|_| OverflowError::new(OverflowOperation::Add, self, other)) } + /// Computes `self - other`, returning an `OverflowError` if an overflow occurred. pub fn checked_sub(self, other: Self) -> Result { self.0 .checked_sub(other.0) @@ -346,6 +430,7 @@ impl SignedDecimal { SignedDecimal::checked_from_ratio(self.numerator(), other.numerator()) } + /// Computes `self % other`, returning an `DivideByZeroError` if `other == 0`. pub fn checked_rem(self, other: Self) -> Result { self.0 .checked_rem(other.0) From f86d102e8e054ce8d72bd4bfb29f1189621577cc Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 11 Sep 2023 11:33:11 +0200 Subject: [PATCH 0748/2372] Fix SignedDecimal docs --- packages/std/src/math/signed_decimal.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/std/src/math/signed_decimal.rs b/packages/std/src/math/signed_decimal.rs index e390c77f12..6d377f4925 100644 --- a/packages/std/src/math/signed_decimal.rs +++ b/packages/std/src/math/signed_decimal.rs @@ -61,7 +61,7 @@ impl SignedDecimal { pub const MIN: Self = Self(Int128::MIN); /// Creates a SignedDecimal(value) - /// This is equivalent to `Decimal::from_atomics(value, 18)` but usable in a const context. + /// This is equivalent to `SignedDecimal::from_atomics(value, 18)` but usable in a const context. /// /// # Examples /// @@ -370,7 +370,7 @@ impl SignedDecimal { .map_err(|_| OverflowError::new(OverflowOperation::Sub, self, other)) } - /// Multiplies one `Decimal` by another, returning an `OverflowError` if an overflow occurred. + /// Multiplies one `SignedDecimal` by another, returning an `OverflowError` if an overflow occurred. pub fn checked_mul(self, other: Self) -> Result { let result_as_int256 = self.numerator().full_mul(other.numerator()) / Int256::from(Self::DECIMAL_FRACTIONAL); @@ -484,7 +484,7 @@ impl SignedDecimal { } } - /// Converts this decimal to an unsigned integer by rounding down + /// Converts this decimal to a signed integer by rounding down /// to the next integer, e.g. 22.5 becomes 22 and -1.2 becomes -2. /// /// ## Examples @@ -520,7 +520,7 @@ impl SignedDecimal { } } - /// Converts this decimal to an unsigned integer by truncating + /// Converts this decimal to a signed integer by truncating /// the fractional part, e.g. 22.5 becomes 22. /// /// ## Examples @@ -543,7 +543,7 @@ impl SignedDecimal { self.0 / Self::DECIMAL_FRACTIONAL } - /// Converts this decimal to an unsigned integer by rounding up + /// Converts this decimal to a signed integer by rounding up /// to the next integer, e.g. 22.3 becomes 23 and -1.2 becomes -1. /// /// ## Examples From eb99c42c829f1a82cdca4927374945870350fff3 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 11 Sep 2023 13:12:17 +0200 Subject: [PATCH 0749/2372] Add SignedDecimal256 --- packages/std/src/lib.rs | 4 +- packages/std/src/math/mod.rs | 2 + packages/std/src/math/signed_decimal_256.rs | 3178 +++++++++++++++++++ 3 files changed, 3182 insertions(+), 2 deletions(-) create mode 100644 packages/std/src/math/signed_decimal_256.rs diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 6c6454ffe2..dcf106b96e 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -61,8 +61,8 @@ pub use crate::ibc::{ pub use crate::iterator::{Order, Record}; pub use crate::math::{ Decimal, Decimal256, Decimal256RangeExceeded, DecimalRangeExceeded, Fraction, Int128, Int256, - Int512, Int64, Isqrt, SignedDecimal, SignedDecimalRangeExceeded, Uint128, Uint256, Uint512, - Uint64, + Int512, Int64, Isqrt, SignedDecimal, SignedDecimal256, SignedDecimal256RangeExceeded, + SignedDecimalRangeExceeded, Uint128, Uint256, Uint512, Uint64, }; pub use crate::metadata::{DenomMetadata, DenomUnit}; pub use crate::never::Never; diff --git a/packages/std/src/math/mod.rs b/packages/std/src/math/mod.rs index 5defdb142b..1e4527f214 100644 --- a/packages/std/src/math/mod.rs +++ b/packages/std/src/math/mod.rs @@ -9,6 +9,7 @@ mod int64; mod isqrt; mod num_consts; mod signed_decimal; +mod signed_decimal_256; mod uint128; mod uint256; mod uint512; @@ -23,6 +24,7 @@ pub use int512::Int512; pub use int64::Int64; pub use isqrt::Isqrt; pub use signed_decimal::{SignedDecimal, SignedDecimalRangeExceeded}; +pub use signed_decimal_256::{SignedDecimal256, SignedDecimal256RangeExceeded}; pub use uint128::Uint128; pub use uint256::Uint256; pub use uint512::Uint512; diff --git a/packages/std/src/math/signed_decimal_256.rs b/packages/std/src/math/signed_decimal_256.rs new file mode 100644 index 0000000000..eafc3f53d3 --- /dev/null +++ b/packages/std/src/math/signed_decimal_256.rs @@ -0,0 +1,3178 @@ +use core::cmp::Ordering; +use core::fmt::{self, Write}; +use core::ops::{ + Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Rem, RemAssign, Sub, SubAssign, +}; +use core::str::FromStr; +use forward_ref::{forward_ref_binop, forward_ref_op_assign}; +use schemars::JsonSchema; +use serde::{de, ser, Deserialize, Deserializer, Serialize}; +use thiserror::Error; + +use crate::errors::{ + CheckedFromRatioError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, + OverflowOperation, RoundDownOverflowError, RoundUpOverflowError, StdError, +}; +use crate::{forward_ref_partial_eq, Decimal256, Int512}; + +use super::Fraction; +use super::Int256; + +/// A signed fixed-point decimal value with 18 fractional digits, +/// i.e. SignedDecimal256(1_000_000_000_000_000_000) == 1.0 +/// +/// The greatest possible value that can be represented is +/// 57896044618658097711785492504343953926634992332820282019728.792003956564819967 +/// (which is (2^255 - 1) / 10^18) +/// and the smallest is +/// -57896044618658097711785492504343953926634992332820282019728.792003956564819968 +/// (which is -2^255 / 10^18). +#[derive(Copy, Clone, Default, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] +pub struct SignedDecimal256(#[schemars(with = "String")] Int256); + +forward_ref_partial_eq!(SignedDecimal256, SignedDecimal256); + +#[derive(Error, Debug, PartialEq, Eq)] +#[error("SignedDecimal256 range exceeded")] +pub struct SignedDecimal256RangeExceeded; + +impl SignedDecimal256 { + const DECIMAL_FRACTIONAL: Int256 = // 1*10**18 + Int256::from_be_bytes([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 224, 182, + 179, 167, 100, 0, 0, + ]); + const DECIMAL_FRACTIONAL_SQUARED: Int256 = // 1*10**36 + Int256::from_be_bytes([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 151, 206, 123, 201, 7, 21, 179, + 75, 159, 16, 0, 0, 0, 0, + ]); + + /// The number of decimal places. Since decimal types are fixed-point rather than + /// floating-point, this is a constant. + pub const DECIMAL_PLACES: u32 = 18; // This needs to be an even number. + + /// The largest value that can be represented by this signed decimal type. + /// + /// # Examples + /// + /// ``` + /// # use cosmwasm_std::SignedDecimal256; + /// assert_eq!( + /// SignedDecimal256::MAX.to_string(), + /// "57896044618658097711785492504343953926634992332820282019728.792003956564819967" + /// ); + /// ``` + pub const MAX: Self = Self(Int256::MAX); + + /// The smallest value that can be represented by this signed decimal type. + /// + /// # Examples + /// + /// ``` + /// # use cosmwasm_std::SignedDecimal256; + /// assert_eq!( + /// SignedDecimal256::MIN.to_string(), + /// "-57896044618658097711785492504343953926634992332820282019728.792003956564819968" + /// ); + /// ``` + pub const MIN: Self = Self(Int256::MIN); + + /// Creates a SignedDecimal256(value) + /// This is equivalent to `SignedDecimal256::from_atomics(value, 18)` but usable in a const context. + /// + /// # Examples + /// + /// ``` + /// # use cosmwasm_std::{SignedDecimal256, Int256}; + /// assert_eq!(SignedDecimal256::new(Int256::one()).to_string(), "0.000000000000000001"); + /// ``` + pub const fn new(value: Int256) -> Self { + Self(value) + } + + /// Creates a SignedDecimal256(Int256(value)) + /// This is equivalent to `SignedDecimal256::from_atomics(value, 18)` but usable in a const context. + /// + /// # Examples + /// + /// ``` + /// # use cosmwasm_std::SignedDecimal256; + /// assert_eq!(SignedDecimal256::raw(1234i128).to_string(), "0.000000000000001234"); + /// ``` + pub const fn raw(value: i128) -> Self { + Self(Int256::from_i128(value)) + } + + /// Create a 1.0 SignedDecimal256 + #[inline] + pub const fn one() -> Self { + Self(Self::DECIMAL_FRACTIONAL) + } + + /// Create a -1.0 SignedDecimal256 + #[inline] + pub fn negative_one() -> Self { + Self(-Self::DECIMAL_FRACTIONAL) // TODO: constify + } + + /// Create a 0.0 SignedDecimal256 + #[inline] + pub const fn zero() -> Self { + Self(Int256::zero()) + } + + /// Convert x% into SignedDecimal256 + pub fn percent(x: i64) -> Self { + Self(((x as i128) * 10_000_000_000_000_000).into()) + } + + /// Convert permille (x/1000) into SignedDecimal256 + pub fn permille(x: i64) -> Self { + Self(((x as i128) * 1_000_000_000_000_000).into()) + } + + /// Convert basis points (x/10000) into SignedDecimal256 + pub fn bps(x: i64) -> Self { + Self(((x as i128) * 100_000_000_000_000).into()) + } + + /// Creates a signed decimal from a number of atomic units and the number + /// of decimal places. The inputs will be converted internally to form + /// a signed decimal with 18 decimal places. So the input 123 and 2 will create + /// the decimal 1.23. + /// + /// Using 18 decimal places is slightly more efficient than other values + /// as no internal conversion is necessary. + /// + /// ## Examples + /// + /// ``` + /// # use cosmwasm_std::{SignedDecimal256, Int256}; + /// let a = SignedDecimal256::from_atomics(Int256::from(1234), 3).unwrap(); + /// assert_eq!(a.to_string(), "1.234"); + /// + /// let a = SignedDecimal256::from_atomics(1234i128, 0).unwrap(); + /// assert_eq!(a.to_string(), "1234"); + /// + /// let a = SignedDecimal256::from_atomics(1i64, 18).unwrap(); + /// assert_eq!(a.to_string(), "0.000000000000000001"); + /// + /// let a = SignedDecimal256::from_atomics(-1i64, 18).unwrap(); + /// assert_eq!(a.to_string(), "-0.000000000000000001"); + /// ``` + pub fn from_atomics( + atomics: impl Into, + decimal_places: u32, + ) -> Result { + let atomics = atomics.into(); + let ten = Int256::from(10u64); + Ok(match decimal_places.cmp(&(Self::DECIMAL_PLACES)) { + Ordering::Less => { + let digits = (Self::DECIMAL_PLACES) - decimal_places; // No overflow because decimal_places < DECIMAL_PLACES + let factor = ten.checked_pow(digits).unwrap(); // Safe because digits <= 17 + Self( + atomics + .checked_mul(factor) + .map_err(|_| SignedDecimal256RangeExceeded)?, + ) + } + Ordering::Equal => Self(atomics), + Ordering::Greater => { + let digits = decimal_places - (Self::DECIMAL_PLACES); // No overflow because decimal_places > DECIMAL_PLACES + if let Ok(factor) = ten.checked_pow(digits) { + Self(atomics.checked_div(factor).unwrap()) // Safe because factor cannot be zero + } else { + // In this case `factor` exceeds the Int256 range. + // Any Int256 `x` divided by `factor` with `factor > Int256::MAX` is 0. + // Try e.g. Python3: `(2**128-1) // 2**128` + Self(Int256::zero()) + } + } + }) + } + + /// Returns the ratio (numerator / denominator) as a SignedDecimal256 + /// + /// # Examples + /// + /// ``` + /// # use cosmwasm_std::SignedDecimal256; + /// assert_eq!( + /// SignedDecimal256::from_ratio(1, 3).to_string(), + /// "0.333333333333333333" + /// ); + /// ``` + pub fn from_ratio(numerator: impl Into, denominator: impl Into) -> Self { + match SignedDecimal256::checked_from_ratio(numerator, denominator) { + Ok(value) => value, + Err(CheckedFromRatioError::DivideByZero) => { + panic!("Denominator must not be zero") + } + Err(CheckedFromRatioError::Overflow) => panic!("Multiplication overflow"), + } + } + + /// Returns the ratio (numerator / denominator) as a SignedDecimal256 + /// + /// # Examples + /// + /// ``` + /// # use cosmwasm_std::{SignedDecimal256, CheckedFromRatioError}; + /// assert_eq!( + /// SignedDecimal256::checked_from_ratio(1, 3).unwrap().to_string(), + /// "0.333333333333333333" + /// ); + /// assert_eq!( + /// SignedDecimal256::checked_from_ratio(1, 0), + /// Err(CheckedFromRatioError::DivideByZero) + /// ); + /// ``` + pub fn checked_from_ratio( + numerator: impl Into, + denominator: impl Into, + ) -> Result { + let numerator: Int256 = numerator.into(); + let denominator: Int256 = denominator.into(); + match numerator.checked_multiply_ratio(Self::DECIMAL_FRACTIONAL, denominator) { + Ok(ratio) => { + // numerator * DECIMAL_FRACTIONAL / denominator + Ok(SignedDecimal256(ratio)) + } + Err(CheckedMultiplyRatioError::Overflow) => Err(CheckedFromRatioError::Overflow), + Err(CheckedMultiplyRatioError::DivideByZero) => { + Err(CheckedFromRatioError::DivideByZero) + } + } + } + + /// Returns `true` if the number is 0 + #[must_use] + pub const fn is_zero(&self) -> bool { + self.0.is_zero() + } + + /// Returns `true` if the number is negative (< 0) + #[must_use] + pub const fn is_negative(&self) -> bool { + self.0.is_negative() + } + + /// A decimal is an integer of atomic units plus a number that specifies the + /// position of the decimal dot. So any decimal can be expressed as two numbers. + /// + /// ## Examples + /// + /// ``` + /// # use cosmwasm_std::{SignedDecimal256, Int256}; + /// # use core::str::FromStr; + /// // Value with whole and fractional part + /// let a = SignedDecimal256::from_str("1.234").unwrap(); + /// assert_eq!(a.decimal_places(), 18); + /// assert_eq!(a.atomics(), Int256::from(1234000000000000000i128)); + /// + /// // Smallest possible value + /// let b = SignedDecimal256::from_str("0.000000000000000001").unwrap(); + /// assert_eq!(b.decimal_places(), 18); + /// assert_eq!(b.atomics(), Int256::from(1)); + /// ``` + #[must_use] + #[inline] + pub const fn atomics(&self) -> Int256 { + self.0 + } + + /// The number of decimal places. This is a constant value for now + /// but this could potentially change as the type evolves. + /// + /// See also [`SignedDecimal256::atomics()`]. + #[must_use] + #[inline] + pub const fn decimal_places(&self) -> u32 { + Self::DECIMAL_PLACES + } + + /// Rounds value by truncating the decimal places. + /// + /// # Examples + /// + /// ``` + /// # use cosmwasm_std::SignedDecimal256; + /// # use core::str::FromStr; + /// assert!(SignedDecimal256::from_str("0.6").unwrap().trunc().is_zero()); + /// assert_eq!(SignedDecimal256::from_str("-5.8").unwrap().trunc().to_string(), "-5"); + /// ``` + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn trunc(&self) -> Self { + Self((self.0 / Self::DECIMAL_FRACTIONAL) * Self::DECIMAL_FRACTIONAL) + } + + /// Rounds value down after decimal places. Panics on overflow. + /// + /// # Examples + /// + /// ``` + /// # use cosmwasm_std::SignedDecimal256; + /// # use core::str::FromStr; + /// assert!(SignedDecimal256::from_str("0.6").unwrap().floor().is_zero()); + /// assert_eq!(SignedDecimal256::from_str("-5.2").unwrap().floor().to_string(), "-6"); + /// ``` + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn floor(&self) -> Self { + match self.checked_floor() { + Ok(value) => value, + Err(_) => panic!("attempt to floor with overflow"), + } + } + + /// Rounds value down after decimal places. + pub fn checked_floor(&self) -> Result { + if self.is_negative() { + let truncated = self.trunc(); + + if truncated != self { + truncated + .checked_sub(SignedDecimal256::one()) + .map_err(|_| RoundDownOverflowError) + } else { + Ok(truncated) + } + } else { + Ok(self.trunc()) + } + } + + /// Rounds value up after decimal places. Panics on overflow. + /// + /// # Examples + /// + /// ``` + /// # use cosmwasm_std::SignedDecimal256; + /// # use core::str::FromStr; + /// assert_eq!(SignedDecimal256::from_str("0.2").unwrap().ceil(), SignedDecimal256::one()); + /// assert_eq!(SignedDecimal256::from_str("-5.8").unwrap().ceil().to_string(), "-5"); + /// ``` + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn ceil(&self) -> Self { + match self.checked_ceil() { + Ok(value) => value, + Err(_) => panic!("attempt to ceil with overflow"), + } + } + + /// Rounds value up after decimal places. Returns OverflowError on overflow. + pub fn checked_ceil(&self) -> Result { + let floor = self.floor(); + if floor == self { + Ok(floor) + } else { + floor + .checked_add(SignedDecimal256::one()) + .map_err(|_| RoundUpOverflowError) + } + } + + /// Computes `self + other`, returning an `OverflowError` if an overflow occurred. + pub fn checked_add(self, other: Self) -> Result { + self.0 + .checked_add(other.0) + .map(Self) + .map_err(|_| OverflowError::new(OverflowOperation::Add, self, other)) + } + + /// Computes `self - other`, returning an `OverflowError` if an overflow occurred. + pub fn checked_sub(self, other: Self) -> Result { + self.0 + .checked_sub(other.0) + .map(Self) + .map_err(|_| OverflowError::new(OverflowOperation::Sub, self, other)) + } + + /// Multiplies one `SignedDecimal256` by another, returning an `OverflowError` if an overflow occurred. + pub fn checked_mul(self, other: Self) -> Result { + let result_as_int512 = + self.numerator().full_mul(other.numerator()) / Int512::from(Self::DECIMAL_FRACTIONAL); + result_as_int512 + .try_into() + .map(Self) + .map_err(|_| OverflowError { + operation: crate::OverflowOperation::Mul, + operand1: self.to_string(), + operand2: other.to_string(), + }) + } + + /// Raises a value to the power of `exp`, panics if an overflow occurred. + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn pow(self, exp: u32) -> Self { + match self.checked_pow(exp) { + Ok(value) => value, + Err(_) => panic!("Multiplication overflow"), + } + } + + /// Raises a value to the power of `exp`, returning an `OverflowError` if an overflow occurred. + pub fn checked_pow(self, exp: u32) -> Result { + // This uses the exponentiation by squaring algorithm: + // https://en.wikipedia.org/wiki/Exponentiation_by_squaring#Basic_method + + fn inner(mut x: SignedDecimal256, mut n: u32) -> Result { + if n == 0 { + return Ok(SignedDecimal256::one()); + } + + let mut y = SignedDecimal256::one(); + + while n > 1 { + if n % 2 == 0 { + x = x.checked_mul(x)?; + n /= 2; + } else { + y = x.checked_mul(y)?; + x = x.checked_mul(x)?; + n = (n - 1) / 2; + } + } + + Ok(x * y) + } + + inner(self, exp).map_err(|_| OverflowError { + operation: crate::OverflowOperation::Pow, + operand1: self.to_string(), + operand2: exp.to_string(), + }) + } + + pub fn checked_div(self, other: Self) -> Result { + SignedDecimal256::checked_from_ratio(self.numerator(), other.numerator()) + } + + /// Computes `self % other`, returning an `DivideByZeroError` if `other == 0`. + pub fn checked_rem(self, other: Self) -> Result { + self.0 + .checked_rem(other.0) + .map(Self) + .map_err(|_| DivideByZeroError::new(self)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub const fn abs_diff(self, other: Self) -> Decimal256 { + Decimal256::new(self.0.abs_diff(other.0)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn saturating_add(self, other: Self) -> Self { + Self(self.0.saturating_add(other.0)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn saturating_sub(self, other: Self) -> Self { + Self(self.0.saturating_sub(other.0)) + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn saturating_mul(self, other: Self) -> Self { + match self.checked_mul(other) { + Ok(value) => value, + Err(_) => { + // both negative or both positive results in positive number, otherwise negative + if self.is_negative() == other.is_negative() { + Self::MAX + } else { + Self::MIN + } + } + } + } + + #[must_use = "this returns the result of the operation, without modifying the original"] + pub fn saturating_pow(self, exp: u32) -> Self { + match self.checked_pow(exp) { + Ok(value) => value, + Err(_) => { + // odd exponent of negative number results in negative number + // everything else results in positive number + if self.is_negative() && exp % 2 == 1 { + Self::MIN + } else { + Self::MAX + } + } + } + } + + /// Converts this decimal to a signed integer by rounding down + /// to the next integer, e.g. 22.5 becomes 22 and -1.2 becomes -2. + /// + /// ## Examples + /// + /// ``` + /// use core::str::FromStr; + /// use cosmwasm_std::{SignedDecimal256, Int256}; + /// + /// let d = SignedDecimal256::from_str("12.345").unwrap(); + /// assert_eq!(d.to_int_floor(), Int256::from(12)); + /// + /// let d = SignedDecimal256::from_str("-12.999").unwrap(); + /// assert_eq!(d.to_int_floor(), Int256::from(-13)); + /// + /// let d = SignedDecimal256::from_str("-0.05").unwrap(); + /// assert_eq!(d.to_int_floor(), Int256::from(-1)); + /// ``` + #[must_use] + pub fn to_int_floor(self) -> Int256 { + if self.is_negative() { + // Using `x.to_int_floor() = -(-x).to_int_ceil()` for a negative `x`, + // but avoiding overflow by implementing the formula from `to_int_ceil` directly. + let x = self.0; + let y = Self::DECIMAL_FRACTIONAL; + if x.is_zero() { + Int256::zero() + } else { + // making sure not to negate `x`, as this would overflow + -Int256::one() - ((-Int256::one() - x) / y) + } + } else { + self.to_int_trunc() + } + } + + /// Converts this decimal to a signed integer by truncating + /// the fractional part, e.g. 22.5 becomes 22. + /// + /// ## Examples + /// + /// ``` + /// use core::str::FromStr; + /// use cosmwasm_std::{SignedDecimal256, Int256}; + /// + /// let d = SignedDecimal256::from_str("12.345").unwrap(); + /// assert_eq!(d.to_int_trunc(), Int256::from(12)); + /// + /// let d = SignedDecimal256::from_str("-12.999").unwrap(); + /// assert_eq!(d.to_int_trunc(), Int256::from(-12)); + /// + /// let d = SignedDecimal256::from_str("75.0").unwrap(); + /// assert_eq!(d.to_int_trunc(), Int256::from(75)); + /// ``` + #[must_use] + pub fn to_int_trunc(self) -> Int256 { + self.0 / Self::DECIMAL_FRACTIONAL + } + + /// Converts this decimal to a signed integer by rounding up + /// to the next integer, e.g. 22.3 becomes 23 and -1.2 becomes -1. + /// + /// ## Examples + /// + /// ``` + /// use core::str::FromStr; + /// use cosmwasm_std::{SignedDecimal256, Int256}; + /// + /// let d = SignedDecimal256::from_str("12.345").unwrap(); + /// assert_eq!(d.to_int_ceil(), Int256::from(13)); + /// + /// let d = SignedDecimal256::from_str("-12.999").unwrap(); + /// assert_eq!(d.to_int_ceil(), Int256::from(-12)); + /// + /// let d = SignedDecimal256::from_str("75.0").unwrap(); + /// assert_eq!(d.to_int_ceil(), Int256::from(75)); + /// ``` + #[must_use] + pub fn to_int_ceil(self) -> Int256 { + if self.is_negative() { + self.to_int_trunc() + } else { + // Using `q = 1 + ((x - 1) / y); // if x != 0` with unsigned integers x, y, q + // from https://stackoverflow.com/a/2745086/2013738. We know `x + y` CAN overflow. + let x = self.0; + let y = Self::DECIMAL_FRACTIONAL; + if x.is_zero() { + Int256::zero() + } else { + Int256::one() + ((x - Int256::one()) / y) + } + } + } +} + +impl Fraction for SignedDecimal256 { + #[inline] + fn numerator(&self) -> Int256 { + self.0 + } + + #[inline] + fn denominator(&self) -> Int256 { + Self::DECIMAL_FRACTIONAL + } + + /// Returns the multiplicative inverse `1/d` for decimal `d`. + /// + /// If `d` is zero, none is returned. + fn inv(&self) -> Option { + if self.is_zero() { + None + } else { + // Let self be p/q with p = self.0 and q = DECIMAL_FRACTIONAL. + // Now we calculate the inverse a/b = q/p such that b = DECIMAL_FRACTIONAL. Then + // `a = DECIMAL_FRACTIONAL*DECIMAL_FRACTIONAL / self.0`. + Some(SignedDecimal256(Self::DECIMAL_FRACTIONAL_SQUARED / self.0)) + } + } +} + +impl Neg for SignedDecimal256 { + type Output = Self; + + fn neg(self) -> Self::Output { + Self(-self.0) + } +} + +impl FromStr for SignedDecimal256 { + type Err = StdError; + + /// Converts the decimal string to a SignedDecimal256 + /// Possible inputs: "1.23", "1", "000012", "1.123000000", "-1.12300" + /// Disallowed: "", ".23" + /// + /// This never performs any kind of rounding. + /// More than DECIMAL_PLACES fractional digits, even zeros, result in an error. + fn from_str(input: &str) -> Result { + let mut parts_iter = input.split('.'); + + let whole_part = parts_iter.next().unwrap(); // split always returns at least one element + let is_neg = whole_part.starts_with('-'); + + let whole = whole_part + .parse::() + .map_err(|_| StdError::generic_err("Error parsing whole"))?; + let mut atomics = whole + .checked_mul(Self::DECIMAL_FRACTIONAL) + .map_err(|_| StdError::generic_err("Value too big"))?; + + if let Some(fractional_part) = parts_iter.next() { + let fractional = fractional_part + .parse::() // u64 is enough for 18 decimal places + .map_err(|_| StdError::generic_err("Error parsing fractional"))?; + let exp = (Self::DECIMAL_PLACES.checked_sub(fractional_part.len() as u32)).ok_or_else( + || { + StdError::generic_err(format!( + "Cannot parse more than {} fractional digits", + Self::DECIMAL_PLACES + )) + }, + )?; + debug_assert!(exp <= Self::DECIMAL_PLACES); + let fractional_factor = Int256::from(10i128.pow(exp)); + + // This multiplication can't overflow because + // fractional < 10^DECIMAL_PLACES && fractional_factor <= 10^DECIMAL_PLACES + let fractional_part = Int256::from(fractional) + .checked_mul(fractional_factor) + .unwrap(); + + // for negative numbers, we need to subtract the fractional part + atomics = if is_neg { + atomics.checked_sub(fractional_part) + } else { + atomics.checked_add(fractional_part) + } + .map_err(|_| StdError::generic_err("Value too big"))?; + } + + if parts_iter.next().is_some() { + return Err(StdError::generic_err("Unexpected number of dots")); + } + + Ok(SignedDecimal256(atomics)) + } +} + +impl fmt::Display for SignedDecimal256 { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let whole = (self.0) / Self::DECIMAL_FRACTIONAL; + let fractional = (self.0).checked_rem(Self::DECIMAL_FRACTIONAL).unwrap(); + + if fractional.is_zero() { + write!(f, "{whole}") + } else { + let fractional_string = format!( + "{:0>padding$}", + fractional.abs(), // fractional should always be printed as positive + padding = Self::DECIMAL_PLACES as usize + ); + if self.is_negative() { + f.write_char('-')?; + } + write!( + f, + "{whole}.{fractional}", + whole = whole.abs(), + fractional = fractional_string.trim_end_matches('0') + ) + } + } +} + +impl fmt::Debug for SignedDecimal256 { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "SignedDecimal256({self})") + } +} + +impl Add for SignedDecimal256 { + type Output = Self; + + fn add(self, other: Self) -> Self { + SignedDecimal256(self.0 + other.0) + } +} +forward_ref_binop!(impl Add, add for SignedDecimal256, SignedDecimal256); + +impl AddAssign for SignedDecimal256 { + fn add_assign(&mut self, rhs: SignedDecimal256) { + *self = *self + rhs; + } +} +forward_ref_op_assign!(impl AddAssign, add_assign for SignedDecimal256, SignedDecimal256); + +impl Sub for SignedDecimal256 { + type Output = Self; + + fn sub(self, other: Self) -> Self { + SignedDecimal256(self.0 - other.0) + } +} +forward_ref_binop!(impl Sub, sub for SignedDecimal256, SignedDecimal256); + +impl SubAssign for SignedDecimal256 { + fn sub_assign(&mut self, rhs: SignedDecimal256) { + *self = *self - rhs; + } +} +forward_ref_op_assign!(impl SubAssign, sub_assign for SignedDecimal256, SignedDecimal256); + +impl Mul for SignedDecimal256 { + type Output = Self; + + #[allow(clippy::suspicious_arithmetic_impl)] + fn mul(self, other: Self) -> Self { + // SignedDecimal256s are fractions. We can multiply two decimals a and b + // via + // (a.numerator() * b.numerator()) / (a.denominator() * b.denominator()) + // = (a.numerator() * b.numerator()) / a.denominator() / b.denominator() + + let result_as_int512 = + self.numerator().full_mul(other.numerator()) / Int512::from(Self::DECIMAL_FRACTIONAL); + match result_as_int512.try_into() { + Ok(result) => Self(result), + Err(_) => panic!("attempt to multiply with overflow"), + } + } +} +forward_ref_binop!(impl Mul, mul for SignedDecimal256, SignedDecimal256); + +impl MulAssign for SignedDecimal256 { + fn mul_assign(&mut self, rhs: SignedDecimal256) { + *self = *self * rhs; + } +} +forward_ref_op_assign!(impl MulAssign, mul_assign for SignedDecimal256, SignedDecimal256); + +impl Div for SignedDecimal256 { + type Output = Self; + + fn div(self, other: Self) -> Self { + match SignedDecimal256::checked_from_ratio(self.numerator(), other.numerator()) { + Ok(ratio) => ratio, + Err(CheckedFromRatioError::DivideByZero) => { + panic!("Division failed - denominator must not be zero") + } + Err(CheckedFromRatioError::Overflow) => { + panic!("Division failed - multiplication overflow") + } + } + } +} +forward_ref_binop!(impl Div, div for SignedDecimal256, SignedDecimal256); + +impl DivAssign for SignedDecimal256 { + fn div_assign(&mut self, rhs: SignedDecimal256) { + *self = *self / rhs; + } +} +forward_ref_op_assign!(impl DivAssign, div_assign for SignedDecimal256, SignedDecimal256); + +impl Div for SignedDecimal256 { + type Output = Self; + + fn div(self, rhs: Int256) -> Self::Output { + SignedDecimal256(self.0 / rhs) + } +} + +impl DivAssign for SignedDecimal256 { + fn div_assign(&mut self, rhs: Int256) { + self.0 /= rhs; + } +} + +impl Rem for SignedDecimal256 { + type Output = Self; + + /// # Panics + /// + /// This operation will panic if `rhs` is zero + #[inline] + fn rem(self, rhs: Self) -> Self { + Self(self.0.rem(rhs.0)) + } +} +forward_ref_binop!(impl Rem, rem for SignedDecimal256, SignedDecimal256); + +impl RemAssign for SignedDecimal256 { + fn rem_assign(&mut self, rhs: SignedDecimal256) { + *self = *self % rhs; + } +} +forward_ref_op_assign!(impl RemAssign, rem_assign for SignedDecimal256, SignedDecimal256); + +impl core::iter::Sum for SignedDecimal256 +where + Self: Add, +{ + fn sum>(iter: I) -> Self { + iter.fold(Self::zero(), Add::add) + } +} + +/// Serializes as a decimal string +impl Serialize for SignedDecimal256 { + fn serialize(&self, serializer: S) -> Result + where + S: ser::Serializer, + { + serializer.serialize_str(&self.to_string()) + } +} + +/// Deserializes as a base64 string +impl<'de> Deserialize<'de> for SignedDecimal256 { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_str(SignedDecimal256Visitor) + } +} + +struct SignedDecimal256Visitor; + +impl<'de> de::Visitor<'de> for SignedDecimal256Visitor { + type Value = SignedDecimal256; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("string-encoded decimal") + } + + fn visit_str(self, v: &str) -> Result + where + E: de::Error, + { + match SignedDecimal256::from_str(v) { + Ok(d) => Ok(d), + Err(e) => Err(E::custom(format!("Error parsing decimal '{v}': {e}"))), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{from_slice, to_vec}; + + fn dec(input: &str) -> SignedDecimal256 { + SignedDecimal256::from_str(input).unwrap() + } + + #[test] + fn signed_decimal_256_new() { + let expected = Int256::from(300i128); + assert_eq!(SignedDecimal256::new(expected).0, expected); + + let expected = Int256::from(-300i128); + assert_eq!(SignedDecimal256::new(expected).0, expected); + } + + #[test] + fn signed_decimal_256_raw() { + let value = 300i128; + assert_eq!(SignedDecimal256::raw(value).0, Int256::from(value)); + + let value = -300i128; + assert_eq!(SignedDecimal256::raw(value).0, Int256::from(value)); + } + + #[test] + fn signed_decimal_256_one() { + let value = SignedDecimal256::one(); + assert_eq!(value.0, SignedDecimal256::DECIMAL_FRACTIONAL); + } + + #[test] + fn signed_decimal_256_zero() { + let value = SignedDecimal256::zero(); + assert!(value.0.is_zero()); + } + + #[test] + fn signed_decimal_256_percent() { + let value = SignedDecimal256::percent(50); + assert_eq!( + value.0, + SignedDecimal256::DECIMAL_FRACTIONAL / Int256::from(2u8) + ); + + let value = SignedDecimal256::percent(-50); + assert_eq!( + value.0, + SignedDecimal256::DECIMAL_FRACTIONAL / Int256::from(-2i8) + ); + } + + #[test] + fn signed_decimal_256_permille() { + let value = SignedDecimal256::permille(125); + assert_eq!( + value.0, + SignedDecimal256::DECIMAL_FRACTIONAL / Int256::from(8u8) + ); + + let value = SignedDecimal256::permille(-125); + assert_eq!( + value.0, + SignedDecimal256::DECIMAL_FRACTIONAL / Int256::from(-8i8) + ); + } + + #[test] + fn signed_decimal_256_bps() { + let value = SignedDecimal256::bps(125); + assert_eq!( + value.0, + SignedDecimal256::DECIMAL_FRACTIONAL / Int256::from(80u8) + ); + + let value = SignedDecimal256::bps(-125); + assert_eq!( + value.0, + SignedDecimal256::DECIMAL_FRACTIONAL / Int256::from(-80i8) + ); + } + + #[test] + fn signed_decimal_256_from_atomics_works() { + let one = SignedDecimal256::one(); + let two = one + one; + let neg_one = SignedDecimal256::negative_one(); + + assert_eq!(SignedDecimal256::from_atomics(1i128, 0).unwrap(), one); + assert_eq!(SignedDecimal256::from_atomics(10i128, 1).unwrap(), one); + assert_eq!(SignedDecimal256::from_atomics(100i128, 2).unwrap(), one); + assert_eq!(SignedDecimal256::from_atomics(1000i128, 3).unwrap(), one); + assert_eq!( + SignedDecimal256::from_atomics(1000000000000000000i128, 18).unwrap(), + one + ); + assert_eq!( + SignedDecimal256::from_atomics(10000000000000000000i128, 19).unwrap(), + one + ); + assert_eq!( + SignedDecimal256::from_atomics(100000000000000000000i128, 20).unwrap(), + one + ); + + assert_eq!(SignedDecimal256::from_atomics(2i128, 0).unwrap(), two); + assert_eq!(SignedDecimal256::from_atomics(20i128, 1).unwrap(), two); + assert_eq!(SignedDecimal256::from_atomics(200i128, 2).unwrap(), two); + assert_eq!(SignedDecimal256::from_atomics(2000i128, 3).unwrap(), two); + assert_eq!( + SignedDecimal256::from_atomics(2000000000000000000i128, 18).unwrap(), + two + ); + assert_eq!( + SignedDecimal256::from_atomics(20000000000000000000i128, 19).unwrap(), + two + ); + assert_eq!( + SignedDecimal256::from_atomics(200000000000000000000i128, 20).unwrap(), + two + ); + + assert_eq!(SignedDecimal256::from_atomics(-1i128, 0).unwrap(), neg_one); + assert_eq!(SignedDecimal256::from_atomics(-10i128, 1).unwrap(), neg_one); + assert_eq!( + SignedDecimal256::from_atomics(-100000000000000000000i128, 20).unwrap(), + neg_one + ); + + // Cuts decimal digits (20 provided but only 18 can be stored) + assert_eq!( + SignedDecimal256::from_atomics(4321i128, 20).unwrap(), + SignedDecimal256::from_str("0.000000000000000043").unwrap() + ); + assert_eq!( + SignedDecimal256::from_atomics(-4321i128, 20).unwrap(), + SignedDecimal256::from_str("-0.000000000000000043").unwrap() + ); + assert_eq!( + SignedDecimal256::from_atomics(6789i128, 20).unwrap(), + SignedDecimal256::from_str("0.000000000000000067").unwrap() + ); + assert_eq!( + SignedDecimal256::from_atomics(i128::MAX, 38).unwrap(), + SignedDecimal256::from_str("1.701411834604692317").unwrap() + ); + assert_eq!( + SignedDecimal256::from_atomics(i128::MAX, 39).unwrap(), + SignedDecimal256::from_str("0.170141183460469231").unwrap() + ); + assert_eq!( + SignedDecimal256::from_atomics(i128::MAX, 45).unwrap(), + SignedDecimal256::from_str("0.000000170141183460").unwrap() + ); + assert_eq!( + SignedDecimal256::from_atomics(i128::MAX, 51).unwrap(), + SignedDecimal256::from_str("0.000000000000170141").unwrap() + ); + assert_eq!( + SignedDecimal256::from_atomics(i128::MAX, 56).unwrap(), + SignedDecimal256::from_str("0.000000000000000001").unwrap() + ); + assert_eq!( + SignedDecimal256::from_atomics(i128::MAX, 57).unwrap(), + SignedDecimal256::from_str("0.000000000000000000").unwrap() + ); + assert_eq!( + SignedDecimal256::from_atomics(i128::MAX, u32::MAX).unwrap(), + SignedDecimal256::from_str("0.000000000000000000").unwrap() + ); + + // Can be used with max value + let max = SignedDecimal256::MAX; + assert_eq!( + SignedDecimal256::from_atomics(max.atomics(), max.decimal_places()).unwrap(), + max + ); + + // Can be used with min value + let min = SignedDecimal256::MIN; + assert_eq!( + SignedDecimal256::from_atomics(min.atomics(), min.decimal_places()).unwrap(), + min + ); + + // Overflow is only possible with digits < 18 + let result = SignedDecimal256::from_atomics(Int256::MAX, 17); + assert_eq!(result.unwrap_err(), SignedDecimal256RangeExceeded); + } + + #[test] + fn signed_decimal_256_from_ratio_works() { + // 1.0 + assert_eq!( + SignedDecimal256::from_ratio(1i128, 1i128), + SignedDecimal256::one() + ); + assert_eq!( + SignedDecimal256::from_ratio(53i128, 53i128), + SignedDecimal256::one() + ); + assert_eq!( + SignedDecimal256::from_ratio(125i128, 125i128), + SignedDecimal256::one() + ); + + // -1.0 + assert_eq!( + SignedDecimal256::from_ratio(-1i128, 1i128), + SignedDecimal256::negative_one() + ); + assert_eq!( + SignedDecimal256::from_ratio(-53i128, 53i128), + SignedDecimal256::negative_one() + ); + assert_eq!( + SignedDecimal256::from_ratio(125i128, -125i128), + SignedDecimal256::negative_one() + ); + + // 1.5 + assert_eq!( + SignedDecimal256::from_ratio(3i128, 2i128), + SignedDecimal256::percent(150) + ); + assert_eq!( + SignedDecimal256::from_ratio(150i128, 100i128), + SignedDecimal256::percent(150) + ); + assert_eq!( + SignedDecimal256::from_ratio(333i128, 222i128), + SignedDecimal256::percent(150) + ); + + // 0.125 + assert_eq!( + SignedDecimal256::from_ratio(1i64, 8i64), + SignedDecimal256::permille(125) + ); + assert_eq!( + SignedDecimal256::from_ratio(125i64, 1000i64), + SignedDecimal256::permille(125) + ); + + // -0.125 + assert_eq!( + SignedDecimal256::from_ratio(-1i64, 8i64), + SignedDecimal256::permille(-125) + ); + assert_eq!( + SignedDecimal256::from_ratio(125i64, -1000i64), + SignedDecimal256::permille(-125) + ); + + // 1/3 (result floored) + assert_eq!( + SignedDecimal256::from_ratio(1i64, 3i64), + SignedDecimal256(Int256::from(333_333_333_333_333_333i128)) + ); + + // 2/3 (result floored) + assert_eq!( + SignedDecimal256::from_ratio(2i64, 3i64), + SignedDecimal256(Int256::from(666_666_666_666_666_666i128)) + ); + + // large inputs + assert_eq!( + SignedDecimal256::from_ratio(0i128, i128::MAX), + SignedDecimal256::zero() + ); + assert_eq!( + SignedDecimal256::from_ratio(i128::MAX, i128::MAX), + SignedDecimal256::one() + ); + // 170141183460469231731 is the largest integer <= SignedDecimal256::MAX + assert_eq!( + SignedDecimal256::from_ratio(170141183460469231731i128, 1i128), + SignedDecimal256::from_str("170141183460469231731").unwrap() + ); + } + + #[test] + #[should_panic(expected = "Denominator must not be zero")] + fn signed_decimal_256_from_ratio_panics_for_zero_denominator() { + SignedDecimal256::from_ratio(1i128, 0i128); + } + + #[test] + #[should_panic(expected = "Multiplication overflow")] + fn signed_decimal_256_from_ratio_panics_for_mul_overflow() { + SignedDecimal256::from_ratio(Int256::MAX, 1i128); + } + + #[test] + fn signed_decimal_256_checked_from_ratio_does_not_panic() { + assert_eq!( + SignedDecimal256::checked_from_ratio(1i128, 0i128), + Err(CheckedFromRatioError::DivideByZero) + ); + + assert_eq!( + SignedDecimal256::checked_from_ratio(Int256::MAX, 1i128), + Err(CheckedFromRatioError::Overflow) + ); + } + + #[test] + fn signed_decimal_256_implements_fraction() { + let fraction = SignedDecimal256::from_str("1234.567").unwrap(); + assert_eq!( + fraction.numerator(), + Int256::from(1_234_567_000_000_000_000_000i128) + ); + assert_eq!( + fraction.denominator(), + Int256::from(1_000_000_000_000_000_000i128) + ); + + let fraction = SignedDecimal256::from_str("-1234.567").unwrap(); + assert_eq!( + fraction.numerator(), + Int256::from(-1_234_567_000_000_000_000_000i128) + ); + assert_eq!( + fraction.denominator(), + Int256::from(1_000_000_000_000_000_000i128) + ); + } + + #[test] + fn signed_decimal_256_from_str_works() { + // Integers + assert_eq!( + SignedDecimal256::from_str("0").unwrap(), + SignedDecimal256::percent(0) + ); + assert_eq!( + SignedDecimal256::from_str("1").unwrap(), + SignedDecimal256::percent(100) + ); + assert_eq!( + SignedDecimal256::from_str("5").unwrap(), + SignedDecimal256::percent(500) + ); + assert_eq!( + SignedDecimal256::from_str("42").unwrap(), + SignedDecimal256::percent(4200) + ); + assert_eq!( + SignedDecimal256::from_str("000").unwrap(), + SignedDecimal256::percent(0) + ); + assert_eq!( + SignedDecimal256::from_str("001").unwrap(), + SignedDecimal256::percent(100) + ); + assert_eq!( + SignedDecimal256::from_str("005").unwrap(), + SignedDecimal256::percent(500) + ); + assert_eq!( + SignedDecimal256::from_str("0042").unwrap(), + SignedDecimal256::percent(4200) + ); + + // Positive decimals + assert_eq!( + SignedDecimal256::from_str("1.0").unwrap(), + SignedDecimal256::percent(100) + ); + assert_eq!( + SignedDecimal256::from_str("1.5").unwrap(), + SignedDecimal256::percent(150) + ); + assert_eq!( + SignedDecimal256::from_str("0.5").unwrap(), + SignedDecimal256::percent(50) + ); + assert_eq!( + SignedDecimal256::from_str("0.123").unwrap(), + SignedDecimal256::permille(123) + ); + + assert_eq!( + SignedDecimal256::from_str("40.00").unwrap(), + SignedDecimal256::percent(4000) + ); + assert_eq!( + SignedDecimal256::from_str("04.00").unwrap(), + SignedDecimal256::percent(400) + ); + assert_eq!( + SignedDecimal256::from_str("00.40").unwrap(), + SignedDecimal256::percent(40) + ); + assert_eq!( + SignedDecimal256::from_str("00.04").unwrap(), + SignedDecimal256::percent(4) + ); + // Negative decimals + assert_eq!( + SignedDecimal256::from_str("-00.04").unwrap(), + SignedDecimal256::percent(-4) + ); + assert_eq!( + SignedDecimal256::from_str("-00.40").unwrap(), + SignedDecimal256::percent(-40) + ); + assert_eq!( + SignedDecimal256::from_str("-04.00").unwrap(), + SignedDecimal256::percent(-400) + ); + + // Can handle DECIMAL_PLACES fractional digits + assert_eq!( + SignedDecimal256::from_str("7.123456789012345678").unwrap(), + SignedDecimal256(Int256::from(7123456789012345678i128)) + ); + assert_eq!( + SignedDecimal256::from_str("7.999999999999999999").unwrap(), + SignedDecimal256(Int256::from(7999999999999999999i128)) + ); + + // Works for documented max value + assert_eq!( + SignedDecimal256::from_str( + "57896044618658097711785492504343953926634992332820282019728.792003956564819967" + ) + .unwrap(), + SignedDecimal256::MAX + ); + // Works for documented min value + assert_eq!( + SignedDecimal256::from_str( + "-57896044618658097711785492504343953926634992332820282019728.792003956564819968" + ) + .unwrap(), + SignedDecimal256::MIN + ); + assert_eq!( + SignedDecimal256::from_str("-1").unwrap(), + SignedDecimal256::negative_one() + ); + } + + #[test] + fn signed_decimal_256_from_str_errors_for_broken_whole_part() { + match SignedDecimal256::from_str("").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing whole"), + e => panic!("Unexpected error: {e:?}"), + } + + match SignedDecimal256::from_str(" ").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing whole"), + e => panic!("Unexpected error: {e:?}"), + } + + match SignedDecimal256::from_str("-").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing whole"), + e => panic!("Unexpected error: {e:?}"), + } + } + + #[test] + fn signed_decimal_256_from_str_errors_for_broken_fractinal_part() { + match SignedDecimal256::from_str("1.").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), + e => panic!("Unexpected error: {e:?}"), + } + + match SignedDecimal256::from_str("1. ").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), + e => panic!("Unexpected error: {e:?}"), + } + + match SignedDecimal256::from_str("1.e").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), + e => panic!("Unexpected error: {e:?}"), + } + + match SignedDecimal256::from_str("1.2e3").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), + e => panic!("Unexpected error: {e:?}"), + } + + match SignedDecimal256::from_str("1.-2").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), + e => panic!("Unexpected error: {e:?}"), + } + } + + #[test] + fn signed_decimal_256_from_str_errors_for_more_than_18_fractional_digits() { + match SignedDecimal256::from_str("7.1234567890123456789").unwrap_err() { + StdError::GenericErr { msg, .. } => { + assert_eq!(msg, "Cannot parse more than 18 fractional digits",) + } + e => panic!("Unexpected error: {e:?}"), + } + + // No special rules for trailing zeros. This could be changed but adds gas cost for the happy path. + match SignedDecimal256::from_str("7.1230000000000000000").unwrap_err() { + StdError::GenericErr { msg, .. } => { + assert_eq!(msg, "Cannot parse more than 18 fractional digits") + } + e => panic!("Unexpected error: {e:?}"), + } + } + + #[test] + fn signed_decimal_256_from_str_errors_for_invalid_number_of_dots() { + match SignedDecimal256::from_str("1.2.3").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Unexpected number of dots"), + e => panic!("Unexpected error: {e:?}"), + } + + match SignedDecimal256::from_str("1.2.3.4").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Unexpected number of dots"), + e => panic!("Unexpected error: {e:?}"), + } + } + + #[test] + fn signed_decimal_256_from_str_errors_for_more_than_max_value() { + // Integer + match SignedDecimal256::from_str( + "57896044618658097711785492504343953926634992332820282019729", + ) + .unwrap_err() + { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), + e => panic!("Unexpected error: {e:?}"), + } + match SignedDecimal256::from_str( + "-57896044618658097711785492504343953926634992332820282019729", + ) + .unwrap_err() + { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), + e => panic!("Unexpected error: {e:?}"), + } + + // SignedDecimal256 + match SignedDecimal256::from_str( + "57896044618658097711785492504343953926634992332820282019729.0", + ) + .unwrap_err() + { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), + e => panic!("Unexpected error: {e:?}"), + } + match SignedDecimal256::from_str( + "57896044618658097711785492504343953926634992332820282019728.792003956564819968", + ) + .unwrap_err() + { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), + e => panic!("Unexpected error: {e:?}"), + } + match SignedDecimal256::from_str( + "-57896044618658097711785492504343953926634992332820282019728.792003956564819969", + ) + .unwrap_err() + { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), + e => panic!("Unexpected error: {e:?}"), + } + } + + #[test] + fn signed_decimal_256_atomics_works() { + let zero = SignedDecimal256::zero(); + let one = SignedDecimal256::one(); + let half = SignedDecimal256::percent(50); + let two = SignedDecimal256::percent(200); + let max = SignedDecimal256::MAX; + let neg_half = SignedDecimal256::percent(-50); + let neg_two = SignedDecimal256::percent(-200); + let min = SignedDecimal256::MIN; + + assert_eq!(zero.atomics(), Int256::from(0)); + assert_eq!(one.atomics(), Int256::from(1000000000000000000i128)); + assert_eq!(half.atomics(), Int256::from(500000000000000000i128)); + assert_eq!(two.atomics(), Int256::from(2000000000000000000i128)); + assert_eq!(max.atomics(), Int256::MAX); + assert_eq!(neg_half.atomics(), Int256::from(-500000000000000000i128)); + assert_eq!(neg_two.atomics(), Int256::from(-2000000000000000000i128)); + assert_eq!(min.atomics(), Int256::MIN); + } + + #[test] + fn signed_decimal_256_decimal_places_works() { + let zero = SignedDecimal256::zero(); + let one = SignedDecimal256::one(); + let half = SignedDecimal256::percent(50); + let two = SignedDecimal256::percent(200); + let max = SignedDecimal256::MAX; + let neg_one = SignedDecimal256::negative_one(); + + assert_eq!(zero.decimal_places(), 18); + assert_eq!(one.decimal_places(), 18); + assert_eq!(half.decimal_places(), 18); + assert_eq!(two.decimal_places(), 18); + assert_eq!(max.decimal_places(), 18); + assert_eq!(neg_one.decimal_places(), 18); + } + + #[test] + fn signed_decimal_256_is_zero_works() { + assert!(SignedDecimal256::zero().is_zero()); + assert!(SignedDecimal256::percent(0).is_zero()); + assert!(SignedDecimal256::permille(0).is_zero()); + + assert!(!SignedDecimal256::one().is_zero()); + assert!(!SignedDecimal256::percent(123).is_zero()); + assert!(!SignedDecimal256::permille(-1234).is_zero()); + } + + #[test] + fn signed_decimal_256_inv_works() { + // d = 0 + assert_eq!(SignedDecimal256::zero().inv(), None); + + // d == 1 + assert_eq!(SignedDecimal256::one().inv(), Some(SignedDecimal256::one())); + + // d == -1 + assert_eq!( + SignedDecimal256::negative_one().inv(), + Some(SignedDecimal256::negative_one()) + ); + + // d > 1 exact + assert_eq!( + SignedDecimal256::from_str("2").unwrap().inv(), + Some(SignedDecimal256::from_str("0.5").unwrap()) + ); + assert_eq!( + SignedDecimal256::from_str("20").unwrap().inv(), + Some(SignedDecimal256::from_str("0.05").unwrap()) + ); + assert_eq!( + SignedDecimal256::from_str("200").unwrap().inv(), + Some(SignedDecimal256::from_str("0.005").unwrap()) + ); + assert_eq!( + SignedDecimal256::from_str("2000").unwrap().inv(), + Some(SignedDecimal256::from_str("0.0005").unwrap()) + ); + + // d > 1 rounded + assert_eq!( + SignedDecimal256::from_str("3").unwrap().inv(), + Some(SignedDecimal256::from_str("0.333333333333333333").unwrap()) + ); + assert_eq!( + SignedDecimal256::from_str("6").unwrap().inv(), + Some(SignedDecimal256::from_str("0.166666666666666666").unwrap()) + ); + + // d < 1 exact + assert_eq!( + SignedDecimal256::from_str("0.5").unwrap().inv(), + Some(SignedDecimal256::from_str("2").unwrap()) + ); + assert_eq!( + SignedDecimal256::from_str("0.05").unwrap().inv(), + Some(SignedDecimal256::from_str("20").unwrap()) + ); + assert_eq!( + SignedDecimal256::from_str("0.005").unwrap().inv(), + Some(SignedDecimal256::from_str("200").unwrap()) + ); + assert_eq!( + SignedDecimal256::from_str("0.0005").unwrap().inv(), + Some(SignedDecimal256::from_str("2000").unwrap()) + ); + + // d < 0 + assert_eq!( + SignedDecimal256::from_str("-0.5").unwrap().inv(), + Some(SignedDecimal256::from_str("-2").unwrap()) + ); + // d < 0 rounded + assert_eq!( + SignedDecimal256::from_str("-3").unwrap().inv(), + Some(SignedDecimal256::from_str("-0.333333333333333333").unwrap()) + ); + } + + #[test] + #[allow(clippy::op_ref)] + fn signed_decimal_256_add_works() { + let value = SignedDecimal256::one() + SignedDecimal256::percent(50); // 1.5 + assert_eq!( + value.0, + SignedDecimal256::DECIMAL_FRACTIONAL * Int256::from(3u8) / Int256::from(2u8) + ); + + assert_eq!( + SignedDecimal256::percent(5) + SignedDecimal256::percent(4), + SignedDecimal256::percent(9) + ); + assert_eq!( + SignedDecimal256::percent(5) + SignedDecimal256::zero(), + SignedDecimal256::percent(5) + ); + assert_eq!( + SignedDecimal256::zero() + SignedDecimal256::zero(), + SignedDecimal256::zero() + ); + // negative numbers + assert_eq!( + SignedDecimal256::percent(-5) + SignedDecimal256::percent(-4), + SignedDecimal256::percent(-9) + ); + assert_eq!( + SignedDecimal256::percent(-5) + SignedDecimal256::percent(4), + SignedDecimal256::percent(-1) + ); + assert_eq!( + SignedDecimal256::percent(5) + SignedDecimal256::percent(-4), + SignedDecimal256::percent(1) + ); + + // works for refs + let a = SignedDecimal256::percent(15); + let b = SignedDecimal256::percent(25); + let expected = SignedDecimal256::percent(40); + assert_eq!(a + b, expected); + assert_eq!(&a + b, expected); + assert_eq!(a + &b, expected); + assert_eq!(&a + &b, expected); + } + + #[test] + #[should_panic] + fn signed_decimal_256_add_overflow_panics() { + let _value = SignedDecimal256::MAX + SignedDecimal256::percent(50); + } + + #[test] + fn signed_decimal_256_add_assign_works() { + let mut a = SignedDecimal256::percent(30); + a += SignedDecimal256::percent(20); + assert_eq!(a, SignedDecimal256::percent(50)); + + // works for refs + let mut a = SignedDecimal256::percent(15); + let b = SignedDecimal256::percent(3); + let expected = SignedDecimal256::percent(18); + a += &b; + assert_eq!(a, expected); + } + + #[test] + #[allow(clippy::op_ref)] + fn signed_decimal_256_sub_works() { + let value = SignedDecimal256::one() - SignedDecimal256::percent(50); // 0.5 + assert_eq!( + value.0, + SignedDecimal256::DECIMAL_FRACTIONAL / Int256::from(2u8) + ); + + assert_eq!( + SignedDecimal256::percent(9) - SignedDecimal256::percent(4), + SignedDecimal256::percent(5) + ); + assert_eq!( + SignedDecimal256::percent(16) - SignedDecimal256::zero(), + SignedDecimal256::percent(16) + ); + assert_eq!( + SignedDecimal256::percent(16) - SignedDecimal256::percent(16), + SignedDecimal256::zero() + ); + assert_eq!( + SignedDecimal256::zero() - SignedDecimal256::zero(), + SignedDecimal256::zero() + ); + + // negative numbers + assert_eq!( + SignedDecimal256::percent(-5) - SignedDecimal256::percent(-4), + SignedDecimal256::percent(-1) + ); + assert_eq!( + SignedDecimal256::percent(-5) - SignedDecimal256::percent(4), + SignedDecimal256::percent(-9) + ); + assert_eq!( + SignedDecimal256::percent(500) - SignedDecimal256::percent(-4), + SignedDecimal256::percent(504) + ); + + // works for refs + let a = SignedDecimal256::percent(13); + let b = SignedDecimal256::percent(6); + let expected = SignedDecimal256::percent(7); + assert_eq!(a - b, expected); + assert_eq!(&a - b, expected); + assert_eq!(a - &b, expected); + assert_eq!(&a - &b, expected); + } + + #[test] + #[should_panic] + fn signed_decimal_256_sub_overflow_panics() { + let _value = SignedDecimal256::MIN - SignedDecimal256::percent(50); + } + + #[test] + fn signed_decimal_256_sub_assign_works() { + let mut a = SignedDecimal256::percent(20); + a -= SignedDecimal256::percent(2); + assert_eq!(a, SignedDecimal256::percent(18)); + + // works for refs + let mut a = SignedDecimal256::percent(33); + let b = SignedDecimal256::percent(13); + let expected = SignedDecimal256::percent(20); + a -= &b; + assert_eq!(a, expected); + } + + #[test] + #[allow(clippy::op_ref)] + fn signed_decimal_256_implements_mul() { + let one = SignedDecimal256::one(); + let two = one + one; + let half = SignedDecimal256::percent(50); + + // 1*x and x*1 + assert_eq!( + one * SignedDecimal256::percent(0), + SignedDecimal256::percent(0) + ); + assert_eq!( + one * SignedDecimal256::percent(1), + SignedDecimal256::percent(1) + ); + assert_eq!( + one * SignedDecimal256::percent(10), + SignedDecimal256::percent(10) + ); + assert_eq!( + one * SignedDecimal256::percent(100), + SignedDecimal256::percent(100) + ); + assert_eq!( + one * SignedDecimal256::percent(1000), + SignedDecimal256::percent(1000) + ); + assert_eq!(one * SignedDecimal256::MAX, SignedDecimal256::MAX); + assert_eq!( + SignedDecimal256::percent(0) * one, + SignedDecimal256::percent(0) + ); + assert_eq!( + SignedDecimal256::percent(1) * one, + SignedDecimal256::percent(1) + ); + assert_eq!( + SignedDecimal256::percent(10) * one, + SignedDecimal256::percent(10) + ); + assert_eq!( + SignedDecimal256::percent(100) * one, + SignedDecimal256::percent(100) + ); + assert_eq!( + SignedDecimal256::percent(1000) * one, + SignedDecimal256::percent(1000) + ); + assert_eq!(SignedDecimal256::MAX * one, SignedDecimal256::MAX); + assert_eq!( + SignedDecimal256::percent(-1) * one, + SignedDecimal256::percent(-1) + ); + assert_eq!( + one * SignedDecimal256::percent(-10), + SignedDecimal256::percent(-10) + ); + + // double + assert_eq!( + two * SignedDecimal256::percent(0), + SignedDecimal256::percent(0) + ); + assert_eq!( + two * SignedDecimal256::percent(1), + SignedDecimal256::percent(2) + ); + assert_eq!( + two * SignedDecimal256::percent(10), + SignedDecimal256::percent(20) + ); + assert_eq!( + two * SignedDecimal256::percent(100), + SignedDecimal256::percent(200) + ); + assert_eq!( + two * SignedDecimal256::percent(1000), + SignedDecimal256::percent(2000) + ); + assert_eq!( + SignedDecimal256::percent(0) * two, + SignedDecimal256::percent(0) + ); + assert_eq!( + SignedDecimal256::percent(1) * two, + SignedDecimal256::percent(2) + ); + assert_eq!( + SignedDecimal256::percent(10) * two, + SignedDecimal256::percent(20) + ); + assert_eq!( + SignedDecimal256::percent(100) * two, + SignedDecimal256::percent(200) + ); + assert_eq!( + SignedDecimal256::percent(1000) * two, + SignedDecimal256::percent(2000) + ); + assert_eq!( + SignedDecimal256::percent(-1) * two, + SignedDecimal256::percent(-2) + ); + assert_eq!( + two * SignedDecimal256::new(Int256::MIN / Int256::from(2)), + SignedDecimal256::MIN + ); + + // half + assert_eq!( + half * SignedDecimal256::percent(0), + SignedDecimal256::percent(0) + ); + assert_eq!( + half * SignedDecimal256::percent(1), + SignedDecimal256::permille(5) + ); + assert_eq!( + half * SignedDecimal256::percent(10), + SignedDecimal256::percent(5) + ); + assert_eq!( + half * SignedDecimal256::percent(100), + SignedDecimal256::percent(50) + ); + assert_eq!( + half * SignedDecimal256::percent(1000), + SignedDecimal256::percent(500) + ); + assert_eq!( + SignedDecimal256::percent(0) * half, + SignedDecimal256::percent(0) + ); + assert_eq!( + SignedDecimal256::percent(1) * half, + SignedDecimal256::permille(5) + ); + assert_eq!( + SignedDecimal256::percent(10) * half, + SignedDecimal256::percent(5) + ); + assert_eq!( + SignedDecimal256::percent(100) * half, + SignedDecimal256::percent(50) + ); + assert_eq!( + SignedDecimal256::percent(1000) * half, + SignedDecimal256::percent(500) + ); + + // Move left + let a = dec("123.127726548762582"); + assert_eq!(a * dec("1"), dec("123.127726548762582")); + assert_eq!(a * dec("10"), dec("1231.27726548762582")); + assert_eq!(a * dec("100"), dec("12312.7726548762582")); + assert_eq!(a * dec("1000"), dec("123127.726548762582")); + assert_eq!(a * dec("1000000"), dec("123127726.548762582")); + assert_eq!(a * dec("1000000000"), dec("123127726548.762582")); + assert_eq!(a * dec("1000000000000"), dec("123127726548762.582")); + assert_eq!(a * dec("1000000000000000"), dec("123127726548762582")); + assert_eq!(a * dec("1000000000000000000"), dec("123127726548762582000")); + assert_eq!(dec("1") * a, dec("123.127726548762582")); + assert_eq!(dec("10") * a, dec("1231.27726548762582")); + assert_eq!(dec("100") * a, dec("12312.7726548762582")); + assert_eq!(dec("1000") * a, dec("123127.726548762582")); + assert_eq!(dec("1000000") * a, dec("123127726.548762582")); + assert_eq!(dec("1000000000") * a, dec("123127726548.762582")); + assert_eq!(dec("1000000000000") * a, dec("123127726548762.582")); + assert_eq!(dec("1000000000000000") * a, dec("123127726548762582")); + assert_eq!(dec("1000000000000000000") * a, dec("123127726548762582000")); + assert_eq!( + dec("-1000000000000000000") * a, + dec("-123127726548762582000") + ); + + // Move right + let max = SignedDecimal256::MAX; + assert_eq!( + max * dec("1.0"), + dec("57896044618658097711785492504343953926634992332820282019728.792003956564819967") + ); + assert_eq!( + max * dec("0.1"), + dec("5789604461865809771178549250434395392663499233282028201972.879200395656481996") + ); + assert_eq!( + max * dec("0.01"), + dec("578960446186580977117854925043439539266349923328202820197.287920039565648199") + ); + assert_eq!( + max * dec("0.001"), + dec("57896044618658097711785492504343953926634992332820282019.728792003956564819") + ); + assert_eq!( + max * dec("0.000001"), + dec("57896044618658097711785492504343953926634992332820282.019728792003956564") + ); + assert_eq!( + max * dec("0.000000001"), + dec("57896044618658097711785492504343953926634992332820.282019728792003956") + ); + assert_eq!( + max * dec("0.000000000001"), + dec("57896044618658097711785492504343953926634992332.820282019728792003") + ); + assert_eq!( + max * dec("0.000000000000001"), + dec("57896044618658097711785492504343953926634992.332820282019728792") + ); + assert_eq!( + max * dec("0.000000000000000001"), + dec("57896044618658097711785492504343953926634.992332820282019728") + ); + + // works for refs + let a = SignedDecimal256::percent(20); + let b = SignedDecimal256::percent(30); + let expected = SignedDecimal256::percent(6); + assert_eq!(a * b, expected); + assert_eq!(&a * b, expected); + assert_eq!(a * &b, expected); + assert_eq!(&a * &b, expected); + } + + #[test] + fn signed_decimal_256_mul_assign_works() { + let mut a = SignedDecimal256::percent(15); + a *= SignedDecimal256::percent(60); + assert_eq!(a, SignedDecimal256::percent(9)); + + // works for refs + let mut a = SignedDecimal256::percent(50); + let b = SignedDecimal256::percent(20); + a *= &b; + assert_eq!(a, SignedDecimal256::percent(10)); + } + + #[test] + #[should_panic(expected = "attempt to multiply with overflow")] + fn signed_decimal_256_mul_overflow_panics() { + let _value = SignedDecimal256::MAX * SignedDecimal256::percent(101); + } + + #[test] + fn signed_decimal_256_checked_mul() { + let test_data = [ + (SignedDecimal256::zero(), SignedDecimal256::zero()), + (SignedDecimal256::zero(), SignedDecimal256::one()), + (SignedDecimal256::one(), SignedDecimal256::zero()), + (SignedDecimal256::percent(10), SignedDecimal256::zero()), + (SignedDecimal256::percent(10), SignedDecimal256::percent(5)), + (SignedDecimal256::MAX, SignedDecimal256::one()), + ( + SignedDecimal256::MAX / Int256::from(2), + SignedDecimal256::percent(200), + ), + ( + SignedDecimal256::permille(6), + SignedDecimal256::permille(13), + ), + ( + SignedDecimal256::permille(-6), + SignedDecimal256::permille(0), + ), + (SignedDecimal256::MAX, SignedDecimal256::negative_one()), + ]; + + // The regular core::ops::Mul is our source of truth for these tests. + for (x, y) in test_data.into_iter() { + assert_eq!(x * y, x.checked_mul(y).unwrap()); + } + } + + #[test] + fn signed_decimal_256_checked_mul_overflow() { + assert_eq!( + SignedDecimal256::MAX.checked_mul(SignedDecimal256::percent(200)), + Err(OverflowError { + operation: crate::OverflowOperation::Mul, + operand1: SignedDecimal256::MAX.to_string(), + operand2: SignedDecimal256::percent(200).to_string(), + }) + ); + } + + #[test] + #[allow(clippy::op_ref)] + fn signed_decimal_256_implements_div() { + let one = SignedDecimal256::one(); + let two = one + one; + let half = SignedDecimal256::percent(50); + + // 1/x and x/1 + assert_eq!( + one / SignedDecimal256::percent(1), + SignedDecimal256::percent(10_000) + ); + assert_eq!( + one / SignedDecimal256::percent(10), + SignedDecimal256::percent(1_000) + ); + assert_eq!( + one / SignedDecimal256::percent(100), + SignedDecimal256::percent(100) + ); + assert_eq!( + one / SignedDecimal256::percent(1000), + SignedDecimal256::percent(10) + ); + assert_eq!( + SignedDecimal256::percent(0) / one, + SignedDecimal256::percent(0) + ); + assert_eq!( + SignedDecimal256::percent(1) / one, + SignedDecimal256::percent(1) + ); + assert_eq!( + SignedDecimal256::percent(10) / one, + SignedDecimal256::percent(10) + ); + assert_eq!( + SignedDecimal256::percent(100) / one, + SignedDecimal256::percent(100) + ); + assert_eq!( + SignedDecimal256::percent(1000) / one, + SignedDecimal256::percent(1000) + ); + assert_eq!( + one / SignedDecimal256::percent(-1), + SignedDecimal256::percent(-10_000) + ); + assert_eq!( + one / SignedDecimal256::percent(-10), + SignedDecimal256::percent(-1_000) + ); + + // double + assert_eq!( + two / SignedDecimal256::percent(1), + SignedDecimal256::percent(20_000) + ); + assert_eq!( + two / SignedDecimal256::percent(10), + SignedDecimal256::percent(2_000) + ); + assert_eq!( + two / SignedDecimal256::percent(100), + SignedDecimal256::percent(200) + ); + assert_eq!( + two / SignedDecimal256::percent(1000), + SignedDecimal256::percent(20) + ); + assert_eq!( + SignedDecimal256::percent(0) / two, + SignedDecimal256::percent(0) + ); + assert_eq!(SignedDecimal256::percent(1) / two, dec("0.005")); + assert_eq!( + SignedDecimal256::percent(10) / two, + SignedDecimal256::percent(5) + ); + assert_eq!( + SignedDecimal256::percent(100) / two, + SignedDecimal256::percent(50) + ); + assert_eq!( + SignedDecimal256::percent(1000) / two, + SignedDecimal256::percent(500) + ); + assert_eq!( + two / SignedDecimal256::percent(-1), + SignedDecimal256::percent(-20_000) + ); + assert_eq!( + SignedDecimal256::percent(-10000) / two, + SignedDecimal256::percent(-5000) + ); + + // half + assert_eq!( + half / SignedDecimal256::percent(1), + SignedDecimal256::percent(5_000) + ); + assert_eq!( + half / SignedDecimal256::percent(10), + SignedDecimal256::percent(500) + ); + assert_eq!( + half / SignedDecimal256::percent(100), + SignedDecimal256::percent(50) + ); + assert_eq!( + half / SignedDecimal256::percent(1000), + SignedDecimal256::percent(5) + ); + assert_eq!( + SignedDecimal256::percent(0) / half, + SignedDecimal256::percent(0) + ); + assert_eq!( + SignedDecimal256::percent(1) / half, + SignedDecimal256::percent(2) + ); + assert_eq!( + SignedDecimal256::percent(10) / half, + SignedDecimal256::percent(20) + ); + assert_eq!( + SignedDecimal256::percent(100) / half, + SignedDecimal256::percent(200) + ); + assert_eq!( + SignedDecimal256::percent(1000) / half, + SignedDecimal256::percent(2000) + ); + + // Move right + let a = dec("123127726548762582"); + assert_eq!(a / dec("1"), dec("123127726548762582")); + assert_eq!(a / dec("10"), dec("12312772654876258.2")); + assert_eq!(a / dec("100"), dec("1231277265487625.82")); + assert_eq!(a / dec("1000"), dec("123127726548762.582")); + assert_eq!(a / dec("1000000"), dec("123127726548.762582")); + assert_eq!(a / dec("1000000000"), dec("123127726.548762582")); + assert_eq!(a / dec("1000000000000"), dec("123127.726548762582")); + assert_eq!(a / dec("1000000000000000"), dec("123.127726548762582")); + assert_eq!(a / dec("1000000000000000000"), dec("0.123127726548762582")); + assert_eq!(dec("1") / a, dec("0.000000000000000008")); + assert_eq!(dec("10") / a, dec("0.000000000000000081")); + assert_eq!(dec("100") / a, dec("0.000000000000000812")); + assert_eq!(dec("1000") / a, dec("0.000000000000008121")); + assert_eq!(dec("1000000") / a, dec("0.000000000008121647")); + assert_eq!(dec("1000000000") / a, dec("0.000000008121647560")); + assert_eq!(dec("1000000000000") / a, dec("0.000008121647560868")); + assert_eq!(dec("1000000000000000") / a, dec("0.008121647560868164")); + assert_eq!(dec("1000000000000000000") / a, dec("8.121647560868164773")); + // negative + let a = dec("-123127726548762582"); + assert_eq!(a / dec("1"), dec("-123127726548762582")); + assert_eq!(a / dec("10"), dec("-12312772654876258.2")); + assert_eq!(a / dec("100"), dec("-1231277265487625.82")); + assert_eq!(a / dec("1000"), dec("-123127726548762.582")); + assert_eq!(a / dec("1000000"), dec("-123127726548.762582")); + assert_eq!(a / dec("1000000000"), dec("-123127726.548762582")); + assert_eq!(a / dec("1000000000000"), dec("-123127.726548762582")); + assert_eq!(a / dec("1000000000000000"), dec("-123.127726548762582")); + assert_eq!(a / dec("1000000000000000000"), dec("-0.123127726548762582")); + assert_eq!(dec("1") / a, dec("-0.000000000000000008")); + + // Move left + let a = dec("0.123127726548762582"); + assert_eq!(a / dec("1.0"), dec("0.123127726548762582")); + assert_eq!(a / dec("0.1"), dec("1.23127726548762582")); + assert_eq!(a / dec("0.01"), dec("12.3127726548762582")); + assert_eq!(a / dec("0.001"), dec("123.127726548762582")); + assert_eq!(a / dec("0.000001"), dec("123127.726548762582")); + assert_eq!(a / dec("0.000000001"), dec("123127726.548762582")); + assert_eq!(a / dec("0.000000000001"), dec("123127726548.762582")); + assert_eq!(a / dec("0.000000000000001"), dec("123127726548762.582")); + assert_eq!(a / dec("0.000000000000000001"), dec("123127726548762582")); + // negative + let a = dec("-0.123127726548762582"); + assert_eq!(a / dec("1.0"), dec("-0.123127726548762582")); + assert_eq!(a / dec("0.1"), dec("-1.23127726548762582")); + assert_eq!(a / dec("0.01"), dec("-12.3127726548762582")); + assert_eq!(a / dec("0.001"), dec("-123.127726548762582")); + assert_eq!(a / dec("0.000001"), dec("-123127.726548762582")); + assert_eq!(a / dec("0.000000001"), dec("-123127726.548762582")); + + assert_eq!( + SignedDecimal256::percent(15) / SignedDecimal256::percent(60), + SignedDecimal256::percent(25) + ); + + // works for refs + let a = SignedDecimal256::percent(100); + let b = SignedDecimal256::percent(20); + let expected = SignedDecimal256::percent(500); + assert_eq!(a / b, expected); + assert_eq!(&a / b, expected); + assert_eq!(a / &b, expected); + assert_eq!(&a / &b, expected); + } + + #[test] + fn signed_decimal_256_div_assign_works() { + let mut a = SignedDecimal256::percent(15); + a /= SignedDecimal256::percent(20); + assert_eq!(a, SignedDecimal256::percent(75)); + + // works for refs + let mut a = SignedDecimal256::percent(50); + let b = SignedDecimal256::percent(20); + a /= &b; + assert_eq!(a, SignedDecimal256::percent(250)); + } + + #[test] + #[should_panic(expected = "Division failed - multiplication overflow")] + fn signed_decimal_256_div_overflow_panics() { + let _value = SignedDecimal256::MAX / SignedDecimal256::percent(10); + } + + #[test] + #[should_panic(expected = "Division failed - denominator must not be zero")] + fn signed_decimal_256_div_by_zero_panics() { + let _value = SignedDecimal256::one() / SignedDecimal256::zero(); + } + + #[test] + fn signed_decimal_256_int128_division() { + // a/b + let left = SignedDecimal256::percent(150); // 1.5 + let right = Int256::from(3); + assert_eq!(left / right, SignedDecimal256::percent(50)); + + // negative + let left = SignedDecimal256::percent(-150); // -1.5 + let right = Int256::from(3); + assert_eq!(left / right, SignedDecimal256::percent(-50)); + + // 0/a + let left = SignedDecimal256::zero(); + let right = Int256::from(300); + assert_eq!(left / right, SignedDecimal256::zero()); + } + + #[test] + #[should_panic] + fn signed_decimal_256_int128_divide_by_zero() { + let left = SignedDecimal256::percent(150); // 1.5 + let right = Int256::from(0); + let _result = left / right; + } + + #[test] + fn signed_decimal_256_int128_div_assign() { + // a/b + let mut dec = SignedDecimal256::percent(150); // 1.5 + dec /= Int256::from(3); + assert_eq!(dec, SignedDecimal256::percent(50)); + + // 0/a + let mut dec = SignedDecimal256::zero(); + dec /= Int256::from(300); + assert_eq!(dec, SignedDecimal256::zero()); + } + + #[test] + #[should_panic] + fn signed_decimal_256_int128_div_assign_by_zero() { + // a/0 + let mut dec = SignedDecimal256::percent(50); + dec /= Int256::from(0); + } + + #[test] + fn signed_decimal_256_checked_pow() { + for exp in 0..10 { + assert_eq!( + SignedDecimal256::one().checked_pow(exp).unwrap(), + SignedDecimal256::one() + ); + } + + // This case is mathematically undefined but we ensure consistency with Rust stdandard types + // https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=20df6716048e77087acd40194b233494 + assert_eq!( + SignedDecimal256::zero().checked_pow(0).unwrap(), + SignedDecimal256::one() + ); + + for exp in 1..10 { + assert_eq!( + SignedDecimal256::zero().checked_pow(exp).unwrap(), + SignedDecimal256::zero() + ); + } + + for exp in 1..10 { + assert_eq!( + SignedDecimal256::negative_one().checked_pow(exp).unwrap(), + // alternates between 1 and -1 + if exp % 2 == 0 { + SignedDecimal256::one() + } else { + SignedDecimal256::negative_one() + } + ) + } + + for num in &[ + SignedDecimal256::percent(50), + SignedDecimal256::percent(99), + SignedDecimal256::percent(200), + ] { + assert_eq!(num.checked_pow(0).unwrap(), SignedDecimal256::one()) + } + + assert_eq!( + SignedDecimal256::percent(20).checked_pow(2).unwrap(), + SignedDecimal256::percent(4) + ); + + assert_eq!( + SignedDecimal256::percent(20).checked_pow(3).unwrap(), + SignedDecimal256::permille(8) + ); + + assert_eq!( + SignedDecimal256::percent(200).checked_pow(4).unwrap(), + SignedDecimal256::percent(1600) + ); + + assert_eq!( + SignedDecimal256::percent(200).checked_pow(4).unwrap(), + SignedDecimal256::percent(1600) + ); + + assert_eq!( + SignedDecimal256::percent(700).checked_pow(5).unwrap(), + SignedDecimal256::percent(1680700) + ); + + assert_eq!( + SignedDecimal256::percent(700).checked_pow(8).unwrap(), + SignedDecimal256::percent(576480100) + ); + + assert_eq!( + SignedDecimal256::percent(700).checked_pow(10).unwrap(), + SignedDecimal256::percent(28247524900) + ); + + assert_eq!( + SignedDecimal256::percent(120).checked_pow(123).unwrap(), + SignedDecimal256(5486473221892422150877397607i128.into()) + ); + + assert_eq!( + SignedDecimal256::percent(10).checked_pow(2).unwrap(), + SignedDecimal256(10000000000000000i128.into()) + ); + + assert_eq!( + SignedDecimal256::percent(10).checked_pow(18).unwrap(), + SignedDecimal256(1i128.into()) + ); + + let decimals = [ + SignedDecimal256::percent(-50), + SignedDecimal256::percent(-99), + SignedDecimal256::percent(-200), + ]; + let exponents = [1, 2, 3, 4, 5, 8, 10]; + + for d in decimals { + for e in exponents { + // use multiplication as source of truth + let mut mul = Ok(d); + for _ in 1..e { + mul = mul.and_then(|mul| mul.checked_mul(d)); + } + assert_eq!(mul, d.checked_pow(e)); + } + } + } + + #[test] + fn signed_decimal_256_checked_pow_overflow() { + assert_eq!( + SignedDecimal256::MAX.checked_pow(2), + Err(OverflowError { + operation: crate::OverflowOperation::Pow, + operand1: SignedDecimal256::MAX.to_string(), + operand2: "2".to_string(), + }) + ); + } + + #[test] + fn signed_decimal_256_to_string() { + // Integers + assert_eq!(SignedDecimal256::zero().to_string(), "0"); + assert_eq!(SignedDecimal256::one().to_string(), "1"); + assert_eq!(SignedDecimal256::percent(500).to_string(), "5"); + assert_eq!(SignedDecimal256::percent(-500).to_string(), "-5"); + + // SignedDecimal256s + assert_eq!(SignedDecimal256::percent(125).to_string(), "1.25"); + assert_eq!(SignedDecimal256::percent(42638).to_string(), "426.38"); + assert_eq!(SignedDecimal256::percent(3).to_string(), "0.03"); + assert_eq!(SignedDecimal256::permille(987).to_string(), "0.987"); + assert_eq!(SignedDecimal256::percent(-125).to_string(), "-1.25"); + assert_eq!(SignedDecimal256::percent(-42638).to_string(), "-426.38"); + assert_eq!(SignedDecimal256::percent(-3).to_string(), "-0.03"); + assert_eq!(SignedDecimal256::permille(-987).to_string(), "-0.987"); + + assert_eq!( + SignedDecimal256(Int256::from(1i128)).to_string(), + "0.000000000000000001" + ); + assert_eq!( + SignedDecimal256(Int256::from(10i128)).to_string(), + "0.00000000000000001" + ); + assert_eq!( + SignedDecimal256(Int256::from(100i128)).to_string(), + "0.0000000000000001" + ); + assert_eq!( + SignedDecimal256(Int256::from(1000i128)).to_string(), + "0.000000000000001" + ); + assert_eq!( + SignedDecimal256(Int256::from(10000i128)).to_string(), + "0.00000000000001" + ); + assert_eq!( + SignedDecimal256(Int256::from(100000i128)).to_string(), + "0.0000000000001" + ); + assert_eq!( + SignedDecimal256(Int256::from(1000000i128)).to_string(), + "0.000000000001" + ); + assert_eq!( + SignedDecimal256(Int256::from(10000000i128)).to_string(), + "0.00000000001" + ); + assert_eq!( + SignedDecimal256(Int256::from(100000000i128)).to_string(), + "0.0000000001" + ); + assert_eq!( + SignedDecimal256(Int256::from(1000000000i128)).to_string(), + "0.000000001" + ); + assert_eq!( + SignedDecimal256(Int256::from(10000000000i128)).to_string(), + "0.00000001" + ); + assert_eq!( + SignedDecimal256(Int256::from(100000000000i128)).to_string(), + "0.0000001" + ); + assert_eq!( + SignedDecimal256(Int256::from(10000000000000i128)).to_string(), + "0.00001" + ); + assert_eq!( + SignedDecimal256(Int256::from(100000000000000i128)).to_string(), + "0.0001" + ); + assert_eq!( + SignedDecimal256(Int256::from(1000000000000000i128)).to_string(), + "0.001" + ); + assert_eq!( + SignedDecimal256(Int256::from(10000000000000000i128)).to_string(), + "0.01" + ); + assert_eq!( + SignedDecimal256(Int256::from(100000000000000000i128)).to_string(), + "0.1" + ); + assert_eq!( + SignedDecimal256(Int256::from(-1i128)).to_string(), + "-0.000000000000000001" + ); + assert_eq!( + SignedDecimal256(Int256::from(-100000000000000i128)).to_string(), + "-0.0001" + ); + assert_eq!( + SignedDecimal256(Int256::from(-100000000000000000i128)).to_string(), + "-0.1" + ); + } + + #[test] + fn signed_decimal_256_iter_sum() { + let items = vec![ + SignedDecimal256::zero(), + SignedDecimal256(Int256::from(2i128)), + SignedDecimal256(Int256::from(2i128)), + SignedDecimal256(Int256::from(-2i128)), + ]; + assert_eq!( + items.iter().sum::(), + SignedDecimal256(Int256::from(2i128)) + ); + assert_eq!( + items.into_iter().sum::(), + SignedDecimal256(Int256::from(2i128)) + ); + + let empty: Vec = vec![]; + assert_eq!( + SignedDecimal256::zero(), + empty.iter().sum::() + ); + } + + #[test] + fn signed_decimal_256_serialize() { + assert_eq!(to_vec(&SignedDecimal256::zero()).unwrap(), br#""0""#); + assert_eq!(to_vec(&SignedDecimal256::one()).unwrap(), br#""1""#); + assert_eq!(to_vec(&SignedDecimal256::percent(8)).unwrap(), br#""0.08""#); + assert_eq!( + to_vec(&SignedDecimal256::percent(87)).unwrap(), + br#""0.87""# + ); + assert_eq!( + to_vec(&SignedDecimal256::percent(876)).unwrap(), + br#""8.76""# + ); + assert_eq!( + to_vec(&SignedDecimal256::percent(8765)).unwrap(), + br#""87.65""# + ); + assert_eq!( + to_vec(&SignedDecimal256::percent(-87654)).unwrap(), + br#""-876.54""# + ); + assert_eq!( + to_vec(&SignedDecimal256::negative_one()).unwrap(), + br#""-1""# + ); + assert_eq!( + to_vec(&-SignedDecimal256::percent(8)).unwrap(), + br#""-0.08""# + ); + } + + #[test] + fn signed_decimal_256_deserialize() { + assert_eq!( + from_slice::(br#""0""#).unwrap(), + SignedDecimal256::zero() + ); + assert_eq!( + from_slice::(br#""1""#).unwrap(), + SignedDecimal256::one() + ); + assert_eq!( + from_slice::(br#""000""#).unwrap(), + SignedDecimal256::zero() + ); + assert_eq!( + from_slice::(br#""001""#).unwrap(), + SignedDecimal256::one() + ); + + assert_eq!( + from_slice::(br#""0.08""#).unwrap(), + SignedDecimal256::percent(8) + ); + assert_eq!( + from_slice::(br#""0.87""#).unwrap(), + SignedDecimal256::percent(87) + ); + assert_eq!( + from_slice::(br#""8.76""#).unwrap(), + SignedDecimal256::percent(876) + ); + assert_eq!( + from_slice::(br#""87.65""#).unwrap(), + SignedDecimal256::percent(8765) + ); + + // negative numbers + assert_eq!( + from_slice::(br#""-0""#).unwrap(), + SignedDecimal256::zero() + ); + assert_eq!( + from_slice::(br#""-1""#).unwrap(), + SignedDecimal256::negative_one() + ); + assert_eq!( + from_slice::(br#""-001""#).unwrap(), + SignedDecimal256::negative_one() + ); + assert_eq!( + from_slice::(br#""-0.08""#).unwrap(), + SignedDecimal256::percent(-8) + ); + } + + #[test] + fn signed_decimal_256_abs_diff_works() { + let a = SignedDecimal256::percent(285); + let b = SignedDecimal256::percent(200); + let expected = Decimal256::percent(85); + assert_eq!(a.abs_diff(b), expected); + assert_eq!(b.abs_diff(a), expected); + + let a = SignedDecimal256::percent(-200); + let b = SignedDecimal256::percent(200); + let expected = Decimal256::percent(400); + assert_eq!(a.abs_diff(b), expected); + assert_eq!(b.abs_diff(a), expected); + + let a = SignedDecimal256::percent(-200); + let b = SignedDecimal256::percent(-240); + let expected = Decimal256::percent(40); + assert_eq!(a.abs_diff(b), expected); + assert_eq!(b.abs_diff(a), expected); + } + + #[test] + #[allow(clippy::op_ref)] + fn signed_decimal_256_rem_works() { + // 4.02 % 1.11 = 0.69 + assert_eq!( + SignedDecimal256::percent(402) % SignedDecimal256::percent(111), + SignedDecimal256::percent(69) + ); + + // 15.25 % 4 = 3.25 + assert_eq!( + SignedDecimal256::percent(1525) % SignedDecimal256::percent(400), + SignedDecimal256::percent(325) + ); + + // -20.25 % 5 = -25 + assert_eq!( + SignedDecimal256::percent(-2025) % SignedDecimal256::percent(500), + SignedDecimal256::percent(-25) + ); + + let a = SignedDecimal256::percent(318); + let b = SignedDecimal256::percent(317); + let expected = SignedDecimal256::percent(1); + assert_eq!(a % b, expected); + assert_eq!(a % &b, expected); + assert_eq!(&a % b, expected); + assert_eq!(&a % &b, expected); + } + + #[test] + fn signed_decimal_256_rem_assign_works() { + let mut a = SignedDecimal256::percent(17673); + a %= SignedDecimal256::percent(2362); + assert_eq!(a, SignedDecimal256::percent(1139)); // 176.73 % 23.62 = 11.39 + + let mut a = SignedDecimal256::percent(4262); + let b = SignedDecimal256::percent(1270); + a %= &b; + assert_eq!(a, SignedDecimal256::percent(452)); // 42.62 % 12.7 = 4.52 + + let mut a = SignedDecimal256::percent(-4262); + let b = SignedDecimal256::percent(1270); + a %= &b; + assert_eq!(a, SignedDecimal256::percent(-452)); // -42.62 % 12.7 = -4.52 + } + + #[test] + #[should_panic(expected = "divisor of zero")] + fn signed_decimal_256_rem_panics_for_zero() { + let _ = SignedDecimal256::percent(777) % SignedDecimal256::zero(); + } + + #[test] + fn signed_decimal_256_checked_methods() { + // checked add + assert_eq!( + SignedDecimal256::percent(402) + .checked_add(SignedDecimal256::percent(111)) + .unwrap(), + SignedDecimal256::percent(513) + ); + assert!(matches!( + SignedDecimal256::MAX.checked_add(SignedDecimal256::percent(1)), + Err(OverflowError { .. }) + )); + assert!(matches!( + SignedDecimal256::MIN.checked_add(SignedDecimal256::percent(-1)), + Err(OverflowError { .. }) + )); + + // checked sub + assert_eq!( + SignedDecimal256::percent(1111) + .checked_sub(SignedDecimal256::percent(111)) + .unwrap(), + SignedDecimal256::percent(1000) + ); + assert_eq!( + SignedDecimal256::zero() + .checked_sub(SignedDecimal256::percent(1)) + .unwrap(), + SignedDecimal256::percent(-1) + ); + assert!(matches!( + SignedDecimal256::MIN.checked_sub(SignedDecimal256::percent(1)), + Err(OverflowError { .. }) + )); + assert!(matches!( + SignedDecimal256::MAX.checked_sub(SignedDecimal256::percent(-1)), + Err(OverflowError { .. }) + )); + + // checked div + assert_eq!( + SignedDecimal256::percent(30) + .checked_div(SignedDecimal256::percent(200)) + .unwrap(), + SignedDecimal256::percent(15) + ); + assert_eq!( + SignedDecimal256::percent(88) + .checked_div(SignedDecimal256::percent(20)) + .unwrap(), + SignedDecimal256::percent(440) + ); + assert!(matches!( + SignedDecimal256::MAX.checked_div(SignedDecimal256::zero()), + Err(CheckedFromRatioError::DivideByZero {}) + )); + assert!(matches!( + SignedDecimal256::MAX.checked_div(SignedDecimal256::percent(1)), + Err(CheckedFromRatioError::Overflow {}) + )); + assert_eq!( + SignedDecimal256::percent(-88) + .checked_div(SignedDecimal256::percent(20)) + .unwrap(), + SignedDecimal256::percent(-440) + ); + assert_eq!( + SignedDecimal256::percent(-88) + .checked_div(SignedDecimal256::percent(-20)) + .unwrap(), + SignedDecimal256::percent(440) + ); + + // checked rem + assert_eq!( + SignedDecimal256::percent(402) + .checked_rem(SignedDecimal256::percent(111)) + .unwrap(), + SignedDecimal256::percent(69) + ); + assert_eq!( + SignedDecimal256::percent(1525) + .checked_rem(SignedDecimal256::percent(400)) + .unwrap(), + SignedDecimal256::percent(325) + ); + assert_eq!( + SignedDecimal256::percent(-1525) + .checked_rem(SignedDecimal256::percent(400)) + .unwrap(), + SignedDecimal256::percent(-325) + ); + assert_eq!( + SignedDecimal256::percent(-1525) + .checked_rem(SignedDecimal256::percent(-400)) + .unwrap(), + SignedDecimal256::percent(-325) + ); + assert!(matches!( + SignedDecimal256::MAX.checked_rem(SignedDecimal256::zero()), + Err(DivideByZeroError { .. }) + )); + } + + #[test] + fn signed_decimal_256_pow_works() { + assert_eq!( + SignedDecimal256::percent(200).pow(2), + SignedDecimal256::percent(400) + ); + assert_eq!( + SignedDecimal256::percent(-200).pow(2), + SignedDecimal256::percent(400) + ); + assert_eq!( + SignedDecimal256::percent(-200).pow(3), + SignedDecimal256::percent(-800) + ); + assert_eq!( + SignedDecimal256::percent(200).pow(10), + SignedDecimal256::percent(102400) + ); + } + + #[test] + #[should_panic] + fn signed_decimal_256_pow_overflow_panics() { + _ = SignedDecimal256::MAX.pow(2u32); + } + + #[test] + fn signed_decimal_256_saturating_works() { + assert_eq!( + SignedDecimal256::percent(200).saturating_add(SignedDecimal256::percent(200)), + SignedDecimal256::percent(400) + ); + assert_eq!( + SignedDecimal256::percent(-200).saturating_add(SignedDecimal256::percent(200)), + SignedDecimal256::zero() + ); + assert_eq!( + SignedDecimal256::percent(-200).saturating_add(SignedDecimal256::percent(-200)), + SignedDecimal256::percent(-400) + ); + assert_eq!( + SignedDecimal256::MAX.saturating_add(SignedDecimal256::percent(200)), + SignedDecimal256::MAX + ); + assert_eq!( + SignedDecimal256::MIN.saturating_add(SignedDecimal256::percent(-1)), + SignedDecimal256::MIN + ); + assert_eq!( + SignedDecimal256::percent(200).saturating_sub(SignedDecimal256::percent(100)), + SignedDecimal256::percent(100) + ); + assert_eq!( + SignedDecimal256::percent(-200).saturating_sub(SignedDecimal256::percent(100)), + SignedDecimal256::percent(-300) + ); + assert_eq!( + SignedDecimal256::percent(-200).saturating_sub(SignedDecimal256::percent(-100)), + SignedDecimal256::percent(-100) + ); + assert_eq!( + SignedDecimal256::zero().saturating_sub(SignedDecimal256::percent(200)), + SignedDecimal256::from_str("-2").unwrap() + ); + assert_eq!( + SignedDecimal256::MIN.saturating_sub(SignedDecimal256::percent(200)), + SignedDecimal256::MIN + ); + assert_eq!( + SignedDecimal256::MAX.saturating_sub(SignedDecimal256::percent(-200)), + SignedDecimal256::MAX + ); + assert_eq!( + SignedDecimal256::percent(200).saturating_mul(SignedDecimal256::percent(50)), + SignedDecimal256::percent(100) + ); + assert_eq!( + SignedDecimal256::percent(-200).saturating_mul(SignedDecimal256::percent(50)), + SignedDecimal256::percent(-100) + ); + assert_eq!( + SignedDecimal256::percent(-200).saturating_mul(SignedDecimal256::percent(-50)), + SignedDecimal256::percent(100) + ); + assert_eq!( + SignedDecimal256::MAX.saturating_mul(SignedDecimal256::percent(200)), + SignedDecimal256::MAX + ); + assert_eq!( + SignedDecimal256::MIN.saturating_mul(SignedDecimal256::percent(200)), + SignedDecimal256::MIN + ); + assert_eq!( + SignedDecimal256::MIN.saturating_mul(SignedDecimal256::percent(-200)), + SignedDecimal256::MAX + ); + assert_eq!( + SignedDecimal256::percent(400).saturating_pow(2u32), + SignedDecimal256::percent(1600) + ); + assert_eq!( + SignedDecimal256::MAX.saturating_pow(2u32), + SignedDecimal256::MAX + ); + } + + #[test] + fn signed_decimal_256_rounding() { + assert_eq!(SignedDecimal256::one().floor(), SignedDecimal256::one()); + assert_eq!( + SignedDecimal256::percent(150).floor(), + SignedDecimal256::one() + ); + assert_eq!( + SignedDecimal256::percent(199).floor(), + SignedDecimal256::one() + ); + assert_eq!( + SignedDecimal256::percent(200).floor(), + SignedDecimal256::percent(200) + ); + assert_eq!( + SignedDecimal256::percent(99).floor(), + SignedDecimal256::zero() + ); + assert_eq!( + SignedDecimal256(Int256::from(1i128)).floor(), + SignedDecimal256::zero() + ); + assert_eq!( + SignedDecimal256(Int256::from(-1i128)).floor(), + SignedDecimal256::negative_one() + ); + assert_eq!( + SignedDecimal256::permille(-1234).floor(), + SignedDecimal256::percent(-200) + ); + + assert_eq!(SignedDecimal256::one().ceil(), SignedDecimal256::one()); + assert_eq!( + SignedDecimal256::percent(150).ceil(), + SignedDecimal256::percent(200) + ); + assert_eq!( + SignedDecimal256::percent(199).ceil(), + SignedDecimal256::percent(200) + ); + assert_eq!( + SignedDecimal256::percent(99).ceil(), + SignedDecimal256::one() + ); + assert_eq!( + SignedDecimal256(Int256::from(1i128)).ceil(), + SignedDecimal256::one() + ); + assert_eq!( + SignedDecimal256(Int256::from(-1i128)).ceil(), + SignedDecimal256::zero() + ); + assert_eq!( + SignedDecimal256::permille(-1234).ceil(), + SignedDecimal256::negative_one() + ); + + assert_eq!(SignedDecimal256::one().trunc(), SignedDecimal256::one()); + assert_eq!( + SignedDecimal256::percent(150).trunc(), + SignedDecimal256::one() + ); + assert_eq!( + SignedDecimal256::percent(199).trunc(), + SignedDecimal256::one() + ); + assert_eq!( + SignedDecimal256::percent(200).trunc(), + SignedDecimal256::percent(200) + ); + assert_eq!( + SignedDecimal256::percent(99).trunc(), + SignedDecimal256::zero() + ); + assert_eq!( + SignedDecimal256(Int256::from(1i128)).trunc(), + SignedDecimal256::zero() + ); + assert_eq!( + SignedDecimal256(Int256::from(-1i128)).trunc(), + SignedDecimal256::zero() + ); + assert_eq!( + SignedDecimal256::permille(-1234).trunc(), + SignedDecimal256::negative_one() + ); + } + + #[test] + #[should_panic(expected = "attempt to ceil with overflow")] + fn signed_decimal_256_ceil_panics() { + let _ = SignedDecimal256::MAX.ceil(); + } + + #[test] + #[should_panic(expected = "attempt to floor with overflow")] + fn signed_decimal_256_floor_panics() { + let _ = SignedDecimal256::MIN.floor(); + } + + #[test] + fn signed_decimal_256_checked_ceil() { + assert_eq!( + SignedDecimal256::percent(199).checked_ceil(), + Ok(SignedDecimal256::percent(200)) + ); + assert_eq!( + SignedDecimal256::MAX.checked_ceil(), + Err(RoundUpOverflowError) + ); + } + + #[test] + fn signed_decimal_256_checked_floor() { + assert_eq!( + SignedDecimal256::percent(199).checked_floor(), + Ok(SignedDecimal256::one()) + ); + assert_eq!( + SignedDecimal256::percent(-199).checked_floor(), + Ok(SignedDecimal256::percent(-200)) + ); + assert_eq!( + SignedDecimal256::MIN.checked_floor(), + Err(RoundDownOverflowError) + ); + } + + #[test] + fn signed_decimal_256_to_int_floor_works() { + let d = SignedDecimal256::from_str("12.000000000000000001").unwrap(); + assert_eq!(d.to_int_floor(), Int256::from(12)); + let d = SignedDecimal256::from_str("12.345").unwrap(); + assert_eq!(d.to_int_floor(), Int256::from(12)); + let d = SignedDecimal256::from_str("12.999").unwrap(); + assert_eq!(d.to_int_floor(), Int256::from(12)); + let d = SignedDecimal256::from_str("0.98451384").unwrap(); + assert_eq!(d.to_int_floor(), Int256::from(0)); + let d = SignedDecimal256::from_str("-12.000000000000000001").unwrap(); + assert_eq!(d.to_int_floor(), Int256::from(-13)); + let d = SignedDecimal256::from_str("-12.345").unwrap(); + assert_eq!(d.to_int_floor(), Int256::from(-13)); + + let d = SignedDecimal256::from_str("75.0").unwrap(); + assert_eq!(d.to_int_floor(), Int256::from(75)); + let d = SignedDecimal256::from_str("0.0").unwrap(); + assert_eq!(d.to_int_floor(), Int256::from(0)); + let d = SignedDecimal256::from_str("-75.0").unwrap(); + assert_eq!(d.to_int_floor(), Int256::from(-75)); + + let d = SignedDecimal256::MAX; + assert_eq!( + d.to_int_floor(), + Int256::from_str("57896044618658097711785492504343953926634992332820282019728") + .unwrap() + ); + let d = SignedDecimal256::MIN; + assert_eq!( + d.to_int_floor(), + Int256::from_str("-57896044618658097711785492504343953926634992332820282019729") + .unwrap() + ); + } + + #[test] + fn signed_decimal_256_to_int_ceil_works() { + let d = SignedDecimal256::from_str("12.000000000000000001").unwrap(); + assert_eq!(d.to_int_ceil(), Int256::from(13)); + let d = SignedDecimal256::from_str("12.345").unwrap(); + assert_eq!(d.to_int_ceil(), Int256::from(13)); + let d = SignedDecimal256::from_str("12.999").unwrap(); + assert_eq!(d.to_int_ceil(), Int256::from(13)); + let d = SignedDecimal256::from_str("-12.000000000000000001").unwrap(); + assert_eq!(d.to_int_ceil(), Int256::from(-12)); + let d = SignedDecimal256::from_str("-12.345").unwrap(); + assert_eq!(d.to_int_ceil(), Int256::from(-12)); + + let d = SignedDecimal256::from_str("75.0").unwrap(); + assert_eq!(d.to_int_ceil(), Int256::from(75)); + let d = SignedDecimal256::from_str("0.0").unwrap(); + assert_eq!(d.to_int_ceil(), Int256::from(0)); + let d = SignedDecimal256::from_str("-75.0").unwrap(); + assert_eq!(d.to_int_ceil(), Int256::from(-75)); + + let d = SignedDecimal256::MAX; + assert_eq!( + d.to_int_ceil(), + Int256::from_str("57896044618658097711785492504343953926634992332820282019729") + .unwrap() + ); + let d = SignedDecimal256::MIN; + assert_eq!( + d.to_int_ceil(), + Int256::from_str("-57896044618658097711785492504343953926634992332820282019728") + .unwrap() + ); + } + + #[test] + fn signed_decimal_256_to_int_trunc_works() { + let d = SignedDecimal256::from_str("12.000000000000000001").unwrap(); + assert_eq!(d.to_int_trunc(), Int256::from(12)); + let d = SignedDecimal256::from_str("12.345").unwrap(); + assert_eq!(d.to_int_trunc(), Int256::from(12)); + let d = SignedDecimal256::from_str("12.999").unwrap(); + assert_eq!(d.to_int_trunc(), Int256::from(12)); + let d = SignedDecimal256::from_str("-12.000000000000000001").unwrap(); + assert_eq!(d.to_int_trunc(), Int256::from(-12)); + let d = SignedDecimal256::from_str("-12.345").unwrap(); + assert_eq!(d.to_int_trunc(), Int256::from(-12)); + + let d = SignedDecimal256::from_str("75.0").unwrap(); + assert_eq!(d.to_int_trunc(), Int256::from(75)); + let d = SignedDecimal256::from_str("0.0").unwrap(); + assert_eq!(d.to_int_trunc(), Int256::from(0)); + let d = SignedDecimal256::from_str("-75.0").unwrap(); + assert_eq!(d.to_int_trunc(), Int256::from(-75)); + + let d = SignedDecimal256::MAX; + assert_eq!( + d.to_int_trunc(), + Int256::from_str("57896044618658097711785492504343953926634992332820282019728") + .unwrap() + ); + let d = SignedDecimal256::MIN; + assert_eq!( + d.to_int_trunc(), + Int256::from_str("-57896044618658097711785492504343953926634992332820282019728") + .unwrap() + ); + } + + #[test] + fn signed_decimal_256_neg_works() { + assert_eq!( + -SignedDecimal256::percent(50), + SignedDecimal256::percent(-50) + ); + assert_eq!(-SignedDecimal256::one(), SignedDecimal256::negative_one()); + } + + #[test] + fn signed_decimal_256_partial_eq() { + let test_cases = [ + ("1", "1", true), + ("0.5", "0.5", true), + ("0.5", "0.51", false), + ("0", "0.00000", true), + ("-1", "-1", true), + ("-0.5", "-0.5", true), + ("-0.5", "0.5", false), + ("-0.5", "-0.51", false), + ("-0", "-0.00000", true), + ] + .into_iter() + .map(|(lhs, rhs, expected)| (dec(lhs), dec(rhs), expected)); + + #[allow(clippy::op_ref)] + for (lhs, rhs, expected) in test_cases { + assert_eq!(lhs == rhs, expected); + assert_eq!(&lhs == rhs, expected); + assert_eq!(lhs == &rhs, expected); + assert_eq!(&lhs == &rhs, expected); + } + } + + #[test] + fn signed_decimal_256_implements_debug() { + let decimal = SignedDecimal256::from_str("123.45").unwrap(); + assert_eq!(format!("{decimal:?}"), "SignedDecimal256(123.45)"); + + let test_cases = ["5", "5.01", "42", "0", "2", "-0.000001"]; + for s in test_cases { + let decimal = SignedDecimal256::from_str(s).unwrap(); + let expected = format!("SignedDecimal256({s})"); + assert_eq!(format!("{decimal:?}"), expected); + } + } +} From b385419ae2d94b5e7b18087b3a009d06444674be Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 11 Sep 2023 15:41:46 +0200 Subject: [PATCH 0750/2372] Add conversions between signed decimals --- packages/std/src/math/signed_decimal.rs | 44 ++++++++++++++++++++- packages/std/src/math/signed_decimal_256.rs | 36 ++++++++++++++++- 2 files changed, 78 insertions(+), 2 deletions(-) diff --git a/packages/std/src/math/signed_decimal.rs b/packages/std/src/math/signed_decimal.rs index 6d377f4925..de97ce3616 100644 --- a/packages/std/src/math/signed_decimal.rs +++ b/packages/std/src/math/signed_decimal.rs @@ -13,7 +13,7 @@ use crate::errors::{ CheckedFromRatioError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, OverflowOperation, RoundDownOverflowError, RoundUpOverflowError, StdError, }; -use crate::{forward_ref_partial_eq, Decimal, Int256}; +use crate::{forward_ref_partial_eq, Decimal, Int256, SignedDecimal256}; use super::Fraction; use super::Int128; @@ -613,6 +613,18 @@ impl Neg for SignedDecimal { } } +impl TryFrom for SignedDecimal { + type Error = SignedDecimalRangeExceeded; + + fn try_from(value: SignedDecimal256) -> Result { + value + .atomics() + .try_into() + .map(SignedDecimal) + .map_err(|_| SignedDecimalRangeExceeded) + } +} + impl FromStr for SignedDecimal { type Err = StdError; @@ -1417,6 +1429,36 @@ mod tests { } } + #[test] + fn signed_decimal_conversions_work() { + // signed decimal to signed decimal + assert_eq!( + SignedDecimal::try_from(SignedDecimal256::MAX).unwrap_err(), + SignedDecimalRangeExceeded + ); + assert_eq!( + SignedDecimal::try_from(SignedDecimal256::MIN).unwrap_err(), + SignedDecimalRangeExceeded + ); + + assert_eq!( + SignedDecimal::try_from(SignedDecimal256::zero()).unwrap(), + SignedDecimal::zero() + ); + assert_eq!( + SignedDecimal::try_from(SignedDecimal256::one()).unwrap(), + SignedDecimal::one() + ); + assert_eq!( + SignedDecimal::try_from(SignedDecimal256::percent(50)).unwrap(), + SignedDecimal::percent(50) + ); + assert_eq!( + SignedDecimal::try_from(SignedDecimal256::percent(-200)).unwrap(), + SignedDecimal::percent(-200) + ); + } + #[test] fn signed_decimal_atomics_works() { let zero = SignedDecimal::zero(); diff --git a/packages/std/src/math/signed_decimal_256.rs b/packages/std/src/math/signed_decimal_256.rs index eafc3f53d3..a08d4a4b2d 100644 --- a/packages/std/src/math/signed_decimal_256.rs +++ b/packages/std/src/math/signed_decimal_256.rs @@ -13,7 +13,7 @@ use crate::errors::{ CheckedFromRatioError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, OverflowOperation, RoundDownOverflowError, RoundUpOverflowError, StdError, }; -use crate::{forward_ref_partial_eq, Decimal256, Int512}; +use crate::{forward_ref_partial_eq, Decimal256, Int512, SignedDecimal}; use super::Fraction; use super::Int256; @@ -631,6 +631,12 @@ impl Neg for SignedDecimal256 { } } +impl From for SignedDecimal256 { + fn from(value: SignedDecimal) -> Self { + Self::from_atomics(value.atomics(), SignedDecimal::DECIMAL_PLACES).unwrap() + } +} + impl FromStr for SignedDecimal256 { type Err = StdError; @@ -1461,6 +1467,34 @@ mod tests { } } + #[test] + fn signed_decimal_256_conversions_work() { + assert_eq!( + SignedDecimal256::from(SignedDecimal::zero()), + SignedDecimal256::zero() + ); + assert_eq!( + SignedDecimal256::from(SignedDecimal::one()), + SignedDecimal256::one() + ); + assert_eq!( + SignedDecimal256::from(SignedDecimal::percent(50)), + SignedDecimal256::percent(50) + ); + assert_eq!( + SignedDecimal256::from(SignedDecimal::MAX), + SignedDecimal256::new(Int256::from_i128(i128::MAX)) + ); + assert_eq!( + SignedDecimal256::from(SignedDecimal::percent(-50)), + SignedDecimal256::percent(-50) + ); + assert_eq!( + SignedDecimal256::from(SignedDecimal::MIN), + SignedDecimal256::new(Int256::from_i128(i128::MIN)) + ); + } + #[test] fn signed_decimal_256_atomics_works() { let zero = SignedDecimal256::zero(); From 0609aff944de987e3a7e72629d0ca21b8cdb1be6 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 11 Sep 2023 17:58:52 +0200 Subject: [PATCH 0751/2372] Add conversions between signed + unsigned decimals --- packages/std/src/math/decimal.rs | 44 ++++++++++++++++++++++++- packages/std/src/math/signed_decimal.rs | 32 +++++++++++++++++- 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index f402613621..f4db352bb2 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -11,7 +11,7 @@ use crate::errors::{ CheckedFromRatioError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, OverflowOperation, RoundUpOverflowError, StdError, }; -use crate::{forward_ref_partial_eq, Decimal256}; +use crate::{forward_ref_partial_eq, Decimal256, SignedDecimal}; use super::Fraction; use super::Isqrt; @@ -510,6 +510,20 @@ impl TryFrom for Decimal { } } +impl TryFrom for Decimal { + type Error = DecimalRangeExceeded; + + fn try_from(value: SignedDecimal) -> Result { + value + .atomics() + .i128() + .try_into() // convert to u128 + .map(Uint128::new) + .map(Decimal) + .map_err(|_| DecimalRangeExceeded) + } +} + impl FromStr for Decimal { type Err = StdError; @@ -845,6 +859,34 @@ mod tests { ); } + #[test] + fn decimal_try_from_signed_works() { + assert_eq!( + Decimal::try_from(SignedDecimal::MAX).unwrap(), + Decimal::raw(SignedDecimal::MAX.atomics().i128() as u128) + ); + assert_eq!( + Decimal::try_from(SignedDecimal::zero()).unwrap(), + Decimal::zero() + ); + assert_eq!( + Decimal::try_from(SignedDecimal::one()).unwrap(), + Decimal::one() + ); + assert_eq!( + Decimal::try_from(SignedDecimal::percent(50)).unwrap(), + Decimal::percent(50) + ); + assert_eq!( + Decimal::try_from(SignedDecimal::negative_one()), + Err(DecimalRangeExceeded) + ); + assert_eq!( + Decimal::try_from(SignedDecimal::MIN), + Err(DecimalRangeExceeded) + ); + } + #[test] fn decimal_from_atomics_works() { let one = Decimal::one(); diff --git a/packages/std/src/math/signed_decimal.rs b/packages/std/src/math/signed_decimal.rs index de97ce3616..a544ed13b1 100644 --- a/packages/std/src/math/signed_decimal.rs +++ b/packages/std/src/math/signed_decimal.rs @@ -625,6 +625,20 @@ impl TryFrom for SignedDecimal { } } +impl TryFrom for SignedDecimal { + type Error = SignedDecimalRangeExceeded; + + fn try_from(value: Decimal) -> Result { + value + .atomics() + .u128() + .try_into() // convert to i128 + .map(Int128::new) + .map(SignedDecimal) + .map_err(|_| SignedDecimalRangeExceeded) + } +} + impl FromStr for SignedDecimal { type Err = StdError; @@ -1440,7 +1454,6 @@ mod tests { SignedDecimal::try_from(SignedDecimal256::MIN).unwrap_err(), SignedDecimalRangeExceeded ); - assert_eq!( SignedDecimal::try_from(SignedDecimal256::zero()).unwrap(), SignedDecimal::zero() @@ -1457,6 +1470,23 @@ mod tests { SignedDecimal::try_from(SignedDecimal256::percent(-200)).unwrap(), SignedDecimal::percent(-200) ); + + // unsigned to signed decimal + assert_eq!( + SignedDecimal::try_from(Decimal::MAX).unwrap_err(), + SignedDecimalRangeExceeded + ); + let max = Decimal::raw(SignedDecimal::MAX.atomics().i128() as u128); + let too_big = max + Decimal::raw(1); + assert_eq!( + SignedDecimal::try_from(too_big).unwrap_err(), + SignedDecimalRangeExceeded + ); + assert_eq!( + SignedDecimal::try_from(Decimal::zero()).unwrap(), + SignedDecimal::zero() + ); + assert_eq!(SignedDecimal::try_from(max).unwrap(), SignedDecimal::MAX); } #[test] From 25f9c35faaf6fc8fc093c511428f534615545566 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 14 Sep 2023 13:49:12 +0200 Subject: [PATCH 0752/2372] Add From and TryFrom impl between decimals --- packages/std/src/math/decimal.rs | 18 ++++++++++---- packages/std/src/math/decimal256.rs | 26 ++++++++++++++++++++- packages/std/src/math/signed_decimal.rs | 18 ++++++++++---- packages/std/src/math/signed_decimal_256.rs | 22 +++++++++++++++-- 4 files changed, 73 insertions(+), 11 deletions(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index f4db352bb2..de9006f701 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -11,7 +11,7 @@ use crate::errors::{ CheckedFromRatioError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, OverflowOperation, RoundUpOverflowError, StdError, }; -use crate::{forward_ref_partial_eq, Decimal256, SignedDecimal}; +use crate::{forward_ref_partial_eq, Decimal256, SignedDecimal, SignedDecimal256}; use super::Fraction; use super::Isqrt; @@ -516,9 +516,19 @@ impl TryFrom for Decimal { fn try_from(value: SignedDecimal) -> Result { value .atomics() - .i128() - .try_into() // convert to u128 - .map(Uint128::new) + .try_into() + .map(Decimal) + .map_err(|_| DecimalRangeExceeded) + } +} + +impl TryFrom for Decimal { + type Error = DecimalRangeExceeded; + + fn try_from(value: SignedDecimal256) -> Result { + value + .atomics() + .try_into() .map(Decimal) .map_err(|_| DecimalRangeExceeded) } diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index cfa58f8211..b1aec4ab4e 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -11,7 +11,7 @@ use crate::errors::{ CheckedFromRatioError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, OverflowOperation, RoundUpOverflowError, StdError, }; -use crate::{forward_ref_partial_eq, Decimal, Uint512}; +use crate::{forward_ref_partial_eq, Decimal, SignedDecimal, SignedDecimal256, Uint512}; use super::Fraction; use super::Isqrt; @@ -525,6 +525,30 @@ impl From for Decimal256 { } } +impl TryFrom for Decimal256 { + type Error = Decimal256RangeExceeded; + + fn try_from(value: SignedDecimal) -> Result { + value + .atomics() + .try_into() + .map(Decimal256) + .map_err(|_| Decimal256RangeExceeded) + } +} + +impl TryFrom for Decimal256 { + type Error = Decimal256RangeExceeded; + + fn try_from(value: SignedDecimal256) -> Result { + value + .atomics() + .try_into() + .map(Decimal256) + .map_err(|_| Decimal256RangeExceeded) + } +} + impl FromStr for Decimal256 { type Err = StdError; diff --git a/packages/std/src/math/signed_decimal.rs b/packages/std/src/math/signed_decimal.rs index a544ed13b1..b7c3e21267 100644 --- a/packages/std/src/math/signed_decimal.rs +++ b/packages/std/src/math/signed_decimal.rs @@ -13,7 +13,7 @@ use crate::errors::{ CheckedFromRatioError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, OverflowOperation, RoundDownOverflowError, RoundUpOverflowError, StdError, }; -use crate::{forward_ref_partial_eq, Decimal, Int256, SignedDecimal256}; +use crate::{forward_ref_partial_eq, Decimal, Decimal256, Int256, SignedDecimal256}; use super::Fraction; use super::Int128; @@ -631,9 +631,19 @@ impl TryFrom for SignedDecimal { fn try_from(value: Decimal) -> Result { value .atomics() - .u128() - .try_into() // convert to i128 - .map(Int128::new) + .try_into() + .map(SignedDecimal) + .map_err(|_| SignedDecimalRangeExceeded) + } +} + +impl TryFrom for SignedDecimal { + type Error = SignedDecimalRangeExceeded; + + fn try_from(value: Decimal256) -> Result { + value + .atomics() + .try_into() .map(SignedDecimal) .map_err(|_| SignedDecimalRangeExceeded) } diff --git a/packages/std/src/math/signed_decimal_256.rs b/packages/std/src/math/signed_decimal_256.rs index a08d4a4b2d..a761f13f38 100644 --- a/packages/std/src/math/signed_decimal_256.rs +++ b/packages/std/src/math/signed_decimal_256.rs @@ -13,7 +13,7 @@ use crate::errors::{ CheckedFromRatioError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, OverflowOperation, RoundDownOverflowError, RoundUpOverflowError, StdError, }; -use crate::{forward_ref_partial_eq, Decimal256, Int512, SignedDecimal}; +use crate::{forward_ref_partial_eq, Decimal, Decimal256, Int512, SignedDecimal}; use super::Fraction; use super::Int256; @@ -633,7 +633,25 @@ impl Neg for SignedDecimal256 { impl From for SignedDecimal256 { fn from(value: SignedDecimal) -> Self { - Self::from_atomics(value.atomics(), SignedDecimal::DECIMAL_PLACES).unwrap() + Self::new(value.atomics().into()) + } +} + +impl From for SignedDecimal256 { + fn from(value: Decimal) -> Self { + Self::new(value.atomics().into()) + } +} + +impl TryFrom for SignedDecimal256 { + type Error = SignedDecimal256RangeExceeded; + + fn try_from(value: Decimal256) -> Result { + value + .atomics() + .try_into() + .map(SignedDecimal256) + .map_err(|_| SignedDecimal256RangeExceeded) } } From d82d79444affa8cb55ef664f2c73aaebd26efc9f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 22 Sep 2023 16:31:56 +0200 Subject: [PATCH 0753/2372] Remove unnecessary zero check --- packages/std/src/math/signed_decimal.rs | 8 ++------ packages/std/src/math/signed_decimal_256.rs | 8 ++------ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/packages/std/src/math/signed_decimal.rs b/packages/std/src/math/signed_decimal.rs index b7c3e21267..e813c8111a 100644 --- a/packages/std/src/math/signed_decimal.rs +++ b/packages/std/src/math/signed_decimal.rs @@ -509,12 +509,8 @@ impl SignedDecimal { // but avoiding overflow by implementing the formula from `to_int_ceil` directly. let x = self.0; let y = Self::DECIMAL_FRACTIONAL; - if x.is_zero() { - Int128::zero() - } else { - // making sure not to negate `x`, as this would overflow - -Int128::one() - ((-Int128::one() - x) / y) - } + // making sure not to negate `x`, as this would overflow + -Int128::one() - ((-Int128::one() - x) / y) } else { self.to_int_trunc() } diff --git a/packages/std/src/math/signed_decimal_256.rs b/packages/std/src/math/signed_decimal_256.rs index a761f13f38..44fcfee83b 100644 --- a/packages/std/src/math/signed_decimal_256.rs +++ b/packages/std/src/math/signed_decimal_256.rs @@ -527,12 +527,8 @@ impl SignedDecimal256 { // but avoiding overflow by implementing the formula from `to_int_ceil` directly. let x = self.0; let y = Self::DECIMAL_FRACTIONAL; - if x.is_zero() { - Int256::zero() - } else { - // making sure not to negate `x`, as this would overflow - -Int256::one() - ((-Int256::one() - x) / y) - } + // making sure not to negate `x`, as this would overflow + -Int256::one() - ((-Int256::one() - x) / y) } else { self.to_int_trunc() } From 0ad3f13cf617ff43859904d09a8efc1e98e83fc9 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 25 Sep 2023 09:52:54 +0200 Subject: [PATCH 0754/2372] Fix minor things --- packages/std/src/math/decimal.rs | 12 ++++++------ packages/std/src/math/decimal256.rs | 12 ++++++------ packages/std/src/math/signed_decimal.rs | 18 +++++++++--------- packages/std/src/math/signed_decimal_256.rs | 12 ++++++------ 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index de9006f701..d22f35ee27 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -289,7 +289,7 @@ impl Decimal { .try_into() .map(Self) .map_err(|_| OverflowError { - operation: crate::OverflowOperation::Mul, + operation: OverflowOperation::Mul, operand1: self.to_string(), operand2: other.to_string(), }) @@ -331,7 +331,7 @@ impl Decimal { } inner(self, exp).map_err(|_| OverflowError { - operation: crate::OverflowOperation::Pow, + operation: OverflowOperation::Pow, operand1: self.to_string(), operand2: exp.to_string(), }) @@ -1121,7 +1121,7 @@ mod tests { } #[test] - fn decimal_from_str_errors_for_broken_fractinal_part() { + fn decimal_from_str_errors_for_broken_fractional_part() { match Decimal::from_str("1.").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), e => panic!("Unexpected error: {e:?}"), @@ -1537,7 +1537,7 @@ mod tests { assert_eq!( Decimal::MAX.checked_mul(Decimal::percent(200)), Err(OverflowError { - operation: crate::OverflowOperation::Mul, + operation: OverflowOperation::Mul, operand1: Decimal::MAX.to_string(), operand2: Decimal::percent(200).to_string(), }) @@ -1779,7 +1779,7 @@ mod tests { assert_eq!(Decimal::one().checked_pow(exp).unwrap(), Decimal::one()); } - // This case is mathematically undefined but we ensure consistency with Rust stdandard types + // This case is mathematically undefined but we ensure consistency with Rust standard types // https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=20df6716048e77087acd40194b233494 assert_eq!(Decimal::zero().checked_pow(0).unwrap(), Decimal::one()); @@ -1851,7 +1851,7 @@ mod tests { assert_eq!( Decimal::MAX.checked_pow(2), Err(OverflowError { - operation: crate::OverflowOperation::Pow, + operation: OverflowOperation::Pow, operand1: Decimal::MAX.to_string(), operand2: "2".to_string(), }) diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index b1aec4ab4e..fde449c952 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -304,7 +304,7 @@ impl Decimal256 { .try_into() .map(Self) .map_err(|_| OverflowError { - operation: crate::OverflowOperation::Mul, + operation: OverflowOperation::Mul, operand1: self.to_string(), operand2: other.to_string(), }) @@ -346,7 +346,7 @@ impl Decimal256 { } inner(self, exp).map_err(|_| OverflowError { - operation: crate::OverflowOperation::Pow, + operation: OverflowOperation::Pow, operand1: self.to_string(), operand2: exp.to_string(), }) @@ -1169,7 +1169,7 @@ mod tests { } #[test] - fn decimal256_from_str_errors_for_broken_fractinal_part() { + fn decimal256_from_str_errors_for_broken_fractional_part() { match Decimal256::from_str("1.").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), e => panic!("Unexpected error: {e:?}"), @@ -1605,7 +1605,7 @@ mod tests { assert_eq!( Decimal256::MAX.checked_mul(Decimal256::percent(200)), Err(OverflowError { - operation: crate::OverflowOperation::Mul, + operation: OverflowOperation::Mul, operand1: Decimal256::MAX.to_string(), operand2: Decimal256::percent(200).to_string(), }) @@ -1854,7 +1854,7 @@ mod tests { ); } - // This case is mathematically undefined but we ensure consistency with Rust stdandard types + // This case is mathematically undefined but we ensure consistency with Rust standard types // https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=20df6716048e77087acd40194b233494 assert_eq!( Decimal256::zero().checked_pow(0).unwrap(), @@ -1932,7 +1932,7 @@ mod tests { assert_eq!( Decimal256::MAX.checked_pow(2), Err(OverflowError { - operation: crate::OverflowOperation::Pow, + operation: OverflowOperation::Pow, operand1: Decimal256::MAX.to_string(), operand2: "2".to_string(), }) diff --git a/packages/std/src/math/signed_decimal.rs b/packages/std/src/math/signed_decimal.rs index e813c8111a..943535f889 100644 --- a/packages/std/src/math/signed_decimal.rs +++ b/packages/std/src/math/signed_decimal.rs @@ -378,7 +378,7 @@ impl SignedDecimal { .try_into() .map(Self) .map_err(|_| OverflowError { - operation: crate::OverflowOperation::Mul, + operation: OverflowOperation::Mul, operand1: self.to_string(), operand2: other.to_string(), }) @@ -420,7 +420,7 @@ impl SignedDecimal { } inner(self, exp).map_err(|_| OverflowError { - operation: crate::OverflowOperation::Pow, + operation: OverflowOperation::Pow, operand1: self.to_string(), operand2: exp.to_string(), }) @@ -502,7 +502,7 @@ impl SignedDecimal { /// let d = SignedDecimal::from_str("-0.05").unwrap(); /// assert_eq!(d.to_int_floor(), Int128::new(-1)); /// ``` - #[must_use] + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn to_int_floor(self) -> Int128 { if self.is_negative() { // Using `x.to_int_floor() = -(-x).to_int_ceil()` for a negative `x`, @@ -534,7 +534,7 @@ impl SignedDecimal { /// let d = SignedDecimal::from_str("75.0").unwrap(); /// assert_eq!(d.to_int_trunc(), Int128::new(75)); /// ``` - #[must_use] + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn to_int_trunc(self) -> Int128 { self.0 / Self::DECIMAL_FRACTIONAL } @@ -557,7 +557,7 @@ impl SignedDecimal { /// let d = SignedDecimal::from_str("75.0").unwrap(); /// assert_eq!(d.to_int_ceil(), Int128::new(75)); /// ``` - #[must_use] + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn to_int_ceil(self) -> Int128 { if self.is_negative() { self.to_int_trunc() @@ -1364,7 +1364,7 @@ mod tests { } #[test] - fn signed_decimal_from_str_errors_for_broken_fractinal_part() { + fn signed_decimal_from_str_errors_for_broken_fractional_part() { match SignedDecimal::from_str("1.").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), e => panic!("Unexpected error: {e:?}"), @@ -1964,7 +1964,7 @@ mod tests { assert_eq!( SignedDecimal::MAX.checked_mul(SignedDecimal::percent(200)), Err(OverflowError { - operation: crate::OverflowOperation::Mul, + operation: OverflowOperation::Mul, operand1: SignedDecimal::MAX.to_string(), operand2: SignedDecimal::percent(200).to_string(), }) @@ -2233,7 +2233,7 @@ mod tests { ); } - // This case is mathematically undefined but we ensure consistency with Rust stdandard types + // This case is mathematically undefined but we ensure consistency with Rust standard types // https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=20df6716048e77087acd40194b233494 assert_eq!( SignedDecimal::zero().checked_pow(0).unwrap(), @@ -2341,7 +2341,7 @@ mod tests { assert_eq!( SignedDecimal::MAX.checked_pow(2), Err(OverflowError { - operation: crate::OverflowOperation::Pow, + operation: OverflowOperation::Pow, operand1: SignedDecimal::MAX.to_string(), operand2: "2".to_string(), }) diff --git a/packages/std/src/math/signed_decimal_256.rs b/packages/std/src/math/signed_decimal_256.rs index 44fcfee83b..c6fd1f9171 100644 --- a/packages/std/src/math/signed_decimal_256.rs +++ b/packages/std/src/math/signed_decimal_256.rs @@ -396,7 +396,7 @@ impl SignedDecimal256 { .try_into() .map(Self) .map_err(|_| OverflowError { - operation: crate::OverflowOperation::Mul, + operation: OverflowOperation::Mul, operand1: self.to_string(), operand2: other.to_string(), }) @@ -438,7 +438,7 @@ impl SignedDecimal256 { } inner(self, exp).map_err(|_| OverflowError { - operation: crate::OverflowOperation::Pow, + operation: OverflowOperation::Pow, operand1: self.to_string(), operand2: exp.to_string(), }) @@ -1376,7 +1376,7 @@ mod tests { } #[test] - fn signed_decimal_256_from_str_errors_for_broken_fractinal_part() { + fn signed_decimal_256_from_str_errors_for_broken_fractional_part() { match SignedDecimal256::from_str("1.").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), e => panic!("Unexpected error: {e:?}"), @@ -2044,7 +2044,7 @@ mod tests { assert_eq!( SignedDecimal256::MAX.checked_mul(SignedDecimal256::percent(200)), Err(OverflowError { - operation: crate::OverflowOperation::Mul, + operation: OverflowOperation::Mul, operand1: SignedDecimal256::MAX.to_string(), operand2: SignedDecimal256::percent(200).to_string(), }) @@ -2334,7 +2334,7 @@ mod tests { ); } - // This case is mathematically undefined but we ensure consistency with Rust stdandard types + // This case is mathematically undefined but we ensure consistency with Rust standard types // https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=20df6716048e77087acd40194b233494 assert_eq!( SignedDecimal256::zero().checked_pow(0).unwrap(), @@ -2442,7 +2442,7 @@ mod tests { assert_eq!( SignedDecimal256::MAX.checked_pow(2), Err(OverflowError { - operation: crate::OverflowOperation::Pow, + operation: OverflowOperation::Pow, operand1: SignedDecimal256::MAX.to_string(), operand2: "2".to_string(), }) From 52127d96cce9efbb5af5bc7af741feefb3cb542c Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 25 Sep 2023 10:23:27 +0200 Subject: [PATCH 0755/2372] Constify SignedDecimal256::negative_one --- packages/std/src/math/decimal256.rs | 10 ++-------- packages/std/src/math/signed_decimal_256.rs | 15 +++++---------- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index fde449c952..8c9ccc7c19 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -33,15 +33,9 @@ pub struct Decimal256RangeExceeded; impl Decimal256 { const DECIMAL_FRACTIONAL: Uint256 = // 1*10**18 - Uint256::from_be_bytes([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 224, 182, - 179, 167, 100, 0, 0, - ]); + Uint256::from_u128(1_000_000_000_000_000_000); const DECIMAL_FRACTIONAL_SQUARED: Uint256 = // 1*10**36 - Uint256::from_be_bytes([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 151, 206, 123, 201, 7, 21, 179, - 75, 159, 16, 0, 0, 0, 0, - ]); + Uint256::from_u128(1_000_000_000_000_000_000_000_000_000_000_000_000); /// The number of decimal places. Since decimal types are fixed-point rather than /// floating-point, this is a constant. diff --git a/packages/std/src/math/signed_decimal_256.rs b/packages/std/src/math/signed_decimal_256.rs index c6fd1f9171..b09230d621 100644 --- a/packages/std/src/math/signed_decimal_256.rs +++ b/packages/std/src/math/signed_decimal_256.rs @@ -38,15 +38,9 @@ pub struct SignedDecimal256RangeExceeded; impl SignedDecimal256 { const DECIMAL_FRACTIONAL: Int256 = // 1*10**18 - Int256::from_be_bytes([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 224, 182, - 179, 167, 100, 0, 0, - ]); + Int256::from_i128(1_000_000_000_000_000_000); const DECIMAL_FRACTIONAL_SQUARED: Int256 = // 1*10**36 - Int256::from_be_bytes([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 151, 206, 123, 201, 7, 21, 179, - 75, 159, 16, 0, 0, 0, 0, - ]); + Int256::from_i128(1_000_000_000_000_000_000_000_000_000_000_000_000); /// The number of decimal places. Since decimal types are fixed-point rather than /// floating-point, this is a constant. @@ -112,8 +106,9 @@ impl SignedDecimal256 { /// Create a -1.0 SignedDecimal256 #[inline] - pub fn negative_one() -> Self { - Self(-Self::DECIMAL_FRACTIONAL) // TODO: constify + pub const fn negative_one() -> Self { + // -DECIMAL_FRATIONAL + Self(Int256::from_i128(-1_000_000_000_000_000_000)) } /// Create a 0.0 SignedDecimal256 From 1718a1724962dc8a11fdf7bdee02f2c0a5a22510 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 25 Sep 2023 10:43:35 +0200 Subject: [PATCH 0756/2372] Add must_use messages --- packages/std/src/math/decimal.rs | 4 ++-- packages/std/src/math/decimal256.rs | 4 ++-- packages/std/src/math/signed_decimal_256.rs | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index d22f35ee27..12837bc214 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -435,7 +435,7 @@ impl Decimal { /// let d = Decimal::from_str("75.0").unwrap(); /// assert_eq!(d.to_uint_floor(), Uint128::new(75)); /// ``` - #[must_use] + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn to_uint_floor(self) -> Uint128 { self.0 / Self::DECIMAL_FRACTIONAL } @@ -458,7 +458,7 @@ impl Decimal { /// let d = Decimal::from_str("75.0").unwrap(); /// assert_eq!(d.to_uint_ceil(), Uint128::new(75)); /// ``` - #[must_use] + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn to_uint_ceil(self) -> Uint128 { // Using `q = 1 + ((x - 1) / y); // if x != 0` with unsigned integers x, y, q // from https://stackoverflow.com/a/2745086/2013738. We know `x + y` CAN overflow. diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 8c9ccc7c19..f0db608d2a 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -448,7 +448,7 @@ impl Decimal256 { /// let d = Decimal256::from_str("75.0").unwrap(); /// assert_eq!(d.to_uint_floor(), Uint256::from(75u64)); /// ``` - #[must_use] + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn to_uint_floor(self) -> Uint256 { self.0 / Self::DECIMAL_FRACTIONAL } @@ -471,7 +471,7 @@ impl Decimal256 { /// let d = Decimal256::from_str("75.0").unwrap(); /// assert_eq!(d.to_uint_ceil(), Uint256::from(75u64)); /// ``` - #[must_use] + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn to_uint_ceil(self) -> Uint256 { // Using `q = 1 + ((x - 1) / y); // if x != 0` with unsigned integers x, y, q // from https://stackoverflow.com/a/2745086/2013738. We know `x + y` CAN overflow. diff --git a/packages/std/src/math/signed_decimal_256.rs b/packages/std/src/math/signed_decimal_256.rs index b09230d621..ca46e1a6c7 100644 --- a/packages/std/src/math/signed_decimal_256.rs +++ b/packages/std/src/math/signed_decimal_256.rs @@ -515,7 +515,7 @@ impl SignedDecimal256 { /// let d = SignedDecimal256::from_str("-0.05").unwrap(); /// assert_eq!(d.to_int_floor(), Int256::from(-1)); /// ``` - #[must_use] + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn to_int_floor(self) -> Int256 { if self.is_negative() { // Using `x.to_int_floor() = -(-x).to_int_ceil()` for a negative `x`, @@ -547,7 +547,7 @@ impl SignedDecimal256 { /// let d = SignedDecimal256::from_str("75.0").unwrap(); /// assert_eq!(d.to_int_trunc(), Int256::from(75)); /// ``` - #[must_use] + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn to_int_trunc(self) -> Int256 { self.0 / Self::DECIMAL_FRACTIONAL } @@ -570,7 +570,7 @@ impl SignedDecimal256 { /// let d = SignedDecimal256::from_str("75.0").unwrap(); /// assert_eq!(d.to_int_ceil(), Int256::from(75)); /// ``` - #[must_use] + #[must_use = "this returns the result of the operation, without modifying the original"] pub fn to_int_ceil(self) -> Int256 { if self.is_negative() { self.to_int_trunc() From 9d1be62ed1bed935cf0f7b9c2d86e9d0188f893e Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Fri, 22 Sep 2023 17:56:50 +0200 Subject: [PATCH 0757/2372] Added test cases. --- packages/std/src/math/signed_decimal.rs | 193 ++++++++++++++---------- 1 file changed, 111 insertions(+), 82 deletions(-) diff --git a/packages/std/src/math/signed_decimal.rs b/packages/std/src/math/signed_decimal.rs index 943535f889..ba029f96f6 100644 --- a/packages/std/src/math/signed_decimal.rs +++ b/packages/std/src/math/signed_decimal.rs @@ -907,6 +907,7 @@ impl<'de> de::Visitor<'de> for SignedDecimalVisitor { mod tests { use super::*; use crate::{from_slice, to_vec}; + use schemars::schema_for; fn dec(input: &str) -> SignedDecimal { SignedDecimal::from_str(input).unwrap() @@ -1347,106 +1348,72 @@ mod tests { #[test] fn signed_decimal_from_str_errors_for_broken_whole_part() { - match SignedDecimal::from_str("").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing whole"), - e => panic!("Unexpected error: {e:?}"), - } - - match SignedDecimal::from_str(" ").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing whole"), - e => panic!("Unexpected error: {e:?}"), - } - - match SignedDecimal::from_str("-").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing whole"), - e => panic!("Unexpected error: {e:?}"), - } + let expected_err = StdError::generic_err("Error parsing whole"); + assert_eq!(expected_err, SignedDecimal::from_str("").unwrap_err()); + assert_eq!(expected_err, SignedDecimal::from_str(" ").unwrap_err()); + assert_eq!(expected_err, SignedDecimal::from_str("-").unwrap_err()); } #[test] fn signed_decimal_from_str_errors_for_broken_fractional_part() { - match SignedDecimal::from_str("1.").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), - e => panic!("Unexpected error: {e:?}"), - } - - match SignedDecimal::from_str("1. ").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), - e => panic!("Unexpected error: {e:?}"), - } - - match SignedDecimal::from_str("1.e").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), - e => panic!("Unexpected error: {e:?}"), - } - - match SignedDecimal::from_str("1.2e3").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), - e => panic!("Unexpected error: {e:?}"), - } - - match SignedDecimal::from_str("1.-2").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), - e => panic!("Unexpected error: {e:?}"), - } + let expected_err = StdError::generic_err("Error parsing fractional"); + assert_eq!(expected_err, SignedDecimal::from_str("1.").unwrap_err()); + assert_eq!(expected_err, SignedDecimal::from_str("1. ").unwrap_err()); + assert_eq!(expected_err, SignedDecimal::from_str("1.e").unwrap_err()); + assert_eq!(expected_err, SignedDecimal::from_str("1.2e3").unwrap_err()); + assert_eq!(expected_err, SignedDecimal::from_str("1.-2").unwrap_err()); } #[test] fn signed_decimal_from_str_errors_for_more_than_18_fractional_digits() { - match SignedDecimal::from_str("7.1234567890123456789").unwrap_err() { - StdError::GenericErr { msg, .. } => { - assert_eq!(msg, "Cannot parse more than 18 fractional digits",) - } - e => panic!("Unexpected error: {e:?}"), - } - + let expected_err = StdError::generic_err("Cannot parse more than 18 fractional digits"); + assert_eq!( + expected_err, + SignedDecimal::from_str("7.1234567890123456789").unwrap_err() + ); // No special rules for trailing zeros. This could be changed but adds gas cost for the happy path. - match SignedDecimal::from_str("7.1230000000000000000").unwrap_err() { - StdError::GenericErr { msg, .. } => { - assert_eq!(msg, "Cannot parse more than 18 fractional digits") - } - e => panic!("Unexpected error: {e:?}"), - } + assert_eq!( + expected_err, + SignedDecimal::from_str("7.1230000000000000000").unwrap_err() + ); } #[test] fn signed_decimal_from_str_errors_for_invalid_number_of_dots() { - match SignedDecimal::from_str("1.2.3").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Unexpected number of dots"), - e => panic!("Unexpected error: {e:?}"), - } - - match SignedDecimal::from_str("1.2.3.4").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Unexpected number of dots"), - e => panic!("Unexpected error: {e:?}"), - } + let expected_err = StdError::generic_err("Unexpected number of dots"); + assert_eq!(expected_err, SignedDecimal::from_str("1.2.3").unwrap_err()); + assert_eq!( + expected_err, + SignedDecimal::from_str("1.2.3.4").unwrap_err() + ); } #[test] fn signed_decimal_from_str_errors_for_more_than_max_value() { + let expected_err = StdError::generic_err("Value too big"); // Integer - match SignedDecimal::from_str("170141183460469231732").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), - e => panic!("Unexpected error: {e:?}"), - } - match SignedDecimal::from_str("-170141183460469231732").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), - e => panic!("Unexpected error: {e:?}"), - } + assert_eq!( + expected_err, + SignedDecimal::from_str("170141183460469231732").unwrap_err() + ); + assert_eq!( + expected_err, + SignedDecimal::from_str("-170141183460469231732").unwrap_err() + ); // SignedDecimal - match SignedDecimal::from_str("170141183460469231732.0").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), - e => panic!("Unexpected error: {e:?}"), - } - match SignedDecimal::from_str("170141183460469231731.687303715884105728").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), - e => panic!("Unexpected error: {e:?}"), - } - match SignedDecimal::from_str("-170141183460469231731.687303715884105729").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), - e => panic!("Unexpected error: {e:?}"), - } + assert_eq!( + expected_err, + SignedDecimal::from_str("170141183460469231732.0").unwrap_err() + ); + assert_eq!( + expected_err, + SignedDecimal::from_str("170141183460469231731.687303715884105728").unwrap_err() + ); + assert_eq!( + expected_err, + SignedDecimal::from_str("-170141183460469231731.687303715884105729").unwrap_err() + ); } #[test] @@ -2823,6 +2790,9 @@ mod tests { SignedDecimal::percent(1600) ); assert_eq!(SignedDecimal::MAX.saturating_pow(2u32), SignedDecimal::MAX); + assert_eq!(SignedDecimal::MAX.saturating_pow(3u32), SignedDecimal::MAX); + assert_eq!(SignedDecimal::MIN.saturating_pow(2u32), SignedDecimal::MAX); + assert_eq!(SignedDecimal::MIN.saturating_pow(3u32), SignedDecimal::MIN); } #[test] @@ -2928,6 +2898,10 @@ mod tests { SignedDecimal::MIN.checked_floor(), Err(RoundDownOverflowError) ); + assert_eq!( + SignedDecimal::negative_one().checked_floor(), + Ok(SignedDecimal::negative_one()) + ); } #[test] @@ -2944,14 +2918,18 @@ mod tests { assert_eq!(d.to_int_floor(), Int128::new(-13)); let d = SignedDecimal::from_str("-12.345").unwrap(); assert_eq!(d.to_int_floor(), Int128::new(-13)); - let d = SignedDecimal::from_str("75.0").unwrap(); assert_eq!(d.to_int_floor(), Int128::new(75)); + let d = SignedDecimal::from_str("0.0001").unwrap(); + assert_eq!(d.to_int_floor(), Int128::new(0)); let d = SignedDecimal::from_str("0.0").unwrap(); assert_eq!(d.to_int_floor(), Int128::new(0)); + let d = SignedDecimal::from_str("-0.0").unwrap(); + assert_eq!(d.to_int_floor(), Int128::new(0)); + let d = SignedDecimal::from_str("-0.0001").unwrap(); + assert_eq!(d.to_int_floor(), Int128::new(-1)); let d = SignedDecimal::from_str("-75.0").unwrap(); assert_eq!(d.to_int_floor(), Int128::new(-75)); - let d = SignedDecimal::MAX; assert_eq!(d.to_int_floor(), Int128::new(170141183460469231731)); let d = SignedDecimal::MIN; @@ -3053,4 +3031,55 @@ mod tests { assert_eq!(format!("{decimal:?}"), expected); } } + + #[test] + fn signed_decimal_can_be_instantiated_from_decimal256() { + let d: SignedDecimal = Decimal256::zero().try_into().unwrap(); + assert_eq!(d, SignedDecimal::zero()); + } + + #[test] + fn signed_decimal_may_fail_when_instantiated_from_decimal256() { + let err = >::try_into(Decimal256::MAX).unwrap_err(); + assert_eq!("SignedDecimalRangeExceeded", format!("{:?}", err)); + assert_eq!("SignedDecimal range exceeded", format!("{}", err)); + } + + #[test] + fn signed_decimal_can_be_serialized_and_deserialized() { + // properly deserialized + let value: SignedDecimal = serde_json::from_str(r#""123""#).unwrap(); + assert_eq!(SignedDecimal::from_str("123").unwrap(), value); + + // properly serialized + let value = SignedDecimal::from_str("456").unwrap(); + assert_eq!(r#""456""#, serde_json::to_string(&value).unwrap()); + + // invalid: not a string encoded decimal + assert_eq!( + "invalid type: integer `123`, expected string-encoded decimal at line 1 column 3", + serde_json::from_str::("123") + .err() + .unwrap() + .to_string() + ); + + // invalid: not properly defined signed decimal value + assert_eq!( + "Error parsing decimal '1.e': Generic error: Error parsing fractional at line 1 column 5", + serde_json::from_str::(r#""1.e""#) + .err() + .unwrap() + .to_string() + ); + } + + #[test] + fn signed_decimal_has_defined_json_schema() { + let schema = schema_for!(SignedDecimal); + assert_eq!( + "SignedDecimal", + schema.schema.metadata.unwrap().title.unwrap() + ); + } } From 7e6f24e0135c126beb36e471503cf51e7bc420fc Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 25 Sep 2023 10:53:26 +0200 Subject: [PATCH 0758/2372] Adjust assert order --- packages/std/src/math/signed_decimal.rs | 50 ++++++++++++------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/packages/std/src/math/signed_decimal.rs b/packages/std/src/math/signed_decimal.rs index ba029f96f6..3ad803ae7d 100644 --- a/packages/std/src/math/signed_decimal.rs +++ b/packages/std/src/math/signed_decimal.rs @@ -1349,42 +1349,42 @@ mod tests { #[test] fn signed_decimal_from_str_errors_for_broken_whole_part() { let expected_err = StdError::generic_err("Error parsing whole"); - assert_eq!(expected_err, SignedDecimal::from_str("").unwrap_err()); - assert_eq!(expected_err, SignedDecimal::from_str(" ").unwrap_err()); - assert_eq!(expected_err, SignedDecimal::from_str("-").unwrap_err()); + assert_eq!(SignedDecimal::from_str("").unwrap_err(), expected_err); + assert_eq!(SignedDecimal::from_str(" ").unwrap_err(), expected_err); + assert_eq!(SignedDecimal::from_str("-").unwrap_err(), expected_err); } #[test] fn signed_decimal_from_str_errors_for_broken_fractional_part() { let expected_err = StdError::generic_err("Error parsing fractional"); - assert_eq!(expected_err, SignedDecimal::from_str("1.").unwrap_err()); - assert_eq!(expected_err, SignedDecimal::from_str("1. ").unwrap_err()); - assert_eq!(expected_err, SignedDecimal::from_str("1.e").unwrap_err()); - assert_eq!(expected_err, SignedDecimal::from_str("1.2e3").unwrap_err()); - assert_eq!(expected_err, SignedDecimal::from_str("1.-2").unwrap_err()); + assert_eq!(SignedDecimal::from_str("1.").unwrap_err(), expected_err); + assert_eq!(SignedDecimal::from_str("1. ").unwrap_err(), expected_err); + assert_eq!(SignedDecimal::from_str("1.e").unwrap_err(), expected_err); + assert_eq!(SignedDecimal::from_str("1.2e3").unwrap_err(), expected_err); + assert_eq!(SignedDecimal::from_str("1.-2").unwrap_err(), expected_err); } #[test] fn signed_decimal_from_str_errors_for_more_than_18_fractional_digits() { let expected_err = StdError::generic_err("Cannot parse more than 18 fractional digits"); assert_eq!( - expected_err, - SignedDecimal::from_str("7.1234567890123456789").unwrap_err() + SignedDecimal::from_str("7.1234567890123456789").unwrap_err(), + expected_err ); // No special rules for trailing zeros. This could be changed but adds gas cost for the happy path. assert_eq!( - expected_err, - SignedDecimal::from_str("7.1230000000000000000").unwrap_err() + SignedDecimal::from_str("7.1230000000000000000").unwrap_err(), + expected_err ); } #[test] fn signed_decimal_from_str_errors_for_invalid_number_of_dots() { let expected_err = StdError::generic_err("Unexpected number of dots"); - assert_eq!(expected_err, SignedDecimal::from_str("1.2.3").unwrap_err()); + assert_eq!(SignedDecimal::from_str("1.2.3").unwrap_err(), expected_err); assert_eq!( - expected_err, - SignedDecimal::from_str("1.2.3.4").unwrap_err() + SignedDecimal::from_str("1.2.3.4").unwrap_err(), + expected_err ); } @@ -1393,26 +1393,26 @@ mod tests { let expected_err = StdError::generic_err("Value too big"); // Integer assert_eq!( - expected_err, - SignedDecimal::from_str("170141183460469231732").unwrap_err() + SignedDecimal::from_str("170141183460469231732").unwrap_err(), + expected_err ); assert_eq!( - expected_err, - SignedDecimal::from_str("-170141183460469231732").unwrap_err() + SignedDecimal::from_str("-170141183460469231732").unwrap_err(), + expected_err ); // SignedDecimal assert_eq!( - expected_err, - SignedDecimal::from_str("170141183460469231732.0").unwrap_err() + SignedDecimal::from_str("170141183460469231732.0").unwrap_err(), + expected_err ); assert_eq!( - expected_err, - SignedDecimal::from_str("170141183460469231731.687303715884105728").unwrap_err() + SignedDecimal::from_str("170141183460469231731.687303715884105728").unwrap_err(), + expected_err ); assert_eq!( - expected_err, - SignedDecimal::from_str("-170141183460469231731.687303715884105729").unwrap_err() + SignedDecimal::from_str("-170141183460469231731.687303715884105729").unwrap_err(), + expected_err ); } From d87684220910a892ddea3eac630b13c045fc5785 Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Mon, 25 Sep 2023 10:45:27 +0200 Subject: [PATCH 0759/2372] Added test cases. --- packages/std/src/math/signed_decimal_256.rs | 251 ++++++++++++-------- 1 file changed, 150 insertions(+), 101 deletions(-) diff --git a/packages/std/src/math/signed_decimal_256.rs b/packages/std/src/math/signed_decimal_256.rs index ca46e1a6c7..44c5c4e71d 100644 --- a/packages/std/src/math/signed_decimal_256.rs +++ b/packages/std/src/math/signed_decimal_256.rs @@ -908,6 +908,7 @@ impl<'de> de::Visitor<'de> for SignedDecimal256Visitor { mod tests { use super::*; use crate::{from_slice, to_vec}; + use schemars::schema_for; fn dec(input: &str) -> SignedDecimal256 { SignedDecimal256::from_str(input).unwrap() @@ -1354,126 +1355,96 @@ mod tests { #[test] fn signed_decimal_256_from_str_errors_for_broken_whole_part() { - match SignedDecimal256::from_str("").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing whole"), - e => panic!("Unexpected error: {e:?}"), - } - - match SignedDecimal256::from_str(" ").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing whole"), - e => panic!("Unexpected error: {e:?}"), - } - - match SignedDecimal256::from_str("-").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing whole"), - e => panic!("Unexpected error: {e:?}"), - } + let expected_err = StdError::generic_err("Error parsing whole"); + assert_eq!(expected_err, SignedDecimal256::from_str("").unwrap_err()); + assert_eq!(expected_err, SignedDecimal256::from_str(" ").unwrap_err()); + assert_eq!(expected_err, SignedDecimal256::from_str("-").unwrap_err()); } #[test] fn signed_decimal_256_from_str_errors_for_broken_fractional_part() { - match SignedDecimal256::from_str("1.").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), - e => panic!("Unexpected error: {e:?}"), - } - - match SignedDecimal256::from_str("1. ").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), - e => panic!("Unexpected error: {e:?}"), - } - - match SignedDecimal256::from_str("1.e").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), - e => panic!("Unexpected error: {e:?}"), - } - - match SignedDecimal256::from_str("1.2e3").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), - e => panic!("Unexpected error: {e:?}"), - } - - match SignedDecimal256::from_str("1.-2").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), - e => panic!("Unexpected error: {e:?}"), - } + let expected_err = StdError::generic_err("Error parsing fractional"); + assert_eq!(expected_err, SignedDecimal256::from_str("1.").unwrap_err()); + assert_eq!(expected_err, SignedDecimal256::from_str("1. ").unwrap_err()); + assert_eq!(expected_err, SignedDecimal256::from_str("1.e").unwrap_err()); + assert_eq!( + expected_err, + SignedDecimal256::from_str("1.2e3").unwrap_err() + ); + assert_eq!( + expected_err, + SignedDecimal256::from_str("1.-2").unwrap_err() + ); } #[test] fn signed_decimal_256_from_str_errors_for_more_than_18_fractional_digits() { - match SignedDecimal256::from_str("7.1234567890123456789").unwrap_err() { - StdError::GenericErr { msg, .. } => { - assert_eq!(msg, "Cannot parse more than 18 fractional digits",) - } - e => panic!("Unexpected error: {e:?}"), - } - + let expected_err = StdError::generic_err("Cannot parse more than 18 fractional digits"); + assert_eq!( + expected_err, + SignedDecimal256::from_str("7.1234567890123456789").unwrap_err() + ); // No special rules for trailing zeros. This could be changed but adds gas cost for the happy path. - match SignedDecimal256::from_str("7.1230000000000000000").unwrap_err() { - StdError::GenericErr { msg, .. } => { - assert_eq!(msg, "Cannot parse more than 18 fractional digits") - } - e => panic!("Unexpected error: {e:?}"), - } + assert_eq!( + expected_err, + SignedDecimal256::from_str("7.1230000000000000000").unwrap_err() + ); } #[test] fn signed_decimal_256_from_str_errors_for_invalid_number_of_dots() { - match SignedDecimal256::from_str("1.2.3").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Unexpected number of dots"), - e => panic!("Unexpected error: {e:?}"), - } - - match SignedDecimal256::from_str("1.2.3.4").unwrap_err() { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Unexpected number of dots"), - e => panic!("Unexpected error: {e:?}"), - } + let expected_err = StdError::generic_err("Unexpected number of dots"); + assert_eq!( + expected_err, + SignedDecimal256::from_str("1.2.3").unwrap_err() + ); + assert_eq!( + expected_err, + SignedDecimal256::from_str("1.2.3.4").unwrap_err() + ); } #[test] fn signed_decimal_256_from_str_errors_for_more_than_max_value() { + let expected_err = StdError::generic_err("Value too big"); // Integer - match SignedDecimal256::from_str( - "57896044618658097711785492504343953926634992332820282019729", - ) - .unwrap_err() - { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), - e => panic!("Unexpected error: {e:?}"), - } - match SignedDecimal256::from_str( - "-57896044618658097711785492504343953926634992332820282019729", - ) - .unwrap_err() - { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), - e => panic!("Unexpected error: {e:?}"), - } + assert_eq!( + expected_err, + SignedDecimal256::from_str( + "57896044618658097711785492504343953926634992332820282019729", + ) + .unwrap_err() + ); + assert_eq!( + expected_err, + SignedDecimal256::from_str( + "-57896044618658097711785492504343953926634992332820282019729", + ) + .unwrap_err() + ); // SignedDecimal256 - match SignedDecimal256::from_str( - "57896044618658097711785492504343953926634992332820282019729.0", - ) - .unwrap_err() - { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), - e => panic!("Unexpected error: {e:?}"), - } - match SignedDecimal256::from_str( - "57896044618658097711785492504343953926634992332820282019728.792003956564819968", - ) - .unwrap_err() - { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), - e => panic!("Unexpected error: {e:?}"), - } - match SignedDecimal256::from_str( - "-57896044618658097711785492504343953926634992332820282019728.792003956564819969", - ) - .unwrap_err() - { - StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), - e => panic!("Unexpected error: {e:?}"), - } + assert_eq!( + expected_err, + SignedDecimal256::from_str( + "57896044618658097711785492504343953926634992332820282019729.0", + ) + .unwrap_err() + ); + assert_eq!( + expected_err, + SignedDecimal256::from_str( + "57896044618658097711785492504343953926634992332820282019728.792003956564819968", + ) + .unwrap_err() + ); + assert_eq!( + expected_err, + SignedDecimal256::from_str( + "-57896044618658097711785492504343953926634992332820282019728.792003956564819969", + ) + .unwrap_err() + ); } #[test] @@ -2937,6 +2908,18 @@ mod tests { SignedDecimal256::MAX.saturating_pow(2u32), SignedDecimal256::MAX ); + assert_eq!( + SignedDecimal256::MAX.saturating_pow(3u32), + SignedDecimal256::MAX + ); + assert_eq!( + SignedDecimal256::MIN.saturating_pow(2u32), + SignedDecimal256::MAX + ); + assert_eq!( + SignedDecimal256::MIN.saturating_pow(3u32), + SignedDecimal256::MIN + ); } #[test] @@ -3066,6 +3049,10 @@ mod tests { SignedDecimal256::MIN.checked_floor(), Err(RoundDownOverflowError) ); + assert_eq!( + SignedDecimal256::negative_one().checked_floor(), + Ok(SignedDecimal256::negative_one()) + ); } #[test] @@ -3082,11 +3069,16 @@ mod tests { assert_eq!(d.to_int_floor(), Int256::from(-13)); let d = SignedDecimal256::from_str("-12.345").unwrap(); assert_eq!(d.to_int_floor(), Int256::from(-13)); - + let d = SignedDecimal256::from_str("0.0001").unwrap(); + assert_eq!(d.to_int_floor(), Int256::from(0)); let d = SignedDecimal256::from_str("75.0").unwrap(); assert_eq!(d.to_int_floor(), Int256::from(75)); let d = SignedDecimal256::from_str("0.0").unwrap(); assert_eq!(d.to_int_floor(), Int256::from(0)); + let d = SignedDecimal256::from_str("-0.0").unwrap(); + assert_eq!(d.to_int_floor(), Int256::from(0)); + let d = SignedDecimal256::from_str("-0.0001").unwrap(); + assert_eq!(d.to_int_floor(), Int256::from(-1)); let d = SignedDecimal256::from_str("-75.0").unwrap(); assert_eq!(d.to_int_floor(), Int256::from(-75)); @@ -3218,4 +3210,61 @@ mod tests { assert_eq!(format!("{decimal:?}"), expected); } } + + #[test] + fn signed_decimal_256_can_be_instantiated_from_decimal() { + let d: SignedDecimal256 = Decimal::one().into(); + assert_eq!(d, SignedDecimal256::one()); + } + + #[test] + fn signed_decimal_256_can_be_instantiated_from_decimal_256() { + let d: SignedDecimal256 = Decimal256::zero().try_into().unwrap(); + assert_eq!(d, SignedDecimal256::zero()); + } + + #[test] + fn signed_decimal_256_may_fail_when_instantiated_from_decimal_256() { + let err = >::try_into(Decimal256::MAX).unwrap_err(); + assert_eq!("SignedDecimal256RangeExceeded", format!("{:?}", err)); + assert_eq!("SignedDecimal256 range exceeded", format!("{}", err)); + } + + #[test] + fn signed_decimal_256_can_be_serialized_and_deserialized() { + // properly deserialized + let value: SignedDecimal256 = serde_json::from_str(r#""123""#).unwrap(); + assert_eq!(SignedDecimal256::from_str("123").unwrap(), value); + + // properly serialized + let value = SignedDecimal256::from_str("456").unwrap(); + assert_eq!(r#""456""#, serde_json::to_string(&value).unwrap()); + + // invalid: not a string encoded decimal + assert_eq!( + "invalid type: integer `123`, expected string-encoded decimal at line 1 column 3", + serde_json::from_str::("123") + .err() + .unwrap() + .to_string() + ); + + // invalid: not properly defined signed decimal value + assert_eq!( + "Error parsing decimal '1.e': Generic error: Error parsing fractional at line 1 column 5", + serde_json::from_str::(r#""1.e""#) + .err() + .unwrap() + .to_string() + ); + } + + #[test] + fn signed_decimal_256_has_defined_json_schema() { + let schema = schema_for!(SignedDecimal256); + assert_eq!( + "SignedDecimal256", + schema.schema.metadata.unwrap().title.unwrap() + ); + } } From 51162f10aafcf5d1929ac20836c923e7aabd29c1 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 25 Sep 2023 11:12:43 +0200 Subject: [PATCH 0760/2372] Adjust assert order --- packages/std/src/math/signed_decimal_256.rs | 56 ++++++++++----------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/packages/std/src/math/signed_decimal_256.rs b/packages/std/src/math/signed_decimal_256.rs index 44c5c4e71d..67ad5165d1 100644 --- a/packages/std/src/math/signed_decimal_256.rs +++ b/packages/std/src/math/signed_decimal_256.rs @@ -1356,24 +1356,24 @@ mod tests { #[test] fn signed_decimal_256_from_str_errors_for_broken_whole_part() { let expected_err = StdError::generic_err("Error parsing whole"); - assert_eq!(expected_err, SignedDecimal256::from_str("").unwrap_err()); - assert_eq!(expected_err, SignedDecimal256::from_str(" ").unwrap_err()); - assert_eq!(expected_err, SignedDecimal256::from_str("-").unwrap_err()); + assert_eq!(SignedDecimal256::from_str("").unwrap_err(), expected_err); + assert_eq!(SignedDecimal256::from_str(" ").unwrap_err(), expected_err); + assert_eq!(SignedDecimal256::from_str("-").unwrap_err(), expected_err); } #[test] fn signed_decimal_256_from_str_errors_for_broken_fractional_part() { let expected_err = StdError::generic_err("Error parsing fractional"); - assert_eq!(expected_err, SignedDecimal256::from_str("1.").unwrap_err()); - assert_eq!(expected_err, SignedDecimal256::from_str("1. ").unwrap_err()); - assert_eq!(expected_err, SignedDecimal256::from_str("1.e").unwrap_err()); + assert_eq!(SignedDecimal256::from_str("1.").unwrap_err(), expected_err); + assert_eq!(SignedDecimal256::from_str("1. ").unwrap_err(), expected_err); + assert_eq!(SignedDecimal256::from_str("1.e").unwrap_err(), expected_err); assert_eq!( - expected_err, - SignedDecimal256::from_str("1.2e3").unwrap_err() + SignedDecimal256::from_str("1.2e3").unwrap_err(), + expected_err ); assert_eq!( - expected_err, - SignedDecimal256::from_str("1.-2").unwrap_err() + SignedDecimal256::from_str("1.-2").unwrap_err(), + expected_err ); } @@ -1381,13 +1381,13 @@ mod tests { fn signed_decimal_256_from_str_errors_for_more_than_18_fractional_digits() { let expected_err = StdError::generic_err("Cannot parse more than 18 fractional digits"); assert_eq!( - expected_err, - SignedDecimal256::from_str("7.1234567890123456789").unwrap_err() + SignedDecimal256::from_str("7.1234567890123456789").unwrap_err(), + expected_err ); // No special rules for trailing zeros. This could be changed but adds gas cost for the happy path. assert_eq!( - expected_err, - SignedDecimal256::from_str("7.1230000000000000000").unwrap_err() + SignedDecimal256::from_str("7.1230000000000000000").unwrap_err(), + expected_err ); } @@ -1395,12 +1395,12 @@ mod tests { fn signed_decimal_256_from_str_errors_for_invalid_number_of_dots() { let expected_err = StdError::generic_err("Unexpected number of dots"); assert_eq!( - expected_err, - SignedDecimal256::from_str("1.2.3").unwrap_err() + SignedDecimal256::from_str("1.2.3").unwrap_err(), + expected_err ); assert_eq!( - expected_err, - SignedDecimal256::from_str("1.2.3.4").unwrap_err() + SignedDecimal256::from_str("1.2.3.4").unwrap_err(), + expected_err ); } @@ -1409,41 +1409,41 @@ mod tests { let expected_err = StdError::generic_err("Value too big"); // Integer assert_eq!( - expected_err, SignedDecimal256::from_str( "57896044618658097711785492504343953926634992332820282019729", ) - .unwrap_err() + .unwrap_err(), + expected_err ); assert_eq!( - expected_err, SignedDecimal256::from_str( "-57896044618658097711785492504343953926634992332820282019729", ) - .unwrap_err() + .unwrap_err(), + expected_err ); // SignedDecimal256 assert_eq!( - expected_err, SignedDecimal256::from_str( "57896044618658097711785492504343953926634992332820282019729.0", ) - .unwrap_err() + .unwrap_err(), + expected_err ); assert_eq!( - expected_err, SignedDecimal256::from_str( "57896044618658097711785492504343953926634992332820282019728.792003956564819968", ) - .unwrap_err() + .unwrap_err(), + expected_err ); assert_eq!( - expected_err, SignedDecimal256::from_str( "-57896044618658097711785492504343953926634992332820282019728.792003956564819969", ) - .unwrap_err() + .unwrap_err(), + expected_err ); } From 68802e0f3c3f68acfc6633df9c9d9dd2cf46d363 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 25 Sep 2023 11:15:02 +0200 Subject: [PATCH 0761/2372] Fix clippy lints --- packages/std/src/math/signed_decimal.rs | 4 ++-- packages/std/src/math/signed_decimal_256.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/std/src/math/signed_decimal.rs b/packages/std/src/math/signed_decimal.rs index 3ad803ae7d..5a92106a7a 100644 --- a/packages/std/src/math/signed_decimal.rs +++ b/packages/std/src/math/signed_decimal.rs @@ -3041,8 +3041,8 @@ mod tests { #[test] fn signed_decimal_may_fail_when_instantiated_from_decimal256() { let err = >::try_into(Decimal256::MAX).unwrap_err(); - assert_eq!("SignedDecimalRangeExceeded", format!("{:?}", err)); - assert_eq!("SignedDecimal range exceeded", format!("{}", err)); + assert_eq!("SignedDecimalRangeExceeded", format!("{err:?}")); + assert_eq!("SignedDecimal range exceeded", format!("{err}")); } #[test] diff --git a/packages/std/src/math/signed_decimal_256.rs b/packages/std/src/math/signed_decimal_256.rs index 67ad5165d1..a9cd4d494c 100644 --- a/packages/std/src/math/signed_decimal_256.rs +++ b/packages/std/src/math/signed_decimal_256.rs @@ -3226,8 +3226,8 @@ mod tests { #[test] fn signed_decimal_256_may_fail_when_instantiated_from_decimal_256() { let err = >::try_into(Decimal256::MAX).unwrap_err(); - assert_eq!("SignedDecimal256RangeExceeded", format!("{:?}", err)); - assert_eq!("SignedDecimal256 range exceeded", format!("{}", err)); + assert_eq!("SignedDecimal256RangeExceeded", format!("{err:?}")); + assert_eq!("SignedDecimal256 range exceeded", format!("{err}")); } #[test] From f8d5d8e4a65b5290934fc5a62cb7391ba450d602 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 25 Sep 2023 15:38:41 +0200 Subject: [PATCH 0762/2372] Add changelog entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d1e7575a9..93b8860e4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ and this project adheres to - cosmwasm-std: Add `to_json_{vec,binary,string}` and `from_json` and deprecate `to_{vec,binary}` in favor of `to_json_{vec,binary}` and `from_{slice,binary}` in favor of `from_json`. ([#1886]) +- cosmwasm-std: Add `SignedDecimal` and `SignedDecimal256` ([#1807]). [#1854]: https://github.com/CosmWasm/cosmwasm/pull/1854 [#1861]: https://github.com/CosmWasm/cosmwasm/pull/1861 @@ -29,6 +30,7 @@ and this project adheres to [#1867]: https://github.com/CosmWasm/cosmwasm/pull/1867 [#1870]: https://github.com/CosmWasm/cosmwasm/pull/1870 [#1886]: https://github.com/CosmWasm/cosmwasm/pull/1886 +[#1807]: https://github.com/CosmWasm/cosmwasm/pull/1807 ## [1.4.0] - 2023-09-04 From 9989ab9e7262b360c3f83d938230fd7fb998c7e9 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 25 Sep 2023 15:51:51 +0200 Subject: [PATCH 0763/2372] Replace deprecated calls --- packages/std/src/math/signed_decimal.rs | 59 +++++++++++++-------- packages/std/src/math/signed_decimal_256.rs | 47 ++++++++-------- 2 files changed, 62 insertions(+), 44 deletions(-) diff --git a/packages/std/src/math/signed_decimal.rs b/packages/std/src/math/signed_decimal.rs index 5a92106a7a..bdb45cf04e 100644 --- a/packages/std/src/math/signed_decimal.rs +++ b/packages/std/src/math/signed_decimal.rs @@ -906,7 +906,7 @@ impl<'de> de::Visitor<'de> for SignedDecimalVisitor { #[cfg(test)] mod tests { use super::*; - use crate::{from_slice, to_vec}; + use crate::{from_json, to_json_vec}; use schemars::schema_for; fn dec(input: &str) -> SignedDecimal { @@ -2438,74 +2438,89 @@ mod tests { #[test] fn signed_decimal_serialize() { - assert_eq!(to_vec(&SignedDecimal::zero()).unwrap(), br#""0""#); - assert_eq!(to_vec(&SignedDecimal::one()).unwrap(), br#""1""#); - assert_eq!(to_vec(&SignedDecimal::percent(8)).unwrap(), br#""0.08""#); - assert_eq!(to_vec(&SignedDecimal::percent(87)).unwrap(), br#""0.87""#); - assert_eq!(to_vec(&SignedDecimal::percent(876)).unwrap(), br#""8.76""#); + assert_eq!(to_json_vec(&SignedDecimal::zero()).unwrap(), br#""0""#); + assert_eq!(to_json_vec(&SignedDecimal::one()).unwrap(), br#""1""#); assert_eq!( - to_vec(&SignedDecimal::percent(8765)).unwrap(), + to_json_vec(&SignedDecimal::percent(8)).unwrap(), + br#""0.08""# + ); + assert_eq!( + to_json_vec(&SignedDecimal::percent(87)).unwrap(), + br#""0.87""# + ); + assert_eq!( + to_json_vec(&SignedDecimal::percent(876)).unwrap(), + br#""8.76""# + ); + assert_eq!( + to_json_vec(&SignedDecimal::percent(8765)).unwrap(), br#""87.65""# ); assert_eq!( - to_vec(&SignedDecimal::percent(-87654)).unwrap(), + to_json_vec(&SignedDecimal::percent(-87654)).unwrap(), br#""-876.54""# ); - assert_eq!(to_vec(&SignedDecimal::negative_one()).unwrap(), br#""-1""#); - assert_eq!(to_vec(&-SignedDecimal::percent(8)).unwrap(), br#""-0.08""#); + assert_eq!( + to_json_vec(&SignedDecimal::negative_one()).unwrap(), + br#""-1""# + ); + assert_eq!( + to_json_vec(&-SignedDecimal::percent(8)).unwrap(), + br#""-0.08""# + ); } #[test] fn signed_decimal_deserialize() { assert_eq!( - from_slice::(br#""0""#).unwrap(), + from_json::(br#""0""#).unwrap(), SignedDecimal::zero() ); assert_eq!( - from_slice::(br#""1""#).unwrap(), + from_json::(br#""1""#).unwrap(), SignedDecimal::one() ); assert_eq!( - from_slice::(br#""000""#).unwrap(), + from_json::(br#""000""#).unwrap(), SignedDecimal::zero() ); assert_eq!( - from_slice::(br#""001""#).unwrap(), + from_json::(br#""001""#).unwrap(), SignedDecimal::one() ); assert_eq!( - from_slice::(br#""0.08""#).unwrap(), + from_json::(br#""0.08""#).unwrap(), SignedDecimal::percent(8) ); assert_eq!( - from_slice::(br#""0.87""#).unwrap(), + from_json::(br#""0.87""#).unwrap(), SignedDecimal::percent(87) ); assert_eq!( - from_slice::(br#""8.76""#).unwrap(), + from_json::(br#""8.76""#).unwrap(), SignedDecimal::percent(876) ); assert_eq!( - from_slice::(br#""87.65""#).unwrap(), + from_json::(br#""87.65""#).unwrap(), SignedDecimal::percent(8765) ); // negative numbers assert_eq!( - from_slice::(br#""-0""#).unwrap(), + from_json::(br#""-0""#).unwrap(), SignedDecimal::zero() ); assert_eq!( - from_slice::(br#""-1""#).unwrap(), + from_json::(br#""-1""#).unwrap(), SignedDecimal::negative_one() ); assert_eq!( - from_slice::(br#""-001""#).unwrap(), + from_json::(br#""-001""#).unwrap(), SignedDecimal::negative_one() ); assert_eq!( - from_slice::(br#""-0.08""#).unwrap(), + from_json::(br#""-0.08""#).unwrap(), SignedDecimal::percent(-8) ); } diff --git a/packages/std/src/math/signed_decimal_256.rs b/packages/std/src/math/signed_decimal_256.rs index a9cd4d494c..9468729c02 100644 --- a/packages/std/src/math/signed_decimal_256.rs +++ b/packages/std/src/math/signed_decimal_256.rs @@ -907,7 +907,7 @@ impl<'de> de::Visitor<'de> for SignedDecimal256Visitor { #[cfg(test)] mod tests { use super::*; - use crate::{from_slice, to_vec}; + use crate::{from_json, to_json_vec}; use schemars::schema_for; fn dec(input: &str) -> SignedDecimal256 { @@ -2541,31 +2541,34 @@ mod tests { #[test] fn signed_decimal_256_serialize() { - assert_eq!(to_vec(&SignedDecimal256::zero()).unwrap(), br#""0""#); - assert_eq!(to_vec(&SignedDecimal256::one()).unwrap(), br#""1""#); - assert_eq!(to_vec(&SignedDecimal256::percent(8)).unwrap(), br#""0.08""#); + assert_eq!(to_json_vec(&SignedDecimal256::zero()).unwrap(), br#""0""#); + assert_eq!(to_json_vec(&SignedDecimal256::one()).unwrap(), br#""1""#); assert_eq!( - to_vec(&SignedDecimal256::percent(87)).unwrap(), + to_json_vec(&SignedDecimal256::percent(8)).unwrap(), + br#""0.08""# + ); + assert_eq!( + to_json_vec(&SignedDecimal256::percent(87)).unwrap(), br#""0.87""# ); assert_eq!( - to_vec(&SignedDecimal256::percent(876)).unwrap(), + to_json_vec(&SignedDecimal256::percent(876)).unwrap(), br#""8.76""# ); assert_eq!( - to_vec(&SignedDecimal256::percent(8765)).unwrap(), + to_json_vec(&SignedDecimal256::percent(8765)).unwrap(), br#""87.65""# ); assert_eq!( - to_vec(&SignedDecimal256::percent(-87654)).unwrap(), + to_json_vec(&SignedDecimal256::percent(-87654)).unwrap(), br#""-876.54""# ); assert_eq!( - to_vec(&SignedDecimal256::negative_one()).unwrap(), + to_json_vec(&SignedDecimal256::negative_one()).unwrap(), br#""-1""# ); assert_eq!( - to_vec(&-SignedDecimal256::percent(8)).unwrap(), + to_json_vec(&-SignedDecimal256::percent(8)).unwrap(), br#""-0.08""# ); } @@ -2573,54 +2576,54 @@ mod tests { #[test] fn signed_decimal_256_deserialize() { assert_eq!( - from_slice::(br#""0""#).unwrap(), + from_json::(br#""0""#).unwrap(), SignedDecimal256::zero() ); assert_eq!( - from_slice::(br#""1""#).unwrap(), + from_json::(br#""1""#).unwrap(), SignedDecimal256::one() ); assert_eq!( - from_slice::(br#""000""#).unwrap(), + from_json::(br#""000""#).unwrap(), SignedDecimal256::zero() ); assert_eq!( - from_slice::(br#""001""#).unwrap(), + from_json::(br#""001""#).unwrap(), SignedDecimal256::one() ); assert_eq!( - from_slice::(br#""0.08""#).unwrap(), + from_json::(br#""0.08""#).unwrap(), SignedDecimal256::percent(8) ); assert_eq!( - from_slice::(br#""0.87""#).unwrap(), + from_json::(br#""0.87""#).unwrap(), SignedDecimal256::percent(87) ); assert_eq!( - from_slice::(br#""8.76""#).unwrap(), + from_json::(br#""8.76""#).unwrap(), SignedDecimal256::percent(876) ); assert_eq!( - from_slice::(br#""87.65""#).unwrap(), + from_json::(br#""87.65""#).unwrap(), SignedDecimal256::percent(8765) ); // negative numbers assert_eq!( - from_slice::(br#""-0""#).unwrap(), + from_json::(br#""-0""#).unwrap(), SignedDecimal256::zero() ); assert_eq!( - from_slice::(br#""-1""#).unwrap(), + from_json::(br#""-1""#).unwrap(), SignedDecimal256::negative_one() ); assert_eq!( - from_slice::(br#""-001""#).unwrap(), + from_json::(br#""-001""#).unwrap(), SignedDecimal256::negative_one() ); assert_eq!( - from_slice::(br#""-0.08""#).unwrap(), + from_json::(br#""-0.08""#).unwrap(), SignedDecimal256::percent(-8) ); } From 39eda67f4ae0a9cc9e07f3f500f8238cf77f325f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 6 Sep 2023 09:50:10 +0200 Subject: [PATCH 0764/2372] Enable NaN canonicalization --- packages/vm/src/wasm_backend/engine.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/vm/src/wasm_backend/engine.rs b/packages/vm/src/wasm_backend/engine.rs index 0761e5968a..25eceee93c 100644 --- a/packages/vm/src/wasm_backend/engine.rs +++ b/packages/vm/src/wasm_backend/engine.rs @@ -54,6 +54,7 @@ pub fn make_compiling_engine(memory_limit: Option) -> Engine { #[cfg(not(feature = "cranelift"))] let mut compiler = Singlepass::default(); + compiler.canonicalize_nans(true); compiler.push_middleware(deterministic); compiler.push_middleware(metering); let mut engine = Engine::from(compiler); From 1a866462cef6b93a254b05c824626ebb6c30a4ef Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 6 Sep 2023 09:52:09 +0200 Subject: [PATCH 0765/2372] Allow floats in the Gatekeeper --- packages/vm/src/wasm_backend/gatekeeper.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vm/src/wasm_backend/gatekeeper.rs b/packages/vm/src/wasm_backend/gatekeeper.rs index bc9c770c94..5ee7e08cb7 100644 --- a/packages/vm/src/wasm_backend/gatekeeper.rs +++ b/packages/vm/src/wasm_backend/gatekeeper.rs @@ -57,7 +57,7 @@ impl Gatekeeper { impl Default for Gatekeeper { fn default() -> Self { Self::new(GatekeeperConfig { - allow_floats: false, + allow_floats: true, allow_feature_bulk_memory_operations: false, allow_feature_reference_types: false, allow_feature_simd: false, From 5213aad2a55a68d94b0c7624373e66d735f607aa Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 6 Sep 2023 10:07:14 +0200 Subject: [PATCH 0766/2372] Change float tests --- contracts/floaty/tests/integration.rs | 5 ++--- packages/check/tests/cosmwasm_check_tests.rs | 9 +++------ packages/vm/src/wasm_backend/compile.rs | 5 ++--- packages/vm/src/wasm_backend/gatekeeper.rs | 7 ++----- 4 files changed, 9 insertions(+), 17 deletions(-) diff --git a/contracts/floaty/tests/integration.rs b/contracts/floaty/tests/integration.rs index 5d3de04e58..593ae1d1e0 100644 --- a/contracts/floaty/tests/integration.rs +++ b/contracts/floaty/tests/integration.rs @@ -6,7 +6,6 @@ static WASM: &[u8] = include_bytes!("../target/wasm32-unknown-unknown/release/fl // static WASM: &[u8] = include_bytes!("../contract.wasm"); #[test] -#[should_panic(expected = "Float operator detected")] -fn instantiate_fails() { - let mut _deps = mock_instance(WASM, &[]); +fn validation_succeeds() { + mock_instance(WASM, &[]); } diff --git a/packages/check/tests/cosmwasm_check_tests.rs b/packages/check/tests/cosmwasm_check_tests.rs index 0c4301d683..751ac2ae0e 100644 --- a/packages/check/tests/cosmwasm_check_tests.rs +++ b/packages/check/tests/cosmwasm_check_tests.rs @@ -27,16 +27,13 @@ fn invalid_contract_check() -> Result<(), Box> { } #[test] -fn invalid_contract_check_float_operator() -> Result<(), Box> { +fn valid_contract_check_float_operator() -> Result<(), Box> { let mut cmd = Command::cargo_bin("cosmwasm-check")?; cmd.arg("../vm/testdata/floaty.wasm"); cmd.assert() - .failure() - .stdout(predicate::str::contains("Float operator detected")) - .stdout(predicate::str::contains( - "The use of floats is not supported", - )); + .success() + .stdout(predicate::str::contains("pass")); Ok(()) } diff --git a/packages/vm/src/wasm_backend/compile.rs b/packages/vm/src/wasm_backend/compile.rs index 38fd4966d2..d06a1ae055 100644 --- a/packages/vm/src/wasm_backend/compile.rs +++ b/packages/vm/src/wasm_backend/compile.rs @@ -16,9 +16,8 @@ mod tests { static CONTRACT: &[u8] = include_bytes!("../../testdata/floaty.wasm"); #[test] - fn contract_with_floats_fails_check() { + fn contract_with_floats_passes_check() { let engine = make_compiling_engine(None); - let err = compile(&engine, CONTRACT).unwrap_err(); - assert!(err.to_string().contains("Float operator detected:")); + assert!(compile(&engine, CONTRACT).is_ok()); } } diff --git a/packages/vm/src/wasm_backend/gatekeeper.rs b/packages/vm/src/wasm_backend/gatekeeper.rs index 5ee7e08cb7..fbc2ab8b02 100644 --- a/packages/vm/src/wasm_backend/gatekeeper.rs +++ b/packages/vm/src/wasm_backend/gatekeeper.rs @@ -727,7 +727,7 @@ mod tests { } #[test] - fn parser_floats_are_not_supported() { + fn parser_floats_are_supported() { let wasm = wat::parse_str( r#" (module @@ -744,10 +744,7 @@ mod tests { compiler.push_middleware(deterministic); let store = Store::new(compiler); let result = Module::new(&store, wasm); - assert!(result - .unwrap_err() - .to_string() - .contains("Float operator detected:")); + assert!(result.is_ok()); } #[test] From ca8f22530f14de1bdae2a0580539cdbda90e395d Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 6 Sep 2023 18:09:00 +0200 Subject: [PATCH 0767/2372] Replace floaty contract --- contracts/floaty/.vscode/settings.json | 6 + contracts/floaty/Cargo.lock | 26 +- contracts/floaty/Cargo.toml | 2 +- contracts/floaty/README.md | 10 + contracts/floaty/src/bin/schema.rs | 7 +- contracts/floaty/src/contract.rs | 85 ++----- contracts/floaty/src/errors.rs | 12 - contracts/floaty/src/floats.rs | 190 ++++++++++++++ contracts/floaty/src/instructions.rs | 338 +++++++++++++++++++++++++ contracts/floaty/src/lib.rs | 5 +- contracts/floaty/src/msg.rs | 27 +- 11 files changed, 600 insertions(+), 108 deletions(-) create mode 100644 contracts/floaty/.vscode/settings.json create mode 100644 contracts/floaty/README.md delete mode 100644 contracts/floaty/src/errors.rs create mode 100644 contracts/floaty/src/floats.rs create mode 100644 contracts/floaty/src/instructions.rs diff --git a/contracts/floaty/.vscode/settings.json b/contracts/floaty/.vscode/settings.json new file mode 100644 index 0000000000..11fee5dc5b --- /dev/null +++ b/contracts/floaty/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "rust-analyzer.cargo.target": "wasm32-unknown-unknown", + "rust-analyzer.cargo.extraEnv": { + "RUSTFLAGS": "-C target-feature=+nontrapping-fptoint" + } +} diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 37e0fc6474..2e0272a2a5 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -689,9 +689,9 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", + "rand_chacha", "schemars", "serde", - "thiserror", ] [[package]] @@ -1034,6 +1034,12 @@ dependencies = [ "spki", ] +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1060,9 +1066,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] @@ -1089,13 +1095,23 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.9" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + [[package]] name = "rand_core" version = "0.5.1" diff --git a/contracts/floaty/Cargo.toml b/contracts/floaty/Cargo.toml index 0aee91625c..63a78be956 100644 --- a/contracts/floaty/Cargo.toml +++ b/contracts/floaty/Cargo.toml @@ -35,7 +35,7 @@ cosmwasm-schema = { path = "../../packages/schema" } cosmwasm-std = { path = "../../packages/std" } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } -thiserror = "1.0.26" +rand_chacha = "0.3.1" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator"] } diff --git a/contracts/floaty/README.md b/contracts/floaty/README.md new file mode 100644 index 0000000000..882488413b --- /dev/null +++ b/contracts/floaty/README.md @@ -0,0 +1,10 @@ +# Floaty Contract + +This contract contains all WebAssembly floating point instructions. It is used for testing the floating point support. + +In order to compile it, you need a nightly version of Rust and enable +the `nontrapping-fptoint` target-feature like this: + +```sh +RUSTFLAGS="-C target-feature=+nontrapping-fptoint" cargo wasm +``` diff --git a/contracts/floaty/src/bin/schema.rs b/contracts/floaty/src/bin/schema.rs index b0a8a02b01..91a115b9d0 100644 --- a/contracts/floaty/src/bin/schema.rs +++ b/contracts/floaty/src/bin/schema.rs @@ -1,11 +1,12 @@ use cosmwasm_schema::write_api; -use floaty::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; +use cosmwasm_std::Empty; +use floaty::msg::QueryMsg; fn main() { write_api! { - instantiate: InstantiateMsg, + instantiate: Empty, query: QueryMsg, - execute: ExecuteMsg, + execute: Empty, } } diff --git a/contracts/floaty/src/contract.rs b/contracts/floaty/src/contract.rs index 157dcf5765..6c8c0a2e1e 100644 --- a/contracts/floaty/src/contract.rs +++ b/contracts/floaty/src/contract.rs @@ -1,74 +1,37 @@ use cosmwasm_std::{ - entry_point, from_json, to_json_binary, to_json_vec, AllBalanceResponse, BankMsg, Deps, - DepsMut, Env, Event, MessageInfo, QueryResponse, Response, StdError, StdResult, + entry_point, from_slice, to_binary, to_vec, AllBalanceResponse, BankMsg, Deps, DepsMut, Env, + Event, MessageInfo, QueryResponse, Response, StdError, StdResult, }; +use rand_chacha::rand_core::SeedableRng; -use crate::errors::HackError; -use crate::msg::{ExecuteMsg, InstantiateMsg, QueryMsg, VerifierResponse}; -use crate::state::{State, CONFIG_KEY}; +use crate::instructions::run_instruction; +use crate::msg::QueryMsg; #[entry_point] pub fn instantiate( - deps: DepsMut, + _deps: DepsMut, _env: Env, - info: MessageInfo, - msg: InstantiateMsg, -) -> Result { - deps.api.debug("here we go 🚀"); - - deps.storage.set( - CONFIG_KEY, - &to_json_vec(&State { - verifier: deps.api.addr_validate(&msg.verifier)?, - beneficiary: deps.api.addr_validate(&msg.beneficiary)?, - funder: info.sender, - })?, - ); - - // This adds some unrelated event attribute for testing purposes - Ok(Response::new().add_attribute("Let the", "hacking begin")) + _info: MessageInfo, + _msg: Empty, +) -> Result { + Ok(Response::default()) } #[entry_point] pub fn execute( - deps: DepsMut, - env: Env, - info: MessageInfo, - _msg: ExecuteMsg, -) -> Result { - let data = deps - .storage - .get(CONFIG_KEY) - .ok_or_else(|| StdError::not_found("State"))?; - let state: State = from_json(data)?; - - if info.sender == state.verifier { - let to_addr = state.beneficiary; - let balance = deps.querier.query_all_balances(env.contract.address)?; - - let mut fl = balance[0].amount.u128() as f64; - fl *= 0.3; - - let resp = Response::new() - .add_attribute("action", "release") - .add_attribute("destination", to_addr.clone()) - .add_attribute("foo", fl.to_string()) - .add_event(Event::new("hackatom").add_attribute("action", "release")) - .add_message(BankMsg::Send { - to_address: to_addr.into(), - amount: balance, - }) - .set_data([0xF0, 0x0B, 0xAA]); - Ok(resp) - } else { - Err(HackError::Unauthorized {}) - } + _deps: DepsMut, + _env: Env, + _info: MessageInfo, + _msg: Empty, +) -> Result { + Ok(Response::default()) } +#[entry_point] pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { match msg { - QueryMsg::Verifier {} => to_json_binary(&query_verifier(deps)?), - QueryMsg::OtherBalance { address } => to_json_binary(&query_other_balance(deps, address)?), + QueryMsg::Verifier {} => to_binary(&query_verifier(deps)?), + QueryMsg::OtherBalance { address } => to_binary(&query_other_balance(deps, address)?), } } @@ -77,15 +40,13 @@ fn query_verifier(deps: Deps) -> StdResult { .storage .get(CONFIG_KEY) .ok_or_else(|| StdError::not_found("State"))?; - let state: State = from_json(data)?; + let state: State = from_slice(&data)?; Ok(VerifierResponse { verifier: state.verifier.into(), }) } -fn query_other_balance(deps: Deps, address: String) -> StdResult { - let amount = deps.querier.query_all_balances(address)?; - Ok(AllBalanceResponse { amount }) + Ok(result) } #[cfg(test)] @@ -124,7 +85,7 @@ mod tests { // it worked, let's check the state let data = deps.storage.get(CONFIG_KEY).expect("no data stored"); - let state: State = from_json(data).unwrap(); + let state: State = from_slice(&data).unwrap(); assert_eq!(state, expected_state); } @@ -246,7 +207,7 @@ mod tests { // state should not change let data = deps.storage.get(CONFIG_KEY).expect("no data stored"); - let state: State = from_json(data).unwrap(); + let state: State = from_slice(&data).unwrap(); assert_eq!( state, State { diff --git a/contracts/floaty/src/errors.rs b/contracts/floaty/src/errors.rs deleted file mode 100644 index 7b46b00b63..0000000000 --- a/contracts/floaty/src/errors.rs +++ /dev/null @@ -1,12 +0,0 @@ -use cosmwasm_std::StdError; -use thiserror::Error; - -#[derive(Error, Debug, PartialEq)] -pub enum HackError { - #[error("{0}")] - /// this is needed so we can use `bucket.load(...)?` and have it auto-converted to the custom error - Std(#[from] StdError), - // this is whatever we want - #[error("Unauthorized")] - Unauthorized {}, -} diff --git a/contracts/floaty/src/floats.rs b/contracts/floaty/src/floats.rs new file mode 100644 index 0000000000..2777402d8b --- /dev/null +++ b/contracts/floaty/src/floats.rs @@ -0,0 +1,190 @@ +use rand_chacha::rand_core::RngCore; + +pub const INF_32: u32 = 0x7f800000; +pub const NEG_INF_32: u32 = 0xff800000; +pub const INF_64: u64 = 0x7ff0000000000000; +pub const NEG_INF_64: u64 = 0xfff0000000000000; + +const EXPONENT_MASK_32: u32 = 0x7f800000; +const EXPONENT_MASK_64: u64 = 0x7ff0000000000000; +const SIGN_MASK_32: u32 = 0x80000000; +const SIGN_MASK_64: u64 = 0x8000000000000000; +const MANTISSA_MASK_32: u32 = 0x007fffff; +const MANTISSA_MASK_64: u64 = 0x000fffffffffffff; + +pub fn random_f32(rng: &mut impl RngCore) -> f32 { + let decider = rng.next_u32(); + let bits = if decider < u32::MAX / 4 { + // 25% chance of being a NaN + random_nan_32(rng) + } else if decider < u32::MAX / 2 { + // 25% chance of being a subnormal + random_subnormal_32(rng) + } else if decider < u32::MAX / 4 * 3 { + // 25% chance of being an infinite + if decider % 2 == 0 { + INF_32 + } else { + NEG_INF_32 + } + } else { + // 25% chance of being a random bit pattern + rng.next_u32() + }; + f32::from_bits(bits) +} + +pub fn random_f64(rng: &mut impl RngCore) -> f64 { + let decider = rng.next_u64(); + let bits = if decider < u64::MAX / 4 { + // 25% chance of being a NaN + random_nan_64(rng) + } else if decider < u64::MAX / 2 { + // 25% chance of being a subnormal + random_subnormal_64(rng) + } else if decider < u64::MAX / 4 * 3 { + // 25% chance of being an infinite + if decider % 2 == 0 { + INF_64 + } else { + NEG_INF_64 + } + } else { + // 25% chance of being a random bit pattern + rng.next_u64() + }; + f64::from_bits(bits) +} + +/// Returns bits for a random NaN +pub fn random_nan_32(rng: &mut impl RngCore) -> u32 { + let mut rnd = rng.next_u32(); + if rnd == 0 { + // we don't want to return an infinity, so we just set the last bit to 1 + rnd = 1; + } + // Set the exponent to all 1s and remaining bits random + EXPONENT_MASK_32 | rnd +} + +/// Returns bits for a random NaN +pub fn random_nan_64(rng: &mut impl RngCore) -> u64 { + let mut rnd = rng.next_u64(); + if rnd == 0 { + // we don't want to return an infinity, so we just set the last bit to 1 + rnd = 1; + } + // Set the exponent to all 1s and remaining bits random + EXPONENT_MASK_64 | rnd +} + +/// Returns bits for a random subnormal +pub fn random_subnormal_32(rng: &mut impl RngCore) -> u32 { + // Set the exponent to all 0s and remaining bits random + let res = rng.next_u32() & (SIGN_MASK_32 | MANTISSA_MASK_32); + + if res == 0 { + // we don't want to return a zero, so we just return a fixed subnormal + SIGN_MASK_32 | MANTISSA_MASK_32 + } else { + res + } +} + +/// Returns bits for a random subnormal +pub fn random_subnormal_64(rng: &mut impl RngCore) -> u64 { + // Set the exponent to all 0s and remaining bits random + let res = rng.next_u64() & (SIGN_MASK_64 | MANTISSA_MASK_64); + + if res == 0 { + // we don't want to return a zero, so we just return a fixed subnormal + SIGN_MASK_64 | MANTISSA_MASK_64 + } else { + res + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Class { + Normal, + Subnormal, + Zero, + Infinite, + NaN, +} + +pub trait Classifier { + fn classify(&self) -> Class; +} + +impl Classifier for u32 { + fn classify(&self) -> Class { + let exponent = self & EXPONENT_MASK_32; + let mantissa = self & MANTISSA_MASK_32; + + match (exponent, mantissa) { + (0, 0) => Class::Zero, + (0, _) => Class::Subnormal, + (EXPONENT_MASK_32, 0) => Class::Infinite, + (EXPONENT_MASK_32, _) => Class::NaN, + _ => Class::Normal, + } + } +} + +impl Classifier for u64 { + fn classify(&self) -> Class { + let exponent = self & EXPONENT_MASK_64; + let mantissa = self & MANTISSA_MASK_64; + + match (exponent, mantissa) { + (0, 0) => Class::Zero, + (0, _) => Class::Subnormal, + (EXPONENT_MASK_64, 0) => Class::Infinite, + (EXPONENT_MASK_64, _) => Class::NaN, + _ => Class::Normal, + } + } +} + +#[cfg(test)] +mod tests { + use rand_chacha::rand_core::SeedableRng; + + use super::*; + + #[test] + fn test_constants() { + assert_eq!(INF_32, f32::INFINITY.to_bits()); + assert_eq!(NEG_INF_32, f32::NEG_INFINITY.to_bits()); + assert_eq!(INF_64, f64::INFINITY.to_bits()); + assert_eq!(NEG_INF_64, f64::NEG_INFINITY.to_bits()); + } + + #[test] + fn test_classify() { + // for 32-bit floats + assert_eq!((-0f32).to_bits().classify(), Class::Zero); + assert_eq!(0u32.classify(), Class::Zero); + assert_eq!(1f32.to_bits().classify(), Class::Normal); + assert_eq!(INF_32.classify(), Class::Infinite); + assert_eq!(NEG_INF_32.classify(), Class::Infinite); + + // for 64-bit floats + assert_eq!((-0f64).to_bits().classify(), Class::Zero); + assert_eq!(0u64.classify(), Class::Zero); + assert_eq!(1f64.to_bits().classify(), Class::Normal); + assert_eq!(INF_64.classify(), Class::Infinite); + assert_eq!(NEG_INF_64.classify(), Class::Infinite); + + // random floats + let mut rng = rand_chacha::ChaChaRng::seed_from_u64(123456); + for _ in 0..1000 { + assert_eq!(random_subnormal_32(&mut rng).classify(), Class::Subnormal); + assert_eq!(random_nan_32(&mut rng).classify(), Class::NaN); + + assert_eq!(random_subnormal_64(&mut rng).classify(), Class::Subnormal); + assert_eq!(random_nan_64(&mut rng).classify(), Class::NaN); + } + } +} diff --git a/contracts/floaty/src/instructions.rs b/contracts/floaty/src/instructions.rs new file mode 100644 index 0000000000..c7d4c251fb --- /dev/null +++ b/contracts/floaty/src/instructions.rs @@ -0,0 +1,338 @@ +use rand_chacha::rand_core::RngCore; + +use crate::floats::{random_f32, random_f64}; + +/// Not intended for direct usage +macro_rules! run_instr { + ($instr:expr, $input:ident : $input_ty:ty, $return_ty:ty) => {{ + let input: $input_ty = $input; + let ret: $return_ty; + unsafe { + core::arch::asm!("local.get {0}", $instr, "local.set {1}", in(local) input, out(local) ret) + }; + ret + }}; + ($instr:expr, $input1:ident : $input1_ty:ty, $input2:ident : $input2_ty:ty, $returnty:ty) => {{ + let input1: $input1_ty = $input1; + let input2: $input2_ty = $input2; + let ret: $returnty; + unsafe { + core::arch::asm!("local.get {0}", "local.get {1}", $instr, "local.set {2}", in(local) input1, in(local) input2, out(local) ret) + }; + ret + }}; +} +pub(crate) use run_instr; + +/// Helper to run a single WebAssembly instruction in a type-safe way +macro_rules! run { + ("f32.eq", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f32.eq", $input1 : f32, $input2 : f32, u32) + }; + ("f32.ne", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f32.ne", $input1 : f32, $input2 : f32, u32) + }; + ("f32.lt", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f32.lt", $input1 : f32, $input2 : f32, u32) + }; + ("f32.gt", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f32.gt", $input1 : f32, $input2 : f32, u32) + }; + ("f32.le", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f32.le", $input1 : f32, $input2 : f32, u32) + }; + ("f32.ge", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f32.ge", $input1 : f32, $input2 : f32, u32) + }; + ("f64.eq", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f64.eq", $input1 : f64, $input2 : f64, u32) + }; + ("f64.ne", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f64.ne", $input1 : f64, $input2 : f64, u32) + }; + ("f64.lt", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f64.lt", $input1 : f64, $input2 : f64, u32) + }; + ("f64.gt", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f64.gt", $input1 : f64, $input2 : f64, u32) + }; + ("f64.le", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f64.le", $input1 : f64, $input2 : f64, u32) + }; + ("f64.ge", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f64.ge", $input1 : f64, $input2 : f64, u32) + }; + // + ("f32.abs", $input:ident) => { + $crate::instructions::run_instr!("f32.abs", $input : f32, f32) + }; + ("f32.neg", $input:ident) => { + $crate::instructions::run_instr!("f32.neg", $input : f32, f32) + }; + ("f32.ceil", $input:ident) => { + $crate::instructions::run_instr!("f32.ceil", $input : f32, f32) + }; + ("f32.floor", $input:ident) => { + $crate::instructions::run_instr!("f32.floor", $input : f32, f32) + }; + ("f32.trunc", $input:ident) => { + $crate::instructions::run_instr!("f32.trunc", $input : f32, f32) + }; + ("f32.nearest", $input:ident) => { + $crate::instructions::run_instr!("f32.nearest", $input : f32, f32) + }; + ("f32.sqrt", $input:ident) => { + $crate::instructions::run_instr!("f32.sqrt", $input : f32, f32) + }; + ("f32.add", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f32.add", $input1 : f32, $input2 : f32, f32) + }; + ("f32.sub", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f32.sub", $input1 : f32, $input2 : f32, f32) + }; + ("f32.mul", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f32.mul", $input1 : f32, $input2 : f32, f32) + }; + ("f32.div", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f32.div", $input1 : f32, $input2 : f32, f32) + }; + ("f32.min", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f32.min", $input1 : f32, $input2 : f32, f32) + }; + ("f32.max", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f32.max", $input1 : f32, $input2 : f32, f32) + }; + ("f32.copysign", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f32.copysign", $input1 : f32, $input2 : f32, f32) + }; + ("f64.abs", $input:ident) => { + $crate::instructions::run_instr!("f64.abs", $input : f64, f64) + }; + ("f64.neg", $input:ident) => { + $crate::instructions::run_instr!("f64.neg", $input : f64, f64) + }; + ("f64.ceil", $input:ident) => { + $crate::instructions::run_instr!("f64.ceil", $input : f64, f64) + }; + ("f64.floor", $input:ident) => { + $crate::instructions::run_instr!("f64.floor", $input : f64, f64) + }; + ("f64.trunc", $input:ident) => { + $crate::instructions::run_instr!("f64.trunc", $input : f64, f64) + }; + ("f64.nearest", $input:ident) => { + $crate::instructions::run_instr!("f64.nearest", $input : f64, f64) + }; + ("f64.sqrt", $input:ident) => { + $crate::instructions::run_instr!("f64.sqrt", $input : f64, f64) + }; + ("f64.add", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f64.add", $input1 : f64, $input2 : f64, f64) + }; + ("f64.sub", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f64.sub", $input1 : f64, $input2 : f64, f64) + }; + ("f64.mul", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f64.mul", $input1 : f64, $input2 : f64, f64) + }; + ("f64.div", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f64.div", $input1 : f64, $input2 : f64, f64) + }; + ("f64.min", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f64.min", $input1 : f64, $input2 : f64, f64) + }; + ("f64.max", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f64.max", $input1 : f64, $input2 : f64, f64) + }; + ("f64.copysign", $input1:ident, $input2:ident) => { + $crate::instructions::run_instr!("f64.copysign", $input1 : f64, $input2 : f64, f64) + }; + // + ("i32.trunc_f32_s", $input:ident) => { + $crate::instructions::run_instr!("i32.trunc_f32_s", $input : f32, i32) + }; + ("i32.trunc_f32_u", $input:ident) => { + $crate::instructions::run_instr!("i32.trunc_f32_u", $input : f32, u32) + }; + ("i32.trunc_f64_s", $input:ident) => { + $crate::instructions::run_instr!("i32.trunc_f64_s", $input : f64, i32) + }; + ("i32.trunc_f64_u", $input:ident) => { + $crate::instructions::run_instr!("i32.trunc_f64_u", $input : f64, u32) + }; + // + ("i64.trunc_f32_s", $input:ident) => { + $crate::instructions::run_instr!("i64.trunc_f32_s", $input : f32, i64) + }; + ("i64.trunc_f32_u", $input:ident) => { + $crate::instructions::run_instr!("i64.trunc_f32_u", $input : f32, u64) + }; + ("i64.trunc_f64_s", $input:ident) => { + $crate::instructions::run_instr!("i64.trunc_f64_s", $input : f64, i64) + }; + ("i64.trunc_f64_u", $input:ident) => { + $crate::instructions::run_instr!("i64.trunc_f64_u", $input : f64, u64) + }; + // + ("f32.convert_i32_s", $input:ident) => { + $crate::instructions::run_instr!("f32.convert_i32_s", $input : i32, f32) + }; + ("f32.convert_i32_u", $input:ident) => { + $crate::instructions::run_instr!("f32.convert_i32_u", $input : u32, f32) + }; + ("f32.convert_i64_s", $input:ident) => { + $crate::instructions::run_instr!("f32.convert_i64_s", $input : i64, f32) + }; + ("f32.convert_i64_u", $input:ident) => { + $crate::instructions::run_instr!("f32.convert_i64_u", $input : u64, f32) + }; + ("f32.demote_f64", $input:ident) => { + $crate::instructions::run_instr!("f32.demote_f64", $input : f64, f32) + }; + ("f64.convert_i32_s", $input:ident) => { + $crate::instructions::run_instr!("f64.convert_i32_s", $input : i32, f64) + }; + ("f64.convert_i32_u", $input:ident) => { + $crate::instructions::run_instr!("f64.convert_i32_u", $input : u32, f64) + }; + ("f64.convert_i64_s", $input:ident) => { + $crate::instructions::run_instr!("f64.convert_i64_s", $input : i64, f64) + }; + ("f64.convert_i64_u", $input:ident) => { + $crate::instructions::run_instr!("f64.convert_i64_u", $input : u64, f64) + }; + ("f64.promote_f32", $input:ident) => { + $crate::instructions::run_instr!("f64.promote_f32", $input : f32, f64) + }; + // + ("i32.reinterpret_f32", $input:ident) => { + $crate::instructions::run_instr!("i32.reinterpret_f32", $input : f32, i32) + }; + ("i64.reinterpret_f64", $input:ident) => { + $crate::instructions::run_instr!("i64.reinterpret_f64", $input : f64, i64) + }; + ("f32.reinterpret_i32", $input:ident) => { + $crate::instructions::run_instr!("f32.reinterpret_i32", $input : u32, f32) + }; + ("f64.reinterpret_i64", $input:ident) => { + $crate::instructions::run_instr!("f64.reinterpret_i64", $input : u64, f64) + }; + // + ("i32.trunc_sat_f32_s", $input:ident) => { + $crate::instructions::run_instr!("i32.trunc_sat_f32_s", $input : f32, i32) + }; + ("i32.trunc_sat_f32_u", $input:ident) => { + $crate::instructions::run_instr!("i32.trunc_sat_f32_u", $input : f32, u32) + }; + ("i32.trunc_sat_f64_s", $input:ident) => { + $crate::instructions::run_instr!("i32.trunc_sat_f64_s", $input : f64, i32) + }; + ("i32.trunc_sat_f64_u", $input:ident) => { + $crate::instructions::run_instr!("i32.trunc_sat_f64_u", $input : f64, u32) + }; + ("i64.trunc_sat_f32_s", $input:ident) => { + $crate::instructions::run_instr!("i64.trunc_sat_f32_s", $input : f32, i64) + }; + ("i64.trunc_sat_f32_u", $input:ident) => { + $crate::instructions::run_instr!("i64.trunc_sat_f32_u", $input : f32, u64) + }; + ("i64.trunc_sat_f64_s", $input:ident) => { + $crate::instructions::run_instr!("i64.trunc_sat_f64_s", $input : f64, i64) + }; + ("i64.trunc_sat_f64_u", $input:ident) => { + $crate::instructions::run_instr!("i64.trunc_sat_f64_u", $input : f64, u64) + }; +} +pub(crate) use run; + +/// Runs the given instruction with random inputs +pub fn run_instruction(instr: &str, rng: &mut impl RngCore) -> u64 { + let a = random_f32(rng); + let b = random_f32(rng); + let c = random_f64(rng); + let d = random_f64(rng); + let e = rng.next_u32(); + let f = rng.next_u64(); + let g = rng.next_u32() as i32; + let h = rng.next_u64() as i64; + + match instr { + "f32.eq" => run!("f32.eq", a, b) as u64, + "f32.ne" => run!("f32.ne", a, b) as u64, + "f32.lt" => run!("f32.lt", a, b) as u64, + "f32.gt" => run!("f32.gt", a, b) as u64, + "f32.le" => run!("f32.le", a, b) as u64, + "f32.ge" => run!("f32.ge", a, b) as u64, + "f64.eq" => run!("f64.eq", c, d) as u64, + "f64.ne" => run!("f64.ne", c, d) as u64, + "f64.lt" => run!("f64.lt", c, d) as u64, + "f64.gt" => run!("f64.gt", c, d) as u64, + "f64.le" => run!("f64.le", c, d) as u64, + "f64.ge" => run!("f64.ge", c, d) as u64, + // + "f32.abs" => run!("f32.abs", a).to_bits() as u64, + "f32.neg" => run!("f32.neg", a).to_bits() as u64, + "f32.ceil" => run!("f32.ceil", a).to_bits() as u64, + "f32.floor" => run!("f32.floor", a).to_bits() as u64, + "f32.trunc" => run!("f32.trunc", a).to_bits() as u64, + "f32.nearest" => run!("f32.nearest", a).to_bits() as u64, + "f32.sqrt" => run!("f32.sqrt", a).to_bits() as u64, + "f32.add" => run!("f32.add", a, b).to_bits() as u64, + "f32.sub" => run!("f32.sub", a, b).to_bits() as u64, + "f32.mul" => run!("f32.mul", a, b).to_bits() as u64, + "f32.div" => run!("f32.div", a, b).to_bits() as u64, + "f32.min" => run!("f32.min", a, b).to_bits() as u64, + "f32.max" => run!("f32.max", a, b).to_bits() as u64, + "f32.copysign" => run!("f32.copysign", a, b).to_bits() as u64, + "f64.abs" => run!("f64.abs", c).to_bits(), + "f64.neg" => run!("f64.neg", c).to_bits(), + "f64.ceil" => run!("f64.ceil", c).to_bits(), + "f64.floor" => run!("f64.floor", c).to_bits(), + "f64.trunc" => run!("f64.trunc", c).to_bits(), + "f64.nearest" => run!("f64.nearest", c).to_bits(), + "f64.sqrt" => run!("f64.sqrt", c).to_bits(), + "f64.add" => run!("f64.add", c, d).to_bits(), + "f64.sub" => run!("f64.sub", c, d).to_bits(), + "f64.mul" => run!("f64.mul", c, d).to_bits(), + "f64.div" => run!("f64.div", c, d).to_bits(), + "f64.min" => run!("f64.min", c, d).to_bits(), + "f64.max" => run!("f64.max", c, d).to_bits(), + "f64.copysign" => run!("f64.copysign", c, d).to_bits(), + // + "i32.trunc_f32_s" => run!("i32.trunc_f32_s", a) as u64, + "i32.trunc_f32_u" => run!("i32.trunc_f32_u", a) as u64, + "i32.trunc_f64_s" => run!("i32.trunc_f64_s", c) as u64, + "i32.trunc_f64_u" => run!("i32.trunc_f64_u", c) as u64, + // + "i64.trunc_f32_s" => run!("i64.trunc_f32_s", a) as u64, + "i64.trunc_f32_u" => run!("i64.trunc_f32_u", a) as u64, + "i64.trunc_f64_s" => run!("i64.trunc_f64_s", c) as u64, + "i64.trunc_f64_u" => run!("i64.trunc_f64_u", c) as u64, + // + "f32.convert_i32_s" => run!("f32.convert_i32_s", g).to_bits() as u64, + "f32.convert_i32_u" => run!("f32.convert_i32_u", e).to_bits() as u64, + "f32.convert_i64_s" => run!("f32.convert_i64_s", h).to_bits() as u64, + "f32.convert_i64_u" => run!("f32.convert_i64_u", f).to_bits() as u64, + "f32.demote_f64" => run!("f32.demote_f64", c).to_bits() as u64, + "f64.convert_i32_s" => run!("f64.convert_i32_s", g).to_bits(), + "f64.convert_i32_u" => run!("f64.convert_i32_u", e).to_bits(), + "f64.convert_i64_s" => run!("f64.convert_i64_s", h).to_bits(), + "f64.convert_i64_u" => run!("f64.convert_i64_u", f).to_bits(), + "f64.promote_f32" => run!("f64.promote_f32", a).to_bits(), + // + "i32.reinterpret_f32" => run!("i32.reinterpret_f32", a) as u64, + "i64.reinterpret_f64" => run!("i64.reinterpret_f64", c) as u64, + "f32.reinterpret_i32" => run!("f32.reinterpret_i32", e).to_bits() as u64, + "f64.reinterpret_i64" => run!("f64.reinterpret_i64", f).to_bits(), + // + "i32.trunc_sat_f32_s" => run!("i32.trunc_sat_f32_s", a) as u64, + "i32.trunc_sat_f32_u" => run!("i32.trunc_sat_f32_u", a) as u64, + "i32.trunc_sat_f64_s" => run!("i32.trunc_sat_f64_s", c) as u64, + "i32.trunc_sat_f64_u" => run!("i32.trunc_sat_f64_u", c) as u64, + "i64.trunc_sat_f32_s" => run!("i64.trunc_sat_f32_s", a) as u64, + "i64.trunc_sat_f32_u" => run!("i64.trunc_sat_f32_u", a) as u64, + "i64.trunc_sat_f64_s" => run!("i64.trunc_sat_f64_s", c) as u64, + "i64.trunc_sat_f64_u" => run!("i64.trunc_sat_f64_u", c) as u64, + _ => panic!("unknown instruction: {}", instr), + } +} diff --git a/contracts/floaty/src/lib.rs b/contracts/floaty/src/lib.rs index 0573cc96c3..a5e0b30524 100644 --- a/contracts/floaty/src/lib.rs +++ b/contracts/floaty/src/lib.rs @@ -1,4 +1,7 @@ +#![feature(asm_experimental_arch)] + pub mod contract; -mod errors; +pub(crate) mod floats; +mod instructions; pub mod msg; pub mod state; diff --git a/contracts/floaty/src/msg.rs b/contracts/floaty/src/msg.rs index caa8fc4e3e..d9f078bf04 100644 --- a/contracts/floaty/src/msg.rs +++ b/contracts/floaty/src/msg.rs @@ -1,30 +1,9 @@ use cosmwasm_schema::{cw_serde, QueryResponses}; -#[cw_serde] -pub struct InstantiateMsg { - pub verifier: String, - pub beneficiary: String, -} - -#[cw_serde] -pub enum ExecuteMsg { - /// Releasing all funds in the contract to the beneficiary. This is the only "proper" action of this demo contract. - Release {}, -} - #[cw_serde] #[derive(QueryResponses)] pub enum QueryMsg { - /// returns a human-readable representation of the verifier - /// use to ensure query path works in integration tests - #[returns(VerifierResponse)] - Verifier {}, - /// This returns cosmwasm_std::AllBalanceResponse to demo use of the querier - #[returns(cosmwasm_std::AllBalanceResponse)] - OtherBalance { address: String }, -} - -#[cw_serde] -pub struct VerifierResponse { - pub verifier: String, + /// Performs a huge amount of floating point operations and hashes them together + #[returns(u64)] + Run { instruction: String, seed: u64 }, } From 77f1e1815ae745ef456335b414186e9d106d0b8f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 8 Sep 2023 10:54:40 +0200 Subject: [PATCH 0768/2372] Make floaty contract schema work --- contracts/floaty/src/contract.rs | 18 ++++++++---------- contracts/floaty/src/lib.rs | 3 ++- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/contracts/floaty/src/contract.rs b/contracts/floaty/src/contract.rs index 6c8c0a2e1e..a43af21765 100644 --- a/contracts/floaty/src/contract.rs +++ b/contracts/floaty/src/contract.rs @@ -4,6 +4,7 @@ use cosmwasm_std::{ }; use rand_chacha::rand_core::SeedableRng; +#[cfg(target_arch = "wasm32")] use crate::instructions::run_instruction; use crate::msg::QueryMsg; @@ -35,16 +36,13 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { } } -fn query_verifier(deps: Deps) -> StdResult { - let data = deps - .storage - .get(CONFIG_KEY) - .ok_or_else(|| StdError::not_found("State"))?; - let state: State = from_slice(&data)?; - Ok(VerifierResponse { - verifier: state.verifier.into(), - }) -} +fn query_floats(_deps: Deps, instruction: &str, seed: u64) -> StdResult { + let mut rng = rand_chacha::ChaChaRng::seed_from_u64(seed); + + #[cfg(target_arch = "wasm32")] + let result = run_instruction(instruction, &mut rng); + #[cfg(not(target_arch = "wasm32"))] + let result = panic!(); Ok(result) } diff --git a/contracts/floaty/src/lib.rs b/contracts/floaty/src/lib.rs index a5e0b30524..51fd622f96 100644 --- a/contracts/floaty/src/lib.rs +++ b/contracts/floaty/src/lib.rs @@ -1,7 +1,8 @@ -#![feature(asm_experimental_arch)] +#![cfg_attr(target_arch = "wasm32", feature(asm_experimental_arch))] pub mod contract; pub(crate) mod floats; +#[cfg(target_arch = "wasm32")] mod instructions; pub mod msg; pub mod state; From b6d6a47cf7b18269d8dbf8b59e01b090145cda15 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 8 Sep 2023 10:54:57 +0200 Subject: [PATCH 0769/2372] Update floaty schema --- contracts/floaty/schema/floaty.json | 119 +++--------------- contracts/floaty/schema/raw/execute.json | 18 +-- contracts/floaty/schema/raw/instantiate.json | 16 +-- contracts/floaty/schema/raw/query.json | 30 ++--- .../floaty/schema/raw/response_to_run.json | 7 ++ 5 files changed, 42 insertions(+), 148 deletions(-) create mode 100644 contracts/floaty/schema/raw/response_to_run.json diff --git a/contracts/floaty/schema/floaty.json b/contracts/floaty/schema/floaty.json index 62f697a59f..f8a069b82e 100644 --- a/contracts/floaty/schema/floaty.json +++ b/contracts/floaty/schema/floaty.json @@ -5,74 +5,40 @@ "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", "title": "InstantiateMsg", - "type": "object", - "required": [ - "beneficiary", - "verifier" - ], - "properties": { - "beneficiary": { - "type": "string" - }, - "verifier": { - "type": "string" - } - }, - "additionalProperties": false + "description": "An empty struct that serves as a placeholder in different places, such as contracts that don't set a custom message.\n\nIt is designed to be expressable in correct JSON and JSON Schema but contains no meaningful data. Previously we used enums without cases, but those cannot represented as valid JSON Schema (https://github.com/CosmWasm/cosmwasm/issues/451)", + "type": "object" }, "execute": { "$schema": "http://json-schema.org/draft-07/schema#", "title": "ExecuteMsg", - "oneOf": [ - { - "description": "Releasing all funds in the contract to the beneficiary. This is the only \"proper\" action of this demo contract.", - "type": "object", - "required": [ - "release" - ], - "properties": { - "release": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - } - ] + "description": "An empty struct that serves as a placeholder in different places, such as contracts that don't set a custom message.\n\nIt is designed to be expressable in correct JSON and JSON Schema but contains no meaningful data. Previously we used enums without cases, but those cannot represented as valid JSON Schema (https://github.com/CosmWasm/cosmwasm/issues/451)", + "type": "object" }, "query": { "$schema": "http://json-schema.org/draft-07/schema#", "title": "QueryMsg", "oneOf": [ { - "description": "returns a human-readable representation of the verifier use to ensure query path works in integration tests", - "type": "object", - "required": [ - "verifier" - ], - "properties": { - "verifier": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "This returns cosmwasm_std::AllBalanceResponse to demo use of the querier", + "description": "Performs a huge amount of floating point operations and hashes them together", "type": "object", "required": [ - "other_balance" + "run" ], "properties": { - "other_balance": { + "run": { "type": "object", "required": [ - "address" + "instruction", + "seed" ], "properties": { - "address": { + "instruction": { "type": "string" + }, + "seed": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 } }, "additionalProperties": false @@ -85,57 +51,12 @@ "migrate": null, "sudo": null, "responses": { - "other_balance": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "AllBalanceResponse", - "type": "object", - "required": [ - "amount" - ], - "properties": { - "amount": { - "description": "Returns all non-zero coins held by this account.", - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } - } - }, - "definitions": { - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } - }, - "verifier": { + "run": { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "VerifierResponse", - "type": "object", - "required": [ - "verifier" - ], - "properties": { - "verifier": { - "type": "string" - } - }, - "additionalProperties": false + "title": "uint64", + "type": "integer", + "format": "uint64", + "minimum": 0.0 } } } diff --git a/contracts/floaty/schema/raw/execute.json b/contracts/floaty/schema/raw/execute.json index 76967fd17b..bcd478d67e 100644 --- a/contracts/floaty/schema/raw/execute.json +++ b/contracts/floaty/schema/raw/execute.json @@ -1,20 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "title": "ExecuteMsg", - "oneOf": [ - { - "description": "Releasing all funds in the contract to the beneficiary. This is the only \"proper\" action of this demo contract.", - "type": "object", - "required": [ - "release" - ], - "properties": { - "release": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - } - ] + "description": "An empty struct that serves as a placeholder in different places, such as contracts that don't set a custom message.\n\nIt is designed to be expressable in correct JSON and JSON Schema but contains no meaningful data. Previously we used enums without cases, but those cannot represented as valid JSON Schema (https://github.com/CosmWasm/cosmwasm/issues/451)", + "type": "object" } diff --git a/contracts/floaty/schema/raw/instantiate.json b/contracts/floaty/schema/raw/instantiate.json index 8639103d34..5f6dfaf43c 100644 --- a/contracts/floaty/schema/raw/instantiate.json +++ b/contracts/floaty/schema/raw/instantiate.json @@ -1,18 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "title": "InstantiateMsg", - "type": "object", - "required": [ - "beneficiary", - "verifier" - ], - "properties": { - "beneficiary": { - "type": "string" - }, - "verifier": { - "type": "string" - } - }, - "additionalProperties": false + "description": "An empty struct that serves as a placeholder in different places, such as contracts that don't set a custom message.\n\nIt is designed to be expressable in correct JSON and JSON Schema but contains no meaningful data. Previously we used enums without cases, but those cannot represented as valid JSON Schema (https://github.com/CosmWasm/cosmwasm/issues/451)", + "type": "object" } diff --git a/contracts/floaty/schema/raw/query.json b/contracts/floaty/schema/raw/query.json index b96c3dfb8a..6ae73756ec 100644 --- a/contracts/floaty/schema/raw/query.json +++ b/contracts/floaty/schema/raw/query.json @@ -3,34 +3,26 @@ "title": "QueryMsg", "oneOf": [ { - "description": "returns a human-readable representation of the verifier use to ensure query path works in integration tests", + "description": "Performs a huge amount of floating point operations and hashes them together", "type": "object", "required": [ - "verifier" + "run" ], "properties": { - "verifier": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "This returns cosmwasm_std::AllBalanceResponse to demo use of the querier", - "type": "object", - "required": [ - "other_balance" - ], - "properties": { - "other_balance": { + "run": { "type": "object", "required": [ - "address" + "instruction", + "seed" ], "properties": { - "address": { + "instruction": { "type": "string" + }, + "seed": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 } }, "additionalProperties": false diff --git a/contracts/floaty/schema/raw/response_to_run.json b/contracts/floaty/schema/raw/response_to_run.json new file mode 100644 index 0000000000..7b729a7b96 --- /dev/null +++ b/contracts/floaty/schema/raw/response_to_run.json @@ -0,0 +1,7 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "uint64", + "type": "integer", + "format": "uint64", + "minimum": 0.0 +} From a2365da9cfbcc77f49d7735826334aac7c94cf47 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 8 Sep 2023 11:38:52 +0200 Subject: [PATCH 0770/2372] Add instruction list to floaty contract --- contracts/floaty/schema/floaty.json | 22 +++++ contracts/floaty/schema/raw/query.json | 14 ++++ .../schema/raw/response_to_instructions.json | 8 ++ contracts/floaty/src/contract.rs | 6 +- contracts/floaty/src/instructions.rs | 80 +++++++++++++++++++ contracts/floaty/src/lib.rs | 1 - contracts/floaty/src/msg.rs | 3 + 7 files changed, 130 insertions(+), 4 deletions(-) create mode 100644 contracts/floaty/schema/raw/response_to_instructions.json diff --git a/contracts/floaty/schema/floaty.json b/contracts/floaty/schema/floaty.json index f8a069b82e..5ed32155d3 100644 --- a/contracts/floaty/schema/floaty.json +++ b/contracts/floaty/schema/floaty.json @@ -18,6 +18,20 @@ "$schema": "http://json-schema.org/draft-07/schema#", "title": "QueryMsg", "oneOf": [ + { + "description": "Returns a list of all instructions", + "type": "object", + "required": [ + "instructions" + ], + "properties": { + "instructions": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, { "description": "Performs a huge amount of floating point operations and hashes them together", "type": "object", @@ -51,6 +65,14 @@ "migrate": null, "sudo": null, "responses": { + "instructions": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Array_of_String", + "type": "array", + "items": { + "type": "string" + } + }, "run": { "$schema": "http://json-schema.org/draft-07/schema#", "title": "uint64", diff --git a/contracts/floaty/schema/raw/query.json b/contracts/floaty/schema/raw/query.json index 6ae73756ec..a1ecb4c41a 100644 --- a/contracts/floaty/schema/raw/query.json +++ b/contracts/floaty/schema/raw/query.json @@ -2,6 +2,20 @@ "$schema": "http://json-schema.org/draft-07/schema#", "title": "QueryMsg", "oneOf": [ + { + "description": "Returns a list of all instructions", + "type": "object", + "required": [ + "instructions" + ], + "properties": { + "instructions": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, { "description": "Performs a huge amount of floating point operations and hashes them together", "type": "object", diff --git a/contracts/floaty/schema/raw/response_to_instructions.json b/contracts/floaty/schema/raw/response_to_instructions.json new file mode 100644 index 0000000000..4290cb1a21 --- /dev/null +++ b/contracts/floaty/schema/raw/response_to_instructions.json @@ -0,0 +1,8 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Array_of_String", + "type": "array", + "items": { + "type": "string" + } +} diff --git a/contracts/floaty/src/contract.rs b/contracts/floaty/src/contract.rs index a43af21765..8ce0f2e28b 100644 --- a/contracts/floaty/src/contract.rs +++ b/contracts/floaty/src/contract.rs @@ -6,7 +6,7 @@ use rand_chacha::rand_core::SeedableRng; #[cfg(target_arch = "wasm32")] use crate::instructions::run_instruction; -use crate::msg::QueryMsg; +use crate::{instructions::FLOAT_INSTRUCTIONS, msg::QueryMsg}; #[entry_point] pub fn instantiate( @@ -31,8 +31,8 @@ pub fn execute( #[entry_point] pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { match msg { - QueryMsg::Verifier {} => to_binary(&query_verifier(deps)?), - QueryMsg::OtherBalance { address } => to_binary(&query_other_balance(deps, address)?), + QueryMsg::Instructions {} => to_binary(&FLOAT_INSTRUCTIONS.to_vec()), + QueryMsg::Run { instruction, seed } => to_binary(&query_floats(deps, &instruction, seed)?), } } diff --git a/contracts/floaty/src/instructions.rs b/contracts/floaty/src/instructions.rs index c7d4c251fb..d95b903f22 100644 --- a/contracts/floaty/src/instructions.rs +++ b/contracts/floaty/src/instructions.rs @@ -246,6 +246,7 @@ macro_rules! run { pub(crate) use run; /// Runs the given instruction with random inputs +#[cfg(target_arch = "wasm32")] pub fn run_instruction(instr: &str, rng: &mut impl RngCore) -> u64 { let a = random_f32(rng); let b = random_f32(rng); @@ -336,3 +337,82 @@ pub fn run_instruction(instr: &str, rng: &mut impl RngCore) -> u64 { _ => panic!("unknown instruction: {}", instr), } } + +pub const FLOAT_INSTRUCTIONS: [&'static str; 70] = [ + "f32.eq", + "f32.ne", + "f32.lt", + "f32.gt", + "f32.le", + "f32.ge", + "f64.eq", + "f64.ne", + "f64.lt", + "f64.gt", + "f64.le", + "f64.ge", + // + "f32.abs", + "f32.neg", + "f32.ceil", + "f32.floor", + "f32.trunc", + "f32.nearest", + "f32.sqrt", + "f32.add", + "f32.sub", + "f32.mul", + "f32.div", + "f32.min", + "f32.max", + "f32.copysign", + "f64.abs", + "f64.neg", + "f64.ceil", + "f64.floor", + "f64.trunc", + "f64.nearest", + "f64.sqrt", + "f64.add", + "f64.sub", + "f64.mul", + "f64.div", + "f64.min", + "f64.max", + "f64.copysign", + // + "i32.trunc_f32_s", + "i32.trunc_f32_u", + "i32.trunc_f64_s", + "i32.trunc_f64_u", + // + "i64.trunc_f32_s", + "i64.trunc_f32_u", + "i64.trunc_f64_s", + "i64.trunc_f64_u", + // + "f32.convert_i32_s", + "f32.convert_i32_u", + "f32.convert_i64_s", + "f32.convert_i64_u", + "f32.demote_f64", + "f64.convert_i32_s", + "f64.convert_i32_u", + "f64.convert_i64_s", + "f64.convert_i64_u", + "f64.promote_f32", + // + "i32.reinterpret_f32", + "i64.reinterpret_f64", + "f32.reinterpret_i32", + "f64.reinterpret_i64", + // + "i32.trunc_sat_f32_s", + "i32.trunc_sat_f32_u", + "i32.trunc_sat_f64_s", + "i32.trunc_sat_f64_u", + "i64.trunc_sat_f32_s", + "i64.trunc_sat_f32_u", + "i64.trunc_sat_f64_s", + "i64.trunc_sat_f64_u", +]; diff --git a/contracts/floaty/src/lib.rs b/contracts/floaty/src/lib.rs index 51fd622f96..ba67016d30 100644 --- a/contracts/floaty/src/lib.rs +++ b/contracts/floaty/src/lib.rs @@ -2,7 +2,6 @@ pub mod contract; pub(crate) mod floats; -#[cfg(target_arch = "wasm32")] mod instructions; pub mod msg; pub mod state; diff --git a/contracts/floaty/src/msg.rs b/contracts/floaty/src/msg.rs index d9f078bf04..3e582c06b3 100644 --- a/contracts/floaty/src/msg.rs +++ b/contracts/floaty/src/msg.rs @@ -3,6 +3,9 @@ use cosmwasm_schema::{cw_serde, QueryResponses}; #[cw_serde] #[derive(QueryResponses)] pub enum QueryMsg { + /// Returns a list of all instructions + #[returns(Vec)] + Instructions {}, /// Performs a huge amount of floating point operations and hashes them together #[returns(u64)] Run { instruction: String, seed: u64 }, From 39a682f36c2019afd7eb34586614dc3e8ba457bf Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 8 Sep 2023 15:53:18 +0200 Subject: [PATCH 0771/2372] Add RandomArgsFor query to floaty --- contracts/floaty/schema/floaty.json | 240 +++++++- contracts/floaty/schema/raw/query.json | 107 +++- .../raw/response_to_random_args_for.json | 70 +++ .../floaty/schema/raw/response_to_run.json | 63 +- contracts/floaty/src/contract.rs | 27 +- contracts/floaty/src/floats.rs | 10 + contracts/floaty/src/instructions.rs | 563 +++++++++++------- contracts/floaty/src/msg.rs | 20 +- 8 files changed, 848 insertions(+), 252 deletions(-) create mode 100644 contracts/floaty/schema/raw/response_to_random_args_for.json diff --git a/contracts/floaty/schema/floaty.json b/contracts/floaty/schema/floaty.json index 5ed32155d3..6b5ca30370 100644 --- a/contracts/floaty/schema/floaty.json +++ b/contracts/floaty/schema/floaty.json @@ -18,6 +18,34 @@ "$schema": "http://json-schema.org/draft-07/schema#", "title": "QueryMsg", "oneOf": [ + { + "description": "Returns valid random arguments for the given instruction", + "type": "object", + "required": [ + "random_args_for" + ], + "properties": { + "random_args_for": { + "type": "object", + "required": [ + "instruction", + "seed" + ], + "properties": { + "instruction": { + "type": "string" + }, + "seed": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, { "description": "Returns a list of all instructions", "type": "object", @@ -33,7 +61,7 @@ "additionalProperties": false }, { - "description": "Performs a huge amount of floating point operations and hashes them together", + "description": "Runs the given instruction with the given arguments and returns the result", "type": "object", "required": [ "run" @@ -42,14 +70,78 @@ "run": { "type": "object", "required": [ - "instruction", - "seed" + "args", + "instruction" ], "properties": { + "args": { + "type": "array", + "items": { + "$ref": "#/definitions/Value" + } + }, "instruction": { "type": "string" - }, - "seed": { + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ], + "definitions": { + "Value": { + "oneOf": [ + { + "type": "object", + "required": [ + "u32" + ], + "properties": { + "u32": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "u64" + ], + "properties": { + "u64": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "f32" + ], + "properties": { + "f32": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "f64" + ], + "properties": { + "f64": { "type": "integer", "format": "uint64", "minimum": 0.0 @@ -57,10 +149,9 @@ }, "additionalProperties": false } - }, - "additionalProperties": false + ] } - ] + } }, "migrate": null, "sudo": null, @@ -73,12 +164,137 @@ "type": "string" } }, + "random_args_for": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Array_of_Value", + "type": "array", + "items": { + "$ref": "#/definitions/Value" + }, + "definitions": { + "Value": { + "oneOf": [ + { + "type": "object", + "required": [ + "u32" + ], + "properties": { + "u32": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "u64" + ], + "properties": { + "u64": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "f32" + ], + "properties": { + "f32": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "f64" + ], + "properties": { + "f64": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + }, + "additionalProperties": false + } + ] + } + } + }, "run": { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "uint64", - "type": "integer", - "format": "uint64", - "minimum": 0.0 + "title": "Value", + "oneOf": [ + { + "type": "object", + "required": [ + "u32" + ], + "properties": { + "u32": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "u64" + ], + "properties": { + "u64": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "f32" + ], + "properties": { + "f32": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "f64" + ], + "properties": { + "f64": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + }, + "additionalProperties": false + } + ] } } } diff --git a/contracts/floaty/schema/raw/query.json b/contracts/floaty/schema/raw/query.json index a1ecb4c41a..376f327931 100644 --- a/contracts/floaty/schema/raw/query.json +++ b/contracts/floaty/schema/raw/query.json @@ -2,6 +2,34 @@ "$schema": "http://json-schema.org/draft-07/schema#", "title": "QueryMsg", "oneOf": [ + { + "description": "Returns valid random arguments for the given instruction", + "type": "object", + "required": [ + "random_args_for" + ], + "properties": { + "random_args_for": { + "type": "object", + "required": [ + "instruction", + "seed" + ], + "properties": { + "instruction": { + "type": "string" + }, + "seed": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, { "description": "Returns a list of all instructions", "type": "object", @@ -17,7 +45,7 @@ "additionalProperties": false }, { - "description": "Performs a huge amount of floating point operations and hashes them together", + "description": "Runs the given instruction with the given arguments and returns the result", "type": "object", "required": [ "run" @@ -26,14 +54,78 @@ "run": { "type": "object", "required": [ - "instruction", - "seed" + "args", + "instruction" ], "properties": { + "args": { + "type": "array", + "items": { + "$ref": "#/definitions/Value" + } + }, "instruction": { "type": "string" - }, - "seed": { + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ], + "definitions": { + "Value": { + "oneOf": [ + { + "type": "object", + "required": [ + "u32" + ], + "properties": { + "u32": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "u64" + ], + "properties": { + "u64": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "f32" + ], + "properties": { + "f32": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "f64" + ], + "properties": { + "f64": { "type": "integer", "format": "uint64", "minimum": 0.0 @@ -41,8 +133,7 @@ }, "additionalProperties": false } - }, - "additionalProperties": false + ] } - ] + } } diff --git a/contracts/floaty/schema/raw/response_to_random_args_for.json b/contracts/floaty/schema/raw/response_to_random_args_for.json new file mode 100644 index 0000000000..4b9c97bed9 --- /dev/null +++ b/contracts/floaty/schema/raw/response_to_random_args_for.json @@ -0,0 +1,70 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Array_of_Value", + "type": "array", + "items": { + "$ref": "#/definitions/Value" + }, + "definitions": { + "Value": { + "oneOf": [ + { + "type": "object", + "required": [ + "u32" + ], + "properties": { + "u32": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "u64" + ], + "properties": { + "u64": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "f32" + ], + "properties": { + "f32": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "f64" + ], + "properties": { + "f64": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + }, + "additionalProperties": false + } + ] + } + } +} diff --git a/contracts/floaty/schema/raw/response_to_run.json b/contracts/floaty/schema/raw/response_to_run.json index 7b729a7b96..08c5730abf 100644 --- a/contracts/floaty/schema/raw/response_to_run.json +++ b/contracts/floaty/schema/raw/response_to_run.json @@ -1,7 +1,62 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "uint64", - "type": "integer", - "format": "uint64", - "minimum": 0.0 + "title": "Value", + "oneOf": [ + { + "type": "object", + "required": [ + "u32" + ], + "properties": { + "u32": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "u64" + ], + "properties": { + "u64": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "f32" + ], + "properties": { + "f32": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "f64" + ], + "properties": { + "f64": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + }, + "additionalProperties": false + } + ] } diff --git a/contracts/floaty/src/contract.rs b/contracts/floaty/src/contract.rs index 8ce0f2e28b..9ec2197075 100644 --- a/contracts/floaty/src/contract.rs +++ b/contracts/floaty/src/contract.rs @@ -6,7 +6,10 @@ use rand_chacha::rand_core::SeedableRng; #[cfg(target_arch = "wasm32")] use crate::instructions::run_instruction; -use crate::{instructions::FLOAT_INSTRUCTIONS, msg::QueryMsg}; +use crate::{ + instructions::{random_args_for, Value, FLOAT_INSTRUCTIONS}, + msg::QueryMsg, +}; #[entry_point] pub fn instantiate( @@ -29,22 +32,26 @@ pub fn execute( } #[entry_point] -pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { +pub fn query(_deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { match msg { + QueryMsg::RandomArgsFor { instruction, seed } => { + let mut rng = rand_chacha::ChaChaRng::seed_from_u64(seed); + to_binary(&random_args_for(&instruction, &mut rng)) + } QueryMsg::Instructions {} => to_binary(&FLOAT_INSTRUCTIONS.to_vec()), - QueryMsg::Run { instruction, seed } => to_binary(&query_floats(deps, &instruction, seed)?), + QueryMsg::Run { instruction, args } => to_binary(&query_run(&instruction, args)?), } } -fn query_floats(_deps: Deps, instruction: &str, seed: u64) -> StdResult { - let mut rng = rand_chacha::ChaChaRng::seed_from_u64(seed); - - #[cfg(target_arch = "wasm32")] - let result = run_instruction(instruction, &mut rng); +fn query_run(instruction: &str, args: Vec) -> StdResult { #[cfg(not(target_arch = "wasm32"))] - let result = panic!(); + panic!(); - Ok(result) + #[cfg(target_arch = "wasm32")] + { + let result = run_instruction(instruction, &args); + Ok(result) + } } #[cfg(test)] diff --git a/contracts/floaty/src/floats.rs b/contracts/floaty/src/floats.rs index 2777402d8b..7e921182b7 100644 --- a/contracts/floaty/src/floats.rs +++ b/contracts/floaty/src/floats.rs @@ -12,6 +12,13 @@ const SIGN_MASK_64: u64 = 0x8000000000000000; const MANTISSA_MASK_32: u32 = 0x007fffff; const MANTISSA_MASK_64: u64 = 0x000fffffffffffff; +/// Returns a random `f32`. +/// +/// We want to cover all classes of floats: NaNs, subnormals, infinities, and normal floats. +/// Because of that, we don't just generate a random `u32` and convert it to an `f32` +/// (that would make e.g. infinities highly unlikely) +/// Instead, we give each of these classes a probability of 25% and +/// then generate a random pattern within that class pub fn random_f32(rng: &mut impl RngCore) -> f32 { let decider = rng.next_u32(); let bits = if decider < u32::MAX / 4 { @@ -34,6 +41,9 @@ pub fn random_f32(rng: &mut impl RngCore) -> f32 { f32::from_bits(bits) } +/// Returns a random `f64`. +/// +/// See [`random_f32`] for more details. pub fn random_f64(rng: &mut impl RngCore) -> f64 { let decider = rng.next_u64(); let bits = if decider < u64::MAX / 4 { diff --git a/contracts/floaty/src/instructions.rs b/contracts/floaty/src/instructions.rs index d95b903f22..7bdfe23493 100644 --- a/contracts/floaty/src/instructions.rs +++ b/contracts/floaty/src/instructions.rs @@ -1,10 +1,11 @@ +use cosmwasm_schema::cw_serde; use rand_chacha::rand_core::RngCore; use crate::floats::{random_f32, random_f64}; /// Not intended for direct usage macro_rules! run_instr { - ($instr:expr, $input:ident : $input_ty:ty, $return_ty:ty) => {{ + ($instr:expr, $input:expr, $input_ty:ty, $return_ty:ty) => {{ let input: $input_ty = $input; let ret: $return_ty; unsafe { @@ -12,7 +13,7 @@ macro_rules! run_instr { }; ret }}; - ($instr:expr, $input1:ident : $input1_ty:ty, $input2:ident : $input2_ty:ty, $returnty:ty) => {{ + ($instr:expr, $input1:expr, $input1_ty:ty, $input2:expr, $input2_ty:ty, $returnty:ty) => {{ let input1: $input1_ty = $input1; let input2: $input2_ty = $input2; let ret: $returnty; @@ -26,314 +27,446 @@ pub(crate) use run_instr; /// Helper to run a single WebAssembly instruction in a type-safe way macro_rules! run { - ("f32.eq", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f32.eq", $input1 : f32, $input2 : f32, u32) + ("f32.eq", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f32.eq", $input1, f32, $input2, f32, u32) }; - ("f32.ne", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f32.ne", $input1 : f32, $input2 : f32, u32) + ("f32.ne", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f32.ne", $input1, f32, $input2, f32, u32) }; - ("f32.lt", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f32.lt", $input1 : f32, $input2 : f32, u32) + ("f32.lt", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f32.lt", $input1, f32, $input2, f32, u32) }; - ("f32.gt", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f32.gt", $input1 : f32, $input2 : f32, u32) + ("f32.gt", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f32.gt", $input1, f32, $input2, f32, u32) }; - ("f32.le", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f32.le", $input1 : f32, $input2 : f32, u32) + ("f32.le", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f32.le", $input1, f32, $input2, f32, u32) }; - ("f32.ge", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f32.ge", $input1 : f32, $input2 : f32, u32) + ("f32.ge", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f32.ge", $input1, f32, $input2, f32, u32) }; - ("f64.eq", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f64.eq", $input1 : f64, $input2 : f64, u32) + ("f64.eq", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f64.eq", $input1, f64, $input2, f64, u32) }; - ("f64.ne", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f64.ne", $input1 : f64, $input2 : f64, u32) + ("f64.ne", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f64.ne", $input1, f64, $input2, f64, u32) }; - ("f64.lt", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f64.lt", $input1 : f64, $input2 : f64, u32) + ("f64.lt", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f64.lt", $input1, f64, $input2, f64, u32) }; - ("f64.gt", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f64.gt", $input1 : f64, $input2 : f64, u32) + ("f64.gt", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f64.gt", $input1, f64, $input2, f64, u32) }; - ("f64.le", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f64.le", $input1 : f64, $input2 : f64, u32) + ("f64.le", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f64.le", $input1, f64, $input2, f64, u32) }; - ("f64.ge", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f64.ge", $input1 : f64, $input2 : f64, u32) + ("f64.ge", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f64.ge", $input1, f64, $input2, f64, u32) }; // - ("f32.abs", $input:ident) => { - $crate::instructions::run_instr!("f32.abs", $input : f32, f32) + ("f32.abs", $input:expr) => { + $crate::instructions::run_instr!("f32.abs", $input, f32, f32) }; - ("f32.neg", $input:ident) => { - $crate::instructions::run_instr!("f32.neg", $input : f32, f32) + ("f32.neg", $input:expr) => { + $crate::instructions::run_instr!("f32.neg", $input, f32, f32) }; - ("f32.ceil", $input:ident) => { - $crate::instructions::run_instr!("f32.ceil", $input : f32, f32) + ("f32.ceil", $input:expr) => { + $crate::instructions::run_instr!("f32.ceil", $input, f32, f32) }; - ("f32.floor", $input:ident) => { - $crate::instructions::run_instr!("f32.floor", $input : f32, f32) + ("f32.floor", $input:expr) => { + $crate::instructions::run_instr!("f32.floor", $input, f32, f32) }; - ("f32.trunc", $input:ident) => { - $crate::instructions::run_instr!("f32.trunc", $input : f32, f32) + ("f32.trunc", $input:expr) => { + $crate::instructions::run_instr!("f32.trunc", $input, f32, f32) }; - ("f32.nearest", $input:ident) => { - $crate::instructions::run_instr!("f32.nearest", $input : f32, f32) + ("f32.nearest", $input:expr) => { + $crate::instructions::run_instr!("f32.nearest", $input, f32, f32) }; - ("f32.sqrt", $input:ident) => { - $crate::instructions::run_instr!("f32.sqrt", $input : f32, f32) + ("f32.sqrt", $input:expr) => { + $crate::instructions::run_instr!("f32.sqrt", $input, f32, f32) }; - ("f32.add", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f32.add", $input1 : f32, $input2 : f32, f32) + ("f32.add", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f32.add", $input1, f32, $input2, f32, f32) }; - ("f32.sub", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f32.sub", $input1 : f32, $input2 : f32, f32) + ("f32.sub", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f32.sub", $input1, f32, $input2, f32, f32) }; - ("f32.mul", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f32.mul", $input1 : f32, $input2 : f32, f32) + ("f32.mul", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f32.mul", $input1, f32, $input2, f32, f32) }; - ("f32.div", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f32.div", $input1 : f32, $input2 : f32, f32) + ("f32.div", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f32.div", $input1, f32, $input2, f32, f32) }; - ("f32.min", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f32.min", $input1 : f32, $input2 : f32, f32) + ("f32.min", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f32.min", $input1, f32, $input2, f32, f32) }; - ("f32.max", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f32.max", $input1 : f32, $input2 : f32, f32) + ("f32.max", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f32.max", $input1, f32, $input2, f32, f32) }; - ("f32.copysign", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f32.copysign", $input1 : f32, $input2 : f32, f32) + ("f32.copysign", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f32.copysign", $input1, f32, $input2, f32, f32) }; - ("f64.abs", $input:ident) => { - $crate::instructions::run_instr!("f64.abs", $input : f64, f64) + ("f64.abs", $input:expr) => { + $crate::instructions::run_instr!("f64.abs", $input, f64, f64) }; - ("f64.neg", $input:ident) => { - $crate::instructions::run_instr!("f64.neg", $input : f64, f64) + ("f64.neg", $input:expr) => { + $crate::instructions::run_instr!("f64.neg", $input, f64, f64) }; - ("f64.ceil", $input:ident) => { - $crate::instructions::run_instr!("f64.ceil", $input : f64, f64) + ("f64.ceil", $input:expr) => { + $crate::instructions::run_instr!("f64.ceil", $input, f64, f64) }; - ("f64.floor", $input:ident) => { - $crate::instructions::run_instr!("f64.floor", $input : f64, f64) + ("f64.floor", $input:expr) => { + $crate::instructions::run_instr!("f64.floor", $input, f64, f64) }; - ("f64.trunc", $input:ident) => { - $crate::instructions::run_instr!("f64.trunc", $input : f64, f64) + ("f64.trunc", $input:expr) => { + $crate::instructions::run_instr!("f64.trunc", $input, f64, f64) }; - ("f64.nearest", $input:ident) => { - $crate::instructions::run_instr!("f64.nearest", $input : f64, f64) + ("f64.nearest", $input:expr) => { + $crate::instructions::run_instr!("f64.nearest", $input, f64, f64) }; - ("f64.sqrt", $input:ident) => { - $crate::instructions::run_instr!("f64.sqrt", $input : f64, f64) + ("f64.sqrt", $input:expr) => { + $crate::instructions::run_instr!("f64.sqrt", $input, f64, f64) }; - ("f64.add", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f64.add", $input1 : f64, $input2 : f64, f64) + ("f64.add", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f64.add", $input1, f64, $input2, f64, f64) }; - ("f64.sub", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f64.sub", $input1 : f64, $input2 : f64, f64) + ("f64.sub", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f64.sub", $input1, f64, $input2, f64, f64) }; - ("f64.mul", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f64.mul", $input1 : f64, $input2 : f64, f64) + ("f64.mul", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f64.mul", $input1, f64, $input2, f64, f64) }; - ("f64.div", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f64.div", $input1 : f64, $input2 : f64, f64) + ("f64.div", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f64.div", $input1, f64, $input2, f64, f64) }; - ("f64.min", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f64.min", $input1 : f64, $input2 : f64, f64) + ("f64.min", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f64.min", $input1, f64, $input2, f64, f64) }; - ("f64.max", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f64.max", $input1 : f64, $input2 : f64, f64) + ("f64.max", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f64.max", $input1, f64, $input2, f64, f64) }; - ("f64.copysign", $input1:ident, $input2:ident) => { - $crate::instructions::run_instr!("f64.copysign", $input1 : f64, $input2 : f64, f64) + ("f64.copysign", $input1:expr, $input2:expr) => { + $crate::instructions::run_instr!("f64.copysign", $input1, f64, $input2, f64, f64) }; // - ("i32.trunc_f32_s", $input:ident) => { - $crate::instructions::run_instr!("i32.trunc_f32_s", $input : f32, i32) + ("i32.trunc_f32_s", $input:expr) => { + $crate::instructions::run_instr!("i32.trunc_f32_s", $input, f32, i32) }; - ("i32.trunc_f32_u", $input:ident) => { - $crate::instructions::run_instr!("i32.trunc_f32_u", $input : f32, u32) + ("i32.trunc_f32_u", $input:expr) => { + $crate::instructions::run_instr!("i32.trunc_f32_u", $input, f32, u32) }; - ("i32.trunc_f64_s", $input:ident) => { - $crate::instructions::run_instr!("i32.trunc_f64_s", $input : f64, i32) + ("i32.trunc_f64_s", $input:expr) => { + $crate::instructions::run_instr!("i32.trunc_f64_s", $input, f64, i32) }; - ("i32.trunc_f64_u", $input:ident) => { - $crate::instructions::run_instr!("i32.trunc_f64_u", $input : f64, u32) + ("i32.trunc_f64_u", $input:expr) => { + $crate::instructions::run_instr!("i32.trunc_f64_u", $input, f64, u32) }; // - ("i64.trunc_f32_s", $input:ident) => { - $crate::instructions::run_instr!("i64.trunc_f32_s", $input : f32, i64) + ("i64.trunc_f32_s", $input:expr) => { + $crate::instructions::run_instr!("i64.trunc_f32_s", $input, f32, i64) }; - ("i64.trunc_f32_u", $input:ident) => { - $crate::instructions::run_instr!("i64.trunc_f32_u", $input : f32, u64) + ("i64.trunc_f32_u", $input:expr) => { + $crate::instructions::run_instr!("i64.trunc_f32_u", $input, f32, u64) }; - ("i64.trunc_f64_s", $input:ident) => { - $crate::instructions::run_instr!("i64.trunc_f64_s", $input : f64, i64) + ("i64.trunc_f64_s", $input:expr) => { + $crate::instructions::run_instr!("i64.trunc_f64_s", $input, f64, i64) }; - ("i64.trunc_f64_u", $input:ident) => { - $crate::instructions::run_instr!("i64.trunc_f64_u", $input : f64, u64) + ("i64.trunc_f64_u", $input:expr) => { + $crate::instructions::run_instr!("i64.trunc_f64_u", $input, f64, u64) }; // - ("f32.convert_i32_s", $input:ident) => { - $crate::instructions::run_instr!("f32.convert_i32_s", $input : i32, f32) + ("f32.convert_i32_s", $input:expr) => { + $crate::instructions::run_instr!("f32.convert_i32_s", $input, i32, f32) }; - ("f32.convert_i32_u", $input:ident) => { - $crate::instructions::run_instr!("f32.convert_i32_u", $input : u32, f32) + ("f32.convert_i32_u", $input:expr) => { + $crate::instructions::run_instr!("f32.convert_i32_u", $input, u32, f32) }; - ("f32.convert_i64_s", $input:ident) => { - $crate::instructions::run_instr!("f32.convert_i64_s", $input : i64, f32) + ("f32.convert_i64_s", $input:expr) => { + $crate::instructions::run_instr!("f32.convert_i64_s", $input, i64, f32) }; - ("f32.convert_i64_u", $input:ident) => { - $crate::instructions::run_instr!("f32.convert_i64_u", $input : u64, f32) + ("f32.convert_i64_u", $input:expr) => { + $crate::instructions::run_instr!("f32.convert_i64_u", $input, u64, f32) }; - ("f32.demote_f64", $input:ident) => { - $crate::instructions::run_instr!("f32.demote_f64", $input : f64, f32) + ("f32.demote_f64", $input:expr) => { + $crate::instructions::run_instr!("f32.demote_f64", $input, f64, f32) }; - ("f64.convert_i32_s", $input:ident) => { - $crate::instructions::run_instr!("f64.convert_i32_s", $input : i32, f64) + ("f64.convert_i32_s", $input:expr) => { + $crate::instructions::run_instr!("f64.convert_i32_s", $input, i32, f64) }; - ("f64.convert_i32_u", $input:ident) => { - $crate::instructions::run_instr!("f64.convert_i32_u", $input : u32, f64) + ("f64.convert_i32_u", $input:expr) => { + $crate::instructions::run_instr!("f64.convert_i32_u", $input, u32, f64) }; - ("f64.convert_i64_s", $input:ident) => { - $crate::instructions::run_instr!("f64.convert_i64_s", $input : i64, f64) + ("f64.convert_i64_s", $input:expr) => { + $crate::instructions::run_instr!("f64.convert_i64_s", $input, i64, f64) }; - ("f64.convert_i64_u", $input:ident) => { - $crate::instructions::run_instr!("f64.convert_i64_u", $input : u64, f64) + ("f64.convert_i64_u", $input:expr) => { + $crate::instructions::run_instr!("f64.convert_i64_u", $input, u64, f64) }; - ("f64.promote_f32", $input:ident) => { - $crate::instructions::run_instr!("f64.promote_f32", $input : f32, f64) + ("f64.promote_f32", $input:expr) => { + $crate::instructions::run_instr!("f64.promote_f32", $input, f32, f64) }; // - ("i32.reinterpret_f32", $input:ident) => { - $crate::instructions::run_instr!("i32.reinterpret_f32", $input : f32, i32) + ("i32.reinterpret_f32", $input:expr) => { + $crate::instructions::run_instr!("i32.reinterpret_f32", $input, f32, i32) }; - ("i64.reinterpret_f64", $input:ident) => { - $crate::instructions::run_instr!("i64.reinterpret_f64", $input : f64, i64) + ("i64.reinterpret_f64", $input:expr) => { + $crate::instructions::run_instr!("i64.reinterpret_f64", $input, f64, i64) }; - ("f32.reinterpret_i32", $input:ident) => { - $crate::instructions::run_instr!("f32.reinterpret_i32", $input : u32, f32) + ("f32.reinterpret_i32", $input:expr) => { + $crate::instructions::run_instr!("f32.reinterpret_i32", $input, u32, f32) }; - ("f64.reinterpret_i64", $input:ident) => { - $crate::instructions::run_instr!("f64.reinterpret_i64", $input : u64, f64) + ("f64.reinterpret_i64", $input:expr) => { + $crate::instructions::run_instr!("f64.reinterpret_i64", $input, u64, f64) }; // - ("i32.trunc_sat_f32_s", $input:ident) => { - $crate::instructions::run_instr!("i32.trunc_sat_f32_s", $input : f32, i32) + ("i32.trunc_sat_f32_s", $input:expr) => { + $crate::instructions::run_instr!("i32.trunc_sat_f32_s", $input, f32, i32) }; - ("i32.trunc_sat_f32_u", $input:ident) => { - $crate::instructions::run_instr!("i32.trunc_sat_f32_u", $input : f32, u32) + ("i32.trunc_sat_f32_u", $input:expr) => { + $crate::instructions::run_instr!("i32.trunc_sat_f32_u", $input, f32, u32) }; - ("i32.trunc_sat_f64_s", $input:ident) => { - $crate::instructions::run_instr!("i32.trunc_sat_f64_s", $input : f64, i32) + ("i32.trunc_sat_f64_s", $input:expr) => { + $crate::instructions::run_instr!("i32.trunc_sat_f64_s", $input, f64, i32) }; - ("i32.trunc_sat_f64_u", $input:ident) => { - $crate::instructions::run_instr!("i32.trunc_sat_f64_u", $input : f64, u32) + ("i32.trunc_sat_f64_u", $input:expr) => { + $crate::instructions::run_instr!("i32.trunc_sat_f64_u", $input, f64, u32) }; - ("i64.trunc_sat_f32_s", $input:ident) => { - $crate::instructions::run_instr!("i64.trunc_sat_f32_s", $input : f32, i64) + ("i64.trunc_sat_f32_s", $input:expr) => { + $crate::instructions::run_instr!("i64.trunc_sat_f32_s", $input, f32, i64) }; - ("i64.trunc_sat_f32_u", $input:ident) => { - $crate::instructions::run_instr!("i64.trunc_sat_f32_u", $input : f32, u64) + ("i64.trunc_sat_f32_u", $input:expr) => { + $crate::instructions::run_instr!("i64.trunc_sat_f32_u", $input, f32, u64) }; - ("i64.trunc_sat_f64_s", $input:ident) => { - $crate::instructions::run_instr!("i64.trunc_sat_f64_s", $input : f64, i64) + ("i64.trunc_sat_f64_s", $input:expr) => { + $crate::instructions::run_instr!("i64.trunc_sat_f64_s", $input, f64, i64) }; - ("i64.trunc_sat_f64_u", $input:ident) => { - $crate::instructions::run_instr!("i64.trunc_sat_f64_u", $input : f64, u64) + ("i64.trunc_sat_f64_u", $input:expr) => { + $crate::instructions::run_instr!("i64.trunc_sat_f64_u", $input, f64, u64) }; } pub(crate) use run; +#[cw_serde] +pub enum Value { + U32(u32), + U64(u64), + F32(u32), + F64(u64), +} + +impl Value { + pub fn u32(&self) -> u32 { + match self { + Self::U32(x) => *x, + v => panic!("expected u32, got {:?}", v), + } + } + + pub fn u64(&self) -> u64 { + match self { + Self::U64(x) => *x, + v => panic!("expected u64, got {:?}", v), + } + } + + pub fn f32(&self) -> f32 { + match self { + Self::F32(x) => f32::from_bits(*x), + v => panic!("expected f32, got {:?}", v), + } + } + + pub fn f64(&self) -> f64 { + match self { + Self::F64(x) => f64::from_bits(*x), + v => panic!("expected f64, got {:?}", v), + } + } +} + /// Runs the given instruction with random inputs #[cfg(target_arch = "wasm32")] -pub fn run_instruction(instr: &str, rng: &mut impl RngCore) -> u64 { +pub fn run_instruction(instr: &str, args: &[Value]) -> Value { + use Value::*; + + let arg1 = || args.get(0).unwrap(); + let arg2 = || args.get(0).unwrap(); + + match instr { + "f32.eq" => U32(run!("f32.eq", arg1().f32(), arg2().f32())), + "f32.ne" => U32(run!("f32.ne", arg1().f32(), arg2().f32())), + "f32.lt" => U32(run!("f32.lt", arg1().f32(), arg2().f32())), + "f32.gt" => U32(run!("f32.gt", arg1().f32(), arg2().f32())), + "f32.le" => U32(run!("f32.le", arg1().f32(), arg2().f32())), + "f32.ge" => U32(run!("f32.ge", arg1().f32(), arg2().f32())), + "f64.eq" => U32(run!("f64.eq", arg1().f64(), arg2().f64())), + "f64.ne" => U32(run!("f64.ne", arg1().f64(), arg2().f64())), + "f64.lt" => U32(run!("f64.lt", arg1().f64(), arg2().f64())), + "f64.gt" => U32(run!("f64.gt", arg1().f64(), arg2().f64())), + "f64.le" => U32(run!("f64.le", arg1().f64(), arg2().f64())), + "f64.ge" => U32(run!("f64.ge", arg1().f64(), arg2().f64())), + // + "f32.abs" => U32(run!("f32.abs", arg1().f32()).to_bits()), + "f32.neg" => U32(run!("f32.neg", arg1().f32()).to_bits()), + "f32.ceil" => U32(run!("f32.ceil", arg1().f32()).to_bits()), + "f32.floor" => U32(run!("f32.floor", arg1().f32()).to_bits()), + "f32.trunc" => U32(run!("f32.trunc", arg1().f32()).to_bits()), + "f32.nearest" => U32(run!("f32.nearest", arg1().f32()).to_bits()), + "f32.sqrt" => U32(run!("f32.sqrt", arg1().f32()).to_bits()), + "f32.add" => U32(run!("f32.add", arg1().f32(), arg2().f32()).to_bits()), + "f32.sub" => U32(run!("f32.sub", arg1().f32(), arg2().f32()).to_bits()), + "f32.mul" => U32(run!("f32.mul", arg1().f32(), arg2().f32()).to_bits()), + "f32.div" => U32(run!("f32.div", arg1().f32(), arg2().f32()).to_bits()), + "f32.min" => U32(run!("f32.min", arg1().f32(), arg2().f32()).to_bits()), + "f32.max" => U32(run!("f32.max", arg1().f32(), arg2().f32()).to_bits()), + "f32.copysign" => U32(run!("f32.copysign", arg1().f32(), arg2().f32()).to_bits()), + "f64.abs" => U64(run!("f64.abs", arg1().f64()).to_bits()), + "f64.neg" => U64(run!("f64.neg", arg1().f64()).to_bits()), + "f64.ceil" => U64(run!("f64.ceil", arg1().f64()).to_bits()), + "f64.floor" => U64(run!("f64.floor", arg1().f64()).to_bits()), + "f64.trunc" => U64(run!("f64.trunc", arg1().f64()).to_bits()), + "f64.nearest" => U64(run!("f64.nearest", arg1().f64()).to_bits()), + "f64.sqrt" => U64(run!("f64.sqrt", arg1().f64()).to_bits()), + "f64.add" => U64(run!("f64.add", arg1().f64(), arg2().f64()).to_bits()), + "f64.sub" => U64(run!("f64.sub", arg1().f64(), arg2().f64()).to_bits()), + "f64.mul" => U64(run!("f64.mul", arg1().f64(), arg2().f64()).to_bits()), + "f64.div" => U64(run!("f64.div", arg1().f64(), arg2().f64()).to_bits()), + "f64.min" => U64(run!("f64.min", arg1().f64(), arg2().f64()).to_bits()), + "f64.max" => U64(run!("f64.max", arg1().f64(), arg2().f64()).to_bits()), + "f64.copysign" => U64(run!("f64.copysign", arg1().f64(), arg2().f64()).to_bits()), + // + "i32.trunc_f32_s" => U32(run!("i32.trunc_f32_s", arg1().f32()) as u32), + "i32.trunc_f32_u" => U32(run!("i32.trunc_f32_u", arg1().f32())), + "i32.trunc_f64_s" => U32(run!("i32.trunc_f64_s", arg1().f64()) as u32), + "i32.trunc_f64_u" => U32(run!("i32.trunc_f64_u", arg1().f64())), + // + "i64.trunc_f32_s" => U64(run!("i64.trunc_f32_s", arg1().f32()) as u64), + "i64.trunc_f32_u" => U64(run!("i64.trunc_f32_u", arg1().f32())), + "i64.trunc_f64_s" => U64(run!("i64.trunc_f64_s", arg1().f64()) as u64), + "i64.trunc_f64_u" => U64(run!("i64.trunc_f64_u", arg1().f64())), + // + "f32.convert_i32_s" => U32(run!("f32.convert_i32_s", arg1().u32() as i32).to_bits()), + "f32.convert_i32_u" => U32(run!("f32.convert_i32_u", arg1().u32()).to_bits()), + "f32.convert_i64_s" => U32(run!("f32.convert_i64_s", arg1().u64() as i64).to_bits()), + "f32.convert_i64_u" => U32(run!("f32.convert_i64_u", arg1().u64()).to_bits()), + "f32.demote_f64" => U32(run!("f32.demote_f64", arg1().f64()).to_bits()), + "f64.convert_i32_s" => U64(run!("f64.convert_i32_s", arg1().u32() as i32).to_bits()), + "f64.convert_i32_u" => U64(run!("f64.convert_i32_u", arg1().u32()).to_bits()), + "f64.convert_i64_s" => U64(run!("f64.convert_i64_s", arg1().u64() as i64).to_bits()), + "f64.convert_i64_u" => U64(run!("f64.convert_i64_u", arg1().u64()).to_bits()), + "f64.promote_f32" => U64(run!("f64.promote_f32", arg1().f32()).to_bits()), + // + "i32.reinterpret_f32" => U32(run!("i32.reinterpret_f32", arg1().f32()) as u32), + "i64.reinterpret_f64" => U64(run!("i64.reinterpret_f64", arg1().f64()) as u64), + "f32.reinterpret_i32" => U32(run!("f32.reinterpret_i32", arg1().u32()).to_bits() as u32), + "f64.reinterpret_i64" => U64(run!("f64.reinterpret_i64", arg1().u64()).to_bits() as u64), + // + "i32.trunc_sat_f32_s" => U32(run!("i32.trunc_sat_f32_s", arg1().f32()) as u32), + "i32.trunc_sat_f32_u" => U32(run!("i32.trunc_sat_f32_u", arg1().f32()) as u32), + "i32.trunc_sat_f64_s" => U32(run!("i32.trunc_sat_f64_s", arg1().f64()) as u32), + "i32.trunc_sat_f64_u" => U32(run!("i32.trunc_sat_f64_u", arg1().f64()) as u32), + "i64.trunc_sat_f32_s" => U64(run!("i64.trunc_sat_f32_s", arg1().f32()) as u64), + "i64.trunc_sat_f32_u" => U64(run!("i64.trunc_sat_f32_u", arg1().f32()) as u64), + "i64.trunc_sat_f64_s" => U64(run!("i64.trunc_sat_f64_s", arg1().f64()) as u64), + "i64.trunc_sat_f64_u" => U64(run!("i64.trunc_sat_f64_u", arg1().f64()) as u64), + _ => panic!("unknown instruction: {}", instr), + } +} + +pub fn random_args_for(instr: &str, rng: &mut impl RngCore) -> Vec { let a = random_f32(rng); let b = random_f32(rng); let c = random_f64(rng); let d = random_f64(rng); let e = rng.next_u32(); let f = rng.next_u64(); - let g = rng.next_u32() as i32; - let h = rng.next_u64() as i64; + + use Value::*; + + let f32x2 = vec![F32(a.to_bits()), F32(b.to_bits())]; + let f64x2 = vec![F64(c.to_bits()), F64(d.to_bits())]; + let f32 = vec![F32(a.to_bits())]; + let f64 = vec![F64(c.to_bits())]; + let u32 = vec![U32(e)]; + let u64 = vec![U64(f)]; match instr { - "f32.eq" => run!("f32.eq", a, b) as u64, - "f32.ne" => run!("f32.ne", a, b) as u64, - "f32.lt" => run!("f32.lt", a, b) as u64, - "f32.gt" => run!("f32.gt", a, b) as u64, - "f32.le" => run!("f32.le", a, b) as u64, - "f32.ge" => run!("f32.ge", a, b) as u64, - "f64.eq" => run!("f64.eq", c, d) as u64, - "f64.ne" => run!("f64.ne", c, d) as u64, - "f64.lt" => run!("f64.lt", c, d) as u64, - "f64.gt" => run!("f64.gt", c, d) as u64, - "f64.le" => run!("f64.le", c, d) as u64, - "f64.ge" => run!("f64.ge", c, d) as u64, + "f32.eq" => f32x2, + "f32.ne" => f32x2, + "f32.lt" => f32x2, + "f32.gt" => f32x2, + "f32.le" => f32x2, + "f32.ge" => f32x2, + "f64.eq" => f64x2, + "f64.ne" => f64x2, + "f64.lt" => f64x2, + "f64.gt" => f64x2, + "f64.le" => f64x2, + "f64.ge" => f64x2, // - "f32.abs" => run!("f32.abs", a).to_bits() as u64, - "f32.neg" => run!("f32.neg", a).to_bits() as u64, - "f32.ceil" => run!("f32.ceil", a).to_bits() as u64, - "f32.floor" => run!("f32.floor", a).to_bits() as u64, - "f32.trunc" => run!("f32.trunc", a).to_bits() as u64, - "f32.nearest" => run!("f32.nearest", a).to_bits() as u64, - "f32.sqrt" => run!("f32.sqrt", a).to_bits() as u64, - "f32.add" => run!("f32.add", a, b).to_bits() as u64, - "f32.sub" => run!("f32.sub", a, b).to_bits() as u64, - "f32.mul" => run!("f32.mul", a, b).to_bits() as u64, - "f32.div" => run!("f32.div", a, b).to_bits() as u64, - "f32.min" => run!("f32.min", a, b).to_bits() as u64, - "f32.max" => run!("f32.max", a, b).to_bits() as u64, - "f32.copysign" => run!("f32.copysign", a, b).to_bits() as u64, - "f64.abs" => run!("f64.abs", c).to_bits(), - "f64.neg" => run!("f64.neg", c).to_bits(), - "f64.ceil" => run!("f64.ceil", c).to_bits(), - "f64.floor" => run!("f64.floor", c).to_bits(), - "f64.trunc" => run!("f64.trunc", c).to_bits(), - "f64.nearest" => run!("f64.nearest", c).to_bits(), - "f64.sqrt" => run!("f64.sqrt", c).to_bits(), - "f64.add" => run!("f64.add", c, d).to_bits(), - "f64.sub" => run!("f64.sub", c, d).to_bits(), - "f64.mul" => run!("f64.mul", c, d).to_bits(), - "f64.div" => run!("f64.div", c, d).to_bits(), - "f64.min" => run!("f64.min", c, d).to_bits(), - "f64.max" => run!("f64.max", c, d).to_bits(), - "f64.copysign" => run!("f64.copysign", c, d).to_bits(), + "f32.abs" => f32, + "f32.neg" => f32, + "f32.ceil" => f32, + "f32.floor" => f32, + "f32.trunc" => f32, + "f32.nearest" => f32, + "f32.sqrt" => f32, + "f32.add" => f32x2, + "f32.sub" => f32x2, + "f32.mul" => f32x2, + "f32.div" => f32x2, + "f32.min" => f32x2, + "f32.max" => f32x2, + "f32.copysign" => f32x2, + "f64.abs" => f64, + "f64.neg" => f64, + "f64.ceil" => f64, + "f64.floor" => f64, + "f64.trunc" => f64, + "f64.nearest" => f64, + "f64.sqrt" => f64, + "f64.add" => f64x2, + "f64.sub" => f64x2, + "f64.mul" => f64x2, + "f64.div" => f64x2, + "f64.min" => f64x2, + "f64.max" => f64x2, + "f64.copysign" => f64x2, // - "i32.trunc_f32_s" => run!("i32.trunc_f32_s", a) as u64, - "i32.trunc_f32_u" => run!("i32.trunc_f32_u", a) as u64, - "i32.trunc_f64_s" => run!("i32.trunc_f64_s", c) as u64, - "i32.trunc_f64_u" => run!("i32.trunc_f64_u", c) as u64, + "i32.trunc_f32_s" => f32, + "i32.trunc_f32_u" => f32, + "i32.trunc_f64_s" => f64, + "i32.trunc_f64_u" => f64, // - "i64.trunc_f32_s" => run!("i64.trunc_f32_s", a) as u64, - "i64.trunc_f32_u" => run!("i64.trunc_f32_u", a) as u64, - "i64.trunc_f64_s" => run!("i64.trunc_f64_s", c) as u64, - "i64.trunc_f64_u" => run!("i64.trunc_f64_u", c) as u64, + "i64.trunc_f32_s" => f32, + "i64.trunc_f32_u" => f32, + "i64.trunc_f64_s" => f64, + "i64.trunc_f64_u" => f64, // - "f32.convert_i32_s" => run!("f32.convert_i32_s", g).to_bits() as u64, - "f32.convert_i32_u" => run!("f32.convert_i32_u", e).to_bits() as u64, - "f32.convert_i64_s" => run!("f32.convert_i64_s", h).to_bits() as u64, - "f32.convert_i64_u" => run!("f32.convert_i64_u", f).to_bits() as u64, - "f32.demote_f64" => run!("f32.demote_f64", c).to_bits() as u64, - "f64.convert_i32_s" => run!("f64.convert_i32_s", g).to_bits(), - "f64.convert_i32_u" => run!("f64.convert_i32_u", e).to_bits(), - "f64.convert_i64_s" => run!("f64.convert_i64_s", h).to_bits(), - "f64.convert_i64_u" => run!("f64.convert_i64_u", f).to_bits(), - "f64.promote_f32" => run!("f64.promote_f32", a).to_bits(), + "f32.convert_i32_s" => u32, + "f32.convert_i32_u" => u32, + "f32.convert_i64_s" => u64, + "f32.convert_i64_u" => u64, + "f32.demote_f64" => f64, + "f64.convert_i32_s" => u32, + "f64.convert_i32_u" => u32, + "f64.convert_i64_s" => u64, + "f64.convert_i64_u" => u64, + "f64.promote_f32" => f32, // - "i32.reinterpret_f32" => run!("i32.reinterpret_f32", a) as u64, - "i64.reinterpret_f64" => run!("i64.reinterpret_f64", c) as u64, - "f32.reinterpret_i32" => run!("f32.reinterpret_i32", e).to_bits() as u64, - "f64.reinterpret_i64" => run!("f64.reinterpret_i64", f).to_bits(), + "i32.reinterpret_f32" => f32, + "i64.reinterpret_f64" => f64, + "f32.reinterpret_i32" => u32, + "f64.reinterpret_i64" => u64, // - "i32.trunc_sat_f32_s" => run!("i32.trunc_sat_f32_s", a) as u64, - "i32.trunc_sat_f32_u" => run!("i32.trunc_sat_f32_u", a) as u64, - "i32.trunc_sat_f64_s" => run!("i32.trunc_sat_f64_s", c) as u64, - "i32.trunc_sat_f64_u" => run!("i32.trunc_sat_f64_u", c) as u64, - "i64.trunc_sat_f32_s" => run!("i64.trunc_sat_f32_s", a) as u64, - "i64.trunc_sat_f32_u" => run!("i64.trunc_sat_f32_u", a) as u64, - "i64.trunc_sat_f64_s" => run!("i64.trunc_sat_f64_s", c) as u64, - "i64.trunc_sat_f64_u" => run!("i64.trunc_sat_f64_u", c) as u64, + "i32.trunc_sat_f32_s" => f32, + "i32.trunc_sat_f32_u" => f32, + "i32.trunc_sat_f64_s" => f64, + "i32.trunc_sat_f64_u" => f64, + "i64.trunc_sat_f32_s" => f32, + "i64.trunc_sat_f32_u" => f32, + "i64.trunc_sat_f64_s" => f64, + "i64.trunc_sat_f64_u" => f64, _ => panic!("unknown instruction: {}", instr), } } diff --git a/contracts/floaty/src/msg.rs b/contracts/floaty/src/msg.rs index 3e582c06b3..6baa9a1efe 100644 --- a/contracts/floaty/src/msg.rs +++ b/contracts/floaty/src/msg.rs @@ -1,12 +1,26 @@ use cosmwasm_schema::{cw_serde, QueryResponses}; +use crate::instructions::Value; + +#[cw_serde] +pub enum ValueType { + Float, + Int, +} + #[cw_serde] #[derive(QueryResponses)] pub enum QueryMsg { + /// Returns valid random arguments for the given instruction + #[returns(Vec)] + RandomArgsFor { instruction: String, seed: u64 }, /// Returns a list of all instructions #[returns(Vec)] Instructions {}, - /// Performs a huge amount of floating point operations and hashes them together - #[returns(u64)] - Run { instruction: String, seed: u64 }, + /// Runs the given instruction with the given arguments and returns the result + #[returns(Value)] + Run { + instruction: String, + args: Vec, + }, } From 3413dd0437ff62b7740251b82788edc2bd5fb51a Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 8 Sep 2023 17:06:04 +0200 Subject: [PATCH 0772/2372] Add test running all float instructions --- packages/vm/src/calls.rs | 95 ++++++++++++++++++++++++++- packages/vm/testdata/floaty_2.0.wasm | Bin 0 -> 2022223 bytes 2 files changed, 93 insertions(+), 2 deletions(-) create mode 100755 packages/vm/testdata/floaty_2.0.wasm diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index dc24a11a6f..84dded29bb 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -590,11 +590,15 @@ where #[cfg(test)] mod tests { use super::*; - use crate::testing::{mock_env, mock_info, mock_instance}; - use cosmwasm_std::{coins, Empty}; + use crate::testing::{ + mock_env, mock_info, mock_instance, mock_instance_with_options, MockInstanceOptions, + }; + use cosmwasm_std::{coins, from_slice, Empty}; + use sha2::{Digest, Sha256}; static CONTRACT: &[u8] = include_bytes!("../testdata/hackatom.wasm"); static CYBERPUNK: &[u8] = include_bytes!("../testdata/cyberpunk.wasm"); + static FLOATY2: &[u8] = include_bytes!("../testdata/floaty_2.0.wasm"); #[test] fn call_instantiate_works() { @@ -734,6 +738,93 @@ mod tests { assert_eq!(query_response.as_slice(), b"{\"verifier\":\"verifies\"}"); } + #[test] + fn float_instrs_are_deterministic() { + #[derive(Debug, serde::Serialize, serde::Deserialize)] + #[serde(rename_all = "snake_case")] + pub enum Value { + U32(u32), + U64(u64), + F32(u32), + F64(u64), + } + + let mut instance = mock_instance_with_options( + FLOATY2, + MockInstanceOptions { + gas_limit: u64::MAX, + memory_limit: None, + ..Default::default() + }, + ); + + // init + let info = mock_info("creator", &[]); + call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, br#"{}"#) + .unwrap() + .unwrap(); + + // query instructions + let msg = br#"{"instructions":{}}"#; + let contract_result = call_query(&mut instance, &mock_env(), msg) + .unwrap() + .unwrap(); + let instructions: Vec = from_slice(&contract_result).unwrap(); + // little sanity check + assert_eq!(instructions.len(), 70); + + const RUNS_PER_INSTRUCTION: u64 = 150; + let mut hasher = Sha256::new(); + for instr in &instructions { + for seed in 0..RUNS_PER_INSTRUCTION { + // query some input values for the instruction + let args: Vec = from_slice( + &call_query( + &mut instance, + &mock_env(), + format!( + r#"{{"random_args_for":{{ "instruction": "{instr}", "seed": {seed}}}}}"# + ) + .as_bytes(), + ) + .unwrap() + .unwrap(), + ) + .unwrap(); + + // build the run message + let arg_str = args + .iter() + .map(|a| { + let serialized = to_vec(a).unwrap(); + core::str::from_utf8(&serialized).unwrap().to_string() + }) + .collect::>() + .join(","); + let msg: String = format!( + r#"{{"run":{{ + "instruction": "{instr}", + "args": [{arg_str}] + }}}}"# + ); + // run the instruction + // this might throw a runtime error (e.g. if the instruction traps) + let result = match call_query(&mut instance, &mock_env(), msg.as_bytes()) { + Ok(ContractResult::Ok(r)) => format!("{:?}", from_slice::(&r).unwrap()), + Err(VmError::RuntimeErr { msg }) => msg, + e => panic!("unexpected error: {:?}", e), + }; + // add the result to the hash + hasher.update(format!("{}{}{}", instr, seed, result).as_bytes()); + } + } + let hash = Digest::finalize(hasher); + assert_eq!( + hex::encode(hash.as_slice()), + "03b185aa78dc8a8071c7221228b02a1dab78a2e4cf20520d6569cf2a0ea1d5cf" + ); + } + #[cfg(feature = "stargate")] mod ibc { use super::*; diff --git a/packages/vm/testdata/floaty_2.0.wasm b/packages/vm/testdata/floaty_2.0.wasm new file mode 100755 index 0000000000000000000000000000000000000000..c165731f8d62d14f0efbe577265bca8bf8795845 GIT binary patch literal 2022223 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%0Dw4 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ⅇgBE!EGIM=mL2##-5#~O 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

T_t8zowX(5HXWGDRS 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

D; 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ⅇgBE!EGIM=mL2##-5#~O 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

T_t8zowX(5HXWGDRS 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

D; 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

e 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�eom5FZI%#?k17*BM29 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 From a11b4aba4f742e924d3f322d15ca03365be8d464 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 19 Sep 2023 13:07:33 +0200 Subject: [PATCH 0780/2372] Format readme --- contracts/floaty/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/floaty/README.md b/contracts/floaty/README.md index 33da3058cc..9212056517 100644 --- a/contracts/floaty/README.md +++ b/contracts/floaty/README.md @@ -4,8 +4,8 @@ This contract contains all WebAssembly floating point instructions. It is used for testing the floating point support. In order to compile it, you need a nightly version of Rust and enable the -`nontrapping-fptoint` target-feature. -This allows the usage of [some more conversion instructions](https://github.com/WebAssembly/spec/blob/main/proposals/nontrapping-float-to-int-conversion/Overview.md). +`nontrapping-fptoint` target-feature. This allows the usage of +[some more conversion instructions](https://github.com/WebAssembly/spec/blob/main/proposals/nontrapping-float-to-int-conversion/Overview.md). To do this, run: ```sh From 0a0a088edcf3d229d42ccaff6b883856e745900d Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 19 Sep 2023 14:53:31 +0200 Subject: [PATCH 0781/2372] Update float instruction hash --- packages/vm/src/calls.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 3953854ab1..1bdf306db5 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -821,7 +821,7 @@ mod tests { let hash = Digest::finalize(hasher); assert_eq!( hex::encode(hash.as_slice()), - "03b185aa78dc8a8071c7221228b02a1dab78a2e4cf20520d6569cf2a0ea1d5cf" + "5a91c9d299468606eda65921b57e999fe19cffa81be4a23c94118088b2532ae2" ); } From 206cdb4664a24ac9366582b9e0452e92db8a569c Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 20 Sep 2023 10:13:31 +0200 Subject: [PATCH 0782/2372] Refactor floaty contract code --- contracts/floaty/src/floats.rs | 36 ++++++++++++++++----------- packages/vm/src/calls.rs | 2 +- packages/vm/testdata/floaty_2.0.wasm | Bin 181647 -> 181603 bytes 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/contracts/floaty/src/floats.rs b/contracts/floaty/src/floats.rs index d928700113..ccbb06ade5 100644 --- a/contracts/floaty/src/floats.rs +++ b/contracts/floaty/src/floats.rs @@ -52,22 +52,28 @@ pub fn random_f32(rng: &mut impl RngCore) -> f32 { /// See [`random_f32`] for more details. pub fn random_f64(rng: &mut impl RngCore) -> f64 { let decider = rng.next_u64(); - let bits = if decider < u64::MAX / 4 { - // 25% chance of being a NaN - random_nan_64(rng) - } else if decider < u64::MAX / 2 { - // 25% chance of being a subnormal - random_subnormal_64(rng) - } else if decider < u64::MAX / 4 * 3 { - // 25% chance of being an infinite - if decider % 2 == 0 { - INF_64 - } else { - NEG_INF_64 + let bits = match decider % 4 { + 0 => { + // 25% chance of being a NaN + random_nan_64(rng) } - } else { - // 25% chance of being a random bit pattern - rng.next_u64() + 1 => { + // 25% chance of being a subnormal + random_subnormal_64(rng) + } + 2 => { + // 25% chance of being an infinite + if decider % 2 == 0 { + INF_64 + } else { + NEG_INF_64 + } + } + 3 => { + // 25% chance of being a random bit pattern + rng.next_u64() + } + _ => unreachable!(), }; f64::from_bits(bits) } diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 1bdf306db5..752c5a928e 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -821,7 +821,7 @@ mod tests { let hash = Digest::finalize(hasher); assert_eq!( hex::encode(hash.as_slice()), - "5a91c9d299468606eda65921b57e999fe19cffa81be4a23c94118088b2532ae2" + "95f70fa6451176ab04a9594417a047a1e4d8e2ff809609b8f81099496bee2393" ); } diff --git a/packages/vm/testdata/floaty_2.0.wasm b/packages/vm/testdata/floaty_2.0.wasm index 255560f0d0446896d60423c3312bde7dc805f1cf..3dd07a913ecd00bea4badf1a7b7029f0684913df 100755 GIT binary patch delta 1104 zcmYjNdrZ?;811=jq3&0(!xnH%tt1j2E#)D`0Rt^mHN~gmT)HL^LO0|+TrTSUbcrJGg2;yO^l?7`=9~(tbctmQNWi>C?Io4D?^HlYo zoi%lpyWNfLIE;PIKX(WR@e+15U1ZPh_rZ%7(SjFH{B&tUeR)O6_5-h@jDMipt-o=5 zkzXr%3`-cg#PEH^z>mUcR3KGk$eh|2Iu6SI1+Bd9SP5Mk#37z;C=pvs-4N+|Kg7@X zUjZ*Lzt7)Y(k{%F%{m+vyO!3N@q_rrUa7+wk(*L&^6RYn$2zIqu6#ey+7E@{l5W#R%-K<4a z7~Uqg1zRve7c5vcudJkmBMl>}GaPRj@wxg>G``l;%Qi&Q-UP%@hz-kWQyhvY5RbFi zPp&vb(al&C8_gQ4CYH^Cj>Z$<;2S%ZD~s>CFnv!$arljj66CD01U#_t_)!~*>32I! zu}kNBqZh^)tT45DJs!>frhM7r@sKMSNnt}Cd9z0TkU1kOoyJP%5OpQPj$wKy8Bd^| z5*;jpLhXpb8A`KbEgi5U14DG)j(pryiye3kI7=o6a%j>9OW3`vzs}B9&NKSt0wU@9 z$1qTOA}-(UR?R8kQPlMq+D*O9veT$jtQxD%sx|eJ<8f4|^)9(lc2UdSrxNI+3MlHt zM);xj6{2Ao`Y6&3m!t|e0+K>%Wb8gQqXyN>&_k2mC|8vuxEzcgRf?^8$!q&iqnF{) zj}-d0A1fDX$4T@q)OSwa^IZe~)r<6sT+-Zzh6j);yC(;bD@m$YDhNQCw=${W5)A5z z0B(%ado3)6dRkaK9cf_-J?v$9l;~xP&D*Q1-R0@&^*bbN-BF$yQ@3{yWqR2w>K|U# G?fe%U5qJdv delta 1199 zcmYjOdr(wW7~kL7yRdL~dC7$(bXci)EG!TvqfLQ4){&fOF`A~Dj7J~>vY2K{#KLZY zfrNBMPq0i0*p!oK%o(~lrj*m9jgKf3ttqqk$4O}_XUZN%=kBuAcW1uG@Ao_3cfNCH zd*uFJd3UyAa0_eKRq931RfcGl+dWZo7BJEn(oJ-s+(%9zM2Ww9dE7EuBW34pY}nM) zSp9U1Yio0RA9mr{=UQJv7j~k~eUfb7(F-qLgaKIsU0oL&1;a|!^Rf)ijc6#XA#&u+s_E|~M{DKu! zn05av=XDiki2Bw7J>`DPOp3$~n%$h&1=H<91Fti2Dw2<1Q^2oWPmRP;Zv1O8h{wxQ zZe7)5MvVmG2~Ml2dL+i+IGa*nWi<+xV~PzbxHAAfj44%#!!Z-yRnI45#=w?lB8g?& z@Hom@v<->pkVb)`V%zny1JbT@SlB`&rRhLHmPO>7Z%PU@9 zP6&X>LB<$lSXn9@+N4%?APvdv?M&Rp_P+%M+gNl0iDd`vNXJ1oW5){r=+N^Xtzm0` zy*&#l7-#oqq14jrpA@+;9#KDwx6;W+h^CBVJJMmMjW36@uXAt;hnOP=#r}rI8-CrK zKA@8`kfcs$VJm{73z^7@8P`O4Vl7f=X(%)`6pk~+4!c;t*p3SI>Rq6TR&Lsv7s*x>dT7n_9tq&`V7-AyUsFuCBAqmjrLyJMY#Ao}E%MS0u z(m;MD2u+U!p Date: Wed, 20 Sep 2023 10:14:24 +0200 Subject: [PATCH 0783/2372] Remove floaty execute variant from schema --- contracts/floaty/schema/floaty.json | 7 +------ contracts/floaty/src/bin/schema.rs | 1 - 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/contracts/floaty/schema/floaty.json b/contracts/floaty/schema/floaty.json index 6b5ca30370..cd80c14339 100644 --- a/contracts/floaty/schema/floaty.json +++ b/contracts/floaty/schema/floaty.json @@ -8,12 +8,7 @@ "description": "An empty struct that serves as a placeholder in different places, such as contracts that don't set a custom message.\n\nIt is designed to be expressable in correct JSON and JSON Schema but contains no meaningful data. Previously we used enums without cases, but those cannot represented as valid JSON Schema (https://github.com/CosmWasm/cosmwasm/issues/451)", "type": "object" }, - "execute": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ExecuteMsg", - "description": "An empty struct that serves as a placeholder in different places, such as contracts that don't set a custom message.\n\nIt is designed to be expressable in correct JSON and JSON Schema but contains no meaningful data. Previously we used enums without cases, but those cannot represented as valid JSON Schema (https://github.com/CosmWasm/cosmwasm/issues/451)", - "type": "object" - }, + "execute": null, "query": { "$schema": "http://json-schema.org/draft-07/schema#", "title": "QueryMsg", diff --git a/contracts/floaty/src/bin/schema.rs b/contracts/floaty/src/bin/schema.rs index 91a115b9d0..6a19141a53 100644 --- a/contracts/floaty/src/bin/schema.rs +++ b/contracts/floaty/src/bin/schema.rs @@ -7,6 +7,5 @@ fn main() { write_api! { instantiate: Empty, query: QueryMsg, - execute: Empty, } } From b89c32c87c75a31fb195e363351ceaf42bde23d7 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 25 Sep 2023 11:29:10 +0200 Subject: [PATCH 0784/2372] Simplify json generation in test --- packages/vm/src/calls.rs | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 752c5a928e..aac3a0c1eb 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -593,7 +593,7 @@ mod tests { use crate::testing::{ mock_env, mock_info, mock_instance, mock_instance_with_options, MockInstanceOptions, }; - use cosmwasm_std::{coins, from_slice, Empty}; + use cosmwasm_std::{coins, from_json, to_json_string, Empty}; use sha2::{Digest, Sha256}; static CONTRACT: &[u8] = include_bytes!("../testdata/hackatom.wasm"); @@ -769,7 +769,7 @@ mod tests { let contract_result = call_query(&mut instance, &mock_env(), msg) .unwrap() .unwrap(); - let instructions: Vec = from_slice(&contract_result).unwrap(); + let instructions: Vec = from_json(&contract_result).unwrap(); // little sanity check assert_eq!(instructions.len(), 70); @@ -778,7 +778,7 @@ mod tests { for instr in &instructions { for seed in 0..RUNS_PER_INSTRUCTION { // query some input values for the instruction - let args: Vec = from_slice( + let args: Vec = from_json( &call_query( &mut instance, &mock_env(), @@ -793,24 +793,17 @@ mod tests { .unwrap(); // build the run message - let arg_str = args - .iter() - .map(|a| { - let serialized = to_vec(a).unwrap(); - core::str::from_utf8(&serialized).unwrap().to_string() - }) - .collect::>() - .join(","); + let args = to_json_string(&args).unwrap(); let msg: String = format!( r#"{{"run":{{ "instruction": "{instr}", - "args": [{arg_str}] + "args": {args} }}}}"# ); // run the instruction // this might throw a runtime error (e.g. if the instruction traps) let result = match call_query(&mut instance, &mock_env(), msg.as_bytes()) { - Ok(ContractResult::Ok(r)) => format!("{:?}", from_slice::(&r).unwrap()), + Ok(ContractResult::Ok(r)) => format!("{:?}", from_json::(&r).unwrap()), Err(VmError::RuntimeErr { msg }) => msg, e => panic!("unexpected error: {e:?}"), }; From c1e9ca2bce396b2c282692496aa8f447de80b93d Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 25 Sep 2023 15:49:56 +0200 Subject: [PATCH 0785/2372] Fixes --- contracts/floaty/src/instructions.rs | 4 ++-- packages/vm/src/calls.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/floaty/src/instructions.rs b/contracts/floaty/src/instructions.rs index 7bdfe23493..d76fa28b19 100644 --- a/contracts/floaty/src/instructions.rs +++ b/contracts/floaty/src/instructions.rs @@ -13,10 +13,10 @@ macro_rules! run_instr { }; ret }}; - ($instr:expr, $input1:expr, $input1_ty:ty, $input2:expr, $input2_ty:ty, $returnty:ty) => {{ + ($instr:expr, $input1:expr, $input1_ty:ty, $input2:expr, $input2_ty:ty, $return_ty:ty) => {{ let input1: $input1_ty = $input1; let input2: $input2_ty = $input2; - let ret: $returnty; + let ret: $return_ty; unsafe { core::arch::asm!("local.get {0}", "local.get {1}", $instr, "local.set {2}", in(local) input1, in(local) input2, out(local) ret) }; diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index aac3a0c1eb..3f3037b8e0 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -804,7 +804,7 @@ mod tests { // this might throw a runtime error (e.g. if the instruction traps) let result = match call_query(&mut instance, &mock_env(), msg.as_bytes()) { Ok(ContractResult::Ok(r)) => format!("{:?}", from_json::(&r).unwrap()), - Err(VmError::RuntimeErr { msg }) => msg, + Err(VmError::RuntimeErr { msg, .. }) => msg, e => panic!("unexpected error: {e:?}"), }; // add the result to the hash From 5538397fec10c76c6040fdbb96f473faccd2fc31 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 25 Sep 2023 16:13:31 +0200 Subject: [PATCH 0786/2372] Add changelog entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93b8860e4a..31018a206d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ and this project adheres to `to_{vec,binary}` in favor of `to_json_{vec,binary}` and `from_{slice,binary}` in favor of `from_json`. ([#1886]) - cosmwasm-std: Add `SignedDecimal` and `SignedDecimal256` ([#1807]). +- cosmwasm-vm: Allow float operations with NaN canonicalization ([#1864]). [#1854]: https://github.com/CosmWasm/cosmwasm/pull/1854 [#1861]: https://github.com/CosmWasm/cosmwasm/pull/1861 @@ -31,6 +32,7 @@ and this project adheres to [#1870]: https://github.com/CosmWasm/cosmwasm/pull/1870 [#1886]: https://github.com/CosmWasm/cosmwasm/pull/1886 [#1807]: https://github.com/CosmWasm/cosmwasm/pull/1807 +[#1864]: https://github.com/CosmWasm/cosmwasm/pull/1864 ## [1.4.0] - 2023-09-04 From b9f432c2589e61d14a4199feada7345f4693910b Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 26 Sep 2023 12:11:13 +0200 Subject: [PATCH 0787/2372] Replace tarpaulin with grcov --- .circleci/config.yml | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index acd3756e6f..c76fe19b3f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -967,41 +967,45 @@ jobs: coverage: # https://circleci.com/developer/images?imageType=machine - machine: - image: ubuntu-2004:202201-02 + docker: + - image: rust:1.67.0 steps: - checkout + - run: + name: Install grcov + command: | + rustup component add llvm-tools-preview + cargo install grcov - run: name: Run tests with coverage # See https://github.com/xd009642/tarpaulin/blob/develop/CHANGELOG.md and https://hub.docker.com/r/xd009642/tarpaulin/tags # for tarpaulin versions. command: | - mkdir -p reports/crypto - mkdir -p reports/derive - mkdir -p reports/schema - mkdir -p reports/std - mkdir -p reports/storage - CRYPTO=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/crypto --packages cosmwasm-crypto" - DERIVE=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/derive --packages cosmwasm-derive" - SCHEMA=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/schema --packages cosmwasm-schema" - STD=" cargo tarpaulin --skip-clean --out Xml --output-dir reports/std --packages cosmwasm-std --features abort,iterator,staking,stargate,cosmwasm_1_4" - STORAGE="cargo tarpaulin --skip-clean --out Xml --output-dir reports/storage --packages cosmwasm-storage" - docker run --security-opt seccomp=unconfined -v "${PWD}:/volume" xd009642/tarpaulin:0.21.0 \ - sh -c "$CRYPTO && $DERIVE && $SCHEMA && $STD && $STORAGE" + mkdir -p reports + cargo test + + grcov . ./packages/**/ -s packages/crypto --binary-path ./target/debug -t lcov -o ./reports/crypto.info + grcov . ./packages/**/ -s packages/derive --binary-path ./target/debug -t lcov -o ./reports/derive.info + grcov . ./packages/**/ -s packages/schema --binary-path ./target/debug -t lcov -o ./reports/schema.info + grcov . ./packages/**/ -s packages/std --binary-path ./target/debug -t lcov -o ./reports/std.info + grcov . ./packages/**/ -s packages/storage --binary-path ./target/debug -t lcov -o ./reports/storage.info + environment: + RUSTFLAGS: "-Cinstrument-coverage" + LLVM_PROFILE_FILE: "cosmwasm-%p-%m.profraw" - codecov/upload: - file: reports/crypto/cobertura.xml + file: reports/crypto.info flags: cosmwasm-crypto - codecov/upload: - file: reports/derive/cobertura.xml + file: reports/derive.info flags: cosmwasm-derive - codecov/upload: - file: reports/schema/cobertura.xml + file: reports/schema.info flags: cosmwasm-schema - codecov/upload: - file: reports/std/cobertura.xml + file: reports/std.info flags: cosmwasm-std - codecov/upload: - file: reports/storage/cobertura.xml + file: reports/storage.info flags: cosmwasm-storage # This job roughly follows the instructions from https://circleci.com/blog/publishing-to-github-releases-via-circleci/ From df702d20b070f0dd03f68b674da0c051896fb8ad Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 26 Sep 2023 14:57:17 +0200 Subject: [PATCH 0788/2372] Enable coverage ci job again --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c76fe19b3f..54285851b8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -86,7 +86,7 @@ workflows: # Add your branch here if benchmarking matters to your work - fix-benchmarking - w3 - # - coverage # disabled temporarily because Rust version is too low + - coverage deploy: jobs: - build_and_upload_devcontracts: From 5a7ed6ba797dfbf40466a4767210e86b611c0099 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 26 Sep 2023 15:22:15 +0200 Subject: [PATCH 0789/2372] Fix grcov in ci --- .circleci/config.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 54285851b8..9fde1481f6 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -968,18 +968,16 @@ jobs: coverage: # https://circleci.com/developer/images?imageType=machine docker: - - image: rust:1.67.0 + - image: rust:1.72.0 steps: - checkout - run: name: Install grcov command: | rustup component add llvm-tools-preview - cargo install grcov + cargo install grcov --locked - run: name: Run tests with coverage - # See https://github.com/xd009642/tarpaulin/blob/develop/CHANGELOG.md and https://hub.docker.com/r/xd009642/tarpaulin/tags - # for tarpaulin versions. command: | mkdir -p reports cargo test From 157d0510bf53f26d159edf662abdba5dbf77a38e Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 26 Sep 2023 15:58:26 +0200 Subject: [PATCH 0790/2372] Add cosmwasm-vm to coverage --- .circleci/config.yml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9fde1481f6..c5d451835d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -982,11 +982,12 @@ jobs: mkdir -p reports cargo test - grcov . ./packages/**/ -s packages/crypto --binary-path ./target/debug -t lcov -o ./reports/crypto.info - grcov . ./packages/**/ -s packages/derive --binary-path ./target/debug -t lcov -o ./reports/derive.info - grcov . ./packages/**/ -s packages/schema --binary-path ./target/debug -t lcov -o ./reports/schema.info - grcov . ./packages/**/ -s packages/std --binary-path ./target/debug -t lcov -o ./reports/std.info - grcov . ./packages/**/ -s packages/storage --binary-path ./target/debug -t lcov -o ./reports/storage.info + grcov . -s packages/crypto --binary-path ./target/debug -t lcov -o ./reports/crypto.info + grcov . -s packages/derive --binary-path ./target/debug -t lcov -o ./reports/derive.info + grcov . -s packages/schema --binary-path ./target/debug -t lcov -o ./reports/schema.info + grcov . -s packages/std --binary-path ./target/debug -t lcov -o ./reports/std.info + grcov . -s packages/storage --binary-path ./target/debug -t lcov -o ./reports/storage.info + grcov . -s packages/vm --binary-path ./target/debug -t lcov -o ./reports/vm.info environment: RUSTFLAGS: "-Cinstrument-coverage" LLVM_PROFILE_FILE: "cosmwasm-%p-%m.profraw" @@ -1005,6 +1006,9 @@ jobs: - codecov/upload: file: reports/storage.info flags: cosmwasm-storage + - codecov/upload: + file: reports/vm.info + flags: cosmwasm-vm # This job roughly follows the instructions from https://circleci.com/blog/publishing-to-github-releases-via-circleci/ build_and_upload_devcontracts: From 376801cdef50bd521a7ab3308c269eeacbfca8b3 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 26 Sep 2023 16:27:07 +0200 Subject: [PATCH 0791/2372] Update codecov orb --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c5d451835d..791b747594 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,7 +1,7 @@ version: 2.1 orbs: - codecov: codecov/codecov@3.2.0 + codecov: codecov/codecov@3.2.5 win: circleci/windows@5.0 commands: From 59c89eba4631bf8c939a9a10d891da004efbb52c Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 27 Sep 2023 09:19:56 +0200 Subject: [PATCH 0792/2372] Remove comment --- .circleci/config.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 791b747594..0e38951381 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -966,7 +966,6 @@ jobs: key: cargocache-v2-benchmarking-rust:1.67.0-{{ checksum "Cargo.lock" }} coverage: - # https://circleci.com/developer/images?imageType=machine docker: - image: rust:1.72.0 steps: From 5d41ea342d032ef75c94586cb70bad60092d2213 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 27 Sep 2023 12:44:03 +0200 Subject: [PATCH 0793/2372] Improve write limit error message --- packages/vm/src/errors/vm_error.rs | 8 ++++ packages/vm/src/imports.rs | 72 ++++++++++++++++++------------ 2 files changed, 52 insertions(+), 28 deletions(-) diff --git a/packages/vm/src/errors/vm_error.rs b/packages/vm/src/errors/vm_error.rs index b0ed25f9a5..c8f7f51404 100644 --- a/packages/vm/src/errors/vm_error.rs +++ b/packages/vm/src/errors/vm_error.rs @@ -29,6 +29,14 @@ pub enum VmError { #[cfg(feature = "backtraces")] backtrace: Backtrace, }, + #[error("{kind} too big. Tried to write {length} bytes to storage, limit is {max_length}")] + WriteTooBig { + kind: &'static str, + length: usize, + max_length: usize, + #[cfg(feature = "backtraces")] + backtrace: Backtrace, + }, #[error("Error in guest/host communication: {source}")] CommunicationErr { #[from] diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index b2c24a7ba1..4a792a7c52 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -98,8 +98,30 @@ pub fn do_db_write VmError { + if let VmError::CommunicationErr { + source: CommunicationError::RegionLengthTooBig { length, max_length }, + #[cfg(feature = "backtraces")] + backtrace, + } = e + { + VmError::WriteTooBig { + kind, + length, + max_length, + #[cfg(feature = "backtraces")] + backtrace, + } + } else { + e + } + } + + let key = read_region(&data.memory(&store), key_ptr, MAX_LENGTH_DB_KEY) + .map_err(|e| convert_error(e, "Key"))?; + let value = read_region(&data.memory(&store), value_ptr, MAX_LENGTH_DB_VALUE) + .map_err(|e| convert_error(e, "Value"))?; let (result, gas_info) = data.with_storage_from_context::<_, _>(|store| Ok(store.set(&key, &value)))?; @@ -877,25 +899,22 @@ mod tests { let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let key_ptr = write_data(&mut fe_mut, &vec![4u8; 300 * 1024]); + const KEY_SIZE: usize = 300 * 1024; + let key_ptr = write_data(&mut fe_mut, &vec![4u8; KEY_SIZE]); let value_ptr = write_data(&mut fe_mut, b"new value"); leave_default_data(&mut fe_mut); let result = do_db_write(fe_mut, key_ptr, value_ptr); - match result.unwrap_err() { - VmError::CommunicationErr { - source: - CommunicationError::RegionLengthTooBig { - length, max_length, .. - }, + assert!(matches!( + result, + Err(VmError::WriteTooBig { + kind: "Key", + length: KEY_SIZE, + max_length: MAX_LENGTH_DB_KEY, .. - } => { - assert_eq!(length, 300 * 1024); - assert_eq!(max_length, MAX_LENGTH_DB_KEY); - } - err => panic!("unexpected error: {err:?}"), - }; + }) + )); } #[test] @@ -904,25 +923,22 @@ mod tests { let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); + const VAL_SIZE: usize = 300 * 1024; let key_ptr = write_data(&mut fe_mut, b"new storage key"); - let value_ptr = write_data(&mut fe_mut, &vec![5u8; 300 * 1024]); + let value_ptr = write_data(&mut fe_mut, &vec![5u8; VAL_SIZE]); leave_default_data(&mut fe_mut); let result = do_db_write(fe_mut, key_ptr, value_ptr); - match result.unwrap_err() { - VmError::CommunicationErr { - source: - CommunicationError::RegionLengthTooBig { - length, max_length, .. - }, + assert!(matches!( + result, + Err(VmError::WriteTooBig { + kind: "Value", + length: VAL_SIZE, + max_length: MAX_LENGTH_DB_VALUE, .. - } => { - assert_eq!(length, 300 * 1024); - assert_eq!(max_length, MAX_LENGTH_DB_VALUE); - } - err => panic!("unexpected error: {err:?}"), - }; + }) + )); } #[test] From 8592efa71d099269c63ed03e6ee35cf75c096ff0 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 27 Sep 2023 14:11:23 +0200 Subject: [PATCH 0794/2372] Use generic instead of structured error --- packages/vm/src/errors/vm_error.rs | 8 -------- packages/vm/src/imports.rs | 28 ++++++---------------------- 2 files changed, 6 insertions(+), 30 deletions(-) diff --git a/packages/vm/src/errors/vm_error.rs b/packages/vm/src/errors/vm_error.rs index c8f7f51404..b0ed25f9a5 100644 --- a/packages/vm/src/errors/vm_error.rs +++ b/packages/vm/src/errors/vm_error.rs @@ -29,14 +29,6 @@ pub enum VmError { #[cfg(feature = "backtraces")] backtrace: Backtrace, }, - #[error("{kind} too big. Tried to write {length} bytes to storage, limit is {max_length}")] - WriteTooBig { - kind: &'static str, - length: usize, - max_length: usize, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, #[error("Error in guest/host communication: {source}")] CommunicationErr { #[from] diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 4a792a7c52..83feacabef 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -106,10 +106,10 @@ pub fn do_db_write Date: Wed, 27 Sep 2023 16:31:17 +0200 Subject: [PATCH 0795/2372] Ignore backtrace for write error --- packages/vm/src/imports.rs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 83feacabef..51d76c32d5 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -102,17 +102,12 @@ pub fn do_db_write VmError { if let VmError::CommunicationErr { source: CommunicationError::RegionLengthTooBig { length, max_length }, - #[cfg(feature = "backtraces")] - backtrace, + .. } = e { - VmError::GenericErr { - msg: format!( + VmError::generic_err(format!( "{kind} too big. Tried to write {length} bytes to storage, limit is {max_length}" - ), - #[cfg(feature = "backtraces")] - backtrace, - } + )) } else { e } From 7f2eea1ae852e750fa869ec263ea64c7e459cf99 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 27 Sep 2023 16:32:27 +0200 Subject: [PATCH 0796/2372] Add punctuation Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/vm/src/imports.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 51d76c32d5..f27a2750fc 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -106,7 +106,7 @@ pub fn do_db_write Date: Thu, 28 Sep 2023 18:22:20 +0200 Subject: [PATCH 0797/2372] Remove old floaty tests --- contracts/floaty/src/contract.rs | 180 +------------------------------ 1 file changed, 5 insertions(+), 175 deletions(-) diff --git a/contracts/floaty/src/contract.rs b/contracts/floaty/src/contract.rs index 99b0def3b2..668498a97c 100644 --- a/contracts/floaty/src/contract.rs +++ b/contracts/floaty/src/contract.rs @@ -1,6 +1,6 @@ use cosmwasm_std::{ - entry_point, from_slice, to_binary, to_vec, AllBalanceResponse, BankMsg, Deps, DepsMut, Env, - Event, MessageInfo, QueryResponse, Response, StdError, StdResult, + entry_point, to_json_binary, Deps, DepsMut, Empty, Env, MessageInfo, QueryResponse, Response, + StdResult, }; use rand_chacha::rand_core::SeedableRng; @@ -26,10 +26,10 @@ pub fn query(_deps: Deps, _env: Env, msg: QueryMsg) -> StdResult match msg { QueryMsg::RandomArgsFor { instruction, seed } => { let mut rng = rand_chacha::ChaChaRng::seed_from_u64(seed); - to_binary(&random_args_for(&instruction, &mut rng)) + to_json_binary(&random_args_for(&instruction, &mut rng)) } - QueryMsg::Instructions {} => to_binary(&FLOAT_INSTRUCTIONS.to_vec()), - QueryMsg::Run { instruction, args } => to_binary(&query_run(&instruction, args)?), + QueryMsg::Instructions {} => to_json_binary(&FLOAT_INSTRUCTIONS.to_vec()), + QueryMsg::Run { instruction, args } => to_json_binary(&query_run(&instruction, args)?), } } @@ -43,173 +43,3 @@ fn query_run(instruction: &str, args: Vec) -> StdResult { Ok(result) } } - -#[cfg(test)] -mod tests { - use super::*; - use cosmwasm_std::testing::{ - mock_dependencies, mock_dependencies_with_balances, mock_env, mock_info, MOCK_CONTRACT_ADDR, - }; - use cosmwasm_std::Api as _; - // import trait Storage to get access to read - use cosmwasm_std::{attr, coins, Addr, Storage, SubMsg}; - - #[test] - fn proper_initialization() { - let mut deps = mock_dependencies(); - - let verifier = String::from("verifies"); - let beneficiary = String::from("benefits"); - let creator = String::from("creator"); - let expected_state = State { - verifier: deps.api.addr_validate(&verifier).unwrap(), - beneficiary: deps.api.addr_validate(&beneficiary).unwrap(), - funder: deps.api.addr_validate(&creator).unwrap(), - }; - - let msg = InstantiateMsg { - verifier, - beneficiary, - }; - let info = mock_info(creator.as_str(), &[]); - let res = instantiate(deps.as_mut(), mock_env(), info, msg).unwrap(); - assert_eq!(res.messages.len(), 0); - assert_eq!(res.attributes.len(), 1); - assert_eq!(res.attributes[0].key, "Let the"); - assert_eq!(res.attributes[0].value, "hacking begin"); - - // it worked, let's check the state - let data = deps.storage.get(CONFIG_KEY).expect("no data stored"); - let state: State = from_slice(&data).unwrap(); - assert_eq!(state, expected_state); - } - - #[test] - fn instantiate_and_query() { - let mut deps = mock_dependencies(); - - let verifier = String::from("verifies"); - let beneficiary = String::from("benefits"); - let creator = String::from("creator"); - let msg = InstantiateMsg { - verifier: verifier.clone(), - beneficiary, - }; - let info = mock_info(&creator, &[]); - let res = instantiate(deps.as_mut(), mock_env(), info, msg).unwrap(); - assert_eq!(0, res.messages.len()); - - // now let's query - let query_response = query_verifier(deps.as_ref()).unwrap(); - assert_eq!(query_response.verifier, verifier); - } - - #[test] - fn querier_callbacks_work() { - let rich_addr = String::from("foobar"); - let rich_balance = coins(10000, "gold"); - let deps = mock_dependencies_with_balances(&[(&rich_addr, &rich_balance)]); - - // querying with balance gets the balance - let bal = query_other_balance(deps.as_ref(), rich_addr).unwrap(); - assert_eq!(bal.amount, rich_balance); - - // querying other accounts gets none - let bal = query_other_balance(deps.as_ref(), String::from("someone else")).unwrap(); - assert_eq!(bal.amount, vec![]); - } - - #[test] - fn execute_release_works() { - let mut deps = mock_dependencies(); - - // initialize the store - let creator = String::from("creator"); - let verifier = String::from("verifies"); - let beneficiary = String::from("benefits"); - - let instantiate_msg = InstantiateMsg { - verifier: verifier.clone(), - beneficiary: beneficiary.clone(), - }; - let init_amount = coins(1000, "earth"); - let init_info = mock_info(&creator, &init_amount); - let init_res = instantiate(deps.as_mut(), mock_env(), init_info, instantiate_msg).unwrap(); - assert_eq!(init_res.messages.len(), 0); - - // balance changed in init - deps.querier.update_balance(MOCK_CONTRACT_ADDR, init_amount); - - // beneficiary can release it - let execute_info = mock_info(verifier.as_str(), &[]); - let execute_res = execute( - deps.as_mut(), - mock_env(), - execute_info, - ExecuteMsg::Release {}, - ) - .unwrap(); - assert_eq!(execute_res.messages.len(), 1); - let msg = execute_res.messages.get(0).expect("no message"); - assert_eq!( - msg, - &SubMsg::new(BankMsg::Send { - to_address: beneficiary, - amount: coins(1000, "earth"), - }), - ); - assert_eq!( - execute_res.attributes, - vec![ - attr("action", "release"), - attr("destination", "benefits"), - attr("foo", "300") - ], - ); - assert_eq!(execute_res.data, Some(vec![0xF0, 0x0B, 0xAA].into())); - } - - #[test] - fn execute_release_fails_for_wrong_sender() { - let mut deps = mock_dependencies(); - - // initialize the store - let creator = String::from("creator"); - let verifier = String::from("verifies"); - let beneficiary = String::from("benefits"); - - let instantiate_msg = InstantiateMsg { - verifier: verifier.clone(), - beneficiary: beneficiary.clone(), - }; - let init_amount = coins(1000, "earth"); - let init_info = mock_info(&creator, &init_amount); - let init_res = instantiate(deps.as_mut(), mock_env(), init_info, instantiate_msg).unwrap(); - assert_eq!(init_res.messages.len(), 0); - - // balance changed in init - deps.querier.update_balance(MOCK_CONTRACT_ADDR, init_amount); - - // beneficiary cannot release it - let execute_info = mock_info(beneficiary.as_str(), &[]); - let execute_res = execute( - deps.as_mut(), - mock_env(), - execute_info, - ExecuteMsg::Release {}, - ); - assert_eq!(execute_res.unwrap_err(), HackError::Unauthorized {}); - - // state should not change - let data = deps.storage.get(CONFIG_KEY).expect("no data stored"); - let state: State = from_slice(&data).unwrap(); - assert_eq!( - state, - State { - verifier: Addr::unchecked(verifier), - beneficiary: Addr::unchecked(beneficiary), - funder: Addr::unchecked(creator), - } - ); - } -} From 686e7c1222a132e40e1dcfe63f6ab58796246687 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 29 Sep 2023 16:53:45 +0200 Subject: [PATCH 0798/2372] Suppress warnings in floaty when not on wasm32 --- contracts/floaty/src/contract.rs | 1 + contracts/floaty/src/instructions.rs | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/contracts/floaty/src/contract.rs b/contracts/floaty/src/contract.rs index 668498a97c..9f7e8e4bff 100644 --- a/contracts/floaty/src/contract.rs +++ b/contracts/floaty/src/contract.rs @@ -33,6 +33,7 @@ pub fn query(_deps: Deps, _env: Env, msg: QueryMsg) -> StdResult } } +#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))] fn query_run(instruction: &str, args: Vec) -> StdResult { #[cfg(not(target_arch = "wasm32"))] panic!(); diff --git a/contracts/floaty/src/instructions.rs b/contracts/floaty/src/instructions.rs index d76fa28b19..d264330852 100644 --- a/contracts/floaty/src/instructions.rs +++ b/contracts/floaty/src/instructions.rs @@ -4,6 +4,7 @@ use rand_chacha::rand_core::RngCore; use crate::floats::{random_f32, random_f64}; /// Not intended for direct usage +#[cfg_attr(not(target_arch = "wasm32"), allow(unused_macros))] macro_rules! run_instr { ($instr:expr, $input:expr, $input_ty:ty, $return_ty:ty) => {{ let input: $input_ty = $input; @@ -23,9 +24,11 @@ macro_rules! run_instr { ret }}; } +#[cfg_attr(not(target_arch = "wasm32"), allow(unused_imports))] pub(crate) use run_instr; /// Helper to run a single WebAssembly instruction in a type-safe way +#[cfg_attr(not(target_arch = "wasm32"), allow(unused_macros))] macro_rules! run { ("f32.eq", $input1:expr, $input2:expr) => { $crate::instructions::run_instr!("f32.eq", $input1, f32, $input2, f32, u32) @@ -244,6 +247,7 @@ macro_rules! run { $crate::instructions::run_instr!("i64.trunc_sat_f64_u", $input, f64, u64) }; } +#[cfg_attr(not(target_arch = "wasm32"), allow(unused_imports))] pub(crate) use run; #[cw_serde] @@ -471,7 +475,7 @@ pub fn random_args_for(instr: &str, rng: &mut impl RngCore) -> Vec { } } -pub const FLOAT_INSTRUCTIONS: [&'static str; 70] = [ +pub const FLOAT_INSTRUCTIONS: [&str; 70] = [ "f32.eq", "f32.ne", "f32.lt", From 347c6cbbdb2485e20a00b48c0b6110b215899c76 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 29 Sep 2023 16:53:58 +0200 Subject: [PATCH 0799/2372] Exclude floaty from devtool scripts --- devtools/check_contracts_full.sh | 1 + devtools/check_contracts_medium.sh | 1 + 2 files changed, 2 insertions(+) diff --git a/devtools/check_contracts_full.sh b/devtools/check_contracts_full.sh index 5a77cdd36e..35947c1029 100755 --- a/devtools/check_contracts_full.sh +++ b/devtools/check_contracts_full.sh @@ -2,6 +2,7 @@ set -o errexit -o nounset -o pipefail command -v shellcheck >/dev/null && shellcheck "$0" +GLOBIGNORE="contracts/floaty/" for contract_dir in contracts/*/; do ( cd "$contract_dir" diff --git a/devtools/check_contracts_medium.sh b/devtools/check_contracts_medium.sh index 0dcf5346b3..e8ecc78ad6 100755 --- a/devtools/check_contracts_medium.sh +++ b/devtools/check_contracts_medium.sh @@ -2,6 +2,7 @@ set -o errexit -o nounset -o pipefail command -v shellcheck >/dev/null && shellcheck "$0" +GLOBIGNORE="contracts/floaty/" for contract_dir in contracts/*/; do ( cd "$contract_dir" From ad42d692665270603a9d9fb129b1d536781c052f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 2 Oct 2023 10:21:39 +0200 Subject: [PATCH 0800/2372] Fix dead links --- packages/std/src/ibc.rs | 8 ++++---- packages/std/src/results/events.rs | 4 ++-- packages/std/src/results/response.rs | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 2c3965f7b7..1ad33e3667 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -492,14 +492,14 @@ pub struct IbcBasicResponse { /// /// More info about events (and their attributes) can be found in [*Cosmos SDK* docs]. /// - /// [*Cosmos SDK* docs]: https://docs.cosmos.network/main/core/events.html + /// [*Cosmos SDK* docs]: https://docs.cosmos.network/main/learn/advanced/events pub attributes: Vec, /// Extra, custom events separate from the main `wasm` one. These will have /// `wasm-` prepended to the type. /// /// More info about events can be found in [*Cosmos SDK* docs]. /// - /// [*Cosmos SDK* docs]: https://docs.cosmos.network/main/core/events.html + /// [*Cosmos SDK* docs]: https://docs.cosmos.network/main/learn/advanced/events pub events: Vec, } @@ -637,14 +637,14 @@ pub struct IbcReceiveResponse { /// /// More info about events (and their attributes) can be found in [*Cosmos SDK* docs]. /// - /// [*Cosmos SDK* docs]: https://docs.cosmos.network/main/core/events.html + /// [*Cosmos SDK* docs]: https://docs.cosmos.network/main/learn/advanced/events pub attributes: Vec, /// Extra, custom events separate from the main `wasm` one. These will have /// `wasm-` prepended to the type. /// /// More info about events can be found in [*Cosmos SDK* docs]. /// - /// [*Cosmos SDK* docs]: https://docs.cosmos.network/main/core/events.html + /// [*Cosmos SDK* docs]: https://docs.cosmos.network/main/learn/advanced/events pub events: Vec, } diff --git a/packages/std/src/results/events.rs b/packages/std/src/results/events.rs index 31c84a9dc8..51eb7ace00 100644 --- a/packages/std/src/results/events.rs +++ b/packages/std/src/results/events.rs @@ -9,7 +9,7 @@ use crate::forward_ref_partial_eq; /// which then get magically converted to bytes for Tendermint somewhere between /// the Rust-Go interface, JSON deserialization and the `NewEvent` call in Cosmos SDK. /// -/// [*Cosmos SDK* event]: https://docs.cosmos.network/main/core/events.html +/// [*Cosmos SDK* event]: https://docs.cosmos.network/main/learn/advanced/events /// [*Cosmos SDK* StringEvent]: https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/base/abci/v1beta1/abci.proto#L56-L70 #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[non_exhaustive] @@ -21,7 +21,7 @@ pub struct Event { /// /// You can learn more about these from [*Cosmos SDK* docs]. /// - /// [*Cosmos SDK* docs]: https://docs.cosmos.network/main/core/events.html + /// [*Cosmos SDK* docs]: https://docs.cosmos.network/main/learn/advanced/events pub attributes: Vec, } diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index a728675f40..80f687c75c 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -72,14 +72,14 @@ pub struct Response { /// /// More info about events (and their attributes) can be found in [*Cosmos SDK* docs]. /// - /// [*Cosmos SDK* docs]: https://docs.cosmos.network/main/core/events.html + /// [*Cosmos SDK* docs]: https://docs.cosmos.network/main/learn/advanced/events pub attributes: Vec, /// Extra, custom events separate from the main `wasm` one. These will have /// `wasm-` prepended to the type. /// /// More info about events can be found in [*Cosmos SDK* docs]. /// - /// [*Cosmos SDK* docs]: https://docs.cosmos.network/main/core/events.html + /// [*Cosmos SDK* docs]: https://docs.cosmos.network/main/learn/advanced/events pub events: Vec, /// The binary payload to include in the response. pub data: Option, From 7cb91fea033d1722f6dc7c5f6678ae78c2a8b390 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 2 Oct 2023 10:37:57 +0200 Subject: [PATCH 0801/2372] Update schema --- contracts/reflect/schema/raw/response_to_sub_msg_result.json | 4 ++-- contracts/reflect/schema/reflect.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/reflect/schema/raw/response_to_sub_msg_result.json b/contracts/reflect/schema/raw/response_to_sub_msg_result.json index e7a26e26fb..d3b29ce66d 100644 --- a/contracts/reflect/schema/raw/response_to_sub_msg_result.json +++ b/contracts/reflect/schema/raw/response_to_sub_msg_result.json @@ -40,7 +40,7 @@ "type": "string" }, "Event": { - "description": "A full [*Cosmos SDK* event].\n\nThis version uses string attributes (similar to [*Cosmos SDK* StringEvent]), which then get magically converted to bytes for Tendermint somewhere between the Rust-Go interface, JSON deserialization and the `NewEvent` call in Cosmos SDK.\n\n[*Cosmos SDK* event]: https://docs.cosmos.network/main/core/events.html [*Cosmos SDK* StringEvent]: https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/base/abci/v1beta1/abci.proto#L56-L70", + "description": "A full [*Cosmos SDK* event].\n\nThis version uses string attributes (similar to [*Cosmos SDK* StringEvent]), which then get magically converted to bytes for Tendermint somewhere between the Rust-Go interface, JSON deserialization and the `NewEvent` call in Cosmos SDK.\n\n[*Cosmos SDK* event]: https://docs.cosmos.network/main/learn/advanced/events [*Cosmos SDK* StringEvent]: https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/base/abci/v1beta1/abci.proto#L56-L70", "type": "object", "required": [ "attributes", @@ -48,7 +48,7 @@ ], "properties": { "attributes": { - "description": "The attributes to be included in the event.\n\nYou can learn more about these from [*Cosmos SDK* docs].\n\n[*Cosmos SDK* docs]: https://docs.cosmos.network/main/core/events.html", + "description": "The attributes to be included in the event.\n\nYou can learn more about these from [*Cosmos SDK* docs].\n\n[*Cosmos SDK* docs]: https://docs.cosmos.network/main/learn/advanced/events", "type": "array", "items": { "$ref": "#/definitions/Attribute" diff --git a/contracts/reflect/schema/reflect.json b/contracts/reflect/schema/reflect.json index ab5217ce28..641d7498d7 100644 --- a/contracts/reflect/schema/reflect.json +++ b/contracts/reflect/schema/reflect.json @@ -1911,7 +1911,7 @@ "type": "string" }, "Event": { - "description": "A full [*Cosmos SDK* event].\n\nThis version uses string attributes (similar to [*Cosmos SDK* StringEvent]), which then get magically converted to bytes for Tendermint somewhere between the Rust-Go interface, JSON deserialization and the `NewEvent` call in Cosmos SDK.\n\n[*Cosmos SDK* event]: https://docs.cosmos.network/main/core/events.html [*Cosmos SDK* StringEvent]: https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/base/abci/v1beta1/abci.proto#L56-L70", + "description": "A full [*Cosmos SDK* event].\n\nThis version uses string attributes (similar to [*Cosmos SDK* StringEvent]), which then get magically converted to bytes for Tendermint somewhere between the Rust-Go interface, JSON deserialization and the `NewEvent` call in Cosmos SDK.\n\n[*Cosmos SDK* event]: https://docs.cosmos.network/main/learn/advanced/events [*Cosmos SDK* StringEvent]: https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/base/abci/v1beta1/abci.proto#L56-L70", "type": "object", "required": [ "attributes", @@ -1919,7 +1919,7 @@ ], "properties": { "attributes": { - "description": "The attributes to be included in the event.\n\nYou can learn more about these from [*Cosmos SDK* docs].\n\n[*Cosmos SDK* docs]: https://docs.cosmos.network/main/core/events.html", + "description": "The attributes to be included in the event.\n\nYou can learn more about these from [*Cosmos SDK* docs].\n\n[*Cosmos SDK* docs]: https://docs.cosmos.network/main/learn/advanced/events", "type": "array", "items": { "$ref": "#/definitions/Attribute" From 5adc0e02f649461dab0a78046bc6ab9d1e5fdf3f Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Tue, 3 Oct 2023 12:11:49 +0200 Subject: [PATCH 0802/2372] Set the minimum ecdsa version to v0.16.2 --- Cargo.lock | 1 + packages/crypto/Cargo.toml | 1 + 2 files changed, 2 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 83ac5a0c44..a443db5af2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -438,6 +438,7 @@ version = "1.4.0" dependencies = [ "criterion", "digest 0.10.6", + "ecdsa", "ed25519-zebra", "english-numbers", "hex", diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 8bbb5c4e42..8e5108bfc0 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -20,6 +20,7 @@ bench = false [dependencies] k256 = { version = "0.13.1", features = ["ecdsa"] } +ecdsa = "0.16.2" ed25519-zebra = "3" digest = "0.10" rand_core = { version = "0.6", features = ["getrandom"] } From 4f2aeb7742545c578ff64f338e1447f9a3e86f06 Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Tue, 3 Oct 2023 12:39:22 +0200 Subject: [PATCH 0803/2372] Updated dependencies in contracts. --- contracts/burner/Cargo.lock | 1 + contracts/crypto-verify/Cargo.lock | 1 + contracts/cyberpunk/Cargo.lock | 1 + contracts/floaty/Cargo.lock | 1 + contracts/hackatom/Cargo.lock | 1 + contracts/ibc-reflect-send/Cargo.lock | 1 + contracts/ibc-reflect/Cargo.lock | 1 + contracts/queue/Cargo.lock | 1 + contracts/reflect/Cargo.lock | 1 + contracts/staking/Cargo.lock | 1 + contracts/virus/Cargo.lock | 1 + 11 files changed, 11 insertions(+) diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 7fa350f505..b08806ef22 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -196,6 +196,7 @@ name = "cosmwasm-crypto" version = "1.4.0" dependencies = [ "digest 0.10.7", + "ecdsa", "ed25519-zebra", "k256", "rand_core 0.6.4", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 5636fa7796..466bb94c9d 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -185,6 +185,7 @@ name = "cosmwasm-crypto" version = "1.4.0" dependencies = [ "digest 0.10.7", + "ecdsa", "ed25519-zebra", "k256", "rand_core 0.6.4", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 8e57b58a64..ca11131276 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -220,6 +220,7 @@ name = "cosmwasm-crypto" version = "1.4.0" dependencies = [ "digest 0.10.7", + "ecdsa", "ed25519-zebra", "k256", "rand_core 0.6.4", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 2e0272a2a5..0f4a73c693 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -185,6 +185,7 @@ name = "cosmwasm-crypto" version = "1.4.0" dependencies = [ "digest 0.10.7", + "ecdsa", "ed25519-zebra", "k256", "rand_core 0.6.4", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index f83083cc8f..7a963bfbee 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -185,6 +185,7 @@ name = "cosmwasm-crypto" version = "1.4.0" dependencies = [ "digest 0.10.7", + "ecdsa", "ed25519-zebra", "k256", "rand_core 0.6.4", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 81954a09e6..471e9d203f 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -185,6 +185,7 @@ name = "cosmwasm-crypto" version = "1.4.0" dependencies = [ "digest 0.10.7", + "ecdsa", "ed25519-zebra", "k256", "rand_core 0.6.4", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 6a64201229..972966f513 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -185,6 +185,7 @@ name = "cosmwasm-crypto" version = "1.4.0" dependencies = [ "digest 0.10.7", + "ecdsa", "ed25519-zebra", "k256", "rand_core 0.6.4", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 1bd7277f4b..69167026b5 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -185,6 +185,7 @@ name = "cosmwasm-crypto" version = "1.4.0" dependencies = [ "digest 0.10.7", + "ecdsa", "ed25519-zebra", "k256", "rand_core 0.6.4", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index b144d43571..827498c662 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -185,6 +185,7 @@ name = "cosmwasm-crypto" version = "1.4.0" dependencies = [ "digest 0.10.7", + "ecdsa", "ed25519-zebra", "k256", "rand_core 0.6.4", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 4197746d30..680c1ae6be 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -185,6 +185,7 @@ name = "cosmwasm-crypto" version = "1.4.0" dependencies = [ "digest 0.10.7", + "ecdsa", "ed25519-zebra", "k256", "rand_core 0.6.4", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 0727cbeb83..a77d4d11e7 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -185,6 +185,7 @@ name = "cosmwasm-crypto" version = "1.4.0" dependencies = [ "digest 0.10.7", + "ecdsa", "ed25519-zebra", "k256", "rand_core 0.6.4", From 156c2cb791c84d32bb1f51ba2b057e7a8c1b1586 Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Tue, 3 Oct 2023 14:01:26 +0200 Subject: [PATCH 0804/2372] Commented dependency usage. --- packages/crypto/Cargo.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 8e5108bfc0..af419e90e8 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -20,11 +20,12 @@ bench = false [dependencies] k256 = { version = "0.13.1", features = ["ecdsa"] } -ecdsa = "0.16.2" ed25519-zebra = "3" digest = "0.10" rand_core = { version = "0.6", features = ["getrandom"] } thiserror = "1.0.38" +# Not used directly, but needed to bump transitive dependency, see: https://github.com/CosmWasm/cosmwasm/pull/1899 for details. +ecdsa = "0.16.2" [dev-dependencies] criterion = "0.4" From 2d20bdfaa5796aec5e272996bb2bdc6c73dc4a5b Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Thu, 5 Oct 2023 11:16:31 +0200 Subject: [PATCH 0805/2372] Initial implementation. --- Cargo.lock | 7 ++ packages/std/Cargo.toml | 1 + packages/std/src/testing/mock.rs | 130 +++++++++++++++++++++++++++++++ 3 files changed, 138 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index a443db5af2..dbbecf6190 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -179,6 +179,12 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + [[package]] name = "bitflags" version = "1.3.2" @@ -488,6 +494,7 @@ name = "cosmwasm-std" version = "1.4.0" dependencies = [ "base64", + "bech32", "bnum", "chrono", "cosmwasm-crypto", diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 323b73b70c..dbacdb8d4a 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -62,6 +62,7 @@ serde-json-wasm = { version = "0.5.0" } thiserror = "1.0.26" bnum = "0.8.0" static_assertions = "1.1.0" +bech32 = "0.9.1" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] cosmwasm-crypto = { path = "../crypto", version = "1.4.0" } diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index d2ca6d65f6..ff6026faf2 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -1,10 +1,12 @@ use alloc::collections::BTreeMap; +use bech32::{encode, ToBase32, Variant}; use core::marker::PhantomData; #[cfg(feature = "cosmwasm_1_3")] use core::ops::Bound; use serde::de::DeserializeOwned; #[cfg(feature = "stargate")] use serde::Serialize; +use sha2::{Digest, Sha256}; #[cfg(feature = "cosmwasm_1_3")] use std::collections::BTreeSet; use std::collections::HashMap; @@ -106,6 +108,19 @@ const CANONICAL_LENGTH: usize = 90; // n = 45 const SHUFFLES_ENCODE: usize = 10; const SHUFFLES_DECODE: usize = 2; +/// Default prefix used when creating Bech32 encoded address. +/// +/// Prefix should not be empty. +const BECH32_PREFIX: &str = "cosmwasm"; + +/// Default Bech32 variant used when creating Bech32 encoded address. +const BECH32_VARIANT: Variant = Variant::Bech32; + +/// Number of bytes taken from digest as input data for generating Bech32 encoded addresses. +/// +/// This value should be currently set to 32 or 20 bytes. +const BECH32_INPUT_LENGTH: usize = 32; + // MockApi zero pads all human addresses to make them fit the canonical_length // it trims off zeros for the reverse operation. // not really smart, but allows us to see a difference (and consistent length for canonical addresses) @@ -114,12 +129,21 @@ pub struct MockApi { /// Length of canonical addresses created with this API. Contracts should not make any assumptions /// what this value is. canonical_length: usize, + /// Prefix used for creating addresses in Bech32 encoding. + bech32_prefix: &'static str, + /// Variant of the Bech32 encoding used for generating addresses. + bech32_variant: Variant, + /// Maximum length of the inout data used for generating Bech32 encoded addresses. + bech32_input_length: usize, } impl Default for MockApi { fn default() -> Self { MockApi { canonical_length: CANONICAL_LENGTH, + bech32_prefix: BECH32_PREFIX, + bech32_variant: BECH32_VARIANT, + bech32_input_length: BECH32_INPUT_LENGTH, } } } @@ -244,6 +268,35 @@ impl Api for MockApi { } } +impl MockApi { + /// Returns an address built from provided input string. + /// + /// # Example + /// + /// ``` + /// # use cosmwasm_std::Addr; + /// # use cosmwasm_std::testing::MockApi; + /// # + /// let mock_api = MockApi::default(); + /// let addr = mock_api.make_addr("creator"); + /// + /// assert_eq!("cosmwasm1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqs8s7vcp", addr.to_string()); + /// ``` + pub fn make_addr(&self, input: &str) -> Addr { + let digest = Sha256::digest(input).to_vec(); + if self.bech32_input_length > 0 && self.bech32_input_length <= digest.len() { + if let Ok(address) = encode( + self.bech32_prefix, + (&digest[..self.bech32_input_length]).to_base32(), + self.bech32_variant, + ) { + return Addr::unchecked(address); + } + } + Addr::unchecked(input) + } +} + /// Returns a default enviroment with height, time, chain_id, and contract address /// You can submit as is to most contracts, or modify height/time if you want to /// test for expiration. @@ -2264,4 +2317,81 @@ mod tests { assert_eq!(digit_sum(&[255, 1]), 256); } + + #[test] + fn making_an_address_works() { + let mut mock_api = MockApi::default(); + + // address generated using default settings + assert_eq!( + "cosmwasm1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqs8s7vcp", + mock_api.make_addr("creator").to_string() + ); + + // address generated using default settings and from empty input string + assert_eq!( + "cosmwasm1uwcvgs5clswpfxhm7nyfjmaeysn6us0yvjdexn9yjkv3k7zjhp2sly4xh9", + mock_api.make_addr("").to_string() + ); + + // address generated using "juno" prefix + mock_api.bech32_prefix = "juno"; + assert_eq!( + "juno1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqsksmtyp", + mock_api.make_addr("creator").to_string() + ); + + // address generated using "juno" prefix and 20 bytes from the SHA256 digest + mock_api.bech32_input_length = 20; + assert_eq!( + "juno1h34lmpywh4upnjdg90cjf4j70aee6z8qywe5hq", + mock_api.make_addr("creator").to_string() + ); + + // address generated using "juno" prefix, 20 bytes from the SHA256 digest and Bech32m variant + mock_api.bech32_variant = Variant::Bech32m; + assert_eq!( + "juno1h34lmpywh4upnjdg90cjf4j70aee6z8q3jfcjz", + mock_api.make_addr("creator").to_string() + ); + } + + #[test] + fn making_an_address_fails() { + // when for some reason generating the address fails, + // then the original input is returned as an unchecked address + + // empty prefix + assert_eq!( + "creator", + MockApi { + bech32_prefix: "", + ..Default::default() + } + .make_addr("creator") + .to_string() + ); + + // no bytes taken from SHA256 digest + assert_eq!( + "creator", + MockApi { + bech32_input_length: 0, + ..Default::default() + } + .make_addr("creator") + .to_string() + ); + + // SHA256 digest has not so many bytes as expected + assert_eq!( + "creator", + MockApi { + bech32_input_length: 120, + ..Default::default() + } + .make_addr("creator") + .to_string() + ); + } } From 92aeea144c5b047808c3480727e68b450643d50d Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Thu, 5 Oct 2023 12:39:02 +0200 Subject: [PATCH 0806/2372] Rebuild all contracts. --- contracts/burner/Cargo.lock | 7 +++++++ contracts/crypto-verify/Cargo.lock | 7 +++++++ contracts/cyberpunk/Cargo.lock | 7 +++++++ contracts/floaty/Cargo.lock | 7 +++++++ contracts/hackatom/Cargo.lock | 7 +++++++ contracts/ibc-reflect-send/Cargo.lock | 7 +++++++ contracts/ibc-reflect/Cargo.lock | 7 +++++++ contracts/queue/Cargo.lock | 7 +++++++ contracts/reflect/Cargo.lock | 7 +++++++ contracts/staking/Cargo.lock | 7 +++++++ contracts/virus/Cargo.lock | 7 +++++++ 11 files changed, 77 insertions(+) diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index b08806ef22..82aa2a9cab 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -73,6 +73,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dea908e7347a8c64e378c17e30ef880ad73e3b4498346b055c2c00ea342f3179" +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + [[package]] name = "bitflags" version = "1.2.1" @@ -235,6 +241,7 @@ name = "cosmwasm-std" version = "1.4.0" dependencies = [ "base64", + "bech32", "bnum", "cosmwasm-crypto", "cosmwasm-derive", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 466bb94c9d..47cdf8470b 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -73,6 +73,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dea908e7347a8c64e378c17e30ef880ad73e3b4498346b055c2c00ea342f3179" +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + [[package]] name = "bitflags" version = "1.2.1" @@ -224,6 +230,7 @@ name = "cosmwasm-std" version = "1.4.0" dependencies = [ "base64", + "bech32", "bnum", "cosmwasm-crypto", "cosmwasm-derive", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index ca11131276..a413c3a867 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -91,6 +91,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dea908e7347a8c64e378c17e30ef880ad73e3b4498346b055c2c00ea342f3179" +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + [[package]] name = "bitflags" version = "1.2.1" @@ -259,6 +265,7 @@ name = "cosmwasm-std" version = "1.4.0" dependencies = [ "base64 0.21.2", + "bech32", "bnum", "cosmwasm-crypto", "cosmwasm-derive", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 0f4a73c693..fd591b7238 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -73,6 +73,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dea908e7347a8c64e378c17e30ef880ad73e3b4498346b055c2c00ea342f3179" +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + [[package]] name = "bitflags" version = "1.2.1" @@ -224,6 +230,7 @@ name = "cosmwasm-std" version = "1.4.0" dependencies = [ "base64", + "bech32", "bnum", "cosmwasm-crypto", "cosmwasm-derive", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 7a963bfbee..f6c10faa47 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -73,6 +73,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dea908e7347a8c64e378c17e30ef880ad73e3b4498346b055c2c00ea342f3179" +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + [[package]] name = "bitflags" version = "1.2.1" @@ -224,6 +230,7 @@ name = "cosmwasm-std" version = "1.4.0" dependencies = [ "base64", + "bech32", "bnum", "cosmwasm-crypto", "cosmwasm-derive", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 471e9d203f..ffb2af64e9 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -73,6 +73,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dea908e7347a8c64e378c17e30ef880ad73e3b4498346b055c2c00ea342f3179" +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + [[package]] name = "bitflags" version = "1.2.1" @@ -224,6 +230,7 @@ name = "cosmwasm-std" version = "1.4.0" dependencies = [ "base64", + "bech32", "bnum", "cosmwasm-crypto", "cosmwasm-derive", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 972966f513..6b851f1890 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -73,6 +73,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dea908e7347a8c64e378c17e30ef880ad73e3b4498346b055c2c00ea342f3179" +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + [[package]] name = "bitflags" version = "1.2.1" @@ -224,6 +230,7 @@ name = "cosmwasm-std" version = "1.4.0" dependencies = [ "base64", + "bech32", "bnum", "cosmwasm-crypto", "cosmwasm-derive", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 69167026b5..7565fd5bae 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -73,6 +73,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dea908e7347a8c64e378c17e30ef880ad73e3b4498346b055c2c00ea342f3179" +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + [[package]] name = "bitflags" version = "1.2.1" @@ -224,6 +230,7 @@ name = "cosmwasm-std" version = "1.4.0" dependencies = [ "base64", + "bech32", "bnum", "cosmwasm-crypto", "cosmwasm-derive", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 827498c662..77fd87b6e7 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -73,6 +73,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dea908e7347a8c64e378c17e30ef880ad73e3b4498346b055c2c00ea342f3179" +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + [[package]] name = "bitflags" version = "1.2.1" @@ -224,6 +230,7 @@ name = "cosmwasm-std" version = "1.4.0" dependencies = [ "base64", + "bech32", "bnum", "cosmwasm-crypto", "cosmwasm-derive", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 680c1ae6be..ac7bb115dc 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -73,6 +73,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dea908e7347a8c64e378c17e30ef880ad73e3b4498346b055c2c00ea342f3179" +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + [[package]] name = "bitflags" version = "1.2.1" @@ -224,6 +230,7 @@ name = "cosmwasm-std" version = "1.4.0" dependencies = [ "base64", + "bech32", "bnum", "cosmwasm-crypto", "cosmwasm-derive", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index a77d4d11e7..3f90131420 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -73,6 +73,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dea908e7347a8c64e378c17e30ef880ad73e3b4498346b055c2c00ea342f3179" +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + [[package]] name = "bitflags" version = "1.2.1" @@ -224,6 +230,7 @@ name = "cosmwasm-std" version = "1.4.0" dependencies = [ "base64", + "bech32", "bnum", "cosmwasm-crypto", "cosmwasm-derive", From 38b9f586f2a68b58f7ddb9232e4932fd6864f8d1 Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Thu, 5 Oct 2023 13:03:46 +0200 Subject: [PATCH 0807/2372] Corrected the function name. --- packages/std/src/testing/mock.rs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index ff6026faf2..d7907832bf 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -278,11 +278,11 @@ impl MockApi { /// # use cosmwasm_std::testing::MockApi; /// # /// let mock_api = MockApi::default(); - /// let addr = mock_api.make_addr("creator"); + /// let addr = mock_api.addr_make("creator"); /// /// assert_eq!("cosmwasm1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqs8s7vcp", addr.to_string()); /// ``` - pub fn make_addr(&self, input: &str) -> Addr { + pub fn addr_make(&self, input: &str) -> Addr { let digest = Sha256::digest(input).to_vec(); if self.bech32_input_length > 0 && self.bech32_input_length <= digest.len() { if let Ok(address) = encode( @@ -2325,34 +2325,34 @@ mod tests { // address generated using default settings assert_eq!( "cosmwasm1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqs8s7vcp", - mock_api.make_addr("creator").to_string() + mock_api.addr_make("creator").to_string() ); // address generated using default settings and from empty input string assert_eq!( "cosmwasm1uwcvgs5clswpfxhm7nyfjmaeysn6us0yvjdexn9yjkv3k7zjhp2sly4xh9", - mock_api.make_addr("").to_string() + mock_api.addr_make("").to_string() ); // address generated using "juno" prefix mock_api.bech32_prefix = "juno"; assert_eq!( "juno1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqsksmtyp", - mock_api.make_addr("creator").to_string() + mock_api.addr_make("creator").to_string() ); // address generated using "juno" prefix and 20 bytes from the SHA256 digest mock_api.bech32_input_length = 20; assert_eq!( "juno1h34lmpywh4upnjdg90cjf4j70aee6z8qywe5hq", - mock_api.make_addr("creator").to_string() + mock_api.addr_make("creator").to_string() ); // address generated using "juno" prefix, 20 bytes from the SHA256 digest and Bech32m variant mock_api.bech32_variant = Variant::Bech32m; assert_eq!( "juno1h34lmpywh4upnjdg90cjf4j70aee6z8q3jfcjz", - mock_api.make_addr("creator").to_string() + mock_api.addr_make("creator").to_string() ); } @@ -2368,7 +2368,7 @@ mod tests { bech32_prefix: "", ..Default::default() } - .make_addr("creator") + .addr_make("creator") .to_string() ); @@ -2379,7 +2379,7 @@ mod tests { bech32_input_length: 0, ..Default::default() } - .make_addr("creator") + .addr_make("creator") .to_string() ); @@ -2390,7 +2390,7 @@ mod tests { bech32_input_length: 120, ..Default::default() } - .make_addr("creator") + .addr_make("creator") .to_string() ); } From 0bcde82d079145550ffffa14ab4412904096c0ef Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Thu, 5 Oct 2023 13:26:24 +0200 Subject: [PATCH 0808/2372] Moved bech dependency to non-wasm block. --- packages/std/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index dbacdb8d4a..6ab8a5ab44 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -62,9 +62,9 @@ serde-json-wasm = { version = "0.5.0" } thiserror = "1.0.26" bnum = "0.8.0" static_assertions = "1.1.0" -bech32 = "0.9.1" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] +bech32 = "0.9.1" cosmwasm-crypto = { path = "../crypto", version = "1.4.0" } [dev-dependencies] From 99a915fcbd37518e828f28336ffd914b6b062e19 Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Thu, 5 Oct 2023 14:12:43 +0200 Subject: [PATCH 0809/2372] Simplified implementation. --- packages/std/src/testing/mock.rs | 110 +++++++++---------------------- 1 file changed, 30 insertions(+), 80 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index d7907832bf..3c0bae55da 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -113,14 +113,6 @@ const SHUFFLES_DECODE: usize = 2; /// Prefix should not be empty. const BECH32_PREFIX: &str = "cosmwasm"; -/// Default Bech32 variant used when creating Bech32 encoded address. -const BECH32_VARIANT: Variant = Variant::Bech32; - -/// Number of bytes taken from digest as input data for generating Bech32 encoded addresses. -/// -/// This value should be currently set to 32 or 20 bytes. -const BECH32_INPUT_LENGTH: usize = 32; - // MockApi zero pads all human addresses to make them fit the canonical_length // it trims off zeros for the reverse operation. // not really smart, but allows us to see a difference (and consistent length for canonical addresses) @@ -131,10 +123,6 @@ pub struct MockApi { canonical_length: usize, /// Prefix used for creating addresses in Bech32 encoding. bech32_prefix: &'static str, - /// Variant of the Bech32 encoding used for generating addresses. - bech32_variant: Variant, - /// Maximum length of the inout data used for generating Bech32 encoded addresses. - bech32_input_length: usize, } impl Default for MockApi { @@ -142,8 +130,6 @@ impl Default for MockApi { MockApi { canonical_length: CANONICAL_LENGTH, bech32_prefix: BECH32_PREFIX, - bech32_variant: BECH32_VARIANT, - bech32_input_length: BECH32_INPUT_LENGTH, } } } @@ -269,6 +255,26 @@ impl Api for MockApi { } impl MockApi { + /// Returns [MockApi] with Bech32 prefix set to provided value. + /// + /// # Example + /// + /// ``` + /// # use cosmwasm_std::Addr; + /// # use cosmwasm_std::testing::MockApi; + /// # + /// let mock_api = MockApi::with_prefix("juno"); + /// let addr = mock_api.addr_make("creator").to_string(); + /// + /// assert_eq!("juno1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqsksmtyp", addr); + /// ``` + pub fn with_prefix(prefix: &'static str) -> Self { + Self { + bech32_prefix: prefix, + ..Default::default() + } + } + /// Returns an address built from provided input string. /// /// # Example @@ -278,22 +284,16 @@ impl MockApi { /// # use cosmwasm_std::testing::MockApi; /// # /// let mock_api = MockApi::default(); - /// let addr = mock_api.addr_make("creator"); + /// let addr = mock_api.addr_make("creator").to_string(); /// - /// assert_eq!("cosmwasm1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqs8s7vcp", addr.to_string()); + /// assert_eq!("cosmwasm1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqs8s7vcp", addr); /// ``` pub fn addr_make(&self, input: &str) -> Addr { let digest = Sha256::digest(input).to_vec(); - if self.bech32_input_length > 0 && self.bech32_input_length <= digest.len() { - if let Ok(address) = encode( - self.bech32_prefix, - (&digest[..self.bech32_input_length]).to_base32(), - self.bech32_variant, - ) { - return Addr::unchecked(address); - } + match encode(self.bech32_prefix, digest.to_base32(), Variant::Bech32) { + Ok(address) => Addr::unchecked(address), + Err(reason) => panic!("Generating address failed with reason: {}", reason), } - Addr::unchecked(input) } } @@ -2320,78 +2320,28 @@ mod tests { #[test] fn making_an_address_works() { - let mut mock_api = MockApi::default(); + let mock_api = MockApi::default(); - // address generated using default settings assert_eq!( "cosmwasm1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqs8s7vcp", mock_api.addr_make("creator").to_string() ); - // address generated using default settings and from empty input string assert_eq!( "cosmwasm1uwcvgs5clswpfxhm7nyfjmaeysn6us0yvjdexn9yjkv3k7zjhp2sly4xh9", mock_api.addr_make("").to_string() ); - // address generated using "juno" prefix - mock_api.bech32_prefix = "juno"; + let mock_api = MockApi::with_prefix("juno"); assert_eq!( "juno1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqsksmtyp", mock_api.addr_make("creator").to_string() ); - - // address generated using "juno" prefix and 20 bytes from the SHA256 digest - mock_api.bech32_input_length = 20; - assert_eq!( - "juno1h34lmpywh4upnjdg90cjf4j70aee6z8qywe5hq", - mock_api.addr_make("creator").to_string() - ); - - // address generated using "juno" prefix, 20 bytes from the SHA256 digest and Bech32m variant - mock_api.bech32_variant = Variant::Bech32m; - assert_eq!( - "juno1h34lmpywh4upnjdg90cjf4j70aee6z8q3jfcjz", - mock_api.addr_make("creator").to_string() - ); } #[test] - fn making_an_address_fails() { - // when for some reason generating the address fails, - // then the original input is returned as an unchecked address - - // empty prefix - assert_eq!( - "creator", - MockApi { - bech32_prefix: "", - ..Default::default() - } - .addr_make("creator") - .to_string() - ); - - // no bytes taken from SHA256 digest - assert_eq!( - "creator", - MockApi { - bech32_input_length: 0, - ..Default::default() - } - .addr_make("creator") - .to_string() - ); - - // SHA256 digest has not so many bytes as expected - assert_eq!( - "creator", - MockApi { - bech32_input_length: 120, - ..Default::default() - } - .addr_make("creator") - .to_string() - ); + #[should_panic(expected = "Generating address failed with reason: invalid length")] + fn making_an_address_with_empty_prefix_should_panic() { + MockApi::with_prefix("").addr_make("creator"); } } From a19d374405f639e34f337cab3ca5db7cc3242bf8 Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Thu, 5 Oct 2023 14:15:07 +0200 Subject: [PATCH 0810/2372] Fixed clippy warnings. --- packages/std/src/testing/mock.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 3c0bae55da..35f183f553 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -292,7 +292,7 @@ impl MockApi { let digest = Sha256::digest(input).to_vec(); match encode(self.bech32_prefix, digest.to_base32(), Variant::Bech32) { Ok(address) => Addr::unchecked(address), - Err(reason) => panic!("Generating address failed with reason: {}", reason), + Err(reason) => panic!("Generating address failed with reason: {reason}"), } } } From 7c7b72dacd7c36d074c11e070430ca72dc0f4b81 Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Thu, 5 Oct 2023 14:33:04 +0200 Subject: [PATCH 0811/2372] Made function with_prefix composable. --- packages/std/src/testing/mock.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 35f183f553..61629bf5e1 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -263,12 +263,12 @@ impl MockApi { /// # use cosmwasm_std::Addr; /// # use cosmwasm_std::testing::MockApi; /// # - /// let mock_api = MockApi::with_prefix("juno"); + /// let mock_api = MockApi::default().with_prefix("juno"); /// let addr = mock_api.addr_make("creator").to_string(); /// /// assert_eq!("juno1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqsksmtyp", addr); /// ``` - pub fn with_prefix(prefix: &'static str) -> Self { + pub fn with_prefix(self, prefix: &'static str) -> Self { Self { bech32_prefix: prefix, ..Default::default() @@ -2332,7 +2332,7 @@ mod tests { mock_api.addr_make("").to_string() ); - let mock_api = MockApi::with_prefix("juno"); + let mock_api = MockApi::default().with_prefix("juno"); assert_eq!( "juno1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqsksmtyp", mock_api.addr_make("creator").to_string() @@ -2342,6 +2342,6 @@ mod tests { #[test] #[should_panic(expected = "Generating address failed with reason: invalid length")] fn making_an_address_with_empty_prefix_should_panic() { - MockApi::with_prefix("").addr_make("creator"); + MockApi::default().with_prefix("").addr_make("creator"); } } From 5a49ca53ece79fb83acc24d7e95cb2e3a0b6b9f7 Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Thu, 5 Oct 2023 15:00:26 +0200 Subject: [PATCH 0812/2372] Fixed clippy warnings. --- packages/std/src/errors/std_error.rs | 2 +- packages/std/src/math/isqrt.rs | 22 +++++++++++----------- packages/vm/src/calls.rs | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index 2900e65141..60a8a8dc0a 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -888,7 +888,7 @@ mod tests { } #[test] - fn from_std_string_fromutf8error_works() { + fn from_std_string_from_utf8error_works() { let error: StdError = String::from_utf8(b"Hello \xF0\x90\x80World".to_vec()) .unwrap_err() .into(); diff --git a/packages/std/src/math/isqrt.rs b/packages/std/src/math/isqrt.rs index 6fd58c3974..837cada5ae 100644 --- a/packages/std/src/math/isqrt.rs +++ b/packages/std/src/math/isqrt.rs @@ -59,19 +59,19 @@ mod tests { #[test] fn isqrt_primitives() { // Let's check correctness. - assert_eq!(0u8.isqrt(), 0); - assert_eq!(1u8.isqrt(), 1); - assert_eq!(24u8.isqrt(), 4); - assert_eq!(25u8.isqrt(), 5); - assert_eq!(26u8.isqrt(), 5); - assert_eq!(36u8.isqrt(), 6); + assert_eq!(super::Isqrt::isqrt(0u8), 0); + assert_eq!(super::Isqrt::isqrt(1u8), 1); + assert_eq!(super::Isqrt::isqrt(24u8), 4); + assert_eq!(super::Isqrt::isqrt(25u8), 5); + assert_eq!(super::Isqrt::isqrt(26u8), 5); + assert_eq!(super::Isqrt::isqrt(36u8), 6); // Let's also check different types. - assert_eq!(26u8.isqrt(), 5); - assert_eq!(26u16.isqrt(), 5); - assert_eq!(26u32.isqrt(), 5); - assert_eq!(26u64.isqrt(), 5); - assert_eq!(26u128.isqrt(), 5); + assert_eq!(super::Isqrt::isqrt(26u8), 5); + assert_eq!(super::Isqrt::isqrt(26u16), 5); + assert_eq!(super::Isqrt::isqrt(26u32), 5); + assert_eq!(super::Isqrt::isqrt(26u64), 5); + assert_eq!(super::Isqrt::isqrt(26u128), 5); } #[test] diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 3f3037b8e0..5828b02102 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -769,7 +769,7 @@ mod tests { let contract_result = call_query(&mut instance, &mock_env(), msg) .unwrap() .unwrap(); - let instructions: Vec = from_json(&contract_result).unwrap(); + let instructions: Vec = from_json(contract_result).unwrap(); // little sanity check assert_eq!(instructions.len(), 70); From ef372c80923f725162fedbcd510c9bb04685dac2 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 4 Oct 2023 22:39:30 +0200 Subject: [PATCH 0813/2372] Upgrade to latest wasmer v4.2.1 --- packages/vm/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index b38c772715..b9593e95b1 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -48,8 +48,8 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " serde_json = "1.0.40" sha2 = "0.10.3" thiserror = "1.0.26" -wasmer = { version = "=4.1.2", default-features = false, features = ["cranelift", "singlepass"] } -wasmer-middlewares = "=4.1.2" +wasmer = { version = "=4.2.1", default-features = false, features = ["cranelift", "singlepass"] } +wasmer-middlewares = "=4.2.1" # Dependencies that we do not use ourself. We add those entries # to bump the min version of them. From 378b620ab79dd7214d035373647268fde0626ec3 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 4 Oct 2023 22:39:56 +0200 Subject: [PATCH 0814/2372] Update wasmer version in tests --- packages/vm/src/modules/file_system_cache.rs | 2 +- packages/vm/src/modules/versioning.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 52f5be2763..b634007087 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -287,7 +287,7 @@ mod tests { cache.store(&checksum, &module).unwrap(); let mut globber = glob::glob(&format!( - "{}/v7-wasmer4/**/{}", + "{}/v7-wasmer5/**/{}", tmp_dir.path().to_string_lossy(), checksum )) diff --git a/packages/vm/src/modules/versioning.rs b/packages/vm/src/modules/versioning.rs index 1911852b3f..f48d7198b0 100644 --- a/packages/vm/src/modules/versioning.rs +++ b/packages/vm/src/modules/versioning.rs @@ -51,6 +51,6 @@ mod tests { #[test] fn current_wasmer_module_version_works() { let version = current_wasmer_module_version(); - assert_eq!(version, 4); + assert_eq!(version, 5); } } From f4e7eb0c2a3014ccf10b54acfd6cc4cde13c6b9d Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 4 Oct 2023 22:40:25 +0200 Subject: [PATCH 0815/2372] Update lock file --- Cargo.lock | 77 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 59 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a443db5af2..83d5fd4d0f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -718,6 +718,16 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.15" @@ -892,7 +902,7 @@ checksum = "64fba5a42bd76a17cad4bfa00de168ee1cbfa06a5e8ce992ae880218c05641a9" dependencies = [ "byteorder", "dynasm", - "memmap2", + "memmap2 0.5.10", ] [[package]] @@ -1384,6 +1394,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d28bba84adfe6646737845bc5ebbfa2c08424eb1c37e94a1fd2a82adb56a872" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.8.0" @@ -1900,6 +1919,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "self_cell" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" + [[package]] name = "semver" version = "1.0.17" @@ -1992,6 +2017,16 @@ dependencies = [ "digest 0.10.6", ] +[[package]] +name = "shared-buffer" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +dependencies = [ + "bytes", + "memmap2 0.6.2", +] + [[package]] name = "signature" version = "2.1.0" @@ -2365,9 +2400,9 @@ dependencies = [ [[package]] name = "wasmer" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7142dbb91ede83cc0aef2301fa75fcc7e0c9e5a7d5358e3c4f3a7249fe9ce8" +checksum = "39cf1c6bb916d6bf272a5036dfbdff5f78ba6b5c72eb7063dc36b6bde194aadb" dependencies = [ "bytes", "cfg-if", @@ -2378,6 +2413,7 @@ dependencies = [ "rustc-demangle", "serde", "serde-wasm-bindgen", + "shared-buffer", "target-lexicon", "thiserror", "wasm-bindgen", @@ -2393,19 +2429,23 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5b99c70711ec7631b602a9fc95577c40df21e8f3916159c9d80c3fb4f77abdc" +checksum = "8243dee0d182add98bc58f8f352beb60c4631713fe42c02360f056ca0670b7c5" dependencies = [ "backtrace", + "bytes", "cfg-if", "enum-iterator", "enumset", "lazy_static", "leb128", - "memmap2", + "memmap2 0.5.10", "more-asserts", "region", + "rkyv", + "self_cell", + "shared-buffer", "smallvec", "thiserror", "wasmer-types", @@ -2416,9 +2456,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52aef2ef35513a04fed54de9a7dc9c469d4742a5c2e378a5f7e2a79b1327e3bd" +checksum = "1bdc493884a8e52ed822c879bd6db3152dcde18e5bc77cf89a65775c427ef00d" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -2435,9 +2475,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebfd019aa98b19fea0fb1d8db9b539145c9416d183ce4cda4e8e024b2c890aac" +checksum = "4f98444cf5c146d16b38a225612363a5a0809fa07a44e9f2898ed82e9c9bbadb" dependencies = [ "byteorder", "dynasm", @@ -2454,9 +2494,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25bb1425c9e4dc3e2d3aacd6e82e22e27a3127379e0d09bcbdf25ff376229162" +checksum = "e139ec60501bc51e056b6fc14489ce11c2f4df657550cfe726011cc463b970e3" dependencies = [ "proc-macro-error", "proc-macro2", @@ -2466,9 +2506,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acfc08fb8e2e1511f1d69302d7406ace6c0ec0c90e103f8c0a5aa81ecb9fe81f" +checksum = "28bad1cacdfac30b570da8aba328730fa497e444a9325806a661bf73d682dc94" dependencies = [ "wasmer", "wasmer-types", @@ -2477,9 +2517,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7e32ed799fa8c0d96ca9615d9ea8006857a0f0c18e7c2ed8082bd5c63a9ea70" +checksum = "1747223169a18c36793a9fc4885068b9ff8b54fe006dd3d94cbf76a275b1a45c" dependencies = [ "bytecheck", "enum-iterator", @@ -2493,14 +2533,15 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0847513cb176b5d62a6f65d6ae474594935e726a10e9e3387177d9cbf8b8cda0" +checksum = "81c3faab9737b5424acaeffb03f9f921854a7c9a2b71223cafbb9b6fe3b169a7" dependencies = [ "backtrace", "cc", "cfg-if", "corosensei", + "crossbeam-queue", "dashmap", "derivative", "enum-iterator", From 5ee7ad375db3817ea1df781f18e146d0ecb2882f Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 5 Oct 2023 09:13:15 +0200 Subject: [PATCH 0816/2372] Update contracts lock file --- contracts/burner/Cargo.lock | 77 ++++++++++++++++++++------- contracts/crypto-verify/Cargo.lock | 77 ++++++++++++++++++++------- contracts/cyberpunk/Cargo.lock | 77 ++++++++++++++++++++------- contracts/floaty/Cargo.lock | 77 ++++++++++++++++++++------- contracts/hackatom/Cargo.lock | 77 ++++++++++++++++++++------- contracts/ibc-reflect-send/Cargo.lock | 77 ++++++++++++++++++++------- contracts/ibc-reflect/Cargo.lock | 77 ++++++++++++++++++++------- contracts/queue/Cargo.lock | 77 ++++++++++++++++++++------- contracts/reflect/Cargo.lock | 77 ++++++++++++++++++++------- contracts/staking/Cargo.lock | 77 ++++++++++++++++++++------- contracts/virus/Cargo.lock | 77 ++++++++++++++++++++------- 11 files changed, 649 insertions(+), 198 deletions(-) diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index b08806ef22..de38ef833c 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -416,6 +416,16 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.8" @@ -580,7 +590,7 @@ checksum = "64fba5a42bd76a17cad4bfa00de168ee1cbfa06a5e8ce992ae880218c05641a9" dependencies = [ "byteorder", "dynasm", - "memmap2", + "memmap2 0.5.0", ] [[package]] @@ -934,6 +944,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d28bba84adfe6646737845bc5ebbfa2c08424eb1c37e94a1fd2a82adb56a872" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.6.4" @@ -1279,6 +1298,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "self_cell" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" + [[package]] name = "serde" version = "1.0.126" @@ -1365,6 +1390,16 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "shared-buffer" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +dependencies = [ + "bytes", + "memmap2 0.6.2", +] + [[package]] name = "signature" version = "2.1.0" @@ -1646,9 +1681,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7142dbb91ede83cc0aef2301fa75fcc7e0c9e5a7d5358e3c4f3a7249fe9ce8" +checksum = "39cf1c6bb916d6bf272a5036dfbdff5f78ba6b5c72eb7063dc36b6bde194aadb" dependencies = [ "bytes", "cfg-if", @@ -1659,6 +1694,7 @@ dependencies = [ "rustc-demangle", "serde", "serde-wasm-bindgen", + "shared-buffer", "target-lexicon", "thiserror", "wasm-bindgen", @@ -1674,19 +1710,23 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5b99c70711ec7631b602a9fc95577c40df21e8f3916159c9d80c3fb4f77abdc" +checksum = "8243dee0d182add98bc58f8f352beb60c4631713fe42c02360f056ca0670b7c5" dependencies = [ "backtrace", + "bytes", "cfg-if", "enum-iterator", "enumset", "lazy_static", "leb128", - "memmap2", + "memmap2 0.5.0", "more-asserts", "region", + "rkyv", + "self_cell", + "shared-buffer", "smallvec", "thiserror", "wasmer-types", @@ -1697,9 +1737,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52aef2ef35513a04fed54de9a7dc9c469d4742a5c2e378a5f7e2a79b1327e3bd" +checksum = "1bdc493884a8e52ed822c879bd6db3152dcde18e5bc77cf89a65775c427ef00d" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1716,9 +1756,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebfd019aa98b19fea0fb1d8db9b539145c9416d183ce4cda4e8e024b2c890aac" +checksum = "4f98444cf5c146d16b38a225612363a5a0809fa07a44e9f2898ed82e9c9bbadb" dependencies = [ "byteorder", "dynasm", @@ -1735,9 +1775,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25bb1425c9e4dc3e2d3aacd6e82e22e27a3127379e0d09bcbdf25ff376229162" +checksum = "e139ec60501bc51e056b6fc14489ce11c2f4df657550cfe726011cc463b970e3" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1747,9 +1787,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acfc08fb8e2e1511f1d69302d7406ace6c0ec0c90e103f8c0a5aa81ecb9fe81f" +checksum = "28bad1cacdfac30b570da8aba328730fa497e444a9325806a661bf73d682dc94" dependencies = [ "wasmer", "wasmer-types", @@ -1758,9 +1798,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7e32ed799fa8c0d96ca9615d9ea8006857a0f0c18e7c2ed8082bd5c63a9ea70" +checksum = "1747223169a18c36793a9fc4885068b9ff8b54fe006dd3d94cbf76a275b1a45c" dependencies = [ "bytecheck", "enum-iterator", @@ -1774,14 +1814,15 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0847513cb176b5d62a6f65d6ae474594935e726a10e9e3387177d9cbf8b8cda0" +checksum = "81c3faab9737b5424acaeffb03f9f921854a7c9a2b71223cafbb9b6fe3b169a7" dependencies = [ "backtrace", "cc", "cfg-if", "corosensei", + "crossbeam-queue", "dashmap", "derivative", "enum-iterator", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 466bb94c9d..d5e6875200 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -405,6 +405,16 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.8" @@ -585,7 +595,7 @@ checksum = "64fba5a42bd76a17cad4bfa00de168ee1cbfa06a5e8ce992ae880218c05641a9" dependencies = [ "byteorder", "dynasm", - "memmap2", + "memmap2 0.5.0", ] [[package]] @@ -951,6 +961,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d28bba84adfe6646737845bc5ebbfa2c08424eb1c37e94a1fd2a82adb56a872" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.6.4" @@ -1312,6 +1331,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "self_cell" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" + [[package]] name = "serde" version = "1.0.126" @@ -1408,6 +1433,16 @@ dependencies = [ "keccak", ] +[[package]] +name = "shared-buffer" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +dependencies = [ + "bytes", + "memmap2 0.6.2", +] + [[package]] name = "signature" version = "2.1.0" @@ -1689,9 +1724,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7142dbb91ede83cc0aef2301fa75fcc7e0c9e5a7d5358e3c4f3a7249fe9ce8" +checksum = "39cf1c6bb916d6bf272a5036dfbdff5f78ba6b5c72eb7063dc36b6bde194aadb" dependencies = [ "bytes", "cfg-if", @@ -1702,6 +1737,7 @@ dependencies = [ "rustc-demangle", "serde", "serde-wasm-bindgen", + "shared-buffer", "target-lexicon", "thiserror", "wasm-bindgen", @@ -1717,19 +1753,23 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5b99c70711ec7631b602a9fc95577c40df21e8f3916159c9d80c3fb4f77abdc" +checksum = "8243dee0d182add98bc58f8f352beb60c4631713fe42c02360f056ca0670b7c5" dependencies = [ "backtrace", + "bytes", "cfg-if", "enum-iterator", "enumset", "lazy_static", "leb128", - "memmap2", + "memmap2 0.5.0", "more-asserts", "region", + "rkyv", + "self_cell", + "shared-buffer", "smallvec", "thiserror", "wasmer-types", @@ -1740,9 +1780,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52aef2ef35513a04fed54de9a7dc9c469d4742a5c2e378a5f7e2a79b1327e3bd" +checksum = "1bdc493884a8e52ed822c879bd6db3152dcde18e5bc77cf89a65775c427ef00d" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1759,9 +1799,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebfd019aa98b19fea0fb1d8db9b539145c9416d183ce4cda4e8e024b2c890aac" +checksum = "4f98444cf5c146d16b38a225612363a5a0809fa07a44e9f2898ed82e9c9bbadb" dependencies = [ "byteorder", "dynasm", @@ -1778,9 +1818,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25bb1425c9e4dc3e2d3aacd6e82e22e27a3127379e0d09bcbdf25ff376229162" +checksum = "e139ec60501bc51e056b6fc14489ce11c2f4df657550cfe726011cc463b970e3" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1790,9 +1830,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acfc08fb8e2e1511f1d69302d7406ace6c0ec0c90e103f8c0a5aa81ecb9fe81f" +checksum = "28bad1cacdfac30b570da8aba328730fa497e444a9325806a661bf73d682dc94" dependencies = [ "wasmer", "wasmer-types", @@ -1801,9 +1841,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7e32ed799fa8c0d96ca9615d9ea8006857a0f0c18e7c2ed8082bd5c63a9ea70" +checksum = "1747223169a18c36793a9fc4885068b9ff8b54fe006dd3d94cbf76a275b1a45c" dependencies = [ "bytecheck", "enum-iterator", @@ -1817,14 +1857,15 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0847513cb176b5d62a6f65d6ae474594935e726a10e9e3387177d9cbf8b8cda0" +checksum = "81c3faab9737b5424acaeffb03f9f921854a7c9a2b71223cafbb9b6fe3b169a7" dependencies = [ "backtrace", "cc", "cfg-if", "corosensei", + "crossbeam-queue", "dashmap", "derivative", "enum-iterator", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index ca11131276..3ca7b74daf 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -440,6 +440,16 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.8" @@ -616,7 +626,7 @@ checksum = "64fba5a42bd76a17cad4bfa00de168ee1cbfa06a5e8ce992ae880218c05641a9" dependencies = [ "byteorder", "dynasm", - "memmap2", + "memmap2 0.5.0", ] [[package]] @@ -1032,6 +1042,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d28bba84adfe6646737845bc5ebbfa2c08424eb1c37e94a1fd2a82adb56a872" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.6.4" @@ -1403,6 +1422,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "self_cell" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" + [[package]] name = "serde" version = "1.0.126" @@ -1489,6 +1514,16 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "shared-buffer" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +dependencies = [ + "bytes", + "memmap2 0.6.2", +] + [[package]] name = "signature" version = "2.1.0" @@ -1783,9 +1818,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7142dbb91ede83cc0aef2301fa75fcc7e0c9e5a7d5358e3c4f3a7249fe9ce8" +checksum = "39cf1c6bb916d6bf272a5036dfbdff5f78ba6b5c72eb7063dc36b6bde194aadb" dependencies = [ "bytes", "cfg-if", @@ -1796,6 +1831,7 @@ dependencies = [ "rustc-demangle", "serde", "serde-wasm-bindgen", + "shared-buffer", "target-lexicon", "thiserror", "wasm-bindgen", @@ -1811,19 +1847,23 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5b99c70711ec7631b602a9fc95577c40df21e8f3916159c9d80c3fb4f77abdc" +checksum = "8243dee0d182add98bc58f8f352beb60c4631713fe42c02360f056ca0670b7c5" dependencies = [ "backtrace", + "bytes", "cfg-if", "enum-iterator", "enumset", "lazy_static", "leb128", - "memmap2", + "memmap2 0.5.0", "more-asserts", "region", + "rkyv", + "self_cell", + "shared-buffer", "smallvec", "thiserror", "wasmer-types", @@ -1834,9 +1874,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52aef2ef35513a04fed54de9a7dc9c469d4742a5c2e378a5f7e2a79b1327e3bd" +checksum = "1bdc493884a8e52ed822c879bd6db3152dcde18e5bc77cf89a65775c427ef00d" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1853,9 +1893,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebfd019aa98b19fea0fb1d8db9b539145c9416d183ce4cda4e8e024b2c890aac" +checksum = "4f98444cf5c146d16b38a225612363a5a0809fa07a44e9f2898ed82e9c9bbadb" dependencies = [ "byteorder", "dynasm", @@ -1872,9 +1912,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25bb1425c9e4dc3e2d3aacd6e82e22e27a3127379e0d09bcbdf25ff376229162" +checksum = "e139ec60501bc51e056b6fc14489ce11c2f4df657550cfe726011cc463b970e3" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1884,9 +1924,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acfc08fb8e2e1511f1d69302d7406ace6c0ec0c90e103f8c0a5aa81ecb9fe81f" +checksum = "28bad1cacdfac30b570da8aba328730fa497e444a9325806a661bf73d682dc94" dependencies = [ "wasmer", "wasmer-types", @@ -1895,9 +1935,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7e32ed799fa8c0d96ca9615d9ea8006857a0f0c18e7c2ed8082bd5c63a9ea70" +checksum = "1747223169a18c36793a9fc4885068b9ff8b54fe006dd3d94cbf76a275b1a45c" dependencies = [ "bytecheck", "enum-iterator", @@ -1911,14 +1951,15 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0847513cb176b5d62a6f65d6ae474594935e726a10e9e3387177d9cbf8b8cda0" +checksum = "81c3faab9737b5424acaeffb03f9f921854a7c9a2b71223cafbb9b6fe3b169a7" dependencies = [ "backtrace", "cc", "cfg-if", "corosensei", + "crossbeam-queue", "dashmap", "derivative", "enum-iterator", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 0f4a73c693..45dcdbe810 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -405,6 +405,16 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.8" @@ -569,7 +579,7 @@ checksum = "64fba5a42bd76a17cad4bfa00de168ee1cbfa06a5e8ce992ae880218c05641a9" dependencies = [ "byteorder", "dynasm", - "memmap2", + "memmap2 0.5.0", ] [[package]] @@ -935,6 +945,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d28bba84adfe6646737845bc5ebbfa2c08424eb1c37e94a1fd2a82adb56a872" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.6.4" @@ -1296,6 +1315,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "self_cell" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" + [[package]] name = "serde" version = "1.0.126" @@ -1382,6 +1407,16 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "shared-buffer" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +dependencies = [ + "bytes", + "memmap2 0.6.2", +] + [[package]] name = "signature" version = "2.1.0" @@ -1663,9 +1698,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7142dbb91ede83cc0aef2301fa75fcc7e0c9e5a7d5358e3c4f3a7249fe9ce8" +checksum = "39cf1c6bb916d6bf272a5036dfbdff5f78ba6b5c72eb7063dc36b6bde194aadb" dependencies = [ "bytes", "cfg-if", @@ -1676,6 +1711,7 @@ dependencies = [ "rustc-demangle", "serde", "serde-wasm-bindgen", + "shared-buffer", "target-lexicon", "thiserror", "wasm-bindgen", @@ -1691,19 +1727,23 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5b99c70711ec7631b602a9fc95577c40df21e8f3916159c9d80c3fb4f77abdc" +checksum = "8243dee0d182add98bc58f8f352beb60c4631713fe42c02360f056ca0670b7c5" dependencies = [ "backtrace", + "bytes", "cfg-if", "enum-iterator", "enumset", "lazy_static", "leb128", - "memmap2", + "memmap2 0.5.0", "more-asserts", "region", + "rkyv", + "self_cell", + "shared-buffer", "smallvec", "thiserror", "wasmer-types", @@ -1714,9 +1754,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52aef2ef35513a04fed54de9a7dc9c469d4742a5c2e378a5f7e2a79b1327e3bd" +checksum = "1bdc493884a8e52ed822c879bd6db3152dcde18e5bc77cf89a65775c427ef00d" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1733,9 +1773,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebfd019aa98b19fea0fb1d8db9b539145c9416d183ce4cda4e8e024b2c890aac" +checksum = "4f98444cf5c146d16b38a225612363a5a0809fa07a44e9f2898ed82e9c9bbadb" dependencies = [ "byteorder", "dynasm", @@ -1752,9 +1792,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25bb1425c9e4dc3e2d3aacd6e82e22e27a3127379e0d09bcbdf25ff376229162" +checksum = "e139ec60501bc51e056b6fc14489ce11c2f4df657550cfe726011cc463b970e3" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1764,9 +1804,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acfc08fb8e2e1511f1d69302d7406ace6c0ec0c90e103f8c0a5aa81ecb9fe81f" +checksum = "28bad1cacdfac30b570da8aba328730fa497e444a9325806a661bf73d682dc94" dependencies = [ "wasmer", "wasmer-types", @@ -1775,9 +1815,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7e32ed799fa8c0d96ca9615d9ea8006857a0f0c18e7c2ed8082bd5c63a9ea70" +checksum = "1747223169a18c36793a9fc4885068b9ff8b54fe006dd3d94cbf76a275b1a45c" dependencies = [ "bytecheck", "enum-iterator", @@ -1791,14 +1831,15 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0847513cb176b5d62a6f65d6ae474594935e726a10e9e3387177d9cbf8b8cda0" +checksum = "81c3faab9737b5424acaeffb03f9f921854a7c9a2b71223cafbb9b6fe3b169a7" dependencies = [ "backtrace", "cc", "cfg-if", "corosensei", + "crossbeam-queue", "dashmap", "derivative", "enum-iterator", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 7a963bfbee..16b285a0c8 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -405,6 +405,16 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.8" @@ -569,7 +579,7 @@ checksum = "64fba5a42bd76a17cad4bfa00de168ee1cbfa06a5e8ce992ae880218c05641a9" dependencies = [ "byteorder", "dynasm", - "memmap2", + "memmap2 0.5.0", ] [[package]] @@ -936,6 +946,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d28bba84adfe6646737845bc5ebbfa2c08424eb1c37e94a1fd2a82adb56a872" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.6.4" @@ -1281,6 +1300,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "self_cell" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" + [[package]] name = "serde" version = "1.0.126" @@ -1367,6 +1392,16 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "shared-buffer" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +dependencies = [ + "bytes", + "memmap2 0.6.2", +] + [[package]] name = "signature" version = "2.1.0" @@ -1648,9 +1683,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7142dbb91ede83cc0aef2301fa75fcc7e0c9e5a7d5358e3c4f3a7249fe9ce8" +checksum = "39cf1c6bb916d6bf272a5036dfbdff5f78ba6b5c72eb7063dc36b6bde194aadb" dependencies = [ "bytes", "cfg-if", @@ -1661,6 +1696,7 @@ dependencies = [ "rustc-demangle", "serde", "serde-wasm-bindgen", + "shared-buffer", "target-lexicon", "thiserror", "wasm-bindgen", @@ -1676,19 +1712,23 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5b99c70711ec7631b602a9fc95577c40df21e8f3916159c9d80c3fb4f77abdc" +checksum = "8243dee0d182add98bc58f8f352beb60c4631713fe42c02360f056ca0670b7c5" dependencies = [ "backtrace", + "bytes", "cfg-if", "enum-iterator", "enumset", "lazy_static", "leb128", - "memmap2", + "memmap2 0.5.0", "more-asserts", "region", + "rkyv", + "self_cell", + "shared-buffer", "smallvec", "thiserror", "wasmer-types", @@ -1699,9 +1739,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52aef2ef35513a04fed54de9a7dc9c469d4742a5c2e378a5f7e2a79b1327e3bd" +checksum = "1bdc493884a8e52ed822c879bd6db3152dcde18e5bc77cf89a65775c427ef00d" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1718,9 +1758,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebfd019aa98b19fea0fb1d8db9b539145c9416d183ce4cda4e8e024b2c890aac" +checksum = "4f98444cf5c146d16b38a225612363a5a0809fa07a44e9f2898ed82e9c9bbadb" dependencies = [ "byteorder", "dynasm", @@ -1737,9 +1777,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25bb1425c9e4dc3e2d3aacd6e82e22e27a3127379e0d09bcbdf25ff376229162" +checksum = "e139ec60501bc51e056b6fc14489ce11c2f4df657550cfe726011cc463b970e3" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1749,9 +1789,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acfc08fb8e2e1511f1d69302d7406ace6c0ec0c90e103f8c0a5aa81ecb9fe81f" +checksum = "28bad1cacdfac30b570da8aba328730fa497e444a9325806a661bf73d682dc94" dependencies = [ "wasmer", "wasmer-types", @@ -1760,9 +1800,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7e32ed799fa8c0d96ca9615d9ea8006857a0f0c18e7c2ed8082bd5c63a9ea70" +checksum = "1747223169a18c36793a9fc4885068b9ff8b54fe006dd3d94cbf76a275b1a45c" dependencies = [ "bytecheck", "enum-iterator", @@ -1776,14 +1816,15 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0847513cb176b5d62a6f65d6ae474594935e726a10e9e3387177d9cbf8b8cda0" +checksum = "81c3faab9737b5424acaeffb03f9f921854a7c9a2b71223cafbb9b6fe3b169a7" dependencies = [ "backtrace", "cc", "cfg-if", "corosensei", + "crossbeam-queue", "dashmap", "derivative", "enum-iterator", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 471e9d203f..6e23d046be 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -405,6 +405,16 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.8" @@ -569,7 +579,7 @@ checksum = "64fba5a42bd76a17cad4bfa00de168ee1cbfa06a5e8ce992ae880218c05641a9" dependencies = [ "byteorder", "dynasm", - "memmap2", + "memmap2 0.5.0", ] [[package]] @@ -934,6 +944,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d28bba84adfe6646737845bc5ebbfa2c08424eb1c37e94a1fd2a82adb56a872" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.6.4" @@ -1279,6 +1298,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "self_cell" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" + [[package]] name = "serde" version = "1.0.126" @@ -1365,6 +1390,16 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "shared-buffer" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +dependencies = [ + "bytes", + "memmap2 0.6.2", +] + [[package]] name = "signature" version = "2.1.0" @@ -1646,9 +1681,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7142dbb91ede83cc0aef2301fa75fcc7e0c9e5a7d5358e3c4f3a7249fe9ce8" +checksum = "39cf1c6bb916d6bf272a5036dfbdff5f78ba6b5c72eb7063dc36b6bde194aadb" dependencies = [ "bytes", "cfg-if", @@ -1659,6 +1694,7 @@ dependencies = [ "rustc-demangle", "serde", "serde-wasm-bindgen", + "shared-buffer", "target-lexicon", "thiserror", "wasm-bindgen", @@ -1674,19 +1710,23 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5b99c70711ec7631b602a9fc95577c40df21e8f3916159c9d80c3fb4f77abdc" +checksum = "8243dee0d182add98bc58f8f352beb60c4631713fe42c02360f056ca0670b7c5" dependencies = [ "backtrace", + "bytes", "cfg-if", "enum-iterator", "enumset", "lazy_static", "leb128", - "memmap2", + "memmap2 0.5.0", "more-asserts", "region", + "rkyv", + "self_cell", + "shared-buffer", "smallvec", "thiserror", "wasmer-types", @@ -1697,9 +1737,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52aef2ef35513a04fed54de9a7dc9c469d4742a5c2e378a5f7e2a79b1327e3bd" +checksum = "1bdc493884a8e52ed822c879bd6db3152dcde18e5bc77cf89a65775c427ef00d" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1716,9 +1756,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebfd019aa98b19fea0fb1d8db9b539145c9416d183ce4cda4e8e024b2c890aac" +checksum = "4f98444cf5c146d16b38a225612363a5a0809fa07a44e9f2898ed82e9c9bbadb" dependencies = [ "byteorder", "dynasm", @@ -1735,9 +1775,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25bb1425c9e4dc3e2d3aacd6e82e22e27a3127379e0d09bcbdf25ff376229162" +checksum = "e139ec60501bc51e056b6fc14489ce11c2f4df657550cfe726011cc463b970e3" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1747,9 +1787,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acfc08fb8e2e1511f1d69302d7406ace6c0ec0c90e103f8c0a5aa81ecb9fe81f" +checksum = "28bad1cacdfac30b570da8aba328730fa497e444a9325806a661bf73d682dc94" dependencies = [ "wasmer", "wasmer-types", @@ -1758,9 +1798,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7e32ed799fa8c0d96ca9615d9ea8006857a0f0c18e7c2ed8082bd5c63a9ea70" +checksum = "1747223169a18c36793a9fc4885068b9ff8b54fe006dd3d94cbf76a275b1a45c" dependencies = [ "bytecheck", "enum-iterator", @@ -1774,14 +1814,15 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0847513cb176b5d62a6f65d6ae474594935e726a10e9e3387177d9cbf8b8cda0" +checksum = "81c3faab9737b5424acaeffb03f9f921854a7c9a2b71223cafbb9b6fe3b169a7" dependencies = [ "backtrace", "cc", "cfg-if", "corosensei", + "crossbeam-queue", "dashmap", "derivative", "enum-iterator", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 972966f513..dc515677b3 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -405,6 +405,16 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.8" @@ -569,7 +579,7 @@ checksum = "64fba5a42bd76a17cad4bfa00de168ee1cbfa06a5e8ce992ae880218c05641a9" dependencies = [ "byteorder", "dynasm", - "memmap2", + "memmap2 0.5.0", ] [[package]] @@ -934,6 +944,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d28bba84adfe6646737845bc5ebbfa2c08424eb1c37e94a1fd2a82adb56a872" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.6.4" @@ -1279,6 +1298,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "self_cell" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" + [[package]] name = "serde" version = "1.0.126" @@ -1365,6 +1390,16 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "shared-buffer" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +dependencies = [ + "bytes", + "memmap2 0.6.2", +] + [[package]] name = "signature" version = "2.1.0" @@ -1646,9 +1681,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7142dbb91ede83cc0aef2301fa75fcc7e0c9e5a7d5358e3c4f3a7249fe9ce8" +checksum = "39cf1c6bb916d6bf272a5036dfbdff5f78ba6b5c72eb7063dc36b6bde194aadb" dependencies = [ "bytes", "cfg-if", @@ -1659,6 +1694,7 @@ dependencies = [ "rustc-demangle", "serde", "serde-wasm-bindgen", + "shared-buffer", "target-lexicon", "thiserror", "wasm-bindgen", @@ -1674,19 +1710,23 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5b99c70711ec7631b602a9fc95577c40df21e8f3916159c9d80c3fb4f77abdc" +checksum = "8243dee0d182add98bc58f8f352beb60c4631713fe42c02360f056ca0670b7c5" dependencies = [ "backtrace", + "bytes", "cfg-if", "enum-iterator", "enumset", "lazy_static", "leb128", - "memmap2", + "memmap2 0.5.0", "more-asserts", "region", + "rkyv", + "self_cell", + "shared-buffer", "smallvec", "thiserror", "wasmer-types", @@ -1697,9 +1737,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52aef2ef35513a04fed54de9a7dc9c469d4742a5c2e378a5f7e2a79b1327e3bd" +checksum = "1bdc493884a8e52ed822c879bd6db3152dcde18e5bc77cf89a65775c427ef00d" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1716,9 +1756,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebfd019aa98b19fea0fb1d8db9b539145c9416d183ce4cda4e8e024b2c890aac" +checksum = "4f98444cf5c146d16b38a225612363a5a0809fa07a44e9f2898ed82e9c9bbadb" dependencies = [ "byteorder", "dynasm", @@ -1735,9 +1775,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25bb1425c9e4dc3e2d3aacd6e82e22e27a3127379e0d09bcbdf25ff376229162" +checksum = "e139ec60501bc51e056b6fc14489ce11c2f4df657550cfe726011cc463b970e3" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1747,9 +1787,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acfc08fb8e2e1511f1d69302d7406ace6c0ec0c90e103f8c0a5aa81ecb9fe81f" +checksum = "28bad1cacdfac30b570da8aba328730fa497e444a9325806a661bf73d682dc94" dependencies = [ "wasmer", "wasmer-types", @@ -1758,9 +1798,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7e32ed799fa8c0d96ca9615d9ea8006857a0f0c18e7c2ed8082bd5c63a9ea70" +checksum = "1747223169a18c36793a9fc4885068b9ff8b54fe006dd3d94cbf76a275b1a45c" dependencies = [ "bytecheck", "enum-iterator", @@ -1774,14 +1814,15 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0847513cb176b5d62a6f65d6ae474594935e726a10e9e3387177d9cbf8b8cda0" +checksum = "81c3faab9737b5424acaeffb03f9f921854a7c9a2b71223cafbb9b6fe3b169a7" dependencies = [ "backtrace", "cc", "cfg-if", "corosensei", + "crossbeam-queue", "dashmap", "derivative", "enum-iterator", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 69167026b5..55070b4c11 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -405,6 +405,16 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.8" @@ -569,7 +579,7 @@ checksum = "64fba5a42bd76a17cad4bfa00de168ee1cbfa06a5e8ce992ae880218c05641a9" dependencies = [ "byteorder", "dynasm", - "memmap2", + "memmap2 0.5.0", ] [[package]] @@ -923,6 +933,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d28bba84adfe6646737845bc5ebbfa2c08424eb1c37e94a1fd2a82adb56a872" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.6.4" @@ -1279,6 +1298,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "self_cell" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" + [[package]] name = "serde" version = "1.0.126" @@ -1365,6 +1390,16 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "shared-buffer" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +dependencies = [ + "bytes", + "memmap2 0.6.2", +] + [[package]] name = "signature" version = "2.1.0" @@ -1646,9 +1681,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7142dbb91ede83cc0aef2301fa75fcc7e0c9e5a7d5358e3c4f3a7249fe9ce8" +checksum = "39cf1c6bb916d6bf272a5036dfbdff5f78ba6b5c72eb7063dc36b6bde194aadb" dependencies = [ "bytes", "cfg-if", @@ -1659,6 +1694,7 @@ dependencies = [ "rustc-demangle", "serde", "serde-wasm-bindgen", + "shared-buffer", "target-lexicon", "thiserror", "wasm-bindgen", @@ -1674,19 +1710,23 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5b99c70711ec7631b602a9fc95577c40df21e8f3916159c9d80c3fb4f77abdc" +checksum = "8243dee0d182add98bc58f8f352beb60c4631713fe42c02360f056ca0670b7c5" dependencies = [ "backtrace", + "bytes", "cfg-if", "enum-iterator", "enumset", "lazy_static", "leb128", - "memmap2", + "memmap2 0.5.0", "more-asserts", "region", + "rkyv", + "self_cell", + "shared-buffer", "smallvec", "thiserror", "wasmer-types", @@ -1697,9 +1737,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52aef2ef35513a04fed54de9a7dc9c469d4742a5c2e378a5f7e2a79b1327e3bd" +checksum = "1bdc493884a8e52ed822c879bd6db3152dcde18e5bc77cf89a65775c427ef00d" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1716,9 +1756,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebfd019aa98b19fea0fb1d8db9b539145c9416d183ce4cda4e8e024b2c890aac" +checksum = "4f98444cf5c146d16b38a225612363a5a0809fa07a44e9f2898ed82e9c9bbadb" dependencies = [ "byteorder", "dynasm", @@ -1735,9 +1775,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25bb1425c9e4dc3e2d3aacd6e82e22e27a3127379e0d09bcbdf25ff376229162" +checksum = "e139ec60501bc51e056b6fc14489ce11c2f4df657550cfe726011cc463b970e3" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1747,9 +1787,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acfc08fb8e2e1511f1d69302d7406ace6c0ec0c90e103f8c0a5aa81ecb9fe81f" +checksum = "28bad1cacdfac30b570da8aba328730fa497e444a9325806a661bf73d682dc94" dependencies = [ "wasmer", "wasmer-types", @@ -1758,9 +1798,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7e32ed799fa8c0d96ca9615d9ea8006857a0f0c18e7c2ed8082bd5c63a9ea70" +checksum = "1747223169a18c36793a9fc4885068b9ff8b54fe006dd3d94cbf76a275b1a45c" dependencies = [ "bytecheck", "enum-iterator", @@ -1774,14 +1814,15 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0847513cb176b5d62a6f65d6ae474594935e726a10e9e3387177d9cbf8b8cda0" +checksum = "81c3faab9737b5424acaeffb03f9f921854a7c9a2b71223cafbb9b6fe3b169a7" dependencies = [ "backtrace", "cc", "cfg-if", "corosensei", + "crossbeam-queue", "dashmap", "derivative", "enum-iterator", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 827498c662..91c3e0477f 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -405,6 +405,16 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.8" @@ -569,7 +579,7 @@ checksum = "64fba5a42bd76a17cad4bfa00de168ee1cbfa06a5e8ce992ae880218c05641a9" dependencies = [ "byteorder", "dynasm", - "memmap2", + "memmap2 0.5.0", ] [[package]] @@ -923,6 +933,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d28bba84adfe6646737845bc5ebbfa2c08424eb1c37e94a1fd2a82adb56a872" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.6.4" @@ -1280,6 +1299,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "self_cell" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" + [[package]] name = "serde" version = "1.0.103" @@ -1366,6 +1391,16 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "shared-buffer" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +dependencies = [ + "bytes", + "memmap2 0.6.2", +] + [[package]] name = "signature" version = "2.1.0" @@ -1647,9 +1682,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7142dbb91ede83cc0aef2301fa75fcc7e0c9e5a7d5358e3c4f3a7249fe9ce8" +checksum = "39cf1c6bb916d6bf272a5036dfbdff5f78ba6b5c72eb7063dc36b6bde194aadb" dependencies = [ "bytes", "cfg-if", @@ -1660,6 +1695,7 @@ dependencies = [ "rustc-demangle", "serde", "serde-wasm-bindgen", + "shared-buffer", "target-lexicon", "thiserror", "wasm-bindgen", @@ -1675,19 +1711,23 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5b99c70711ec7631b602a9fc95577c40df21e8f3916159c9d80c3fb4f77abdc" +checksum = "8243dee0d182add98bc58f8f352beb60c4631713fe42c02360f056ca0670b7c5" dependencies = [ "backtrace", + "bytes", "cfg-if", "enum-iterator", "enumset", "lazy_static", "leb128", - "memmap2", + "memmap2 0.5.0", "more-asserts", "region", + "rkyv", + "self_cell", + "shared-buffer", "smallvec", "thiserror", "wasmer-types", @@ -1698,9 +1738,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52aef2ef35513a04fed54de9a7dc9c469d4742a5c2e378a5f7e2a79b1327e3bd" +checksum = "1bdc493884a8e52ed822c879bd6db3152dcde18e5bc77cf89a65775c427ef00d" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1717,9 +1757,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebfd019aa98b19fea0fb1d8db9b539145c9416d183ce4cda4e8e024b2c890aac" +checksum = "4f98444cf5c146d16b38a225612363a5a0809fa07a44e9f2898ed82e9c9bbadb" dependencies = [ "byteorder", "dynasm", @@ -1736,9 +1776,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25bb1425c9e4dc3e2d3aacd6e82e22e27a3127379e0d09bcbdf25ff376229162" +checksum = "e139ec60501bc51e056b6fc14489ce11c2f4df657550cfe726011cc463b970e3" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1748,9 +1788,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acfc08fb8e2e1511f1d69302d7406ace6c0ec0c90e103f8c0a5aa81ecb9fe81f" +checksum = "28bad1cacdfac30b570da8aba328730fa497e444a9325806a661bf73d682dc94" dependencies = [ "wasmer", "wasmer-types", @@ -1759,9 +1799,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7e32ed799fa8c0d96ca9615d9ea8006857a0f0c18e7c2ed8082bd5c63a9ea70" +checksum = "1747223169a18c36793a9fc4885068b9ff8b54fe006dd3d94cbf76a275b1a45c" dependencies = [ "bytecheck", "enum-iterator", @@ -1775,14 +1815,15 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0847513cb176b5d62a6f65d6ae474594935e726a10e9e3387177d9cbf8b8cda0" +checksum = "81c3faab9737b5424acaeffb03f9f921854a7c9a2b71223cafbb9b6fe3b169a7" dependencies = [ "backtrace", "cc", "cfg-if", "corosensei", + "crossbeam-queue", "dashmap", "derivative", "enum-iterator", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 680c1ae6be..3d175b12a2 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -405,6 +405,16 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.8" @@ -575,7 +585,7 @@ checksum = "64fba5a42bd76a17cad4bfa00de168ee1cbfa06a5e8ce992ae880218c05641a9" dependencies = [ "byteorder", "dynasm", - "memmap2", + "memmap2 0.5.0", ] [[package]] @@ -929,6 +939,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d28bba84adfe6646737845bc5ebbfa2c08424eb1c37e94a1fd2a82adb56a872" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.6.4" @@ -1274,6 +1293,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "self_cell" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" + [[package]] name = "serde" version = "1.0.126" @@ -1360,6 +1385,16 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "shared-buffer" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +dependencies = [ + "bytes", + "memmap2 0.6.2", +] + [[package]] name = "signature" version = "2.1.0" @@ -1674,9 +1709,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7142dbb91ede83cc0aef2301fa75fcc7e0c9e5a7d5358e3c4f3a7249fe9ce8" +checksum = "39cf1c6bb916d6bf272a5036dfbdff5f78ba6b5c72eb7063dc36b6bde194aadb" dependencies = [ "bytes", "cfg-if", @@ -1687,6 +1722,7 @@ dependencies = [ "rustc-demangle", "serde", "serde-wasm-bindgen", + "shared-buffer", "target-lexicon", "thiserror", "wasm-bindgen", @@ -1702,19 +1738,23 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5b99c70711ec7631b602a9fc95577c40df21e8f3916159c9d80c3fb4f77abdc" +checksum = "8243dee0d182add98bc58f8f352beb60c4631713fe42c02360f056ca0670b7c5" dependencies = [ "backtrace", + "bytes", "cfg-if", "enum-iterator", "enumset", "lazy_static", "leb128", - "memmap2", + "memmap2 0.5.0", "more-asserts", "region", + "rkyv", + "self_cell", + "shared-buffer", "smallvec", "thiserror", "wasmer-types", @@ -1725,9 +1765,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52aef2ef35513a04fed54de9a7dc9c469d4742a5c2e378a5f7e2a79b1327e3bd" +checksum = "1bdc493884a8e52ed822c879bd6db3152dcde18e5bc77cf89a65775c427ef00d" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1744,9 +1784,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebfd019aa98b19fea0fb1d8db9b539145c9416d183ce4cda4e8e024b2c890aac" +checksum = "4f98444cf5c146d16b38a225612363a5a0809fa07a44e9f2898ed82e9c9bbadb" dependencies = [ "byteorder", "dynasm", @@ -1763,9 +1803,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25bb1425c9e4dc3e2d3aacd6e82e22e27a3127379e0d09bcbdf25ff376229162" +checksum = "e139ec60501bc51e056b6fc14489ce11c2f4df657550cfe726011cc463b970e3" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1775,9 +1815,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acfc08fb8e2e1511f1d69302d7406ace6c0ec0c90e103f8c0a5aa81ecb9fe81f" +checksum = "28bad1cacdfac30b570da8aba328730fa497e444a9325806a661bf73d682dc94" dependencies = [ "wasmer", "wasmer-types", @@ -1786,9 +1826,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7e32ed799fa8c0d96ca9615d9ea8006857a0f0c18e7c2ed8082bd5c63a9ea70" +checksum = "1747223169a18c36793a9fc4885068b9ff8b54fe006dd3d94cbf76a275b1a45c" dependencies = [ "bytecheck", "enum-iterator", @@ -1802,14 +1842,15 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0847513cb176b5d62a6f65d6ae474594935e726a10e9e3387177d9cbf8b8cda0" +checksum = "81c3faab9737b5424acaeffb03f9f921854a7c9a2b71223cafbb9b6fe3b169a7" dependencies = [ "backtrace", "cc", "cfg-if", "corosensei", + "crossbeam-queue", "dashmap", "derivative", "enum-iterator", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index a77d4d11e7..98dc192e94 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -405,6 +405,16 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.8" @@ -569,7 +579,7 @@ checksum = "64fba5a42bd76a17cad4bfa00de168ee1cbfa06a5e8ce992ae880218c05641a9" dependencies = [ "byteorder", "dynasm", - "memmap2", + "memmap2 0.5.0", ] [[package]] @@ -923,6 +933,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d28bba84adfe6646737845bc5ebbfa2c08424eb1c37e94a1fd2a82adb56a872" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.6.4" @@ -1268,6 +1287,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "self_cell" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" + [[package]] name = "serde" version = "1.0.126" @@ -1354,6 +1379,16 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "shared-buffer" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +dependencies = [ + "bytes", + "memmap2 0.6.2", +] + [[package]] name = "signature" version = "2.1.0" @@ -1647,9 +1682,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7142dbb91ede83cc0aef2301fa75fcc7e0c9e5a7d5358e3c4f3a7249fe9ce8" +checksum = "39cf1c6bb916d6bf272a5036dfbdff5f78ba6b5c72eb7063dc36b6bde194aadb" dependencies = [ "bytes", "cfg-if", @@ -1660,6 +1695,7 @@ dependencies = [ "rustc-demangle", "serde", "serde-wasm-bindgen", + "shared-buffer", "target-lexicon", "thiserror", "wasm-bindgen", @@ -1675,19 +1711,23 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5b99c70711ec7631b602a9fc95577c40df21e8f3916159c9d80c3fb4f77abdc" +checksum = "8243dee0d182add98bc58f8f352beb60c4631713fe42c02360f056ca0670b7c5" dependencies = [ "backtrace", + "bytes", "cfg-if", "enum-iterator", "enumset", "lazy_static", "leb128", - "memmap2", + "memmap2 0.5.0", "more-asserts", "region", + "rkyv", + "self_cell", + "shared-buffer", "smallvec", "thiserror", "wasmer-types", @@ -1698,9 +1738,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52aef2ef35513a04fed54de9a7dc9c469d4742a5c2e378a5f7e2a79b1327e3bd" +checksum = "1bdc493884a8e52ed822c879bd6db3152dcde18e5bc77cf89a65775c427ef00d" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1717,9 +1757,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebfd019aa98b19fea0fb1d8db9b539145c9416d183ce4cda4e8e024b2c890aac" +checksum = "4f98444cf5c146d16b38a225612363a5a0809fa07a44e9f2898ed82e9c9bbadb" dependencies = [ "byteorder", "dynasm", @@ -1736,9 +1776,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25bb1425c9e4dc3e2d3aacd6e82e22e27a3127379e0d09bcbdf25ff376229162" +checksum = "e139ec60501bc51e056b6fc14489ce11c2f4df657550cfe726011cc463b970e3" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1748,9 +1788,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acfc08fb8e2e1511f1d69302d7406ace6c0ec0c90e103f8c0a5aa81ecb9fe81f" +checksum = "28bad1cacdfac30b570da8aba328730fa497e444a9325806a661bf73d682dc94" dependencies = [ "wasmer", "wasmer-types", @@ -1759,9 +1799,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7e32ed799fa8c0d96ca9615d9ea8006857a0f0c18e7c2ed8082bd5c63a9ea70" +checksum = "1747223169a18c36793a9fc4885068b9ff8b54fe006dd3d94cbf76a275b1a45c" dependencies = [ "bytecheck", "enum-iterator", @@ -1775,14 +1815,15 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.1.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0847513cb176b5d62a6f65d6ae474594935e726a10e9e3387177d9cbf8b8cda0" +checksum = "81c3faab9737b5424acaeffb03f9f921854a7c9a2b71223cafbb9b6fe3b169a7" dependencies = [ "backtrace", "cc", "cfg-if", "corosensei", + "crossbeam-queue", "dashmap", "derivative", "enum-iterator", From b9c831d4e093276eb9c5f03c5a7b2595f8b351f0 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 5 Oct 2023 09:26:37 +0200 Subject: [PATCH 0817/2372] Workaround for wasmer-types clippy error --- contracts/burner/Cargo.toml | 1 + contracts/crypto-verify/Cargo.toml | 1 + contracts/cyberpunk/Cargo.toml | 1 + contracts/floaty/Cargo.toml | 1 + contracts/hackatom/Cargo.toml | 1 + contracts/ibc-reflect-send/Cargo.toml | 1 + contracts/ibc-reflect/Cargo.toml | 1 + contracts/queue/Cargo.toml | 1 + contracts/reflect/Cargo.toml | 1 + contracts/staking/Cargo.toml | 1 + contracts/virus/Cargo.toml | 1 + 11 files changed, 11 insertions(+) diff --git a/contracts/burner/Cargo.toml b/contracts/burner/Cargo.toml index 394074b75d..de750359ed 100644 --- a/contracts/burner/Cargo.toml +++ b/contracts/burner/Cargo.toml @@ -36,6 +36,7 @@ cosmwasm-schema = { path = "../../packages/schema" } cosmwasm-std = { path = "../../packages/std", features = ["iterator", "cosmwasm_1_4"] } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } +enumset = "1.1.0" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator"] } diff --git a/contracts/crypto-verify/Cargo.toml b/contracts/crypto-verify/Cargo.toml index e31fe6242b..31b4883c8f 100644 --- a/contracts/crypto-verify/Cargo.toml +++ b/contracts/crypto-verify/Cargo.toml @@ -40,6 +40,7 @@ schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } sha2 = "0.10" sha3 = "0.10" +enumset = "1.1.0" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator"] } diff --git a/contracts/cyberpunk/Cargo.toml b/contracts/cyberpunk/Cargo.toml index c2db096f28..bb4b348bae 100644 --- a/contracts/cyberpunk/Cargo.toml +++ b/contracts/cyberpunk/Cargo.toml @@ -33,6 +33,7 @@ cosmwasm-schema = { path = "../../packages/schema" } cosmwasm-std = { path = "../../packages/std", default-features = false, features = ["abort", "cosmwasm_1_3"] } rust-argon2 = "0.8" thiserror = "1.0.26" +enumset = "1.1.0" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false } diff --git a/contracts/floaty/Cargo.toml b/contracts/floaty/Cargo.toml index e78bf00175..74892d62c5 100644 --- a/contracts/floaty/Cargo.toml +++ b/contracts/floaty/Cargo.toml @@ -36,6 +36,7 @@ cosmwasm-std = { path = "../../packages/std" } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } rand_chacha = { version = "0.3.1", default-features = false } +enumset = "1.1.0" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator"] } diff --git a/contracts/hackatom/Cargo.toml b/contracts/hackatom/Cargo.toml index 240bdb1476..31cfb66bc9 100644 --- a/contracts/hackatom/Cargo.toml +++ b/contracts/hackatom/Cargo.toml @@ -37,6 +37,7 @@ schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } sha2 = "0.10" thiserror = "1.0.26" +enumset = "1.1.0" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false } diff --git a/contracts/ibc-reflect-send/Cargo.toml b/contracts/ibc-reflect-send/Cargo.toml index dcbde4a4fe..66280df7ec 100644 --- a/contracts/ibc-reflect-send/Cargo.toml +++ b/contracts/ibc-reflect-send/Cargo.toml @@ -36,6 +36,7 @@ cosmwasm-schema = { path = "../../packages/schema" } cosmwasm-std = { path = "../../packages/std", features = ["iterator", "staking", "stargate"] } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } +enumset = "1.1.0" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator", "stargate"] } diff --git a/contracts/ibc-reflect/Cargo.toml b/contracts/ibc-reflect/Cargo.toml index ead27d3725..6f0d8840f6 100644 --- a/contracts/ibc-reflect/Cargo.toml +++ b/contracts/ibc-reflect/Cargo.toml @@ -36,6 +36,7 @@ cosmwasm-schema = { path = "../../packages/schema" } cosmwasm-std = { path = "../../packages/std", features = ["iterator", "ibc3"] } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } +enumset = "1.1.0" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator", "stargate"] } diff --git a/contracts/queue/Cargo.toml b/contracts/queue/Cargo.toml index b37c1f79e6..875b451a18 100644 --- a/contracts/queue/Cargo.toml +++ b/contracts/queue/Cargo.toml @@ -38,6 +38,7 @@ cosmwasm-schema = { path = "../../packages/schema" } cosmwasm-std = { path = "../../packages/std", features = ["iterator", "cosmwasm_1_4"] } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } +enumset = "1.1.0" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator"] } diff --git a/contracts/reflect/Cargo.toml b/contracts/reflect/Cargo.toml index 8ef7e171b2..0f6c31c9cc 100644 --- a/contracts/reflect/Cargo.toml +++ b/contracts/reflect/Cargo.toml @@ -38,6 +38,7 @@ cosmwasm-std = { path = "../../packages/std", default-features = false, features schemars = "0.8.3" serde = { version = "=1.0.103", default-features = false, features = ["derive"] } thiserror = "1.0.26" +enumset = "1.1.0" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["stargate"] } diff --git a/contracts/staking/Cargo.toml b/contracts/staking/Cargo.toml index ff7e7f796d..e121658ca4 100644 --- a/contracts/staking/Cargo.toml +++ b/contracts/staking/Cargo.toml @@ -37,6 +37,7 @@ cosmwasm-std = { path = "../../packages/std", default-features = false, features schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } snafu = "0.6.6" +enumset = "1.1.0" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["staking"] } diff --git a/contracts/virus/Cargo.toml b/contracts/virus/Cargo.toml index 24df513fab..f5ee453db8 100644 --- a/contracts/virus/Cargo.toml +++ b/contracts/virus/Cargo.toml @@ -37,6 +37,7 @@ cosmwasm-std = { path = "../../packages/std", features = ["cosmwasm_1_2"] } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } thiserror = "1.0.26" +enumset = "1.1.0" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator"] } From a96eb885768a4a262f50daa64ad41f63dad76f8d Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 5 Oct 2023 09:35:04 +0200 Subject: [PATCH 0818/2372] Update contracts lock file --- contracts/burner/Cargo.lock | 89 +++++++++++++------------- contracts/crypto-verify/Cargo.lock | 89 +++++++++++++------------- contracts/cyberpunk/Cargo.lock | 89 +++++++++++++------------- contracts/floaty/Cargo.lock | 81 +++++++++++++----------- contracts/hackatom/Cargo.lock | 89 +++++++++++++------------- contracts/ibc-reflect-send/Cargo.lock | 89 +++++++++++++------------- contracts/ibc-reflect/Cargo.lock | 89 +++++++++++++------------- contracts/queue/Cargo.lock | 89 +++++++++++++------------- contracts/reflect/Cargo.lock | 89 +++++++++++++------------- contracts/staking/Cargo.lock | 91 ++++++++++++++------------- contracts/virus/Cargo.lock | 89 +++++++++++++------------- 11 files changed, 514 insertions(+), 459 deletions(-) diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index de38ef833c..b9eab599f6 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -116,6 +116,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", + "enumset", "schemars", "serde", ] @@ -139,7 +140,7 @@ checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -207,7 +208,7 @@ dependencies = [ name = "cosmwasm-derive" version = "1.4.0" dependencies = [ - "syn", + "syn 1.0.109", ] [[package]] @@ -227,7 +228,7 @@ version = "1.4.0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -473,9 +474,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "757c0ded2af11d8e739c4daea1ac623dd1624b06c844cf3f5a39f1bdbd99bb12" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" dependencies = [ "darling_core", "darling_macro", @@ -483,27 +484,26 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c34d8efb62d0c2d7f60ece80f75e5c63c1588ba68032740494b0b9a996466e3" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim", - "syn", + "syn 2.0.37", ] [[package]] name = "darling_macro" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade7bff147130fe5e6d39f089c6bd49ec0250f35d70b2eebf72afdfc919f15cc" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.37", ] [[package]] @@ -537,7 +537,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -579,7 +579,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -664,28 +664,28 @@ checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "enumset" -version = "1.0.7" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e76129da36102af021b8e5000dab2c1c30dbef85c1e482beeff8da5dde0e0b0" +checksum = "e875f1719c16de097dee81ed675e2d9bb63096823ed3f0ca827b7dea3028bbbb" dependencies = [ "enumset_derive", ] [[package]] name = "enumset_derive" -version = "0.5.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6451128aa6655d880755345d085494cf7561a6bee7c8dc821e5d77e6d267ecd4" +checksum = "e08b6c6ab82d70f08844964ba10c7babb716de2ecaeab9be5717918a5177d3af" dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.37", ] [[package]] @@ -1062,7 +1062,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -1079,9 +1079,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" dependencies = [ "unicode-ident", ] @@ -1103,14 +1103,14 @@ checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "quote" -version = "1.0.9" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -1233,7 +1233,7 @@ checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1269,7 +1269,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn", + "syn 1.0.109", ] [[package]] @@ -1341,7 +1341,7 @@ checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1352,7 +1352,7 @@ checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1450,12 +1450,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "subtle" version = "2.4.1" @@ -1473,6 +1467,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "target-lexicon" version = "0.12.7" @@ -1496,7 +1501,7 @@ checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1534,7 +1539,7 @@ checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1623,7 +1628,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-shared", ] @@ -1647,7 +1652,7 @@ checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1668,7 +1673,7 @@ checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1782,7 +1787,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index d5e6875200..4435b3fb2d 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -128,7 +128,7 @@ checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -196,7 +196,7 @@ dependencies = [ name = "cosmwasm-derive" version = "1.4.0" dependencies = [ - "syn", + "syn 1.0.109", ] [[package]] @@ -216,7 +216,7 @@ version = "1.4.0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -454,6 +454,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", + "enumset", "hex", "hex-literal", "rlp", @@ -478,9 +479,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "757c0ded2af11d8e739c4daea1ac623dd1624b06c844cf3f5a39f1bdbd99bb12" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" dependencies = [ "darling_core", "darling_macro", @@ -488,27 +489,26 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c34d8efb62d0c2d7f60ece80f75e5c63c1588ba68032740494b0b9a996466e3" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim", - "syn", + "syn 2.0.37", ] [[package]] name = "darling_macro" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade7bff147130fe5e6d39f089c6bd49ec0250f35d70b2eebf72afdfc919f15cc" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.37", ] [[package]] @@ -542,7 +542,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -584,7 +584,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -669,28 +669,28 @@ checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "enumset" -version = "1.0.7" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e76129da36102af021b8e5000dab2c1c30dbef85c1e482beeff8da5dde0e0b0" +checksum = "e875f1719c16de097dee81ed675e2d9bb63096823ed3f0ca827b7dea3028bbbb" dependencies = [ "enumset_derive", ] [[package]] name = "enumset_derive" -version = "0.5.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6451128aa6655d880755345d085494cf7561a6bee7c8dc821e5d77e6d267ecd4" +checksum = "e08b6c6ab82d70f08844964ba10c7babb716de2ecaeab9be5717918a5177d3af" dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.37", ] [[package]] @@ -1079,7 +1079,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -1096,9 +1096,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" dependencies = [ "unicode-ident", ] @@ -1120,14 +1120,14 @@ checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "quote" -version = "1.0.9" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -1250,7 +1250,7 @@ checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1302,7 +1302,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn", + "syn 1.0.109", ] [[package]] @@ -1374,7 +1374,7 @@ checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1385,7 +1385,7 @@ checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1493,12 +1493,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "subtle" version = "2.4.1" @@ -1516,6 +1510,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "target-lexicon" version = "0.12.7" @@ -1539,7 +1544,7 @@ checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1577,7 +1582,7 @@ checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1666,7 +1671,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-shared", ] @@ -1690,7 +1695,7 @@ checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1711,7 +1716,7 @@ checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1825,7 +1830,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 3ca7b74daf..55914a526b 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -157,7 +157,7 @@ checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -231,7 +231,7 @@ dependencies = [ name = "cosmwasm-derive" version = "1.4.0" dependencies = [ - "syn", + "syn 1.0.109", ] [[package]] @@ -251,7 +251,7 @@ version = "1.4.0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -502,6 +502,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", + "enumset", "rust-argon2", "tempfile", "thiserror", @@ -509,9 +510,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "757c0ded2af11d8e739c4daea1ac623dd1624b06c844cf3f5a39f1bdbd99bb12" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" dependencies = [ "darling_core", "darling_macro", @@ -519,27 +520,26 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c34d8efb62d0c2d7f60ece80f75e5c63c1588ba68032740494b0b9a996466e3" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim", - "syn", + "syn 2.0.37", ] [[package]] name = "darling_macro" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade7bff147130fe5e6d39f089c6bd49ec0250f35d70b2eebf72afdfc919f15cc" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.37", ] [[package]] @@ -573,7 +573,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -615,7 +615,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -700,28 +700,28 @@ checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "enumset" -version = "1.0.7" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e76129da36102af021b8e5000dab2c1c30dbef85c1e482beeff8da5dde0e0b0" +checksum = "e875f1719c16de097dee81ed675e2d9bb63096823ed3f0ca827b7dea3028bbbb" dependencies = [ "enumset_derive", ] [[package]] name = "enumset_derive" -version = "0.5.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6451128aa6655d880755345d085494cf7561a6bee7c8dc821e5d77e6d267ecd4" +checksum = "e08b6c6ab82d70f08844964ba10c7babb716de2ecaeab9be5717918a5177d3af" dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.37", ] [[package]] @@ -1160,7 +1160,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -1177,9 +1177,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" dependencies = [ "unicode-ident", ] @@ -1201,14 +1201,14 @@ checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "quote" -version = "1.0.9" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -1331,7 +1331,7 @@ checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1393,7 +1393,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn", + "syn 1.0.109", ] [[package]] @@ -1465,7 +1465,7 @@ checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1476,7 +1476,7 @@ checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1574,12 +1574,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "subtle" version = "2.4.1" @@ -1597,6 +1591,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "target-lexicon" version = "0.12.7" @@ -1633,7 +1638,7 @@ checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1671,7 +1676,7 @@ checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1760,7 +1765,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-shared", ] @@ -1784,7 +1789,7 @@ checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1805,7 +1810,7 @@ checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1919,7 +1924,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 45dcdbe810..041f1457d8 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -128,7 +128,7 @@ checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -196,7 +196,7 @@ dependencies = [ name = "cosmwasm-derive" version = "1.4.0" dependencies = [ - "syn", + "syn 1.0.109", ] [[package]] @@ -216,7 +216,7 @@ version = "1.4.0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -462,9 +462,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "757c0ded2af11d8e739c4daea1ac623dd1624b06c844cf3f5a39f1bdbd99bb12" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" dependencies = [ "darling_core", "darling_macro", @@ -472,27 +472,26 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c34d8efb62d0c2d7f60ece80f75e5c63c1588ba68032740494b0b9a996466e3" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim", - "syn", + "syn 2.0.32", ] [[package]] name = "darling_macro" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade7bff147130fe5e6d39f089c6bd49ec0250f35d70b2eebf72afdfc919f15cc" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.32", ] [[package]] @@ -526,7 +525,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -568,7 +567,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -653,28 +652,28 @@ checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "enumset" -version = "1.0.7" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e76129da36102af021b8e5000dab2c1c30dbef85c1e482beeff8da5dde0e0b0" +checksum = "e875f1719c16de097dee81ed675e2d9bb63096823ed3f0ca827b7dea3028bbbb" dependencies = [ "enumset_derive", ] [[package]] name = "enumset_derive" -version = "0.5.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6451128aa6655d880755345d085494cf7561a6bee7c8dc821e5d77e6d267ecd4" +checksum = "e08b6c6ab82d70f08844964ba10c7babb716de2ecaeab9be5717918a5177d3af" dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.32", ] [[package]] @@ -700,6 +699,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", + "enumset", "rand_chacha", "schemars", "serde", @@ -1069,7 +1069,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -1110,7 +1110,7 @@ checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1250,7 +1250,7 @@ checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1286,7 +1286,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn", + "syn 1.0.109", ] [[package]] @@ -1358,7 +1358,7 @@ checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1369,7 +1369,7 @@ checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1467,12 +1467,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "subtle" version = "2.4.1" @@ -1490,6 +1484,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "239814284fd6f1a4ffe4ca893952cdd93c224b6a1571c9a9eadd670295c0c9e2" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "target-lexicon" version = "0.12.7" @@ -1513,7 +1518,7 @@ checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1551,7 +1556,7 @@ checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1640,7 +1645,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-shared", ] @@ -1664,7 +1669,7 @@ checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1685,7 +1690,7 @@ checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1799,7 +1804,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 16b285a0c8..0a497f9a45 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -128,7 +128,7 @@ checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -196,7 +196,7 @@ dependencies = [ name = "cosmwasm-derive" version = "1.4.0" dependencies = [ - "syn", + "syn 1.0.109", ] [[package]] @@ -216,7 +216,7 @@ version = "1.4.0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -462,9 +462,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "757c0ded2af11d8e739c4daea1ac623dd1624b06c844cf3f5a39f1bdbd99bb12" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" dependencies = [ "darling_core", "darling_macro", @@ -472,27 +472,26 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c34d8efb62d0c2d7f60ece80f75e5c63c1588ba68032740494b0b9a996466e3" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim", - "syn", + "syn 2.0.37", ] [[package]] name = "darling_macro" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade7bff147130fe5e6d39f089c6bd49ec0250f35d70b2eebf72afdfc919f15cc" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.37", ] [[package]] @@ -526,7 +525,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -568,7 +567,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -653,28 +652,28 @@ checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "enumset" -version = "1.0.7" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e76129da36102af021b8e5000dab2c1c30dbef85c1e482beeff8da5dde0e0b0" +checksum = "e875f1719c16de097dee81ed675e2d9bb63096823ed3f0ca827b7dea3028bbbb" dependencies = [ "enumset_derive", ] [[package]] name = "enumset_derive" -version = "0.5.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6451128aa6655d880755345d085494cf7561a6bee7c8dc821e5d77e6d267ecd4" +checksum = "e08b6c6ab82d70f08844964ba10c7babb716de2ecaeab9be5717918a5177d3af" dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.37", ] [[package]] @@ -791,6 +790,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", + "enumset", "schemars", "serde", "sha2 0.10.3", @@ -1064,7 +1064,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -1081,9 +1081,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" dependencies = [ "unicode-ident", ] @@ -1105,14 +1105,14 @@ checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "quote" -version = "1.0.9" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -1235,7 +1235,7 @@ checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1271,7 +1271,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn", + "syn 1.0.109", ] [[package]] @@ -1343,7 +1343,7 @@ checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1354,7 +1354,7 @@ checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1452,12 +1452,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "subtle" version = "2.4.1" @@ -1475,6 +1469,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "target-lexicon" version = "0.12.7" @@ -1498,7 +1503,7 @@ checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1536,7 +1541,7 @@ checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1625,7 +1630,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-shared", ] @@ -1649,7 +1654,7 @@ checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1670,7 +1675,7 @@ checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1784,7 +1789,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 6e23d046be..f89fae2170 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -128,7 +128,7 @@ checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -196,7 +196,7 @@ dependencies = [ name = "cosmwasm-derive" version = "1.4.0" dependencies = [ - "syn", + "syn 1.0.109", ] [[package]] @@ -216,7 +216,7 @@ version = "1.4.0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -462,9 +462,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "757c0ded2af11d8e739c4daea1ac623dd1624b06c844cf3f5a39f1bdbd99bb12" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" dependencies = [ "darling_core", "darling_macro", @@ -472,27 +472,26 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c34d8efb62d0c2d7f60ece80f75e5c63c1588ba68032740494b0b9a996466e3" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim", - "syn", + "syn 2.0.37", ] [[package]] name = "darling_macro" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade7bff147130fe5e6d39f089c6bd49ec0250f35d70b2eebf72afdfc919f15cc" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.37", ] [[package]] @@ -526,7 +525,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -568,7 +567,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -653,28 +652,28 @@ checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "enumset" -version = "1.0.7" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e76129da36102af021b8e5000dab2c1c30dbef85c1e482beeff8da5dde0e0b0" +checksum = "e875f1719c16de097dee81ed675e2d9bb63096823ed3f0ca827b7dea3028bbbb" dependencies = [ "enumset_derive", ] [[package]] name = "enumset_derive" -version = "0.5.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6451128aa6655d880755345d085494cf7561a6bee7c8dc821e5d77e6d267ecd4" +checksum = "e08b6c6ab82d70f08844964ba10c7babb716de2ecaeab9be5717918a5177d3af" dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.37", ] [[package]] @@ -824,6 +823,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", + "enumset", "schemars", "serde", ] @@ -1062,7 +1062,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -1079,9 +1079,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" dependencies = [ "unicode-ident", ] @@ -1103,14 +1103,14 @@ checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "quote" -version = "1.0.9" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -1233,7 +1233,7 @@ checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1269,7 +1269,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn", + "syn 1.0.109", ] [[package]] @@ -1341,7 +1341,7 @@ checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1352,7 +1352,7 @@ checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1450,12 +1450,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "subtle" version = "2.4.1" @@ -1473,6 +1467,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "target-lexicon" version = "0.12.7" @@ -1496,7 +1501,7 @@ checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1534,7 +1539,7 @@ checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1623,7 +1628,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-shared", ] @@ -1647,7 +1652,7 @@ checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1668,7 +1673,7 @@ checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1782,7 +1787,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index dc515677b3..5562af4c2b 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -128,7 +128,7 @@ checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -196,7 +196,7 @@ dependencies = [ name = "cosmwasm-derive" version = "1.4.0" dependencies = [ - "syn", + "syn 1.0.109", ] [[package]] @@ -216,7 +216,7 @@ version = "1.4.0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -462,9 +462,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "757c0ded2af11d8e739c4daea1ac623dd1624b06c844cf3f5a39f1bdbd99bb12" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" dependencies = [ "darling_core", "darling_macro", @@ -472,27 +472,26 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c34d8efb62d0c2d7f60ece80f75e5c63c1588ba68032740494b0b9a996466e3" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim", - "syn", + "syn 2.0.37", ] [[package]] name = "darling_macro" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade7bff147130fe5e6d39f089c6bd49ec0250f35d70b2eebf72afdfc919f15cc" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.37", ] [[package]] @@ -526,7 +525,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -568,7 +567,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -653,28 +652,28 @@ checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "enumset" -version = "1.0.7" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e76129da36102af021b8e5000dab2c1c30dbef85c1e482beeff8da5dde0e0b0" +checksum = "e875f1719c16de097dee81ed675e2d9bb63096823ed3f0ca827b7dea3028bbbb" dependencies = [ "enumset_derive", ] [[package]] name = "enumset_derive" -version = "0.5.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6451128aa6655d880755345d085494cf7561a6bee7c8dc821e5d77e6d267ecd4" +checksum = "e08b6c6ab82d70f08844964ba10c7babb716de2ecaeab9be5717918a5177d3af" dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.37", ] [[package]] @@ -824,6 +823,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", + "enumset", "schemars", "serde", ] @@ -1062,7 +1062,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -1079,9 +1079,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" dependencies = [ "unicode-ident", ] @@ -1103,14 +1103,14 @@ checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "quote" -version = "1.0.9" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -1233,7 +1233,7 @@ checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1269,7 +1269,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn", + "syn 1.0.109", ] [[package]] @@ -1341,7 +1341,7 @@ checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1352,7 +1352,7 @@ checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1450,12 +1450,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "subtle" version = "2.4.1" @@ -1473,6 +1467,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "target-lexicon" version = "0.12.7" @@ -1496,7 +1501,7 @@ checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1534,7 +1539,7 @@ checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1623,7 +1628,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-shared", ] @@ -1647,7 +1652,7 @@ checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1668,7 +1673,7 @@ checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1782,7 +1787,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 55070b4c11..401eadb0a3 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -128,7 +128,7 @@ checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -196,7 +196,7 @@ dependencies = [ name = "cosmwasm-derive" version = "1.4.0" dependencies = [ - "syn", + "syn 1.0.109", ] [[package]] @@ -216,7 +216,7 @@ version = "1.4.0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -462,9 +462,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "757c0ded2af11d8e739c4daea1ac623dd1624b06c844cf3f5a39f1bdbd99bb12" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" dependencies = [ "darling_core", "darling_macro", @@ -472,27 +472,26 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c34d8efb62d0c2d7f60ece80f75e5c63c1588ba68032740494b0b9a996466e3" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim", - "syn", + "syn 2.0.37", ] [[package]] name = "darling_macro" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade7bff147130fe5e6d39f089c6bd49ec0250f35d70b2eebf72afdfc919f15cc" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.37", ] [[package]] @@ -526,7 +525,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -568,7 +567,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -653,28 +652,28 @@ checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "enumset" -version = "1.0.7" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e76129da36102af021b8e5000dab2c1c30dbef85c1e482beeff8da5dde0e0b0" +checksum = "e875f1719c16de097dee81ed675e2d9bb63096823ed3f0ca827b7dea3028bbbb" dependencies = [ "enumset_derive", ] [[package]] name = "enumset_derive" -version = "0.5.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6451128aa6655d880755345d085494cf7561a6bee7c8dc821e5d77e6d267ecd4" +checksum = "e08b6c6ab82d70f08844964ba10c7babb716de2ecaeab9be5717918a5177d3af" dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.37", ] [[package]] @@ -1051,7 +1050,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -1068,9 +1067,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" dependencies = [ "unicode-ident", ] @@ -1092,7 +1091,7 @@ checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1102,15 +1101,16 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", + "enumset", "schemars", "serde", ] [[package]] name = "quote" -version = "1.0.9" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -1233,7 +1233,7 @@ checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1269,7 +1269,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn", + "syn 1.0.109", ] [[package]] @@ -1341,7 +1341,7 @@ checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1352,7 +1352,7 @@ checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1450,12 +1450,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "subtle" version = "2.4.1" @@ -1473,6 +1467,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "target-lexicon" version = "0.12.7" @@ -1496,7 +1501,7 @@ checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1534,7 +1539,7 @@ checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1623,7 +1628,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-shared", ] @@ -1647,7 +1652,7 @@ checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1668,7 +1673,7 @@ checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1782,7 +1787,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 91c3e0477f..32554e4111 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -128,7 +128,7 @@ checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -196,7 +196,7 @@ dependencies = [ name = "cosmwasm-derive" version = "1.4.0" dependencies = [ - "syn", + "syn 1.0.109", ] [[package]] @@ -216,7 +216,7 @@ version = "1.4.0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -462,9 +462,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "757c0ded2af11d8e739c4daea1ac623dd1624b06c844cf3f5a39f1bdbd99bb12" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" dependencies = [ "darling_core", "darling_macro", @@ -472,27 +472,26 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c34d8efb62d0c2d7f60ece80f75e5c63c1588ba68032740494b0b9a996466e3" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim", - "syn", + "syn 2.0.37", ] [[package]] name = "darling_macro" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade7bff147130fe5e6d39f089c6bd49ec0250f35d70b2eebf72afdfc919f15cc" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.37", ] [[package]] @@ -526,7 +525,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -568,7 +567,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -653,28 +652,28 @@ checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "enumset" -version = "1.0.7" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e76129da36102af021b8e5000dab2c1c30dbef85c1e482beeff8da5dde0e0b0" +checksum = "e875f1719c16de097dee81ed675e2d9bb63096823ed3f0ca827b7dea3028bbbb" dependencies = [ "enumset_derive", ] [[package]] name = "enumset_derive" -version = "0.5.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6451128aa6655d880755345d085494cf7561a6bee7c8dc821e5d77e6d267ecd4" +checksum = "e08b6c6ab82d70f08844964ba10c7babb716de2ecaeab9be5717918a5177d3af" dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.37", ] [[package]] @@ -1051,7 +1050,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -1068,9 +1067,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" dependencies = [ "unicode-ident", ] @@ -1092,14 +1091,14 @@ checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "quote" -version = "1.0.9" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -1163,6 +1162,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", + "enumset", "schemars", "serde", "thiserror", @@ -1234,7 +1234,7 @@ checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1270,7 +1270,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn", + "syn 1.0.109", ] [[package]] @@ -1342,7 +1342,7 @@ checksum = "a8c6faef9a2e64b0064f48570289b4bf8823b7581f1d6157c1b52152306651d0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1353,7 +1353,7 @@ checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1451,12 +1451,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "subtle" version = "2.4.1" @@ -1474,6 +1468,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "target-lexicon" version = "0.12.7" @@ -1497,7 +1502,7 @@ checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1535,7 +1540,7 @@ checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1624,7 +1629,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-shared", ] @@ -1648,7 +1653,7 @@ checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1669,7 +1674,7 @@ checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1783,7 +1788,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 3d175b12a2..122aab1f0e 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -128,7 +128,7 @@ checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -196,7 +196,7 @@ dependencies = [ name = "cosmwasm-derive" version = "1.4.0" dependencies = [ - "syn", + "syn 1.0.109", ] [[package]] @@ -216,7 +216,7 @@ version = "1.4.0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -462,9 +462,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "757c0ded2af11d8e739c4daea1ac623dd1624b06c844cf3f5a39f1bdbd99bb12" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" dependencies = [ "darling_core", "darling_macro", @@ -472,27 +472,26 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c34d8efb62d0c2d7f60ece80f75e5c63c1588ba68032740494b0b9a996466e3" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim", - "syn", + "syn 2.0.37", ] [[package]] name = "darling_macro" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade7bff147130fe5e6d39f089c6bd49ec0250f35d70b2eebf72afdfc919f15cc" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.37", ] [[package]] @@ -526,7 +525,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -574,7 +573,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -659,28 +658,28 @@ checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "enumset" -version = "1.0.7" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e76129da36102af021b8e5000dab2c1c30dbef85c1e482beeff8da5dde0e0b0" +checksum = "e875f1719c16de097dee81ed675e2d9bb63096823ed3f0ca827b7dea3028bbbb" dependencies = [ "enumset_derive", ] [[package]] name = "enumset_derive" -version = "0.5.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6451128aa6655d880755345d085494cf7561a6bee7c8dc821e5d77e6d267ecd4" +checksum = "e08b6c6ab82d70f08844964ba10c7babb716de2ecaeab9be5717918a5177d3af" dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.37", ] [[package]] @@ -1057,7 +1056,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -1074,9 +1073,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" dependencies = [ "unicode-ident", ] @@ -1098,14 +1097,14 @@ checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "quote" -version = "1.0.9" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -1228,7 +1227,7 @@ checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1264,7 +1263,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn", + "syn 1.0.109", ] [[package]] @@ -1336,7 +1335,7 @@ checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1347,7 +1346,7 @@ checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1441,7 +1440,7 @@ checksum = "1508efa03c362e23817f96cde18abed596a25219a8b2c66e8db33c03543d315b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1467,6 +1466,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", + "enumset", "schemars", "serde", "snafu", @@ -1478,12 +1478,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "subtle" version = "2.4.1" @@ -1501,6 +1495,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "target-lexicon" version = "0.12.7" @@ -1524,7 +1529,7 @@ checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1562,7 +1567,7 @@ checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1651,7 +1656,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-shared", ] @@ -1675,7 +1680,7 @@ checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1696,7 +1701,7 @@ checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1810,7 +1815,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 98dc192e94..91652e9722 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -128,7 +128,7 @@ checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -196,7 +196,7 @@ dependencies = [ name = "cosmwasm-derive" version = "1.4.0" dependencies = [ - "syn", + "syn 1.0.109", ] [[package]] @@ -216,7 +216,7 @@ version = "1.4.0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -462,9 +462,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "757c0ded2af11d8e739c4daea1ac623dd1624b06c844cf3f5a39f1bdbd99bb12" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" dependencies = [ "darling_core", "darling_macro", @@ -472,27 +472,26 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c34d8efb62d0c2d7f60ece80f75e5c63c1588ba68032740494b0b9a996466e3" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim", - "syn", + "syn 2.0.37", ] [[package]] name = "darling_macro" -version = "0.13.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade7bff147130fe5e6d39f089c6bd49ec0250f35d70b2eebf72afdfc919f15cc" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.37", ] [[package]] @@ -526,7 +525,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -568,7 +567,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -653,28 +652,28 @@ checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "enumset" -version = "1.0.7" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e76129da36102af021b8e5000dab2c1c30dbef85c1e482beeff8da5dde0e0b0" +checksum = "e875f1719c16de097dee81ed675e2d9bb63096823ed3f0ca827b7dea3028bbbb" dependencies = [ "enumset_derive", ] [[package]] name = "enumset_derive" -version = "0.5.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6451128aa6655d880755345d085494cf7561a6bee7c8dc821e5d77e6d267ecd4" +checksum = "e08b6c6ab82d70f08844964ba10c7babb716de2ecaeab9be5717918a5177d3af" dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.37", ] [[package]] @@ -1051,7 +1050,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -1068,9 +1067,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" dependencies = [ "unicode-ident", ] @@ -1092,14 +1091,14 @@ checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "quote" -version = "1.0.9" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -1222,7 +1221,7 @@ checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1258,7 +1257,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn", + "syn 1.0.109", ] [[package]] @@ -1330,7 +1329,7 @@ checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1341,7 +1340,7 @@ checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1439,12 +1438,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "subtle" version = "2.4.1" @@ -1462,6 +1455,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "target-lexicon" version = "0.12.7" @@ -1485,7 +1489,7 @@ checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1523,7 +1527,7 @@ checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1586,6 +1590,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", + "enumset", "schemars", "serde", "thiserror", @@ -1624,7 +1629,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-shared", ] @@ -1648,7 +1653,7 @@ checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1669,7 +1674,7 @@ checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1783,7 +1788,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] From c3fb9d207e02d410ad2a973548fd9949ef405300 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 5 Oct 2023 09:35:22 +0200 Subject: [PATCH 0819/2372] Update MSRV to 1.70 --- .circleci/config.yml | 150 +++++++++++++++++++++---------------------- 1 file changed, 75 insertions(+), 75 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0e38951381..c0314ba4e2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -72,7 +72,7 @@ workflows: matrix: parameters: # Run with MSRV and some modern stable Rust - rust-version: ["1.67.0", "1.72.0"] + rust-version: ["1.70.0", "1.72.0"] - benchmarking: requires: - package_vm @@ -118,7 +118,7 @@ jobs: command: | wget https://static.rust-lang.org/rustup/dist/aarch64-unknown-linux-gnu/rustup-init chmod +x rustup-init - ./rustup-init -y --default-toolchain 1.67.0 --profile minimal + ./rustup-init -y --default-toolchain 1.70.0 --profile minimal - run: name: Version information command: rustc --version; cargo --version; rustup --version; rustup target list --installed @@ -127,12 +127,12 @@ jobs: command: rustup target add wasm32-unknown-unknown && rustup target list --installed - restore_cache: keys: - - v4-arm64-workspace-rust:1.67.0-{{ checksum "Cargo.lock" }} - - v4-arm64-workspace-rust:1.67.0- + - v4-arm64-workspace-rust:1.70.0-{{ checksum "Cargo.lock" }} + - v4-arm64-workspace-rust:1.70.0- - restore_cache: keys: - - v4-arm64-contracts-rust:1.67.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} - - v4-arm64-contracts-rust:1.67.0- + - v4-arm64-contracts-rust:1.70.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} + - v4-arm64-contracts-rust:1.70.0- # Test a few contracts that do something potentially interesting in the VM # to test contract execution on ARM64. # No need to add all contracts here. @@ -170,14 +170,14 @@ jobs: # use all features command: cargo test --locked --features iterator,staking,stargate - save_cache: - key: v4-arm64-workspace-rust:1.67.0-{{ checksum "Cargo.lock" }} + key: v4-arm64-workspace-rust:1.70.0-{{ checksum "Cargo.lock" }} paths: - ~/.cargo/registry - target/debug/.fingerprint - target/debug/build - target/debug/deps - save_cache: - key: v4-arm64-contracts-rust:1.67.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} + key: v4-arm64-contracts-rust:1.70.0-{{ checksum "contracts/crypto-verify/Cargo.lock" }}-{{ checksum "contracts/hackatom/Cargo.lock" }}-{{ checksum "contracts/queue/Cargo.lock" }}-{{ checksum "contracts/reflect/Cargo.lock" }}-{{ checksum "contracts/staking/Cargo.lock" }} paths: - ~/.cargo/registry # crypto-verify @@ -218,7 +218,7 @@ jobs: package_crypto: docker: - - image: rust:1.67.0 + - image: rust:1.70.0 steps: - checkout - run: @@ -226,7 +226,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_crypto-rust:1.67.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_crypto-rust:1.70.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/crypto @@ -241,11 +241,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_crypto-rust:1.67.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_crypto-rust:1.70.0-{{ checksum "Cargo.lock" }} package_check: docker: - - image: rust:1.67.0 + - image: rust:1.70.0 steps: - checkout - run: @@ -253,7 +253,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_check-rust:1.67.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_check-rust:1.70.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/check @@ -268,11 +268,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_check-rust:1.67.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_check-rust:1.70.0-{{ checksum "Cargo.lock" }} package_schema: docker: - - image: rust:1.67.0 + - image: rust:1.70.0 steps: - checkout - run: @@ -280,7 +280,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_schema-rust:1.67.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_schema-rust:1.70.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/schema @@ -295,11 +295,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_schema-rust:1.67.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_schema-rust:1.70.0-{{ checksum "Cargo.lock" }} package_schema_derive: docker: - - image: rust:1.67.0 + - image: rust:1.70.0 steps: - checkout - run: @@ -307,7 +307,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_schema_derive-rust:1.67.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_schema_derive-rust:1.70.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/schema-derive @@ -322,11 +322,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_schema_derive-rust:1.67.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_schema_derive-rust:1.70.0-{{ checksum "Cargo.lock" }} package_std: docker: - - image: rust:1.67.0 + - image: rust:1.70.0 environment: # Limit the number of parallel jobs to avoid OOM crashes during doc testing RUST_TEST_THREADS: 8 @@ -337,7 +337,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_std-rust:1.67.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_std-rust:1.70.0-{{ checksum "Cargo.lock" }} - run: name: Add wasm32 target command: rustup target add wasm32-unknown-unknown && rustup target list --installed @@ -371,11 +371,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_std-rust:1.67.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_std-rust:1.70.0-{{ checksum "Cargo.lock" }} package_storage: docker: - - image: rust:1.67.0 + - image: rust:1.70.0 steps: - checkout - run: @@ -383,7 +383,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_storage-rust:1.67.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_storage-rust:1.70.0-{{ checksum "Cargo.lock" }} - run: name: Build library for native target working_directory: ~/project/packages/storage @@ -402,11 +402,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_storage-rust:1.67.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_storage-rust:1.70.0-{{ checksum "Cargo.lock" }} package_vm: docker: - - image: rust:1.67.0 + - image: rust:1.70.0 steps: - checkout - run: @@ -414,7 +414,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_vm-rust:1.67.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_vm-rust:1.70.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/vm @@ -443,7 +443,7 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_vm-rust:1.67.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_vm-rust:1.70.0-{{ checksum "Cargo.lock" }} package_vm_windows: executor: @@ -462,7 +462,7 @@ jobs: command: | set -o errexit curl -sS --output rustup-init.exe https://static.rust-lang.org/rustup/dist/x86_64-pc-windows-msvc/rustup-init.exe - ./rustup-init.exe --default-toolchain 1.67.0 -y + ./rustup-init.exe --default-toolchain 1.70.0 -y echo 'export PATH="$PATH;$USERPROFILE/.cargo/bin"' >> "$BASH_ENV" - run: name: Version information @@ -471,7 +471,7 @@ jobs: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cachev3-package_vm_windows-rust:1.67.0-{{ checksum "Cargo.lock" }} + - cachev3-package_vm_windows-rust:1.70.0-{{ checksum "Cargo.lock" }} - run: name: Test working_directory: ~/project/packages/vm @@ -487,11 +487,11 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cachev3-package_vm_windows-rust:1.67.0-{{ checksum "Cargo.lock" }} + key: cachev3-package_vm_windows-rust:1.70.0-{{ checksum "Cargo.lock" }} contract_burner: docker: - - image: rust:1.67.0 + - image: rust:1.70.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/burner @@ -503,7 +503,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_burner-rust:1.67.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_burner-rust:1.70.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -514,11 +514,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_burner-rust:1.67.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_burner-rust:1.70.0-{{ checksum "Cargo.lock" }} contract_crypto_verify: docker: - - image: rust:1.67.0 + - image: rust:1.70.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/crypto-verify @@ -530,7 +530,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_crypto_verify-rust:1.67.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_crypto_verify-rust:1.70.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -541,11 +541,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_crypto_verify-rust:1.67.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_crypto_verify-rust:1.70.0-{{ checksum "Cargo.lock" }} contract_cyberpunk: docker: - - image: rust:1.67.0 + - image: rust:1.70.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/cyberpunk @@ -557,7 +557,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_cyberpunk-rust:1.67.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_cyberpunk-rust:1.70.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -568,11 +568,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_cyberpunk-rust:1.67.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_cyberpunk-rust:1.70.0-{{ checksum "Cargo.lock" }} contract_hackatom: docker: - - image: rust:1.67.0 + - image: rust:1.70.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/hackatom @@ -584,7 +584,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_hackatom-rust:1.67.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_hackatom-rust:1.70.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -595,11 +595,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_hackatom-rust:1.67.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_hackatom-rust:1.70.0-{{ checksum "Cargo.lock" }} contract_ibc_reflect: docker: - - image: rust:1.67.0 + - image: rust:1.70.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/ibc-reflect @@ -611,7 +611,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_ibc_reflect-rust:1.67.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_ibc_reflect-rust:1.70.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -622,11 +622,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_ibc_reflect-rust:1.67.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_ibc_reflect-rust:1.70.0-{{ checksum "Cargo.lock" }} contract_ibc_reflect_send: docker: - - image: rust:1.67.0 + - image: rust:1.70.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/ibc-reflect-send @@ -638,7 +638,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_ibc_reflect_send-rust:1.67.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_ibc_reflect_send-rust:1.70.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -649,11 +649,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_ibc_reflect_send-rust:1.67.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_ibc_reflect_send-rust:1.70.0-{{ checksum "Cargo.lock" }} contract_floaty: docker: - - image: rust:1.67.0 + - image: rust:1.70.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/floaty @@ -665,7 +665,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_floaty-rust:1.67.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_floaty-rust:1.70.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -676,11 +676,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_floaty-rust:1.67.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_floaty-rust:1.70.0-{{ checksum "Cargo.lock" }} contract_queue: docker: - - image: rust:1.67.0 + - image: rust:1.70.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/queue @@ -692,7 +692,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_queue-rust:1.67.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_queue-rust:1.70.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -703,11 +703,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_queue-rust:1.67.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_queue-rust:1.70.0-{{ checksum "Cargo.lock" }} contract_reflect: docker: - - image: rust:1.67.0 + - image: rust:1.70.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/reflect @@ -719,7 +719,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_reflect-rust:1.67.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_reflect-rust:1.70.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -730,11 +730,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_reflect-rust:1.67.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_reflect-rust:1.70.0-{{ checksum "Cargo.lock" }} contract_staking: docker: - - image: rust:1.67.0 + - image: rust:1.70.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/staking @@ -746,7 +746,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_staking-rust:1.67.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_staking-rust:1.70.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -757,11 +757,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_staking-rust:1.67.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_staking-rust:1.70.0-{{ checksum "Cargo.lock" }} contract_virus: docker: - - image: rust:1.67.0 + - image: rust:1.70.0 environment: RUST_BACKTRACE: 1 working_directory: ~/cosmwasm/contracts/virus @@ -773,7 +773,7 @@ jobs: command: rustc --version; cargo --version; rustup --version - restore_cache: keys: - - cargocache-v2-contract_virus-rust:1.67.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-contract_virus-rust:1.70.0-{{ checksum "Cargo.lock" }} - check_contract - save_cache: paths: @@ -784,11 +784,11 @@ jobs: - target/wasm32-unknown-unknown/release/.fingerprint - target/wasm32-unknown-unknown/release/build - target/wasm32-unknown-unknown/release/deps - key: cargocache-v2-contract_virus-rust:1.67.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-contract_virus-rust:1.70.0-{{ checksum "Cargo.lock" }} fmt: docker: - - image: rust:1.67.0 + - image: rust:1.70.0 steps: - checkout - run: @@ -796,7 +796,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-fmt-rust:1.67.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-fmt-rust:1.70.0-{{ checksum "Cargo.lock" }} - run: name: Add rustfmt component command: rustup component add rustfmt @@ -809,7 +809,7 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-fmt-rust:1.67.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-fmt-rust:1.70.0-{{ checksum "Cargo.lock" }} fmt_extra: docker: @@ -831,7 +831,7 @@ jobs: deadlinks: docker: - - image: rust:1.67.0 + - image: rust:1.70.0 steps: - checkout - run: @@ -839,7 +839,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-deadlinks-rust:1.67.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-deadlinks-rust:1.70.0-{{ checksum "Cargo.lock" }} - run: name: Generate docs command: cargo doc @@ -859,7 +859,7 @@ jobs: - target/debug/build - target/debug/deps - /root/.cache/pip - key: cargocache-v2-deadlinks-rust:1.67.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-deadlinks-rust:1.70.0-{{ checksum "Cargo.lock" }} clippy: parameters: @@ -935,7 +935,7 @@ jobs: benchmarking: docker: - - image: rust:1.67.0 + - image: rust:1.70.0 environment: RUST_BACKTRACE: 1 steps: @@ -945,7 +945,7 @@ jobs: command: rustc --version && cargo --version - restore_cache: keys: - - cargocache-v2-benchmarking-rust:1.67.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-benchmarking-rust:1.70.0-{{ checksum "Cargo.lock" }} - run: name: Run vm benchmarks (Singlepass) working_directory: ~/project/packages/vm @@ -963,7 +963,7 @@ jobs: - target/release/.fingerprint - target/release/build - target/release/deps - key: cargocache-v2-benchmarking-rust:1.67.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-benchmarking-rust:1.70.0-{{ checksum "Cargo.lock" }} coverage: docker: @@ -1041,7 +1041,7 @@ jobs: name: Check development contracts command: | echo "Checking all contracts under ./artifacts" - docker run --volumes-from with_code rust:1.67.0 \ + docker run --volumes-from with_code rust:1.70.0 \ /bin/bash -e -c 'cd ./code; cargo run --bin cosmwasm-check artifacts/*.wasm' docker cp with_code:/code/artifacts . - run: From 9d7af0bb5b136abeb45666c137d35e97212086c9 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 5 Oct 2023 10:04:24 +0200 Subject: [PATCH 0820/2372] Add ignore clippy warning --- packages/std/src/testing/assertions.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/std/src/testing/assertions.rs b/packages/std/src/testing/assertions.rs index d747360070..fa3ab6c7fa 100644 --- a/packages/std/src/testing/assertions.rs +++ b/packages/std/src/testing/assertions.rs @@ -82,6 +82,7 @@ pub fn assert_hash_works_impl(left: T, right: T, panic_msg } // Check clone + #[allow(clippy::redundant_clone)] let clone = left.clone(); if left != clone { do_panic("assertion failed: `left == left.clone()`", panic_msg); From 5bbf44cc5d4945b02e53c79f00efca64afeba7f2 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 5 Oct 2023 11:01:29 +0200 Subject: [PATCH 0821/2372] Move enumset to dev-dependencies Add comment --- contracts/burner/Cargo.toml | 3 ++- contracts/crypto-verify/Cargo.toml | 3 ++- contracts/cyberpunk/Cargo.toml | 3 ++- contracts/floaty/Cargo.toml | 3 ++- contracts/hackatom/Cargo.toml | 3 ++- contracts/ibc-reflect-send/Cargo.toml | 3 ++- contracts/ibc-reflect/Cargo.toml | 3 ++- contracts/queue/Cargo.toml | 3 ++- contracts/reflect/Cargo.toml | 3 ++- contracts/staking/Cargo.toml | 3 ++- contracts/virus/Cargo.toml | 3 ++- 11 files changed, 22 insertions(+), 11 deletions(-) diff --git a/contracts/burner/Cargo.toml b/contracts/burner/Cargo.toml index de750359ed..900e3ff7ae 100644 --- a/contracts/burner/Cargo.toml +++ b/contracts/burner/Cargo.toml @@ -36,7 +36,8 @@ cosmwasm-schema = { path = "../../packages/schema" } cosmwasm-std = { path = "../../packages/std", features = ["iterator", "cosmwasm_1_4"] } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } -enumset = "1.1.0" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator"] } +# Temporary hack to avoid enumset 1.0 trait `EnumSetTypeRepr` is private +enumset = "1.1.0" diff --git a/contracts/crypto-verify/Cargo.toml b/contracts/crypto-verify/Cargo.toml index 31b4883c8f..3579269e17 100644 --- a/contracts/crypto-verify/Cargo.toml +++ b/contracts/crypto-verify/Cargo.toml @@ -40,8 +40,9 @@ schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } sha2 = "0.10" sha3 = "0.10" -enumset = "1.1.0" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator"] } hex-literal = "0.3.1" +# Temporary hack to avoid enumset 1.0 trait `EnumSetTypeRepr` is private +enumset = "1.1.0" diff --git a/contracts/cyberpunk/Cargo.toml b/contracts/cyberpunk/Cargo.toml index bb4b348bae..3f369e1811 100644 --- a/contracts/cyberpunk/Cargo.toml +++ b/contracts/cyberpunk/Cargo.toml @@ -33,8 +33,9 @@ cosmwasm-schema = { path = "../../packages/schema" } cosmwasm-std = { path = "../../packages/std", default-features = false, features = ["abort", "cosmwasm_1_3"] } rust-argon2 = "0.8" thiserror = "1.0.26" -enumset = "1.1.0" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false } tempfile = "3.1.0" +# Temporary hack to avoid enumset 1.0 trait `EnumSetTypeRepr` is private +enumset = "1.1.0" diff --git a/contracts/floaty/Cargo.toml b/contracts/floaty/Cargo.toml index 74892d62c5..8105daee71 100644 --- a/contracts/floaty/Cargo.toml +++ b/contracts/floaty/Cargo.toml @@ -36,7 +36,8 @@ cosmwasm-std = { path = "../../packages/std" } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } rand_chacha = { version = "0.3.1", default-features = false } -enumset = "1.1.0" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator"] } +# Temporary hack to avoid enumset 1.0 trait `EnumSetTypeRepr` is private +enumset = "1.1.0" diff --git a/contracts/hackatom/Cargo.toml b/contracts/hackatom/Cargo.toml index 31cfb66bc9..0cb092e400 100644 --- a/contracts/hackatom/Cargo.toml +++ b/contracts/hackatom/Cargo.toml @@ -37,7 +37,8 @@ schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } sha2 = "0.10" thiserror = "1.0.26" -enumset = "1.1.0" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false } +# Temporary hack to avoid enumset 1.0 trait `EnumSetTypeRepr` is private +enumset = "1.1.0" diff --git a/contracts/ibc-reflect-send/Cargo.toml b/contracts/ibc-reflect-send/Cargo.toml index 66280df7ec..ca76bc43de 100644 --- a/contracts/ibc-reflect-send/Cargo.toml +++ b/contracts/ibc-reflect-send/Cargo.toml @@ -36,7 +36,8 @@ cosmwasm-schema = { path = "../../packages/schema" } cosmwasm-std = { path = "../../packages/std", features = ["iterator", "staking", "stargate"] } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } -enumset = "1.1.0" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator", "stargate"] } +# Temporary hack to avoid enumset 1.0 trait `EnumSetTypeRepr` is private +enumset = "1.1.0" diff --git a/contracts/ibc-reflect/Cargo.toml b/contracts/ibc-reflect/Cargo.toml index 6f0d8840f6..59e3ec569e 100644 --- a/contracts/ibc-reflect/Cargo.toml +++ b/contracts/ibc-reflect/Cargo.toml @@ -36,7 +36,8 @@ cosmwasm-schema = { path = "../../packages/schema" } cosmwasm-std = { path = "../../packages/std", features = ["iterator", "ibc3"] } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } -enumset = "1.1.0" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator", "stargate"] } +# Temporary hack to avoid enumset 1.0 trait `EnumSetTypeRepr` is private +enumset = "1.1.0" diff --git a/contracts/queue/Cargo.toml b/contracts/queue/Cargo.toml index 875b451a18..1f2c6c7c9b 100644 --- a/contracts/queue/Cargo.toml +++ b/contracts/queue/Cargo.toml @@ -38,7 +38,8 @@ cosmwasm-schema = { path = "../../packages/schema" } cosmwasm-std = { path = "../../packages/std", features = ["iterator", "cosmwasm_1_4"] } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } -enumset = "1.1.0" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator"] } +# Temporary hack to avoid enumset 1.0 trait `EnumSetTypeRepr` is private +enumset = "1.1.0" diff --git a/contracts/reflect/Cargo.toml b/contracts/reflect/Cargo.toml index 0f6c31c9cc..28ff8db769 100644 --- a/contracts/reflect/Cargo.toml +++ b/contracts/reflect/Cargo.toml @@ -38,7 +38,8 @@ cosmwasm-std = { path = "../../packages/std", default-features = false, features schemars = "0.8.3" serde = { version = "=1.0.103", default-features = false, features = ["derive"] } thiserror = "1.0.26" -enumset = "1.1.0" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["stargate"] } +# Temporary hack to avoid enumset 1.0 trait `EnumSetTypeRepr` is private +enumset = "1.1.0" diff --git a/contracts/staking/Cargo.toml b/contracts/staking/Cargo.toml index e121658ca4..8ebcc44d1f 100644 --- a/contracts/staking/Cargo.toml +++ b/contracts/staking/Cargo.toml @@ -37,7 +37,8 @@ cosmwasm-std = { path = "../../packages/std", default-features = false, features schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } snafu = "0.6.6" -enumset = "1.1.0" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["staking"] } +# Temporary hack to avoid enumset 1.0 trait `EnumSetTypeRepr` is private +enumset = "1.1.0" diff --git a/contracts/virus/Cargo.toml b/contracts/virus/Cargo.toml index f5ee453db8..44a99b0caf 100644 --- a/contracts/virus/Cargo.toml +++ b/contracts/virus/Cargo.toml @@ -37,7 +37,8 @@ cosmwasm-std = { path = "../../packages/std", features = ["cosmwasm_1_2"] } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } thiserror = "1.0.26" -enumset = "1.1.0" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator"] } +# Temporary hack to avoid enumset 1.0 trait `EnumSetTypeRepr` is private +enumset = "1.1.0" From d96d08f082dab0c64e73b9a833f93f45d64c5689 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 5 Oct 2023 11:37:44 +0200 Subject: [PATCH 0822/2372] Change rust version to 1.70.0 in GH workflow --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b59d22676d..a432811b1e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,7 +33,7 @@ jobs: - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: 1.67.0 + toolchain: 1.70.0 target: wasm32-unknown-unknown profile: minimal override: true From 5ae16146796e44a1fea5345c8d1057d1e0b3fa09 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 5 Oct 2023 11:56:02 +0200 Subject: [PATCH 0823/2372] Upgrade to latest wasmer v4.2.2 --- packages/vm/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index b9593e95b1..c9154d52d2 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -48,8 +48,8 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " serde_json = "1.0.40" sha2 = "0.10.3" thiserror = "1.0.26" -wasmer = { version = "=4.2.1", default-features = false, features = ["cranelift", "singlepass"] } -wasmer-middlewares = "=4.2.1" +wasmer = { version = "=4.2.2", default-features = false, features = ["cranelift", "singlepass"] } +wasmer-middlewares = "=4.2.2" # Dependencies that we do not use ourself. We add those entries # to bump the min version of them. From 7f93981322a125032127474d6eab6316b3c300d5 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 5 Oct 2023 11:58:37 +0200 Subject: [PATCH 0824/2372] Update lock files --- Cargo.lock | 32 +++++++++++++-------------- contracts/burner/Cargo.lock | 32 +++++++++++++-------------- contracts/crypto-verify/Cargo.lock | 32 +++++++++++++-------------- contracts/cyberpunk/Cargo.lock | 32 +++++++++++++-------------- contracts/floaty/Cargo.lock | 32 +++++++++++++-------------- contracts/hackatom/Cargo.lock | 32 +++++++++++++-------------- contracts/ibc-reflect-send/Cargo.lock | 32 +++++++++++++-------------- contracts/ibc-reflect/Cargo.lock | 32 +++++++++++++-------------- contracts/queue/Cargo.lock | 32 +++++++++++++-------------- contracts/reflect/Cargo.lock | 32 +++++++++++++-------------- contracts/staking/Cargo.lock | 32 +++++++++++++-------------- contracts/virus/Cargo.lock | 32 +++++++++++++-------------- 12 files changed, 192 insertions(+), 192 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 83d5fd4d0f..bb734ad74e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2400,9 +2400,9 @@ dependencies = [ [[package]] name = "wasmer" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cf1c6bb916d6bf272a5036dfbdff5f78ba6b5c72eb7063dc36b6bde194aadb" +checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" dependencies = [ "bytes", "cfg-if", @@ -2429,9 +2429,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8243dee0d182add98bc58f8f352beb60c4631713fe42c02360f056ca0670b7c5" +checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" dependencies = [ "backtrace", "bytes", @@ -2456,9 +2456,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bdc493884a8e52ed822c879bd6db3152dcde18e5bc77cf89a65775c427ef00d" +checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -2475,9 +2475,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f98444cf5c146d16b38a225612363a5a0809fa07a44e9f2898ed82e9c9bbadb" +checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" dependencies = [ "byteorder", "dynasm", @@ -2494,9 +2494,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e139ec60501bc51e056b6fc14489ce11c2f4df657550cfe726011cc463b970e3" +checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" dependencies = [ "proc-macro-error", "proc-macro2", @@ -2506,9 +2506,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28bad1cacdfac30b570da8aba328730fa497e444a9325806a661bf73d682dc94" +checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" dependencies = [ "wasmer", "wasmer-types", @@ -2517,9 +2517,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1747223169a18c36793a9fc4885068b9ff8b54fe006dd3d94cbf76a275b1a45c" +checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" dependencies = [ "bytecheck", "enum-iterator", @@ -2533,9 +2533,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81c3faab9737b5424acaeffb03f9f921854a7c9a2b71223cafbb9b6fe3b169a7" +checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" dependencies = [ "backtrace", "cc", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index b9eab599f6..f1ad293c80 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -1686,9 +1686,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cf1c6bb916d6bf272a5036dfbdff5f78ba6b5c72eb7063dc36b6bde194aadb" +checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" dependencies = [ "bytes", "cfg-if", @@ -1715,9 +1715,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8243dee0d182add98bc58f8f352beb60c4631713fe42c02360f056ca0670b7c5" +checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" dependencies = [ "backtrace", "bytes", @@ -1742,9 +1742,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bdc493884a8e52ed822c879bd6db3152dcde18e5bc77cf89a65775c427ef00d" +checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1761,9 +1761,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f98444cf5c146d16b38a225612363a5a0809fa07a44e9f2898ed82e9c9bbadb" +checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" dependencies = [ "byteorder", "dynasm", @@ -1780,9 +1780,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e139ec60501bc51e056b6fc14489ce11c2f4df657550cfe726011cc463b970e3" +checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1792,9 +1792,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28bad1cacdfac30b570da8aba328730fa497e444a9325806a661bf73d682dc94" +checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" dependencies = [ "wasmer", "wasmer-types", @@ -1803,9 +1803,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1747223169a18c36793a9fc4885068b9ff8b54fe006dd3d94cbf76a275b1a45c" +checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" dependencies = [ "bytecheck", "enum-iterator", @@ -1819,9 +1819,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81c3faab9737b5424acaeffb03f9f921854a7c9a2b71223cafbb9b6fe3b169a7" +checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" dependencies = [ "backtrace", "cc", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 4435b3fb2d..9f5450526b 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -1729,9 +1729,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cf1c6bb916d6bf272a5036dfbdff5f78ba6b5c72eb7063dc36b6bde194aadb" +checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" dependencies = [ "bytes", "cfg-if", @@ -1758,9 +1758,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8243dee0d182add98bc58f8f352beb60c4631713fe42c02360f056ca0670b7c5" +checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" dependencies = [ "backtrace", "bytes", @@ -1785,9 +1785,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bdc493884a8e52ed822c879bd6db3152dcde18e5bc77cf89a65775c427ef00d" +checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1804,9 +1804,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f98444cf5c146d16b38a225612363a5a0809fa07a44e9f2898ed82e9c9bbadb" +checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" dependencies = [ "byteorder", "dynasm", @@ -1823,9 +1823,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e139ec60501bc51e056b6fc14489ce11c2f4df657550cfe726011cc463b970e3" +checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1835,9 +1835,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28bad1cacdfac30b570da8aba328730fa497e444a9325806a661bf73d682dc94" +checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" dependencies = [ "wasmer", "wasmer-types", @@ -1846,9 +1846,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1747223169a18c36793a9fc4885068b9ff8b54fe006dd3d94cbf76a275b1a45c" +checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" dependencies = [ "bytecheck", "enum-iterator", @@ -1862,9 +1862,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81c3faab9737b5424acaeffb03f9f921854a7c9a2b71223cafbb9b6fe3b169a7" +checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" dependencies = [ "backtrace", "cc", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 55914a526b..ad82b65abd 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -1823,9 +1823,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cf1c6bb916d6bf272a5036dfbdff5f78ba6b5c72eb7063dc36b6bde194aadb" +checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" dependencies = [ "bytes", "cfg-if", @@ -1852,9 +1852,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8243dee0d182add98bc58f8f352beb60c4631713fe42c02360f056ca0670b7c5" +checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" dependencies = [ "backtrace", "bytes", @@ -1879,9 +1879,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bdc493884a8e52ed822c879bd6db3152dcde18e5bc77cf89a65775c427ef00d" +checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1898,9 +1898,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f98444cf5c146d16b38a225612363a5a0809fa07a44e9f2898ed82e9c9bbadb" +checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" dependencies = [ "byteorder", "dynasm", @@ -1917,9 +1917,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e139ec60501bc51e056b6fc14489ce11c2f4df657550cfe726011cc463b970e3" +checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1929,9 +1929,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28bad1cacdfac30b570da8aba328730fa497e444a9325806a661bf73d682dc94" +checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" dependencies = [ "wasmer", "wasmer-types", @@ -1940,9 +1940,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1747223169a18c36793a9fc4885068b9ff8b54fe006dd3d94cbf76a275b1a45c" +checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" dependencies = [ "bytecheck", "enum-iterator", @@ -1956,9 +1956,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81c3faab9737b5424acaeffb03f9f921854a7c9a2b71223cafbb9b6fe3b169a7" +checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" dependencies = [ "backtrace", "cc", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 041f1457d8..11f6656bfc 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -1703,9 +1703,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cf1c6bb916d6bf272a5036dfbdff5f78ba6b5c72eb7063dc36b6bde194aadb" +checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" dependencies = [ "bytes", "cfg-if", @@ -1732,9 +1732,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8243dee0d182add98bc58f8f352beb60c4631713fe42c02360f056ca0670b7c5" +checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" dependencies = [ "backtrace", "bytes", @@ -1759,9 +1759,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bdc493884a8e52ed822c879bd6db3152dcde18e5bc77cf89a65775c427ef00d" +checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1778,9 +1778,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f98444cf5c146d16b38a225612363a5a0809fa07a44e9f2898ed82e9c9bbadb" +checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" dependencies = [ "byteorder", "dynasm", @@ -1797,9 +1797,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e139ec60501bc51e056b6fc14489ce11c2f4df657550cfe726011cc463b970e3" +checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1809,9 +1809,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28bad1cacdfac30b570da8aba328730fa497e444a9325806a661bf73d682dc94" +checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" dependencies = [ "wasmer", "wasmer-types", @@ -1820,9 +1820,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1747223169a18c36793a9fc4885068b9ff8b54fe006dd3d94cbf76a275b1a45c" +checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" dependencies = [ "bytecheck", "enum-iterator", @@ -1836,9 +1836,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81c3faab9737b5424acaeffb03f9f921854a7c9a2b71223cafbb9b6fe3b169a7" +checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" dependencies = [ "backtrace", "cc", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 0a497f9a45..5ee4d2dee2 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -1688,9 +1688,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cf1c6bb916d6bf272a5036dfbdff5f78ba6b5c72eb7063dc36b6bde194aadb" +checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" dependencies = [ "bytes", "cfg-if", @@ -1717,9 +1717,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8243dee0d182add98bc58f8f352beb60c4631713fe42c02360f056ca0670b7c5" +checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" dependencies = [ "backtrace", "bytes", @@ -1744,9 +1744,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bdc493884a8e52ed822c879bd6db3152dcde18e5bc77cf89a65775c427ef00d" +checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1763,9 +1763,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f98444cf5c146d16b38a225612363a5a0809fa07a44e9f2898ed82e9c9bbadb" +checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" dependencies = [ "byteorder", "dynasm", @@ -1782,9 +1782,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e139ec60501bc51e056b6fc14489ce11c2f4df657550cfe726011cc463b970e3" +checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1794,9 +1794,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28bad1cacdfac30b570da8aba328730fa497e444a9325806a661bf73d682dc94" +checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" dependencies = [ "wasmer", "wasmer-types", @@ -1805,9 +1805,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1747223169a18c36793a9fc4885068b9ff8b54fe006dd3d94cbf76a275b1a45c" +checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" dependencies = [ "bytecheck", "enum-iterator", @@ -1821,9 +1821,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81c3faab9737b5424acaeffb03f9f921854a7c9a2b71223cafbb9b6fe3b169a7" +checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" dependencies = [ "backtrace", "cc", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index f89fae2170..d513b4187d 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -1686,9 +1686,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cf1c6bb916d6bf272a5036dfbdff5f78ba6b5c72eb7063dc36b6bde194aadb" +checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" dependencies = [ "bytes", "cfg-if", @@ -1715,9 +1715,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8243dee0d182add98bc58f8f352beb60c4631713fe42c02360f056ca0670b7c5" +checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" dependencies = [ "backtrace", "bytes", @@ -1742,9 +1742,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bdc493884a8e52ed822c879bd6db3152dcde18e5bc77cf89a65775c427ef00d" +checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1761,9 +1761,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f98444cf5c146d16b38a225612363a5a0809fa07a44e9f2898ed82e9c9bbadb" +checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" dependencies = [ "byteorder", "dynasm", @@ -1780,9 +1780,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e139ec60501bc51e056b6fc14489ce11c2f4df657550cfe726011cc463b970e3" +checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1792,9 +1792,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28bad1cacdfac30b570da8aba328730fa497e444a9325806a661bf73d682dc94" +checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" dependencies = [ "wasmer", "wasmer-types", @@ -1803,9 +1803,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1747223169a18c36793a9fc4885068b9ff8b54fe006dd3d94cbf76a275b1a45c" +checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" dependencies = [ "bytecheck", "enum-iterator", @@ -1819,9 +1819,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81c3faab9737b5424acaeffb03f9f921854a7c9a2b71223cafbb9b6fe3b169a7" +checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" dependencies = [ "backtrace", "cc", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 5562af4c2b..dbb6d80657 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -1686,9 +1686,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cf1c6bb916d6bf272a5036dfbdff5f78ba6b5c72eb7063dc36b6bde194aadb" +checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" dependencies = [ "bytes", "cfg-if", @@ -1715,9 +1715,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8243dee0d182add98bc58f8f352beb60c4631713fe42c02360f056ca0670b7c5" +checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" dependencies = [ "backtrace", "bytes", @@ -1742,9 +1742,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bdc493884a8e52ed822c879bd6db3152dcde18e5bc77cf89a65775c427ef00d" +checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1761,9 +1761,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f98444cf5c146d16b38a225612363a5a0809fa07a44e9f2898ed82e9c9bbadb" +checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" dependencies = [ "byteorder", "dynasm", @@ -1780,9 +1780,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e139ec60501bc51e056b6fc14489ce11c2f4df657550cfe726011cc463b970e3" +checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1792,9 +1792,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28bad1cacdfac30b570da8aba328730fa497e444a9325806a661bf73d682dc94" +checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" dependencies = [ "wasmer", "wasmer-types", @@ -1803,9 +1803,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1747223169a18c36793a9fc4885068b9ff8b54fe006dd3d94cbf76a275b1a45c" +checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" dependencies = [ "bytecheck", "enum-iterator", @@ -1819,9 +1819,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81c3faab9737b5424acaeffb03f9f921854a7c9a2b71223cafbb9b6fe3b169a7" +checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" dependencies = [ "backtrace", "cc", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 401eadb0a3..56e092f660 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -1686,9 +1686,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cf1c6bb916d6bf272a5036dfbdff5f78ba6b5c72eb7063dc36b6bde194aadb" +checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" dependencies = [ "bytes", "cfg-if", @@ -1715,9 +1715,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8243dee0d182add98bc58f8f352beb60c4631713fe42c02360f056ca0670b7c5" +checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" dependencies = [ "backtrace", "bytes", @@ -1742,9 +1742,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bdc493884a8e52ed822c879bd6db3152dcde18e5bc77cf89a65775c427ef00d" +checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1761,9 +1761,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f98444cf5c146d16b38a225612363a5a0809fa07a44e9f2898ed82e9c9bbadb" +checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" dependencies = [ "byteorder", "dynasm", @@ -1780,9 +1780,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e139ec60501bc51e056b6fc14489ce11c2f4df657550cfe726011cc463b970e3" +checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1792,9 +1792,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28bad1cacdfac30b570da8aba328730fa497e444a9325806a661bf73d682dc94" +checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" dependencies = [ "wasmer", "wasmer-types", @@ -1803,9 +1803,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1747223169a18c36793a9fc4885068b9ff8b54fe006dd3d94cbf76a275b1a45c" +checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" dependencies = [ "bytecheck", "enum-iterator", @@ -1819,9 +1819,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81c3faab9737b5424acaeffb03f9f921854a7c9a2b71223cafbb9b6fe3b169a7" +checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" dependencies = [ "backtrace", "cc", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 32554e4111..e9c04670df 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -1687,9 +1687,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cf1c6bb916d6bf272a5036dfbdff5f78ba6b5c72eb7063dc36b6bde194aadb" +checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" dependencies = [ "bytes", "cfg-if", @@ -1716,9 +1716,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8243dee0d182add98bc58f8f352beb60c4631713fe42c02360f056ca0670b7c5" +checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" dependencies = [ "backtrace", "bytes", @@ -1743,9 +1743,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bdc493884a8e52ed822c879bd6db3152dcde18e5bc77cf89a65775c427ef00d" +checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1762,9 +1762,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f98444cf5c146d16b38a225612363a5a0809fa07a44e9f2898ed82e9c9bbadb" +checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" dependencies = [ "byteorder", "dynasm", @@ -1781,9 +1781,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e139ec60501bc51e056b6fc14489ce11c2f4df657550cfe726011cc463b970e3" +checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1793,9 +1793,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28bad1cacdfac30b570da8aba328730fa497e444a9325806a661bf73d682dc94" +checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" dependencies = [ "wasmer", "wasmer-types", @@ -1804,9 +1804,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1747223169a18c36793a9fc4885068b9ff8b54fe006dd3d94cbf76a275b1a45c" +checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" dependencies = [ "bytecheck", "enum-iterator", @@ -1820,9 +1820,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81c3faab9737b5424acaeffb03f9f921854a7c9a2b71223cafbb9b6fe3b169a7" +checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" dependencies = [ "backtrace", "cc", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 122aab1f0e..5f849a37b7 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -1714,9 +1714,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cf1c6bb916d6bf272a5036dfbdff5f78ba6b5c72eb7063dc36b6bde194aadb" +checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" dependencies = [ "bytes", "cfg-if", @@ -1743,9 +1743,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8243dee0d182add98bc58f8f352beb60c4631713fe42c02360f056ca0670b7c5" +checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" dependencies = [ "backtrace", "bytes", @@ -1770,9 +1770,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bdc493884a8e52ed822c879bd6db3152dcde18e5bc77cf89a65775c427ef00d" +checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1789,9 +1789,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f98444cf5c146d16b38a225612363a5a0809fa07a44e9f2898ed82e9c9bbadb" +checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" dependencies = [ "byteorder", "dynasm", @@ -1808,9 +1808,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e139ec60501bc51e056b6fc14489ce11c2f4df657550cfe726011cc463b970e3" +checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1820,9 +1820,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28bad1cacdfac30b570da8aba328730fa497e444a9325806a661bf73d682dc94" +checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" dependencies = [ "wasmer", "wasmer-types", @@ -1831,9 +1831,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1747223169a18c36793a9fc4885068b9ff8b54fe006dd3d94cbf76a275b1a45c" +checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" dependencies = [ "bytecheck", "enum-iterator", @@ -1847,9 +1847,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81c3faab9737b5424acaeffb03f9f921854a7c9a2b71223cafbb9b6fe3b169a7" +checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" dependencies = [ "backtrace", "cc", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 91652e9722..2df62d16f2 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -1687,9 +1687,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cf1c6bb916d6bf272a5036dfbdff5f78ba6b5c72eb7063dc36b6bde194aadb" +checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" dependencies = [ "bytes", "cfg-if", @@ -1716,9 +1716,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8243dee0d182add98bc58f8f352beb60c4631713fe42c02360f056ca0670b7c5" +checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" dependencies = [ "backtrace", "bytes", @@ -1743,9 +1743,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bdc493884a8e52ed822c879bd6db3152dcde18e5bc77cf89a65775c427ef00d" +checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1762,9 +1762,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f98444cf5c146d16b38a225612363a5a0809fa07a44e9f2898ed82e9c9bbadb" +checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" dependencies = [ "byteorder", "dynasm", @@ -1781,9 +1781,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e139ec60501bc51e056b6fc14489ce11c2f4df657550cfe726011cc463b970e3" +checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1793,9 +1793,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28bad1cacdfac30b570da8aba328730fa497e444a9325806a661bf73d682dc94" +checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" dependencies = [ "wasmer", "wasmer-types", @@ -1804,9 +1804,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1747223169a18c36793a9fc4885068b9ff8b54fe006dd3d94cbf76a275b1a45c" +checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" dependencies = [ "bytecheck", "enum-iterator", @@ -1820,9 +1820,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81c3faab9737b5424acaeffb03f9f921854a7c9a2b71223cafbb9b6fe3b169a7" +checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" dependencies = [ "backtrace", "cc", From 6d27d5ddde98fc26f5a3d0438ed0c1fb1493149c Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 5 Oct 2023 12:02:48 +0200 Subject: [PATCH 0825/2372] Remove enumset hack --- contracts/burner/Cargo.toml | 2 -- contracts/crypto-verify/Cargo.toml | 2 -- contracts/cyberpunk/Cargo.toml | 2 -- contracts/floaty/Cargo.toml | 2 -- contracts/hackatom/Cargo.toml | 2 -- contracts/ibc-reflect-send/Cargo.toml | 2 -- contracts/ibc-reflect/Cargo.toml | 2 -- contracts/queue/Cargo.toml | 2 -- contracts/reflect/Cargo.toml | 2 -- contracts/staking/Cargo.toml | 2 -- contracts/virus/Cargo.toml | 2 -- 11 files changed, 22 deletions(-) diff --git a/contracts/burner/Cargo.toml b/contracts/burner/Cargo.toml index 900e3ff7ae..394074b75d 100644 --- a/contracts/burner/Cargo.toml +++ b/contracts/burner/Cargo.toml @@ -39,5 +39,3 @@ serde = { version = "1.0.103", default-features = false, features = ["derive"] } [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator"] } -# Temporary hack to avoid enumset 1.0 trait `EnumSetTypeRepr` is private -enumset = "1.1.0" diff --git a/contracts/crypto-verify/Cargo.toml b/contracts/crypto-verify/Cargo.toml index 3579269e17..e31fe6242b 100644 --- a/contracts/crypto-verify/Cargo.toml +++ b/contracts/crypto-verify/Cargo.toml @@ -44,5 +44,3 @@ sha3 = "0.10" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator"] } hex-literal = "0.3.1" -# Temporary hack to avoid enumset 1.0 trait `EnumSetTypeRepr` is private -enumset = "1.1.0" diff --git a/contracts/cyberpunk/Cargo.toml b/contracts/cyberpunk/Cargo.toml index 3f369e1811..c2db096f28 100644 --- a/contracts/cyberpunk/Cargo.toml +++ b/contracts/cyberpunk/Cargo.toml @@ -37,5 +37,3 @@ thiserror = "1.0.26" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false } tempfile = "3.1.0" -# Temporary hack to avoid enumset 1.0 trait `EnumSetTypeRepr` is private -enumset = "1.1.0" diff --git a/contracts/floaty/Cargo.toml b/contracts/floaty/Cargo.toml index 8105daee71..e78bf00175 100644 --- a/contracts/floaty/Cargo.toml +++ b/contracts/floaty/Cargo.toml @@ -39,5 +39,3 @@ rand_chacha = { version = "0.3.1", default-features = false } [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator"] } -# Temporary hack to avoid enumset 1.0 trait `EnumSetTypeRepr` is private -enumset = "1.1.0" diff --git a/contracts/hackatom/Cargo.toml b/contracts/hackatom/Cargo.toml index 0cb092e400..240bdb1476 100644 --- a/contracts/hackatom/Cargo.toml +++ b/contracts/hackatom/Cargo.toml @@ -40,5 +40,3 @@ thiserror = "1.0.26" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false } -# Temporary hack to avoid enumset 1.0 trait `EnumSetTypeRepr` is private -enumset = "1.1.0" diff --git a/contracts/ibc-reflect-send/Cargo.toml b/contracts/ibc-reflect-send/Cargo.toml index ca76bc43de..dcbde4a4fe 100644 --- a/contracts/ibc-reflect-send/Cargo.toml +++ b/contracts/ibc-reflect-send/Cargo.toml @@ -39,5 +39,3 @@ serde = { version = "1.0.103", default-features = false, features = ["derive"] } [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator", "stargate"] } -# Temporary hack to avoid enumset 1.0 trait `EnumSetTypeRepr` is private -enumset = "1.1.0" diff --git a/contracts/ibc-reflect/Cargo.toml b/contracts/ibc-reflect/Cargo.toml index 59e3ec569e..ead27d3725 100644 --- a/contracts/ibc-reflect/Cargo.toml +++ b/contracts/ibc-reflect/Cargo.toml @@ -39,5 +39,3 @@ serde = { version = "1.0.103", default-features = false, features = ["derive"] } [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator", "stargate"] } -# Temporary hack to avoid enumset 1.0 trait `EnumSetTypeRepr` is private -enumset = "1.1.0" diff --git a/contracts/queue/Cargo.toml b/contracts/queue/Cargo.toml index 1f2c6c7c9b..b37c1f79e6 100644 --- a/contracts/queue/Cargo.toml +++ b/contracts/queue/Cargo.toml @@ -41,5 +41,3 @@ serde = { version = "1.0.103", default-features = false, features = ["derive"] } [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator"] } -# Temporary hack to avoid enumset 1.0 trait `EnumSetTypeRepr` is private -enumset = "1.1.0" diff --git a/contracts/reflect/Cargo.toml b/contracts/reflect/Cargo.toml index 28ff8db769..8ef7e171b2 100644 --- a/contracts/reflect/Cargo.toml +++ b/contracts/reflect/Cargo.toml @@ -41,5 +41,3 @@ thiserror = "1.0.26" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["stargate"] } -# Temporary hack to avoid enumset 1.0 trait `EnumSetTypeRepr` is private -enumset = "1.1.0" diff --git a/contracts/staking/Cargo.toml b/contracts/staking/Cargo.toml index 8ebcc44d1f..ff7e7f796d 100644 --- a/contracts/staking/Cargo.toml +++ b/contracts/staking/Cargo.toml @@ -40,5 +40,3 @@ snafu = "0.6.6" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["staking"] } -# Temporary hack to avoid enumset 1.0 trait `EnumSetTypeRepr` is private -enumset = "1.1.0" diff --git a/contracts/virus/Cargo.toml b/contracts/virus/Cargo.toml index 44a99b0caf..24df513fab 100644 --- a/contracts/virus/Cargo.toml +++ b/contracts/virus/Cargo.toml @@ -40,5 +40,3 @@ thiserror = "1.0.26" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator"] } -# Temporary hack to avoid enumset 1.0 trait `EnumSetTypeRepr` is private -enumset = "1.1.0" From 31c8b9f10e3efb961490eb97d96849d24e7a285d Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 5 Oct 2023 12:03:12 +0200 Subject: [PATCH 0826/2372] Update contracts lock file --- contracts/burner/Cargo.lock | 1 - contracts/crypto-verify/Cargo.lock | 1 - contracts/cyberpunk/Cargo.lock | 1 - contracts/floaty/Cargo.lock | 1 - contracts/hackatom/Cargo.lock | 1 - contracts/ibc-reflect-send/Cargo.lock | 1 - contracts/ibc-reflect/Cargo.lock | 1 - contracts/queue/Cargo.lock | 1 - contracts/reflect/Cargo.lock | 1 - contracts/staking/Cargo.lock | 1 - contracts/virus/Cargo.lock | 1 - 11 files changed, 11 deletions(-) diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index f1ad293c80..566e96cb44 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -116,7 +116,6 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", - "enumset", "schemars", "serde", ] diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 9f5450526b..a8008a6dff 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -454,7 +454,6 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", - "enumset", "hex", "hex-literal", "rlp", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index ad82b65abd..21bffcd7f7 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -502,7 +502,6 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", - "enumset", "rust-argon2", "tempfile", "thiserror", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 11f6656bfc..fa69b7a4b4 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -699,7 +699,6 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", - "enumset", "rand_chacha", "schemars", "serde", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 5ee4d2dee2..bf7fdc272d 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -790,7 +790,6 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", - "enumset", "schemars", "serde", "sha2 0.10.3", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index d513b4187d..60524cc905 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -823,7 +823,6 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", - "enumset", "schemars", "serde", ] diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index dbb6d80657..8aa6139a1b 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -823,7 +823,6 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", - "enumset", "schemars", "serde", ] diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 56e092f660..e2eaef6aa1 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -1101,7 +1101,6 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", - "enumset", "schemars", "serde", ] diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index e9c04670df..52c5a727e8 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -1162,7 +1162,6 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", - "enumset", "schemars", "serde", "thiserror", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 5f849a37b7..1a1373ef1e 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -1466,7 +1466,6 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", - "enumset", "schemars", "serde", "snafu", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 2df62d16f2..f214963f0a 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -1590,7 +1590,6 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cosmwasm-vm", - "enumset", "schemars", "serde", "thiserror", From 568515a91aa3400f15273df19d099609b80e5653 Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Fri, 6 Oct 2023 08:58:53 +0200 Subject: [PATCH 0827/2372] Refactoring. --- packages/std/src/testing/mock.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 61629bf5e1..c6cae0baa4 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -268,10 +268,13 @@ impl MockApi { /// /// assert_eq!("juno1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqsksmtyp", addr); /// ``` - pub fn with_prefix(self, prefix: &'static str) -> Self { + pub fn with_prefix(self, bech32_prefix: &'static str) -> Self { + let MockApi { + canonical_length, .. + } = self; Self { - bech32_prefix: prefix, - ..Default::default() + canonical_length, + bech32_prefix, } } From dbb26326979a1438048c5d2cf4c9b7fef989a35a Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Fri, 6 Oct 2023 13:25:09 +0200 Subject: [PATCH 0828/2372] Refactoring. --- packages/std/src/testing/mock.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index c6cae0baa4..015c6012d4 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -264,9 +264,9 @@ impl MockApi { /// # use cosmwasm_std::testing::MockApi; /// # /// let mock_api = MockApi::default().with_prefix("juno"); - /// let addr = mock_api.addr_make("creator").to_string(); + /// let addr = mock_api.addr_make("creator"); /// - /// assert_eq!("juno1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqsksmtyp", addr); + /// assert_eq!(addr.to_string(), "juno1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqsksmtyp"); /// ``` pub fn with_prefix(self, bech32_prefix: &'static str) -> Self { let MockApi { @@ -287,9 +287,9 @@ impl MockApi { /// # use cosmwasm_std::testing::MockApi; /// # /// let mock_api = MockApi::default(); - /// let addr = mock_api.addr_make("creator").to_string(); + /// let addr = mock_api.addr_make("creator"); /// - /// assert_eq!("cosmwasm1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqs8s7vcp", addr); + /// assert_eq!(addr.to_string(), "cosmwasm1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqs8s7vcp"); /// ``` pub fn addr_make(&self, input: &str) -> Addr { let digest = Sha256::digest(input).to_vec(); @@ -2326,19 +2326,19 @@ mod tests { let mock_api = MockApi::default(); assert_eq!( + mock_api.addr_make("creator").to_string(), "cosmwasm1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqs8s7vcp", - mock_api.addr_make("creator").to_string() ); assert_eq!( + mock_api.addr_make("").to_string(), "cosmwasm1uwcvgs5clswpfxhm7nyfjmaeysn6us0yvjdexn9yjkv3k7zjhp2sly4xh9", - mock_api.addr_make("").to_string() ); let mock_api = MockApi::default().with_prefix("juno"); assert_eq!( + mock_api.addr_make("creator").to_string(), "juno1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqsksmtyp", - mock_api.addr_make("creator").to_string() ); } From ea7cfb9a6b2b71c5a201824781b6689b2cebcdc4 Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Fri, 6 Oct 2023 13:35:06 +0200 Subject: [PATCH 0829/2372] Refactoring. --- packages/std/src/testing/mock.rs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 015c6012d4..58a8c4e350 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -268,14 +268,9 @@ impl MockApi { /// /// assert_eq!(addr.to_string(), "juno1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqsksmtyp"); /// ``` - pub fn with_prefix(self, bech32_prefix: &'static str) -> Self { - let MockApi { - canonical_length, .. - } = self; - Self { - canonical_length, - bech32_prefix, - } + pub fn with_prefix(mut self, prefix: &'static str) -> Self { + self.bech32_prefix = prefix; + self } /// Returns an address built from provided input string. From 06d15131546e9eaf490d8ea4840ba64da71ce661 Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Fri, 6 Oct 2023 14:18:12 +0200 Subject: [PATCH 0830/2372] Updated code documentation. --- packages/std/src/testing/mock.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 58a8c4e350..1c337e1ac1 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -109,8 +109,6 @@ const SHUFFLES_ENCODE: usize = 10; const SHUFFLES_DECODE: usize = 2; /// Default prefix used when creating Bech32 encoded address. -/// -/// Prefix should not be empty. const BECH32_PREFIX: &str = "cosmwasm"; // MockApi zero pads all human addresses to make them fit the canonical_length @@ -257,6 +255,8 @@ impl Api for MockApi { impl MockApi { /// Returns [MockApi] with Bech32 prefix set to provided value. /// + /// Bech32 prefix must not be empty. + /// /// # Example /// /// ``` @@ -286,6 +286,12 @@ impl MockApi { /// /// assert_eq!(addr.to_string(), "cosmwasm1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqs8s7vcp"); /// ``` + /// + /// # Panics + /// + /// This function panics when generating a valid address is not possible, + /// especially when Bech32 prefix set in function [with_prefix](Self::with_prefix) is empty. + /// pub fn addr_make(&self, input: &str) -> Addr { let digest = Sha256::digest(input).to_vec(); match encode(self.bech32_prefix, digest.to_base32(), Variant::Bech32) { From 32c6ca79e672a2b478ffdb0a7681817c15f09a4c Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Fri, 6 Oct 2023 14:49:27 +0200 Subject: [PATCH 0831/2372] Updated CHANGELOG. --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 31018a206d..21e8b20c71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ and this project adheres to ### Added +- cosmwasm-std: Add `addr_make` and `with_prefix` for + `cosmwasm_std::testing::MockApi` ([#1905]). - cosmwasm-std: Add `abs` and `unsigned_abs` for `Int{64,128,256,512}` ([#1854]). - cosmwasm-std: Add `From` for `Int512`, @@ -25,6 +27,7 @@ and this project adheres to - cosmwasm-std: Add `SignedDecimal` and `SignedDecimal256` ([#1807]). - cosmwasm-vm: Allow float operations with NaN canonicalization ([#1864]). +[#1905]: https://github.com/CosmWasm/cosmwasm/pull/1905 [#1854]: https://github.com/CosmWasm/cosmwasm/pull/1854 [#1861]: https://github.com/CosmWasm/cosmwasm/pull/1861 [#1866]: https://github.com/CosmWasm/cosmwasm/pull/1866 From 3579e839e6e0c9cee6fa9119dbbd38ed5ea4d1bc Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 5 Oct 2023 17:28:32 +0300 Subject: [PATCH 0832/2372] Fix test comments init -> instantiate --- packages/vm/src/cache.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 7d853affa0..5a1546065a 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -854,7 +854,7 @@ mod tests { assert_eq!(cache.stats().hits_fs_cache, 1); assert_eq!(cache.stats().misses, 0); - // init + // instantiate let info = mock_info("creator", &coins(1000, "earth")); let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; let res = @@ -873,7 +873,7 @@ mod tests { assert_eq!(cache.stats().hits_fs_cache, 1); assert_eq!(cache.stats().misses, 0); - // init + // instantiate let info = mock_info("creator", &coins(1000, "earth")); let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; let res = @@ -894,7 +894,7 @@ mod tests { assert_eq!(cache.stats().hits_fs_cache, 2); assert_eq!(cache.stats().misses, 0); - // init + // instantiate let info = mock_info("creator", &coins(1000, "earth")); let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; let res = @@ -919,7 +919,7 @@ mod tests { assert_eq!(cache.stats().hits_fs_cache, 1); assert_eq!(cache.stats().misses, 0); - // init + // instantiate let info = mock_info("creator", &coins(1000, "earth")); let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; let response = @@ -947,7 +947,7 @@ mod tests { assert_eq!(cache.stats().hits_fs_cache, 1); assert_eq!(cache.stats().misses, 0); - // init + // instantiate let info = mock_info("creator", &coins(1000, "earth")); let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; let response = @@ -977,7 +977,7 @@ mod tests { assert_eq!(cache.stats().hits_fs_cache, 2); assert_eq!(cache.stats().misses, 0); - // init + // instantiate let info = mock_info("creator", &coins(1000, "earth")); let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; let response = @@ -1005,7 +1005,7 @@ mod tests { let backend1 = mock_backend(&[]); let backend2 = mock_backend(&[]); - // init instance 1 + // instantiate instance 1 let mut instance = cache .get_instance(&checksum, backend1, TESTING_OPTIONS) .unwrap(); @@ -1017,7 +1017,7 @@ mod tests { assert_eq!(msgs.len(), 0); let backend1 = instance.recycle().unwrap(); - // init instance 2 + // instantiate instance 2 let mut instance = cache .get_instance(&checksum, backend2, TESTING_OPTIONS) .unwrap(); From a440660a9b915bdf56d729afa2f58cfc3177bfaa Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 5 Oct 2023 16:54:14 +0300 Subject: [PATCH 0833/2372] Add test reproducing the issue --- packages/vm/src/cache.rs | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 5a1546065a..070b624cf3 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -996,6 +996,42 @@ mod tests { } } + #[test] + fn call_execute_on_recompiled_contract() { + let options = make_testing_options(); + let cache = unsafe { Cache::new(options.clone()).unwrap() }; + let checksum = cache.save_wasm(CONTRACT).unwrap(); + + // Remove compiled module from disk + remove_dir_all(options.base_dir.join(CACHE_DIR).join(MODULES_DIR)).unwrap(); + + // Recompiles the Wasm (miss on all caches) + let backend = mock_backend(&[]); + let mut instance = cache + .get_instance(&checksum, backend, TESTING_OPTIONS) + .unwrap(); + assert_eq!(cache.stats().hits_pinned_memory_cache, 0); + assert_eq!(cache.stats().hits_memory_cache, 0); + assert_eq!(cache.stats().hits_fs_cache, 0); + assert_eq!(cache.stats().misses, 1); + + // instantiate + let info = mock_info("creator", &coins(1000, "earth")); + let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; + let response = call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) + .unwrap() + .unwrap(); + assert_eq!(response.messages.len(), 0); + + // execute + let info = mock_info("verifies", &coins(15, "earth")); + let msg = br#"{"release":{}}"#; + let response = call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) + .unwrap() + .unwrap(); + assert_eq!(response.messages.len(), 1); + } + #[test] fn use_multiple_cached_instances_of_same_contract() { let cache = unsafe { Cache::new(make_testing_options()).unwrap() }; From d9e05924d660a4914c29e707299865603563e7d2 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 5 Oct 2023 16:57:34 +0300 Subject: [PATCH 0834/2372] Fix misuse of Module Before this fix, the compiling engine was attached to the Module instance (indirectly via the artifact). However, the Store used was created from a different engine. --- packages/vm/src/cache.rs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 070b624cf3..dd62d96c3a 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -377,11 +377,22 @@ where // stored the old module format. let wasm = self.load_wasm_with_path(&cache.wasm_path, checksum)?; cache.stats.misses = cache.stats.misses.saturating_add(1); - // Module will run with a different engine, so we can set memory limit to None - let engine = make_compiling_engine(None); - let module = compile(&engine, &wasm)?; - let module_size = cache.fs_cache.store(checksum, &module)?; + { + // Module will run with a different engine, so we can set memory limit to None + let compiling_engine = make_compiling_engine(None); + // Note that module cannot be used directly as it was not created with the + // runtime engine. + let module = compile(&compiling_engine, &wasm)?; + cache.fs_cache.store(checksum, &module)?; + } + // This time we'll hit the file-system cache. + let Some((module, module_size)) = cache.fs_cache.load(checksum, &cache.runtime_engine)? + else { + return Err(VmError::generic_err( + "Can't load module from file system cache after storing it to file system cache", + )); + }; cache .memory_cache .store(checksum, module.clone(), module_size)?; From 949d82b267b220d9e9626f52a78aef359488c98d Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 6 Oct 2023 11:57:46 +0300 Subject: [PATCH 0835/2372] Pull out test_hackatom_instance_execution --- packages/vm/src/cache.rs | 41 ++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index dd62d96c3a..d04c88d854 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -543,6 +543,30 @@ mod tests { } } + /// Takes an instance and executes it + fn test_hackatom_instance_execution(instance: &mut Instance) + where + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, + { + // instantiate + let info = mock_info("creator", &coins(1000, "earth")); + let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; + let response = call_instantiate::<_, _, _, Empty>(instance, &mock_env(), &info, msg) + .unwrap() + .unwrap(); + assert_eq!(response.messages.len(), 0); + + // execute + let info = mock_info("verifies", &coins(15, "earth")); + let msg = br#"{"release":{}}"#; + let response = call_execute::<_, _, _, Empty>(instance, &mock_env(), &info, msg) + .unwrap() + .unwrap(); + assert_eq!(response.messages.len(), 1); + } + #[test] fn new_base_dir_will_be_created() { let my_base_dir = TempDir::new() @@ -1025,22 +1049,7 @@ mod tests { assert_eq!(cache.stats().hits_memory_cache, 0); assert_eq!(cache.stats().hits_fs_cache, 0); assert_eq!(cache.stats().misses, 1); - - // instantiate - let info = mock_info("creator", &coins(1000, "earth")); - let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; - let response = call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) - .unwrap() - .unwrap(); - assert_eq!(response.messages.len(), 0); - - // execute - let info = mock_info("verifies", &coins(15, "earth")); - let msg = br#"{"release":{}}"#; - let response = call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) - .unwrap() - .unwrap(); - assert_eq!(response.messages.len(), 1); + test_hackatom_instance_execution(&mut instance); } #[test] From 85201719fb61776389cd2b47fc59e6bfce819025 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 6 Oct 2023 12:01:24 +0300 Subject: [PATCH 0836/2372] Execute instances in pin_unpin_works test --- packages/vm/src/cache.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index d04c88d854..57ee769c67 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -1286,13 +1286,14 @@ mod tests { // check not pinned let backend = mock_backend(&[]); - let _instance = cache + let mut instance = cache .get_instance(&checksum, backend, TESTING_OPTIONS) .unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 0); assert_eq!(cache.stats().hits_memory_cache, 0); assert_eq!(cache.stats().hits_fs_cache, 1); assert_eq!(cache.stats().misses, 0); + test_hackatom_instance_execution(&mut instance); // first pin hits file system cache cache.pin(&checksum).unwrap(); @@ -1310,26 +1311,28 @@ mod tests { // check pinned let backend = mock_backend(&[]); - let _instance = cache + let mut instance = cache .get_instance(&checksum, backend, TESTING_OPTIONS) .unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 1); assert_eq!(cache.stats().hits_memory_cache, 0); assert_eq!(cache.stats().hits_fs_cache, 2); assert_eq!(cache.stats().misses, 0); + test_hackatom_instance_execution(&mut instance); // unpin cache.unpin(&checksum).unwrap(); // verify unpinned let backend = mock_backend(&[]); - let _instance = cache + let mut instance = cache .get_instance(&checksum, backend, TESTING_OPTIONS) .unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 1); assert_eq!(cache.stats().hits_memory_cache, 1); assert_eq!(cache.stats().hits_fs_cache, 2); assert_eq!(cache.stats().misses, 0); + test_hackatom_instance_execution(&mut instance); // unpin again has no effect cache.unpin(&checksum).unwrap(); From 7c7b93d9c6a401ed36742d9f3da2e03f5adebc75 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 6 Oct 2023 12:03:38 +0300 Subject: [PATCH 0837/2372] Reproduce bug in pin implementation --- packages/vm/src/cache.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 57ee769c67..69ac065d19 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -1361,13 +1361,14 @@ mod tests { // After the compilation in pin, the module can be used from pinned memory cache let backend = mock_backend(&[]); - let _ = cache + let mut instance = cache .get_instance(&checksum, backend, TESTING_OPTIONS) .unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 1); assert_eq!(cache.stats().hits_memory_cache, 0); assert_eq!(cache.stats().hits_fs_cache, 0); assert_eq!(cache.stats().misses, 1); + test_hackatom_instance_execution(&mut instance); } #[test] From b76c1e5bcb578da5359caa11b0cf114e0d086aca Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 6 Oct 2023 12:09:38 +0300 Subject: [PATCH 0838/2372] Annotate compiled module consistenly --- packages/vm/src/cache.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 69ac065d19..779fdc374f 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -202,6 +202,7 @@ where pub fn save_wasm_unchecked(&self, wasm: &[u8]) -> VmResult { // We need a new engine for each Wasm -> module compilation due to the metering middleware. let compiling_engine = make_compiling_engine(None); + // This module cannot be executed directly as it was not created with the runtime engine let module = compile(&compiling_engine, wasm)?; let mut cache = self.inner.lock().unwrap(); @@ -292,8 +293,9 @@ where let wasm = self.load_wasm_with_path(&cache.wasm_path, checksum)?; cache.stats.misses = cache.stats.misses.saturating_add(1); // Module will run with a different engine, so we can set memory limit to None - let engine = make_compiling_engine(None); - let module = compile(&engine, &wasm)?; + let compiling_engine = make_compiling_engine(None); + // This module cannot be executed directly as it was not created with the runtime engine + let module = compile(&compiling_engine, &wasm)?; // Store into the fs cache too let module_size = cache.fs_cache.store(checksum, &module)?; cache @@ -380,8 +382,7 @@ where { // Module will run with a different engine, so we can set memory limit to None let compiling_engine = make_compiling_engine(None); - // Note that module cannot be used directly as it was not created with the - // runtime engine. + // This module cannot be executed directly as it was not created with the runtime engine let module = compile(&compiling_engine, &wasm)?; cache.fs_cache.store(checksum, &module)?; } From e99425bdbd7f00b856e4841888ded7937f8056f0 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 6 Oct 2023 12:18:23 +0300 Subject: [PATCH 0839/2372] Fix bug for the pin implementation --- packages/vm/src/cache.rs | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 779fdc374f..7bf893bef2 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -292,12 +292,22 @@ where // Re-compile from original Wasm bytecode let wasm = self.load_wasm_with_path(&cache.wasm_path, checksum)?; cache.stats.misses = cache.stats.misses.saturating_add(1); - // Module will run with a different engine, so we can set memory limit to None - let compiling_engine = make_compiling_engine(None); - // This module cannot be executed directly as it was not created with the runtime engine - let module = compile(&compiling_engine, &wasm)?; - // Store into the fs cache too - let module_size = cache.fs_cache.store(checksum, &module)?; + { + // Module will run with a different engine, so we can set memory limit to None + let compiling_engine = make_compiling_engine(None); + // This module cannot be executed directly as it was not created with the runtime engine + let module = compile(&compiling_engine, &wasm)?; + cache.fs_cache.store(checksum, &module)?; + } + + // This time we'll hit the file-system cache. + let Some((module, module_size)) = cache.fs_cache.load(checksum, &cache.runtime_engine)? + else { + return Err(VmError::generic_err( + "Can't load module from file system cache after storing it to file system cache (pin)", + )); + }; + cache .pinned_memory_cache .store(checksum, module, module_size) @@ -391,7 +401,7 @@ where let Some((module, module_size)) = cache.fs_cache.load(checksum, &cache.runtime_engine)? else { return Err(VmError::generic_err( - "Can't load module from file system cache after storing it to file system cache", + "Can't load module from file system cache after storing it to file system cache (get_module)", )); }; cache From 7774c748e18c5dddf646f99240ba40e5bfcd60d0 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Sat, 7 Oct 2023 14:01:46 +0300 Subject: [PATCH 0840/2372] Add CHANGELOG entry for Wasmer engine regression fix --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1011c1a908..12280bdc57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,14 @@ and this project adheres to ## [Unreleased] +## Fixed + +- cosmwasm-vm: Fix a 1.3.x -> 1.4.0 regression bug leading to a _Wasmer runtime + error: RuntimeError: out of bounds memory access_ in cases when the Wasm file + is re-compiled and used right away. ([#1907]) + +[#1907]: https://github.com/CosmWasm/cosmwasm/pull/1907 + ### Changed - cosmwasm-check: Use "=" for pinning the versions of cosmwasm-vm and From dc2eca73c53d5ab27c85910f109fd790ee2527fe Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 9 Oct 2023 09:24:44 +0200 Subject: [PATCH 0841/2372] Set version: 1.4.1 --- Cargo.lock | 16 ++++++++-------- contracts/burner/Cargo.lock | 12 ++++++------ contracts/crypto-verify/Cargo.lock | 12 ++++++------ contracts/cyberpunk/Cargo.lock | 12 ++++++------ contracts/floaty/Cargo.lock | 12 ++++++------ contracts/hackatom/Cargo.lock | 12 ++++++------ contracts/ibc-reflect-send/Cargo.lock | 12 ++++++------ contracts/ibc-reflect/Cargo.lock | 12 ++++++------ contracts/queue/Cargo.lock | 12 ++++++------ contracts/reflect/Cargo.lock | 12 ++++++------ contracts/staking/Cargo.lock | 12 ++++++------ contracts/virus/Cargo.lock | 12 ++++++------ packages/check/Cargo.toml | 6 +++--- packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/go-gen/Cargo.toml | 4 ++-- packages/schema-derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 6 +++--- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 21 files changed, 93 insertions(+), 93 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7468e3988c..fec4e20bcd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -427,7 +427,7 @@ dependencies = [ [[package]] name = "cosmwasm-check" -version = "1.4.0" +version = "1.4.1" dependencies = [ "anyhow", "assert_cmd", @@ -440,7 +440,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0" +version = "1.4.1" dependencies = [ "criterion", "digest 0.10.6", @@ -458,7 +458,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "cosmwasm-std", "syn 1.0.109", @@ -466,7 +466,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "1.4.0" +version = "1.4.1" dependencies = [ "anyhow", "cosmwasm-schema-derive", @@ -481,7 +481,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "proc-macro2", "quote", @@ -490,7 +490,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0" +version = "1.4.1" dependencies = [ "base64", "bnum", @@ -513,7 +513,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.4.0" +version = "1.4.1" dependencies = [ "cosmwasm-std", "serde", @@ -521,7 +521,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0" +version = "1.4.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 07242e93c8..fccfa120b3 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -193,7 +193,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0" +version = "1.4.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -204,14 +204,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0" +version = "1.4.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -222,7 +222,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "proc-macro2", "quote", @@ -231,7 +231,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0" +version = "1.4.1" dependencies = [ "base64", "bnum", @@ -249,7 +249,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0" +version = "1.4.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 57f3c4eb5b..58aadb3fba 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0" +version = "1.4.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0" +version = "1.4.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0" +version = "1.4.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0" +version = "1.4.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 402cce654b..f7ccb63e8f 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -217,7 +217,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0" +version = "1.4.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -228,14 +228,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0" +version = "1.4.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -246,7 +246,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "proc-macro2", "quote", @@ -255,7 +255,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0" +version = "1.4.1" dependencies = [ "base64 0.21.2", "bnum", @@ -273,7 +273,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0" +version = "1.4.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index f0469fa3c6..35f5084311 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0" +version = "1.4.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0" +version = "1.4.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0" +version = "1.4.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0" +version = "1.4.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index a3523bb6c8..157b4b85d6 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0" +version = "1.4.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0" +version = "1.4.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0" +version = "1.4.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0" +version = "1.4.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index f41393259d..b070200db9 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0" +version = "1.4.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0" +version = "1.4.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0" +version = "1.4.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0" +version = "1.4.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 553ee55464..9d35637259 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0" +version = "1.4.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0" +version = "1.4.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0" +version = "1.4.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0" +version = "1.4.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index a4c45020ee..c5ab6b09c5 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0" +version = "1.4.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0" +version = "1.4.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0" +version = "1.4.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0" +version = "1.4.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 42c8d1a249..3cd127ac90 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0" +version = "1.4.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0" +version = "1.4.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0" +version = "1.4.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0" +version = "1.4.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 798cd9cfa1..c21de83d3f 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0" +version = "1.4.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0" +version = "1.4.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0" +version = "1.4.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0" +version = "1.4.1" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index bb24cd92a7..10c29655e2 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0" +version = "1.4.1" dependencies = [ "digest 0.10.7", "ed25519-zebra", @@ -193,14 +193,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.4.0" +version = "1.4.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -211,7 +211,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "proc-macro2", "quote", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0" +version = "1.4.1" dependencies = [ "base64", "bnum", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.0" +version = "1.4.1" dependencies = [ "bitflags", "bytecheck", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index 507eceb8cb..1a4c3c55c0 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-check" -version = "1.4.0" +version = "1.4.1" authors = ["Mauro Lacy "] edition = "2021" description = "A CLI tool for verifying CosmWasm smart contracts" @@ -11,8 +11,8 @@ license = "Apache-2.0" anyhow = "1.0.57" clap = "4" colored = "2" -cosmwasm-vm = { path = "../vm", version = "=1.4.0" } -cosmwasm-std = { path = "../std", version = "=1.4.0" } +cosmwasm-vm = { path = "../vm", version = "=1.4.1" } +cosmwasm-std = { path = "../std", version = "=1.4.1" } [dev-dependencies] assert_cmd = "=2.0.10" # 2.0.11+ requires Rust 1.65.0 which we currently don't want to make the minimum if possible diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 8bbb5c4e42..517c020c48 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "1.4.0" +version = "1.4.1" authors = ["Mauro Lacy "] edition = "2021" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index cc426c01a8..b663b7f53e 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "1.4.0" +version = "1.4.1" authors = ["Simon Warta "] edition = "2021" description = "A package for auto-generated code used for CosmWasm contract development. This is shipped as part of cosmwasm-std. Do not use directly." diff --git a/packages/go-gen/Cargo.toml b/packages/go-gen/Cargo.toml index 99693a0c37..5ffc95d9d1 100644 --- a/packages/go-gen/Cargo.toml +++ b/packages/go-gen/Cargo.toml @@ -9,8 +9,8 @@ publish = false [dependencies] schemars = "0.8.3" -cosmwasm-std = { path = "../std", version = "1.4.0", features = ["cosmwasm_1_4", "staking", "stargate", "ibc3"] } -cosmwasm-schema = { path = "../schema", version = "1.4.0" } +cosmwasm-std = { path = "../std", version = "1.4.1", features = ["cosmwasm_1_4", "staking", "stargate", "ibc3"] } +cosmwasm-schema = { path = "../schema", version = "1.4.1" } anyhow = "1" Inflector = "0.11.4" indenter = "0.3.3" diff --git a/packages/schema-derive/Cargo.toml b/packages/schema-derive/Cargo.toml index ba106b1a9c..e4d227cbff 100644 --- a/packages/schema-derive/Cargo.toml +++ b/packages/schema-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema-derive" -version = "1.4.0" +version = "1.4.1" authors = ["Tomasz Kurcz "] edition = "2021" description = "Derive macros for cosmwasm-schema" diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index b473ee6a99..163123ec1b 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "1.4.0" +version = "1.4.1" authors = ["Simon Warta ", "Ethan Frey "] edition = "2021" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." @@ -8,7 +8,7 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/schema" license = "Apache-2.0" [dependencies] -cosmwasm-schema-derive = { version = "=1.4.0", path = "../schema-derive" } +cosmwasm-schema-derive = { version = "=1.4.1", path = "../schema-derive" } schemars = "0.8.3" serde = "1.0" serde_json = "1.0.40" @@ -16,6 +16,6 @@ thiserror = "1.0.26" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = { version = "1.4.0", path = "../std" } +cosmwasm-std = { version = "1.4.1", path = "../std" } semver = "1" tempfile = "3" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 13b12083f3..d95922b704 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "1.4.0" +version = "1.4.1" authors = ["Ethan Frey "] edition = "2021" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -51,7 +51,7 @@ cosmwasm_1_4 = ["cosmwasm_1_3"] [dependencies] base64 = "0.21.0" -cosmwasm-derive = { path = "../derive", version = "1.4.0" } +cosmwasm-derive = { path = "../derive", version = "1.4.1" } derivative = "2" forward_ref = "1" hex = "0.4" @@ -63,7 +63,7 @@ thiserror = "1.0.26" bnum = "0.8.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "1.4.0" } +cosmwasm-crypto = { path = "../crypto", version = "1.4.1" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index c32c37a0e5..8719aa6e19 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "1.4.0" +version = "1.4.1" authors = ["Ethan Frey "] edition = "2021" description = "CosmWasm library with useful helpers for Storage patterns" @@ -16,5 +16,5 @@ iterator = ["cosmwasm-std/iterator"] [dependencies] # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.4.0", default-features = false } +cosmwasm-std = { path = "../std", version = "1.4.1", default-features = false } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 51a1bfd459..1bf020bc00 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "1.4.0" +version = "1.4.1" authors = ["Ethan Frey "] edition = "2021" description = "VM bindings to run cosmwams contracts" @@ -39,8 +39,8 @@ bytes = "1.4.0" # need a higher version than the one required by Wasmer for the clru = "0.4.0" crc32fast = "1.3.2" # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.4.0", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "1.4.0" } +cosmwasm-std = { path = "../std", version = "1.4.1", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "1.4.1" } derivative = "2" hex = "0.4" schemars = "0.8.3" From 3f93174efce688e4517721d536f7819480b6442d Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 9 Oct 2023 09:29:04 +0200 Subject: [PATCH 0842/2372] Update changelog --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12280bdc57..fbd90b7398 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ and this project adheres to ## [Unreleased] +## [1.4.1] - 2023-10-09 + ## Fixed - cosmwasm-vm: Fix a 1.3.x -> 1.4.0 regression bug leading to a _Wasmer runtime @@ -1877,7 +1879,8 @@ Some main points: All future Changelog entries will reference this base -[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.4.0...HEAD +[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.4.1...HEAD +[1.4.1]: https://github.com/CosmWasm/cosmwasm/compare/v1.4.0...1.4.1 [1.4.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.3...v1.4.0 [1.3.3]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.2...v1.3.3 [1.3.2]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.1...v1.3.2 From 9410fa2f76e576d3eaa2a0a53036d4a97e2705fe Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 9 Oct 2023 09:31:35 +0200 Subject: [PATCH 0843/2372] Fix docs.rs features --- packages/std/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index d95922b704..3161b9a5a1 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -9,7 +9,7 @@ license = "Apache-2.0" readme = "README.md" [package.metadata.docs.rs] -features = ["abort", "stargate", "staking", "ibc3", "cosmwasm_1_3"] +features = ["abort", "stargate", "staking", "ibc3", "cosmwasm_1_4"] [features] default = ["iterator", "abort"] From a519f82435ec918d9df1ab4b452b972e4a18cd7d Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 10 Oct 2023 08:55:24 +0200 Subject: [PATCH 0844/2372] Bump module serialization version --- packages/vm/src/modules/file_system_cache.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index b634007087..e4b39eb1e3 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -49,7 +49,10 @@ use crate::modules::current_wasmer_module_version; /// - **v7**:
/// New version because of Wasmer 2.3.0 -> 4 upgrade. /// This internally changes how rkyv is used for module serialization, making compatibility unlikely. -const MODULE_SERIALIZATION_VERSION: &str = "v7"; +/// - **v8**:
+/// New version because of Wasmer 4.1.2 -> 4.2.2 upgrade. +/// Module compatibility between wasmer versions is not guaranteed. +const MODULE_SERIALIZATION_VERSION: &str = "v8"; /// Representation of a directory that contains compiled Wasm artifacts. pub struct FileSystemCache { @@ -287,7 +290,7 @@ mod tests { cache.store(&checksum, &module).unwrap(); let mut globber = glob::glob(&format!( - "{}/v7-wasmer5/**/{}", + "{}/v8-wasmer5/**/{}", tmp_dir.path().to_string_lossy(), checksum )) @@ -365,9 +368,9 @@ mod tests { assert_eq!( p.as_os_str(), if cfg!(windows) { - "modules\\v7-wasmer17\\x86_64-nintendo-fuchsia-gnu-coff-01E9F9FE" + "modules\\v8-wasmer17\\x86_64-nintendo-fuchsia-gnu-coff-01E9F9FE" } else { - "modules/v7-wasmer17/x86_64-nintendo-fuchsia-gnu-coff-01E9F9FE" + "modules/v8-wasmer17/x86_64-nintendo-fuchsia-gnu-coff-01E9F9FE" } ); } From 9e362a313e10b4c93916d36b40eb669aee86e181 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 10 Oct 2023 10:54:38 +0200 Subject: [PATCH 0845/2372] Add .module file extension --- packages/vm/src/modules/file_system_cache.rs | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index e4b39eb1e3..e49063384f 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -121,6 +121,14 @@ impl FileSystemCache { self.unchecked_modules = unchecked; } + /// Returns the path to the serialized module with the given checksum. + fn module_file(&self, checksum: &Checksum) -> PathBuf { + let mut path = self.modules_path.clone(); + path.push(checksum.to_hex()); + path.set_extension("module"); + path + } + /// Loads a serialized module from the file system and returns a module (i.e. artifact + store), /// along with the size of the serialized module. pub fn load( @@ -128,8 +136,7 @@ impl FileSystemCache { checksum: &Checksum, engine: &impl AsEngineRef, ) -> VmResult> { - let filename = checksum.to_hex(); - let file_path = self.modules_path.join(filename); + let file_path = self.module_file(checksum); let result = if self.unchecked_modules { unsafe { Module::deserialize_from_file_unchecked(engine, &file_path) } @@ -158,8 +165,7 @@ impl FileSystemCache { mkdir_p(&self.modules_path) .map_err(|_e| VmError::cache_err("Error creating modules directory"))?; - let filename = checksum.to_hex(); - let path = self.modules_path.join(filename); + let path = self.module_file(checksum); module .serialize_to_file(&path) .map_err(|e| VmError::cache_err(format!("Error writing module to disk: {e}")))?; @@ -171,8 +177,7 @@ impl FileSystemCache { /// /// Returns true if the file existed and false if the file did not exist. pub fn remove(&mut self, checksum: &Checksum) -> VmResult { - let filename = checksum.to_hex(); - let file_path = self.modules_path.join(filename); + let file_path = self.module_file(checksum); if file_path.exists() { fs::remove_file(file_path) @@ -290,7 +295,7 @@ mod tests { cache.store(&checksum, &module).unwrap(); let mut globber = glob::glob(&format!( - "{}/v8-wasmer5/**/{}", + "{}/v8-wasmer5/**/{}.module", tmp_dir.path().to_string_lossy(), checksum )) From 9b378df358592b95846ed7ad4bdc30f547878679 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 11 Oct 2023 10:08:46 +0200 Subject: [PATCH 0846/2372] Fix typo Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/vm/src/modules/file_system_cache.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index e49063384f..60d8ddaf56 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -51,7 +51,7 @@ use crate::modules::current_wasmer_module_version; /// This internally changes how rkyv is used for module serialization, making compatibility unlikely. /// - **v8**:
/// New version because of Wasmer 4.1.2 -> 4.2.2 upgrade. -/// Module compatibility between wasmer versions is not guaranteed. +/// Module compatibility between Wasmer versions is not guaranteed. const MODULE_SERIALIZATION_VERSION: &str = "v8"; /// Representation of a directory that contains compiled Wasm artifacts. From b3bd56c908f625d2620c3540a51b72b7aaed944c Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 11 Oct 2023 10:31:42 +0200 Subject: [PATCH 0847/2372] Add changelog entry --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f866f6751..cccf3c20ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,13 @@ and this project adheres to [#1807]: https://github.com/CosmWasm/cosmwasm/pull/1807 [#1864]: https://github.com/CosmWasm/cosmwasm/pull/1864 +### Changed + +- cosmwasm-vm: Added `.module` extension to file names in the file system cache + ([#1913]). + +[#1913]: https://github.com/CosmWasm/cosmwasm/pull/1913 + ## [1.4.1] - 2023-10-09 ## Fixed From 3475232a4283f329faa6e36df560108f437f3b93 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 11 Oct 2023 10:54:16 +0200 Subject: [PATCH 0848/2372] Set version: 1.5.0-rc.0 --- Cargo.lock | 16 ++++++++-------- contracts/burner/Cargo.lock | 12 ++++++------ contracts/crypto-verify/Cargo.lock | 12 ++++++------ contracts/cyberpunk/Cargo.lock | 12 ++++++------ contracts/floaty/Cargo.lock | 12 ++++++------ contracts/hackatom/Cargo.lock | 12 ++++++------ contracts/ibc-reflect-send/Cargo.lock | 12 ++++++------ contracts/ibc-reflect/Cargo.lock | 12 ++++++------ contracts/queue/Cargo.lock | 12 ++++++------ contracts/reflect/Cargo.lock | 12 ++++++------ contracts/staking/Cargo.lock | 12 ++++++------ contracts/virus/Cargo.lock | 12 ++++++------ packages/check/Cargo.toml | 6 +++--- packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/go-gen/Cargo.toml | 4 ++-- packages/schema-derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 6 +++--- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 21 files changed, 93 insertions(+), 93 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4036777eaa..63a065d6ec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -427,7 +427,7 @@ dependencies = [ [[package]] name = "cosmwasm-check" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "anyhow", "assert_cmd", @@ -440,7 +440,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "criterion", "digest 0.10.6", @@ -459,7 +459,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "cosmwasm-std", "syn 1.0.109", @@ -467,7 +467,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "anyhow", "cosmwasm-schema-derive", @@ -482,7 +482,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "proc-macro2", "quote", @@ -491,7 +491,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "base64", "bech32", @@ -516,7 +516,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "cosmwasm-std", "serde", @@ -524,7 +524,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 3376ab8834..ca316005d3 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -199,7 +199,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -211,14 +211,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -229,7 +229,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "proc-macro2", "quote", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "base64", "bech32", @@ -258,7 +258,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 7f7a61042b..053f146e0f 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 0f31537537..69b9e31ce9 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -223,7 +223,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -235,14 +235,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -253,7 +253,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "proc-macro2", "quote", @@ -262,7 +262,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "base64 0.21.2", "bech32", @@ -282,7 +282,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 247895ca61..4e2bb708ba 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 7f822f63cd..b166216b05 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index e9eeb811dc..5723273024 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 4f56d0b156..d1a7b7cdae 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 262750b969..5690a0ca7d 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 763806bd9d..1756ae984c 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index c42fd5eb1a..a6659376f0 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 40bafbd65c..fdcee0c5d1 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.4.1" +version = "1.5.0-rc.0" dependencies = [ "bitflags", "bytecheck", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index 0b513c40c6..10a9774c7b 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-check" -version = "1.4.1" +version = "1.5.0-rc.0" authors = ["Mauro Lacy "] edition = "2021" description = "A CLI tool for verifying CosmWasm smart contracts" @@ -11,8 +11,8 @@ license = "Apache-2.0" anyhow = "1.0.57" clap = "4" colored = "2" -cosmwasm-vm = { path = "../vm", version = "=1.4.1" } -cosmwasm-std = { path = "../std", version = "=1.4.1" } +cosmwasm-vm = { path = "../vm", version = "=1.5.0-rc.0" } +cosmwasm-std = { path = "../std", version = "=1.5.0-rc.0" } [dev-dependencies] assert_cmd = "2.0.12" diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 3c2ffa3e01..ad695c4847 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "1.4.1" +version = "1.5.0-rc.0" authors = ["Mauro Lacy "] edition = "2021" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index b663b7f53e..bd797df708 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "1.4.1" +version = "1.5.0-rc.0" authors = ["Simon Warta "] edition = "2021" description = "A package for auto-generated code used for CosmWasm contract development. This is shipped as part of cosmwasm-std. Do not use directly." diff --git a/packages/go-gen/Cargo.toml b/packages/go-gen/Cargo.toml index 5ffc95d9d1..3c59a74e09 100644 --- a/packages/go-gen/Cargo.toml +++ b/packages/go-gen/Cargo.toml @@ -9,8 +9,8 @@ publish = false [dependencies] schemars = "0.8.3" -cosmwasm-std = { path = "../std", version = "1.4.1", features = ["cosmwasm_1_4", "staking", "stargate", "ibc3"] } -cosmwasm-schema = { path = "../schema", version = "1.4.1" } +cosmwasm-std = { path = "../std", version = "1.5.0-rc.0", features = ["cosmwasm_1_4", "staking", "stargate", "ibc3"] } +cosmwasm-schema = { path = "../schema", version = "1.5.0-rc.0" } anyhow = "1" Inflector = "0.11.4" indenter = "0.3.3" diff --git a/packages/schema-derive/Cargo.toml b/packages/schema-derive/Cargo.toml index e4d227cbff..228c220c1f 100644 --- a/packages/schema-derive/Cargo.toml +++ b/packages/schema-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema-derive" -version = "1.4.1" +version = "1.5.0-rc.0" authors = ["Tomasz Kurcz "] edition = "2021" description = "Derive macros for cosmwasm-schema" diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index 163123ec1b..b7d247edb4 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "1.4.1" +version = "1.5.0-rc.0" authors = ["Simon Warta ", "Ethan Frey "] edition = "2021" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." @@ -8,7 +8,7 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/schema" license = "Apache-2.0" [dependencies] -cosmwasm-schema-derive = { version = "=1.4.1", path = "../schema-derive" } +cosmwasm-schema-derive = { version = "=1.5.0-rc.0", path = "../schema-derive" } schemars = "0.8.3" serde = "1.0" serde_json = "1.0.40" @@ -16,6 +16,6 @@ thiserror = "1.0.26" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = { version = "1.4.1", path = "../std" } +cosmwasm-std = { version = "1.5.0-rc.0", path = "../std" } semver = "1" tempfile = "3" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 3bb3222ac0..8099d51c99 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "1.4.1" +version = "1.5.0-rc.0" authors = ["Ethan Frey "] edition = "2021" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -51,7 +51,7 @@ cosmwasm_1_4 = ["cosmwasm_1_3"] [dependencies] base64 = "0.21.0" -cosmwasm-derive = { path = "../derive", version = "1.4.1" } +cosmwasm-derive = { path = "../derive", version = "1.5.0-rc.0" } derivative = "2" forward_ref = "1" hex = "0.4" @@ -68,7 +68,7 @@ static_assertions = "1.1.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] bech32 = "0.9.1" -cosmwasm-crypto = { path = "../crypto", version = "1.4.1" } +cosmwasm-crypto = { path = "../crypto", version = "1.5.0-rc.0" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 8719aa6e19..0ec42e7088 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "1.4.1" +version = "1.5.0-rc.0" authors = ["Ethan Frey "] edition = "2021" description = "CosmWasm library with useful helpers for Storage patterns" @@ -16,5 +16,5 @@ iterator = ["cosmwasm-std/iterator"] [dependencies] # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.4.1", default-features = false } +cosmwasm-std = { path = "../std", version = "1.5.0-rc.0", default-features = false } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 9cb426e6b7..9c3a1a5f82 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "1.4.1" +version = "1.5.0-rc.0" authors = ["Ethan Frey "] edition = "2021" description = "VM bindings to run cosmwams contracts" @@ -39,8 +39,8 @@ bytes = "1.4.0" # need a higher version than the one required by Wasmer for the clru = "0.6.1" crc32fast = "1.3.2" # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.4.1", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "1.4.1" } +cosmwasm-std = { path = "../std", version = "1.5.0-rc.0", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "1.5.0-rc.0" } derivative = "2" hex = "0.4" schemars = "0.8.3" From d41afdda656eda81695fb80ff47e73ed13017965 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 11 Oct 2023 10:55:30 +0200 Subject: [PATCH 0849/2372] Update changelog --- CHANGELOG.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cccf3c20ea..c91334882a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ and this project adheres to ## [Unreleased] +## [1.5.0-rc.0] + ### Added - cosmwasm-std: Add `addr_make` and `with_prefix` for @@ -591,8 +593,9 @@ and this project adheres to The CHANGELOG for versions before 1.0.0 was moved to [CHANGELOG-pre1.0.0.md](./CHANGELOG-pre1.0.0.md). -[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.4.1...HEAD -[1.4.1]: https://github.com/CosmWasm/cosmwasm/compare/v1.4.0...1.4.1 +[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.5.0-rc.0...HEAD +[1.5.0-rc.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.4.1...v1.5.0-rc.0 +[1.4.1]: https://github.com/CosmWasm/cosmwasm/compare/v1.4.0...v1.4.1 [1.4.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.3...v1.4.0 [1.3.3]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.2...v1.3.3 [1.3.2]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.1...v1.3.2 From 3675e936aae9081a9f8f2a75987bdd08fd300e89 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 18 Sep 2023 16:54:47 +0200 Subject: [PATCH 0850/2372] Remove depreated symbols --- packages/std/src/addresses.rs | 56 ------------------------- packages/std/src/lib.rs | 2 - packages/std/src/query/wasm.rs | 25 ++++------- packages/std/src/results/mod.rs | 2 - packages/std/src/results/submessages.rs | 3 -- packages/std/src/testing/mock.rs | 37 +++++++++++----- 6 files changed, 35 insertions(+), 90 deletions(-) diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index f05702e4d9..01eb5aa70c 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -87,46 +87,6 @@ impl AsRef for Addr { } } -/// Implement `Addr == &str` -/// -/// Deprecated. This comparison unsafe. Convert both sides to Addr first. -/// Will be removed soon: https://github.com/CosmWasm/cosmwasm/issues/1669 -impl PartialEq<&str> for Addr { - fn eq(&self, rhs: &&str) -> bool { - self.0 == *rhs - } -} - -/// Implement `&str == Addr` -/// -/// Deprecated. This comparison unsafe. Convert both sides to Addr first. -/// Will be removed soon: https://github.com/CosmWasm/cosmwasm/issues/1669 -impl PartialEq for &str { - fn eq(&self, rhs: &Addr) -> bool { - *self == rhs.0 - } -} - -/// Implement `Addr == String` -/// -/// Deprecated. This comparison unsafe. Convert both sides to Addr first. -/// Will be removed soon: https://github.com/CosmWasm/cosmwasm/issues/1669 -impl PartialEq for Addr { - fn eq(&self, rhs: &String) -> bool { - &self.0 == rhs - } -} - -/// Implement `String == Addr` -/// -/// Deprecated. This comparison unsafe. Convert both sides to Addr first. -/// Will be removed soon: https://github.com/CosmWasm/cosmwasm/issues/1669 -impl PartialEq for String { - fn eq(&self, rhs: &Addr) -> bool { - self == &rhs.0 - } -} - // Addr->String is a safe conversion. // However, the opposite direction is unsafe and must not be implemented. @@ -440,22 +400,6 @@ mod tests { assert_eq!(addr.as_ref(), "literal-string"); } - // Please note that this will be removed soon - // https://github.com/CosmWasm/cosmwasm/issues/1669 - #[test] - fn addr_implements_partial_eq_with_str_and_string() { - let addr = Addr::unchecked("cos934gh9034hg04g0h134"); - - // `Addr == &str` - assert_eq!(addr, "cos934gh9034hg04g0h134"); - // `&str == Addr` - assert_eq!("cos934gh9034hg04g0h134", addr); - // `Addr == String` - assert_eq!(addr, String::from("cos934gh9034hg04g0h134")); - // `String == Addr` - assert_eq!(String::from("cos934gh9034hg04g0h134"), addr); - } - #[test] fn addr_implements_partial_eq_addr_ref() { let addr = Addr::unchecked("cos934gh9034hg04g0h134"); diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index dcf106b96e..ea04f23dc1 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -76,8 +76,6 @@ pub use crate::query::{ DistributionQuery, FullDelegation, IbcQuery, ListChannelsResponse, PortIdResponse, QueryRequest, StakingQuery, SupplyResponse, Validator, ValidatorResponse, WasmQuery, }; -#[allow(deprecated)] -pub use crate::results::SubMsgExecutionResponse; #[cfg(all(feature = "stargate", feature = "cosmwasm_1_2"))] pub use crate::results::WeightedVoteOption; pub use crate::results::{ diff --git a/packages/std/src/query/wasm.rs b/packages/std/src/query/wasm.rs index a80008e29e..936100835d 100644 --- a/packages/std/src/query/wasm.rs +++ b/packages/std/src/query/wasm.rs @@ -47,23 +47,14 @@ pub struct ContractInfoResponse { impl QueryResponseType for ContractInfoResponse {} -impl ContractInfoResponse { - /// Constructor for testing frameworks such as cw-multi-test. - /// This is required because query response types should be #[non_exhaustive]. - /// As a contract developer you should not need this constructor since - /// query responses are constructed for you via deserialization. - #[doc(hidden)] - #[deprecated( - note = "Use ContractInfoResponse::default() and mutate the fields you want to set." - )] - pub fn new(code_id: u64, creator: impl Into) -> Self { - ContractInfoResponse { - code_id, - creator: creator.into(), - ..Default::default() - } - } -} +impl_response_constructor!( + ContractInfoResponse, + code_id: u64, + creator: String, + admin: Option, + pinned: bool, + ibc_port: Option +); /// The essential data from wasmd's [CodeInfo]/[CodeInfoResponse]. /// diff --git a/packages/std/src/results/mod.rs b/packages/std/src/results/mod.rs index 90b8879746..a45afbd14a 100644 --- a/packages/std/src/results/mod.rs +++ b/packages/std/src/results/mod.rs @@ -21,7 +21,5 @@ pub use empty::Empty; pub use events::{attr, Attribute, Event}; pub use query::QueryResponse; pub use response::Response; -#[allow(deprecated)] -pub use submessages::SubMsgExecutionResponse; pub use submessages::{Reply, ReplyOn, SubMsg, SubMsgResponse, SubMsgResult}; pub use system_result::SystemResult; diff --git a/packages/std/src/results/submessages.rs b/packages/std/src/results/submessages.rs index df340d7995..cbaa9c1560 100644 --- a/packages/std/src/results/submessages.rs +++ b/packages/std/src/results/submessages.rs @@ -199,9 +199,6 @@ pub struct SubMsgResponse { pub data: Option, } -#[deprecated(note = "Renamed to SubMsgResponse")] -pub type SubMsgExecutionResponse = SubMsgResponse; - #[cfg(test)] mod tests { use super::*; diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 1c337e1ac1..4218f729f5 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -136,7 +136,7 @@ impl Api for MockApi { fn addr_validate(&self, input: &str) -> StdResult { let canonical = self.addr_canonicalize(input)?; let normalized = self.addr_humanize(&canonical)?; - if input != normalized { + if input != normalized.as_str() { return Err(StdError::generic_err( "Invalid input: address not normalized", )); @@ -1203,7 +1203,7 @@ mod tests { // valid let addr = api.addr_validate("foobar123").unwrap(); - assert_eq!(addr, "foobar123"); + assert_eq!(addr.as_str(), "foobar123"); // invalid: too short api.addr_validate("").unwrap_err(); @@ -1232,20 +1232,20 @@ mod tests { let original = String::from("shorty"); let canonical = api.addr_canonicalize(&original).unwrap(); let recovered = api.addr_humanize(&canonical).unwrap(); - assert_eq!(recovered, original); + assert_eq!(recovered.as_str(), original); // normalizes input let original = String::from("CosmWasmChef"); let canonical = api.addr_canonicalize(&original).unwrap(); let recovered = api.addr_humanize(&canonical).unwrap(); - assert_eq!(recovered, "cosmwasmchef"); + assert_eq!(recovered.as_str(), "cosmwasmchef"); // Long input (Juno contract address) let original = String::from("juno1v82su97skv6ucfqvuvswe0t5fph7pfsrtraxf0x33d8ylj5qnrysdvkc95"); let canonical = api.addr_canonicalize(&original).unwrap(); let recovered = api.addr_humanize(&canonical).unwrap(); - assert_eq!(recovered, original); + assert_eq!(recovered.as_str(), original); } #[test] @@ -1695,7 +1695,7 @@ mod tests { let res = distribution.query(&query).unwrap().unwrap(); let res: DelegatorWithdrawAddressResponse = from_json(res).unwrap(); - assert_eq!(res.withdraw_address, "withdraw0"); + assert_eq!(res.withdraw_address.as_str(), "withdraw0"); let query = DistributionQuery::DelegatorWithdrawAddress { delegator_address: "addr1".to_string(), @@ -1703,7 +1703,7 @@ mod tests { let res = distribution.query(&query).unwrap().unwrap(); let res: DelegatorWithdrawAddressResponse = from_json(res).unwrap(); - assert_eq!(res.withdraw_address, "addr1"); + assert_eq!(res.withdraw_address.as_str(), "addr1"); } #[cfg(feature = "cosmwasm_1_4")] @@ -2169,9 +2169,16 @@ mod tests { let mut storage1 = HashMap::::default(); storage1.insert(b"the key".into(), b"the value".into()); + let api = MockApi::default(); + match request { WasmQuery::Raw { contract_addr, key } => { - if *contract_addr == constract1 { + let Ok(addr) = api.addr_validate(contract_addr) else { + return SystemResult::Err(SystemError::NoSuchContract { + addr: contract_addr.clone(), + }); + }; + if addr == constract1 { if let Some(value) = storage1.get(key) { SystemResult::Ok(ContractResult::Ok(value.clone())) } else { @@ -2184,7 +2191,12 @@ mod tests { } } WasmQuery::Smart { contract_addr, msg } => { - if *contract_addr == constract1 { + let Ok(addr) = api.addr_validate(contract_addr) else { + return SystemResult::Err(SystemError::NoSuchContract { + addr: contract_addr.clone(), + }); + }; + if addr == constract1 { #[derive(Deserialize)] struct MyMsg {} let _msg: MyMsg = match from_json(msg) { @@ -2202,7 +2214,12 @@ mod tests { } } WasmQuery::ContractInfo { contract_addr } => { - if *contract_addr == constract1 { + let Ok(addr) = api.addr_validate(contract_addr) else { + return SystemResult::Err(SystemError::NoSuchContract { + addr: contract_addr.clone(), + }); + }; + if addr == constract1 { let response = ContractInfoResponse { code_id: 4, creator: "lalala".into(), From 7bcd5db43e0a7807fba0d58a187e698387a3cd13 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 19 Sep 2023 16:00:39 +0200 Subject: [PATCH 0851/2372] Fix tests --- packages/std/src/addresses.rs | 2 +- packages/std/src/assertions.rs | 4 ++-- packages/std/src/traits.rs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index 01eb5aa70c..f029913a07 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -48,7 +48,7 @@ impl Addr { /// ``` /// # use cosmwasm_std::{Addr}; /// let address = Addr::unchecked("foobar"); - /// assert_eq!(address, "foobar"); + /// assert_eq!(address.as_str(), "foobar"); /// ``` pub fn unchecked(input: impl Into) -> Addr { Addr(input.into()) diff --git a/packages/std/src/assertions.rs b/packages/std/src/assertions.rs index fb02e26ab9..30b7ccc6fb 100644 --- a/packages/std/src/assertions.rs +++ b/packages/std/src/assertions.rs @@ -45,12 +45,12 @@ macro_rules! ensure { /// # Unauthorized {}, /// # } /// # struct Config { -/// # admin: String, +/// # admin: Addr, /// # } /// # /// # fn body() -> Result<(), ContractError> { /// # let info = MessageInfo { sender: Addr::unchecked("foo"), funds: Vec::new() }; -/// # let cfg = Config { admin: "foo".to_string() }; +/// # let cfg = Config { admin: Addr::unchecked("foo") }; /// use cosmwasm_std::ensure_eq; /// /// ensure_eq!(info.sender, cfg.admin, ContractError::Unauthorized {}); diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index de44b1bd87..12f9824c0c 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -132,7 +132,7 @@ pub trait Api { /// # let api = MockApi::default(); /// let input = "what-users-provide"; /// let validated: Addr = api.addr_validate(input).unwrap(); - /// assert_eq!(validated, input); + /// assert_eq!(validated.as_str(), input); /// ``` fn addr_validate(&self, human: &str) -> StdResult; From 6613f696c07ef2191289842e51890157aaf488cb Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 11 Oct 2023 13:15:32 +0200 Subject: [PATCH 0852/2372] Add changelog entry --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c91334882a..4b78e1061d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,15 @@ and this project adheres to ## [Unreleased] +### Changed + +- cosmwasm-std: Replace `ContractInfoResponse::new` with new (unstable) + constructor, remove `SubMsgExecutionResponse` (Use `SubMsgResponse` instead) + and remove `PartialEq<&str> for Addr` (validate the address and use + `PartialEq` instead). ([#1879]) + +[#1879]: https://github.com/CosmWasm/cosmwasm/pull/1879 + ## [1.5.0-rc.0] ### Added From 40affc91ad56344173ba8d30dd8c3f60154d077c Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 11 Oct 2023 16:02:05 +0200 Subject: [PATCH 0853/2372] Increase resource class for coverage job --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index c0314ba4e2..bdaa6df4c7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -968,6 +968,7 @@ jobs: coverage: docker: - image: rust:1.72.0 + resource_class: medium+ steps: - checkout - run: From a2f48bc236d7df2eac935c04eefa08c1a8679bf1 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 13 Oct 2023 09:27:30 +0200 Subject: [PATCH 0854/2372] Update CHANGELOG.md Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b78e1061d..63d67d0a6d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ and this project adheres to - cosmwasm-std: Replace `ContractInfoResponse::new` with new (unstable) constructor, remove `SubMsgExecutionResponse` (Use `SubMsgResponse` instead) and remove `PartialEq<&str> for Addr` (validate the address and use - `PartialEq` instead). ([#1879]) + `PartialEq for Addr` instead). ([#1879]) [#1879]: https://github.com/CosmWasm/cosmwasm/pull/1879 From 4e797ef2407de71fa7746f3f38c7f516a4c2d0a8 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 13 Oct 2023 16:12:20 +0200 Subject: [PATCH 0855/2372] Add unmaintained warning to storage README --- packages/storage/README.md | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/storage/README.md b/packages/storage/README.md index 933028028e..d2bdffb695 100644 --- a/packages/storage/README.md +++ b/packages/storage/README.md @@ -1,3 +1,9 @@ +# WARNING: Unmaintained + +This crate is no longer maintained and should not be used anymore. For an +alternative, please check out +[cw-storage-plus](https://crates.io/crates/cw-storage-plus) + # cosmwasm-storage [![cosmwasm-storage on crates.io](https://img.shields.io/crates/v/cosmwasm-storage.svg)](https://crates.io/crates/cosmwasm-storage) @@ -8,10 +14,14 @@ boilerplate. ## Contents -- [PrefixedStorage](#prefixed-storage) -- [TypedStorage](#typed-storage) -- [Bucket](#bucket) -- [Singleton](#singleton) +- [WARNING: Unmaintained](#warning-unmaintained) +- [cosmwasm-storage](#cosmwasm-storage) + - [Contents](#contents) + - [Prefixed Storage](#prefixed-storage) + - [Typed Storage](#typed-storage) + - [Bucket](#bucket) + - [Singleton](#singleton) + - [License](#license) ### Prefixed Storage From 9cc124d82e598c48c3138dca60d1cd9bcfb15dee Mon Sep 17 00:00:00 2001 From: xiaolou86 <20718693+xiaolou86@users.noreply.github.com> Date: Mon, 16 Oct 2023 11:52:18 +0800 Subject: [PATCH 0856/2372] docs: fix typos --- IBC.md | 4 ++-- MIGRATING.md | 4 ++-- docs/simulate_riffle_shuffle.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/IBC.md b/IBC.md index fcefc92ffe..fa07f2ad26 100644 --- a/IBC.md +++ b/IBC.md @@ -71,7 +71,7 @@ This particular contract above accepts and sends those to a remote chain, as well as receiving the tokens back and releasing the original cw20 token to a new owner. It does not (yet) allow minting coins originating from the remote chain. I recommend opening up the -source code for that contract and refering to it when you want a concrete +source code for that contract and referring to it when you want a concrete example for anything discussed below. In order to enable IBC communication, a contract must expose the following 6 @@ -168,7 +168,7 @@ pub fn ibc_channel_connect( ``` At this point, it is expected that the contract updates its internal state and -may return `CosmosMsg` in the `Reponse` to interact with other contracts, just +may return `CosmosMsg` in the `Response` to interact with other contracts, just like in `execute`. In particular, you will most likely want to store the local channel_id (`channel.endpoint.channel_id`) in the contract's storage, so it knows what open channels it has (and can expose those via queries or maintain diff --git a/MIGRATING.md b/MIGRATING.md index d06877b406..343e5e8aff 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -1044,7 +1044,7 @@ arbitrary ones. because it did not set the address for one withdraw only but for all following withdrawls. Since withdrawls are [triggered by different events][distribution docs] such as validators changing their commission rate, - an address that was set for a one-time withdrawl would be used for future + an address that was set for a one-time withdrawal would be used for future withdrawls not considered by the contract author. If the contract never set a withdraw address other than the contract itself @@ -1055,7 +1055,7 @@ arbitrary ones. 1. `SetWithdrawAddress { address: recipient }` to temporarily change the recipient - 2. `WithdrawDelegatorReward { validator }` to do a manual withdrawl from the + 2. `WithdrawDelegatorReward { validator }` to do a manual withdrawal from the given validator 3. `SetWithdrawAddress { address: env.contract.address.into() }` to change it back for all future withdrawls diff --git a/docs/simulate_riffle_shuffle.py b/docs/simulate_riffle_shuffle.py index c6a33c1355..3c9227374a 100644 --- a/docs/simulate_riffle_shuffle.py +++ b/docs/simulate_riffle_shuffle.py @@ -1,6 +1,6 @@ import functools -# Create a funtion that executed f recusively n times, i.e. f**n +# Create a function that executed f recusively n times, i.e. f**n def power(f, n): functions = [f for _ in range(n)] def compose2(f, g): From 640b6dca851a0cf1ea24dde112db1314cd06f58c Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 16 Oct 2023 10:43:54 +0200 Subject: [PATCH 0857/2372] Add migration docs --- MIGRATING.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/MIGRATING.md b/MIGRATING.md index d06877b406..e48b84d37f 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -4,6 +4,22 @@ This guide explains what is needed to upgrade contracts when migrating over major releases of `cosmwasm`. Note that you can also view the [complete CHANGELOG](./CHANGELOG.md) to understand the differences. +## 1.4.x -> 1.5.0 + +- Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): + + ``` + [dependencies] + cosmwasm-std = "1.5.0" + cosmwasm-storage = "1.5.0" + # ... + + [dev-dependencies] + cosmwasm-schema = "1.5.0" + cosmwasm-vm = "1.5.0" + # ... + ``` + ## 1.3.x -> 1.4.0 - Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): From 6fa4e5d83e4c7dd75519babb8e3d2b9660dbb7f0 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 16 Oct 2023 10:43:54 +0200 Subject: [PATCH 0858/2372] Add migration docs --- MIGRATING.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/MIGRATING.md b/MIGRATING.md index 343e5e8aff..3eb09ce4db 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -4,6 +4,22 @@ This guide explains what is needed to upgrade contracts when migrating over major releases of `cosmwasm`. Note that you can also view the [complete CHANGELOG](./CHANGELOG.md) to understand the differences. +## 1.4.x -> 1.5.0 + +- Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): + + ``` + [dependencies] + cosmwasm-std = "1.5.0" + cosmwasm-storage = "1.5.0" + # ... + + [dev-dependencies] + cosmwasm-schema = "1.5.0" + cosmwasm-vm = "1.5.0" + # ... + ``` + ## 1.3.x -> 1.4.0 - Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): From 303a3fa5661550364efd3100539312aade020b97 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 16 Oct 2023 15:36:39 +0200 Subject: [PATCH 0859/2372] Add migration entry for 2.0 --- MIGRATING.md | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/MIGRATING.md b/MIGRATING.md index 3eb09ce4db..1ea85ab0e2 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -4,6 +4,56 @@ This guide explains what is needed to upgrade contracts when migrating over major releases of `cosmwasm`. Note that you can also view the [complete CHANGELOG](./CHANGELOG.md) to understand the differences. +## 1.5.x -> 2.0.0 + +- Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): + + ```toml + [dependencies] + cosmwasm-std = "2.0.0" + # ... + + [dev-dependencies] + cosmwasm-schema = "2.0.0" + cosmwasm-vm = "2.0.0" + # ... + ``` + +- `ContractInfoResponse::new` now takes all fields of the response as + parameters: + + ```diff + -ContractInfoResponse::new(code_id, creator) + +ContractInfoResponse::new(code_id, creator, admin, pinned, ibc_port) + ``` + + Please note that, in the future, this function signature can change between + minor versions. + +- Replace all uses of `SubMsgExecutionResponse` with `SubMsgResponse`. +- Replace all uses of `PartialEq<&str> for Addr` with `PartialEq for Addr` + like this: + + ```diff + -if addr == "admin" { + - // ... + -} + +let admin = deps.api.addr_validate("admin")?; + +if addr == admin { + + // ... + +} + ``` + + If you really want to compare the string representation (e.g. in tests), you + can use `Addr::as_str`: + + ```diff + -assert_eq!(addr, "admin"); + +assert_eq!(addr.as_str(), "admin"); + ``` + + But keep in mind that this is case sensitive (while addresses are not). + ## 1.4.x -> 1.5.0 - Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): From 14cff58fa541a02ac28ba79ec12080b32164e18e Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 17 Oct 2023 09:15:24 +0200 Subject: [PATCH 0860/2372] Make GasConfig non_exhaustive GasConfig is currently not exported, making this a non-breaking change. But we want to be prepared to add more crypto algorithms with their gas configuration. --- packages/vm/src/environment.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index 5dfd268166..d6a974cb05 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -28,6 +28,7 @@ pub enum Never {} /** gas config data */ #[derive(Clone, PartialEq, Eq, Debug)] +#[non_exhaustive] pub struct GasConfig { /// Gas costs of VM (not Backend) provided functionality /// secp256k1 signature verification cost From bfa470bff747d99ec2559e2d0cdacb0fdef7025e Mon Sep 17 00:00:00 2001 From: ivan-gavran Date: Tue, 17 Oct 2023 10:56:37 +0200 Subject: [PATCH 0861/2372] correcting the info on messages/submessages ordering in semantics.md --- SEMANTICS.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/SEMANTICS.md b/SEMANTICS.md index dc6afcb66a..e6bfa46c79 100644 --- a/SEMANTICS.md +++ b/SEMANTICS.md @@ -215,6 +215,8 @@ intended to be used for most cases, but is needed for eg. the cron job to protect it from an infinite loop in the submessage burning all gas and aborting the transaction). +Submessage is a generalization of the message concept: indeed, a message is simply a submessage that never handles any response. + This makes use of `CosmosMsg` as above, but it wraps it inside a `SubMsg` envelope: @@ -236,6 +238,8 @@ pub enum ReplyOn { Error, /// Only callback if SubMsg was successful, no callback on error case Success, + /// Never make as callback - equivalent to a message + Never, } ``` @@ -324,10 +328,12 @@ JSON string instead of `null` and handled as any other `Some` value. #### Order and Rollback -Submessages (and their replies) are all executed before any `messages`. They -also follow the _depth first_ rules as with `messages`. Here is a simple -example. Contract A returns submessages S1 and S2, and message M1. Submessage S1 -returns message N1. The order will be: **S1, N1, reply(S1), S2, reply(S2), M1** +Submessages follow the same _depth first_ order rules as `messages`, +with their replies considered as an immediate additional message call. +Here is a simple example. +Contract A returns submessages S1 and S2, and message M1. Submessage S1 +returns message N1. +The order will be: **S1, N1, reply(S1), S2, reply(S2), M1**. Please keep in mind that submessage `execution` and `reply` can happen within the context of another submessage. For example @@ -338,7 +344,7 @@ It just ends up returning `Err` to contract-A's `reply` function. Note that errors are not handled with `ReplyOn::Success`, meaning, in such a case, an error will be treated just like a normal `message` returning an error. -This diagram may help explain. Imagine a contract returned two submesssage - (a) +This diagram may help explain. Imagine a contract returned two submesssages - (a) with `ReplyOn::Success` and (b) with `ReplyOn::Error`: | processing a) | processing b) | reply called | may overwrite result from reply | note | From 60988149a585cc45d76904146267b51462fee7bc Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 28 Sep 2023 17:57:28 +0200 Subject: [PATCH 0862/2372] Remove mixed uint decimal arithmetic --- packages/std/src/math/decimal.rs | 76 +++---------------------- packages/std/src/math/decimal256.rs | 88 +++++++---------------------- 2 files changed, 26 insertions(+), 138 deletions(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 12837bc214..c458eb253a 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -671,30 +671,6 @@ impl MulAssign for Decimal { } forward_ref_op_assign!(impl MulAssign, mul_assign for Decimal, Decimal); -/// Both d*u and u*d with d: Decimal and u: Uint128 returns an Uint128. There is no -/// specific reason for this decision other than the initial use cases we have. If you -/// need a Decimal result for the same calculation, use Decimal(d*u) or Decimal(u*d). -impl Mul for Uint128 { - type Output = Self; - - #[allow(clippy::suspicious_arithmetic_impl)] - fn mul(self, rhs: Decimal) -> Self::Output { - // 0*a and b*0 is always 0 - if self.is_zero() || rhs.is_zero() { - return Uint128::zero(); - } - self.multiply_ratio(rhs.0, Decimal::DECIMAL_FRACTIONAL) - } -} - -impl Mul for Decimal { - type Output = Uint128; - - fn mul(self, rhs: Uint128) -> Self::Output { - rhs * self - } -} - impl Div for Decimal { type Output = Self; @@ -1544,44 +1520,6 @@ mod tests { ); } - #[test] - // in this test the Decimal is on the right - fn uint128_decimal_multiply() { - // a*b - let left = Uint128::new(300); - let right = Decimal::one() + Decimal::percent(50); // 1.5 - assert_eq!(left * right, Uint128::new(450)); - - // a*0 - let left = Uint128::new(300); - let right = Decimal::zero(); - assert_eq!(left * right, Uint128::new(0)); - - // 0*a - let left = Uint128::new(0); - let right = Decimal::one() + Decimal::percent(50); // 1.5 - assert_eq!(left * right, Uint128::new(0)); - } - - #[test] - // in this test the Decimal is on the left - fn decimal_uint128_multiply() { - // a*b - let left = Decimal::one() + Decimal::percent(50); // 1.5 - let right = Uint128::new(300); - assert_eq!(left * right, Uint128::new(450)); - - // 0*a - let left = Decimal::zero(); - let right = Uint128::new(300); - assert_eq!(left * right, Uint128::new(0)); - - // a*0 - let left = Decimal::one() + Decimal::percent(50); // 1.5 - let right = Uint128::new(0); - assert_eq!(left * right, Uint128::new(0)); - } - #[test] #[allow(clippy::op_ref)] fn decimal_implements_div() { @@ -2211,14 +2149,14 @@ mod tests { // Does the same as the old workaround `Uint128::one() * my_decimal`. // This block can be deleted as part of https://github.com/CosmWasm/cosmwasm/issues/1485. let tests = vec![ - Decimal::from_str("12.345").unwrap(), - Decimal::from_str("0.98451384").unwrap(), - Decimal::from_str("178.0").unwrap(), - Decimal::MIN, - Decimal::MAX, + (Decimal::from_str("12.345").unwrap(), 12u128), + (Decimal::from_str("0.98451384").unwrap(), 0u128), + (Decimal::from_str("178.0").unwrap(), 178u128), + (Decimal::MIN, 0u128), + (Decimal::MAX, u128::MAX / Decimal::DECIMAL_FRACTIONAL.u128()), ]; - for my_decimal in tests.into_iter() { - assert_eq!(my_decimal.to_uint_floor(), Uint128::one() * my_decimal); + for (my_decimal, expected) in tests.into_iter() { + assert_eq!(my_decimal.to_uint_floor(), Uint128::new(expected)); } } diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index f0db608d2a..4c99897b60 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -680,30 +680,6 @@ impl MulAssign for Decimal256 { } forward_ref_op_assign!(impl MulAssign, mul_assign for Decimal256, Decimal256); -/// Both d*u and u*d with d: Decimal256 and u: Uint256 returns an Uint256. There is no -/// specific reason for this decision other than the initial use cases we have. If you -/// need a Decimal256 result for the same calculation, use Decimal256(d*u) or Decimal256(u*d). -impl Mul for Uint256 { - type Output = Self; - - #[allow(clippy::suspicious_arithmetic_impl)] - fn mul(self, rhs: Decimal256) -> Self::Output { - // 0*a and b*0 is always 0 - if self.is_zero() || rhs.is_zero() { - return Uint256::zero(); - } - self.multiply_ratio(rhs.0, Decimal256::DECIMAL_FRACTIONAL) - } -} - -impl Mul for Decimal256 { - type Output = Uint256; - - fn mul(self, rhs: Uint256) -> Self::Output { - rhs * self - } -} - impl Div for Decimal256 { type Output = Self; @@ -1606,44 +1582,6 @@ mod tests { ); } - #[test] - // in this test the Decimal256 is on the right - fn uint128_decimal_multiply() { - // a*b - let left = Uint256::from(300u128); - let right = Decimal256::one() + Decimal256::percent(50); // 1.5 - assert_eq!(left * right, Uint256::from(450u32)); - - // a*0 - let left = Uint256::from(300u128); - let right = Decimal256::zero(); - assert_eq!(left * right, Uint256::from(0u128)); - - // 0*a - let left = Uint256::from(0u128); - let right = Decimal256::one() + Decimal256::percent(50); // 1.5 - assert_eq!(left * right, Uint256::from(0u128)); - } - - #[test] - // in this test the Decimal256 is on the left - fn decimal256_uint128_multiply() { - // a*b - let left = Decimal256::one() + Decimal256::percent(50); // 1.5 - let right = Uint256::from(300u128); - assert_eq!(left * right, Uint256::from(450u128)); - - // 0*a - let left = Decimal256::zero(); - let right = Uint256::from(300u128); - assert_eq!(left * right, Uint256::from(0u128)); - - // a*0 - let left = Decimal256::one() + Decimal256::percent(50); // 1.5 - let right = Uint256::from(0u128); - assert_eq!(left * right, Uint256::from(0u128)); - } - #[test] #[allow(clippy::op_ref)] fn decimal256_implements_div() { @@ -2311,14 +2249,26 @@ mod tests { // Does the same as the old workaround `Uint256::one() * my_decimal`. // This block can be deleted as part of https://github.com/CosmWasm/cosmwasm/issues/1485. let tests = vec![ - Decimal256::from_str("12.345").unwrap(), - Decimal256::from_str("0.98451384").unwrap(), - Decimal256::from_str("178.0").unwrap(), - Decimal256::MIN, - Decimal256::MAX, + ( + Decimal256::from_str("12.345").unwrap(), + Uint256::from(12u128), + ), + ( + Decimal256::from_str("0.98451384").unwrap(), + Uint256::from(0u128), + ), + ( + Decimal256::from_str("178.0").unwrap(), + Uint256::from(178u128), + ), + (Decimal256::MIN, Uint256::from(0u128)), + ( + Decimal256::MAX, + Uint256::MAX / Decimal256::DECIMAL_FRACTIONAL, + ), ]; - for my_decimal in tests.into_iter() { - assert_eq!(my_decimal.to_uint_floor(), Uint256::one() * my_decimal); + for (my_decimal, expected) in tests.into_iter() { + assert_eq!(my_decimal.to_uint_floor(), expected); } } From ef908d7dc36ec6cbb85a51d470e967aa059ee8e5 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 28 Sep 2023 18:10:45 +0200 Subject: [PATCH 0863/2372] Fix staking contract --- contracts/staking/src/contract.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/staking/src/contract.rs b/contracts/staking/src/contract.rs index 72b20818e6..ab70170ea3 100644 --- a/contracts/staking/src/contract.rs +++ b/contracts/staking/src/contract.rs @@ -154,7 +154,7 @@ pub fn bond(deps: DepsMut, env: Env, info: MessageInfo) -> StdResult { // TODO: this is just temporary check - we should use dynamic query or have a way to recover assert_bonds(&supply, bonded)?; let to_mint = if supply.issued.is_zero() || bonded.is_zero() { - FALLBACK_RATIO * payment.amount + payment.amount.mul_floor(FALLBACK_RATIO) } else { payment.amount.multiply_ratio(supply.issued, bonded) }; @@ -193,7 +193,7 @@ pub fn unbond(deps: DepsMut, env: Env, info: MessageInfo, amount: Uint128) -> St let owner_raw = deps.api.addr_canonicalize(invest.owner.as_str())?; // calculate tax and remainer to unbond - let tax = amount * invest.exit_tax; + let tax = amount.mul_floor(invest.exit_tax); // deduct all from the account let balance = may_load_map(deps.storage, PREFIX_BALANCE, &sender_raw)?.unwrap_or_default(); From c55e126f95262c7cc83dbbab005dd912347a9ad0 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 17 Oct 2023 11:15:25 +0200 Subject: [PATCH 0864/2372] Add changelog and migrating entry --- CHANGELOG.md | 4 ++++ MIGRATING.md | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63d67d0a6d..9a0124b8e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,8 +12,12 @@ and this project adheres to constructor, remove `SubMsgExecutionResponse` (Use `SubMsgResponse` instead) and remove `PartialEq<&str> for Addr` (validate the address and use `PartialEq for Addr` instead). ([#1879]) +- cosmwasm-std: Remove `Mul for Uint128` and + `Mul for Uint256`. Use `Uint{128,256}::mul_floor` instead. + ([#1890]) [#1879]: https://github.com/CosmWasm/cosmwasm/pull/1879 +[#1890]: https://github.com/CosmWasm/cosmwasm/pull/1890 ## [1.5.0-rc.0] diff --git a/MIGRATING.md b/MIGRATING.md index 1ea85ab0e2..7b7b39f1ad 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -54,6 +54,14 @@ major releases of `cosmwasm`. Note that you can also view the But keep in mind that this is case sensitive (while addresses are not). +- Replace all uses of `Mul for Uint128` and + `Mul for Uint256` with `Uint{128,256}::mul_floor`: + + ```diff + -Uint128::new(123456) * Decimal::percent(1); + +Uint128::new(123456).mul_floor(Decimal::percent(1)); + ``` + ## 1.4.x -> 1.5.0 - Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): From 1eb3697eb81a22024a936091efa3a2078f9476f9 Mon Sep 17 00:00:00 2001 From: ivan-gavran Date: Tue, 17 Oct 2023 11:55:45 +0200 Subject: [PATCH 0865/2372] md formatting --- SEMANTICS.md | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/SEMANTICS.md b/SEMANTICS.md index e6bfa46c79..f4862e81af 100644 --- a/SEMANTICS.md +++ b/SEMANTICS.md @@ -215,7 +215,8 @@ intended to be used for most cases, but is needed for eg. the cron job to protect it from an infinite loop in the submessage burning all gas and aborting the transaction). -Submessage is a generalization of the message concept: indeed, a message is simply a submessage that never handles any response. +Submessage is a generalization of the message concept: indeed, a message is +simply a submessage that never handles any response. This makes use of `CosmosMsg` as above, but it wraps it inside a `SubMsg` envelope: @@ -328,12 +329,10 @@ JSON string instead of `null` and handled as any other `Some` value. #### Order and Rollback -Submessages follow the same _depth first_ order rules as `messages`, -with their replies considered as an immediate additional message call. -Here is a simple example. -Contract A returns submessages S1 and S2, and message M1. Submessage S1 -returns message N1. -The order will be: **S1, N1, reply(S1), S2, reply(S2), M1**. +Submessages follow the same _depth first_ order rules as `messages`, with their +replies considered as an immediate additional message call. Here is a simple +example. Contract A returns submessages S1 and S2, and message M1. Submessage S1 +returns message N1. The order will be: **S1, N1, reply(S1), S2, reply(S2), M1**. Please keep in mind that submessage `execution` and `reply` can happen within the context of another submessage. For example @@ -344,8 +343,8 @@ It just ends up returning `Err` to contract-A's `reply` function. Note that errors are not handled with `ReplyOn::Success`, meaning, in such a case, an error will be treated just like a normal `message` returning an error. -This diagram may help explain. Imagine a contract returned two submesssages - (a) -with `ReplyOn::Success` and (b) with `ReplyOn::Error`: +This diagram may help explain. Imagine a contract returned two submesssages - +(a) with `ReplyOn::Success` and (b) with `ReplyOn::Error`: | processing a) | processing b) | reply called | may overwrite result from reply | note | | ------------- | ------------- | ------------ | ------------------------------- | ------------------------------------------------- | From 94ad11217d4da6c9b5cb9c1056272955684c10f5 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 15 Sep 2023 12:43:13 +0200 Subject: [PATCH 0866/2372] Use Into for all `full_mul` impls --- packages/std/src/math/int128.rs | 2 +- packages/std/src/math/uint128.rs | 4 ++-- packages/std/src/math/uint256.rs | 2 +- packages/std/src/math/uint64.rs | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index bc5cd241fc..c67a167242 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -135,7 +135,7 @@ impl Int128 { /// ``` #[must_use = "this returns the result of the operation, without modifying the original"] pub fn full_mul(self, rhs: impl Into) -> Int256 { - Int256::from(self.i128()) + Int256::from(self) .checked_mul(Int256::from(rhs.into())) .unwrap() } diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 28081a9473..c27d614130 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -148,8 +148,8 @@ impl Uint128 { /// assert_eq!(result.to_string(), "680564733841876926926749214863536422910"); /// ``` #[must_use = "this returns the result of the operation, without modifying the original"] - pub fn full_mul(self, rhs: impl Into) -> Uint256 { - Uint256::from(self.u128()) + pub fn full_mul(self, rhs: impl Into) -> Uint256 { + Uint256::from(self) .checked_mul(Uint256::from(rhs.into())) .unwrap() } diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index a4a672ad80..bc064ce570 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -223,7 +223,7 @@ impl Uint256 { /// ); /// ``` #[must_use = "this returns the result of the operation, without modifying the original"] - pub fn full_mul(self, rhs: impl Into) -> Uint512 { + pub fn full_mul(self, rhs: impl Into) -> Uint512 { Uint512::from(self) .checked_mul(Uint512::from(rhs.into())) .unwrap() diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index f168f893c2..d240619344 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -142,8 +142,8 @@ impl Uint64 { /// assert_eq!(result.to_string(), "36893488147419103230"); /// ``` #[must_use = "this returns the result of the operation, without modifying the original"] - pub fn full_mul(self, rhs: impl Into) -> Uint128 { - Uint128::from(self.u64()) + pub fn full_mul(self, rhs: impl Into) -> Uint128 { + Uint128::from(self) .checked_mul(Uint128::from(rhs.into())) .unwrap() } From 79d610c08f709fec1df30bab37c9d3ceec1b8cc9 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 18 Oct 2023 11:05:26 +0200 Subject: [PATCH 0867/2372] Add changelog entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a0124b8e4..7cdffe3a7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,10 @@ and this project adheres to - cosmwasm-std: Remove `Mul for Uint128` and `Mul for Uint256`. Use `Uint{128,256}::mul_floor` instead. ([#1890]) +- cosmwasm-std: `Uint{64,128}::full_mul` now take `Into` as an argument. + ([#1874]) +[#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1879]: https://github.com/CosmWasm/cosmwasm/pull/1879 [#1890]: https://github.com/CosmWasm/cosmwasm/pull/1890 From 3011a8dfa89b1070213cef18bdeef51f98923222 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 2 Oct 2023 17:05:23 +0200 Subject: [PATCH 0868/2372] Make CacheOptions non-exhaustive --- packages/vm/benches/main.rs | 50 ++++++++++---------- packages/vm/examples/multi_threaded_cache.rs | 12 ++--- packages/vm/src/cache.rs | 17 +++++++ 3 files changed, 48 insertions(+), 31 deletions(-) diff --git a/packages/vm/benches/main.rs b/packages/vm/benches/main.rs index afefe5d3cb..bcad71287b 100644 --- a/packages/vm/benches/main.rs +++ b/packages/vm/benches/main.rs @@ -121,12 +121,12 @@ fn bench_instance(c: &mut Criterion) { fn bench_cache(c: &mut Criterion) { let mut group = c.benchmark_group("Cache"); - let options = CacheOptions { - base_dir: TempDir::new().unwrap().into_path(), - available_capabilities: capabilities_from_csv("iterator,staking"), - memory_cache_size: MEMORY_CACHE_SIZE, - instance_memory_limit: DEFAULT_MEMORY_LIMIT, - }; + let options = CacheOptions::new( + TempDir::new().unwrap().into_path(), + capabilities_from_csv("iterator,staking"), + MEMORY_CACHE_SIZE, + DEFAULT_MEMORY_LIMIT, + ); group.bench_function("save wasm", |b| { let cache: Cache = @@ -150,7 +150,7 @@ fn bench_cache(c: &mut Criterion) { }); group.bench_function("load wasm unchecked", |b| { - let options = CacheOptions { ..options.clone() }; + let options = options.clone(); let mut cache: Cache = unsafe { Cache::new(options).unwrap() }; cache.set_module_unchecked(true); @@ -174,12 +174,12 @@ fn bench_cache(c: &mut Criterion) { }); group.bench_function("instantiate from fs", |b| { - let non_memcache = CacheOptions { - base_dir: TempDir::new().unwrap().into_path(), - available_capabilities: capabilities_from_csv("iterator,staking"), - memory_cache_size: Size(0), - instance_memory_limit: DEFAULT_MEMORY_LIMIT, - }; + let non_memcache = CacheOptions::new( + TempDir::new().unwrap().into_path(), + capabilities_from_csv("iterator,staking"), + Size(0), + DEFAULT_MEMORY_LIMIT, + ); let cache: Cache = unsafe { Cache::new(non_memcache).unwrap() }; let checksum = cache.save_wasm(CONTRACT).unwrap(); @@ -196,12 +196,12 @@ fn bench_cache(c: &mut Criterion) { }); group.bench_function("instantiate from fs unchecked", |b| { - let non_memcache = CacheOptions { - base_dir: TempDir::new().unwrap().into_path(), - available_capabilities: capabilities_from_csv("iterator,staking"), - memory_cache_size: Size(0), - instance_memory_limit: DEFAULT_MEMORY_LIMIT, - }; + let non_memcache = CacheOptions::new( + TempDir::new().unwrap().into_path(), + capabilities_from_csv("iterator,staking"), + Size(0), + DEFAULT_MEMORY_LIMIT, + ); let mut cache: Cache = unsafe { Cache::new(non_memcache).unwrap() }; cache.set_module_unchecked(true); @@ -263,12 +263,12 @@ fn bench_cache(c: &mut Criterion) { pub fn bench_instance_threads(c: &mut Criterion) { c.bench_function("multi-threaded get_instance", |b| { - let options = CacheOptions { - base_dir: TempDir::new().unwrap().into_path(), - available_capabilities: capabilities_from_csv("iterator,staking"), - memory_cache_size: MEMORY_CACHE_SIZE, - instance_memory_limit: DEFAULT_MEMORY_LIMIT, - }; + let options = CacheOptions::new( + TempDir::new().unwrap().into_path(), + capabilities_from_csv("iterator,staking"), + MEMORY_CACHE_SIZE, + DEFAULT_MEMORY_LIMIT, + ); let cache: Cache = unsafe { Cache::new(options).unwrap() }; diff --git a/packages/vm/examples/multi_threaded_cache.rs b/packages/vm/examples/multi_threaded_cache.rs index fd8c145f25..0b42e0dd9c 100644 --- a/packages/vm/examples/multi_threaded_cache.rs +++ b/packages/vm/examples/multi_threaded_cache.rs @@ -26,12 +26,12 @@ const INSTANTIATION_THREADS: usize = 2048; const THREADS: usize = SAVE_WASM_THREADS + INSTANTIATION_THREADS; pub fn main() { - let options = CacheOptions { - base_dir: TempDir::new().unwrap().into_path(), - available_capabilities: capabilities_from_csv("iterator,staking"), - memory_cache_size: MEMORY_CACHE_SIZE, - instance_memory_limit: DEFAULT_MEMORY_LIMIT, - }; + let options = CacheOptions::new( + TempDir::new().unwrap().into_path(), + capabilities_from_csv("iterator,staking"), + MEMORY_CACHE_SIZE, + DEFAULT_MEMORY_LIMIT, + ); let cache: Cache = unsafe { Cache::new(options).unwrap() }; let cache = Arc::new(cache); diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 7bf893bef2..7fdeebdd78 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -52,6 +52,7 @@ pub struct Metrics { } #[derive(Clone, Debug)] +#[non_exhaustive] pub struct CacheOptions { /// The base directory of this cache. /// @@ -65,6 +66,22 @@ pub struct CacheOptions { pub instance_memory_limit: Size, } +impl CacheOptions { + pub fn new( + base_dir: impl Into, + available_capabilities: impl Into>, + memory_cache_size: Size, + instance_memory_limit: Size, + ) -> Self { + Self { + base_dir: base_dir.into(), + available_capabilities: available_capabilities.into(), + memory_cache_size, + instance_memory_limit, + } + } +} + pub struct CacheInner { /// The directory in which the Wasm blobs are stored in the file system. wasm_path: PathBuf, From 498aa9912dc33dfc87cae7a0bf44e086f7c092b1 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 18 Oct 2023 11:39:43 +0200 Subject: [PATCH 0869/2372] Add changelog entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cdffe3a7d..217cd334d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,10 +17,13 @@ and this project adheres to ([#1890]) - cosmwasm-std: `Uint{64,128}::full_mul` now take `Into` as an argument. ([#1874]) +- cosmwasm-vm: Make `CacheOptions` non-exhaustive and add a constructor. + ([#1898]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1879]: https://github.com/CosmWasm/cosmwasm/pull/1879 [#1890]: https://github.com/CosmWasm/cosmwasm/pull/1890 +[#1898]: https://github.com/CosmWasm/cosmwasm/pull/1898 ## [1.5.0-rc.0] From 540c8a35f6cac65d0e7edbf99d08a1a4df81edfb Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 4 Oct 2023 12:19:26 +0200 Subject: [PATCH 0870/2372] Change coin constructor --- packages/std/src/coin.rs | 12 ++++++------ packages/std/src/ibc.rs | 2 +- packages/std/src/query/bank.rs | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/std/src/coin.rs b/packages/std/src/coin.rs index 1a28480188..9e02786b70 100644 --- a/packages/std/src/coin.rs +++ b/packages/std/src/coin.rs @@ -11,9 +11,9 @@ pub struct Coin { } impl Coin { - pub fn new(amount: u128, denom: impl Into) -> Self { + pub fn new(amount: impl Into, denom: impl Into) -> Self { Coin { - amount: Uint128::new(amount), + amount: amount.into(), denom: denom.into(), } } @@ -195,16 +195,16 @@ mod tests { #[test] fn parse_coin() { - let expected = Coin::new(123, "ucosm"); + let expected = Coin::new(123u128, "ucosm"); assert_eq!("123ucosm".parse::().unwrap(), expected); // leading zeroes should be ignored assert_eq!("00123ucosm".parse::().unwrap(), expected); // 0 amount parses correctly - assert_eq!("0ucosm".parse::().unwrap(), Coin::new(0, "ucosm")); + assert_eq!("0ucosm".parse::().unwrap(), Coin::new(0u128, "ucosm")); // ibc denom should work let ibc_str = "11111ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2"; let ibc_coin = Coin::new( - 11111, + 11111u128, "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2", ); assert_eq!(ibc_str.parse::().unwrap(), ibc_coin); @@ -244,7 +244,7 @@ mod tests { #[test] fn debug_coin() { - let coin = Coin::new(123, "ucosm"); + let coin = Coin::new(123u128, "ucosm"); assert_eq!(format!("{coin:?}"), r#"Coin { 123 "ucosm" }"#); } } diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 1ad33e3667..1a732f3e55 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -791,7 +791,7 @@ mod tests { let msg = IbcMsg::Transfer { channel_id: "channel-123".to_string(), to_address: "my-special-addr".into(), - amount: Coin::new(12345678, "uatom"), + amount: Coin::new(12345678u128, "uatom"), timeout: IbcTimeout::with_timestamp(Timestamp::from_nanos(1234567890)), }; let encoded = to_string(&msg).unwrap(); diff --git a/packages/std/src/query/bank.rs b/packages/std/src/query/bank.rs index 95cf616e2a..7980760f4a 100644 --- a/packages/std/src/query/bank.rs +++ b/packages/std/src/query/bank.rs @@ -106,11 +106,11 @@ mod tests { #[test] fn private_constructor_works() { - let response = AllBalanceResponse::new(vec![Coin::new(1234, "uatom")]); + let response = AllBalanceResponse::new(vec![Coin::new(1234u128, "uatom")]); assert_eq!( response, AllBalanceResponse { - amount: vec![Coin::new(1234, "uatom")] + amount: vec![Coin::new(1234u128, "uatom")] } ); } From 02752b8e0c03d7d95a9574ab9d7529670e78e3d3 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 4 Oct 2023 12:20:30 +0200 Subject: [PATCH 0871/2372] Change DecCoin constructor --- packages/std/src/query/distribution.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/std/src/query/distribution.rs b/packages/std/src/query/distribution.rs index 0414ef7927..4776c81e08 100644 --- a/packages/std/src/query/distribution.rs +++ b/packages/std/src/query/distribution.rs @@ -1,7 +1,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use crate::Addr; +use crate::{Addr, Decimal256}; use super::query_response::QueryResponseType; @@ -63,14 +63,14 @@ pub struct DecCoin { /// /// Some chains have choosen atto (10^-18) for their token's base denomination. If we used `Decimal` here, we could only store /// 340282366920938463463.374607431768211455atoken which is 340.28 TOKEN. - pub amount: crate::Decimal256, + pub amount: Decimal256, } impl DecCoin { - pub fn new(amount: crate::Decimal256, denom: impl Into) -> Self { + pub fn new(amount: impl Into, denom: impl Into) -> Self { Self { denom: denom.into(), - amount, + amount: amount.into(), } } } From 434ef6dad773b2ab0b1a05eed3e20e15f6ce6ed8 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 18 Oct 2023 12:36:21 +0200 Subject: [PATCH 0872/2372] Add changelog and migrating entry --- CHANGELOG.md | 4 ++++ MIGRATING.md | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 217cd334d0..f9a2ede939 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,11 +19,15 @@ and this project adheres to ([#1874]) - cosmwasm-vm: Make `CacheOptions` non-exhaustive and add a constructor. ([#1898]) +- cosmwasm-std: `Coin::new` now takes `Into` instead of `u128` as the + first argument and `DecCoin::new` takes `Into` instead of + `Decimal256`. ([#1902]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1879]: https://github.com/CosmWasm/cosmwasm/pull/1879 [#1890]: https://github.com/CosmWasm/cosmwasm/pull/1890 [#1898]: https://github.com/CosmWasm/cosmwasm/pull/1898 +[#1902]: https://github.com/CosmWasm/cosmwasm/pull/1902 ## [1.5.0-rc.0] diff --git a/MIGRATING.md b/MIGRATING.md index 7b7b39f1ad..559581566c 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -62,6 +62,13 @@ major releases of `cosmwasm`. Note that you can also view the +Uint128::new(123456).mul_floor(Decimal::percent(1)); ``` +- When calling `Coin::new`, you now have to explicitly specify the integer type: + + ```diff + -Coin::new(1234, "uatom") + +Coin::new(1234u128, "uatom") + ``` + ## 1.4.x -> 1.5.0 - Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): From e08d23658610caf2bb33430516bfcc18c5245997 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 2 Oct 2023 11:52:32 +0200 Subject: [PATCH 0873/2372] Remove allocations from math errors --- packages/std/src/coins.rs | 7 +- packages/std/src/errors/std_error.rs | 114 +++++++------------- packages/std/src/math/conversion.rs | 42 ++------ packages/std/src/math/decimal.rs | 30 ++---- packages/std/src/math/decimal256.rs | 30 ++---- packages/std/src/math/int128.rs | 14 +-- packages/std/src/math/int256.rs | 14 +-- packages/std/src/math/int512.rs | 14 +-- packages/std/src/math/int64.rs | 14 +-- packages/std/src/math/signed_decimal.rs | 30 ++---- packages/std/src/math/signed_decimal_256.rs | 30 ++---- packages/std/src/math/uint128.rs | 36 +++---- packages/std/src/math/uint256.rs | 48 +++------ packages/std/src/math/uint512.rs | 34 +++--- packages/std/src/math/uint64.rs | 36 +++---- packages/storage/src/singleton.rs | 9 +- 16 files changed, 158 insertions(+), 344 deletions(-) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index 08171a1424..ea589fc160 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -203,12 +203,7 @@ impl Coins { if coin.amount.is_zero() { return Ok(()); } - return Err(OverflowError::new( - OverflowOperation::Sub, - Uint128::zero(), - coin.amount, - ) - .into()); + return Err(OverflowError::new(OverflowOperation::Sub).into()); } } diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index 60a8a8dc0a..1e6555042f 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -493,24 +493,14 @@ impl fmt::Display for OverflowOperation { } #[derive(Error, Debug, PartialEq, Eq)] -#[error("Cannot {operation} with {operand1} and {operand2}")] +#[error("Cannot {operation} with given operands")] pub struct OverflowError { pub operation: OverflowOperation, - pub operand1: String, - pub operand2: String, } impl OverflowError { - pub fn new( - operation: OverflowOperation, - operand1: impl ToString, - operand2: impl ToString, - ) -> Self { - Self { - operation, - operand1: operand1.to_string(), - operand2: operand2.to_string(), - } + pub fn new(operation: OverflowOperation) -> Self { + Self { operation } } } @@ -521,38 +511,28 @@ impl OverflowError { /// [`Uint256`]: crate::Uint256 /// [`Uint128`]: crate::Uint128 #[derive(Error, Debug, PartialEq, Eq)] -#[error("Error converting {source_type} to {target_type} for {value}")] +#[error("Error converting {source_type} to {target_type}")] pub struct ConversionOverflowError { pub source_type: &'static str, pub target_type: &'static str, - pub value: String, } impl ConversionOverflowError { - pub fn new( - source_type: &'static str, - target_type: &'static str, - value: impl Into, - ) -> Self { + pub fn new(source_type: &'static str, target_type: &'static str) -> Self { Self { source_type, target_type, - value: value.into(), } } } -#[derive(Error, Debug, PartialEq, Eq)] -#[error("Cannot divide {operand} by zero")] -pub struct DivideByZeroError { - pub operand: String, -} +#[derive(Error, Debug, Default, PartialEq, Eq)] +#[error("Cannot divide by zero")] +pub struct DivideByZeroError; impl DivideByZeroError { - pub fn new(operand: impl ToString) -> Self { - Self { - operand: operand.to_string(), - } + pub fn new() -> Self { + Self } } @@ -789,87 +769,73 @@ mod tests { #[test] fn underflow_works_for_u128() { - let error = - StdError::overflow(OverflowError::new(OverflowOperation::Sub, 123u128, 456u128)); - match error { + let error = StdError::overflow(OverflowError::new(OverflowOperation::Sub)); + assert!(matches!( + error, StdError::Overflow { - source: - OverflowError { - operation, - operand1, - operand2, - }, + source: OverflowError { + operation: OverflowOperation::Sub + }, .. - } => { - assert_eq!(operation, OverflowOperation::Sub); - assert_eq!(operand1, "123"); - assert_eq!(operand2, "456"); } - _ => panic!("expect different error"), - } + )); } #[test] fn overflow_works_for_i64() { - let error = StdError::overflow(OverflowError::new(OverflowOperation::Sub, 777i64, 1234i64)); - match error { + let error = StdError::overflow(OverflowError::new(OverflowOperation::Sub)); + assert!(matches!( + error, StdError::Overflow { - source: - OverflowError { - operation, - operand1, - operand2, - }, + source: OverflowError { + operation: OverflowOperation::Sub + }, .. - } => { - assert_eq!(operation, OverflowOperation::Sub); - assert_eq!(operand1, "777"); - assert_eq!(operand2, "1234"); } - _ => panic!("expect different error"), - } + )); } #[test] fn divide_by_zero_works() { - let error = StdError::divide_by_zero(DivideByZeroError::new(123u128)); - match error { + let error = StdError::divide_by_zero(DivideByZeroError); + assert!(matches!( + error, StdError::DivideByZero { - source: DivideByZeroError { operand }, + source: DivideByZeroError, .. - } => assert_eq!(operand, "123"), - _ => panic!("expect different error"), - } + } + )); } #[test] fn implements_debug() { - let error: StdError = StdError::from(OverflowError::new(OverflowOperation::Sub, 3, 5)); + let error: StdError = StdError::from(OverflowError::new(OverflowOperation::Sub)); let embedded = format!("Debug: {error:?}"); #[cfg(not(feature = "backtraces"))] - let expected = r#"Debug: Overflow { source: OverflowError { operation: Sub, operand1: "3", operand2: "5" } }"#; + let expected = r#"Debug: Overflow { source: OverflowError { operation: Sub } }"#; #[cfg(feature = "backtraces")] - let expected = r#"Debug: Overflow { source: OverflowError { operation: Sub, operand1: "3", operand2: "5" }, backtrace: }"#; + let expected = r#"Debug: Overflow { source: OverflowError { operation: Sub }, backtrace: }"#; assert_eq!(embedded, expected); } #[test] fn implements_display() { - let error: StdError = StdError::from(OverflowError::new(OverflowOperation::Sub, 3, 5)); + let error: StdError = StdError::from(OverflowError::new(OverflowOperation::Sub)); let embedded = format!("Display: {error}"); - assert_eq!(embedded, "Display: Overflow: Cannot Sub with 3 and 5"); + assert_eq!( + embedded, + "Display: Overflow: Cannot Sub with given operands" + ); } #[test] fn implements_partial_eq() { - let u1 = StdError::from(OverflowError::new(OverflowOperation::Sub, 3, 5)); - let u2 = StdError::from(OverflowError::new(OverflowOperation::Sub, 3, 5)); - let u3 = StdError::from(OverflowError::new(OverflowOperation::Sub, 3, 7)); + let u1 = StdError::from(OverflowError::new(OverflowOperation::Sub)); + let u2 = StdError::from(OverflowError::new(OverflowOperation::Sub)); let s1 = StdError::serialize_err("Book", "Content too long"); let s2 = StdError::serialize_err("Book", "Content too long"); let s3 = StdError::serialize_err("Book", "Title too long"); assert_eq!(u1, u2); - assert_ne!(u1, u3); assert_ne!(u1, s1); assert_eq!(s1, s2); assert_ne!(s1, s3); diff --git a/packages/std/src/math/conversion.rs b/packages/std/src/math/conversion.rs index 240cbf8650..c649dca7d7 100644 --- a/packages/std/src/math/conversion.rs +++ b/packages/std/src/math/conversion.rs @@ -72,7 +72,7 @@ macro_rules! forward_try_from { .0 .try_into() .map(Self) - .map_err(|_| Self::Error::new(stringify!($input), stringify!($output), value)) + .map_err(|_| Self::Error::new(stringify!($input), stringify!($output))) } } }; @@ -93,7 +93,7 @@ macro_rules! try_from_int_to_int { fn try_from(value: $input) -> Result { $crate::math::conversion::shrink_be_int(value.to_be_bytes()) - .ok_or_else(|| Self::Error::new(stringify!($input), stringify!($output), value)) + .ok_or_else(|| Self::Error::new(stringify!($input), stringify!($output))) .map(Self::from_be_bytes) } } @@ -123,11 +123,7 @@ macro_rules! try_from_uint_to_int { use bnum::prelude::As; // $input::MAX has to be bigger than $output::MAX, so we can just cast it if value.0 > Self::MAX.0.as_() { - return Err(Self::Error::new( - stringify!($input), - stringify!($output), - value, - )); + return Err(Self::Error::new(stringify!($input), stringify!($output))); } // at this point we know it fits @@ -157,11 +153,7 @@ where let v = I::MAX; assert_eq!( O::try_from(v), - Err(crate::ConversionOverflowError::new( - input_type, - output_type, - v - )), + Err(crate::ConversionOverflowError::new(input_type, output_type)), "input::MAX value should not fit" ); @@ -172,11 +164,7 @@ where let v = max + I::ONE; assert_eq!( O::try_from(v), - Err(crate::ConversionOverflowError::new( - input_type, - output_type, - v - )), + Err(crate::ConversionOverflowError::new(input_type, output_type)), "output::MAX + 1 should not fit" ); @@ -222,11 +210,7 @@ where let v = I::MAX; assert_eq!( O::try_from(v), - Err(crate::ConversionOverflowError::new( - input_type, - output_type, - v - )), + Err(crate::ConversionOverflowError::new(input_type, output_type)), "input::MAX value should not fit" ); // but `O::MAX` should fit @@ -240,11 +224,7 @@ where let v = max + I::ONE; assert_eq!( O::try_from(v), - Err(crate::ConversionOverflowError::new( - input_type, - output_type, - v - )), + Err(crate::ConversionOverflowError::new(input_type, output_type)), "output::MAX + 1 should not fit" ); } @@ -253,11 +233,7 @@ where let v = I::from(-42i32); assert_eq!( O::try_from(v), - Err(crate::ConversionOverflowError::new( - input_type, - output_type, - v - )), + Err(crate::ConversionOverflowError::new(input_type, output_type,)), "negative numbers should not fit" ); @@ -294,7 +270,6 @@ macro_rules! try_from_int_to_uint { return Err(ConversionOverflowError::new( stringify!($input), stringify!($output), - value, )); } @@ -308,7 +283,6 @@ macro_rules! try_from_int_to_uint { return Err(ConversionOverflowError::new( stringify!($input), stringify!($output), - value, )); } diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index c458eb253a..ed5aaae29f 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -271,14 +271,14 @@ impl Decimal { self.0 .checked_add(other.0) .map(Self) - .map_err(|_| OverflowError::new(OverflowOperation::Add, self, other)) + .map_err(|_| OverflowError::new(OverflowOperation::Add)) } pub fn checked_sub(self, other: Self) -> Result { self.0 .checked_sub(other.0) .map(Self) - .map_err(|_| OverflowError::new(OverflowOperation::Sub, self, other)) + .map_err(|_| OverflowError::new(OverflowOperation::Sub)) } /// Multiplies one `Decimal` by another, returning an `OverflowError` if an overflow occurred. @@ -288,11 +288,7 @@ impl Decimal { result_as_uint256 .try_into() .map(Self) - .map_err(|_| OverflowError { - operation: OverflowOperation::Mul, - operand1: self.to_string(), - operand2: other.to_string(), - }) + .map_err(|_| OverflowError::new(OverflowOperation::Mul)) } /// Raises a value to the power of `exp`, panics if an overflow occurred. @@ -330,11 +326,7 @@ impl Decimal { Ok(x * y) } - inner(self, exp).map_err(|_| OverflowError { - operation: OverflowOperation::Pow, - operand1: self.to_string(), - operand2: exp.to_string(), - }) + inner(self, exp).map_err(|_| OverflowError::new(OverflowOperation::Pow)) } pub fn checked_div(self, other: Self) -> Result { @@ -345,7 +337,7 @@ impl Decimal { self.0 .checked_rem(other.0) .map(Self) - .map_err(|_| DivideByZeroError::new(self)) + .map_err(|_| DivideByZeroError) } /// Returns the approximate square root as a Decimal. @@ -1512,11 +1504,7 @@ mod tests { fn decimal_checked_mul_overflow() { assert_eq!( Decimal::MAX.checked_mul(Decimal::percent(200)), - Err(OverflowError { - operation: OverflowOperation::Mul, - operand1: Decimal::MAX.to_string(), - operand2: Decimal::percent(200).to_string(), - }) + Err(OverflowError::new(OverflowOperation::Mul)) ); } @@ -1788,11 +1776,7 @@ mod tests { fn decimal_checked_pow_overflow() { assert_eq!( Decimal::MAX.checked_pow(2), - Err(OverflowError { - operation: OverflowOperation::Pow, - operand1: Decimal::MAX.to_string(), - operand2: "2".to_string(), - }) + Err(OverflowError::new(OverflowOperation::Pow)) ); } diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 4c99897b60..401f72098e 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -280,14 +280,14 @@ impl Decimal256 { self.0 .checked_add(other.0) .map(Self) - .map_err(|_| OverflowError::new(OverflowOperation::Add, self, other)) + .map_err(|_| OverflowError::new(OverflowOperation::Add)) } pub fn checked_sub(self, other: Self) -> Result { self.0 .checked_sub(other.0) .map(Self) - .map_err(|_| OverflowError::new(OverflowOperation::Sub, self, other)) + .map_err(|_| OverflowError::new(OverflowOperation::Sub)) } /// Multiplies one `Decimal256` by another, returning an `OverflowError` if an overflow occurred. @@ -297,11 +297,7 @@ impl Decimal256 { result_as_uint512 .try_into() .map(Self) - .map_err(|_| OverflowError { - operation: OverflowOperation::Mul, - operand1: self.to_string(), - operand2: other.to_string(), - }) + .map_err(|_| OverflowError::new(OverflowOperation::Mul)) } /// Raises a value to the power of `exp`, panics if an overflow occurred. @@ -339,11 +335,7 @@ impl Decimal256 { Ok(x * y) } - inner(self, exp).map_err(|_| OverflowError { - operation: OverflowOperation::Pow, - operand1: self.to_string(), - operand2: exp.to_string(), - }) + inner(self, exp).map_err(|_| OverflowError::new(OverflowOperation::Pow)) } pub fn checked_div(self, other: Self) -> Result { @@ -354,7 +346,7 @@ impl Decimal256 { self.0 .checked_rem(other.0) .map(Self) - .map_err(|_| DivideByZeroError::new(self)) + .map_err(|_| DivideByZeroError) } /// Returns the approximate square root as a Decimal256. @@ -1574,11 +1566,7 @@ mod tests { fn decimal256_checked_mul_overflow() { assert_eq!( Decimal256::MAX.checked_mul(Decimal256::percent(200)), - Err(OverflowError { - operation: OverflowOperation::Mul, - operand1: Decimal256::MAX.to_string(), - operand2: Decimal256::percent(200).to_string(), - }) + Err(OverflowError::new(OverflowOperation::Mul)) ); } @@ -1863,11 +1851,7 @@ mod tests { fn decimal256_checked_pow_overflow() { assert_eq!( Decimal256::MAX.checked_pow(2), - Err(OverflowError { - operation: OverflowOperation::Pow, - operand1: Decimal256::MAX.to_string(), - operand2: "2".to_string(), - }) + Err(OverflowError::new(OverflowOperation::Pow)) ); } diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index c67a167242..5fc43b6022 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -144,28 +144,28 @@ impl Int128 { self.0 .checked_add(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Add, self, other)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Add)) } pub fn checked_sub(self, other: Self) -> Result { self.0 .checked_sub(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Sub, self, other)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Sub)) } pub fn checked_mul(self, other: Self) -> Result { self.0 .checked_mul(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Mul, self, other)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Mul)) } pub fn checked_pow(self, exp: u32) -> Result { self.0 .checked_pow(exp) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Pow, self, exp)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Pow)) } pub fn checked_div(self, other: Self) -> Result { @@ -192,12 +192,12 @@ impl Int128 { self.0 .checked_rem(other.0) .map(Self) - .ok_or_else(|| DivideByZeroError::new(self)) + .ok_or(DivideByZeroError) } pub fn checked_shr(self, other: u32) -> Result { if other >= 128 { - return Err(OverflowError::new(OverflowOperation::Shr, self, other)); + return Err(OverflowError::new(OverflowOperation::Shr)); } Ok(Self(self.0.shr(other))) @@ -205,7 +205,7 @@ impl Int128 { pub fn checked_shl(self, other: u32) -> Result { if other >= 128 { - return Err(OverflowError::new(OverflowOperation::Shl, self, other)); + return Err(OverflowError::new(OverflowOperation::Shl)); } Ok(Self(self.0.shl(other))) diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index 70d17417d7..24180c54e0 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -202,28 +202,28 @@ impl Int256 { self.0 .checked_add(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Add, self, other)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Add)) } pub fn checked_sub(self, other: Self) -> Result { self.0 .checked_sub(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Sub, self, other)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Sub)) } pub fn checked_mul(self, other: Self) -> Result { self.0 .checked_mul(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Mul, self, other)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Mul)) } pub fn checked_pow(self, exp: u32) -> Result { self.0 .checked_pow(exp) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Pow, self, exp)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Pow)) } pub fn checked_div(self, other: Self) -> Result { @@ -250,12 +250,12 @@ impl Int256 { self.0 .checked_rem(other.0) .map(Self) - .ok_or_else(|| DivideByZeroError::new(self)) + .ok_or(DivideByZeroError) } pub fn checked_shr(self, other: u32) -> Result { if other >= 256 { - return Err(OverflowError::new(OverflowOperation::Shr, self, other)); + return Err(OverflowError::new(OverflowOperation::Shr)); } Ok(Self(self.0.shr(other))) @@ -263,7 +263,7 @@ impl Int256 { pub fn checked_shl(self, other: u32) -> Result { if other >= 256 { - return Err(OverflowError::new(OverflowOperation::Shl, self, other)); + return Err(OverflowError::new(OverflowOperation::Shl)); } Ok(Self(self.0.shl(other))) diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index 86b4a93b3a..cc5d74fcac 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -187,28 +187,28 @@ impl Int512 { self.0 .checked_add(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Add, self, other)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Add)) } pub fn checked_sub(self, other: Self) -> Result { self.0 .checked_sub(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Sub, self, other)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Sub)) } pub fn checked_mul(self, other: Self) -> Result { self.0 .checked_mul(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Mul, self, other)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Mul)) } pub fn checked_pow(self, exp: u32) -> Result { self.0 .checked_pow(exp) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Pow, self, exp)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Pow)) } pub fn checked_div(self, other: Self) -> Result { @@ -235,12 +235,12 @@ impl Int512 { self.0 .checked_rem(other.0) .map(Self) - .ok_or_else(|| DivideByZeroError::new(self)) + .ok_or(DivideByZeroError) } pub fn checked_shr(self, other: u32) -> Result { if other >= 512 { - return Err(OverflowError::new(OverflowOperation::Shr, self, other)); + return Err(OverflowError::new(OverflowOperation::Shr)); } Ok(Self(self.0.shr(other))) @@ -248,7 +248,7 @@ impl Int512 { pub fn checked_shl(self, other: u32) -> Result { if other >= 512 { - return Err(OverflowError::new(OverflowOperation::Shl, self, other)); + return Err(OverflowError::new(OverflowOperation::Shl)); } Ok(Self(self.0.shl(other))) diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index 86a9bc4778..096f38a393 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -144,28 +144,28 @@ impl Int64 { self.0 .checked_add(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Add, self, other)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Add)) } pub fn checked_sub(self, other: Self) -> Result { self.0 .checked_sub(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Sub, self, other)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Sub)) } pub fn checked_mul(self, other: Self) -> Result { self.0 .checked_mul(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Mul, self, other)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Mul)) } pub fn checked_pow(self, exp: u32) -> Result { self.0 .checked_pow(exp) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Pow, self, exp)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Pow)) } pub fn checked_div(self, other: Self) -> Result { @@ -192,12 +192,12 @@ impl Int64 { self.0 .checked_rem(other.0) .map(Self) - .ok_or_else(|| DivideByZeroError::new(self)) + .ok_or(DivideByZeroError) } pub fn checked_shr(self, other: u32) -> Result { if other >= 64 { - return Err(OverflowError::new(OverflowOperation::Shr, self, other)); + return Err(OverflowError::new(OverflowOperation::Shr)); } Ok(Self(self.0.shr(other))) @@ -205,7 +205,7 @@ impl Int64 { pub fn checked_shl(self, other: u32) -> Result { if other >= 64 { - return Err(OverflowError::new(OverflowOperation::Shl, self, other)); + return Err(OverflowError::new(OverflowOperation::Shl)); } Ok(Self(self.0.shl(other))) diff --git a/packages/std/src/math/signed_decimal.rs b/packages/std/src/math/signed_decimal.rs index bdb45cf04e..911e30293c 100644 --- a/packages/std/src/math/signed_decimal.rs +++ b/packages/std/src/math/signed_decimal.rs @@ -359,7 +359,7 @@ impl SignedDecimal { self.0 .checked_add(other.0) .map(Self) - .map_err(|_| OverflowError::new(OverflowOperation::Add, self, other)) + .map_err(|_| OverflowError::new(OverflowOperation::Add)) } /// Computes `self - other`, returning an `OverflowError` if an overflow occurred. @@ -367,7 +367,7 @@ impl SignedDecimal { self.0 .checked_sub(other.0) .map(Self) - .map_err(|_| OverflowError::new(OverflowOperation::Sub, self, other)) + .map_err(|_| OverflowError::new(OverflowOperation::Sub)) } /// Multiplies one `SignedDecimal` by another, returning an `OverflowError` if an overflow occurred. @@ -377,11 +377,7 @@ impl SignedDecimal { result_as_int256 .try_into() .map(Self) - .map_err(|_| OverflowError { - operation: OverflowOperation::Mul, - operand1: self.to_string(), - operand2: other.to_string(), - }) + .map_err(|_| OverflowError::new(OverflowOperation::Mul)) } /// Raises a value to the power of `exp`, panics if an overflow occurred. @@ -419,11 +415,7 @@ impl SignedDecimal { Ok(x * y) } - inner(self, exp).map_err(|_| OverflowError { - operation: OverflowOperation::Pow, - operand1: self.to_string(), - operand2: exp.to_string(), - }) + inner(self, exp).map_err(|_| OverflowError::new(OverflowOperation::Pow)) } pub fn checked_div(self, other: Self) -> Result { @@ -435,7 +427,7 @@ impl SignedDecimal { self.0 .checked_rem(other.0) .map(Self) - .map_err(|_| DivideByZeroError::new(self)) + .map_err(|_| DivideByZeroError) } #[must_use = "this returns the result of the operation, without modifying the original"] @@ -1930,11 +1922,7 @@ mod tests { fn signed_decimal_checked_mul_overflow() { assert_eq!( SignedDecimal::MAX.checked_mul(SignedDecimal::percent(200)), - Err(OverflowError { - operation: OverflowOperation::Mul, - operand1: SignedDecimal::MAX.to_string(), - operand2: SignedDecimal::percent(200).to_string(), - }) + Err(OverflowError::new(OverflowOperation::Mul)) ); } @@ -2307,11 +2295,7 @@ mod tests { fn signed_decimal_checked_pow_overflow() { assert_eq!( SignedDecimal::MAX.checked_pow(2), - Err(OverflowError { - operation: OverflowOperation::Pow, - operand1: SignedDecimal::MAX.to_string(), - operand2: "2".to_string(), - }) + Err(OverflowError::new(OverflowOperation::Pow)) ); } diff --git a/packages/std/src/math/signed_decimal_256.rs b/packages/std/src/math/signed_decimal_256.rs index 9468729c02..464346547d 100644 --- a/packages/std/src/math/signed_decimal_256.rs +++ b/packages/std/src/math/signed_decimal_256.rs @@ -372,7 +372,7 @@ impl SignedDecimal256 { self.0 .checked_add(other.0) .map(Self) - .map_err(|_| OverflowError::new(OverflowOperation::Add, self, other)) + .map_err(|_| OverflowError::new(OverflowOperation::Add)) } /// Computes `self - other`, returning an `OverflowError` if an overflow occurred. @@ -380,7 +380,7 @@ impl SignedDecimal256 { self.0 .checked_sub(other.0) .map(Self) - .map_err(|_| OverflowError::new(OverflowOperation::Sub, self, other)) + .map_err(|_| OverflowError::new(OverflowOperation::Sub)) } /// Multiplies one `SignedDecimal256` by another, returning an `OverflowError` if an overflow occurred. @@ -390,11 +390,7 @@ impl SignedDecimal256 { result_as_int512 .try_into() .map(Self) - .map_err(|_| OverflowError { - operation: OverflowOperation::Mul, - operand1: self.to_string(), - operand2: other.to_string(), - }) + .map_err(|_| OverflowError::new(OverflowOperation::Mul)) } /// Raises a value to the power of `exp`, panics if an overflow occurred. @@ -432,11 +428,7 @@ impl SignedDecimal256 { Ok(x * y) } - inner(self, exp).map_err(|_| OverflowError { - operation: OverflowOperation::Pow, - operand1: self.to_string(), - operand2: exp.to_string(), - }) + inner(self, exp).map_err(|_| OverflowError::new(OverflowOperation::Pow)) } pub fn checked_div(self, other: Self) -> Result { @@ -448,7 +440,7 @@ impl SignedDecimal256 { self.0 .checked_rem(other.0) .map(Self) - .map_err(|_| DivideByZeroError::new(self)) + .map_err(|_| DivideByZeroError) } #[must_use = "this returns the result of the operation, without modifying the original"] @@ -2009,11 +2001,7 @@ mod tests { fn signed_decimal_256_checked_mul_overflow() { assert_eq!( SignedDecimal256::MAX.checked_mul(SignedDecimal256::percent(200)), - Err(OverflowError { - operation: OverflowOperation::Mul, - operand1: SignedDecimal256::MAX.to_string(), - operand2: SignedDecimal256::percent(200).to_string(), - }) + Err(OverflowError::new(OverflowOperation::Mul)) ); } @@ -2407,11 +2395,7 @@ mod tests { fn signed_decimal_256_checked_pow_overflow() { assert_eq!( SignedDecimal256::MAX.checked_pow(2), - Err(OverflowError { - operation: OverflowOperation::Pow, - operand1: SignedDecimal256::MAX.to_string(), - operand2: "2".to_string(), - }) + Err(OverflowError::new(OverflowOperation::Pow)) ); } diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index c27d614130..1d42022282 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -158,54 +158,54 @@ impl Uint128 { self.0 .checked_add(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Add, self, other)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Add)) } pub fn checked_sub(self, other: Self) -> Result { self.0 .checked_sub(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Sub, self, other)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Sub)) } pub fn checked_mul(self, other: Self) -> Result { self.0 .checked_mul(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Mul, self, other)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Mul)) } pub fn checked_pow(self, exp: u32) -> Result { self.0 .checked_pow(exp) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Pow, self, exp)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Pow)) } pub fn checked_div(self, other: Self) -> Result { self.0 .checked_div(other.0) .map(Self) - .ok_or_else(|| DivideByZeroError::new(self)) + .ok_or(DivideByZeroError) } pub fn checked_div_euclid(self, other: Self) -> Result { self.0 .checked_div_euclid(other.0) .map(Self) - .ok_or_else(|| DivideByZeroError::new(self)) + .ok_or(DivideByZeroError) } pub fn checked_rem(self, other: Self) -> Result { self.0 .checked_rem(other.0) .map(Self) - .ok_or_else(|| DivideByZeroError::new(self)) + .ok_or(DivideByZeroError) } pub fn checked_shr(self, other: u32) -> Result { if other >= 128 { - return Err(OverflowError::new(OverflowOperation::Shr, self, other)); + return Err(OverflowError::new(OverflowOperation::Shr)); } Ok(Self(self.0.shr(other))) @@ -213,7 +213,7 @@ impl Uint128 { pub fn checked_shl(self, other: u32) -> Result { if other >= 128 { - return Err(OverflowError::new(OverflowOperation::Shl, self, other)); + return Err(OverflowError::new(OverflowOperation::Shl)); } Ok(Self(self.0.shl(other))) @@ -837,10 +837,8 @@ mod tests { // error result on underflow (- would produce negative result) let underflow_result = a.checked_sub(b); - let OverflowError { - operand1, operand2, .. - } = underflow_result.unwrap_err(); - assert_eq!((operand1, operand2), (a.to_string(), b.to_string())); + let OverflowError { operation } = underflow_result.unwrap_err(); + assert_eq!(operation, OverflowOperation::Sub); } #[test] @@ -1252,7 +1250,6 @@ mod tests { Err(ConversionOverflow(ConversionOverflowError { source_type: "Uint256", target_type: "Uint128", - value: "893241213167463466591358344508391555069".to_string() })), ); } @@ -1269,9 +1266,7 @@ mod tests { let fraction = (21u128, 0u128); assert_eq!( Uint128::new(123456).checked_mul_floor(fraction), - Err(DivideByZero(DivideByZeroError { - operand: "2592576".to_string() - })), + Err(DivideByZero(DivideByZeroError)), ); } @@ -1335,7 +1330,6 @@ mod tests { Err(ConversionOverflow(ConversionOverflowError { source_type: "Uint256", target_type: "Uint128", - value: "893241213167463466591358344508391555069".to_string() // raises prior to rounding up })), ); } @@ -1352,9 +1346,7 @@ mod tests { let fraction = (21u128, 0u128); assert_eq!( Uint128::new(123456).checked_mul_ceil(fraction), - Err(DivideByZero(DivideByZeroError { - operand: "2592576".to_string() - })), + Err(DivideByZero(DivideByZeroError)), ); } @@ -1424,7 +1416,6 @@ mod tests { Err(ConversionOverflow(ConversionOverflowError { source_type: "Uint256", target_type: "Uint128", - value: "893241213167463466591358344508391555069".to_string() })), ); } @@ -1495,7 +1486,6 @@ mod tests { Err(ConversionOverflow(ConversionOverflowError { source_type: "Uint256", target_type: "Uint128", - value: "893241213167463466591358344508391555069".to_string() })), ); } diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index bc064ce570..2492cc46b8 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -233,35 +233,35 @@ impl Uint256 { self.0 .checked_add(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Add, self, other)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Add)) } pub fn checked_sub(self, other: Self) -> Result { self.0 .checked_sub(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Sub, self, other)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Sub)) } pub fn checked_mul(self, other: Self) -> Result { self.0 .checked_mul(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Mul, self, other)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Mul)) } pub fn checked_pow(self, exp: u32) -> Result { self.0 .checked_pow(exp) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Pow, self, exp)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Pow)) } pub fn checked_div(self, other: Self) -> Result { self.0 .checked_div(other.0) .map(Self) - .ok_or_else(|| DivideByZeroError::new(self)) + .ok_or(DivideByZeroError) } pub fn checked_div_euclid(self, other: Self) -> Result { @@ -272,12 +272,12 @@ impl Uint256 { self.0 .checked_rem(other.0) .map(Self) - .ok_or_else(|| DivideByZeroError::new(self)) + .ok_or(DivideByZeroError) } pub fn checked_shr(self, other: u32) -> Result { if other >= 256 { - return Err(OverflowError::new(OverflowOperation::Shr, self, other)); + return Err(OverflowError::new(OverflowOperation::Shr)); } Ok(Self(self.0.shr(other))) @@ -285,7 +285,7 @@ impl Uint256 { pub fn checked_shl(self, other: u32) -> Result { if other >= 256 { - return Err(OverflowError::new(OverflowOperation::Shl, self, other)); + return Err(OverflowError::new(OverflowOperation::Shl)); } Ok(Self(self.0.shl(other))) @@ -1111,11 +1111,7 @@ mod tests { let target = Uint128::try_from(source); assert_eq!( target, - Err(ConversionOverflowError::new( - "Uint256", - "Uint128", - Uint256::MAX.to_string() - )) + Err(ConversionOverflowError::new("Uint256", "Uint128")) ); } @@ -1354,10 +1350,8 @@ mod tests { // error result on underflow (- would produce negative result) let underflow_result = a.checked_sub(b); - let OverflowError { - operand1, operand2, .. - } = underflow_result.unwrap_err(); - assert_eq!((operand1, operand2), (a.to_string(), b.to_string())); + let OverflowError { operation } = underflow_result.unwrap_err(); + assert_eq!(operation, OverflowOperation::Sub); } #[test] @@ -1814,9 +1808,6 @@ mod tests { Err(ConversionOverflow(ConversionOverflowError { source_type: "Uint512", target_type: "Uint256", - value: - "303954234247955012986873835647805758114833709747306480603576158020771965304829" - .to_string() })), ); } @@ -1833,9 +1824,7 @@ mod tests { let fraction = (21u128, 0u128); assert_eq!( Uint256::from(123456u32).checked_mul_floor(fraction), - Err(DivideByZero(DivideByZeroError { - operand: "2592576".to_string() - })), + Err(DivideByZero(DivideByZeroError)), ); } @@ -1909,9 +1898,6 @@ mod tests { Err(ConversionOverflow(ConversionOverflowError { source_type: "Uint512", target_type: "Uint256", - value: - "303954234247955012986873835647805758114833709747306480603576158020771965304829" // raises prior to rounding up - .to_string() })), ); } @@ -1928,9 +1914,7 @@ mod tests { let fraction = (21u128, 0u128); assert_eq!( Uint256::from(123456u32).checked_mul_ceil(fraction), - Err(DivideByZero(DivideByZeroError { - operand: "2592576".to_string() - })), + Err(DivideByZero(DivideByZeroError)), ); } @@ -2003,9 +1987,6 @@ mod tests { Err(ConversionOverflow(ConversionOverflowError { source_type: "Uint512", target_type: "Uint256", - value: - "303954234247955012986873835647805758114833709747306480603576158020771965304829" - .to_string() })), ); } @@ -2079,9 +2060,6 @@ mod tests { Err(ConversionOverflow(ConversionOverflowError { source_type: "Uint512", target_type: "Uint256", - value: - "303954234247955012986873835647805758114833709747306480603576158020771965304829" - .to_string() // raises prior to rounding up })), ); } diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index 30be022a62..49f9beeeb5 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -196,35 +196,35 @@ impl Uint512 { self.0 .checked_add(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Add, self, other)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Add)) } pub fn checked_sub(self, other: Self) -> Result { self.0 .checked_sub(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Sub, self, other)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Sub)) } pub fn checked_mul(self, other: Self) -> Result { self.0 .checked_mul(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Mul, self, other)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Mul)) } pub fn checked_pow(self, exp: u32) -> Result { self.0 .checked_pow(exp) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Pow, self, exp)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Pow)) } pub fn checked_div(self, other: Self) -> Result { self.0 .checked_div(other.0) .map(Self) - .ok_or_else(|| DivideByZeroError::new(self)) + .ok_or(DivideByZeroError) } pub fn checked_div_euclid(self, other: Self) -> Result { @@ -235,19 +235,19 @@ impl Uint512 { self.0 .checked_rem(other.0) .map(Self) - .ok_or_else(|| DivideByZeroError::new(self)) + .ok_or(DivideByZeroError) } pub fn checked_shr(self, other: u32) -> Result { self.0 .checked_shr(other) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Shr, self, other)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Shr)) } pub fn checked_shl(self, other: u32) -> Result { if other >= 512 { - return Err(OverflowError::new(OverflowOperation::Shl, self, other)); + return Err(OverflowError::new(OverflowOperation::Shl)); } Ok(Self(self.0.shl(other))) @@ -369,11 +369,7 @@ impl TryFrom for Uint256 { let (first_bytes, last_bytes) = bytes.split_at(32); if first_bytes != [0u8; 32] { - return Err(ConversionOverflowError::new( - "Uint512", - "Uint256", - value.to_string(), - )); + return Err(ConversionOverflowError::new("Uint512", "Uint256")); } Ok(Self::from_be_bytes(last_bytes.try_into().unwrap())) @@ -799,11 +795,7 @@ mod tests { let target = Uint128::try_from(source); assert_eq!( target, - Err(ConversionOverflowError::new( - "Uint512", - "Uint128", - Uint512::MAX.to_string() - )) + Err(ConversionOverflowError::new("Uint512", "Uint128")) ); } @@ -1060,10 +1052,8 @@ mod tests { // error result on underflow (- would produce negative result) let underflow_result = a.checked_sub(b); - let OverflowError { - operand1, operand2, .. - } = underflow_result.unwrap_err(); - assert_eq!((operand1, operand2), (a.to_string(), b.to_string())); + let OverflowError { operation } = underflow_result.unwrap_err(); + assert_eq!(operation, OverflowOperation::Sub); } #[test] diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index d240619344..8a3738bdf3 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -152,54 +152,54 @@ impl Uint64 { self.0 .checked_add(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Add, self, other)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Add)) } pub fn checked_sub(self, other: Self) -> Result { self.0 .checked_sub(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Sub, self, other)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Sub)) } pub fn checked_mul(self, other: Self) -> Result { self.0 .checked_mul(other.0) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Mul, self, other)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Mul)) } pub fn checked_pow(self, exp: u32) -> Result { self.0 .checked_pow(exp) .map(Self) - .ok_or_else(|| OverflowError::new(OverflowOperation::Pow, self, exp)) + .ok_or_else(|| OverflowError::new(OverflowOperation::Pow)) } pub fn checked_div(self, other: Self) -> Result { self.0 .checked_div(other.0) .map(Self) - .ok_or_else(|| DivideByZeroError::new(self)) + .ok_or(DivideByZeroError) } pub fn checked_div_euclid(self, other: Self) -> Result { self.0 .checked_div_euclid(other.0) .map(Self) - .ok_or_else(|| DivideByZeroError::new(self)) + .ok_or(DivideByZeroError) } pub fn checked_rem(self, other: Self) -> Result { self.0 .checked_rem(other.0) .map(Self) - .ok_or_else(|| DivideByZeroError::new(self)) + .ok_or(DivideByZeroError) } pub fn checked_shr(self, other: u32) -> Result { if other >= 64 { - return Err(OverflowError::new(OverflowOperation::Shr, self, other)); + return Err(OverflowError::new(OverflowOperation::Shr)); } Ok(Self(self.0.shr(other))) @@ -207,7 +207,7 @@ impl Uint64 { pub fn checked_shl(self, other: u32) -> Result { if other >= 64 { - return Err(OverflowError::new(OverflowOperation::Shl, self, other)); + return Err(OverflowError::new(OverflowOperation::Shl)); } Ok(Self(self.0.shl(other))) @@ -749,10 +749,8 @@ mod tests { // error result on underflow (- would produce negative result) let underflow_result = a.checked_sub(b); - let OverflowError { - operand1, operand2, .. - } = underflow_result.unwrap_err(); - assert_eq!((operand1, operand2), (a.to_string(), b.to_string())); + let OverflowError { operation } = underflow_result.unwrap_err(); + assert_eq!(operation, OverflowOperation::Sub); } #[test] @@ -1148,7 +1146,6 @@ mod tests { Err(ConversionOverflow(ConversionOverflowError { source_type: "Uint128", target_type: "Uint64", - value: "48422703193487572989".to_string() })), ); } @@ -1165,9 +1162,7 @@ mod tests { let fraction = (21u64, 0u64); assert_eq!( Uint64::new(123456).checked_mul_floor(fraction), - Err(DivideByZero(DivideByZeroError { - operand: "2592576".to_string() - })), + Err(DivideByZero(DivideByZeroError)), ); } @@ -1221,7 +1216,6 @@ mod tests { Err(ConversionOverflow(ConversionOverflowError { source_type: "Uint128", target_type: "Uint64", - value: "48422703193487572989".to_string() // raises prior to rounding up })), ); } @@ -1238,9 +1232,7 @@ mod tests { let fraction = (21u64, 0u64); assert_eq!( Uint64::new(123456).checked_mul_ceil(fraction), - Err(DivideByZero(DivideByZeroError { - operand: "2592576".to_string() - })), + Err(DivideByZero(DivideByZeroError)), ); } @@ -1294,7 +1286,6 @@ mod tests { Err(ConversionOverflow(ConversionOverflowError { source_type: "Uint128", target_type: "Uint64", - value: "48422703193487572989".to_string() })), ); } @@ -1349,7 +1340,6 @@ mod tests { Err(ConversionOverflow(ConversionOverflowError { source_type: "Uint128", target_type: "Uint64", - value: "48422703193487572989".to_string() })), ); } diff --git a/packages/storage/src/singleton.rs b/packages/storage/src/singleton.rs index 41fbda7d62..5afa576e77 100644 --- a/packages/storage/src/singleton.rs +++ b/packages/storage/src/singleton.rs @@ -262,13 +262,8 @@ mod tests { }; writer.save(&cfg).unwrap(); - let output = writer.update(|_c| { - Err(StdError::from(OverflowError::new( - OverflowOperation::Sub, - 4, - 7, - ))) - }); + let output = + writer.update(|_c| Err(StdError::from(OverflowError::new(OverflowOperation::Sub)))); match output.unwrap_err() { StdError::Overflow { .. } => {} err => panic!("Unexpected error: {err:?}"), From da134efb8015d2f69bc897907d67e9600a3d5365 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 18 Oct 2023 13:10:39 +0200 Subject: [PATCH 0874/2372] Pull out testing wats --- packages/vm/src/modules/in_memory_cache.rs | 99 +++++++--------------- 1 file changed, 29 insertions(+), 70 deletions(-) diff --git a/packages/vm/src/modules/in_memory_cache.rs b/packages/vm/src/modules/in_memory_cache.rs index 95991c0e5a..7bc596bb72 100644 --- a/packages/vm/src/modules/in_memory_cache.rs +++ b/packages/vm/src/modules/in_memory_cache.rs @@ -117,6 +117,28 @@ mod tests { // Based on `examples/module_size.sh` const TESTING_WASM_SIZE_FACTOR: usize = 18; + const WAT1: &str = r#"(module + (type $t0 (func (param i32) (result i32))) + (func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32) + get_local $p0 + i32.const 1 + i32.add) + )"#; + const WAT2: &str = r#"(module + (type $t0 (func (param i32) (result i32))) + (func $add_one (export "add_two") (type $t0) (param $p0 i32) (result i32) + get_local $p0 + i32.const 2 + i32.add) + )"#; + const WAT3: &str = r#"(module + (type $t0 (func (param i32) (result i32))) + (func $add_one (export "add_three") (type $t0) (param $p0 i32) (result i32) + get_local $p0 + i32.const 3 + i32.add) + )"#; + #[test] fn check_element_sizes() { let key_size = mem::size_of::(); @@ -135,16 +157,7 @@ mod tests { let mut cache = InMemoryCache::new(Size::mebi(200)); // Create module - let wasm = wat::parse_str( - r#"(module - (type $t0 (func (param i32) (result i32))) - (func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32) - get_local $p0 - i32.const 1 - i32.add) - )"#, - ) - .unwrap(); + let wasm = wat::parse_str(WAT1).unwrap(); let checksum = Checksum::generate(&wasm); // Module does not exist @@ -188,38 +201,11 @@ mod tests { let mut cache = InMemoryCache::new(Size::mebi(2)); // Create module - let wasm1 = wat::parse_str( - r#"(module - (type $t0 (func (param i32) (result i32))) - (func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32) - get_local $p0 - i32.const 1 - i32.add) - )"#, - ) - .unwrap(); + let wasm1 = wat::parse_str(WAT1).unwrap(); let checksum1 = Checksum::generate(&wasm1); - let wasm2 = wat::parse_str( - r#"(module - (type $t0 (func (param i32) (result i32))) - (func $add_one (export "add_two") (type $t0) (param $p0 i32) (result i32) - get_local $p0 - i32.const 2 - i32.add) - )"#, - ) - .unwrap(); + let wasm2 = wat::parse_str(WAT2).unwrap(); let checksum2 = Checksum::generate(&wasm2); - let wasm3 = wat::parse_str( - r#"(module - (type $t0 (func (param i32) (result i32))) - (func $add_one (export "add_three") (type $t0) (param $p0 i32) (result i32) - get_local $p0 - i32.const 3 - i32.add) - )"#, - ) - .unwrap(); + let wasm3 = wat::parse_str(WAT3).unwrap(); let checksum3 = Checksum::generate(&wasm3); assert_eq!(cache.len(), 0); @@ -248,38 +234,11 @@ mod tests { let mut cache = InMemoryCache::new(Size::mebi(2)); // Create module - let wasm1 = wat::parse_str( - r#"(module - (type $t0 (func (param i32) (result i32))) - (func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32) - get_local $p0 - i32.const 1 - i32.add) - )"#, - ) - .unwrap(); + let wasm1 = wat::parse_str(WAT1).unwrap(); let checksum1 = Checksum::generate(&wasm1); - let wasm2 = wat::parse_str( - r#"(module - (type $t0 (func (param i32) (result i32))) - (func $add_one (export "add_two") (type $t0) (param $p0 i32) (result i32) - get_local $p0 - i32.const 2 - i32.add) - )"#, - ) - .unwrap(); + let wasm2 = wat::parse_str(WAT2).unwrap(); let checksum2 = Checksum::generate(&wasm2); - let wasm3 = wat::parse_str( - r#"(module - (type $t0 (func (param i32) (result i32))) - (func $add_one (export "add_three") (type $t0) (param $p0 i32) (result i32) - get_local $p0 - i32.const 3 - i32.add) - )"#, - ) - .unwrap(); + let wasm3 = wat::parse_str(WAT3).unwrap(); let checksum3 = Checksum::generate(&wasm3); assert_eq!(cache.size(), 0); From d6ad28feb6df6b7d6bc11ae5b496901848f10182 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 18 Oct 2023 13:11:27 +0200 Subject: [PATCH 0875/2372] Test zero-size InMemoryCache --- packages/vm/src/modules/in_memory_cache.rs | 35 ++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/packages/vm/src/modules/in_memory_cache.rs b/packages/vm/src/modules/in_memory_cache.rs index 7bc596bb72..0fa221c130 100644 --- a/packages/vm/src/modules/in_memory_cache.rs +++ b/packages/vm/src/modules/in_memory_cache.rs @@ -261,4 +261,39 @@ mod tests { cache.store(&checksum3, module, 1_500_000).unwrap(); assert_eq!(cache.size(), 1_500_032); } + + #[test] + fn in_memory_cache_works_for_zero_size() { + // A cache size of 0 practically disabled the cache. It must work + // like any cache with insufficient space. + // We test all common methods here. + + let mut cache = InMemoryCache::new(Size::mebi(0)); + + // Create module + let wasm = wat::parse_str(WAT1).unwrap(); + let checksum = Checksum::generate(&wasm); + + // Module does not exist + let cache_entry = cache.load(&checksum).unwrap(); + assert!(cache_entry.is_none()); + assert_eq!(cache.len(), 0); + assert_eq!(cache.size(), 0); + + // Compile module + let engine = make_compiling_engine(TESTING_MEMORY_LIMIT); + let original = compile(&engine, &wasm).unwrap(); + + // Store module + let size = wasm.len() * TESTING_WASM_SIZE_FACTOR; + cache.store(&checksum, original, size).unwrap(); + assert_eq!(cache.len(), 0); + assert_eq!(cache.size(), 0); + + // Load module + let cached = cache.load(&checksum).unwrap(); + assert!(cached.is_none()); + assert_eq!(cache.len(), 0); + assert_eq!(cache.size(), 0); + } } From 98a1428f1dbb0bed95eef3276ae7720491ec0ba1 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 19 Oct 2023 11:35:59 +0200 Subject: [PATCH 0876/2372] Add changelog entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9a2ede939..70d3b93570 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,10 +22,13 @@ and this project adheres to - cosmwasm-std: `Coin::new` now takes `Into` instead of `u128` as the first argument and `DecCoin::new` takes `Into` instead of `Decimal256`. ([#1902]) +- cosmwasm-std: Remove operand strings from `OverflowError`, + `ConversionOverflowError` and `DivideByZeroError`. ([#1896]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1879]: https://github.com/CosmWasm/cosmwasm/pull/1879 [#1890]: https://github.com/CosmWasm/cosmwasm/pull/1890 +[#1896]: https://github.com/CosmWasm/cosmwasm/pull/1896 [#1898]: https://github.com/CosmWasm/cosmwasm/pull/1898 [#1902]: https://github.com/CosmWasm/cosmwasm/pull/1902 From 36d8cad5514db5f7f1972ceffde675b94850f867 Mon Sep 17 00:00:00 2001 From: Amit Prasad <13373751+AmitPr@users.noreply.github.com> Date: Tue, 24 Oct 2023 18:55:28 -0400 Subject: [PATCH 0877/2372] Add `SubMsg::reply_never()` --- packages/std/src/results/submessages.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/std/src/results/submessages.rs b/packages/std/src/results/submessages.rs index cbaa9c1560..c47cc25aff 100644 --- a/packages/std/src/results/submessages.rs +++ b/packages/std/src/results/submessages.rs @@ -67,6 +67,11 @@ impl SubMsg { Self::reply_on(msg.into(), id, ReplyOn::Always) } + /// create a `SubMsg` that will never `reply`. This is equivalent to standard message semantics. + pub fn reply_never(msg: impl Into>, id: u64) -> Self { + Self::reply_on(msg.into(), id, ReplyOn::Never) + } + /// Add a gas limit to the message. /// This gas limit measured in [Cosmos SDK gas](https://github.com/CosmWasm/cosmwasm/blob/main/docs/GAS.md). /// From b1fdf5819684414049951719d83357de72c7d43f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 18 Sep 2023 11:51:38 +0200 Subject: [PATCH 0878/2372] Add memo field to IbcMsg::Transfer --- contracts/ibc-reflect-send/src/contract.rs | 1 + contracts/ibc-reflect-send/src/ibc.rs | 2 ++ contracts/ibc-reflect-send/tests/integration.rs | 2 ++ packages/std/src/ibc.rs | 5 ++++- 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/contracts/ibc-reflect-send/src/contract.rs b/contracts/ibc-reflect-send/src/contract.rs index 23adc82b89..05170533bf 100644 --- a/contracts/ibc-reflect-send/src/contract.rs +++ b/contracts/ibc-reflect-send/src/contract.rs @@ -157,6 +157,7 @@ pub fn handle_send_funds( to_address: remote_addr, amount, timeout: env.block.time.plus_seconds(PACKET_LIFETIME).into(), + memo: String::new(), }; let res = Response::new() diff --git a/contracts/ibc-reflect-send/src/ibc.rs b/contracts/ibc-reflect-send/src/ibc.rs index 6faabd5c10..c9f16a4f06 100644 --- a/contracts/ibc-reflect-send/src/ibc.rs +++ b/contracts/ibc-reflect-send/src/ibc.rs @@ -410,12 +410,14 @@ mod tests { to_address, amount, timeout, + memo, }) => { assert_eq!(transfer_channel_id, channel_id.as_str()); assert_eq!(remote_addr, to_address.as_str()); assert_eq!(&coin(12344, "utrgd"), amount); assert!(timeout.block().is_none()); assert!(timeout.timestamp().is_some()); + assert_eq!(memo, ""); } o => panic!("unexpected message: {o:?}"), } diff --git a/contracts/ibc-reflect-send/tests/integration.rs b/contracts/ibc-reflect-send/tests/integration.rs index 21d5c95352..2b608c13a2 100644 --- a/contracts/ibc-reflect-send/tests/integration.rs +++ b/contracts/ibc-reflect-send/tests/integration.rs @@ -234,12 +234,14 @@ fn send_remote_funds() { to_address, amount, timeout, + memo, }) => { assert_eq!(transfer_channel_id, channel_id.as_str()); assert_eq!(remote_addr, to_address.as_str()); assert_eq!(&coin(12344, "utrgd"), amount); assert!(timeout.block().is_none()); assert!(timeout.timestamp().is_some()); + assert_eq!(memo, ""); } o => panic!("unexpected message: {o:?}"), } diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 1a732f3e55..9bf4773cc9 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -35,6 +35,8 @@ pub enum IbcMsg { amount: Coin, /// when packet times out, measured on remote chain timeout: IbcTimeout, + /// optional memo + memo: String, }, /// Sends an IBC packet with given data over the existing channel. /// Data should be encoded in a format defined by the channel version, @@ -793,9 +795,10 @@ mod tests { to_address: "my-special-addr".into(), amount: Coin::new(12345678u128, "uatom"), timeout: IbcTimeout::with_timestamp(Timestamp::from_nanos(1234567890)), + memo: String::new(), }; let encoded = to_string(&msg).unwrap(); - let expected = r#"{"transfer":{"channel_id":"channel-123","to_address":"my-special-addr","amount":{"denom":"uatom","amount":"12345678"},"timeout":{"block":null,"timestamp":"1234567890"}}}"#; + let expected = r#"{"transfer":{"channel_id":"channel-123","to_address":"my-special-addr","amount":{"denom":"uatom","amount":"12345678"},"timeout":{"block":null,"timestamp":"1234567890"},"memo":""}}"#; assert_eq!(encoded.as_str(), expected); } From a89ba94ebbd12779372110769d0b7fc28ad8ef31 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 18 Sep 2023 12:23:23 +0200 Subject: [PATCH 0879/2372] Fix schema --- contracts/ibc-reflect-send/schema/ibc-reflect-send.json | 5 +++++ contracts/ibc-reflect-send/schema/ibc/packet_msg.json | 5 +++++ contracts/ibc-reflect-send/schema/raw/execute.json | 5 +++++ contracts/ibc-reflect/schema/ibc/packet_msg.json | 5 +++++ contracts/reflect/schema/raw/execute.json | 5 +++++ contracts/reflect/schema/reflect.json | 5 +++++ 6 files changed, 30 insertions(+) diff --git a/contracts/ibc-reflect-send/schema/ibc-reflect-send.json b/contracts/ibc-reflect-send/schema/ibc-reflect-send.json index cf36088129..f6a6288237 100644 --- a/contracts/ibc-reflect-send/schema/ibc-reflect-send.json +++ b/contracts/ibc-reflect-send/schema/ibc-reflect-send.json @@ -408,6 +408,7 @@ "required": [ "amount", "channel_id", + "memo", "timeout", "to_address" ], @@ -424,6 +425,10 @@ "description": "existing channel to send the tokens over", "type": "string" }, + "memo": { + "description": "optional memo", + "type": "string" + }, "timeout": { "description": "when packet times out, measured on remote chain", "allOf": [ diff --git a/contracts/ibc-reflect-send/schema/ibc/packet_msg.json b/contracts/ibc-reflect-send/schema/ibc/packet_msg.json index 00bcd35219..0fa40b1575 100644 --- a/contracts/ibc-reflect-send/schema/ibc/packet_msg.json +++ b/contracts/ibc-reflect-send/schema/ibc/packet_msg.json @@ -346,6 +346,7 @@ "required": [ "amount", "channel_id", + "memo", "timeout", "to_address" ], @@ -362,6 +363,10 @@ "description": "existing channel to send the tokens over", "type": "string" }, + "memo": { + "description": "optional memo", + "type": "string" + }, "timeout": { "description": "when packet times out, measured on remote chain", "allOf": [ diff --git a/contracts/ibc-reflect-send/schema/raw/execute.json b/contracts/ibc-reflect-send/schema/raw/execute.json index 5fee9b17a4..e1174c25d4 100644 --- a/contracts/ibc-reflect-send/schema/raw/execute.json +++ b/contracts/ibc-reflect-send/schema/raw/execute.json @@ -397,6 +397,7 @@ "required": [ "amount", "channel_id", + "memo", "timeout", "to_address" ], @@ -413,6 +414,10 @@ "description": "existing channel to send the tokens over", "type": "string" }, + "memo": { + "description": "optional memo", + "type": "string" + }, "timeout": { "description": "when packet times out, measured on remote chain", "allOf": [ diff --git a/contracts/ibc-reflect/schema/ibc/packet_msg.json b/contracts/ibc-reflect/schema/ibc/packet_msg.json index 3b9ebaef68..2de97e0651 100644 --- a/contracts/ibc-reflect/schema/ibc/packet_msg.json +++ b/contracts/ibc-reflect/schema/ibc/packet_msg.json @@ -333,6 +333,7 @@ "required": [ "amount", "channel_id", + "memo", "timeout", "to_address" ], @@ -349,6 +350,10 @@ "description": "existing channel to send the tokens over", "type": "string" }, + "memo": { + "description": "optional memo", + "type": "string" + }, "timeout": { "description": "when packet times out, measured on remote chain", "allOf": [ diff --git a/contracts/reflect/schema/raw/execute.json b/contracts/reflect/schema/raw/execute.json index 4180145986..550cf03f6e 100644 --- a/contracts/reflect/schema/raw/execute.json +++ b/contracts/reflect/schema/raw/execute.json @@ -451,6 +451,7 @@ "required": [ "amount", "channel_id", + "memo", "timeout", "to_address" ], @@ -467,6 +468,10 @@ "description": "existing channel to send the tokens over", "type": "string" }, + "memo": { + "description": "optional memo", + "type": "string" + }, "timeout": { "description": "when packet times out, measured on remote chain", "allOf": [ diff --git a/contracts/reflect/schema/reflect.json b/contracts/reflect/schema/reflect.json index 641d7498d7..59a960801d 100644 --- a/contracts/reflect/schema/reflect.json +++ b/contracts/reflect/schema/reflect.json @@ -461,6 +461,7 @@ "required": [ "amount", "channel_id", + "memo", "timeout", "to_address" ], @@ -477,6 +478,10 @@ "description": "existing channel to send the tokens over", "type": "string" }, + "memo": { + "description": "optional memo", + "type": "string" + }, "timeout": { "description": "when packet times out, measured on remote chain", "allOf": [ From 94544859bcbb444526f2c2727e1600eda0c80c76 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 17 Oct 2023 12:27:40 +0200 Subject: [PATCH 0880/2372] Use Option for memo field --- contracts/ibc-reflect-send/schema/ibc-reflect-send.json | 6 ++++-- contracts/ibc-reflect-send/schema/ibc/packet_msg.json | 6 ++++-- contracts/ibc-reflect-send/schema/raw/execute.json | 6 ++++-- contracts/ibc-reflect-send/src/contract.rs | 2 +- contracts/ibc-reflect-send/src/ibc.rs | 2 +- contracts/ibc-reflect-send/tests/integration.rs | 2 +- contracts/ibc-reflect/schema/ibc/packet_msg.json | 6 ++++-- contracts/reflect/schema/raw/execute.json | 6 ++++-- contracts/reflect/schema/reflect.json | 6 ++++-- packages/std/src/ibc.rs | 7 ++++--- 10 files changed, 31 insertions(+), 18 deletions(-) diff --git a/contracts/ibc-reflect-send/schema/ibc-reflect-send.json b/contracts/ibc-reflect-send/schema/ibc-reflect-send.json index f6a6288237..f863c79d43 100644 --- a/contracts/ibc-reflect-send/schema/ibc-reflect-send.json +++ b/contracts/ibc-reflect-send/schema/ibc-reflect-send.json @@ -408,7 +408,6 @@ "required": [ "amount", "channel_id", - "memo", "timeout", "to_address" ], @@ -427,7 +426,10 @@ }, "memo": { "description": "optional memo", - "type": "string" + "type": [ + "string", + "null" + ] }, "timeout": { "description": "when packet times out, measured on remote chain", diff --git a/contracts/ibc-reflect-send/schema/ibc/packet_msg.json b/contracts/ibc-reflect-send/schema/ibc/packet_msg.json index 0fa40b1575..f8f8640a5c 100644 --- a/contracts/ibc-reflect-send/schema/ibc/packet_msg.json +++ b/contracts/ibc-reflect-send/schema/ibc/packet_msg.json @@ -346,7 +346,6 @@ "required": [ "amount", "channel_id", - "memo", "timeout", "to_address" ], @@ -365,7 +364,10 @@ }, "memo": { "description": "optional memo", - "type": "string" + "type": [ + "string", + "null" + ] }, "timeout": { "description": "when packet times out, measured on remote chain", diff --git a/contracts/ibc-reflect-send/schema/raw/execute.json b/contracts/ibc-reflect-send/schema/raw/execute.json index e1174c25d4..1765e73a74 100644 --- a/contracts/ibc-reflect-send/schema/raw/execute.json +++ b/contracts/ibc-reflect-send/schema/raw/execute.json @@ -397,7 +397,6 @@ "required": [ "amount", "channel_id", - "memo", "timeout", "to_address" ], @@ -416,7 +415,10 @@ }, "memo": { "description": "optional memo", - "type": "string" + "type": [ + "string", + "null" + ] }, "timeout": { "description": "when packet times out, measured on remote chain", diff --git a/contracts/ibc-reflect-send/src/contract.rs b/contracts/ibc-reflect-send/src/contract.rs index 05170533bf..d3a2bfe441 100644 --- a/contracts/ibc-reflect-send/src/contract.rs +++ b/contracts/ibc-reflect-send/src/contract.rs @@ -157,7 +157,7 @@ pub fn handle_send_funds( to_address: remote_addr, amount, timeout: env.block.time.plus_seconds(PACKET_LIFETIME).into(), - memo: String::new(), + memo: None, }; let res = Response::new() diff --git a/contracts/ibc-reflect-send/src/ibc.rs b/contracts/ibc-reflect-send/src/ibc.rs index c9f16a4f06..511a7b1518 100644 --- a/contracts/ibc-reflect-send/src/ibc.rs +++ b/contracts/ibc-reflect-send/src/ibc.rs @@ -417,7 +417,7 @@ mod tests { assert_eq!(&coin(12344, "utrgd"), amount); assert!(timeout.block().is_none()); assert!(timeout.timestamp().is_some()); - assert_eq!(memo, ""); + assert!(memo.is_none()); } o => panic!("unexpected message: {o:?}"), } diff --git a/contracts/ibc-reflect-send/tests/integration.rs b/contracts/ibc-reflect-send/tests/integration.rs index 2b608c13a2..ea8a70f8d2 100644 --- a/contracts/ibc-reflect-send/tests/integration.rs +++ b/contracts/ibc-reflect-send/tests/integration.rs @@ -241,7 +241,7 @@ fn send_remote_funds() { assert_eq!(&coin(12344, "utrgd"), amount); assert!(timeout.block().is_none()); assert!(timeout.timestamp().is_some()); - assert_eq!(memo, ""); + assert!(memo.is_none()); } o => panic!("unexpected message: {o:?}"), } diff --git a/contracts/ibc-reflect/schema/ibc/packet_msg.json b/contracts/ibc-reflect/schema/ibc/packet_msg.json index 2de97e0651..6856f57368 100644 --- a/contracts/ibc-reflect/schema/ibc/packet_msg.json +++ b/contracts/ibc-reflect/schema/ibc/packet_msg.json @@ -333,7 +333,6 @@ "required": [ "amount", "channel_id", - "memo", "timeout", "to_address" ], @@ -352,7 +351,10 @@ }, "memo": { "description": "optional memo", - "type": "string" + "type": [ + "string", + "null" + ] }, "timeout": { "description": "when packet times out, measured on remote chain", diff --git a/contracts/reflect/schema/raw/execute.json b/contracts/reflect/schema/raw/execute.json index 550cf03f6e..abd024e972 100644 --- a/contracts/reflect/schema/raw/execute.json +++ b/contracts/reflect/schema/raw/execute.json @@ -451,7 +451,6 @@ "required": [ "amount", "channel_id", - "memo", "timeout", "to_address" ], @@ -470,7 +469,10 @@ }, "memo": { "description": "optional memo", - "type": "string" + "type": [ + "string", + "null" + ] }, "timeout": { "description": "when packet times out, measured on remote chain", diff --git a/contracts/reflect/schema/reflect.json b/contracts/reflect/schema/reflect.json index 59a960801d..21b899f174 100644 --- a/contracts/reflect/schema/reflect.json +++ b/contracts/reflect/schema/reflect.json @@ -461,7 +461,6 @@ "required": [ "amount", "channel_id", - "memo", "timeout", "to_address" ], @@ -480,7 +479,10 @@ }, "memo": { "description": "optional memo", - "type": "string" + "type": [ + "string", + "null" + ] }, "timeout": { "description": "when packet times out, measured on remote chain", diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 9bf4773cc9..1c3eb16454 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -36,7 +36,8 @@ pub enum IbcMsg { /// when packet times out, measured on remote chain timeout: IbcTimeout, /// optional memo - memo: String, + #[serde(skip_serializing_if = "Option::is_none")] + memo: Option, }, /// Sends an IBC packet with given data over the existing channel. /// Data should be encoded in a format defined by the channel version, @@ -795,10 +796,10 @@ mod tests { to_address: "my-special-addr".into(), amount: Coin::new(12345678u128, "uatom"), timeout: IbcTimeout::with_timestamp(Timestamp::from_nanos(1234567890)), - memo: String::new(), + memo: None, }; let encoded = to_string(&msg).unwrap(); - let expected = r#"{"transfer":{"channel_id":"channel-123","to_address":"my-special-addr","amount":{"denom":"uatom","amount":"12345678"},"timeout":{"block":null,"timestamp":"1234567890"},"memo":""}}"#; + let expected = r#"{"transfer":{"channel_id":"channel-123","to_address":"my-special-addr","amount":{"denom":"uatom","amount":"12345678"},"timeout":{"block":null,"timestamp":"1234567890"}}}"#; assert_eq!(encoded.as_str(), expected); } From dfdba5b3c020c18573aad5e4c7f9be69491ad121 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 17 Oct 2023 16:10:08 +0200 Subject: [PATCH 0881/2372] Remove serde skip annotation --- packages/std/src/ibc.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 1c3eb16454..70b9f91da0 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -36,7 +36,6 @@ pub enum IbcMsg { /// when packet times out, measured on remote chain timeout: IbcTimeout, /// optional memo - #[serde(skip_serializing_if = "Option::is_none")] memo: Option, }, /// Sends an IBC packet with given data over the existing channel. From a7b9bbaa47beeee1c5b47c98babe5154273de3a0 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 17 Oct 2023 16:25:43 +0200 Subject: [PATCH 0882/2372] Fix test --- packages/std/src/ibc.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 70b9f91da0..17c60ae87f 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -798,7 +798,7 @@ mod tests { memo: None, }; let encoded = to_string(&msg).unwrap(); - let expected = r#"{"transfer":{"channel_id":"channel-123","to_address":"my-special-addr","amount":{"denom":"uatom","amount":"12345678"},"timeout":{"block":null,"timestamp":"1234567890"}}}"#; + let expected = r#"{"transfer":{"channel_id":"channel-123","to_address":"my-special-addr","amount":{"denom":"uatom","amount":"12345678"},"timeout":{"block":null,"timestamp":"1234567890"},"memo":null}}"#; assert_eq!(encoded.as_str(), expected); } From eb2c9cefbd6dbbf38f6c36c17da8cde239cada77 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 30 Oct 2023 10:35:17 +0100 Subject: [PATCH 0883/2372] Add changelog entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 70d3b93570..b03f1a2c07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,8 +24,10 @@ and this project adheres to `Decimal256`. ([#1902]) - cosmwasm-std: Remove operand strings from `OverflowError`, `ConversionOverflowError` and `DivideByZeroError`. ([#1896]) +- cosmwasm-std: Add optional memo field to `IbcMsg::Transfer`. ([#1878]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 +[#1878]: https://github.com/CosmWasm/cosmwasm/pull/1878 [#1879]: https://github.com/CosmWasm/cosmwasm/pull/1879 [#1890]: https://github.com/CosmWasm/cosmwasm/pull/1890 [#1896]: https://github.com/CosmWasm/cosmwasm/pull/1896 From 0c596bb2664de3ae34f278e8ca7852e18d26db83 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 31 Oct 2023 10:33:27 +0100 Subject: [PATCH 0884/2372] Set version: 1.5.0 --- Cargo.lock | 16 ++++++++-------- contracts/burner/Cargo.lock | 12 ++++++------ contracts/crypto-verify/Cargo.lock | 12 ++++++------ contracts/cyberpunk/Cargo.lock | 12 ++++++------ contracts/floaty/Cargo.lock | 12 ++++++------ contracts/hackatom/Cargo.lock | 12 ++++++------ contracts/ibc-reflect-send/Cargo.lock | 12 ++++++------ contracts/ibc-reflect/Cargo.lock | 12 ++++++------ contracts/queue/Cargo.lock | 12 ++++++------ contracts/reflect/Cargo.lock | 12 ++++++------ contracts/staking/Cargo.lock | 12 ++++++------ contracts/virus/Cargo.lock | 12 ++++++------ packages/check/Cargo.toml | 6 +++--- packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/go-gen/Cargo.toml | 4 ++-- packages/schema-derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 6 +++--- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 21 files changed, 93 insertions(+), 93 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 63a065d6ec..4b5a1f6cd9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -427,7 +427,7 @@ dependencies = [ [[package]] name = "cosmwasm-check" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "anyhow", "assert_cmd", @@ -440,7 +440,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "criterion", "digest 0.10.6", @@ -459,7 +459,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "cosmwasm-std", "syn 1.0.109", @@ -467,7 +467,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "anyhow", "cosmwasm-schema-derive", @@ -482,7 +482,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "proc-macro2", "quote", @@ -491,7 +491,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "base64", "bech32", @@ -516,7 +516,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "cosmwasm-std", "serde", @@ -524,7 +524,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index ca316005d3..059d31c649 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -199,7 +199,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -211,14 +211,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -229,7 +229,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "proc-macro2", "quote", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "base64", "bech32", @@ -258,7 +258,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 053f146e0f..506d42a232 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 69b9e31ce9..b14ddf9a7d 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -223,7 +223,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -235,14 +235,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -253,7 +253,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "proc-macro2", "quote", @@ -262,7 +262,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "base64 0.21.2", "bech32", @@ -282,7 +282,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 4e2bb708ba..03ee23986d 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index b166216b05..8fa0ef8fd9 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 5723273024..b0ba960340 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index d1a7b7cdae..155dd64dad 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 5690a0ca7d..21c40a3ce4 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 1756ae984c..883d4e958b 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index a6659376f0..5560f10518 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "bitflags", "bytecheck", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index fdcee0c5d1..7ea3b2995b 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "bitflags", "bytecheck", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index 10a9774c7b..bd5f45b244 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-check" -version = "1.5.0-rc.0" +version = "1.5.0" authors = ["Mauro Lacy "] edition = "2021" description = "A CLI tool for verifying CosmWasm smart contracts" @@ -11,8 +11,8 @@ license = "Apache-2.0" anyhow = "1.0.57" clap = "4" colored = "2" -cosmwasm-vm = { path = "../vm", version = "=1.5.0-rc.0" } -cosmwasm-std = { path = "../std", version = "=1.5.0-rc.0" } +cosmwasm-vm = { path = "../vm", version = "=1.5.0" } +cosmwasm-std = { path = "../std", version = "=1.5.0" } [dev-dependencies] assert_cmd = "2.0.12" diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index ad695c4847..689afb02a6 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "1.5.0-rc.0" +version = "1.5.0" authors = ["Mauro Lacy "] edition = "2021" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index bd797df708..98656a5bf0 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "1.5.0-rc.0" +version = "1.5.0" authors = ["Simon Warta "] edition = "2021" description = "A package for auto-generated code used for CosmWasm contract development. This is shipped as part of cosmwasm-std. Do not use directly." diff --git a/packages/go-gen/Cargo.toml b/packages/go-gen/Cargo.toml index 3c59a74e09..12035ed5a0 100644 --- a/packages/go-gen/Cargo.toml +++ b/packages/go-gen/Cargo.toml @@ -9,8 +9,8 @@ publish = false [dependencies] schemars = "0.8.3" -cosmwasm-std = { path = "../std", version = "1.5.0-rc.0", features = ["cosmwasm_1_4", "staking", "stargate", "ibc3"] } -cosmwasm-schema = { path = "../schema", version = "1.5.0-rc.0" } +cosmwasm-std = { path = "../std", version = "1.5.0", features = ["cosmwasm_1_4", "staking", "stargate", "ibc3"] } +cosmwasm-schema = { path = "../schema", version = "1.5.0" } anyhow = "1" Inflector = "0.11.4" indenter = "0.3.3" diff --git a/packages/schema-derive/Cargo.toml b/packages/schema-derive/Cargo.toml index 228c220c1f..c53a9f9c92 100644 --- a/packages/schema-derive/Cargo.toml +++ b/packages/schema-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema-derive" -version = "1.5.0-rc.0" +version = "1.5.0" authors = ["Tomasz Kurcz "] edition = "2021" description = "Derive macros for cosmwasm-schema" diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index b7d247edb4..02fafcaba5 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "1.5.0-rc.0" +version = "1.5.0" authors = ["Simon Warta ", "Ethan Frey "] edition = "2021" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." @@ -8,7 +8,7 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/schema" license = "Apache-2.0" [dependencies] -cosmwasm-schema-derive = { version = "=1.5.0-rc.0", path = "../schema-derive" } +cosmwasm-schema-derive = { version = "=1.5.0", path = "../schema-derive" } schemars = "0.8.3" serde = "1.0" serde_json = "1.0.40" @@ -16,6 +16,6 @@ thiserror = "1.0.26" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = { version = "1.5.0-rc.0", path = "../std" } +cosmwasm-std = { version = "1.5.0", path = "../std" } semver = "1" tempfile = "3" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 8099d51c99..aa3f92219a 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "1.5.0-rc.0" +version = "1.5.0" authors = ["Ethan Frey "] edition = "2021" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -51,7 +51,7 @@ cosmwasm_1_4 = ["cosmwasm_1_3"] [dependencies] base64 = "0.21.0" -cosmwasm-derive = { path = "../derive", version = "1.5.0-rc.0" } +cosmwasm-derive = { path = "../derive", version = "1.5.0" } derivative = "2" forward_ref = "1" hex = "0.4" @@ -68,7 +68,7 @@ static_assertions = "1.1.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] bech32 = "0.9.1" -cosmwasm-crypto = { path = "../crypto", version = "1.5.0-rc.0" } +cosmwasm-crypto = { path = "../crypto", version = "1.5.0" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 0ec42e7088..5c38f021d2 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "1.5.0-rc.0" +version = "1.5.0" authors = ["Ethan Frey "] edition = "2021" description = "CosmWasm library with useful helpers for Storage patterns" @@ -16,5 +16,5 @@ iterator = ["cosmwasm-std/iterator"] [dependencies] # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.5.0-rc.0", default-features = false } +cosmwasm-std = { path = "../std", version = "1.5.0", default-features = false } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 9c3a1a5f82..8eeba737ee 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "1.5.0-rc.0" +version = "1.5.0" authors = ["Ethan Frey "] edition = "2021" description = "VM bindings to run cosmwams contracts" @@ -39,8 +39,8 @@ bytes = "1.4.0" # need a higher version than the one required by Wasmer for the clru = "0.6.1" crc32fast = "1.3.2" # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.5.0-rc.0", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "1.5.0-rc.0" } +cosmwasm-std = { path = "../std", version = "1.5.0", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "1.5.0" } derivative = "2" hex = "0.4" schemars = "0.8.3" From 89891f0bb2de2c83d00600208695d0d5e1b617ac Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 31 Oct 2023 10:43:32 +0100 Subject: [PATCH 0885/2372] Update changelog --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c91334882a..aaff32f83f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ and this project adheres to ## [Unreleased] -## [1.5.0-rc.0] +## [1.5.0] - 2023-10-31 ### Added @@ -593,8 +593,8 @@ and this project adheres to The CHANGELOG for versions before 1.0.0 was moved to [CHANGELOG-pre1.0.0.md](./CHANGELOG-pre1.0.0.md). -[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.5.0-rc.0...HEAD -[1.5.0-rc.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.4.1...v1.5.0-rc.0 +[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.5.0...HEAD +[1.5.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.4.1...v1.5.0 [1.4.1]: https://github.com/CosmWasm/cosmwasm/compare/v1.4.0...v1.4.1 [1.4.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.3...v1.4.0 [1.3.3]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.2...v1.3.3 From 2ce363f7fe876619fb5d5426e5365546dfc142f8 Mon Sep 17 00:00:00 2001 From: Amit Prasad <17amitprasad@gmail.com> Date: Tue, 31 Oct 2023 14:57:31 -0500 Subject: [PATCH 0886/2372] UNUSED_MSG_ID, new uses reply_never --- packages/std/src/results/submessages.rs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/packages/std/src/results/submessages.rs b/packages/std/src/results/submessages.rs index c47cc25aff..176677abe4 100644 --- a/packages/std/src/results/submessages.rs +++ b/packages/std/src/results/submessages.rs @@ -44,12 +44,7 @@ pub const UNUSED_MSG_ID: u64 = 0; impl SubMsg { /// new creates a "fire and forget" message with the pre-0.14 semantics pub fn new(msg: impl Into>) -> Self { - SubMsg { - id: UNUSED_MSG_ID, - msg: msg.into(), - reply_on: ReplyOn::Never, - gas_limit: None, - } + Self::reply_never(msg) } /// create a `SubMsg` that will provide a `reply` with the given id if the message returns `Ok` @@ -68,8 +63,8 @@ impl SubMsg { } /// create a `SubMsg` that will never `reply`. This is equivalent to standard message semantics. - pub fn reply_never(msg: impl Into>, id: u64) -> Self { - Self::reply_on(msg.into(), id, ReplyOn::Never) + pub fn reply_never(msg: impl Into>) -> Self { + Self::reply_on(msg.into(), UNUSED_MSG_ID, ReplyOn::Never) } /// Add a gas limit to the message. From 0a1d463810dc52145f9383d53f3b7cc15ce2d5f7 Mon Sep 17 00:00:00 2001 From: larry <26318510+larry0x@users.noreply.github.com> Date: Fri, 3 Nov 2023 05:44:33 +0000 Subject: [PATCH 0887/2372] update WAT text format in several test cases --- packages/vm/src/cache.rs | 2 +- packages/vm/src/modules/file_system_cache.rs | 2 +- packages/vm/src/modules/in_memory_cache.rs | 6 +++--- packages/vm/src/modules/pinned_memory_cache.rs | 10 +++++----- packages/vm/src/wasm_backend/gatekeeper.rs | 8 ++++---- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 7fdeebdd78..1014e7dd21 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -542,7 +542,7 @@ mod tests { static INVALID_CONTRACT_WAT: &str = r#"(module (type $t0 (func (param i32) (result i32))) (func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32) - get_local $p0 + local.get $p0 i32.const 1 i32.add)) "#; diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 60d8ddaf56..9008c038b5 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -237,7 +237,7 @@ mod tests { const SOME_WAT: &str = r#"(module (type $t0 (func (param i32) (result i32))) (func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32) - get_local $p0 + local.get $p0 i32.const 1 i32.add)) "#; diff --git a/packages/vm/src/modules/in_memory_cache.rs b/packages/vm/src/modules/in_memory_cache.rs index 0fa221c130..a61ece8c01 100644 --- a/packages/vm/src/modules/in_memory_cache.rs +++ b/packages/vm/src/modules/in_memory_cache.rs @@ -120,21 +120,21 @@ mod tests { const WAT1: &str = r#"(module (type $t0 (func (param i32) (result i32))) (func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32) - get_local $p0 + local.get $p0 i32.const 1 i32.add) )"#; const WAT2: &str = r#"(module (type $t0 (func (param i32) (result i32))) (func $add_one (export "add_two") (type $t0) (param $p0 i32) (result i32) - get_local $p0 + local.get $p0 i32.const 2 i32.add) )"#; const WAT3: &str = r#"(module (type $t0 (func (param i32) (result i32))) (func $add_one (export "add_three") (type $t0) (param $p0 i32) (result i32) - get_local $p0 + local.get $p0 i32.const 3 i32.add) )"#; diff --git a/packages/vm/src/modules/pinned_memory_cache.rs b/packages/vm/src/modules/pinned_memory_cache.rs index 8fd6f9d039..f8fe048694 100644 --- a/packages/vm/src/modules/pinned_memory_cache.rs +++ b/packages/vm/src/modules/pinned_memory_cache.rs @@ -92,7 +92,7 @@ mod tests { r#"(module (type $t0 (func (param i32) (result i32))) (func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32) - get_local $p0 + local.get $p0 i32.const 1 i32.add) )"#, @@ -144,7 +144,7 @@ mod tests { r#"(module (type $t0 (func (param i32) (result i32))) (func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32) - get_local $p0 + local.get $p0 i32.const 1 i32.add) )"#, @@ -176,7 +176,7 @@ mod tests { r#"(module (type $t0 (func (param i32) (result i32))) (func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32) - get_local $p0 + local.get $p0 i32.const 1 i32.add) )"#, @@ -208,7 +208,7 @@ mod tests { r#"(module (type $t0 (func (param i32) (result i32))) (func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32) - get_local $p0 + local.get $p0 i32.const 1 i32.add) )"#, @@ -219,7 +219,7 @@ mod tests { r#"(module (type $t0 (func (param i32) (result i32))) (func $add_one (export "add_two") (type $t0) (param $p0 i32) (result i32) - get_local $p0 + local.get $p0 i32.const 2 i32.add) )"#, diff --git a/packages/vm/src/wasm_backend/gatekeeper.rs b/packages/vm/src/wasm_backend/gatekeeper.rs index fbc2ab8b02..f3646326a3 100644 --- a/packages/vm/src/wasm_backend/gatekeeper.rs +++ b/packages/vm/src/wasm_backend/gatekeeper.rs @@ -710,8 +710,8 @@ mod tests { r#" (module (func (export "sum") (param i32 i32) (result i32) - get_local 0 - get_local 1 + local.get 0 + local.get 1 i32.add )) "#, @@ -732,8 +732,8 @@ mod tests { r#" (module (func $to_float (param i32) (result f32) - get_local 0 - f32.convert_u/i32 + local.get 0 + f32.convert_i32_u )) "#, ) From 132f892c15ab604818df41802544d507d5d8a5b5 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Sat, 4 Nov 2023 23:19:42 +0100 Subject: [PATCH 0888/2372] Upgrade clippy in CI to Rust 1.73.0 --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index bdaa6df4c7..38ee07c097 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -72,7 +72,7 @@ workflows: matrix: parameters: # Run with MSRV and some modern stable Rust - rust-version: ["1.70.0", "1.72.0"] + rust-version: ["1.70.0", "1.73.0"] - benchmarking: requires: - package_vm From 8326a573e5915504cc26669710518092cbfa1898 Mon Sep 17 00:00:00 2001 From: Amit Prasad <17amitprasad@gmail.com> Date: Sun, 5 Nov 2023 01:06:10 -0500 Subject: [PATCH 0889/2372] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 70d3b93570..9ac80310e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ and this project adheres to `Decimal256`. ([#1902]) - cosmwasm-std: Remove operand strings from `OverflowError`, `ConversionOverflowError` and `DivideByZeroError`. ([#1896]) +- cosmwasm-std: Add `SubMsg:reply_never` constructor ([#1929]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1879]: https://github.com/CosmWasm/cosmwasm/pull/1879 @@ -31,6 +32,7 @@ and this project adheres to [#1896]: https://github.com/CosmWasm/cosmwasm/pull/1896 [#1898]: https://github.com/CosmWasm/cosmwasm/pull/1898 [#1902]: https://github.com/CosmWasm/cosmwasm/pull/1902 +[#1929]: https://github.com/CosmWasm/cosmwasm/pull/1929 ## [1.5.0-rc.0] From 0f05df7781725f4d022d13353781a7450d7816b3 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 15 Sep 2023 13:35:47 +0200 Subject: [PATCH 0890/2372] Privatize CanonicalAddr, Binary and Size inner val --- packages/std/src/addresses.rs | 34 +++++++++++++++++++------- packages/std/src/binary.rs | 7 +++++- packages/std/src/ibc.rs | 2 +- packages/std/src/serde.rs | 2 +- packages/vm/src/size.rs | 2 +- packages/vm/src/wasm_backend/engine.rs | 2 +- 6 files changed, 35 insertions(+), 14 deletions(-) diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index f029913a07..c41ab4c8a0 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -130,7 +130,7 @@ impl<'a> From<&'a Addr> for Cow<'a, Addr> { /// So the type should be treated as a marker to express the intended data type, not as /// a validity guarantee of any sort. #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Hash, JsonSchema)] -pub struct CanonicalAddr(pub Binary); +pub struct CanonicalAddr(Binary); /// Implement `CanonicalAddr == Binary` impl PartialEq for CanonicalAddr { @@ -485,26 +485,34 @@ mod tests { let original_ptr = original.as_ptr(); let addr: CanonicalAddr = original.into(); assert_eq!(addr.as_slice(), [0u8, 187, 61, 11, 250, 0]); - assert_eq!((addr.0).0.as_ptr(), original_ptr, "must not be copied"); + assert_eq!( + (addr.0).as_slice().as_ptr(), + original_ptr, + "must not be copied" + ); // From> for CanonicalAddr let original = vec![0u8, 187, 61, 11, 250, 0]; let original_ptr = original.as_ptr(); let addr = CanonicalAddr::from(original); assert_eq!(addr.as_slice(), [0u8, 187, 61, 11, 250, 0]); - assert_eq!((addr.0).0.as_ptr(), original_ptr, "must not be copied"); + assert_eq!( + (addr.0).as_slice().as_ptr(), + original_ptr, + "must not be copied" + ); // Into> for CanonicalAddr // This test is a bit pointless because we get Into from the From implementation let original = CanonicalAddr::from(vec![0u8, 187, 61, 11, 250, 0]); - let original_ptr = (original.0).0.as_ptr(); + let original_ptr = (original.0).as_slice().as_ptr(); let vec: Vec = original.into(); assert_eq!(vec.as_slice(), [0u8, 187, 61, 11, 250, 0]); assert_eq!(vec.as_ptr(), original_ptr, "must not be copied"); // From for Vec let original = CanonicalAddr::from(vec![7u8, 35, 49, 101, 0, 255]); - let original_ptr = (original.0).0.as_ptr(); + let original_ptr = (original.0).as_slice().as_ptr(); let vec = Vec::::from(original); assert_eq!(vec.as_slice(), [7u8, 35, 49, 101, 0, 255]); assert_eq!(vec.as_ptr(), original_ptr, "must not be copied"); @@ -517,11 +525,15 @@ mod tests { let original_ptr = original.as_ptr(); let addr = CanonicalAddr::from(original); assert_eq!(addr.as_slice(), [0u8, 187, 61, 11, 250, 0]); - assert_eq!((addr.0).0.as_ptr(), original_ptr, "must not be copied"); + assert_eq!( + (addr.0).as_slice().as_ptr(), + original_ptr, + "must not be copied" + ); // From for Binary let original = CanonicalAddr::from(vec![7u8, 35, 49, 101, 0, 255]); - let original_ptr = (original.0).0.as_ptr(); + let original_ptr = (original.0).as_slice().as_ptr(); let bin = Binary::from(original); assert_eq!(bin.as_slice(), [7u8, 35, 49, 101, 0, 255]); assert_eq!(bin.as_ptr(), original_ptr, "must not be copied"); @@ -534,11 +546,15 @@ mod tests { let original_ptr = original.as_ptr(); let addr = CanonicalAddr::from(original); assert_eq!(addr.as_slice(), [0u8, 187, 61, 11, 250, 0]); - assert_eq!((addr.0).0.as_ptr(), original_ptr, "must not be copied"); + assert_eq!( + (addr.0).as_slice().as_ptr(), + original_ptr, + "must not be copied" + ); // From for HexBinary let original = CanonicalAddr::from(vec![7u8, 35, 49, 101, 0, 255]); - let original_ptr = (original.0).0.as_ptr(); + let original_ptr = (original.0).as_slice().as_ptr(); let bin = HexBinary::from(original); assert_eq!(bin.as_slice(), [7u8, 35, 49, 101, 0, 255]); assert_eq!(bin.as_ptr(), original_ptr, "must not be copied"); diff --git a/packages/std/src/binary.rs b/packages/std/src/binary.rs index bb65eea8db..8e2355033b 100644 --- a/packages/std/src/binary.rs +++ b/packages/std/src/binary.rs @@ -13,7 +13,7 @@ use crate::errors::{StdError, StdResult}; /// This is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. /// See also . #[derive(Clone, Default, PartialEq, Eq, Hash, PartialOrd, Ord, JsonSchema)] -pub struct Binary(#[schemars(with = "String")] pub Vec); +pub struct Binary(#[schemars(with = "String")] Vec); impl Binary { /// Base64 encoding engine used in conversion to/from base64. @@ -26,6 +26,11 @@ impl Binary { .with_decode_padding_mode(base64::engine::DecodePaddingMode::Indifferent), ); + /// Creates a new `Binary` containing the given data. + pub const fn new(data: Vec) -> Self { + Self(data) + } + /// take an (untrusted) string and decode it into bytes. /// fails if it is not valid base64 pub fn from_base64(encoded: &str) -> StdResult { diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 17c60ae87f..6631312527 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -654,7 +654,7 @@ pub struct IbcReceiveResponse { impl Default for IbcReceiveResponse { fn default() -> Self { IbcReceiveResponse { - acknowledgement: Binary(vec![]), + acknowledgement: Binary::default(), messages: vec![], attributes: vec![], events: vec![], diff --git a/packages/std/src/serde.rs b/packages/std/src/serde.rs index 23793698b6..2948813281 100644 --- a/packages/std/src/serde.rs +++ b/packages/std/src/serde.rs @@ -63,7 +63,7 @@ pub fn to_json_binary(data: &T) -> StdResult where T: Serialize + ?Sized, { - to_json_vec(data).map(Binary) + to_json_vec(data).map(Binary::new) } #[cfg(test)] diff --git a/packages/vm/src/size.rs b/packages/vm/src/size.rs index 14ec88f928..c6f4c88520 100644 --- a/packages/vm/src/size.rs +++ b/packages/vm/src/size.rs @@ -1,5 +1,5 @@ #[derive(Copy, Clone, Debug)] -pub struct Size(pub usize); +pub struct Size(pub(crate) usize); impl Size { /// Creates a size of `n` kilo diff --git a/packages/vm/src/wasm_backend/engine.rs b/packages/vm/src/wasm_backend/engine.rs index 25eceee93c..575950c275 100644 --- a/packages/vm/src/wasm_backend/engine.rs +++ b/packages/vm/src/wasm_backend/engine.rs @@ -87,7 +87,7 @@ mod tests { #[test] fn limit_to_pages_works() { // rounds down - assert_eq!(limit_to_pages(Size(0)), Pages(0)); + assert_eq!(limit_to_pages(Size::kilo(0)), Pages(0)); assert_eq!(limit_to_pages(Size(1)), Pages(0)); assert_eq!(limit_to_pages(Size::kibi(63)), Pages(0)); assert_eq!(limit_to_pages(Size::kibi(64)), Pages(1)); From 2b0c2eedf752728a7bcb2ab70cf776725285a0d9 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 15 Sep 2023 15:30:01 +0200 Subject: [PATCH 0891/2372] Fix contracts --- contracts/crypto-verify/src/contract.rs | 82 ++++++++++---------- contracts/crypto-verify/tests/integration.rs | 71 +++++++++-------- contracts/queue/src/contract.rs | 2 +- contracts/reflect/src/contract.rs | 2 +- contracts/reflect/tests/integration.rs | 2 +- 5 files changed, 82 insertions(+), 77 deletions(-) diff --git a/contracts/crypto-verify/src/contract.rs b/contracts/crypto-verify/src/contract.rs index 41fe879201..1a418cb8ef 100644 --- a/contracts/crypto-verify/src/contract.rs +++ b/contracts/crypto-verify/src/contract.rs @@ -34,9 +34,9 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { public_key, } => to_json_binary(&query_verify_cosmos( deps, - &message.0, - &signature.0, - &public_key.0, + message.as_slice(), + signature.as_slice(), + public_key.as_slice(), )?), QueryMsg::VerifyEthereumText { message, @@ -69,9 +69,9 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { public_key, } => to_json_binary(&query_verify_tendermint( deps, - &message.0, - &signature.0, - &public_key.0, + message.as_slice(), + signature.as_slice(), + public_key.as_slice(), )?), QueryMsg::VerifyTendermintBatch { messages, @@ -268,9 +268,9 @@ mod tests { let public_key = hex::decode(SECP256K1_PUBLIC_KEY_HEX).unwrap(); let verify_msg = QueryMsg::VerifyCosmosSignature { - message: Binary(message), - signature: Binary(signature), - public_key: Binary(public_key), + message: Binary::new(message), + signature: Binary::new(signature), + public_key: Binary::new(public_key), }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); @@ -290,9 +290,9 @@ mod tests { let public_key = hex::decode(SECP256K1_PUBLIC_KEY_HEX).unwrap(); let verify_msg = QueryMsg::VerifyCosmosSignature { - message: Binary(message), - signature: Binary(signature), - public_key: Binary(public_key), + message: Binary::new(message), + signature: Binary::new(signature), + public_key: Binary::new(public_key), }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); @@ -310,9 +310,9 @@ mod tests { let public_key = vec![]; let verify_msg = QueryMsg::VerifyCosmosSignature { - message: Binary(message), - signature: Binary(signature), - public_key: Binary(public_key), + message: Binary::new(message), + signature: Binary::new(signature), + public_key: Binary::new(public_key), }; let res = query(deps.as_ref(), mock_env(), verify_msg); @@ -457,15 +457,15 @@ mod tests { let messages = [ED25519_MESSAGE_HEX, ED25519_MESSAGE2_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); let signatures = [ED25519_SIGNATURE_HEX, ED25519_SIGNATURE2_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); let public_keys = [ED25519_PUBLIC_KEY_HEX, ED25519_PUBLIC_KEY2_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); let verify_msg = QueryMsg::VerifyTendermintBatch { @@ -487,18 +487,18 @@ mod tests { // One message let messages = [ED25519_MESSAGE_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); // Multiple signatures //FIXME: Use different signatures / pubkeys let signatures = [ED25519_SIGNATURE_HEX, ED25519_SIGNATURE_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); // Multiple pubkeys let public_keys = [ED25519_PUBLIC_KEY_HEX, ED25519_PUBLIC_KEY_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); let verify_msg = QueryMsg::VerifyTendermintBatch { @@ -521,18 +521,18 @@ mod tests { //FIXME: Use different messages let messages = [ED25519_MESSAGE_HEX, ED25519_MESSAGE_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); // Multiple signatures //FIXME: Use different signatures let signatures = [ED25519_SIGNATURE_HEX, ED25519_SIGNATURE_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); // One pubkey let public_keys = [ED25519_PUBLIC_KEY_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); let verify_msg = QueryMsg::VerifyTendermintBatch { @@ -553,17 +553,19 @@ mod tests { let mut messages: Vec = [ED25519_MESSAGE_HEX, ED25519_MESSAGE2_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); // Alter one of the messages - messages[0].0[0] ^= 0x01; + let mut b: Vec<_> = messages.pop().unwrap().into(); + b[0] ^= 0x01; + messages.push(Binary::new(b)); let signatures = [ED25519_SIGNATURE_HEX, ED25519_SIGNATURE2_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); let public_keys = [ED25519_PUBLIC_KEY_HEX, ED25519_PUBLIC_KEY2_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); let verify_msg = QueryMsg::VerifyTendermintBatch { @@ -584,16 +586,16 @@ mod tests { let messages = [ED25519_MESSAGE_HEX, ED25519_MESSAGE2_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); let signatures = [ED25519_SIGNATURE_HEX, ED25519_SIGNATURE2_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); // One of the public keys is empty let public_keys = ["", ED25519_PUBLIC_KEY_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); let verify_msg = QueryMsg::VerifyTendermintBatch { @@ -620,9 +622,9 @@ mod tests { let public_key = hex::decode(ED25519_PUBLIC_KEY_HEX).unwrap(); let verify_msg = QueryMsg::VerifyTendermintSignature { - message: Binary(message), - signature: Binary(signature), - public_key: Binary(public_key), + message: Binary::new(message), + signature: Binary::new(signature), + public_key: Binary::new(public_key), }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); @@ -642,9 +644,9 @@ mod tests { let public_key = hex::decode(ED25519_PUBLIC_KEY_HEX).unwrap(); let verify_msg = QueryMsg::VerifyTendermintSignature { - message: Binary(message), - signature: Binary(signature), - public_key: Binary(public_key), + message: Binary::new(message), + signature: Binary::new(signature), + public_key: Binary::new(public_key), }; let raw = query(deps.as_ref(), mock_env(), verify_msg).unwrap(); @@ -662,9 +664,9 @@ mod tests { let public_key = vec![]; let verify_msg = QueryMsg::VerifyTendermintSignature { - message: Binary(message), - signature: Binary(signature), - public_key: Binary(public_key), + message: Binary::new(message), + signature: Binary::new(signature), + public_key: Binary::new(public_key), }; let res = query(deps.as_ref(), mock_env(), verify_msg); assert!(res.is_err()); diff --git a/contracts/crypto-verify/tests/integration.rs b/contracts/crypto-verify/tests/integration.rs index 4cdf2f3749..1ef58efbb7 100644 --- a/contracts/crypto-verify/tests/integration.rs +++ b/contracts/crypto-verify/tests/integration.rs @@ -79,9 +79,9 @@ fn cosmos_signature_verify_works() { let public_key = hex::decode(SECP256K1_PUBLIC_KEY_HEX).unwrap(); let verify_msg = QueryMsg::VerifyCosmosSignature { - message: Binary(message), - signature: Binary(signature), - public_key: Binary(public_key), + message: Binary::new(message), + signature: Binary::new(signature), + public_key: Binary::new(public_key), }; let raw = query(&mut deps, mock_env(), verify_msg).unwrap(); @@ -101,9 +101,9 @@ fn cosmos_signature_verify_fails() { let public_key = hex::decode(SECP256K1_PUBLIC_KEY_HEX).unwrap(); let verify_msg = QueryMsg::VerifyCosmosSignature { - message: Binary(message), - signature: Binary(signature), - public_key: Binary(public_key), + message: Binary::new(message), + signature: Binary::new(signature), + public_key: Binary::new(public_key), }; let raw = query(&mut deps, mock_env(), verify_msg).unwrap(); @@ -121,9 +121,9 @@ fn cosmos_signature_verify_errors() { let public_key = vec![]; let verify_msg = QueryMsg::VerifyCosmosSignature { - message: Binary(message), - signature: Binary(signature), - public_key: Binary(public_key), + message: Binary::new(message), + signature: Binary::new(signature), + public_key: Binary::new(public_key), }; let res = query(&mut deps, mock_env(), verify_msg); assert_eq!( @@ -262,9 +262,9 @@ fn tendermint_signature_verify_works() { let public_key = hex::decode(ED25519_PUBLIC_KEY_HEX).unwrap(); let verify_msg = QueryMsg::VerifyTendermintSignature { - message: Binary(message), - signature: Binary(signature), - public_key: Binary(public_key), + message: Binary::new(message), + signature: Binary::new(signature), + public_key: Binary::new(public_key), }; let raw = query(&mut deps, mock_env(), verify_msg).unwrap(); @@ -284,9 +284,9 @@ fn tendermint_signature_verify_fails() { let public_key = hex::decode(ED25519_PUBLIC_KEY_HEX).unwrap(); let verify_msg = QueryMsg::VerifyTendermintSignature { - message: Binary(message), - signature: Binary(signature), - public_key: Binary(public_key), + message: Binary::new(message), + signature: Binary::new(signature), + public_key: Binary::new(public_key), }; let raw = query(&mut deps, mock_env(), verify_msg).unwrap(); @@ -304,9 +304,9 @@ fn tendermint_signature_verify_errors() { let public_key = vec![]; let verify_msg = QueryMsg::VerifyTendermintSignature { - message: Binary(message), - signature: Binary(signature), - public_key: Binary(public_key), + message: Binary::new(message), + signature: Binary::new(signature), + public_key: Binary::new(public_key), }; let res = query(&mut deps, mock_env(), verify_msg); assert_eq!( @@ -321,15 +321,15 @@ fn tendermint_signatures_batch_verify_works() { let messages = [ED25519_MESSAGE_HEX, ED25519_MESSAGE2_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); let signatures = [ED25519_SIGNATURE_HEX, ED25519_SIGNATURE2_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); let public_keys = [ED25519_PUBLIC_KEY_HEX, ED25519_PUBLIC_KEY2_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); let verify_msg = QueryMsg::VerifyTendermintBatch { @@ -351,18 +351,18 @@ fn tendermint_signatures_batch_verify_message_multisig_works() { // One message let messages = [ED25519_MESSAGE_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); // Multiple signatures //FIXME: Use different signatures / pubkeys let signatures = [ED25519_SIGNATURE_HEX, ED25519_SIGNATURE_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); // Multiple pubkeys let public_keys = [ED25519_PUBLIC_KEY_HEX, ED25519_PUBLIC_KEY_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); let verify_msg = QueryMsg::VerifyTendermintBatch { @@ -385,17 +385,17 @@ fn tendermint_signatures_batch_verify_single_public_key_works() { //FIXME: Use different messages / signatures let messages = [ED25519_MESSAGE_HEX, ED25519_MESSAGE_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); // Multiple signatures let signatures = [ED25519_SIGNATURE_HEX, ED25519_SIGNATURE_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); // One pubkey let public_keys = [ED25519_PUBLIC_KEY_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); let verify_msg = QueryMsg::VerifyTendermintBatch { @@ -416,17 +416,20 @@ fn tendermint_signatures_batch_verify_fails() { let mut messages: Vec = [ED25519_MESSAGE_HEX, ED25519_MESSAGE2_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); // Alter one of the messages - messages[1].0[0] ^= 0x01; + let mut b: Vec<_> = messages.swap_remove(0).into(); + b[0] ^= 0x01; + messages.push(Binary::new(b)); + messages.swap(0, 1); // swap them again to old order let signatures = [ED25519_SIGNATURE_HEX, ED25519_SIGNATURE2_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); let public_keys = [ED25519_PUBLIC_KEY_HEX, ED25519_PUBLIC_KEY2_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); let verify_msg = QueryMsg::VerifyTendermintBatch { @@ -447,16 +450,16 @@ fn tendermint_signatures_batch_verify_errors() { let messages = [ED25519_MESSAGE_HEX, ED25519_MESSAGE2_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); let signatures = [ED25519_SIGNATURE_HEX, ED25519_SIGNATURE2_HEX] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); // One of the public keys is empty let public_keys = [ED25519_PUBLIC_KEY_HEX, ""] .iter() - .map(|m| Binary(hex::decode(m).unwrap())) + .map(|m| Binary::new(hex::decode(m).unwrap())) .collect(); let verify_msg = QueryMsg::VerifyTendermintBatch { diff --git a/contracts/queue/src/contract.rs b/contracts/queue/src/contract.rs index 536921a4e4..02b39e2198 100644 --- a/contracts/queue/src/contract.rs +++ b/contracts/queue/src/contract.rs @@ -66,7 +66,7 @@ fn handle_dequeue(deps: DepsMut) -> StdResult { if let Some((key, value)) = first { // remove from storage and return old value deps.storage.remove(&key); - res.data = Some(Binary(value)); + res.data = Some(Binary::new(value)); } Ok(res) } diff --git a/contracts/reflect/src/contract.rs b/contracts/reflect/src/contract.rs index fbe9076ec7..87208f2e94 100644 --- a/contracts/reflect/src/contract.rs +++ b/contracts/reflect/src/contract.rs @@ -274,7 +274,7 @@ mod tests { } .into(), // make sure we can pass through custom native messages - CustomMsg::Raw(Binary(b"{\"foo\":123}".to_vec())).into(), + CustomMsg::Raw(Binary::new(b"{\"foo\":123}".to_vec())).into(), CustomMsg::Debug("Hi, Dad!".to_string()).into(), StakingMsg::Delegate { validator: String::from("validator"), diff --git a/contracts/reflect/tests/integration.rs b/contracts/reflect/tests/integration.rs index 1333ad53bb..47714925f0 100644 --- a/contracts/reflect/tests/integration.rs +++ b/contracts/reflect/tests/integration.rs @@ -102,7 +102,7 @@ fn reflect() { } .into(), // make sure we can pass through custom native messages - CustomMsg::Raw(Binary(b"{\"foo\":123}".to_vec())).into(), + CustomMsg::Raw(Binary::new(b"{\"foo\":123}".to_vec())).into(), CustomMsg::Debug("Hi, Dad!".to_string()).into(), StakingMsg::Delegate { validator: String::from("validator"), From 4ef1b80de153c7519c7866ddc8a6bc79a99a5df5 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 15 Sep 2023 15:35:36 +0200 Subject: [PATCH 0892/2372] Fix bench --- packages/vm/benches/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vm/benches/main.rs b/packages/vm/benches/main.rs index bcad71287b..d313e85a1f 100644 --- a/packages/vm/benches/main.rs +++ b/packages/vm/benches/main.rs @@ -177,7 +177,7 @@ fn bench_cache(c: &mut Criterion) { let non_memcache = CacheOptions::new( TempDir::new().unwrap().into_path(), capabilities_from_csv("iterator,staking"), - Size(0), + Size::kilo(0), DEFAULT_MEMORY_LIMIT, ); let cache: Cache = @@ -199,7 +199,7 @@ fn bench_cache(c: &mut Criterion) { let non_memcache = CacheOptions::new( TempDir::new().unwrap().into_path(), capabilities_from_csv("iterator,staking"), - Size(0), + Size::kilo(0), DEFAULT_MEMORY_LIMIT, ); let mut cache: Cache = From b75e767c979b6a1c87a412a239bcaf64461f9197 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 28 Sep 2023 11:00:21 +0200 Subject: [PATCH 0893/2372] Add Size::new --- packages/vm/benches/main.rs | 4 ++-- packages/vm/src/size.rs | 13 +++++++++---- packages/vm/src/wasm_backend/engine.rs | 8 ++++---- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/packages/vm/benches/main.rs b/packages/vm/benches/main.rs index d313e85a1f..16ce2c23cd 100644 --- a/packages/vm/benches/main.rs +++ b/packages/vm/benches/main.rs @@ -177,7 +177,7 @@ fn bench_cache(c: &mut Criterion) { let non_memcache = CacheOptions::new( TempDir::new().unwrap().into_path(), capabilities_from_csv("iterator,staking"), - Size::kilo(0), + Size::new(0), DEFAULT_MEMORY_LIMIT, ); let cache: Cache = @@ -199,7 +199,7 @@ fn bench_cache(c: &mut Criterion) { let non_memcache = CacheOptions::new( TempDir::new().unwrap().into_path(), capabilities_from_csv("iterator,staking"), - Size::kilo(0), + Size::new(0), DEFAULT_MEMORY_LIMIT, ); let mut cache: Cache = diff --git a/packages/vm/src/size.rs b/packages/vm/src/size.rs index c6f4c88520..c43a3a1a6b 100644 --- a/packages/vm/src/size.rs +++ b/packages/vm/src/size.rs @@ -2,6 +2,11 @@ pub struct Size(pub(crate) usize); impl Size { + /// Creates a size of `n` + pub const fn new(n: usize) -> Self { + Size(n) + } + /// Creates a size of `n` kilo pub const fn kilo(n: usize) -> Self { Size(n * 1000) @@ -39,8 +44,8 @@ mod tests { #[test] fn constructors_work() { - assert_eq!(Size(0).0, 0); - assert_eq!(Size(3).0, 3); + assert_eq!(Size::new(0).0, Size(0).0); + assert_eq!(Size::new(3).0, Size(3).0); assert_eq!(Size::kilo(0).0, 0); assert_eq!(Size::kilo(3).0, 3000); @@ -63,8 +68,8 @@ mod tests { #[test] fn implements_debug() { - assert_eq!(format!("{:?}", Size(0)), "Size(0)"); - assert_eq!(format!("{:?}", Size(123)), "Size(123)"); + assert_eq!(format!("{:?}", Size::new(0)), "Size(0)"); + assert_eq!(format!("{:?}", Size::new(123)), "Size(123)"); assert_eq!(format!("{:?}", Size::kibi(2)), "Size(2048)"); assert_eq!(format!("{:?}", Size::mebi(1)), "Size(1048576)"); } diff --git a/packages/vm/src/wasm_backend/engine.rs b/packages/vm/src/wasm_backend/engine.rs index 575950c275..b5b67e660a 100644 --- a/packages/vm/src/wasm_backend/engine.rs +++ b/packages/vm/src/wasm_backend/engine.rs @@ -87,16 +87,16 @@ mod tests { #[test] fn limit_to_pages_works() { // rounds down - assert_eq!(limit_to_pages(Size::kilo(0)), Pages(0)); - assert_eq!(limit_to_pages(Size(1)), Pages(0)); + assert_eq!(limit_to_pages(Size::new(0)), Pages(0)); + assert_eq!(limit_to_pages(Size::new(1)), Pages(0)); assert_eq!(limit_to_pages(Size::kibi(63)), Pages(0)); assert_eq!(limit_to_pages(Size::kibi(64)), Pages(1)); assert_eq!(limit_to_pages(Size::kibi(65)), Pages(1)); - assert_eq!(limit_to_pages(Size(u32::MAX as usize)), Pages(65535)); + assert_eq!(limit_to_pages(Size::new(u32::MAX as usize)), Pages(65535)); // caps at 4 GiB assert_eq!(limit_to_pages(Size::gibi(3)), Pages(49152)); assert_eq!(limit_to_pages(Size::gibi(4)), Pages(65536)); assert_eq!(limit_to_pages(Size::gibi(5)), Pages(65536)); - assert_eq!(limit_to_pages(Size(usize::MAX)), Pages(65536)); + assert_eq!(limit_to_pages(Size::new(usize::MAX)), Pages(65536)); } } From 656813b8810ae8800eed575ea02b191d5d5a54ce Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 6 Nov 2023 13:32:15 +0100 Subject: [PATCH 0894/2372] Add changelog and migrating entries --- CHANGELOG.md | 4 ++++ MIGRATING.md | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bee5de0d7e..00f9418771 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,8 +26,12 @@ and this project adheres to `ConversionOverflowError` and `DivideByZeroError`. ([#1896]) - cosmwasm-std: Add `SubMsg:reply_never` constructor ([#1929]) - cosmwasm-std: Add optional memo field to `IbcMsg::Transfer`. ([#1878]) +- cosmwasm-std: Make inner values of `CanonicalAddr` and `Binary` private and + add constructor for `Binary`. ([#1876]) +- cosmwasm-vm: Make inner value of `Size` private and add constructor. ([#1876]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 +[#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 [#1878]: https://github.com/CosmWasm/cosmwasm/pull/1878 [#1879]: https://github.com/CosmWasm/cosmwasm/pull/1879 [#1890]: https://github.com/CosmWasm/cosmwasm/pull/1890 diff --git a/MIGRATING.md b/MIGRATING.md index 559581566c..f367462f30 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -69,6 +69,22 @@ major releases of `cosmwasm`. Note that you can also view the +Coin::new(1234u128, "uatom") ``` +- When creating a `Binary` or `Size` instance from an inner value, you now have + to explicitly call `new`: + + ```diff + -Binary(vec![1u8]) + +Binary::new(vec![1u8]) + ``` + +- When accessing the inner value of a `CanonicalAddr` or `Binary`, use + `as_slice` instead: + + ```diff + -&canonical_addr.0 + +canonical_addr.as_slice() + ``` + ## 1.4.x -> 1.5.0 - Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): From 0394174ac95d670129eb78295085580ab695add5 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 15 Sep 2023 13:15:11 +0200 Subject: [PATCH 0895/2372] Remove old ibc functionality --- packages/std/src/exports.rs | 9 ++++----- packages/std/src/ibc.rs | 21 --------------------- packages/std/src/lib.rs | 8 +++++--- packages/std/src/testing/mock.rs | 25 ++++++++++++------------- packages/std/src/testing/mod.rs | 4 +++- packages/vm/src/calls.rs | 4 +++- 6 files changed, 27 insertions(+), 44 deletions(-) diff --git a/packages/std/src/exports.rs b/packages/std/src/exports.rs index c745bc82e7..279b9d8bb3 100644 --- a/packages/std/src/exports.rs +++ b/packages/std/src/exports.rs @@ -15,9 +15,8 @@ use serde::de::DeserializeOwned; use crate::deps::OwnedDeps; #[cfg(feature = "stargate")] use crate::ibc::{ - IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, - IbcChannelOpenResponse, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, - IbcReceiveResponse, + IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcPacketAckMsg, + IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, }; use crate::imports::{ExternalApi, ExternalQuerier, ExternalStorage}; use crate::memory::{alloc, consume_region, release_buffer, Region}; @@ -531,10 +530,10 @@ where #[cfg(feature = "stargate")] fn _do_ibc_channel_open( - contract_fn: &dyn Fn(DepsMut, Env, IbcChannelOpenMsg) -> Result, + contract_fn: &dyn Fn(DepsMut, Env, IbcChannelOpenMsg) -> Result<(), E>, env_ptr: *mut Region, msg_ptr: *mut Region, -) -> ContractResult +) -> ContractResult<()> where Q: CustomQuery, E: ToString, diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 6631312527..121ba7e262 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -299,9 +299,6 @@ impl From for IbcChannel { } } -/// Note that this serializes as "null". -#[cfg(not(feature = "ibc3"))] -pub type IbcChannelOpenResponse = (); /// This serializes either as "null" or a JSON object. #[cfg(feature = "ibc3")] pub type IbcChannelOpenResponse = Option; @@ -410,11 +407,6 @@ pub struct IbcPacketReceiveMsg { } impl IbcPacketReceiveMsg { - #[cfg(not(feature = "ibc3"))] - pub fn new(packet: IbcPacket) -> Self { - Self { packet } - } - #[cfg(feature = "ibc3")] pub fn new(packet: IbcPacket, relayer: Addr) -> Self { Self { packet, relayer } @@ -432,14 +424,6 @@ pub struct IbcPacketAckMsg { } impl IbcPacketAckMsg { - #[cfg(not(feature = "ibc3"))] - pub fn new(acknowledgement: IbcAcknowledgement, original_packet: IbcPacket) -> Self { - Self { - acknowledgement, - original_packet, - } - } - #[cfg(feature = "ibc3")] pub fn new( acknowledgement: IbcAcknowledgement, @@ -464,11 +448,6 @@ pub struct IbcPacketTimeoutMsg { } impl IbcPacketTimeoutMsg { - #[cfg(not(feature = "ibc3"))] - pub fn new(packet: IbcPacket) -> Self { - Self { packet } - } - #[cfg(feature = "ibc3")] pub fn new(packet: IbcPacket, relayer: Addr) -> Self { Self { packet, relayer } diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index ea04f23dc1..00332fe0db 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -51,11 +51,13 @@ pub use crate::errors::{ VerificationError, }; pub use crate::hex_binary::HexBinary; +#[cfg(feature = "ibc3")] +pub use crate::ibc::IbcChannelOpenResponse; pub use crate::ibc::{ Ibc3ChannelOpenResponse, IbcAcknowledgement, IbcBasicResponse, IbcChannel, IbcChannelCloseMsg, - IbcChannelConnectMsg, IbcChannelOpenMsg, IbcChannelOpenResponse, IbcEndpoint, IbcMsg, IbcOrder, - IbcPacket, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, - IbcTimeout, IbcTimeoutBlock, + IbcChannelConnectMsg, IbcChannelOpenMsg, IbcEndpoint, IbcMsg, IbcOrder, IbcPacket, + IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, IbcTimeout, + IbcTimeoutBlock, }; #[cfg(feature = "iterator")] pub use crate::iterator::{Order, Record}; diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 4218f729f5..1e13b04b1f 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -4,7 +4,7 @@ use core::marker::PhantomData; #[cfg(feature = "cosmwasm_1_3")] use core::ops::Bound; use serde::de::DeserializeOwned; -#[cfg(feature = "stargate")] +#[cfg(feature = "ibc3")] use serde::Serialize; use sha2::{Digest, Sha256}; #[cfg(feature = "cosmwasm_1_3")] @@ -16,12 +16,15 @@ use crate::binary::Binary; use crate::coin::Coin; use crate::deps::OwnedDeps; use crate::errors::{RecoverPubkeyError, StdError, StdResult, SystemError, VerificationError}; -#[cfg(feature = "stargate")] +#[cfg(feature = "ibc3")] use crate::ibc::{ - IbcAcknowledgement, IbcChannel, IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, - IbcEndpoint, IbcOrder, IbcPacket, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, + IbcAcknowledgement, IbcPacket, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcTimeoutBlock, }; +#[cfg(feature = "stargate")] +use crate::ibc::{ + IbcChannel, IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcEndpoint, IbcOrder, +}; use crate::math::Uint128; #[cfg(feature = "cosmwasm_1_1")] use crate::query::SupplyResponse; @@ -410,7 +413,7 @@ pub fn mock_ibc_channel_close_confirm( /// Creates a IbcPacketReceiveMsg for testing ibc_packet_receive. You set a few key parameters that are /// often parsed. If you want to set more, use this as a default and mutate other fields -#[cfg(feature = "stargate")] +#[cfg(feature = "ibc3")] pub fn mock_ibc_packet_recv( my_channel_id: &str, data: &impl Serialize, @@ -441,7 +444,7 @@ pub fn mock_ibc_packet_recv( /// Creates a IbcPacket for testing ibc_packet_{ack,timeout}. You set a few key parameters that are /// often parsed. If you want to set more, use this as a default and mutate other fields. /// The difference from mock_ibc_packet_recv is if `my_channel_id` is src or dest. -#[cfg(feature = "stargate")] +#[cfg(feature = "ibc3")] fn mock_ibc_packet(my_channel_id: &str, data: &impl Serialize) -> StdResult { Ok(IbcPacket { data: to_json_binary(data)?, @@ -465,7 +468,7 @@ fn mock_ibc_packet(my_channel_id: &str, data: &impl Serialize) -> StdResult StdResult { let packet = mock_ibc_packet(my_channel_id, data)?; - Ok(IbcPacketTimeoutMsg::new( - packet, - #[cfg(feature = "ibc3")] - Addr::unchecked("relayer"), - )) + Ok(IbcPacketTimeoutMsg::new(packet, Addr::unchecked("relayer"))) } /// The same type as cosmwasm-std's QuerierResult, but easier to reuse in diff --git a/packages/std/src/testing/mod.rs b/packages/std/src/testing/mod.rs index 14b362ce42..7977061e49 100644 --- a/packages/std/src/testing/mod.rs +++ b/packages/std/src/testing/mod.rs @@ -24,6 +24,8 @@ pub use mock::{ pub use mock::{ mock_ibc_channel, mock_ibc_channel_close_confirm, mock_ibc_channel_close_init, mock_ibc_channel_connect_ack, mock_ibc_channel_connect_confirm, mock_ibc_channel_open_init, - mock_ibc_channel_open_try, mock_ibc_packet_ack, mock_ibc_packet_recv, mock_ibc_packet_timeout, + mock_ibc_channel_open_try, }; +#[cfg(feature = "ibc3")] +pub use mock::{mock_ibc_packet_ack, mock_ibc_packet_recv, mock_ibc_packet_timeout}; pub use shuffle::riffle_shuffle; diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 5828b02102..334c38ded6 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -825,9 +825,11 @@ mod tests { use crate::testing::{ mock_env, mock_info, mock_instance, MockApi, MockQuerier, MockStorage, }; + #[cfg(feature = "ibc3")] + use cosmwasm_std::testing::mock_ibc_packet_timeout; use cosmwasm_std::testing::{ mock_ibc_channel_close_init, mock_ibc_channel_connect_ack, mock_ibc_channel_open_init, - mock_ibc_packet_ack, mock_ibc_packet_recv, mock_ibc_packet_timeout, mock_wasmd_attr, + mock_ibc_packet_ack, mock_ibc_packet_recv, mock_wasmd_attr, }; use cosmwasm_std::{ Empty, Event, IbcAcknowledgement, IbcOrder, Reply, ReplyOn, SubMsgResponse, From 6ac80d49394268ecd8edcd3c43ebb4edbcf9bdad Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 18 Sep 2023 10:48:39 +0200 Subject: [PATCH 0896/2372] Remove ibc3 feature --- contracts/ibc-reflect-send/src/ibc.rs | 17 ++++++++++++----- contracts/ibc-reflect/Cargo.toml | 2 +- docs/USING_COSMWASM_STD.md | 1 - packages/go-gen/Cargo.toml | 2 +- packages/std/Cargo.toml | 5 +---- packages/std/src/exports.rs | 8 ++++---- packages/std/src/ibc.rs | 8 -------- packages/std/src/lib.rs | 1 - packages/std/src/testing/mock.rs | 16 +++++++--------- packages/std/src/testing/mod.rs | 4 +--- packages/vm/Cargo.toml | 2 +- packages/vm/src/calls.rs | 1 - 12 files changed, 28 insertions(+), 39 deletions(-) diff --git a/contracts/ibc-reflect-send/src/ibc.rs b/contracts/ibc-reflect-send/src/ibc.rs index 511a7b1518..0dadfb53fb 100644 --- a/contracts/ibc-reflect-send/src/ibc.rs +++ b/contracts/ibc-reflect-send/src/ibc.rs @@ -1,7 +1,8 @@ use cosmwasm_std::{ - entry_point, from_json, to_json_binary, DepsMut, Env, IbcBasicResponse, IbcChannelCloseMsg, - IbcChannelConnectMsg, IbcChannelOpenMsg, IbcMsg, IbcOrder, IbcPacketAckMsg, - IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, Never, StdError, StdResult, + entry_point, from_json, to_json_binary, DepsMut, Env, Ibc3ChannelOpenResponse, + IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, + IbcChannelOpenResponse, IbcMsg, IbcOrder, IbcPacketAckMsg, IbcPacketReceiveMsg, + IbcPacketTimeoutMsg, IbcReceiveResponse, Never, StdError, StdResult, }; use crate::ibc_msg::{ @@ -17,7 +18,11 @@ pub const PACKET_LIFETIME: u64 = 60 * 60; #[entry_point] /// enforces ordering and versioing constraints -pub fn ibc_channel_open(_deps: DepsMut, _env: Env, msg: IbcChannelOpenMsg) -> StdResult<()> { +pub fn ibc_channel_open( + _deps: DepsMut, + _env: Env, + msg: IbcChannelOpenMsg, +) -> StdResult { let channel = msg.channel(); if channel.order != IbcOrder::Ordered { @@ -37,7 +42,9 @@ pub fn ibc_channel_open(_deps: DepsMut, _env: Env, msg: IbcChannelOpenMsg) -> St } } - Ok(()) + Ok(Some(Ibc3ChannelOpenResponse { + version: IBC_APP_VERSION.to_string(), + })) } #[entry_point] diff --git a/contracts/ibc-reflect/Cargo.toml b/contracts/ibc-reflect/Cargo.toml index ead27d3725..cd16b206e3 100644 --- a/contracts/ibc-reflect/Cargo.toml +++ b/contracts/ibc-reflect/Cargo.toml @@ -33,7 +33,7 @@ backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } -cosmwasm-std = { path = "../../packages/std", features = ["iterator", "ibc3"] } +cosmwasm-std = { path = "../../packages/std", features = ["iterator", "stargate"] } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } diff --git a/docs/USING_COSMWASM_STD.md b/docs/USING_COSMWASM_STD.md index 19a04bdb66..49cf3511d4 100644 --- a/docs/USING_COSMWASM_STD.md +++ b/docs/USING_COSMWASM_STD.md @@ -39,7 +39,6 @@ The libarary comes with the following features: | iterator | x | Storage iterators | | abort | x | A panic handler that aborts the contract execution with a helpful message | | stargate | | Cosmos SDK 0.40+ features and IBC | -| ibc3 | | New fields added in IBC v3 | | staking | | Access to the staking module | | backtraces | | Add backtraces to errors (for unit testing) | | cosmwasm_1_1 | | Features that require CosmWasm 1.1+ on the chain | diff --git a/packages/go-gen/Cargo.toml b/packages/go-gen/Cargo.toml index 12035ed5a0..8e5ef67d65 100644 --- a/packages/go-gen/Cargo.toml +++ b/packages/go-gen/Cargo.toml @@ -9,7 +9,7 @@ publish = false [dependencies] schemars = "0.8.3" -cosmwasm-std = { path = "../std", version = "1.5.0", features = ["cosmwasm_1_4", "staking", "stargate", "ibc3"] } +cosmwasm-std = { path = "../std", version = "1.5.0", features = ["cosmwasm_1_4", "staking", "stargate"] } cosmwasm-schema = { path = "../schema", version = "1.5.0" } anyhow = "1" Inflector = "0.11.4" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index aa3f92219a..2ab60fcb5f 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -9,7 +9,7 @@ license = "Apache-2.0" readme = "README.md" [package.metadata.docs.rs] -features = ["abort", "stargate", "staking", "ibc3", "cosmwasm_1_4"] +features = ["abort", "stargate", "staking", "cosmwasm_1_4"] [features] default = ["iterator", "abort"] @@ -30,9 +30,6 @@ backtraces = [] # stargate enables stargate-dependent messages and queries, like raw protobuf messages # as well as ibc-related functionality stargate = [] -# ibc3 extends ibc messages with ibc-v3 only features. This should only be enabled on contracts -# that require these types. Without this, they get the smaller ibc-v1 API. -ibc3 = ["stargate"] # This feature makes `BankQuery::Supply` available for the contract to call, but requires # the host blockchain to run CosmWasm `1.1.0` or higher. cosmwasm_1_1 = [] diff --git a/packages/std/src/exports.rs b/packages/std/src/exports.rs index 279b9d8bb3..9cbd92fb8e 100644 --- a/packages/std/src/exports.rs +++ b/packages/std/src/exports.rs @@ -15,9 +15,10 @@ use serde::de::DeserializeOwned; use crate::deps::OwnedDeps; #[cfg(feature = "stargate")] use crate::ibc::{ - IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcPacketAckMsg, + IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, }; +use crate::ibc::{IbcChannelOpenMsg, IbcChannelOpenResponse}; use crate::imports::{ExternalApi, ExternalQuerier, ExternalStorage}; use crate::memory::{alloc, consume_region, release_buffer, Region}; #[cfg(feature = "abort")] @@ -528,12 +529,11 @@ where query_fn(deps.as_ref(), env, msg).into() } -#[cfg(feature = "stargate")] fn _do_ibc_channel_open( - contract_fn: &dyn Fn(DepsMut, Env, IbcChannelOpenMsg) -> Result<(), E>, + contract_fn: &dyn Fn(DepsMut, Env, IbcChannelOpenMsg) -> Result, env_ptr: *mut Region, msg_ptr: *mut Region, -) -> ContractResult<()> +) -> ContractResult where Q: CustomQuery, E: ToString, diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 121ba7e262..b9ccbe5dc7 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -5,7 +5,6 @@ use core::cmp::{Ord, Ordering, PartialOrd}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -#[cfg(feature = "ibc3")] use crate::addresses::Addr; use crate::binary::Binary; use crate::coin::Coin; @@ -300,7 +299,6 @@ impl From for IbcChannel { } /// This serializes either as "null" or a JSON object. -#[cfg(feature = "ibc3")] pub type IbcChannelOpenResponse = Option; #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] @@ -402,12 +400,10 @@ impl From for IbcChannel { #[non_exhaustive] pub struct IbcPacketReceiveMsg { pub packet: IbcPacket, - #[cfg(feature = "ibc3")] pub relayer: Addr, } impl IbcPacketReceiveMsg { - #[cfg(feature = "ibc3")] pub fn new(packet: IbcPacket, relayer: Addr) -> Self { Self { packet, relayer } } @@ -419,12 +415,10 @@ impl IbcPacketReceiveMsg { pub struct IbcPacketAckMsg { pub acknowledgement: IbcAcknowledgement, pub original_packet: IbcPacket, - #[cfg(feature = "ibc3")] pub relayer: Addr, } impl IbcPacketAckMsg { - #[cfg(feature = "ibc3")] pub fn new( acknowledgement: IbcAcknowledgement, original_packet: IbcPacket, @@ -443,12 +437,10 @@ impl IbcPacketAckMsg { #[non_exhaustive] pub struct IbcPacketTimeoutMsg { pub packet: IbcPacket, - #[cfg(feature = "ibc3")] pub relayer: Addr, } impl IbcPacketTimeoutMsg { - #[cfg(feature = "ibc3")] pub fn new(packet: IbcPacket, relayer: Addr) -> Self { Self { packet, relayer } } diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 00332fe0db..df60c6debc 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -51,7 +51,6 @@ pub use crate::errors::{ VerificationError, }; pub use crate::hex_binary::HexBinary; -#[cfg(feature = "ibc3")] pub use crate::ibc::IbcChannelOpenResponse; pub use crate::ibc::{ Ibc3ChannelOpenResponse, IbcAcknowledgement, IbcBasicResponse, IbcChannel, IbcChannelCloseMsg, diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 1e13b04b1f..fd9ea4a1d5 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -4,7 +4,7 @@ use core::marker::PhantomData; #[cfg(feature = "cosmwasm_1_3")] use core::ops::Bound; use serde::de::DeserializeOwned; -#[cfg(feature = "ibc3")] +#[cfg(feature = "stargate")] use serde::Serialize; use sha2::{Digest, Sha256}; #[cfg(feature = "cosmwasm_1_3")] @@ -16,7 +16,7 @@ use crate::binary::Binary; use crate::coin::Coin; use crate::deps::OwnedDeps; use crate::errors::{RecoverPubkeyError, StdError, StdResult, SystemError, VerificationError}; -#[cfg(feature = "ibc3")] +#[cfg(feature = "stargate")] use crate::ibc::{ IbcAcknowledgement, IbcPacket, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcTimeoutBlock, @@ -413,7 +413,7 @@ pub fn mock_ibc_channel_close_confirm( /// Creates a IbcPacketReceiveMsg for testing ibc_packet_receive. You set a few key parameters that are /// often parsed. If you want to set more, use this as a default and mutate other fields -#[cfg(feature = "ibc3")] +#[cfg(feature = "stargate")] pub fn mock_ibc_packet_recv( my_channel_id: &str, data: &impl Serialize, @@ -436,7 +436,6 @@ pub fn mock_ibc_packet_recv( } .into(), }, - #[cfg(feature = "ibc3")] Addr::unchecked("relayer"), )) } @@ -444,7 +443,7 @@ pub fn mock_ibc_packet_recv( /// Creates a IbcPacket for testing ibc_packet_{ack,timeout}. You set a few key parameters that are /// often parsed. If you want to set more, use this as a default and mutate other fields. /// The difference from mock_ibc_packet_recv is if `my_channel_id` is src or dest. -#[cfg(feature = "ibc3")] +#[cfg(feature = "stargate")] fn mock_ibc_packet(my_channel_id: &str, data: &impl Serialize) -> StdResult { Ok(IbcPacket { data: to_json_binary(data)?, @@ -468,7 +467,7 @@ fn mock_ibc_packet(my_channel_id: &str, data: &impl Serialize) -> StdResult Date: Fri, 3 Nov 2023 10:08:10 +0100 Subject: [PATCH 0897/2372] Merge imports --- packages/std/src/testing/mock.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index fd9ea4a1d5..2db41403d5 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -18,13 +18,10 @@ use crate::deps::OwnedDeps; use crate::errors::{RecoverPubkeyError, StdError, StdResult, SystemError, VerificationError}; #[cfg(feature = "stargate")] use crate::ibc::{ - IbcAcknowledgement, IbcPacket, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, + IbcAcknowledgement, IbcChannel, IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, + IbcEndpoint, IbcOrder, IbcPacket, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcTimeoutBlock, }; -#[cfg(feature = "stargate")] -use crate::ibc::{ - IbcChannel, IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcEndpoint, IbcOrder, -}; use crate::math::Uint128; #[cfg(feature = "cosmwasm_1_1")] use crate::query::SupplyResponse; From 350879fad30ce3581069d2badf42e653dfb5e331 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 3 Nov 2023 11:54:19 +0100 Subject: [PATCH 0898/2372] Add IbcChannelOpenResponse docs --- packages/std/src/ibc.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index b9ccbe5dc7..ceba3ad015 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -298,7 +298,9 @@ impl From for IbcChannel { } } -/// This serializes either as "null" or a JSON object. +/// This serializes either as `null` or a JSON object. +/// Within the response, a channel version can be specified. +/// If `null` is provided instead, the incoming channel version is accepted. pub type IbcChannelOpenResponse = Option; #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] From 37351f1931234e19da98a4a0e224c0561812d721 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 7 Nov 2023 10:51:57 +0100 Subject: [PATCH 0899/2372] Add changelog and migrating entry --- CHANGELOG.md | 2 ++ MIGRATING.md | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 00f9418771..058d3a6817 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,8 +29,10 @@ and this project adheres to - cosmwasm-std: Make inner values of `CanonicalAddr` and `Binary` private and add constructor for `Binary`. ([#1876]) - cosmwasm-vm: Make inner value of `Size` private and add constructor. ([#1876]) +- cosmwasm-std: Remove old IBC version and make v3 the default. ([#1875]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 +[#1875]: https://github.com/CosmWasm/cosmwasm/pull/1875 [#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 [#1878]: https://github.com/CosmWasm/cosmwasm/pull/1878 [#1879]: https://github.com/CosmWasm/cosmwasm/pull/1879 diff --git a/MIGRATING.md b/MIGRATING.md index f367462f30..30b18953f9 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -19,6 +19,10 @@ major releases of `cosmwasm`. Note that you can also view the # ... ``` + If you were using cosmwasm-std's `ibc3` feature, you can remove it, as it is + the default now. Depending on your usage, you might have to enable the + `stargate` feature instead, since it was previously implied by `ibc3`. + - `ContractInfoResponse::new` now takes all fields of the response as parameters: From c2a8d2ddea7f91e1e11e73aed52d78341a9d9260 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 3 Nov 2023 13:28:01 +0100 Subject: [PATCH 0900/2372] Delete cosmwasm-storage --- Cargo.lock | 8 - packages/storage/Cargo.toml | 20 - packages/storage/README.md | 204 ---------- packages/storage/src/bucket.rs | 474 ---------------------- packages/storage/src/lib.rs | 17 - packages/storage/src/namespace_helpers.rs | 219 ---------- packages/storage/src/prefixed_storage.rs | 196 --------- packages/storage/src/sequence.rs | 81 ---- packages/storage/src/singleton.rs | 316 --------------- packages/storage/src/type_helpers.rs | 89 ---- 10 files changed, 1624 deletions(-) delete mode 100644 packages/storage/Cargo.toml delete mode 100644 packages/storage/README.md delete mode 100644 packages/storage/src/bucket.rs delete mode 100644 packages/storage/src/lib.rs delete mode 100644 packages/storage/src/namespace_helpers.rs delete mode 100644 packages/storage/src/prefixed_storage.rs delete mode 100644 packages/storage/src/sequence.rs delete mode 100644 packages/storage/src/singleton.rs delete mode 100644 packages/storage/src/type_helpers.rs diff --git a/Cargo.lock b/Cargo.lock index 4b5a1f6cd9..25b1026961 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -514,14 +514,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "cosmwasm-storage" -version = "1.5.0" -dependencies = [ - "cosmwasm-std", - "serde", -] - [[package]] name = "cosmwasm-vm" version = "1.5.0" diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml deleted file mode 100644 index 5c38f021d2..0000000000 --- a/packages/storage/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "cosmwasm-storage" -version = "1.5.0" -authors = ["Ethan Frey "] -edition = "2021" -description = "CosmWasm library with useful helpers for Storage patterns" -repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/storage" -license = "Apache-2.0" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[features] -default = ["iterator"] -# This enables iterator functionality, as exposed in cosmwasm-std/iterator -iterator = ["cosmwasm-std/iterator"] - -[dependencies] -# Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.5.0", default-features = false } -serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/storage/README.md b/packages/storage/README.md deleted file mode 100644 index d2bdffb695..0000000000 --- a/packages/storage/README.md +++ /dev/null @@ -1,204 +0,0 @@ -# WARNING: Unmaintained - -This crate is no longer maintained and should not be used anymore. For an -alternative, please check out -[cw-storage-plus](https://crates.io/crates/cw-storage-plus) - -# cosmwasm-storage - -[![cosmwasm-storage on crates.io](https://img.shields.io/crates/v/cosmwasm-storage.svg)](https://crates.io/crates/cosmwasm-storage) - -CosmWasm library with useful helpers for Storage patterns. You can use `Storage` -implementations in `cosmwasm-std`, or rely on these to remove some common -boilerplate. - -## Contents - -- [WARNING: Unmaintained](#warning-unmaintained) -- [cosmwasm-storage](#cosmwasm-storage) - - [Contents](#contents) - - [Prefixed Storage](#prefixed-storage) - - [Typed Storage](#typed-storage) - - [Bucket](#bucket) - - [Singleton](#singleton) - - [License](#license) - -### Prefixed Storage - -One common technique in smart contracts, especially when multiple types of data -are being stored, is to create separate sub-stores with unique prefixes. Thus -instead of directly dealing with storage, we wrap it and put all `Foo` in a -Storage with key `"foo" + id`, and all `Bar` in a Storage with key `"bar" + id`. -This lets us add multiple types of objects without too much cognitive overhead. -Similar separation like Mongo collections or SQL tables. - -Since we have different types for `Storage` and `ReadonlyStorage`, we use two -different constructors: - -```rust -use cosmwasm_std::testing::MockStorage; -use cosmwasm_storage::{prefixed, prefixed_read}; - -let mut store = MockStorage::new(); - -let mut foos = prefixed(b"foo", &mut store); -foos.set(b"one", b"foo"); - -let mut bars = prefixed(b"bar", &mut store); -bars.set(b"one", b"bar"); - -let read_foo = prefixed_read(b"foo", &store); -assert_eq!(b"foo".to_vec(), read_foo.get(b"one").unwrap()); - -let read_bar = prefixed_read(b"bar", &store); -assert_eq!(b"bar".to_vec(), read_bar.get(b"one").unwrap()); -``` - -Please note that only one mutable reference to the underlying store may be valid -at one point. The compiler sees we do not ever use `foos` after constructing -`bars`, so this example is valid. However, if we did use `foos` again at the -bottom, it would properly complain about violating unique mutable reference. - -The takeaway is to create the `PrefixedStorage` objects when needed and not to -hang around to them too long. - -### Typed Storage - -As we divide our storage space into different subspaces or "buckets", we will -quickly notice that each "bucket" works on a unique type. This leads to a lot of -repeated serialization and deserialization boilerplate that can be removed. We -do this by wrapping a `Storage` with a type-aware `TypedStorage` struct that -provides us a higher-level access to the data. - -Note that `TypedStorage` itself does not implement the `Storage` interface, so -when combining with `PrefixStorage`, make sure to wrap the prefix first. - -```rust -use cosmwasm_std::testing::MockStorage; -use cosmwasm_storage::{prefixed, typed}; - -let mut store = MockStorage::new(); -let mut space = prefixed(b"data", &mut store); -let mut bucket = typed::<_, Data>(&mut space); - -// save data -let data = Data { - name: "Maria".to_string(), - age: 42, -}; -bucket.save(b"maria", &data).unwrap(); - -// load it properly -let loaded = bucket.load(b"maria").unwrap(); -assert_eq!(data, loaded); - -// loading empty can return Ok(None) or Err depending on the chosen method: -assert!(bucket.load(b"john").is_err()); -assert_eq!(bucket.may_load(b"john"), Ok(None)); -``` - -Beyond the basic `save`, `load`, and `may_load`, there is a higher-level API -exposed, `update`. `Update` will load the data, apply an operation and save it -again (if the operation was successful). It will also return any error that -occurred, or the final state that was written if successful. - -```rust -let on_birthday = |mut m: Option| match m { - Some(mut d) => { - d.age += 1; - Ok(d) - }, - None => NotFound { kind: "Data" }.fail(), -}; -let output = bucket.update(b"maria", &on_birthday).unwrap(); -let expected = Data { - name: "Maria".to_string(), - age: 43, -}; -assert_eq!(output, expected); -``` - -### Bucket - -Since the above idiom (a subspace for a class of items) is so common and useful, -and there is no easy way to return this from a function (bucket holds a -reference to space, and cannot live longer than the local variable), the two are -often combined into a `Bucket`. A Bucket works just like the example above, -except the creation can be in another function: - -```rust -use cosmwasm_std::StdResult; -use cosmwasm_std::testing::MockStorage; -use cosmwasm_storage::{bucket, Bucket}; - -fn people<'a, S: Storage>(storage: &'a mut S) -> Bucket<'a, S, Data> { - bucket(b"people", storage) -} - -fn do_stuff() -> StdResult<()> { - let mut store = MockStorage::new(); - people(&mut store).save(b"john", &Data{ - name: "John", - age: 314, - })?; - OK(()) -} -``` - -### Singleton - -Singleton is another wrapper around the `TypedStorage` API. There are cases when -we don't need a whole subspace to hold arbitrary key-value lookup for typed -data, but rather a single storage key. The simplest example is some -_configuration_ information for a contract. For example, in the -[name service example](https://github.com/CosmWasm/cosmwasm-examples/tree/master/nameservice), -there is a `Bucket` to look up name to name data, but we also have a `Singleton` -to store global configuration - namely the price of buying a name. - -Please note that in this context, the term "singleton" does not refer to -[the singleton pattern](https://en.wikipedia.org/wiki/Singleton_pattern) but a -container for a single element. - -```rust -use cosmwasm_std::{Coin, coin, StdResult}; -use cosmwasm_std::testing::MockStorage; - -use cosmwasm_storage::{singleton}; - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] -pub struct Config { - pub purchase_price: Option, - pub transfer_price: Option, -} - -fn initialize() -> StdResult<()> { - let mut store = MockStorage::new(); - let config = singleton(&mut store, b"config"); - config.save(&Config{ - purchase_price: Some(coin("5", "FEE")), - transfer_price: None, - })?; - config.update(|mut cfg| { - cfg.transfer_price = Some(coin(2, "FEE")); - Ok(cfg) - })?; - let loaded = config.load()?; - OK(()) -} -``` - -`Singleton` works just like `Bucket`, except the `save`, `load`, `update` -methods don't take a key, and `update` requires the object to already exist, so -the closure takes type `T`, rather than `Option`. (Use `save` to create the -object the first time). For `Buckets`, we often don't know which keys exist, but -`Singleton`s should be initialized when the contract is instantiated. - -Since the heart of much of the smart contract code is simply transformations -upon some stored state, we may be able to just code the state transitions and -let the `TypedStorage` APIs take care of all the boilerplate. - -## License - -This package is part of the cosmwasm repository, licensed under the Apache -License 2.0 (see [NOTICE](https://github.com/CosmWasm/cosmwasm/blob/main/NOTICE) -and [LICENSE](https://github.com/CosmWasm/cosmwasm/blob/main/LICENSE)). diff --git a/packages/storage/src/bucket.rs b/packages/storage/src/bucket.rs deleted file mode 100644 index 81c7a65c33..0000000000 --- a/packages/storage/src/bucket.rs +++ /dev/null @@ -1,474 +0,0 @@ -use serde::{de::DeserializeOwned, ser::Serialize}; -use std::marker::PhantomData; - -use cosmwasm_std::{ - storage_keys::{to_length_prefixed, to_length_prefixed_nested}, - to_json_vec, StdError, StdResult, Storage, -}; -#[cfg(feature = "iterator")] -use cosmwasm_std::{Order, Record}; - -#[cfg(feature = "iterator")] -use crate::namespace_helpers::range_with_prefix; -use crate::namespace_helpers::{get_with_prefix, remove_with_prefix, set_with_prefix}; -#[cfg(feature = "iterator")] -use crate::type_helpers::deserialize_kv; -use crate::type_helpers::{may_deserialize, must_deserialize}; - -/// An alias of Bucket::new for less verbose usage -#[deprecated( - note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." -)] -pub fn bucket<'a, T>(storage: &'a mut dyn Storage, namespace: &[u8]) -> Bucket<'a, T> -where - T: Serialize + DeserializeOwned, -{ - Bucket::new(storage, namespace) -} - -/// An alias of ReadonlyBucket::new for less verbose usage -#[deprecated( - note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." -)] -pub fn bucket_read<'a, T>(storage: &'a dyn Storage, namespace: &[u8]) -> ReadonlyBucket<'a, T> -where - T: Serialize + DeserializeOwned, -{ - ReadonlyBucket::new(storage, namespace) -} - -#[deprecated( - note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." -)] -pub struct Bucket<'a, T> -where - T: Serialize + DeserializeOwned, -{ - storage: &'a mut dyn Storage, - prefix: Vec, - // see https://doc.rust-lang.org/std/marker/struct.PhantomData.html#unused-type-parameters for why this is needed - data: PhantomData, -} - -impl<'a, T> Bucket<'a, T> -where - T: Serialize + DeserializeOwned, -{ - pub fn new(storage: &'a mut dyn Storage, namespace: &[u8]) -> Self { - Bucket { - storage, - prefix: to_length_prefixed(namespace), - data: PhantomData, - } - } - - pub fn multilevel(storage: &'a mut dyn Storage, namespaces: &[&[u8]]) -> Self { - Bucket { - storage, - prefix: to_length_prefixed_nested(namespaces), - data: PhantomData, - } - } - - /// save will serialize the model and store, returns an error on serialization issues - pub fn save(&mut self, key: &[u8], data: &T) -> StdResult<()> { - set_with_prefix(self.storage, &self.prefix, key, &to_json_vec(data)?); - Ok(()) - } - - pub fn remove(&mut self, key: &[u8]) { - remove_with_prefix(self.storage, &self.prefix, key) - } - - /// load will return an error if no data is set at the given key, or on parse error - pub fn load(&self, key: &[u8]) -> StdResult { - let value = get_with_prefix(self.storage, &self.prefix, key); - must_deserialize(&value) - } - - /// may_load will parse the data stored at the key if present, returns Ok(None) if no data there. - /// returns an error on issues parsing - pub fn may_load(&self, key: &[u8]) -> StdResult> { - let value = get_with_prefix(self.storage, &self.prefix, key); - may_deserialize(&value) - } - - #[cfg(feature = "iterator")] - pub fn range<'b>( - &'b self, - start: Option<&[u8]>, - end: Option<&[u8]>, - order: Order, - ) -> Box>> + 'b> { - let mapped = range_with_prefix(self.storage, &self.prefix, start, end, order) - .map(deserialize_kv::); - Box::new(mapped) - } - - /// Loads the data, perform the specified action, and store the result - /// in the database. This is shorthand for some common sequences, which may be useful. - /// - /// If the data exists, `action(Some(value))` is called. Otherwise `action(None)` is called. - pub fn update(&mut self, key: &[u8], action: A) -> Result - where - A: FnOnce(Option) -> Result, - E: From, - { - let input = self.may_load(key)?; - let output = action(input)?; - self.save(key, &output)?; - Ok(output) - } -} - -#[deprecated( - note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." -)] -pub struct ReadonlyBucket<'a, T> -where - T: Serialize + DeserializeOwned, -{ - storage: &'a dyn Storage, - prefix: Vec, - // see https://doc.rust-lang.org/std/marker/struct.PhantomData.html#unused-type-parameters for why this is needed - data: PhantomData, -} - -impl<'a, T> ReadonlyBucket<'a, T> -where - T: Serialize + DeserializeOwned, -{ - pub fn new(storage: &'a dyn Storage, namespace: &[u8]) -> Self { - ReadonlyBucket { - storage, - prefix: to_length_prefixed(namespace), - data: PhantomData, - } - } - - pub fn multilevel(storage: &'a dyn Storage, namespaces: &[&[u8]]) -> Self { - ReadonlyBucket { - storage, - prefix: to_length_prefixed_nested(namespaces), - data: PhantomData, - } - } - - /// load will return an error if no data is set at the given key, or on parse error - pub fn load(&self, key: &[u8]) -> StdResult { - let value = get_with_prefix(self.storage, &self.prefix, key); - must_deserialize(&value) - } - - /// may_load will parse the data stored at the key if present, returns Ok(None) if no data there. - /// returns an error on issues parsing - pub fn may_load(&self, key: &[u8]) -> StdResult> { - let value = get_with_prefix(self.storage, &self.prefix, key); - may_deserialize(&value) - } - - #[cfg(feature = "iterator")] - pub fn range<'b>( - &'b self, - start: Option<&[u8]>, - end: Option<&[u8]>, - order: Order, - ) -> Box>> + 'b> { - let mapped = range_with_prefix(self.storage, &self.prefix, start, end, order) - .map(deserialize_kv::); - Box::new(mapped) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use cosmwasm_std::testing::MockStorage; - use cosmwasm_std::StdError; - use serde::{Deserialize, Serialize}; - - #[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] - struct Data { - pub name: String, - pub age: i32, - } - - #[test] - fn store_and_load() { - let mut store = MockStorage::new(); - let mut bucket = bucket::(&mut store, b"data"); - - // save data - let data = Data { - name: "Maria".to_string(), - age: 42, - }; - bucket.save(b"maria", &data).unwrap(); - - // load it properly - let loaded = bucket.load(b"maria").unwrap(); - assert_eq!(data, loaded); - } - - #[test] - fn remove_works() { - let mut store = MockStorage::new(); - let mut bucket = bucket::(&mut store, b"data"); - - // save data - let data = Data { - name: "Maria".to_string(), - age: 42, - }; - bucket.save(b"maria", &data).unwrap(); - assert_eq!(data, bucket.load(b"maria").unwrap()); - - // deleting random key does nothing - bucket.remove(b"foobar"); - assert_eq!(data, bucket.load(b"maria").unwrap()); - - // deleting maria removes the data - bucket.remove(b"maria"); - assert_eq!(None, bucket.may_load(b"maria").unwrap()); - } - - #[test] - fn readonly_works() { - let mut store = MockStorage::new(); - let mut bucket = bucket::(&mut store, b"data"); - - // save data - let data = Data { - name: "Maria".to_string(), - age: 42, - }; - bucket.save(b"maria", &data).unwrap(); - - let reader = bucket_read::(&store, b"data"); - - // check empty data handling - assert!(reader.load(b"john").is_err()); - assert_eq!(reader.may_load(b"john").unwrap(), None); - - // load it properly - let loaded = reader.load(b"maria").unwrap(); - assert_eq!(data, loaded); - } - - #[test] - fn buckets_isolated() { - let mut store = MockStorage::new(); - let mut bucket1 = bucket::(&mut store, b"data"); - - // save data - let data = Data { - name: "Maria".to_string(), - age: 42, - }; - bucket1.save(b"maria", &data).unwrap(); - - let mut bucket2 = bucket::(&mut store, b"dat"); - - // save data (dat, amaria) vs (data, maria) - let data2 = Data { - name: "Amen".to_string(), - age: 67, - }; - bucket2.save(b"amaria", &data2).unwrap(); - - // load one - let reader = bucket_read::(&store, b"data"); - let loaded = reader.load(b"maria").unwrap(); - assert_eq!(data, loaded); - // no cross load - assert_eq!(None, reader.may_load(b"amaria").unwrap()); - - // load the other - let reader2 = bucket_read::(&store, b"dat"); - let loaded2 = reader2.load(b"amaria").unwrap(); - assert_eq!(data2, loaded2); - // no cross load - assert_eq!(None, reader2.may_load(b"maria").unwrap()); - } - - #[test] - fn update_success() { - let mut store = MockStorage::new(); - let mut bucket = bucket::(&mut store, b"data"); - - // initial data - let init = Data { - name: "Maria".to_string(), - age: 42, - }; - bucket.save(b"maria", &init).unwrap(); - - // it's my birthday - let birthday = |mayd: Option| -> StdResult { - let mut d = mayd.ok_or_else(|| StdError::not_found("Data"))?; - d.age += 1; - Ok(d) - }; - let output = bucket.update(b"maria", birthday).unwrap(); - let expected = Data { - name: "Maria".to_string(), - age: 43, - }; - assert_eq!(output, expected); - - // load it properly - let loaded = bucket.load(b"maria").unwrap(); - assert_eq!(loaded, expected); - } - - #[test] - fn update_can_change_variable_from_outer_scope() { - let mut store = MockStorage::new(); - let mut bucket = bucket::(&mut store, b"data"); - let init = Data { - name: "Maria".to_string(), - age: 42, - }; - bucket.save(b"maria", &init).unwrap(); - - // show we can capture data from the closure - let mut old_age = 0i32; - bucket - .update(b"maria", |mayd: Option| -> StdResult<_> { - let mut d = mayd.ok_or_else(|| StdError::not_found("Data"))?; - old_age = d.age; - d.age += 1; - Ok(d) - }) - .unwrap(); - assert_eq!(old_age, 42); - } - - #[test] - fn update_fails_on_error() { - let mut store = MockStorage::new(); - let mut bucket = bucket::(&mut store, b"data"); - - // initial data - let init = Data { - name: "Maria".to_string(), - age: 42, - }; - bucket.save(b"maria", &init).unwrap(); - - // it's my birthday - let output = bucket.update(b"maria", |_d| { - Err(StdError::generic_err("cuz i feel like it")) - }); - assert!(output.is_err()); - - // load it properly - let loaded = bucket.load(b"maria").unwrap(); - assert_eq!(loaded, init); - } - - #[test] - fn update_supports_custom_error_types() { - #[derive(Debug)] - enum MyError { - Std, - NotFound, - } - - impl From for MyError { - fn from(_original: StdError) -> MyError { - MyError::Std - } - } - - let mut store = MockStorage::new(); - let mut bucket = bucket::(&mut store, b"data"); - - // initial data - let init = Data { - name: "Maria".to_string(), - age: 42, - }; - bucket.save(b"maria", &init).unwrap(); - - // it's my birthday - let res = bucket.update(b"bob", |data| { - if let Some(mut data) = data { - if data.age < 0 { - // Uses Into to convert StdError to MyError - return Err(StdError::generic_err("Current age is negative").into()); - } - if data.age > 10 { - to_json_vec(&data)?; // Uses From to convert StdError to MyError - } - data.age += 1; - Ok(data) - } else { - Err(MyError::NotFound) - } - }); - match res.unwrap_err() { - MyError::NotFound { .. } => {} - err => panic!("Unexpected error: {err:?}"), - } - } - - #[test] - fn update_handles_on_no_data() { - let mut store = MockStorage::new(); - let mut bucket = bucket::(&mut store, b"data"); - - let init_value = Data { - name: "Maria".to_string(), - age: 42, - }; - - // it's my birthday - let output = bucket - .update(b"maria", |d| match d { - Some(_) => Err(StdError::generic_err("Ensure this was empty")), - None => Ok(init_value.clone()), - }) - .unwrap(); - assert_eq!(output, init_value); - - // nothing stored - let loaded = bucket.load(b"maria").unwrap(); - assert_eq!(loaded, init_value); - } - - #[test] - #[cfg(feature = "iterator")] - fn range_over_data() { - let mut store = MockStorage::new(); - let mut bucket = bucket::(&mut store, b"data"); - - let jose = Data { - name: "Jose".to_string(), - age: 42, - }; - let maria = Data { - name: "Maria".to_string(), - age: 27, - }; - - bucket.save(b"maria", &maria).unwrap(); - bucket.save(b"jose", &jose).unwrap(); - - let res_data: StdResult>> = - bucket.range(None, None, Order::Ascending).collect(); - let data = res_data.unwrap(); - assert_eq!(data.len(), 2); - assert_eq!(data[0], (b"jose".to_vec(), jose.clone())); - assert_eq!(data[1], (b"maria".to_vec(), maria.clone())); - - // also works for readonly - let read_bucket = bucket_read::(&store, b"data"); - let res_data: StdResult>> = - read_bucket.range(None, None, Order::Ascending).collect(); - let data = res_data.unwrap(); - assert_eq!(data.len(), 2); - assert_eq!(data[0], (b"jose".to_vec(), jose)); - assert_eq!(data[1], (b"maria".to_vec(), maria)); - } -} diff --git a/packages/storage/src/lib.rs b/packages/storage/src/lib.rs deleted file mode 100644 index 3fd3a37946..0000000000 --- a/packages/storage/src/lib.rs +++ /dev/null @@ -1,17 +0,0 @@ -#![allow(deprecated)] - -mod bucket; -mod namespace_helpers; -mod prefixed_storage; -mod sequence; -mod singleton; -mod type_helpers; - -pub use bucket::{bucket, bucket_read, Bucket, ReadonlyBucket}; -pub use prefixed_storage::{prefixed, prefixed_read, PrefixedStorage, ReadonlyPrefixedStorage}; -pub use sequence::{currval, nextval, sequence}; -pub use singleton::{singleton, singleton_read, ReadonlySingleton, Singleton}; - -// Re-exported for backwads compatibility. -// See https://github.com/CosmWasm/cosmwasm/pull/1676. -pub use cosmwasm_std::storage_keys::{to_length_prefixed, to_length_prefixed_nested}; diff --git a/packages/storage/src/namespace_helpers.rs b/packages/storage/src/namespace_helpers.rs deleted file mode 100644 index 6a24829856..0000000000 --- a/packages/storage/src/namespace_helpers.rs +++ /dev/null @@ -1,219 +0,0 @@ -use cosmwasm_std::Storage; -#[cfg(feature = "iterator")] -use cosmwasm_std::{Order, Record}; - -pub(crate) fn get_with_prefix( - storage: &dyn Storage, - namespace: &[u8], - key: &[u8], -) -> Option> { - storage.get(&concat(namespace, key)) -} - -pub(crate) fn set_with_prefix( - storage: &mut dyn Storage, - namespace: &[u8], - key: &[u8], - value: &[u8], -) { - storage.set(&concat(namespace, key), value); -} - -pub(crate) fn remove_with_prefix(storage: &mut dyn Storage, namespace: &[u8], key: &[u8]) { - storage.remove(&concat(namespace, key)); -} - -#[inline] -fn concat(namespace: &[u8], key: &[u8]) -> Vec { - let mut k = namespace.to_vec(); - k.extend_from_slice(key); - k -} - -#[cfg(feature = "iterator")] -pub(crate) fn range_with_prefix<'a>( - storage: &'a dyn Storage, - namespace: &[u8], - start: Option<&[u8]>, - end: Option<&[u8]>, - order: Order, -) -> Box + 'a> { - // prepare start, end with prefix - let start = match start { - Some(s) => concat(namespace, s), - None => namespace.to_vec(), - }; - let end = match end { - Some(e) => concat(namespace, e), - // end is updating last byte by one - None => namespace_upper_bound(namespace), - }; - - // get iterator from storage - let base_iterator = storage.range(Some(&start), Some(&end), order); - - // make a copy for the closure to handle lifetimes safely - let prefix = namespace.to_vec(); - let mapped = base_iterator.map(move |(k, v)| (trim(&prefix, &k), v)); - Box::new(mapped) -} - -#[cfg(feature = "iterator")] -#[inline] -fn trim(namespace: &[u8], key: &[u8]) -> Vec { - key[namespace.len()..].to_vec() -} - -/// Returns a new vec of same length and last byte incremented by one -/// If last bytes are 255, we handle overflow up the chain. -/// If all bytes are 255, this returns wrong data - but that is never possible as a namespace -#[cfg(feature = "iterator")] -fn namespace_upper_bound(input: &[u8]) -> Vec { - let mut copy = input.to_vec(); - // zero out all trailing 255, increment first that is not such - for i in (0..input.len()).rev() { - if copy[i] == 255 { - copy[i] = 0; - } else { - copy[i] += 1; - break; - } - } - copy -} - -#[cfg(test)] -mod tests { - use super::*; - use cosmwasm_std::{storage_keys::to_length_prefixed, testing::MockStorage}; - - #[test] - fn prefix_get_set() { - let mut storage = MockStorage::new(); - let prefix = to_length_prefixed(b"foo"); - - set_with_prefix(&mut storage, &prefix, b"bar", b"gotcha"); - let rfoo = get_with_prefix(&storage, &prefix, b"bar"); - assert_eq!(rfoo, Some(b"gotcha".to_vec())); - - // no collisions with other prefixes - let other_prefix = to_length_prefixed(b"fo"); - let collision = get_with_prefix(&storage, &other_prefix, b"obar"); - assert_eq!(collision, None); - } - - #[test] - #[cfg(feature = "iterator")] - fn range_works() { - let mut storage = MockStorage::new(); - let prefix = to_length_prefixed(b"foo"); - let other_prefix = to_length_prefixed(b"food"); - - // set some values in this range - set_with_prefix(&mut storage, &prefix, b"bar", b"none"); - set_with_prefix(&mut storage, &prefix, b"snowy", b"day"); - - // set some values outside this range - set_with_prefix(&mut storage, &other_prefix, b"moon", b"buggy"); - - // ensure we get proper result from prefixed_range iterator - let mut iter = range_with_prefix(&storage, &prefix, None, None, Order::Descending); - let first = iter.next().unwrap(); - assert_eq!(first, (b"snowy".to_vec(), b"day".to_vec())); - let second = iter.next().unwrap(); - assert_eq!(second, (b"bar".to_vec(), b"none".to_vec())); - assert!(iter.next().is_none()); - - // ensure we get raw result from base range - let iter = storage.range(None, None, Order::Ascending); - assert_eq!(3, iter.count()); - - // foo comes first - let mut iter = storage.range(None, None, Order::Ascending); - let first = iter.next().unwrap(); - let expected_key = concat(&prefix, b"bar"); - assert_eq!(first, (expected_key, b"none".to_vec())); - } - - #[test] - #[cfg(feature = "iterator")] - fn range_with_prefix_wrapover() { - let mut storage = MockStorage::new(); - // if we don't properly wrap over there will be issues here (note 255+1 is used to calculate end) - let prefix = to_length_prefixed(b"f\xff\xff"); - let other_prefix = to_length_prefixed(b"f\xff\x44"); - - // set some values in this range - set_with_prefix(&mut storage, &prefix, b"bar", b"none"); - set_with_prefix(&mut storage, &prefix, b"snowy", b"day"); - - // set some values outside this range - set_with_prefix(&mut storage, &other_prefix, b"moon", b"buggy"); - - // ensure we get proper result from prefixed_range iterator - let iter = range_with_prefix(&storage, &prefix, None, None, Order::Descending); - let elements: Vec = iter.collect(); - assert_eq!( - elements, - vec![ - (b"snowy".to_vec(), b"day".to_vec()), - (b"bar".to_vec(), b"none".to_vec()), - ] - ); - } - - #[test] - #[cfg(feature = "iterator")] - fn range_with_start_end_set() { - let mut storage = MockStorage::new(); - // if we don't properly wrap over there will be issues here (note 255+1 is used to calculate end) - let prefix = to_length_prefixed(b"f\xff\xff"); - let other_prefix = to_length_prefixed(b"f\xff\x44"); - - // set some values in this range - set_with_prefix(&mut storage, &prefix, b"bar", b"none"); - set_with_prefix(&mut storage, &prefix, b"snowy", b"day"); - - // set some values outside this range - set_with_prefix(&mut storage, &other_prefix, b"moon", b"buggy"); - - // make sure start and end are applied properly - let res: Vec = - range_with_prefix(&storage, &prefix, Some(b"b"), Some(b"c"), Order::Ascending) - .collect(); - assert_eq!(res.len(), 1); - assert_eq!(res[0], (b"bar".to_vec(), b"none".to_vec())); - - // make sure start and end are applied properly - let res_count = range_with_prefix( - &storage, - &prefix, - Some(b"bas"), - Some(b"sno"), - Order::Ascending, - ) - .count(); - assert_eq!(res_count, 0); - - let res: Vec = - range_with_prefix(&storage, &prefix, Some(b"ant"), None, Order::Ascending).collect(); - assert_eq!(res.len(), 2); - assert_eq!(res[0], (b"bar".to_vec(), b"none".to_vec())); - assert_eq!(res[1], (b"snowy".to_vec(), b"day".to_vec())); - } - - #[test] - #[cfg(feature = "iterator")] - fn namespace_upper_bound_works() { - assert_eq!(namespace_upper_bound(b"bob"), b"boc".to_vec()); - assert_eq!(namespace_upper_bound(b"fo\xfe"), b"fo\xff".to_vec()); - assert_eq!(namespace_upper_bound(b"fo\xff"), b"fp\x00".to_vec()); - // multiple \xff roll over - assert_eq!( - namespace_upper_bound(b"fo\xff\xff\xff"), - b"fp\x00\x00\x00".to_vec() - ); - // \xff not at the end are ignored - assert_eq!(namespace_upper_bound(b"\xffabc"), b"\xffabd".to_vec()); - } -} diff --git a/packages/storage/src/prefixed_storage.rs b/packages/storage/src/prefixed_storage.rs deleted file mode 100644 index 97f5bb63a5..0000000000 --- a/packages/storage/src/prefixed_storage.rs +++ /dev/null @@ -1,196 +0,0 @@ -use cosmwasm_std::{ - storage_keys::{to_length_prefixed, to_length_prefixed_nested}, - Storage, -}; -#[cfg(feature = "iterator")] -use cosmwasm_std::{Order, Record}; - -#[cfg(feature = "iterator")] -use crate::namespace_helpers::range_with_prefix; -use crate::namespace_helpers::{get_with_prefix, remove_with_prefix, set_with_prefix}; - -/// An alias of PrefixedStorage::new for less verbose usage -#[deprecated( - note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." -)] -pub fn prefixed<'a>(storage: &'a mut dyn Storage, namespace: &[u8]) -> PrefixedStorage<'a> { - PrefixedStorage::new(storage, namespace) -} - -/// An alias of ReadonlyPrefixedStorage::new for less verbose usage -#[deprecated( - note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." -)] -pub fn prefixed_read<'a>( - storage: &'a dyn Storage, - namespace: &[u8], -) -> ReadonlyPrefixedStorage<'a> { - ReadonlyPrefixedStorage::new(storage, namespace) -} - -#[deprecated( - note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." -)] -pub struct PrefixedStorage<'a> { - storage: &'a mut dyn Storage, - prefix: Vec, -} - -impl<'a> PrefixedStorage<'a> { - pub fn new(storage: &'a mut dyn Storage, namespace: &[u8]) -> Self { - PrefixedStorage { - storage, - prefix: to_length_prefixed(namespace), - } - } - - // Nested namespaces as documented in - // https://github.com/webmaster128/key-namespacing#nesting - pub fn multilevel(storage: &'a mut dyn Storage, namespaces: &[&[u8]]) -> Self { - PrefixedStorage { - storage, - prefix: to_length_prefixed_nested(namespaces), - } - } -} - -impl<'a> Storage for PrefixedStorage<'a> { - fn get(&self, key: &[u8]) -> Option> { - get_with_prefix(self.storage, &self.prefix, key) - } - - fn set(&mut self, key: &[u8], value: &[u8]) { - set_with_prefix(self.storage, &self.prefix, key, value); - } - - fn remove(&mut self, key: &[u8]) { - remove_with_prefix(self.storage, &self.prefix, key); - } - - #[cfg(feature = "iterator")] - /// range allows iteration over a set of keys, either forwards or backwards - /// uses standard rust range notation, and eg db.range(b"foo"..b"bar") also works reverse - fn range<'b>( - &'b self, - start: Option<&[u8]>, - end: Option<&[u8]>, - order: Order, - ) -> Box + 'b> { - range_with_prefix(self.storage, &self.prefix, start, end, order) - } -} - -#[deprecated( - note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." -)] -pub struct ReadonlyPrefixedStorage<'a> { - storage: &'a dyn Storage, - prefix: Vec, -} - -impl<'a> ReadonlyPrefixedStorage<'a> { - pub fn new(storage: &'a dyn Storage, namespace: &[u8]) -> Self { - ReadonlyPrefixedStorage { - storage, - prefix: to_length_prefixed(namespace), - } - } - - // Nested namespaces as documented in - // https://github.com/webmaster128/key-namespacing#nesting - pub fn multilevel(storage: &'a dyn Storage, namespaces: &[&[u8]]) -> Self { - ReadonlyPrefixedStorage { - storage, - prefix: to_length_prefixed_nested(namespaces), - } - } -} - -impl<'a> Storage for ReadonlyPrefixedStorage<'a> { - fn get(&self, key: &[u8]) -> Option> { - get_with_prefix(self.storage, &self.prefix, key) - } - - fn set(&mut self, _key: &[u8], _value: &[u8]) { - unimplemented!(); - } - - fn remove(&mut self, _key: &[u8]) { - unimplemented!(); - } - - #[cfg(feature = "iterator")] - /// range allows iteration over a set of keys, either forwards or backwards - fn range<'b>( - &'b self, - start: Option<&[u8]>, - end: Option<&[u8]>, - order: Order, - ) -> Box + 'b> { - range_with_prefix(self.storage, &self.prefix, start, end, order) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use cosmwasm_std::testing::MockStorage; - - #[test] - fn prefixed_storage_set_and_get() { - let mut storage = MockStorage::new(); - - // set - let mut s1 = PrefixedStorage::new(&mut storage, b"foo"); - s1.set(b"bar", b"gotcha"); - assert_eq!(storage.get(b"\x00\x03foobar").unwrap(), b"gotcha".to_vec()); - - // get - let s2 = PrefixedStorage::new(&mut storage, b"foo"); - assert_eq!(s2.get(b"bar"), Some(b"gotcha".to_vec())); - assert_eq!(s2.get(b"elsewhere"), None); - } - - #[test] - fn prefixed_storage_multilevel_set_and_get() { - let mut storage = MockStorage::new(); - - // set - let mut bar = PrefixedStorage::multilevel(&mut storage, &[b"foo", b"bar"]); - bar.set(b"baz", b"winner"); - assert_eq!( - storage.get(b"\x00\x03foo\x00\x03barbaz").unwrap(), - b"winner".to_vec() - ); - - // get - let bar = PrefixedStorage::multilevel(&mut storage, &[b"foo", b"bar"]); - assert_eq!(bar.get(b"baz"), Some(b"winner".to_vec())); - assert_eq!(bar.get(b"elsewhere"), None); - } - - #[test] - fn readonly_prefixed_storage_get() { - let mut storage = MockStorage::new(); - storage.set(b"\x00\x03foobar", b"gotcha"); - - // try readonly correctly - let s1 = ReadonlyPrefixedStorage::new(&storage, b"foo"); - assert_eq!(s1.get(b"bar"), Some(b"gotcha".to_vec())); - assert_eq!(s1.get(b"elsewhere"), None); - - // no collisions with other prefixes - let s2 = ReadonlyPrefixedStorage::new(&storage, b"fo"); - assert_eq!(s2.get(b"obar"), None); - } - - #[test] - fn readonly_prefixed_storage_multilevel_get() { - let mut storage = MockStorage::new(); - storage.set(b"\x00\x03foo\x00\x03barbaz", b"winner"); - - let bar = ReadonlyPrefixedStorage::multilevel(&storage, &[b"foo", b"bar"]); - assert_eq!(bar.get(b"baz"), Some(b"winner".to_vec())); - assert_eq!(bar.get(b"elsewhere"), None); - } -} diff --git a/packages/storage/src/sequence.rs b/packages/storage/src/sequence.rs deleted file mode 100644 index 6d953f79c5..0000000000 --- a/packages/storage/src/sequence.rs +++ /dev/null @@ -1,81 +0,0 @@ -use cosmwasm_std::{StdResult, Storage}; - -use crate::Singleton; - -/// Sequence creates a custom Singleton to hold an empty sequence -#[deprecated( - note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." -)] -pub fn sequence<'a>(storage: &'a mut dyn Storage, key: &[u8]) -> Singleton<'a, u64> { - Singleton::new(storage, key) -} - -/// currval returns the last value returned by nextval. If the sequence has never been used, -/// then it will return 0. -#[deprecated( - note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." -)] -pub fn currval(seq: &Singleton) -> StdResult { - Ok(seq.may_load()?.unwrap_or_default()) -} - -/// nextval increments the counter by 1 and returns the new value. -/// On the first time it is called (no sequence info in db) it will return 1. -#[deprecated( - note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." -)] -pub fn nextval(seq: &mut Singleton) -> StdResult { - let val = currval(seq)? + 1; - seq.save(&val)?; - Ok(val) -} - -#[cfg(test)] -mod tests { - use super::*; - use cosmwasm_std::testing::MockStorage; - - #[test] - fn walk_through_sequence() { - let mut store = MockStorage::new(); - let mut seq = sequence(&mut store, b"seq"); - - assert_eq!(currval(&seq).unwrap(), 0); - assert_eq!(nextval(&mut seq).unwrap(), 1); - assert_eq!(nextval(&mut seq).unwrap(), 2); - assert_eq!(nextval(&mut seq).unwrap(), 3); - assert_eq!(currval(&seq).unwrap(), 3); - assert_eq!(currval(&seq).unwrap(), 3); - } - - #[test] - fn sequences_independent() { - let mut store = MockStorage::new(); - - let mut seq = sequence(&mut store, b"seq"); - assert_eq!(nextval(&mut seq).unwrap(), 1); - assert_eq!(nextval(&mut seq).unwrap(), 2); - assert_eq!(nextval(&mut seq).unwrap(), 3); - - let mut seq2 = sequence(&mut store, b"seq2"); - assert_eq!(nextval(&mut seq2).unwrap(), 1); - assert_eq!(nextval(&mut seq2).unwrap(), 2); - - let mut seq3 = sequence(&mut store, b"seq"); - assert_eq!(nextval(&mut seq3).unwrap(), 4); - } - - #[test] - fn set_sequence() { - let mut store = MockStorage::new(); - let mut seq = sequence(&mut store, b"seq"); - - assert_eq!(nextval(&mut seq).unwrap(), 1); - assert_eq!(nextval(&mut seq).unwrap(), 2); - - seq.save(&20).unwrap(); - - assert_eq!(currval(&seq).unwrap(), 20); - assert_eq!(nextval(&mut seq).unwrap(), 21); - } -} diff --git a/packages/storage/src/singleton.rs b/packages/storage/src/singleton.rs deleted file mode 100644 index 5afa576e77..0000000000 --- a/packages/storage/src/singleton.rs +++ /dev/null @@ -1,316 +0,0 @@ -use serde::{de::DeserializeOwned, ser::Serialize}; -use std::marker::PhantomData; - -use cosmwasm_std::{storage_keys::to_length_prefixed, to_json_vec, StdError, StdResult, Storage}; - -use crate::type_helpers::{may_deserialize, must_deserialize}; - -/// An alias of Singleton::new for less verbose usage -#[deprecated( - note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." -)] -pub fn singleton<'a, T>(storage: &'a mut dyn Storage, key: &[u8]) -> Singleton<'a, T> -where - T: Serialize + DeserializeOwned, -{ - Singleton::new(storage, key) -} - -/// An alias of ReadonlySingleton::new for less verbose usage -#[deprecated( - note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." -)] -pub fn singleton_read<'a, T>(storage: &'a dyn Storage, key: &[u8]) -> ReadonlySingleton<'a, T> -where - T: Serialize + DeserializeOwned, -{ - ReadonlySingleton::new(storage, key) -} - -/// Singleton effectively combines PrefixedStorage with TypedStorage to -/// work on a single storage key. It performs the to_length_prefixed transformation -/// on the given name to ensure no collisions, and then provides the standard -/// TypedStorage accessors, without requiring a key (which is defined in the constructor) -#[deprecated( - note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." -)] -pub struct Singleton<'a, T> -where - T: Serialize + DeserializeOwned, -{ - storage: &'a mut dyn Storage, - key: Vec, - // see https://doc.rust-lang.org/std/marker/struct.PhantomData.html#unused-type-parameters for why this is needed - data: PhantomData, -} - -impl<'a, T> Singleton<'a, T> -where - T: Serialize + DeserializeOwned, -{ - pub fn new(storage: &'a mut dyn Storage, key: &[u8]) -> Self { - Singleton { - storage, - key: to_length_prefixed(key), - data: PhantomData, - } - } - - /// save will serialize the model and store, returns an error on serialization issues - pub fn save(&mut self, data: &T) -> StdResult<()> { - self.storage.set(&self.key, &to_json_vec(data)?); - Ok(()) - } - - pub fn remove(&mut self) { - self.storage.remove(&self.key) - } - - /// load will return an error if no data is set at the given key, or on parse error - pub fn load(&self) -> StdResult { - let value = self.storage.get(&self.key); - must_deserialize(&value) - } - - /// may_load will parse the data stored at the key if present, returns Ok(None) if no data there. - /// returns an error on issues parsing - pub fn may_load(&self) -> StdResult> { - let value = self.storage.get(&self.key); - may_deserialize(&value) - } - - /// update will load the data, perform the specified action, and store the result - /// in the database. This is shorthand for some common sequences, which may be useful - /// - /// This is the least stable of the APIs, and definitely needs some usage - pub fn update(&mut self, action: A) -> Result - where - A: FnOnce(T) -> Result, - E: From, - { - let input = self.load()?; - let output = action(input)?; - self.save(&output)?; - Ok(output) - } -} - -/// ReadonlySingleton only requires a Storage and exposes only the -/// methods of Singleton that don't modify state. -#[deprecated( - note = "The crate cosmwasm-storage is unmaintained and will be removed in CosmWasm 2.0. Please consider migrating to cw-storage-plus or simple cosmwasm-std storage calls." -)] -pub struct ReadonlySingleton<'a, T> -where - T: Serialize + DeserializeOwned, -{ - storage: &'a dyn Storage, - key: Vec, - // see https://doc.rust-lang.org/std/marker/struct.PhantomData.html#unused-type-parameters for why this is needed - data: PhantomData, -} - -impl<'a, T> ReadonlySingleton<'a, T> -where - T: Serialize + DeserializeOwned, -{ - pub fn new(storage: &'a dyn Storage, key: &[u8]) -> Self { - ReadonlySingleton { - storage, - key: to_length_prefixed(key), - data: PhantomData, - } - } - - /// load will return an error if no data is set at the given key, or on parse error - pub fn load(&self) -> StdResult { - let value = self.storage.get(&self.key); - must_deserialize(&value) - } - - /// may_load will parse the data stored at the key if present, returns Ok(None) if no data there. - /// returns an error on issues parsing - pub fn may_load(&self) -> StdResult> { - let value = self.storage.get(&self.key); - may_deserialize(&value) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use cosmwasm_std::testing::MockStorage; - use serde::{Deserialize, Serialize}; - - use cosmwasm_std::{OverflowError, OverflowOperation, StdError}; - - #[derive(Serialize, Deserialize, PartialEq, Debug)] - struct Config { - pub owner: String, - pub max_tokens: i32, - } - - #[test] - fn save_and_load() { - let mut store = MockStorage::new(); - let mut single = Singleton::::new(&mut store, b"config"); - - assert!(single.load().is_err()); - assert_eq!(single.may_load().unwrap(), None); - - let cfg = Config { - owner: "admin".to_string(), - max_tokens: 1234, - }; - single.save(&cfg).unwrap(); - - assert_eq!(cfg, single.load().unwrap()); - } - - #[test] - fn remove_works() { - let mut store = MockStorage::new(); - let mut single = Singleton::::new(&mut store, b"config"); - - // store data - let cfg = Config { - owner: "admin".to_string(), - max_tokens: 1234, - }; - single.save(&cfg).unwrap(); - assert_eq!(cfg, single.load().unwrap()); - - // remove it and loads None - single.remove(); - assert_eq!(None, single.may_load().unwrap()); - - // safe to remove 2 times - single.remove(); - assert_eq!(None, single.may_load().unwrap()); - } - - #[test] - fn isolated_reads() { - let mut store = MockStorage::new(); - let mut writer = singleton::(&mut store, b"config"); - - let cfg = Config { - owner: "admin".to_string(), - max_tokens: 1234, - }; - writer.save(&cfg).unwrap(); - - let reader = singleton_read::(&store, b"config"); - assert_eq!(cfg, reader.load().unwrap()); - - let other_reader = singleton_read::(&store, b"config2"); - assert_eq!(other_reader.may_load().unwrap(), None); - } - - #[test] - fn update_success() { - let mut store = MockStorage::new(); - let mut writer = singleton::(&mut store, b"config"); - - let cfg = Config { - owner: "admin".to_string(), - max_tokens: 1234, - }; - writer.save(&cfg).unwrap(); - - let output = writer.update(|mut c| -> StdResult<_> { - c.max_tokens *= 2; - Ok(c) - }); - let expected = Config { - owner: "admin".to_string(), - max_tokens: 2468, - }; - assert_eq!(output.unwrap(), expected); - assert_eq!(writer.load().unwrap(), expected); - } - - #[test] - fn update_can_change_variable_from_outer_scope() { - let mut store = MockStorage::new(); - let mut writer = singleton::(&mut store, b"config"); - let cfg = Config { - owner: "admin".to_string(), - max_tokens: 1234, - }; - writer.save(&cfg).unwrap(); - - let mut old_max_tokens = 0i32; - writer - .update(|mut c| -> StdResult<_> { - old_max_tokens = c.max_tokens; - c.max_tokens *= 2; - Ok(c) - }) - .unwrap(); - assert_eq!(old_max_tokens, 1234); - } - - #[test] - fn update_does_not_change_data_on_error() { - let mut store = MockStorage::new(); - let mut writer = singleton::(&mut store, b"config"); - - let cfg = Config { - owner: "admin".to_string(), - max_tokens: 1234, - }; - writer.save(&cfg).unwrap(); - - let output = - writer.update(|_c| Err(StdError::from(OverflowError::new(OverflowOperation::Sub)))); - match output.unwrap_err() { - StdError::Overflow { .. } => {} - err => panic!("Unexpected error: {err:?}"), - } - assert_eq!(writer.load().unwrap(), cfg); - } - - #[test] - fn update_supports_custom_errors() { - #[derive(Debug)] - enum MyError { - Std(StdError), - Foo, - } - - impl From for MyError { - fn from(original: StdError) -> MyError { - MyError::Std(original) - } - } - - let mut store = MockStorage::new(); - let mut writer = singleton::(&mut store, b"config"); - - let cfg = Config { - owner: "admin".to_string(), - max_tokens: 1234, - }; - writer.save(&cfg).unwrap(); - - let res = writer.update(|mut c| { - if c.max_tokens > 5000 { - return Err(MyError::Foo); - } - if c.max_tokens > 20 { - return Err(StdError::generic_err("broken stuff").into()); // Uses Into to convert StdError to MyError - } - if c.max_tokens > 10 { - to_json_vec(&c)?; // Uses From to convert StdError to MyError - } - c.max_tokens += 20; - Ok(c) - }); - match res.unwrap_err() { - MyError::Std(StdError::GenericErr { .. }) => {} - err => panic!("Unexpected error: {err:?}"), - } - assert_eq!(writer.load().unwrap(), cfg); - } -} diff --git a/packages/storage/src/type_helpers.rs b/packages/storage/src/type_helpers.rs deleted file mode 100644 index 98855de1bc..0000000000 --- a/packages/storage/src/type_helpers.rs +++ /dev/null @@ -1,89 +0,0 @@ -use serde::de::DeserializeOwned; -use std::any::type_name; - -#[cfg(feature = "iterator")] -use cosmwasm_std::Record; -use cosmwasm_std::{from_slice, StdError, StdResult}; - -/// may_deserialize parses json bytes from storage (Option), returning Ok(None) if no data present -/// -/// value is an odd type, but this is meant to be easy to use with output from storage.get (Option>) -/// and value.map(|s| s.as_slice()) seems trickier than &value -pub(crate) fn may_deserialize( - value: &Option>, -) -> StdResult> { - match value { - Some(data) => Ok(Some(from_slice(data)?)), - None => Ok(None), - } -} - -/// must_deserialize parses json bytes from storage (Option), returning NotFound error if no data present -pub(crate) fn must_deserialize(value: &Option>) -> StdResult { - match value { - Some(data) => from_slice(data), - None => Err(StdError::not_found(type_name::())), - } -} - -#[cfg(feature = "iterator")] -pub(crate) fn deserialize_kv(kv: Record>) -> StdResult> { - let (k, v) = kv; - let t = from_slice::(&v)?; - Ok((k, t)) -} - -#[cfg(test)] -mod tests { - use super::*; - use cosmwasm_std::{to_json_vec, StdError}; - use serde::{Deserialize, Serialize}; - - #[derive(Serialize, Deserialize, PartialEq, Debug)] - struct Person { - pub name: String, - pub age: i32, - } - - #[test] - fn may_deserialize_handles_some() { - let person = Person { - name: "Maria".to_string(), - age: 42, - }; - let value = to_json_vec(&person).unwrap(); - - let may_parse: Option = may_deserialize(&Some(value)).unwrap(); - assert_eq!(may_parse, Some(person)); - } - - #[test] - fn may_deserialize_handles_none() { - let may_parse = may_deserialize::(&None).unwrap(); - assert_eq!(may_parse, None); - } - - #[test] - fn must_deserialize_handles_some() { - let person = Person { - name: "Maria".to_string(), - age: 42, - }; - let value = to_json_vec(&person).unwrap(); - let loaded = Some(value); - - let parsed: Person = must_deserialize(&loaded).unwrap(); - assert_eq!(parsed, person); - } - - #[test] - fn must_deserialize_handles_none() { - let parsed = must_deserialize::(&None); - match parsed.unwrap_err() { - StdError::NotFound { kind, .. } => { - assert_eq!(kind, "cosmwasm_storage::type_helpers::tests::Person") - } - e => panic!("Unexpected error {e}"), - } - } -} From 1dcbfd15f4361a2056fd4b1b9c874f0527878ff5 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 3 Nov 2023 13:32:06 +0100 Subject: [PATCH 0901/2372] Remove storage from devtools and CI --- .circleci/config.yml | 44 ------------------------------------- .mergify.yml | 1 - codecov.yml | 3 --- devtools/check_workspace.sh | 1 - devtools/clean.sh | 1 - devtools/deadlinks.py | 1 - devtools/test_workspace.sh | 1 - 7 files changed, 52 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 38ee07c097..31a018aa70 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -52,7 +52,6 @@ workflows: - package_schema - package_schema_derive - package_std - - package_storage - package_vm - package_vm_windows - contract_burner @@ -373,37 +372,6 @@ jobs: - target/debug/deps key: cargocache-v2-package_std-rust:1.70.0-{{ checksum "Cargo.lock" }} - package_storage: - docker: - - image: rust:1.70.0 - steps: - - checkout - - run: - name: Version information - command: rustc --version; cargo --version; rustup --version; rustup target list --installed - - restore_cache: - keys: - - cargocache-v2-package_storage-rust:1.70.0-{{ checksum "Cargo.lock" }} - - run: - name: Build library for native target - working_directory: ~/project/packages/storage - command: cargo build --locked - - run: - name: Run unit tests - working_directory: ~/project/packages/storage - command: cargo test --locked - - run: - name: Run unit tests (with iterator support) - working_directory: ~/project/packages/storage - command: cargo test --locked --features iterator - - save_cache: - paths: - - /usr/local/cargo/registry - - target/debug/.fingerprint - - target/debug/build - - target/debug/deps - key: cargocache-v2-package_storage-rust:1.70.0-{{ checksum "Cargo.lock" }} - package_vm: docker: - image: rust:1.70.0 @@ -908,14 +876,6 @@ jobs: name: Clippy linting on std (all feature flags) working_directory: ~/project/packages/std command: cargo clippy --all-targets --features abort,iterator,staking,stargate,cosmwasm_1_4 -- -D warnings - - run: - name: Clippy linting on storage (no feature flags) - working_directory: ~/project/packages/storage - command: cargo clippy --all-targets -- -D warnings - - run: - name: Clippy linting on storage (all feature flags) - working_directory: ~/project/packages/storage - command: cargo clippy --all-targets --features iterator -- -D warnings - run: name: Clippy linting on vm (no feature flags) working_directory: ~/project/packages/vm @@ -986,7 +946,6 @@ jobs: grcov . -s packages/derive --binary-path ./target/debug -t lcov -o ./reports/derive.info grcov . -s packages/schema --binary-path ./target/debug -t lcov -o ./reports/schema.info grcov . -s packages/std --binary-path ./target/debug -t lcov -o ./reports/std.info - grcov . -s packages/storage --binary-path ./target/debug -t lcov -o ./reports/storage.info grcov . -s packages/vm --binary-path ./target/debug -t lcov -o ./reports/vm.info environment: RUSTFLAGS: "-Cinstrument-coverage" @@ -1003,9 +962,6 @@ jobs: - codecov/upload: file: reports/std.info flags: cosmwasm-std - - codecov/upload: - file: reports/storage.info - flags: cosmwasm-storage - codecov/upload: file: reports/vm.info flags: cosmwasm-vm diff --git a/.mergify.yml b/.mergify.yml index 4bb3f061d8..4895cfe743 100644 --- a/.mergify.yml +++ b/.mergify.yml @@ -36,7 +36,6 @@ pull_request_rules: - "status-success=ci/circleci: package_schema" - "status-success=ci/circleci: package_schema_derive" - "status-success=ci/circleci: package_std" - - "status-success=ci/circleci: package_storage" - "status-success=ci/circleci: package_vm" - "status-success=ci/circleci: package_vm_windows" actions: diff --git a/codecov.yml b/codecov.yml index b1de3c37b8..036e3b781d 100644 --- a/codecov.yml +++ b/codecov.yml @@ -30,6 +30,3 @@ flags: cosmwasm-std: paths: - packages/std/ - cosmwasm-storage: - paths: - - packages/storage/ diff --git a/devtools/check_workspace.sh b/devtools/check_workspace.sh index 1747d316d6..76f8d387d6 100755 --- a/devtools/check_workspace.sh +++ b/devtools/check_workspace.sh @@ -15,7 +15,6 @@ cargo fmt cargo wasm-debug --features iterator,staking,stargate cargo clippy --all-targets --features iterator,staking,stargate -- -D warnings ) -(cd packages/storage && cargo build && cargo clippy --all-targets --features iterator -- -D warnings) (cd packages/schema && cargo build && cargo clippy --all-targets -- -D warnings) (cd packages/schema-derive && cargo build && cargo clippy --all-targets -- -D warnings) (cd packages/vm && cargo build --features iterator,stargate && cargo clippy --all-targets --features iterator,stargate -- -D warnings) diff --git a/devtools/clean.sh b/devtools/clean.sh index 616c7846ad..ad30e74210 100755 --- a/devtools/clean.sh +++ b/devtools/clean.sh @@ -4,6 +4,5 @@ command -v shellcheck >/dev/null && shellcheck "$0" (cd packages/std && cargo clean) (cd packages/crypto && cargo clean) -(cd packages/storage && cargo clean) (cd packages/schema && cargo clean) (cd packages/vm && cargo clean) diff --git a/devtools/deadlinks.py b/devtools/deadlinks.py index 79d3cc81f3..9dee04a9a8 100755 --- a/devtools/deadlinks.py +++ b/devtools/deadlinks.py @@ -72,7 +72,6 @@ def check_project(project): "cosmwasm_derive", "cosmwasm_schema", "cosmwasm_std", - "cosmwasm_storage", "cosmwasm_vm" ] diff --git a/devtools/test_workspace.sh b/devtools/test_workspace.sh index 5ade3f183f..0303753549 100755 --- a/devtools/test_workspace.sh +++ b/devtools/test_workspace.sh @@ -5,7 +5,6 @@ command -v shellcheck >/dev/null && shellcheck "$0" cargo fmt (cd packages/crypto && cargo test) (cd packages/std && cargo test --features iterator,cosmwasm_1_2) -(cd packages/storage && cargo test --features iterator) (cd packages/schema && cargo test) (cd packages/schema-derive && cargo test) (cd packages/vm && cargo test --features iterator,stargate) From e7cd96539aee0fa1c99b46c0fcc5995d1cec3a3c Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 3 Nov 2023 16:21:02 +0100 Subject: [PATCH 0902/2372] Remove cosmwasm-storage from README --- README.md | 41 ++++++++++++++++++----------------------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 7536c89f59..50904c6fb4 100644 --- a/README.md +++ b/README.md @@ -8,15 +8,19 @@ The following packages are maintained here: -| Crate | Usage | Download | Docs | Coverage | -| ---------------- | -------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | -------------------------------------------------- | -| cosmwasm-crypto | Internal only | [![cosmwasm-crypto on crates.io](https://img.shields.io/crates/v/cosmwasm-crypto.svg)](https://crates.io/crates/cosmwasm-crypto) | [![Docs](https://docs.rs/cosmwasm-crypto/badge.svg)](https://docs.rs/cosmwasm-crypto) | [![Coverage][cov-badge-crypto]][cov-link-crypto] | -| cosmwasm-derive | Internal only | [![cosmwasm-derive on crates.io](https://img.shields.io/crates/v/cosmwasm-derive.svg)](https://crates.io/crates/cosmwasm-derive) | [![Docs](https://docs.rs/cosmwasm-derive/badge.svg)](https://docs.rs/cosmwasm-derive) | [![Coverage][cov-badge-derive]][cov-link-derive] | -| cosmwasm-schema | Contract development | [![cosmwasm-schema on crates.io](https://img.shields.io/crates/v/cosmwasm-schema.svg)](https://crates.io/crates/cosmwasm-schema) | [![Docs](https://docs.rs/cosmwasm-schema/badge.svg)](https://docs.rs/cosmwasm-schema) | [![Coverage][cov-badge-schema]][cov-link-schema] | -| cosmwasm-std | Contract development | [![cosmwasm-std on crates.io](https://img.shields.io/crates/v/cosmwasm-std.svg)](https://crates.io/crates/cosmwasm-std) | [![Docs](https://docs.rs/cosmwasm-std/badge.svg)](https://docs.rs/cosmwasm-std) | [![Coverage][cov-badge-std]][cov-link-std] | -| cosmwasm-storage | Contract development | [![cosmwasm-storage on crates.io](https://img.shields.io/crates/v/cosmwasm-storage.svg)](https://crates.io/crates/cosmwasm-storage) | [![Docs](https://docs.rs/cosmwasm-storage/badge.svg)](https://docs.rs/cosmwasm-storage) | [![Coverage][cov-badge-storage]][cov-link-storage] | -| cosmwasm-vm | Host environments | [![cosmwasm-vm on crates.io](https://img.shields.io/crates/v/cosmwasm-vm.svg)](https://crates.io/crates/cosmwasm-vm) | [![Docs](https://docs.rs/cosmwasm-vm/badge.svg)](https://docs.rs/cosmwasm-vm) | ([#1151]) | -| cosmwasm-check | Contract development | [![cosmwasm-check on crates.io](https://img.shields.io/crates/v/cosmwasm-check.svg)](https://crates.io/crates/cosmwasm-check) | `cosmwasm-check -h` | N/A | +| Crate | Usage | Download | Docs | Coverage | +| --------------- | -------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------ | +| cosmwasm-crypto | Internal only | [![cosmwasm-crypto on crates.io](https://img.shields.io/crates/v/cosmwasm-crypto.svg)](https://crates.io/crates/cosmwasm-crypto) | [![Docs](https://docs.rs/cosmwasm-crypto/badge.svg)](https://docs.rs/cosmwasm-crypto) | [![Coverage][cov-badge-crypto]][cov-link-crypto] | +| cosmwasm-derive | Internal only | [![cosmwasm-derive on crates.io](https://img.shields.io/crates/v/cosmwasm-derive.svg)](https://crates.io/crates/cosmwasm-derive) | [![Docs](https://docs.rs/cosmwasm-derive/badge.svg)](https://docs.rs/cosmwasm-derive) | [![Coverage][cov-badge-derive]][cov-link-derive] | +| cosmwasm-schema | Contract development | [![cosmwasm-schema on crates.io](https://img.shields.io/crates/v/cosmwasm-schema.svg)](https://crates.io/crates/cosmwasm-schema) | [![Docs](https://docs.rs/cosmwasm-schema/badge.svg)](https://docs.rs/cosmwasm-schema) | [![Coverage][cov-badge-schema]][cov-link-schema] | +| cosmwasm-std | Contract development | [![cosmwasm-std on crates.io](https://img.shields.io/crates/v/cosmwasm-std.svg)](https://crates.io/crates/cosmwasm-std) | [![Docs](https://docs.rs/cosmwasm-std/badge.svg)](https://docs.rs/cosmwasm-std) | [![Coverage][cov-badge-std]][cov-link-std] | +| cosmwasm-vm | Host environments | [![cosmwasm-vm on crates.io](https://img.shields.io/crates/v/cosmwasm-vm.svg)](https://crates.io/crates/cosmwasm-vm) | [![Docs](https://docs.rs/cosmwasm-vm/badge.svg)](https://docs.rs/cosmwasm-vm) | [![Coverage][cov-badge-vm]][cov-link-vm] | +| cosmwasm-check | Contract development | [![cosmwasm-check on crates.io](https://img.shields.io/crates/v/cosmwasm-check.svg)](https://crates.io/crates/cosmwasm-check) | `cosmwasm-check -h` | N/A | + +We used to maintain +[cosmwasm-storage](https://crates.io/crates/cosmwasm-storage) here too, but it +is no longer maintained and has been dropped in favor of +[cw-storage-plus](https://github.com/CosmWasm/cw-storage-plus). [cov-badge-crypto]: https://codecov.io/gh/CosmWasm/cosmwasm/branch/main/graph/badge.svg?flag=cosmwasm-crypto @@ -26,8 +30,8 @@ The following packages are maintained here: https://codecov.io/gh/CosmWasm/cosmwasm/branch/main/graph/badge.svg?flag=cosmwasm-schema [cov-badge-std]: https://codecov.io/gh/CosmWasm/cosmwasm/branch/main/graph/badge.svg?flag=cosmwasm-std -[cov-badge-storage]: - https://codecov.io/gh/CosmWasm/cosmwasm/branch/main/graph/badge.svg?flag=cosmwasm-storage +[cov-badge-vm]: + https://codecov.io/gh/CosmWasm/cosmwasm/branch/main/graph/badge.svg?flag=cosmwasm-vm [cov-link-crypto]: https://codecov.io/gh/CosmWasm/cosmwasm/tree/main/packages/crypto [cov-link-derive]: @@ -35,9 +39,7 @@ The following packages are maintained here: [cov-link-schema]: https://codecov.io/gh/CosmWasm/cosmwasm/tree/main/packages/schema [cov-link-std]: https://codecov.io/gh/CosmWasm/cosmwasm/tree/main/packages/std -[cov-link-storage]: - https://codecov.io/gh/CosmWasm/cosmwasm/tree/main/packages/storage -[#1151]: https://github.com/CosmWasm/cosmwasm/issues/1151 +[cov-link-vm]: https://codecov.io/gh/CosmWasm/cosmwasm/tree/main/packages/vm ## Overview @@ -51,17 +53,10 @@ This code is compiled into Wasm bytecode as part of the smart contract. - [cosmwasm-std](https://github.com/CosmWasm/cosmwasm/tree/main/packages/std) - A crate in this workspace. Provides the bindings and all imports needed to build a smart contract. -- [cosmwasm-storage](https://github.com/CosmWasm/cosmwasm/tree/main/packages/storage) - - A crate in this workspace. This optional addition to `cosmwasm-std` includes - convenience helpers for interacting with storage. **This is being deprecated - in favor of - [`cw-storage-plus`](https://github.com/CosmWasm/cw-storage-plus).** See - [issue #1457](https://github.com/CosmWasm/cosmwasm/issues/1457). - [cw-storage-plus](https://github.com/CosmWasm/cw-storage-plus) - A crate which - fills the same role as `cosmwasm-storage`, but with much more powerful types + provides convenience helpers for interacting with storage with powerful types supporting composite primary keys, secondary indexes, automatic snapshotting, - and more. This is used in most modern contracts and likely going to be - stabilized (version `1.0.0`) soon. + and more. This is used in most modern contracts. **Building contracts:** From 26c1acef2b0cf16403d60f13441f025b7273645c Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 6 Nov 2023 15:20:34 +0100 Subject: [PATCH 0903/2372] Improve readme wording --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 50904c6fb4..3964683bb2 100644 --- a/README.md +++ b/README.md @@ -17,9 +17,8 @@ The following packages are maintained here: | cosmwasm-vm | Host environments | [![cosmwasm-vm on crates.io](https://img.shields.io/crates/v/cosmwasm-vm.svg)](https://crates.io/crates/cosmwasm-vm) | [![Docs](https://docs.rs/cosmwasm-vm/badge.svg)](https://docs.rs/cosmwasm-vm) | [![Coverage][cov-badge-vm]][cov-link-vm] | | cosmwasm-check | Contract development | [![cosmwasm-check on crates.io](https://img.shields.io/crates/v/cosmwasm-check.svg)](https://crates.io/crates/cosmwasm-check) | `cosmwasm-check -h` | N/A | -We used to maintain -[cosmwasm-storage](https://crates.io/crates/cosmwasm-storage) here too, but it -is no longer maintained and has been dropped in favor of +[cosmwasm-storage](https://crates.io/crates/cosmwasm-storage) is no longer +maintained and has been dropped in favor of [cw-storage-plus](https://github.com/CosmWasm/cw-storage-plus). [cov-badge-crypto]: From 536e8786448bf4fef4f2ed4719f754c9d389d08f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 7 Nov 2023 11:54:27 +0100 Subject: [PATCH 0904/2372] Add changelog entry --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 058d3a6817..1138f101fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,13 @@ and this project adheres to [#1902]: https://github.com/CosmWasm/cosmwasm/pull/1902 [#1929]: https://github.com/CosmWasm/cosmwasm/pull/1929 +### Removed + +- cosmwasm-storage: Removed, use [cw-storage-plus] instead. ([#1936]) + +[cw-storage-plus]: https://github.com/CosmWasm/cw-storage-plus +[#1936]: https://github.com/CosmWasm/cosmwasm/pull/1936 + ## [1.5.0] - 2023-10-31 ### Added From 7831a8810cad5840d75923099461c32cb2008a59 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 7 Nov 2023 12:11:55 +0100 Subject: [PATCH 0905/2372] Split changelog sections --- CHANGELOG.md | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1138f101fd..0fc1973267 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,15 +6,20 @@ and this project adheres to ## [Unreleased] +### Added + +- cosmwasm-std: Add `SubMsg:reply_never` constructor ([#1929]) +- cosmwasm-std: Add optional memo field to `IbcMsg::Transfer`. ([#1878]) + +[#1878]: https://github.com/CosmWasm/cosmwasm/pull/1878 +[#1929]: https://github.com/CosmWasm/cosmwasm/pull/1929 + ### Changed - cosmwasm-std: Replace `ContractInfoResponse::new` with new (unstable) constructor, remove `SubMsgExecutionResponse` (Use `SubMsgResponse` instead) and remove `PartialEq<&str> for Addr` (validate the address and use `PartialEq for Addr` instead). ([#1879]) -- cosmwasm-std: Remove `Mul for Uint128` and - `Mul for Uint256`. Use `Uint{128,256}::mul_floor` instead. - ([#1890]) - cosmwasm-std: `Uint{64,128}::full_mul` now take `Into` as an argument. ([#1874]) - cosmwasm-vm: Make `CacheOptions` non-exhaustive and add a constructor. @@ -22,31 +27,30 @@ and this project adheres to - cosmwasm-std: `Coin::new` now takes `Into` instead of `u128` as the first argument and `DecCoin::new` takes `Into` instead of `Decimal256`. ([#1902]) -- cosmwasm-std: Remove operand strings from `OverflowError`, - `ConversionOverflowError` and `DivideByZeroError`. ([#1896]) -- cosmwasm-std: Add `SubMsg:reply_never` constructor ([#1929]) -- cosmwasm-std: Add optional memo field to `IbcMsg::Transfer`. ([#1878]) - cosmwasm-std: Make inner values of `CanonicalAddr` and `Binary` private and add constructor for `Binary`. ([#1876]) - cosmwasm-vm: Make inner value of `Size` private and add constructor. ([#1876]) -- cosmwasm-std: Remove old IBC version and make v3 the default. ([#1875]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 -[#1875]: https://github.com/CosmWasm/cosmwasm/pull/1875 [#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 -[#1878]: https://github.com/CosmWasm/cosmwasm/pull/1878 [#1879]: https://github.com/CosmWasm/cosmwasm/pull/1879 -[#1890]: https://github.com/CosmWasm/cosmwasm/pull/1890 -[#1896]: https://github.com/CosmWasm/cosmwasm/pull/1896 [#1898]: https://github.com/CosmWasm/cosmwasm/pull/1898 [#1902]: https://github.com/CosmWasm/cosmwasm/pull/1902 -[#1929]: https://github.com/CosmWasm/cosmwasm/pull/1929 ### Removed +- cosmwasm-std: Remove `Mul for Uint128` and + `Mul for Uint256`. Use `Uint{128,256}::mul_floor` instead. + ([#1890]) +- cosmwasm-std: Remove operand strings from `OverflowError`, + `ConversionOverflowError` and `DivideByZeroError`. ([#1896]) +- cosmwasm-std: Remove old IBC version and make v3 the default. ([#1875]) - cosmwasm-storage: Removed, use [cw-storage-plus] instead. ([#1936]) [cw-storage-plus]: https://github.com/CosmWasm/cw-storage-plus +[#1875]: https://github.com/CosmWasm/cosmwasm/pull/1875 +[#1890]: https://github.com/CosmWasm/cosmwasm/pull/1890 +[#1896]: https://github.com/CosmWasm/cosmwasm/pull/1896 [#1936]: https://github.com/CosmWasm/cosmwasm/pull/1936 ## [1.5.0] - 2023-10-31 From 102e2536bfcec7f3674a3da74284e9b429799177 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 21 Sep 2023 13:06:41 +0200 Subject: [PATCH 0906/2372] Reduce gas by factor 1000 --- docs/GAS.md | 16 ++++++++-------- packages/vm/src/wasm_backend/engine.rs | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/GAS.md b/docs/GAS.md index 73eb260345..a78dd66013 100644 --- a/docs/GAS.md +++ b/docs/GAS.md @@ -18,7 +18,7 @@ while ago and can be adjusted when necessary. ## CosmWasm gas pricing -For CosmWasm gas, the target gas consumption is 1 Teragas (10^12 gas) per +For CosmWasm gas, the target gas consumption is 1 Gigagas (10^12 gas) per millisecond. This idea is [inspired by NEAR][neargas] and we encourage you to read their excellent docs on that topic. @@ -26,7 +26,7 @@ In order to meet this target, we execute Argon2 in a test contract ([#1120]). This is a CPU and memory intense job that does not call out into the host. At a constant gas cost per operation of 1 (pre CosmWasm 1.0), this consumed 96837752 gas and took 15ms on our CI system. The ideal cost per operation for this system -is `10**12 / (96837752 / 15)`: 154898. This is rounded to 150000 for simplicity. +is `10**9 / (96837752 / 15)`: 154. This is rounded to 150 for simplicity. Each machine is different, we know that. But the above target helps us in multiple ways: @@ -45,14 +45,14 @@ multiple ways: ## Gas overflow potential -CosmWasm gas aims for 1 Teragas/millisecond, i.e. the uint64 range exceeds after -18 million seconds (5 hours)1. Assuming a max supported block +CosmWasm gas aims for 1 Gigagas/millisecond, i.e. the uint64 range exceeds after +18 million seconds (5000 hours)1. Assuming a max supported block execution time of 30 seconds, the gas price has to be over-priced by a factor of -614 (614 Teragas/millisecond) in order to exceed the uint64 range2. +614891 (614891 Gigagas/millisecond) in order to exceed the uint64 range2. Since serious over or underpricing is considered a bug, using uint64 for gas measurements is considered safe. -Cosmos SDK gas uses values that are smaller by a factor of 150_000, so those +Cosmos SDK gas uses values that are smaller by a factor of 150, so those don't overflow as well. Since no Cosmos SDK gas values are processed inside of this repository, this is not our main concern. However, it's good to know that we can safely pass them in uint64 fields, as long as the full range is @@ -62,6 +62,6 @@ their JSON implementation. Go and Rust do that while many other implementations don't support integers, and convert them to IEEE-754 doubles, which has a safe integer range up to about 53 bit (e.g. JavaScript and jq). -1 Python3: `(2**64-1)/1000 / 10**12` +1 Python3: `(2**64-1)/1000 / 10**9` -2 Python3: `((2**64-1)/1000/30) / 10**122` +2 Python3: `((2**64-1)/1000/30) / 10**9` diff --git a/packages/vm/src/wasm_backend/engine.rs b/packages/vm/src/wasm_backend/engine.rs index b5b67e660a..cd0a03f026 100644 --- a/packages/vm/src/wasm_backend/engine.rs +++ b/packages/vm/src/wasm_backend/engine.rs @@ -22,12 +22,12 @@ const MAX_WASM_PAGES: u32 = 65536; fn cost(_operator: &Operator) -> u64 { // A flat fee for each operation - // The target is 1 Teragas per millisecond (see GAS.md). + // The target is 1 Gigagas per millisecond (see GAS.md). // // In https://github.com/CosmWasm/cosmwasm/pull/1042 a profiler is developed to // identify runtime differences between different Wasm operation, but this is not yet // precise enough to derive insights from it. - 150_000 + 150 } /// Creates an engine without a compiler. From 534d1c4cb12c2aecfcc9e92437c04f69ddd24c73 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 21 Sep 2023 13:07:29 +0200 Subject: [PATCH 0907/2372] Reduce test gas values --- contracts/cyberpunk/tests/integration.rs | 10 +++++----- contracts/hackatom/tests/integration.rs | 4 ++-- contracts/queue/tests/integration.rs | 2 +- docs/GAS.md | 14 +++++++------- packages/vm/benches/main.rs | 4 ++-- packages/vm/examples/multi_threaded_cache.rs | 2 +- packages/vm/src/cache.rs | 2 +- packages/vm/src/environment.rs | 11 +++++------ packages/vm/src/imports.rs | 2 +- packages/vm/src/instance.rs | 12 ++++++------ packages/vm/src/modules/file_system_cache.rs | 2 +- packages/vm/src/modules/in_memory_cache.rs | 2 +- packages/vm/src/modules/pinned_memory_cache.rs | 2 +- packages/vm/src/testing/instance.rs | 2 +- packages/vm/src/testing/mock.rs | 2 +- packages/vm/src/wasm_backend/engine.rs | 2 +- 16 files changed, 37 insertions(+), 38 deletions(-) diff --git a/contracts/cyberpunk/tests/integration.rs b/contracts/cyberpunk/tests/integration.rs index 539a53eb2a..da39c22e25 100644 --- a/contracts/cyberpunk/tests/integration.rs +++ b/contracts/cyberpunk/tests/integration.rs @@ -31,7 +31,7 @@ static WASM: &[u8] = include_bytes!("../target/wasm32-unknown-unknown/release/cy #[test] fn execute_argon2() { - let mut deps = mock_instance_with_gas_limit(WASM, 100_000_000_000_000); + let mut deps = mock_instance_with_gas_limit(WASM, 100_000_000_000); let init_info = mock_info("admin", &[]); let init_res: Response = instantiate(&mut deps, mock_env(), init_info, Empty {}).unwrap(); @@ -51,7 +51,7 @@ fn execute_argon2() { let gas_used = gas_before - deps.get_gas_left(); // Note: the exact gas usage depends on the Rust version used to compile Wasm, // which we only fix when using rust-optimizer, not integration tests. - let expected = 8635688250000; // +/- 20% + let expected = 8635688250; // +/- 20% assert!(gas_used > expected * 80 / 100, "Gas used: {gas_used}"); assert!(gas_used < expected * 120 / 100, "Gas used: {gas_used}"); } @@ -60,7 +60,7 @@ fn execute_argon2() { // cargo integration-test debug_works -- --nocapture #[test] fn debug_works() { - let mut deps = mock_instance_with_gas_limit(WASM, 100_000_000_000_000); + let mut deps = mock_instance_with_gas_limit(WASM, 100_000_000_000); let _res: Response = instantiate(&mut deps, mock_env(), mock_info("admin", &[]), Empty {}).unwrap(); @@ -89,7 +89,7 @@ fn debug_works() { // cargo integration-test debug_timing -- --nocapture #[test] fn debug_timing() { - let mut deps = mock_instance_with_gas_limit(WASM, 100_000_000_000_000); + let mut deps = mock_instance_with_gas_limit(WASM, 100_000_000_000); let _res: Response = instantiate(&mut deps, mock_env(), mock_info("admin", &[]), Empty {}).unwrap(); @@ -115,7 +115,7 @@ fn debug_timing() { #[test] fn debug_file() { - let mut deps = mock_instance_with_gas_limit(WASM, 100_000_000_000_000); + let mut deps = mock_instance_with_gas_limit(WASM, 100_000_000_000); let _res: Response = instantiate(&mut deps, mock_env(), mock_info("admin", &[]), Empty {}).unwrap(); diff --git a/contracts/hackatom/tests/integration.rs b/contracts/hackatom/tests/integration.rs index 890309ffd6..1a73fe88f3 100644 --- a/contracts/hackatom/tests/integration.rs +++ b/contracts/hackatom/tests/integration.rs @@ -405,7 +405,7 @@ fn execute_allocate_large_memory() { // Gas consumption is relatively small // Note: the exact gas usage depends on the Rust version used to compile Wasm, // which we only fix when using rust-optimizer, not integration tests. - assert_approx_eq!(gas_used, 4413600000, "0.2"); + assert_approx_eq!(gas_used, 4413600, "0.2"); let used = deps.memory_pages(); assert_eq!(used, pages_before + 48, "Memory used: {used} pages"); pages_before += 48; @@ -424,7 +424,7 @@ fn execute_allocate_large_memory() { // Gas consumption is relatively small // Note: the exact gas usage depends on the Rust version used to compile Wasm, // which we only fix when using rust-optimizer, not integration tests. - let expected = 4859700000; // +/- 20% + let expected = 4859700; // +/- 20% assert!(gas_used > expected * 80 / 100, "Gas used: {gas_used}"); assert!(gas_used < expected * 120 / 100, "Gas used: {gas_used}"); let used = deps.memory_pages(); diff --git a/contracts/queue/tests/integration.rs b/contracts/queue/tests/integration.rs index b0a86ae1d5..c791881e44 100644 --- a/contracts/queue/tests/integration.rs +++ b/contracts/queue/tests/integration.rs @@ -36,7 +36,7 @@ static WASM: &[u8] = include_bytes!("../target/wasm32-unknown-unknown/release/qu /// Instantiates a contract with no elements fn create_contract() -> (Instance, MessageInfo) { - let gas_limit = 1_000_000_000_000; // ~1ms, enough for many executions within one instance + let gas_limit = 1_000_000_000; // ~1ms, enough for many executions within one instance let mut deps = mock_instance_with_gas_limit(WASM, gas_limit); let creator = String::from("creator"); let info = mock_info(&creator, &[]); diff --git a/docs/GAS.md b/docs/GAS.md index a78dd66013..83cd6827e2 100644 --- a/docs/GAS.md +++ b/docs/GAS.md @@ -18,15 +18,15 @@ while ago and can be adjusted when necessary. ## CosmWasm gas pricing -For CosmWasm gas, the target gas consumption is 1 Gigagas (10^12 gas) per -millisecond. This idea is [inspired by NEAR][neargas] and we encourage you to +For CosmWasm gas, the target gas consumption is 1 Teragas (10^12 gas) per +second. This idea is [inspired by NEAR][neargas] and we encourage you to read their excellent docs on that topic. In order to meet this target, we execute Argon2 in a test contract ([#1120]). This is a CPU and memory intense job that does not call out into the host. At a constant gas cost per operation of 1 (pre CosmWasm 1.0), this consumed 96837752 gas and took 15ms on our CI system. The ideal cost per operation for this system -is `10**9 / (96837752 / 15)`: 154. This is rounded to 150 for simplicity. +is `10**12 / (96837752 / (15 / 1000))`: 154. This is rounded to 150 for simplicity. Each machine is different, we know that. But the above target helps us in multiple ways: @@ -45,10 +45,10 @@ multiple ways: ## Gas overflow potential -CosmWasm gas aims for 1 Gigagas/millisecond, i.e. the uint64 range exceeds after +CosmWasm gas aims for 1 Teragas/second, i.e. the uint64 range exceeds after 18 million seconds (5000 hours)1. Assuming a max supported block execution time of 30 seconds, the gas price has to be over-priced by a factor of -614891 (614891 Gigagas/millisecond) in order to exceed the uint64 range2. +614891 (614891 Teragas/second) in order to exceed the uint64 range2. Since serious over or underpricing is considered a bug, using uint64 for gas measurements is considered safe. @@ -62,6 +62,6 @@ their JSON implementation. Go and Rust do that while many other implementations don't support integers, and convert them to IEEE-754 doubles, which has a safe integer range up to about 53 bit (e.g. JavaScript and jq). -1 Python3: `(2**64-1)/1000 / 10**9` +1 Python3: `(2**64-1) / 10**12` -2 Python3: `((2**64-1)/1000/30) / 10**9` +2 Python3: `((2**64-1)/30) / 10**12` diff --git a/packages/vm/benches/main.rs b/packages/vm/benches/main.rs index 16ce2c23cd..7bdd75ad51 100644 --- a/packages/vm/benches/main.rs +++ b/packages/vm/benches/main.rs @@ -17,12 +17,12 @@ use cosmwasm_vm::{ // Instance const DEFAULT_MEMORY_LIMIT: Size = Size::mebi(64); -const DEFAULT_GAS_LIMIT: u64 = 1_000_000_000_000; // ~1ms +const DEFAULT_GAS_LIMIT: u64 = 1_000_000_000; // ~1ms const DEFAULT_INSTANCE_OPTIONS: InstanceOptions = InstanceOptions { gas_limit: DEFAULT_GAS_LIMIT, print_debug: false, }; -const HIGH_GAS_LIMIT: u64 = 20_000_000_000_000_000; // ~20s, allows many calls on one instance +const HIGH_GAS_LIMIT: u64 = 20_000_000_000_000; // ~20s, allows many calls on one instance // Cache const MEMORY_CACHE_SIZE: Size = Size::mebi(200); diff --git a/packages/vm/examples/multi_threaded_cache.rs b/packages/vm/examples/multi_threaded_cache.rs index 0b42e0dd9c..1cc5b98131 100644 --- a/packages/vm/examples/multi_threaded_cache.rs +++ b/packages/vm/examples/multi_threaded_cache.rs @@ -11,7 +11,7 @@ use cosmwasm_vm::{ // Instance const DEFAULT_MEMORY_LIMIT: Size = Size::mebi(64); -const DEFAULT_GAS_LIMIT: u64 = 400_000 * 150_000; +const DEFAULT_GAS_LIMIT: u64 = 400_000 * 150; const DEFAULT_INSTANCE_OPTIONS: InstanceOptions = InstanceOptions { gas_limit: DEFAULT_GAS_LIMIT, print_debug: false, diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 1014e7dd21..b4d1d9ea8e 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -528,7 +528,7 @@ mod tests { use std::io::Write; use tempfile::TempDir; - const TESTING_GAS_LIMIT: u64 = 500_000_000_000; // ~0.5ms + const TESTING_GAS_LIMIT: u64 = 500_000_000; // ~0.5ms const TESTING_MEMORY_LIMIT: Size = Size::mebi(16); const TESTING_OPTIONS: InstanceOptions = InstanceOptions { gas_limit: TESTING_GAS_LIMIT, diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index d6a974cb05..d6ec187719 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -1,5 +1,5 @@ //! Internal details to be used by instance.rs only -use std::borrow::{Borrow, BorrowMut}; +use std::borrow::BorrowMut; use std::cell::RefCell; use std::marker::PhantomData; use std::ptr::NonNull; @@ -45,8 +45,8 @@ pub struct GasConfig { impl Default for GasConfig { fn default() -> Self { - // Target is 10^12 per millisecond (see GAS.md), i.e. 10^9 gas per µ second. - const GAS_PER_US: u64 = 1_000_000_000; + // Target is 10^9 per millisecond (see GAS.md), i.e. 10^6 gas per µ second. + const GAS_PER_US: u64 = 1_000_000; Self { // ~154 us in crypto benchmarks secp256k1_verify_cost: 154 * GAS_PER_US, @@ -169,8 +169,7 @@ impl Environment { C: FnOnce(&ContextData) -> R, { let guard = self.data.as_ref().read().unwrap(); - let context_data = guard.borrow(); - callback(context_data) + callback(&guard) } pub fn with_gas_state(&self, callback: C) -> R @@ -469,7 +468,7 @@ mod tests { const INIT_AMOUNT: u128 = 500; const INIT_DENOM: &str = "TOKEN"; - const TESTING_GAS_LIMIT: u64 = 500_000_000_000; // ~0.5ms + const TESTING_GAS_LIMIT: u64 = 500_000_000; // ~0.5ms const DEFAULT_QUERY_GAS_LIMIT: u64 = 300_000; const TESTING_MEMORY_LIMIT: Option = Some(Size::mebi(16)); diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index f27a2750fc..745b87f2e8 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -643,7 +643,7 @@ mod tests { const INIT_AMOUNT: u128 = 500; const INIT_DENOM: &str = "TOKEN"; - const TESTING_GAS_LIMIT: u64 = 500_000_000_000; // ~0.5ms + const TESTING_GAS_LIMIT: u64 = 500_000_000; // ~0.5ms const TESTING_MEMORY_LIMIT: Option = Some(Size::mebi(16)); const ECDSA_HASH_HEX: &str = "5ae8317d34d1e595e3fa7247db80c0af4320cce1116de187f8f7e2e099c0d8d0"; diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index c4be57cdbc..b400731de8 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -535,7 +535,7 @@ mod tests { #[test] fn set_debug_handler_and_unset_debug_handler_work() { - const LIMIT: u64 = 70_000_000_000_000; + const LIMIT: u64 = 70_000_000_000; let mut instance = mock_instance_with_gas_limit(CYBERPUNK, LIMIT); // init contract @@ -868,7 +868,7 @@ mod tests { #[test] fn create_gas_report_works() { - const LIMIT: u64 = 700_000_000_000; + const LIMIT: u64 = 700_000_000; let mut instance = mock_instance_with_gas_limit(CONTRACT, LIMIT); let report1 = instance.create_gas_report(); @@ -886,7 +886,7 @@ mod tests { let report2 = instance.create_gas_report(); assert_eq!(report2.used_externally, 73); - assert_eq!(report2.used_internally, 5764950198); + assert_eq!(report2.used_internally, 5765148); assert_eq!(report2.limit, LIMIT); assert_eq!( report2.remaining, @@ -1075,7 +1075,7 @@ mod tests { .unwrap(); let init_used = orig_gas - instance.get_gas_left(); - assert_eq!(init_used, 5764950271); + assert_eq!(init_used, 5765221); } #[test] @@ -1098,7 +1098,7 @@ mod tests { .unwrap(); let execute_used = gas_before_execute - instance.get_gas_left(); - assert_eq!(execute_used, 8548903606); + assert_eq!(execute_used, 8652406); } #[test] @@ -1132,6 +1132,6 @@ mod tests { assert_eq!(answer.as_slice(), b"{\"verifier\":\"verifies\"}"); let query_used = gas_before_query - instance.get_gas_left(); - assert_eq!(query_used, 4493700006); + assert_eq!(query_used, 4493706); } } diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 9008c038b5..58cac91b73 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -232,7 +232,7 @@ mod tests { use wasmer_middlewares::metering::set_remaining_points; const TESTING_MEMORY_LIMIT: Option = Some(Size::mebi(16)); - const TESTING_GAS_LIMIT: u64 = 500_000_000; + const TESTING_GAS_LIMIT: u64 = 500_000; const SOME_WAT: &str = r#"(module (type $t0 (func (param i32) (result i32))) diff --git a/packages/vm/src/modules/in_memory_cache.rs b/packages/vm/src/modules/in_memory_cache.rs index a61ece8c01..5b2eec52d5 100644 --- a/packages/vm/src/modules/in_memory_cache.rs +++ b/packages/vm/src/modules/in_memory_cache.rs @@ -113,7 +113,7 @@ mod tests { use wasmer_middlewares::metering::set_remaining_points; const TESTING_MEMORY_LIMIT: Option = Some(Size::mebi(16)); - const TESTING_GAS_LIMIT: u64 = 500_000_000; + const TESTING_GAS_LIMIT: u64 = 500_000; // Based on `examples/module_size.sh` const TESTING_WASM_SIZE_FACTOR: usize = 18; diff --git a/packages/vm/src/modules/pinned_memory_cache.rs b/packages/vm/src/modules/pinned_memory_cache.rs index f8fe048694..6177013b98 100644 --- a/packages/vm/src/modules/pinned_memory_cache.rs +++ b/packages/vm/src/modules/pinned_memory_cache.rs @@ -81,7 +81,7 @@ mod tests { use wasmer_middlewares::metering::set_remaining_points; const TESTING_MEMORY_LIMIT: Option = Some(Size::mebi(16)); - const TESTING_GAS_LIMIT: u64 = 500_000_000; + const TESTING_GAS_LIMIT: u64 = 500_000; #[test] fn pinned_memory_cache_run() { diff --git a/packages/vm/src/testing/instance.rs b/packages/vm/src/testing/instance.rs index ce1ba84c07..bf5c200a95 100644 --- a/packages/vm/src/testing/instance.rs +++ b/packages/vm/src/testing/instance.rs @@ -17,7 +17,7 @@ use super::storage::MockStorage; /// This gas limit is used in integration tests and should be high enough to allow a reasonable /// number of contract executions and queries on one instance. For this reason it is significatly /// higher than the limit for a single execution that we have in the production setup. -const DEFAULT_GAS_LIMIT: u64 = 500_000_000_000; // ~0.5ms +const DEFAULT_GAS_LIMIT: u64 = 500_000_000; // ~0.5ms const DEFAULT_MEMORY_LIMIT: Option = Some(Size::mebi(16)); const DEFAULT_PRINT_DEBUG: bool = true; diff --git a/packages/vm/src/testing/mock.rs b/packages/vm/src/testing/mock.rs index 15c7942eb3..d0edca6e41 100644 --- a/packages/vm/src/testing/mock.rs +++ b/packages/vm/src/testing/mock.rs @@ -8,7 +8,7 @@ use super::storage::MockStorage; use crate::{Backend, BackendApi, BackendError, BackendResult, GasInfo}; pub const MOCK_CONTRACT_ADDR: &str = "cosmos2contract"; -const GAS_COST_HUMANIZE: u64 = 44; +const GAS_COST_HUMANIZE: u64 = 44; // TODO: these seem very low const GAS_COST_CANONICALIZE: u64 = 55; /// All external requirements that can be injected for unit tests. diff --git a/packages/vm/src/wasm_backend/engine.rs b/packages/vm/src/wasm_backend/engine.rs index cd0a03f026..b5be96ee52 100644 --- a/packages/vm/src/wasm_backend/engine.rs +++ b/packages/vm/src/wasm_backend/engine.rs @@ -22,7 +22,7 @@ const MAX_WASM_PAGES: u32 = 65536; fn cost(_operator: &Operator) -> u64 { // A flat fee for each operation - // The target is 1 Gigagas per millisecond (see GAS.md). + // The target is 1 Teragas per second (see GAS.md). // // In https://github.com/CosmWasm/cosmwasm/pull/1042 a profiler is developed to // identify runtime differences between different Wasm operation, but this is not yet From 129f40a4be968a1e10cdacaba3d2e02ef7447ebc Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 21 Sep 2023 13:30:25 +0200 Subject: [PATCH 0908/2372] Format markdown --- docs/GAS.md | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/docs/GAS.md b/docs/GAS.md index 83cd6827e2..113e66b952 100644 --- a/docs/GAS.md +++ b/docs/GAS.md @@ -19,14 +19,15 @@ while ago and can be adjusted when necessary. ## CosmWasm gas pricing For CosmWasm gas, the target gas consumption is 1 Teragas (10^12 gas) per -second. This idea is [inspired by NEAR][neargas] and we encourage you to -read their excellent docs on that topic. +second. This idea is [inspired by NEAR][neargas] and we encourage you to read +their excellent docs on that topic. In order to meet this target, we execute Argon2 in a test contract ([#1120]). This is a CPU and memory intense job that does not call out into the host. At a constant gas cost per operation of 1 (pre CosmWasm 1.0), this consumed 96837752 gas and took 15ms on our CI system. The ideal cost per operation for this system -is `10**12 / (96837752 / (15 / 1000))`: 154. This is rounded to 150 for simplicity. +is `10**12 / (96837752 / (15 / 1000))`: 154. This is rounded to 150 for +simplicity. Each machine is different, we know that. But the above target helps us in multiple ways: @@ -45,22 +46,22 @@ multiple ways: ## Gas overflow potential -CosmWasm gas aims for 1 Teragas/second, i.e. the uint64 range exceeds after -18 million seconds (5000 hours)1. Assuming a max supported block +CosmWasm gas aims for 1 Teragas/second, i.e. the uint64 range exceeds after 18 +million seconds (5000 hours)1. Assuming a max supported block execution time of 30 seconds, the gas price has to be over-priced by a factor of 614891 (614891 Teragas/second) in order to exceed the uint64 range2. Since serious over or underpricing is considered a bug, using uint64 for gas measurements is considered safe. -Cosmos SDK gas uses values that are smaller by a factor of 150, so those -don't overflow as well. Since no Cosmos SDK gas values are processed inside of -this repository, this is not our main concern. However, it's good to know that -we can safely pass them in uint64 fields, as long as the full range is -supported. This is the case for the C API as well as -[JSON numbers](https://www.json.org/) as long as both sides support integers in -their JSON implementation. Go and Rust do that while many other implementations -don't support integers, and convert them to IEEE-754 doubles, which has a safe -integer range up to about 53 bit (e.g. JavaScript and jq). +Cosmos SDK gas uses values that are smaller by a factor of 150, so those don't +overflow as well. Since no Cosmos SDK gas values are processed inside of this +repository, this is not our main concern. However, it's good to know that we can +safely pass them in uint64 fields, as long as the full range is supported. This +is the case for the C API as well as [JSON numbers](https://www.json.org/) as +long as both sides support integers in their JSON implementation. Go and Rust do +that while many other implementations don't support integers, and convert them +to IEEE-754 doubles, which has a safe integer range up to about 53 bit (e.g. +JavaScript and jq). 1 Python3: `(2**64-1) / 10**12` From d998b8253546474cd1d8fb60fe206b94b43f3aa2 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 6 Nov 2023 11:57:00 +0100 Subject: [PATCH 0909/2372] Add pre 2.0 section to gas docs --- docs/GAS.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/GAS.md b/docs/GAS.md index 113e66b952..4798b14fd5 100644 --- a/docs/GAS.md +++ b/docs/GAS.md @@ -66,3 +66,19 @@ JavaScript and jq). 1 Python3: `(2**64-1) / 10**12` 2 Python3: `((2**64-1)/30) / 10**12` + +## CosmWasm 1.x -> 2.0 changes + +In all versions before 2.0, the gas values were bigger by a factor of 1000. +There is no need to have them this big and in order to reduce the risk of +overflow, the gas values were lowered in [#1599]. Here is a breakdown of what +this change entails: + +| | CosmWasm 1.x | CosmWasm 2.x | +| -------------------------- | --------------------- | --------------------- | +| Cost target | 1 Teragas/millisecond | 1 Teragas/second | +| Exceeds uint64 range after | 5 hours | 5124 hours (213 days) | +| Cost per Wasm op | 150_000 | 150 | +| Multiplier | 140_000_000 | 140_000 | + +[#1599]: https://github.com/CosmWasm/cosmwasm/pull/1599 From 1dcc18faf7bc30216a8b5b108d606a2cde7ecae7 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 6 Nov 2023 11:58:36 +0100 Subject: [PATCH 0910/2372] Change wording --- packages/vm/src/environment.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index d6ec187719..ad6bac36f4 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -45,7 +45,7 @@ pub struct GasConfig { impl Default for GasConfig { fn default() -> Self { - // Target is 10^9 per millisecond (see GAS.md), i.e. 10^6 gas per µ second. + // Target is 10^12 per second (see GAS.md), i.e. 10^6 gas per µ second. const GAS_PER_US: u64 = 1_000_000; Self { // ~154 us in crypto benchmarks From 2d2005037dca87d180140e721e57585eba94ea6f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 7 Nov 2023 12:40:19 +0100 Subject: [PATCH 0911/2372] Add changelog entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fc1973267..bb8c1be848 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,10 +30,12 @@ and this project adheres to - cosmwasm-std: Make inner values of `CanonicalAddr` and `Binary` private and add constructor for `Binary`. ([#1876]) - cosmwasm-vm: Make inner value of `Size` private and add constructor. ([#1876]) +- cosmwasm-vm: Reduce gas values by a factor of 1000. ([#1884]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 [#1879]: https://github.com/CosmWasm/cosmwasm/pull/1879 +[#1884]: https://github.com/CosmWasm/cosmwasm/pull/1884 [#1898]: https://github.com/CosmWasm/cosmwasm/pull/1898 [#1902]: https://github.com/CosmWasm/cosmwasm/pull/1902 From 01f3db6b7dff2120a9d8f6e8865139ea0573c8c3 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 7 Nov 2023 12:47:20 +0100 Subject: [PATCH 0912/2372] Upgrade to serde-json-wasm 1.0 --- Cargo.lock | 12 ++++++------ packages/std/Cargo.toml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 25b1026961..eb4f764799 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1932,18 +1932,18 @@ checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" [[package]] name = "serde" -version = "1.0.180" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea67f183f058fe88a4e3ec6e2788e003840893b91bac4559cabedd00863b3ed" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" dependencies = [ "serde_derive", ] [[package]] name = "serde-json-wasm" -version = "0.5.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16a62a1fad1e1828b24acac8f2b468971dade7b8c3c2e672bcadefefb1f8c137" +checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" dependencies = [ "serde", ] @@ -1961,9 +1961,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.180" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24e744d7782b686ab3b73267ef05697159cc0e5abbed3f47f9933165e5219036" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 2ab60fcb5f..24cf779ed5 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -58,7 +58,7 @@ serde = { version = "1.0.103", default-features = false, features = [ "derive", "alloc", ] } -serde-json-wasm = { version = "0.5.0" } +serde-json-wasm = { version = "1.0.0" } thiserror = "1.0.26" bnum = "0.8.0" static_assertions = "1.1.0" From dcecc8533d8b436a0a88840577025217713dac55 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 7 Nov 2023 14:12:26 +0100 Subject: [PATCH 0913/2372] Update message types documentation --- docs/MESSAGE_TYPES.md | 44 +++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/docs/MESSAGE_TYPES.md b/docs/MESSAGE_TYPES.md index 8c34243704..006e99596e 100644 --- a/docs/MESSAGE_TYPES.md +++ b/docs/MESSAGE_TYPES.md @@ -9,28 +9,28 @@ this reason, the CosmWasm standard library `cosmwasm-std` ships types that ensure good user experience in JSON. The following table shows both standard Rust types as well as `cosmwasm_std` types and how they are encoded in JSON. -| Rust type | JSON type[^1] | Example | Note | -| ------------------- | ----------------------------------------- | ------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| bool | `true` or `false` | `true` | | -| u32/i32 | number | `123` | | -| u64/i64 | number | `123456` | Supported in Rust and Go. Other implementations (`jq`, `JavaScript`) do not support the full uint64/int64 range. | -| u128/i128 | string | `"340282366920938463463374607431768211455", "-2766523308300312711084346401884294402"` | 🚫 Strongly discouraged because the JSON type in serde-json-wasm is wrong and will change. See [Dev Note #4: u128/i128 serialization][dev-note-4]. | -| usize/isize | number | `123456` | 🚫 Don't use this type because it has a different size in unit tests (64 bit) and Wasm (32 bit). Also it tends to issue float instructions such that the contracts cannot be uploaded. | -| String | string | `"foo"` | -| &str | string | `"foo"` | 🚫 Unsuppored since message types must be owned (DeserializeOwned) | -| Option\ | `null` or JSON type of `T` | `null`, `{"foo":12}` | | -| Vec\ | array of JSON type of `T` | `["one", "two", "three"]` (Vec\), `[true, false]` (Vec\) | -| Vec\ | array of numbers from 0 to 255 | `[187, 61, 11, 250]` | ⚠️ Discouraged as this encoding is not as compact as it can be. See `Binary`. | -| struct MyType { … } | object | `{"foo":12}` | | -| [Uint64]/[Int64] | string containing number | `"1234321"`, `"-1234321"` | Used to support full uint64/int64 range in all implementations | -| [Uint128]/[Int128] | string containing number | `"1234321"`, `"-1234321"` | | -| [Uint256]/[Int256] | string containing number | `"1234321"`, `"-1234321"` | | -| [Uint512]/[Int512] | string containing number | `"1234321"`, `"-1234321"` | | -| [Decimal] | string containing decimal number | `"55.6584"` | | -| [Decimal256] | string containing decimal number | `"55.6584"` | | -| [Binary] | string containing base64 data | `"MTIzCg=="` | | -| [HexBinary] | string containing hex data | `"b5d7d24e428c"` | | -| [Timestamp] | string containing nanoseconds since epoch | `"1677687687000000000"` | | +| Rust type | JSON type[^1] | Example | Note | +| ------------------- | ----------------------------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| bool | `true` or `false` | `true` | | +| u32/i32 | number | `123` | | +| u64/i64 | number | `123456` | Supported in Rust and Go. Other implementations (`jq`, `JavaScript`) do not support the full uint64/int64 range. | +| u128/i128 | number | `340282366920938463463374607431768211455, -2766523308300312711084346401884294402` | Supported in Rust. Other implementations do not support the full range. This used to be serialized as a string in serde-json-wasm. See [Dev Note #4: u128/i128 serialization][dev-note-4]. If you have any code relying on that serialization, switch to `Uint128` / `Int128`. | +| usize/isize | number | `123456` | 🚫 Don't use this type because it has a different size in unit tests (64 bit) and Wasm (32 bit). Also it tends to issue float instructions such that the contracts cannot be uploaded. | +| String | string | `"foo"` | +| &str | string | `"foo"` | 🚫 Unsuppored since message types must be owned (DeserializeOwned) | +| Option\ | `null` or JSON type of `T` | `null`, `{"foo":12}` | | +| Vec\ | array of JSON type of `T` | `["one", "two", "three"]` (Vec\), `[true, false]` (Vec\) | +| Vec\ | array of numbers from 0 to 255 | `[187, 61, 11, 250]` | ⚠️ Discouraged as this encoding is not as compact as it can be. See `Binary`. | +| struct MyType { … } | object | `{"foo":12}` | | +| [Uint64]/[Int64] | string containing number | `"1234321"`, `"-1234321"` | Used to support full uint64/int64 range in all implementations | +| [Uint128]/[Int128] | string containing number | `"1234321"`, `"-1234321"` | | +| [Uint256]/[Int256] | string containing number | `"1234321"`, `"-1234321"` | | +| [Uint512]/[Int512] | string containing number | `"1234321"`, `"-1234321"` | | +| [Decimal] | string containing decimal number | `"55.6584"` | | +| [Decimal256] | string containing decimal number | `"55.6584"` | | +| [Binary] | string containing base64 data | `"MTIzCg=="` | | +| [HexBinary] | string containing hex data | `"b5d7d24e428c"` | | +| [Timestamp] | string containing nanoseconds since epoch | `"1677687687000000000"` | | [uint64]: https://docs.rs/cosmwasm-std/1.3.3/cosmwasm_std/struct.Uint64.html [uint128]: https://docs.rs/cosmwasm-std/1.3.3/cosmwasm_std/struct.Uint128.html From 8fe98c71f074543bd6014b3ed77afa0e543c024a Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 7 Nov 2023 14:15:07 +0100 Subject: [PATCH 0914/2372] Add changelog and migrating entry --- CHANGELOG.md | 3 +++ MIGRATING.md | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb8c1be848..6143c383eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,9 @@ and this project adheres to add constructor for `Binary`. ([#1876]) - cosmwasm-vm: Make inner value of `Size` private and add constructor. ([#1876]) - cosmwasm-vm: Reduce gas values by a factor of 1000. ([#1884]) +- cosmwasm-std: Upgrade to `serde-json-wasm` 1.0. This means `u128` and `i128` + are now serialized as numbers instead of strings. Use `Uint128` and `Int128` + instead. ([#1898]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 diff --git a/MIGRATING.md b/MIGRATING.md index 30b18953f9..b27f9f0839 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -89,6 +89,10 @@ major releases of `cosmwasm`. Note that you can also view the +canonical_addr.as_slice() ``` +- If you use any `u128` or `i128` in storage or message types, replace them with + `Uint128` and `Int128` respectively to preserve the current serialization. + Failing to do this will result in deserialization errors! + ## 1.4.x -> 1.5.0 - Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): From 95ba843d96c1c0f310985d54b23c1e77f5ed4e7b Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 7 Nov 2023 14:18:47 +0100 Subject: [PATCH 0915/2372] Add migrating example --- MIGRATING.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/MIGRATING.md b/MIGRATING.md index b27f9f0839..9706e7cd22 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -93,6 +93,17 @@ major releases of `cosmwasm`. Note that you can also view the `Uint128` and `Int128` respectively to preserve the current serialization. Failing to do this will result in deserialization errors! + ```diff + #[cw_serde] + struct MyStorage { + - a: u128, + - b: i128, + + a: Uint128, + + b: Int128, + } + -const map: Map = Map::new("map"); + +const map: Map = Map::new("map"); + ``` ## 1.4.x -> 1.5.0 - Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): From 1b8abcb5c8aa7ca4c575badf1102149027bca331 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 7 Nov 2023 14:23:03 +0100 Subject: [PATCH 0916/2372] Format markdown --- MIGRATING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/MIGRATING.md b/MIGRATING.md index 9706e7cd22..6dcbb44f3d 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -104,6 +104,7 @@ major releases of `cosmwasm`. Note that you can also view the -const map: Map = Map::new("map"); +const map: Map = Map::new("map"); ``` + ## 1.4.x -> 1.5.0 - Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): From 507a8a6814f8b93de698361c2ee108990a8a6029 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 7 Nov 2023 15:05:25 +0100 Subject: [PATCH 0917/2372] Update contract lock files and fix reflect dep --- contracts/burner/Cargo.lock | 14 +++++++------- contracts/crypto-verify/Cargo.lock | 14 +++++++------- contracts/cyberpunk/Cargo.lock | 14 +++++++------- contracts/floaty/Cargo.lock | 14 +++++++------- contracts/hackatom/Cargo.lock | 14 +++++++------- contracts/ibc-reflect-send/Cargo.lock | 14 +++++++------- contracts/ibc-reflect/Cargo.lock | 14 +++++++------- contracts/queue/Cargo.lock | 14 +++++++------- contracts/reflect/Cargo.lock | 14 +++++++------- contracts/reflect/Cargo.toml | 2 +- contracts/staking/Cargo.lock | 14 +++++++------- contracts/virus/Cargo.lock | 14 +++++++------- 12 files changed, 78 insertions(+), 78 deletions(-) diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 059d31c649..039c36a785 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -1312,18 +1312,18 @@ checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" [[package]] name = "serde" -version = "1.0.126" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" dependencies = [ "serde_derive", ] [[package]] name = "serde-json-wasm" -version = "0.5.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" +checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" dependencies = [ "serde", ] @@ -1341,13 +1341,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.126" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.37", ] [[package]] diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 506d42a232..bc88a47b5e 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -1345,18 +1345,18 @@ checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" [[package]] name = "serde" -version = "1.0.126" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" dependencies = [ "serde_derive", ] [[package]] name = "serde-json-wasm" -version = "0.5.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" +checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" dependencies = [ "serde", ] @@ -1374,13 +1374,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.126" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.37", ] [[package]] diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index b14ddf9a7d..44a1aec8ac 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -1436,18 +1436,18 @@ checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" [[package]] name = "serde" -version = "1.0.126" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" dependencies = [ "serde_derive", ] [[package]] name = "serde-json-wasm" -version = "0.5.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" +checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" dependencies = [ "serde", ] @@ -1465,13 +1465,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.126" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.37", ] [[package]] diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 03ee23986d..eeeaa6353f 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -1329,18 +1329,18 @@ checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" [[package]] name = "serde" -version = "1.0.126" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" dependencies = [ "serde_derive", ] [[package]] name = "serde-json-wasm" -version = "0.5.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" +checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" dependencies = [ "serde", ] @@ -1358,13 +1358,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.126" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.32", ] [[package]] diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 8fa0ef8fd9..cdb8cf7ede 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -1314,18 +1314,18 @@ checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" [[package]] name = "serde" -version = "1.0.126" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" dependencies = [ "serde_derive", ] [[package]] name = "serde-json-wasm" -version = "0.5.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" +checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" dependencies = [ "serde", ] @@ -1343,13 +1343,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.126" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.37", ] [[package]] diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index b0ba960340..656e614d46 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -1312,18 +1312,18 @@ checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" [[package]] name = "serde" -version = "1.0.126" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" dependencies = [ "serde_derive", ] [[package]] name = "serde-json-wasm" -version = "0.5.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" +checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" dependencies = [ "serde", ] @@ -1341,13 +1341,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.126" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.37", ] [[package]] diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 155dd64dad..5c1407d179 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -1312,18 +1312,18 @@ checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" [[package]] name = "serde" -version = "1.0.126" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" dependencies = [ "serde_derive", ] [[package]] name = "serde-json-wasm" -version = "0.5.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" +checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" dependencies = [ "serde", ] @@ -1341,13 +1341,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.126" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.37", ] [[package]] diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 21c40a3ce4..2cc2910726 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -1312,18 +1312,18 @@ checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" [[package]] name = "serde" -version = "1.0.126" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" dependencies = [ "serde_derive", ] [[package]] name = "serde-json-wasm" -version = "0.5.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" +checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" dependencies = [ "serde", ] @@ -1341,13 +1341,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.126" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.37", ] [[package]] diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 883d4e958b..ddf696931c 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -1313,18 +1313,18 @@ checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" [[package]] name = "serde" -version = "1.0.103" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1217f97ab8e8904b57dd22eb61cde455fa7446a9c1cf43966066da047c1f3702" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" dependencies = [ "serde_derive", ] [[package]] name = "serde-json-wasm" -version = "0.5.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" +checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" dependencies = [ "serde", ] @@ -1342,13 +1342,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.103" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8c6faef9a2e64b0064f48570289b4bf8823b7581f1d6157c1b52152306651d0" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.37", ] [[package]] diff --git a/contracts/reflect/Cargo.toml b/contracts/reflect/Cargo.toml index 8ef7e171b2..6e471dfddb 100644 --- a/contracts/reflect/Cargo.toml +++ b/contracts/reflect/Cargo.toml @@ -36,7 +36,7 @@ backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] cosmwasm-schema = { path = "../../packages/schema" } cosmwasm-std = { path = "../../packages/std", default-features = false, features = ["staking", "stargate", "cosmwasm_1_4"] } schemars = "0.8.3" -serde = { version = "=1.0.103", default-features = false, features = ["derive"] } +serde = { version = "1.0.103", default-features = false, features = ["derive"] } thiserror = "1.0.26" [dev-dependencies] diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 5560f10518..939c78f4e7 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -1307,18 +1307,18 @@ checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" [[package]] name = "serde" -version = "1.0.126" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" dependencies = [ "serde_derive", ] [[package]] name = "serde-json-wasm" -version = "0.5.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" +checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" dependencies = [ "serde", ] @@ -1336,13 +1336,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.126" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.37", ] [[package]] diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 7ea3b2995b..859dd66413 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -1301,18 +1301,18 @@ checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" [[package]] name = "serde" -version = "1.0.126" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" dependencies = [ "serde_derive", ] [[package]] name = "serde-json-wasm" -version = "0.5.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" +checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" dependencies = [ "serde", ] @@ -1330,13 +1330,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.126" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.37", ] [[package]] From a28d53aaf8df53c427d11b3efc1b0a36cd09693b Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 7 Nov 2023 15:07:47 +0100 Subject: [PATCH 0918/2372] Fix changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6143c383eb..2439396833 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,7 +33,7 @@ and this project adheres to - cosmwasm-vm: Reduce gas values by a factor of 1000. ([#1884]) - cosmwasm-std: Upgrade to `serde-json-wasm` 1.0. This means `u128` and `i128` are now serialized as numbers instead of strings. Use `Uint128` and `Int128` - instead. ([#1898]) + instead. ([#1939]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 @@ -41,6 +41,7 @@ and this project adheres to [#1884]: https://github.com/CosmWasm/cosmwasm/pull/1884 [#1898]: https://github.com/CosmWasm/cosmwasm/pull/1898 [#1902]: https://github.com/CosmWasm/cosmwasm/pull/1902 +[#1939]: https://github.com/CosmWasm/cosmwasm/pull/1939 ### Removed From 9f8a08e8c1c914c46516a8deb984ae2afeaa648e Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 7 Nov 2023 15:17:09 +0100 Subject: [PATCH 0919/2372] Fix serialization migration docs --- MIGRATING.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/MIGRATING.md b/MIGRATING.md index 6dcbb44f3d..04c0b9a24e 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -101,8 +101,10 @@ major releases of `cosmwasm`. Note that you can also view the + a: Uint128, + b: Int128, } - -const map: Map = Map::new("map"); - +const map: Map = Map::new("map"); + const map: Map = Map::new("map"); + + -const item: Item = Item::new("item"); + +const item: Item = Item::new("item"); ``` ## 1.4.x -> 1.5.0 From 552def346520e43336d96bee145b4b6cb04a8759 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 19 Sep 2023 18:01:18 +0200 Subject: [PATCH 0920/2372] Make responses and their children non_exhaustive --- packages/std/src/query/bank.rs | 2 ++ packages/std/src/query/distribution.rs | 8 +++++++ packages/std/src/query/ibc.rs | 3 +++ packages/std/src/query/staking.rs | 32 ++++++++++++++++++++++++++ 4 files changed, 45 insertions(+) diff --git a/packages/std/src/query/bank.rs b/packages/std/src/query/bank.rs index 7980760f4a..9cfc8f9467 100644 --- a/packages/std/src/query/bank.rs +++ b/packages/std/src/query/bank.rs @@ -50,6 +50,7 @@ impl QueryResponseType for SupplyResponse {} #[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] +#[non_exhaustive] pub struct BalanceResponse { /// Always returns a Coin with the requested denom. /// This may be of 0 amount if no such funds. @@ -62,6 +63,7 @@ impl QueryResponseType for BalanceResponse {} #[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] +#[non_exhaustive] pub struct AllBalanceResponse { /// Returns all non-zero coins held by this account. pub amount: Vec, diff --git a/packages/std/src/query/distribution.rs b/packages/std/src/query/distribution.rs index 4776c81e08..5dbdfec2e4 100644 --- a/packages/std/src/query/distribution.rs +++ b/packages/std/src/query/distribution.rs @@ -39,6 +39,7 @@ impl QueryResponseType for DelegatorWithdrawAddressResponse {} /// See #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] +#[non_exhaustive] pub struct DelegationRewardsResponse { pub rewards: Vec, } @@ -91,13 +92,20 @@ impl_response_constructor!( impl QueryResponseType for DelegationTotalRewardsResponse {} #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[non_exhaustive] pub struct DelegatorReward { pub validator_address: String, pub reward: Vec, } +impl_response_constructor!( + DelegatorReward, + validator_address: String, + reward: Vec +); /// See #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[non_exhaustive] pub struct DelegatorValidatorsResponse { pub validators: Vec, } diff --git a/packages/std/src/query/ibc.rs b/packages/std/src/query/ibc.rs index e8d6ff81e7..511c61274e 100644 --- a/packages/std/src/query/ibc.rs +++ b/packages/std/src/query/ibc.rs @@ -31,6 +31,7 @@ pub enum IbcQuery { } #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[non_exhaustive] pub struct PortIdResponse { pub port_id: String, } @@ -38,6 +39,7 @@ pub struct PortIdResponse { impl_response_constructor!(PortIdResponse, port_id: String); #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[non_exhaustive] pub struct ListChannelsResponse { pub channels: Vec, } @@ -45,6 +47,7 @@ pub struct ListChannelsResponse { impl_response_constructor!(ListChannelsResponse, channels: Vec); #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[non_exhaustive] pub struct ChannelResponse { pub channel: Option, } diff --git a/packages/std/src/query/staking.rs b/packages/std/src/query/staking.rs index 08222f3cbd..a85a8c9e01 100644 --- a/packages/std/src/query/staking.rs +++ b/packages/std/src/query/staking.rs @@ -36,6 +36,7 @@ pub enum StakingQuery { /// BondedDenomResponse is data format returned from StakingRequest::BondedDenom query #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] +#[non_exhaustive] pub struct BondedDenomResponse { pub denom: String, } @@ -47,6 +48,7 @@ impl_response_constructor!(BondedDenomResponse, denom: String); /// DelegationsResponse is data format returned from StakingRequest::AllDelegations query #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] +#[non_exhaustive] pub struct AllDelegationsResponse { pub delegations: Vec, } @@ -59,6 +61,7 @@ impl_response_constructor!(AllDelegationsResponse, delegations: Vec) /// /// Instances are created in the querier. #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[non_exhaustive] pub struct Delegation { pub delegator: Addr, /// A validator address (e.g. cosmosvaloper1...) @@ -67,6 +70,13 @@ pub struct Delegation { pub amount: Coin, } +impl_response_constructor!( + Delegation, + delegator: Addr, + validator: String, + amount: Coin +); + impl From for Delegation { fn from(full: FullDelegation) -> Self { Delegation { @@ -80,6 +90,7 @@ impl From for Delegation { /// DelegationResponse is data format returned from StakingRequest::Delegation query #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] +#[non_exhaustive] pub struct DelegationResponse { pub delegation: Option, } @@ -93,6 +104,7 @@ impl_response_constructor!(DelegationResponse, delegation: Option, } +impl_response_constructor!( + FullDelegation, + delegator: Addr, + validator: String, + amount: Coin, + can_redelegate: Coin, + accumulated_rewards: Vec +); + /// The data format returned from StakingRequest::AllValidators query #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[non_exhaustive] pub struct AllValidatorsResponse { pub validators: Vec, } @@ -119,6 +141,7 @@ impl_response_constructor!(AllValidatorsResponse, validators: Vec); /// The data format returned from StakingRequest::Validator query #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[non_exhaustive] pub struct ValidatorResponse { pub validator: Option, } @@ -129,6 +152,7 @@ impl_response_constructor!(ValidatorResponse, validator: Option); /// Instances are created in the querier. #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[non_exhaustive] pub struct Validator { /// The operator address of the validator (e.g. cosmosvaloper1...). /// See https://github.com/cosmos/cosmos-sdk/blob/v0.47.4/proto/cosmos/staking/v1beta1/staking.proto#L95-L96 @@ -142,3 +166,11 @@ pub struct Validator { /// The maximum daily increase of the commission pub max_change_rate: Decimal, } + +impl_response_constructor!( + Validator, + address: String, + commission: Decimal, + max_commission: Decimal, + max_change_rate: Decimal +); From fabe25d40d8c85d541023f3bde26f1f2bf46342e Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 19 Sep 2023 18:11:31 +0200 Subject: [PATCH 0921/2372] Fix vm tests --- packages/vm/src/instance.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index b400731de8..b5f26c875e 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -970,7 +970,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let BalanceResponse { amount } = from_json(response).unwrap(); + let BalanceResponse { amount, .. } = from_json(response).unwrap(); assert_eq!(amount.amount.u128(), 8000); assert_eq!(amount.denom, "silver"); Ok(()) @@ -991,7 +991,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let AllBalanceResponse { amount } = from_json(response).unwrap(); + let AllBalanceResponse { amount, .. } = from_json(response).unwrap(); assert_eq!(amount.len(), 2); assert_eq!(amount[0].amount.u128(), 10000); assert_eq!(amount[0].denom, "gold"); @@ -1026,7 +1026,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let BalanceResponse { amount } = from_json(response).unwrap(); + let BalanceResponse { amount, .. } = from_json(response).unwrap(); assert_eq!(amount.amount.u128(), 500); Ok(()) }) @@ -1055,7 +1055,7 @@ mod tests { .unwrap() .unwrap() .unwrap(); - let BalanceResponse { amount } = from_json(response).unwrap(); + let BalanceResponse { amount, .. } = from_json(response).unwrap(); assert_eq!(amount.amount.u128(), 8000); Ok(()) }) From 538e5baaca5aa3a1c27381b06fcdc5bcfcd05ece Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 20 Sep 2023 12:09:34 +0200 Subject: [PATCH 0922/2372] Fix contracts --- contracts/hackatom/src/contract.rs | 8 +++---- contracts/staking/Cargo.lock | 9 ++++---- contracts/staking/Cargo.toml | 1 + contracts/staking/src/contract.rs | 29 +++++++++++++------------- contracts/staking/tests/integration.rs | 13 ++++++------ 5 files changed, 32 insertions(+), 28 deletions(-) diff --git a/contracts/hackatom/src/contract.rs b/contracts/hackatom/src/contract.rs index f62ffcb319..d99eb0753a 100644 --- a/contracts/hackatom/src/contract.rs +++ b/contracts/hackatom/src/contract.rs @@ -2,8 +2,8 @@ use sha2::{Digest, Sha256}; use cosmwasm_std::{ entry_point, from_json, to_json_binary, to_json_vec, Addr, AllBalanceResponse, Api, BankMsg, - CanonicalAddr, Deps, DepsMut, Env, Event, MessageInfo, QueryRequest, QueryResponse, Response, - StdError, StdResult, WasmMsg, WasmQuery, + BankQuery, CanonicalAddr, Deps, DepsMut, Env, Event, MessageInfo, QueryRequest, QueryResponse, + Response, StdError, StdResult, WasmMsg, WasmQuery, }; use crate::errors::HackError; @@ -269,8 +269,8 @@ fn query_verifier(deps: Deps) -> StdResult { } fn query_other_balance(deps: Deps, address: String) -> StdResult { - let amount = deps.querier.query_all_balances(address)?; - Ok(AllBalanceResponse { amount }) + deps.querier + .query(&BankQuery::AllBalances { address }.into()) } fn query_recurse(deps: Deps, depth: u32, work: u32, contract: Addr) -> StdResult { diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 939c78f4e7..95127a262c 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -857,9 +857,9 @@ dependencies = [ [[package]] name = "itoa" -version = "0.4.7" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" @@ -1358,9 +1358,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.64" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" +checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" dependencies = [ "itoa", "ryu", @@ -1475,6 +1475,7 @@ dependencies = [ "cosmwasm-vm", "schemars", "serde", + "serde_json", "snafu", ] diff --git a/contracts/staking/Cargo.toml b/contracts/staking/Cargo.toml index ff7e7f796d..e42a0541d1 100644 --- a/contracts/staking/Cargo.toml +++ b/contracts/staking/Cargo.toml @@ -40,3 +40,4 @@ snafu = "0.6.6" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["staking"] } +serde_json = "1.0.107" diff --git a/contracts/staking/src/contract.rs b/contracts/staking/src/contract.rs index ab70170ea3..752e292b5a 100644 --- a/contracts/staking/src/contract.rs +++ b/contracts/staking/src/contract.rs @@ -412,23 +412,24 @@ mod tests { use std::str::FromStr; fn sample_validator(addr: &str) -> Validator { - Validator { - address: addr.to_owned(), - commission: Decimal::percent(3), - max_commission: Decimal::percent(10), - max_change_rate: Decimal::percent(1), - } + serde_json::from_value(serde_json::json!({ + "address": addr.to_owned(), + "commission": Decimal::percent(3), + "max_commission": Decimal::percent(10), + "max_change_rate": Decimal::percent(1), + })) + .unwrap() } fn sample_delegation(validator_addr: &str, amount: Coin) -> FullDelegation { - let can_redelegate = amount.clone(); - FullDelegation { - validator: validator_addr.to_owned(), - delegator: Addr::unchecked(MOCK_CONTRACT_ADDR), - amount, - can_redelegate, - accumulated_rewards: Vec::new(), - } + serde_json::from_value(serde_json::json!({ + "validator": validator_addr.to_owned(), + "delegator": Addr::unchecked(MOCK_CONTRACT_ADDR), + "amount": amount, + "can_redelegate": amount, + "accumulated_rewards": Vec::::new(), + })) + .unwrap() } fn set_validator(querier: &mut MockQuerier) { diff --git a/contracts/staking/tests/integration.rs b/contracts/staking/tests/integration.rs index cca65a9db4..05db200694 100644 --- a/contracts/staking/tests/integration.rs +++ b/contracts/staking/tests/integration.rs @@ -34,12 +34,13 @@ static WASM: &[u8] = include_bytes!("../target/wasm32-unknown-unknown/release/st // static WASM: &[u8] = include_bytes!("../contract.wasm"); fn sample_validator(addr: &str) -> Validator { - Validator { - address: addr.to_owned(), - commission: Decimal::percent(3), - max_commission: Decimal::percent(10), - max_change_rate: Decimal::percent(1), - } + serde_json::from_value(serde_json::json!({ + "address": addr.to_owned(), + "commission": Decimal::percent(3), + "max_commission": Decimal::percent(10), + "max_change_rate": Decimal::percent(1), + })) + .unwrap() } #[test] From 6a20737505d2f6a5b8cf1b72c76f6d30947ccfc2 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 20 Sep 2023 12:48:12 +0200 Subject: [PATCH 0923/2372] Fix formatting --- packages/std/src/query/staking.rs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/std/src/query/staking.rs b/packages/std/src/query/staking.rs index a85a8c9e01..7a6bf11c4b 100644 --- a/packages/std/src/query/staking.rs +++ b/packages/std/src/query/staking.rs @@ -70,12 +70,7 @@ pub struct Delegation { pub amount: Coin, } -impl_response_constructor!( - Delegation, - delegator: Addr, - validator: String, - amount: Coin -); +impl_response_constructor!(Delegation, delegator: Addr, validator: String, amount: Coin); impl From for Delegation { fn from(full: FullDelegation) -> Self { From e448c75ea4576e3b297729307efb7b78b38f0345 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 4 Oct 2023 13:28:43 +0200 Subject: [PATCH 0924/2372] Remove Default impls --- packages/std/src/query/bank.rs | 6 +++--- packages/std/src/query/wasm.rs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/std/src/query/bank.rs b/packages/std/src/query/bank.rs index 9cfc8f9467..d8ecb3baec 100644 --- a/packages/std/src/query/bank.rs +++ b/packages/std/src/query/bank.rs @@ -35,7 +35,7 @@ pub enum BankQuery { AllDenomMetadata { pagination: Option }, } -#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq, JsonSchema)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] #[non_exhaustive] pub struct SupplyResponse { @@ -48,7 +48,7 @@ impl_response_constructor!(SupplyResponse, amount: Coin); impl QueryResponseType for SupplyResponse {} -#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq, JsonSchema)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] #[non_exhaustive] pub struct BalanceResponse { @@ -61,7 +61,7 @@ impl_response_constructor!(BalanceResponse, amount: Coin); impl QueryResponseType for BalanceResponse {} -#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq, JsonSchema)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] #[non_exhaustive] pub struct AllBalanceResponse { diff --git a/packages/std/src/query/wasm.rs b/packages/std/src/query/wasm.rs index 936100835d..6960c32836 100644 --- a/packages/std/src/query/wasm.rs +++ b/packages/std/src/query/wasm.rs @@ -32,7 +32,7 @@ pub enum WasmQuery { } #[non_exhaustive] -#[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] pub struct ContractInfoResponse { pub code_id: u64, /// address that instantiated this contract @@ -64,7 +64,7 @@ impl_response_constructor!( /// [CodeInfo]: https://github.com/CosmWasm/wasmd/blob/v0.30.0/proto/cosmwasm/wasm/v1/types.proto#L62-L72 /// [CodeInfoResponse]: https://github.com/CosmWasm/wasmd/blob/v0.30.0/proto/cosmwasm/wasm/v1/query.proto#L184-L199 #[non_exhaustive] -#[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] pub struct CodeInfoResponse { pub code_id: u64, /// The address that initially stored the code From 959c81ceb03b5ed6ca148755040eabb49d869ab4 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 4 Oct 2023 13:38:39 +0200 Subject: [PATCH 0925/2372] Use Addr in responses --- packages/std/src/query/wasm.rs | 20 ++++++++++---------- packages/std/src/testing/mock.rs | 4 ++-- packages/std/src/traits.rs | 4 ++-- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/std/src/query/wasm.rs b/packages/std/src/query/wasm.rs index 6960c32836..91a36cac40 100644 --- a/packages/std/src/query/wasm.rs +++ b/packages/std/src/query/wasm.rs @@ -1,7 +1,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use crate::{Binary, HexBinary}; +use crate::{Addr, Binary, HexBinary}; use super::query_response::QueryResponseType; @@ -36,9 +36,9 @@ pub enum WasmQuery { pub struct ContractInfoResponse { pub code_id: u64, /// address that instantiated this contract - pub creator: String, + pub creator: Addr, /// admin who can run migrations (if any) - pub admin: Option, + pub admin: Option, /// if set, the contract is pinned to the cache, and thus uses less gas when called pub pinned: bool, /// set if this contract has bound an IBC port @@ -50,8 +50,8 @@ impl QueryResponseType for ContractInfoResponse {} impl_response_constructor!( ContractInfoResponse, code_id: u64, - creator: String, - admin: Option, + creator: Addr, + admin: Option, pinned: bool, ibc_port: Option ); @@ -68,7 +68,7 @@ impl_response_constructor!( pub struct CodeInfoResponse { pub code_id: u64, /// The address that initially stored the code - pub creator: String, + pub creator: Addr, /// The hash of the Wasm blob pub checksum: HexBinary, } @@ -76,7 +76,7 @@ pub struct CodeInfoResponse { impl_response_constructor!( CodeInfoResponse, code_id: u64, - creator: String, + creator: Addr, checksum: HexBinary ); @@ -114,8 +114,8 @@ mod tests { fn contract_info_response_serialization() { let response = ContractInfoResponse { code_id: 67, - creator: "jane".to_string(), - admin: Some("king".to_string()), + creator: Addr::unchecked("jane"), + admin: Some(Addr::unchecked("king")), pinned: true, ibc_port: Some("wasm.123".to_string()), }; @@ -133,7 +133,7 @@ mod tests { let response = CodeInfoResponse { code_id: 67, - creator: "jane".to_string(), + creator: Addr::unchecked("jane"), checksum: HexBinary::from_hex( "f7bb7b18fb01bbf425cf4ed2cd4b7fb26a019a7fc75a4dc87e8a0b768c501f00", ) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 2db41403d5..1aaad06daf 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -2216,7 +2216,7 @@ mod tests { if addr == constract1 { let response = ContractInfoResponse { code_id: 4, - creator: "lalala".into(), + creator: Addr::unchecked("lalala"), admin: None, pinned: false, ibc_port: None, @@ -2235,7 +2235,7 @@ mod tests { if code_id == 4 { let response = CodeInfoResponse { code_id, - creator: "lalala".into(), + creator: Addr::unchecked("lalala"), checksum: HexBinary::from_hex( "84cf20810fd429caf58898c3210fcb71759a27becddae08dbde8668ea2f4725d", ) diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 12f9824c0c..2ddc669add 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -567,7 +567,7 @@ mod tests { fn mock_resp() -> ContractInfoResponse { ContractInfoResponse { code_id: 0, - creator: "creator".to_string(), + creator: Addr::unchecked("creator"), admin: None, pinned: false, ibc_port: None, @@ -598,7 +598,7 @@ mod tests { fn mock_resp() -> ContractInfoResponse { ContractInfoResponse { code_id: 0, - creator: "creator".to_string(), + creator: Addr::unchecked("creator"), admin: None, pinned: false, ibc_port: None, From 7328832df5f39cb111febca0501337b8cafd3923 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 6 Nov 2023 12:10:34 +0100 Subject: [PATCH 0926/2372] Add stable constructors for query response fields --- packages/std/src/query/staking.rs | 42 +++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/packages/std/src/query/staking.rs b/packages/std/src/query/staking.rs index 7a6bf11c4b..b8104b8f12 100644 --- a/packages/std/src/query/staking.rs +++ b/packages/std/src/query/staking.rs @@ -123,6 +123,28 @@ impl_response_constructor!( accumulated_rewards: Vec ); +impl FullDelegation { + /// Creates a new delegation. + /// + /// If fields get added to the [`FullDelegation`] struct in the future, this constructor will + /// provide default values for them, but these default values may not be sensible. + pub fn create( + delegator: Addr, + validator: String, + amount: Coin, + can_redelegate: Coin, + accumulated_rewards: Vec, + ) -> Self { + Self { + delegator, + validator, + amount, + can_redelegate, + accumulated_rewards, + } + } +} + /// The data format returned from StakingRequest::AllValidators query #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[non_exhaustive] @@ -169,3 +191,23 @@ impl_response_constructor!( max_commission: Decimal, max_change_rate: Decimal ); + +impl Validator { + /// Creates a new validator. + /// + /// If fields get added to the [`Validator`] struct in the future, this constructor will + /// provide default values for them, but these default values may not be sensible. + pub fn create( + address: String, + commission: Decimal, + max_commission: Decimal, + max_change_rate: Decimal, + ) -> Self { + Self { + address, + commission, + max_commission, + max_change_rate, + } + } +} From 0b40af9716329d58b3000da87ec7ae8721a7b07b Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 6 Nov 2023 12:16:14 +0100 Subject: [PATCH 0927/2372] Use new constructors in tests --- contracts/staking/src/contract.rs | 28 ++++++++++++-------------- contracts/staking/tests/integration.rs | 13 ++++++------ 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/contracts/staking/src/contract.rs b/contracts/staking/src/contract.rs index 752e292b5a..f5ee407776 100644 --- a/contracts/staking/src/contract.rs +++ b/contracts/staking/src/contract.rs @@ -412,24 +412,22 @@ mod tests { use std::str::FromStr; fn sample_validator(addr: &str) -> Validator { - serde_json::from_value(serde_json::json!({ - "address": addr.to_owned(), - "commission": Decimal::percent(3), - "max_commission": Decimal::percent(10), - "max_change_rate": Decimal::percent(1), - })) - .unwrap() + Validator::create( + addr.to_owned(), + Decimal::percent(3), + Decimal::percent(10), + Decimal::percent(1), + ) } fn sample_delegation(validator_addr: &str, amount: Coin) -> FullDelegation { - serde_json::from_value(serde_json::json!({ - "validator": validator_addr.to_owned(), - "delegator": Addr::unchecked(MOCK_CONTRACT_ADDR), - "amount": amount, - "can_redelegate": amount, - "accumulated_rewards": Vec::::new(), - })) - .unwrap() + FullDelegation::create( + Addr::unchecked(MOCK_CONTRACT_ADDR), + validator_addr.to_owned(), + amount.clone(), + amount, + vec![], + ) } fn set_validator(querier: &mut MockQuerier) { diff --git a/contracts/staking/tests/integration.rs b/contracts/staking/tests/integration.rs index 05db200694..23355ba932 100644 --- a/contracts/staking/tests/integration.rs +++ b/contracts/staking/tests/integration.rs @@ -34,13 +34,12 @@ static WASM: &[u8] = include_bytes!("../target/wasm32-unknown-unknown/release/st // static WASM: &[u8] = include_bytes!("../contract.wasm"); fn sample_validator(addr: &str) -> Validator { - serde_json::from_value(serde_json::json!({ - "address": addr.to_owned(), - "commission": Decimal::percent(3), - "max_commission": Decimal::percent(10), - "max_change_rate": Decimal::percent(1), - })) - .unwrap() + Validator::create( + addr.to_owned(), + Decimal::percent(3), + Decimal::percent(10), + Decimal::percent(1), + ) } #[test] From 0d9883010a4d91880a8e45d1a3e7d94892c453a1 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 7 Nov 2023 12:28:34 +0100 Subject: [PATCH 0928/2372] Remove unecessary dependency --- contracts/staking/Cargo.lock | 1 - contracts/staking/Cargo.toml | 1 - 2 files changed, 2 deletions(-) diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 95127a262c..adf45172da 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -1475,7 +1475,6 @@ dependencies = [ "cosmwasm-vm", "schemars", "serde", - "serde_json", "snafu", ] diff --git a/contracts/staking/Cargo.toml b/contracts/staking/Cargo.toml index e42a0541d1..ff7e7f796d 100644 --- a/contracts/staking/Cargo.toml +++ b/contracts/staking/Cargo.toml @@ -40,4 +40,3 @@ snafu = "0.6.6" [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["staking"] } -serde_json = "1.0.107" From f6ba5ac5a46cefcefb8ed7c6b1c4839cc7e8f381 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 8 Nov 2023 10:31:27 +0100 Subject: [PATCH 0929/2372] Add changelog entry --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2439396833..37e8d1c7f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,10 +34,19 @@ and this project adheres to - cosmwasm-std: Upgrade to `serde-json-wasm` 1.0. This means `u128` and `i128` are now serialized as numbers instead of strings. Use `Uint128` and `Int128` instead. ([#1939]) +- cosmwasm-std: Make `BalanceResponse`, `AllBalanceResponse`, + `DelegationRewardsResponse`, `DelegatorReward`, `DelegatorValidatorsResponse`, + `PortIdResponse`, `ListChannelsResponse`, `ChannelResponse`, + `BondedDenomResponse`, `AllDelegationsResponse`, `Delegation`, + `DelegationResponse`, `FullDelegation`, `AllValidatorsResponse`, + `ValidatorResponse` and `Validator` non-exhaustive. Add `Validator::create` + and `FullDelegation::create` to allow creating them in a stable way. Use + `Addr` type for `ContractInfoResponse::{creator, admin}`. ([#1883]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 [#1879]: https://github.com/CosmWasm/cosmwasm/pull/1879 +[#1883]: https://github.com/CosmWasm/cosmwasm/pull/1883 [#1884]: https://github.com/CosmWasm/cosmwasm/pull/1884 [#1898]: https://github.com/CosmWasm/cosmwasm/pull/1898 [#1902]: https://github.com/CosmWasm/cosmwasm/pull/1902 From 9f67685fd56f9b817a1e6538205d2b01ef501f0b Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 29 Sep 2023 11:18:13 +0200 Subject: [PATCH 0930/2372] Require ack for IbcReceiveResponse construction --- contracts/ibc-reflect-send/src/ibc.rs | 4 +--- contracts/ibc-reflect/src/contract.rs | 17 +++++------------ packages/std/src/ibc.rs | 24 +++++++++++++++--------- packages/std/src/stdack.rs | 4 ++-- 4 files changed, 23 insertions(+), 26 deletions(-) diff --git a/contracts/ibc-reflect-send/src/ibc.rs b/contracts/ibc-reflect-send/src/ibc.rs index 0dadfb53fb..28362d0c23 100644 --- a/contracts/ibc-reflect-send/src/ibc.rs +++ b/contracts/ibc-reflect-send/src/ibc.rs @@ -101,9 +101,7 @@ pub fn ibc_packet_receive( _env: Env, _packet: IbcPacketReceiveMsg, ) -> Result { - Ok(IbcReceiveResponse::new() - .set_ack(b"{}") - .add_attribute("action", "ibc_packet_ack")) + Ok(IbcReceiveResponse::new(b"{}").add_attribute("action", "ibc_packet_ack")) } #[entry_point] diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 7d8efb44c2..e6bcb96555 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -255,8 +255,7 @@ pub fn ibc_packet_receive( // we try to capture all app-level errors and convert them into // acknowledgement packets that contain an error code. let acknowledgement = encode_ibc_error(format!("invalid packet: {e}")); - Ok(IbcReceiveResponse::new() - .set_ack(acknowledgement) + Ok(IbcReceiveResponse::new(acknowledgement) .add_event(Event::new("ibc").add_attribute("packet", "receive"))) }) } @@ -269,9 +268,7 @@ fn receive_who_am_i(deps: DepsMut, caller: String) -> StdResult StdResult StdResult { fn execute_return_msgs(msgs: Vec) -> StdResult { let acknowledgement = to_json_binary(&AcknowledgementMsg::::Ok(()))?; - Ok(IbcReceiveResponse::new() - .set_ack(acknowledgement) + Ok(IbcReceiveResponse::new(acknowledgement) .add_messages(msgs) .add_attribute("action", "receive_dispatch")) } diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index ceba3ad015..f4ae78e4ea 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -636,8 +636,14 @@ impl Default for IbcReceiveResponse { } impl IbcReceiveResponse { - pub fn new() -> Self { - Self::default() + /// Create a new response with the given acknowledgement. + pub fn new(ack: impl Into) -> Self { + Self { + acknowledgement: ack.into(), + messages: vec![], + attributes: vec![], + events: vec![], + } } /// Set the acknowledgement for this response. @@ -649,7 +655,7 @@ impl IbcReceiveResponse { /// /// fn make_response_with_ack() -> IbcReceiveResponse { /// let ack = StdAck::success(b"\x01"); // 0x01 is a FungibleTokenPacketSuccess from ICS-20. - /// IbcReceiveResponse::new().set_ack(ack) + /// IbcReceiveResponse::new(ack) /// } /// ``` pub fn set_ack(mut self, ack: impl Into) -> Self { @@ -695,14 +701,14 @@ impl IbcReceiveResponse { /// ## Examples /// /// ``` - /// use cosmwasm_std::{attr, IbcReceiveResponse}; + /// use cosmwasm_std::{attr, IbcReceiveResponse, StdAck}; /// /// let attrs = vec![ /// ("action", "reaction"), /// ("answer", "42"), /// ("another", "attribute"), /// ]; - /// let res: IbcReceiveResponse = IbcReceiveResponse::new().add_attributes(attrs.clone()); + /// let res: IbcReceiveResponse = IbcReceiveResponse::new(StdAck::success(b"\x01")).add_attributes(attrs.clone()); /// assert_eq!(res.attributes, attrs); /// ``` pub fn add_attributes>( @@ -718,10 +724,10 @@ impl IbcReceiveResponse { /// ## Examples /// /// ``` - /// use cosmwasm_std::{CosmosMsg, IbcReceiveResponse}; + /// use cosmwasm_std::{CosmosMsg, IbcReceiveResponse, StdAck}; /// /// fn make_response_with_msgs(msgs: Vec) -> IbcReceiveResponse { - /// IbcReceiveResponse::new().add_messages(msgs) + /// IbcReceiveResponse::new(StdAck::success(b"\x01")).add_messages(msgs) /// } /// ``` pub fn add_messages>>(self, msgs: impl IntoIterator) -> Self { @@ -733,10 +739,10 @@ impl IbcReceiveResponse { /// ## Examples /// /// ``` - /// use cosmwasm_std::{SubMsg, IbcReceiveResponse}; + /// use cosmwasm_std::{SubMsg, StdAck, IbcReceiveResponse}; /// /// fn make_response_with_submsgs(msgs: Vec) -> IbcReceiveResponse { - /// IbcReceiveResponse::new().add_submessages(msgs) + /// IbcReceiveResponse::new(StdAck::success(b"\x01")).add_submessages(msgs) /// } /// ``` pub fn add_submessages(mut self, msgs: impl IntoIterator>) -> Self { diff --git a/packages/std/src/stdack.rs b/packages/std/src/stdack.rs index 64c711ef51..170317fa36 100644 --- a/packages/std/src/stdack.rs +++ b/packages/std/src/stdack.rs @@ -87,8 +87,8 @@ impl StdAck { /// /// let ack = StdAck::success(b"\x01"); // 0x01 is a FungibleTokenPacketSuccess from ICS-20. /// - /// let res: IbcReceiveResponse = IbcReceiveResponse::new().set_ack(ack.to_binary()); - /// let res: IbcReceiveResponse = IbcReceiveResponse::new().set_ack(ack); // Does the same but consumes the instance + /// let res: IbcReceiveResponse = IbcReceiveResponse::new(ack.to_binary()); + /// let res: IbcReceiveResponse = IbcReceiveResponse::new(ack); // Does the same but consumes the instance /// ``` pub fn to_binary(&self) -> Binary { // We need a non-failing StdAck -> Binary conversion to allow using StdAck in From cd5d61c2982136db5b2a271634121bc45e9219c5 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 16 Oct 2023 16:13:29 +0200 Subject: [PATCH 0931/2372] Remove set_ack function from IbcReceiveResponse --- packages/std/src/ibc.rs | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index f4ae78e4ea..a6f53b56cc 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -646,23 +646,6 @@ impl IbcReceiveResponse { } } - /// Set the acknowledgement for this response. - /// - /// ## Examples - /// - /// ``` - /// use cosmwasm_std::{StdAck, IbcReceiveResponse}; - /// - /// fn make_response_with_ack() -> IbcReceiveResponse { - /// let ack = StdAck::success(b"\x01"); // 0x01 is a FungibleTokenPacketSuccess from ICS-20. - /// IbcReceiveResponse::new(ack) - /// } - /// ``` - pub fn set_ack(mut self, ack: impl Into) -> Self { - self.acknowledgement = ack.into(); - self - } - /// Add an attribute included in the main `wasm` event. pub fn add_attribute(mut self, key: impl Into, value: impl Into) -> Self { self.attributes.push(Attribute::new(key, value)); From 87ee3c7fe971ef8c7e9b1575d4aced3bd80e597f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 8 Nov 2023 13:10:13 +0100 Subject: [PATCH 0932/2372] Add example to constructor --- packages/std/src/ibc.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index a6f53b56cc..44032ce707 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -637,6 +637,16 @@ impl Default for IbcReceiveResponse { impl IbcReceiveResponse { /// Create a new response with the given acknowledgement. + /// + /// ## Examples + /// + /// ``` + /// use cosmwasm_std::{StdAck, IbcReceiveResponse}; + /// + /// // 0x01 is a FungibleTokenPacketSuccess from ICS-20. + /// let resp: IbcReceiveResponse = IbcReceiveResponse::new(StdAck::success(b"\x01")); + /// assert_eq!(resp.acknowledgement, b"{\"result\":\"AQ==\"}"); + /// ``` pub fn new(ack: impl Into) -> Self { Self { acknowledgement: ack.into(), From 2b1a3e737343b2900d3e8b7b36ae4888de04488e Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 8 Nov 2023 14:00:09 +0100 Subject: [PATCH 0933/2372] Add changelog and migration entry --- CHANGELOG.md | 3 +++ MIGRATING.md | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 37e8d1c7f6..ec3eebddab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,8 @@ and this project adheres to - cosmwasm-std: Upgrade to `serde-json-wasm` 1.0. This means `u128` and `i128` are now serialized as numbers instead of strings. Use `Uint128` and `Int128` instead. ([#1939]) +- cosmwasm-std: Add `ack` parameter to `IbcReceiveResponse::new` and remove + `IbcReceiveResponse::set_ack` ([#1940]) - cosmwasm-std: Make `BalanceResponse`, `AllBalanceResponse`, `DelegationRewardsResponse`, `DelegatorReward`, `DelegatorValidatorsResponse`, `PortIdResponse`, `ListChannelsResponse`, `ChannelResponse`, @@ -51,6 +53,7 @@ and this project adheres to [#1898]: https://github.com/CosmWasm/cosmwasm/pull/1898 [#1902]: https://github.com/CosmWasm/cosmwasm/pull/1902 [#1939]: https://github.com/CosmWasm/cosmwasm/pull/1939 +[#1940]: https://github.com/CosmWasm/cosmwasm/pull/1940 ### Removed diff --git a/MIGRATING.md b/MIGRATING.md index 04c0b9a24e..5acb3e61e9 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -107,6 +107,13 @@ major releases of `cosmwasm`. Note that you can also view the +const item: Item = Item::new("item"); ``` +- Replace all uses of `IbcReceiveResponse::set_ack` with calls to `IbcReceiveResponse::new`: + + ```diff + - Ok(IbcReceiveResponse::new().set_ack(b"{}")) + + Ok(IbcReceiveResponse::new(b"{}")) + ``` + ## 1.4.x -> 1.5.0 - Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): From 3bee7284b9bfe516abd5568b4c0c48f9fb2b72d3 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 8 Nov 2023 14:18:02 +0100 Subject: [PATCH 0934/2372] Fix formatting --- MIGRATING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MIGRATING.md b/MIGRATING.md index 5acb3e61e9..a6770b4f60 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -107,7 +107,8 @@ major releases of `cosmwasm`. Note that you can also view the +const item: Item = Item::new("item"); ``` -- Replace all uses of `IbcReceiveResponse::set_ack` with calls to `IbcReceiveResponse::new`: +- Replace all uses of `IbcReceiveResponse::set_ack` with calls to + `IbcReceiveResponse::new`: ```diff - Ok(IbcReceiveResponse::new().set_ack(b"{}")) From fdae562a7c499ff7c1b739c0db43bac7c250bde0 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 8 Nov 2023 13:18:00 +0100 Subject: [PATCH 0935/2372] Relax DistributionQuerier::new param type --- packages/std/src/testing/mock.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 1aaad06daf..057def8dd5 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -1,5 +1,6 @@ use alloc::collections::BTreeMap; use bech32::{encode, ToBase32, Variant}; +use core::iter::IntoIterator; use core::marker::PhantomData; #[cfg(feature = "cosmwasm_1_3")] use core::ops::Bound; @@ -998,9 +999,12 @@ pub struct DistributionQuerier { #[cfg(feature = "cosmwasm_1_3")] impl DistributionQuerier { - pub fn new(withdraw_addresses: HashMap) -> Self { + pub fn new(withdraw_addresses: T) -> Self + where + T: IntoIterator, + { DistributionQuerier { - withdraw_addresses, + withdraw_addresses: withdraw_addresses.into_iter().collect(), ..Default::default() } } From e5ef8732f4e7b73303188ec8bed402ca6945d5f7 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 8 Nov 2023 13:31:47 +0100 Subject: [PATCH 0936/2372] Add changelog entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec3eebddab..a790cccba6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,8 @@ and this project adheres to `ValidatorResponse` and `Validator` non-exhaustive. Add `Validator::create` and `FullDelegation::create` to allow creating them in a stable way. Use `Addr` type for `ContractInfoResponse::{creator, admin}`. ([#1883]) +- cosmwasm-std: Change `DistributionQuerier::new` to take `IntoIterator` instead + of `HashMap`. ([#1941]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 @@ -54,6 +56,7 @@ and this project adheres to [#1902]: https://github.com/CosmWasm/cosmwasm/pull/1902 [#1939]: https://github.com/CosmWasm/cosmwasm/pull/1939 [#1940]: https://github.com/CosmWasm/cosmwasm/pull/1940 +[#1941]: https://github.com/CosmWasm/cosmwasm/pull/1941 ### Removed From 44e0220fb422c2e44b9ef62c8f7566a77fa60675 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 8 Nov 2023 15:49:38 +0100 Subject: [PATCH 0937/2372] Use BTreeMap for DistributionQuerier field --- packages/std/src/testing/mock.rs | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 057def8dd5..6336c8b5eb 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -990,7 +990,7 @@ impl StakingQuerier { #[cfg(feature = "cosmwasm_1_3")] #[derive(Clone, Default)] pub struct DistributionQuerier { - withdraw_addresses: HashMap, + withdraw_addresses: BTreeMap, /// Mock of accumulated rewards, indexed first by delegator and then validator address. rewards: BTreeMap>>, /// Mock of validators that a delegator has bonded to. @@ -2363,4 +2363,26 @@ mod tests { fn making_an_address_with_empty_prefix_should_panic() { MockApi::default().with_prefix("").addr_make("creator"); } + + #[test] + fn distribution_querier_new_works() { + let addresses = [ + ("addr0000".to_string(), "addr0001".to_string()), + ("addr0002".to_string(), "addr0001".to_string()), + ]; + let btree_map = BTreeMap::from(addresses.clone()); + + // should still work with HashMap + let hashmap = HashMap::from(addresses.clone()); + let querier = DistributionQuerier::new(hashmap); + assert_eq!(querier.withdraw_addresses, btree_map); + + // should work with BTreeMap + let querier = DistributionQuerier::new(btree_map.clone()); + assert_eq!(querier.withdraw_addresses, btree_map); + + // should work with array + let querier = DistributionQuerier::new(addresses); + assert_eq!(querier.withdraw_addresses, btree_map); + } } From 6df3b4ef4f5024022b5248bf2b51d002e20153da Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 8 Nov 2023 15:59:31 +0100 Subject: [PATCH 0938/2372] Add feature gate --- packages/std/src/testing/mock.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 6336c8b5eb..dcd52214a7 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -2365,6 +2365,7 @@ mod tests { } #[test] + #[cfg(feature = "cosmwasm_1_3")] fn distribution_querier_new_works() { let addresses = [ ("addr0000".to_string(), "addr0001".to_string()), From 4ec8d37368d93e1c9eb9d2f76cf18e3afd080c55 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 9 Nov 2023 15:04:50 +0100 Subject: [PATCH 0939/2372] Remove Default impl for IbcReceiveResponse --- packages/std/src/ibc.rs | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 44032ce707..91fb7cf63a 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -623,18 +623,6 @@ pub struct IbcReceiveResponse { pub events: Vec, } -// Custom implementation in order to implement it for all `T`, even if `T` is not `Default`. -impl Default for IbcReceiveResponse { - fn default() -> Self { - IbcReceiveResponse { - acknowledgement: Binary::default(), - messages: vec![], - attributes: vec![], - events: vec![], - } - } -} - impl IbcReceiveResponse { /// Create a new response with the given acknowledgement. /// From 6c6159de1be469e06424f3087f260c7597767f33 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 9 Nov 2023 16:27:26 +0100 Subject: [PATCH 0940/2372] Add changelog and migrating entry --- CHANGELOG.md | 3 +++ MIGRATING.md | 11 +++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a790cccba6..1b639f28fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -67,12 +67,15 @@ and this project adheres to `ConversionOverflowError` and `DivideByZeroError`. ([#1896]) - cosmwasm-std: Remove old IBC version and make v3 the default. ([#1875]) - cosmwasm-storage: Removed, use [cw-storage-plus] instead. ([#1936]) +- cosmwasm-std: Remove `IbcReceiveResponse`'s `Default` implementation. Use + `IbcReceiveResponse::new` instead. ([#1942]) [cw-storage-plus]: https://github.com/CosmWasm/cw-storage-plus [#1875]: https://github.com/CosmWasm/cosmwasm/pull/1875 [#1890]: https://github.com/CosmWasm/cosmwasm/pull/1890 [#1896]: https://github.com/CosmWasm/cosmwasm/pull/1896 [#1936]: https://github.com/CosmWasm/cosmwasm/pull/1936 +[#1942]: https://github.com/CosmWasm/cosmwasm/pull/1942 ## [1.5.0] - 2023-10-31 diff --git a/MIGRATING.md b/MIGRATING.md index a6770b4f60..cc5450d2e6 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -107,12 +107,15 @@ major releases of `cosmwasm`. Note that you can also view the +const item: Item = Item::new("item"); ``` -- Replace all uses of `IbcReceiveResponse::set_ack` with calls to - `IbcReceiveResponse::new`: +- Replace all uses of `IbcReceiveResponse::set_ack` and + `IbcReceiveResponse::default` with calls to `IbcReceiveResponse::new`: ```diff - - Ok(IbcReceiveResponse::new().set_ack(b"{}")) - + Ok(IbcReceiveResponse::new(b"{}")) + -Ok(IbcReceiveResponse::new().set_ack(b"{}")) + +Ok(IbcReceiveResponse::new(b"{}")) + + -Ok(IbcReceiveResponse::default()) + +Ok(IbcReceiveResponse::new(b"")) ``` ## 1.4.x -> 1.5.0 From 1ad75ec7533487ec3169dc730405b04f622811e6 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 9 Nov 2023 16:39:21 +0100 Subject: [PATCH 0941/2372] Add more custom types to go-gen --- packages/go-gen/src/schema.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/go-gen/src/schema.rs b/packages/go-gen/src/schema.rs index 496d0954c2..09b7a9aa51 100644 --- a/packages/go-gen/src/schema.rs +++ b/packages/go-gen/src/schema.rs @@ -259,12 +259,14 @@ pub fn documentation(schema: &SchemaObject) -> Option { /// If the given type is not a special type, returns `None`. pub fn custom_type_of(ty: &str) -> Option<&str> { match ty { + "Uint64" => Some("string"), "Uint128" => Some("string"), "Binary" => Some("[]byte"), "HexBinary" => Some("Checksum"), "Addr" => Some("string"), "Decimal" => Some("string"), "Decimal256" => Some("string"), + "Timestamp" => Some("uint64"), _ => None, } } From cf7d85daeb102e7d3b594581ddf8f277c6e329c1 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 9 Nov 2023 16:40:20 +0100 Subject: [PATCH 0942/2372] Fix go-gen acronym replacement --- packages/go-gen/src/main.rs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/packages/go-gen/src/main.rs b/packages/go-gen/src/main.rs index 8d3dcc3d40..76b35f8b0a 100644 --- a/packages/go-gen/src/main.rs +++ b/packages/go-gen/src/main.rs @@ -37,7 +37,7 @@ fn generate_go(root: RootSchema) -> Result { for (name, additional_type) in &root.definitions { additional_type .object() - .map(|def| build_type(&replace_acronyms(name), def, &mut types)) + .map(|def| build_type(name, def, &mut types)) .and_then(|r| r) .context("failed to generate additional definitions")?; } @@ -107,7 +107,7 @@ pub fn build_struct( let fields = fields.collect::>>()?; Ok(GoStruct { - name: to_pascal_case(name), + name: replace_acronyms(to_pascal_case(name)), docs, fields, }) @@ -121,6 +121,7 @@ pub fn build_enum<'a>( variants: impl Iterator, additional_structs: &mut Vec, ) -> Result { + let name = replace_acronyms(name); let docs = documentation(enm); // go through all fields @@ -131,18 +132,14 @@ pub fn build_enum<'a>( .with_context(|| format!("expected schema object for enum variants of {name}"))?; // analyze the variant - let variant_field = build_enum_variant(v, name, additional_structs) + let variant_field = build_enum_variant(v, &name, additional_structs) .context("failed to extract enum variant")?; anyhow::Ok(variant_field) }); let fields = fields.collect::>>()?; - Ok(GoStruct { - name: name.to_string(), - docs, - fields, - }) + Ok(GoStruct { name, docs, fields }) } /// Tries to extract the name and type of the given enum variant and returns it as a `GoField`. From f2b28c32d68b8df2324c199bc9df6cabb9e4b166 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 9 Nov 2023 17:55:33 +0100 Subject: [PATCH 0943/2372] Fix field type name --- packages/go-gen/src/schema.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/go-gen/src/schema.rs b/packages/go-gen/src/schema.rs index 09b7a9aa51..cd17fe16f8 100644 --- a/packages/go-gen/src/schema.rs +++ b/packages/go-gen/src/schema.rs @@ -43,12 +43,12 @@ pub fn schema_object_type( replace_custom_type(title) } else if let Some(reference) = &schema.reference { // if it has a reference, strip the path and use that - replace_custom_type( + replace_custom_type(&replace_acronyms( reference .split('/') .last() .expect("split should always return at least one item"), - ) + )) } else if let Some(t) = &schema.instance_type { type_from_instance_type(schema, type_context, t, additional_structs)? } else if let Some(subschemas) = schema.subschemas.as_ref().and_then(|s| s.any_of.as_ref()) { From 64710d2c6e1f9019b186cdf489335b6613467bec Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 9 Nov 2023 17:55:58 +0100 Subject: [PATCH 0944/2372] Add some tests for message go code generation --- packages/go-gen/src/main.rs | 10 ++ .../go-gen/tests/cosmwasm_std__BankMsg.go | 24 ++++ .../tests/cosmwasm_std__DistributionMsg.go | 32 +++++ packages/go-gen/tests/cosmwasm_std__IbcMsg.go | 47 +++++++ .../go-gen/tests/cosmwasm_std__StakingMsg.go | 25 ++++ .../go-gen/tests/cosmwasm_std__WasmMsg.go | 115 ++++++++++++++++++ 6 files changed, 253 insertions(+) create mode 100644 packages/go-gen/tests/cosmwasm_std__BankMsg.go create mode 100644 packages/go-gen/tests/cosmwasm_std__DistributionMsg.go create mode 100644 packages/go-gen/tests/cosmwasm_std__IbcMsg.go create mode 100644 packages/go-gen/tests/cosmwasm_std__StakingMsg.go create mode 100644 packages/go-gen/tests/cosmwasm_std__WasmMsg.go diff --git a/packages/go-gen/src/main.rs b/packages/go-gen/src/main.rs index 76b35f8b0a..0811fbed6a 100644 --- a/packages/go-gen/src/main.rs +++ b/packages/go-gen/src/main.rs @@ -428,6 +428,16 @@ mod tests { compare_codes!(cosmwasm_std::WasmQuery); } + #[test] + fn messages_work() { + compare_codes!(cosmwasm_std::BankMsg); + compare_codes!(cosmwasm_std::StakingMsg); + compare_codes!(cosmwasm_std::DistributionMsg); + compare_codes!(cosmwasm_std::IbcMsg); + compare_codes!(cosmwasm_std::WasmMsg); + // compare_codes!(cosmwasm_std::GovMsg); // TODO: currently fails because of VoteOption + } + #[test] fn array_item_type_works() { #[cw_serde] diff --git a/packages/go-gen/tests/cosmwasm_std__BankMsg.go b/packages/go-gen/tests/cosmwasm_std__BankMsg.go new file mode 100644 index 0000000000..d94723582e --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__BankMsg.go @@ -0,0 +1,24 @@ +// SendMsg contains instructions for a Cosmos-SDK/SendMsg +// It has a fixed interface here and should be converted into the proper SDK format before dispatching +type SendMsg struct { + Amount []Coin `json:"amount"` + ToAddress string `json:"to_address"` +} + +// BurnMsg will burn the given coins from the contract's account. +// There is no Cosmos SDK message that performs this, but it can be done by calling the bank keeper. +// Important if a contract controls significant token supply that must be retired. +type BurnMsg struct { + Amount []Coin `json:"amount"` +} + +type BankMsg struct { + Send *SendMsg `json:"send,omitempty"` + Burn *BurnMsg `json:"burn,omitempty"` +} + +// Coin is a string representation of the sdk.Coin type (more portable than sdk.Int) +type Coin struct { + Amount string `json:"amount"` // string encoing of decimal value, eg. "12.3456" + Denom string `json:"denom"` // type, eg. "ATOM" +} diff --git a/packages/go-gen/tests/cosmwasm_std__DistributionMsg.go b/packages/go-gen/tests/cosmwasm_std__DistributionMsg.go new file mode 100644 index 0000000000..35217b6434 --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__DistributionMsg.go @@ -0,0 +1,32 @@ +// SetWithdrawAddressMsg is translated to a [MsgSetWithdrawAddress](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#L29-L37). +// `delegator_address` is automatically filled with the current contract's address. +type SetWithdrawAddressMsg struct { + // Address contains the `delegator_address` of a MsgSetWithdrawAddress + Address string `json:"address"` +} + +// WithdrawDelegatorRewardMsg is translated to a [MsgWithdrawDelegatorReward](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#L42-L50). +// `delegator_address` is automatically filled with the current contract's address. +type WithdrawDelegatorRewardMsg struct { + // Validator contains `validator_address` of a MsgWithdrawDelegatorReward + Validator string `json:"validator"` +} + +// FundCommunityPoolMsg is translated to a [MsgFundCommunityPool](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#LL69C1-L76C2). +// `depositor` is automatically filled with the current contract's address +type FundCommunityPoolMsg struct { + // Amount is the list of coins to be send to the community pool + Amount []Coin `json:"amount"` +} + +type DistributionMsg struct { + SetWithdrawAddress *SetWithdrawAddressMsg `json:"set_withdraw_address,omitempty"` + WithdrawDelegatorReward *WithdrawDelegatorRewardMsg `json:"withdraw_delegator_reward,omitempty"` + FundCommunityPool *FundCommunityPoolMsg `json:"fund_community_pool,omitempty"` +} + +// Coin is a string representation of the sdk.Coin type (more portable than sdk.Int) +type Coin struct { + Amount string `json:"amount"` // string encoing of decimal value, eg. "12.3456" + Denom string `json:"denom"` // type, eg. "ATOM" +} diff --git a/packages/go-gen/tests/cosmwasm_std__IbcMsg.go b/packages/go-gen/tests/cosmwasm_std__IbcMsg.go new file mode 100644 index 0000000000..d8165ba957 --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__IbcMsg.go @@ -0,0 +1,47 @@ +type TransferMsg struct { + Amount Coin `json:"amount"` + ChannelID string `json:"channel_id"` + Memo string `json:"memo,omitempty"` // this is not yet in wasmvm, but will be soon + Timeout IBCTimeout `json:"timeout"` + ToAddress string `json:"to_address"` +} +type SendPacketMsg struct { + ChannelID string `json:"channel_id"` + Data []byte `json:"data"` + Timeout IBCTimeout `json:"timeout"` +} +type CloseChannelMsg struct { + ChannelID string `json:"channel_id"` +} + +type IBCMsg struct { + Transfer *TransferMsg `json:"transfer,omitempty"` + SendPacket *SendPacketMsg `json:"send_packet,omitempty"` + CloseChannel *CloseChannelMsg `json:"close_channel,omitempty"` +} + +// Coin is a string representation of the sdk.Coin type (more portable than sdk.Int) +type Coin struct { + Amount string `json:"amount"` // string encoing of decimal value, eg. "12.3456" + Denom string `json:"denom"` // type, eg. "ATOM" +} + +// IBCTimeout is the timeout for an IBC packet. At least one of block and timestamp is required. +type IBCTimeout struct { + Block *IBCTimeoutBlock `json:"block,omitempty"` // in wasmvm, this does not have "omitempty" + // Nanoseconds since UNIX epoch + Timestamp uint64 `json:"timestamp,omitempty"` // wasmvm has a "string" in here too +} + +// IBCTimeoutBlock Height is a monotonically increasing data type +// that can be compared against another Height for the purposes of updating and +// freezing clients. +// Ordering is (revision_number, timeout_height) +type IBCTimeoutBlock struct { + // block height after which the packet times out. + // the height within the given revision + Height uint64 `json:"height"` + // the version that the client is currently on + // (eg. after reseting the chain this could increment 1 as height drops to 0) + Revision uint64 `json:"revision"` +} diff --git a/packages/go-gen/tests/cosmwasm_std__StakingMsg.go b/packages/go-gen/tests/cosmwasm_std__StakingMsg.go new file mode 100644 index 0000000000..e7cc377d1f --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__StakingMsg.go @@ -0,0 +1,25 @@ +type DelegateMsg struct { + Amount Coin `json:"amount"` + Validator string `json:"validator"` +} +type UndelegateMsg struct { + Amount Coin `json:"amount"` + Validator string `json:"validator"` +} +type RedelegateMsg struct { + Amount Coin `json:"amount"` + DstValidator string `json:"dst_validator"` + SrcValidator string `json:"src_validator"` +} + +type StakingMsg struct { + Delegate *DelegateMsg `json:"delegate,omitempty"` + Undelegate *UndelegateMsg `json:"undelegate,omitempty"` + Redelegate *RedelegateMsg `json:"redelegate,omitempty"` +} + +// Coin is a string representation of the sdk.Coin type (more portable than sdk.Int) +type Coin struct { + Amount string `json:"amount"` // string encoing of decimal value, eg. "12.3456" + Denom string `json:"denom"` // type, eg. "ATOM" +} diff --git a/packages/go-gen/tests/cosmwasm_std__WasmMsg.go b/packages/go-gen/tests/cosmwasm_std__WasmMsg.go new file mode 100644 index 0000000000..0e7287e61b --- /dev/null +++ b/packages/go-gen/tests/cosmwasm_std__WasmMsg.go @@ -0,0 +1,115 @@ +// ExecuteMsg is used to call another defined contract on this chain. +// The calling contract requires the callee to be defined beforehand, +// and the address should have been defined in initialization. +// And we assume the developer tested the ABIs and coded them together. +// +// Since a contract is immutable once it is deployed, we don't need to transform this. +// If it was properly coded and worked once, it will continue to work throughout upgrades. +type ExecuteMsg struct { + // ContractAddr is the sdk.AccAddress of the contract, which uniquely defines + // the contract ID and instance ID. The sdk module should maintain a reverse lookup table. + ContractAddr string `json:"contract_addr"` + // Send is an optional amount of coins this contract sends to the called contract + Funds []Coin `json:"funds"` + // Msg is assumed to be a json-encoded message, which will be passed directly + // as `userMsg` when calling `Handle` on the above-defined contract + Msg []byte `json:"msg"` +} + +// InstantiateMsg will create a new contract instance from a previously uploaded CodeID. +// This allows one contract to spawn "sub-contracts". +type InstantiateMsg struct { + // Admin (optional) may be set here to allow future migrations from this address + Admin string `json:"admin,omitempty"` + // CodeID is the reference to the wasm byte code as used by the Cosmos-SDK + CodeID uint64 `json:"code_id"` + // Send is an optional amount of coins this contract sends to the called contract + Funds []Coin `json:"funds"` + // Label is optional metadata to be stored with a contract instance. + Label string `json:"label"` + // Msg is assumed to be a json-encoded message, which will be passed directly + // as `userMsg` when calling `Instantiate` on a new contract with the above-defined CodeID + Msg []byte `json:"msg"` +} + +// Instantiate2Msg will create a new contract instance from a previously uploaded CodeID +// using the predictable address derivation. +type Instantiate2Msg struct { + // Admin (optional) may be set here to allow future migrations from this address + Admin string `json:"admin,omitempty"` + // CodeID is the reference to the wasm byte code as used by the Cosmos-SDK + CodeID uint64 `json:"code_id"` + // Send is an optional amount of coins this contract sends to the called contract + Funds []Coin `json:"funds"` + // Label is optional metadata to be stored with a contract instance. + Label string `json:"label"` + // Msg is assumed to be a json-encoded message, which will be passed directly + // as `userMsg` when calling `Instantiate` on a new contract with the above-defined CodeID + Msg []byte `json:"msg"` + Salt []byte `json:"salt"` +} + +// MigrateMsg will migrate an existing contract from it's current wasm code (logic) +// to another previously uploaded wasm code. It requires the calling contract to be +// listed as "admin" of the contract to be migrated. +type MigrateMsg struct { + // ContractAddr is the sdk.AccAddress of the target contract, to migrate. + ContractAddr string `json:"contract_addr"` + // Msg is assumed to be a json-encoded message, which will be passed directly + // as `userMsg` when calling `Migrate` on the above-defined contract + Msg []byte `json:"msg"` + // NewCodeID is the reference to the wasm byte code for the new logic to migrate to + NewCodeID uint64 `json:"new_code_id"` +} + +// UpdateAdminMsg is the Go counterpart of WasmMsg::UpdateAdmin +// (https://github.com/CosmWasm/cosmwasm/blob/v0.14.0-beta5/packages/std/src/results/cosmos_msg.rs#L158-L160). +type UpdateAdminMsg struct { + // Admin is the sdk.AccAddress of the new admin. + Admin string `json:"admin"` + // ContractAddr is the sdk.AccAddress of the target contract. + ContractAddr string `json:"contract_addr"` +} + +// ClearAdminMsg is the Go counterpart of WasmMsg::ClearAdmin +// (https://github.com/CosmWasm/cosmwasm/blob/v0.14.0-beta5/packages/std/src/results/cosmos_msg.rs#L158-L160). +type ClearAdminMsg struct { + // ContractAddr is the sdk.AccAddress of the target contract. + ContractAddr string `json:"contract_addr"` +} + +// The message types of the wasm module. +// +// See https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto +type WasmMsg struct { + // Dispatches a call to another contract at a known address (with known ABI). + // + // This is translated to a [MsgExecuteContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L68-L78). `sender` is automatically filled with the current contract's address. + Execute *ExecuteMsg `json:"execute,omitempty"` + // Instantiates a new contracts from previously uploaded Wasm code. + // + // The contract address is non-predictable. But it is guaranteed that when emitting the same Instantiate message multiple times, multiple instances on different addresses will be generated. See also Instantiate2. + // + // This is translated to a [MsgInstantiateContract](https://github.com/CosmWasm/wasmd/blob/v0.29.2/proto/cosmwasm/wasm/v1/tx.proto#L53-L71). `sender` is automatically filled with the current contract's address. + Instantiate *InstantiateMsg `json:"instantiate,omitempty"` + // Instantiates a new contracts from previously uploaded Wasm code using a predictable address derivation algorithm implemented in [`cosmwasm_std::instantiate2_address`]. + // + // This is translated to a [MsgInstantiateContract2](https://github.com/CosmWasm/wasmd/blob/v0.29.2/proto/cosmwasm/wasm/v1/tx.proto#L73-L96). `sender` is automatically filled with the current contract's address. `fix_msg` is automatically set to false. + Instantiate2 *Instantiate2Msg `json:"instantiate2,omitempty"` + // Migrates a given contracts to use new wasm code. Passes a MigrateMsg to allow us to customize behavior. + // + // Only the contract admin (as defined in wasmd), if any, is able to make this call. + // + // This is translated to a [MsgMigrateContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L86-L96). `sender` is automatically filled with the current contract's address. + Migrate *MigrateMsg `json:"migrate,omitempty"` + // Sets a new admin (for migrate) on the given contract. Fails if this contract is not currently admin of the target contract. + UpdateAdmin *UpdateAdminMsg `json:"update_admin,omitempty"` + // Clears the admin on the given contract, so no more migration possible. Fails if this contract is not currently admin of the target contract. + ClearAdmin *ClearAdminMsg `json:"clear_admin,omitempty"` +} + +// Coin is a string representation of the sdk.Coin type (more portable than sdk.Int) +type Coin struct { + Amount string `json:"amount"` // string encoing of decimal value, eg. "12.3456" + Denom string `json:"denom"` // type, eg. "ATOM" +} From 3730cb8b172e7c035eb87a3b7f2bf04f6b15aa87 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 10 Nov 2023 10:05:23 +0100 Subject: [PATCH 0945/2372] Fix top-level accronym replacement --- packages/go-gen/src/main.rs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/go-gen/src/main.rs b/packages/go-gen/src/main.rs index 0811fbed6a..84ff3932d9 100644 --- a/packages/go-gen/src/main.rs +++ b/packages/go-gen/src/main.rs @@ -21,16 +21,15 @@ fn main() -> Result<()> { /// Generates the Go code for the given schema fn generate_go(root: RootSchema) -> Result { - let title = replace_acronyms( - root.schema - .metadata - .as_ref() - .and_then(|m| m.title.as_ref()) - .context("failed to get type name")?, - ); + let title = root + .schema + .metadata + .as_ref() + .and_then(|m| m.title.as_ref()) + .context("failed to get type name")?; let mut types = vec![]; - build_type(&title, &root.schema, &mut types) + build_type(title, &root.schema, &mut types) .with_context(|| format!("failed to generate {title}"))?; // go through additional definitions From bd805923d1b0e1891939261188afebe12ea05d5f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 10 Nov 2023 10:05:52 +0100 Subject: [PATCH 0946/2372] Add correct accronym replacement test --- packages/go-gen/src/main.rs | 52 +++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/packages/go-gen/src/main.rs b/packages/go-gen/src/main.rs index 84ff3932d9..1a4f8278f2 100644 --- a/packages/go-gen/src/main.rs +++ b/packages/go-gen/src/main.rs @@ -472,4 +472,56 @@ mod tests { }"#, ); } + + #[test] + fn accronym_replacement_works() { + #[cw_serde] + struct IbcStruct { + a: IbcSubStruct, + b: IbcSubEnum, + } + #[cw_serde] + enum IbcEnum { + A(IbcSubStruct), + B(IbcSubEnum), + } + #[cw_serde] + struct IbcSubStruct {} + #[cw_serde] + enum IbcSubEnum { + A(String), + } + + let code = generate_go(cosmwasm_schema::schema_for!(IbcStruct)).unwrap(); + assert_code_eq( + code, + r#" + type IBCStruct struct { + A IBCSubStruct `json:"a"` + B IBCSubEnum `json:"b"` + } + type IBCSubEnum struct { + A string `json:"a,omitempty"` + } + type IBCSubStruct struct { + } + "#, + ); + + let code = generate_go(cosmwasm_schema::schema_for!(IbcEnum)).unwrap(); + assert_code_eq( + code, + r#" + type IBCEnum struct { + A *IBCSubStruct `json:"a,omitempty"` + B *IBCSubEnum `json:"b,omitempty"` + } + type IBCSubEnum struct { + A string `json:"a,omitempty"` + } + type IBCSubStruct struct { + } + "#, + ); + } } From e571f0507e744fd36cecdb35422adcaf9036c6db Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 10 Nov 2023 10:15:32 +0100 Subject: [PATCH 0947/2372] Add signed custom types --- packages/go-gen/src/schema.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/go-gen/src/schema.rs b/packages/go-gen/src/schema.rs index cd17fe16f8..9ee6a8ffcf 100644 --- a/packages/go-gen/src/schema.rs +++ b/packages/go-gen/src/schema.rs @@ -261,11 +261,15 @@ pub fn custom_type_of(ty: &str) -> Option<&str> { match ty { "Uint64" => Some("string"), "Uint128" => Some("string"), + "Int64" => Some("string"), + "Int128" => Some("string"), "Binary" => Some("[]byte"), "HexBinary" => Some("Checksum"), "Addr" => Some("string"), "Decimal" => Some("string"), "Decimal256" => Some("string"), + "SignedDecimal" => Some("string"), + "SignedDecimal256" => Some("string"), "Timestamp" => Some("uint64"), _ => None, } From 669361d1f2831de467356dbd628ddfbb5345f252 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 10 Nov 2023 11:20:32 +0100 Subject: [PATCH 0948/2372] Add optional json annotations for custom types --- packages/go-gen/src/go.rs | 30 +++++++++ packages/go-gen/src/main.rs | 29 ++++++++- packages/go-gen/src/schema.rs | 62 +++++++++++-------- packages/go-gen/tests/cosmwasm_std__IbcMsg.go | 2 +- 4 files changed, 96 insertions(+), 27 deletions(-) diff --git a/packages/go-gen/src/go.rs b/packages/go-gen/src/go.rs index faead10df9..a854c0fb67 100644 --- a/packages/go-gen/src/go.rs +++ b/packages/go-gen/src/go.rs @@ -50,6 +50,9 @@ impl Display for GoField { self.ty, self.rust_name )?; + if let Some(annotations) = &self.ty.json_annotations { + write!(f, ",{}", annotations)?; + } if self.ty.is_nullable { f.write_str(",omitempty")?; } @@ -64,6 +67,8 @@ pub struct GoType { /// This will add `omitempty` to the json tag and use a pointer type if /// the type is not a basic type pub is_nullable: bool, + /// Additional json annotations, if any + pub json_annotations: Option, } impl GoType { @@ -123,10 +128,12 @@ mod tests { let ty = GoType { name: "string".to_string(), is_nullable: true, + json_annotations: None, }; let ty2 = GoType { name: "string".to_string(), is_nullable: false, + json_annotations: None, }; assert_eq!(format!("{}", ty), "string"); assert_eq!(format!("{}", ty2), "string"); @@ -134,11 +141,13 @@ mod tests { let ty = GoType { name: "FooBar".to_string(), is_nullable: true, + json_annotations: None, }; assert_eq!(format!("{}", ty), "*FooBar"); let ty = GoType { name: "FooBar".to_string(), is_nullable: false, + json_annotations: None, }; assert_eq!(format!("{}", ty), "FooBar"); } @@ -151,6 +160,7 @@ mod tests { ty: GoType { name: "string".to_string(), is_nullable: true, + json_annotations: None, }, }; assert_eq!( @@ -164,6 +174,7 @@ mod tests { ty: GoType { name: "string".to_string(), is_nullable: false, + json_annotations: None, }, }; assert_eq!(format!("{}", field), "FooBar string `json:\"foo_bar\"`"); @@ -174,6 +185,7 @@ mod tests { ty: GoType { name: "FooBar".to_string(), is_nullable: true, + json_annotations: None, }, }; assert_eq!( @@ -190,12 +202,28 @@ mod tests { ty: GoType { name: "string".to_string(), is_nullable: true, + json_annotations: None, }, }; assert_eq!( format!("{}", field), "// foo_bar is a test field\nFooBar string `json:\"foo_bar,omitempty\"`" ); + + // now with additional json annotations + let field = GoField { + rust_name: "foo_bar".to_string(), + docs: None, + ty: GoType { + name: "uint64".to_string(), + is_nullable: true, + json_annotations: Some("string".to_string()), + }, + }; + assert_eq!( + format!("{}", field), + "FooBar uint64 `json:\"foo_bar,string,omitempty\"`" + ); } #[test] @@ -209,6 +237,7 @@ mod tests { ty: GoType { name: "string".to_string(), is_nullable: true, + json_annotations: None, }, }], }; @@ -226,6 +255,7 @@ mod tests { ty: GoType { name: "string".to_string(), is_nullable: true, + json_annotations: None, }, }], }; diff --git a/packages/go-gen/src/main.rs b/packages/go-gen/src/main.rs index 1a4f8278f2..b44459ac9c 100644 --- a/packages/go-gen/src/main.rs +++ b/packages/go-gen/src/main.rs @@ -175,7 +175,11 @@ pub fn build_enum_variant( ); // we can unwrap here, because we checked the length above let (name, schema) = properties.first_key_value().unwrap(); - let GoType { name: ty, .. } = schema_object_type( + let GoType { + name: ty, + json_annotations, + .. + } = schema_object_type( schema.object()?, TypeContext::new(enum_name, name), additional_structs, @@ -187,6 +191,7 @@ pub fn build_enum_variant( ty: GoType { name: ty, is_nullable: true, // always nullable + json_annotations, }, }) } @@ -524,4 +529,26 @@ mod tests { "#, ); } + + #[test] + fn timestamp_works() { + use cosmwasm_std::Timestamp; + + #[cw_serde] + struct A { + a: Timestamp, + b: Option, + } + + let code = generate_go(cosmwasm_schema::schema_for!(A)).unwrap(); + assert_code_eq( + code, + r#" + type A struct { + A uint64 `json:"a,string"` + B uint64 `json:"b,string,omitempty"` + } + "#, + ); + } } diff --git a/packages/go-gen/src/schema.rs b/packages/go-gen/src/schema.rs index 9ee6a8ffcf..e166d54522 100644 --- a/packages/go-gen/src/schema.rs +++ b/packages/go-gen/src/schema.rs @@ -39,7 +39,9 @@ pub fn schema_object_type( let mut is_nullable = is_null(schema); // if it has a title, use that - let ty = if let Some(title) = schema.metadata.as_ref().and_then(|m| m.title.as_ref()) { + let (ty, json_annotations) = if let Some(title) = + schema.metadata.as_ref().and_then(|m| m.title.as_ref()) + { replace_custom_type(title) } else if let Some(reference) = &schema.reference { // if it has a reference, strip the path and use that @@ -50,17 +52,25 @@ pub fn schema_object_type( .expect("split should always return at least one item"), )) } else if let Some(t) = &schema.instance_type { - type_from_instance_type(schema, type_context, t, additional_structs)? + ( + type_from_instance_type(schema, type_context, t, additional_structs)?, + None, + ) } else if let Some(subschemas) = schema.subschemas.as_ref().and_then(|s| s.any_of.as_ref()) { // check if one of them is null - let nullable = nullable_type(subschemas)?; + let nullable: Option<&SchemaObject> = nullable_type(subschemas)?; if let Some(non_null) = nullable { ensure!(subschemas.len() == 2, "multiple subschemas in anyOf"); is_nullable = true; // extract non-null type - let GoType { name, .. } = - schema_object_type(non_null, type_context, additional_structs)?; - replace_custom_type(&name) + let GoType { + name, + json_annotations, + .. + } = schema_object_type(non_null, type_context, additional_structs)?; + // let (ty, annotations) = replace_custom_type(&name); + // (ty, annotations.or(json_annotations)) + (name, json_annotations) } else { subschema_type(subschemas, type_context, additional_structs) .context("failed to get type of anyOf subschemas")? @@ -79,6 +89,7 @@ pub fn schema_object_type( Ok(GoType { name: ty, is_nullable, + json_annotations, // TODO: implement }) } @@ -197,11 +208,11 @@ pub fn type_from_instance_type( // for nullable array item types, we have to use a pointer type, even for basic types, // so we can pass null as elements // otherwise they would just be omitted from the array - replace_custom_type(&if item_type.is_nullable { + if item_type.is_nullable { format!("[]*{}", item_type.name) } else { format!("[]{}", item_type.name) - }) + } } else { unreachable!("instance type should be one of the above") }) @@ -233,7 +244,7 @@ pub fn subschema_type( subschemas: &[Schema], type_context: TypeContext, additional_structs: &mut Vec, -) -> Result { +) -> Result<(String, Option)> { ensure!( subschemas.len() == 1, "multiple subschemas are not supported" @@ -257,26 +268,27 @@ pub fn documentation(schema: &SchemaObject) -> Option { /// Maps special types to their Go equivalents. /// If the given type is not a special type, returns `None`. -pub fn custom_type_of(ty: &str) -> Option<&str> { +/// Otherwise, returns a tuple of the Go type name and additional json annotations. +pub fn custom_type_of(ty: &str) -> Option<(&str, Option<&str>)> { match ty { - "Uint64" => Some("string"), - "Uint128" => Some("string"), - "Int64" => Some("string"), - "Int128" => Some("string"), - "Binary" => Some("[]byte"), - "HexBinary" => Some("Checksum"), - "Addr" => Some("string"), - "Decimal" => Some("string"), - "Decimal256" => Some("string"), - "SignedDecimal" => Some("string"), - "SignedDecimal256" => Some("string"), - "Timestamp" => Some("uint64"), + "Uint64" => Some(("string", None)), + "Uint128" => Some(("string", None)), + "Int64" => Some(("string", None)), + "Int128" => Some(("string", None)), + "Binary" => Some(("[]byte", None)), + "HexBinary" => Some(("Checksum", None)), + "Addr" => Some(("string", None)), + "Decimal" => Some(("string", None)), + "Decimal256" => Some(("string", None)), + "SignedDecimal" => Some(("string", None)), + "SignedDecimal256" => Some(("string", None)), + "Timestamp" => Some(("uint64", Some("string"))), _ => None, } } -pub fn replace_custom_type(ty: &str) -> String { +pub fn replace_custom_type(ty: &str) -> (String, Option) { custom_type_of(ty) - .map(|ty| ty.to_string()) - .unwrap_or_else(|| ty.to_string()) + .map(|(ty, json_annotations)| (ty.to_string(), json_annotations.map(String::from))) + .unwrap_or_else(|| (ty.to_string(), None)) } diff --git a/packages/go-gen/tests/cosmwasm_std__IbcMsg.go b/packages/go-gen/tests/cosmwasm_std__IbcMsg.go index d8165ba957..96989755db 100644 --- a/packages/go-gen/tests/cosmwasm_std__IbcMsg.go +++ b/packages/go-gen/tests/cosmwasm_std__IbcMsg.go @@ -30,7 +30,7 @@ type Coin struct { type IBCTimeout struct { Block *IBCTimeoutBlock `json:"block,omitempty"` // in wasmvm, this does not have "omitempty" // Nanoseconds since UNIX epoch - Timestamp uint64 `json:"timestamp,omitempty"` // wasmvm has a "string" in here too + Timestamp uint64 `json:"timestamp,string,omitempty"` // wasmvm has a "string" in here too } // IBCTimeoutBlock Height is a monotonically increasing data type From 4519a23dc42524e44828a35365541eb9746ce266 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Sun, 12 Nov 2023 14:12:22 +0100 Subject: [PATCH 0949/2372] Add missing CHNAGELOG entry for cosmwasm_std::storage_keys to 1.4.0 --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b639f28fa..7c797851d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -155,8 +155,14 @@ and this project adheres to - cosmwasm-std: Add `DistributionQuery::{DelegationRewards, DelegationTotalRewards, DelegatorValidators}`. This requires the `cosmwasm_1_4` feature to be enabled. ([#1788]) +- cosmwasm-std: Export module `cosmwasm_std::storage_keys` with + `namespace_with_key`, `to_length_prefixed` and `to_length_prefixed_nested` to + make it easier to use the strandard storage key layout documented in + [STORAGE_KEYS.md](https://github.com/CosmWasm/cosmwasm/blob/v1.5.0/docs/STORAGE_KEYS.md) + in other libraries such as cw-storage-plus or indexers. ([#1676]) [#1512]: https://github.com/CosmWasm/cosmwasm/issues/1512 +[#1676]: https://github.com/CosmWasm/cosmwasm/pull/1676 [#1799]: https://github.com/CosmWasm/cosmwasm/pull/1799 [#1806]: https://github.com/CosmWasm/cosmwasm/pull/1806 [#1832]: https://github.com/CosmWasm/cosmwasm/pull/1832 From a9a34699643ad85678b220aef452fa1fc3390d29 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 30 Oct 2023 11:55:45 +0100 Subject: [PATCH 0950/2372] Allow storing contracts without instantiate --- packages/vm/src/compatibility.rs | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index dfbbb606a8..e3acab9728 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -44,8 +44,6 @@ const REQUIRED_EXPORTS: &[&str] = &[ // IO "allocate", "deallocate", - // Required entry points - "instantiate", ]; const INTERFACE_VERSION_PREFIX: &str = "interface_version_"; @@ -565,7 +563,6 @@ mod tests { (export "add_one" (func 0)) (export "allocate" (func 0)) (export "deallocate" (func 0)) - (export "instantiate" (func 0)) )"#, ) .unwrap(); @@ -612,20 +609,6 @@ mod tests { } } - #[test] - fn check_wasm_exports_of_old_contract() { - let module = ParsedWasm::parse(CONTRACT_0_7).unwrap(); - match check_wasm_exports(&module) { - Err(VmError::StaticValidationErr { msg, .. }) => { - assert!( - msg.starts_with("Wasm contract doesn't have required export: \"instantiate\"") - ) - } - Err(e) => panic!("Unexpected error {e:?}"), - Ok(_) => panic!("Didn't reject wasm with invalid api"), - } - } - #[test] fn check_wasm_imports_ok() { let wasm = wat::parse_str( From 1eb1fefaab479fa8f7ae51cd2dfd087c60121356 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 30 Oct 2023 14:35:50 +0100 Subject: [PATCH 0951/2372] Make instantiate optional in schema --- packages/schema-derive/src/generate_api.rs | 23 ++++++++++++---------- packages/schema/src/idl.rs | 22 +++++++++++++-------- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/packages/schema-derive/src/generate_api.rs b/packages/schema-derive/src/generate_api.rs index 1306aa613d..82482a7668 100644 --- a/packages/schema-derive/src/generate_api.rs +++ b/packages/schema-derive/src/generate_api.rs @@ -4,7 +4,7 @@ use proc_macro2::TokenStream; use quote::quote; use syn::{ parse::{Parse, ParseStream}, - parse_quote, Block, ExprStruct, Ident, Path, Token, + parse_quote, Block, ExprStruct, Ident, Token, }; pub fn write_api_impl(input: Options) -> Block { @@ -63,7 +63,7 @@ pub fn generate_api_impl(input: &Options) -> ExprStruct { ::cosmwasm_schema::Api { contract_name: #name.to_string(), contract_version: #version.to_string(), - instantiate: ::cosmwasm_schema::schema_for!(#instantiate), + instantiate: #instantiate, execute: #execute, query: #query, migrate: #migrate, @@ -124,7 +124,7 @@ impl Parse for Pair { pub struct Options { name: TokenStream, version: TokenStream, - instantiate: Path, + instantiate: TokenStream, execute: TokenStream, query: TokenStream, migrate: TokenStream, @@ -159,10 +159,13 @@ impl Parse for Options { } }; - let instantiate = map - .remove(&parse_quote!(instantiate)) - .unwrap() - .unwrap_type(); + let instantiate = match map.remove(&parse_quote!(instantiate)) { + Some(ty) => { + let ty = ty.unwrap_type(); + quote! {Some(::cosmwasm_schema::schema_for!(#ty))} + } + None => quote! { None }, + }; let execute = match map.remove(&parse_quote!(execute)) { Some(ty) => { @@ -230,7 +233,7 @@ mod tests { ::cosmwasm_schema::Api { contract_name: ::std::env!("CARGO_PKG_NAME").to_string(), contract_version: ::std::env!("CARGO_PKG_VERSION").to_string(), - instantiate: ::cosmwasm_schema::schema_for!(InstantiateMsg), + instantiate: Some(::cosmwasm_schema::schema_for!(InstantiateMsg)), execute: None, query: None, migrate: None, @@ -253,7 +256,7 @@ mod tests { ::cosmwasm_schema::Api { contract_name: "foo".to_string(), contract_version: "bar".to_string(), - instantiate: ::cosmwasm_schema::schema_for!(InstantiateMsg), + instantiate: Some(::cosmwasm_schema::schema_for!(InstantiateMsg)), execute: None, query: None, migrate: None, @@ -278,7 +281,7 @@ mod tests { ::cosmwasm_schema::Api { contract_name: ::std::env!("CARGO_PKG_NAME").to_string(), contract_version: ::std::env!("CARGO_PKG_VERSION").to_string(), - instantiate: ::cosmwasm_schema::schema_for!(InstantiateMsg), + instantiate: Some(::cosmwasm_schema::schema_for!(InstantiateMsg)), execute: Some(::cosmwasm_schema::schema_for!(ExecuteMsg)), query: Some(::cosmwasm_schema::schema_for!(QueryMsg)), migrate: Some(::cosmwasm_schema::schema_for!(MigrateMsg)), diff --git a/packages/schema/src/idl.rs b/packages/schema/src/idl.rs index 80166b7cdb..e1390fa1b1 100644 --- a/packages/schema/src/idl.rs +++ b/packages/schema/src/idl.rs @@ -15,7 +15,7 @@ pub const IDL_VERSION: &str = "1.0.0"; pub struct Api { pub contract_name: String, pub contract_version: String, - pub instantiate: RootSchema, + pub instantiate: Option, pub execute: Option, pub query: Option, pub migrate: Option, @@ -38,8 +38,10 @@ impl Api { responses: self.responses, }; - if let Some(metadata) = &mut json_api.instantiate.schema.metadata { - metadata.title = Some("InstantiateMsg".to_string()); + if let Some(instantiate) = &mut json_api.instantiate { + if let Some(metadata) = &mut instantiate.schema.metadata { + metadata.title = Some("InstantiateMsg".to_string()); + } } if let Some(execute) = &mut json_api.execute { if let Some(metadata) = &mut execute.schema.metadata { @@ -72,7 +74,7 @@ pub struct JsonApi { contract_name: String, contract_version: String, idl_version: String, - instantiate: RootSchema, + instantiate: Option, execute: Option, query: Option, migrate: Option, @@ -86,10 +88,14 @@ impl JsonApi { } pub fn to_schema_files(&self) -> Result, EncodeError> { - let mut result = vec![( - "instantiate.json".to_string(), - serde_json::to_string_pretty(&self.instantiate)?, - )]; + let mut result = Vec::new(); + + if let Some(instantiate) = &self.instantiate { + result.push(( + "instantiate.json".to_string(), + serde_json::to_string_pretty(&instantiate)?, + )); + } if let Some(execute) = &self.execute { result.push(( From 333cc74ce3e7d8084f8d28b9dcbd47e8cacd972a Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 30 Oct 2023 15:20:11 +0100 Subject: [PATCH 0952/2372] Add empty contract --- contracts/empty/.cargo/config | 6 + contracts/empty/Cargo.lock | 1989 ++++++++++++++++++++++++++ contracts/empty/Cargo.toml | 40 + contracts/empty/README.md | 4 + contracts/empty/schema/empty.json | 11 + contracts/empty/src/bin/schema.rs | 5 + contracts/empty/src/lib.rs | 2 + contracts/empty/tests/integration.rs | 52 + 8 files changed, 2109 insertions(+) create mode 100644 contracts/empty/.cargo/config create mode 100644 contracts/empty/Cargo.lock create mode 100644 contracts/empty/Cargo.toml create mode 100644 contracts/empty/README.md create mode 100644 contracts/empty/schema/empty.json create mode 100644 contracts/empty/src/bin/schema.rs create mode 100644 contracts/empty/src/lib.rs create mode 100644 contracts/empty/tests/integration.rs diff --git a/contracts/empty/.cargo/config b/contracts/empty/.cargo/config new file mode 100644 index 0000000000..f5174787c2 --- /dev/null +++ b/contracts/empty/.cargo/config @@ -0,0 +1,6 @@ +[alias] +wasm = "build --release --lib --target wasm32-unknown-unknown" +wasm-debug = "build --lib --target wasm32-unknown-unknown" +unit-test = "test --lib" +integration-test = "test --test integration" +schema = "run --bin schema" diff --git a/contracts/empty/Cargo.lock b/contracts/empty/Cargo.lock new file mode 100644 index 0000000000..4f79839e89 --- /dev/null +++ b/contracts/empty/Cargo.lock @@ -0,0 +1,1989 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a2e47a1fbe209ee101dd6d61285226744c6c8d3c21c8dc878ba6cb9f467f3a" +dependencies = [ + "gimli 0.24.0", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom 0.2.3", + "once_cell", + "version_check", +] + +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7815ea54e4d821e791162e078acbebfd6d8c8939cd559c9335dceb1c8ca7282" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" + +[[package]] +name = "base64ct" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea908e7347a8c64e378c17e30ef880ad73e3b4498346b055c2c00ea342f3179" + +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bnum" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" + +[[package]] +name = "bumpalo" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" + +[[package]] +name = "bytecheck" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13fe11640a23eb24562225322cd3e452b93a3d4091d62fab69c70542fcd17d1f" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + +[[package]] +name = "cc" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70cc2f62c6ce1868963827bd677764c62d07c3d9a3e1fb1177ee1a9ab199eb2" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clru" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8191fa7302e03607ff0e237d4246cc043ff5b3cb9409d995172ba3bea16b807" + +[[package]] +name = "const-oid" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" + +[[package]] +name = "corosensei" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9847f90f32a50b0dcbd68bc23ff242798b13080b97b0569f6ed96a45ce4cf2cd" +dependencies = [ + "autocfg", + "cfg-if", + "libc", + "scopeguard", + "windows-sys", +] + +[[package]] +name = "cosmwasm-crypto" +version = "1.5.0-rc.0" +dependencies = [ + "digest 0.10.7", + "ecdsa", + "ed25519-zebra", + "k256", + "rand_core 0.6.4", + "thiserror", +] + +[[package]] +name = "cosmwasm-derive" +version = "1.5.0-rc.0" +dependencies = [ + "syn 1.0.109", +] + +[[package]] +name = "cosmwasm-schema" +version = "1.5.0-rc.0" +dependencies = [ + "cosmwasm-schema-derive", + "schemars", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cosmwasm-schema-derive" +version = "1.5.0-rc.0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "cosmwasm-std" +version = "1.5.0-rc.0" +dependencies = [ + "base64", + "bech32", + "bnum", + "cosmwasm-crypto", + "cosmwasm-derive", + "derivative", + "forward_ref", + "hex", + "schemars", + "serde", + "serde-json-wasm", + "sha2 0.10.3", + "static_assertions", + "thiserror", +] + +[[package]] +name = "cosmwasm-vm" +version = "1.5.0-rc.0" +dependencies = [ + "bitflags", + "bytecheck", + "bytes", + "clru", + "cosmwasm-crypto", + "cosmwasm-std", + "crc32fast", + "derivative", + "enumset", + "hex", + "schemars", + "serde", + "serde_json", + "sha2 0.10.3", + "thiserror", + "wasmer", + "wasmer-middlewares", +] + +[[package]] +name = "cpufeatures" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66c99696f6c9dd7f35d486b9d04d7e6e202aa3e8c40d553f2fdf5e7e0c6a71ef" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +dependencies = [ + "libc", +] + +[[package]] +name = "cranelift-bforest" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2ab4512dfd3a6f4be184403a195f76e81a8a9f9e6c898e19d2dc3ce20e0115" +dependencies = [ + "cranelift-entity", +] + +[[package]] +name = "cranelift-codegen" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98b022ed2a5913a38839dfbafe6cf135342661293b08049843362df4301261dc" +dependencies = [ + "arrayvec", + "bumpalo", + "cranelift-bforest", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-egraph", + "cranelift-entity", + "cranelift-isle", + "gimli 0.26.1", + "log", + "regalloc2", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "639307b45434ad112a98f8300c0f0ab085cbefcd767efcdef9ef19d4c0756e74" +dependencies = [ + "cranelift-codegen-shared", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278e52e29c53fcf32431ef08406c295699a70306d05a0715c5b1bf50e33a9ab7" + +[[package]] +name = "cranelift-egraph" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624b54323b06e675293939311943ba82d323bb340468ce1889be5da7932c8d73" +dependencies = [ + "cranelift-entity", + "fxhash", + "hashbrown", + "indexmap", + "log", + "smallvec", +] + +[[package]] +name = "cranelift-entity" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a59bcbca89c3f1b70b93ab3cbba5e5e0cbf3e63dadb23c7525cb142e21a9d4c" + +[[package]] +name = "cranelift-frontend" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d70abacb8cfef3dc8ff7e8836e9c1d70f7967dfdac824a4cd5e30223415aca6" +dependencies = [ + "cranelift-codegen", + "log", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-isle" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "393bc73c451830ff8dbb3a07f61843d6cb41a084f9996319917c0b291ed785bb" + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "lazy_static", + "memoffset 0.6.4", + "scopeguard", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" +dependencies = [ + "cfg-if", + "lazy_static", +] + +[[package]] +name = "crypto-bigint" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "curve25519-dalek" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "639891fde0dbea823fc3d798a0fdf9d2f9440a42d64a78ab3488b0ca025117b3" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "darling" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "syn 2.0.37", +] + +[[package]] +name = "darling_macro" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.37", +] + +[[package]] +name = "dashmap" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" +dependencies = [ + "cfg-if", + "hashbrown", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "der" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.2", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dyn-clone" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee2626afccd7561a06cf1367e2950c4718ea04565e20fb5029b6c7d8ad09abcf" + +[[package]] +name = "dynasm" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "add9a102807b524ec050363f09e06f1504214b0e1c7797f64261c891022dce8b" +dependencies = [ + "bitflags", + "byteorder", + "lazy_static", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "dynasmrt" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64fba5a42bd76a17cad4bfa00de168ee1cbfa06a5e8ce992ae880218c05641a9" +dependencies = [ + "byteorder", + "dynasm", + "memmap2 0.5.0", +] + +[[package]] +name = "ecdsa" +version = "0.16.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "ed25519-zebra" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "403ef3e961ab98f0ba902771d29f842058578bb1ce7e3c59dad5a6a93e784c69" +dependencies = [ + "curve25519-dalek", + "hex", + "rand_core 0.6.4", + "serde", + "sha2 0.9.5", + "thiserror", + "zeroize", +] + +[[package]] +name = "either" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" + +[[package]] +name = "elliptic-curve" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "empty" +version = "0.0.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cosmwasm-vm", + "schemars", +] + +[[package]] +name = "enum-iterator" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eeac5c5edb79e4e39fe8439ef35207780a11f69c52cbe424ce3dfad4cb78de6" +dependencies = [ + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "enumset" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e875f1719c16de097dee81ed675e2d9bb63096823ed3f0ca827b7dea3028bbbb" +dependencies = [ + "enumset_derive", +] + +[[package]] +name = "enumset_derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08b6c6ab82d70f08844964ba10c7babb716de2ecaeab9be5717918a5177d3af" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.37", +] + +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "forward_ref" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", +] + +[[package]] +name = "gimli" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189" + +[[package]] +name = "gimli" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" +dependencies = [ + "fallible-iterator", + "indexmap", + "stable_deref_trait", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash", +] + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "itoa" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" + +[[package]] +name = "js-sys" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "k256" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2 0.10.3", + "signature", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "leb128" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3576a87f2ba00f6f106fdfcd16db1d698d648a26ad8e0573cad8537c3c362d2a" + +[[package]] +name = "libc" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" + +[[package]] +name = "lock_api" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + +[[package]] +name = "memmap2" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4647a11b578fead29cdbb34d4adef8dd3dc35b876c9c6d5240d83f205abfe96e" +dependencies = [ + "libc", +] + +[[package]] +name = "memmap2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d28bba84adfe6646737845bc5ebbfa2c08424eb1c37e94a1fd2a82adb56a872" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg", +] + +[[package]] +name = "more-asserts" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" + +[[package]] +name = "num_cpus" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a38f2be3697a57b4060074ff41b44c16870d916ad7877c17696e063257482bc7" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "parking_lot_core" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "percent-encoding" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" + +[[package]] +name = "pin-project-lite" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.3", +] + +[[package]] +name = "rayon" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" +dependencies = [ + "autocfg", + "crossbeam-deque", + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "lazy_static", + "num_cpus", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regalloc2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300d4fbfb40c1c66a78ba3ddd41c1110247cf52f97b87d0f2fc9209bd49b030c" +dependencies = [ + "fxhash", + "log", + "slice-group-by", + "smallvec", +] + +[[package]] +name = "region" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76e189c2369884dce920945e2ddf79b3dff49e071a167dd1817fa9c4c00d512e" +dependencies = [ + "bitflags", + "libc", + "mach", + "winapi", +] + +[[package]] +name = "rend" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "rkyv" +version = "0.7.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21499ed91807f07ae081880aabb2ccc0235e9d88011867d984525e9a4c3cfa3e" +dependencies = [ + "bytecheck", + "hashbrown", + "indexmap", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" + +[[package]] +name = "ryu" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" + +[[package]] +name = "schemars" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 1.0.109", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "self_cell" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" + +[[package]] +name = "serde" +version = "1.0.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-json-wasm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" +dependencies = [ + "serde", +] + +[[package]] +name = "serde-wasm-bindgen" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde_derive" +version = "1.0.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "serde_derive_internals" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "serde_json" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b362ae5752fd2137731f9fa25fd4d9058af34666ca1966fb969119cc35719f12" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures 0.1.5", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899bf02746a2c92bf1053d9327dadb252b01af1f81f90cdb902411f518bc7215" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.2", + "digest 0.10.7", +] + +[[package]] +name = "shared-buffer" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +dependencies = [ + "bytes", + "memmap2 0.6.2", +] + +[[package]] +name = "signature" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + +[[package]] +name = "slice-group-by" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" + +[[package]] +name = "smallvec" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" + +[[package]] +name = "spki" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "target-lexicon" +version = "0.12.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5" + +[[package]] +name = "thiserror" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tracing" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "tracing-core" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9ff14f98b1a4b289c6248a023c1c2fa1491062964e9fed67ab29c4e4da4a052" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + +[[package]] +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "version_check" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "wasm-bindgen" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 1.0.109", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-downcast" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" +dependencies = [ + "js-sys", + "once_cell", + "wasm-bindgen", + "wasm-bindgen-downcast-macros", +] + +[[package]] +name = "wasm-bindgen-downcast-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" + +[[package]] +name = "wasmer" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" +dependencies = [ + "bytes", + "cfg-if", + "derivative", + "indexmap", + "js-sys", + "more-asserts", + "rustc-demangle", + "serde", + "serde-wasm-bindgen", + "shared-buffer", + "target-lexicon", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-downcast", + "wasmer-compiler", + "wasmer-compiler-cranelift", + "wasmer-compiler-singlepass", + "wasmer-derive", + "wasmer-types", + "wasmer-vm", + "winapi", +] + +[[package]] +name = "wasmer-compiler" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" +dependencies = [ + "backtrace", + "bytes", + "cfg-if", + "enum-iterator", + "enumset", + "lazy_static", + "leb128", + "memmap2 0.5.0", + "more-asserts", + "region", + "rkyv", + "self_cell", + "shared-buffer", + "smallvec", + "thiserror", + "wasmer-types", + "wasmer-vm", + "wasmparser", + "winapi", +] + +[[package]] +name = "wasmer-compiler-cranelift" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" +dependencies = [ + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "gimli 0.26.1", + "more-asserts", + "rayon", + "smallvec", + "target-lexicon", + "tracing", + "wasmer-compiler", + "wasmer-types", +] + +[[package]] +name = "wasmer-compiler-singlepass" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" +dependencies = [ + "byteorder", + "dynasm", + "dynasmrt", + "enumset", + "gimli 0.26.1", + "lazy_static", + "more-asserts", + "rayon", + "smallvec", + "wasmer-compiler", + "wasmer-types", +] + +[[package]] +name = "wasmer-derive" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "wasmer-middlewares" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" +dependencies = [ + "wasmer", + "wasmer-types", + "wasmer-vm", +] + +[[package]] +name = "wasmer-types" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" +dependencies = [ + "bytecheck", + "enum-iterator", + "enumset", + "indexmap", + "more-asserts", + "rkyv", + "target-lexicon", + "thiserror", +] + +[[package]] +name = "wasmer-vm" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" +dependencies = [ + "backtrace", + "cc", + "cfg-if", + "corosensei", + "crossbeam-queue", + "dashmap", + "derivative", + "enum-iterator", + "fnv", + "indexmap", + "lazy_static", + "libc", + "mach", + "memoffset 0.8.0", + "more-asserts", + "region", + "scopeguard", + "thiserror", + "wasmer-types", + "winapi", +] + +[[package]] +name = "wasmparser" +version = "0.95.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ea896273ea99b15132414be1da01ab0d8836415083298ecaffbe308eaac87a" +dependencies = [ + "indexmap", + "url", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43dbb096663629518eb1dfa72d80243ca5a6aca764cae62a2df70af760a9be75" +dependencies = [ + "windows_aarch64_msvc 0.33.0", + "windows_i686_gnu 0.33.0", + "windows_i686_msvc 0.33.0", + "windows_x86_64_gnu 0.33.0", + "windows_x86_64_msvc 0.33.0", +] + +[[package]] +name = "windows-targets" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc 0.48.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "zeroize" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" diff --git a/contracts/empty/Cargo.toml b/contracts/empty/Cargo.toml new file mode 100644 index 0000000000..6b9be1e37d --- /dev/null +++ b/contracts/empty/Cargo.toml @@ -0,0 +1,40 @@ +[package] +name = "empty" +version = "0.0.0" +authors = ["Christoph Otter "] +edition = "2021" +publish = false +license = "Apache-2.0" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +crate-type = ["cdylib", "rlib"] + +[profile.release] +opt-level = 3 +debug = false +rpath = false +lto = true +debug-assertions = false +codegen-units = 1 +panic = 'abort' +incremental = false +overflow-checks = true + +[features] +# Add feature "cranelift" to default if you need 32 bit or ARM support +default = [] +# Use cranelift backend instead of singlepass. This is required for development on 32 bit or ARM machines. +cranelift = ["cosmwasm-vm/cranelift"] +# for quicker tests, cargo test --lib +# for more explicit tests, cargo test --features=backtraces +backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] + +[dependencies] +cosmwasm-schema = { path = "../../packages/schema" } +cosmwasm-std = { path = "../../packages/std", features = ["iterator"] } +schemars = "0.8.3" + +[dev-dependencies] +cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator"] } diff --git a/contracts/empty/README.md b/contracts/empty/README.md new file mode 100644 index 0000000000..8506f007b9 --- /dev/null +++ b/contracts/empty/README.md @@ -0,0 +1,4 @@ +# Empty Contract + +This is a minimal contract to test against. It has no functionality and only has +the minimum required to be a valid contract. diff --git a/contracts/empty/schema/empty.json b/contracts/empty/schema/empty.json new file mode 100644 index 0000000000..58d5e48c12 --- /dev/null +++ b/contracts/empty/schema/empty.json @@ -0,0 +1,11 @@ +{ + "contract_name": "empty", + "contract_version": "0.0.0", + "idl_version": "1.0.0", + "instantiate": null, + "execute": null, + "query": null, + "migrate": null, + "sudo": null, + "responses": null +} diff --git a/contracts/empty/src/bin/schema.rs b/contracts/empty/src/bin/schema.rs new file mode 100644 index 0000000000..d240ff2b48 --- /dev/null +++ b/contracts/empty/src/bin/schema.rs @@ -0,0 +1,5 @@ +use cosmwasm_schema::write_api; + +fn main() { + write_api! {} +} diff --git a/contracts/empty/src/lib.rs b/contracts/empty/src/lib.rs new file mode 100644 index 0000000000..2e91145396 --- /dev/null +++ b/contracts/empty/src/lib.rs @@ -0,0 +1,2 @@ +// Make sure to reexport cosmwasm_std, so it is kept in the final wasm +pub use cosmwasm_std; diff --git a/contracts/empty/tests/integration.rs b/contracts/empty/tests/integration.rs new file mode 100644 index 0000000000..b42805031d --- /dev/null +++ b/contracts/empty/tests/integration.rs @@ -0,0 +1,52 @@ +//! This integration test tries to run and call the generated wasm. +//! It depends on a Wasm build being available, which you can create with `cargo wasm`. +//! Then running `cargo integration-test` will validate we can properly call into that generated Wasm. +//! +//! You can easily convert unit tests to integration tests. +//! 1. First copy them over verbatum, +//! 2. Then change +//! let mut deps = mock_dependencies(20, &[]); +//! to +//! let mut deps = mock_instance(WASM, &[]); +//! 3. If you access raw storage, where ever you see something like: +//! deps.storage.get(CONFIG_KEY).expect("no data stored"); +//! replace it with: +//! deps.with_storage(|store| { +//! let data = store.get(CONFIG_KEY).expect("no data stored"); +//! //... +//! }); +//! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) + +use cosmwasm_std::{coins, to_json_vec, ContractResult, Empty, Response}; +use cosmwasm_vm::{ + call_instantiate, + testing::{mock_env, mock_info, mock_instance}, + VmError, +}; + +// This line will test the output of cargo wasm +static WASM: &[u8] = include_bytes!("../target/wasm32-unknown-unknown/release/empty.wasm"); +// You can uncomment this line instead to test productionified build from rust-optimizer +// static WASM: &[u8] = include_bytes!("../contract.wasm"); + +#[test] +fn instantiate_fails() { + let mut deps = mock_instance(WASM, &[]); + + let msg = Empty {}; + let info = mock_info("creator", &coins(1000, "earth")); + + let serialized_msg = to_json_vec(&msg).unwrap(); + let result: Result, VmError> = + call_instantiate(&mut deps, &mock_env(), &info, &serialized_msg); + let err = result.unwrap_err(); + + assert!(matches!( + err, + VmError::ResolveErr { + msg, + .. + } + if msg == "Could not get export: Missing export instantiate" + )); +} From 2d9687fb65a970c9eb6f6b0e6b197965615ba35f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 30 Oct 2023 16:45:59 +0100 Subject: [PATCH 0953/2372] Add tests for empty contract --- contracts/empty/tests/integration.rs | 28 ++----------------- packages/check/tests/cosmwasm_check_tests.rs | 12 ++++++++ packages/vm/src/calls.rs | 23 +++++++++++++++ packages/vm/testdata/empty.wasm | Bin 0 -> 13676 bytes 4 files changed, 38 insertions(+), 25 deletions(-) create mode 100644 packages/vm/testdata/empty.wasm diff --git a/contracts/empty/tests/integration.rs b/contracts/empty/tests/integration.rs index b42805031d..e2973d6a07 100644 --- a/contracts/empty/tests/integration.rs +++ b/contracts/empty/tests/integration.rs @@ -17,12 +17,7 @@ //! }); //! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) -use cosmwasm_std::{coins, to_json_vec, ContractResult, Empty, Response}; -use cosmwasm_vm::{ - call_instantiate, - testing::{mock_env, mock_info, mock_instance}, - VmError, -}; +use cosmwasm_vm::testing::mock_instance; // This line will test the output of cargo wasm static WASM: &[u8] = include_bytes!("../target/wasm32-unknown-unknown/release/empty.wasm"); @@ -30,23 +25,6 @@ static WASM: &[u8] = include_bytes!("../target/wasm32-unknown-unknown/release/em // static WASM: &[u8] = include_bytes!("../contract.wasm"); #[test] -fn instantiate_fails() { - let mut deps = mock_instance(WASM, &[]); - - let msg = Empty {}; - let info = mock_info("creator", &coins(1000, "earth")); - - let serialized_msg = to_json_vec(&msg).unwrap(); - let result: Result, VmError> = - call_instantiate(&mut deps, &mock_env(), &info, &serialized_msg); - let err = result.unwrap_err(); - - assert!(matches!( - err, - VmError::ResolveErr { - msg, - .. - } - if msg == "Could not get export: Missing export instantiate" - )); +fn validation_succeeds() { + mock_instance(WASM, &[]); } diff --git a/packages/check/tests/cosmwasm_check_tests.rs b/packages/check/tests/cosmwasm_check_tests.rs index 751ac2ae0e..c28187a1af 100644 --- a/packages/check/tests/cosmwasm_check_tests.rs +++ b/packages/check/tests/cosmwasm_check_tests.rs @@ -14,6 +14,18 @@ fn valid_contract_check() -> Result<(), Box> { Ok(()) } +#[test] +fn empty_contract_check() -> Result<(), Box> { + let mut cmd = Command::cargo_bin("cosmwasm-check")?; + + cmd.arg("../vm/testdata/empty.wasm"); + cmd.assert() + .success() + .stdout(predicate::str::contains("pass")); + + Ok(()) +} + #[test] fn invalid_contract_check() -> Result<(), Box> { let mut cmd = Command::cargo_bin("cosmwasm-check")?; diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index d64216380f..29d1b9a3ab 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -599,6 +599,7 @@ mod tests { static CONTRACT: &[u8] = include_bytes!("../testdata/hackatom.wasm"); static CYBERPUNK: &[u8] = include_bytes!("../testdata/cyberpunk.wasm"); static FLOATY2: &[u8] = include_bytes!("../testdata/floaty_2.0.wasm"); + static EMPTY: &[u8] = include_bytes!("../testdata/empty.wasm"); #[test] fn call_instantiate_works() { @@ -612,6 +613,28 @@ mod tests { .unwrap(); } + #[test] + fn call_instantiate_handles_missing_export() { + let mut deps = mock_instance(EMPTY, &[]); + + let msg = Empty {}; + let info = mock_info("creator", &coins(1000, "earth")); + + let serialized_msg = to_vec(&msg).unwrap(); + let err = + call_instantiate::<_, _, _, Empty>(&mut deps, &mock_env(), &info, &serialized_msg) + .unwrap_err(); + + assert!(matches!( + err, + VmError::ResolveErr { + msg, + .. + } + if msg == "Could not get export: Missing export instantiate" + )); + } + #[test] fn call_execute_works() { let mut instance = mock_instance(CONTRACT, &[]); diff --git a/packages/vm/testdata/empty.wasm b/packages/vm/testdata/empty.wasm new file mode 100644 index 0000000000000000000000000000000000000000..fe3ef96899a52911bd117acb15bddc385a2cba3b GIT binary patch literal 13676 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 a);71UmTOxEt^rT~%Z$H+vYGb_n)hGH|Jru| literal 0 HcmV?d00001 From 0dbfbc64a5f8fff3bb51b536e695d214f354d638 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 30 Oct 2023 17:10:32 +0100 Subject: [PATCH 0954/2372] Add empty contract to ci --- .circleci/config.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 31a018aa70..373cf84054 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -65,6 +65,7 @@ workflows: - contract_reflect - contract_staking - contract_virus + - contract_empty - fmt - fmt_extra - clippy: @@ -754,6 +755,33 @@ jobs: - target/wasm32-unknown-unknown/release/deps key: cargocache-v2-contract_virus-rust:1.70.0-{{ checksum "Cargo.lock" }} + contract_empty: + docker: + - image: rust:1.70.0 + environment: + RUST_BACKTRACE: 1 + working_directory: ~/cosmwasm/contracts/empty + steps: + - checkout: + path: ~/cosmwasm + - run: + name: Version information + command: rustc --version; cargo --version; rustup --version + - restore_cache: + keys: + - cargocache-v2-contract_empty-rust:1.70.0-{{ checksum "Cargo.lock" }} + - check_contract + - save_cache: + paths: + - /usr/local/cargo/registry + - target/debug/.fingerprint + - target/debug/build + - target/debug/deps + - target/wasm32-unknown-unknown/release/.fingerprint + - target/wasm32-unknown-unknown/release/build + - target/wasm32-unknown-unknown/release/deps + key: cargocache-v2-contract_empty-rust:1.70.0-{{ checksum "Cargo.lock" }} + fmt: docker: - image: rust:1.70.0 From 3fc63f4bc91d906ddc79449d3c617e0ebf1ba716 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 31 Oct 2023 10:14:28 +0100 Subject: [PATCH 0955/2372] Update readmes --- contracts/README.md | 7 +++++++ packages/vm/README.md | 18 +++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/contracts/README.md b/contracts/README.md index 7ed97a842b..35a60dd720 100644 --- a/contracts/README.md +++ b/contracts/README.md @@ -38,6 +38,8 @@ Introducing the development contracts in the order they were created. that hackatom has. 10. **virus** is a contract that reproduces itself and does nothing useful beyond that, showing how to use instantiate2 from a contract. +11. **empty** is an empty contract that does nothing. It is used to test that we + can store contracts with no entry points. ## Optimized builds @@ -99,6 +101,11 @@ docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_virus",target=/code/contracts/virus/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ cosmwasm/rust-optimizer:0.12.13 ./contracts/virus + +docker run --rm -v "$(pwd)":/code \ + --mount type=volume,source="devcontract_cache_empty",target=/code/contracts/empty/target \ + --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ + cosmwasm/rust-optimizer:0.12.13 ./contracts/empty ``` ## Entry points diff --git a/packages/vm/README.md b/packages/vm/README.md index a50ae52130..8ed9ad94df 100644 --- a/packages/vm/README.md +++ b/packages/vm/README.md @@ -5,8 +5,8 @@ This is an abstraction layer around the wasmer VM to expose just what we need to run cosmwasm contracts in a high-level manner. This is intended both for efficient writing of unit tests, as well as a public API to run contracts in eg. -go-cosmwasm. As such it includes all glue code needed for typical actions, like -fs caching. +[wasmvm](https://github.com/CosmWasm/wasmvm). As such it includes all glue code +needed for typical actions, like fs caching. ## Compatibility @@ -69,10 +69,10 @@ docker run --rm -v "$(pwd)":/code \ && cp artifacts/ibc_reflect.wasm packages/vm/testdata/ibc_reflect_1.2.wasm docker run --rm -v "$(pwd)":/code \ - --mount type=volume,source="devcontract_cache_floaty",target=/code/contracts/floaty/target \ + --mount type=volume,source="devcontract_cache_empty",target=/code/contracts/empty/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.13 ./contracts/floaty \ - && cp artifacts/floaty.wasm packages/vm/testdata/floaty_1.2.wasm + cosmwasm/rust-optimizer:0.12.13 ./contracts/empty \ + && cp artifacts/empty.wasm packages/vm/testdata/empty.wasm ``` The `cyberpunk_rust170.wasm` for @@ -86,6 +86,14 @@ RUSTFLAGS='-C link-arg=-s' cargo build --release --lib --target wasm32-unknown-u cp target/wasm32-unknown-unknown/release/cyberpunk.wasm ../../packages/vm/testdata/cyberpunk_rust170.wasm ``` +The `floaty_2.0.wasm` is built using Rust nightly as follows (non-reproducible): + +```sh +cd contracts/floaty +RUSTFLAGS="-C link-arg=-s -C target-feature=+nontrapping-fptoint" cargo wasm +cp target/wasm32-unknown-unknown/release/floaty.wasm ../../packages/vm/testdata/floaty_2.0.wasm +``` + ## Testing By default, this repository is built and tested with the singlepass backend. You From cf3fc5734acd921ac6e61c1bae360a26f542a390 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 31 Oct 2023 10:14:34 +0100 Subject: [PATCH 0956/2372] Change wording --- contracts/empty/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/empty/src/lib.rs b/contracts/empty/src/lib.rs index 2e91145396..ce476b6e8d 100644 --- a/contracts/empty/src/lib.rs +++ b/contracts/empty/src/lib.rs @@ -1,2 +1,2 @@ -// Make sure to reexport cosmwasm_std, so it is kept in the final wasm +// Make sure to reexport cosmwasm_std, so the standard entry points are kept in the final wasm pub use cosmwasm_std; From 03f2080534357b5883f7b30c36e605f162d1e700 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 10 Nov 2023 11:33:30 +0100 Subject: [PATCH 0957/2372] Sort contracts in ci config --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 373cf84054..6412da3308 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -57,15 +57,15 @@ workflows: - contract_burner - contract_crypto_verify - contract_cyberpunk + - contract_empty + # - contract_floaty # This contract needs nightly Rust to compile - contract_hackatom - contract_ibc_reflect - contract_ibc_reflect_send - # - contract_floaty # This contract needs nightly Rust to compile - contract_queue - contract_reflect - contract_staking - contract_virus - - contract_empty - fmt - fmt_extra - clippy: From c630c3d6a00973c4287eb3e5fc5e1a6db6c05e61 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 10 Nov 2023 11:34:45 +0100 Subject: [PATCH 0958/2372] Fix minimal schema-derive test --- packages/schema-derive/src/generate_api.rs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/schema-derive/src/generate_api.rs b/packages/schema-derive/src/generate_api.rs index 82482a7668..41f485008e 100644 --- a/packages/schema-derive/src/generate_api.rs +++ b/packages/schema-derive/src/generate_api.rs @@ -225,6 +225,25 @@ mod tests { #[test] fn api_object_minimal() { + assert_eq!( + generate_api_impl(&parse_quote! {}), + parse_quote! { + ::cosmwasm_schema::Api { + contract_name: ::std::env!("CARGO_PKG_NAME").to_string(), + contract_version: ::std::env!("CARGO_PKG_VERSION").to_string(), + instantiate: None, + execute: None, + query: None, + migrate: None, + sudo: None, + responses: None, + } + } + ); + } + + #[test] + fn api_object_instantiate_only() { assert_eq!( generate_api_impl(&parse_quote! { instantiate: InstantiateMsg, @@ -245,7 +264,7 @@ mod tests { } #[test] - fn api_object_name_vesion_override() { + fn api_object_name_version_override() { assert_eq!( generate_api_impl(&parse_quote! { name: "foo", From 37a1735026f0b4c8e52fe239d6e318780aa835ae Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 13 Nov 2023 12:56:19 +0100 Subject: [PATCH 0959/2372] Add changelog entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b639f28fa..0007cab8af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,7 @@ and this project adheres to `Addr` type for `ContractInfoResponse::{creator, admin}`. ([#1883]) - cosmwasm-std: Change `DistributionQuerier::new` to take `IntoIterator` instead of `HashMap`. ([#1941]) +- cosmwasm-vm: Make `instantiate` entrypoint optional. ([#1933]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 @@ -54,6 +55,7 @@ and this project adheres to [#1884]: https://github.com/CosmWasm/cosmwasm/pull/1884 [#1898]: https://github.com/CosmWasm/cosmwasm/pull/1898 [#1902]: https://github.com/CosmWasm/cosmwasm/pull/1902 +[#1933]: https://github.com/CosmWasm/cosmwasm/pull/1933 [#1939]: https://github.com/CosmWasm/cosmwasm/pull/1939 [#1940]: https://github.com/CosmWasm/cosmwasm/pull/1940 [#1941]: https://github.com/CosmWasm/cosmwasm/pull/1941 From 374b2ea5feae1048dd10601e0257b499438d04cf Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 13 Nov 2023 13:12:03 +0100 Subject: [PATCH 0960/2372] Update empty contract lock file --- contracts/empty/Cargo.lock | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/contracts/empty/Cargo.lock b/contracts/empty/Cargo.lock index 4f79839e89..47ec1c6f80 100644 --- a/contracts/empty/Cargo.lock +++ b/contracts/empty/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0-rc.0" +version = "1.5.0" dependencies = [ "bitflags", "bytecheck", @@ -1311,18 +1311,18 @@ checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" [[package]] name = "serde" -version = "1.0.126" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" dependencies = [ "serde_derive", ] [[package]] name = "serde-json-wasm" -version = "0.5.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" +checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" dependencies = [ "serde", ] @@ -1340,13 +1340,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.126" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.37", ] [[package]] From 07dc89fb7a6e956faae91dd7dd965f5453e04093 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 18 Oct 2023 16:38:09 +0200 Subject: [PATCH 0961/2372] Add Any message with blanket implementation --- packages/std/src/lib.rs | 1 + packages/std/src/results/cosmos_msg.rs | 16 ++++++++++++++++ packages/std/src/results/mod.rs | 4 +++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index df60c6debc..70dc7a16f9 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -77,6 +77,7 @@ pub use crate::query::{ DistributionQuery, FullDelegation, IbcQuery, ListChannelsResponse, PortIdResponse, QueryRequest, StakingQuery, SupplyResponse, Validator, ValidatorResponse, WasmQuery, }; +pub use crate::results::IntoAny; #[cfg(all(feature = "stargate", feature = "cosmwasm_1_2"))] pub use crate::results::WeightedVoteOption; pub use crate::results::{ diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index 27ebd8249b..affc20f098 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -40,6 +40,10 @@ pub enum CosmosMsg { type_url: String, value: Binary, }, + Any { + type_url: String, + value: Binary, + }, #[cfg(feature = "stargate")] Ibc(IbcMsg), Wasm(WasmMsg), @@ -386,6 +390,18 @@ impl From for CosmosMsg { } } +pub trait IntoAny { + /// Takes self and returns a (type_url, value) pair. + fn into_any(self) -> (String, Binary); +} + +impl From for CosmosMsg { + fn from(source: S) -> Self { + let (type_url, value) = source.into_any(); + CosmosMsg::::Any { type_url, value } + } +} + #[cfg(feature = "stargate")] impl From for CosmosMsg { fn from(msg: IbcMsg) -> Self { diff --git a/packages/std/src/results/mod.rs b/packages/std/src/results/mod.rs index a45afbd14a..0a10c4ac26 100644 --- a/packages/std/src/results/mod.rs +++ b/packages/std/src/results/mod.rs @@ -12,7 +12,9 @@ mod system_result; pub use contract_result::ContractResult; #[cfg(all(feature = "stargate", feature = "cosmwasm_1_2"))] pub use cosmos_msg::WeightedVoteOption; -pub use cosmos_msg::{wasm_execute, wasm_instantiate, BankMsg, CosmosMsg, CustomMsg, WasmMsg}; +pub use cosmos_msg::{ + wasm_execute, wasm_instantiate, BankMsg, CosmosMsg, CustomMsg, IntoAny, WasmMsg, +}; #[cfg(feature = "staking")] pub use cosmos_msg::{DistributionMsg, StakingMsg}; #[cfg(feature = "stargate")] From 025ff707aac0b83b1e55ad7894797d68448cb019 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 23 Oct 2023 11:02:13 +0200 Subject: [PATCH 0962/2372] Add inner type AnyMsg --- packages/std/src/lib.rs | 7 ++- packages/std/src/results/cosmos_msg.rs | 61 +++++++++++++++++++------- packages/std/src/results/mod.rs | 2 +- 3 files changed, 48 insertions(+), 22 deletions(-) diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 70dc7a16f9..559e9852f3 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -77,13 +77,12 @@ pub use crate::query::{ DistributionQuery, FullDelegation, IbcQuery, ListChannelsResponse, PortIdResponse, QueryRequest, StakingQuery, SupplyResponse, Validator, ValidatorResponse, WasmQuery, }; -pub use crate::results::IntoAny; #[cfg(all(feature = "stargate", feature = "cosmwasm_1_2"))] pub use crate::results::WeightedVoteOption; pub use crate::results::{ - attr, wasm_execute, wasm_instantiate, Attribute, BankMsg, ContractResult, CosmosMsg, CustomMsg, - Empty, Event, QueryResponse, Reply, ReplyOn, Response, SubMsg, SubMsgResponse, SubMsgResult, - SystemResult, WasmMsg, + attr, wasm_execute, wasm_instantiate, AnyMsg, Attribute, BankMsg, ContractResult, CosmosMsg, + CustomMsg, Empty, Event, QueryResponse, Reply, ReplyOn, Response, SubMsg, SubMsgResponse, + SubMsgResult, SystemResult, WasmMsg, }; #[cfg(feature = "staking")] pub use crate::results::{DistributionMsg, StakingMsg}; diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index affc20f098..5cd4e0bbbc 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -40,10 +40,7 @@ pub enum CosmosMsg { type_url: String, value: Binary, }, - Any { - type_url: String, - value: Binary, - }, + Any(AnyMsg), #[cfg(feature = "stargate")] Ibc(IbcMsg), Wasm(WasmMsg), @@ -124,6 +121,12 @@ pub enum DistributionMsg { }, } +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +pub struct AnyMsg { + pub type_url: String, + pub value: Binary, +} + fn binary_to_string(data: &Binary, fmt: &mut core::fmt::Formatter) -> core::fmt::Result { match core::str::from_utf8(data.as_slice()) { Ok(s) => fmt.write_str(s), @@ -384,21 +387,17 @@ impl From for CosmosMsg { } } -impl From for CosmosMsg { - fn from(msg: WasmMsg) -> Self { - CosmosMsg::Wasm(msg) +// By implementing `From for cosmwasm_std::AnyMsg`, +// you automatically get a MyType -> CosmosMsg conversion. +impl, T> From for CosmosMsg { + fn from(source: S) -> Self { + CosmosMsg::::Any(source.into()) } } -pub trait IntoAny { - /// Takes self and returns a (type_url, value) pair. - fn into_any(self) -> (String, Binary); -} - -impl From for CosmosMsg { - fn from(source: S) -> Self { - let (type_url, value) = source.into_any(); - CosmosMsg::::Any { type_url, value } +impl From for CosmosMsg { + fn from(msg: WasmMsg) -> Self { + CosmosMsg::Wasm(msg) } } @@ -419,7 +418,7 @@ impl From for CosmosMsg { #[cfg(test)] mod tests { use super::*; - use crate::{coin, coins}; + use crate::{coin, coins, to_json_string}; #[test] fn from_bank_msg_works() { @@ -496,6 +495,34 @@ mod tests { } } + #[test] + #[cfg(feature = "stargate")] + fn stargate_msg_serializes_to_correct_json() { + let msg: CosmosMsg = CosmosMsg::Stargate { + type_url: "/cosmos.foo.v1beta.MsgBar".to_string(), + value: Binary::from_base64("5yu/rQ+HrMcxH1zdga7P5hpGMLE=").unwrap(), + }; + let json = to_json_string(&msg).unwrap(); + assert_eq!( + json, + r#"{"stargate":{"type_url":"/cosmos.foo.v1beta.MsgBar","value":"5yu/rQ+HrMcxH1zdga7P5hpGMLE="}}"#, + ); + } + + #[test] + fn any_msg_serializes_to_correct_json() { + // Same serialization as CosmosMsg::Stargate (see above), except the top level key + let msg: CosmosMsg = CosmosMsg::Any(AnyMsg { + type_url: "/cosmos.foo.v1beta.MsgBar".to_string(), + value: Binary::from_base64("5yu/rQ+HrMcxH1zdga7P5hpGMLE=").unwrap(), + }); + let json = to_json_string(&msg).unwrap(); + assert_eq!( + json, + r#"{"any":{"type_url":"/cosmos.foo.v1beta.MsgBar","value":"5yu/rQ+HrMcxH1zdga7P5hpGMLE="}}"#, + ); + } + #[test] #[cfg(feature = "cosmwasm_1_3")] fn msg_distribution_serializes_to_correct_json() { diff --git a/packages/std/src/results/mod.rs b/packages/std/src/results/mod.rs index 0a10c4ac26..2df471c3ea 100644 --- a/packages/std/src/results/mod.rs +++ b/packages/std/src/results/mod.rs @@ -13,7 +13,7 @@ pub use contract_result::ContractResult; #[cfg(all(feature = "stargate", feature = "cosmwasm_1_2"))] pub use cosmos_msg::WeightedVoteOption; pub use cosmos_msg::{ - wasm_execute, wasm_instantiate, BankMsg, CosmosMsg, CustomMsg, IntoAny, WasmMsg, + wasm_execute, wasm_instantiate, AnyMsg, BankMsg, CosmosMsg, CustomMsg, WasmMsg, }; #[cfg(feature = "staking")] pub use cosmos_msg::{DistributionMsg, StakingMsg}; From 6cc4d6f10b808b74c637ec767784d1f07eefa3cc Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 9 Nov 2023 11:16:10 +0100 Subject: [PATCH 0963/2372] Remove stargate msg --- packages/std/src/results/cosmos_msg.rs | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index 5cd4e0bbbc..45d18b57e2 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -33,13 +33,6 @@ pub enum CosmosMsg { Staking(StakingMsg), #[cfg(feature = "staking")] Distribution(DistributionMsg), - /// A Stargate message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). - /// This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md) - #[cfg(feature = "stargate")] - Stargate { - type_url: String, - value: Binary, - }, Any(AnyMsg), #[cfg(feature = "stargate")] Ibc(IbcMsg), @@ -121,6 +114,8 @@ pub enum DistributionMsg { }, } +/// A message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). +/// This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md) #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] pub struct AnyMsg { pub type_url: String, @@ -495,20 +490,6 @@ mod tests { } } - #[test] - #[cfg(feature = "stargate")] - fn stargate_msg_serializes_to_correct_json() { - let msg: CosmosMsg = CosmosMsg::Stargate { - type_url: "/cosmos.foo.v1beta.MsgBar".to_string(), - value: Binary::from_base64("5yu/rQ+HrMcxH1zdga7P5hpGMLE=").unwrap(), - }; - let json = to_json_string(&msg).unwrap(); - assert_eq!( - json, - r#"{"stargate":{"type_url":"/cosmos.foo.v1beta.MsgBar","value":"5yu/rQ+HrMcxH1zdga7P5hpGMLE="}}"#, - ); - } - #[test] fn any_msg_serializes_to_correct_json() { // Same serialization as CosmosMsg::Stargate (see above), except the top level key From 63b3a93ef8d47cc895d6bf78136eb41ff5cf6c47 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 9 Nov 2023 12:20:06 +0100 Subject: [PATCH 0964/2372] Add changelog and migration entry --- CHANGELOG.md | 3 +++ MIGRATING.md | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 624ab95eea..7aba9851a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,8 @@ and this project adheres to - cosmwasm-std: Change `DistributionQuerier::new` to take `IntoIterator` instead of `HashMap`. ([#1941]) - cosmwasm-vm: Make `instantiate` entrypoint optional. ([#1933]) +- cosmwasm-std: Rename `CosmosMsg::Stargate` to `CosmosMsg::Any` and use a + nested msg struct like in other messages. ([#1926]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 @@ -55,6 +57,7 @@ and this project adheres to [#1884]: https://github.com/CosmWasm/cosmwasm/pull/1884 [#1898]: https://github.com/CosmWasm/cosmwasm/pull/1898 [#1902]: https://github.com/CosmWasm/cosmwasm/pull/1902 +[#1926]: https://github.com/CosmWasm/cosmwasm/pull/1926 [#1933]: https://github.com/CosmWasm/cosmwasm/pull/1933 [#1939]: https://github.com/CosmWasm/cosmwasm/pull/1939 [#1940]: https://github.com/CosmWasm/cosmwasm/pull/1940 diff --git a/MIGRATING.md b/MIGRATING.md index cc5450d2e6..d43e8ec50f 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -118,6 +118,13 @@ major releases of `cosmwasm`. Note that you can also view the +Ok(IbcReceiveResponse::new(b"")) ``` +- Replace all uses of `CosmosMsg::Stargate` with `CosmosMsg::Any`: + + ```diff + -CosmosMsg::Stargate { type_url, value } + +CosmosMsg::Any(AnyMsg { type_url, value }) + ``` + ## 1.4.x -> 1.5.0 - Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): From 728bb1f248ebe141bb9db4d5754ac19bd8a2a162 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 9 Nov 2023 13:03:02 +0100 Subject: [PATCH 0965/2372] Update schemas --- .../schema/ibc-reflect-send.json | 35 ++++++++++--------- .../schema/ibc/packet_msg.json | 35 ++++++++++--------- .../ibc-reflect-send/schema/raw/execute.json | 35 ++++++++++--------- .../ibc-reflect/schema/ibc/packet_msg.json | 35 ++++++++++--------- contracts/reflect/schema/raw/execute.json | 35 ++++++++++--------- contracts/reflect/schema/reflect.json | 35 ++++++++++--------- 6 files changed, 114 insertions(+), 96 deletions(-) diff --git a/contracts/ibc-reflect-send/schema/ibc-reflect-send.json b/contracts/ibc-reflect-send/schema/ibc-reflect-send.json index f863c79d43..2d20c0778c 100644 --- a/contracts/ibc-reflect-send/schema/ibc-reflect-send.json +++ b/contracts/ibc-reflect-send/schema/ibc-reflect-send.json @@ -114,6 +114,22 @@ } ], "definitions": { + "AnyMsg": { + "description": "A message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", + "type": "object", + "required": [ + "type_url", + "value" + ], + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "$ref": "#/definitions/Binary" + } + } + }, "BankMsg": { "description": "The message types of the bank module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto", "oneOf": [ @@ -241,26 +257,13 @@ "additionalProperties": false }, { - "description": "A Stargate message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", "type": "object", "required": [ - "stargate" + "any" ], "properties": { - "stargate": { - "type": "object", - "required": [ - "type_url", - "value" - ], - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "$ref": "#/definitions/Binary" - } - } + "any": { + "$ref": "#/definitions/AnyMsg" } }, "additionalProperties": false diff --git a/contracts/ibc-reflect-send/schema/ibc/packet_msg.json b/contracts/ibc-reflect-send/schema/ibc/packet_msg.json index f8f8640a5c..5f767c7ef9 100644 --- a/contracts/ibc-reflect-send/schema/ibc/packet_msg.json +++ b/contracts/ibc-reflect-send/schema/ibc/packet_msg.json @@ -52,6 +52,22 @@ } ], "definitions": { + "AnyMsg": { + "description": "A message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", + "type": "object", + "required": [ + "type_url", + "value" + ], + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "$ref": "#/definitions/Binary" + } + } + }, "BankMsg": { "description": "The message types of the bank module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto", "oneOf": [ @@ -179,26 +195,13 @@ "additionalProperties": false }, { - "description": "A Stargate message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", "type": "object", "required": [ - "stargate" + "any" ], "properties": { - "stargate": { - "type": "object", - "required": [ - "type_url", - "value" - ], - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "$ref": "#/definitions/Binary" - } - } + "any": { + "$ref": "#/definitions/AnyMsg" } }, "additionalProperties": false diff --git a/contracts/ibc-reflect-send/schema/raw/execute.json b/contracts/ibc-reflect-send/schema/raw/execute.json index 1765e73a74..9d3924037c 100644 --- a/contracts/ibc-reflect-send/schema/raw/execute.json +++ b/contracts/ibc-reflect-send/schema/raw/execute.json @@ -103,6 +103,22 @@ } ], "definitions": { + "AnyMsg": { + "description": "A message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", + "type": "object", + "required": [ + "type_url", + "value" + ], + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "$ref": "#/definitions/Binary" + } + } + }, "BankMsg": { "description": "The message types of the bank module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto", "oneOf": [ @@ -230,26 +246,13 @@ "additionalProperties": false }, { - "description": "A Stargate message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", "type": "object", "required": [ - "stargate" + "any" ], "properties": { - "stargate": { - "type": "object", - "required": [ - "type_url", - "value" - ], - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "$ref": "#/definitions/Binary" - } - } + "any": { + "$ref": "#/definitions/AnyMsg" } }, "additionalProperties": false diff --git a/contracts/ibc-reflect/schema/ibc/packet_msg.json b/contracts/ibc-reflect/schema/ibc/packet_msg.json index 6856f57368..be30fef8c5 100644 --- a/contracts/ibc-reflect/schema/ibc/packet_msg.json +++ b/contracts/ibc-reflect/schema/ibc/packet_msg.json @@ -112,6 +112,22 @@ } ], "definitions": { + "AnyMsg": { + "description": "A message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", + "type": "object", + "required": [ + "type_url", + "value" + ], + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "$ref": "#/definitions/Binary" + } + } + }, "BankMsg": { "description": "The message types of the bank module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto", "oneOf": [ @@ -215,26 +231,13 @@ "additionalProperties": false }, { - "description": "A Stargate message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", "type": "object", "required": [ - "stargate" + "any" ], "properties": { - "stargate": { - "type": "object", - "required": [ - "type_url", - "value" - ], - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "$ref": "#/definitions/Binary" - } - } + "any": { + "$ref": "#/definitions/AnyMsg" } }, "additionalProperties": false diff --git a/contracts/reflect/schema/raw/execute.json b/contracts/reflect/schema/raw/execute.json index abd024e972..0af550511d 100644 --- a/contracts/reflect/schema/raw/execute.json +++ b/contracts/reflect/schema/raw/execute.json @@ -73,6 +73,22 @@ } ], "definitions": { + "AnyMsg": { + "description": "A message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", + "type": "object", + "required": [ + "type_url", + "value" + ], + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "$ref": "#/definitions/Binary" + } + } + }, "BankMsg": { "description": "The message types of the bank module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto", "oneOf": [ @@ -200,26 +216,13 @@ "additionalProperties": false }, { - "description": "A Stargate message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", "type": "object", "required": [ - "stargate" + "any" ], "properties": { - "stargate": { - "type": "object", - "required": [ - "type_url", - "value" - ], - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "$ref": "#/definitions/Binary" - } - } + "any": { + "$ref": "#/definitions/AnyMsg" } }, "additionalProperties": false diff --git a/contracts/reflect/schema/reflect.json b/contracts/reflect/schema/reflect.json index 21b899f174..09a84719e2 100644 --- a/contracts/reflect/schema/reflect.json +++ b/contracts/reflect/schema/reflect.json @@ -83,6 +83,22 @@ } ], "definitions": { + "AnyMsg": { + "description": "A message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", + "type": "object", + "required": [ + "type_url", + "value" + ], + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "$ref": "#/definitions/Binary" + } + } + }, "BankMsg": { "description": "The message types of the bank module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto", "oneOf": [ @@ -210,26 +226,13 @@ "additionalProperties": false }, { - "description": "A Stargate message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", "type": "object", "required": [ - "stargate" + "any" ], "properties": { - "stargate": { - "type": "object", - "required": [ - "type_url", - "value" - ], - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "$ref": "#/definitions/Binary" - } - } + "any": { + "$ref": "#/definitions/AnyMsg" } }, "additionalProperties": false From 304348b63dc3f0dec0d43de0f693393c17343890 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 9 Nov 2023 16:00:07 +0100 Subject: [PATCH 0966/2372] Add test for CosmosMsg from AnyMsg --- packages/std/src/results/cosmos_msg.rs | 27 ++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index 45d18b57e2..9c60c25bbf 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -427,6 +427,33 @@ mod tests { } } + #[test] + fn from_any_msg_works() { + // should work with AnyMsg + let any = AnyMsg { + type_url: "/cosmos.foo.v1beta.MsgBar".to_string(), + value: Binary::from_base64("5yu/rQ+HrMcxH1zdga7P5hpGMLE=").unwrap(), + }; + let msg: CosmosMsg = any.clone().into(); + assert!(matches!(msg, CosmosMsg::Any(a) if a == any)); + + // should work with Into + struct IntoAny; + impl From for AnyMsg { + fn from(_: IntoAny) -> Self { + AnyMsg { + type_url: "/cosmos.foo.v1beta.MsgBar".to_string(), + value: Binary::from_base64("5yu/rQ+HrMcxH1zdga7P5hpGMLE=").unwrap(), + } + } + } + let msg: CosmosMsg = IntoAny.into(); + assert!(matches!( + msg, + CosmosMsg::Any(a) if a == any + )); + } + #[test] fn wasm_msg_serializes_to_correct_json() { // Instantiate with admin From 7779079c0bb8ecbc3d0e7a3660bef18c3ea96bef Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 16 Nov 2023 14:07:19 +0100 Subject: [PATCH 0967/2372] Add instantiate + migrate flags to AnalysisReport --- packages/vm/src/cache.rs | 36 +++++++++++++- packages/vm/src/static_analysis.rs | 80 ------------------------------ 2 files changed, 34 insertions(+), 82 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index b4d1d9ea8e..2f816991b4 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -16,7 +16,7 @@ use crate::instance::{Instance, InstanceOptions}; use crate::modules::{CachedModule, FileSystemCache, InMemoryCache, PinnedMemoryCache}; use crate::parsed_wasm::ParsedWasm; use crate::size::Size; -use crate::static_analysis::has_ibc_entry_points; +use crate::static_analysis::{ExportInfo, REQUIRED_IBC_EXPORTS}; use crate::wasm_backend::{compile, make_compiling_engine, make_runtime_engine}; const STATE_DIR: &str = "state"; @@ -117,7 +117,16 @@ pub struct Cache { #[derive(PartialEq, Eq, Debug)] pub struct AnalysisReport { + /// `true` if and only if all [`REQUIRED_IBC_EXPORTS`] exist as exported functions. + /// This does not guarantee they are functional or even have the correct signatures. pub has_ibc_entry_points: bool, + /// `true` if the module has an `instantiate` export. + /// This does not guarantee it is functional or even has the correct signature. + pub has_instantiate_entry_point: bool, + /// `true` if the module has a `migrate` export. + /// This does not guarantee it is functional or even has the correct signature. + pub has_migrate_entry_point: bool, + /// The set of capabilities the contract requires. pub required_capabilities: HashSet, } @@ -274,8 +283,14 @@ where // Here we could use a streaming deserializer to slightly improve performance. However, this way it is DRYer. let wasm = self.load_wasm(checksum)?; let module = ParsedWasm::parse(&wasm)?; + let exports = module.exported_function_names(None); + Ok(AnalysisReport { - has_ibc_entry_points: has_ibc_entry_points(&module), + has_ibc_entry_points: REQUIRED_IBC_EXPORTS + .iter() + .all(|required| exports.contains(*required)), + has_instantiate_entry_point: exports.contains("instantiate"), + has_migrate_entry_point: exports.contains("migrate"), required_capabilities: required_capabilities_from_module(&module), }) } @@ -538,6 +553,7 @@ mod tests { static CONTRACT: &[u8] = include_bytes!("../testdata/hackatom.wasm"); static IBC_CONTRACT: &[u8] = include_bytes!("../testdata/ibc_reflect.wasm"); + static EMPTY_CONTRACT: &[u8] = include_bytes!("../testdata/empty.wasm"); // Invalid because it doesn't contain required memory and exports static INVALID_CONTRACT_WAT: &str = r#"(module (type $t0 (func (param i32) (result i32))) @@ -1289,6 +1305,8 @@ mod tests { report1, AnalysisReport { has_ibc_entry_points: false, + has_instantiate_entry_point: true, + has_migrate_entry_point: true, required_capabilities: HashSet::new(), } ); @@ -1299,12 +1317,26 @@ mod tests { report2, AnalysisReport { has_ibc_entry_points: true, + has_instantiate_entry_point: true, + has_migrate_entry_point: true, required_capabilities: HashSet::from_iter([ "iterator".to_string(), "stargate".to_string() ]), } ); + + let checksum3 = cache.save_wasm(EMPTY_CONTRACT).unwrap(); + let report3 = cache.analyze(&checksum3).unwrap(); + assert_eq!( + report3, + AnalysisReport { + has_ibc_entry_points: false, + has_instantiate_entry_point: false, + has_migrate_entry_point: false, + required_capabilities: HashSet::from(["iterator".to_string()]), + } + ); } #[test] diff --git a/packages/vm/src/static_analysis.rs b/packages/vm/src/static_analysis.rs index 7e20fb95f3..6b87dd58c0 100644 --- a/packages/vm/src/static_analysis.rs +++ b/packages/vm/src/static_analysis.rs @@ -60,16 +60,6 @@ impl ExportInfo for &wasmer::Module { } } -/// Returns true if and only if all IBC entry points ([`REQUIRED_IBC_EXPORTS`]) -/// exist as exported functions. This does not guarantee the entry points -/// are functional and for simplicity does not even check their signatures. -pub fn has_ibc_entry_points(module: impl ExportInfo) -> bool { - let available_exports = module.exported_function_names(None); - REQUIRED_IBC_EXPORTS - .iter() - .all(|required| available_exports.contains(*required)) -} - #[cfg(test)] mod tests { use crate::VmError; @@ -225,74 +215,4 @@ mod tests { HashSet::from_iter(vec!["bar".to_string(), "baz".to_string()]) ); } - - #[test] - fn has_ibc_entry_points_works() { - // Non-IBC contract - let wasm = wat::parse_str( - r#"(module - (memory 3) - (export "memory" (memory 0)) - - (type (func)) - (func (type 0) nop) - (export "interface_version_8" (func 0)) - (export "instantiate" (func 0)) - (export "allocate" (func 0)) - (export "deallocate" (func 0)) - )"#, - ) - .unwrap(); - let module = ParsedWasm::parse(&wasm).unwrap(); - assert!(!has_ibc_entry_points(&module)); - - // IBC contract - let wasm = wat::parse_str( - r#"(module - (memory 3) - (export "memory" (memory 0)) - - (type (func)) - (func (type 0) nop) - (export "interface_version_8" (func 0)) - (export "instantiate" (func 0)) - (export "execute" (func 0)) - (export "allocate" (func 0)) - (export "deallocate" (func 0)) - (export "ibc_channel_open" (func 0)) - (export "ibc_channel_connect" (func 0)) - (export "ibc_channel_close" (func 0)) - (export "ibc_packet_receive" (func 0)) - (export "ibc_packet_ack" (func 0)) - (export "ibc_packet_timeout" (func 0)) - )"#, - ) - .unwrap(); - let module = ParsedWasm::parse(&wasm).unwrap(); - assert!(has_ibc_entry_points(&module)); - - // Missing packet ack - let wasm = wat::parse_str( - r#"(module - (memory 3) - (export "memory" (memory 0)) - - (type (func)) - (func (type 0) nop) - (export "interface_version_8" (func 0)) - (export "instantiate" (func 0)) - (export "execute" (func 0)) - (export "allocate" (func 0)) - (export "deallocate" (func 0)) - (export "ibc_channel_open" (func 0)) - (export "ibc_channel_connect" (func 0)) - (export "ibc_channel_close" (func 0)) - (export "ibc_packet_receive" (func 0)) - (export "ibc_packet_timeout" (func 0)) - )"#, - ) - .unwrap(); - let module = ParsedWasm::parse(&wasm).unwrap(); - assert!(!has_ibc_entry_points(&module)); - } } From 486ee784a7ac4d024a2c797b8b863a13a6a2413c Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 16 Nov 2023 17:14:45 +0100 Subject: [PATCH 0968/2372] Add Entrypoint enum --- Cargo.lock | 35 ++++++++++++++++++++ packages/vm/Cargo.toml | 9 +++--- packages/vm/src/cache.rs | 35 +++++++++++--------- packages/vm/src/static_analysis.rs | 51 ++++++++++++++++++++++++++++++ 4 files changed, 111 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index eb4f764799..62ff478877 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -538,6 +538,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.6", + "strum", "target-lexicon", "tempfile", "thiserror", @@ -1179,6 +1180,12 @@ dependencies = [ "ahash", ] +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -1853,6 +1860,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + [[package]] name = "ryu" version = "1.0.13" @@ -2082,6 +2095,28 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.28", +] + [[package]] name = "subtle" version = "2.4.1" diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index f3211bcf3b..08fb119bd0 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -35,7 +35,7 @@ allow_interface_version_7 = [] bench = false [dependencies] -bytes = "1.4.0" # need a higher version than the one required by Wasmer for the Bytes -> Vec implementation +bytes = "1.4.0" # need a higher version than the one required by Wasmer for the Bytes -> Vec implementation clru = "0.6.1" crc32fast = "1.3.2" # Uses the path when built locally; uses the given version from crates.io when published @@ -50,12 +50,13 @@ sha2 = "0.10.3" thiserror = "1.0.26" wasmer = { version = "=4.2.2", default-features = false, features = ["cranelift", "singlepass"] } wasmer-middlewares = "=4.2.2" +strum = { version = "0.25.0", default-features = false, features = ["derive"] } # Dependencies that we do not use ourself. We add those entries # to bump the min version of them. bytecheck = "0.6.3" # With this version the simdutf8 dependency became optional -enumset = "1.0.2" # Fixes https://github.com/Lymia/enumset/issues/17 (https://github.com/Lymia/enumset/commit/a430550cd6a3c9b1ef636d37f75dede7616f5b62) -bitflags = "1.1.0" # https://github.com/CensoredUsername/dynasm-rs/pull/74 +enumset = "1.0.2" # Fixes https://github.com/Lymia/enumset/issues/17 (https://github.com/Lymia/enumset/commit/a430550cd6a3c9b1ef636d37f75dede7616f5b62) +bitflags = "1.1.0" # https://github.com/CensoredUsername/dynasm-rs/pull/74 # Wasmer git/local (used for quick local debugging or patching) # wasmer = { git = "https://github.com/wasmerio/wasmer", rev = "877ce1f7c44fad853c", default-features = false, features = ["cranelift", "singlepass"] } @@ -64,7 +65,7 @@ bitflags = "1.1.0" # https://github.com/CensoredUsername/dynasm-rs/pull/74 # wasmer-middlewares = { path = "../../../wasmer/lib/middlewares" } [dev-dependencies] -criterion = { version = "0.4", features = [ "html_reports" ] } +criterion = { version = "0.4", features = ["html_reports"] } glob = "0.3.1" hex-literal = "0.3.1" tempfile = "3.1.0" diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 2f816991b4..536d4793c2 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -3,6 +3,7 @@ use std::fs::{self, File, OpenOptions}; use std::io::{Read, Write}; use std::marker::PhantomData; use std::path::{Path, PathBuf}; +use std::str::FromStr; use std::sync::Mutex; use wasmer::{Engine, Store}; @@ -16,7 +17,7 @@ use crate::instance::{Instance, InstanceOptions}; use crate::modules::{CachedModule, FileSystemCache, InMemoryCache, PinnedMemoryCache}; use crate::parsed_wasm::ParsedWasm; use crate::size::Size; -use crate::static_analysis::{ExportInfo, REQUIRED_IBC_EXPORTS}; +use crate::static_analysis::{Entrypoint, ExportInfo, REQUIRED_IBC_EXPORTS}; use crate::wasm_backend::{compile, make_compiling_engine, make_runtime_engine}; const STATE_DIR: &str = "state"; @@ -120,12 +121,8 @@ pub struct AnalysisReport { /// `true` if and only if all [`REQUIRED_IBC_EXPORTS`] exist as exported functions. /// This does not guarantee they are functional or even have the correct signatures. pub has_ibc_entry_points: bool, - /// `true` if the module has an `instantiate` export. - /// This does not guarantee it is functional or even has the correct signature. - pub has_instantiate_entry_point: bool, - /// `true` if the module has a `migrate` export. - /// This does not guarantee it is functional or even has the correct signature. - pub has_migrate_entry_point: bool, + /// A set of all entrypoints that are exported by the contract. + pub entrypoints: HashSet, /// The set of capabilities the contract requires. pub required_capabilities: HashSet, } @@ -285,12 +282,16 @@ where let module = ParsedWasm::parse(&wasm)?; let exports = module.exported_function_names(None); + let entrypoints = exports + .iter() + .filter_map(|export| Entrypoint::from_str(export).ok()) + .collect(); + Ok(AnalysisReport { has_ibc_entry_points: REQUIRED_IBC_EXPORTS .iter() .all(|required| exports.contains(*required)), - has_instantiate_entry_point: exports.contains("instantiate"), - has_migrate_entry_point: exports.contains("migrate"), + entrypoints, required_capabilities: required_capabilities_from_module(&module), }) } @@ -1296,6 +1297,7 @@ mod tests { #[test] fn analyze_works() { + use Entrypoint as E; let cache: Cache = unsafe { Cache::new(make_stargate_testing_options()).unwrap() }; @@ -1305,8 +1307,13 @@ mod tests { report1, AnalysisReport { has_ibc_entry_points: false, - has_instantiate_entry_point: true, - has_migrate_entry_point: true, + entrypoints: HashSet::from([ + E::Instantiate, + E::Migrate, + E::Sudo, + E::Execute, + E::Query + ]), required_capabilities: HashSet::new(), } ); @@ -1317,8 +1324,7 @@ mod tests { report2, AnalysisReport { has_ibc_entry_points: true, - has_instantiate_entry_point: true, - has_migrate_entry_point: true, + entrypoints: HashSet::from([E::Instantiate, E::Reply, E::Query]), required_capabilities: HashSet::from_iter([ "iterator".to_string(), "stargate".to_string() @@ -1332,8 +1338,7 @@ mod tests { report3, AnalysisReport { has_ibc_entry_points: false, - has_instantiate_entry_point: false, - has_migrate_entry_point: false, + entrypoints: HashSet::new(), required_capabilities: HashSet::from(["iterator".to_string()]), } ); diff --git a/packages/vm/src/static_analysis.rs b/packages/vm/src/static_analysis.rs index 6b87dd58c0..3c718b0526 100644 --- a/packages/vm/src/static_analysis.rs +++ b/packages/vm/src/static_analysis.rs @@ -1,9 +1,40 @@ use std::collections::HashSet; +use strum::{Display, EnumString}; use wasmer::wasmparser::ExternalKind; use crate::parsed_wasm::ParsedWasm; +/// An enum containing all available contract entrypoints. +/// This also provides conversions to and from strings. +#[derive(PartialEq, Eq, Debug, Clone, Copy, Hash, EnumString, Display)] +pub enum Entrypoint { + #[strum(serialize = "instantiate")] + Instantiate, + #[strum(serialize = "execute")] + Execute, + #[strum(serialize = "migrate")] + Migrate, + #[strum(serialize = "sudo")] + Sudo, + #[strum(serialize = "reply")] + Reply, + #[strum(serialize = "query")] + Query, + #[strum(serialize = "ibc_channel_open")] + IbcChannelOpen, + #[strum(serialize = "ibc_channel_connect")] + IbcChannelConnect, + #[strum(serialize = "ibc_channel_close")] + IbcChannelClose, + #[strum(serialize = "ibc_packet_receive")] + IbcPacketReceive, + #[strum(serialize = "ibc_packet_ack")] + IbcPacketAck, + #[strum(serialize = "ibc_packet_timeout")] + IbcPacketTimeout, +} + pub const REQUIRED_IBC_EXPORTS: &[&str] = &[ "ibc_channel_open", "ibc_channel_connect", @@ -62,6 +93,8 @@ impl ExportInfo for &wasmer::Module { #[cfg(test)] mod tests { + use std::str::FromStr; + use crate::VmError; use super::*; @@ -215,4 +248,22 @@ mod tests { HashSet::from_iter(vec!["bar".to_string(), "baz".to_string()]) ); } + + #[test] + fn entrypoint_from_string_works() { + assert_eq!( + Entrypoint::from_str("ibc_channel_open").unwrap(), + Entrypoint::IbcChannelOpen + ); + + assert!(Entrypoint::from_str("IbcChannelConnect").is_err()); + } + + #[test] + fn entrypoint_display_works() { + assert_eq!( + Entrypoint::IbcPacketTimeout.to_string(), + "ibc_packet_timeout".to_string() + ); + } } From 2b0fa2fe065da7897a2e7009984c5f7eb87d4bb9 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 16 Nov 2023 17:23:49 +0100 Subject: [PATCH 0969/2372] Use Entrypoint type for ibc entrypoints --- packages/vm/src/cache.rs | 7 +++++-- packages/vm/src/static_analysis.rs | 25 +++++++++++++++---------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 536d4793c2..60f434d728 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -290,7 +290,7 @@ where Ok(AnalysisReport { has_ibc_entry_points: REQUIRED_IBC_EXPORTS .iter() - .all(|required| exports.contains(*required)), + .all(|required| exports.contains(<&str>::from(required))), entrypoints, required_capabilities: required_capabilities_from_module(&module), }) @@ -1320,11 +1320,14 @@ mod tests { let checksum2 = cache.save_wasm(IBC_CONTRACT).unwrap(); let report2 = cache.analyze(&checksum2).unwrap(); + let mut ibc_contract_entrypoints = + HashSet::from([E::Instantiate, E::Migrate, E::Reply, E::Query]); + ibc_contract_entrypoints.extend(REQUIRED_IBC_EXPORTS); assert_eq!( report2, AnalysisReport { has_ibc_entry_points: true, - entrypoints: HashSet::from([E::Instantiate, E::Reply, E::Query]), + entrypoints: ibc_contract_entrypoints, required_capabilities: HashSet::from_iter([ "iterator".to_string(), "stargate".to_string() diff --git a/packages/vm/src/static_analysis.rs b/packages/vm/src/static_analysis.rs index 3c718b0526..b385b87ddf 100644 --- a/packages/vm/src/static_analysis.rs +++ b/packages/vm/src/static_analysis.rs @@ -1,13 +1,13 @@ use std::collections::HashSet; -use strum::{Display, EnumString}; +use strum::{Display, EnumString, IntoStaticStr}; use wasmer::wasmparser::ExternalKind; use crate::parsed_wasm::ParsedWasm; /// An enum containing all available contract entrypoints. /// This also provides conversions to and from strings. -#[derive(PartialEq, Eq, Debug, Clone, Copy, Hash, EnumString, Display)] +#[derive(PartialEq, Eq, Debug, Clone, Copy, Hash, EnumString, Display, IntoStaticStr)] pub enum Entrypoint { #[strum(serialize = "instantiate")] Instantiate, @@ -35,13 +35,13 @@ pub enum Entrypoint { IbcPacketTimeout, } -pub const REQUIRED_IBC_EXPORTS: &[&str] = &[ - "ibc_channel_open", - "ibc_channel_connect", - "ibc_channel_close", - "ibc_packet_receive", - "ibc_packet_ack", - "ibc_packet_timeout", +pub const REQUIRED_IBC_EXPORTS: &[Entrypoint] = &[ + Entrypoint::IbcChannelOpen, + Entrypoint::IbcChannelConnect, + Entrypoint::IbcChannelClose, + Entrypoint::IbcPacketReceive, + Entrypoint::IbcPacketAck, + Entrypoint::IbcPacketTimeout, ]; /// A trait that allows accessing shared functionality of `parity_wasm::elements::Module` @@ -260,10 +260,15 @@ mod tests { } #[test] - fn entrypoint_display_works() { + fn entrypoint_to_string_works() { assert_eq!( Entrypoint::IbcPacketTimeout.to_string(), "ibc_packet_timeout".to_string() ); + + assert_eq!( + <&'static str>::from(Entrypoint::IbcPacketReceive), + "ibc_packet_receive" + ); } } From 810b8dbd6bb8252d3e737c8c2d395f97597acaed Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 16 Nov 2023 17:36:47 +0100 Subject: [PATCH 0970/2372] Use AsRef instead of From for &str conversion --- packages/vm/src/cache.rs | 2 +- packages/vm/src/static_analysis.rs | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 60f434d728..db7938e2c7 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -290,7 +290,7 @@ where Ok(AnalysisReport { has_ibc_entry_points: REQUIRED_IBC_EXPORTS .iter() - .all(|required| exports.contains(<&str>::from(required))), + .all(|required| exports.contains(required.as_ref())), entrypoints, required_capabilities: required_capabilities_from_module(&module), }) diff --git a/packages/vm/src/static_analysis.rs b/packages/vm/src/static_analysis.rs index b385b87ddf..f2f0f77521 100644 --- a/packages/vm/src/static_analysis.rs +++ b/packages/vm/src/static_analysis.rs @@ -1,13 +1,13 @@ use std::collections::HashSet; -use strum::{Display, EnumString, IntoStaticStr}; +use strum::{AsRefStr, Display, EnumString}; use wasmer::wasmparser::ExternalKind; use crate::parsed_wasm::ParsedWasm; /// An enum containing all available contract entrypoints. /// This also provides conversions to and from strings. -#[derive(PartialEq, Eq, Debug, Clone, Copy, Hash, EnumString, Display, IntoStaticStr)] +#[derive(PartialEq, Eq, Debug, Clone, Copy, Hash, EnumString, Display, AsRefStr)] pub enum Entrypoint { #[strum(serialize = "instantiate")] Instantiate, @@ -263,12 +263,10 @@ mod tests { fn entrypoint_to_string_works() { assert_eq!( Entrypoint::IbcPacketTimeout.to_string(), - "ibc_packet_timeout".to_string() + "ibc_packet_timeout" ); - assert_eq!( - <&'static str>::from(Entrypoint::IbcPacketReceive), - "ibc_packet_receive" - ); + let static_str: &'static str = Entrypoint::IbcPacketReceive.as_ref(); + assert_eq!(static_str, "ibc_packet_receive"); } } From ae737eb1a0eb81d0c10fbba4b92e7afc4ef34e18 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 16 Nov 2023 17:46:29 +0100 Subject: [PATCH 0971/2372] Update contract lock files --- contracts/burner/Cargo.lock | 35 +++++++++++++++++++++++++++ contracts/crypto-verify/Cargo.lock | 35 +++++++++++++++++++++++++++ contracts/cyberpunk/Cargo.lock | 35 +++++++++++++++++++++++++++ contracts/empty/Cargo.lock | 35 +++++++++++++++++++++++++++ contracts/floaty/Cargo.lock | 35 +++++++++++++++++++++++++++ contracts/hackatom/Cargo.lock | 35 +++++++++++++++++++++++++++ contracts/ibc-reflect-send/Cargo.lock | 35 +++++++++++++++++++++++++++ contracts/ibc-reflect/Cargo.lock | 35 +++++++++++++++++++++++++++ contracts/queue/Cargo.lock | 35 +++++++++++++++++++++++++++ contracts/reflect/Cargo.lock | 35 +++++++++++++++++++++++++++ contracts/staking/Cargo.lock | 35 +++++++++++++++++++++++++++ contracts/virus/Cargo.lock | 35 +++++++++++++++++++++++++++ 12 files changed, 420 insertions(+) diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 039c36a785..b34c8884d5 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -274,6 +274,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.3", + "strum", "thiserror", "wasmer", "wasmer-middlewares", @@ -810,6 +811,12 @@ dependencies = [ "ahash", ] +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -1248,6 +1255,12 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + [[package]] name = "ryu" version = "1.0.5" @@ -1456,6 +1469,28 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.37", +] + [[package]] name = "subtle" version = "2.4.1" diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index bc88a47b5e..1b0edfa2a0 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -263,6 +263,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.3", + "strum", "thiserror", "wasmer", "wasmer-middlewares", @@ -815,6 +816,12 @@ dependencies = [ "ahash", ] +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -1281,6 +1288,12 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + [[package]] name = "ryu" version = "1.0.5" @@ -1499,6 +1512,28 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.37", +] + [[package]] name = "subtle" version = "2.4.1" diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 44a1aec8ac..7c5cc0e80c 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -298,6 +298,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.3", + "strum", "thiserror", "wasmer", "wasmer-middlewares", @@ -876,6 +877,12 @@ dependencies = [ "ahash", ] +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -1372,6 +1379,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + [[package]] name = "ryu" version = "1.0.5" @@ -1580,6 +1593,28 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.37", +] + [[package]] name = "subtle" version = "2.4.1" diff --git a/contracts/empty/Cargo.lock b/contracts/empty/Cargo.lock index 47ec1c6f80..4af72f118c 100644 --- a/contracts/empty/Cargo.lock +++ b/contracts/empty/Cargo.lock @@ -263,6 +263,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.3", + "strum", "thiserror", "wasmer", "wasmer-middlewares", @@ -809,6 +810,12 @@ dependencies = [ "ahash", ] +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -1247,6 +1254,12 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + [[package]] name = "ryu" version = "1.0.5" @@ -1455,6 +1468,28 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.37", +] + [[package]] name = "subtle" version = "2.4.1" diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index eeeaa6353f..25a79648c7 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -263,6 +263,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.3", + "strum", "thiserror", "wasmer", "wasmer-middlewares", @@ -811,6 +812,12 @@ dependencies = [ "ahash", ] +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -1265,6 +1272,12 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + [[package]] name = "ryu" version = "1.0.5" @@ -1473,6 +1486,28 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.32", +] + [[package]] name = "subtle" version = "2.4.1" diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index cdb8cf7ede..bf88a6b513 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -263,6 +263,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.3", + "strum", "thiserror", "wasmer", "wasmer-middlewares", @@ -812,6 +813,12 @@ dependencies = [ "ahash", ] +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -1250,6 +1257,12 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + [[package]] name = "ryu" version = "1.0.5" @@ -1458,6 +1471,28 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.37", +] + [[package]] name = "subtle" version = "2.4.1" diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 656e614d46..c87567cac2 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -263,6 +263,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.3", + "strum", "thiserror", "wasmer", "wasmer-middlewares", @@ -799,6 +800,12 @@ dependencies = [ "ahash", ] +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -1248,6 +1255,12 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + [[package]] name = "ryu" version = "1.0.5" @@ -1456,6 +1469,28 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.37", +] + [[package]] name = "subtle" version = "2.4.1" diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 5c1407d179..63a15bab2a 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -263,6 +263,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.3", + "strum", "thiserror", "wasmer", "wasmer-middlewares", @@ -799,6 +800,12 @@ dependencies = [ "ahash", ] +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -1248,6 +1255,12 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + [[package]] name = "ryu" version = "1.0.5" @@ -1456,6 +1469,28 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.37", +] + [[package]] name = "subtle" version = "2.4.1" diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 2cc2910726..24f9479a69 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -263,6 +263,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.3", + "strum", "thiserror", "wasmer", "wasmer-middlewares", @@ -799,6 +800,12 @@ dependencies = [ "ahash", ] +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -1248,6 +1255,12 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + [[package]] name = "ryu" version = "1.0.5" @@ -1456,6 +1469,28 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.37", +] + [[package]] name = "subtle" version = "2.4.1" diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index ddf696931c..eb44b19333 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -263,6 +263,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.3", + "strum", "thiserror", "wasmer", "wasmer-middlewares", @@ -799,6 +800,12 @@ dependencies = [ "ahash", ] +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -1249,6 +1256,12 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + [[package]] name = "ryu" version = "1.0.5" @@ -1457,6 +1470,28 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.37", +] + [[package]] name = "subtle" version = "2.4.1" diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index adf45172da..c1a78d2d31 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -263,6 +263,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.3", + "strum", "thiserror", "wasmer", "wasmer-middlewares", @@ -805,6 +806,12 @@ dependencies = [ "ahash", ] +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -1243,6 +1250,12 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + [[package]] name = "ryu" version = "1.0.5" @@ -1484,6 +1497,28 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.37", +] + [[package]] name = "subtle" version = "2.4.1" diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 859dd66413..78a107c138 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -263,6 +263,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.3", + "strum", "thiserror", "wasmer", "wasmer-middlewares", @@ -799,6 +800,12 @@ dependencies = [ "ahash", ] +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -1237,6 +1244,12 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + [[package]] name = "ryu" version = "1.0.5" @@ -1445,6 +1458,28 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.37", +] + [[package]] name = "subtle" version = "2.4.1" From 4d24d21402daa6511231a54b693f87d35ac2edeb Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 17 Nov 2023 17:29:13 +0100 Subject: [PATCH 0972/2372] Add gas_used to Reply --- SEMANTICS.md | 7 ++++--- packages/go-gen/src/main.rs | 2 +- packages/std/src/results/submessages.rs | 3 +++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/SEMANTICS.md b/SEMANTICS.md index f4862e81af..017735f1e8 100644 --- a/SEMANTICS.md +++ b/SEMANTICS.md @@ -286,11 +286,12 @@ pub fn reply(deps: DepsMut, env: Env, msg: Reply) -> Result` - pub result: ContractResult, + pub gas_used: u64, + /// SubMsgResult is just a nicely serializable version of `Result` + pub result: SubMsgResult, } -pub struct SubcallResponse { +pub struct SubMsgResponse { pub events: Vec, pub data: Option, } diff --git a/packages/go-gen/src/main.rs b/packages/go-gen/src/main.rs index 8d3dcc3d40..7dd00d383f 100644 --- a/packages/go-gen/src/main.rs +++ b/packages/go-gen/src/main.rs @@ -11,7 +11,7 @@ mod schema; mod utils; fn main() -> Result<()> { - let root = cosmwasm_schema::schema_for!(cosmwasm_std::BankQuery); + let root = cosmwasm_schema::schema_for!(cosmwasm_std::Reply); let code = generate_go(root)?; println!("{}", code); diff --git a/packages/std/src/results/submessages.rs b/packages/std/src/results/submessages.rs index 176677abe4..973047c771 100644 --- a/packages/std/src/results/submessages.rs +++ b/packages/std/src/results/submessages.rs @@ -102,6 +102,9 @@ pub struct Reply { /// The ID that the contract set when emitting the `SubMsg`. /// Use this to identify which submessage triggered the `reply`. pub id: u64, + /// The amount of gas used by the submessage, + /// measured in [Cosmos SDK gas](https://github.com/CosmWasm/cosmwasm/blob/main/docs/GAS.md). + pub gas_used: u64, pub result: SubMsgResult, } From 588e46b5c6cbb82f8b928b0f4d38f700421078b3 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 17 Nov 2023 18:00:38 +0100 Subject: [PATCH 0973/2372] Fix tests --- contracts/ibc-reflect/src/contract.rs | 2 ++ contracts/ibc-reflect/tests/integration.rs | 2 ++ contracts/reflect/src/contract.rs | 7 ++++++- contracts/reflect/tests/integration.rs | 7 ++++++- packages/vm/src/calls.rs | 1 + 5 files changed, 17 insertions(+), 2 deletions(-) diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index e6bcb96555..3dd6c776ca 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -404,6 +404,7 @@ mod tests { // fake a reply and ensure this works let response = Reply { id, + gas_used: 1234567, result: SubMsgResult::Ok(SubMsgResponse { events: fake_events(&account), data: None, @@ -481,6 +482,7 @@ mod tests { // fake a reply and ensure this works let response = Reply { id, + gas_used: 1234567, result: SubMsgResult::Ok(SubMsgResponse { events: fake_events(REFLECT_ADDR), data: None, diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index 9f1e994fcf..542ff939ac 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -95,6 +95,7 @@ fn connect( // fake a reply and ensure this works let response = Reply { id, + gas_used: 1234567, result: SubMsgResult::Ok(SubMsgResponse { events: fake_events(&account), data: None, @@ -173,6 +174,7 @@ fn proper_handshake_flow() { // we get the callback from reflect let response = Reply { id, + gas_used: 1234567, result: SubMsgResult::Ok(SubMsgResponse { events: fake_events(REFLECT_ADDR), data: None, diff --git a/contracts/reflect/src/contract.rs b/contracts/reflect/src/contract.rs index 87208f2e94..4d32665c6e 100644 --- a/contracts/reflect/src/contract.rs +++ b/contracts/reflect/src/contract.rs @@ -434,11 +434,16 @@ mod tests { let id = 123u64; let data = Binary::from(b"foobar"); let events = vec![Event::new("message").add_attribute("signer", "caller-addr")]; + let gas_used = 1234567u64; let result = SubMsgResult::Ok(SubMsgResponse { events: events.clone(), data: Some(data.clone()), }); - let subcall = Reply { id, result }; + let subcall = Reply { + id, + gas_used, + result, + }; let res = reply(deps.as_mut(), mock_env(), subcall).unwrap(); assert_eq!(0, res.messages.len()); diff --git a/contracts/reflect/tests/integration.rs b/contracts/reflect/tests/integration.rs index 47714925f0..6be7f79bd2 100644 --- a/contracts/reflect/tests/integration.rs +++ b/contracts/reflect/tests/integration.rs @@ -268,11 +268,16 @@ fn reply_and_query() { let id = 123u64; let data = Binary::from(b"foobar"); let events = vec![Event::new("message").add_attribute("signer", "caller-addr")]; + let gas_used = 1234567u64; let result = SubMsgResult::Ok(SubMsgResponse { events: events.clone(), data: Some(data.clone()), }); - let subcall = Reply { id, result }; + let subcall = Reply { + id, + gas_used, + result, + }; let res: Response = reply(&mut deps, mock_env(), subcall).unwrap(); assert_eq!(0, res.messages.len()); diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 29d1b9a3ab..d9421c5b4f 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -900,6 +900,7 @@ mod tests { // which creates a reflect account. here we get the callback let response = Reply { id, + gas_used: 1234567, result: SubMsgResult::Ok(SubMsgResponse { events: vec![event], data: None, From 31cd8b667a7682fa84390dac8362bae5c0f34471 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 17 Nov 2023 18:14:59 +0100 Subject: [PATCH 0974/2372] Update schema --- .../reflect/schema/raw/response_to_sub_msg_result.json | 7 +++++++ contracts/reflect/schema/reflect.json | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/contracts/reflect/schema/raw/response_to_sub_msg_result.json b/contracts/reflect/schema/raw/response_to_sub_msg_result.json index d3b29ce66d..afe3b4b9b0 100644 --- a/contracts/reflect/schema/raw/response_to_sub_msg_result.json +++ b/contracts/reflect/schema/raw/response_to_sub_msg_result.json @@ -4,10 +4,17 @@ "description": "The result object returned to `reply`. We always get the ID from the submessage back and then must handle success and error cases ourselves.", "type": "object", "required": [ + "gas_used", "id", "result" ], "properties": { + "gas_used": { + "description": "The amount of gas used by the submessage, measured in [Cosmos SDK gas](https://github.com/CosmWasm/cosmwasm/blob/main/docs/GAS.md).", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, "id": { "description": "The ID that the contract set when emitting the `SubMsg`. Use this to identify which submessage triggered the `reply`.", "type": "integer", diff --git a/contracts/reflect/schema/reflect.json b/contracts/reflect/schema/reflect.json index 09a84719e2..713ca2745c 100644 --- a/contracts/reflect/schema/reflect.json +++ b/contracts/reflect/schema/reflect.json @@ -1885,10 +1885,17 @@ "description": "The result object returned to `reply`. We always get the ID from the submessage back and then must handle success and error cases ourselves.", "type": "object", "required": [ + "gas_used", "id", "result" ], "properties": { + "gas_used": { + "description": "The amount of gas used by the submessage, measured in [Cosmos SDK gas](https://github.com/CosmWasm/cosmwasm/blob/main/docs/GAS.md).", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, "id": { "description": "The ID that the contract set when emitting the `SubMsg`. Use this to identify which submessage triggered the `reply`.", "type": "integer", From 08a5f78f25a35ad9608f7bec8a0296996eaf559c Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 14 Nov 2023 10:55:08 +0100 Subject: [PATCH 0975/2372] Use cosmwasm/optimizer:0.15.0 --- .circleci/config.yml | 18 ++++++++++++++++-- README.md | 8 ++++---- contracts/README.md | 22 +++++++++++----------- packages/vm/README.md | 8 ++++---- 4 files changed, 35 insertions(+), 21 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6412da3308..2ff3fd5c24 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1020,15 +1020,29 @@ jobs: name: Build development contracts command: | echo "Building all contracts under ./contracts" - export GLOBIGNORE="./contracts/floaty/" - docker run --volumes-from with_code cosmwasm/rust-optimizer:0.12.13 ./contracts/*/ + export GLOBIGNORE="contracts/floaty" + for contract_dir in contracts/*; do + if [ -d "$contract_dir" ]; then + echo "Building '$contract_dir' ..." + docker run --volumes-from with_code cosmwasm/optimizer:0.15.0 "$contract_dir" + fi + done - run: name: Check development contracts command: | echo "Checking all contracts under ./artifacts" docker run --volumes-from with_code rust:1.70.0 \ /bin/bash -e -c 'cd ./code; cargo run --bin cosmwasm-check artifacts/*.wasm' + - run: + name: Export development contracts + command: | + # copy into host docker cp with_code:/code/artifacts . + cd ./artifacts + ls -lA . + # Check checksums + cat checksums.txt + sha256sum -c checksums.txt - run: name: Publish artifacts on GitHub command: | diff --git a/README.md b/README.md index 3964683bb2..d79dabc345 100644 --- a/README.md +++ b/README.md @@ -397,16 +397,16 @@ from the published rust code. For that, we have a separate repo, [rust-optimizer](https://github.com/CosmWasm/rust-optimizer) that provides a -[docker image](https://hub.docker.com/r/CosmWasm/rust-optimizer/tags) for -building. For more info, look at +[docker image](https://hub.docker.com/r/CosmWasm/optimizer/tags) for building. +For more info, look at [rust-optimizer README](https://github.com/CosmWasm/rust-optimizer/blob/master/README.md#usage), but the quickstart guide is: ```sh docker run --rm -v "$(pwd)":/code \ - --mount type=volume,source="$(basename "$(pwd)")_cache",target=/code/target \ + --mount type=volume,source="$(basename "$(pwd)")_cache",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.13 + cosmwasm/optimizer:0.15.0 ``` It will output a highly size-optimized build as `contract.wasm` in `$CODE`. With diff --git a/contracts/README.md b/contracts/README.md index 35a60dd720..f4444cc913 100644 --- a/contracts/README.md +++ b/contracts/README.md @@ -55,57 +55,57 @@ reason, use the following commands: docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_burner",target=/code/contracts/burner/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.13 ./contracts/burner + cosmwasm/optimizer:0.15.0 ./contracts/burner docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_crypto_verify",target=/code/contracts/crypto-verify/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.13 ./contracts/crypto-verify + cosmwasm/optimizer:0.15.0 ./contracts/crypto-verify docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_floaty",target=/code/contracts/floaty/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.13 ./contracts/floaty + cosmwasm/optimizer:0.15.0 ./contracts/floaty docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_hackatom",target=/code/contracts/hackatom/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.13 ./contracts/hackatom + cosmwasm/optimizer:0.15.0 ./contracts/hackatom docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_ibc_reflect",target=/code/contracts/ibc-reflect/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.13 ./contracts/ibc-reflect + cosmwasm/optimizer:0.15.0 ./contracts/ibc-reflect docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_ibc_reflect_send",target=/code/contracts/ibc-reflect-send/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.13 ./contracts/ibc-reflect-send + cosmwasm/optimizer:0.15.0 ./contracts/ibc-reflect-send docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_queue",target=/code/contracts/queue/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.13 ./contracts/queue + cosmwasm/optimizer:0.15.0 ./contracts/queue docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_reflect",target=/code/contracts/reflect/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.13 ./contracts/reflect + cosmwasm/optimizer:0.15.0 ./contracts/reflect docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_staking",target=/code/contracts/staking/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.13 ./contracts/staking + cosmwasm/optimizer:0.15.0 ./contracts/staking docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_virus",target=/code/contracts/virus/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.13 ./contracts/virus + cosmwasm/optimizer:0.15.0 ./contracts/virus docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_empty",target=/code/contracts/empty/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.13 ./contracts/empty + cosmwasm/optimizer:0.15.0 ./contracts/empty ``` ## Entry points diff --git a/packages/vm/README.md b/packages/vm/README.md index 8ed9ad94df..b4166c5652 100644 --- a/packages/vm/README.md +++ b/packages/vm/README.md @@ -53,25 +53,25 @@ To rebuild the test contracts, go to the repo root and do docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_cyberpunk",target=/code/contracts/cyberpunk/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.13 ./contracts/cyberpunk \ + cosmwasm/optimizer:0.15.0 ./contracts/cyberpunk \ && cp artifacts/cyberpunk.wasm packages/vm/testdata/cyberpunk.wasm docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_hackatom",target=/code/contracts/hackatom/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.13 ./contracts/hackatom \ + cosmwasm/optimizer:0.15.0 ./contracts/hackatom \ && cp artifacts/hackatom.wasm packages/vm/testdata/hackatom_1.2.wasm docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_ibc_reflect",target=/code/contracts/ibc-reflect/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.13 ./contracts/ibc-reflect \ + cosmwasm/optimizer:0.15.0 ./contracts/ibc-reflect \ && cp artifacts/ibc_reflect.wasm packages/vm/testdata/ibc_reflect_1.2.wasm docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_empty",target=/code/contracts/empty/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.13 ./contracts/empty \ + cosmwasm/optimizer:0.15.0 ./contracts/empty \ && cp artifacts/empty.wasm packages/vm/testdata/empty.wasm ``` From b1656ed0be3f1455cb3e40a12223e45f9b431491 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 14 Nov 2023 17:11:02 +0100 Subject: [PATCH 0976/2372] Add comment on correct directory in README --- contracts/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contracts/README.md b/contracts/README.md index f4444cc913..12758384f3 100644 --- a/contracts/README.md +++ b/contracts/README.md @@ -52,6 +52,8 @@ the CI for every release tag. In case you need to build them manually for some reason, use the following commands: ```sh +# cd to the repo root first + docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_burner",target=/code/contracts/burner/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ From 9b8382324e2c3e61f66129a0d668f13e875f142e Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 14 Nov 2023 17:15:44 +0100 Subject: [PATCH 0977/2372] Add $CIRCLE_TAG check to deployment This allows us to test the CI job without creating a release. --- .circleci/config.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 2ff3fd5c24..5d6d832922 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1046,6 +1046,12 @@ jobs: - run: name: Publish artifacts on GitHub command: | + # This safety measure allows us to run the job until here for testing. + if [ -z "$CIRCLE_TAG" ]; then + echo "Not a tag build" + exit 1 + fi + TAG="$CIRCLE_TAG" TITLE="$TAG" BODY="The release notes are available in [CHANGELOG.md](https://github.com/CosmWasm/cosmwasm/blob/$TAG/CHANGELOG.md). For upgrading contracts also consult [MIGRATING.md](https://github.com/CosmWasm/cosmwasm/blob/$TAG/MIGRATING.md).\n\nAttached there are some build artifacts generated at this tag. Those are for development purposes only! Please use crates.io to find the packages of this release." From 45c14b5ab94ff37723672ebd9babbe478595087a Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Sat, 18 Nov 2023 10:51:33 +0100 Subject: [PATCH 0978/2372] Mount /target for cosmwasm/optimizer --- contracts/README.md | 22 +++++++++++----------- packages/vm/README.md | 8 ++++---- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/contracts/README.md b/contracts/README.md index 12758384f3..84795914e2 100644 --- a/contracts/README.md +++ b/contracts/README.md @@ -55,57 +55,57 @@ reason, use the following commands: # cd to the repo root first docker run --rm -v "$(pwd)":/code \ - --mount type=volume,source="devcontract_cache_burner",target=/code/contracts/burner/target \ + --mount type=volume,source="devcontract_cache_burner",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ cosmwasm/optimizer:0.15.0 ./contracts/burner docker run --rm -v "$(pwd)":/code \ - --mount type=volume,source="devcontract_cache_crypto_verify",target=/code/contracts/crypto-verify/target \ + --mount type=volume,source="devcontract_cache_crypto_verify",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ cosmwasm/optimizer:0.15.0 ./contracts/crypto-verify docker run --rm -v "$(pwd)":/code \ - --mount type=volume,source="devcontract_cache_floaty",target=/code/contracts/floaty/target \ + --mount type=volume,source="devcontract_cache_floaty",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ cosmwasm/optimizer:0.15.0 ./contracts/floaty docker run --rm -v "$(pwd)":/code \ - --mount type=volume,source="devcontract_cache_hackatom",target=/code/contracts/hackatom/target \ + --mount type=volume,source="devcontract_cache_hackatom",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ cosmwasm/optimizer:0.15.0 ./contracts/hackatom docker run --rm -v "$(pwd)":/code \ - --mount type=volume,source="devcontract_cache_ibc_reflect",target=/code/contracts/ibc-reflect/target \ + --mount type=volume,source="devcontract_cache_ibc_reflect",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ cosmwasm/optimizer:0.15.0 ./contracts/ibc-reflect docker run --rm -v "$(pwd)":/code \ - --mount type=volume,source="devcontract_cache_ibc_reflect_send",target=/code/contracts/ibc-reflect-send/target \ + --mount type=volume,source="devcontract_cache_ibc_reflect_send",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ cosmwasm/optimizer:0.15.0 ./contracts/ibc-reflect-send docker run --rm -v "$(pwd)":/code \ - --mount type=volume,source="devcontract_cache_queue",target=/code/contracts/queue/target \ + --mount type=volume,source="devcontract_cache_queue",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ cosmwasm/optimizer:0.15.0 ./contracts/queue docker run --rm -v "$(pwd)":/code \ - --mount type=volume,source="devcontract_cache_reflect",target=/code/contracts/reflect/target \ + --mount type=volume,source="devcontract_cache_reflect",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ cosmwasm/optimizer:0.15.0 ./contracts/reflect docker run --rm -v "$(pwd)":/code \ - --mount type=volume,source="devcontract_cache_staking",target=/code/contracts/staking/target \ + --mount type=volume,source="devcontract_cache_staking",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ cosmwasm/optimizer:0.15.0 ./contracts/staking docker run --rm -v "$(pwd)":/code \ - --mount type=volume,source="devcontract_cache_virus",target=/code/contracts/virus/target \ + --mount type=volume,source="devcontract_cache_virus",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ cosmwasm/optimizer:0.15.0 ./contracts/virus docker run --rm -v "$(pwd)":/code \ - --mount type=volume,source="devcontract_cache_empty",target=/code/contracts/empty/target \ + --mount type=volume,source="devcontract_cache_empty",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ cosmwasm/optimizer:0.15.0 ./contracts/empty ``` diff --git a/packages/vm/README.md b/packages/vm/README.md index b4166c5652..aa440a7960 100644 --- a/packages/vm/README.md +++ b/packages/vm/README.md @@ -51,25 +51,25 @@ To rebuild the test contracts, go to the repo root and do ```sh docker run --rm -v "$(pwd)":/code \ - --mount type=volume,source="devcontract_cache_cyberpunk",target=/code/contracts/cyberpunk/target \ + --mount type=volume,source="devcontract_cache_cyberpunk",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ cosmwasm/optimizer:0.15.0 ./contracts/cyberpunk \ && cp artifacts/cyberpunk.wasm packages/vm/testdata/cyberpunk.wasm docker run --rm -v "$(pwd)":/code \ - --mount type=volume,source="devcontract_cache_hackatom",target=/code/contracts/hackatom/target \ + --mount type=volume,source="devcontract_cache_hackatom",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ cosmwasm/optimizer:0.15.0 ./contracts/hackatom \ && cp artifacts/hackatom.wasm packages/vm/testdata/hackatom_1.2.wasm docker run --rm -v "$(pwd)":/code \ - --mount type=volume,source="devcontract_cache_ibc_reflect",target=/code/contracts/ibc-reflect/target \ + --mount type=volume,source="devcontract_cache_ibc_reflect",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ cosmwasm/optimizer:0.15.0 ./contracts/ibc-reflect \ && cp artifacts/ibc_reflect.wasm packages/vm/testdata/ibc_reflect_1.2.wasm docker run --rm -v "$(pwd)":/code \ - --mount type=volume,source="devcontract_cache_empty",target=/code/contracts/empty/target \ + --mount type=volume,source="devcontract_cache_empty",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ cosmwasm/optimizer:0.15.0 ./contracts/empty \ && cp artifacts/empty.wasm packages/vm/testdata/empty.wasm From 4a0fc53e5288f612224dd2d34757ff8fe399c73c Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 20 Nov 2023 10:52:10 +0100 Subject: [PATCH 0979/2372] Add changelog entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7aba9851a3..447c4d4e1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,9 +10,11 @@ and this project adheres to - cosmwasm-std: Add `SubMsg:reply_never` constructor ([#1929]) - cosmwasm-std: Add optional memo field to `IbcMsg::Transfer`. ([#1878]) +- cosmwasm-std: Add `Reply::gas_used`. ([#1954]) [#1878]: https://github.com/CosmWasm/cosmwasm/pull/1878 [#1929]: https://github.com/CosmWasm/cosmwasm/pull/1929 +[#1954]: https://github.com/CosmWasm/cosmwasm/pull/1954 ### Changed From e09ae4adf554ad912ebda8d24b1a8e2e0a012d09 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 17 Nov 2023 13:41:40 +0100 Subject: [PATCH 0980/2372] Remove default debug handler --- packages/vm/src/instance.rs | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index b5f26c875e..9939541a27 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -95,17 +95,7 @@ where extra_imports: Option>, instantiation_lock: Option<&Mutex<()>>, ) -> VmResult { - let fe = FunctionEnv::new(&mut store, { - let e = Environment::new(backend.api, gas_limit); - if print_debug { - e.set_debug_handler(Some(Rc::new(RefCell::new( - |msg: &str, _info: DebugInfo<'_>| { - eprintln!("{msg}"); - }, - )))) - } - e - }); + let fe = FunctionEnv::new(&mut store, Environment::new(backend.api, gas_limit)); let mut import_obj = Imports::new(); let mut env_imports = Exports::new(); From 9257a8ee4b066f2116595803fca94c372b90eefd Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 17 Nov 2023 13:50:07 +0100 Subject: [PATCH 0981/2372] Remove print_debug flag --- packages/vm/benches/main.rs | 4 ---- packages/vm/examples/multi_threaded_cache.rs | 1 - packages/vm/src/cache.rs | 8 +------ packages/vm/src/instance.rs | 24 ++------------------ packages/vm/src/testing/instance.rs | 5 ---- 5 files changed, 3 insertions(+), 39 deletions(-) diff --git a/packages/vm/benches/main.rs b/packages/vm/benches/main.rs index 7bdd75ad51..f171c7bec5 100644 --- a/packages/vm/benches/main.rs +++ b/packages/vm/benches/main.rs @@ -20,7 +20,6 @@ const DEFAULT_MEMORY_LIMIT: Size = Size::mebi(64); const DEFAULT_GAS_LIMIT: u64 = 1_000_000_000; // ~1ms const DEFAULT_INSTANCE_OPTIONS: InstanceOptions = InstanceOptions { gas_limit: DEFAULT_GAS_LIMIT, - print_debug: false, }; const HIGH_GAS_LIMIT: u64 = 20_000_000_000_000; // ~20s, allows many calls on one instance @@ -50,7 +49,6 @@ fn bench_instance(c: &mut Criterion) { let backend = mock_backend(&[]); let much_gas: InstanceOptions = InstanceOptions { gas_limit: HIGH_GAS_LIMIT, - ..DEFAULT_INSTANCE_OPTIONS }; let mut instance = Instance::from_code(CONTRACT, backend, much_gas, Some(DEFAULT_MEMORY_LIMIT)).unwrap(); @@ -68,7 +66,6 @@ fn bench_instance(c: &mut Criterion) { let backend = mock_backend(&[]); let much_gas: InstanceOptions = InstanceOptions { gas_limit: HIGH_GAS_LIMIT, - ..DEFAULT_INSTANCE_OPTIONS }; let mut instance = Instance::from_code(CONTRACT, backend, much_gas, Some(DEFAULT_MEMORY_LIMIT)).unwrap(); @@ -92,7 +89,6 @@ fn bench_instance(c: &mut Criterion) { let backend = mock_backend(&[]); let much_gas: InstanceOptions = InstanceOptions { gas_limit: HIGH_GAS_LIMIT, - ..DEFAULT_INSTANCE_OPTIONS }; let mut instance = Instance::from_code(CYBERPUNK, backend, much_gas, Some(DEFAULT_MEMORY_LIMIT)).unwrap(); diff --git a/packages/vm/examples/multi_threaded_cache.rs b/packages/vm/examples/multi_threaded_cache.rs index 1cc5b98131..f0926d489d 100644 --- a/packages/vm/examples/multi_threaded_cache.rs +++ b/packages/vm/examples/multi_threaded_cache.rs @@ -14,7 +14,6 @@ const DEFAULT_MEMORY_LIMIT: Size = Size::mebi(64); const DEFAULT_GAS_LIMIT: u64 = 400_000 * 150; const DEFAULT_INSTANCE_OPTIONS: InstanceOptions = InstanceOptions { gas_limit: DEFAULT_GAS_LIMIT, - print_debug: false, }; // Cache const MEMORY_CACHE_SIZE: Size = Size::mebi(200); diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index b4d1d9ea8e..b764ab6acb 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -357,7 +357,6 @@ where &cached.module, backend, options.gas_limit, - options.print_debug, None, Some(&self.instantiation_lock), )?; @@ -532,7 +531,6 @@ mod tests { const TESTING_MEMORY_LIMIT: Size = Size::mebi(16); const TESTING_OPTIONS: InstanceOptions = InstanceOptions { gas_limit: TESTING_GAS_LIMIT, - print_debug: false, }; const TESTING_MEMORY_CACHE_SIZE: Size = Size::mebi(200); @@ -1180,10 +1178,7 @@ mod tests { let backend2 = mock_backend(&[]); // Init from module cache - let options = InstanceOptions { - gas_limit: 10, - print_debug: false, - }; + let options = InstanceOptions { gas_limit: 10 }; let mut instance1 = cache.get_instance(&checksum, backend1, options).unwrap(); assert_eq!(cache.stats().hits_fs_cache, 1); assert_eq!(cache.stats().misses, 0); @@ -1202,7 +1197,6 @@ mod tests { // Init from memory cache let options = InstanceOptions { gas_limit: TESTING_GAS_LIMIT, - print_debug: false, }; let mut instance2 = cache.get_instance(&checksum, backend2, options).unwrap(); assert_eq!(cache.stats().hits_pinned_memory_cache, 0); diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 9939541a27..617d2aa4a1 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -43,7 +43,6 @@ pub struct GasReport { pub struct InstanceOptions { /// Gas limit measured in [CosmWasm gas](https://github.com/CosmWasm/cosmwasm/blob/main/docs/GAS.md). pub gas_limit: u64, - pub print_debug: bool, } pub struct Instance { @@ -74,15 +73,7 @@ where let engine = make_compiling_engine(memory_limit); let module = compile(&engine, code)?; let store = Store::new(engine); - Instance::from_module( - store, - &module, - backend, - options.gas_limit, - options.print_debug, - None, - None, - ) + Instance::from_module(store, &module, backend, options.gas_limit, None, None) } #[allow(clippy::too_many_arguments)] @@ -91,7 +82,6 @@ where module: &Module, backend: Backend, gas_limit: u64, - print_debug: bool, extra_imports: Option>, instantiation_lock: Option<&Mutex<()>>, ) -> VmResult { @@ -470,7 +460,6 @@ pub fn instance_from_module( module: &Module, backend: Backend, gas_limit: u64, - print_debug: bool, extra_imports: Option>, ) -> VmResult> where @@ -478,15 +467,7 @@ where S: Storage + 'static, // 'static is needed here to allow using this in an Environment that is cloned into closures Q: Querier + 'static, { - Instance::from_module( - store, - module, - backend, - gas_limit, - print_debug, - extra_imports, - None, - ) + Instance::from_module(store, module, backend, gas_limit, extra_imports, None) } #[cfg(test)] @@ -645,7 +626,6 @@ mod tests { &module, backend, instance_options.gas_limit, - false, Some(extra_imports), None, ) diff --git a/packages/vm/src/testing/instance.rs b/packages/vm/src/testing/instance.rs index bf5c200a95..c89e4e237f 100644 --- a/packages/vm/src/testing/instance.rs +++ b/packages/vm/src/testing/instance.rs @@ -19,7 +19,6 @@ use super::storage::MockStorage; /// higher than the limit for a single execution that we have in the production setup. const DEFAULT_GAS_LIMIT: u64 = 500_000_000; // ~0.5ms const DEFAULT_MEMORY_LIMIT: Option = Some(Size::mebi(16)); -const DEFAULT_PRINT_DEBUG: bool = true; pub fn mock_instance( wasm: &[u8], @@ -90,7 +89,6 @@ pub struct MockInstanceOptions<'a> { pub available_capabilities: HashSet, /// Gas limit measured in [CosmWasm gas](https://github.com/CosmWasm/cosmwasm/blob/main/docs/GAS.md). pub gas_limit: u64, - pub print_debug: bool, /// Memory limit in bytes. Use a value that is divisible by the Wasm page size 65536, e.g. full MiBs. pub memory_limit: Option, } @@ -118,7 +116,6 @@ impl Default for MockInstanceOptions<'_> { // instance available_capabilities: Self::default_capabilities(), gas_limit: DEFAULT_GAS_LIMIT, - print_debug: DEFAULT_PRINT_DEBUG, memory_limit: DEFAULT_MEMORY_LIMIT, } } @@ -155,7 +152,6 @@ pub fn mock_instance_with_options( let memory_limit = options.memory_limit; let options = InstanceOptions { gas_limit: options.gas_limit, - print_debug: options.print_debug, }; Instance::from_code(wasm, backend, options, memory_limit).unwrap() } @@ -165,7 +161,6 @@ pub fn mock_instance_options() -> (InstanceOptions, Option) { ( InstanceOptions { gas_limit: DEFAULT_GAS_LIMIT, - print_debug: DEFAULT_PRINT_DEBUG, }, DEFAULT_MEMORY_LIMIT, ) From a7c58a0980fb5754011d61b6751bced6c393730d Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 20 Nov 2023 11:00:46 +0100 Subject: [PATCH 0982/2372] Add changelog entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 447c4d4e1e..3fdfb4f53d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -76,6 +76,8 @@ and this project adheres to - cosmwasm-storage: Removed, use [cw-storage-plus] instead. ([#1936]) - cosmwasm-std: Remove `IbcReceiveResponse`'s `Default` implementation. Use `IbcReceiveResponse::new` instead. ([#1942]) +- cosmwasm-vm: Remove `InstanceOptions::print_debug` flag. Set your own handler + using `Instance::set_debug_handler`. ([#1953]) [cw-storage-plus]: https://github.com/CosmWasm/cw-storage-plus [#1875]: https://github.com/CosmWasm/cosmwasm/pull/1875 @@ -83,6 +85,7 @@ and this project adheres to [#1896]: https://github.com/CosmWasm/cosmwasm/pull/1896 [#1936]: https://github.com/CosmWasm/cosmwasm/pull/1936 [#1942]: https://github.com/CosmWasm/cosmwasm/pull/1942 +[#1953]: https://github.com/CosmWasm/cosmwasm/pull/1953 ## [1.5.0] - 2023-10-31 From 5f356ab00c7ab1b4a05c1b15329fbdf9fe568ad6 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 20 Nov 2023 12:43:58 +0100 Subject: [PATCH 0983/2372] Use BTreeSet in AnalysisReport --- packages/vm/src/cache.rs | 22 ++++++++++++---------- packages/vm/src/static_analysis.rs | 12 ++++++++++++ 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index db7938e2c7..c83db3ab8f 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -1,4 +1,4 @@ -use std::collections::HashSet; +use std::collections::{BTreeSet, HashSet}; use std::fs::{self, File, OpenOptions}; use std::io::{Read, Write}; use std::marker::PhantomData; @@ -122,9 +122,9 @@ pub struct AnalysisReport { /// This does not guarantee they are functional or even have the correct signatures. pub has_ibc_entry_points: bool, /// A set of all entrypoints that are exported by the contract. - pub entrypoints: HashSet, + pub entrypoints: BTreeSet, /// The set of capabilities the contract requires. - pub required_capabilities: HashSet, + pub required_capabilities: BTreeSet, } impl Cache @@ -292,7 +292,9 @@ where .iter() .all(|required| exports.contains(required.as_ref())), entrypoints, - required_capabilities: required_capabilities_from_module(&module), + required_capabilities: required_capabilities_from_module(&module) + .into_iter() + .collect(), }) } @@ -1307,28 +1309,28 @@ mod tests { report1, AnalysisReport { has_ibc_entry_points: false, - entrypoints: HashSet::from([ + entrypoints: BTreeSet::from([ E::Instantiate, E::Migrate, E::Sudo, E::Execute, E::Query ]), - required_capabilities: HashSet::new(), + required_capabilities: BTreeSet::new(), } ); let checksum2 = cache.save_wasm(IBC_CONTRACT).unwrap(); let report2 = cache.analyze(&checksum2).unwrap(); let mut ibc_contract_entrypoints = - HashSet::from([E::Instantiate, E::Migrate, E::Reply, E::Query]); + BTreeSet::from([E::Instantiate, E::Migrate, E::Reply, E::Query]); ibc_contract_entrypoints.extend(REQUIRED_IBC_EXPORTS); assert_eq!( report2, AnalysisReport { has_ibc_entry_points: true, entrypoints: ibc_contract_entrypoints, - required_capabilities: HashSet::from_iter([ + required_capabilities: BTreeSet::from_iter([ "iterator".to_string(), "stargate".to_string() ]), @@ -1341,8 +1343,8 @@ mod tests { report3, AnalysisReport { has_ibc_entry_points: false, - entrypoints: HashSet::new(), - required_capabilities: HashSet::from(["iterator".to_string()]), + entrypoints: BTreeSet::new(), + required_capabilities: BTreeSet::from(["iterator".to_string()]), } ); } diff --git a/packages/vm/src/static_analysis.rs b/packages/vm/src/static_analysis.rs index f2f0f77521..4cff8d6402 100644 --- a/packages/vm/src/static_analysis.rs +++ b/packages/vm/src/static_analysis.rs @@ -35,6 +35,18 @@ pub enum Entrypoint { IbcPacketTimeout, } +// sort entrypoints by their &str representation +impl PartialOrd for Entrypoint { + fn partial_cmp(&self, other: &Self) -> Option { + self.as_ref().partial_cmp(other.as_ref()) + } +} +impl Ord for Entrypoint { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + self.as_ref().cmp(other.as_ref()) + } +} + pub const REQUIRED_IBC_EXPORTS: &[Entrypoint] = &[ Entrypoint::IbcChannelOpen, Entrypoint::IbcChannelConnect, From 1f397bbc80cc2df100048034fa80f8c541220af6 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 20 Nov 2023 12:48:11 +0100 Subject: [PATCH 0984/2372] Fix lint --- packages/vm/src/static_analysis.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vm/src/static_analysis.rs b/packages/vm/src/static_analysis.rs index 4cff8d6402..ab11b52089 100644 --- a/packages/vm/src/static_analysis.rs +++ b/packages/vm/src/static_analysis.rs @@ -38,7 +38,7 @@ pub enum Entrypoint { // sort entrypoints by their &str representation impl PartialOrd for Entrypoint { fn partial_cmp(&self, other: &Self) -> Option { - self.as_ref().partial_cmp(other.as_ref()) + Some(self.cmp(other)) } } impl Ord for Entrypoint { From 0f4acd8df1a2b7cf4efc22499b811624912de3e2 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 17 Nov 2023 13:34:51 +0100 Subject: [PATCH 0985/2372] Remove interface version 7 support --- .circleci/config.yml | 6 +++--- packages/vm/Cargo.toml | 13 ++++--------- packages/vm/src/compatibility.rs | 25 +------------------------ 3 files changed, 8 insertions(+), 36 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6412da3308..d240236812 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -391,7 +391,7 @@ jobs: - run: name: Build with all features working_directory: ~/project/packages/vm - command: cargo build --locked --features allow_interface_version_7,iterator,staking,stargate + command: cargo build --locked --features iterator,staking,stargate - run: name: Test working_directory: ~/project/packages/vm @@ -399,7 +399,7 @@ jobs: - run: name: Test with all features working_directory: ~/project/packages/vm - command: cargo test --locked --features allow_interface_version_7,iterator,staking,stargate + command: cargo test --locked --features iterator,staking,stargate - run: name: Test multi threaded cache working_directory: ~/project/packages/vm @@ -448,7 +448,7 @@ jobs: - run: name: Test with all features working_directory: ~/project/packages/vm - command: cargo test --locked --features allow_interface_version_7,iterator,staking,stargate + command: cargo test --locked --features iterator,staking,stargate - save_cache: paths: # ".." is the easiest way to get $HOME here (pwd is $HOME\project) diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index f3211bcf3b..469350a4e8 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -24,18 +24,13 @@ staking = ["cosmwasm-std/staking"] stargate = ["cosmwasm-std/stargate"] # Use cranelift backend instead of singlepass. This is required for development on Windows. cranelift = ["wasmer/cranelift"] -# It's a bit unclear if interface_version_7 (CosmWasm 0.16) contracts are fully compatible -# with newer hosts. If old contracts are important to you and you are willing to take the risk, -# activate this feature. -# See also https://gist.github.com/webmaster128/3cd1988680843ecaf7548050821e1e6f. -allow_interface_version_7 = [] [lib] # See https://bheisler.github.io/criterion.rs/book/faq.html#cargo-bench-gives-unrecognized-option-errors-for-valid-command-line-options bench = false [dependencies] -bytes = "1.4.0" # need a higher version than the one required by Wasmer for the Bytes -> Vec implementation +bytes = "1.4.0" # need a higher version than the one required by Wasmer for the Bytes -> Vec implementation clru = "0.6.1" crc32fast = "1.3.2" # Uses the path when built locally; uses the given version from crates.io when published @@ -54,8 +49,8 @@ wasmer-middlewares = "=4.2.2" # Dependencies that we do not use ourself. We add those entries # to bump the min version of them. bytecheck = "0.6.3" # With this version the simdutf8 dependency became optional -enumset = "1.0.2" # Fixes https://github.com/Lymia/enumset/issues/17 (https://github.com/Lymia/enumset/commit/a430550cd6a3c9b1ef636d37f75dede7616f5b62) -bitflags = "1.1.0" # https://github.com/CensoredUsername/dynasm-rs/pull/74 +enumset = "1.0.2" # Fixes https://github.com/Lymia/enumset/issues/17 (https://github.com/Lymia/enumset/commit/a430550cd6a3c9b1ef636d37f75dede7616f5b62) +bitflags = "1.1.0" # https://github.com/CensoredUsername/dynasm-rs/pull/74 # Wasmer git/local (used for quick local debugging or patching) # wasmer = { git = "https://github.com/wasmerio/wasmer", rev = "877ce1f7c44fad853c", default-features = false, features = ["cranelift", "singlepass"] } @@ -64,7 +59,7 @@ bitflags = "1.1.0" # https://github.com/CensoredUsername/dynasm-rs/pull/74 # wasmer-middlewares = { path = "../../../wasmer/lib/middlewares" } [dev-dependencies] -criterion = { version = "0.4", features = [ "html_reports" ] } +criterion = { version = "0.4", features = ["html_reports"] } glob = "0.3.1" hex-literal = "0.3.1" tempfile = "3.1.0" diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index e3acab9728..b6dd6a65be 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -47,11 +47,7 @@ const REQUIRED_EXPORTS: &[&str] = &[ ]; const INTERFACE_VERSION_PREFIX: &str = "interface_version_"; -const SUPPORTED_INTERFACE_VERSIONS: &[&str] = &[ - "interface_version_8", - #[cfg(feature = "allow_interface_version_7")] - "interface_version_7", -]; +const SUPPORTED_INTERFACE_VERSIONS: &[&str] = &["interface_version_8"]; const MEMORY_LIMIT: u32 = 512; // in pages /// The upper limit for the `max` value of each table. CosmWasm contracts have @@ -443,25 +439,6 @@ mod tests { let module = ParsedWasm::parse(&wasm).unwrap(); check_interface_version(&module).unwrap(); - #[cfg(feature = "allow_interface_version_7")] - { - // valid legacy version - let wasm = wat::parse_str( - r#"(module - (type (func)) - (func (type 0) nop) - (export "add_one" (func 0)) - (export "allocate" (func 0)) - (export "interface_version_7" (func 0)) - (export "deallocate" (func 0)) - (export "instantiate" (func 0)) - )"#, - ) - .unwrap(); - let module = ParsedWasm::parse(&wasm).unwrap(); - check_interface_version(&module).unwrap(); - } - // missing let wasm = wat::parse_str( r#"(module From 58791c56e0ba5eb0f1caab6d2a95c90463c10145 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 20 Nov 2023 13:22:53 +0100 Subject: [PATCH 0986/2372] Add changelog entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3fdfb4f53d..834173c5d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -78,6 +78,8 @@ and this project adheres to `IbcReceiveResponse::new` instead. ([#1942]) - cosmwasm-vm: Remove `InstanceOptions::print_debug` flag. Set your own handler using `Instance::set_debug_handler`. ([#1953]) +- cosmwasm-vm: Remove `allow_interface_version_7` feature and all related + functionality. ([#1952]) [cw-storage-plus]: https://github.com/CosmWasm/cw-storage-plus [#1875]: https://github.com/CosmWasm/cosmwasm/pull/1875 @@ -85,6 +87,7 @@ and this project adheres to [#1896]: https://github.com/CosmWasm/cosmwasm/pull/1896 [#1936]: https://github.com/CosmWasm/cosmwasm/pull/1936 [#1942]: https://github.com/CosmWasm/cosmwasm/pull/1942 +[#1952]: https://github.com/CosmWasm/cosmwasm/pull/1952 [#1953]: https://github.com/CosmWasm/cosmwasm/pull/1953 ## [1.5.0] - 2023-10-31 From 720e6e02c762a97299a7faa9493df564d45a2c1c Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 20 Nov 2023 13:59:16 +0100 Subject: [PATCH 0987/2372] Add changelog entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7aba9851a3..a5d8730e6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,8 @@ and this project adheres to - cosmwasm-vm: Make `instantiate` entrypoint optional. ([#1933]) - cosmwasm-std: Rename `CosmosMsg::Stargate` to `CosmosMsg::Any` and use a nested msg struct like in other messages. ([#1926]) +- cosmwasm-vm: Add `AnalysisReport::entrypoints` and make + `AnalysisReport::required_capabilities` a `BTreeSet`. ([#1949]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 @@ -62,6 +64,7 @@ and this project adheres to [#1939]: https://github.com/CosmWasm/cosmwasm/pull/1939 [#1940]: https://github.com/CosmWasm/cosmwasm/pull/1940 [#1941]: https://github.com/CosmWasm/cosmwasm/pull/1941 +[#1949]: https://github.com/CosmWasm/cosmwasm/pull/1949 ### Removed From ac9d84bf63452deb0cd8d31ee8e0678235967936 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 20 Nov 2023 14:47:05 +0100 Subject: [PATCH 0988/2372] Revert "Add optional json annotations for custom types" This reverts commit 669361d1f2831de467356dbd628ddfbb5345f252. --- packages/go-gen/src/go.rs | 30 --------- packages/go-gen/src/main.rs | 29 +-------- packages/go-gen/src/schema.rs | 62 ++++++++----------- packages/go-gen/tests/cosmwasm_std__IbcMsg.go | 2 +- 4 files changed, 27 insertions(+), 96 deletions(-) diff --git a/packages/go-gen/src/go.rs b/packages/go-gen/src/go.rs index a854c0fb67..faead10df9 100644 --- a/packages/go-gen/src/go.rs +++ b/packages/go-gen/src/go.rs @@ -50,9 +50,6 @@ impl Display for GoField { self.ty, self.rust_name )?; - if let Some(annotations) = &self.ty.json_annotations { - write!(f, ",{}", annotations)?; - } if self.ty.is_nullable { f.write_str(",omitempty")?; } @@ -67,8 +64,6 @@ pub struct GoType { /// This will add `omitempty` to the json tag and use a pointer type if /// the type is not a basic type pub is_nullable: bool, - /// Additional json annotations, if any - pub json_annotations: Option, } impl GoType { @@ -128,12 +123,10 @@ mod tests { let ty = GoType { name: "string".to_string(), is_nullable: true, - json_annotations: None, }; let ty2 = GoType { name: "string".to_string(), is_nullable: false, - json_annotations: None, }; assert_eq!(format!("{}", ty), "string"); assert_eq!(format!("{}", ty2), "string"); @@ -141,13 +134,11 @@ mod tests { let ty = GoType { name: "FooBar".to_string(), is_nullable: true, - json_annotations: None, }; assert_eq!(format!("{}", ty), "*FooBar"); let ty = GoType { name: "FooBar".to_string(), is_nullable: false, - json_annotations: None, }; assert_eq!(format!("{}", ty), "FooBar"); } @@ -160,7 +151,6 @@ mod tests { ty: GoType { name: "string".to_string(), is_nullable: true, - json_annotations: None, }, }; assert_eq!( @@ -174,7 +164,6 @@ mod tests { ty: GoType { name: "string".to_string(), is_nullable: false, - json_annotations: None, }, }; assert_eq!(format!("{}", field), "FooBar string `json:\"foo_bar\"`"); @@ -185,7 +174,6 @@ mod tests { ty: GoType { name: "FooBar".to_string(), is_nullable: true, - json_annotations: None, }, }; assert_eq!( @@ -202,28 +190,12 @@ mod tests { ty: GoType { name: "string".to_string(), is_nullable: true, - json_annotations: None, }, }; assert_eq!( format!("{}", field), "// foo_bar is a test field\nFooBar string `json:\"foo_bar,omitempty\"`" ); - - // now with additional json annotations - let field = GoField { - rust_name: "foo_bar".to_string(), - docs: None, - ty: GoType { - name: "uint64".to_string(), - is_nullable: true, - json_annotations: Some("string".to_string()), - }, - }; - assert_eq!( - format!("{}", field), - "FooBar uint64 `json:\"foo_bar,string,omitempty\"`" - ); } #[test] @@ -237,7 +209,6 @@ mod tests { ty: GoType { name: "string".to_string(), is_nullable: true, - json_annotations: None, }, }], }; @@ -255,7 +226,6 @@ mod tests { ty: GoType { name: "string".to_string(), is_nullable: true, - json_annotations: None, }, }], }; diff --git a/packages/go-gen/src/main.rs b/packages/go-gen/src/main.rs index b44459ac9c..1a4f8278f2 100644 --- a/packages/go-gen/src/main.rs +++ b/packages/go-gen/src/main.rs @@ -175,11 +175,7 @@ pub fn build_enum_variant( ); // we can unwrap here, because we checked the length above let (name, schema) = properties.first_key_value().unwrap(); - let GoType { - name: ty, - json_annotations, - .. - } = schema_object_type( + let GoType { name: ty, .. } = schema_object_type( schema.object()?, TypeContext::new(enum_name, name), additional_structs, @@ -191,7 +187,6 @@ pub fn build_enum_variant( ty: GoType { name: ty, is_nullable: true, // always nullable - json_annotations, }, }) } @@ -529,26 +524,4 @@ mod tests { "#, ); } - - #[test] - fn timestamp_works() { - use cosmwasm_std::Timestamp; - - #[cw_serde] - struct A { - a: Timestamp, - b: Option, - } - - let code = generate_go(cosmwasm_schema::schema_for!(A)).unwrap(); - assert_code_eq( - code, - r#" - type A struct { - A uint64 `json:"a,string"` - B uint64 `json:"b,string,omitempty"` - } - "#, - ); - } } diff --git a/packages/go-gen/src/schema.rs b/packages/go-gen/src/schema.rs index e166d54522..9ee6a8ffcf 100644 --- a/packages/go-gen/src/schema.rs +++ b/packages/go-gen/src/schema.rs @@ -39,9 +39,7 @@ pub fn schema_object_type( let mut is_nullable = is_null(schema); // if it has a title, use that - let (ty, json_annotations) = if let Some(title) = - schema.metadata.as_ref().and_then(|m| m.title.as_ref()) - { + let ty = if let Some(title) = schema.metadata.as_ref().and_then(|m| m.title.as_ref()) { replace_custom_type(title) } else if let Some(reference) = &schema.reference { // if it has a reference, strip the path and use that @@ -52,25 +50,17 @@ pub fn schema_object_type( .expect("split should always return at least one item"), )) } else if let Some(t) = &schema.instance_type { - ( - type_from_instance_type(schema, type_context, t, additional_structs)?, - None, - ) + type_from_instance_type(schema, type_context, t, additional_structs)? } else if let Some(subschemas) = schema.subschemas.as_ref().and_then(|s| s.any_of.as_ref()) { // check if one of them is null - let nullable: Option<&SchemaObject> = nullable_type(subschemas)?; + let nullable = nullable_type(subschemas)?; if let Some(non_null) = nullable { ensure!(subschemas.len() == 2, "multiple subschemas in anyOf"); is_nullable = true; // extract non-null type - let GoType { - name, - json_annotations, - .. - } = schema_object_type(non_null, type_context, additional_structs)?; - // let (ty, annotations) = replace_custom_type(&name); - // (ty, annotations.or(json_annotations)) - (name, json_annotations) + let GoType { name, .. } = + schema_object_type(non_null, type_context, additional_structs)?; + replace_custom_type(&name) } else { subschema_type(subschemas, type_context, additional_structs) .context("failed to get type of anyOf subschemas")? @@ -89,7 +79,6 @@ pub fn schema_object_type( Ok(GoType { name: ty, is_nullable, - json_annotations, // TODO: implement }) } @@ -208,11 +197,11 @@ pub fn type_from_instance_type( // for nullable array item types, we have to use a pointer type, even for basic types, // so we can pass null as elements // otherwise they would just be omitted from the array - if item_type.is_nullable { + replace_custom_type(&if item_type.is_nullable { format!("[]*{}", item_type.name) } else { format!("[]{}", item_type.name) - } + }) } else { unreachable!("instance type should be one of the above") }) @@ -244,7 +233,7 @@ pub fn subschema_type( subschemas: &[Schema], type_context: TypeContext, additional_structs: &mut Vec, -) -> Result<(String, Option)> { +) -> Result { ensure!( subschemas.len() == 1, "multiple subschemas are not supported" @@ -268,27 +257,26 @@ pub fn documentation(schema: &SchemaObject) -> Option { /// Maps special types to their Go equivalents. /// If the given type is not a special type, returns `None`. -/// Otherwise, returns a tuple of the Go type name and additional json annotations. -pub fn custom_type_of(ty: &str) -> Option<(&str, Option<&str>)> { +pub fn custom_type_of(ty: &str) -> Option<&str> { match ty { - "Uint64" => Some(("string", None)), - "Uint128" => Some(("string", None)), - "Int64" => Some(("string", None)), - "Int128" => Some(("string", None)), - "Binary" => Some(("[]byte", None)), - "HexBinary" => Some(("Checksum", None)), - "Addr" => Some(("string", None)), - "Decimal" => Some(("string", None)), - "Decimal256" => Some(("string", None)), - "SignedDecimal" => Some(("string", None)), - "SignedDecimal256" => Some(("string", None)), - "Timestamp" => Some(("uint64", Some("string"))), + "Uint64" => Some("string"), + "Uint128" => Some("string"), + "Int64" => Some("string"), + "Int128" => Some("string"), + "Binary" => Some("[]byte"), + "HexBinary" => Some("Checksum"), + "Addr" => Some("string"), + "Decimal" => Some("string"), + "Decimal256" => Some("string"), + "SignedDecimal" => Some("string"), + "SignedDecimal256" => Some("string"), + "Timestamp" => Some("uint64"), _ => None, } } -pub fn replace_custom_type(ty: &str) -> (String, Option) { +pub fn replace_custom_type(ty: &str) -> String { custom_type_of(ty) - .map(|(ty, json_annotations)| (ty.to_string(), json_annotations.map(String::from))) - .unwrap_or_else(|| (ty.to_string(), None)) + .map(|ty| ty.to_string()) + .unwrap_or_else(|| ty.to_string()) } diff --git a/packages/go-gen/tests/cosmwasm_std__IbcMsg.go b/packages/go-gen/tests/cosmwasm_std__IbcMsg.go index 96989755db..d8165ba957 100644 --- a/packages/go-gen/tests/cosmwasm_std__IbcMsg.go +++ b/packages/go-gen/tests/cosmwasm_std__IbcMsg.go @@ -30,7 +30,7 @@ type Coin struct { type IBCTimeout struct { Block *IBCTimeoutBlock `json:"block,omitempty"` // in wasmvm, this does not have "omitempty" // Nanoseconds since UNIX epoch - Timestamp uint64 `json:"timestamp,string,omitempty"` // wasmvm has a "string" in here too + Timestamp uint64 `json:"timestamp,omitempty"` // wasmvm has a "string" in here too } // IBCTimeoutBlock Height is a monotonically increasing data type From f9d365c090d663f46c71b967810cfa683d6afebf Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 20 Nov 2023 16:11:41 +0100 Subject: [PATCH 0989/2372] Use new Uint64 wasmvm types --- packages/go-gen/src/main.rs | 22 +++++++++++++++++++ packages/go-gen/src/schema.rs | 6 ++--- packages/go-gen/tests/cosmwasm_std__IbcMsg.go | 2 +- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/packages/go-gen/src/main.rs b/packages/go-gen/src/main.rs index 1a4f8278f2..ab853a47c6 100644 --- a/packages/go-gen/src/main.rs +++ b/packages/go-gen/src/main.rs @@ -524,4 +524,26 @@ mod tests { "#, ); } + + #[test] + fn timestamp_works() { + use cosmwasm_std::Timestamp; + + #[cw_serde] + struct A { + a: Timestamp, + b: Option, + } + + let code = generate_go(cosmwasm_schema::schema_for!(A)).unwrap(); + assert_code_eq( + code, + r#" + type A struct { + A Uint64 `json:"a"` + B *Uint64 `json:"b,omitempty"` + } + "#, + ); + } } diff --git a/packages/go-gen/src/schema.rs b/packages/go-gen/src/schema.rs index 9ee6a8ffcf..97fe28bc5d 100644 --- a/packages/go-gen/src/schema.rs +++ b/packages/go-gen/src/schema.rs @@ -259,9 +259,9 @@ pub fn documentation(schema: &SchemaObject) -> Option { /// If the given type is not a special type, returns `None`. pub fn custom_type_of(ty: &str) -> Option<&str> { match ty { - "Uint64" => Some("string"), + "Uint64" => Some("Uint64"), "Uint128" => Some("string"), - "Int64" => Some("string"), + "Int64" => Some("Int64"), "Int128" => Some("string"), "Binary" => Some("[]byte"), "HexBinary" => Some("Checksum"), @@ -270,7 +270,7 @@ pub fn custom_type_of(ty: &str) -> Option<&str> { "Decimal256" => Some("string"), "SignedDecimal" => Some("string"), "SignedDecimal256" => Some("string"), - "Timestamp" => Some("uint64"), + "Timestamp" => Some("Uint64"), _ => None, } } diff --git a/packages/go-gen/tests/cosmwasm_std__IbcMsg.go b/packages/go-gen/tests/cosmwasm_std__IbcMsg.go index d8165ba957..e9699c1161 100644 --- a/packages/go-gen/tests/cosmwasm_std__IbcMsg.go +++ b/packages/go-gen/tests/cosmwasm_std__IbcMsg.go @@ -30,7 +30,7 @@ type Coin struct { type IBCTimeout struct { Block *IBCTimeoutBlock `json:"block,omitempty"` // in wasmvm, this does not have "omitempty" // Nanoseconds since UNIX epoch - Timestamp uint64 `json:"timestamp,omitempty"` // wasmvm has a "string" in here too + Timestamp *Uint64 `json:"timestamp,omitempty"` } // IBCTimeoutBlock Height is a monotonically increasing data type From dd8a8b19c89e0a63320b3f252b8ec3c1b0e911c1 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 10 Nov 2023 13:27:31 +0100 Subject: [PATCH 0990/2372] Move Checksum into cosmwasm_std --- packages/{vm => std}/src/checksum.rs | 13 ++++++++----- packages/std/src/lib.rs | 2 ++ packages/vm/src/cache.rs | 3 ++- packages/vm/src/lib.rs | 2 -- packages/vm/src/modules/file_system_cache.rs | 4 ++-- packages/vm/src/modules/in_memory_cache.rs | 4 +++- packages/vm/src/modules/pinned_memory_cache.rs | 3 ++- 7 files changed, 19 insertions(+), 12 deletions(-) rename packages/{vm => std}/src/checksum.rs (93%) diff --git a/packages/vm/src/checksum.rs b/packages/std/src/checksum.rs similarity index 93% rename from packages/vm/src/checksum.rs rename to packages/std/src/checksum.rs index c6aefc3fa9..f72fd4b98f 100644 --- a/packages/vm/src/checksum.rs +++ b/packages/std/src/checksum.rs @@ -1,8 +1,7 @@ -use std::fmt; +use core::fmt; use sha2::{Digest, Sha256}; - -use crate::errors::VmError; +use thiserror::Error; /// A SHA-256 checksum of a Wasm blob, used to identify a Wasm code. /// This must remain stable since this checksum is stored in the blockchain state. @@ -40,12 +39,16 @@ impl From<[u8; 32]> for Checksum { } } +#[derive(Error, Debug)] +#[error("Checksum not of length 32")] +pub struct ChecksumError; + impl TryFrom<&[u8]> for Checksum { - type Error = VmError; + type Error = ChecksumError; fn try_from(value: &[u8]) -> Result { if value.len() != 32 { - return Err(VmError::cache_err("Checksum not of length 32")); + return Err(ChecksumError); } let mut data = [0u8; 32]; data.copy_from_slice(value); diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 559e9852f3..b6536c28ec 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -8,6 +8,7 @@ extern crate alloc; mod addresses; mod assertions; mod binary; +mod checksum; mod coin; mod coins; mod conversion; @@ -41,6 +42,7 @@ pub mod storage_keys; pub use crate::addresses::{instantiate2_address, Addr, CanonicalAddr, Instantiate2AddressError}; pub use crate::binary::Binary; +pub use crate::checksum::{Checksum, ChecksumError}; pub use crate::coin::{coin, coins, has_coins, Coin}; pub use crate::coins::Coins; pub use crate::deps::{Deps, DepsMut, OwnedDeps}; diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 7ff54ebfee..5ba9291a20 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -7,9 +7,10 @@ use std::str::FromStr; use std::sync::Mutex; use wasmer::{Engine, Store}; +use cosmwasm_std::Checksum; + use crate::backend::{Backend, BackendApi, Querier, Storage}; use crate::capabilities::required_capabilities_from_module; -use crate::checksum::Checksum; use crate::compatibility::check_wasm; use crate::errors::{VmError, VmResult}; use crate::filesystem::mkdir_p; diff --git a/packages/vm/src/lib.rs b/packages/vm/src/lib.rs index 05987bac76..5a858ed560 100644 --- a/packages/vm/src/lib.rs +++ b/packages/vm/src/lib.rs @@ -5,7 +5,6 @@ mod backend; mod cache; mod calls; mod capabilities; -mod checksum; mod compatibility; mod conversion; mod environment; @@ -41,7 +40,6 @@ pub use crate::calls::{ call_ibc_packet_receive_raw, call_ibc_packet_timeout, call_ibc_packet_timeout_raw, }; pub use crate::capabilities::capabilities_from_csv; -pub use crate::checksum::Checksum; pub use crate::errors::{ CommunicationError, CommunicationResult, RegionValidationError, RegionValidationResult, VmError, VmResult, diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 58cac91b73..fd87d9cd4e 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -6,9 +6,9 @@ use thiserror::Error; use wasmer::{AsEngineRef, DeserializeError, Module, Target}; -use crate::checksum::Checksum; -use crate::errors::{VmError, VmResult}; +use cosmwasm_std::Checksum; +use crate::errors::{VmError, VmResult}; use crate::filesystem::mkdir_p; use crate::modules::current_wasmer_module_version; diff --git a/packages/vm/src/modules/in_memory_cache.rs b/packages/vm/src/modules/in_memory_cache.rs index 5b2eec52d5..6708168394 100644 --- a/packages/vm/src/modules/in_memory_cache.rs +++ b/packages/vm/src/modules/in_memory_cache.rs @@ -3,8 +3,10 @@ use std::collections::hash_map::RandomState; use std::num::NonZeroUsize; use wasmer::Module; +use cosmwasm_std::Checksum; + use super::cached_module::CachedModule; -use crate::{Checksum, Size, VmError, VmResult}; +use crate::{Size, VmError, VmResult}; // Minimum module size. // Based on `examples/module_size.sh`, and the cosmwasm-plus contracts. diff --git a/packages/vm/src/modules/pinned_memory_cache.rs b/packages/vm/src/modules/pinned_memory_cache.rs index 6177013b98..b003bed21b 100644 --- a/packages/vm/src/modules/pinned_memory_cache.rs +++ b/packages/vm/src/modules/pinned_memory_cache.rs @@ -1,8 +1,9 @@ +use cosmwasm_std::Checksum; use std::collections::HashMap; use wasmer::Module; use super::cached_module::CachedModule; -use crate::{Checksum, VmResult}; +use crate::VmResult; /// An pinned in memory module cache pub struct PinnedMemoryCache { From a2ca7ba6345f7310daab74e15c207e98e7b7b5cc Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 10 Nov 2023 15:04:30 +0100 Subject: [PATCH 0991/2372] Add Checksum::from_hex --- packages/std/src/checksum.rs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/packages/std/src/checksum.rs b/packages/std/src/checksum.rs index f72fd4b98f..1d90808c5d 100644 --- a/packages/std/src/checksum.rs +++ b/packages/std/src/checksum.rs @@ -3,6 +3,8 @@ use core::fmt; use sha2::{Digest, Sha256}; use thiserror::Error; +use crate::{StdError, StdResult}; + /// A SHA-256 checksum of a Wasm blob, used to identify a Wasm code. /// This must remain stable since this checksum is stored in the blockchain state. /// @@ -16,6 +18,15 @@ impl Checksum { Checksum(Sha256::digest(wasm).into()) } + /// Tries to parse the given hex string into a checksum. + /// Errors if the string contains non-hex characters or does not contain 32 bytes. + pub fn from_hex(input: &str) -> StdResult { + let mut binary = [0u8; 32]; + hex::decode_to_slice(input, &mut binary).map_err(StdError::invalid_hex)?; + + Ok(Self(binary)) + } + /// Creates a lowercase hex encoded copy of this checksum. /// /// This takes an owned `self` instead of a reference because `Checksum` is cheap to `Copy`. @@ -96,6 +107,24 @@ mod tests { ); } + #[test] + fn from_hex_works() { + // echo -n "hij" | sha256sum + let checksum = "722c8c993fd75a7627d69ed941344fe2a1423a3e75efd3e6778a142884227104"; + let parsed = Checksum::from_hex(checksum).unwrap(); + assert_eq!(parsed, Checksum::generate(b"hij")); + // should be inverse of `to_hex` + assert_eq!(parsed.to_hex(), checksum); + + // invalid hex + let too_short = "722c8c993fd75a7627d69ed941344fe2a1423a3e75efd3e6778a1428842271"; + assert!(Checksum::from_hex(too_short).is_err()); + let invalid_char = "722c8c993fd75a7627d69ed941344fe2a1423a3e75efd3e6778a1428842271g4"; + assert!(Checksum::from_hex(invalid_char).is_err()); + let too_long = "722c8c993fd75a7627d69ed941344fe2a1423a3e75efd3e6778a14288422710400"; + assert!(Checksum::from_hex(too_long).is_err()); + } + #[test] fn to_hex_works() { let wasm = vec![0x68, 0x69, 0x6a]; From 89c5dbec239064ab5287b88c3ae1b759be4c5300 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 10 Nov 2023 15:05:20 +0100 Subject: [PATCH 0992/2372] Use Checksum type in CodeInfoResponse --- packages/std/src/checksum.rs | 46 ++++++++++++++++++++++++++++++-- packages/std/src/query/wasm.rs | 10 +++---- packages/std/src/testing/mock.rs | 4 +-- 3 files changed, 51 insertions(+), 9 deletions(-) diff --git a/packages/std/src/checksum.rs b/packages/std/src/checksum.rs index 1d90808c5d..6e5c3db0b5 100644 --- a/packages/std/src/checksum.rs +++ b/packages/std/src/checksum.rs @@ -1,5 +1,7 @@ use core::fmt; +use schemars::JsonSchema; +use serde::{de, ser, Deserialize, Deserializer, Serialize}; use sha2::{Digest, Sha256}; use thiserror::Error; @@ -10,8 +12,8 @@ use crate::{StdError, StdResult}; /// /// This is often referred to as "code ID" in go-cosmwasm, even if code ID /// usually refers to an auto-incrementing number. -#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] -pub struct Checksum([u8; 32]); +#[derive(JsonSchema, Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub struct Checksum(#[schemars(with = "String")] [u8; 32]); impl Checksum { pub fn generate(wasm: &[u8]) -> Self { @@ -50,6 +52,46 @@ impl From<[u8; 32]> for Checksum { } } +/// Serializes as a hex string +impl Serialize for Checksum { + fn serialize(&self, serializer: S) -> Result + where + S: ser::Serializer, + { + serializer.serialize_str(&self.to_hex()) + } +} + +/// Deserializes as a hex string +impl<'de> Deserialize<'de> for Checksum { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_str(ChecksumVisitor) + } +} + +struct ChecksumVisitor; + +impl<'de> de::Visitor<'de> for ChecksumVisitor { + type Value = Checksum; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("valid hex encoded 32 byte checksum") + } + + fn visit_str(self, v: &str) -> Result + where + E: de::Error, + { + match Checksum::from_hex(v) { + Ok(data) => Ok(data), + Err(_) => Err(E::custom(format!("invalid checksum: {v}"))), + } + } +} + #[derive(Error, Debug)] #[error("Checksum not of length 32")] pub struct ChecksumError; diff --git a/packages/std/src/query/wasm.rs b/packages/std/src/query/wasm.rs index 91a36cac40..7c01040ee5 100644 --- a/packages/std/src/query/wasm.rs +++ b/packages/std/src/query/wasm.rs @@ -1,7 +1,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use crate::{Addr, Binary, HexBinary}; +use crate::{Addr, Binary, Checksum}; use super::query_response::QueryResponseType; @@ -70,14 +70,14 @@ pub struct CodeInfoResponse { /// The address that initially stored the code pub creator: Addr, /// The hash of the Wasm blob - pub checksum: HexBinary, + pub checksum: Checksum, } impl_response_constructor!( CodeInfoResponse, code_id: u64, creator: Addr, - checksum: HexBinary + checksum: Checksum ); impl QueryResponseType for CodeInfoResponse {} @@ -129,12 +129,12 @@ mod tests { #[test] #[cfg(feature = "cosmwasm_1_2")] fn code_info_response_serialization() { - use crate::HexBinary; + use crate::Checksum; let response = CodeInfoResponse { code_id: 67, creator: Addr::unchecked("jane"), - checksum: HexBinary::from_hex( + checksum: Checksum::from_hex( "f7bb7b18fb01bbf425cf4ed2cd4b7fb26a019a7fc75a4dc87e8a0b768c501f00", ) .unwrap(), diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index dcd52214a7..0a90e98d18 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -2234,13 +2234,13 @@ mod tests { } #[cfg(feature = "cosmwasm_1_2")] WasmQuery::CodeInfo { code_id } => { - use crate::{CodeInfoResponse, HexBinary}; + use crate::{Checksum, CodeInfoResponse}; let code_id = *code_id; if code_id == 4 { let response = CodeInfoResponse { code_id, creator: Addr::unchecked("lalala"), - checksum: HexBinary::from_hex( + checksum: Checksum::from_hex( "84cf20810fd429caf58898c3210fcb71759a27becddae08dbde8668ea2f4725d", ) .unwrap(), From ae1203dc8f5596ad70557550349a8f7cba1c5f90 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 10 Nov 2023 15:09:00 +0100 Subject: [PATCH 0993/2372] Change go-gen type mapping --- packages/go-gen/src/main.rs | 6 ++++-- packages/go-gen/src/schema.rs | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/go-gen/src/main.rs b/packages/go-gen/src/main.rs index 7dd00d383f..7461734eef 100644 --- a/packages/go-gen/src/main.rs +++ b/packages/go-gen/src/main.rs @@ -198,7 +198,7 @@ pub fn build_enum_variant( #[cfg(test)] mod tests { use cosmwasm_schema::cw_serde; - use cosmwasm_std::{Binary, Empty, HexBinary, Uint128}; + use cosmwasm_std::{Binary, Checksum, Empty, HexBinary, Uint128}; use super::*; @@ -241,6 +241,7 @@ mod tests { binary: Binary, nested_binary: Vec>, hex_binary: HexBinary, + checksum: Checksum, uint128: Uint128, } @@ -252,7 +253,8 @@ mod tests { r#" type SpecialTypes struct { Binary []byte `json:"binary"` - HexBinary Checksum `json:"hex_binary"` + Checksum Checksum `json:"checksum"` + HexBinary string `json:"hex_binary"` NestedBinary []*[]byte `json:"nested_binary"` Uint128 string `json:"uint128"` }"#, diff --git a/packages/go-gen/src/schema.rs b/packages/go-gen/src/schema.rs index 496d0954c2..346bc29895 100644 --- a/packages/go-gen/src/schema.rs +++ b/packages/go-gen/src/schema.rs @@ -261,7 +261,8 @@ pub fn custom_type_of(ty: &str) -> Option<&str> { match ty { "Uint128" => Some("string"), "Binary" => Some("[]byte"), - "HexBinary" => Some("Checksum"), + "HexBinary" => Some("string"), + "Checksum" => Some("Checksum"), "Addr" => Some("string"), "Decimal" => Some("string"), "Decimal256" => Some("string"), From e4afd27880e9db3bb509ec68184f6f98b8af4e01 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 10 Nov 2023 16:39:31 +0100 Subject: [PATCH 0994/2372] Fix benchmark code --- packages/vm/benches/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vm/benches/main.rs b/packages/vm/benches/main.rs index f171c7bec5..5b014617a5 100644 --- a/packages/vm/benches/main.rs +++ b/packages/vm/benches/main.rs @@ -6,12 +6,12 @@ use std::thread; use std::time::{Duration, SystemTime}; use tempfile::TempDir; -use cosmwasm_std::{coins, Empty}; +use cosmwasm_std::{coins, Checksum, Empty}; use cosmwasm_vm::testing::{ mock_backend, mock_env, mock_info, mock_instance_options, MockApi, MockQuerier, MockStorage, }; use cosmwasm_vm::{ - call_execute, call_instantiate, capabilities_from_csv, Cache, CacheOptions, Checksum, Instance, + call_execute, call_instantiate, capabilities_from_csv, Cache, CacheOptions, Instance, InstanceOptions, Size, }; From 9e09ffcedc85bc176a4fc81de3574fb39a4b72ae Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 10 Nov 2023 16:55:58 +0100 Subject: [PATCH 0995/2372] Add Checksum to [u8; 32] conversion --- packages/std/src/checksum.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/packages/std/src/checksum.rs b/packages/std/src/checksum.rs index 6e5c3db0b5..7ddf2565e9 100644 --- a/packages/std/src/checksum.rs +++ b/packages/std/src/checksum.rs @@ -1,4 +1,5 @@ use core::fmt; +use core::ops::Deref; use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; @@ -52,6 +53,25 @@ impl From<[u8; 32]> for Checksum { } } +/// Just like Vec, Checksum is a smart pointer to [u8]. +/// This implements `*data` for us and allows us to +/// do `&*data`, returning a `&[u8]` from a `&Checksum`. +/// With [deref coercions](https://doc.rust-lang.org/1.22.1/book/first-edition/deref-coercions.html#deref-coercions), +/// this allows us to use `&data` whenever a `&[u8]` is required. +impl Deref for Checksum { + type Target = [u8; 32]; + + fn deref(&self) -> &Self::Target { + self.as_ref() + } +} + +impl AsRef<[u8; 32]> for Checksum { + fn as_ref(&self) -> &[u8; 32] { + &self.0 + } +} + /// Serializes as a hex string impl Serialize for Checksum { fn serialize(&self, serializer: S) -> Result @@ -184,4 +204,18 @@ mod tests { let as_vec: Vec = checksum.into(); assert_eq!(as_vec, checksum.0); } + + #[test] + fn ref_conversions_work() { + let checksum = Checksum::generate(&[12u8; 17]); + // deref + let _: &[u8; 32] = &checksum; + let _: &[u8] = &*checksum; + // as_ref + let _: &[u8; 32] = checksum.as_ref(); + let _: &[u8] = checksum.as_ref(); + // as_slice + let _: &[u8; 32] = checksum.as_ref(); + let _: &[u8] = checksum.as_ref(); + } } From fad8a4aca41af3aef9cce4c3f33a2799369d364a Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 10 Nov 2023 17:05:33 +0100 Subject: [PATCH 0996/2372] Fix virus contract --- contracts/virus/src/contract.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/contracts/virus/src/contract.rs b/contracts/virus/src/contract.rs index 0a1235751a..fe77dfbf21 100644 --- a/contracts/virus/src/contract.rs +++ b/contracts/virus/src/contract.rs @@ -60,9 +60,11 @@ pub fn execute_spread( attributes.push(Attribute::new(format!("path{i}"), path.clone())); + // clippy produces a false positive here, see https://github.com/rust-lang/rust-clippy/issues/9841 + #[allow(clippy::explicit_auto_deref)] let address = deps .api - .addr_humanize(&instantiate2_address(&checksum, &creator, &salt)?)?; + .addr_humanize(&instantiate2_address(&*checksum, &creator, &salt)?)?; attributes.push(Attribute::new( format!("predicted_address{i}"), address.clone(), From dbfc3876dd0fc523246b10c7f1505e8fbdecf480 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 15 Nov 2023 16:35:12 +0100 Subject: [PATCH 0997/2372] Add to_schema_files test --- packages/schema/src/idl.rs | 45 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/packages/schema/src/idl.rs b/packages/schema/src/idl.rs index e1390fa1b1..dc47b239ec 100644 --- a/packages/schema/src/idl.rs +++ b/packages/schema/src/idl.rs @@ -146,10 +146,55 @@ pub enum EncodeError { #[cfg(test)] mod tests { + use crate::schema_for; + use super::*; #[test] fn version_is_semver() { semver::Version::parse(IDL_VERSION).unwrap(); } + + #[test] + fn to_schema_files_works() { + let empty = Api { + contract_name: "my_contract".to_string(), + contract_version: "1.2.3".to_string(), + instantiate: None, + execute: None, + query: None, + migrate: None, + sudo: None, + responses: None, + }; + + let files = empty.render().to_schema_files().unwrap(); + assert_eq!(files, []); + + #[derive(schemars::JsonSchema)] + struct TestMsg {} + + let full = Api { + contract_name: "my_contract".to_string(), + contract_version: "1.2.3".to_string(), + instantiate: Some(schema_for!(TestMsg)), + execute: Some(schema_for!(TestMsg)), + query: Some(schema_for!(TestMsg)), + migrate: Some(schema_for!(TestMsg)), + sudo: Some(schema_for!(TestMsg)), + responses: Some(BTreeMap::from([( + "TestMsg".to_string(), + schema_for!(TestMsg), + )])), + }; + + let files = full.render().to_schema_files().unwrap(); + assert_eq!(files.len(), 6); + assert_eq!(files[0].0, "instantiate.json"); + assert_eq!(files[1].0, "execute.json"); + assert_eq!(files[2].0, "query.json"); + assert_eq!(files[3].0, "migrate.json"); + assert_eq!(files[4].0, "sudo.json"); + assert_eq!(files[5].0, "response_to_TestMsg.json"); + } } From 3664b39e9ae727bd17193cbbf9a352693e825113 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 15 Nov 2023 16:48:39 +0100 Subject: [PATCH 0998/2372] Add CodeInfoResponse go-gen test --- packages/go-gen/src/main.rs | 2 +- packages/go-gen/tests/cosmwasm_std__CodeInfoResponse.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/go-gen/src/main.rs b/packages/go-gen/src/main.rs index 7461734eef..20779a2897 100644 --- a/packages/go-gen/src/main.rs +++ b/packages/go-gen/src/main.rs @@ -359,7 +359,7 @@ mod tests { compare_codes!(cosmwasm_std::DelegatorValidatorsResponse); // wasm compare_codes!(cosmwasm_std::ContractInfoResponse); - // compare_codes!(cosmwasm_std::CodeInfoResponse); // TODO: Checksum type and "omitempty" + compare_codes!(cosmwasm_std::CodeInfoResponse); } #[test] diff --git a/packages/go-gen/tests/cosmwasm_std__CodeInfoResponse.go b/packages/go-gen/tests/cosmwasm_std__CodeInfoResponse.go index 1173e9e7f9..16105c3597 100644 --- a/packages/go-gen/tests/cosmwasm_std__CodeInfoResponse.go +++ b/packages/go-gen/tests/cosmwasm_std__CodeInfoResponse.go @@ -1,5 +1,5 @@ type CodeInfoResponse struct { - Checksum Checksum `json:"checksum,omitempty"` + Checksum Checksum `json:"checksum"` // in wasmvm, this is `omitempty` CodeID uint64 `json:"code_id"` Creator string `json:"creator"` } From 914006ea521e0b6dfe155b23a4a4685232761659 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 15 Nov 2023 16:54:51 +0100 Subject: [PATCH 0999/2372] Add Checksum serde test --- packages/std/src/checksum.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/packages/std/src/checksum.rs b/packages/std/src/checksum.rs index 7ddf2565e9..119f93fa1f 100644 --- a/packages/std/src/checksum.rs +++ b/packages/std/src/checksum.rs @@ -139,6 +139,8 @@ impl From for Vec { mod tests { use super::*; + use crate::to_json_string; + #[test] fn generate_works() { let wasm = vec![0x68, 0x69, 0x6a]; @@ -218,4 +220,21 @@ mod tests { let _: &[u8; 32] = checksum.as_ref(); let _: &[u8] = checksum.as_ref(); } + + #[test] + fn serde_works() { + // echo -n "hij" | sha256sum + let checksum = + Checksum::from_hex("722c8c993fd75a7627d69ed941344fe2a1423a3e75efd3e6778a142884227104") + .unwrap(); + + let serialized = to_json_string(&checksum).unwrap(); + assert_eq!( + serialized, + "\"722c8c993fd75a7627d69ed941344fe2a1423a3e75efd3e6778a142884227104\"" + ); + + let deserialized: Checksum = serde_json::from_str(&serialized).unwrap(); + assert_eq!(deserialized, checksum); + } } From fc2d73373ee368fa10264dc769abbbd276be7b3b Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 16 Nov 2023 12:21:13 +0100 Subject: [PATCH 1000/2372] Remove Deref impl for Checksum --- contracts/virus/src/contract.rs | 8 +++----- packages/std/src/checksum.rs | 17 ----------------- 2 files changed, 3 insertions(+), 22 deletions(-) diff --git a/contracts/virus/src/contract.rs b/contracts/virus/src/contract.rs index fe77dfbf21..38b06f3463 100644 --- a/contracts/virus/src/contract.rs +++ b/contracts/virus/src/contract.rs @@ -60,11 +60,9 @@ pub fn execute_spread( attributes.push(Attribute::new(format!("path{i}"), path.clone())); - // clippy produces a false positive here, see https://github.com/rust-lang/rust-clippy/issues/9841 - #[allow(clippy::explicit_auto_deref)] - let address = deps - .api - .addr_humanize(&instantiate2_address(&*checksum, &creator, &salt)?)?; + let address = + deps.api + .addr_humanize(&instantiate2_address(checksum.as_ref(), &creator, &salt)?)?; attributes.push(Attribute::new( format!("predicted_address{i}"), address.clone(), diff --git a/packages/std/src/checksum.rs b/packages/std/src/checksum.rs index 119f93fa1f..cc60249bb4 100644 --- a/packages/std/src/checksum.rs +++ b/packages/std/src/checksum.rs @@ -1,5 +1,4 @@ use core::fmt; -use core::ops::Deref; use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; @@ -53,19 +52,6 @@ impl From<[u8; 32]> for Checksum { } } -/// Just like Vec, Checksum is a smart pointer to [u8]. -/// This implements `*data` for us and allows us to -/// do `&*data`, returning a `&[u8]` from a `&Checksum`. -/// With [deref coercions](https://doc.rust-lang.org/1.22.1/book/first-edition/deref-coercions.html#deref-coercions), -/// this allows us to use `&data` whenever a `&[u8]` is required. -impl Deref for Checksum { - type Target = [u8; 32]; - - fn deref(&self) -> &Self::Target { - self.as_ref() - } -} - impl AsRef<[u8; 32]> for Checksum { fn as_ref(&self) -> &[u8; 32] { &self.0 @@ -210,9 +196,6 @@ mod tests { #[test] fn ref_conversions_work() { let checksum = Checksum::generate(&[12u8; 17]); - // deref - let _: &[u8; 32] = &checksum; - let _: &[u8] = &*checksum; // as_ref let _: &[u8; 32] = checksum.as_ref(); let _: &[u8] = checksum.as_ref(); From 64b60394436e560f6f510064c7099b8206f30585 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 16 Nov 2023 13:04:56 +0100 Subject: [PATCH 1001/2372] Add as_slice to Checksum --- packages/std/src/checksum.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/std/src/checksum.rs b/packages/std/src/checksum.rs index cc60249bb4..1a6cfff04c 100644 --- a/packages/std/src/checksum.rs +++ b/packages/std/src/checksum.rs @@ -35,6 +35,12 @@ impl Checksum { pub fn to_hex(self) -> String { self.to_string() } + + /// Returns a reference to the inner bytes of this checksum as a slice. + /// If you need a reference to the array, use [`AsRef::as_ref`]. + pub fn as_slice(&self) -> &[u8] { + &self.0 + } } impl fmt::Display for Checksum { From fac1e25ee630424d249fe66e8d504aedb1df8978 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 20 Nov 2023 11:22:14 +0100 Subject: [PATCH 1002/2372] Fix CodeInfoResponse comment Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/go-gen/tests/cosmwasm_std__CodeInfoResponse.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/go-gen/tests/cosmwasm_std__CodeInfoResponse.go b/packages/go-gen/tests/cosmwasm_std__CodeInfoResponse.go index 16105c3597..54520073a5 100644 --- a/packages/go-gen/tests/cosmwasm_std__CodeInfoResponse.go +++ b/packages/go-gen/tests/cosmwasm_std__CodeInfoResponse.go @@ -1,5 +1,5 @@ type CodeInfoResponse struct { - Checksum Checksum `json:"checksum"` // in wasmvm, this is `omitempty` + Checksum Checksum `json:"checksum"` // before wasmvm 2.0.0, this was `omitempty` (https://github.com/CosmWasm/wasmvm/issues/471) CodeID uint64 `json:"code_id"` Creator string `json:"creator"` } From 3849d47660b9f56986fb93ad626afb3dd7ef3fbf Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 20 Nov 2023 11:53:05 +0100 Subject: [PATCH 1003/2372] Add changelog entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 27c7b85a96..dcd7451791 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,6 +53,8 @@ and this project adheres to nested msg struct like in other messages. ([#1926]) - cosmwasm-vm: Add `AnalysisReport::entrypoints` and make `AnalysisReport::required_capabilities` a `BTreeSet`. ([#1949]) +- cosmwasm-std: Add `Checksum` type and change type of + `CodeInfoResponse::checksum` to that. ([#1944]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 @@ -66,6 +68,7 @@ and this project adheres to [#1939]: https://github.com/CosmWasm/cosmwasm/pull/1939 [#1940]: https://github.com/CosmWasm/cosmwasm/pull/1940 [#1941]: https://github.com/CosmWasm/cosmwasm/pull/1941 +[#1944]: https://github.com/CosmWasm/cosmwasm/pull/1944 [#1949]: https://github.com/CosmWasm/cosmwasm/pull/1949 ### Removed From 80e6886511b32af29accee793ecfec9cc52ec487 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 21 Nov 2023 11:24:08 +0000 Subject: [PATCH 1004/2372] Add changelog entry about Checksum removal --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dcd7451791..e922810d52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -86,6 +86,8 @@ and this project adheres to using `Instance::set_debug_handler`. ([#1953]) - cosmwasm-vm: Remove `allow_interface_version_7` feature and all related functionality. ([#1952]) +- cosmwasm-vm: Remove `Checksum`. Use `cosmwasm_std::Checksum` instead. + ([#1944]) [cw-storage-plus]: https://github.com/CosmWasm/cw-storage-plus [#1875]: https://github.com/CosmWasm/cosmwasm/pull/1875 From da5a32cd0365a8ee5b19cab7df6cdf44dd2dc9d0 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 4 Oct 2023 17:33:52 +0200 Subject: [PATCH 1005/2372] Add msg_responses to SubMsgResponse --- packages/std/src/results/mod.rs | 2 +- packages/std/src/results/submessages.rs | 50 +++++++++++++++++++++---- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/packages/std/src/results/mod.rs b/packages/std/src/results/mod.rs index 2df471c3ea..ed505da4c3 100644 --- a/packages/std/src/results/mod.rs +++ b/packages/std/src/results/mod.rs @@ -23,5 +23,5 @@ pub use empty::Empty; pub use events::{attr, Attribute, Event}; pub use query::QueryResponse; pub use response::Response; -pub use submessages::{Reply, ReplyOn, SubMsg, SubMsgResponse, SubMsgResult}; +pub use submessages::{MsgResponseValue, Reply, ReplyOn, SubMsg, SubMsgResponse, SubMsgResult}; pub use system_result::SystemResult; diff --git a/packages/std/src/results/submessages.rs b/packages/std/src/results/submessages.rs index 973047c771..3f0de1ca65 100644 --- a/packages/std/src/results/submessages.rs +++ b/packages/std/src/results/submessages.rs @@ -123,22 +123,26 @@ pub struct Reply { /// Success: /// /// ``` -/// # use cosmwasm_std::{to_vec, Binary, Event, SubMsgResponse, SubMsgResult}; +/// # use cosmwasm_std::{to_json_string, Binary, Event, SubMsgResponse, SubMsgResult}; /// let response = SubMsgResponse { /// data: Some(Binary::from_base64("MTIzCg==").unwrap()), /// events: vec![Event::new("wasm").add_attribute("fo", "ba")], +/// msg_responses: vec![], /// }; /// let result: SubMsgResult = SubMsgResult::Ok(response); -/// assert_eq!(to_vec(&result).unwrap(), br#"{"ok":{"events":[{"type":"wasm","attributes":[{"key":"fo","value":"ba"}]}],"data":"MTIzCg=="}}"#); +/// assert_eq!( +/// to_json_string(&result).unwrap(), +/// r#"{"ok":{"events":[{"type":"wasm","attributes":[{"key":"fo","value":"ba"}]}],"data":"MTIzCg==","msg_responses":[]}}"#, +/// ); /// ``` /// /// Failure: /// /// ``` -/// # use cosmwasm_std::{to_vec, SubMsgResult, Response}; +/// # use cosmwasm_std::{to_json_string, SubMsgResult, Response}; /// let error_msg = String::from("Something went wrong"); /// let result = SubMsgResult::Err(error_msg); -/// assert_eq!(to_vec(&result).unwrap(), br#"{"error":"Something went wrong"}"#); +/// assert_eq!(to_json_string(&result).unwrap(), r#"{"error":"Something went wrong"}"#); /// ``` #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] @@ -200,6 +204,14 @@ impl From for Result { pub struct SubMsgResponse { pub events: Vec, pub data: Option, + #[serde(default)] + pub msg_responses: Vec, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +pub struct MsgResponseValue { + pub type_url: String, + pub value: Binary, } #[cfg(test)] @@ -211,20 +223,26 @@ mod tests { fn sub_msg_result_serialization_works() { let result = SubMsgResult::Ok(SubMsgResponse { data: None, + msg_responses: vec![], events: vec![], }); assert_eq!( &to_json_vec(&result).unwrap(), - br#"{"ok":{"events":[],"data":null}}"# + br#"{"ok":{"events":[],"data":null,"msg_responses":[]}}"# ); let result = SubMsgResult::Ok(SubMsgResponse { data: Some(Binary::from_base64("MTIzCg==").unwrap()), + msg_responses: vec![MsgResponseValue { + type_url: "URL".to_string(), + value: Binary::from_base64("MTIzCg==").unwrap(), + }], events: vec![Event::new("wasm").add_attribute("fo", "ba")], }); + println!("{}", &crate::to_json_string(&result).unwrap()); assert_eq!( &to_json_vec(&result).unwrap(), - br#"{"ok":{"events":[{"type":"wasm","attributes":[{"key":"fo","value":"ba"}]}],"data":"MTIzCg=="}}"# + br#"{"ok":{"events":[{"type":"wasm","attributes":[{"key":"fo","value":"ba"}]}],"data":"MTIzCg==","msg_responses":[{"type_url":"URL","value":"MTIzCg=="}]}}"# ); let result: SubMsgResult = SubMsgResult::Err("broken".to_string()); @@ -233,21 +251,28 @@ mod tests { #[test] fn sub_msg_result_deserialization_works() { + // should work without `msg_responses` let result: SubMsgResult = from_json(br#"{"ok":{"events":[],"data":null}}"#).unwrap(); assert_eq!( result, SubMsgResult::Ok(SubMsgResponse { events: vec![], data: None, + msg_responses: vec![] }) ); let result: SubMsgResult = from_json( - br#"{"ok":{"events":[{"type":"wasm","attributes":[{"key":"fo","value":"ba"}]}],"data":"MTIzCg=="}}"#).unwrap(); + br#"{"ok":{"events":[{"type":"wasm","attributes":[{"key":"fo","value":"ba"}]}],"data":"MTIzCg==", + "msg_responses":[{"type_url":"URL","value":"MTIzCg=="}]}}"#).unwrap(); assert_eq!( result, SubMsgResult::Ok(SubMsgResponse { data: Some(Binary::from_base64("MTIzCg==").unwrap()), + msg_responses: vec![MsgResponseValue { + type_url: "URL".to_string(), + value: Binary::from_base64("MTIzCg==").unwrap(), + }], events: vec![Event::new("wasm").add_attribute("fo", "ba")], }) ); @@ -272,6 +297,10 @@ mod tests { fn sub_msg_result_unwrap_works() { let response = SubMsgResponse { data: Some(Binary::from_base64("MTIzCg==").unwrap()), + msg_responses: vec![MsgResponseValue { + type_url: "URL".to_string(), + value: Binary::from_base64("MTIzCg==").unwrap(), + }], events: vec![Event::new("wasm").add_attribute("fo", "ba")], }; let success = SubMsgResult::Ok(response.clone()); @@ -297,6 +326,7 @@ mod tests { let response = SubMsgResponse { data: Some(Binary::from_base64("MTIzCg==").unwrap()), events: vec![Event::new("wasm").add_attribute("fo", "ba")], + msg_responses: vec![], }; let success = SubMsgResult::Ok(response); let _ = success.unwrap_err(); @@ -307,6 +337,7 @@ mod tests { let success = SubMsgResult::Ok(SubMsgResponse { data: Some(Binary::from_base64("MTIzCg==").unwrap()), events: vec![Event::new("wasm").add_attribute("fo", "ba")], + msg_responses: vec![], }); let failure = SubMsgResult::Err("broken".to_string()); assert!(success.is_ok()); @@ -318,6 +349,7 @@ mod tests { let success = SubMsgResult::Ok(SubMsgResponse { data: Some(Binary::from_base64("MTIzCg==").unwrap()), events: vec![Event::new("wasm").add_attribute("fo", "ba")], + msg_responses: vec![], }); let failure = SubMsgResult::Err("broken".to_string()); assert!(failure.is_err()); @@ -329,6 +361,7 @@ mod tests { let original: Result = Ok(SubMsgResponse { data: Some(Binary::from_base64("MTIzCg==").unwrap()), events: vec![], + msg_responses: vec![], }); let converted: SubMsgResult = original.into(); assert_eq!( @@ -336,6 +369,7 @@ mod tests { SubMsgResult::Ok(SubMsgResponse { data: Some(Binary::from_base64("MTIzCg==").unwrap()), events: vec![], + msg_responses: vec![], }) ); @@ -352,6 +386,7 @@ mod tests { let original = SubMsgResult::Ok(SubMsgResponse { data: Some(Binary::from_base64("MTIzCg==").unwrap()), events: vec![], + msg_responses: vec![], }); let converted: Result = original.into(); assert_eq!( @@ -359,6 +394,7 @@ mod tests { Ok(SubMsgResponse { data: Some(Binary::from_base64("MTIzCg==").unwrap()), events: vec![], + msg_responses: vec![], }) ); From b0628c95597b1fe359448bea768ed4f9e1a771c5 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 4 Oct 2023 17:34:14 +0200 Subject: [PATCH 1006/2372] Deprecate SubMsgResponse::data --- packages/std/src/results/submessages.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/std/src/results/submessages.rs b/packages/std/src/results/submessages.rs index 3f0de1ca65..2568f22557 100644 --- a/packages/std/src/results/submessages.rs +++ b/packages/std/src/results/submessages.rs @@ -124,6 +124,7 @@ pub struct Reply { /// /// ``` /// # use cosmwasm_std::{to_json_string, Binary, Event, SubMsgResponse, SubMsgResult}; +/// #[allow(deprecated)] /// let response = SubMsgResponse { /// data: Some(Binary::from_base64("MTIzCg==").unwrap()), /// events: vec![Event::new("wasm").add_attribute("fo", "ba")], @@ -203,6 +204,7 @@ impl From for Result { #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] pub struct SubMsgResponse { pub events: Vec, + #[deprecated = "deprecated in the cosmos-sdk in favor of msg_responses"] pub data: Option, #[serde(default)] pub msg_responses: Vec, @@ -215,6 +217,7 @@ pub struct MsgResponseValue { } #[cfg(test)] +#[allow(deprecated)] mod tests { use super::*; use crate::{from_json, to_json_vec, StdError, StdResult}; From 51c0adf46e83efdebdedb479f4225c0561b36cd5 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 4 Oct 2023 18:01:01 +0200 Subject: [PATCH 1007/2372] Fix contracts --- contracts/ibc-reflect/src/contract.rs | 4 ++++ contracts/ibc-reflect/tests/integration.rs | 4 ++++ contracts/reflect/src/contract.rs | 7 ++++++- contracts/reflect/tests/integration.rs | 7 ++++++- 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 3dd6c776ca..20a8b36568 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -402,11 +402,13 @@ mod tests { let id = res.messages[0].id; // fake a reply and ensure this works + #[allow(deprecated)] let response = Reply { id, gas_used: 1234567, result: SubMsgResult::Ok(SubMsgResponse { events: fake_events(&account), + msg_responses: vec![], data: None, }), }; @@ -480,11 +482,13 @@ mod tests { assert_eq!(0, res.accounts.len()); // fake a reply and ensure this works + #[allow(deprecated)] let response = Reply { id, gas_used: 1234567, result: SubMsgResult::Ok(SubMsgResponse { events: fake_events(REFLECT_ADDR), + msg_responses: vec![], data: None, }), }; diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index 542ff939ac..d7beffc874 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -93,11 +93,13 @@ fn connect( let id = res.messages[0].id; // fake a reply and ensure this works + #[allow(deprecated)] let response = Reply { id, gas_used: 1234567, result: SubMsgResult::Ok(SubMsgResponse { events: fake_events(&account), + msg_responses: vec![], data: None, }), }; @@ -172,11 +174,13 @@ fn proper_handshake_flow() { assert_eq!(0, res.accounts.len()); // we get the callback from reflect + #[allow(deprecated)] let response = Reply { id, gas_used: 1234567, result: SubMsgResult::Ok(SubMsgResponse { events: fake_events(REFLECT_ADDR), + msg_responses: vec![], data: None, }), }; diff --git a/contracts/reflect/src/contract.rs b/contracts/reflect/src/contract.rs index 4d32665c6e..914c701a53 100644 --- a/contracts/reflect/src/contract.rs +++ b/contracts/reflect/src/contract.rs @@ -435,9 +435,11 @@ mod tests { let data = Binary::from(b"foobar"); let events = vec![Event::new("message").add_attribute("signer", "caller-addr")]; let gas_used = 1234567u64; + #[allow(deprecated)] let result = SubMsgResult::Ok(SubMsgResponse { events: events.clone(), data: Some(data.clone()), + msg_responses: vec![], }); let subcall = Reply { id, @@ -460,7 +462,10 @@ mod tests { let qres: Reply = from_json(raw).unwrap(); assert_eq!(qres.id, id); let result = qres.result.unwrap(); - assert_eq!(result.data, Some(data)); + #[allow(deprecated)] + { + assert_eq!(result.data, Some(data)); + } assert_eq!(result.events, events); } } diff --git a/contracts/reflect/tests/integration.rs b/contracts/reflect/tests/integration.rs index 6be7f79bd2..23bff83c8f 100644 --- a/contracts/reflect/tests/integration.rs +++ b/contracts/reflect/tests/integration.rs @@ -269,9 +269,11 @@ fn reply_and_query() { let data = Binary::from(b"foobar"); let events = vec![Event::new("message").add_attribute("signer", "caller-addr")]; let gas_used = 1234567u64; + #[allow(deprecated)] let result = SubMsgResult::Ok(SubMsgResponse { events: events.clone(), data: Some(data.clone()), + msg_responses: vec![], }); let subcall = Reply { id, @@ -290,6 +292,9 @@ fn reply_and_query() { let qres: Reply = from_json(raw).unwrap(); assert_eq!(qres.id, id); let result = qres.result.unwrap(); - assert_eq!(result.data, Some(data)); + #[allow(deprecated)] + { + assert_eq!(result.data, Some(data)); + } assert_eq!(result.events, events); } From 321e8fcbfd2f90c7b4e127eb477e7b95ae87dfc0 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 4 Oct 2023 18:12:14 +0200 Subject: [PATCH 1008/2372] Fix vm --- packages/vm/src/calls.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index d9421c5b4f..97b059e109 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -898,11 +898,13 @@ mod tests { mock_wasmd_attr("_contract_address", account), ]); // which creates a reflect account. here we get the callback + #[allow(deprecated)] let response = Reply { id, gas_used: 1234567, result: SubMsgResult::Ok(SubMsgResponse { events: vec![event], + msg_responses: vec![], data: None, }), }; From 592c40c148b148ce80173fbe16251ff52fb07c5c Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 4 Oct 2023 18:24:21 +0200 Subject: [PATCH 1009/2372] Update contract schemas --- .../raw/response_to_sub_msg_result.json | 25 ++++++++++++++++++- contracts/reflect/schema/reflect.json | 25 ++++++++++++++++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/contracts/reflect/schema/raw/response_to_sub_msg_result.json b/contracts/reflect/schema/raw/response_to_sub_msg_result.json index afe3b4b9b0..38ee54d477 100644 --- a/contracts/reflect/schema/raw/response_to_sub_msg_result.json +++ b/contracts/reflect/schema/raw/response_to_sub_msg_result.json @@ -67,6 +67,21 @@ } } }, + "MsgResponseValue": { + "type": "object", + "required": [ + "type_url", + "value" + ], + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "$ref": "#/definitions/Binary" + } + } + }, "SubMsgResponse": { "description": "The information we get back from a successful sub message execution, with full Cosmos SDK events.", "type": "object", @@ -75,6 +90,7 @@ ], "properties": { "data": { + "deprecated": true, "anyOf": [ { "$ref": "#/definitions/Binary" @@ -89,11 +105,18 @@ "items": { "$ref": "#/definitions/Event" } + }, + "msg_responses": { + "default": [], + "type": "array", + "items": { + "$ref": "#/definitions/MsgResponseValue" + } } } }, "SubMsgResult": { - "description": "This is the result type that is returned from a sub message execution.\n\nWe use a custom type here instead of Rust's Result because we want to be able to define the serialization, which is a public interface. Every language that compiles to Wasm and runs in the ComsWasm VM needs to create the same JSON representation.\n\nUntil version 1.0.0-beta5, `ContractResult` was used instead of this type. Once serialized, the two types are the same. However, in the Rust type system we want different types for clarity and documenation reasons.\n\n# Examples\n\nSuccess:\n\n``` # use cosmwasm_std::{to_vec, Binary, Event, SubMsgResponse, SubMsgResult}; let response = SubMsgResponse { data: Some(Binary::from_base64(\"MTIzCg==\").unwrap()), events: vec![Event::new(\"wasm\").add_attribute(\"fo\", \"ba\")], }; let result: SubMsgResult = SubMsgResult::Ok(response); assert_eq!(to_vec(&result).unwrap(), br#\"{\"ok\":{\"events\":[{\"type\":\"wasm\",\"attributes\":[{\"key\":\"fo\",\"value\":\"ba\"}]}],\"data\":\"MTIzCg==\"}}\"#); ```\n\nFailure:\n\n``` # use cosmwasm_std::{to_vec, SubMsgResult, Response}; let error_msg = String::from(\"Something went wrong\"); let result = SubMsgResult::Err(error_msg); assert_eq!(to_vec(&result).unwrap(), br#\"{\"error\":\"Something went wrong\"}\"#); ```", + "description": "This is the result type that is returned from a sub message execution.\n\nWe use a custom type here instead of Rust's Result because we want to be able to define the serialization, which is a public interface. Every language that compiles to Wasm and runs in the ComsWasm VM needs to create the same JSON representation.\n\nUntil version 1.0.0-beta5, `ContractResult` was used instead of this type. Once serialized, the two types are the same. However, in the Rust type system we want different types for clarity and documenation reasons.\n\n# Examples\n\nSuccess:\n\n``` # use cosmwasm_std::{to_json_string, Binary, Event, SubMsgResponse, SubMsgResult}; #[allow(deprecated)] let response = SubMsgResponse { data: Some(Binary::from_base64(\"MTIzCg==\").unwrap()), events: vec![Event::new(\"wasm\").add_attribute(\"fo\", \"ba\")], msg_responses: vec![], }; let result: SubMsgResult = SubMsgResult::Ok(response); assert_eq!( to_json_string(&result).unwrap(), r#\"{\"ok\":{\"events\":[{\"type\":\"wasm\",\"attributes\":[{\"key\":\"fo\",\"value\":\"ba\"}]}],\"data\":\"MTIzCg==\",\"msg_responses\":[]}}\"#, ); ```\n\nFailure:\n\n``` # use cosmwasm_std::{to_json_string, SubMsgResult, Response}; let error_msg = String::from(\"Something went wrong\"); let result = SubMsgResult::Err(error_msg); assert_eq!(to_json_string(&result).unwrap(), r#\"{\"error\":\"Something went wrong\"}\"#); ```", "oneOf": [ { "type": "object", diff --git a/contracts/reflect/schema/reflect.json b/contracts/reflect/schema/reflect.json index 713ca2745c..c382e6605a 100644 --- a/contracts/reflect/schema/reflect.json +++ b/contracts/reflect/schema/reflect.json @@ -1948,6 +1948,21 @@ } } }, + "MsgResponseValue": { + "type": "object", + "required": [ + "type_url", + "value" + ], + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "$ref": "#/definitions/Binary" + } + } + }, "SubMsgResponse": { "description": "The information we get back from a successful sub message execution, with full Cosmos SDK events.", "type": "object", @@ -1956,6 +1971,7 @@ ], "properties": { "data": { + "deprecated": true, "anyOf": [ { "$ref": "#/definitions/Binary" @@ -1970,11 +1986,18 @@ "items": { "$ref": "#/definitions/Event" } + }, + "msg_responses": { + "default": [], + "type": "array", + "items": { + "$ref": "#/definitions/MsgResponseValue" + } } } }, "SubMsgResult": { - "description": "This is the result type that is returned from a sub message execution.\n\nWe use a custom type here instead of Rust's Result because we want to be able to define the serialization, which is a public interface. Every language that compiles to Wasm and runs in the ComsWasm VM needs to create the same JSON representation.\n\nUntil version 1.0.0-beta5, `ContractResult` was used instead of this type. Once serialized, the two types are the same. However, in the Rust type system we want different types for clarity and documenation reasons.\n\n# Examples\n\nSuccess:\n\n``` # use cosmwasm_std::{to_vec, Binary, Event, SubMsgResponse, SubMsgResult}; let response = SubMsgResponse { data: Some(Binary::from_base64(\"MTIzCg==\").unwrap()), events: vec![Event::new(\"wasm\").add_attribute(\"fo\", \"ba\")], }; let result: SubMsgResult = SubMsgResult::Ok(response); assert_eq!(to_vec(&result).unwrap(), br#\"{\"ok\":{\"events\":[{\"type\":\"wasm\",\"attributes\":[{\"key\":\"fo\",\"value\":\"ba\"}]}],\"data\":\"MTIzCg==\"}}\"#); ```\n\nFailure:\n\n``` # use cosmwasm_std::{to_vec, SubMsgResult, Response}; let error_msg = String::from(\"Something went wrong\"); let result = SubMsgResult::Err(error_msg); assert_eq!(to_vec(&result).unwrap(), br#\"{\"error\":\"Something went wrong\"}\"#); ```", + "description": "This is the result type that is returned from a sub message execution.\n\nWe use a custom type here instead of Rust's Result because we want to be able to define the serialization, which is a public interface. Every language that compiles to Wasm and runs in the ComsWasm VM needs to create the same JSON representation.\n\nUntil version 1.0.0-beta5, `ContractResult` was used instead of this type. Once serialized, the two types are the same. However, in the Rust type system we want different types for clarity and documenation reasons.\n\n# Examples\n\nSuccess:\n\n``` # use cosmwasm_std::{to_json_string, Binary, Event, SubMsgResponse, SubMsgResult}; #[allow(deprecated)] let response = SubMsgResponse { data: Some(Binary::from_base64(\"MTIzCg==\").unwrap()), events: vec![Event::new(\"wasm\").add_attribute(\"fo\", \"ba\")], msg_responses: vec![], }; let result: SubMsgResult = SubMsgResult::Ok(response); assert_eq!( to_json_string(&result).unwrap(), r#\"{\"ok\":{\"events\":[{\"type\":\"wasm\",\"attributes\":[{\"key\":\"fo\",\"value\":\"ba\"}]}],\"data\":\"MTIzCg==\",\"msg_responses\":[]}}\"#, ); ```\n\nFailure:\n\n``` # use cosmwasm_std::{to_json_string, SubMsgResult, Response}; let error_msg = String::from(\"Something went wrong\"); let result = SubMsgResult::Err(error_msg); assert_eq!(to_json_string(&result).unwrap(), r#\"{\"error\":\"Something went wrong\"}\"#); ```", "oneOf": [ { "type": "object", From 16b91227fabf8d220d647b06e34e518a74d4ba65 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 22 Nov 2023 09:29:44 +0000 Subject: [PATCH 1010/2372] Rename MsgResponseValue to MsgResponse --- packages/std/src/results/mod.rs | 2 +- packages/std/src/results/submessages.rs | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/std/src/results/mod.rs b/packages/std/src/results/mod.rs index ed505da4c3..effbf9ed73 100644 --- a/packages/std/src/results/mod.rs +++ b/packages/std/src/results/mod.rs @@ -23,5 +23,5 @@ pub use empty::Empty; pub use events::{attr, Attribute, Event}; pub use query::QueryResponse; pub use response::Response; -pub use submessages::{MsgResponseValue, Reply, ReplyOn, SubMsg, SubMsgResponse, SubMsgResult}; +pub use submessages::{MsgResponse, Reply, ReplyOn, SubMsg, SubMsgResponse, SubMsgResult}; pub use system_result::SystemResult; diff --git a/packages/std/src/results/submessages.rs b/packages/std/src/results/submessages.rs index 2568f22557..1f9a0a6ef1 100644 --- a/packages/std/src/results/submessages.rs +++ b/packages/std/src/results/submessages.rs @@ -207,11 +207,11 @@ pub struct SubMsgResponse { #[deprecated = "deprecated in the cosmos-sdk in favor of msg_responses"] pub data: Option, #[serde(default)] - pub msg_responses: Vec, + pub msg_responses: Vec, } #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] -pub struct MsgResponseValue { +pub struct MsgResponse { pub type_url: String, pub value: Binary, } @@ -236,7 +236,7 @@ mod tests { let result = SubMsgResult::Ok(SubMsgResponse { data: Some(Binary::from_base64("MTIzCg==").unwrap()), - msg_responses: vec![MsgResponseValue { + msg_responses: vec![MsgResponse { type_url: "URL".to_string(), value: Binary::from_base64("MTIzCg==").unwrap(), }], @@ -272,7 +272,7 @@ mod tests { result, SubMsgResult::Ok(SubMsgResponse { data: Some(Binary::from_base64("MTIzCg==").unwrap()), - msg_responses: vec![MsgResponseValue { + msg_responses: vec![MsgResponse { type_url: "URL".to_string(), value: Binary::from_base64("MTIzCg==").unwrap(), }], @@ -300,7 +300,7 @@ mod tests { fn sub_msg_result_unwrap_works() { let response = SubMsgResponse { data: Some(Binary::from_base64("MTIzCg==").unwrap()), - msg_responses: vec![MsgResponseValue { + msg_responses: vec![MsgResponse { type_url: "URL".to_string(), value: Binary::from_base64("MTIzCg==").unwrap(), }], From f5356df6f7092868ecc06263168230b394e8d1ed Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 22 Nov 2023 09:44:03 +0000 Subject: [PATCH 1011/2372] Update schema --- contracts/reflect/schema/raw/response_to_sub_msg_result.json | 4 ++-- contracts/reflect/schema/reflect.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/reflect/schema/raw/response_to_sub_msg_result.json b/contracts/reflect/schema/raw/response_to_sub_msg_result.json index 38ee54d477..e11c7ad73e 100644 --- a/contracts/reflect/schema/raw/response_to_sub_msg_result.json +++ b/contracts/reflect/schema/raw/response_to_sub_msg_result.json @@ -67,7 +67,7 @@ } } }, - "MsgResponseValue": { + "MsgResponse": { "type": "object", "required": [ "type_url", @@ -110,7 +110,7 @@ "default": [], "type": "array", "items": { - "$ref": "#/definitions/MsgResponseValue" + "$ref": "#/definitions/MsgResponse" } } } diff --git a/contracts/reflect/schema/reflect.json b/contracts/reflect/schema/reflect.json index c382e6605a..3b34e13ac9 100644 --- a/contracts/reflect/schema/reflect.json +++ b/contracts/reflect/schema/reflect.json @@ -1948,7 +1948,7 @@ } } }, - "MsgResponseValue": { + "MsgResponse": { "type": "object", "required": [ "type_url", @@ -1991,7 +1991,7 @@ "default": [], "type": "array", "items": { - "$ref": "#/definitions/MsgResponseValue" + "$ref": "#/definitions/MsgResponse" } } } From 9b68dee1b8e3a505041dc43b958dc94060261da6 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 22 Nov 2023 10:21:13 +0000 Subject: [PATCH 1012/2372] Improve deprecation msg --- packages/std/src/results/submessages.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/results/submessages.rs b/packages/std/src/results/submessages.rs index 1f9a0a6ef1..bd9801f249 100644 --- a/packages/std/src/results/submessages.rs +++ b/packages/std/src/results/submessages.rs @@ -204,7 +204,7 @@ impl From for Result { #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] pub struct SubMsgResponse { pub events: Vec, - #[deprecated = "deprecated in the cosmos-sdk in favor of msg_responses"] + #[deprecated = "Deprecated in the Cosmos SDK in favor of msg_responses. If your chain is running on CosmWasm 2.0 or higher, msg_responses will be filled. For older versions, the data field is still needed since msg_responses is empty in those cases."] pub data: Option, #[serde(default)] pub msg_responses: Vec, From 4a0d6e105e3c4ef83caf9072976612ae23d28c25 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 22 Nov 2023 17:34:37 +0100 Subject: [PATCH 1013/2372] Improve SubMsgResult test Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/std/src/results/submessages.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/results/submessages.rs b/packages/std/src/results/submessages.rs index bd9801f249..3186ad5fa7 100644 --- a/packages/std/src/results/submessages.rs +++ b/packages/std/src/results/submessages.rs @@ -255,7 +255,7 @@ mod tests { #[test] fn sub_msg_result_deserialization_works() { // should work without `msg_responses` - let result: SubMsgResult = from_json(br#"{"ok":{"events":[],"data":null}}"#).unwrap(); + let result: SubMsgResult = from_json(br#"{"ok":{"events":[]}}"#).unwrap(); assert_eq!( result, SubMsgResult::Ok(SubMsgResponse { From 92f5512f67b4e7ef4eb529cde7435567e99058bc Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 22 Nov 2023 17:22:27 +0000 Subject: [PATCH 1014/2372] Add test for pre-2.0 SubMsgResponse --- packages/std/src/results/submessages.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/std/src/results/submessages.rs b/packages/std/src/results/submessages.rs index 3186ad5fa7..5d58e87d2c 100644 --- a/packages/std/src/results/submessages.rs +++ b/packages/std/src/results/submessages.rs @@ -265,6 +265,18 @@ mod tests { }) ); + // should work with `data` and no `msg_responses` + // this is the case for pre-2.0 CosmWasm chains + let result: SubMsgResult = from_json(br#"{"ok":{"events":[],"data":"aGk="}}"#).unwrap(); + assert_eq!( + result, + SubMsgResult::Ok(SubMsgResponse { + events: vec![], + data: Some(Binary::from_base64("aGk=").unwrap()), + msg_responses: vec![] + }) + ); + let result: SubMsgResult = from_json( br#"{"ok":{"events":[{"type":"wasm","attributes":[{"key":"fo","value":"ba"}]}],"data":"MTIzCg==", "msg_responses":[{"type_url":"URL","value":"MTIzCg=="}]}}"#).unwrap(); From 89d00e18160a724d596bdd8f6e462ccd87b7bbf5 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 23 Nov 2023 12:18:52 +0000 Subject: [PATCH 1015/2372] Add changelog entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e922810d52..ed9c9f0594 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,8 +11,11 @@ and this project adheres to - cosmwasm-std: Add `SubMsg:reply_never` constructor ([#1929]) - cosmwasm-std: Add optional memo field to `IbcMsg::Transfer`. ([#1878]) - cosmwasm-std: Add `Reply::gas_used`. ([#1954]) +- cosmwasm-std: Add `SubMsgResponse::msg_responses` and deprecate + `SubMsgResponse::data`. ([#1903]) [#1878]: https://github.com/CosmWasm/cosmwasm/pull/1878 +[#1903]: https://github.com/CosmWasm/cosmwasm/pull/1903 [#1929]: https://github.com/CosmWasm/cosmwasm/pull/1929 [#1954]: https://github.com/CosmWasm/cosmwasm/pull/1954 From b62e8ceb2add4708ced95aa0c0151f214259991f Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Sat, 25 Nov 2023 22:39:35 +0100 Subject: [PATCH 1016/2372] Upgrade criterion --- Cargo.lock | 49 +++++++------------------------------- packages/crypto/Cargo.toml | 2 +- packages/vm/Cargo.toml | 2 +- 3 files changed, 10 insertions(+), 43 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 62ff478877..a115eba759 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -334,18 +334,6 @@ dependencies = [ "half", ] -[[package]] -name = "clap" -version = "3.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" -dependencies = [ - "bitflags", - "clap_lex 0.2.4", - "indexmap", - "textwrap", -] - [[package]] name = "clap" version = "4.3.0" @@ -364,19 +352,10 @@ dependencies = [ "anstream", "anstyle", "bitflags", - "clap_lex 0.5.0", + "clap_lex", "strsim", ] -[[package]] -name = "clap_lex" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" -dependencies = [ - "os_str_bytes", -] - [[package]] name = "clap_lex" version = "0.5.0" @@ -431,7 +410,7 @@ version = "1.5.0" dependencies = [ "anyhow", "assert_cmd", - "clap 4.3.0", + "clap", "colored", "cosmwasm-std", "cosmwasm-vm", @@ -521,7 +500,7 @@ dependencies = [ "bitflags", "bytecheck", "bytes", - "clap 4.3.0", + "clap", "clru", "cosmwasm-crypto", "cosmwasm-std", @@ -650,19 +629,19 @@ dependencies = [ [[package]] name = "criterion" -version = "0.4.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" dependencies = [ "anes", - "atty", "cast", "ciborium", - "clap 3.2.25", + "clap", "criterion-plot", + "is-terminal", "itertools", - "lazy_static", "num-traits", + "once_cell", "oorandom", "plotters", "rayon", @@ -1495,12 +1474,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "os_str_bytes" -version = "6.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" - [[package]] name = "parking_lot_core" version = "0.9.7" @@ -2176,12 +2149,6 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" -[[package]] -name = "textwrap" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" - [[package]] name = "thiserror" version = "1.0.40" diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 689afb02a6..e2607a31fe 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -28,7 +28,7 @@ thiserror = "1.0.38" ecdsa = "0.16.2" [dev-dependencies] -criterion = "0.4" +criterion = "0.5.1" serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } serde_json = "1.0.40" sha2 = "0.10" diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 566a7b7cae..cd792ba8fe 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -60,7 +60,7 @@ bitflags = "1.1.0" # https://github.com/CensoredUsername/dynasm-rs/pull/74 # wasmer-middlewares = { path = "../../../wasmer/lib/middlewares" } [dev-dependencies] -criterion = { version = "0.4", features = ["html_reports"] } +criterion = { version = "0.5.1", features = ["html_reports"] } glob = "0.3.1" hex-literal = "0.3.1" tempfile = "3.1.0" From c4fd8133db6cc155defa911a624f827cbc3d91bc Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 27 Nov 2023 17:34:30 +0000 Subject: [PATCH 1017/2372] Always add backtrace to cosmwasm-std --- packages/std/Cargo.toml | 14 +- packages/std/src/binary.rs | 2 +- packages/std/src/errors/backtrace.rs | 48 +++++ packages/std/src/errors/mod.rs | 2 + .../std/src/errors/recover_pubkey_error.rs | 14 +- packages/std/src/errors/std_error.rs | 197 ++++++------------ packages/std/src/errors/verification_error.rs | 14 +- 7 files changed, 122 insertions(+), 169 deletions(-) create mode 100644 packages/std/src/errors/backtrace.rs diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 24cf779ed5..43461a812c 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -23,10 +23,6 @@ iterator = [] # CosmosMsg types, and new QueryRequest types. This should only be enabled on contracts # that require these types, so other contracts can be used on systems with eg. PoA consensus staking = [] -# backtraces provides much better context at runtime errors (in non-wasm code) -# at the cost of a bit of code size and performance. -# This feature requires Rust nightly because it depends on the unstable backtrace feature. -backtraces = [] # stargate enables stargate-dependent messages and queries, like raw protobuf messages # as well as ibc-related functionality stargate = [] @@ -54,10 +50,7 @@ forward_ref = "1" hex = "0.4" schemars = "0.8.3" sha2 = "0.10.3" -serde = { version = "1.0.103", default-features = false, features = [ - "derive", - "alloc", -] } +serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } serde-json-wasm = { version = "1.0.0" } thiserror = "1.0.26" bnum = "0.8.0" @@ -70,10 +63,7 @@ cosmwasm-crypto = { path = "../crypto", version = "1.5.0" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } # The chrono dependency is only used in an example, which Rust compiles for us. If this causes trouble, remove it. -chrono = { version = "0.4", default-features = false, features = [ - "alloc", - "std", -] } +chrono = { version = "0.4", default-features = false, features = ["alloc", "std"] } crc32fast = "1.3.2" hex-literal = "0.3.1" serde_json = "1.0.81" diff --git a/packages/std/src/binary.rs b/packages/std/src/binary.rs index 8e2355033b..f5f39afec3 100644 --- a/packages/std/src/binary.rs +++ b/packages/std/src/binary.rs @@ -335,7 +335,7 @@ mod tests { ("cmFuZ", "Encoded text cannot have a 6-bit remainder."), ] { match Binary::from_base64(invalid_base64) { - Err(StdError::InvalidBase64 { msg }) => assert_eq!(want, msg), + Err(StdError::InvalidBase64 { msg, .. }) => assert_eq!(want, msg), result => panic!("Unexpected result: {result:?}"), } } diff --git a/packages/std/src/errors/backtrace.rs b/packages/std/src/errors/backtrace.rs new file mode 100644 index 0000000000..552c608032 --- /dev/null +++ b/packages/std/src/errors/backtrace.rs @@ -0,0 +1,48 @@ +use core::fmt::{Debug, Display, Formatter, Result}; +use thiserror::Error; + +/// This wraps an actual backtrace to achieve two things: +/// - being able to fill this with a stub implementation in `no_std` environments +/// - being able to use this in conjunction with [`thiserror::Error`] +#[derive(Error)] +pub struct BT(Box); + +impl BT { + #[track_caller] + pub fn capture() -> Self { + BT(Box::new(std::backtrace::Backtrace::capture())) + } +} + +trait Printable: Debug + Display {} +impl Printable for T where T: Debug + Display {} + +impl Debug for BT { + fn fmt(&self, f: &mut Formatter<'_>) -> Result { + Debug::fmt(&self.0, f) + } +} + +impl Display for BT { + fn fmt(&self, f: &mut Formatter<'_>) -> Result { + Display::fmt(&self.0, f) + } +} + +/// This macro implements `From` for a given error type to a given error type where +/// the target error has a `backtrace` field. +/// This is meant as a replacement for `thiserror`'s `#[from]` attribute, which does not +/// work with our custom backtrace wrapper. +macro_rules! impl_from_err { + ($from:ty, $to:ty, $map:path) => { + impl From<$from> for $to { + fn from(err: $from) -> Self { + $map { + source: err, + backtrace: $crate::errors::backtrace::BT::capture(), + } + } + } + }; +} +pub(crate) use impl_from_err; diff --git a/packages/std/src/errors/mod.rs b/packages/std/src/errors/mod.rs index 47555b5849..f85e7774d9 100644 --- a/packages/std/src/errors/mod.rs +++ b/packages/std/src/errors/mod.rs @@ -1,8 +1,10 @@ +mod backtrace; mod recover_pubkey_error; mod std_error; mod system_error; mod verification_error; +pub(crate) use backtrace::{impl_from_err, BT}; pub use recover_pubkey_error::RecoverPubkeyError; pub use std_error::{ CheckedFromRatioError, CheckedMultiplyFractionError, CheckedMultiplyRatioError, diff --git a/packages/std/src/errors/recover_pubkey_error.rs b/packages/std/src/errors/recover_pubkey_error.rs index 6a48fa2af8..ac2b174a26 100644 --- a/packages/std/src/errors/recover_pubkey_error.rs +++ b/packages/std/src/errors/recover_pubkey_error.rs @@ -1,8 +1,8 @@ use core::fmt::Debug; #[cfg(not(target_arch = "wasm32"))] use cosmwasm_crypto::CryptoError; -#[cfg(feature = "backtraces")] -use std::backtrace::Backtrace; + +use super::BT; use thiserror::Error; #[derive(Error, Debug)] @@ -14,19 +14,15 @@ pub enum RecoverPubkeyError { #[error("Invalid recovery parameter. Supported values: 0 and 1.")] InvalidRecoveryParam, #[error("Unknown error: {error_code}")] - UnknownErr { - error_code: u32, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + UnknownErr { error_code: u32, backtrace: BT }, } impl RecoverPubkeyError { pub fn unknown_err(error_code: u32) -> Self { RecoverPubkeyError::UnknownErr { error_code, - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + + backtrace: BT::capture(), } } } diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index 1e6555042f..22bbe71f24 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -1,6 +1,6 @@ use core::fmt; -#[cfg(feature = "backtraces")] -use std::backtrace::Backtrace; + +use super::{impl_from_err, BT}; use thiserror::Error; use crate::errors::{RecoverPubkeyError, VerificationError}; @@ -25,121 +25,94 @@ pub enum StdError { #[error("Verification error: {source}")] VerificationErr { source: VerificationError, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, + backtrace: BT, }, #[error("Recover pubkey error: {source}")] RecoverPubkeyErr { source: RecoverPubkeyError, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, + backtrace: BT, }, /// Whenever there is no specific error type available #[error("Generic error: {msg}")] - GenericErr { - msg: String, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + GenericErr { msg: String, backtrace: BT }, #[error("Invalid Base64 string: {msg}")] - InvalidBase64 { - msg: String, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + InvalidBase64 { msg: String, backtrace: BT }, #[error("Invalid data size: expected={expected} actual={actual}")] InvalidDataSize { expected: u64, actual: u64, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, + backtrace: BT, }, #[error("Invalid hex string: {msg}")] - InvalidHex { - msg: String, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + InvalidHex { msg: String, backtrace: BT }, /// Whenever UTF-8 bytes cannot be decoded into a unicode string, e.g. in String::from_utf8 or str::from_utf8. #[error("Cannot decode UTF8 bytes into string: {msg}")] - InvalidUtf8 { - msg: String, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + InvalidUtf8 { msg: String, backtrace: BT }, #[error("{kind} not found")] - NotFound { - kind: String, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + NotFound { kind: String, backtrace: BT }, #[error("Error parsing into type {target_type}: {msg}")] ParseErr { /// the target type that was attempted target_type: String, msg: String, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, + backtrace: BT, }, #[error("Error serializing type {source_type}: {msg}")] SerializeErr { /// the source type that was attempted source_type: String, msg: String, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, + backtrace: BT, }, #[error("Overflow: {source}")] Overflow { source: OverflowError, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, + backtrace: BT, }, #[error("Divide by zero: {source}")] DivideByZero { source: DivideByZeroError, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, + backtrace: BT, }, #[error("Conversion error: ")] ConversionOverflow { - #[from] source: ConversionOverflowError, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, + backtrace: BT, }, } +impl_from_err!( + ConversionOverflowError, + StdError, + StdError::ConversionOverflow +); + impl StdError { pub fn verification_err(source: VerificationError) -> Self { StdError::VerificationErr { source, - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub fn recover_pubkey_err(source: RecoverPubkeyError) -> Self { StdError::RecoverPubkeyErr { source, - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub fn generic_err(msg: impl Into) -> Self { StdError::GenericErr { msg: msg.into(), - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub fn invalid_base64(msg: impl ToString) -> Self { StdError::InvalidBase64 { msg: msg.to_string(), - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } @@ -148,32 +121,28 @@ impl StdError { // Cast is safe because usize is 32 or 64 bit large in all environments we support expected: expected as u64, actual: actual as u64, - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub fn invalid_hex(msg: impl ToString) -> Self { StdError::InvalidHex { msg: msg.to_string(), - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub fn invalid_utf8(msg: impl ToString) -> Self { StdError::InvalidUtf8 { msg: msg.to_string(), - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub fn not_found(kind: impl Into) -> Self { StdError::NotFound { kind: kind.into(), - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } @@ -181,8 +150,7 @@ impl StdError { StdError::ParseErr { target_type: target.into(), msg: msg.to_string(), - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } @@ -190,24 +158,21 @@ impl StdError { StdError::SerializeErr { source_type: source.into(), msg: msg.to_string(), - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub fn overflow(source: OverflowError) -> Self { StdError::Overflow { source, - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub fn divide_by_zero(source: DivideByZeroError) -> Self { StdError::DivideByZero { source, - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } } @@ -217,13 +182,11 @@ impl PartialEq for StdError { match self { StdError::VerificationErr { source, - #[cfg(feature = "backtraces")] - backtrace: _, + backtrace: _, } => { if let StdError::VerificationErr { source: rhs_source, - #[cfg(feature = "backtraces")] - backtrace: _, + backtrace: _, } = rhs { source == rhs_source @@ -233,13 +196,11 @@ impl PartialEq for StdError { } StdError::RecoverPubkeyErr { source, - #[cfg(feature = "backtraces")] - backtrace: _, + backtrace: _, } => { if let StdError::RecoverPubkeyErr { source: rhs_source, - #[cfg(feature = "backtraces")] - backtrace: _, + backtrace: _, } = rhs { source == rhs_source @@ -247,15 +208,10 @@ impl PartialEq for StdError { false } } - StdError::GenericErr { - msg, - #[cfg(feature = "backtraces")] - backtrace: _, - } => { + StdError::GenericErr { msg, backtrace: _ } => { if let StdError::GenericErr { msg: rhs_msg, - #[cfg(feature = "backtraces")] - backtrace: _, + backtrace: _, } = rhs { msg == rhs_msg @@ -263,15 +219,10 @@ impl PartialEq for StdError { false } } - StdError::InvalidBase64 { - msg, - #[cfg(feature = "backtraces")] - backtrace: _, - } => { + StdError::InvalidBase64 { msg, backtrace: _ } => { if let StdError::InvalidBase64 { msg: rhs_msg, - #[cfg(feature = "backtraces")] - backtrace: _, + backtrace: _, } = rhs { msg == rhs_msg @@ -282,14 +233,12 @@ impl PartialEq for StdError { StdError::InvalidDataSize { expected, actual, - #[cfg(feature = "backtraces")] - backtrace: _, + backtrace: _, } => { if let StdError::InvalidDataSize { expected: rhs_expected, actual: rhs_actual, - #[cfg(feature = "backtraces")] - backtrace: _, + backtrace: _, } = rhs { expected == rhs_expected && actual == rhs_actual @@ -297,15 +246,10 @@ impl PartialEq for StdError { false } } - StdError::InvalidHex { - msg, - #[cfg(feature = "backtraces")] - backtrace: _, - } => { + StdError::InvalidHex { msg, backtrace: _ } => { if let StdError::InvalidHex { msg: rhs_msg, - #[cfg(feature = "backtraces")] - backtrace: _, + backtrace: _, } = rhs { msg == rhs_msg @@ -313,15 +257,10 @@ impl PartialEq for StdError { false } } - StdError::InvalidUtf8 { - msg, - #[cfg(feature = "backtraces")] - backtrace: _, - } => { + StdError::InvalidUtf8 { msg, backtrace: _ } => { if let StdError::InvalidUtf8 { msg: rhs_msg, - #[cfg(feature = "backtraces")] - backtrace: _, + backtrace: _, } = rhs { msg == rhs_msg @@ -329,15 +268,10 @@ impl PartialEq for StdError { false } } - StdError::NotFound { - kind, - #[cfg(feature = "backtraces")] - backtrace: _, - } => { + StdError::NotFound { kind, backtrace: _ } => { if let StdError::NotFound { kind: rhs_kind, - #[cfg(feature = "backtraces")] - backtrace: _, + backtrace: _, } = rhs { kind == rhs_kind @@ -348,14 +282,12 @@ impl PartialEq for StdError { StdError::ParseErr { target_type, msg, - #[cfg(feature = "backtraces")] - backtrace: _, + backtrace: _, } => { if let StdError::ParseErr { target_type: rhs_target_type, msg: rhs_msg, - #[cfg(feature = "backtraces")] - backtrace: _, + backtrace: _, } = rhs { target_type == rhs_target_type && msg == rhs_msg @@ -366,14 +298,12 @@ impl PartialEq for StdError { StdError::SerializeErr { source_type, msg, - #[cfg(feature = "backtraces")] - backtrace: _, + backtrace: _, } => { if let StdError::SerializeErr { source_type: rhs_source_type, msg: rhs_msg, - #[cfg(feature = "backtraces")] - backtrace: _, + backtrace: _, } = rhs { source_type == rhs_source_type && msg == rhs_msg @@ -383,13 +313,11 @@ impl PartialEq for StdError { } StdError::Overflow { source, - #[cfg(feature = "backtraces")] - backtrace: _, + backtrace: _, } => { if let StdError::Overflow { source: rhs_source, - #[cfg(feature = "backtraces")] - backtrace: _, + backtrace: _, } = rhs { source == rhs_source @@ -399,13 +327,11 @@ impl PartialEq for StdError { } StdError::DivideByZero { source, - #[cfg(feature = "backtraces")] - backtrace: _, + backtrace: _, } => { if let StdError::DivideByZero { source: rhs_source, - #[cfg(feature = "backtraces")] - backtrace: _, + backtrace: _, } = rhs { source == rhs_source @@ -415,13 +341,11 @@ impl PartialEq for StdError { } StdError::ConversionOverflow { source, - #[cfg(feature = "backtraces")] - backtrace: _, + backtrace: _, } => { if let StdError::ConversionOverflow { source: rhs_source, - #[cfg(feature = "backtraces")] - backtrace: _, + backtrace: _, } = rhs { source == rhs_source @@ -811,9 +735,6 @@ mod tests { fn implements_debug() { let error: StdError = StdError::from(OverflowError::new(OverflowOperation::Sub)); let embedded = format!("Debug: {error:?}"); - #[cfg(not(feature = "backtraces"))] - let expected = r#"Debug: Overflow { source: OverflowError { operation: Sub } }"#; - #[cfg(feature = "backtraces")] let expected = r#"Debug: Overflow { source: OverflowError { operation: Sub }, backtrace: }"#; assert_eq!(embedded, expected); } diff --git a/packages/std/src/errors/verification_error.rs b/packages/std/src/errors/verification_error.rs index 5c57999767..d4366c5206 100644 --- a/packages/std/src/errors/verification_error.rs +++ b/packages/std/src/errors/verification_error.rs @@ -1,6 +1,6 @@ use core::fmt::Debug; -#[cfg(feature = "backtraces")] -use std::backtrace::Backtrace; + +use super::BT; use thiserror::Error; #[cfg(not(target_arch = "wasm32"))] @@ -21,19 +21,15 @@ pub enum VerificationError { #[error("Invalid recovery parameter. Supported values: 0 and 1.")] InvalidRecoveryParam, #[error("Unknown error: {error_code}")] - UnknownErr { - error_code: u32, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + UnknownErr { error_code: u32, backtrace: BT }, } impl VerificationError { pub fn unknown_err(error_code: u32) -> Self { VerificationError::UnknownErr { error_code, - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + + backtrace: BT::capture(), } } } From ba858048c508851990ab40f57122606f609e35dc Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 28 Nov 2023 09:48:21 +0000 Subject: [PATCH 1018/2372] Fix contracts --- contracts/burner/Cargo.toml | 2 +- contracts/crypto-verify/Cargo.toml | 2 +- contracts/crypto-verify/src/contract.rs | 19 +++++++++++-------- contracts/cyberpunk/Cargo.toml | 2 +- contracts/empty/Cargo.toml | 2 +- contracts/floaty/Cargo.toml | 2 +- contracts/hackatom/Cargo.toml | 2 +- contracts/ibc-reflect-send/Cargo.toml | 2 +- contracts/ibc-reflect/Cargo.toml | 2 +- contracts/queue/Cargo.toml | 4 ++-- contracts/reflect/Cargo.toml | 2 +- contracts/staking/Cargo.toml | 2 +- contracts/virus/Cargo.toml | 2 +- 13 files changed, 24 insertions(+), 21 deletions(-) diff --git a/contracts/burner/Cargo.toml b/contracts/burner/Cargo.toml index 394074b75d..4c94930e2a 100644 --- a/contracts/burner/Cargo.toml +++ b/contracts/burner/Cargo.toml @@ -29,7 +29,7 @@ default = [] cranelift = ["cosmwasm-vm/cranelift"] # for quicker tests, cargo test --lib # for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] +backtraces = ["cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } diff --git a/contracts/crypto-verify/Cargo.toml b/contracts/crypto-verify/Cargo.toml index e31fe6242b..b9db8fa79e 100644 --- a/contracts/crypto-verify/Cargo.toml +++ b/contracts/crypto-verify/Cargo.toml @@ -29,7 +29,7 @@ default = [] cranelift = ["cosmwasm-vm/cranelift"] # for quicker tests, cargo test --lib # for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] +backtraces = ["cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } diff --git a/contracts/crypto-verify/src/contract.rs b/contracts/crypto-verify/src/contract.rs index 1a418cb8ef..f52716df73 100644 --- a/contracts/crypto-verify/src/contract.rs +++ b/contracts/crypto-verify/src/contract.rs @@ -317,12 +317,13 @@ mod tests { let res = query(deps.as_ref(), mock_env(), verify_msg); assert!(res.is_err()); - assert_eq!( + assert!(matches!( res.unwrap_err(), StdError::VerificationErr { - source: VerificationError::InvalidPubkeyFormat + source: VerificationError::InvalidPubkeyFormat, + .. } - ) + )) } #[test] @@ -605,12 +606,13 @@ mod tests { }; let res = query(deps.as_ref(), mock_env(), verify_msg); assert!(res.is_err()); - assert_eq!( + assert!(matches!( res.unwrap_err(), StdError::VerificationErr { source: VerificationError::InvalidPubkeyFormat, + .. } - ) + )) } #[test] @@ -670,12 +672,13 @@ mod tests { }; let res = query(deps.as_ref(), mock_env(), verify_msg); assert!(res.is_err()); - assert_eq!( + assert!(matches!( res.unwrap_err(), StdError::VerificationErr { - source: VerificationError::InvalidPubkeyFormat + source: VerificationError::InvalidPubkeyFormat, + .. } - ) + )) } #[test] diff --git a/contracts/cyberpunk/Cargo.toml b/contracts/cyberpunk/Cargo.toml index c2db096f28..3215512c9f 100644 --- a/contracts/cyberpunk/Cargo.toml +++ b/contracts/cyberpunk/Cargo.toml @@ -26,7 +26,7 @@ default = [] # Use cranelift backend instead of singlepass. This is required for development on 32 bit or ARM machines. cranelift = ["cosmwasm-vm/cranelift"] # For quicker tests, cargo test --lib. for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] +backtraces = ["cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } diff --git a/contracts/empty/Cargo.toml b/contracts/empty/Cargo.toml index 6b9be1e37d..d61c6d9154 100644 --- a/contracts/empty/Cargo.toml +++ b/contracts/empty/Cargo.toml @@ -29,7 +29,7 @@ default = [] cranelift = ["cosmwasm-vm/cranelift"] # for quicker tests, cargo test --lib # for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] +backtraces = ["cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } diff --git a/contracts/floaty/Cargo.toml b/contracts/floaty/Cargo.toml index e78bf00175..5cb31e351d 100644 --- a/contracts/floaty/Cargo.toml +++ b/contracts/floaty/Cargo.toml @@ -28,7 +28,7 @@ default = [] # Use cranelift backend instead of singlepass. This is required for development on 32 bit or ARM machines. cranelift = ["cosmwasm-vm/cranelift"] # For quicker tests, cargo test --lib. for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] +backtraces = ["cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } diff --git a/contracts/hackatom/Cargo.toml b/contracts/hackatom/Cargo.toml index 240bdb1476..f2b4ab6b47 100644 --- a/contracts/hackatom/Cargo.toml +++ b/contracts/hackatom/Cargo.toml @@ -28,7 +28,7 @@ default = [] # Use cranelift backend instead of singlepass. This is required for development on 32 bit or ARM machines. cranelift = ["cosmwasm-vm/cranelift"] # For quicker tests, cargo test --lib. for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] +backtraces = ["cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } diff --git a/contracts/ibc-reflect-send/Cargo.toml b/contracts/ibc-reflect-send/Cargo.toml index dcbde4a4fe..f8c4c3cb2e 100644 --- a/contracts/ibc-reflect-send/Cargo.toml +++ b/contracts/ibc-reflect-send/Cargo.toml @@ -29,7 +29,7 @@ default = [] cranelift = ["cosmwasm-vm/cranelift"] # for quicker tests, cargo test --lib # for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] +backtraces = ["cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } diff --git a/contracts/ibc-reflect/Cargo.toml b/contracts/ibc-reflect/Cargo.toml index cd16b206e3..5a9aa73b9a 100644 --- a/contracts/ibc-reflect/Cargo.toml +++ b/contracts/ibc-reflect/Cargo.toml @@ -29,7 +29,7 @@ default = [] cranelift = ["cosmwasm-vm/cranelift"] # for quicker tests, cargo test --lib # for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] +backtraces = ["cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } diff --git a/contracts/queue/Cargo.toml b/contracts/queue/Cargo.toml index b37c1f79e6..19feeb95db 100644 --- a/contracts/queue/Cargo.toml +++ b/contracts/queue/Cargo.toml @@ -28,7 +28,7 @@ default = [] # Use cranelift backend instead of singlepass. This is required for development on 32 bit or ARM machines. cranelift = ["cosmwasm-vm/cranelift"] # For quicker tests, cargo test --lib. for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] +backtraces = ["cosmwasm-vm/backtraces"] # this is to demonstrate conditional entry-points for cosmwasm-plus style library = [] @@ -40,4 +40,4 @@ schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } [dev-dependencies] -cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator"] } +cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator"] } diff --git a/contracts/reflect/Cargo.toml b/contracts/reflect/Cargo.toml index 6e471dfddb..75d3e621b3 100644 --- a/contracts/reflect/Cargo.toml +++ b/contracts/reflect/Cargo.toml @@ -30,7 +30,7 @@ default = [] cranelift = ["cosmwasm-vm/cranelift"] # for quicker tests, cargo test --lib # for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] +backtraces = ["cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } diff --git a/contracts/staking/Cargo.toml b/contracts/staking/Cargo.toml index ff7e7f796d..74ccf89d7e 100644 --- a/contracts/staking/Cargo.toml +++ b/contracts/staking/Cargo.toml @@ -29,7 +29,7 @@ default = [] cranelift = ["cosmwasm-vm/cranelift"] # for quicker tests, cargo test --lib # for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] +backtraces = ["cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } diff --git a/contracts/virus/Cargo.toml b/contracts/virus/Cargo.toml index 24df513fab..f61c0a13e3 100644 --- a/contracts/virus/Cargo.toml +++ b/contracts/virus/Cargo.toml @@ -29,7 +29,7 @@ default = [] cranelift = ["cosmwasm-vm/cranelift"] # for quicker tests, cargo test --lib # for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] +backtraces = ["cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } From 7b97715a86412082eb75d3645c489bf44d187cee Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 28 Nov 2023 11:52:06 +0000 Subject: [PATCH 1019/2372] Always add backtrace to cosmwasm-vm --- packages/vm/Cargo.toml | 4 - packages/vm/src/cache.rs | 2 +- packages/vm/src/calls.rs | 6 +- packages/vm/src/errors/backtrace.rs | 44 +++++++ packages/vm/src/errors/mod.rs | 2 + packages/vm/src/errors/vm_error.rs | 170 +++++++--------------------- 6 files changed, 94 insertions(+), 134 deletions(-) create mode 100644 packages/vm/src/errors/backtrace.rs diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index cd792ba8fe..e89fd11f88 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -9,10 +9,6 @@ license = "Apache-2.0" [features] default = ["staking", "iterator"] -# backtraces provides much better context at runtime errors (in non-wasm code) -# at the cost of a bit of code size and performance. -# This feature requires Rust nightly because it depends on the unstable backtrace feature. -backtraces = [] # iterator allows us to iterate over all DB items in a given range # this must be enabled to support cosmwasm contracts compiled with the 'iterator' feature # optional as some merkle stores (like tries) don't support this diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 5ba9291a20..32a13b5221 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -1287,7 +1287,7 @@ mod tests { // removing again fails match remove_wasm_from_disk(path, &checksum).unwrap_err() { - VmError::CacheErr { msg } => assert_eq!(msg, "Wasm file does not exist"), + VmError::CacheErr { msg, .. } => assert_eq!(msg, "Wasm file does not exist"), err => panic!("Unexpected error: {err:?}"), } } diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 97b059e109..29fbf47422 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -669,7 +669,7 @@ mod tests { let msg = br#"{"cpu_loop":{}}"#; let err = call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap_err(); - assert!(matches!(err, VmError::GasDepletion {})); + assert!(matches!(err, VmError::GasDepletion { .. })); } #[test] @@ -687,7 +687,7 @@ mod tests { let err = call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap_err(); match err { - VmError::RuntimeErr { msg } => { + VmError::RuntimeErr { msg, .. } => { assert!(msg.contains( "RuntimeError: Aborted: panicked at 'This page intentionally faulted'" )) @@ -711,7 +711,7 @@ mod tests { let err = call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap_err(); match err { - VmError::RuntimeErr { msg } => { + VmError::RuntimeErr { msg, .. } => { assert!(msg.contains("RuntimeError: unreachable")) } err => panic!("Unexpected error: {err:?}"), diff --git a/packages/vm/src/errors/backtrace.rs b/packages/vm/src/errors/backtrace.rs new file mode 100644 index 0000000000..11f2d6748e --- /dev/null +++ b/packages/vm/src/errors/backtrace.rs @@ -0,0 +1,44 @@ +use core::fmt::{Debug, Display, Formatter, Result}; +use std::backtrace::Backtrace; + +/// This wraps an actual backtrace to achieve two things: +/// - being able to fill this with a stub implementation in `no_std` environments +/// - being able to use this in conjunction with [`thiserror::Error`] +pub struct BT(Backtrace); + +impl BT { + #[track_caller] + pub fn capture() -> Self { + BT(Backtrace::capture()) + } +} + +impl Debug for BT { + fn fmt(&self, f: &mut Formatter<'_>) -> Result { + Debug::fmt(&self.0, f) + } +} + +impl Display for BT { + fn fmt(&self, f: &mut Formatter<'_>) -> Result { + Display::fmt(&self.0, f) + } +} + +/// This macro implements `From` for a given error type to a given error type where +/// the target error has a `backtrace` field. +/// This is meant as a replacement for `thiserror`'s `#[from]` attribute, which does not +/// work with our custom backtrace wrapper. +macro_rules! impl_from_err { + ($from:ty, $to:ty, $map:path) => { + impl From<$from> for $to { + fn from(err: $from) -> Self { + $map { + source: err, + backtrace: $crate::errors::backtrace::BT::capture(), + } + } + } + }; +} +pub(crate) use impl_from_err; diff --git a/packages/vm/src/errors/mod.rs b/packages/vm/src/errors/mod.rs index b1da714a38..ba536389a4 100644 --- a/packages/vm/src/errors/mod.rs +++ b/packages/vm/src/errors/mod.rs @@ -1,7 +1,9 @@ +mod backtrace; mod communication_error; mod region_validation_error; mod vm_error; +pub(crate) use backtrace::{impl_from_err, BT}; pub use communication_error::CommunicationError; pub use region_validation_error::RegionValidationError; pub use vm_error::VmError; diff --git a/packages/vm/src/errors/vm_error.rs b/packages/vm/src/errors/vm_error.rs index b0ed25f9a5..8987aaa199 100644 --- a/packages/vm/src/errors/vm_error.rs +++ b/packages/vm/src/errors/vm_error.rs @@ -1,5 +1,4 @@ -#[cfg(feature = "backtraces")] -use std::backtrace::Backtrace; +use super::{impl_from_err, BT}; use std::fmt::{Debug, Display}; use thiserror::Error; @@ -12,103 +11,59 @@ use crate::backend::BackendError; #[non_exhaustive] pub enum VmError { #[error("Aborted: {}", msg)] - Aborted { - msg: String, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + Aborted { msg: String, backtrace: BT }, #[error("Error calling into the VM's backend: {}", source)] - BackendErr { - source: BackendError, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + BackendErr { source: BackendError, backtrace: BT }, #[error("Cache error: {msg}")] - CacheErr { - msg: String, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + CacheErr { msg: String, backtrace: BT }, #[error("Error in guest/host communication: {source}")] CommunicationErr { - #[from] source: CommunicationError, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, + backtrace: BT, }, #[error("Error compiling Wasm: {msg}")] - CompileErr { - msg: String, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + CompileErr { msg: String, backtrace: BT }, #[error("Couldn't convert from {} to {}. Input: {}", from_type, to_type, input)] ConversionErr { from_type: String, to_type: String, input: String, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, + backtrace: BT, }, #[error("Crypto error: {}", source)] - CryptoErr { - source: CryptoError, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + CryptoErr { source: CryptoError, backtrace: BT }, #[error("Ran out of gas during contract execution")] - GasDepletion { - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + GasDepletion { backtrace: BT }, /// Whenever there is no specific error type available #[error("Generic error: {msg}")] - GenericErr { - msg: String, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + GenericErr { msg: String, backtrace: BT }, #[error("Error instantiating a Wasm module: {msg}")] - InstantiationErr { - msg: String, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + InstantiationErr { msg: String, backtrace: BT }, #[error("Hash doesn't match stored data")] - IntegrityErr { - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + IntegrityErr { backtrace: BT }, #[error("Error parsing into type {target_type}: {msg}")] ParseErr { /// the target type that was attempted target_type: String, msg: String, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, + backtrace: BT, }, #[error("Data too long for deserialization. Got: {length} bytes; limit: {max_length} bytes")] DeserializationLimitExceeded { /// the target type that was attempted length: usize, max_length: usize, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, + backtrace: BT, }, #[error("Error serializing type {source_type}: {msg}")] SerializeErr { /// the source type that was attempted source_type: String, msg: String, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, + backtrace: BT, }, #[error("Error resolving Wasm function: {}", msg)] - ResolveErr { - msg: String, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + ResolveErr { msg: String, backtrace: BT }, #[error( "Unexpected number of result values when calling '{}'. Expected: {}, actual: {}.", function_name, @@ -119,69 +74,46 @@ pub enum VmError { function_name: String, expected: usize, actual: usize, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, + backtrace: BT, }, #[error("Error executing Wasm: {}", msg)] - RuntimeErr { - msg: String, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + RuntimeErr { msg: String, backtrace: BT }, #[error("Error during static Wasm validation: {}", msg)] - StaticValidationErr { - msg: String, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + StaticValidationErr { msg: String, backtrace: BT }, #[error("Uninitialized Context Data: {}", kind)] - UninitializedContextData { - kind: String, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + UninitializedContextData { kind: String, backtrace: BT }, #[error("Must not call a writing storage function in this context.")] - WriteAccessDenied { - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + WriteAccessDenied { backtrace: BT }, #[error("Maximum call depth exceeded.")] - MaxCallDepthExceeded { - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + MaxCallDepthExceeded { backtrace: BT }, } impl VmError { pub(crate) fn aborted(msg: impl Into) -> Self { VmError::Aborted { msg: msg.into(), - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub(crate) fn backend_err(original: BackendError) -> Self { VmError::BackendErr { source: original, - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub(crate) fn cache_err(msg: impl Into) -> Self { VmError::CacheErr { msg: msg.into(), - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub(crate) fn compile_err(msg: impl Into) -> Self { VmError::CompileErr { msg: msg.into(), - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } @@ -194,46 +126,40 @@ impl VmError { from_type: from_type.into(), to_type: to_type.into(), input: input.into(), - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub(crate) fn crypto_err(original: CryptoError) -> Self { VmError::CryptoErr { source: original, - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub(crate) fn gas_depletion() -> Self { VmError::GasDepletion { - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub(crate) fn generic_err(msg: impl Into) -> Self { VmError::GenericErr { msg: msg.into(), - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub(crate) fn instantiation_err(msg: impl Into) -> Self { VmError::InstantiationErr { msg: msg.into(), - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub(crate) fn integrity_err() -> Self { VmError::IntegrityErr { - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } @@ -241,8 +167,7 @@ impl VmError { VmError::ParseErr { target_type: target.into(), msg: msg.to_string(), - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } @@ -250,8 +175,7 @@ impl VmError { VmError::DeserializationLimitExceeded { length, max_length, - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } @@ -259,16 +183,14 @@ impl VmError { VmError::SerializeErr { source_type: source.into(), msg: msg.to_string(), - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub(crate) fn resolve_err(msg: impl Into) -> Self { VmError::ResolveErr { msg: msg.into(), - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } @@ -281,8 +203,7 @@ impl VmError { function_name: function_name.into(), expected, actual, - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } @@ -292,42 +213,39 @@ impl VmError { fn runtime_err(msg: impl Into) -> Self { VmError::RuntimeErr { msg: msg.into(), - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub(crate) fn static_validation_err(msg: impl Into) -> Self { VmError::StaticValidationErr { msg: msg.into(), - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub(crate) fn uninitialized_context_data(kind: impl Into) -> Self { VmError::UninitializedContextData { kind: kind.into(), - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub(crate) fn write_access_denied() -> Self { VmError::WriteAccessDenied { - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub(crate) fn max_call_depth_exceeded() -> Self { VmError::MaxCallDepthExceeded { - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } } +impl_from_err!(CommunicationError, VmError, VmError::CommunicationErr); + impl From for VmError { fn from(original: BackendError) -> Self { match original { From b7f003f25ebefa6f0b30479378a0020381182a6b Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 28 Nov 2023 11:56:59 +0000 Subject: [PATCH 1020/2372] Fix contracts --- contracts/burner/Cargo.toml | 4 +--- contracts/crypto-verify/Cargo.toml | 3 --- contracts/cyberpunk/Cargo.toml | 2 -- contracts/empty/Cargo.toml | 3 --- contracts/floaty/Cargo.toml | 2 -- contracts/hackatom/Cargo.toml | 2 -- contracts/ibc-reflect-send/Cargo.toml | 3 --- contracts/ibc-reflect/Cargo.toml | 3 --- contracts/queue/Cargo.toml | 2 -- contracts/reflect/Cargo.toml | 3 --- contracts/staking/Cargo.toml | 3 --- contracts/virus/Cargo.toml | 3 --- packages/crypto/Cargo.toml | 4 ---- 13 files changed, 1 insertion(+), 36 deletions(-) diff --git a/contracts/burner/Cargo.toml b/contracts/burner/Cargo.toml index 4c94930e2a..119f212165 100644 --- a/contracts/burner/Cargo.toml +++ b/contracts/burner/Cargo.toml @@ -27,9 +27,7 @@ overflow-checks = true default = [] # Use cranelift backend instead of singlepass. This is required for development on 32 bit or ARM machines. cranelift = ["cosmwasm-vm/cranelift"] -# for quicker tests, cargo test --lib -# for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm-vm/backtraces"] + [dependencies] cosmwasm-schema = { path = "../../packages/schema" } diff --git a/contracts/crypto-verify/Cargo.toml b/contracts/crypto-verify/Cargo.toml index b9db8fa79e..40284724de 100644 --- a/contracts/crypto-verify/Cargo.toml +++ b/contracts/crypto-verify/Cargo.toml @@ -27,9 +27,6 @@ overflow-checks = true default = [] # Use cranelift backend instead of singlepass. This is required for development on 32 bit or ARM machines. cranelift = ["cosmwasm-vm/cranelift"] -# for quicker tests, cargo test --lib -# for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } diff --git a/contracts/cyberpunk/Cargo.toml b/contracts/cyberpunk/Cargo.toml index 3215512c9f..0b3e833c2d 100644 --- a/contracts/cyberpunk/Cargo.toml +++ b/contracts/cyberpunk/Cargo.toml @@ -25,8 +25,6 @@ overflow-checks = true default = [] # Use cranelift backend instead of singlepass. This is required for development on 32 bit or ARM machines. cranelift = ["cosmwasm-vm/cranelift"] -# For quicker tests, cargo test --lib. for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } diff --git a/contracts/empty/Cargo.toml b/contracts/empty/Cargo.toml index d61c6d9154..e3ed9f50f7 100644 --- a/contracts/empty/Cargo.toml +++ b/contracts/empty/Cargo.toml @@ -27,9 +27,6 @@ overflow-checks = true default = [] # Use cranelift backend instead of singlepass. This is required for development on 32 bit or ARM machines. cranelift = ["cosmwasm-vm/cranelift"] -# for quicker tests, cargo test --lib -# for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } diff --git a/contracts/floaty/Cargo.toml b/contracts/floaty/Cargo.toml index 5cb31e351d..ab5a74ea07 100644 --- a/contracts/floaty/Cargo.toml +++ b/contracts/floaty/Cargo.toml @@ -27,8 +27,6 @@ overflow-checks = true default = [] # Use cranelift backend instead of singlepass. This is required for development on 32 bit or ARM machines. cranelift = ["cosmwasm-vm/cranelift"] -# For quicker tests, cargo test --lib. for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } diff --git a/contracts/hackatom/Cargo.toml b/contracts/hackatom/Cargo.toml index f2b4ab6b47..08a68ddd1b 100644 --- a/contracts/hackatom/Cargo.toml +++ b/contracts/hackatom/Cargo.toml @@ -27,8 +27,6 @@ overflow-checks = true default = [] # Use cranelift backend instead of singlepass. This is required for development on 32 bit or ARM machines. cranelift = ["cosmwasm-vm/cranelift"] -# For quicker tests, cargo test --lib. for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } diff --git a/contracts/ibc-reflect-send/Cargo.toml b/contracts/ibc-reflect-send/Cargo.toml index f8c4c3cb2e..722bee4229 100644 --- a/contracts/ibc-reflect-send/Cargo.toml +++ b/contracts/ibc-reflect-send/Cargo.toml @@ -27,9 +27,6 @@ overflow-checks = true default = [] # Use cranelift backend instead of singlepass. This is required for development on 32 bit or ARM machines. cranelift = ["cosmwasm-vm/cranelift"] -# for quicker tests, cargo test --lib -# for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } diff --git a/contracts/ibc-reflect/Cargo.toml b/contracts/ibc-reflect/Cargo.toml index 5a9aa73b9a..d58d3b217f 100644 --- a/contracts/ibc-reflect/Cargo.toml +++ b/contracts/ibc-reflect/Cargo.toml @@ -27,9 +27,6 @@ overflow-checks = true default = [] # Use cranelift backend instead of singlepass. This is required for development on 32 bit or ARM machines. cranelift = ["cosmwasm-vm/cranelift"] -# for quicker tests, cargo test --lib -# for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } diff --git a/contracts/queue/Cargo.toml b/contracts/queue/Cargo.toml index 19feeb95db..ab59e57fd6 100644 --- a/contracts/queue/Cargo.toml +++ b/contracts/queue/Cargo.toml @@ -27,8 +27,6 @@ overflow-checks = true default = [] # Use cranelift backend instead of singlepass. This is required for development on 32 bit or ARM machines. cranelift = ["cosmwasm-vm/cranelift"] -# For quicker tests, cargo test --lib. for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm-vm/backtraces"] # this is to demonstrate conditional entry-points for cosmwasm-plus style library = [] diff --git a/contracts/reflect/Cargo.toml b/contracts/reflect/Cargo.toml index 75d3e621b3..9f68a486bc 100644 --- a/contracts/reflect/Cargo.toml +++ b/contracts/reflect/Cargo.toml @@ -28,9 +28,6 @@ overflow-checks = true default = [] # Use cranelift backend instead of singlepass. This is required for development on 32 bit or ARM machines. cranelift = ["cosmwasm-vm/cranelift"] -# for quicker tests, cargo test --lib -# for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } diff --git a/contracts/staking/Cargo.toml b/contracts/staking/Cargo.toml index 74ccf89d7e..7e5ca0a853 100644 --- a/contracts/staking/Cargo.toml +++ b/contracts/staking/Cargo.toml @@ -27,9 +27,6 @@ overflow-checks = true default = [] # Use cranelift backend instead of singlepass. This is required for development on 32 bit or ARM machines. cranelift = ["cosmwasm-vm/cranelift"] -# for quicker tests, cargo test --lib -# for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } diff --git a/contracts/virus/Cargo.toml b/contracts/virus/Cargo.toml index f61c0a13e3..5ab4d5025b 100644 --- a/contracts/virus/Cargo.toml +++ b/contracts/virus/Cargo.toml @@ -27,9 +27,6 @@ overflow-checks = true default = [] # Use cranelift backend instead of singlepass. This is required for development on 32 bit or ARM machines. cranelift = ["cosmwasm-vm/cranelift"] -# for quicker tests, cargo test --lib -# for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm-vm/backtraces"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index e2607a31fe..383ddbec1f 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -9,10 +9,6 @@ license = "Apache-2.0" [features] default = [] -# backtraces provides much better context at runtime errors (in non-wasm code) -# at the cost of a bit of code size and performance. -# This feature requires Rust nightly because it depends on the unstable backtrace feature. -backtraces = [] [lib] # See https://bheisler.github.io/criterion.rs/book/faq.html#cargo-bench-gives-unrecognized-option-errors-for-valid-command-line-options From fda293dc344cee3e41c396d3ee42bb64045e5561 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 28 Nov 2023 12:03:36 +0000 Subject: [PATCH 1021/2372] Always add backtrace to cosmwasm-crypto --- packages/crypto/src/backtrace.rs | 26 ++++++++++++++++ packages/crypto/src/errors.rs | 53 ++++++++------------------------ packages/crypto/src/lib.rs | 5 ++- 3 files changed, 41 insertions(+), 43 deletions(-) create mode 100644 packages/crypto/src/backtrace.rs diff --git a/packages/crypto/src/backtrace.rs b/packages/crypto/src/backtrace.rs new file mode 100644 index 0000000000..549279132b --- /dev/null +++ b/packages/crypto/src/backtrace.rs @@ -0,0 +1,26 @@ +use core::fmt::{Debug, Display, Formatter, Result}; +use std::backtrace::Backtrace; + +/// This wraps an actual backtrace to achieve two things: +/// - being able to fill this with a stub implementation in `no_std` environments +/// - being able to use this in conjunction with [`thiserror::Error`] +pub struct BT(Backtrace); + +impl BT { + #[track_caller] + pub fn capture() -> Self { + BT(Backtrace::capture()) + } +} + +impl Debug for BT { + fn fmt(&self, f: &mut Formatter<'_>) -> Result { + Debug::fmt(&self.0, f) + } +} + +impl Display for BT { + fn fmt(&self, f: &mut Formatter<'_>) -> Result { + Display::fmt(&self.0, f) + } +} diff --git a/packages/crypto/src/errors.rs b/packages/crypto/src/errors.rs index b48f154ed0..db4ba3fe11 100644 --- a/packages/crypto/src/errors.rs +++ b/packages/crypto/src/errors.rs @@ -1,5 +1,4 @@ -#[cfg(feature = "backtraces")] -use std::backtrace::Backtrace; +use crate::BT; use std::fmt::Debug; use thiserror::Error; @@ -8,81 +7,55 @@ pub type CryptoResult = core::result::Result; #[derive(Error, Debug)] pub enum CryptoError { #[error("Batch verify error: {msg}")] - BatchErr { - msg: String, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + BatchErr { msg: String, backtrace: BT }, #[error("Crypto error: {msg}")] - GenericErr { - msg: String, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + GenericErr { msg: String, backtrace: BT }, #[error("Invalid hash format")] - InvalidHashFormat { - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + InvalidHashFormat { backtrace: BT }, #[error("Invalid public key format")] - InvalidPubkeyFormat { - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + InvalidPubkeyFormat { backtrace: BT }, #[error("Invalid signature format")] - InvalidSignatureFormat { - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + InvalidSignatureFormat { backtrace: BT }, #[error("Invalid recovery parameter. Supported values: 0 and 1.")] - InvalidRecoveryParam { - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, + InvalidRecoveryParam { backtrace: BT }, } impl CryptoError { pub fn batch_err(msg: impl Into) -> Self { CryptoError::BatchErr { msg: msg.into(), - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub fn generic_err(msg: impl Into) -> Self { CryptoError::GenericErr { msg: msg.into(), - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub fn invalid_hash_format() -> Self { CryptoError::InvalidHashFormat { - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub fn invalid_pubkey_format() -> Self { CryptoError::InvalidPubkeyFormat { - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub fn invalid_signature_format() -> Self { CryptoError::InvalidSignatureFormat { - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } pub fn invalid_recovery_param() -> Self { CryptoError::InvalidRecoveryParam { - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), + backtrace: BT::capture(), } } diff --git a/packages/crypto/src/lib.rs b/packages/crypto/src/lib.rs index 01ee97bbf7..b586502e7b 100644 --- a/packages/crypto/src/lib.rs +++ b/packages/crypto/src/lib.rs @@ -2,9 +2,7 @@ //! Please don't use any of these types directly, as //! they might change frequently, or be removed in the future. //! This crate does not adhere to semantic versioning. -#![cfg_attr(feature = "backtraces", feature(error_generic_member_access))] -#![cfg_attr(feature = "backtraces", feature(provide_any))] - +mod backtrace; mod ed25519; mod errors; mod identity_digest; @@ -20,3 +18,4 @@ pub use crate::errors::{CryptoError, CryptoResult}; pub use crate::secp256k1::{secp256k1_recover_pubkey, secp256k1_verify}; #[doc(hidden)] pub use crate::secp256k1::{ECDSA_PUBKEY_MAX_LEN, ECDSA_SIGNATURE_LEN, MESSAGE_HASH_MAX_LEN}; +pub(crate) use backtrace::BT; From e4f1d21acaab63498014f3a3cd7765730d0f4fb8 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 28 Nov 2023 14:15:01 +0000 Subject: [PATCH 1022/2372] Box error for size reduction --- packages/vm/src/errors/backtrace.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vm/src/errors/backtrace.rs b/packages/vm/src/errors/backtrace.rs index 11f2d6748e..ca19fbedbb 100644 --- a/packages/vm/src/errors/backtrace.rs +++ b/packages/vm/src/errors/backtrace.rs @@ -4,12 +4,12 @@ use std::backtrace::Backtrace; /// This wraps an actual backtrace to achieve two things: /// - being able to fill this with a stub implementation in `no_std` environments /// - being able to use this in conjunction with [`thiserror::Error`] -pub struct BT(Backtrace); +pub struct BT(Box); impl BT { #[track_caller] pub fn capture() -> Self { - BT(Backtrace::capture()) + BT(Box::new(Backtrace::capture())) } } From 5ee44a50a88b25de2eed7999de359db0f6060fc7 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 28 Nov 2023 15:26:15 +0000 Subject: [PATCH 1023/2372] Remove references to backtraces features --- docs/USING_COSMWASM_STD.md | 3 +-- packages/std/src/lib.rs | 3 --- packages/vm/src/lib.rs | 3 --- 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/docs/USING_COSMWASM_STD.md b/docs/USING_COSMWASM_STD.md index 49cf3511d4..2c61767742 100644 --- a/docs/USING_COSMWASM_STD.md +++ b/docs/USING_COSMWASM_STD.md @@ -32,7 +32,7 @@ in the dependency tree. Otherwise conflicting C exports are created. ## cosmwasm-std features -The libarary comes with the following features: +The library comes with the following features: | Feature | Enabled by default | Description | | ------------ | ------------------ | ------------------------------------------------------------------------- | @@ -40,7 +40,6 @@ The libarary comes with the following features: | abort | x | A panic handler that aborts the contract execution with a helpful message | | stargate | | Cosmos SDK 0.40+ features and IBC | | staking | | Access to the staking module | -| backtraces | | Add backtraces to errors (for unit testing) | | cosmwasm_1_1 | | Features that require CosmWasm 1.1+ on the chain | | cosmwasm_1_2 | | Features that require CosmWasm 1.2+ on the chain | | cosmwasm_1_3 | | Features that require CosmWasm 1.3+ on the chain | diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index b6536c28ec..43111e20e8 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -1,6 +1,3 @@ -#![cfg_attr(feature = "backtraces", feature(error_generic_member_access))] -#![cfg_attr(feature = "backtraces", feature(provide_any))] - extern crate alloc; // Exposed on all platforms diff --git a/packages/vm/src/lib.rs b/packages/vm/src/lib.rs index 5a858ed560..8a3ae48b1e 100644 --- a/packages/vm/src/lib.rs +++ b/packages/vm/src/lib.rs @@ -1,6 +1,3 @@ -#![cfg_attr(feature = "backtraces", feature(error_generic_member_access))] -#![cfg_attr(feature = "backtraces", feature(provide_any))] - mod backend; mod cache; mod calls; From 9ca7955f1531ddefa77361a2f9a5ab13cbbecd9f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 30 Nov 2023 11:17:53 +0000 Subject: [PATCH 1024/2372] Always use disabled function for backtrace on wasm --- packages/std/src/errors/backtrace.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/std/src/errors/backtrace.rs b/packages/std/src/errors/backtrace.rs index 552c608032..d817e8672d 100644 --- a/packages/std/src/errors/backtrace.rs +++ b/packages/std/src/errors/backtrace.rs @@ -10,7 +10,10 @@ pub struct BT(Box); impl BT { #[track_caller] pub fn capture() -> Self { - BT(Box::new(std::backtrace::Backtrace::capture())) + #[cfg(target_arch = "wasm32")] + return BT(Box::new(std::backtrace::Backtrace::disabled())); + #[cfg(not(target_arch = "wasm32"))] + return BT(Box::new(std::backtrace::Backtrace::capture())); } } From e4f3f2b7b8e7ee96bcb8d304b1a9f07638561271 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 30 Nov 2023 11:18:52 +0000 Subject: [PATCH 1025/2372] Remove incorrect Error derive --- packages/std/src/errors/backtrace.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/std/src/errors/backtrace.rs b/packages/std/src/errors/backtrace.rs index d817e8672d..a626ae6b4b 100644 --- a/packages/std/src/errors/backtrace.rs +++ b/packages/std/src/errors/backtrace.rs @@ -1,10 +1,8 @@ use core::fmt::{Debug, Display, Formatter, Result}; -use thiserror::Error; /// This wraps an actual backtrace to achieve two things: /// - being able to fill this with a stub implementation in `no_std` environments /// - being able to use this in conjunction with [`thiserror::Error`] -#[derive(Error)] pub struct BT(Box); impl BT { From 417123a6cf94cd0d297639b5449d246ac3e02fa7 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 30 Nov 2023 11:21:41 +0000 Subject: [PATCH 1026/2372] Fix docs --- packages/vm/src/errors/backtrace.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/vm/src/errors/backtrace.rs b/packages/vm/src/errors/backtrace.rs index ca19fbedbb..5697225c9a 100644 --- a/packages/vm/src/errors/backtrace.rs +++ b/packages/vm/src/errors/backtrace.rs @@ -1,9 +1,7 @@ use core::fmt::{Debug, Display, Formatter, Result}; use std::backtrace::Backtrace; -/// This wraps an actual backtrace to achieve two things: -/// - being able to fill this with a stub implementation in `no_std` environments -/// - being able to use this in conjunction with [`thiserror::Error`] +/// This wraps an actual backtrace to allow us to use this in conjunction with [`thiserror::Error`] pub struct BT(Box); impl BT { From eae54c0b8ad2a2385e8f06f429a6d5c43520509e Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 30 Nov 2023 11:27:26 +0000 Subject: [PATCH 1027/2372] Add example of no_std BT --- packages/std/src/errors/backtrace.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/packages/std/src/errors/backtrace.rs b/packages/std/src/errors/backtrace.rs index a626ae6b4b..8446243c17 100644 --- a/packages/std/src/errors/backtrace.rs +++ b/packages/std/src/errors/backtrace.rs @@ -8,6 +8,7 @@ pub struct BT(Box); impl BT { #[track_caller] pub fn capture() -> Self { + // in case of no_std, we can fill with a stub here #[cfg(target_arch = "wasm32")] return BT(Box::new(std::backtrace::Backtrace::disabled())); #[cfg(not(target_arch = "wasm32"))] @@ -47,3 +48,22 @@ macro_rules! impl_from_err { }; } pub(crate) use impl_from_err; + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn bt_works_without_std() { + #[derive(Debug)] + struct BacktraceStub; + + impl Display for BacktraceStub { + fn fmt(&self, _f: &mut Formatter<'_>) -> Result { + Ok(()) + } + } + + _ = BT(Box::new(BacktraceStub)); + } +} From a127f868b4c3352887ed4893502336625c02874e Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 30 Nov 2023 11:36:26 +0000 Subject: [PATCH 1028/2372] Add changelog entry --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed9c9f0594..4cace6726f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,6 +58,12 @@ and this project adheres to `AnalysisReport::required_capabilities` a `BTreeSet`. ([#1949]) - cosmwasm-std: Add `Checksum` type and change type of `CodeInfoResponse::checksum` to that. ([#1944]) +- cosmwasm-std: Removed `backtraces` feature, use the `RUST_BACKTRACE=1` env + variable instead. Error variants that previously only contained a `backtrace` + field with the feature enabled now always contain it. ([#1967]) +- cosmwasm-vm: Removed `backtraces` feature, use the `RUST_BACKTRACE=1` env + variable instead. All `VmError` variants now have a `backtrace` field. + ([#1967]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 @@ -73,6 +79,7 @@ and this project adheres to [#1941]: https://github.com/CosmWasm/cosmwasm/pull/1941 [#1944]: https://github.com/CosmWasm/cosmwasm/pull/1944 [#1949]: https://github.com/CosmWasm/cosmwasm/pull/1949 +[#1967]: https://github.com/CosmWasm/cosmwasm/pull/1967 ### Removed From ae633cb17b14a9d34837504756ac254bf285560d Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 30 Nov 2023 11:40:03 +0000 Subject: [PATCH 1029/2372] Add migrating entry --- MIGRATING.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/MIGRATING.md b/MIGRATING.md index d43e8ec50f..2f4ef0dbb1 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -125,6 +125,14 @@ major releases of `cosmwasm`. Note that you can also view the +CosmosMsg::Any(AnyMsg { type_url, value }) ``` +- Replace all direct construction of `StdError` with use of the corresponding + constructor: + + ```diff + -StdError::GenericErr { msg } + +StdError::generic_err(msg) + ``` + ## 1.4.x -> 1.5.0 - Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): From ea7d630b79e801678b479c7a2a9595fa1a5fec61 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 30 Nov 2023 12:16:57 +0000 Subject: [PATCH 1030/2372] Add backtraces feature removal to migrating doc --- MIGRATING.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MIGRATING.md b/MIGRATING.md index 2f4ef0dbb1..a240967ba2 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -21,7 +21,9 @@ major releases of `cosmwasm`. Note that you can also view the If you were using cosmwasm-std's `ibc3` feature, you can remove it, as it is the default now. Depending on your usage, you might have to enable the - `stargate` feature instead, since it was previously implied by `ibc3`. + `stargate` feature instead, since it was previously implied by `ibc3`. Also + remove any uses of the `backtraces` feature. You can use a `RUST_BACKTRACE=1` + env variable for this now. - `ContractInfoResponse::new` now takes all fields of the response as parameters: From 8066204f1de6040ed918511187f15756d6ef3cdd Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Tue, 10 Oct 2023 12:35:23 +0200 Subject: [PATCH 1031/2372] New implementation of addr_canonicalize and addr_humanize functions. --- packages/std/src/testing/mock.rs | 177 ++++++++++--------------------- packages/std/src/traits.rs | 4 +- 2 files changed, 59 insertions(+), 122 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 0a90e98d18..e7d3c22a48 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -1,5 +1,5 @@ use alloc::collections::BTreeMap; -use bech32::{encode, ToBase32, Variant}; +use bech32::{decode, encode, FromBase32, ToBase32, Variant}; use core::iter::IntoIterator; use core::marker::PhantomData; #[cfg(feature = "cosmwasm_1_3")] @@ -53,8 +53,6 @@ use crate::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; #[cfg(feature = "cosmwasm_1_4")] use crate::{Decimal256, DelegationRewardsResponse, DelegatorValidatorsResponse}; -use super::riffle_shuffle; - pub const MOCK_CONTRACT_ADDR: &str = "cosmos2contract"; /// Creates all external requirements that can be injected for unit tests. @@ -96,19 +94,6 @@ pub fn mock_dependencies_with_balances( // We can later make simplifications here if needed pub type MockStorage = MemoryStorage; -/// Length of canonical addresses created with this API. Contracts should not make any assumptions -/// what this value is. -/// -/// The mock API can only canonicalize and humanize addresses up to this length. So it must be -/// long enough to store common bech32 addresses. -/// -/// The value here must be restorable with `SHUFFLES_ENCODE` + `SHUFFLES_DECODE` in-shuffles. -/// See for a table of those values. -const CANONICAL_LENGTH: usize = 90; // n = 45 - -const SHUFFLES_ENCODE: usize = 10; -const SHUFFLES_DECODE: usize = 2; - /// Default prefix used when creating Bech32 encoded address. const BECH32_PREFIX: &str = "cosmwasm"; @@ -117,9 +102,6 @@ const BECH32_PREFIX: &str = "cosmwasm"; // not really smart, but allows us to see a difference (and consistent length for canonical addresses) #[derive(Copy, Clone)] pub struct MockApi { - /// Length of canonical addresses created with this API. Contracts should not make any assumptions - /// what this value is. - canonical_length: usize, /// Prefix used for creating addresses in Bech32 encoding. bech32_prefix: &'static str, } @@ -127,7 +109,6 @@ pub struct MockApi { impl Default for MockApi { fn default() -> Self { MockApi { - canonical_length: CANONICAL_LENGTH, bech32_prefix: BECH32_PREFIX, } } @@ -142,62 +123,29 @@ impl Api for MockApi { "Invalid input: address not normalized", )); } - Ok(Addr::unchecked(input)) } fn addr_canonicalize(&self, input: &str) -> StdResult { - // Dummy input validation. This is more sophisticated for formats like bech32, where format and checksum are validated. - let min_length = 3; - let max_length = self.canonical_length; - if input.len() < min_length { - return Err(StdError::generic_err( - format!("Invalid input: human address too short for this mock implementation (must be >= {min_length})."), - )); - } - if input.len() > max_length { - return Err(StdError::generic_err( - format!("Invalid input: human address too long for this mock implementation (must be <= {max_length})."), - )); - } - - // mimics formats like hex or bech32 where different casings are valid for one address - let normalized = input.to_lowercase(); - - let mut out = Vec::from(normalized); - - // pad to canonical length with NULL bytes - out.resize(self.canonical_length, 0x00); - // content-dependent rotate followed by shuffle to destroy - // the most obvious structure (https://github.com/CosmWasm/cosmwasm/issues/552) - let rotate_by = digit_sum(&out) % self.canonical_length; - out.rotate_left(rotate_by); - for _ in 0..SHUFFLES_ENCODE { - out = riffle_shuffle(&out); + if let Ok((prefix, decoded, Variant::Bech32)) = decode(input) { + if prefix == self.bech32_prefix { + if let Ok(bytes) = Vec::::from_base32(&decoded) { + return Ok(bytes.into()); + } + } } - Ok(out.into()) + Err(StdError::generic_err("Invalid input")) } fn addr_humanize(&self, canonical: &CanonicalAddr) -> StdResult { - if canonical.len() != self.canonical_length { - return Err(StdError::generic_err( - "Invalid input: canonical address length not correct", - )); - } - - let mut tmp: Vec = canonical.clone().into(); - // Shuffle two more times which restored the original value (24 elements are back to original after 20 rounds) - for _ in 0..SHUFFLES_DECODE { - tmp = riffle_shuffle(&tmp); - } - // Rotate back - let rotate_by = digit_sum(&tmp) % self.canonical_length; - tmp.rotate_right(rotate_by); - // Remove NULL bytes (i.e. the padding) - let trimmed = tmp.into_iter().filter(|&x| x != 0x00).collect(); - // decode UTF-8 bytes into string - let human = String::from_utf8(trimmed)?; - Ok(Addr::unchecked(human)) + let Ok(encoded) = encode( + self.bech32_prefix, + canonical.as_slice().to_base32(), + Variant::Bech32, + ) else { + return Err(StdError::generic_err("Invalid canonical address")); + }; + Ok(Addr::unchecked(encoded)) } fn secp256k1_verify( @@ -1197,11 +1145,13 @@ mod tests { #[test] fn addr_validate_works() { + // default prefix is 'cosmwasm' let api = MockApi::default(); // valid - let addr = api.addr_validate("foobar123").unwrap(); - assert_eq!(addr.as_str(), "foobar123"); + let humanized = "cosmwasm1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqs8s7vcp"; + let addr = api.addr_validate(humanized).unwrap(); + assert_eq!(addr, humanized); // invalid: too short api.addr_validate("").unwrap_err(); @@ -1214,31 +1164,44 @@ mod tests { fn addr_canonicalize_works() { let api = MockApi::default(); - api.addr_canonicalize("foobar123").unwrap(); + api.addr_canonicalize( + "cosmwasm1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqs8s7vcp", + ) + .unwrap(); // is case insensitive - let data1 = api.addr_canonicalize("foo123").unwrap(); - let data2 = api.addr_canonicalize("FOO123").unwrap(); + let data1 = api + .addr_canonicalize( + "cosmwasm1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqs8s7vcp", + ) + .unwrap(); + let data2 = api + .addr_canonicalize( + "COSMWASM1H34LMPYWH4UPNJDG90CJF4J70AEE6Z8QQFSPUGAMJP42E4Q28KQS8S7VCP", + ) + .unwrap(); assert_eq!(data1, data2); } #[test] fn canonicalize_and_humanize_restores_original() { + // create api with 'cosmwasm' prefix let api = MockApi::default(); - // simple - let original = String::from("shorty"); - let canonical = api.addr_canonicalize(&original).unwrap(); - let recovered = api.addr_humanize(&canonical).unwrap(); - assert_eq!(recovered.as_str(), original); - // normalizes input - let original = String::from("CosmWasmChef"); + let original = + String::from("COSMWASM1H34LMPYWH4UPNJDG90CJF4J70AEE6Z8QQFSPUGAMJP42E4Q28KQS8S7VCP"); let canonical = api.addr_canonicalize(&original).unwrap(); let recovered = api.addr_humanize(&canonical).unwrap(); - assert_eq!(recovered.as_str(), "cosmwasmchef"); + assert_eq!( + recovered, + "cosmwasm1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqs8s7vcp" + ); - // Long input (Juno contract address) + // create api with 'juno' prefix + let api = MockApi::default().with_prefix("juno"); + + // long input (Juno contract address) let original = String::from("juno1v82su97skv6ucfqvuvswe0t5fph7pfsrtraxf0x33d8ylj5qnrysdvkc95"); let canonical = api.addr_canonicalize(&original).unwrap(); @@ -1247,32 +1210,29 @@ mod tests { } #[test] - fn addr_canonicalize_min_input_length() { + fn addr_canonicalize_short_input() { let api = MockApi::default(); - let human = String::from("1"); - let err = api.addr_canonicalize(&human).unwrap_err(); - assert!(err - .to_string() - .contains("human address too short for this mock implementation (must be >= 3)")); + let human = String::from("cosmwasm1pj90vm"); + assert_eq!(api.addr_canonicalize(&human).unwrap().to_string(), ""); } #[test] - fn addr_canonicalize_max_input_length() { + fn addr_canonicalize_long_input() { let api = MockApi::default(); let human = - String::from("some-extremely-long-address-not-supported-by-this-api-longer-than-supported------------------------"); - let err = api.addr_canonicalize(&human).unwrap_err(); - assert!(err - .to_string() - .contains("human address too long for this mock implementation (must be <= 90)")); + "some-extremely-long-address-some-extremely-long-address-some-extremely-long-address-some-extremely-long-address"; + let err = api.addr_canonicalize(human).unwrap_err(); + assert!(err.to_string().contains("Invalid input")); } #[test] - #[should_panic(expected = "length not correct")] fn addr_humanize_input_length() { let api = MockApi::default(); - let input = CanonicalAddr::from(vec![61; 11]); - api.addr_humanize(&input).unwrap(); + let input = CanonicalAddr::from(vec![]); + assert_eq!( + api.addr_humanize(&input).unwrap(), + Addr::unchecked("cosmwasm1pj90vm") + ); } // Basic "works" test. Exhaustive tests on VM's side (packages/vm/src/imports.rs) @@ -2363,27 +2323,4 @@ mod tests { fn making_an_address_with_empty_prefix_should_panic() { MockApi::default().with_prefix("").addr_make("creator"); } - - #[test] - #[cfg(feature = "cosmwasm_1_3")] - fn distribution_querier_new_works() { - let addresses = [ - ("addr0000".to_string(), "addr0001".to_string()), - ("addr0002".to_string(), "addr0001".to_string()), - ]; - let btree_map = BTreeMap::from(addresses.clone()); - - // should still work with HashMap - let hashmap = HashMap::from(addresses.clone()); - let querier = DistributionQuerier::new(hashmap); - assert_eq!(querier.withdraw_addresses, btree_map); - - // should work with BTreeMap - let querier = DistributionQuerier::new(btree_map.clone()); - assert_eq!(querier.withdraw_addresses, btree_map); - - // should work with array - let querier = DistributionQuerier::new(addresses); - assert_eq!(querier.withdraw_addresses, btree_map); - } } diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 2ddc669add..0d966bd2d2 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -129,8 +129,8 @@ pub trait Api { /// ``` /// # use cosmwasm_std::{Api, Addr}; /// # use cosmwasm_std::testing::MockApi; - /// # let api = MockApi::default(); - /// let input = "what-users-provide"; + /// let api = MockApi::default().with_prefix("juno"); + /// let input = "juno1v82su97skv6ucfqvuvswe0t5fph7pfsrtraxf0x33d8ylj5qnrysdvkc95"; /// let validated: Addr = api.addr_validate(input).unwrap(); /// assert_eq!(validated.as_str(), input); /// ``` From b17169a5cd5c36ad927041aaac69f7d4823cf2b9 Mon Sep 17 00:00:00 2001 From: Dariusz Depta Date: Mon, 27 Nov 2023 12:25:03 +0100 Subject: [PATCH 1032/2372] Updates. --- contracts/hackatom/src/contract.rs | 61 ++++++++++++++++-------------- packages/std/src/testing/mock.rs | 29 +++++++------- 2 files changed, 47 insertions(+), 43 deletions(-) diff --git a/contracts/hackatom/src/contract.rs b/contracts/hackatom/src/contract.rs index d99eb0753a..ef7fcd758b 100644 --- a/contracts/hackatom/src/contract.rs +++ b/contracts/hackatom/src/contract.rs @@ -316,9 +316,9 @@ mod tests { fn proper_initialization() { let mut deps = mock_dependencies(); - let verifier = String::from("verifies"); - let beneficiary = String::from("benefits"); - let creator = String::from("creator"); + let verifier: String = deps.api.addr_make("verifies").into(); + let beneficiary: String = deps.api.addr_make("benefits").into(); + let creator: String = deps.api.addr_make("creator").into(); let expected_state = State { verifier: deps.api.addr_validate(&verifier).unwrap(), beneficiary: deps.api.addr_validate(&beneficiary).unwrap(), @@ -344,9 +344,9 @@ mod tests { fn instantiate_and_query() { let mut deps = mock_dependencies(); - let verifier = String::from("verifies"); - let beneficiary = String::from("benefits"); - let creator = String::from("creator"); + let verifier: String = deps.api.addr_make("verifies").into(); + let beneficiary: String = deps.api.addr_make("benefits").into(); + let creator: String = deps.api.addr_make("creator").into(); let msg = InstantiateMsg { verifier: verifier.clone(), beneficiary, @@ -364,11 +364,11 @@ mod tests { fn migrate_verifier() { let mut deps = mock_dependencies(); - let verifier = String::from("verifies"); - let beneficiary = String::from("benefits"); - let creator = String::from("creator"); + let verifier: String = deps.api.addr_make("verifies").into(); + let beneficiary: String = deps.api.addr_make("benefits").into(); + let creator: String = deps.api.addr_make("creator").into(); let msg = InstantiateMsg { - verifier, + verifier: verifier.clone(), beneficiary, }; let info = mock_info(&creator, &[]); @@ -377,10 +377,13 @@ mod tests { // check it is 'verifies' let query_response = query(deps.as_ref(), mock_env(), QueryMsg::Verifier {}).unwrap(); - assert_eq!(query_response.as_slice(), b"{\"verifier\":\"verifies\"}"); + assert_eq!( + query_response.as_slice(), + format!(r#"{{"verifier":"{verifier}"}}"#).as_bytes() + ); // change the verifier via migrate - let new_verifier = String::from("someone else"); + let new_verifier: String = deps.api.addr_make("someone else").into(); let msg = MigrateMsg { verifier: new_verifier.clone(), }; @@ -396,9 +399,9 @@ mod tests { fn sudo_can_steal_tokens() { let mut deps = mock_dependencies(); - let verifier = String::from("verifies"); - let beneficiary = String::from("benefits"); - let creator = String::from("creator"); + let verifier: String = deps.api.addr_make("verifies").into(); + let beneficiary: String = deps.api.addr_make("benefits").into(); + let creator: String = deps.api.addr_make("creator").into(); let msg = InstantiateMsg { verifier, beneficiary, @@ -440,9 +443,9 @@ mod tests { let mut deps = mock_dependencies(); // initialize the store - let creator = String::from("creator"); - let verifier = String::from("verifies"); - let beneficiary = String::from("benefits"); + let creator: String = deps.api.addr_make("creator").into(); + let verifier: String = deps.api.addr_make("verifies").into(); + let beneficiary: String = deps.api.addr_make("benefits").into(); let instantiate_msg = InstantiateMsg { verifier: verifier.clone(), @@ -470,13 +473,13 @@ mod tests { assert_eq!( msg, &SubMsg::new(BankMsg::Send { - to_address: beneficiary, + to_address: beneficiary.clone(), amount: coins(1000, "earth"), }), ); assert_eq!( execute_res.attributes, - vec![("action", "release"), ("destination", "benefits")], + vec![("action", "release"), ("destination", &beneficiary)], ); assert_eq!(execute_res.data, Some(vec![0xF0, 0x0B, 0xAA].into())); } @@ -486,9 +489,9 @@ mod tests { let mut deps = mock_dependencies(); // initialize the store - let creator = String::from("creator"); - let verifier = String::from("verifies"); - let beneficiary = String::from("benefits"); + let creator: String = deps.api.addr_make("creator").into(); + let verifier: String = deps.api.addr_make("verifies").into(); + let beneficiary: String = deps.api.addr_make("benefits").into(); let instantiate_msg = InstantiateMsg { verifier: verifier.clone(), @@ -531,9 +534,9 @@ mod tests { let mut deps = mock_dependencies(); // initialize the store - let verifier = String::from("verifies"); - let beneficiary = String::from("benefits"); - let creator = String::from("creator"); + let verifier: String = deps.api.addr_make("verifies").into(); + let beneficiary: String = deps.api.addr_make("benefits").into(); + let creator: String = deps.api.addr_make("creator").into(); let instantiate_msg = InstantiateMsg { verifier, @@ -558,8 +561,8 @@ mod tests { let mut deps = mock_dependencies(); let instantiate_msg = InstantiateMsg { - verifier: String::from("verifies"), - beneficiary: String::from("benefits"), + verifier: deps.api.addr_make("verifies").into(), + beneficiary: deps.api.addr_make("benefits").into(), }; let init_info = mock_info("creator", &coins(1000, "earth")); let init_res = instantiate(deps.as_mut(), mock_env(), init_info, instantiate_msg).unwrap(); @@ -584,7 +587,7 @@ mod tests { let contract = Addr::unchecked("my-contract"); let bin_contract: &[u8] = b"my-contract"; - // return the unhashed value here + // return the un-hashed value here let no_work_query = query_recurse(deps.as_ref(), 0, 0, contract.clone()).unwrap(); assert_eq!(no_work_query.hashed, Binary::from(bin_contract)); diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index e7d3c22a48..5f09146b88 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -1,6 +1,5 @@ use alloc::collections::BTreeMap; use bech32::{decode, encode, FromBase32, ToBase32, Variant}; -use core::iter::IntoIterator; use core::marker::PhantomData; #[cfg(feature = "cosmwasm_1_3")] use core::ops::Bound; @@ -1151,7 +1150,7 @@ mod tests { // valid let humanized = "cosmwasm1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqs8s7vcp"; let addr = api.addr_validate(humanized).unwrap(); - assert_eq!(addr, humanized); + assert_eq!(addr.as_str(), humanized); // invalid: too short api.addr_validate("").unwrap_err(); @@ -1194,7 +1193,7 @@ mod tests { let canonical = api.addr_canonicalize(&original).unwrap(); let recovered = api.addr_humanize(&canonical).unwrap(); assert_eq!( - recovered, + recovered.as_str(), "cosmwasm1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqs8s7vcp" ); @@ -2123,12 +2122,11 @@ mod tests { } querier.update_handler(|request| { - let constract1 = Addr::unchecked("contract1"); + let api = MockApi::default(); + let contract1 = api.addr_make("contract1"); let mut storage1 = HashMap::::default(); storage1.insert(b"the key".into(), b"the value".into()); - let api = MockApi::default(); - match request { WasmQuery::Raw { contract_addr, key } => { let Ok(addr) = api.addr_validate(contract_addr) else { @@ -2136,7 +2134,7 @@ mod tests { addr: contract_addr.clone(), }); }; - if addr == constract1 { + if addr == contract1 { if let Some(value) = storage1.get(key) { SystemResult::Ok(ContractResult::Ok(value.clone())) } else { @@ -2154,7 +2152,7 @@ mod tests { addr: contract_addr.clone(), }); }; - if addr == constract1 { + if addr == contract1 { #[derive(Deserialize)] struct MyMsg {} let _msg: MyMsg = match from_json(msg) { @@ -2177,7 +2175,7 @@ mod tests { addr: contract_addr.clone(), }); }; - if addr == constract1 { + if addr == contract1 { let response = ContractInfoResponse { code_id: 4, creator: Addr::unchecked("lalala"), @@ -2213,17 +2211,20 @@ mod tests { } }); + let contract_addr = MockApi::default().addr_make("contract1"); + // WasmQuery::Raw let result = querier.query(&WasmQuery::Raw { - contract_addr: "contract1".into(), + contract_addr: contract_addr.clone().into(), key: b"the key".into(), }); + match result { SystemResult::Ok(ContractResult::Ok(value)) => assert_eq!(value, b"the value" as &[u8]), res => panic!("Unexpected result: {res:?}"), } let result = querier.query(&WasmQuery::Raw { - contract_addr: "contract1".into(), + contract_addr: contract_addr.clone().into(), key: b"other key".into(), }); match result { @@ -2233,7 +2234,7 @@ mod tests { // WasmQuery::Smart let result = querier.query(&WasmQuery::Smart { - contract_addr: "contract1".into(), + contract_addr: contract_addr.clone().into(), msg: b"{}".into(), }); match result { @@ -2244,7 +2245,7 @@ mod tests { res => panic!("Unexpected result: {res:?}"), } let result = querier.query(&WasmQuery::Smart { - contract_addr: "contract1".into(), + contract_addr: contract_addr.clone().into(), msg: b"a broken request".into(), }); match result { @@ -2256,7 +2257,7 @@ mod tests { // WasmQuery::ContractInfo let result = querier.query(&WasmQuery::ContractInfo { - contract_addr: "contract1".into(), + contract_addr: contract_addr.into(), }); match result { SystemResult::Ok(ContractResult::Ok(value)) => assert_eq!( From f00b39dddbfe558885f1d61bfece1a6063338f49 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 28 Nov 2023 16:37:57 +0000 Subject: [PATCH 1033/2372] Fix hackatom address assumptions --- contracts/hackatom/src/contract.rs | 27 +++++++-------------------- packages/std/src/testing/mock.rs | 16 ++++++++++++---- 2 files changed, 19 insertions(+), 24 deletions(-) diff --git a/contracts/hackatom/src/contract.rs b/contracts/hackatom/src/contract.rs index ef7fcd758b..a6314dcc43 100644 --- a/contracts/hackatom/src/contract.rs +++ b/contracts/hackatom/src/contract.rs @@ -195,22 +195,8 @@ fn do_user_errors_in_api_calls(api: &dyn Api) -> Result { } } - let too_long = - "bn9hhssomeltvhzgvuqkwjkpwxojfuigltwedayzxljucefikuieillowaticksoistqoynmgcnj219aewfwefwwegwg"; - match api.addr_canonicalize(too_long).unwrap_err() { - StdError::GenericErr { .. } => {} - err => { - return Err(StdError::generic_err(format!( - "Unexpected error in do_user_errors_in_api_calls: {err:?}" - )) - .into()) - } - } - - // Humanize - - let empty: CanonicalAddr = vec![].into(); - match api.addr_humanize(&empty).unwrap_err() { + let invalid = "bn9hhssomeltvhzgvuqkwjkpwxoj"; + match api.addr_canonicalize(invalid).unwrap_err() { StdError::GenericErr { .. } => {} err => { return Err(StdError::generic_err(format!( @@ -220,8 +206,8 @@ fn do_user_errors_in_api_calls(api: &dyn Api) -> Result { } } - let too_short: CanonicalAddr = vec![0xAA, 0xBB, 0xCC].into(); - match api.addr_humanize(&too_short).unwrap_err() { + let too_long = "cosmwasm1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqehqqkz"; + match api.addr_canonicalize(too_long).unwrap_err() { StdError::GenericErr { .. } => {} err => { return Err(StdError::generic_err(format!( @@ -231,8 +217,9 @@ fn do_user_errors_in_api_calls(api: &dyn Api) -> Result { } } - let wrong_length: CanonicalAddr = vec![0xA6; 17].into(); - match api.addr_humanize(&wrong_length).unwrap_err() { + // Humanize + let empty: CanonicalAddr = vec![].into(); + match api.addr_humanize(&empty).unwrap_err() { StdError::GenericErr { .. } => {} err => { return Err(StdError::generic_err(format!( diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 5f09146b88..f61ea15b1c 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -129,6 +129,7 @@ impl Api for MockApi { if let Ok((prefix, decoded, Variant::Bech32)) = decode(input) { if prefix == self.bech32_prefix { if let Ok(bytes) = Vec::::from_base32(&decoded) { + validate_length(&bytes)?; return Ok(bytes.into()); } } @@ -137,6 +138,7 @@ impl Api for MockApi { } fn addr_humanize(&self, canonical: &CanonicalAddr) -> StdResult { + validate_length(canonical.as_ref())?; let Ok(encoded) = encode( self.bech32_prefix, canonical.as_slice().to_base32(), @@ -249,6 +251,14 @@ impl MockApi { } } +/// Does basic validation of the number of bytes in a canonical address +fn validate_length(bytes: &[u8]) -> StdResult<()> { + if !(1..=255).contains(&bytes.len()) { + return Err(StdError::generic_err("Invalid canonical address length")); + } + Ok(()) +} + /// Returns a default enviroment with height, time, chain_id, and contract address /// You can submit as is to most contracts, or modify height/time if you want to /// test for expiration. @@ -1225,13 +1235,11 @@ mod tests { } #[test] + #[should_panic(expected = "Invalid canonical address length")] fn addr_humanize_input_length() { let api = MockApi::default(); let input = CanonicalAddr::from(vec![]); - assert_eq!( - api.addr_humanize(&input).unwrap(), - Addr::unchecked("cosmwasm1pj90vm") - ); + api.addr_humanize(&input).unwrap(); } // Basic "works" test. Exhaustive tests on VM's side (packages/vm/src/imports.rs) From 005d863be86a47232690e11c9a42ef5f17386701 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 29 Nov 2023 15:44:32 +0000 Subject: [PATCH 1034/2372] Simplify MockApi implementation --- packages/std/src/testing/mock.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index f61ea15b1c..3079cd6154 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -139,14 +139,14 @@ impl Api for MockApi { fn addr_humanize(&self, canonical: &CanonicalAddr) -> StdResult { validate_length(canonical.as_ref())?; - let Ok(encoded) = encode( + + encode( self.bech32_prefix, canonical.as_slice().to_base32(), Variant::Bech32, - ) else { - return Err(StdError::generic_err("Invalid canonical address")); - }; - Ok(Addr::unchecked(encoded)) + ) + .map(Addr::unchecked) + .map_err(|_| StdError::generic_err("Invalid canonical address")) } fn secp256k1_verify( From 78b53ebeaf277fef675af739a0eaefbac30a886e Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 29 Nov 2023 16:14:39 +0000 Subject: [PATCH 1035/2372] Replace vm MockApi with bech32 --- Cargo.lock | 1 + packages/std/src/testing/mod.rs | 2 - packages/std/src/testing/shuffle.rs | 69 -------------- packages/vm/Cargo.toml | 1 + packages/vm/src/backend.rs | 13 +++ packages/vm/src/imports.rs | 18 ++-- packages/vm/src/testing/mock.rs | 138 ++++++++++------------------ 7 files changed, 70 insertions(+), 172 deletions(-) delete mode 100644 packages/std/src/testing/shuffle.rs diff --git a/Cargo.lock b/Cargo.lock index a115eba759..f148f1fbb7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -497,6 +497,7 @@ dependencies = [ name = "cosmwasm-vm" version = "1.5.0" dependencies = [ + "bech32", "bitflags", "bytecheck", "bytes", diff --git a/packages/std/src/testing/mod.rs b/packages/std/src/testing/mod.rs index 14b362ce42..eb52359d5a 100644 --- a/packages/std/src/testing/mod.rs +++ b/packages/std/src/testing/mod.rs @@ -5,7 +5,6 @@ mod assertions; mod mock; -mod shuffle; pub use assertions::assert_approx_eq_impl; #[cfg(test)] @@ -26,4 +25,3 @@ pub use mock::{ mock_ibc_channel_connect_ack, mock_ibc_channel_connect_confirm, mock_ibc_channel_open_init, mock_ibc_channel_open_try, mock_ibc_packet_ack, mock_ibc_packet_recv, mock_ibc_packet_timeout, }; -pub use shuffle::riffle_shuffle; diff --git a/packages/std/src/testing/shuffle.rs b/packages/std/src/testing/shuffle.rs deleted file mode 100644 index aa04c17ff2..0000000000 --- a/packages/std/src/testing/shuffle.rs +++ /dev/null @@ -1,69 +0,0 @@ -/// Performs a perfect shuffle (in shuffle) -/// -/// https://en.wikipedia.org/wiki/Riffle_shuffle_permutation#Perfect_shuffles -/// https://en.wikipedia.org/wiki/In_shuffle -/// -/// The number of shuffles required to restore the original order are listed in -/// and , e.g.: -/// -/// ```text -/// 2 (n=1): 2 -/// 4 (n=2): 4 -/// 6 (n=3): 3 -/// 8 (n=4): 6 -/// 10 (n=5): 10 -/// 12 (n=6): 12 -/// 14 (n=7): 4 -/// 16 (n=8): 8 -/// ``` -pub fn riffle_shuffle(input: &[T]) -> Vec { - assert!( - input.len() % 2 == 0, - "Method only defined for even number of elements" - ); - let mid = input.len() / 2; - let (left, right) = input.split_at(mid); - let mut out = Vec::::with_capacity(input.len()); - for i in 0..mid { - out.push(right[i].clone()); - out.push(left[i].clone()); - } - out -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn riffle_shuffle_works() { - // Example from https://en.wikipedia.org/wiki/In_shuffle - let start = [0xA, 0x2, 0x3, 0x4, 0x5, 0x6]; - let round1 = riffle_shuffle(&start); - assert_eq!(round1, [0x4, 0xA, 0x5, 0x2, 0x6, 0x3]); - let round2 = riffle_shuffle(&round1); - assert_eq!(round2, [0x2, 0x4, 0x6, 0xA, 0x3, 0x5]); - let round3 = riffle_shuffle(&round2); - assert_eq!(round3, start); - - // For 14 elements, the original order is restored after 4 executions - // See https://en.wikipedia.org/wiki/In_shuffle#Mathematics and https://oeis.org/A002326 - let original = [12, 33, 76, 576, 0, 44, 1, 14, 78, 99, 871212, -7, 2, -1]; - let mut result = Vec::from(original); - for _ in 0..4 { - result = riffle_shuffle(&result); - } - assert_eq!(result, original); - - // For 24 elements, the original order is restored after 20 executions - let original = [ - 7, 4, 2, 4656, 23, 45, 23, 1, 12, 76, 576, 0, 12, 1, 14, 78, 99, 12, 1212, 444, 31, - 111, 424, 34, - ]; - let mut result = Vec::from(original); - for _ in 0..20 { - result = riffle_shuffle(&result); - } - assert_eq!(result, original); - } -} diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index e89fd11f88..a53e3096da 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -29,6 +29,7 @@ bench = false bytes = "1.4.0" # need a higher version than the one required by Wasmer for the Bytes -> Vec implementation clru = "0.6.1" crc32fast = "1.3.2" +bech32 = "0.9.1" # Uses the path when built locally; uses the given version from crates.io when published cosmwasm-std = { path = "../std", version = "1.5.0", default-features = false } cosmwasm-crypto = { path = "../crypto", version = "1.5.0" } diff --git a/packages/vm/src/backend.rs b/packages/vm/src/backend.rs index bd81d466c4..1a6d9aceef 100644 --- a/packages/vm/src/backend.rs +++ b/packages/vm/src/backend.rs @@ -197,6 +197,19 @@ pub trait Querier { /// must always have gas information attached. pub type BackendResult = (core::result::Result, GasInfo); +/// The equivalent of the `?` operator, but for a [`BackendResult`] +macro_rules! try_br { + ($res: expr $(,)?) => { + let (result, gas) = $res; + + match result { + Ok(v) => v, + Err(e) => return (Err(e), gas), + } + }; +} +pub(crate) use try_br; + #[derive(Error, Debug, PartialEq, Eq)] #[non_exhaustive] pub enum BackendError { diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 745b87f2e8..24382684b7 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -1140,23 +1140,23 @@ mod tests { } } + const CANONICAL_ADDRESS_BUFFER_LENGTH: u32 = 64; + #[test] fn do_addr_canonicalize_works() { let api = MockApi::default(); let (fe, mut store, instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let api = MockApi::default(); let source_ptr = write_data(&mut fe_mut, b"foo"); - let dest_ptr = create_empty(&instance, &mut fe_mut, api.canonical_length() as u32); + let dest_ptr = create_empty(&instance, &mut fe_mut, CANONICAL_ADDRESS_BUFFER_LENGTH); leave_default_data(&mut fe_mut); - let api = MockApi::default(); let res = do_addr_canonicalize(fe_mut.as_mut(), source_ptr, dest_ptr).unwrap(); assert_eq!(res, 0); let data = force_read(&mut fe_mut, dest_ptr); - assert_eq!(data.len(), api.canonical_length()); + assert_eq!(data.len(), CANONICAL_ADDRESS_BUFFER_LENGTH as usize); } #[test] @@ -1257,7 +1257,7 @@ mod tests { .. } => { assert_eq!(size, 7); - assert_eq!(required, api.canonical_length()); + assert_eq!(required, CANONICAL_ADDRESS_BUFFER_LENGTH as usize); } err => panic!("Incorrect error returned: {err:?}"), } @@ -1268,9 +1268,8 @@ mod tests { let api = MockApi::default(); let (fe, mut store, instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let api = MockApi::default(); - let source_data = vec![0x22; api.canonical_length()]; + let source_data = vec![0x22; CANONICAL_ADDRESS_BUFFER_LENGTH as usize]; let source_ptr = write_data(&mut fe_mut, &source_data); let dest_ptr = create_empty(&instance, &mut fe_mut, 70); @@ -1351,9 +1350,8 @@ mod tests { let api = MockApi::default(); let (fe, mut store, instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let api = MockApi::default(); - let source_data = vec![0x22; api.canonical_length()]; + let source_data = vec![0x22; CANONICAL_ADDRESS_BUFFER_LENGTH as usize]; let source_ptr = write_data(&mut fe_mut, &source_data); let dest_ptr = create_empty(&instance, &mut fe_mut, 2); @@ -1366,7 +1364,7 @@ mod tests { .. } => { assert_eq!(size, 2); - assert_eq!(required, api.canonical_length()); + assert_eq!(required, CANONICAL_ADDRESS_BUFFER_LENGTH as usize); } err => panic!("Incorrect error returned: {err:?}"), } diff --git a/packages/vm/src/testing/mock.rs b/packages/vm/src/testing/mock.rs index d0edca6e41..c433b64d31 100644 --- a/packages/vm/src/testing/mock.rs +++ b/packages/vm/src/testing/mock.rs @@ -1,16 +1,20 @@ -use cosmwasm_std::testing::{digit_sum, riffle_shuffle}; +use bech32::{decode, encode, FromBase32, ToBase32, Variant}; use cosmwasm_std::{ Addr, BlockInfo, Coin, ContractInfo, Env, MessageInfo, Timestamp, TransactionInfo, }; use super::querier::MockQuerier; use super::storage::MockStorage; +use crate::backend::try_br; use crate::{Backend, BackendApi, BackendError, BackendResult, GasInfo}; -pub const MOCK_CONTRACT_ADDR: &str = "cosmos2contract"; +pub const MOCK_CONTRACT_ADDR: &str = "cosmwasmcontract"; // TODO: use correct address const GAS_COST_HUMANIZE: u64 = 44; // TODO: these seem very low const GAS_COST_CANONICALIZE: u64 = 55; +/// Default prefix used when creating Bech32 encoded address. +const BECH32_PREFIX: &str = "cosmwasm"; + /// All external requirements that can be injected for unit tests. /// It sets the given balance for the contract itself, nothing else pub fn mock_backend(contract_balance: &[Coin]) -> Backend { @@ -33,130 +37,82 @@ pub fn mock_backend_with_balances( } } -/// Length of canonical addresses created with this API. Contracts should not make any assumptions -/// what this value is. -/// -/// The value here must be restorable with `SHUFFLES_ENCODE` + `SHUFFLES_DECODE` in-shuffles. -/// See for a table of those values. -const CANONICAL_LENGTH: usize = 64; // n = 32 - -const SHUFFLES_ENCODE: usize = 10; -const SHUFFLES_DECODE: usize = 2; - /// Zero-pads all human addresses to make them fit the canonical_length and /// trims off zeros for the reverse operation. /// This is not really smart, but allows us to see a difference (and consistent length for canonical adddresses). #[derive(Copy, Clone)] -pub struct MockApi { - /// Length of canonical addresses created with this API. Contracts should not make any assumptions - /// what this value is. - canonical_length: usize, - /// When set, all calls to the API fail with BackendError::Unknown containing this message - backend_error: Option<&'static str>, +pub enum MockApi { + /// With this variant, all calls to the API fail with BackendError::Unknown + /// containing the given message + Error(&'static str), + /// This variant implements Bech32 addresses. + Bech32 { + /// Prefix used for creating addresses in Bech32 encoding. + bech32_prefix: &'static str, + }, } impl MockApi { - /// Read-only getter for `canonical_length`, which must not be changed by the caller. - pub fn canonical_length(&self) -> usize { - self.canonical_length - } - pub fn new_failing(backend_error: &'static str) -> Self { - MockApi { - backend_error: Some(backend_error), - ..MockApi::default() - } + MockApi::Error(backend_error) } } impl Default for MockApi { fn default() -> Self { - MockApi { - canonical_length: CANONICAL_LENGTH, - backend_error: None, + MockApi::Bech32 { + bech32_prefix: BECH32_PREFIX, } } } impl BackendApi for MockApi { fn canonical_address(&self, input: &str) -> BackendResult> { - // mimicks formats like hex or bech32 where different casings are valid for one address - let normalized = input.to_lowercase(); - let gas_info = GasInfo::with_cost(GAS_COST_CANONICALIZE); - if let Some(backend_error) = self.backend_error { - return (Err(BackendError::unknown(backend_error)), gas_info); - } - - // Dummy input validation. This is more sophisticated for formats like bech32, where format and checksum are validated. - let min_length = 3; - let max_length = self.canonical_length; - if normalized.len() < min_length { - return ( - Err(BackendError::user_err( - format!("Invalid input: human address too short for this mock implementation (must be >= {min_length})."), - )), - gas_info, - ); - } - if normalized.len() > max_length { - return ( - Err(BackendError::user_err( - format!("Invalid input: human address too long for this mock implementation (must be <= {max_length})."), - )), - gas_info, - ); - } + // handle error case + let bech32_prefix = match self { + MockApi::Error(e) => return (Err(BackendError::unknown(*e)), gas_info), + MockApi::Bech32 { bech32_prefix } => *bech32_prefix, + }; - let mut out = Vec::from(normalized); - // pad to canonical length with NULL bytes - out.resize(self.canonical_length, 0x00); - // content-dependent rotate followed by shuffle to destroy - // the most obvious structure (https://github.com/CosmWasm/cosmwasm/issues/552) - let rotate_by = digit_sum(&out) % self.canonical_length; - out.rotate_left(rotate_by); - for _ in 0..SHUFFLES_ENCODE { - out = riffle_shuffle(&out); + if let Ok((prefix, decoded, Variant::Bech32)) = decode(input) { + if prefix == bech32_prefix { + if let Ok(bytes) = Vec::::from_base32(&decoded) { + try_br!((validate_length(&bytes), gas_info)); + return (Ok(bytes), gas_info); + } + } } - (Ok(out), gas_info) + (Err(BackendError::user_err("Invalid input")), gas_info) } fn human_address(&self, canonical: &[u8]) -> BackendResult { let gas_info = GasInfo::with_cost(GAS_COST_HUMANIZE); - if let Some(backend_error) = self.backend_error { - return (Err(BackendError::unknown(backend_error)), gas_info); - } + // handle error case + let bech32_prefix = match self { + MockApi::Error(e) => return (Err(BackendError::unknown(*e)), gas_info), + MockApi::Bech32 { bech32_prefix } => *bech32_prefix, + }; - if canonical.len() != self.canonical_length { - return ( - Err(BackendError::user_err( - "Invalid input: canonical address length not correct", - )), - gas_info, - ); - } + try_br!((validate_length(canonical.as_ref()), gas_info)); - let mut tmp: Vec = canonical.into(); - // Shuffle two more times which restored the original value (24 elements are back to original after 20 rounds) - for _ in 0..SHUFFLES_DECODE { - tmp = riffle_shuffle(&tmp); - } - // Rotate back - let rotate_by = digit_sum(&tmp) % self.canonical_length; - tmp.rotate_right(rotate_by); - // Remove NULL bytes (i.e. the padding) - let trimmed = tmp.into_iter().filter(|&x| x != 0x00).collect(); + let result = encode(bech32_prefix, canonical.to_base32(), Variant::Bech32) + .map_err(|_| BackendError::user_err("Invalid canonical address")); - let result = match String::from_utf8(trimmed) { - Ok(human) => Ok(human), - Err(err) => Err(err.into()), - }; (result, gas_info) } } +/// Does basic validation of the number of bytes in a canonical address +fn validate_length(bytes: &[u8]) -> Result<(), BackendError> { + if !(1..=255).contains(&bytes.len()) { + return Err(BackendError::user_err("Invalid canonical address length")); + } + Ok(()) +} + /// Returns a default enviroment with height, time, chain_id, and contract address /// You can submit as is to most contracts, or modify height/time if you want to /// test for expiration. From 310f344cba57b273d4ba5738ca3185887afc7572 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 29 Nov 2023 16:15:10 +0000 Subject: [PATCH 1036/2372] Remove digit_sum --- packages/std/src/testing/mock.rs | 20 -------------------- packages/std/src/testing/mod.rs | 6 +++--- 2 files changed, 3 insertions(+), 23 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 3079cd6154..c066457238 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -1103,10 +1103,6 @@ impl DistributionQuerier { } } -pub fn digit_sum(input: &[u8]) -> usize { - input.iter().fold(0, |sum, val| sum + (*val as usize)) -} - /// Only for test code. This bypasses assertions in new, allowing us to create _* /// Attributes to simulate responses from the blockchain pub fn mock_wasmd_attr(key: impl Into, value: impl Into) -> Attribute { @@ -2290,22 +2286,6 @@ mod tests { } } - #[test] - fn digit_sum_works() { - assert_eq!(digit_sum(&[]), 0); - assert_eq!(digit_sum(&[0]), 0); - assert_eq!(digit_sum(&[0, 0]), 0); - assert_eq!(digit_sum(&[0, 0, 0]), 0); - - assert_eq!(digit_sum(&[1, 0, 0]), 1); - assert_eq!(digit_sum(&[0, 1, 0]), 1); - assert_eq!(digit_sum(&[0, 0, 1]), 1); - - assert_eq!(digit_sum(&[1, 2, 3]), 6); - - assert_eq!(digit_sum(&[255, 1]), 256); - } - #[test] fn making_an_address_works() { let mock_api = MockApi::default(); diff --git a/packages/std/src/testing/mod.rs b/packages/std/src/testing/mod.rs index eb52359d5a..820580c40c 100644 --- a/packages/std/src/testing/mod.rs +++ b/packages/std/src/testing/mod.rs @@ -15,9 +15,9 @@ pub use mock::DistributionQuerier; #[cfg(feature = "staking")] pub use mock::StakingQuerier; pub use mock::{ - digit_sum, mock_dependencies, mock_dependencies_with_balance, mock_dependencies_with_balances, - mock_env, mock_info, mock_wasmd_attr, BankQuerier, MockApi, MockQuerier, - MockQuerierCustomHandlerResult, MockStorage, MOCK_CONTRACT_ADDR, + mock_dependencies, mock_dependencies_with_balance, mock_dependencies_with_balances, mock_env, + mock_info, mock_wasmd_attr, BankQuerier, MockApi, MockQuerier, MockQuerierCustomHandlerResult, + MockStorage, MOCK_CONTRACT_ADDR, }; #[cfg(feature = "stargate")] pub use mock::{ From d30535de5b6a92259268515b7d25c87b4d27e597 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 30 Nov 2023 11:13:15 +0000 Subject: [PATCH 1037/2372] Improve vm MockApi --- packages/vm/src/testing/mock.rs | 54 +++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/packages/vm/src/testing/mock.rs b/packages/vm/src/testing/mock.rs index c433b64d31..5f2166b77f 100644 --- a/packages/vm/src/testing/mock.rs +++ b/packages/vm/src/testing/mock.rs @@ -56,6 +56,60 @@ impl MockApi { pub fn new_failing(backend_error: &'static str) -> Self { MockApi::Error(backend_error) } + + /// Returns [MockApi] with Bech32 prefix set to provided value. + /// + /// Bech32 prefix must not be empty. + /// + /// # Example + /// + /// ``` + /// # use cosmwasm_std::Addr; + /// # use cosmwasm_std::testing::MockApi; + /// # + /// let mock_api = MockApi::default().with_prefix("juno"); + /// let addr = mock_api.addr_make("creator"); + /// + /// assert_eq!(addr, "juno1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqsksmtyp"); + /// ``` + pub fn with_prefix(self, prefix: &'static str) -> Self { + Self::Bech32 { + bech32_prefix: prefix, + } + } + + /// Returns an address built from provided input string. + /// + /// # Example + /// + /// ``` + /// # use cosmwasm_std::Addr; + /// # use cosmwasm_std::testing::MockApi; + /// # + /// let mock_api = MockApi::default(); + /// let addr = mock_api.addr_make("creator"); + /// + /// assert_eq!(addr, "cosmwasm1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqs8s7vcp"); + /// ``` + /// + /// # Panics + /// + /// This function panics when generating a valid address is not possible, + /// especially when Bech32 prefix set in function [with_prefix](Self::with_prefix) is empty. + /// + pub fn addr_make(&self, input: &str) -> String { + // handle error case + let bech32_prefix = match self { + MockApi::Error(e) => panic!("Generating address failed: {e}"), + MockApi::Bech32 { bech32_prefix } => *bech32_prefix, + }; + + let digest = Sha256::digest(input).to_vec(); + match encode(bech32_prefix, digest.to_base32(), Variant::Bech32) { + Ok(address) => address, + Err(reason) => panic!("Generating address failed with reason: {reason}"), + } + } } impl Default for MockApi { From 272e88124ff165c031e270d3437f6fb9e80404e6 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 30 Nov 2023 11:13:33 +0000 Subject: [PATCH 1038/2372] Fix vm tests --- packages/vm/src/testing/mock.rs | 39 ++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/packages/vm/src/testing/mock.rs b/packages/vm/src/testing/mock.rs index 5f2166b77f..b3cdbbe106 100644 --- a/packages/vm/src/testing/mock.rs +++ b/packages/vm/src/testing/mock.rs @@ -2,6 +2,7 @@ use bech32::{decode, encode, FromBase32, ToBase32, Variant}; use cosmwasm_std::{ Addr, BlockInfo, Coin, ContractInfo, Env, MessageInfo, Timestamp, TransactionInfo, }; +use sha2::{Digest, Sha256}; use super::querier::MockQuerier; use super::storage::MockStorage; @@ -218,31 +219,39 @@ mod tests { #[test] fn canonical_address_works() { - let api = MockApi::default(); + let api = MockApi::default().with_prefix("osmo"); - api.canonical_address("foobar123").0.unwrap(); + api.canonical_address("osmo186kh7c0k0gh4ww0wh4jqc4yhzu7n7dhswe845d") + .0 + .unwrap(); // is case insensitive - let data1 = api.canonical_address("foo123").0.unwrap(); - let data2 = api.canonical_address("FOO123").0.unwrap(); + let data1 = api + .canonical_address("osmo186kh7c0k0gh4ww0wh4jqc4yhzu7n7dhswe845d") + .0 + .unwrap(); + let data2 = api + .canonical_address("OSMO186KH7C0K0GH4WW0WH4JQC4YHZU7N7DHSWE845D") + .0 + .unwrap(); assert_eq!(data1, data2); } #[test] fn canonicalize_and_humanize_restores_original() { - let api = MockApi::default(); + let api = MockApi::default().with_prefix("juno"); // simple - let original = "shorty"; - let canonical = api.canonical_address(original).0.unwrap(); + let original = api.addr_make("shorty"); + let canonical = api.canonical_address(&original).0.unwrap(); let (recovered, _gas_cost) = api.human_address(&canonical); assert_eq!(recovered.unwrap(), original); // normalizes input - let original = String::from("CosmWasmChef"); + let original = "JUNO1MEPRU9FUQ4E65856ARD6068MFSFRWPGEMD0C3R"; let canonical = api.canonical_address(&original).0.unwrap(); let recovered = api.human_address(&canonical).0.unwrap(); - assert_eq!(recovered, "cosmwasmchef"); + assert_eq!(recovered, original.to_lowercase()); // Long input (Juno contract address) let original = @@ -255,7 +264,7 @@ mod tests { #[test] fn human_address_input_length() { let api = MockApi::default(); - let input = vec![61; 11]; + let input = vec![61; 256]; // too long let (result, _gas_info) = api.human_address(&input); match result.unwrap_err() { BackendError::UserErr { .. } => {} @@ -266,9 +275,11 @@ mod tests { #[test] fn canonical_address_min_input_length() { let api = MockApi::default(); - let human = "1"; + let human = "cosmwasm1pj90vm"; match api.canonical_address(human).0.unwrap_err() { - BackendError::UserErr { msg } => assert!(msg.contains("too short")), + BackendError::UserErr { msg } => { + assert!(msg.contains("address length")) + } err => panic!("Unexpected error: {err:?}"), } } @@ -278,7 +289,9 @@ mod tests { let api = MockApi::default(); let human = "longer-than-the-address-length-supported-by-this-api-longer-than-54"; match api.canonical_address(human).0.unwrap_err() { - BackendError::UserErr { msg } => assert!(msg.contains("too long")), + BackendError::UserErr { msg } => { + assert!(msg.contains("address length")) + } err => panic!("Unexpected error: {err:?}"), } } From 2d7b837a2007d49ebb3beb2e73770abb9f8998ea Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 30 Nov 2023 12:46:43 +0000 Subject: [PATCH 1039/2372] Fix std tests --- packages/std/src/testing/mock.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index c066457238..25a84aca99 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -1217,8 +1217,18 @@ mod tests { #[test] fn addr_canonicalize_short_input() { let api = MockApi::default(); - let human = String::from("cosmwasm1pj90vm"); - assert_eq!(api.addr_canonicalize(&human).unwrap().to_string(), ""); + + // empty address should fail + let empty = "cosmwasm1pj90vm"; + assert!(api + .addr_canonicalize(empty) + .unwrap_err() + .to_string() + .contains("Invalid canonical address length")); + + // one byte address should work + let human = "cosmwasm1qqvk2mde"; + assert_eq!(api.addr_canonicalize(human).unwrap().as_ref(), [0u8]); } #[test] From 9d539c0394ca63b833b8e3d633911b229844e801 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 1 Dec 2023 19:15:18 +0000 Subject: [PATCH 1040/2372] Fix vm tests --- packages/vm/benches/main.rs | 14 +- packages/vm/examples/multi_threaded_cache.rs | 17 +- packages/vm/src/cache.rs | 167 +++++++++++++------ packages/vm/src/calls.rs | 50 ++++-- packages/vm/src/imports.rs | 58 +++---- packages/vm/src/instance.rs | 63 ++++--- packages/vm/src/testing/mock.rs | 34 ++-- 7 files changed, 246 insertions(+), 157 deletions(-) diff --git a/packages/vm/benches/main.rs b/packages/vm/benches/main.rs index 5b014617a5..a6410fab89 100644 --- a/packages/vm/benches/main.rs +++ b/packages/vm/benches/main.rs @@ -54,8 +54,10 @@ fn bench_instance(c: &mut Criterion) { Instance::from_code(CONTRACT, backend, much_gas, Some(DEFAULT_MEMORY_LIMIT)).unwrap(); b.iter(|| { - let info = mock_info("creator", &coins(1000, "earth")); - let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; + let info = mock_info(&instance.api().addr_make("creator"), &coins(1000, "earth")); + let verifier = instance.api().addr_make("verifies"); + let beneficiary = instance.api().addr_make("benefits"); + let msg = format!(r#"{{"verifier": "{verifier}", "beneficiary": "{beneficiary}"}}"#); let contract_result = call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); assert!(contract_result.into_result().is_ok()); @@ -70,14 +72,16 @@ fn bench_instance(c: &mut Criterion) { let mut instance = Instance::from_code(CONTRACT, backend, much_gas, Some(DEFAULT_MEMORY_LIMIT)).unwrap(); - let info = mock_info("creator", &coins(1000, "earth")); - let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; + let info = mock_info(&instance.api().addr_make("creator"), &coins(1000, "earth")); + let verifier = instance.api().addr_make("verifies"); + let beneficiary = instance.api().addr_make("benefits"); + let msg = format!(r#"{{"verifier": "{verifier}", "beneficiary": "{beneficiary}"}}"#); let contract_result = call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); assert!(contract_result.into_result().is_ok()); b.iter(|| { - let info = mock_info("verifies", &coins(15, "earth")); + let info = mock_info(&verifier, &coins(15, "earth")); let msg = br#"{"release":{}}"#; let contract_result = call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); diff --git a/packages/vm/examples/multi_threaded_cache.rs b/packages/vm/examples/multi_threaded_cache.rs index f0926d489d..b3ca70d6e2 100644 --- a/packages/vm/examples/multi_threaded_cache.rs +++ b/packages/vm/examples/multi_threaded_cache.rs @@ -55,13 +55,20 @@ pub fn main() { .unwrap(); println!("Done instantiating contract {i}"); - let info = mock_info("creator", &coins(1000, "earth")); - let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; - let contract_result = - call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); + let info = mock_info(&instance.api().addr_make("creator"), &coins(1000, "earth")); + let verifier = instance.api().addr_make("verifies"); + let beneficiary = instance.api().addr_make("benefits"); + let msg = format!(r#"{{"verifier": "{verifier}", "beneficiary": "{beneficiary}"}}"#); + let contract_result = call_instantiate::<_, _, _, Empty>( + &mut instance, + &mock_env(), + &info, + msg.as_bytes(), + ) + .unwrap(); assert!(contract_result.into_result().is_ok()); - let info = mock_info("verifies", &coins(15, "earth")); + let info = mock_info(&verifier, &coins(15, "earth")); let msg = br#"{"release":{}}"#; let contract_result = call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 32a13b5221..4616c99653 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -590,22 +590,24 @@ mod tests { } /// Takes an instance and executes it - fn test_hackatom_instance_execution(instance: &mut Instance) + fn test_hackatom_instance_execution(instance: &mut Instance) where - A: BackendApi + 'static, S: Storage + 'static, Q: Querier + 'static, { // instantiate - let info = mock_info("creator", &coins(1000, "earth")); - let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; - let response = call_instantiate::<_, _, _, Empty>(instance, &mock_env(), &info, msg) - .unwrap() - .unwrap(); + let info = mock_info(&instance.api().addr_make("creator"), &coins(1000, "earth")); + let verifier = instance.api().addr_make("verifies"); + let beneficiary = instance.api().addr_make("benefits"); + let msg = format!(r#"{{"verifier": "{verifier}", "beneficiary": "{beneficiary}"}}"#); + let response = + call_instantiate::<_, _, _, Empty>(instance, &mock_env(), &info, msg.as_bytes()) + .unwrap() + .unwrap(); assert_eq!(response.messages.len(), 0); // execute - let info = mock_info("verifies", &coins(15, "earth")); + let info = mock_info(&verifier, &coins(15, "earth")); let msg = br#"{"release":{}}"#; let response = call_execute::<_, _, _, Empty>(instance, &mock_env(), &info, msg) .unwrap() @@ -936,10 +938,17 @@ mod tests { assert_eq!(cache.stats().misses, 0); // instantiate - let info = mock_info("creator", &coins(1000, "earth")); - let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; - let res = - call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); + let info = mock_info(&instance.api().addr_make("creator"), &coins(1000, "earth")); + let verifier = instance.api().addr_make("verifies"); + let beneficiary = instance.api().addr_make("benefits"); + let msg = format!(r#"{{"verifier": "{verifier}", "beneficiary": "{beneficiary}"}}"#); + let res = call_instantiate::<_, _, _, Empty>( + &mut instance, + &mock_env(), + &info, + msg.as_bytes(), + ) + .unwrap(); let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); } @@ -955,10 +964,17 @@ mod tests { assert_eq!(cache.stats().misses, 0); // instantiate - let info = mock_info("creator", &coins(1000, "earth")); - let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; - let res = - call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); + let info = mock_info(&instance.api().addr_make("creator"), &coins(1000, "earth")); + let verifier = instance.api().addr_make("verifies"); + let beneficiary = instance.api().addr_make("benefits"); + let msg = format!(r#"{{"verifier": "{verifier}", "beneficiary": "{beneficiary}"}}"#); + let res = call_instantiate::<_, _, _, Empty>( + &mut instance, + &mock_env(), + &info, + msg.as_bytes(), + ) + .unwrap(); let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); } @@ -976,10 +992,17 @@ mod tests { assert_eq!(cache.stats().misses, 0); // instantiate - let info = mock_info("creator", &coins(1000, "earth")); - let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; - let res = - call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); + let info = mock_info(&instance.api().addr_make("creator"), &coins(1000, "earth")); + let verifier = instance.api().addr_make("verifies"); + let beneficiary = instance.api().addr_make("benefits"); + let msg = format!(r#"{{"verifier": "{verifier}", "beneficiary": "{beneficiary}"}}"#); + let res = call_instantiate::<_, _, _, Empty>( + &mut instance, + &mock_env(), + &info, + msg.as_bytes(), + ) + .unwrap(); let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); } @@ -1001,16 +1024,22 @@ mod tests { assert_eq!(cache.stats().misses, 0); // instantiate - let info = mock_info("creator", &coins(1000, "earth")); - let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; - let response = - call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) - .unwrap() - .unwrap(); + let info = mock_info(&instance.api().addr_make("creator"), &coins(1000, "earth")); + let verifier = instance.api().addr_make("verifies"); + let beneficiary = instance.api().addr_make("benefits"); + let msg = format!(r#"{{"verifier": "{verifier}", "beneficiary": "{beneficiary}"}}"#); + let response = call_instantiate::<_, _, _, Empty>( + &mut instance, + &mock_env(), + &info, + msg.as_bytes(), + ) + .unwrap() + .unwrap(); assert_eq!(response.messages.len(), 0); // execute - let info = mock_info("verifies", &coins(15, "earth")); + let info = mock_info(&verifier, &coins(15, "earth")); let msg = br#"{"release":{}}"#; let response = call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) .unwrap() @@ -1029,16 +1058,22 @@ mod tests { assert_eq!(cache.stats().misses, 0); // instantiate - let info = mock_info("creator", &coins(1000, "earth")); - let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; - let response = - call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) - .unwrap() - .unwrap(); + let info = mock_info(&instance.api().addr_make("creator"), &coins(1000, "earth")); + let verifier = instance.api().addr_make("verifies"); + let beneficiary = instance.api().addr_make("benefits"); + let msg = format!(r#"{{"verifier": "{verifier}", "beneficiary": "{beneficiary}"}}"#); + let response = call_instantiate::<_, _, _, Empty>( + &mut instance, + &mock_env(), + &info, + msg.as_bytes(), + ) + .unwrap() + .unwrap(); assert_eq!(response.messages.len(), 0); // execute - let info = mock_info("verifies", &coins(15, "earth")); + let info = mock_info(&verifier, &coins(15, "earth")); let msg = br#"{"release":{}}"#; let response = call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) .unwrap() @@ -1059,16 +1094,22 @@ mod tests { assert_eq!(cache.stats().misses, 0); // instantiate - let info = mock_info("creator", &coins(1000, "earth")); - let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; - let response = - call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) - .unwrap() - .unwrap(); + let info = mock_info(&instance.api().addr_make("creator"), &coins(1000, "earth")); + let verifier = instance.api().addr_make("verifies"); + let beneficiary = instance.api().addr_make("benefits"); + let msg = format!(r#"{{"verifier": "{verifier}", "beneficiary": "{beneficiary}"}}"#); + let response = call_instantiate::<_, _, _, Empty>( + &mut instance, + &mock_env(), + &info, + msg.as_bytes(), + ) + .unwrap() + .unwrap(); assert_eq!(response.messages.len(), 0); // execute - let info = mock_info("verifies", &coins(15, "earth")); + let info = mock_info(&verifier, &coins(15, "earth")); let msg = br#"{"release":{}}"#; let response = call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) .unwrap() @@ -1112,9 +1153,12 @@ mod tests { .get_instance(&checksum, backend1, TESTING_OPTIONS) .unwrap(); let info = mock_info("owner1", &coins(1000, "earth")); - let msg = br#"{"verifier": "sue", "beneficiary": "mary"}"#; + let sue = instance.api().addr_make("sue"); + let mary = instance.api().addr_make("mary"); + let msg = format!(r#"{{"verifier": "{sue}", "beneficiary": "{mary}"}}"#); let res = - call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); + call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg.as_bytes()) + .unwrap(); let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); let backend1 = instance.recycle().unwrap(); @@ -1124,9 +1168,12 @@ mod tests { .get_instance(&checksum, backend2, TESTING_OPTIONS) .unwrap(); let info = mock_info("owner2", &coins(500, "earth")); - let msg = br#"{"verifier": "bob", "beneficiary": "john"}"#; + let bob = instance.api().addr_make("bob"); + let john = instance.api().addr_make("john"); + let msg = format!(r#"{{"verifier": "{bob}", "beneficiary": "{john}"}}"#); let res = - call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); + call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg.as_bytes()) + .unwrap(); let msgs = res.unwrap().messages; assert_eq!(msgs.len(), 0); let backend2 = instance.recycle().unwrap(); @@ -1135,7 +1182,7 @@ mod tests { let mut instance = cache .get_instance(&checksum, backend2, TESTING_OPTIONS) .unwrap(); - let info = mock_info("bob", &coins(15, "earth")); + let info = mock_info(&bob, &coins(15, "earth")); let msg = br#"{"release":{}}"#; let res = call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; @@ -1145,7 +1192,7 @@ mod tests { let mut instance = cache .get_instance(&checksum, backend1, TESTING_OPTIONS) .unwrap(); - let info = mock_info("sue", &coins(15, "earth")); + let info = mock_info(&sue, &coins(15, "earth")); let msg = br#"{"release":{}}"#; let res = call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); let msgs = res.unwrap().messages; @@ -1172,8 +1219,10 @@ mod tests { // Consume some gas let info = mock_info("owner1", &coins(1000, "earth")); - let msg = br#"{"verifier": "sue", "beneficiary": "mary"}"#; - call_instantiate::<_, _, _, Empty>(&mut instance1, &mock_env(), &info, msg) + let sue = instance1.api().addr_make("sue"); + let mary = instance1.api().addr_make("mary"); + let msg = format!(r#"{{"verifier": "{sue}", "beneficiary": "{mary}"}}"#); + call_instantiate::<_, _, _, Empty>(&mut instance1, &mock_env(), &info, msg.as_bytes()) .unwrap() .unwrap(); assert!(instance1.get_gas_left() < original_gas); @@ -1205,9 +1254,17 @@ mod tests { // Consume some gas. This fails let info1 = mock_info("owner1", &coins(1000, "earth")); - let msg1 = br#"{"verifier": "sue", "beneficiary": "mary"}"#; - match call_instantiate::<_, _, _, Empty>(&mut instance1, &mock_env(), &info1, msg1) - .unwrap_err() + let sue = instance1.api().addr_make("sue"); + let mary = instance1.api().addr_make("mary"); + let msg1 = format!(r#"{{"verifier": "{sue}", "beneficiary": "{mary}"}}"#); + + match call_instantiate::<_, _, _, Empty>( + &mut instance1, + &mock_env(), + &info1, + msg1.as_bytes(), + ) + .unwrap_err() { VmError::GasDepletion { .. } => (), // all good, continue e => panic!("unexpected error, {e:?}"), @@ -1227,8 +1284,10 @@ mod tests { // Now it works let info2 = mock_info("owner2", &coins(500, "earth")); - let msg2 = br#"{"verifier": "bob", "beneficiary": "john"}"#; - call_instantiate::<_, _, _, Empty>(&mut instance2, &mock_env(), &info2, msg2) + let bob = instance2.api().addr_make("bob"); + let john = instance2.api().addr_make("john"); + let msg2 = format!(r#"{{"verifier": "{bob}", "beneficiary": "{john}"}}"#); + call_instantiate::<_, _, _, Empty>(&mut instance2, &mock_env(), &info2, msg2.as_bytes()) .unwrap() .unwrap(); } diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 29fbf47422..6b648b9136 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -606,9 +606,11 @@ mod tests { let mut instance = mock_instance(CONTRACT, &[]); // init - let info = mock_info("creator", &coins(1000, "earth")); - let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; - call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) + let info = mock_info(&instance.api().addr_make("creator"), &coins(1000, "earth")); + let verifier = instance.api().addr_make("verifies"); + let beneficiary = instance.api().addr_make("benefits"); + let msg = format!(r#"{{"verifier": "{verifier}", "beneficiary": "{beneficiary}"}}"#); + call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg.as_bytes()) .unwrap() .unwrap(); } @@ -640,14 +642,16 @@ mod tests { let mut instance = mock_instance(CONTRACT, &[]); // init - let info = mock_info("creator", &coins(1000, "earth")); - let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; - call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) + let info = mock_info(&instance.api().addr_make("creator"), &coins(1000, "earth")); + let verifier = instance.api().addr_make("verifies"); + let beneficiary = instance.api().addr_make("benefits"); + let msg = format!(r#"{{"verifier": "{verifier}", "beneficiary": "{beneficiary}"}}"#); + call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg.as_bytes()) .unwrap() .unwrap(); // execute - let info = mock_info("verifies", &coins(15, "earth")); + let info = mock_info(&verifier, &coins(15, "earth")); let msg = br#"{"release":{}}"#; call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) .unwrap() @@ -723,23 +727,28 @@ mod tests { let mut instance = mock_instance(CONTRACT, &[]); // init - let info = mock_info("creator", &coins(1000, "earth")); - let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; - call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) + let info = mock_info(&instance.api().addr_make("creator"), &coins(1000, "earth")); + let verifier = instance.api().addr_make("verifies"); + let beneficiary = instance.api().addr_make("benefits"); + let msg = format!(r#"{{"verifier": "{verifier}", "beneficiary": "{beneficiary}"}}"#); + call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg.as_bytes()) .unwrap() .unwrap(); // change the verifier via migrate - let msg = br#"{"verifier": "someone else"}"#; - let _res = call_migrate::<_, _, _, Empty>(&mut instance, &mock_env(), msg); + let someone_else = instance.api().addr_make("someone else"); + let msg = format!(r#"{{"verifier": "{someone_else}"}}"#); + let _res = call_migrate::<_, _, _, Empty>(&mut instance, &mock_env(), msg.as_bytes()) + .unwrap() + .unwrap(); // query the new_verifier with verifier let msg = br#"{"verifier":{}}"#; let contract_result = call_query(&mut instance, &mock_env(), msg).unwrap(); let query_response = contract_result.unwrap(); assert_eq!( - query_response.as_slice(), - b"{\"verifier\":\"someone else\"}" + query_response, + format!(r#"{{"verifier":"{}"}}"#, someone_else).as_bytes(), ); } @@ -748,9 +757,11 @@ mod tests { let mut instance = mock_instance(CONTRACT, &[]); // init - let info = mock_info("creator", &coins(1000, "earth")); - let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; - call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) + let info = mock_info(&instance.api().addr_make("creator"), &coins(1000, "earth")); + let verifier = instance.api().addr_make("verifies"); + let beneficiary = instance.api().addr_make("benefits"); + let msg = format!(r#"{{"verifier": "{verifier}", "beneficiary": "{beneficiary}"}}"#); + call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg.as_bytes()) .unwrap() .unwrap(); @@ -758,7 +769,10 @@ mod tests { let msg = br#"{"verifier":{}}"#; let contract_result = call_query(&mut instance, &mock_env(), msg).unwrap(); let query_response = contract_result.unwrap(); - assert_eq!(query_response.as_slice(), b"{\"verifier\":\"verifies\"}"); + assert_eq!( + query_response, + format!("{{\"verifier\":\"{verifier}\"}}").as_bytes() + ); } #[test] diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 24382684b7..b0ef67b930 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -1046,12 +1046,12 @@ mod tests { #[test] fn do_addr_validate_works() { - let api = MockApi::default(); + let api = MockApi::default().with_prefix("osmo"); let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let source_ptr1 = write_data(&mut fe_mut, b"foo"); - let source_ptr2 = write_data(&mut fe_mut, b"eth1n48g2mjh9ezz7zjtya37wtgg5r5emr0drkwlgw"); + let source_ptr1 = write_data(&mut fe_mut, b"osmo186kh7c0k0gh4ww0wh4jqc4yhzu7n7dhswe845d"); + let source_ptr2 = write_data(&mut fe_mut, b"osmo18enxpg25jc4zkwe7w00yneva0vztwuex3rtv8t"); let res = do_addr_validate(fe_mut.as_mut(), source_ptr1).unwrap(); assert_eq!(res, 0); @@ -1065,10 +1065,12 @@ mod tests { let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let source_ptr1 = write_data(&mut fe_mut, b"fo\x80o"); // invalid UTF-8 (fo�o) + let source_ptr1 = write_data(&mut fe_mut, b"cosmwasm\x80o"); // invalid UTF-8 (cosmwasm�o) let source_ptr2 = write_data(&mut fe_mut, b""); // empty - let source_ptr3 = write_data(&mut fe_mut, b"addressexceedingaddressspacesuperlongreallylongiamensuringthatitislongerthaneverything"); // too long - let source_ptr4 = write_data(&mut fe_mut, b"fooBar"); // Not normalized. The definition of normalized is chain-dependent but the MockApi requires lower case. + let source_ptr3 = write_data( + &mut fe_mut, + b"cosmwasm1h34LMPYwh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqs8s7vcp", + ); // Not normalized. The definition of normalized is chain-dependent but the MockApi disallows mixed case. let res = do_addr_validate(fe_mut.as_mut(), source_ptr1).unwrap(); assert_ne!(res, 0); @@ -1083,15 +1085,7 @@ mod tests { let res = do_addr_validate(fe_mut.as_mut(), source_ptr3).unwrap(); assert_ne!(res, 0); let err = String::from_utf8(force_read(&mut fe_mut, res)).unwrap(); - assert_eq!( - err, - "Invalid input: human address too long for this mock implementation (must be <= 64)." - ); - - let res = do_addr_validate(fe_mut.as_mut(), source_ptr4).unwrap(); - assert_ne!(res, 0); - let err = String::from_utf8(force_read(&mut fe_mut, res)).unwrap(); - assert_eq!(err, "Address is not normalized"); + assert_eq!(err, "Invalid input"); } #[test] @@ -1148,7 +1142,10 @@ mod tests { let (fe, mut store, instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let source_ptr = write_data(&mut fe_mut, b"foo"); + let source_ptr = write_data( + &mut fe_mut, + b"cosmwasm1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqs8s7vcp", + ); let dest_ptr = create_empty(&instance, &mut fe_mut, CANONICAL_ADDRESS_BUFFER_LENGTH); leave_default_data(&mut fe_mut); @@ -1156,7 +1153,7 @@ mod tests { let res = do_addr_canonicalize(fe_mut.as_mut(), source_ptr, dest_ptr).unwrap(); assert_eq!(res, 0); let data = force_read(&mut fe_mut, dest_ptr); - assert_eq!(data.len(), CANONICAL_ADDRESS_BUFFER_LENGTH as usize); + assert_eq!(data.len(), 32); } #[test] @@ -1165,9 +1162,8 @@ mod tests { let (fe, mut store, instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let source_ptr1 = write_data(&mut fe_mut, b"fo\x80o"); // invalid UTF-8 (fo�o) + let source_ptr1 = write_data(&mut fe_mut, b"cosmwasm\x80o"); // invalid UTF-8 (cosmwasm�o) let source_ptr2 = write_data(&mut fe_mut, b""); // empty - let source_ptr3 = write_data(&mut fe_mut, b"addressexceedingaddressspacesuperlongreallylongiamensuringthatitislongerthaneverything"); // too long let dest_ptr = create_empty(&instance, &mut fe_mut, 70); leave_default_data(&mut fe_mut); @@ -1181,14 +1177,6 @@ mod tests { assert_ne!(res, 0); let err = String::from_utf8(force_read(&mut fe_mut, res)).unwrap(); assert_eq!(err, "Input is empty"); - - let res = do_addr_canonicalize(fe_mut.as_mut(), source_ptr3, dest_ptr).unwrap(); - assert_ne!(res, 0); - let err = String::from_utf8(force_read(&mut fe_mut, res)).unwrap(); - assert_eq!( - err, - "Invalid input: human address too long for this mock implementation (must be <= 64)." - ); } #[test] @@ -1241,11 +1229,11 @@ mod tests { #[test] fn do_addr_canonicalize_fails_for_small_destination_region() { - let api = MockApi::default(); + let api = MockApi::default().with_prefix("osmo"); let (fe, mut store, instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let source_ptr = write_data(&mut fe_mut, b"foo"); + let source_ptr = write_data(&mut fe_mut, b"osmo18enxpg25jc4zkwe7w00yneva0vztwuex3rtv8t"); let dest_ptr = create_empty(&instance, &mut fe_mut, 7); leave_default_data(&mut fe_mut); @@ -1257,7 +1245,7 @@ mod tests { .. } => { assert_eq!(size, 7); - assert_eq!(required, CANONICAL_ADDRESS_BUFFER_LENGTH as usize); + assert_eq!(required, 20); } err => panic!("Incorrect error returned: {err:?}"), } @@ -1271,13 +1259,13 @@ mod tests { let source_data = vec![0x22; CANONICAL_ADDRESS_BUFFER_LENGTH as usize]; let source_ptr = write_data(&mut fe_mut, &source_data); - let dest_ptr = create_empty(&instance, &mut fe_mut, 70); + let dest_ptr = create_empty(&instance, &mut fe_mut, 118); leave_default_data(&mut fe_mut); let error_ptr = do_addr_humanize(fe_mut.as_mut(), source_ptr, dest_ptr).unwrap(); assert_eq!(error_ptr, 0); - assert_eq!(force_read(&mut fe_mut, dest_ptr), source_data); + assert_eq!(force_read(&mut fe_mut, dest_ptr), b"cosmwasm1yg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygsegeksq"); } #[test] @@ -1286,7 +1274,7 @@ mod tests { let (fe, mut store, instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let source_ptr = write_data(&mut fe_mut, b"foo"); // too short + let source_ptr = write_data(&mut fe_mut, b""); // too short let dest_ptr = create_empty(&instance, &mut fe_mut, 70); leave_default_data(&mut fe_mut); @@ -1294,7 +1282,7 @@ mod tests { let res = do_addr_humanize(fe_mut.as_mut(), source_ptr, dest_ptr).unwrap(); assert_ne!(res, 0); let err = String::from_utf8(force_read(&mut fe_mut, res)).unwrap(); - assert_eq!(err, "Invalid input: canonical address length not correct"); + assert_eq!(err, "Invalid canonical address length"); } #[test] @@ -1364,7 +1352,7 @@ mod tests { .. } => { assert_eq!(size, 2); - assert_eq!(required, CANONICAL_ADDRESS_BUFFER_LENGTH as usize); + assert_eq!(required, 118); } err => panic!("Incorrect error returned: {err:?}"), } diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 617d2aa4a1..a1f4ced072 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -848,15 +848,17 @@ mod tests { assert_eq!(report1.remaining, LIMIT); // init contract - let info = mock_info("creator", &coins(1000, "earth")); - let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; - call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) + let info = mock_info(&instance.api().addr_make("creator"), &coins(1000, "earth")); + let verifier = instance.api().addr_make("verifies"); + let beneficiary = instance.api().addr_make("benefits"); + let msg = format!(r#"{{"verifier": "{verifier}", "beneficiary": "{beneficiary}"}}"#); + call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg.as_bytes()) .unwrap() .unwrap(); let report2 = instance.create_gas_report(); - assert_eq!(report2.used_externally, 73); - assert_eq!(report2.used_internally, 5765148); + assert_eq!(report2.used_externally, 251); + assert_eq!(report2.used_internally, 8461548); assert_eq!(report2.limit, LIMIT); assert_eq!( report2.remaining, @@ -1038,14 +1040,16 @@ mod tests { let orig_gas = instance.get_gas_left(); // init contract - let info = mock_info("creator", &coins(1000, "earth")); - let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; - call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) + let info = mock_info(&instance.api().addr_make("creator"), &coins(1000, "earth")); + let verifier = instance.api().addr_make("verifies"); + let beneficiary = instance.api().addr_make("benefits"); + let msg = format!(r#"{{"verifier": "{verifier}", "beneficiary": "{beneficiary}"}}"#); + call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg.as_bytes()) .unwrap() .unwrap(); let init_used = orig_gas - instance.get_gas_left(); - assert_eq!(init_used, 5765221); + assert_eq!(init_used, 8461799); } #[test] @@ -1053,22 +1057,24 @@ mod tests { let mut instance = mock_instance(CONTRACT, &[]); // init contract - let info = mock_info("creator", &coins(1000, "earth")); - let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; - call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) + let info = mock_info(&instance.api().addr_make("creator"), &coins(1000, "earth")); + let verifier = instance.api().addr_make("verifies"); + let beneficiary = instance.api().addr_make("benefits"); + let msg = format!(r#"{{"verifier": "{verifier}", "beneficiary": "{beneficiary}"}}"#); + call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg.as_bytes()) .unwrap() .unwrap(); // run contract - just sanity check - results validate in contract unit tests let gas_before_execute = instance.get_gas_left(); - let info = mock_info("verifies", &coins(15, "earth")); + let info = mock_info(&verifier, &coins(15, "earth")); let msg = br#"{"release":{}}"#; call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) .unwrap() .unwrap(); let execute_used = gas_before_execute - instance.get_gas_left(); - assert_eq!(execute_used, 8652406); + assert_eq!(execute_used, 11181706); } #[test] @@ -1076,9 +1082,12 @@ mod tests { let mut instance = mock_instance_with_gas_limit(CONTRACT, 20_000); // init contract - let info = mock_info("creator", &coins(1000, "earth")); - let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; - let res = call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg); + let info = mock_info(&instance.api().addr_make("creator"), &coins(1000, "earth")); + let verifier = instance.api().addr_make("verifies"); + let beneficiary = instance.api().addr_make("benefits"); + let msg = format!(r#"{{"verifier": "{verifier}", "beneficiary": "{beneficiary}"}}"#); + let res = + call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg.as_bytes()); assert!(res.is_err()); } @@ -1087,11 +1096,14 @@ mod tests { let mut instance = mock_instance(CONTRACT, &[]); // init contract - let info = mock_info("creator", &coins(1000, "earth")); - let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; - let _res = call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) - .unwrap() - .unwrap(); + let info = mock_info(&instance.api().addr_make("creator"), &coins(1000, "earth")); + let verifier = instance.api().addr_make("verifies"); + let beneficiary = instance.api().addr_make("benefits"); + let msg = format!(r#"{{"verifier": "{verifier}", "beneficiary": "{beneficiary}"}}"#); + let _res = + call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg.as_bytes()) + .unwrap() + .unwrap(); // run contract - just sanity check - results validate in contract unit tests let gas_before_query = instance.get_gas_left(); @@ -1099,9 +1111,12 @@ mod tests { let msg = br#"{"verifier":{}}"#; let res = call_query(&mut instance, &mock_env(), msg).unwrap(); let answer = res.unwrap(); - assert_eq!(answer.as_slice(), b"{\"verifier\":\"verifies\"}"); + assert_eq!( + answer.as_slice(), + format!("{{\"verifier\":\"{verifier}\"}}").as_bytes() + ); let query_used = gas_before_query - instance.get_gas_left(); - assert_eq!(query_used, 4493706); + assert_eq!(query_used, 7142556); } } diff --git a/packages/vm/src/testing/mock.rs b/packages/vm/src/testing/mock.rs index b3cdbbe106..c604535b35 100644 --- a/packages/vm/src/testing/mock.rs +++ b/packages/vm/src/testing/mock.rs @@ -71,7 +71,7 @@ impl MockApi { /// let mock_api = MockApi::default().with_prefix("juno"); /// let addr = mock_api.addr_make("creator"); /// - /// assert_eq!(addr, "juno1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqsksmtyp"); + /// assert_eq!(addr.as_str(), "juno1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqsksmtyp"); /// ``` pub fn with_prefix(self, prefix: &'static str) -> Self { Self::Bech32 { @@ -90,7 +90,7 @@ impl MockApi { /// let mock_api = MockApi::default(); /// let addr = mock_api.addr_make("creator"); /// - /// assert_eq!(addr, "cosmwasm1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqs8s7vcp"); + /// assert_eq!(addr.as_str(), "cosmwasm1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqs8s7vcp"); /// ``` /// /// # Panics @@ -275,24 +275,26 @@ mod tests { #[test] fn canonical_address_min_input_length() { let api = MockApi::default(); - let human = "cosmwasm1pj90vm"; - match api.canonical_address(human).0.unwrap_err() { - BackendError::UserErr { msg } => { - assert!(msg.contains("address length")) - } - err => panic!("Unexpected error: {err:?}"), - } + + // empty address should fail + let empty = "cosmwasm1pj90vm"; + assert!(matches!(api + .canonical_address(empty) + .0 + .unwrap_err(), + BackendError::UserErr { msg } if msg.contains("address length"))); } #[test] fn canonical_address_max_input_length() { let api = MockApi::default(); - let human = "longer-than-the-address-length-supported-by-this-api-longer-than-54"; - match api.canonical_address(human).0.unwrap_err() { - BackendError::UserErr { msg } => { - assert!(msg.contains("address length")) - } - err => panic!("Unexpected error: {err:?}"), - } + + let too_long = "cosmwasm1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqehqqkz"; + + assert!(matches!(api + .canonical_address(too_long) + .0 + .unwrap_err(), + BackendError::UserErr { msg } if msg.contains("address length"))); } } From 6d610d407f5ccc9c831d10ac9395b97e4566d7a3 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 1 Dec 2023 19:15:31 +0000 Subject: [PATCH 1041/2372] Fix contract tests --- contracts/burner/Cargo.lock | 1 + contracts/crypto-verify/Cargo.lock | 1 + contracts/cyberpunk/Cargo.lock | 1 + contracts/empty/Cargo.lock | 1 + contracts/floaty/Cargo.lock | 1 + contracts/hackatom/Cargo.lock | 1 + contracts/hackatom/tests/integration.rs | 91 ++++++++++++---------- contracts/ibc-reflect-send/Cargo.lock | 1 + contracts/ibc-reflect/Cargo.lock | 1 + contracts/ibc-reflect/src/contract.rs | 23 +++--- contracts/ibc-reflect/tests/integration.rs | 11 +-- contracts/queue/Cargo.lock | 1 + contracts/reflect/Cargo.lock | 1 + contracts/reflect/src/contract.rs | 10 ++- contracts/reflect/tests/integration.rs | 8 +- contracts/staking/Cargo.lock | 1 + contracts/staking/src/contract.rs | 51 ++++++------ contracts/staking/tests/integration.rs | 4 +- contracts/virus/Cargo.lock | 1 + 19 files changed, 120 insertions(+), 90 deletions(-) diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index b34c8884d5..9921f63fde 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -260,6 +260,7 @@ dependencies = [ name = "cosmwasm-vm" version = "1.5.0" dependencies = [ + "bech32", "bitflags", "bytecheck", "bytes", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 1b0edfa2a0..db1791d4ae 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -249,6 +249,7 @@ dependencies = [ name = "cosmwasm-vm" version = "1.5.0" dependencies = [ + "bech32", "bitflags", "bytecheck", "bytes", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 7c5cc0e80c..2724a69f4d 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -284,6 +284,7 @@ dependencies = [ name = "cosmwasm-vm" version = "1.5.0" dependencies = [ + "bech32", "bitflags", "bytecheck", "bytes", diff --git a/contracts/empty/Cargo.lock b/contracts/empty/Cargo.lock index 4af72f118c..84b8ec89c8 100644 --- a/contracts/empty/Cargo.lock +++ b/contracts/empty/Cargo.lock @@ -249,6 +249,7 @@ dependencies = [ name = "cosmwasm-vm" version = "1.5.0" dependencies = [ + "bech32", "bitflags", "bytecheck", "bytes", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 25a79648c7..9f4b2cb718 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -249,6 +249,7 @@ dependencies = [ name = "cosmwasm-vm" version = "1.5.0" dependencies = [ + "bech32", "bitflags", "bytecheck", "bytes", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index bf88a6b513..b45628310a 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -249,6 +249,7 @@ dependencies = [ name = "cosmwasm-vm" version = "1.5.0" dependencies = [ + "bech32", "bitflags", "bytecheck", "bytes", diff --git a/contracts/hackatom/tests/integration.rs b/contracts/hackatom/tests/integration.rs index 1a73fe88f3..d5560bf2a0 100644 --- a/contracts/hackatom/tests/integration.rs +++ b/contracts/hackatom/tests/integration.rs @@ -25,9 +25,9 @@ use cosmwasm_vm::{ call_execute, from_slice, testing::{ execute, instantiate, migrate, mock_env, mock_info, mock_instance, - mock_instance_with_balances, query, sudo, test_io, MOCK_CONTRACT_ADDR, + mock_instance_with_balances, query, sudo, test_io, MockApi, MOCK_CONTRACT_ADDR, }, - Storage, VmError, + Instance, Querier, Storage, VmError, }; use hackatom::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg, SudoMsg}; @@ -37,10 +37,12 @@ static WASM: &[u8] = include_bytes!("../target/wasm32-unknown-unknown/release/ha const DESERIALIZATION_LIMIT: usize = 20_000; -fn make_init_msg() -> (InstantiateMsg, String) { - let verifier = String::from("verifies"); - let beneficiary = String::from("benefits"); - let creator = String::from("creator"); +fn make_init_msg( + deps: &Instance, +) -> (InstantiateMsg, String) { + let verifier = deps.api().addr_make("verifies").to_string(); + let beneficiary = deps.api().addr_make("benefits").to_string(); + let creator = deps.api().addr_make("creator").to_string(); ( InstantiateMsg { verifier, @@ -55,9 +57,9 @@ fn proper_initialization() { let mut deps = mock_instance(WASM, &[]); assert_eq!(deps.required_capabilities().len(), 0); - let verifier = String::from("verifies"); - let beneficiary = String::from("benefits"); - let creator = String::from("creator"); + let verifier = deps.api().addr_make("verifies").to_string(); + let beneficiary = deps.api().addr_make("benefits").to_string(); + let creator = deps.api().addr_make("creator").to_string(); let expected_state = State { verifier: Addr::unchecked(&verifier), beneficiary: Addr::unchecked(&beneficiary), @@ -91,11 +93,11 @@ fn proper_initialization() { fn instantiate_and_query() { let mut deps = mock_instance(WASM, &[]); - let verifier = String::from("verifies"); - let beneficiary = String::from("benefits"); - let creator = String::from("creator"); + let verifier = deps.api().addr_make("verifies").to_string(); + let beneficiary = deps.api().addr_make("benefits").to_string(); + let creator = deps.api().addr_make("creator").to_string(); let msg = InstantiateMsg { - verifier, + verifier: verifier.clone(), beneficiary, }; let info = mock_info(&creator, &coins(1000, "earth")); @@ -104,7 +106,10 @@ fn instantiate_and_query() { // now let's query let query_response = query(&mut deps, mock_env(), QueryMsg::Verifier {}).unwrap(); - assert_eq!(query_response.as_slice(), b"{\"verifier\":\"verifies\"}"); + assert_eq!( + query_response, + format!("{{\"verifier\":\"{verifier}\"}}").as_bytes() + ); // bad query returns parse error (pass wrong type - this connection is not enforced) let qres = query(&mut deps, mock_env(), ExecuteMsg::Release {}); @@ -116,11 +121,11 @@ fn instantiate_and_query() { fn migrate_verifier() { let mut deps = mock_instance(WASM, &[]); - let verifier = String::from("verifies"); - let beneficiary = String::from("benefits"); - let creator = String::from("creator"); + let verifier = deps.api().addr_make("verifies").to_string(); + let beneficiary = deps.api().addr_make("benefits").to_string(); + let creator = deps.api().addr_make("creator").to_string(); let msg = InstantiateMsg { - verifier, + verifier: verifier.clone(), beneficiary, }; let info = mock_info(&creator, &[]); @@ -129,11 +134,15 @@ fn migrate_verifier() { // check it is 'verifies' let query_response = query(&mut deps, mock_env(), QueryMsg::Verifier {}).unwrap(); - assert_eq!(query_response.as_slice(), b"{\"verifier\":\"verifies\"}"); + assert_eq!( + query_response, + format!("{{\"verifier\":\"{verifier}\"}}").as_bytes() + ); // change the verifier via migrate + let someone_else = deps.api().addr_make("someone else").to_string(); let msg = MigrateMsg { - verifier: String::from("someone else"), + verifier: someone_else.clone(), }; let res: Response = migrate(&mut deps, mock_env(), msg).unwrap(); assert_eq!(0, res.messages.len()); @@ -141,8 +150,8 @@ fn migrate_verifier() { // check it is 'someone else' let query_response = query(&mut deps, mock_env(), QueryMsg::Verifier {}).unwrap(); assert_eq!( - query_response.as_slice(), - b"{\"verifier\":\"someone else\"}" + query_response, + format!("{{\"verifier\":\"{someone_else}\"}}").as_bytes() ); } @@ -150,9 +159,9 @@ fn migrate_verifier() { fn sudo_can_steal_tokens() { let mut deps = mock_instance(WASM, &[]); - let verifier = String::from("verifies"); - let beneficiary = String::from("benefits"); - let creator = String::from("creator"); + let verifier = deps.api().addr_make("verifies").to_string(); + let beneficiary = deps.api().addr_make("benefits").to_string(); + let creator = deps.api().addr_make("creator").to_string(); let msg = InstantiateMsg { verifier, beneficiary, @@ -162,7 +171,7 @@ fn sudo_can_steal_tokens() { assert_eq!(0, res.messages.len()); // sudo takes any tax it wants - let to_address = String::from("community-pool"); + let to_address = deps.api().addr_make("community-pool").to_string(); let amount = coins(700, "gold"); let sys_msg = SudoMsg::StealFunds { recipient: to_address.clone(), @@ -176,7 +185,7 @@ fn sudo_can_steal_tokens() { #[test] fn querier_callbacks_work() { - let rich_addr = String::from("foobar"); + let rich_addr = String::from("cosmwasm1qqvk2mde"); let rich_balance = coins(10000, "gold"); let mut deps = mock_instance_with_balances(WASM, &[(&rich_addr, &rich_balance)]); @@ -211,9 +220,9 @@ fn execute_release_works() { let mut deps = mock_instance(WASM, &[]); // initialize the store - let creator = String::from("creator"); - let verifier = String::from("verifies"); - let beneficiary = String::from("benefits"); + let creator = deps.api().addr_make("creator").to_string(); + let verifier = deps.api().addr_make("verifies").to_string(); + let beneficiary = deps.api().addr_make("benefits").to_string(); let instantiate_msg = InstantiateMsg { verifier: verifier.clone(), @@ -241,13 +250,13 @@ fn execute_release_works() { assert_eq!( msg, &SubMsg::new(BankMsg::Send { - to_address: beneficiary, + to_address: beneficiary.clone(), amount: coins(1000, "earth"), }), ); assert_eq!( execute_res.attributes, - vec![("action", "release"), ("destination", "benefits")], + vec![("action", "release"), ("destination", beneficiary.as_str())], ); assert_eq!(execute_res.data, Some(vec![0xF0, 0x0B, 0xAA].into())); } @@ -257,9 +266,9 @@ fn execute_release_fails_for_wrong_sender() { let mut deps = mock_instance(WASM, &[]); // initialize the store - let creator = String::from("creator"); - let verifier = String::from("verifies"); - let beneficiary = String::from("benefits"); + let creator = deps.api().addr_make("creator").to_string(); + let verifier = deps.api().addr_make("verifies").to_string(); + let beneficiary = deps.api().addr_make("benefits").to_string(); let instantiate_msg = InstantiateMsg { verifier: verifier.clone(), @@ -310,7 +319,7 @@ fn execute_release_fails_for_wrong_sender() { fn execute_cpu_loop() { let mut deps = mock_instance(WASM, &[]); - let (instantiate_msg, creator) = make_init_msg(); + let (instantiate_msg, creator) = make_init_msg(&deps); let init_info = mock_info(creator.as_str(), &[]); let init_res: Response = instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); @@ -332,7 +341,7 @@ fn execute_cpu_loop() { fn execute_storage_loop() { let mut deps = mock_instance(WASM, &[]); - let (instantiate_msg, creator) = make_init_msg(); + let (instantiate_msg, creator) = make_init_msg(&deps); let init_info = mock_info(creator.as_str(), &[]); let init_res: Response = instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); @@ -354,7 +363,7 @@ fn execute_storage_loop() { fn execute_memory_loop() { let mut deps = mock_instance(WASM, &[]); - let (instantiate_msg, creator) = make_init_msg(); + let (instantiate_msg, creator) = make_init_msg(&deps); let init_info = mock_info(creator.as_str(), &[]); let init_res: Response = instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); @@ -379,7 +388,7 @@ fn execute_memory_loop() { fn execute_allocate_large_memory() { let mut deps = mock_instance(WASM, &[]); - let (instantiate_msg, creator) = make_init_msg(); + let (instantiate_msg, creator) = make_init_msg(&deps); let init_info = mock_info(creator.as_str(), &[]); let init_res: Response = instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); @@ -435,7 +444,7 @@ fn execute_allocate_large_memory() { fn execute_panic() { let mut deps = mock_instance(WASM, &[]); - let (instantiate_msg, creator) = make_init_msg(); + let (instantiate_msg, creator) = make_init_msg(&deps); let init_info = mock_info(creator.as_str(), &[]); let init_res: Response = instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); @@ -466,7 +475,7 @@ fn execute_panic() { fn execute_user_errors_in_api_calls() { let mut deps = mock_instance(WASM, &[]); - let (instantiate_msg, creator) = make_init_msg(); + let (instantiate_msg, creator) = make_init_msg(&deps); let init_info = mock_info(creator.as_str(), &[]); let _init_res: Response = instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index c87567cac2..96e29910f0 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -249,6 +249,7 @@ dependencies = [ name = "cosmwasm-vm" version = "1.5.0" dependencies = [ + "bech32", "bitflags", "bytecheck", "bytes", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 63a15bab2a..7d0e5a4570 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -249,6 +249,7 @@ dependencies = [ name = "cosmwasm-vm" version = "1.5.0" dependencies = [ + "bech32", "bitflags", "bytecheck", "bytes", diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 20a8b36568..499dd4186d 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -447,6 +447,7 @@ mod tests { fn proper_handshake_flow() { let mut deps = setup(); let channel_id = "channel-1234"; + let reflect_addr = deps.api.addr_make(REFLECT_ADDR); // first we try to open with a valid handshake let handshake_open = @@ -487,7 +488,7 @@ mod tests { id, gas_used: 1234567, result: SubMsgResult::Ok(SubMsgResponse { - events: fake_events(REFLECT_ADDR), + events: fake_events(reflect_addr.as_str()), msg_responses: vec![], data: None, }), @@ -501,7 +502,7 @@ mod tests { assert_eq!( &res.accounts[0], &AccountInfo { - account: REFLECT_ADDR.into(), + account: reflect_addr.to_string(), channel_id: channel_id.to_string(), } ); @@ -516,7 +517,7 @@ mod tests { ) .unwrap(); let res: AccountResponse = from_json(raw).unwrap(); - assert_eq!(res.account.unwrap(), REFLECT_ADDR); + assert_eq!(res.account.unwrap(), reflect_addr.as_str()); } #[test] @@ -524,7 +525,7 @@ mod tests { let mut deps = setup(); let channel_id = "channel-123"; - let account = "acct-123"; + let account = deps.api.addr_make("acct-123"); // receive a packet for an unregistered channel returns app-level error (not Result::Err) let msgs_to_dispatch = vec![BankMsg::Send { @@ -552,7 +553,7 @@ mod tests { ); // register the channel - connect(deps.as_mut(), channel_id, account); + connect(deps.as_mut(), channel_id, &account); // receive a packet for an unregistered channel returns app-level error (not Result::Err) let msg = mock_ibc_packet_recv(channel_id, &ibc_msg).unwrap(); @@ -573,7 +574,7 @@ mod tests { funds, }) = &res.messages[0].msg { - assert_eq!(account, contract_addr.as_str()); + assert_eq!(account.as_str(), contract_addr); assert_eq!(0, funds.len()); // parse the message - should callback with proper channel_id let rmsg: ReflectExecuteMsg = from_json(msg).unwrap(); @@ -605,19 +606,19 @@ mod tests { let mut deps = setup(); let channel_id = "channel-123"; - let account = "acct-123"; + let account = deps.api.addr_make("acct-123"); // register the channel - connect(deps.as_mut(), channel_id, account); + connect(deps.as_mut(), channel_id, &account); // assign it some funds let funds = vec![coin(123456, "uatom"), coin(7654321, "tgrd")]; - deps.querier.update_balance(account, funds.clone()); + deps.querier.update_balance(&account, funds.clone()); // channel should be listed and have balance let raw = query(deps.as_ref(), mock_env(), QueryMsg::ListAccounts {}).unwrap(); let res: ListAccountsResponse = from_json(raw).unwrap(); assert_eq!(1, res.accounts.len()); - let balance = deps.as_ref().querier.query_all_balances(account).unwrap(); + let balance = deps.as_ref().querier.query_all_balances(&account).unwrap(); assert_eq!(funds, balance); // close the channel @@ -630,7 +631,7 @@ mod tests { contract_addr, msg, .. }) = &res.messages[0].msg { - assert_eq!(contract_addr.as_str(), account); + assert_eq!(contract_addr, account.as_str()); let reflect: ReflectExecuteMsg = from_json(msg).unwrap(); match reflect { ReflectExecuteMsg::ReflectMsg { msgs } => { diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index d7beffc874..975ec9f647 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -139,6 +139,7 @@ fn enforce_version_in_handshake() { fn proper_handshake_flow() { let mut deps = setup(); let channel_id = "channel-432"; + let reflect_addr = deps.api().addr_make(REFLECT_ADDR); // first we try to open with a valid handshake let handshake_open = mock_ibc_channel_open_init(channel_id, IbcOrder::Ordered, IBC_APP_VERSION); @@ -179,7 +180,7 @@ fn proper_handshake_flow() { id, gas_used: 1234567, result: SubMsgResult::Ok(SubMsgResponse { - events: fake_events(REFLECT_ADDR), + events: fake_events(reflect_addr.as_str()), msg_responses: vec![], data: None, }), @@ -194,7 +195,7 @@ fn proper_handshake_flow() { assert_eq!( &res.accounts[0], &AccountInfo { - account: REFLECT_ADDR.into(), + account: reflect_addr.to_string(), channel_id: channel_id.to_string(), } ); @@ -209,7 +210,7 @@ fn proper_handshake_flow() { ) .unwrap(); let res: AccountResponse = from_slice(&raw, DESERIALIZATION_LIMIT).unwrap(); - assert_eq!(res.account.unwrap(), REFLECT_ADDR); + assert_eq!(res.account.unwrap(), reflect_addr.as_str()); } #[test] @@ -217,7 +218,7 @@ fn handle_dispatch_packet() { let mut deps = setup(); let channel_id = "channel-123"; - let account = "acct-123"; + let account = deps.api().addr_make("acct-123"); // receive a packet for an unregistered channel returns app-level error (not Result::Err) let msgs_to_dispatch = vec![BankMsg::Send { @@ -246,7 +247,7 @@ fn handle_dispatch_packet() { ); // register the channel - connect(&mut deps, channel_id, account); + connect(&mut deps, channel_id, &account); // receive a packet for an unregistered channel returns app-level error (not Result::Err) let msg = mock_ibc_packet_recv(channel_id, &ibc_msg).unwrap(); diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 24f9479a69..e59d5f4c32 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -249,6 +249,7 @@ dependencies = [ name = "cosmwasm-vm" version = "1.5.0" dependencies = [ + "bech32", "bitflags", "bytecheck", "bytes", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index eb44b19333..7030aaa127 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -249,6 +249,7 @@ dependencies = [ name = "cosmwasm-vm" version = "1.5.0" dependencies = [ + "bech32", "bitflags", "bytecheck", "bytes", diff --git a/contracts/reflect/src/contract.rs b/contracts/reflect/src/contract.rs index 914c701a53..3421af108f 100644 --- a/contracts/reflect/src/contract.rs +++ b/contracts/reflect/src/contract.rs @@ -301,14 +301,16 @@ mod tests { let _res = instantiate(deps.as_mut(), mock_env(), info, msg).unwrap(); let info = mock_info("creator", &[]); - let new_owner = String::from("friend"); - let msg = ExecuteMsg::ChangeOwner { owner: new_owner }; + let new_owner = deps.api.addr_make("friend"); + let msg = ExecuteMsg::ChangeOwner { + owner: new_owner.to_string(), + }; let res = execute(deps.as_mut(), mock_env(), info, msg).unwrap(); // should change state assert_eq!(0, res.messages.len()); let value = query_owner(deps.as_ref()).unwrap(); - assert_eq!("friend", value.owner.as_str()); + assert_eq!(value.owner, new_owner.as_str()); } #[test] @@ -351,7 +353,7 @@ mod tests { let err = execute(deps.as_mut(), mock_env(), info, msg).unwrap_err(); match err { ReflectError::Std(StdError::GenericErr { msg, .. }) => { - assert!(msg.contains("human address too short")) + assert!(msg.contains("Invalid input")) } e => panic!("Unexpected error: {e:?}"), } diff --git a/contracts/reflect/tests/integration.rs b/contracts/reflect/tests/integration.rs index 23bff83c8f..b3cfda30c8 100644 --- a/contracts/reflect/tests/integration.rs +++ b/contracts/reflect/tests/integration.rs @@ -152,15 +152,17 @@ fn transfer() { let _res: Response = instantiate(&mut deps, mock_env(), info, msg).unwrap(); let info = mock_info("creator", &[]); - let new_owner = String::from("friend"); - let msg = ExecuteMsg::ChangeOwner { owner: new_owner }; + let new_owner = deps.api().addr_make("friend"); + let msg = ExecuteMsg::ChangeOwner { + owner: new_owner.to_string(), + }; let res: Response = execute(&mut deps, mock_env(), info, msg).unwrap(); // should change state assert_eq!(0, res.messages.len()); let res = query(&mut deps, mock_env(), QueryMsg::Owner {}).unwrap(); let value: OwnerResponse = from_json(res).unwrap(); - assert_eq!("friend", value.owner.as_str()); + assert_eq!(value.owner, new_owner.as_str()); } #[test] diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index c1a78d2d31..71ee646e5e 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -249,6 +249,7 @@ dependencies = [ name = "cosmwasm-vm" version = "1.5.0" dependencies = [ + "bech32", "bitflags", "bytecheck", "bytes", diff --git a/contracts/staking/src/contract.rs b/contracts/staking/src/contract.rs index f5ee407776..ff0cbccb92 100644 --- a/contracts/staking/src/contract.rs +++ b/contracts/staking/src/contract.rs @@ -469,7 +469,7 @@ mod tests { deps.querier .update_staking("ustake", &[sample_validator("john")], &[]); - let creator = String::from("creator"); + let creator = deps.api.addr_make("creator").to_string(); let msg = InstantiateMsg { name: "Cool Derivative".to_string(), symbol: "DRV".to_string(), @@ -503,7 +503,7 @@ mod tests { &[], ); - let creator = String::from("creator"); + let creator = deps.api.addr_make("creator").to_string(); let msg = InstantiateMsg { name: "Cool Derivative".to_string(), symbol: "DRV".to_string(), @@ -546,7 +546,7 @@ mod tests { let mut deps = mock_dependencies(); set_validator(&mut deps.querier); - let creator = String::from("creator"); + let creator = deps.api.addr_make("creator").to_string(); let instantiate_msg = default_init(2, 50); let info = mock_info(&creator, &[]); @@ -555,7 +555,7 @@ mod tests { assert_eq!(0, res.messages.len()); // let's bond some tokens now - let bob = String::from("bob"); + let bob = deps.api.addr_make("bob").to_string(); let bond_msg = ExecuteMsg::Bond {}; let info = mock_info(&bob, &[coin(10, "random"), coin(1000, "ustake")]); @@ -586,18 +586,18 @@ mod tests { let mut deps = mock_dependencies(); set_validator(&mut deps.querier); - let creator = String::from("creator"); + let creator = deps.api.addr_make("creator").to_string(); let instantiate_msg = default_init(2, 50); - let info = mock_info(&creator, &[]); + let info = mock_info(creator.as_str(), &[]); // make sure we can instantiate with this let res = instantiate(deps.as_mut(), mock_env(), info, instantiate_msg).unwrap(); assert_eq!(0, res.messages.len()); // let's bond some tokens now - let bob = String::from("bob"); + let bob = deps.api.addr_make("bob").to_string(); let bond_msg = ExecuteMsg::Bond {}; - let info = mock_info(&bob, &[coin(10, "random"), coin(1000, "ustake")]); + let info = mock_info(bob.as_str(), &[coin(10, "random"), coin(1000, "ustake")]); let res = execute(deps.as_mut(), mock_env(), info, bond_msg).unwrap(); assert_eq!(1, res.messages.len()); @@ -622,9 +622,9 @@ mod tests { assert_eq!(invest.nominal_value, ratio); // we bond some other tokens and get a different issuance price (maintaining the ratio) - let alice = String::from("alice"); + let alice = deps.api.addr_make("alice").to_string(); let bond_msg = ExecuteMsg::Bond {}; - let info = mock_info(&alice, &[coin(3000, "ustake")]); + let info = mock_info(alice.as_str(), &[coin(3000, "ustake")]); let res = execute(deps.as_mut(), mock_env(), info, bond_msg).unwrap(); assert_eq!(1, res.messages.len()); @@ -632,7 +632,10 @@ mod tests { set_delegation(&mut deps.querier, 3000, "ustake"); // alice should have gotten 2000 DRV for the 3000 stake, keeping the ratio at 1.5 - assert_eq!(get_balance(deps.as_ref(), &alice), Uint128::new(2000)); + assert_eq!( + get_balance(deps.as_ref(), alice.as_str()), + Uint128::new(2000) + ); let invest = query_investment(deps.as_ref()).unwrap(); assert_eq!(invest.token_supply, Uint128::new(3000)); @@ -645,18 +648,18 @@ mod tests { let mut deps = mock_dependencies(); set_validator(&mut deps.querier); - let creator = String::from("creator"); + let creator = deps.api.addr_make("creator").to_string(); let instantiate_msg = default_init(2, 50); - let info = mock_info(&creator, &[]); + let info = mock_info(creator.as_str(), &[]); // make sure we can instantiate with this let res = instantiate(deps.as_mut(), mock_env(), info, instantiate_msg).unwrap(); assert_eq!(0, res.messages.len()); // let's bond some tokens now - let bob = String::from("bob"); + let bob = deps.api.addr_make("bob").to_string(); let bond_msg = ExecuteMsg::Bond {}; - let info = mock_info(&bob, &[coin(500, "photon")]); + let info = mock_info(bob.as_str(), &[coin(500, "photon")]); // try to bond and make sure we trigger delegation let res = execute(deps.as_mut(), mock_env(), info, bond_msg); @@ -673,18 +676,18 @@ mod tests { let mut deps = mock_dependencies(); set_validator(&mut deps.querier); - let creator = String::from("creator"); + let creator = deps.api.addr_make("creator").to_string(); let instantiate_msg = default_init(10, 50); - let info = mock_info(&creator, &[]); + let info = mock_info(creator.as_str(), &[]); // make sure we can instantiate with this let res = instantiate(deps.as_mut(), mock_env(), info, instantiate_msg).unwrap(); assert_eq!(0, res.messages.len()); // let's bond some tokens now - let bob = String::from("bob"); + let bob = deps.api.addr_make("bob").to_string(); let bond_msg = ExecuteMsg::Bond {}; - let info = mock_info(&bob, &[coin(10, "random"), coin(1000, "ustake")]); + let info = mock_info(bob.as_str(), &[coin(10, "random"), coin(1000, "ustake")]); let res = execute(deps.as_mut(), mock_env(), info, bond_msg).unwrap(); assert_eq!(1, res.messages.len()); @@ -707,7 +710,7 @@ mod tests { let unbond_msg = ExecuteMsg::Unbond { amount: Uint128::new(600), }; - let info = mock_info(&creator, &[]); + let info = mock_info(creator.as_str(), &[]); let res = execute(deps.as_mut(), mock_env(), info, unbond_msg); match res.unwrap_err() { StakingError::Std { @@ -725,7 +728,7 @@ mod tests { let owner_cut = Uint128::new(60); let bobs_claim = Uint128::new(810); let bobs_balance = Uint128::new(400); - let info = mock_info(&bob, &[]); + let info = mock_info(bob.as_str(), &[]); let res = execute(deps.as_mut(), mock_env(), info, unbond_msg).unwrap(); assert_eq!(1, res.messages.len()); let delegate = &res.messages[0].msg; @@ -741,10 +744,10 @@ mod tests { set_delegation(&mut deps.querier, 690, "ustake"); // check balances - assert_eq!(get_balance(deps.as_ref(), &bob), bobs_balance); - assert_eq!(get_balance(deps.as_ref(), &creator), owner_cut); + assert_eq!(get_balance(deps.as_ref(), bob.as_str()), bobs_balance); + assert_eq!(get_balance(deps.as_ref(), creator.as_str()), owner_cut); // proper claims - assert_eq!(get_claims(deps.as_ref(), &bob), bobs_claim); + assert_eq!(get_claims(deps.as_ref(), bob.as_str()), bobs_claim); // supplies updated, ratio the same (1.5) let ratio = Decimal::from_str("1.5").unwrap(); diff --git a/contracts/staking/tests/integration.rs b/contracts/staking/tests/integration.rs index 23355ba932..badd4e4b87 100644 --- a/contracts/staking/tests/integration.rs +++ b/contracts/staking/tests/integration.rs @@ -51,7 +51,7 @@ fn initialization_with_missing_validator() { let (instance_options, memory_limit) = mock_instance_options(); let mut deps = Instance::from_code(WASM, backend, instance_options, memory_limit).unwrap(); - let creator = String::from("creator"); + let creator = deps.api().addr_make("creator").to_string(); let msg = InstantiateMsg { name: "Cool Derivative".to_string(), symbol: "DRV".to_string(), @@ -89,7 +89,7 @@ fn proper_initialization() { assert_eq!(deps.required_capabilities().len(), 1); assert!(deps.required_capabilities().contains("staking")); - let creator = String::from("creator"); + let creator = deps.api().addr_make("creator").to_string(); let msg = InstantiateMsg { name: "Cool Derivative".to_string(), symbol: "DRV".to_string(), diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 78a107c138..945b91eeca 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -249,6 +249,7 @@ dependencies = [ name = "cosmwasm-vm" version = "1.5.0" dependencies = [ + "bech32", "bitflags", "bytecheck", "bytes", From d20bc91446908b47b56eda74470637e8cb4e0c43 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 4 Dec 2023 10:28:08 +0000 Subject: [PATCH 1042/2372] Fix vm tests --- packages/vm/benches/main.rs | 12 +++++++++--- packages/vm/src/calls.rs | 3 ++- packages/vm/src/testing/mock.rs | 4 ++-- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/vm/benches/main.rs b/packages/vm/benches/main.rs index a6410fab89..9f47467131 100644 --- a/packages/vm/benches/main.rs +++ b/packages/vm/benches/main.rs @@ -58,8 +58,13 @@ fn bench_instance(c: &mut Criterion) { let verifier = instance.api().addr_make("verifies"); let beneficiary = instance.api().addr_make("benefits"); let msg = format!(r#"{{"verifier": "{verifier}", "beneficiary": "{beneficiary}"}}"#); - let contract_result = - call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); + let contract_result = call_instantiate::<_, _, _, Empty>( + &mut instance, + &mock_env(), + &info, + msg.as_bytes(), + ) + .unwrap(); assert!(contract_result.into_result().is_ok()); }); }); @@ -77,7 +82,8 @@ fn bench_instance(c: &mut Criterion) { let beneficiary = instance.api().addr_make("benefits"); let msg = format!(r#"{{"verifier": "{verifier}", "beneficiary": "{beneficiary}"}}"#); let contract_result = - call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); + call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg.as_bytes()) + .unwrap(); assert!(contract_result.into_result().is_ok()); b.iter(|| { diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 6b648b9136..872cd971c8 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -934,7 +934,8 @@ mod tests { #[test] fn call_ibc_channel_close_works() { let mut instance = mock_instance(CONTRACT, &[]); - setup(&mut instance, CHANNEL_ID, ACCOUNT); + let account = instance.api().addr_make(ACCOUNT); + setup(&mut instance, CHANNEL_ID, &account); let handshake_close = mock_ibc_channel_close_init(CHANNEL_ID, IbcOrder::Ordered, IBC_VERSION); call_ibc_channel_close::<_, _, _, Empty>(&mut instance, &mock_env(), &handshake_close) diff --git a/packages/vm/src/testing/mock.rs b/packages/vm/src/testing/mock.rs index c604535b35..8994321299 100644 --- a/packages/vm/src/testing/mock.rs +++ b/packages/vm/src/testing/mock.rs @@ -151,7 +151,7 @@ impl BackendApi for MockApi { MockApi::Bech32 { bech32_prefix } => *bech32_prefix, }; - try_br!((validate_length(canonical.as_ref()), gas_info)); + try_br!((validate_length(canonical), gas_info)); let result = encode(bech32_prefix, canonical.to_base32(), Variant::Bech32) .map_err(|_| BackendError::user_err("Invalid canonical address")); @@ -249,7 +249,7 @@ mod tests { // normalizes input let original = "JUNO1MEPRU9FUQ4E65856ARD6068MFSFRWPGEMD0C3R"; - let canonical = api.canonical_address(&original).0.unwrap(); + let canonical = api.canonical_address(original).0.unwrap(); let recovered = api.human_address(&canonical).0.unwrap(); assert_eq!(recovered, original.to_lowercase()); From 6ec5ea08ab0dc025b9d892cab607867db32cc8c6 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 4 Dec 2023 10:28:14 +0000 Subject: [PATCH 1043/2372] Fix contract tests --- contracts/hackatom/tests/integration.rs | 46 ++++++++++++------------- contracts/staking/tests/integration.rs | 4 +-- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/contracts/hackatom/tests/integration.rs b/contracts/hackatom/tests/integration.rs index d5560bf2a0..2cd8146d3a 100644 --- a/contracts/hackatom/tests/integration.rs +++ b/contracts/hackatom/tests/integration.rs @@ -40,9 +40,9 @@ const DESERIALIZATION_LIMIT: usize = 20_000; fn make_init_msg( deps: &Instance, ) -> (InstantiateMsg, String) { - let verifier = deps.api().addr_make("verifies").to_string(); - let beneficiary = deps.api().addr_make("benefits").to_string(); - let creator = deps.api().addr_make("creator").to_string(); + let verifier = deps.api().addr_make("verifies"); + let beneficiary = deps.api().addr_make("benefits"); + let creator = deps.api().addr_make("creator"); ( InstantiateMsg { verifier, @@ -57,9 +57,9 @@ fn proper_initialization() { let mut deps = mock_instance(WASM, &[]); assert_eq!(deps.required_capabilities().len(), 0); - let verifier = deps.api().addr_make("verifies").to_string(); - let beneficiary = deps.api().addr_make("benefits").to_string(); - let creator = deps.api().addr_make("creator").to_string(); + let verifier = deps.api().addr_make("verifies"); + let beneficiary = deps.api().addr_make("benefits"); + let creator = deps.api().addr_make("creator"); let expected_state = State { verifier: Addr::unchecked(&verifier), beneficiary: Addr::unchecked(&beneficiary), @@ -93,9 +93,9 @@ fn proper_initialization() { fn instantiate_and_query() { let mut deps = mock_instance(WASM, &[]); - let verifier = deps.api().addr_make("verifies").to_string(); - let beneficiary = deps.api().addr_make("benefits").to_string(); - let creator = deps.api().addr_make("creator").to_string(); + let verifier = deps.api().addr_make("verifies"); + let beneficiary = deps.api().addr_make("benefits"); + let creator = deps.api().addr_make("creator"); let msg = InstantiateMsg { verifier: verifier.clone(), beneficiary, @@ -121,9 +121,9 @@ fn instantiate_and_query() { fn migrate_verifier() { let mut deps = mock_instance(WASM, &[]); - let verifier = deps.api().addr_make("verifies").to_string(); - let beneficiary = deps.api().addr_make("benefits").to_string(); - let creator = deps.api().addr_make("creator").to_string(); + let verifier = deps.api().addr_make("verifies"); + let beneficiary = deps.api().addr_make("benefits"); + let creator = deps.api().addr_make("creator"); let msg = InstantiateMsg { verifier: verifier.clone(), beneficiary, @@ -140,7 +140,7 @@ fn migrate_verifier() { ); // change the verifier via migrate - let someone_else = deps.api().addr_make("someone else").to_string(); + let someone_else = deps.api().addr_make("someone else"); let msg = MigrateMsg { verifier: someone_else.clone(), }; @@ -159,9 +159,9 @@ fn migrate_verifier() { fn sudo_can_steal_tokens() { let mut deps = mock_instance(WASM, &[]); - let verifier = deps.api().addr_make("verifies").to_string(); - let beneficiary = deps.api().addr_make("benefits").to_string(); - let creator = deps.api().addr_make("creator").to_string(); + let verifier = deps.api().addr_make("verifies"); + let beneficiary = deps.api().addr_make("benefits"); + let creator = deps.api().addr_make("creator"); let msg = InstantiateMsg { verifier, beneficiary, @@ -171,7 +171,7 @@ fn sudo_can_steal_tokens() { assert_eq!(0, res.messages.len()); // sudo takes any tax it wants - let to_address = deps.api().addr_make("community-pool").to_string(); + let to_address = deps.api().addr_make("community-pool"); let amount = coins(700, "gold"); let sys_msg = SudoMsg::StealFunds { recipient: to_address.clone(), @@ -220,9 +220,9 @@ fn execute_release_works() { let mut deps = mock_instance(WASM, &[]); // initialize the store - let creator = deps.api().addr_make("creator").to_string(); - let verifier = deps.api().addr_make("verifies").to_string(); - let beneficiary = deps.api().addr_make("benefits").to_string(); + let creator = deps.api().addr_make("creator"); + let verifier = deps.api().addr_make("verifies"); + let beneficiary = deps.api().addr_make("benefits"); let instantiate_msg = InstantiateMsg { verifier: verifier.clone(), @@ -266,9 +266,9 @@ fn execute_release_fails_for_wrong_sender() { let mut deps = mock_instance(WASM, &[]); // initialize the store - let creator = deps.api().addr_make("creator").to_string(); - let verifier = deps.api().addr_make("verifies").to_string(); - let beneficiary = deps.api().addr_make("benefits").to_string(); + let creator = deps.api().addr_make("creator"); + let verifier = deps.api().addr_make("verifies"); + let beneficiary = deps.api().addr_make("benefits"); let instantiate_msg = InstantiateMsg { verifier: verifier.clone(), diff --git a/contracts/staking/tests/integration.rs b/contracts/staking/tests/integration.rs index badd4e4b87..45012ee4cb 100644 --- a/contracts/staking/tests/integration.rs +++ b/contracts/staking/tests/integration.rs @@ -51,7 +51,7 @@ fn initialization_with_missing_validator() { let (instance_options, memory_limit) = mock_instance_options(); let mut deps = Instance::from_code(WASM, backend, instance_options, memory_limit).unwrap(); - let creator = deps.api().addr_make("creator").to_string(); + let creator = deps.api().addr_make("creator"); let msg = InstantiateMsg { name: "Cool Derivative".to_string(), symbol: "DRV".to_string(), @@ -89,7 +89,7 @@ fn proper_initialization() { assert_eq!(deps.required_capabilities().len(), 1); assert!(deps.required_capabilities().contains("staking")); - let creator = deps.api().addr_make("creator").to_string(); + let creator = deps.api().addr_make("creator"); let msg = InstantiateMsg { name: "Cool Derivative".to_string(), symbol: "DRV".to_string(), From 966bd0acb9fec5928248afc90be49fbfd4ffe443 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 4 Dec 2023 11:57:01 +0000 Subject: [PATCH 1044/2372] Add colon bech32 test --- packages/std/src/testing/mock.rs | 13 +++++++++++++ packages/vm/src/testing/mock.rs | 15 +++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 25a84aca99..d40e7554db 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -2317,6 +2317,19 @@ mod tests { ); } + #[test] + fn colon_in_prefix_is_valid() { + let mock_api = MockApi::default().with_prefix("did:com:"); + let addr = mock_api + .addr_validate("did:com:1jkf0kmeyefvyzpwf56m7sne2000ay53r6upttu") + .unwrap(); + + assert_eq!( + addr.as_str(), + "did:com:1jkf0kmeyefvyzpwf56m7sne2000ay53r6upttu" + ); + } + #[test] #[should_panic(expected = "Generating address failed with reason: invalid length")] fn making_an_address_with_empty_prefix_should_panic() { diff --git a/packages/vm/src/testing/mock.rs b/packages/vm/src/testing/mock.rs index 8994321299..58b568d0d5 100644 --- a/packages/vm/src/testing/mock.rs +++ b/packages/vm/src/testing/mock.rs @@ -297,4 +297,19 @@ mod tests { .unwrap_err(), BackendError::UserErr { msg } if msg.contains("address length"))); } + + #[test] + fn colon_in_prefix_is_valid() { + let mock_api = MockApi::default().with_prefix("did:com:"); + let bytes = mock_api + .canonical_address("did:com:1jkf0kmeyefvyzpwf56m7sne2000ay53r6upttu") + .0 + .unwrap(); + let humanized = mock_api.human_address(&bytes).0.unwrap(); + + assert_eq!( + humanized.as_str(), + "did:com:1jkf0kmeyefvyzpwf56m7sne2000ay53r6upttu" + ); + } } From 5cd6f83331d06eed1ffb17b427460e932dd9996b Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 11 Dec 2023 13:21:43 +0100 Subject: [PATCH 1045/2372] Make integration test pass on latest Rust --- contracts/hackatom/tests/integration.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/hackatom/tests/integration.rs b/contracts/hackatom/tests/integration.rs index 1a73fe88f3..8312ab251e 100644 --- a/contracts/hackatom/tests/integration.rs +++ b/contracts/hackatom/tests/integration.rs @@ -453,7 +453,8 @@ fn execute_panic() { match execute_res.unwrap_err() { VmError::RuntimeErr { msg, .. } => { assert!( - msg.contains("Aborted: panicked at 'This page intentionally faulted'"), + msg.contains("Aborted: panicked") + && msg.contains("This page intentionally faulted"), "Must contain panic message" ); assert!(msg.contains("contract.rs:"), "Must contain file and line"); From 2be2cf4ae4fd2daa783fe1953c14f36acf87bba2 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 11 Dec 2023 13:52:52 +0100 Subject: [PATCH 1046/2372] Add readme note about panic message --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index d79dabc345..30f40e051f 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,11 @@ This code is compiled into Wasm bytecode as part of the smart contract. some given source code, allowing a [similar contract verification algorithm](https://medium.com/coinmonks/how-to-verify-and-publish-on-etherscan-52cf25312945) as Etherscan. + + Building locally instead of using the docker image can + [leak some information about the directory structure of your system](https://github.com/CosmWasm/cosmwasm/issues/1918) + and makes the build non-reproducible. + - [serde-json-wasm](https://github.com/CosmWasm/serde-json-wasm) - A custom json library, forked from `serde-json-core`. This provides an interface similar to `serde-json`, but without any floating-point instructions (non-deterministic) From aa8663d8f1e5a72e471e12e57759f5810c098347 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 11 Dec 2023 16:43:08 +0100 Subject: [PATCH 1047/2372] Pass api to make_init_msg --- contracts/hackatom/tests/integration.rs | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/contracts/hackatom/tests/integration.rs b/contracts/hackatom/tests/integration.rs index 2cd8146d3a..2d1311e78c 100644 --- a/contracts/hackatom/tests/integration.rs +++ b/contracts/hackatom/tests/integration.rs @@ -27,7 +27,7 @@ use cosmwasm_vm::{ execute, instantiate, migrate, mock_env, mock_info, mock_instance, mock_instance_with_balances, query, sudo, test_io, MockApi, MOCK_CONTRACT_ADDR, }, - Instance, Querier, Storage, VmError, + Storage, VmError, }; use hackatom::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg, SudoMsg}; @@ -37,12 +37,10 @@ static WASM: &[u8] = include_bytes!("../target/wasm32-unknown-unknown/release/ha const DESERIALIZATION_LIMIT: usize = 20_000; -fn make_init_msg( - deps: &Instance, -) -> (InstantiateMsg, String) { - let verifier = deps.api().addr_make("verifies"); - let beneficiary = deps.api().addr_make("benefits"); - let creator = deps.api().addr_make("creator"); +fn make_init_msg(api: &MockApi) -> (InstantiateMsg, String) { + let verifier = api.addr_make("verifies"); + let beneficiary = api.addr_make("benefits"); + let creator = api.addr_make("creator"); ( InstantiateMsg { verifier, @@ -319,7 +317,7 @@ fn execute_release_fails_for_wrong_sender() { fn execute_cpu_loop() { let mut deps = mock_instance(WASM, &[]); - let (instantiate_msg, creator) = make_init_msg(&deps); + let (instantiate_msg, creator) = make_init_msg(deps.api()); let init_info = mock_info(creator.as_str(), &[]); let init_res: Response = instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); @@ -341,7 +339,7 @@ fn execute_cpu_loop() { fn execute_storage_loop() { let mut deps = mock_instance(WASM, &[]); - let (instantiate_msg, creator) = make_init_msg(&deps); + let (instantiate_msg, creator) = make_init_msg(deps.api()); let init_info = mock_info(creator.as_str(), &[]); let init_res: Response = instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); @@ -363,7 +361,7 @@ fn execute_storage_loop() { fn execute_memory_loop() { let mut deps = mock_instance(WASM, &[]); - let (instantiate_msg, creator) = make_init_msg(&deps); + let (instantiate_msg, creator) = make_init_msg(deps.api()); let init_info = mock_info(creator.as_str(), &[]); let init_res: Response = instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); @@ -388,7 +386,7 @@ fn execute_memory_loop() { fn execute_allocate_large_memory() { let mut deps = mock_instance(WASM, &[]); - let (instantiate_msg, creator) = make_init_msg(&deps); + let (instantiate_msg, creator) = make_init_msg(deps.api()); let init_info = mock_info(creator.as_str(), &[]); let init_res: Response = instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); @@ -444,7 +442,7 @@ fn execute_allocate_large_memory() { fn execute_panic() { let mut deps = mock_instance(WASM, &[]); - let (instantiate_msg, creator) = make_init_msg(&deps); + let (instantiate_msg, creator) = make_init_msg(deps.api()); let init_info = mock_info(creator.as_str(), &[]); let init_res: Response = instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); @@ -475,7 +473,7 @@ fn execute_panic() { fn execute_user_errors_in_api_calls() { let mut deps = mock_instance(WASM, &[]); - let (instantiate_msg, creator) = make_init_msg(&deps); + let (instantiate_msg, creator) = make_init_msg(deps.api()); let init_info = mock_info(creator.as_str(), &[]); let _init_res: Response = instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); From c4de1632091602f66fabbbd720ba5a5cbfe8d9e4 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 11 Dec 2023 17:27:18 +0100 Subject: [PATCH 1048/2372] Improve humanize empty addr test --- packages/std/src/testing/mock.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index d40e7554db..5fb3b6b153 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -1241,11 +1241,13 @@ mod tests { } #[test] - #[should_panic(expected = "Invalid canonical address length")] fn addr_humanize_input_length() { let api = MockApi::default(); let input = CanonicalAddr::from(vec![]); - api.addr_humanize(&input).unwrap(); + assert_eq!( + api.addr_humanize(&input).unwrap_err(), + StdError::generic_err("Invalid canonical address length") + ); } // Basic "works" test. Exhaustive tests on VM's side (packages/vm/src/imports.rs) From 71b9573a26d969829eafa98499d7c30e6ca3bd8c Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 11 Dec 2023 17:47:28 +0100 Subject: [PATCH 1049/2372] Use match for validating length --- packages/std/src/testing/mock.rs | 6 +++--- packages/vm/src/testing/mock.rs | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 5fb3b6b153..71356f74c3 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -253,10 +253,10 @@ impl MockApi { /// Does basic validation of the number of bytes in a canonical address fn validate_length(bytes: &[u8]) -> StdResult<()> { - if !(1..=255).contains(&bytes.len()) { - return Err(StdError::generic_err("Invalid canonical address length")); + match bytes.len() { + 1..=255 => Ok(()), + _ => Err(StdError::generic_err("Invalid canonical address length")), } - Ok(()) } /// Returns a default enviroment with height, time, chain_id, and contract address diff --git a/packages/vm/src/testing/mock.rs b/packages/vm/src/testing/mock.rs index 58b568d0d5..25e5f888d2 100644 --- a/packages/vm/src/testing/mock.rs +++ b/packages/vm/src/testing/mock.rs @@ -162,10 +162,10 @@ impl BackendApi for MockApi { /// Does basic validation of the number of bytes in a canonical address fn validate_length(bytes: &[u8]) -> Result<(), BackendError> { - if !(1..=255).contains(&bytes.len()) { - return Err(BackendError::user_err("Invalid canonical address length")); + match bytes.len() { + 1..=255 => Ok(()), + _ => Err(BackendError::user_err("Invalid canonical address length")), } - Ok(()) } /// Returns a default enviroment with height, time, chain_id, and contract address From 51a500f36812c63148d1a91a9cfecc36bf368cfa Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 12 Dec 2023 09:28:49 +0100 Subject: [PATCH 1050/2372] Improve MockApi canonicalize error handling --- contracts/reflect/src/contract.rs | 2 +- packages/std/src/testing/mock.rs | 21 +++++++++++++-------- packages/vm/src/testing/mock.rs | 23 +++++++++++++++++------ 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/contracts/reflect/src/contract.rs b/contracts/reflect/src/contract.rs index 3421af108f..0aa15d3459 100644 --- a/contracts/reflect/src/contract.rs +++ b/contracts/reflect/src/contract.rs @@ -353,7 +353,7 @@ mod tests { let err = execute(deps.as_mut(), mock_env(), info, msg).unwrap_err(); match err { ReflectError::Std(StdError::GenericErr { msg, .. }) => { - assert!(msg.contains("Invalid input")) + assert!(msg.contains("Error decoding bech32")) } e => panic!("Unexpected error: {e:?}"), } diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 71356f74c3..8c1a7c0942 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -126,15 +126,20 @@ impl Api for MockApi { } fn addr_canonicalize(&self, input: &str) -> StdResult { - if let Ok((prefix, decoded, Variant::Bech32)) = decode(input) { - if prefix == self.bech32_prefix { - if let Ok(bytes) = Vec::::from_base32(&decoded) { + match decode(input) { + Ok((prefix, _, _)) if prefix != self.bech32_prefix => { + Err(StdError::generic_err("Wrong bech32 prefix")) + } + Ok((_, _, Variant::Bech32m)) => Err(StdError::generic_err("Wrong bech32 variant")), + Err(_) => Err(StdError::generic_err("Error decoding bech32")), + Ok((_, decoded, Variant::Bech32)) => match Vec::::from_base32(&decoded) { + Ok(bytes) => { validate_length(&bytes)?; - return Ok(bytes.into()); + Ok(bytes.into()) } - } + Err(_) => Err(StdError::generic_err("Invalid bech32 data")), + }, } - Err(StdError::generic_err("Invalid input")) } fn addr_humanize(&self, canonical: &CanonicalAddr) -> StdResult { @@ -1235,9 +1240,9 @@ mod tests { fn addr_canonicalize_long_input() { let api = MockApi::default(); let human = - "some-extremely-long-address-some-extremely-long-address-some-extremely-long-address-some-extremely-long-address"; + "cosmwasm1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqehqqkz"; let err = api.addr_canonicalize(human).unwrap_err(); - assert!(err.to_string().contains("Invalid input")); + assert!(err.to_string().contains("Invalid canonical address length")); } #[test] diff --git a/packages/vm/src/testing/mock.rs b/packages/vm/src/testing/mock.rs index 25e5f888d2..024f65c62d 100644 --- a/packages/vm/src/testing/mock.rs +++ b/packages/vm/src/testing/mock.rs @@ -131,15 +131,26 @@ impl BackendApi for MockApi { MockApi::Bech32 { bech32_prefix } => *bech32_prefix, }; - if let Ok((prefix, decoded, Variant::Bech32)) = decode(input) { - if prefix == bech32_prefix { - if let Ok(bytes) = Vec::::from_base32(&decoded) { + match decode(input) { + Ok((prefix, _, _)) if prefix != bech32_prefix => { + (Err(BackendError::user_err("Wrong bech32 prefix")), gas_info) + } + Ok((_, _, Variant::Bech32m)) => ( + Err(BackendError::user_err("Wrong bech32 variant")), + gas_info, + ), + Err(_) => ( + Err(BackendError::user_err("Error decoding bech32")), + gas_info, + ), + Ok((_, decoded, Variant::Bech32)) => match Vec::::from_base32(&decoded) { + Ok(bytes) => { try_br!((validate_length(&bytes), gas_info)); - return (Ok(bytes), gas_info); + (Ok(bytes), gas_info) } - } + Err(_) => (Err(BackendError::user_err("Invalid bech32 data")), gas_info), + }, } - (Err(BackendError::user_err("Invalid input")), gas_info) } fn human_address(&self, canonical: &[u8]) -> BackendResult { From ae7550532a95109d6bd55d0594025bca0faee156 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 12 Dec 2023 10:08:29 +0100 Subject: [PATCH 1051/2372] Fix humanize error message --- packages/std/src/testing/mock.rs | 2 +- packages/vm/src/testing/mock.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 8c1a7c0942..79cb42a1e4 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -151,7 +151,7 @@ impl Api for MockApi { Variant::Bech32, ) .map(Addr::unchecked) - .map_err(|_| StdError::generic_err("Invalid canonical address")) + .map_err(|_| StdError::generic_err("Invalid bech32 prefix")) } fn secp256k1_verify( diff --git a/packages/vm/src/testing/mock.rs b/packages/vm/src/testing/mock.rs index 024f65c62d..0dcedaac07 100644 --- a/packages/vm/src/testing/mock.rs +++ b/packages/vm/src/testing/mock.rs @@ -165,7 +165,7 @@ impl BackendApi for MockApi { try_br!((validate_length(canonical), gas_info)); let result = encode(bech32_prefix, canonical.to_base32(), Variant::Bech32) - .map_err(|_| BackendError::user_err("Invalid canonical address")); + .map_err(|_| BackendError::user_err("Invalid bech32 prefix")); (result, gas_info) } From 4a76d94f74bcd7fa199f4353f00742226d62fca0 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 12 Dec 2023 10:21:59 +0100 Subject: [PATCH 1052/2372] Hide MockApi enum --- packages/vm/src/testing/mock.rs | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/packages/vm/src/testing/mock.rs b/packages/vm/src/testing/mock.rs index 0dcedaac07..b5823e83c6 100644 --- a/packages/vm/src/testing/mock.rs +++ b/packages/vm/src/testing/mock.rs @@ -42,7 +42,10 @@ pub fn mock_backend_with_balances( /// trims off zeros for the reverse operation. /// This is not really smart, but allows us to see a difference (and consistent length for canonical adddresses). #[derive(Copy, Clone)] -pub enum MockApi { +pub struct MockApi(MockApiImpl); + +#[derive(Copy, Clone)] +enum MockApiImpl { /// With this variant, all calls to the API fail with BackendError::Unknown /// containing the given message Error(&'static str), @@ -55,7 +58,7 @@ pub enum MockApi { impl MockApi { pub fn new_failing(backend_error: &'static str) -> Self { - MockApi::Error(backend_error) + Self(MockApiImpl::Error(backend_error)) } /// Returns [MockApi] with Bech32 prefix set to provided value. @@ -74,9 +77,9 @@ impl MockApi { /// assert_eq!(addr.as_str(), "juno1h34lmpywh4upnjdg90cjf4j70aee6z8qqfspugamjp42e4q28kqsksmtyp"); /// ``` pub fn with_prefix(self, prefix: &'static str) -> Self { - Self::Bech32 { + Self(MockApiImpl::Bech32 { bech32_prefix: prefix, - } + }) } /// Returns an address built from provided input string. @@ -100,9 +103,9 @@ impl MockApi { /// pub fn addr_make(&self, input: &str) -> String { // handle error case - let bech32_prefix = match self { - MockApi::Error(e) => panic!("Generating address failed: {e}"), - MockApi::Bech32 { bech32_prefix } => *bech32_prefix, + let bech32_prefix = match self.0 { + MockApiImpl::Error(e) => panic!("Generating address failed: {e}"), + MockApiImpl::Bech32 { bech32_prefix } => bech32_prefix, }; let digest = Sha256::digest(input).to_vec(); @@ -115,9 +118,9 @@ impl MockApi { impl Default for MockApi { fn default() -> Self { - MockApi::Bech32 { + Self(MockApiImpl::Bech32 { bech32_prefix: BECH32_PREFIX, - } + }) } } @@ -126,9 +129,9 @@ impl BackendApi for MockApi { let gas_info = GasInfo::with_cost(GAS_COST_CANONICALIZE); // handle error case - let bech32_prefix = match self { - MockApi::Error(e) => return (Err(BackendError::unknown(*e)), gas_info), - MockApi::Bech32 { bech32_prefix } => *bech32_prefix, + let bech32_prefix = match self.0 { + MockApiImpl::Error(e) => return (Err(BackendError::unknown(e)), gas_info), + MockApiImpl::Bech32 { bech32_prefix } => bech32_prefix, }; match decode(input) { @@ -157,9 +160,9 @@ impl BackendApi for MockApi { let gas_info = GasInfo::with_cost(GAS_COST_HUMANIZE); // handle error case - let bech32_prefix = match self { - MockApi::Error(e) => return (Err(BackendError::unknown(*e)), gas_info), - MockApi::Bech32 { bech32_prefix } => *bech32_prefix, + let bech32_prefix = match self.0 { + MockApiImpl::Error(e) => return (Err(BackendError::unknown(e)), gas_info), + MockApiImpl::Bech32 { bech32_prefix } => bech32_prefix, }; try_br!((validate_length(canonical), gas_info)); From 5c81608fe31a19e706c308f6b8c5968457b90546 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 12 Dec 2023 13:11:15 +0100 Subject: [PATCH 1053/2372] Bring back test --- packages/std/src/testing/mock.rs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 79cb42a1e4..4a21d87d43 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -2342,4 +2342,27 @@ mod tests { fn making_an_address_with_empty_prefix_should_panic() { MockApi::default().with_prefix("").addr_make("creator"); } + + #[test] + #[cfg(feature = "cosmwasm_1_3")] + fn distribution_querier_new_works() { + let addresses = [ + ("addr0000".to_string(), "addr0001".to_string()), + ("addr0002".to_string(), "addr0001".to_string()), + ]; + let btree_map = BTreeMap::from(addresses.clone()); + + // should still work with HashMap + let hashmap = HashMap::from(addresses.clone()); + let querier = DistributionQuerier::new(hashmap); + assert_eq!(querier.withdraw_addresses, btree_map); + + // should work with BTreeMap + let querier = DistributionQuerier::new(btree_map.clone()); + assert_eq!(querier.withdraw_addresses, btree_map); + + // should work with array + let querier = DistributionQuerier::new(addresses); + assert_eq!(querier.withdraw_addresses, btree_map); + } } From 3404ef58ca15387155b847b337ecf10b93265c82 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 12 Dec 2023 17:35:50 +0100 Subject: [PATCH 1054/2372] Fix vm MockApi test --- packages/vm/src/imports.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index b0ef67b930..d1c245d30b 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -1085,7 +1085,7 @@ mod tests { let res = do_addr_validate(fe_mut.as_mut(), source_ptr3).unwrap(); assert_ne!(res, 0); let err = String::from_utf8(force_read(&mut fe_mut, res)).unwrap(); - assert_eq!(err, "Invalid input"); + assert_eq!(err, "Error decoding bech32"); } #[test] From b7b91ff76ca04b43841b037046c2337bf9c01a88 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 13 Dec 2023 11:04:23 +0100 Subject: [PATCH 1055/2372] Add changelog entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cace6726f..9ddeda11e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -64,6 +64,8 @@ and this project adheres to - cosmwasm-vm: Removed `backtraces` feature, use the `RUST_BACKTRACE=1` env variable instead. All `VmError` variants now have a `backtrace` field. ([#1967]) +- cosmwasm-std: Replace `MockApi` with bech32 implementation. ([#1914]) +- cosmwasm-vm: Replace `MockApi` with bech32 implementation. ([#1914]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 @@ -72,6 +74,7 @@ and this project adheres to [#1884]: https://github.com/CosmWasm/cosmwasm/pull/1884 [#1898]: https://github.com/CosmWasm/cosmwasm/pull/1898 [#1902]: https://github.com/CosmWasm/cosmwasm/pull/1902 +[#1914]: https://github.com/CosmWasm/cosmwasm/pull/1914 [#1926]: https://github.com/CosmWasm/cosmwasm/pull/1926 [#1933]: https://github.com/CosmWasm/cosmwasm/pull/1933 [#1939]: https://github.com/CosmWasm/cosmwasm/pull/1939 From fe53f4461bbef1982c2396d3ae005e6c66ece4e0 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 13 Dec 2023 12:18:05 +0100 Subject: [PATCH 1056/2372] Add migrating entry --- MIGRATING.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/MIGRATING.md b/MIGRATING.md index a240967ba2..dadb3d80dc 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -135,6 +135,39 @@ major releases of `cosmwasm`. Note that you can also view the +StdError::generic_err(msg) ``` +- Replace addresses in unit tests with valid bech32 addresses. This has to be + done for all addresses that are validated or canonicalized during the test or + within the contract. The easiest way to do this is by using + `MockApi::addr_make`. It generates a bech32 address from any string: + + ```diff + -let msg = InstantiateMsg { + - verifier: "verifier".to_string(), + - beneficiary: "beneficiary".to_string(), + -}; + +let msg = InstantiateMsg { + + verifier: deps.api.addr_make("verifier").to_string(), + + beneficiary: deps.api.addr_make("beneficiary").to_string(), + +}; + ``` + +- Replace addresses in integration tests using `cosmwasm-vm` with valid bech32 + addresses. This has to be done for all addresses that are validated or + canonicalized during the test or within the contract. The easiest way to do + this is by using `MockApi::addr_make`. It generates a bech32 address from any + string: + + ```diff + -let msg = InstantiateMsg { + - verifier: "verifier".to_string(), + - beneficiary: "beneficiary".to_string(), + -}; + +let msg = InstantiateMsg { + + verifier: instance.api().addr_make("verifier").to_string(), + + beneficiary: instance.api().addr_make("beneficiary").to_string(), + +}; + ``` + ## 1.4.x -> 1.5.0 - Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): From c1846485ab76ae88c165ff4255a76c17b770535e Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 13 Dec 2023 12:27:31 +0100 Subject: [PATCH 1057/2372] Add MockApi instantiate2_address test --- packages/std/src/testing/mock.rs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 4a21d87d43..f339fae8aa 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -1122,7 +1122,10 @@ mod tests { use super::*; #[cfg(feature = "cosmwasm_1_3")] use crate::DenomUnit; - use crate::{coin, coins, from_json, to_json_binary, ContractInfoResponse, Response}; + use crate::{ + coin, coins, from_json, instantiate2_address, to_json_binary, ContractInfoResponse, + HexBinary, Response, + }; #[cfg(feature = "staking")] use crate::{Decimal, Delegation}; use hex_literal::hex; @@ -2365,4 +2368,20 @@ mod tests { let querier = DistributionQuerier::new(addresses); assert_eq!(querier.withdraw_addresses, btree_map); } + + #[test] + fn instantiate2_address_can_be_humanized() { + let mock_api = MockApi::default(); + + let contract_addr = mock_api + .addr_canonicalize(mock_api.addr_make("contract").as_str()) + .unwrap(); + let checksum = + HexBinary::from_hex("9af782a3a1bcbcd22dbb6a45c751551d9af782a3a1bcbcd22dbb6a45c751551d") + .unwrap(); + let salt = b"instance 1231"; + let canonical_addr = instantiate2_address(&checksum, &contract_addr, salt).unwrap(); + // we are not interested in the exact humanization, just that it works + mock_api.addr_humanize(&canonical_addr).unwrap(); + } } From 6a8053e353a48bac2f69653d1ca1183723a0dadc Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 29 Sep 2023 13:15:42 +0200 Subject: [PATCH 1058/2372] Allow ibc ack of `None` --- contracts/ibc-reflect-send/src/ibc.rs | 4 ++-- contracts/ibc-reflect/src/contract.rs | 8 +++++--- contracts/ibc-reflect/tests/integration.rs | 6 +++--- packages/std/src/ibc.rs | 7 ++++--- packages/std/src/stdack.rs | 6 ++++++ 5 files changed, 20 insertions(+), 11 deletions(-) diff --git a/contracts/ibc-reflect-send/src/ibc.rs b/contracts/ibc-reflect-send/src/ibc.rs index 28362d0c23..aabacf913a 100644 --- a/contracts/ibc-reflect-send/src/ibc.rs +++ b/contracts/ibc-reflect-send/src/ibc.rs @@ -1,5 +1,5 @@ use cosmwasm_std::{ - entry_point, from_json, to_json_binary, DepsMut, Env, Ibc3ChannelOpenResponse, + entry_point, from_json, to_json_binary, Binary, DepsMut, Env, Ibc3ChannelOpenResponse, IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcChannelOpenResponse, IbcMsg, IbcOrder, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, Never, StdError, StdResult, @@ -101,7 +101,7 @@ pub fn ibc_packet_receive( _env: Env, _packet: IbcPacketReceiveMsg, ) -> Result { - Ok(IbcReceiveResponse::new(b"{}").add_attribute("action", "ibc_packet_ack")) + Ok(IbcReceiveResponse::new(Binary::from(b"{}")).add_attribute("action", "ibc_packet_ack")) } #[entry_point] diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 499dd4186d..b6b9366d34 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -546,7 +546,8 @@ mod tests { res.events[0] ); // acknowledgement is an error - let ack: AcknowledgementMsg = from_json(res.acknowledgement).unwrap(); + let ack: AcknowledgementMsg = + from_json(res.acknowledgement.unwrap()).unwrap(); assert_eq!( ack.unwrap_err(), "invalid packet: account channel-123 not found" @@ -560,7 +561,7 @@ mod tests { let res = ibc_packet_receive(deps.as_mut(), mock_env(), msg).unwrap(); // assert app-level success - let ack: AcknowledgementMsg<()> = from_json(res.acknowledgement).unwrap(); + let ack: AcknowledgementMsg<()> = from_json(res.acknowledgement.unwrap()).unwrap(); ack.unwrap(); // and we dispatch the BankMsg via submessage @@ -597,7 +598,8 @@ mod tests { // we didn't dispatch anything assert_eq!(0, res.messages.len()); // acknowledgement is an error - let ack: AcknowledgementMsg = from_json(res.acknowledgement).unwrap(); + let ack: AcknowledgementMsg = + from_json(res.acknowledgement.unwrap()).unwrap(); assert_eq!(ack.unwrap_err(), "invalid packet: Error parsing into type ibc_reflect::msg::PacketMsg: unknown variant `reflect_code_id`, expected one of `dispatch`, `who_am_i`, `balances`, `panic`, `return_err`, `return_msgs`"); } diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index 975ec9f647..7c69621065 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -240,7 +240,7 @@ fn handle_dispatch_packet() { ); // acknowledgement is an error let ack: AcknowledgementMsg = - from_slice(&res.acknowledgement, DESERIALIZATION_LIMIT).unwrap(); + from_slice(&res.acknowledgement.unwrap(), DESERIALIZATION_LIMIT).unwrap(); assert_eq!( ack.unwrap_err(), "invalid packet: account channel-123 not found" @@ -255,7 +255,7 @@ fn handle_dispatch_packet() { // assert app-level success let ack: AcknowledgementMsg = - from_slice(&res.acknowledgement, DESERIALIZATION_LIMIT).unwrap(); + from_slice(&res.acknowledgement.unwrap(), DESERIALIZATION_LIMIT).unwrap(); ack.unwrap(); // and we dispatch the BankMsg @@ -293,6 +293,6 @@ fn handle_dispatch_packet() { assert_eq!(0, res.messages.len()); // acknowledgement is an error let ack: AcknowledgementMsg = - from_slice(&res.acknowledgement, DESERIALIZATION_LIMIT).unwrap(); + from_slice(&res.acknowledgement.unwrap(), DESERIALIZATION_LIMIT).unwrap(); assert_eq!(ack.unwrap_err(), "invalid packet: Error parsing into type ibc_reflect::msg::PacketMsg: unknown variant `reflect_code_id`, expected one of `dispatch`, `who_am_i`, `balances`, `panic`, `return_err`, `return_msgs`"); } diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 91fb7cf63a..9e7877d87e 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -601,8 +601,9 @@ impl IbcBasicResponse { #[non_exhaustive] pub struct IbcReceiveResponse { /// The bytes we return to the contract that sent the packet. - /// This may represent a success or error of execution - pub acknowledgement: Binary, + /// This may represent a success or error of execution. + /// In case of `None`, no acknowledgement is written. + pub acknowledgement: Option, /// Optional list of messages to pass. These will be executed in order. /// If the ReplyOn member is set, they will invoke this contract's `reply` entry point /// after execution. Otherwise, they act like "fire and forget". @@ -633,7 +634,7 @@ impl IbcReceiveResponse { /// /// // 0x01 is a FungibleTokenPacketSuccess from ICS-20. /// let resp: IbcReceiveResponse = IbcReceiveResponse::new(StdAck::success(b"\x01")); - /// assert_eq!(resp.acknowledgement, b"{\"result\":\"AQ==\"}"); + /// assert_eq!(resp.acknowledgement.unwrap(), b"{\"result\":\"AQ==\"}"); /// ``` pub fn new(ack: impl Into) -> Self { Self { diff --git a/packages/std/src/stdack.rs b/packages/std/src/stdack.rs index 170317fa36..c12a4a1708 100644 --- a/packages/std/src/stdack.rs +++ b/packages/std/src/stdack.rs @@ -118,6 +118,12 @@ impl From for Binary { } } +impl From for Option { + fn from(original: StdAck) -> Option { + Some(original.into()) + } +} + #[cfg(test)] mod tests { use super::*; From e88ee7283bbc6ce61fa94551ceb9b29afc5a6053 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 29 Sep 2023 13:42:26 +0200 Subject: [PATCH 1059/2372] Add test for new StdAck From impl --- packages/std/src/stdack.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/std/src/stdack.rs b/packages/std/src/stdack.rs index c12a4a1708..45879fcbc7 100644 --- a/packages/std/src/stdack.rs +++ b/packages/std/src/stdack.rs @@ -166,4 +166,13 @@ mod tests { let ack2 = StdAck::error("kaputt"); assert_eq!(ack2.to_binary(), br#"{"error":"kaputt"}"#); } + + #[test] + fn stdack_to_option_binary_works() { + let ack1 = StdAck::success(b"\x01"); + assert_eq!(Option::::from(ack1.clone()), Some(ack1.to_binary())); + + let ack2 = StdAck::error("kaputt"); + assert_eq!(Option::::from(ack2.clone()), Some(ack2.to_binary())); + } } From 45acc9513d5b14aa9918f0d95a4b20a3526bc8d0 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 13 Oct 2023 17:41:05 +0200 Subject: [PATCH 1060/2372] Add separate constructor for IbcReceiveResponse --- packages/std/src/ibc.rs | 15 ++++++++++++++- packages/std/src/stdack.rs | 15 --------------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 9e7877d87e..d6398f8f19 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -638,7 +638,20 @@ impl IbcReceiveResponse { /// ``` pub fn new(ack: impl Into) -> Self { Self { - acknowledgement: ack.into(), + acknowledgement: Some(ack.into()), + messages: vec![], + attributes: vec![], + events: vec![], + } + } + + /// Creates a new response without an acknowledgement. + /// + /// This allows you to send the acknowledgement asynchronously later using [`IbcMsg::WriteAcknowledgement`]. + /// If you want to send the acknowledgement immediately, use [`IbcReceiveResponse::new`]. + pub fn without_ack() -> Self { + Self { + acknowledgement: None, messages: vec![], attributes: vec![], events: vec![], diff --git a/packages/std/src/stdack.rs b/packages/std/src/stdack.rs index 45879fcbc7..170317fa36 100644 --- a/packages/std/src/stdack.rs +++ b/packages/std/src/stdack.rs @@ -118,12 +118,6 @@ impl From for Binary { } } -impl From for Option { - fn from(original: StdAck) -> Option { - Some(original.into()) - } -} - #[cfg(test)] mod tests { use super::*; @@ -166,13 +160,4 @@ mod tests { let ack2 = StdAck::error("kaputt"); assert_eq!(ack2.to_binary(), br#"{"error":"kaputt"}"#); } - - #[test] - fn stdack_to_option_binary_works() { - let ack1 = StdAck::success(b"\x01"); - assert_eq!(Option::::from(ack1.clone()), Some(ack1.to_binary())); - - let ack2 = StdAck::error("kaputt"); - assert_eq!(Option::::from(ack2.clone()), Some(ack2.to_binary())); - } } From ca05c45477d68044a89de5857169d92c6adef9b6 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 13 Dec 2023 12:58:14 +0100 Subject: [PATCH 1061/2372] Add changelog entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ddeda11e4..706ca415c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -66,12 +66,15 @@ and this project adheres to ([#1967]) - cosmwasm-std: Replace `MockApi` with bech32 implementation. ([#1914]) - cosmwasm-vm: Replace `MockApi` with bech32 implementation. ([#1914]) +- cosmwasm-std: Make `IbcReceiveResponse::acknowledgement` optional and add + `IbcReceiveResponse::without_ack` constructor. ([#1892]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 [#1879]: https://github.com/CosmWasm/cosmwasm/pull/1879 [#1883]: https://github.com/CosmWasm/cosmwasm/pull/1883 [#1884]: https://github.com/CosmWasm/cosmwasm/pull/1884 +[#1892]: https://github.com/CosmWasm/cosmwasm/pull/1892 [#1898]: https://github.com/CosmWasm/cosmwasm/pull/1898 [#1902]: https://github.com/CosmWasm/cosmwasm/pull/1902 [#1914]: https://github.com/CosmWasm/cosmwasm/pull/1914 From 9f03d7713f020444e24d837bdc594f7986986c88 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 13 Dec 2023 17:14:17 +0100 Subject: [PATCH 1062/2372] Add std feature --- packages/std/Cargo.toml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 43461a812c..a2f9034b72 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -12,8 +12,13 @@ readme = "README.md" features = ["abort", "stargate", "staking", "cosmwasm_1_4"] [features] -default = ["iterator", "abort"] +default = ["iterator", "abort", "std"] abort = [] +# This feature is currently unused, but might be used in the future to replace internal +# implementation details with no_std compatible ones or feature-gate functionality +# that is only available in std environments. +# You probably want to keep this enabled for now to avoid breaking changes later. +std = [] # iterator allows us to iterate over all DB items in a given range # optional as some merkle stores (like tries) don't support this # given Ethereum 1.0, 2.0, Substrate, and other major projects use Tries From b893462d4eb9b70baa58a92ec5b1a5c9603d46bc Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 13 Dec 2023 18:32:18 +0100 Subject: [PATCH 1063/2372] Remove direct std usage --- packages/std/Cargo.toml | 14 ++++---- packages/std/src/addresses.rs | 1 + packages/std/src/binary.rs | 1 + packages/std/src/checksum.rs | 1 + packages/std/src/coin.rs | 1 + packages/std/src/coins.rs | 1 + packages/std/src/errors/backtrace.rs | 34 ++++++++++++++++--- packages/std/src/errors/std_error.rs | 1 + packages/std/src/errors/system_error.rs | 2 ++ packages/std/src/hex_binary.rs | 1 + packages/std/src/ibc.rs | 1 + packages/std/src/lib.rs | 5 +++ packages/std/src/math/decimal.rs | 1 + packages/std/src/math/decimal256.rs | 1 + packages/std/src/math/int128.rs | 1 + packages/std/src/math/int256.rs | 1 + packages/std/src/math/int512.rs | 1 + packages/std/src/math/int64.rs | 1 + packages/std/src/math/signed_decimal.rs | 1 + packages/std/src/math/signed_decimal_256.rs | 1 + packages/std/src/math/uint128.rs | 8 ++--- packages/std/src/math/uint256.rs | 6 ++-- packages/std/src/math/uint512.rs | 1 + packages/std/src/math/uint64.rs | 8 ++--- packages/std/src/metadata.rs | 2 ++ packages/std/src/pagination.rs | 1 + packages/std/src/prelude.rs | 6 ++++ packages/std/src/query/bank.rs | 1 + packages/std/src/query/distribution.rs | 1 + packages/std/src/query/ibc.rs | 1 + packages/std/src/query/mod.rs | 1 + packages/std/src/query/query_response.rs | 2 +- packages/std/src/query/staking.rs | 1 + packages/std/src/query/wasm.rs | 1 + packages/std/src/results/contract_result.rs | 2 ++ packages/std/src/results/cosmos_msg.rs | 1 + packages/std/src/results/empty.rs | 2 ++ packages/std/src/results/events.rs | 1 + packages/std/src/results/response.rs | 1 + packages/std/src/results/submessages.rs | 1 + packages/std/src/results/system_result.rs | 2 ++ packages/std/src/sections.rs | 1 + packages/std/src/serde.rs | 1 + packages/std/src/stdack.rs | 1 + packages/std/src/storage.rs | 1 + .../std/src/storage_keys/length_prefixed.rs | 2 ++ packages/std/src/testing/assertions.rs | 1 + packages/std/src/testing/mock.rs | 29 +++++++++------- packages/std/src/timestamp.rs | 1 + packages/std/src/traits.rs | 1 + packages/std/src/types.rs | 1 + 51 files changed, 124 insertions(+), 36 deletions(-) create mode 100644 packages/std/src/prelude.rs diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index a2f9034b72..7ece6bc72b 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -14,11 +14,11 @@ features = ["abort", "stargate", "staking", "cosmwasm_1_4"] [features] default = ["iterator", "abort", "std"] abort = [] -# This feature is currently unused, but might be used in the future to replace internal -# implementation details with no_std compatible ones or feature-gate functionality -# that is only available in std environments. -# You probably want to keep this enabled for now to avoid breaking changes later. -std = [] +# This feature can be used in the future to provide support for no_std environments, +# but disabling it will not provide any benefit at the moment. Even with this feature disabled, +# we currently require an std environment. +# You probably want to keep this enabled for now to avoid possible breaking changes later. +std = ["serde/std", "serde-json-wasm/std"] # iterator allows us to iterate over all DB items in a given range # optional as some merkle stores (like tries) don't support this # given Ethereum 1.0, 2.0, Substrate, and other major projects use Tries @@ -50,13 +50,13 @@ cosmwasm_1_4 = ["cosmwasm_1_3"] [dependencies] base64 = "0.21.0" cosmwasm-derive = { path = "../derive", version = "1.5.0" } -derivative = "2" +derivative = { version = "2", features = ["use_core"] } forward_ref = "1" hex = "0.4" schemars = "0.8.3" sha2 = "0.10.3" serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } -serde-json-wasm = { version = "1.0.0" } +serde-json-wasm = { version = "1.0.0", default-features = false } thiserror = "1.0.26" bnum = "0.8.0" static_assertions = "1.1.0" diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index c41ab4c8a0..659fe86534 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -9,6 +9,7 @@ use sha2::{ }; use thiserror::Error; +use crate::prelude::*; use crate::{binary::Binary, forward_ref_partial_eq, HexBinary}; /// A human readable address. diff --git a/packages/std/src/binary.rs b/packages/std/src/binary.rs index f5f39afec3..8237980666 100644 --- a/packages/std/src/binary.rs +++ b/packages/std/src/binary.rs @@ -6,6 +6,7 @@ use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{StdError, StdResult}; +use crate::prelude::*; /// Binary is a wrapper around Vec to add base64 de/serialization /// with serde. It also adds some helper methods to help encode inline. diff --git a/packages/std/src/checksum.rs b/packages/std/src/checksum.rs index 1a6cfff04c..e56735640d 100644 --- a/packages/std/src/checksum.rs +++ b/packages/std/src/checksum.rs @@ -5,6 +5,7 @@ use serde::{de, ser, Deserialize, Deserializer, Serialize}; use sha2::{Digest, Sha256}; use thiserror::Error; +use crate::prelude::*; use crate::{StdError, StdResult}; /// A SHA-256 checksum of a Wasm blob, used to identify a Wasm code. diff --git a/packages/std/src/coin.rs b/packages/std/src/coin.rs index 9e02786b70..daf1df1738 100644 --- a/packages/std/src/coin.rs +++ b/packages/std/src/coin.rs @@ -2,6 +2,7 @@ use core::{fmt, str::FromStr}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +use crate::prelude::*; use crate::{errors::CoinFromStrError, math::Uint128}; #[derive(Serialize, Deserialize, Clone, Default, PartialEq, Eq, JsonSchema)] diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index ea589fc160..967ab7067f 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -2,6 +2,7 @@ use alloc::collections::BTreeMap; use core::fmt; use core::str::FromStr; +use crate::prelude::*; use crate::{ errors::CoinsError, Coin, OverflowError, OverflowOperation, StdError, StdResult, Uint128, }; diff --git a/packages/std/src/errors/backtrace.rs b/packages/std/src/errors/backtrace.rs index 8446243c17..65058f1215 100644 --- a/packages/std/src/errors/backtrace.rs +++ b/packages/std/src/errors/backtrace.rs @@ -1,5 +1,7 @@ use core::fmt::{Debug, Display, Formatter, Result}; +use crate::prelude::*; + /// This wraps an actual backtrace to achieve two things: /// - being able to fill this with a stub implementation in `no_std` environments /// - being able to use this in conjunction with [`thiserror::Error`] @@ -9,10 +11,17 @@ impl BT { #[track_caller] pub fn capture() -> Self { // in case of no_std, we can fill with a stub here - #[cfg(target_arch = "wasm32")] - return BT(Box::new(std::backtrace::Backtrace::disabled())); - #[cfg(not(target_arch = "wasm32"))] - return BT(Box::new(std::backtrace::Backtrace::capture())); + #[cfg(feature = "std")] + { + #[cfg(target_arch = "wasm32")] + return BT(Box::new(std::backtrace::Backtrace::disabled())); + #[cfg(not(target_arch = "wasm32"))] + return BT(Box::new(std::backtrace::Backtrace::capture())); + } + #[cfg(not(feature = "std"))] + { + BT(Box::new(Stub)) + } } } @@ -31,6 +40,23 @@ impl Display for BT { } } +#[cfg(not(feature = "std"))] +struct Stub; + +#[cfg(not(feature = "std"))] +impl Debug for Stub { + fn fmt(&self, f: &mut Formatter<'_>) -> Result { + write!(f, "") + } +} + +#[cfg(not(feature = "std"))] +impl Display for Stub { + fn fmt(&self, f: &mut Formatter<'_>) -> Result { + write!(f, "") + } +} + /// This macro implements `From` for a given error type to a given error type where /// the target error has a `backtrace` field. /// This is meant as a replacement for `thiserror`'s `#[from]` attribute, which does not diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index 22bbe71f24..31cd692ae1 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -4,6 +4,7 @@ use super::{impl_from_err, BT}; use thiserror::Error; use crate::errors::{RecoverPubkeyError, VerificationError}; +use crate::prelude::*; /// Structured error type for init, execute and query. /// diff --git a/packages/std/src/errors/system_error.rs b/packages/std/src/errors/system_error.rs index 8d560c4132..e7a0b5a865 100644 --- a/packages/std/src/errors/system_error.rs +++ b/packages/std/src/errors/system_error.rs @@ -1,6 +1,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +use crate::prelude::*; use crate::Binary; /// SystemError is used for errors inside the VM and is API friendly (i.e. serializable). @@ -39,6 +40,7 @@ pub enum SystemError { }, } +#[cfg(feature = "std")] impl std::error::Error for SystemError {} impl core::fmt::Display for SystemError { diff --git a/packages/std/src/hex_binary.rs b/packages/std/src/hex_binary.rs index aeb30b4c48..1b704e2261 100644 --- a/packages/std/src/hex_binary.rs +++ b/packages/std/src/hex_binary.rs @@ -4,6 +4,7 @@ use core::ops::Deref; use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; +use crate::prelude::*; use crate::{Binary, StdError, StdResult}; /// This is a wrapper around Vec to add hex de/serialization diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index d6398f8f19..8e5e635bdb 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -9,6 +9,7 @@ use crate::addresses::Addr; use crate::binary::Binary; use crate::coin::Coin; use crate::errors::StdResult; +use crate::prelude::*; use crate::results::{Attribute, CosmosMsg, Empty, Event, SubMsg}; use crate::serde::to_json_binary; use crate::timestamp::Timestamp; diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 43111e20e8..8f72c26e8a 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -1,3 +1,5 @@ +// #![cfg_attr(not(feature = "std"), no_std)] + extern crate alloc; // Exposed on all platforms @@ -32,6 +34,9 @@ mod timestamp; mod traits; mod types; +/// This module is to simplify no_std imports +pub(crate) mod prelude; + /// This modules is very advanced and will not be used directly by the vast majority of users. /// We want to offer it to ensure a stable storage key composition system but don't encourage /// contract devs to use it directly. diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index ed5aaae29f..e512798668 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -11,6 +11,7 @@ use crate::errors::{ CheckedFromRatioError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, OverflowOperation, RoundUpOverflowError, StdError, }; +use crate::prelude::*; use crate::{forward_ref_partial_eq, Decimal256, SignedDecimal, SignedDecimal256}; use super::Fraction; diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 401f72098e..4117dd8305 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -11,6 +11,7 @@ use crate::errors::{ CheckedFromRatioError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, OverflowOperation, RoundUpOverflowError, StdError, }; +use crate::prelude::*; use crate::{forward_ref_partial_eq, Decimal, SignedDecimal, SignedDecimal256, Uint512}; use super::Fraction; diff --git a/packages/std/src/math/int128.rs b/packages/std/src/math/int128.rs index 5fc43b6022..aa86525b8e 100644 --- a/packages/std/src/math/int128.rs +++ b/packages/std/src/math/int128.rs @@ -9,6 +9,7 @@ use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; +use crate::prelude::*; use crate::{ forward_ref_partial_eq, CheckedMultiplyRatioError, Int256, Int512, Int64, Uint128, Uint256, Uint512, Uint64, diff --git a/packages/std/src/math/int256.rs b/packages/std/src/math/int256.rs index 24180c54e0..64e5771f07 100644 --- a/packages/std/src/math/int256.rs +++ b/packages/std/src/math/int256.rs @@ -9,6 +9,7 @@ use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; +use crate::prelude::*; use crate::{ forward_ref_partial_eq, CheckedMultiplyRatioError, Int128, Int512, Int64, Uint128, Uint256, Uint512, Uint64, diff --git a/packages/std/src/math/int512.rs b/packages/std/src/math/int512.rs index cc5d74fcac..32499b657c 100644 --- a/packages/std/src/math/int512.rs +++ b/packages/std/src/math/int512.rs @@ -9,6 +9,7 @@ use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; +use crate::prelude::*; use crate::{forward_ref_partial_eq, Int128, Int256, Int64, Uint128, Uint256, Uint512, Uint64}; /// Used internally - we don't want to leak this type since we might change diff --git a/packages/std/src/math/int64.rs b/packages/std/src/math/int64.rs index 096f38a393..de88022811 100644 --- a/packages/std/src/math/int64.rs +++ b/packages/std/src/math/int64.rs @@ -9,6 +9,7 @@ use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{DivideByZeroError, DivisionError, OverflowError, OverflowOperation, StdError}; +use crate::prelude::*; use crate::{ forward_ref_partial_eq, CheckedMultiplyRatioError, Int128, Int256, Int512, Uint128, Uint256, Uint512, Uint64, diff --git a/packages/std/src/math/signed_decimal.rs b/packages/std/src/math/signed_decimal.rs index 911e30293c..2c9dddf96e 100644 --- a/packages/std/src/math/signed_decimal.rs +++ b/packages/std/src/math/signed_decimal.rs @@ -13,6 +13,7 @@ use crate::errors::{ CheckedFromRatioError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, OverflowOperation, RoundDownOverflowError, RoundUpOverflowError, StdError, }; +use crate::prelude::*; use crate::{forward_ref_partial_eq, Decimal, Decimal256, Int256, SignedDecimal256}; use super::Fraction; diff --git a/packages/std/src/math/signed_decimal_256.rs b/packages/std/src/math/signed_decimal_256.rs index 464346547d..1753662084 100644 --- a/packages/std/src/math/signed_decimal_256.rs +++ b/packages/std/src/math/signed_decimal_256.rs @@ -13,6 +13,7 @@ use crate::errors::{ CheckedFromRatioError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, OverflowOperation, RoundDownOverflowError, RoundUpOverflowError, StdError, }; +use crate::prelude::*; use crate::{forward_ref_partial_eq, Decimal, Decimal256, Int512, SignedDecimal}; use super::Fraction; diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 1d42022282..70005efbfe 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -1,10 +1,9 @@ -use core::fmt::{self}; +use core::fmt; use core::ops::{ - Add, AddAssign, Div, DivAssign, Mul, MulAssign, Rem, RemAssign, Shl, ShlAssign, Shr, ShrAssign, - Sub, SubAssign, + Add, AddAssign, Div, DivAssign, Mul, MulAssign, Not, Rem, RemAssign, Shl, ShlAssign, Shr, + ShrAssign, Sub, SubAssign, }; use core::str::FromStr; -use std::ops::Not; use forward_ref::{forward_ref_binop, forward_ref_op_assign}; use schemars::JsonSchema; @@ -14,6 +13,7 @@ use crate::errors::{ CheckedMultiplyFractionError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, OverflowOperation, StdError, }; +use crate::prelude::*; use crate::{ forward_ref_partial_eq, impl_mul_fraction, Fraction, Int128, Int256, Int512, Int64, Uint256, Uint64, diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 2492cc46b8..06dbcb9331 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -1,18 +1,18 @@ use core::fmt; use core::ops::{ - Add, AddAssign, Div, DivAssign, Mul, MulAssign, Rem, RemAssign, Shl, ShlAssign, Shr, ShrAssign, - Sub, SubAssign, + Add, AddAssign, Div, DivAssign, Mul, MulAssign, Not, Rem, RemAssign, Shl, ShlAssign, Shr, + ShrAssign, Sub, SubAssign, }; use core::str::FromStr; use forward_ref::{forward_ref_binop, forward_ref_op_assign}; use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; -use std::ops::Not; use crate::errors::{ CheckedMultiplyFractionError, CheckedMultiplyRatioError, ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, StdError, }; +use crate::prelude::*; use crate::{ forward_ref_partial_eq, impl_mul_fraction, Fraction, Int128, Int256, Int512, Int64, Uint128, Uint512, Uint64, diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index 49f9beeeb5..2d4d05217c 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -11,6 +11,7 @@ use serde::{de, ser, Deserialize, Deserializer, Serialize}; use crate::errors::{ ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, StdError, }; +use crate::prelude::*; use crate::{forward_ref_partial_eq, Int128, Int256, Int512, Int64, Uint128, Uint256, Uint64}; /// Used internally - we don't want to leak this type since we might change diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index 8a3738bdf3..b663855d8e 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -1,17 +1,17 @@ -use core::fmt::{self}; +use core::fmt; use core::ops::{ - Add, AddAssign, Div, DivAssign, Mul, MulAssign, Rem, RemAssign, Shl, ShlAssign, Shr, ShrAssign, - Sub, SubAssign, + Add, AddAssign, Div, DivAssign, Mul, MulAssign, Not, Rem, RemAssign, Shl, ShlAssign, Shr, + ShrAssign, Sub, SubAssign, }; use forward_ref::{forward_ref_binop, forward_ref_op_assign}; use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; -use std::ops::Not; use crate::errors::{ CheckedMultiplyFractionError, CheckedMultiplyRatioError, DivideByZeroError, OverflowError, OverflowOperation, StdError, }; +use crate::prelude::*; use crate::{ forward_ref_partial_eq, impl_mul_fraction, Fraction, Int128, Int256, Int512, Int64, Uint128, }; diff --git a/packages/std/src/metadata.rs b/packages/std/src/metadata.rs index c0827ce722..b741f32099 100644 --- a/packages/std/src/metadata.rs +++ b/packages/std/src/metadata.rs @@ -1,6 +1,8 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +use crate::prelude::*; + /// Replicates the cosmos-sdk bank module Metadata type #[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, JsonSchema)] pub struct DenomMetadata { diff --git a/packages/std/src/pagination.rs b/packages/std/src/pagination.rs index d9d1d8ef96..d5e979f9f7 100644 --- a/packages/std/src/pagination.rs +++ b/packages/std/src/pagination.rs @@ -1,6 +1,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +use crate::prelude::*; use crate::Binary; /// Simplified version of the PageRequest type for pagination from the cosmos-sdk diff --git a/packages/std/src/prelude.rs b/packages/std/src/prelude.rs new file mode 100644 index 0000000000..ad2d30b855 --- /dev/null +++ b/packages/std/src/prelude.rs @@ -0,0 +1,6 @@ +pub use alloc::boxed::Box; +pub use alloc::format; +pub use alloc::string::{String, ToString}; +pub use alloc::vec; +pub use alloc::vec::Vec; +pub use core::option::Option::{self, None, Some}; diff --git a/packages/std/src/query/bank.rs b/packages/std/src/query/bank.rs index d8ecb3baec..4ae51883e0 100644 --- a/packages/std/src/query/bank.rs +++ b/packages/std/src/query/bank.rs @@ -3,6 +3,7 @@ use serde::{Deserialize, Serialize}; use crate::Coin; +use crate::prelude::*; #[cfg(feature = "cosmwasm_1_3")] use crate::PageRequest; use crate::{Binary, DenomMetadata}; diff --git a/packages/std/src/query/distribution.rs b/packages/std/src/query/distribution.rs index 5dbdfec2e4..0abc33f196 100644 --- a/packages/std/src/query/distribution.rs +++ b/packages/std/src/query/distribution.rs @@ -1,6 +1,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +use crate::prelude::*; use crate::{Addr, Decimal256}; use super::query_response::QueryResponseType; diff --git a/packages/std/src/query/ibc.rs b/packages/std/src/query/ibc.rs index 511c61274e..739e9ac35f 100644 --- a/packages/std/src/query/ibc.rs +++ b/packages/std/src/query/ibc.rs @@ -2,6 +2,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use crate::ibc::IbcChannel; +use crate::prelude::*; /// These are queries to the various IBC modules to see the state of the contract's /// IBC connection. These will return errors if the contract is not "ibc enabled" diff --git a/packages/std/src/query/mod.rs b/packages/std/src/query/mod.rs index a957574a89..a6e0219c11 100644 --- a/packages/std/src/query/mod.rs +++ b/packages/std/src/query/mod.rs @@ -1,6 +1,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +use crate::prelude::*; #[cfg(feature = "stargate")] use crate::Binary; use crate::Empty; diff --git a/packages/std/src/query/query_response.rs b/packages/std/src/query/query_response.rs index 4aa4559e4b..00dae078c0 100644 --- a/packages/std/src/query/query_response.rs +++ b/packages/std/src/query/query_response.rs @@ -1,4 +1,4 @@ -use std::fmt::Debug; +use core::fmt::Debug; use serde::de::DeserializeOwned; diff --git a/packages/std/src/query/staking.rs b/packages/std/src/query/staking.rs index b8104b8f12..3c5fd0ec2b 100644 --- a/packages/std/src/query/staking.rs +++ b/packages/std/src/query/staking.rs @@ -1,6 +1,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +use crate::prelude::*; use crate::{Addr, Coin, Decimal}; use super::query_response::QueryResponseType; diff --git a/packages/std/src/query/wasm.rs b/packages/std/src/query/wasm.rs index 7c01040ee5..b05ba32d47 100644 --- a/packages/std/src/query/wasm.rs +++ b/packages/std/src/query/wasm.rs @@ -1,6 +1,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +use crate::prelude::*; use crate::{Addr, Binary, Checksum}; use super::query_response::QueryResponseType; diff --git a/packages/std/src/results/contract_result.rs b/packages/std/src/results/contract_result.rs index a55c32e3c4..e887c74500 100644 --- a/packages/std/src/results/contract_result.rs +++ b/packages/std/src/results/contract_result.rs @@ -2,6 +2,8 @@ use core::fmt; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +use crate::prelude::*; + /// This is the final result type that is created and serialized in a contract for /// every init/execute/migrate call. The VM then deserializes this type to distinguish /// between successful and failed executions. diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index 9c60c25bbf..1336c35a50 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -8,6 +8,7 @@ use crate::coin::Coin; use crate::errors::StdResult; #[cfg(feature = "stargate")] use crate::ibc::IbcMsg; +use crate::prelude::*; use crate::serde::to_json_binary; #[cfg(all(feature = "stargate", feature = "cosmwasm_1_2"))] use crate::Decimal; diff --git a/packages/std/src/results/empty.rs b/packages/std/src/results/empty.rs index 91e3b581bf..9efd96d908 100644 --- a/packages/std/src/results/empty.rs +++ b/packages/std/src/results/empty.rs @@ -1,6 +1,8 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +use crate::prelude::*; + /// An empty struct that serves as a placeholder in different places, /// such as contracts that don't set a custom message. /// diff --git a/packages/std/src/results/events.rs b/packages/std/src/results/events.rs index 51eb7ace00..2ed593ae68 100644 --- a/packages/std/src/results/events.rs +++ b/packages/std/src/results/events.rs @@ -2,6 +2,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use crate::forward_ref_partial_eq; +use crate::prelude::*; /// A full [*Cosmos SDK* event]. /// diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index 80f687c75c..921dea5159 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -1,6 +1,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +use crate::prelude::*; use crate::Binary; use super::{Attribute, CosmosMsg, Empty, Event, SubMsg}; diff --git a/packages/std/src/results/submessages.rs b/packages/std/src/results/submessages.rs index 5d58e87d2c..ebc0efa177 100644 --- a/packages/std/src/results/submessages.rs +++ b/packages/std/src/results/submessages.rs @@ -1,6 +1,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +use crate::prelude::*; use crate::Binary; use super::{CosmosMsg, Empty, Event}; diff --git a/packages/std/src/results/system_result.rs b/packages/std/src/results/system_result.rs index 6ad224d940..624fe0bc3b 100644 --- a/packages/std/src/results/system_result.rs +++ b/packages/std/src/results/system_result.rs @@ -4,6 +4,8 @@ use serde::{Deserialize, Serialize}; use super::super::errors::SystemError; +use crate::prelude::*; + /// This is the outer result type returned by a querier to the contract. /// /// We use a custom type here instead of Rust's Result because we want to be able to diff --git a/packages/std/src/sections.rs b/packages/std/src/sections.rs index 89433f5537..3a8bc9ee98 100644 --- a/packages/std/src/sections.rs +++ b/packages/std/src/sections.rs @@ -1,4 +1,5 @@ use crate::conversion::force_to_u32; +use crate::prelude::*; /// A sections decoder for the special case of two elements #[allow(dead_code)] // used in Wasm and tests only diff --git a/packages/std/src/serde.rs b/packages/std/src/serde.rs index 2948813281..5adaf24567 100644 --- a/packages/std/src/serde.rs +++ b/packages/std/src/serde.rs @@ -7,6 +7,7 @@ use serde::{de::DeserializeOwned, Serialize}; use crate::binary::Binary; use crate::errors::{StdError, StdResult}; +use crate::prelude::*; #[deprecated = "use from_json instead"] pub fn from_slice(value: &[u8]) -> StdResult { diff --git a/packages/std/src/stdack.rs b/packages/std/src/stdack.rs index 170317fa36..1d65a7d8f4 100644 --- a/packages/std/src/stdack.rs +++ b/packages/std/src/stdack.rs @@ -2,6 +2,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use crate::binary::Binary; +use crate::prelude::*; use crate::to_json_binary; /// This is a standard IBC acknowledgement type. IBC application are free diff --git a/packages/std/src/storage.rs b/packages/std/src/storage.rs index 26d7f710d2..bcfcb76e7a 100644 --- a/packages/std/src/storage.rs +++ b/packages/std/src/storage.rs @@ -7,6 +7,7 @@ use core::ops::{Bound, RangeBounds}; #[cfg(feature = "iterator")] use crate::iterator::{Order, Record}; +use crate::prelude::*; use crate::traits::Storage; #[derive(Default)] diff --git a/packages/std/src/storage_keys/length_prefixed.rs b/packages/std/src/storage_keys/length_prefixed.rs index 9e95f17f04..e033ed79f8 100644 --- a/packages/std/src/storage_keys/length_prefixed.rs +++ b/packages/std/src/storage_keys/length_prefixed.rs @@ -4,6 +4,8 @@ //! Everything in this file is only responsible for building such keys //! and is in no way specific to any kind of storage. +use crate::prelude::*; + /// Calculates the raw key prefix for a given namespace as documented /// in https://github.com/webmaster128/key-namespacing#length-prefixed-keys pub fn to_length_prefixed(namespace_component: &[u8]) -> Vec { diff --git a/packages/std/src/testing/assertions.rs b/packages/std/src/testing/assertions.rs index fa3ab6c7fa..c87ba28b55 100644 --- a/packages/std/src/testing/assertions.rs +++ b/packages/std/src/testing/assertions.rs @@ -1,3 +1,4 @@ +use crate::prelude::*; use crate::{Decimal, Uint128}; #[cfg(test)] use core::hash::{Hash, Hasher}; diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index f339fae8aa..e65436d939 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -1,4 +1,7 @@ +use crate::prelude::*; use alloc::collections::BTreeMap; +#[cfg(feature = "cosmwasm_1_3")] +use alloc::collections::BTreeSet; use bech32::{decode, encode, FromBase32, ToBase32, Variant}; use core::marker::PhantomData; #[cfg(feature = "cosmwasm_1_3")] @@ -7,9 +10,6 @@ use serde::de::DeserializeOwned; #[cfg(feature = "stargate")] use serde::Serialize; use sha2::{Digest, Sha256}; -#[cfg(feature = "cosmwasm_1_3")] -use std::collections::BTreeSet; -use std::collections::HashMap; use crate::addresses::{Addr, CanonicalAddr}; use crate::binary::Binary; @@ -202,9 +202,12 @@ impl Api for MockApi { )?) } + #[cfg(feature = "std")] fn debug(&self, message: &str) { println!("{message}"); } + #[cfg(not(feature = "std"))] + fn debug(&self, _message: &str) {} } impl MockApi { @@ -662,17 +665,17 @@ impl Default for WasmQuerier { #[derive(Clone, Default)] pub struct BankQuerier { #[allow(dead_code)] - /// HashMap - supplies: HashMap, - /// HashMap - balances: HashMap>, + /// BTreeMap + supplies: BTreeMap, + /// BTreeMap + balances: BTreeMap>, /// Vec denom_metadata: BTreeMap, DenomMetadata>, } impl BankQuerier { pub fn new(balances: &[(&str, &[Coin])]) -> Self { - let balances: HashMap<_, _> = balances + let balances: BTreeMap<_, _> = balances .iter() .map(|(s, c)| (s.to_string(), c.to_vec())) .collect(); @@ -702,8 +705,8 @@ impl BankQuerier { .collect(); } - fn calculate_supplies(balances: &HashMap>) -> HashMap { - let mut supplies = HashMap::new(); + fn calculate_supplies(balances: &BTreeMap>) -> BTreeMap { + let mut supplies = BTreeMap::new(); let all_coins = balances.iter().flat_map(|(_, coins)| coins); @@ -2148,7 +2151,7 @@ mod tests { querier.update_handler(|request| { let api = MockApi::default(); let contract1 = api.addr_make("contract1"); - let mut storage1 = HashMap::::default(); + let mut storage1 = BTreeMap::::default(); storage1.insert(b"the key".into(), b"the value".into()); match request { @@ -2347,7 +2350,7 @@ mod tests { } #[test] - #[cfg(feature = "cosmwasm_1_3")] + #[cfg(all(feature = "cosmwasm_1_3", feature = "std"))] fn distribution_querier_new_works() { let addresses = [ ("addr0000".to_string(), "addr0001".to_string()), @@ -2356,7 +2359,7 @@ mod tests { let btree_map = BTreeMap::from(addresses.clone()); // should still work with HashMap - let hashmap = HashMap::from(addresses.clone()); + let hashmap = std::collections::HashMap::from(addresses.clone()); let querier = DistributionQuerier::new(hashmap); assert_eq!(querier.withdraw_addresses, btree_map); diff --git a/packages/std/src/timestamp.rs b/packages/std/src/timestamp.rs index 6a10f060d5..8421e3b1b6 100644 --- a/packages/std/src/timestamp.rs +++ b/packages/std/src/timestamp.rs @@ -3,6 +3,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use crate::math::Uint64; +use crate::prelude::*; /// A point in time in nanosecond precision. /// diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 0d966bd2d2..4dea2819da 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -8,6 +8,7 @@ use crate::coin::Coin; use crate::errors::{RecoverPubkeyError, StdError, StdResult, VerificationError}; #[cfg(feature = "iterator")] use crate::iterator::{Order, Record}; +use crate::prelude::*; #[cfg(feature = "cosmwasm_1_2")] use crate::query::CodeInfoResponse; #[cfg(feature = "cosmwasm_1_1")] diff --git a/packages/std/src/types.rs b/packages/std/src/types.rs index 782ad1e726..6a77eccd80 100644 --- a/packages/std/src/types.rs +++ b/packages/std/src/types.rs @@ -3,6 +3,7 @@ use serde::{Deserialize, Serialize}; use crate::addresses::Addr; use crate::coin::Coin; +use crate::prelude::*; use crate::timestamp::Timestamp; #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] From 611178a559d23e4ef577206b99652dc57b9b8e3f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 14 Dec 2023 09:57:19 +0100 Subject: [PATCH 1064/2372] Remove commented no_std attribute --- packages/std/src/lib.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 8f72c26e8a..1e6194ff54 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -1,5 +1,3 @@ -// #![cfg_attr(not(feature = "std"), no_std)] - extern crate alloc; // Exposed on all platforms From 1257bb029dcc664a49ded967758c8c2633bc15c5 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 15 Dec 2023 10:57:23 +0100 Subject: [PATCH 1065/2372] Always keep backtrace stub --- packages/std/src/errors/backtrace.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/std/src/errors/backtrace.rs b/packages/std/src/errors/backtrace.rs index 65058f1215..eef9ceb753 100644 --- a/packages/std/src/errors/backtrace.rs +++ b/packages/std/src/errors/backtrace.rs @@ -40,17 +40,15 @@ impl Display for BT { } } -#[cfg(not(feature = "std"))] +#[allow(unused)] struct Stub; -#[cfg(not(feature = "std"))] impl Debug for Stub { fn fmt(&self, f: &mut Formatter<'_>) -> Result { write!(f, "") } } -#[cfg(not(feature = "std"))] impl Display for Stub { fn fmt(&self, f: &mut Formatter<'_>) -> Result { write!(f, "") From d8ef5c957fdfc93b824085e1af2cd5b47a9b9880 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 15 Dec 2023 11:16:39 +0100 Subject: [PATCH 1066/2372] Merge debug versions --- packages/std/src/testing/mock.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index e65436d939..dd3395daf0 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -202,12 +202,10 @@ impl Api for MockApi { )?) } - #[cfg(feature = "std")] - fn debug(&self, message: &str) { + fn debug(&self, #[allow(unused)] message: &str) { + #[cfg(feature = "std")] println!("{message}"); } - #[cfg(not(feature = "std"))] - fn debug(&self, _message: &str) {} } impl MockApi { From db9afea31dd60a60803f7113c220027ecc582d3a Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 15 Dec 2023 11:19:17 +0100 Subject: [PATCH 1067/2372] Add changelog entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 706ca415c7..4f07ce8e87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -68,6 +68,7 @@ and this project adheres to - cosmwasm-vm: Replace `MockApi` with bech32 implementation. ([#1914]) - cosmwasm-std: Make `IbcReceiveResponse::acknowledgement` optional and add `IbcReceiveResponse::without_ack` constructor. ([#1892]) +- cosmwasm-std: Add `std` feature and make it a default feature. ([#1971]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 @@ -86,6 +87,7 @@ and this project adheres to [#1944]: https://github.com/CosmWasm/cosmwasm/pull/1944 [#1949]: https://github.com/CosmWasm/cosmwasm/pull/1949 [#1967]: https://github.com/CosmWasm/cosmwasm/pull/1967 +[#1971]: https://github.com/CosmWasm/cosmwasm/pull/1971 ### Removed From d6ab63cd49ccdee2ed99272d2c9cf1e89269378f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 15 Dec 2023 11:34:12 +0100 Subject: [PATCH 1068/2372] Add migrating entry --- MIGRATING.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/MIGRATING.md b/MIGRATING.md index dadb3d80dc..cc65c3dbb1 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -21,9 +21,18 @@ major releases of `cosmwasm`. Note that you can also view the If you were using cosmwasm-std's `ibc3` feature, you can remove it, as it is the default now. Depending on your usage, you might have to enable the - `stargate` feature instead, since it was previously implied by `ibc3`. Also - remove any uses of the `backtraces` feature. You can use a `RUST_BACKTRACE=1` - env variable for this now. + `stargate` feature instead, since it was previously implied by `ibc3`. + + Also remove any uses of the `backtraces` feature. You can use a + `RUST_BACKTRACE=1` env variable for this now. + + If you were using `cosmwasm-std` with `default-features = false`, you probably + want to enable the `std` feature now, as we might move certain existing + functionality to that feature in the future to support no_std environments: + + ```toml + cosmwasm-std = { version = "2.0.0", default-features = false, features = ["std", ...] } + ``` - `ContractInfoResponse::new` now takes all fields of the response as parameters: From 221951955e664220204d8c8e18656d3bd59dd2f6 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 19 Dec 2023 15:28:44 +0100 Subject: [PATCH 1069/2372] Update docs --- MIGRATING.md | 5 +++-- docs/USING_COSMWASM_STD.md | 6 ++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/MIGRATING.md b/MIGRATING.md index cc65c3dbb1..6cea8ea3ea 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -30,8 +30,9 @@ major releases of `cosmwasm`. Note that you can also view the want to enable the `std` feature now, as we might move certain existing functionality to that feature in the future to support no_std environments: - ```toml - cosmwasm-std = { version = "2.0.0", default-features = false, features = ["std", ...] } + ```diff + -cosmwasm-std = { version = "2.0.0", default-features = false, features = [...] } + +cosmwasm-std = { version = "2.0.0", default-features = false, features = ["std", ...] } ``` - `ContractInfoResponse::new` now takes all fields of the response as diff --git a/docs/USING_COSMWASM_STD.md b/docs/USING_COSMWASM_STD.md index 2c61767742..500a232a01 100644 --- a/docs/USING_COSMWASM_STD.md +++ b/docs/USING_COSMWASM_STD.md @@ -74,7 +74,8 @@ there it becomes impossible to use the contract in chains with lower CosmWasm versions. If you add `abort`, it becomes impossible for the contract developer to opt out of the abort feature due to your library. Since this affects the default features `abort` and `iterator`, you should always disable default -features. +features. However, you should make sure to keep the `std` feature enabled, as we +might move certain existing functionality to that feature in the future. Also libraries should define a loose version range that allows the contract developer to control which cosmwasm-std version they want to use in the final @@ -85,5 +86,6 @@ A typical dependency then looks like this: ```toml # We really need `stargate` here as this is an IBC related library. `abort` and `iterator` are not needed. -cosmwasm-std = { version = "1.0.1", default-features = false, features = ["stargate"] } +# `std` should always stay enabled. +cosmwasm-std = { version = "1.0.1", default-features = false, features = ["std", "stargate"] } ``` From 4ffac280702fd133a0da01c52df399c1cbe57e22 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 20 Dec 2023 15:21:13 +0100 Subject: [PATCH 1070/2372] Add cosmwasm_2_0 capability and feature --- .circleci/config.yml | 8 ++++---- .vscode/settings.json | 2 +- MIGRATING.md | 11 +++++++++++ docs/CAPABILITIES-BUILT-IN.md | 2 ++ packages/go-gen/Cargo.toml | 2 +- packages/std/Cargo.toml | 5 ++++- packages/std/src/exports.rs | 4 ++++ packages/std/src/results/cosmos_msg.rs | 8 ++++++-- packages/vm/src/testing/instance.rs | 2 +- 9 files changed, 34 insertions(+), 10 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c5fb488b96..e8ab8ed68c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -356,15 +356,15 @@ jobs: - run: name: Build library for native target (all features) working_directory: ~/project/packages/std - command: cargo build --locked --features abort,iterator,staking,stargate,cosmwasm_1_4 + command: cargo build --locked --features abort,iterator,staking,stargate,cosmwasm_2_0 - run: name: Build library for wasm target (all features) working_directory: ~/project/packages/std - command: cargo wasm --locked --features abort,iterator,staking,stargate,cosmwasm_1_4 + command: cargo wasm --locked --features abort,iterator,staking,stargate,cosmwasm_2_0 - run: name: Run unit tests (all features) working_directory: ~/project/packages/std - command: cargo test --locked --features abort,iterator,staking,stargate,cosmwasm_1_4 + command: cargo test --locked --features abort,iterator,staking,stargate,cosmwasm_2_0 - save_cache: paths: - /usr/local/cargo/registry @@ -903,7 +903,7 @@ jobs: - run: name: Clippy linting on std (all feature flags) working_directory: ~/project/packages/std - command: cargo clippy --all-targets --features abort,iterator,staking,stargate,cosmwasm_1_4 -- -D warnings + command: cargo clippy --all-targets --features abort,iterator,staking,stargate,cosmwasm_2_0 -- -D warnings - run: name: Clippy linting on vm (no feature flags) working_directory: ~/project/packages/vm diff --git a/.vscode/settings.json b/.vscode/settings.json index a9e08224c1..bc57d18570 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,6 +3,6 @@ "abort", "stargate", "staking", - "cosmwasm_1_4" + "cosmwasm_2_0" ] } diff --git a/MIGRATING.md b/MIGRATING.md index 6cea8ea3ea..d1dc8c6099 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -35,6 +35,17 @@ major releases of `cosmwasm`. Note that you can also view the +cosmwasm-std = { version = "2.0.0", default-features = false, features = ["std", ...] } ``` +- If you want to use a feature that is only available on CosmWasm 2.0+ chains, + use this feature: + + ```diff + -cosmwasm-std = { version = "1.4.0", features = ["stargate"] } + +cosmwasm-std = { version = "1.4.0", features = ["stargate", "cosmwasm_2_0"] } + ``` + + Please note that `cosmwasm_2_0` implies `cosmwasm_1_4`, `cosmwasm_1_3` and so + on, so there is no need to set multiple. + - `ContractInfoResponse::new` now takes all fields of the response as parameters: diff --git a/docs/CAPABILITIES-BUILT-IN.md b/docs/CAPABILITIES-BUILT-IN.md index bf31681e9d..1d1313618d 100644 --- a/docs/CAPABILITIES-BUILT-IN.md +++ b/docs/CAPABILITIES-BUILT-IN.md @@ -23,3 +23,5 @@ might define others. `DistributionQuery::DelegationTotalRewards` and `DistributionQuery::DelegatorValidators` queries. Only chains running CosmWasm `1.4.0` or higher support this. +- `cosmwasm_2_0` enables `CosmosMsg::Any`. Only chains running CosmWasm `2.0.0` + or higher support this. diff --git a/packages/go-gen/Cargo.toml b/packages/go-gen/Cargo.toml index 8e5ef67d65..d92f16e3b1 100644 --- a/packages/go-gen/Cargo.toml +++ b/packages/go-gen/Cargo.toml @@ -9,7 +9,7 @@ publish = false [dependencies] schemars = "0.8.3" -cosmwasm-std = { path = "../std", version = "1.5.0", features = ["cosmwasm_1_4", "staking", "stargate"] } +cosmwasm-std = { path = "../std", version = "1.5.0", features = ["cosmwasm_2_0", "staking", "stargate"] } cosmwasm-schema = { path = "../schema", version = "1.5.0" } anyhow = "1" Inflector = "0.11.4" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 7ece6bc72b..6dfdce060b 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -9,7 +9,7 @@ license = "Apache-2.0" readme = "README.md" [package.metadata.docs.rs] -features = ["abort", "stargate", "staking", "cosmwasm_1_4"] +features = ["abort", "stargate", "staking", "cosmwasm_2_0"] [features] default = ["iterator", "abort", "std"] @@ -46,6 +46,9 @@ cosmwasm_1_3 = ["cosmwasm_1_2"] # available for the contract to call. # It requires the host blockchain to run CosmWasm `1.4.0` or higher. cosmwasm_1_4 = ["cosmwasm_1_3"] +# This enables functionality that is only available on 2.0 chains. +# It adds `CosmosMsg::Any`, replacing `CosmosMsg::Stargate`. +cosmwasm_2_0 = ["cosmwasm_1_4"] [dependencies] base64 = "0.21.0" diff --git a/packages/std/src/exports.rs b/packages/std/src/exports.rs index 9cbd92fb8e..26925fa8b2 100644 --- a/packages/std/src/exports.rs +++ b/packages/std/src/exports.rs @@ -57,6 +57,10 @@ extern "C" fn requires_cosmwasm_1_3() -> () {} #[no_mangle] extern "C" fn requires_cosmwasm_1_4() -> () {} +#[cfg(feature = "cosmwasm_2_0")] +#[no_mangle] +extern "C" fn requires_cosmwasm_2_0() -> () {} + /// interface_version_* exports mark which Wasm VM interface level this contract is compiled for. /// They can be checked by cosmwasm_vm. /// Update this whenever the Wasm VM interface breaks. diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index 1336c35a50..874c0c2a1e 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -34,6 +34,7 @@ pub enum CosmosMsg { Staking(StakingMsg), #[cfg(feature = "staking")] Distribution(DistributionMsg), + #[cfg(feature = "cosmwasm_2_0")] Any(AnyMsg), #[cfg(feature = "stargate")] Ibc(IbcMsg), @@ -385,6 +386,7 @@ impl From for CosmosMsg { // By implementing `From for cosmwasm_std::AnyMsg`, // you automatically get a MyType -> CosmosMsg conversion. +#[cfg(feature = "cosmwasm_2_0")] impl, T> From for CosmosMsg { fn from(source: S) -> Self { CosmosMsg::::Any(source.into()) @@ -414,7 +416,7 @@ impl From for CosmosMsg { #[cfg(test)] mod tests { use super::*; - use crate::{coin, coins, to_json_string}; + use crate::{coin, coins}; #[test] fn from_bank_msg_works() { @@ -429,6 +431,7 @@ mod tests { } #[test] + #[cfg(feature = "cosmwasm_2_0")] fn from_any_msg_works() { // should work with AnyMsg let any = AnyMsg { @@ -519,13 +522,14 @@ mod tests { } #[test] + #[cfg(feature = "cosmwasm_2_0")] fn any_msg_serializes_to_correct_json() { // Same serialization as CosmosMsg::Stargate (see above), except the top level key let msg: CosmosMsg = CosmosMsg::Any(AnyMsg { type_url: "/cosmos.foo.v1beta.MsgBar".to_string(), value: Binary::from_base64("5yu/rQ+HrMcxH1zdga7P5hpGMLE=").unwrap(), }); - let json = to_json_string(&msg).unwrap(); + let json = crate::to_json_string(&msg).unwrap(); assert_eq!( json, r#"{"any":{"type_url":"/cosmos.foo.v1beta.MsgBar","value":"5yu/rQ+HrMcxH1zdga7P5hpGMLE="}}"#, diff --git a/packages/vm/src/testing/instance.rs b/packages/vm/src/testing/instance.rs index c89e4e237f..9373401d88 100644 --- a/packages/vm/src/testing/instance.rs +++ b/packages/vm/src/testing/instance.rs @@ -97,7 +97,7 @@ impl MockInstanceOptions<'_> { fn default_capabilities() -> HashSet { #[allow(unused_mut)] let mut out = capabilities_from_csv( - "iterator,staking,cosmwasm_1_1,cosmwasm_1_2,cosmwasm_1_3,cosmwasm_1_4", + "iterator,staking,cosmwasm_1_1,cosmwasm_1_2,cosmwasm_1_3,cosmwasm_1_4,cosmwasm_2_0", ); #[cfg(feature = "stargate")] out.insert("stargate".to_string()); From 9ba7bd7ec5b9b2c81ff079e800ba03f95797e661 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 20 Dec 2023 15:21:35 +0100 Subject: [PATCH 1071/2372] Add comment to capability exports --- packages/std/src/exports.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/std/src/exports.rs b/packages/std/src/exports.rs index 26925fa8b2..4a18ccf117 100644 --- a/packages/std/src/exports.rs +++ b/packages/std/src/exports.rs @@ -29,6 +29,9 @@ use crate::serde::{from_json, to_json_vec}; use crate::types::Env; use crate::{CustomMsg, Deps, DepsMut, MessageInfo}; +// These functions are used as markers for the chain to know which features this contract requires. +// If the chain does not support all the required features, it will reject storing the contract. +// See `docs/CAPABILITIES.md` for more details. #[cfg(feature = "iterator")] #[no_mangle] extern "C" fn requires_iterator() -> () {} From 3c091e513846da202ec1323b6168cc86bd7033a7 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 20 Dec 2023 15:25:28 +0100 Subject: [PATCH 1072/2372] Update schemas --- .../schema/ibc-reflect-send.json | 28 ------------------- .../schema/ibc/packet_msg.json | 28 ------------------- .../ibc-reflect-send/schema/raw/execute.json | 28 ------------------- .../ibc-reflect/schema/ibc/packet_msg.json | 28 ------------------- contracts/reflect/schema/raw/execute.json | 28 ------------------- contracts/reflect/schema/reflect.json | 28 ------------------- 6 files changed, 168 deletions(-) diff --git a/contracts/ibc-reflect-send/schema/ibc-reflect-send.json b/contracts/ibc-reflect-send/schema/ibc-reflect-send.json index 2d20c0778c..d17a18b5ad 100644 --- a/contracts/ibc-reflect-send/schema/ibc-reflect-send.json +++ b/contracts/ibc-reflect-send/schema/ibc-reflect-send.json @@ -114,22 +114,6 @@ } ], "definitions": { - "AnyMsg": { - "description": "A message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", - "type": "object", - "required": [ - "type_url", - "value" - ], - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "$ref": "#/definitions/Binary" - } - } - }, "BankMsg": { "description": "The message types of the bank module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto", "oneOf": [ @@ -256,18 +240,6 @@ }, "additionalProperties": false }, - { - "type": "object", - "required": [ - "any" - ], - "properties": { - "any": { - "$ref": "#/definitions/AnyMsg" - } - }, - "additionalProperties": false - }, { "type": "object", "required": [ diff --git a/contracts/ibc-reflect-send/schema/ibc/packet_msg.json b/contracts/ibc-reflect-send/schema/ibc/packet_msg.json index 5f767c7ef9..2026a4a8cb 100644 --- a/contracts/ibc-reflect-send/schema/ibc/packet_msg.json +++ b/contracts/ibc-reflect-send/schema/ibc/packet_msg.json @@ -52,22 +52,6 @@ } ], "definitions": { - "AnyMsg": { - "description": "A message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", - "type": "object", - "required": [ - "type_url", - "value" - ], - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "$ref": "#/definitions/Binary" - } - } - }, "BankMsg": { "description": "The message types of the bank module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto", "oneOf": [ @@ -194,18 +178,6 @@ }, "additionalProperties": false }, - { - "type": "object", - "required": [ - "any" - ], - "properties": { - "any": { - "$ref": "#/definitions/AnyMsg" - } - }, - "additionalProperties": false - }, { "type": "object", "required": [ diff --git a/contracts/ibc-reflect-send/schema/raw/execute.json b/contracts/ibc-reflect-send/schema/raw/execute.json index 9d3924037c..74b0ac6177 100644 --- a/contracts/ibc-reflect-send/schema/raw/execute.json +++ b/contracts/ibc-reflect-send/schema/raw/execute.json @@ -103,22 +103,6 @@ } ], "definitions": { - "AnyMsg": { - "description": "A message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", - "type": "object", - "required": [ - "type_url", - "value" - ], - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "$ref": "#/definitions/Binary" - } - } - }, "BankMsg": { "description": "The message types of the bank module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto", "oneOf": [ @@ -245,18 +229,6 @@ }, "additionalProperties": false }, - { - "type": "object", - "required": [ - "any" - ], - "properties": { - "any": { - "$ref": "#/definitions/AnyMsg" - } - }, - "additionalProperties": false - }, { "type": "object", "required": [ diff --git a/contracts/ibc-reflect/schema/ibc/packet_msg.json b/contracts/ibc-reflect/schema/ibc/packet_msg.json index be30fef8c5..fa0da797ce 100644 --- a/contracts/ibc-reflect/schema/ibc/packet_msg.json +++ b/contracts/ibc-reflect/schema/ibc/packet_msg.json @@ -112,22 +112,6 @@ } ], "definitions": { - "AnyMsg": { - "description": "A message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", - "type": "object", - "required": [ - "type_url", - "value" - ], - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "$ref": "#/definitions/Binary" - } - } - }, "BankMsg": { "description": "The message types of the bank module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto", "oneOf": [ @@ -230,18 +214,6 @@ }, "additionalProperties": false }, - { - "type": "object", - "required": [ - "any" - ], - "properties": { - "any": { - "$ref": "#/definitions/AnyMsg" - } - }, - "additionalProperties": false - }, { "type": "object", "required": [ diff --git a/contracts/reflect/schema/raw/execute.json b/contracts/reflect/schema/raw/execute.json index 0af550511d..db71bcc390 100644 --- a/contracts/reflect/schema/raw/execute.json +++ b/contracts/reflect/schema/raw/execute.json @@ -73,22 +73,6 @@ } ], "definitions": { - "AnyMsg": { - "description": "A message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", - "type": "object", - "required": [ - "type_url", - "value" - ], - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "$ref": "#/definitions/Binary" - } - } - }, "BankMsg": { "description": "The message types of the bank module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto", "oneOf": [ @@ -215,18 +199,6 @@ }, "additionalProperties": false }, - { - "type": "object", - "required": [ - "any" - ], - "properties": { - "any": { - "$ref": "#/definitions/AnyMsg" - } - }, - "additionalProperties": false - }, { "type": "object", "required": [ diff --git a/contracts/reflect/schema/reflect.json b/contracts/reflect/schema/reflect.json index 3b34e13ac9..05e8c7d4be 100644 --- a/contracts/reflect/schema/reflect.json +++ b/contracts/reflect/schema/reflect.json @@ -83,22 +83,6 @@ } ], "definitions": { - "AnyMsg": { - "description": "A message encoded the same way as a protobuf [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). This is the same structure as messages in `TxBody` from [ADR-020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md)", - "type": "object", - "required": [ - "type_url", - "value" - ], - "properties": { - "type_url": { - "type": "string" - }, - "value": { - "$ref": "#/definitions/Binary" - } - } - }, "BankMsg": { "description": "The message types of the bank module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/bank/v1beta1/tx.proto", "oneOf": [ @@ -225,18 +209,6 @@ }, "additionalProperties": false }, - { - "type": "object", - "required": [ - "any" - ], - "properties": { - "any": { - "$ref": "#/definitions/AnyMsg" - } - }, - "additionalProperties": false - }, { "type": "object", "required": [ From 8f99b9f8cca61ea38e5484c49bc296f0082bed2f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 20 Dec 2023 16:08:30 +0100 Subject: [PATCH 1073/2372] Add changelog entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f07ce8e87..0cb05008d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,11 +13,14 @@ and this project adheres to - cosmwasm-std: Add `Reply::gas_used`. ([#1954]) - cosmwasm-std: Add `SubMsgResponse::msg_responses` and deprecate `SubMsgResponse::data`. ([#1903]) +- cosmwasm-std: Add `cosmwasm_2_0` feature to enable 2.0 specific functionality. + ([#1974]) [#1878]: https://github.com/CosmWasm/cosmwasm/pull/1878 [#1903]: https://github.com/CosmWasm/cosmwasm/pull/1903 [#1929]: https://github.com/CosmWasm/cosmwasm/pull/1929 [#1954]: https://github.com/CosmWasm/cosmwasm/pull/1954 +[#1974]: https://github.com/CosmWasm/cosmwasm/pull/1974 ### Changed From 5e05483a8e86385507b6a82a918f2bda5f6788cd Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 18 Dec 2023 11:28:21 +0100 Subject: [PATCH 1074/2372] Add new grpc query --- packages/std/src/query/mod.rs | 17 ++++++++++++++++- packages/std/src/testing/mock.rs | 3 +++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/std/src/query/mod.rs b/packages/std/src/query/mod.rs index a6e0219c11..636bb0f8d4 100644 --- a/packages/std/src/query/mod.rs +++ b/packages/std/src/query/mod.rs @@ -2,7 +2,6 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use crate::prelude::*; -#[cfg(feature = "stargate")] use crate::Binary; use crate::Empty; @@ -63,6 +62,22 @@ pub enum QueryRequest { #[cfg(feature = "stargate")] Ibc(IbcQuery), Wasm(WasmQuery), + Grpc(GrpcQuery), +} + +/// Queries the chain using a grpc query. +/// This allows to query information that is not exposed in our API. +/// The chain needs to whitelist the supported queries. +/// The drawback of this query is that you have to handle the protobuf encoding and decoding yourself. +/// +/// The returned data is protobuf encoded. The protobuf type depends on the query. +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +pub struct GrpcQuery { + /// The fully qualified service path used for routing, + /// eg. "custom/cosmos_sdk.x.bank.v1.Query/QueryBalance" + path: String, + /// The expected protobuf message type (not any), binary encoded + data: Binary, } /// A trait that is required to avoid conflicts with other query types like BankQuery and WasmQuery diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index dd3395daf0..cb7e839268 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -605,6 +605,9 @@ impl MockQuerier { QueryRequest::Stargate { .. } => SystemResult::Err(SystemError::UnsupportedRequest { kind: "Stargate".to_string(), }), + QueryRequest::Grpc(_) => SystemResult::Err(SystemError::UnsupportedRequest { + kind: "GRPC".to_string(), + }), #[cfg(feature = "stargate")] QueryRequest::Ibc(msg) => self.ibc.query(msg), } From 2e15e769c9fa03fef755e7eeb3f7f0ddf40bf50d Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 18 Dec 2023 13:43:56 +0100 Subject: [PATCH 1075/2372] Update schemas --- contracts/reflect/schema/raw/query.json | 34 +++++++++++++++++++++++++ contracts/reflect/schema/reflect.json | 34 +++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/contracts/reflect/schema/raw/query.json b/contracts/reflect/schema/raw/query.json index ef21990549..069537b99e 100644 --- a/contracts/reflect/schema/raw/query.json +++ b/contracts/reflect/schema/raw/query.json @@ -324,6 +324,28 @@ } ] }, + "GrpcQuery": { + "description": "Queries the chain using a grpc query. This allows to query information that is not exposed in our API. The chain needs to whitelist the supported queries. The drawback of this query is that you have to handle the protobuf encoding and decoding yourself.\n\nThe returned data is protobuf encoded. The protobuf type depends on the query.", + "type": "object", + "required": [ + "data", + "path" + ], + "properties": { + "data": { + "description": "The expected protobuf message type (not any), binary encoded", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "path": { + "description": "The fully qualified service path used for routing, eg. \"custom/cosmos_sdk.x.bank.v1.Query/QueryBalance\"", + "type": "string" + } + } + }, "IbcQuery": { "description": "These are queries to the various IBC modules to see the state of the contract's IBC connection. These will return errors if the contract is not \"ibc enabled\"", "oneOf": [ @@ -522,6 +544,18 @@ } }, "additionalProperties": false + }, + { + "type": "object", + "required": [ + "grpc" + ], + "properties": { + "grpc": { + "$ref": "#/definitions/GrpcQuery" + } + }, + "additionalProperties": false } ] }, diff --git a/contracts/reflect/schema/reflect.json b/contracts/reflect/schema/reflect.json index 05e8c7d4be..decd37cca7 100644 --- a/contracts/reflect/schema/reflect.json +++ b/contracts/reflect/schema/reflect.json @@ -1327,6 +1327,28 @@ } ] }, + "GrpcQuery": { + "description": "Queries the chain using a grpc query. This allows to query information that is not exposed in our API. The chain needs to whitelist the supported queries. The drawback of this query is that you have to handle the protobuf encoding and decoding yourself.\n\nThe returned data is protobuf encoded. The protobuf type depends on the query.", + "type": "object", + "required": [ + "data", + "path" + ], + "properties": { + "data": { + "description": "The expected protobuf message type (not any), binary encoded", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "path": { + "description": "The fully qualified service path used for routing, eg. \"custom/cosmos_sdk.x.bank.v1.Query/QueryBalance\"", + "type": "string" + } + } + }, "IbcQuery": { "description": "These are queries to the various IBC modules to see the state of the contract's IBC connection. These will return errors if the contract is not \"ibc enabled\"", "oneOf": [ @@ -1525,6 +1547,18 @@ } }, "additionalProperties": false + }, + { + "type": "object", + "required": [ + "grpc" + ], + "properties": { + "grpc": { + "$ref": "#/definitions/GrpcQuery" + } + }, + "additionalProperties": false } ] }, From 34a55a625c524863efa808220622757b76e3b8ef Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 19 Dec 2023 12:24:45 +0100 Subject: [PATCH 1076/2372] Link to protobuf Any type Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/std/src/query/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/query/mod.rs b/packages/std/src/query/mod.rs index 636bb0f8d4..892e4cf7eb 100644 --- a/packages/std/src/query/mod.rs +++ b/packages/std/src/query/mod.rs @@ -76,7 +76,7 @@ pub struct GrpcQuery { /// The fully qualified service path used for routing, /// eg. "custom/cosmos_sdk.x.bank.v1.Query/QueryBalance" path: String, - /// The expected protobuf message type (not any), binary encoded + /// The expected protobuf message type (not [Any](https://protobuf.dev/programming-guides/proto3/#any)), binary encoded data: Binary, } From e36093c7c27e0cd4ac9a0e810309fc5a5f1ed0bf Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 19 Dec 2023 12:25:15 +0100 Subject: [PATCH 1077/2372] Improve wording Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/std/src/query/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/query/mod.rs b/packages/std/src/query/mod.rs index 892e4cf7eb..73e97a3640 100644 --- a/packages/std/src/query/mod.rs +++ b/packages/std/src/query/mod.rs @@ -67,7 +67,7 @@ pub enum QueryRequest { /// Queries the chain using a grpc query. /// This allows to query information that is not exposed in our API. -/// The chain needs to whitelist the supported queries. +/// The chain needs to allowlist the supported queries. /// The drawback of this query is that you have to handle the protobuf encoding and decoding yourself. /// /// The returned data is protobuf encoded. The protobuf type depends on the query. From 498d9d3d02596dd03b14430d461fad40707ebe92 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 19 Dec 2023 13:04:24 +0100 Subject: [PATCH 1078/2372] Deprecate Stargate query --- packages/std/src/query/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/std/src/query/mod.rs b/packages/std/src/query/mod.rs index 73e97a3640..ae57447c41 100644 --- a/packages/std/src/query/mod.rs +++ b/packages/std/src/query/mod.rs @@ -52,6 +52,7 @@ pub enum QueryRequest { /// The response is protobuf encoded data directly without a JSON response wrapper. /// The caller is responsible for compiling the proper protobuf definitions for both requests and responses. #[cfg(feature = "stargate")] + #[deprecated = "Please use the GrpcQuery instead"] Stargate { /// this is the fully qualified service path used for routing, /// eg. custom/cosmos_sdk.x.bank.v1.Query/QueryBalance From dea14925625726e30eac23280eae6ab995abba15 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 19 Dec 2023 13:04:58 +0100 Subject: [PATCH 1079/2372] Add GrpcQuery to QueryRequest conversion --- packages/std/src/query/mod.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/std/src/query/mod.rs b/packages/std/src/query/mod.rs index ae57447c41..3a23e8ad29 100644 --- a/packages/std/src/query/mod.rs +++ b/packages/std/src/query/mod.rs @@ -131,6 +131,12 @@ impl From for QueryRequest { } } +impl From for QueryRequest { + fn from(msg: GrpcQuery) -> Self { + QueryRequest::Grpc(msg) + } +} + #[cfg(feature = "stargate")] impl From for QueryRequest { fn from(msg: IbcQuery) -> Self { From 22a8bd1aec71548baffc94af5f644e410da0ab45 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 19 Dec 2023 13:59:35 +0100 Subject: [PATCH 1080/2372] Improve grpc query docs --- packages/std/src/query/mod.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/std/src/query/mod.rs b/packages/std/src/query/mod.rs index 3a23e8ad29..19597c501f 100644 --- a/packages/std/src/query/mod.rs +++ b/packages/std/src/query/mod.rs @@ -72,10 +72,14 @@ pub enum QueryRequest { /// The drawback of this query is that you have to handle the protobuf encoding and decoding yourself. /// /// The returned data is protobuf encoded. The protobuf type depends on the query. +/// +/// To find the path, as well as the request and response types, +/// you can query the chain's gRPC endpoint using a tool like +/// [grpcurl](https://github.com/fullstorydev/grpcurl). #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] pub struct GrpcQuery { - /// The fully qualified service path used for routing, - /// eg. "custom/cosmos_sdk.x.bank.v1.Query/QueryBalance" + /// The fully qualified endpoint path used for routing, + /// eg. "cosmos.authz.v1beta1.Query.Grants" path: String, /// The expected protobuf message type (not [Any](https://protobuf.dev/programming-guides/proto3/#any)), binary encoded data: Binary, From 752c8306ef9cb2f7d0077142b3eeac32ce290c7b Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 19 Dec 2023 15:09:23 +0100 Subject: [PATCH 1081/2372] Fix deprecation warnings --- packages/std/src/query/mod.rs | 3 +++ packages/std/src/testing/mock.rs | 1 + 2 files changed, 4 insertions(+) diff --git a/packages/std/src/query/mod.rs b/packages/std/src/query/mod.rs index 19597c501f..a3cd4b2681 100644 --- a/packages/std/src/query/mod.rs +++ b/packages/std/src/query/mod.rs @@ -1,3 +1,6 @@ +// needed because the derive macros on QueryRequest use the deprecated `Stargate` variant +#![allow(deprecated)] + use schemars::JsonSchema; use serde::{Deserialize, Serialize}; diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index cb7e839268..abe163649e 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -602,6 +602,7 @@ impl MockQuerier { } QueryRequest::Wasm(msg) => self.wasm.query(msg), #[cfg(feature = "stargate")] + #[allow(deprecated)] QueryRequest::Stargate { .. } => SystemResult::Err(SystemError::UnsupportedRequest { kind: "Stargate".to_string(), }), From a8725fa4ddb945047a1ba6d0baaeea7076e74ce9 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 20 Dec 2023 13:48:32 +0100 Subject: [PATCH 1082/2372] Fix stargate and grpc query docs --- packages/std/src/query/mod.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/std/src/query/mod.rs b/packages/std/src/query/mod.rs index a3cd4b2681..a10e798402 100644 --- a/packages/std/src/query/mod.rs +++ b/packages/std/src/query/mod.rs @@ -58,7 +58,7 @@ pub enum QueryRequest { #[deprecated = "Please use the GrpcQuery instead"] Stargate { /// this is the fully qualified service path used for routing, - /// eg. custom/cosmos_sdk.x.bank.v1.Query/QueryBalance + /// eg. "/cosmos_sdk.x.bank.v1.Query/QueryBalance" path: String, /// this is the expected protobuf message type (not any), binary encoded data: Binary, @@ -81,8 +81,9 @@ pub enum QueryRequest { /// [grpcurl](https://github.com/fullstorydev/grpcurl). #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] pub struct GrpcQuery { - /// The fully qualified endpoint path used for routing, - /// eg. "cosmos.authz.v1beta1.Query.Grants" + /// The fully qualified endpoint path used for routing. + /// It follows the format `/service_path/method_name`, + /// eg. "/cosmos.authz.v1beta1.Query/Grants" path: String, /// The expected protobuf message type (not [Any](https://protobuf.dev/programming-guides/proto3/#any)), binary encoded data: Binary, From e1aa326e25b0c5a40098d59a4aa2ec8a47b98fe9 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 20 Dec 2023 15:58:52 +0100 Subject: [PATCH 1083/2372] Update schemas --- contracts/reflect/schema/raw/query.json | 9 +++++---- contracts/reflect/schema/reflect.json | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/contracts/reflect/schema/raw/query.json b/contracts/reflect/schema/raw/query.json index 069537b99e..4191afab52 100644 --- a/contracts/reflect/schema/raw/query.json +++ b/contracts/reflect/schema/raw/query.json @@ -325,7 +325,7 @@ ] }, "GrpcQuery": { - "description": "Queries the chain using a grpc query. This allows to query information that is not exposed in our API. The chain needs to whitelist the supported queries. The drawback of this query is that you have to handle the protobuf encoding and decoding yourself.\n\nThe returned data is protobuf encoded. The protobuf type depends on the query.", + "description": "Queries the chain using a grpc query. This allows to query information that is not exposed in our API. The chain needs to allowlist the supported queries. The drawback of this query is that you have to handle the protobuf encoding and decoding yourself.\n\nThe returned data is protobuf encoded. The protobuf type depends on the query.\n\nTo find the path, as well as the request and response types, you can query the chain's gRPC endpoint using a tool like [grpcurl](https://github.com/fullstorydev/grpcurl).", "type": "object", "required": [ "data", @@ -333,7 +333,7 @@ ], "properties": { "data": { - "description": "The expected protobuf message type (not any), binary encoded", + "description": "The expected protobuf message type (not [Any](https://protobuf.dev/programming-guides/proto3/#any)), binary encoded", "allOf": [ { "$ref": "#/definitions/Binary" @@ -341,7 +341,7 @@ ] }, "path": { - "description": "The fully qualified service path used for routing, eg. \"custom/cosmos_sdk.x.bank.v1.Query/QueryBalance\"", + "description": "The fully qualified endpoint path used for routing. It follows the format `/service_path/method_name`, eg. \"/cosmos.authz.v1beta1.Query/Grants\"", "type": "string" } } @@ -492,6 +492,7 @@ }, { "description": "A Stargate query is encoded the same way as abci_query, with path and protobuf encoded request data. The format is defined in [ADR-21](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-021-protobuf-query-encoding.md). The response is protobuf encoded data directly without a JSON response wrapper. The caller is responsible for compiling the proper protobuf definitions for both requests and responses.", + "deprecated": true, "type": "object", "required": [ "stargate" @@ -513,7 +514,7 @@ ] }, "path": { - "description": "this is the fully qualified service path used for routing, eg. custom/cosmos_sdk.x.bank.v1.Query/QueryBalance", + "description": "this is the fully qualified service path used for routing, eg. \"/cosmos_sdk.x.bank.v1.Query/QueryBalance\"", "type": "string" } } diff --git a/contracts/reflect/schema/reflect.json b/contracts/reflect/schema/reflect.json index decd37cca7..9877aa1a42 100644 --- a/contracts/reflect/schema/reflect.json +++ b/contracts/reflect/schema/reflect.json @@ -1328,7 +1328,7 @@ ] }, "GrpcQuery": { - "description": "Queries the chain using a grpc query. This allows to query information that is not exposed in our API. The chain needs to whitelist the supported queries. The drawback of this query is that you have to handle the protobuf encoding and decoding yourself.\n\nThe returned data is protobuf encoded. The protobuf type depends on the query.", + "description": "Queries the chain using a grpc query. This allows to query information that is not exposed in our API. The chain needs to allowlist the supported queries. The drawback of this query is that you have to handle the protobuf encoding and decoding yourself.\n\nThe returned data is protobuf encoded. The protobuf type depends on the query.\n\nTo find the path, as well as the request and response types, you can query the chain's gRPC endpoint using a tool like [grpcurl](https://github.com/fullstorydev/grpcurl).", "type": "object", "required": [ "data", @@ -1336,7 +1336,7 @@ ], "properties": { "data": { - "description": "The expected protobuf message type (not any), binary encoded", + "description": "The expected protobuf message type (not [Any](https://protobuf.dev/programming-guides/proto3/#any)), binary encoded", "allOf": [ { "$ref": "#/definitions/Binary" @@ -1344,7 +1344,7 @@ ] }, "path": { - "description": "The fully qualified service path used for routing, eg. \"custom/cosmos_sdk.x.bank.v1.Query/QueryBalance\"", + "description": "The fully qualified endpoint path used for routing. It follows the format `/service_path/method_name`, eg. \"/cosmos.authz.v1beta1.Query/Grants\"", "type": "string" } } @@ -1495,6 +1495,7 @@ }, { "description": "A Stargate query is encoded the same way as abci_query, with path and protobuf encoded request data. The format is defined in [ADR-21](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-021-protobuf-query-encoding.md). The response is protobuf encoded data directly without a JSON response wrapper. The caller is responsible for compiling the proper protobuf definitions for both requests and responses.", + "deprecated": true, "type": "object", "required": [ "stargate" @@ -1516,7 +1517,7 @@ ] }, "path": { - "description": "this is the fully qualified service path used for routing, eg. custom/cosmos_sdk.x.bank.v1.Query/QueryBalance", + "description": "this is the fully qualified service path used for routing, eg. \"/cosmos_sdk.x.bank.v1.Query/QueryBalance\"", "type": "string" } } From 677b09607bc1423ce07bf106a9c3b281c84b6019 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 20 Dec 2023 16:21:51 +0100 Subject: [PATCH 1084/2372] Feature-gate grpc query --- docs/CAPABILITIES-BUILT-IN.md | 4 ++-- packages/std/Cargo.toml | 2 +- packages/std/src/query/mod.rs | 2 ++ packages/std/src/testing/mock.rs | 1 + 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/CAPABILITIES-BUILT-IN.md b/docs/CAPABILITIES-BUILT-IN.md index 1d1313618d..b9c43bf19e 100644 --- a/docs/CAPABILITIES-BUILT-IN.md +++ b/docs/CAPABILITIES-BUILT-IN.md @@ -23,5 +23,5 @@ might define others. `DistributionQuery::DelegationTotalRewards` and `DistributionQuery::DelegatorValidators` queries. Only chains running CosmWasm `1.4.0` or higher support this. -- `cosmwasm_2_0` enables `CosmosMsg::Any`. Only chains running CosmWasm `2.0.0` - or higher support this. +- `cosmwasm_2_0` enables `CosmosMsg::Any` and `QueryRequest::Grpc`. Only chains + running CosmWasm `2.0.0` or higher support this. diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 6dfdce060b..0e89233675 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -47,7 +47,7 @@ cosmwasm_1_3 = ["cosmwasm_1_2"] # It requires the host blockchain to run CosmWasm `1.4.0` or higher. cosmwasm_1_4 = ["cosmwasm_1_3"] # This enables functionality that is only available on 2.0 chains. -# It adds `CosmosMsg::Any`, replacing `CosmosMsg::Stargate`. +# It adds `CosmosMsg::Any`, replacing `CosmosMsg::Stargate`. It also adds `QueryRequest::Grpc`. cosmwasm_2_0 = ["cosmwasm_1_4"] [dependencies] diff --git a/packages/std/src/query/mod.rs b/packages/std/src/query/mod.rs index a10e798402..ded13c2d7f 100644 --- a/packages/std/src/query/mod.rs +++ b/packages/std/src/query/mod.rs @@ -66,6 +66,7 @@ pub enum QueryRequest { #[cfg(feature = "stargate")] Ibc(IbcQuery), Wasm(WasmQuery), + #[cfg(feature = "cosmwasm_2_0")] Grpc(GrpcQuery), } @@ -139,6 +140,7 @@ impl From for QueryRequest { } } +#[cfg(feature = "cosmwasm_2_0")] impl From for QueryRequest { fn from(msg: GrpcQuery) -> Self { QueryRequest::Grpc(msg) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index abe163649e..b3bf55f28f 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -606,6 +606,7 @@ impl MockQuerier { QueryRequest::Stargate { .. } => SystemResult::Err(SystemError::UnsupportedRequest { kind: "Stargate".to_string(), }), + #[cfg(feature = "cosmwasm_2_0")] QueryRequest::Grpc(_) => SystemResult::Err(SystemError::UnsupportedRequest { kind: "GRPC".to_string(), }), From 4f0a8ed92a7d8903eaf6251333d5bd87cc50b398 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 20 Dec 2023 16:27:34 +0100 Subject: [PATCH 1085/2372] Add changelog entry for grpc query --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cb05008d7..a50e5c53fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -72,6 +72,8 @@ and this project adheres to - cosmwasm-std: Make `IbcReceiveResponse::acknowledgement` optional and add `IbcReceiveResponse::without_ack` constructor. ([#1892]) - cosmwasm-std: Add `std` feature and make it a default feature. ([#1971]) +- cosmwasm-std: Add `QueryRequest::Grpc` and deprecate `QueryRequest::Stargate`. + ([#1973]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 @@ -91,6 +93,7 @@ and this project adheres to [#1949]: https://github.com/CosmWasm/cosmwasm/pull/1949 [#1967]: https://github.com/CosmWasm/cosmwasm/pull/1967 [#1971]: https://github.com/CosmWasm/cosmwasm/pull/1971 +[#1973]: https://github.com/CosmWasm/cosmwasm/pull/1973 ### Removed From 9662f73ece4ed2044f353025ba8eaefc33c67f05 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 20 Dec 2023 16:32:45 +0100 Subject: [PATCH 1086/2372] Update schemas --- contracts/reflect/schema/raw/query.json | 34 ------------------------- contracts/reflect/schema/reflect.json | 34 ------------------------- 2 files changed, 68 deletions(-) diff --git a/contracts/reflect/schema/raw/query.json b/contracts/reflect/schema/raw/query.json index 4191afab52..7c37f35326 100644 --- a/contracts/reflect/schema/raw/query.json +++ b/contracts/reflect/schema/raw/query.json @@ -324,28 +324,6 @@ } ] }, - "GrpcQuery": { - "description": "Queries the chain using a grpc query. This allows to query information that is not exposed in our API. The chain needs to allowlist the supported queries. The drawback of this query is that you have to handle the protobuf encoding and decoding yourself.\n\nThe returned data is protobuf encoded. The protobuf type depends on the query.\n\nTo find the path, as well as the request and response types, you can query the chain's gRPC endpoint using a tool like [grpcurl](https://github.com/fullstorydev/grpcurl).", - "type": "object", - "required": [ - "data", - "path" - ], - "properties": { - "data": { - "description": "The expected protobuf message type (not [Any](https://protobuf.dev/programming-guides/proto3/#any)), binary encoded", - "allOf": [ - { - "$ref": "#/definitions/Binary" - } - ] - }, - "path": { - "description": "The fully qualified endpoint path used for routing. It follows the format `/service_path/method_name`, eg. \"/cosmos.authz.v1beta1.Query/Grants\"", - "type": "string" - } - } - }, "IbcQuery": { "description": "These are queries to the various IBC modules to see the state of the contract's IBC connection. These will return errors if the contract is not \"ibc enabled\"", "oneOf": [ @@ -545,18 +523,6 @@ } }, "additionalProperties": false - }, - { - "type": "object", - "required": [ - "grpc" - ], - "properties": { - "grpc": { - "$ref": "#/definitions/GrpcQuery" - } - }, - "additionalProperties": false } ] }, diff --git a/contracts/reflect/schema/reflect.json b/contracts/reflect/schema/reflect.json index 9877aa1a42..aaf5d1dea0 100644 --- a/contracts/reflect/schema/reflect.json +++ b/contracts/reflect/schema/reflect.json @@ -1327,28 +1327,6 @@ } ] }, - "GrpcQuery": { - "description": "Queries the chain using a grpc query. This allows to query information that is not exposed in our API. The chain needs to allowlist the supported queries. The drawback of this query is that you have to handle the protobuf encoding and decoding yourself.\n\nThe returned data is protobuf encoded. The protobuf type depends on the query.\n\nTo find the path, as well as the request and response types, you can query the chain's gRPC endpoint using a tool like [grpcurl](https://github.com/fullstorydev/grpcurl).", - "type": "object", - "required": [ - "data", - "path" - ], - "properties": { - "data": { - "description": "The expected protobuf message type (not [Any](https://protobuf.dev/programming-guides/proto3/#any)), binary encoded", - "allOf": [ - { - "$ref": "#/definitions/Binary" - } - ] - }, - "path": { - "description": "The fully qualified endpoint path used for routing. It follows the format `/service_path/method_name`, eg. \"/cosmos.authz.v1beta1.Query/Grants\"", - "type": "string" - } - } - }, "IbcQuery": { "description": "These are queries to the various IBC modules to see the state of the contract's IBC connection. These will return errors if the contract is not \"ibc enabled\"", "oneOf": [ @@ -1548,18 +1526,6 @@ } }, "additionalProperties": false - }, - { - "type": "object", - "required": [ - "grpc" - ], - "properties": { - "grpc": { - "$ref": "#/definitions/GrpcQuery" - } - }, - "additionalProperties": false } ] }, From 78fa88504e30ccb0510c0abfaaf6e9037ccacbae Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 20 Dec 2023 18:03:11 +0100 Subject: [PATCH 1087/2372] Throw compiler error if std feature is not enabled --- packages/std/src/prelude.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/std/src/prelude.rs b/packages/std/src/prelude.rs index ad2d30b855..50b9a3556a 100644 --- a/packages/std/src/prelude.rs +++ b/packages/std/src/prelude.rs @@ -4,3 +4,6 @@ pub use alloc::string::{String, ToString}; pub use alloc::vec; pub use alloc::vec::Vec; pub use core::option::Option::{self, None, Some}; + +#[cfg(not(feature = "std"))] +core::compile_error!("Please enable `cosmwasm-std`'s `std` feature, as we might move existing functionality to that feature in the future."); From fb01967235f79b98d0245484a09d37bf67107f0a Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 20 Dec 2023 18:32:00 +0100 Subject: [PATCH 1088/2372] Fix builds --- .circleci/config.yml | 6 +++--- contracts/cyberpunk/Cargo.toml | 2 +- contracts/hackatom/Cargo.toml | 2 +- contracts/reflect/Cargo.toml | 2 +- contracts/staking/Cargo.toml | 2 +- devtools/check_workspace.sh | 8 ++++---- packages/std/src/lib.rs | 7 +++++++ packages/std/src/prelude.rs | 3 --- packages/vm/Cargo.toml | 2 +- 9 files changed, 19 insertions(+), 15 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index e8ab8ed68c..501fd22bfd 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -344,15 +344,15 @@ jobs: - run: name: Build library for native target (no features) working_directory: ~/project/packages/std - command: cargo build --locked --no-default-features + command: cargo build --locked --no-default-features --features std - run: name: Build library for wasm target (no features) working_directory: ~/project/packages/std - command: cargo wasm --locked --no-default-features + command: cargo wasm --locked --no-default-features --features std - run: name: Run unit tests (no features) working_directory: ~/project/packages/std - command: cargo test --locked --no-default-features + command: cargo test --locked --no-default-features --features std - run: name: Build library for native target (all features) working_directory: ~/project/packages/std diff --git a/contracts/cyberpunk/Cargo.toml b/contracts/cyberpunk/Cargo.toml index 0b3e833c2d..fd512ae171 100644 --- a/contracts/cyberpunk/Cargo.toml +++ b/contracts/cyberpunk/Cargo.toml @@ -28,7 +28,7 @@ cranelift = ["cosmwasm-vm/cranelift"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } -cosmwasm-std = { path = "../../packages/std", default-features = false, features = ["abort", "cosmwasm_1_3"] } +cosmwasm-std = { path = "../../packages/std", default-features = false, features = ["std", "abort", "cosmwasm_1_3"] } rust-argon2 = "0.8" thiserror = "1.0.26" diff --git a/contracts/hackatom/Cargo.toml b/contracts/hackatom/Cargo.toml index 08a68ddd1b..cf476e9cca 100644 --- a/contracts/hackatom/Cargo.toml +++ b/contracts/hackatom/Cargo.toml @@ -30,7 +30,7 @@ cranelift = ["cosmwasm-vm/cranelift"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } -cosmwasm-std = { path = "../../packages/std", default-features = false, features = ["abort"] } +cosmwasm-std = { path = "../../packages/std", default-features = false, features = ["std", "abort"] } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } sha2 = "0.10" diff --git a/contracts/reflect/Cargo.toml b/contracts/reflect/Cargo.toml index 9f68a486bc..c6d3dc719e 100644 --- a/contracts/reflect/Cargo.toml +++ b/contracts/reflect/Cargo.toml @@ -31,7 +31,7 @@ cranelift = ["cosmwasm-vm/cranelift"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } -cosmwasm-std = { path = "../../packages/std", default-features = false, features = ["staking", "stargate", "cosmwasm_1_4"] } +cosmwasm-std = { path = "../../packages/std", default-features = false, features = ["std", "staking", "stargate", "cosmwasm_1_4"] } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } thiserror = "1.0.26" diff --git a/contracts/staking/Cargo.toml b/contracts/staking/Cargo.toml index 7e5ca0a853..67122e604c 100644 --- a/contracts/staking/Cargo.toml +++ b/contracts/staking/Cargo.toml @@ -30,7 +30,7 @@ cranelift = ["cosmwasm-vm/cranelift"] [dependencies] cosmwasm-schema = { path = "../../packages/schema" } -cosmwasm-std = { path = "../../packages/std", default-features = false, features = ["staking"] } +cosmwasm-std = { path = "../../packages/std", default-features = false, features = ["std", "staking"] } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } snafu = "0.6.6" diff --git a/devtools/check_workspace.sh b/devtools/check_workspace.sh index 76f8d387d6..34aba0bfdd 100755 --- a/devtools/check_workspace.sh +++ b/devtools/check_workspace.sh @@ -9,11 +9,11 @@ cargo fmt cd packages/std # default, min, all cargo check - cargo check --no-default-features - cargo check --features abort,iterator,staking,stargate,cosmwasm_1_2 + cargo check --no-default-features --features std + cargo check --features std,abort,iterator,staking,stargate,cosmwasm_1_2 cargo wasm-debug - cargo wasm-debug --features iterator,staking,stargate - cargo clippy --all-targets --features iterator,staking,stargate -- -D warnings + cargo wasm-debug --features std,iterator,staking,stargate + cargo clippy --all-targets --features std,iterator,staking,stargate -- -D warnings ) (cd packages/schema && cargo build && cargo clippy --all-targets -- -D warnings) (cd packages/schema-derive && cargo build && cargo clippy --all-targets -- -D warnings) diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 1e6194ff54..69b1c1e2cf 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -1,5 +1,12 @@ extern crate alloc; +#[cfg(not(feature = "std"))] +core::compile_error!( + r#"Please enable `cosmwasm-std`'s `std` feature, as we might move existing functionality to that feature in the future. +Builds without the std feature are currently not expected to work. If you need no_std support see #1484. +"# +); + // Exposed on all platforms mod addresses; diff --git a/packages/std/src/prelude.rs b/packages/std/src/prelude.rs index 50b9a3556a..ad2d30b855 100644 --- a/packages/std/src/prelude.rs +++ b/packages/std/src/prelude.rs @@ -4,6 +4,3 @@ pub use alloc::string::{String, ToString}; pub use alloc::vec; pub use alloc::vec::Vec; pub use core::option::Option::{self, None, Some}; - -#[cfg(not(feature = "std"))] -core::compile_error!("Please enable `cosmwasm-std`'s `std` feature, as we might move existing functionality to that feature in the future."); diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index a53e3096da..b1e98e11d1 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -31,7 +31,7 @@ clru = "0.6.1" crc32fast = "1.3.2" bech32 = "0.9.1" # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.5.0", default-features = false } +cosmwasm-std = { path = "../std", version = "1.5.0", default-features = false, features = ["std"] } cosmwasm-crypto = { path = "../crypto", version = "1.5.0" } derivative = "2" hex = "0.4" From 9d9131bef2fec9c3907ba3108a15169b80774726 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 20 Dec 2023 18:58:51 +0100 Subject: [PATCH 1089/2372] Make grpc query fields public --- packages/std/src/query/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/std/src/query/mod.rs b/packages/std/src/query/mod.rs index ded13c2d7f..8082fdd44d 100644 --- a/packages/std/src/query/mod.rs +++ b/packages/std/src/query/mod.rs @@ -85,9 +85,9 @@ pub struct GrpcQuery { /// The fully qualified endpoint path used for routing. /// It follows the format `/service_path/method_name`, /// eg. "/cosmos.authz.v1beta1.Query/Grants" - path: String, + pub path: String, /// The expected protobuf message type (not [Any](https://protobuf.dev/programming-guides/proto3/#any)), binary encoded - data: Binary, + pub data: Binary, } /// A trait that is required to avoid conflicts with other query types like BankQuery and WasmQuery From 2d8baa9895f1304150faa2c9c02777bde56e2c4e Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 20 Dec 2023 19:00:19 +0100 Subject: [PATCH 1090/2372] Add migrating entry for grpc query --- MIGRATING.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/MIGRATING.md b/MIGRATING.md index d1dc8c6099..e13975ac2e 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -189,6 +189,23 @@ major releases of `cosmwasm`. Note that you can also view the +}; ``` +- If you were using `QueryRequest::Stargate`, you might want to enable the + `cosmwasm_2_0` cargo feature and migrate to `QueryRequest::Grpc` instead. + While the stargate query sometimes returns protobuf encoded data and sometimes + JSON encoded data, depending on the chain, the gRPC query always returns + protobuf encoded data. + + ```diff + -deps.querier.query(&QueryRequest::Stargate { + - path: "/service.Path/ServiceMethod".to_string(), + - data: Binary::new(b"DATA"), + -})?; + +deps.querier.query(&QueryRequest::Grpc(GrpcQuery { + + path: "/service.Path/ServiceMethod".to_string(), + + data: Binary::new(b"DATA"), + +}))?; + ``` + ## 1.4.x -> 1.5.0 - Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): From ec2b971641891897f10837dad161fb70e2f4f5d1 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 21 Dec 2023 11:11:41 +0100 Subject: [PATCH 1091/2372] Expose sub-queriers directly in MockQuerier --- contracts/cyberpunk/src/contract.rs | 2 +- contracts/hackatom/src/contract.rs | 8 +++-- contracts/ibc-reflect/src/contract.rs | 2 +- contracts/staking/src/contract.rs | 4 ++- packages/std/src/testing/mock.rs | 45 ++------------------------- packages/vm/src/testing/querier.rs | 2 +- 6 files changed, 15 insertions(+), 48 deletions(-) diff --git a/contracts/cyberpunk/src/contract.rs b/contracts/cyberpunk/src/contract.rs index 2084f630df..4972297e00 100644 --- a/contracts/cyberpunk/src/contract.rs +++ b/contracts/cyberpunk/src/contract.rs @@ -254,7 +254,7 @@ mod tests { fn query_denoms_works() { let mut deps = setup(); - deps.querier.set_denom_metadata( + deps.querier.bank.set_denom_metadata( &(0..98) .map(|i| DenomMetadata { symbol: format!("FOO{i}"), diff --git a/contracts/hackatom/src/contract.rs b/contracts/hackatom/src/contract.rs index a6314dcc43..e333718cfb 100644 --- a/contracts/hackatom/src/contract.rs +++ b/contracts/hackatom/src/contract.rs @@ -444,7 +444,9 @@ mod tests { assert_eq!(init_res.messages.len(), 0); // balance changed in init - deps.querier.update_balance(MOCK_CONTRACT_ADDR, init_amount); + deps.querier + .bank + .update_balance(MOCK_CONTRACT_ADDR, init_amount); // beneficiary can release it let execute_info = mock_info(verifier.as_str(), &[]); @@ -490,7 +492,9 @@ mod tests { assert_eq!(init_res.messages.len(), 0); // balance changed in init - deps.querier.update_balance(MOCK_CONTRACT_ADDR, init_amount); + deps.querier + .bank + .update_balance(MOCK_CONTRACT_ADDR, init_amount); // beneficiary cannot release it let execute_info = mock_info(beneficiary.as_str(), &[]); diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index b6b9366d34..900ed8f242 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -614,7 +614,7 @@ mod tests { connect(deps.as_mut(), channel_id, &account); // assign it some funds let funds = vec![coin(123456, "uatom"), coin(7654321, "tgrd")]; - deps.querier.update_balance(&account, funds.clone()); + deps.querier.bank.update_balance(&account, funds.clone()); // channel should be listed and have balance let raw = query(deps.as_ref(), mock_env(), QueryMsg::ListAccounts {}).unwrap(); diff --git a/contracts/staking/src/contract.rs b/contracts/staking/src/contract.rs index ff0cbccb92..949c4bccf1 100644 --- a/contracts/staking/src/contract.rs +++ b/contracts/staking/src/contract.rs @@ -608,6 +608,7 @@ mod tests { let rebond_msg = ExecuteMsg::_BondAllTokens {}; let info = mock_info(MOCK_CONTRACT_ADDR, &[]); deps.querier + .bank .update_balance(MOCK_CONTRACT_ADDR, coins(500, "ustake")); let _ = execute(deps.as_mut(), mock_env(), info, rebond_msg).unwrap(); @@ -699,12 +700,13 @@ mod tests { let rebond_msg = ExecuteMsg::_BondAllTokens {}; let info = mock_info(MOCK_CONTRACT_ADDR, &[]); deps.querier + .bank .update_balance(MOCK_CONTRACT_ADDR, coins(500, "ustake")); let _ = execute(deps.as_mut(), mock_env(), info, rebond_msg).unwrap(); // update the querier with new bond, lower balance set_delegation(&mut deps.querier, 1500, "ustake"); - deps.querier.update_balance(MOCK_CONTRACT_ADDR, vec![]); + deps.querier.bank.update_balance(MOCK_CONTRACT_ADDR, vec![]); // creator now tries to unbond these tokens - this must fail let unbond_msg = ExecuteMsg::Unbond { diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index b3bf55f28f..b9de939b35 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -462,11 +462,11 @@ pub type MockQuerierCustomHandlerResult = SystemResult>; /// MockQuerier holds an immutable table of bank balances /// and configurable handlers for Wasm queries and custom queries. pub struct MockQuerier { - bank: BankQuerier, + pub bank: BankQuerier, #[cfg(feature = "staking")] staking: StakingQuerier, #[cfg(feature = "cosmwasm_1_3")] - distribution: DistributionQuerier, + pub distribution: DistributionQuerier, wasm: WasmQuerier, #[cfg(feature = "stargate")] ibc: IbcQuerier, @@ -497,46 +497,6 @@ impl MockQuerier { } } - // set a new balance for the given address and return the old balance - pub fn update_balance( - &mut self, - addr: impl Into, - balance: Vec, - ) -> Option> { - self.bank.update_balance(addr, balance) - } - - pub fn set_denom_metadata(&mut self, denom_metadata: &[DenomMetadata]) { - self.bank.set_denom_metadata(denom_metadata); - } - - #[cfg(feature = "cosmwasm_1_3")] - pub fn set_withdraw_address( - &mut self, - delegator_address: impl Into, - withdraw_address: impl Into, - ) { - self.distribution - .set_withdraw_address(delegator_address, withdraw_address); - } - - /// Sets multiple withdraw addresses. - /// - /// This allows passing multiple tuples of `(delegator_address, withdraw_address)`. - /// It does not overwrite existing entries. - #[cfg(feature = "cosmwasm_1_3")] - pub fn set_withdraw_addresses( - &mut self, - withdraw_addresses: impl IntoIterator, impl Into)>, - ) { - self.distribution.set_withdraw_addresses(withdraw_addresses); - } - - #[cfg(feature = "cosmwasm_1_3")] - pub fn clear_withdraw_addresses(&mut self) { - self.distribution.clear_withdraw_addresses(); - } - #[cfg(feature = "staking")] pub fn update_staking( &mut self, @@ -690,6 +650,7 @@ impl BankQuerier { } } + /// set a new balance for the given address and return the old balance pub fn update_balance( &mut self, addr: impl Into, diff --git a/packages/vm/src/testing/querier.rs b/packages/vm/src/testing/querier.rs index cf516bceca..b0993c72bc 100644 --- a/packages/vm/src/testing/querier.rs +++ b/packages/vm/src/testing/querier.rs @@ -32,7 +32,7 @@ impl MockQuerier { addr: impl Into, balance: Vec, ) -> Option> { - self.querier.update_balance(addr, balance) + self.querier.bank.update_balance(addr, balance) } #[cfg(feature = "staking")] From f4b5f3ad961b80a58c59c5584ef7627fde01a729 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 21 Dec 2023 11:28:05 +0100 Subject: [PATCH 1092/2372] Add changelog entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a50e5c53fb..b4e3cea2fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -74,6 +74,9 @@ and this project adheres to - cosmwasm-std: Add `std` feature and make it a default feature. ([#1971]) - cosmwasm-std: Add `QueryRequest::Grpc` and deprecate `QueryRequest::Stargate`. ([#1973]) +- cosmwasm-std: Remove `update_balance`, `set_denom_metadata`, + `set_withdraw_address`, `set_withdraw_addresses`, `clear_withdraw_addresses` + from `MockQuerier` and expose the underlying queriers directly. ([#1977]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 @@ -94,6 +97,7 @@ and this project adheres to [#1967]: https://github.com/CosmWasm/cosmwasm/pull/1967 [#1971]: https://github.com/CosmWasm/cosmwasm/pull/1971 [#1973]: https://github.com/CosmWasm/cosmwasm/pull/1973 +[#1977]: https://github.com/CosmWasm/cosmwasm/pull/1977 ### Removed From d7d03a66d9319a213b41580720707f130e5eaeb6 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 21 Dec 2023 11:28:13 +0100 Subject: [PATCH 1093/2372] Add migrating entry --- MIGRATING.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/MIGRATING.md b/MIGRATING.md index e13975ac2e..097a7cd9d5 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -189,6 +189,17 @@ major releases of `cosmwasm`. Note that you can also view the +}; ``` +- The `update_balance`, `set_denom_metadata`, `set_withdraw_address`, + `set_withdraw_addresses` and `clear_withdraw_addresses` functions were removed + from the `MockQuerier`. Use the newly exposed modules to access them directly: + + ```diff + -querier.update_balance("addr", coins(1000, "ATOM")); + +querier.bank.update_balance("addr", coins(1000, "ATOM")); + -querier.set_withdraw_address("delegator", "withdrawer"); + +querier.distribution.set_withdraw_address("delegator", "withdrawer"); + ``` + - If you were using `QueryRequest::Stargate`, you might want to enable the `cosmwasm_2_0` cargo feature and migrate to `QueryRequest::Grpc` instead. While the stargate query sometimes returns protobuf encoded data and sometimes From 90d0432ecf4d8c5cbc8dc3e7ffd4bc4b4a0fd878 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 21 Dec 2023 15:54:17 +0100 Subject: [PATCH 1094/2372] Remove update_* functions from MockQuerier --- CHANGELOG.md | 5 ++-- MIGRATING.md | 4 ++++ contracts/staking/src/contract.rs | 12 ++++++---- packages/std/src/testing/mock.rs | 37 ++++++++++++++++-------------- packages/vm/src/testing/querier.rs | 2 +- 5 files changed, 35 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b4e3cea2fe..f13690e319 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -75,8 +75,9 @@ and this project adheres to - cosmwasm-std: Add `QueryRequest::Grpc` and deprecate `QueryRequest::Stargate`. ([#1973]) - cosmwasm-std: Remove `update_balance`, `set_denom_metadata`, - `set_withdraw_address`, `set_withdraw_addresses`, `clear_withdraw_addresses` - from `MockQuerier` and expose the underlying queriers directly. ([#1977]) + `set_withdraw_address`, `set_withdraw_addresses`, `clear_withdraw_addresses`, + `update_ibc` and `update_staking` from `MockQuerier` and expose the underlying + queriers directly. ([#1977]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 diff --git a/MIGRATING.md b/MIGRATING.md index 097a7cd9d5..3649f40243 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -198,6 +198,10 @@ major releases of `cosmwasm`. Note that you can also view the +querier.bank.update_balance("addr", coins(1000, "ATOM")); -querier.set_withdraw_address("delegator", "withdrawer"); +querier.distribution.set_withdraw_address("delegator", "withdrawer"); + -querier.update_staking(denom, &[], &[]); + +querier.staking.update(denom, &[], &[]); + -querier.update_ibc(port_id, &[]); + +querier.ibc.update(port_id, &[]); ``` - If you were using `QueryRequest::Stargate`, you might want to enable the diff --git a/contracts/staking/src/contract.rs b/contracts/staking/src/contract.rs index 949c4bccf1..9015006ea2 100644 --- a/contracts/staking/src/contract.rs +++ b/contracts/staking/src/contract.rs @@ -406,7 +406,7 @@ pub fn query_investment(deps: Deps) -> StdResult { mod tests { use super::*; use cosmwasm_std::testing::{ - mock_dependencies, mock_env, mock_info, MockQuerier, MOCK_CONTRACT_ADDR, + mock_dependencies, mock_env, mock_info, MockQuerier, StakingQuerier, MOCK_CONTRACT_ADDR, }; use cosmwasm_std::{coins, Addr, Coin, CosmosMsg, Decimal, FullDelegation, Validator}; use std::str::FromStr; @@ -431,11 +431,12 @@ mod tests { } fn set_validator(querier: &mut MockQuerier) { - querier.update_staking("ustake", &[sample_validator(DEFAULT_VALIDATOR)], &[]); + querier.staking = + StakingQuerier::new("ustake", &[sample_validator(DEFAULT_VALIDATOR)], &[]); } fn set_delegation(querier: &mut MockQuerier, amount: u128, denom: &str) { - querier.update_staking( + querier.staking.update( "ustake", &[sample_validator(DEFAULT_VALIDATOR)], &[sample_delegation(DEFAULT_VALIDATOR, coin(amount, denom))], @@ -467,7 +468,8 @@ mod tests { fn initialization_with_missing_validator() { let mut deps = mock_dependencies(); deps.querier - .update_staking("ustake", &[sample_validator("john")], &[]); + .staking + .update("ustake", &[sample_validator("john")], &[]); let creator = deps.api.addr_make("creator").to_string(); let msg = InstantiateMsg { @@ -493,7 +495,7 @@ mod tests { #[test] fn proper_initialization() { let mut deps = mock_dependencies(); - deps.querier.update_staking( + deps.querier.staking.update( "ustake", &[ sample_validator("john"), diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index b9de939b35..9f9096082d 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -464,12 +464,12 @@ pub type MockQuerierCustomHandlerResult = SystemResult>; pub struct MockQuerier { pub bank: BankQuerier, #[cfg(feature = "staking")] - staking: StakingQuerier, + pub staking: StakingQuerier, #[cfg(feature = "cosmwasm_1_3")] pub distribution: DistributionQuerier, wasm: WasmQuerier, #[cfg(feature = "stargate")] - ibc: IbcQuerier, + pub ibc: IbcQuerier, /// A handler to handle custom queries. This is set to a dummy handler that /// always errors by default. Update it via `with_custom_handler`. /// @@ -497,21 +497,6 @@ impl MockQuerier { } } - #[cfg(feature = "staking")] - pub fn update_staking( - &mut self, - denom: &str, - validators: &[crate::query::Validator], - delegations: &[crate::query::FullDelegation], - ) { - self.staking = StakingQuerier::new(denom, validators, delegations); - } - - #[cfg(feature = "stargate")] - pub fn update_ibc(&mut self, port_id: &str, channels: &[IbcChannel]) { - self.ibc = IbcQuerier::new(port_id, channels); - } - pub fn update_wasm(&mut self, handler: WH) where WH: Fn(&WasmQuery) -> QuerierResult, @@ -800,6 +785,12 @@ impl IbcQuerier { } } + /// Update the querier's configuration + pub fn update(&mut self, port_id: impl Into, channels: &[IbcChannel]) { + self.port_id = port_id.into(); + self.channels = channels.to_vec(); + } + pub fn query(&self, request: &IbcQuery) -> QuerierResult { let contract_result: ContractResult = match request { IbcQuery::Channel { @@ -863,6 +854,18 @@ impl StakingQuerier { } } + /// Update the querier's configuration + pub fn update( + &mut self, + denom: impl Into, + validators: &[Validator], + delegations: &[FullDelegation], + ) { + self.denom = denom.into(); + self.validators = validators.to_vec(); + self.delegations = delegations.to_vec(); + } + pub fn query(&self, request: &StakingQuery) -> QuerierResult { let contract_result: ContractResult = match request { StakingQuery::BondedDenom {} => { diff --git a/packages/vm/src/testing/querier.rs b/packages/vm/src/testing/querier.rs index b0993c72bc..046526ed9f 100644 --- a/packages/vm/src/testing/querier.rs +++ b/packages/vm/src/testing/querier.rs @@ -42,7 +42,7 @@ impl MockQuerier { validators: &[cosmwasm_std::Validator], delegations: &[cosmwasm_std::FullDelegation], ) { - self.querier.update_staking(denom, validators, delegations); + self.querier.staking.update(denom, validators, delegations); } pub fn update_wasm(&mut self, handler: WH) From a578be9d799f27890aaad27aff3b9c24e16e5fb1 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 21 Dec 2023 16:27:54 +0100 Subject: [PATCH 1095/2372] Set version: 2.0.0-beta.0 --- Cargo.lock | 14 +++++++------- contracts/burner/Cargo.lock | 12 ++++++------ contracts/crypto-verify/Cargo.lock | 12 ++++++------ contracts/cyberpunk/Cargo.lock | 12 ++++++------ contracts/empty/Cargo.lock | 12 ++++++------ contracts/floaty/Cargo.lock | 12 ++++++------ contracts/hackatom/Cargo.lock | 12 ++++++------ contracts/ibc-reflect-send/Cargo.lock | 12 ++++++------ contracts/ibc-reflect/Cargo.lock | 12 ++++++------ contracts/queue/Cargo.lock | 12 ++++++------ contracts/reflect/Cargo.lock | 12 ++++++------ contracts/staking/Cargo.lock | 12 ++++++------ contracts/virus/Cargo.lock | 12 ++++++------ packages/check/Cargo.toml | 6 +++--- packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/go-gen/Cargo.toml | 4 ++-- packages/schema-derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 6 +++--- packages/std/Cargo.toml | 6 +++--- packages/vm/Cargo.toml | 6 +++--- 21 files changed, 96 insertions(+), 96 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f148f1fbb7..f1033fa23e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -406,7 +406,7 @@ dependencies = [ [[package]] name = "cosmwasm-check" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "anyhow", "assert_cmd", @@ -419,7 +419,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "criterion", "digest 0.10.6", @@ -438,7 +438,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "cosmwasm-std", "syn 1.0.109", @@ -446,7 +446,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "anyhow", "cosmwasm-schema-derive", @@ -461,7 +461,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "proc-macro2", "quote", @@ -470,7 +470,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "base64", "bech32", @@ -495,7 +495,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "bech32", "bitflags", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 9921f63fde..1ba847ee38 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -199,7 +199,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -211,14 +211,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -229,7 +229,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "proc-macro2", "quote", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "base64", "bech32", @@ -258,7 +258,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "bech32", "bitflags", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index db1791d4ae..1eb14ab5bf 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "bech32", "bitflags", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 2724a69f4d..3634acecdc 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -223,7 +223,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -235,14 +235,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -253,7 +253,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "proc-macro2", "quote", @@ -262,7 +262,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "base64 0.21.2", "bech32", @@ -282,7 +282,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "bech32", "bitflags", diff --git a/contracts/empty/Cargo.lock b/contracts/empty/Cargo.lock index 84b8ec89c8..813204f989 100644 --- a/contracts/empty/Cargo.lock +++ b/contracts/empty/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "bech32", "bitflags", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 9f4b2cb718..ca52aca21b 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "bech32", "bitflags", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index b45628310a..6935ea1a40 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "bech32", "bitflags", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 96e29910f0..51153f881e 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "bech32", "bitflags", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 7d0e5a4570..1716a43ad8 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "bech32", "bitflags", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index e59d5f4c32..e65cd61823 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "bech32", "bitflags", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 7030aaa127..7a9e7eb413 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "bech32", "bitflags", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 71ee646e5e..7c0d169e93 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "bech32", "bitflags", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 945b91eeca..a07b54c3db 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "1.5.0" +version = "2.0.0-beta.0" dependencies = [ "bech32", "bitflags", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index bd5f45b244..7fa3b33ad8 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-check" -version = "1.5.0" +version = "2.0.0-beta.0" authors = ["Mauro Lacy "] edition = "2021" description = "A CLI tool for verifying CosmWasm smart contracts" @@ -11,8 +11,8 @@ license = "Apache-2.0" anyhow = "1.0.57" clap = "4" colored = "2" -cosmwasm-vm = { path = "../vm", version = "=1.5.0" } -cosmwasm-std = { path = "../std", version = "=1.5.0" } +cosmwasm-vm = { path = "../vm", version = "=2.0.0-beta.0" } +cosmwasm-std = { path = "../std", version = "=2.0.0-beta.0" } [dev-dependencies] assert_cmd = "2.0.12" diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 383ddbec1f..1236dcfa8f 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "1.5.0" +version = "2.0.0-beta.0" authors = ["Mauro Lacy "] edition = "2021" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index 98656a5bf0..2218b2edac 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "1.5.0" +version = "2.0.0-beta.0" authors = ["Simon Warta "] edition = "2021" description = "A package for auto-generated code used for CosmWasm contract development. This is shipped as part of cosmwasm-std. Do not use directly." diff --git a/packages/go-gen/Cargo.toml b/packages/go-gen/Cargo.toml index d92f16e3b1..07524dae43 100644 --- a/packages/go-gen/Cargo.toml +++ b/packages/go-gen/Cargo.toml @@ -9,8 +9,8 @@ publish = false [dependencies] schemars = "0.8.3" -cosmwasm-std = { path = "../std", version = "1.5.0", features = ["cosmwasm_2_0", "staking", "stargate"] } -cosmwasm-schema = { path = "../schema", version = "1.5.0" } +cosmwasm-std = { path = "../std", version = "2.0.0-beta.0", features = ["cosmwasm_2_0", "staking", "stargate"] } +cosmwasm-schema = { path = "../schema", version = "2.0.0-beta.0" } anyhow = "1" Inflector = "0.11.4" indenter = "0.3.3" diff --git a/packages/schema-derive/Cargo.toml b/packages/schema-derive/Cargo.toml index c53a9f9c92..56a3beee64 100644 --- a/packages/schema-derive/Cargo.toml +++ b/packages/schema-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema-derive" -version = "1.5.0" +version = "2.0.0-beta.0" authors = ["Tomasz Kurcz "] edition = "2021" description = "Derive macros for cosmwasm-schema" diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index 02fafcaba5..e61c6f4e8e 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "1.5.0" +version = "2.0.0-beta.0" authors = ["Simon Warta ", "Ethan Frey "] edition = "2021" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." @@ -8,7 +8,7 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/schema" license = "Apache-2.0" [dependencies] -cosmwasm-schema-derive = { version = "=1.5.0", path = "../schema-derive" } +cosmwasm-schema-derive = { version = "=2.0.0-beta.0", path = "../schema-derive" } schemars = "0.8.3" serde = "1.0" serde_json = "1.0.40" @@ -16,6 +16,6 @@ thiserror = "1.0.26" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = { version = "1.5.0", path = "../std" } +cosmwasm-std = { version = "2.0.0-beta.0", path = "../std" } semver = "1" tempfile = "3" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 0e89233675..c3a6b5f699 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "1.5.0" +version = "2.0.0-beta.0" authors = ["Ethan Frey "] edition = "2021" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -52,7 +52,7 @@ cosmwasm_2_0 = ["cosmwasm_1_4"] [dependencies] base64 = "0.21.0" -cosmwasm-derive = { path = "../derive", version = "1.5.0" } +cosmwasm-derive = { path = "../derive", version = "2.0.0-beta.0" } derivative = { version = "2", features = ["use_core"] } forward_ref = "1" hex = "0.4" @@ -66,7 +66,7 @@ static_assertions = "1.1.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] bech32 = "0.9.1" -cosmwasm-crypto = { path = "../crypto", version = "1.5.0" } +cosmwasm-crypto = { path = "../crypto", version = "2.0.0-beta.0" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index b1e98e11d1..ba05835225 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "1.5.0" +version = "2.0.0-beta.0" authors = ["Ethan Frey "] edition = "2021" description = "VM bindings to run cosmwams contracts" @@ -31,8 +31,8 @@ clru = "0.6.1" crc32fast = "1.3.2" bech32 = "0.9.1" # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "1.5.0", default-features = false, features = ["std"] } -cosmwasm-crypto = { path = "../crypto", version = "1.5.0" } +cosmwasm-std = { path = "../std", version = "2.0.0-beta.0", default-features = false, features = ["std"] } +cosmwasm-crypto = { path = "../crypto", version = "2.0.0-beta.0" } derivative = "2" hex = "0.4" schemars = "0.8.3" From 1ce73c6b91466fc46e8b574e381cdaa1fb0b298e Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 21 Dec 2023 16:29:09 +0100 Subject: [PATCH 1096/2372] Update changelog --- CHANGELOG.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f13690e319..648f77a380 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [2.0.0-beta.0] - 2023-12-21 ### Added @@ -720,7 +720,9 @@ and this project adheres to The CHANGELOG for versions before 1.0.0 was moved to [CHANGELOG-pre1.0.0.md](./CHANGELOG-pre1.0.0.md). -[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v1.5.0...HEAD +[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v2.0.0-beta.0...HEAD +[2.0.0-beta.0]: + https://github.com/CosmWasm/cosmwasm/compare/v1.5.0...v2.0.0-beta.0 [1.5.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.4.1...v1.5.0 [1.4.1]: https://github.com/CosmWasm/cosmwasm/compare/v1.4.0...v1.4.1 [1.4.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.3...v1.4.0 From 76815ba5c1dfd920bb5423ffb5a6d8942d8c3242 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 27 Dec 2023 22:08:07 +0100 Subject: [PATCH 1097/2372] Rename BackendApi functions --- CHANGELOG.md | 2 ++ packages/vm/src/backend.rs | 7 ++---- packages/vm/src/imports.rs | 8 +++---- packages/vm/src/testing/mock.rs | 40 ++++++++++++++++----------------- 4 files changed, 28 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 648f77a380..e1838c31b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -78,6 +78,8 @@ and this project adheres to `set_withdraw_address`, `set_withdraw_addresses`, `clear_withdraw_addresses`, `update_ibc` and `update_staking` from `MockQuerier` and expose the underlying queriers directly. ([#1977]) +- cosmwasm-vm: Rename `BackendApi::canonical_address`/`::human_address` to + `::addr_canonicalize`/`::addr_humanize` for consistency. [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 diff --git a/packages/vm/src/backend.rs b/packages/vm/src/backend.rs index 1a6d9aceef..c48d53184d 100644 --- a/packages/vm/src/backend.rs +++ b/packages/vm/src/backend.rs @@ -165,12 +165,9 @@ pub trait Storage { /// Currently it just supports address conversion, we could add eg. crypto functions here. /// These should all be pure (stateless) functions. If you need state, you probably want /// to use the Querier. -/// -/// We can use feature flags to opt-in to non-essential methods -/// for backwards compatibility in systems that don't have them all. pub trait BackendApi: Copy + Clone + Send { - fn canonical_address(&self, human: &str) -> BackendResult>; - fn human_address(&self, canonical: &[u8]) -> BackendResult; + fn addr_canonicalize(&self, human: &str) -> BackendResult>; + fn addr_humanize(&self, canonical: &[u8]) -> BackendResult; } pub trait Querier { diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index d1c245d30b..769a26a3e3 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -162,7 +162,7 @@ pub fn do_addr_validate return write_to_contract(data, &mut store, b"Input is not valid UTF-8"), }; - let (result, gas_info) = data.api.canonical_address(&source_string); + let (result, gas_info) = data.api.addr_canonicalize(&source_string); process_gas_info(data, &mut store, gas_info)?; let canonical = match result { Ok(data) => data, @@ -172,7 +172,7 @@ pub fn do_addr_validate return Err(VmError::from(err)), }; - let (result, gas_info) = data.api.human_address(&canonical); + let (result, gas_info) = data.api.addr_humanize(&canonical); process_gas_info(data, &mut store, gas_info)?; let normalized = match result { Ok(addr) => addr, @@ -206,7 +206,7 @@ pub fn do_addr_canonicalize return write_to_contract(data, &mut store, b"Input is not valid UTF-8"), }; - let (result, gas_info) = data.api.canonical_address(&source_string); + let (result, gas_info) = data.api.addr_canonicalize(&source_string); process_gas_info(data, &mut store, gas_info)?; match result { Ok(canonical) => { @@ -233,7 +233,7 @@ pub fn do_addr_humanize { diff --git a/packages/vm/src/testing/mock.rs b/packages/vm/src/testing/mock.rs index b5823e83c6..6668b7bb3c 100644 --- a/packages/vm/src/testing/mock.rs +++ b/packages/vm/src/testing/mock.rs @@ -125,7 +125,7 @@ impl Default for MockApi { } impl BackendApi for MockApi { - fn canonical_address(&self, input: &str) -> BackendResult> { + fn addr_canonicalize(&self, input: &str) -> BackendResult> { let gas_info = GasInfo::with_cost(GAS_COST_CANONICALIZE); // handle error case @@ -156,7 +156,7 @@ impl BackendApi for MockApi { } } - fn human_address(&self, canonical: &[u8]) -> BackendResult { + fn addr_humanize(&self, canonical: &[u8]) -> BackendResult { let gas_info = GasInfo::with_cost(GAS_COST_HUMANIZE); // handle error case @@ -232,20 +232,20 @@ mod tests { } #[test] - fn canonical_address_works() { + fn addr_canonicalize_works() { let api = MockApi::default().with_prefix("osmo"); - api.canonical_address("osmo186kh7c0k0gh4ww0wh4jqc4yhzu7n7dhswe845d") + api.addr_canonicalize("osmo186kh7c0k0gh4ww0wh4jqc4yhzu7n7dhswe845d") .0 .unwrap(); // is case insensitive let data1 = api - .canonical_address("osmo186kh7c0k0gh4ww0wh4jqc4yhzu7n7dhswe845d") + .addr_canonicalize("osmo186kh7c0k0gh4ww0wh4jqc4yhzu7n7dhswe845d") .0 .unwrap(); let data2 = api - .canonical_address("OSMO186KH7C0K0GH4WW0WH4JQC4YHZU7N7DHSWE845D") + .addr_canonicalize("OSMO186KH7C0K0GH4WW0WH4JQC4YHZU7N7DHSWE845D") .0 .unwrap(); assert_eq!(data1, data2); @@ -257,29 +257,29 @@ mod tests { // simple let original = api.addr_make("shorty"); - let canonical = api.canonical_address(&original).0.unwrap(); - let (recovered, _gas_cost) = api.human_address(&canonical); + let canonical = api.addr_canonicalize(&original).0.unwrap(); + let (recovered, _gas_cost) = api.addr_humanize(&canonical); assert_eq!(recovered.unwrap(), original); // normalizes input let original = "JUNO1MEPRU9FUQ4E65856ARD6068MFSFRWPGEMD0C3R"; - let canonical = api.canonical_address(original).0.unwrap(); - let recovered = api.human_address(&canonical).0.unwrap(); + let canonical = api.addr_canonicalize(original).0.unwrap(); + let recovered = api.addr_humanize(&canonical).0.unwrap(); assert_eq!(recovered, original.to_lowercase()); // Long input (Juno contract address) let original = String::from("juno1v82su97skv6ucfqvuvswe0t5fph7pfsrtraxf0x33d8ylj5qnrysdvkc95"); - let canonical = api.canonical_address(&original).0.unwrap(); - let recovered = api.human_address(&canonical).0.unwrap(); + let canonical = api.addr_canonicalize(&original).0.unwrap(); + let recovered = api.addr_humanize(&canonical).0.unwrap(); assert_eq!(recovered, original); } #[test] - fn human_address_input_length() { + fn addr_humanize_input_length() { let api = MockApi::default(); let input = vec![61; 256]; // too long - let (result, _gas_info) = api.human_address(&input); + let (result, _gas_info) = api.addr_humanize(&input); match result.unwrap_err() { BackendError::UserErr { .. } => {} err => panic!("Unexpected error: {err:?}"), @@ -287,26 +287,26 @@ mod tests { } #[test] - fn canonical_address_min_input_length() { + fn addr_canonicalize_min_input_length() { let api = MockApi::default(); // empty address should fail let empty = "cosmwasm1pj90vm"; assert!(matches!(api - .canonical_address(empty) + .addr_canonicalize(empty) .0 .unwrap_err(), BackendError::UserErr { msg } if msg.contains("address length"))); } #[test] - fn canonical_address_max_input_length() { + fn addr_canonicalize_max_input_length() { let api = MockApi::default(); let too_long = "cosmwasm1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqehqqkz"; assert!(matches!(api - .canonical_address(too_long) + .addr_canonicalize(too_long) .0 .unwrap_err(), BackendError::UserErr { msg } if msg.contains("address length"))); @@ -316,10 +316,10 @@ mod tests { fn colon_in_prefix_is_valid() { let mock_api = MockApi::default().with_prefix("did:com:"); let bytes = mock_api - .canonical_address("did:com:1jkf0kmeyefvyzpwf56m7sne2000ay53r6upttu") + .addr_canonicalize("did:com:1jkf0kmeyefvyzpwf56m7sne2000ay53r6upttu") .0 .unwrap(); - let humanized = mock_api.human_address(&bytes).0.unwrap(); + let humanized = mock_api.addr_humanize(&bytes).0.unwrap(); assert_eq!( humanized.as_str(), From 6374c436dac57a47345f149627fa7b406065876c Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 28 Dec 2023 00:55:08 +0100 Subject: [PATCH 1098/2372] Add BackendApi::addr_validate --- CHANGELOG.md | 2 ++ packages/vm/src/backend.rs | 1 + packages/vm/src/imports.rs | 26 +++++--------------------- packages/vm/src/testing/mock.rs | 30 ++++++++++++++++++++++++++++++ 4 files changed, 38 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1838c31b2..07c6219325 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -80,6 +80,8 @@ and this project adheres to queriers directly. ([#1977]) - cosmwasm-vm: Rename `BackendApi::canonical_address`/`::human_address` to `::addr_canonicalize`/`::addr_humanize` for consistency. +- cosmwasm-vm: Add `BackendApi::addr_validate` to avoid having to do two calls + from Rust into Go. [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 diff --git a/packages/vm/src/backend.rs b/packages/vm/src/backend.rs index c48d53184d..d24c75c072 100644 --- a/packages/vm/src/backend.rs +++ b/packages/vm/src/backend.rs @@ -166,6 +166,7 @@ pub trait Storage { /// These should all be pure (stateless) functions. If you need state, you probably want /// to use the Querier. pub trait BackendApi: Copy + Clone + Send { + fn addr_validate(&self, input: &str) -> BackendResult<()>; fn addr_canonicalize(&self, human: &str) -> BackendResult>; fn addr_humanize(&self, canonical: &[u8]) -> BackendResult; } diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 769a26a3e3..a02bd496b8 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -162,31 +162,15 @@ pub fn do_addr_validate return write_to_contract(data, &mut store, b"Input is not valid UTF-8"), }; - let (result, gas_info) = data.api.addr_canonicalize(&source_string); - process_gas_info(data, &mut store, gas_info)?; - let canonical = match result { - Ok(data) => data, - Err(BackendError::UserErr { msg, .. }) => { - return write_to_contract(data, &mut store, msg.as_bytes()) - } - Err(err) => return Err(VmError::from(err)), - }; - - let (result, gas_info) = data.api.addr_humanize(&canonical); + let (result, gas_info) = data.api.addr_validate(&source_string); process_gas_info(data, &mut store, gas_info)?; - let normalized = match result { - Ok(addr) => addr, + match result { + Ok(()) => Ok(0), Err(BackendError::UserErr { msg, .. }) => { - return write_to_contract(data, &mut store, msg.as_bytes()) + write_to_contract(data, &mut store, msg.as_bytes()) } - Err(err) => return Err(VmError::from(err)), - }; - - if normalized != source_string { - return write_to_contract(data, &mut store, b"Address is not normalized"); + Err(err) => Err(VmError::from(err)), } - - Ok(0) } pub fn do_addr_canonicalize( diff --git a/packages/vm/src/testing/mock.rs b/packages/vm/src/testing/mock.rs index 6668b7bb3c..b81f1b1e74 100644 --- a/packages/vm/src/testing/mock.rs +++ b/packages/vm/src/testing/mock.rs @@ -125,6 +125,36 @@ impl Default for MockApi { } impl BackendApi for MockApi { + fn addr_validate(&self, input: &str) -> BackendResult<()> { + let mut gas = GasInfo { + cost: 0, + externally_used: 0, + }; + + let (result, gas_info) = self.addr_canonicalize(input); + gas += gas_info; + let canonical = match result { + Ok(canonical) => canonical, + Err(err) => return (Err(err), gas), + }; + + let (result, gas_info) = self.addr_humanize(&canonical); + gas += gas_info; + let normalized = match result { + Ok(norm) => norm, + Err(err) => return (Err(err), gas), + }; + if input != normalized.as_str() { + return ( + Err(BackendError::user_err( + "Invalid input: address not normalized", + )), + gas, + ); + } + (Ok(()), gas) + } + fn addr_canonicalize(&self, input: &str) -> BackendResult> { let gas_info = GasInfo::with_cost(GAS_COST_CANONICALIZE); From f397a146c8b319d6bf80a9b269e1270c1fabd05a Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 9 Jan 2024 01:34:40 +0100 Subject: [PATCH 1099/2372] Avoid the need for BackendApi to be Copy --- packages/vm/src/backend.rs | 2 +- packages/vm/src/environment.rs | 2 +- packages/vm/src/instance.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/vm/src/backend.rs b/packages/vm/src/backend.rs index d24c75c072..c2c54e16bf 100644 --- a/packages/vm/src/backend.rs +++ b/packages/vm/src/backend.rs @@ -165,7 +165,7 @@ pub trait Storage { /// Currently it just supports address conversion, we could add eg. crypto functions here. /// These should all be pure (stateless) functions. If you need state, you probably want /// to use the Querier. -pub trait BackendApi: Copy + Clone + Send { +pub trait BackendApi: Clone + Send { fn addr_validate(&self, input: &str) -> BackendResult<()>; fn addr_canonicalize(&self, human: &str) -> BackendResult>; fn addr_humanize(&self, canonical: &[u8]) -> BackendResult; diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index ad6bac36f4..23ac343845 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -125,7 +125,7 @@ impl Clone for Environment { fn clone(&self) -> Self { Environment { memory: None, - api: self.api, + api: self.api.clone(), gas_config: self.gas_config.clone(), data: self.data.clone(), } diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index a1f4ced072..adf82c2e2f 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -294,7 +294,7 @@ where let env = fe.as_ref(&store); if let (Some(storage), Some(querier)) = env.move_out() { - let api = env.api; + let api = env.api.clone(); Some(Backend { api, storage, From df69d7601ca66c86a344b854b14094ab831c497d Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 9 Jan 2024 12:34:13 +0100 Subject: [PATCH 1100/2372] Rename variable to gas_total --- packages/vm/src/testing/mock.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/vm/src/testing/mock.rs b/packages/vm/src/testing/mock.rs index b81f1b1e74..941e8fb534 100644 --- a/packages/vm/src/testing/mock.rs +++ b/packages/vm/src/testing/mock.rs @@ -126,33 +126,33 @@ impl Default for MockApi { impl BackendApi for MockApi { fn addr_validate(&self, input: &str) -> BackendResult<()> { - let mut gas = GasInfo { + let mut gas_total = GasInfo { cost: 0, externally_used: 0, }; let (result, gas_info) = self.addr_canonicalize(input); - gas += gas_info; + gas_total += gas_info; let canonical = match result { Ok(canonical) => canonical, - Err(err) => return (Err(err), gas), + Err(err) => return (Err(err), gas_total), }; let (result, gas_info) = self.addr_humanize(&canonical); - gas += gas_info; + gas_total += gas_info; let normalized = match result { Ok(norm) => norm, - Err(err) => return (Err(err), gas), + Err(err) => return (Err(err), gas_total), }; if input != normalized.as_str() { return ( Err(BackendError::user_err( "Invalid input: address not normalized", )), - gas, + gas_total, ); } - (Ok(()), gas) + (Ok(()), gas_total) } fn addr_canonicalize(&self, input: &str) -> BackendResult> { From 1dbba8f3dfba721cfea5625641dca790984cbefe Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 9 Jan 2024 12:57:04 +0100 Subject: [PATCH 1101/2372] Improve try_with_gas readability --- packages/vm/src/backend.rs | 18 ++++++++++++------ packages/vm/src/testing/mock.rs | 6 +++--- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/packages/vm/src/backend.rs b/packages/vm/src/backend.rs index c2c54e16bf..080624d849 100644 --- a/packages/vm/src/backend.rs +++ b/packages/vm/src/backend.rs @@ -195,18 +195,24 @@ pub trait Querier { /// must always have gas information attached. pub type BackendResult = (core::result::Result, GasInfo); -/// The equivalent of the `?` operator, but for a [`BackendResult`] -macro_rules! try_br { - ($res: expr $(,)?) => { - let (result, gas) = $res; - +/// This aims to be similar to the `?` operator, but for a [`BackendResult`]. +/// +/// The first argument is a result. If it is Ok, return the value. +/// If it is Err, end the current function with a `return BackendResult::Err`. +/// +/// The second argument is the gas value that will be used in the error case. +/// It should be the sum of all gas used in the calling function. +macro_rules! try_with_gas { + ($result: expr $(,)?, $gas_total: expr $(,)?) => { + let result: core::result::Result<_, _> = $result; // just a type check + let gas: GasInfo = $gas_total; // just a type check match result { Ok(v) => v, Err(e) => return (Err(e), gas), } }; } -pub(crate) use try_br; +pub(crate) use try_with_gas; #[derive(Error, Debug, PartialEq, Eq)] #[non_exhaustive] diff --git a/packages/vm/src/testing/mock.rs b/packages/vm/src/testing/mock.rs index 941e8fb534..afa63af717 100644 --- a/packages/vm/src/testing/mock.rs +++ b/packages/vm/src/testing/mock.rs @@ -6,7 +6,7 @@ use sha2::{Digest, Sha256}; use super::querier::MockQuerier; use super::storage::MockStorage; -use crate::backend::try_br; +use crate::backend::try_with_gas; use crate::{Backend, BackendApi, BackendError, BackendResult, GasInfo}; pub const MOCK_CONTRACT_ADDR: &str = "cosmwasmcontract"; // TODO: use correct address @@ -178,7 +178,7 @@ impl BackendApi for MockApi { ), Ok((_, decoded, Variant::Bech32)) => match Vec::::from_base32(&decoded) { Ok(bytes) => { - try_br!((validate_length(&bytes), gas_info)); + try_with_gas!(validate_length(&bytes), gas_info); (Ok(bytes), gas_info) } Err(_) => (Err(BackendError::user_err("Invalid bech32 data")), gas_info), @@ -195,7 +195,7 @@ impl BackendApi for MockApi { MockApiImpl::Bech32 { bech32_prefix } => bech32_prefix, }; - try_br!((validate_length(canonical), gas_info)); + try_with_gas!(validate_length(canonical), gas_info); let result = encode(bech32_prefix, canonical.to_base32(), Variant::Bech32) .map_err(|_| BackendError::user_err("Invalid bech32 prefix")); From e0d45c8dda01cef07ad32e2d59ea657b203e1159 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 9 Jan 2024 13:03:55 +0100 Subject: [PATCH 1102/2372] Rename to unwrap_or_return_with_gas and use in addr_validate --- packages/vm/src/backend.rs | 8 +++--- packages/vm/src/testing/mock.rs | 48 ++++++++++++++++----------------- 2 files changed, 27 insertions(+), 29 deletions(-) diff --git a/packages/vm/src/backend.rs b/packages/vm/src/backend.rs index 080624d849..b473ecb7e0 100644 --- a/packages/vm/src/backend.rs +++ b/packages/vm/src/backend.rs @@ -202,17 +202,17 @@ pub type BackendResult = (core::result::Result, GasInfo); /// /// The second argument is the gas value that will be used in the error case. /// It should be the sum of all gas used in the calling function. -macro_rules! try_with_gas { - ($result: expr $(,)?, $gas_total: expr $(,)?) => { +macro_rules! unwrap_or_return_with_gas { + ($result: expr $(,)?, $gas_total: expr $(,)?) => {{ let result: core::result::Result<_, _> = $result; // just a type check let gas: GasInfo = $gas_total; // just a type check match result { Ok(v) => v, Err(e) => return (Err(e), gas), } - }; + }}; } -pub(crate) use try_with_gas; +pub(crate) use unwrap_or_return_with_gas; #[derive(Error, Debug, PartialEq, Eq)] #[non_exhaustive] diff --git a/packages/vm/src/testing/mock.rs b/packages/vm/src/testing/mock.rs index afa63af717..c9f88cc815 100644 --- a/packages/vm/src/testing/mock.rs +++ b/packages/vm/src/testing/mock.rs @@ -6,7 +6,7 @@ use sha2::{Digest, Sha256}; use super::querier::MockQuerier; use super::storage::MockStorage; -use crate::backend::try_with_gas; +use crate::backend::unwrap_or_return_with_gas; use crate::{Backend, BackendApi, BackendError, BackendResult, GasInfo}; pub const MOCK_CONTRACT_ADDR: &str = "cosmwasmcontract"; // TODO: use correct address @@ -131,19 +131,13 @@ impl BackendApi for MockApi { externally_used: 0, }; - let (result, gas_info) = self.addr_canonicalize(input); + let (canonicalize_res, gas_info) = self.addr_canonicalize(input); gas_total += gas_info; - let canonical = match result { - Ok(canonical) => canonical, - Err(err) => return (Err(err), gas_total), - }; + let canonical = unwrap_or_return_with_gas!(canonicalize_res, gas_total); - let (result, gas_info) = self.addr_humanize(&canonical); + let (humanize_res, gas_info) = self.addr_humanize(&canonical); gas_total += gas_info; - let normalized = match result { - Ok(norm) => norm, - Err(err) => return (Err(err), gas_total), - }; + let normalized = unwrap_or_return_with_gas!(humanize_res, gas_total); if input != normalized.as_str() { return ( Err(BackendError::user_err( @@ -156,51 +150,55 @@ impl BackendApi for MockApi { } fn addr_canonicalize(&self, input: &str) -> BackendResult> { - let gas_info = GasInfo::with_cost(GAS_COST_CANONICALIZE); + let gas_total = GasInfo::with_cost(GAS_COST_CANONICALIZE); // handle error case let bech32_prefix = match self.0 { - MockApiImpl::Error(e) => return (Err(BackendError::unknown(e)), gas_info), + MockApiImpl::Error(e) => return (Err(BackendError::unknown(e)), gas_total), MockApiImpl::Bech32 { bech32_prefix } => bech32_prefix, }; match decode(input) { - Ok((prefix, _, _)) if prefix != bech32_prefix => { - (Err(BackendError::user_err("Wrong bech32 prefix")), gas_info) - } + Ok((prefix, _, _)) if prefix != bech32_prefix => ( + Err(BackendError::user_err("Wrong bech32 prefix")), + gas_total, + ), Ok((_, _, Variant::Bech32m)) => ( Err(BackendError::user_err("Wrong bech32 variant")), - gas_info, + gas_total, ), Err(_) => ( Err(BackendError::user_err("Error decoding bech32")), - gas_info, + gas_total, ), Ok((_, decoded, Variant::Bech32)) => match Vec::::from_base32(&decoded) { Ok(bytes) => { - try_with_gas!(validate_length(&bytes), gas_info); - (Ok(bytes), gas_info) + unwrap_or_return_with_gas!(validate_length(&bytes), gas_total); + (Ok(bytes), gas_total) } - Err(_) => (Err(BackendError::user_err("Invalid bech32 data")), gas_info), + Err(_) => ( + Err(BackendError::user_err("Invalid bech32 data")), + gas_total, + ), }, } } fn addr_humanize(&self, canonical: &[u8]) -> BackendResult { - let gas_info = GasInfo::with_cost(GAS_COST_HUMANIZE); + let gas_total = GasInfo::with_cost(GAS_COST_HUMANIZE); // handle error case let bech32_prefix = match self.0 { - MockApiImpl::Error(e) => return (Err(BackendError::unknown(e)), gas_info), + MockApiImpl::Error(e) => return (Err(BackendError::unknown(e)), gas_total), MockApiImpl::Bech32 { bech32_prefix } => bech32_prefix, }; - try_with_gas!(validate_length(canonical), gas_info); + unwrap_or_return_with_gas!(validate_length(canonical), gas_total); let result = encode(bech32_prefix, canonical.to_base32(), Variant::Bech32) .map_err(|_| BackendError::user_err("Invalid bech32 prefix")); - (result, gas_info) + (result, gas_total) } } From a3444689139a3d77cba01c18a48fb0b153af8763 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Sat, 6 Jan 2024 14:16:32 +0100 Subject: [PATCH 1103/2372] Store engine together with Module to fix memory increase issue --- packages/vm/src/cache.rs | 100 ++++++++++-------- packages/vm/src/modules/cached_module.rs | 23 +++- packages/vm/src/modules/file_system_cache.rs | 59 +++++++---- packages/vm/src/modules/in_memory_cache.rs | 84 +++++++++------ packages/vm/src/modules/mod.rs | 2 +- .../vm/src/modules/pinned_memory_cache.rs | 55 ++++++---- 6 files changed, 199 insertions(+), 124 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 4616c99653..40ba51c8da 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -5,7 +5,7 @@ use std::marker::PhantomData; use std::path::{Path, PathBuf}; use std::str::FromStr; use std::sync::Mutex; -use wasmer::{Engine, Store}; +use wasmer::{Module, Store}; use cosmwasm_std::Checksum; @@ -19,7 +19,7 @@ use crate::modules::{CachedModule, FileSystemCache, InMemoryCache, PinnedMemoryC use crate::parsed_wasm::ParsedWasm; use crate::size::Size; use crate::static_analysis::{Entrypoint, ExportInfo, REQUIRED_IBC_EXPORTS}; -use crate::wasm_backend::{compile, make_compiling_engine, make_runtime_engine}; +use crate::wasm_backend::{compile, make_compiling_engine}; const STATE_DIR: &str = "state"; // Things related to the state of the blockchain. @@ -91,17 +91,6 @@ pub struct CacheInner { memory_cache: InMemoryCache, fs_cache: FileSystemCache, stats: Stats, - /// A single engine to execute all contracts in this cache instance (usually - /// this means all contracts in the process). - /// - /// This engine is headless, i.e. does not contain a Singlepass compiler. - /// It only executes modules compiled with other engines. - /// - /// The engine has one memory limit set which is the same for all contracts - /// running with it. If different memory limits would be needed for different - /// contracts at some point, we'd need multiple engines. This is because the tunables - /// that control the limit are attached to the engine. - runtime_engine: Engine, } pub struct Cache { @@ -109,6 +98,7 @@ pub struct Cache { /// i.e. any number of read-only references is allowed to access it concurrently. available_capabilities: HashSet, inner: Mutex, + instance_memory_limit: Size, // Those two don't store data but only fix type information type_api: PhantomData
, type_storage: PhantomData, @@ -169,8 +159,8 @@ where memory_cache: InMemoryCache::new(memory_cache_size), fs_cache, stats: Stats::default(), - runtime_engine: make_runtime_engine(Some(instance_memory_limit)), }), + instance_memory_limit, type_storage: PhantomData::, type_api: PhantomData::, type_querier: PhantomData::, @@ -318,11 +308,12 @@ where // for a not-so-relevant use case. // Try to get module from file system cache - if let Some((module, module_size)) = cache.fs_cache.load(checksum, &cache.runtime_engine)? { + if let Some(cached_module) = cache + .fs_cache + .load(checksum, Some(self.instance_memory_limit))? + { cache.stats.hits_fs_cache = cache.stats.hits_fs_cache.saturating_add(1); - return cache - .pinned_memory_cache - .store(checksum, module, module_size); + return cache.pinned_memory_cache.store(checksum, cached_module); } // Re-compile from original Wasm bytecode @@ -337,16 +328,16 @@ where } // This time we'll hit the file-system cache. - let Some((module, module_size)) = cache.fs_cache.load(checksum, &cache.runtime_engine)? + let Some(cached_module) = cache + .fs_cache + .load(checksum, Some(self.instance_memory_limit))? else { return Err(VmError::generic_err( "Can't load module from file system cache after storing it to file system cache (pin)", )); }; - cache - .pinned_memory_cache - .store(checksum, module, module_size) + cache.pinned_memory_cache.store(checksum, cached_module) } /// Unpins a Module, i.e. removes it from the pinned memory cache. @@ -370,10 +361,10 @@ where backend: Backend, options: InstanceOptions, ) -> VmResult> { - let (cached, store) = self.get_module(checksum)?; + let (module, store) = self.get_module(checksum)?; let instance = Instance::from_module( store, - &cached.module, + &module, backend, options.gas_limit, None, @@ -385,36 +376,49 @@ where /// Returns a module tied to a previously saved Wasm. /// Depending on availability, this is either generated from a memory cache, file system cache or Wasm code. /// This is part of `get_instance` but pulled out to reduce the locking time. - fn get_module(&self, checksum: &Checksum) -> VmResult<(CachedModule, Store)> { + fn get_module(&self, checksum: &Checksum) -> VmResult<(Module, Store)> { let mut cache = self.inner.lock().unwrap(); // Try to get module from the pinned memory cache if let Some(element) = cache.pinned_memory_cache.load(checksum)? { cache.stats.hits_pinned_memory_cache = cache.stats.hits_pinned_memory_cache.saturating_add(1); - let store = Store::new(cache.runtime_engine.clone()); - return Ok((element, store)); + let CachedModule { + module, + engine, + size_estimate: _, + } = element; + let store = Store::new(engine); + return Ok((module, store)); } // Get module from memory cache if let Some(element) = cache.memory_cache.load(checksum)? { cache.stats.hits_memory_cache = cache.stats.hits_memory_cache.saturating_add(1); - let store = Store::new(cache.runtime_engine.clone()); - return Ok((element, store)); + let CachedModule { + module, + engine, + size_estimate: _, + } = element; + let store = Store::new(engine); + return Ok((module, store)); } // Get module from file system cache - if let Some((module, module_size)) = cache.fs_cache.load(checksum, &cache.runtime_engine)? { + if let Some(cached_module) = cache + .fs_cache + .load(checksum, Some(self.instance_memory_limit))? + { cache.stats.hits_fs_cache = cache.stats.hits_fs_cache.saturating_add(1); - cache - .memory_cache - .store(checksum, module.clone(), module_size)?; - let cached = CachedModule { + cache.memory_cache.store(checksum, cached_module.clone())?; + + let CachedModule { module, - size_estimate: module_size, - }; - let store = Store::new(cache.runtime_engine.clone()); - return Ok((cached, store)); + engine, + size_estimate: _, + } = cached_module; + let store = Store::new(engine); + return Ok((module, store)); } // Re-compile module from wasm @@ -433,21 +437,23 @@ where } // This time we'll hit the file-system cache. - let Some((module, module_size)) = cache.fs_cache.load(checksum, &cache.runtime_engine)? + let Some(cached_module) = cache + .fs_cache + .load(checksum, Some(self.instance_memory_limit))? else { return Err(VmError::generic_err( "Can't load module from file system cache after storing it to file system cache (get_module)", )); }; - cache - .memory_cache - .store(checksum, module.clone(), module_size)?; - let cached = CachedModule { + cache.memory_cache.store(checksum, cached_module.clone())?; + + let CachedModule { module, - size_estimate: module_size, - }; - let store = Store::new(cache.runtime_engine.clone()); - Ok((cached, store)) + engine, + size_estimate: _, + } = cached_module; + let store = Store::new(engine); + Ok((module, store)) } } diff --git a/packages/vm/src/modules/cached_module.rs b/packages/vm/src/modules/cached_module.rs index 6f9a157a9b..73c8d1fa58 100644 --- a/packages/vm/src/modules/cached_module.rs +++ b/packages/vm/src/modules/cached_module.rs @@ -1,13 +1,30 @@ -use wasmer::Module; +use wasmer::{Engine, Module}; + +/// Some manual tests on Simon's machine showed that Engine is roughly 3-5 KB big, +/// so give it a constant 10 KiB estimate. +#[inline] +pub fn engine_size_estimate() -> usize { + 10 * 1024 +} #[derive(Debug, Clone)] pub struct CachedModule { pub module: Module, + /// The runtime engine to run this module. Ideally we could use a single engine + /// for all modules but the memory issue described in + /// requires using one engine per module as a workaround. + pub engine: Engine, /// The estimated size of this element in memory. /// Since the cached modules are just [rkyv](https://rkyv.org/) dumps of the Module /// instances, we use the file size of the module on disk (not the Wasm!) /// as an estimate for this. - /// Note: Since CosmWasm 1.4 (Wasmer 4), Store/Engine are not cached anymore. - /// The majority of the Module size is the Artifact. + /// + /// Between CosmWasm 1.4 (Wasmer 4) and 1.5.2, Store/Engine were not cached. This lead to a + /// memory consumption problem. From 1.5.2 on, Module and Engine are cached and Store is created + /// from Engine on demand. + /// + /// The majority of the Module size is the Artifact which is why we use the module filesize as the estimate. + /// Some manual tests on Simon's machine showed that Engine is roughly 3-5 KB big, so give it a constant + /// estimate: [`engine_size_estimate`]. pub size_estimate: usize, } diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index fd87d9cd4e..5338c71818 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -4,13 +4,18 @@ use std::io; use std::path::{Path, PathBuf}; use thiserror::Error; -use wasmer::{AsEngineRef, DeserializeError, Module, Target}; +use wasmer::{DeserializeError, Module, Target}; use cosmwasm_std::Checksum; use crate::errors::{VmError, VmResult}; use crate::filesystem::mkdir_p; use crate::modules::current_wasmer_module_version; +use crate::wasm_backend::make_runtime_engine; +use crate::Size; + +use super::cached_module::engine_size_estimate; +use super::CachedModule; /// Bump this version whenever the module system changes in a way /// that old stored modules would be corrupt when loaded in the new system. @@ -129,24 +134,29 @@ impl FileSystemCache { path } - /// Loads a serialized module from the file system and returns a module (i.e. artifact + store), - /// along with the size of the serialized module. + /// Loads a serialized module from the file system and returns a Module + Engine, + /// along with a size estimation for the pair. pub fn load( &self, checksum: &Checksum, - engine: &impl AsEngineRef, - ) -> VmResult> { + memory_limit: Option, + ) -> VmResult> { let file_path = self.module_file(checksum); + let engine = make_runtime_engine(memory_limit); let result = if self.unchecked_modules { - unsafe { Module::deserialize_from_file_unchecked(engine, &file_path) } + unsafe { Module::deserialize_from_file_unchecked(&engine, &file_path) } } else { - unsafe { Module::deserialize_from_file(engine, &file_path) } + unsafe { Module::deserialize_from_file(&engine, &file_path) } }; match result { Ok(module) => { let module_size = module_size(&file_path)?; - Ok(Some((module, module_size))) + Ok(Some(CachedModule { + module, + engine, + size_estimate: module_size + engine_size_estimate(), + })) } Err(DeserializeError::Io(err)) => match err.kind() { io::ErrorKind::NotFound => Ok(None), @@ -225,7 +235,7 @@ mod tests { use super::*; use crate::{ size::Size, - wasm_backend::{compile, make_compiling_engine, make_runtime_engine}, + wasm_backend::{compile, make_compiling_engine}, }; use tempfile::TempDir; use wasmer::{imports, Instance as WasmerInstance, Store}; @@ -252,8 +262,7 @@ mod tests { let checksum = Checksum::generate(&wasm); // Module does not exist - let runtime_engine = make_runtime_engine(TESTING_MEMORY_LIMIT); - let cached = cache.load(&checksum, &runtime_engine).unwrap(); + let cached = cache.load(&checksum, TESTING_MEMORY_LIMIT).unwrap(); assert!(cached.is_none()); // Store module @@ -262,14 +271,21 @@ mod tests { cache.store(&checksum, &module).unwrap(); // Load module - let cached = cache.load(&checksum, &runtime_engine).unwrap(); + let cached = cache.load(&checksum, TESTING_MEMORY_LIMIT).unwrap(); assert!(cached.is_some()); // Check the returned module is functional. // This is not really testing the cache API but better safe than sorry. { - let (cached_module, module_size) = cached.unwrap(); - assert_eq!(module_size, module.serialize().unwrap().len()); + let CachedModule { + module: cached_module, + engine: runtime_engine, + size_estimate, + } = cached.unwrap(); + assert_eq!( + size_estimate, + module.serialize().unwrap().len() + 10240 /* engine size estimate */ + ); let import_object = imports! {}; let mut store = Store::new(runtime_engine); let instance = WasmerInstance::new(&mut store, &cached_module, &import_object).unwrap(); @@ -314,20 +330,25 @@ mod tests { let checksum = Checksum::generate(&wasm); // Store module - let engine1 = make_compiling_engine(TESTING_MEMORY_LIMIT); - let module = compile(&engine1, &wasm).unwrap(); + let compiling_engine = make_compiling_engine(TESTING_MEMORY_LIMIT); + let module = compile(&compiling_engine, &wasm).unwrap(); cache.store(&checksum, &module).unwrap(); // It's there - let engine2 = make_runtime_engine(TESTING_MEMORY_LIMIT); - assert!(cache.load(&checksum, &engine2).unwrap().is_some()); + assert!(cache + .load(&checksum, TESTING_MEMORY_LIMIT) + .unwrap() + .is_some()); // Remove module let existed = cache.remove(&checksum).unwrap(); assert!(existed); // it's gone now - assert!(cache.load(&checksum, &engine2).unwrap().is_none()); + assert!(cache + .load(&checksum, TESTING_MEMORY_LIMIT) + .unwrap() + .is_none()); // Remove again let existed = cache.remove(&checksum).unwrap(); diff --git a/packages/vm/src/modules/in_memory_cache.rs b/packages/vm/src/modules/in_memory_cache.rs index 6708168394..69a74106f3 100644 --- a/packages/vm/src/modules/in_memory_cache.rs +++ b/packages/vm/src/modules/in_memory_cache.rs @@ -1,7 +1,6 @@ use clru::{CLruCache, CLruCacheConfig, WeightScale}; use std::collections::hash_map::RandomState; use std::num::NonZeroUsize; -use wasmer::Module; use cosmwasm_std::Checksum; @@ -51,21 +50,10 @@ impl InMemoryCache { } } - pub fn store( - &mut self, - checksum: &Checksum, - entry: Module, - module_size: usize, - ) -> VmResult<()> { + pub fn store(&mut self, checksum: &Checksum, cached_module: CachedModule) -> VmResult<()> { if let Some(modules) = &mut self.modules { modules - .put_with_weight( - *checksum, - CachedModule { - module: entry, - size_estimate: module_size, - }, - ) + .put_with_weight(*checksum, cached_module) .map_err(|e| VmError::cache_err(format!("{e:?}")))?; } Ok(()) @@ -108,10 +96,10 @@ mod tests { use super::*; use crate::{ size::Size, - wasm_backend::{compile, make_compiling_engine}, + wasm_backend::{compile, make_compiling_engine, make_runtime_engine}, }; use std::mem; - use wasmer::{imports, Instance as WasmerInstance, Store}; + use wasmer::{imports, Instance as WasmerInstance, Module, Store}; use wasmer_middlewares::metering::set_remaining_points; const TESTING_MEMORY_LIMIT: Option = Some(Size::mebi(16)); @@ -181,8 +169,12 @@ mod tests { } // Store module - let size = wasm.len() * TESTING_WASM_SIZE_FACTOR; - cache.store(&checksum, original, size).unwrap(); + let module = CachedModule { + module: original, + engine: make_runtime_engine(TESTING_MEMORY_LIMIT), + size_estimate: wasm.len() * TESTING_WASM_SIZE_FACTOR, + }; + cache.store(&checksum, module).unwrap(); // Load module let cached = cache.load(&checksum).unwrap().unwrap(); @@ -214,20 +206,32 @@ mod tests { // Add 1 let engine1 = make_compiling_engine(TESTING_MEMORY_LIMIT); - let module = compile(&engine1, &wasm1).unwrap(); - cache.store(&checksum1, module, 900_000).unwrap(); + let module = CachedModule { + module: compile(&engine1, &wasm1).unwrap(), + engine: make_runtime_engine(TESTING_MEMORY_LIMIT), + size_estimate: 900_000, + }; + cache.store(&checksum1, module).unwrap(); assert_eq!(cache.len(), 1); // Add 2 let engine2 = make_compiling_engine(TESTING_MEMORY_LIMIT); - let module = compile(&engine2, &wasm2).unwrap(); - cache.store(&checksum2, module, 900_000).unwrap(); + let module = CachedModule { + module: compile(&engine2, &wasm2).unwrap(), + engine: make_runtime_engine(TESTING_MEMORY_LIMIT), + size_estimate: 900_000, + }; + cache.store(&checksum2, module).unwrap(); assert_eq!(cache.len(), 2); // Add 3 (pushes out the previous two) let engine3 = make_compiling_engine(TESTING_MEMORY_LIMIT); - let module = compile(&engine3, &wasm3).unwrap(); - cache.store(&checksum3, module, 1_500_000).unwrap(); + let module = CachedModule { + module: compile(&engine3, &wasm3).unwrap(), + engine: make_runtime_engine(TESTING_MEMORY_LIMIT), + size_estimate: 1_500_000, + }; + cache.store(&checksum3, module).unwrap(); assert_eq!(cache.len(), 1); } @@ -247,20 +251,32 @@ mod tests { // Add 1 let engine1 = make_compiling_engine(TESTING_MEMORY_LIMIT); - let module = compile(&engine1, &wasm1).unwrap(); - cache.store(&checksum1, module, 900_000).unwrap(); + let module = CachedModule { + module: compile(&engine1, &wasm1).unwrap(), + engine: make_runtime_engine(TESTING_MEMORY_LIMIT), + size_estimate: 900_000, + }; + cache.store(&checksum1, module).unwrap(); assert_eq!(cache.size(), 900_032); // Add 2 let engine2 = make_compiling_engine(TESTING_MEMORY_LIMIT); - let module = compile(&engine2, &wasm2).unwrap(); - cache.store(&checksum2, module, 800_000).unwrap(); + let module = CachedModule { + module: compile(&engine2, &wasm2).unwrap(), + engine: make_runtime_engine(TESTING_MEMORY_LIMIT), + size_estimate: 800_000, + }; + cache.store(&checksum2, module).unwrap(); assert_eq!(cache.size(), 900_032 + 800_032); // Add 3 (pushes out the previous two) let engine3 = make_compiling_engine(TESTING_MEMORY_LIMIT); - let module = compile(&engine3, &wasm3).unwrap(); - cache.store(&checksum3, module, 1_500_000).unwrap(); + let module = CachedModule { + module: compile(&engine3, &wasm3).unwrap(), + engine: make_runtime_engine(TESTING_MEMORY_LIMIT), + size_estimate: 1_500_000, + }; + cache.store(&checksum3, module).unwrap(); assert_eq!(cache.size(), 1_500_032); } @@ -287,8 +303,12 @@ mod tests { let original = compile(&engine, &wasm).unwrap(); // Store module - let size = wasm.len() * TESTING_WASM_SIZE_FACTOR; - cache.store(&checksum, original, size).unwrap(); + let module = CachedModule { + module: original, + engine: make_runtime_engine(TESTING_MEMORY_LIMIT), + size_estimate: wasm.len() * TESTING_WASM_SIZE_FACTOR, + }; + cache.store(&checksum, module).unwrap(); assert_eq!(cache.len(), 0); assert_eq!(cache.size(), 0); diff --git a/packages/vm/src/modules/mod.rs b/packages/vm/src/modules/mod.rs index c871963e87..c3d2d55500 100644 --- a/packages/vm/src/modules/mod.rs +++ b/packages/vm/src/modules/mod.rs @@ -4,7 +4,7 @@ mod in_memory_cache; mod pinned_memory_cache; mod versioning; -pub use cached_module::CachedModule; +pub use cached_module::{engine_size_estimate, CachedModule}; pub use file_system_cache::{FileSystemCache, NewFileSystemCacheError}; pub use in_memory_cache::InMemoryCache; pub use pinned_memory_cache::PinnedMemoryCache; diff --git a/packages/vm/src/modules/pinned_memory_cache.rs b/packages/vm/src/modules/pinned_memory_cache.rs index b003bed21b..73b8a3b10f 100644 --- a/packages/vm/src/modules/pinned_memory_cache.rs +++ b/packages/vm/src/modules/pinned_memory_cache.rs @@ -1,6 +1,5 @@ use cosmwasm_std::Checksum; use std::collections::HashMap; -use wasmer::Module; use super::cached_module::CachedModule; use crate::VmResult; @@ -18,19 +17,8 @@ impl PinnedMemoryCache { } } - pub fn store( - &mut self, - checksum: &Checksum, - element: Module, - module_size: usize, - ) -> VmResult<()> { - self.modules.insert( - *checksum, - CachedModule { - module: element, - size_estimate: module_size, - }, - ); + pub fn store(&mut self, checksum: &Checksum, cached_module: CachedModule) -> VmResult<()> { + self.modules.insert(*checksum, cached_module); Ok(()) } @@ -75,7 +63,7 @@ impl PinnedMemoryCache { mod tests { use super::*; use crate::{ - wasm_backend::{compile, make_compiling_engine}, + wasm_backend::{compile, make_compiling_engine, make_runtime_engine}, Size, }; use wasmer::{imports, Instance as WasmerInstance, Store}; @@ -120,7 +108,12 @@ mod tests { } // Store module - cache.store(&checksum, original, 0).unwrap(); + let module = CachedModule { + module: original, + engine: make_runtime_engine(TESTING_MEMORY_LIMIT), + size_estimate: 0, + }; + cache.store(&checksum, module).unwrap(); // Load module let cached = cache.load(&checksum).unwrap().unwrap(); @@ -158,7 +151,12 @@ mod tests { // Add let engine = make_compiling_engine(TESTING_MEMORY_LIMIT); let original = compile(&engine, &wasm).unwrap(); - cache.store(&checksum, original, 0).unwrap(); + let module = CachedModule { + module: original, + engine: make_runtime_engine(TESTING_MEMORY_LIMIT), + size_estimate: 0, + }; + cache.store(&checksum, module).unwrap(); assert!(cache.has(&checksum)); @@ -190,7 +188,12 @@ mod tests { // Add let engine = make_compiling_engine(TESTING_MEMORY_LIMIT); let original = compile(&engine, &wasm).unwrap(); - cache.store(&checksum, original, 0).unwrap(); + let module = CachedModule { + module: original, + engine: make_runtime_engine(TESTING_MEMORY_LIMIT), + size_estimate: 0, + }; + cache.store(&checksum, module).unwrap(); assert_eq!(cache.len(), 1); @@ -232,14 +235,22 @@ mod tests { // Add 1 let engine1 = make_compiling_engine(TESTING_MEMORY_LIMIT); - let module = compile(&engine1, &wasm1).unwrap(); - cache.store(&checksum1, module, 500).unwrap(); + let module = CachedModule { + module: compile(&engine1, &wasm1).unwrap(), + engine: make_runtime_engine(TESTING_MEMORY_LIMIT), + size_estimate: 500, + }; + cache.store(&checksum1, module).unwrap(); assert_eq!(cache.size(), 532); // Add 2 let engine2 = make_compiling_engine(TESTING_MEMORY_LIMIT); - let module = compile(&engine2, &wasm2).unwrap(); - cache.store(&checksum2, module, 300).unwrap(); + let module = CachedModule { + module: compile(&engine2, &wasm2).unwrap(), + engine: make_runtime_engine(TESTING_MEMORY_LIMIT), + size_estimate: 300, + }; + cache.store(&checksum2, module).unwrap(); assert_eq!(cache.size(), 532 + 332); // Remove 1 From 1b110c672fe7da6fae7636dbef4ba3e7e15d6fb9 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 11 Jan 2024 18:08:00 +0100 Subject: [PATCH 1104/2372] Add CHANGELOG entry for fixing #1978 --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 07c6219325..7795737658 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,13 @@ and this project adheres to ## [2.0.0-beta.0] - 2023-12-21 +### Fixed + +- cosmwasm-vm: Fix memory increase issue (1.3 -> 1.4 regression) by avoiding the + use of a long running Wasmer Engine. ([#1978]) + +[#1978]: https://github.com/CosmWasm/cosmwasm/issues/1978 + ### Added - cosmwasm-std: Add `SubMsg:reply_never` constructor ([#1929]) From ed1586bd8b047b736e709e67e96662795b202f8b Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 15 Jan 2024 23:19:23 +0100 Subject: [PATCH 1105/2372] Export MsgResponse --- CHANGELOG.md | 2 +- packages/std/src/lib.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7795737658..12727fb805 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,7 +19,7 @@ and this project adheres to - cosmwasm-std: Add optional memo field to `IbcMsg::Transfer`. ([#1878]) - cosmwasm-std: Add `Reply::gas_used`. ([#1954]) - cosmwasm-std: Add `SubMsgResponse::msg_responses` and deprecate - `SubMsgResponse::data`. ([#1903]) + `SubMsgResponse::data`. Add new type `MsgResponse`. ([#1903]) - cosmwasm-std: Add `cosmwasm_2_0` feature to enable 2.0 specific functionality. ([#1974]) diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 69b1c1e2cf..08802a6c60 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -90,8 +90,8 @@ pub use crate::query::{ pub use crate::results::WeightedVoteOption; pub use crate::results::{ attr, wasm_execute, wasm_instantiate, AnyMsg, Attribute, BankMsg, ContractResult, CosmosMsg, - CustomMsg, Empty, Event, QueryResponse, Reply, ReplyOn, Response, SubMsg, SubMsgResponse, - SubMsgResult, SystemResult, WasmMsg, + CustomMsg, Empty, Event, MsgResponse, QueryResponse, Reply, ReplyOn, Response, SubMsg, + SubMsgResponse, SubMsgResult, SystemResult, WasmMsg, }; #[cfg(feature = "staking")] pub use crate::results::{DistributionMsg, StakingMsg}; From db41745deca9be52d2348e438ed39528a06ea440 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 15 Jan 2024 23:37:08 +0100 Subject: [PATCH 1106/2372] Bump clippy to 1.75.0 and adapt codebase --- .circleci/config.yml | 2 +- contracts/burner/src/contract.rs | 2 +- contracts/burner/tests/integration.rs | 2 +- contracts/hackatom/src/contract.rs | 4 ++-- contracts/hackatom/tests/integration.rs | 4 ++-- packages/std/src/errors/std_error.rs | 4 ++-- packages/vm/src/modules/mod.rs | 4 ++-- packages/vm/src/wasm_backend/mod.rs | 1 - 8 files changed, 11 insertions(+), 12 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 501fd22bfd..78ba6b30c3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -72,7 +72,7 @@ workflows: matrix: parameters: # Run with MSRV and some modern stable Rust - rust-version: ["1.70.0", "1.73.0"] + rust-version: ["1.70.0", "1.75.0"] - benchmarking: requires: - package_vm diff --git a/contracts/burner/src/contract.rs b/contracts/burner/src/contract.rs index d6a96a0e08..06332db0d7 100644 --- a/contracts/burner/src/contract.rs +++ b/contracts/burner/src/contract.rs @@ -127,7 +127,7 @@ mod tests { let res = migrate(deps.as_mut(), mock_env(), msg).unwrap(); // check payout assert_eq!(1, res.messages.len()); - let msg = res.messages.get(0).expect("no message"); + let msg = res.messages.first().expect("no message"); assert_eq!( msg, &SubMsg::new(BankMsg::Send { diff --git a/contracts/burner/tests/integration.rs b/contracts/burner/tests/integration.rs index c783a6fa3c..a72a3f6fb2 100644 --- a/contracts/burner/tests/integration.rs +++ b/contracts/burner/tests/integration.rs @@ -67,7 +67,7 @@ fn migrate_sends_funds() { let res: Response = migrate(&mut deps, mock_env(), msg).unwrap(); // check payout assert_eq!(1, res.messages.len()); - let msg = res.messages.get(0).expect("no message"); + let msg = res.messages.first().expect("no message"); assert_eq!( msg, &SubMsg::new(BankMsg::Send { diff --git a/contracts/hackatom/src/contract.rs b/contracts/hackatom/src/contract.rs index e333718cfb..d1afbc6f5a 100644 --- a/contracts/hackatom/src/contract.rs +++ b/contracts/hackatom/src/contract.rs @@ -406,7 +406,7 @@ mod tests { }; let res = sudo(deps.as_mut(), mock_env(), sys_msg).unwrap(); assert_eq!(1, res.messages.len()); - let msg = res.messages.get(0).expect("no message"); + let msg = res.messages.first().expect("no message"); assert_eq!(msg, &SubMsg::new(BankMsg::Send { to_address, amount })); } @@ -458,7 +458,7 @@ mod tests { ) .unwrap(); assert_eq!(execute_res.messages.len(), 1); - let msg = execute_res.messages.get(0).expect("no message"); + let msg = execute_res.messages.first().expect("no message"); assert_eq!( msg, &SubMsg::new(BankMsg::Send { diff --git a/contracts/hackatom/tests/integration.rs b/contracts/hackatom/tests/integration.rs index e65773b3f6..1b82fdb7b8 100644 --- a/contracts/hackatom/tests/integration.rs +++ b/contracts/hackatom/tests/integration.rs @@ -177,7 +177,7 @@ fn sudo_can_steal_tokens() { }; let res: Response = sudo(&mut deps, mock_env(), sys_msg).unwrap(); assert_eq!(1, res.messages.len()); - let msg = res.messages.get(0).expect("no message"); + let msg = res.messages.first().expect("no message"); assert_eq!(msg, &SubMsg::new(BankMsg::Send { to_address, amount })); } @@ -244,7 +244,7 @@ fn execute_release_works() { let execute_res: Response = execute(&mut deps, mock_env(), execute_info, ExecuteMsg::Release {}).unwrap(); assert_eq!(execute_res.messages.len(), 1); - let msg = execute_res.messages.get(0).expect("no message"); + let msg = execute_res.messages.first().expect("no message"); assert_eq!( msg, &SubMsg::new(BankMsg::Send { diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index 31cd692ae1..588511346c 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -765,8 +765,8 @@ mod tests { #[test] fn from_std_str_utf8error_works() { - let broken = b"Hello \xF0\x90\x80World"; - let error: StdError = str::from_utf8(broken).unwrap_err().into(); + let broken = Vec::from(b"Hello \xF0\x90\x80World" as &[u8]); + let error: StdError = str::from_utf8(&broken).unwrap_err().into(); match error { StdError::InvalidUtf8 { msg, .. } => { assert_eq!(msg, "invalid utf-8 sequence of 3 bytes from index 6") diff --git a/packages/vm/src/modules/mod.rs b/packages/vm/src/modules/mod.rs index c3d2d55500..ec3804c914 100644 --- a/packages/vm/src/modules/mod.rs +++ b/packages/vm/src/modules/mod.rs @@ -4,8 +4,8 @@ mod in_memory_cache; mod pinned_memory_cache; mod versioning; -pub use cached_module::{engine_size_estimate, CachedModule}; -pub use file_system_cache::{FileSystemCache, NewFileSystemCacheError}; +pub use cached_module::CachedModule; +pub use file_system_cache::FileSystemCache; pub use in_memory_cache::InMemoryCache; pub use pinned_memory_cache::PinnedMemoryCache; pub use versioning::current_wasmer_module_version; diff --git a/packages/vm/src/wasm_backend/mod.rs b/packages/vm/src/wasm_backend/mod.rs index 59707b8d2f..1b64e39398 100644 --- a/packages/vm/src/wasm_backend/mod.rs +++ b/packages/vm/src/wasm_backend/mod.rs @@ -5,4 +5,3 @@ mod limiting_tunables; pub use compile::compile; pub use engine::{make_compiling_engine, make_runtime_engine}; -pub use limiting_tunables::LimitingTunables; From 8dcba8c3723b446327eb1c61e5f6e62363f3fb57 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 15 Jan 2024 22:58:29 +0100 Subject: [PATCH 1107/2372] Upgrade Wasmer to 4.2.5 --- CHANGELOG.md | 1 + Cargo.lock | 73 +++++++++++---------------- contracts/burner/Cargo.lock | 66 ++++++++---------------- contracts/crypto-verify/Cargo.lock | 66 ++++++++---------------- contracts/cyberpunk/Cargo.lock | 66 ++++++++---------------- contracts/empty/Cargo.lock | 66 ++++++++---------------- contracts/floaty/Cargo.lock | 66 ++++++++---------------- contracts/hackatom/Cargo.lock | 66 ++++++++---------------- contracts/ibc-reflect-send/Cargo.lock | 66 ++++++++---------------- contracts/ibc-reflect/Cargo.lock | 66 ++++++++---------------- contracts/queue/Cargo.lock | 66 ++++++++---------------- contracts/reflect/Cargo.lock | 66 ++++++++---------------- contracts/staking/Cargo.lock | 66 ++++++++---------------- contracts/virus/Cargo.lock | 66 ++++++++---------------- packages/vm/Cargo.toml | 4 +- 15 files changed, 284 insertions(+), 586 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12727fb805..e8b095cab2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -89,6 +89,7 @@ and this project adheres to `::addr_canonicalize`/`::addr_humanize` for consistency. - cosmwasm-vm: Add `BackendApi::addr_validate` to avoid having to do two calls from Rust into Go. +- cosmwasm-vm: Upgrade Wasmer to 4.2.5 [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 diff --git a/Cargo.lock b/Cargo.lock index f1033fa23e..12ca9aa3cb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -694,7 +694,7 @@ dependencies = [ "autocfg", "cfg-if", "crossbeam-utils", - "memoffset", + "memoffset 0.8.0", "scopeguard", ] @@ -1398,6 +1398,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + [[package]] name = "miniz_oxide" version = "0.6.2" @@ -2005,9 +2014,9 @@ dependencies = [ [[package]] name = "shared-buffer" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +checksum = "f6c99835bad52957e7aa241d3975ed17c1e5f8c92026377d117a606f36b84b16" dependencies = [ "bytes", "memmap2 0.6.2", @@ -2339,29 +2348,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-downcast" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" -dependencies = [ - "js-sys", - "once_cell", - "wasm-bindgen", - "wasm-bindgen-downcast-macros", -] - -[[package]] -name = "wasm-bindgen-downcast-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.86" @@ -2402,9 +2388,9 @@ dependencies = [ [[package]] name = "wasmer" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" +checksum = "5467c7a23f9be04d5691590bea509dbea27e5ba5810d0020bef908456a495f33" dependencies = [ "bytes", "cfg-if", @@ -2419,7 +2405,6 @@ dependencies = [ "target-lexicon", "thiserror", "wasm-bindgen", - "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", @@ -2431,9 +2416,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" +checksum = "510ad01a668d774f3a103a7c219bbc0970be93e8f1b27e2fdb48d1f4ccd1deff" dependencies = [ "backtrace", "bytes", @@ -2458,9 +2443,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" +checksum = "54bf93078990d83960d798de3c5935bddaba771fc2fefb9ed6bab9c0bbdea5c1" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -2477,9 +2462,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" +checksum = "8f4d6359d66a8bcefac26d48fcb0f3f0882bdf122b52121a1ae21f918706e040" dependencies = [ "byteorder", "dynasm", @@ -2496,9 +2481,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" +checksum = "1b374fd34d97b1c091d8675f9bc472df52dc6787d139d3762d42c7dc84813a9b" dependencies = [ "proc-macro-error", "proc-macro2", @@ -2508,9 +2493,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" +checksum = "aab1347a1f81bf5929289db82b4f3966e9aecc4f874115110b6c0894ee8d9e77" dependencies = [ "wasmer", "wasmer-types", @@ -2519,9 +2504,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" +checksum = "0caf1c87937b52aba8e9f920a278e1beda282f7439612c0b48f51a58e7a87bab" dependencies = [ "bytecheck", "enum-iterator", @@ -2535,9 +2520,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" +checksum = "58315c25492bc72a33f47a7d7fb0869a0106fc0164ec051e349a9e1eddba9a01" dependencies = [ "backtrace", "cc", @@ -2552,7 +2537,7 @@ dependencies = [ "lazy_static", "libc", "mach", - "memoffset", + "memoffset 0.9.0", "more-asserts", "region", "scopeguard", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 1ba847ee38..edb927577d 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -978,9 +978,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ "autocfg", ] @@ -1412,9 +1412,9 @@ dependencies = [ [[package]] name = "shared-buffer" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +checksum = "f6c99835bad52957e7aa241d3975ed17c1e5f8c92026377d117a606f36b84b16" dependencies = [ "bytes", "memmap2 0.6.2", @@ -1674,29 +1674,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-downcast" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" -dependencies = [ - "js-sys", - "once_cell", - "wasm-bindgen", - "wasm-bindgen-downcast-macros", -] - -[[package]] -name = "wasm-bindgen-downcast-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.84" @@ -1728,9 +1705,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" +checksum = "5467c7a23f9be04d5691590bea509dbea27e5ba5810d0020bef908456a495f33" dependencies = [ "bytes", "cfg-if", @@ -1745,7 +1722,6 @@ dependencies = [ "target-lexicon", "thiserror", "wasm-bindgen", - "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", @@ -1757,9 +1733,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" +checksum = "510ad01a668d774f3a103a7c219bbc0970be93e8f1b27e2fdb48d1f4ccd1deff" dependencies = [ "backtrace", "bytes", @@ -1784,9 +1760,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" +checksum = "54bf93078990d83960d798de3c5935bddaba771fc2fefb9ed6bab9c0bbdea5c1" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1803,9 +1779,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" +checksum = "8f4d6359d66a8bcefac26d48fcb0f3f0882bdf122b52121a1ae21f918706e040" dependencies = [ "byteorder", "dynasm", @@ -1822,9 +1798,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" +checksum = "1b374fd34d97b1c091d8675f9bc472df52dc6787d139d3762d42c7dc84813a9b" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1834,9 +1810,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" +checksum = "aab1347a1f81bf5929289db82b4f3966e9aecc4f874115110b6c0894ee8d9e77" dependencies = [ "wasmer", "wasmer-types", @@ -1845,9 +1821,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" +checksum = "0caf1c87937b52aba8e9f920a278e1beda282f7439612c0b48f51a58e7a87bab" dependencies = [ "bytecheck", "enum-iterator", @@ -1861,9 +1837,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" +checksum = "58315c25492bc72a33f47a7d7fb0869a0106fc0164ec051e349a9e1eddba9a01" dependencies = [ "backtrace", "cc", @@ -1878,7 +1854,7 @@ dependencies = [ "lazy_static", "libc", "mach", - "memoffset 0.8.0", + "memoffset 0.9.0", "more-asserts", "region", "scopeguard", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 1eb14ab5bf..4730bc978c 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -995,9 +995,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ "autocfg", ] @@ -1455,9 +1455,9 @@ dependencies = [ [[package]] name = "shared-buffer" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +checksum = "f6c99835bad52957e7aa241d3975ed17c1e5f8c92026377d117a606f36b84b16" dependencies = [ "bytes", "memmap2 0.6.2", @@ -1717,29 +1717,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-downcast" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" -dependencies = [ - "js-sys", - "once_cell", - "wasm-bindgen", - "wasm-bindgen-downcast-macros", -] - -[[package]] -name = "wasm-bindgen-downcast-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.84" @@ -1771,9 +1748,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" +checksum = "5467c7a23f9be04d5691590bea509dbea27e5ba5810d0020bef908456a495f33" dependencies = [ "bytes", "cfg-if", @@ -1788,7 +1765,6 @@ dependencies = [ "target-lexicon", "thiserror", "wasm-bindgen", - "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", @@ -1800,9 +1776,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" +checksum = "510ad01a668d774f3a103a7c219bbc0970be93e8f1b27e2fdb48d1f4ccd1deff" dependencies = [ "backtrace", "bytes", @@ -1827,9 +1803,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" +checksum = "54bf93078990d83960d798de3c5935bddaba771fc2fefb9ed6bab9c0bbdea5c1" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1846,9 +1822,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" +checksum = "8f4d6359d66a8bcefac26d48fcb0f3f0882bdf122b52121a1ae21f918706e040" dependencies = [ "byteorder", "dynasm", @@ -1865,9 +1841,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" +checksum = "1b374fd34d97b1c091d8675f9bc472df52dc6787d139d3762d42c7dc84813a9b" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1877,9 +1853,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" +checksum = "aab1347a1f81bf5929289db82b4f3966e9aecc4f874115110b6c0894ee8d9e77" dependencies = [ "wasmer", "wasmer-types", @@ -1888,9 +1864,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" +checksum = "0caf1c87937b52aba8e9f920a278e1beda282f7439612c0b48f51a58e7a87bab" dependencies = [ "bytecheck", "enum-iterator", @@ -1904,9 +1880,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" +checksum = "58315c25492bc72a33f47a7d7fb0869a0106fc0164ec051e349a9e1eddba9a01" dependencies = [ "backtrace", "cc", @@ -1921,7 +1897,7 @@ dependencies = [ "lazy_static", "libc", "mach", - "memoffset 0.8.0", + "memoffset 0.9.0", "more-asserts", "region", "scopeguard", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 3634acecdc..7a3a7ef02e 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -1076,9 +1076,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ "autocfg", ] @@ -1536,9 +1536,9 @@ dependencies = [ [[package]] name = "shared-buffer" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +checksum = "f6c99835bad52957e7aa241d3975ed17c1e5f8c92026377d117a606f36b84b16" dependencies = [ "bytes", "memmap2 0.6.2", @@ -1811,29 +1811,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-downcast" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" -dependencies = [ - "js-sys", - "once_cell", - "wasm-bindgen", - "wasm-bindgen-downcast-macros", -] - -[[package]] -name = "wasm-bindgen-downcast-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.84" @@ -1865,9 +1842,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" +checksum = "5467c7a23f9be04d5691590bea509dbea27e5ba5810d0020bef908456a495f33" dependencies = [ "bytes", "cfg-if", @@ -1882,7 +1859,6 @@ dependencies = [ "target-lexicon", "thiserror", "wasm-bindgen", - "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", @@ -1894,9 +1870,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" +checksum = "510ad01a668d774f3a103a7c219bbc0970be93e8f1b27e2fdb48d1f4ccd1deff" dependencies = [ "backtrace", "bytes", @@ -1921,9 +1897,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" +checksum = "54bf93078990d83960d798de3c5935bddaba771fc2fefb9ed6bab9c0bbdea5c1" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1940,9 +1916,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" +checksum = "8f4d6359d66a8bcefac26d48fcb0f3f0882bdf122b52121a1ae21f918706e040" dependencies = [ "byteorder", "dynasm", @@ -1959,9 +1935,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" +checksum = "1b374fd34d97b1c091d8675f9bc472df52dc6787d139d3762d42c7dc84813a9b" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1971,9 +1947,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" +checksum = "aab1347a1f81bf5929289db82b4f3966e9aecc4f874115110b6c0894ee8d9e77" dependencies = [ "wasmer", "wasmer-types", @@ -1982,9 +1958,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" +checksum = "0caf1c87937b52aba8e9f920a278e1beda282f7439612c0b48f51a58e7a87bab" dependencies = [ "bytecheck", "enum-iterator", @@ -1998,9 +1974,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" +checksum = "58315c25492bc72a33f47a7d7fb0869a0106fc0164ec051e349a9e1eddba9a01" dependencies = [ "backtrace", "cc", @@ -2015,7 +1991,7 @@ dependencies = [ "lazy_static", "libc", "mach", - "memoffset 0.8.0", + "memoffset 0.9.0", "more-asserts", "region", "scopeguard", diff --git a/contracts/empty/Cargo.lock b/contracts/empty/Cargo.lock index 813204f989..59ffdb0418 100644 --- a/contracts/empty/Cargo.lock +++ b/contracts/empty/Cargo.lock @@ -977,9 +977,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ "autocfg", ] @@ -1411,9 +1411,9 @@ dependencies = [ [[package]] name = "shared-buffer" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +checksum = "f6c99835bad52957e7aa241d3975ed17c1e5f8c92026377d117a606f36b84b16" dependencies = [ "bytes", "memmap2 0.6.2", @@ -1673,29 +1673,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-downcast" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" -dependencies = [ - "js-sys", - "once_cell", - "wasm-bindgen", - "wasm-bindgen-downcast-macros", -] - -[[package]] -name = "wasm-bindgen-downcast-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.84" @@ -1727,9 +1704,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" +checksum = "5467c7a23f9be04d5691590bea509dbea27e5ba5810d0020bef908456a495f33" dependencies = [ "bytes", "cfg-if", @@ -1744,7 +1721,6 @@ dependencies = [ "target-lexicon", "thiserror", "wasm-bindgen", - "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", @@ -1756,9 +1732,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" +checksum = "510ad01a668d774f3a103a7c219bbc0970be93e8f1b27e2fdb48d1f4ccd1deff" dependencies = [ "backtrace", "bytes", @@ -1783,9 +1759,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" +checksum = "54bf93078990d83960d798de3c5935bddaba771fc2fefb9ed6bab9c0bbdea5c1" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1802,9 +1778,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" +checksum = "8f4d6359d66a8bcefac26d48fcb0f3f0882bdf122b52121a1ae21f918706e040" dependencies = [ "byteorder", "dynasm", @@ -1821,9 +1797,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" +checksum = "1b374fd34d97b1c091d8675f9bc472df52dc6787d139d3762d42c7dc84813a9b" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1833,9 +1809,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" +checksum = "aab1347a1f81bf5929289db82b4f3966e9aecc4f874115110b6c0894ee8d9e77" dependencies = [ "wasmer", "wasmer-types", @@ -1844,9 +1820,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" +checksum = "0caf1c87937b52aba8e9f920a278e1beda282f7439612c0b48f51a58e7a87bab" dependencies = [ "bytecheck", "enum-iterator", @@ -1860,9 +1836,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" +checksum = "58315c25492bc72a33f47a7d7fb0869a0106fc0164ec051e349a9e1eddba9a01" dependencies = [ "backtrace", "cc", @@ -1877,7 +1853,7 @@ dependencies = [ "lazy_static", "libc", "mach", - "memoffset 0.8.0", + "memoffset 0.9.0", "more-asserts", "region", "scopeguard", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index ca52aca21b..b3aa94d0d5 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -979,9 +979,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ "autocfg", ] @@ -1429,9 +1429,9 @@ dependencies = [ [[package]] name = "shared-buffer" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +checksum = "f6c99835bad52957e7aa241d3975ed17c1e5f8c92026377d117a606f36b84b16" dependencies = [ "bytes", "memmap2 0.6.2", @@ -1691,29 +1691,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-downcast" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" -dependencies = [ - "js-sys", - "once_cell", - "wasm-bindgen", - "wasm-bindgen-downcast-macros", -] - -[[package]] -name = "wasm-bindgen-downcast-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.84" @@ -1745,9 +1722,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" +checksum = "5467c7a23f9be04d5691590bea509dbea27e5ba5810d0020bef908456a495f33" dependencies = [ "bytes", "cfg-if", @@ -1762,7 +1739,6 @@ dependencies = [ "target-lexicon", "thiserror", "wasm-bindgen", - "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", @@ -1774,9 +1750,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" +checksum = "510ad01a668d774f3a103a7c219bbc0970be93e8f1b27e2fdb48d1f4ccd1deff" dependencies = [ "backtrace", "bytes", @@ -1801,9 +1777,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" +checksum = "54bf93078990d83960d798de3c5935bddaba771fc2fefb9ed6bab9c0bbdea5c1" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1820,9 +1796,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" +checksum = "8f4d6359d66a8bcefac26d48fcb0f3f0882bdf122b52121a1ae21f918706e040" dependencies = [ "byteorder", "dynasm", @@ -1839,9 +1815,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" +checksum = "1b374fd34d97b1c091d8675f9bc472df52dc6787d139d3762d42c7dc84813a9b" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1851,9 +1827,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" +checksum = "aab1347a1f81bf5929289db82b4f3966e9aecc4f874115110b6c0894ee8d9e77" dependencies = [ "wasmer", "wasmer-types", @@ -1862,9 +1838,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" +checksum = "0caf1c87937b52aba8e9f920a278e1beda282f7439612c0b48f51a58e7a87bab" dependencies = [ "bytecheck", "enum-iterator", @@ -1878,9 +1854,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" +checksum = "58315c25492bc72a33f47a7d7fb0869a0106fc0164ec051e349a9e1eddba9a01" dependencies = [ "backtrace", "cc", @@ -1895,7 +1871,7 @@ dependencies = [ "lazy_static", "libc", "mach", - "memoffset 0.8.0", + "memoffset 0.9.0", "more-asserts", "region", "scopeguard", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 6935ea1a40..6e785a0889 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -980,9 +980,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ "autocfg", ] @@ -1414,9 +1414,9 @@ dependencies = [ [[package]] name = "shared-buffer" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +checksum = "f6c99835bad52957e7aa241d3975ed17c1e5f8c92026377d117a606f36b84b16" dependencies = [ "bytes", "memmap2 0.6.2", @@ -1676,29 +1676,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-downcast" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" -dependencies = [ - "js-sys", - "once_cell", - "wasm-bindgen", - "wasm-bindgen-downcast-macros", -] - -[[package]] -name = "wasm-bindgen-downcast-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.84" @@ -1730,9 +1707,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" +checksum = "5467c7a23f9be04d5691590bea509dbea27e5ba5810d0020bef908456a495f33" dependencies = [ "bytes", "cfg-if", @@ -1747,7 +1724,6 @@ dependencies = [ "target-lexicon", "thiserror", "wasm-bindgen", - "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", @@ -1759,9 +1735,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" +checksum = "510ad01a668d774f3a103a7c219bbc0970be93e8f1b27e2fdb48d1f4ccd1deff" dependencies = [ "backtrace", "bytes", @@ -1786,9 +1762,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" +checksum = "54bf93078990d83960d798de3c5935bddaba771fc2fefb9ed6bab9c0bbdea5c1" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1805,9 +1781,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" +checksum = "8f4d6359d66a8bcefac26d48fcb0f3f0882bdf122b52121a1ae21f918706e040" dependencies = [ "byteorder", "dynasm", @@ -1824,9 +1800,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" +checksum = "1b374fd34d97b1c091d8675f9bc472df52dc6787d139d3762d42c7dc84813a9b" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1836,9 +1812,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" +checksum = "aab1347a1f81bf5929289db82b4f3966e9aecc4f874115110b6c0894ee8d9e77" dependencies = [ "wasmer", "wasmer-types", @@ -1847,9 +1823,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" +checksum = "0caf1c87937b52aba8e9f920a278e1beda282f7439612c0b48f51a58e7a87bab" dependencies = [ "bytecheck", "enum-iterator", @@ -1863,9 +1839,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" +checksum = "58315c25492bc72a33f47a7d7fb0869a0106fc0164ec051e349a9e1eddba9a01" dependencies = [ "backtrace", "cc", @@ -1880,7 +1856,7 @@ dependencies = [ "lazy_static", "libc", "mach", - "memoffset 0.8.0", + "memoffset 0.9.0", "more-asserts", "region", "scopeguard", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 51153f881e..4ce9f13a64 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -978,9 +978,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ "autocfg", ] @@ -1412,9 +1412,9 @@ dependencies = [ [[package]] name = "shared-buffer" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +checksum = "f6c99835bad52957e7aa241d3975ed17c1e5f8c92026377d117a606f36b84b16" dependencies = [ "bytes", "memmap2 0.6.2", @@ -1674,29 +1674,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-downcast" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" -dependencies = [ - "js-sys", - "once_cell", - "wasm-bindgen", - "wasm-bindgen-downcast-macros", -] - -[[package]] -name = "wasm-bindgen-downcast-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.84" @@ -1728,9 +1705,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" +checksum = "5467c7a23f9be04d5691590bea509dbea27e5ba5810d0020bef908456a495f33" dependencies = [ "bytes", "cfg-if", @@ -1745,7 +1722,6 @@ dependencies = [ "target-lexicon", "thiserror", "wasm-bindgen", - "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", @@ -1757,9 +1733,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" +checksum = "510ad01a668d774f3a103a7c219bbc0970be93e8f1b27e2fdb48d1f4ccd1deff" dependencies = [ "backtrace", "bytes", @@ -1784,9 +1760,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" +checksum = "54bf93078990d83960d798de3c5935bddaba771fc2fefb9ed6bab9c0bbdea5c1" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1803,9 +1779,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" +checksum = "8f4d6359d66a8bcefac26d48fcb0f3f0882bdf122b52121a1ae21f918706e040" dependencies = [ "byteorder", "dynasm", @@ -1822,9 +1798,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" +checksum = "1b374fd34d97b1c091d8675f9bc472df52dc6787d139d3762d42c7dc84813a9b" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1834,9 +1810,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" +checksum = "aab1347a1f81bf5929289db82b4f3966e9aecc4f874115110b6c0894ee8d9e77" dependencies = [ "wasmer", "wasmer-types", @@ -1845,9 +1821,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" +checksum = "0caf1c87937b52aba8e9f920a278e1beda282f7439612c0b48f51a58e7a87bab" dependencies = [ "bytecheck", "enum-iterator", @@ -1861,9 +1837,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" +checksum = "58315c25492bc72a33f47a7d7fb0869a0106fc0164ec051e349a9e1eddba9a01" dependencies = [ "backtrace", "cc", @@ -1878,7 +1854,7 @@ dependencies = [ "lazy_static", "libc", "mach", - "memoffset 0.8.0", + "memoffset 0.9.0", "more-asserts", "region", "scopeguard", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 1716a43ad8..adebdadeb9 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -978,9 +978,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ "autocfg", ] @@ -1412,9 +1412,9 @@ dependencies = [ [[package]] name = "shared-buffer" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +checksum = "f6c99835bad52957e7aa241d3975ed17c1e5f8c92026377d117a606f36b84b16" dependencies = [ "bytes", "memmap2 0.6.2", @@ -1674,29 +1674,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-downcast" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" -dependencies = [ - "js-sys", - "once_cell", - "wasm-bindgen", - "wasm-bindgen-downcast-macros", -] - -[[package]] -name = "wasm-bindgen-downcast-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.84" @@ -1728,9 +1705,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" +checksum = "5467c7a23f9be04d5691590bea509dbea27e5ba5810d0020bef908456a495f33" dependencies = [ "bytes", "cfg-if", @@ -1745,7 +1722,6 @@ dependencies = [ "target-lexicon", "thiserror", "wasm-bindgen", - "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", @@ -1757,9 +1733,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" +checksum = "510ad01a668d774f3a103a7c219bbc0970be93e8f1b27e2fdb48d1f4ccd1deff" dependencies = [ "backtrace", "bytes", @@ -1784,9 +1760,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" +checksum = "54bf93078990d83960d798de3c5935bddaba771fc2fefb9ed6bab9c0bbdea5c1" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1803,9 +1779,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" +checksum = "8f4d6359d66a8bcefac26d48fcb0f3f0882bdf122b52121a1ae21f918706e040" dependencies = [ "byteorder", "dynasm", @@ -1822,9 +1798,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" +checksum = "1b374fd34d97b1c091d8675f9bc472df52dc6787d139d3762d42c7dc84813a9b" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1834,9 +1810,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" +checksum = "aab1347a1f81bf5929289db82b4f3966e9aecc4f874115110b6c0894ee8d9e77" dependencies = [ "wasmer", "wasmer-types", @@ -1845,9 +1821,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" +checksum = "0caf1c87937b52aba8e9f920a278e1beda282f7439612c0b48f51a58e7a87bab" dependencies = [ "bytecheck", "enum-iterator", @@ -1861,9 +1837,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" +checksum = "58315c25492bc72a33f47a7d7fb0869a0106fc0164ec051e349a9e1eddba9a01" dependencies = [ "backtrace", "cc", @@ -1878,7 +1854,7 @@ dependencies = [ "lazy_static", "libc", "mach", - "memoffset 0.8.0", + "memoffset 0.9.0", "more-asserts", "region", "scopeguard", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index e65cd61823..9e825ecc67 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -967,9 +967,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ "autocfg", ] @@ -1412,9 +1412,9 @@ dependencies = [ [[package]] name = "shared-buffer" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +checksum = "f6c99835bad52957e7aa241d3975ed17c1e5f8c92026377d117a606f36b84b16" dependencies = [ "bytes", "memmap2 0.6.2", @@ -1674,29 +1674,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-downcast" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" -dependencies = [ - "js-sys", - "once_cell", - "wasm-bindgen", - "wasm-bindgen-downcast-macros", -] - -[[package]] -name = "wasm-bindgen-downcast-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.84" @@ -1728,9 +1705,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" +checksum = "5467c7a23f9be04d5691590bea509dbea27e5ba5810d0020bef908456a495f33" dependencies = [ "bytes", "cfg-if", @@ -1745,7 +1722,6 @@ dependencies = [ "target-lexicon", "thiserror", "wasm-bindgen", - "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", @@ -1757,9 +1733,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" +checksum = "510ad01a668d774f3a103a7c219bbc0970be93e8f1b27e2fdb48d1f4ccd1deff" dependencies = [ "backtrace", "bytes", @@ -1784,9 +1760,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" +checksum = "54bf93078990d83960d798de3c5935bddaba771fc2fefb9ed6bab9c0bbdea5c1" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1803,9 +1779,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" +checksum = "8f4d6359d66a8bcefac26d48fcb0f3f0882bdf122b52121a1ae21f918706e040" dependencies = [ "byteorder", "dynasm", @@ -1822,9 +1798,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" +checksum = "1b374fd34d97b1c091d8675f9bc472df52dc6787d139d3762d42c7dc84813a9b" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1834,9 +1810,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" +checksum = "aab1347a1f81bf5929289db82b4f3966e9aecc4f874115110b6c0894ee8d9e77" dependencies = [ "wasmer", "wasmer-types", @@ -1845,9 +1821,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" +checksum = "0caf1c87937b52aba8e9f920a278e1beda282f7439612c0b48f51a58e7a87bab" dependencies = [ "bytecheck", "enum-iterator", @@ -1861,9 +1837,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" +checksum = "58315c25492bc72a33f47a7d7fb0869a0106fc0164ec051e349a9e1eddba9a01" dependencies = [ "backtrace", "cc", @@ -1878,7 +1854,7 @@ dependencies = [ "lazy_static", "libc", "mach", - "memoffset 0.8.0", + "memoffset 0.9.0", "more-asserts", "region", "scopeguard", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 7a9e7eb413..e66b394887 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -967,9 +967,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ "autocfg", ] @@ -1413,9 +1413,9 @@ dependencies = [ [[package]] name = "shared-buffer" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +checksum = "f6c99835bad52957e7aa241d3975ed17c1e5f8c92026377d117a606f36b84b16" dependencies = [ "bytes", "memmap2 0.6.2", @@ -1675,29 +1675,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-downcast" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" -dependencies = [ - "js-sys", - "once_cell", - "wasm-bindgen", - "wasm-bindgen-downcast-macros", -] - -[[package]] -name = "wasm-bindgen-downcast-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.84" @@ -1729,9 +1706,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" +checksum = "5467c7a23f9be04d5691590bea509dbea27e5ba5810d0020bef908456a495f33" dependencies = [ "bytes", "cfg-if", @@ -1746,7 +1723,6 @@ dependencies = [ "target-lexicon", "thiserror", "wasm-bindgen", - "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", @@ -1758,9 +1734,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" +checksum = "510ad01a668d774f3a103a7c219bbc0970be93e8f1b27e2fdb48d1f4ccd1deff" dependencies = [ "backtrace", "bytes", @@ -1785,9 +1761,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" +checksum = "54bf93078990d83960d798de3c5935bddaba771fc2fefb9ed6bab9c0bbdea5c1" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1804,9 +1780,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" +checksum = "8f4d6359d66a8bcefac26d48fcb0f3f0882bdf122b52121a1ae21f918706e040" dependencies = [ "byteorder", "dynasm", @@ -1823,9 +1799,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" +checksum = "1b374fd34d97b1c091d8675f9bc472df52dc6787d139d3762d42c7dc84813a9b" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1835,9 +1811,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" +checksum = "aab1347a1f81bf5929289db82b4f3966e9aecc4f874115110b6c0894ee8d9e77" dependencies = [ "wasmer", "wasmer-types", @@ -1846,9 +1822,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" +checksum = "0caf1c87937b52aba8e9f920a278e1beda282f7439612c0b48f51a58e7a87bab" dependencies = [ "bytecheck", "enum-iterator", @@ -1862,9 +1838,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" +checksum = "58315c25492bc72a33f47a7d7fb0869a0106fc0164ec051e349a9e1eddba9a01" dependencies = [ "backtrace", "cc", @@ -1879,7 +1855,7 @@ dependencies = [ "lazy_static", "libc", "mach", - "memoffset 0.8.0", + "memoffset 0.9.0", "more-asserts", "region", "scopeguard", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 7c0d169e93..ae1d1218e3 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -973,9 +973,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ "autocfg", ] @@ -1407,9 +1407,9 @@ dependencies = [ [[package]] name = "shared-buffer" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +checksum = "f6c99835bad52957e7aa241d3975ed17c1e5f8c92026377d117a606f36b84b16" dependencies = [ "bytes", "memmap2 0.6.2", @@ -1702,29 +1702,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-downcast" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" -dependencies = [ - "js-sys", - "once_cell", - "wasm-bindgen", - "wasm-bindgen-downcast-macros", -] - -[[package]] -name = "wasm-bindgen-downcast-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.84" @@ -1756,9 +1733,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" +checksum = "5467c7a23f9be04d5691590bea509dbea27e5ba5810d0020bef908456a495f33" dependencies = [ "bytes", "cfg-if", @@ -1773,7 +1750,6 @@ dependencies = [ "target-lexicon", "thiserror", "wasm-bindgen", - "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", @@ -1785,9 +1761,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" +checksum = "510ad01a668d774f3a103a7c219bbc0970be93e8f1b27e2fdb48d1f4ccd1deff" dependencies = [ "backtrace", "bytes", @@ -1812,9 +1788,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" +checksum = "54bf93078990d83960d798de3c5935bddaba771fc2fefb9ed6bab9c0bbdea5c1" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1831,9 +1807,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" +checksum = "8f4d6359d66a8bcefac26d48fcb0f3f0882bdf122b52121a1ae21f918706e040" dependencies = [ "byteorder", "dynasm", @@ -1850,9 +1826,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" +checksum = "1b374fd34d97b1c091d8675f9bc472df52dc6787d139d3762d42c7dc84813a9b" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1862,9 +1838,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" +checksum = "aab1347a1f81bf5929289db82b4f3966e9aecc4f874115110b6c0894ee8d9e77" dependencies = [ "wasmer", "wasmer-types", @@ -1873,9 +1849,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" +checksum = "0caf1c87937b52aba8e9f920a278e1beda282f7439612c0b48f51a58e7a87bab" dependencies = [ "bytecheck", "enum-iterator", @@ -1889,9 +1865,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" +checksum = "58315c25492bc72a33f47a7d7fb0869a0106fc0164ec051e349a9e1eddba9a01" dependencies = [ "backtrace", "cc", @@ -1906,7 +1882,7 @@ dependencies = [ "lazy_static", "libc", "mach", - "memoffset 0.8.0", + "memoffset 0.9.0", "more-asserts", "region", "scopeguard", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index a07b54c3db..43f2cb61c1 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -967,9 +967,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ "autocfg", ] @@ -1401,9 +1401,9 @@ dependencies = [ [[package]] name = "shared-buffer" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +checksum = "f6c99835bad52957e7aa241d3975ed17c1e5f8c92026377d117a606f36b84b16" dependencies = [ "bytes", "memmap2 0.6.2", @@ -1675,29 +1675,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-downcast" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" -dependencies = [ - "js-sys", - "once_cell", - "wasm-bindgen", - "wasm-bindgen-downcast-macros", -] - -[[package]] -name = "wasm-bindgen-downcast-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.84" @@ -1729,9 +1706,9 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasmer" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" +checksum = "5467c7a23f9be04d5691590bea509dbea27e5ba5810d0020bef908456a495f33" dependencies = [ "bytes", "cfg-if", @@ -1746,7 +1723,6 @@ dependencies = [ "target-lexicon", "thiserror", "wasm-bindgen", - "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-compiler-singlepass", @@ -1758,9 +1734,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" +checksum = "510ad01a668d774f3a103a7c219bbc0970be93e8f1b27e2fdb48d1f4ccd1deff" dependencies = [ "backtrace", "bytes", @@ -1785,9 +1761,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" +checksum = "54bf93078990d83960d798de3c5935bddaba771fc2fefb9ed6bab9c0bbdea5c1" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1804,9 +1780,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebaa865b40ffb3351b03dab9fe9930a5248c25daebd55b464b79b862d9b55ccd" +checksum = "8f4d6359d66a8bcefac26d48fcb0f3f0882bdf122b52121a1ae21f918706e040" dependencies = [ "byteorder", "dynasm", @@ -1823,9 +1799,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" +checksum = "1b374fd34d97b1c091d8675f9bc472df52dc6787d139d3762d42c7dc84813a9b" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1835,9 +1811,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" +checksum = "aab1347a1f81bf5929289db82b4f3966e9aecc4f874115110b6c0894ee8d9e77" dependencies = [ "wasmer", "wasmer-types", @@ -1846,9 +1822,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" +checksum = "0caf1c87937b52aba8e9f920a278e1beda282f7439612c0b48f51a58e7a87bab" dependencies = [ "bytecheck", "enum-iterator", @@ -1862,9 +1838,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" +checksum = "58315c25492bc72a33f47a7d7fb0869a0106fc0164ec051e349a9e1eddba9a01" dependencies = [ "backtrace", "cc", @@ -1879,7 +1855,7 @@ dependencies = [ "lazy_static", "libc", "mach", - "memoffset 0.8.0", + "memoffset 0.9.0", "more-asserts", "region", "scopeguard", diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index ba05835225..1d4d867fda 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -40,8 +40,8 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " serde_json = "1.0.40" sha2 = "0.10.3" thiserror = "1.0.26" -wasmer = { version = "=4.2.2", default-features = false, features = ["cranelift", "singlepass"] } -wasmer-middlewares = "=4.2.2" +wasmer = { version = "=4.2.5", default-features = false, features = ["cranelift", "singlepass"] } +wasmer-middlewares = "=4.2.5" strum = { version = "0.25.0", default-features = false, features = ["derive"] } # Dependencies that we do not use ourself. We add those entries From 2e4605ff96a71ac41b680fc346893069dfabde8e Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 15 Jan 2024 23:01:51 +0100 Subject: [PATCH 1108/2372] Bump MODULE_SERIALIZATION_VERSION to v9 --- CHANGELOG.md | 3 ++- packages/vm/src/modules/file_system_cache.rs | 11 +++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e8b095cab2..5a15a5f716 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -89,7 +89,8 @@ and this project adheres to `::addr_canonicalize`/`::addr_humanize` for consistency. - cosmwasm-vm: Add `BackendApi::addr_validate` to avoid having to do two calls from Rust into Go. -- cosmwasm-vm: Upgrade Wasmer to 4.2.5 +- cosmwasm-vm: Upgrade Wasmer to 4.2.5; Bump `MODULE_SERIALIZATION_VERSION` to + "v9". [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 5338c71818..decf16c4ac 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -57,7 +57,10 @@ use super::CachedModule; /// - **v8**:
/// New version because of Wasmer 4.1.2 -> 4.2.2 upgrade. /// Module compatibility between Wasmer versions is not guaranteed. -const MODULE_SERIALIZATION_VERSION: &str = "v8"; +/// - **v9**:
+/// New version because of Wasmer 4.2.2 -> 4.2.5 upgrade. +/// Module compatibility between Wasmer versions is not guaranteed. +const MODULE_SERIALIZATION_VERSION: &str = "v9"; /// Representation of a directory that contains compiled Wasm artifacts. pub struct FileSystemCache { @@ -311,7 +314,7 @@ mod tests { cache.store(&checksum, &module).unwrap(); let mut globber = glob::glob(&format!( - "{}/v8-wasmer5/**/{}.module", + "{}/v9-wasmer5/**/{}.module", tmp_dir.path().to_string_lossy(), checksum )) @@ -394,9 +397,9 @@ mod tests { assert_eq!( p.as_os_str(), if cfg!(windows) { - "modules\\v8-wasmer17\\x86_64-nintendo-fuchsia-gnu-coff-01E9F9FE" + "modules\\v9-wasmer17\\x86_64-nintendo-fuchsia-gnu-coff-01E9F9FE" } else { - "modules/v8-wasmer17/x86_64-nintendo-fuchsia-gnu-coff-01E9F9FE" + "modules/v9-wasmer17/x86_64-nintendo-fuchsia-gnu-coff-01E9F9FE" } ); } From c4b235324c2404c4aa278551784eebdc0a8cf7cc Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 15 Jan 2024 23:05:18 +0100 Subject: [PATCH 1109/2372] Remove explicit enumset dependency Wasmer requires enumset 1.1.0 now (https://github.com/wasmerio/wasmer/pull/4317) --- Cargo.lock | 1 - contracts/burner/Cargo.lock | 1 - contracts/crypto-verify/Cargo.lock | 1 - contracts/cyberpunk/Cargo.lock | 1 - contracts/empty/Cargo.lock | 1 - contracts/floaty/Cargo.lock | 1 - contracts/hackatom/Cargo.lock | 1 - contracts/ibc-reflect-send/Cargo.lock | 1 - contracts/ibc-reflect/Cargo.lock | 1 - contracts/queue/Cargo.lock | 1 - contracts/reflect/Cargo.lock | 1 - contracts/staking/Cargo.lock | 1 - contracts/virus/Cargo.lock | 1 - packages/vm/Cargo.toml | 1 - 14 files changed, 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 12ca9aa3cb..79cf3599a5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -508,7 +508,6 @@ dependencies = [ "crc32fast", "criterion", "derivative", - "enumset", "glob", "hex", "hex-literal", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index edb927577d..d92f81cdf0 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -269,7 +269,6 @@ dependencies = [ "cosmwasm-std", "crc32fast", "derivative", - "enumset", "hex", "schemars", "serde", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 4730bc978c..dc7a627bd8 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -258,7 +258,6 @@ dependencies = [ "cosmwasm-std", "crc32fast", "derivative", - "enumset", "hex", "schemars", "serde", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 7a3a7ef02e..2571ba38d8 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -293,7 +293,6 @@ dependencies = [ "cosmwasm-std", "crc32fast", "derivative", - "enumset", "hex", "schemars", "serde", diff --git a/contracts/empty/Cargo.lock b/contracts/empty/Cargo.lock index 59ffdb0418..146ab7517a 100644 --- a/contracts/empty/Cargo.lock +++ b/contracts/empty/Cargo.lock @@ -258,7 +258,6 @@ dependencies = [ "cosmwasm-std", "crc32fast", "derivative", - "enumset", "hex", "schemars", "serde", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index b3aa94d0d5..4db346a2f2 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -258,7 +258,6 @@ dependencies = [ "cosmwasm-std", "crc32fast", "derivative", - "enumset", "hex", "schemars", "serde", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 6e785a0889..5be46e6271 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -258,7 +258,6 @@ dependencies = [ "cosmwasm-std", "crc32fast", "derivative", - "enumset", "hex", "schemars", "serde", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 4ce9f13a64..5a539d9979 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -258,7 +258,6 @@ dependencies = [ "cosmwasm-std", "crc32fast", "derivative", - "enumset", "hex", "schemars", "serde", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index adebdadeb9..b10255338f 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -258,7 +258,6 @@ dependencies = [ "cosmwasm-std", "crc32fast", "derivative", - "enumset", "hex", "schemars", "serde", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 9e825ecc67..42340af8f4 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -258,7 +258,6 @@ dependencies = [ "cosmwasm-std", "crc32fast", "derivative", - "enumset", "hex", "schemars", "serde", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index e66b394887..642e48c489 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -258,7 +258,6 @@ dependencies = [ "cosmwasm-std", "crc32fast", "derivative", - "enumset", "hex", "schemars", "serde", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index ae1d1218e3..9de0959f3a 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -258,7 +258,6 @@ dependencies = [ "cosmwasm-std", "crc32fast", "derivative", - "enumset", "hex", "schemars", "serde", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 43f2cb61c1..3941b68013 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -258,7 +258,6 @@ dependencies = [ "cosmwasm-std", "crc32fast", "derivative", - "enumset", "hex", "schemars", "serde", diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 1d4d867fda..9a5a9794f8 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -47,7 +47,6 @@ strum = { version = "0.25.0", default-features = false, features = ["derive"] } # Dependencies that we do not use ourself. We add those entries # to bump the min version of them. bytecheck = "0.6.3" # With this version the simdutf8 dependency became optional -enumset = "1.0.2" # Fixes https://github.com/Lymia/enumset/issues/17 (https://github.com/Lymia/enumset/commit/a430550cd6a3c9b1ef636d37f75dede7616f5b62) bitflags = "1.1.0" # https://github.com/CensoredUsername/dynasm-rs/pull/74 # Wasmer git/local (used for quick local debugging or patching) From 786d94ab455b45e5110a2d477a15ec9715982c88 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 15 Jan 2024 23:40:22 +0100 Subject: [PATCH 1110/2372] Add PR link to CHANGELOG --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a15a5f716..5c739f9082 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -90,7 +90,7 @@ and this project adheres to - cosmwasm-vm: Add `BackendApi::addr_validate` to avoid having to do two calls from Rust into Go. - cosmwasm-vm: Upgrade Wasmer to 4.2.5; Bump `MODULE_SERIALIZATION_VERSION` to - "v9". + "v9". ([#1992]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 @@ -112,6 +112,7 @@ and this project adheres to [#1971]: https://github.com/CosmWasm/cosmwasm/pull/1971 [#1973]: https://github.com/CosmWasm/cosmwasm/pull/1973 [#1977]: https://github.com/CosmWasm/cosmwasm/pull/1977 +[#1992]: https://github.com/CosmWasm/cosmwasm/pull/1992 ### Removed From 7cafbf7db054eb57f670e8f34b8f68d40aed722f Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 27 Dec 2023 13:14:43 +0100 Subject: [PATCH 1111/2372] Try example with dhat --- Cargo.lock | 104 +++++++++++++++++ packages/vm/Cargo.toml | 12 ++ packages/vm/examples/memory.rs | 198 +++++++++++++++++++++++++++++++++ 3 files changed, 314 insertions(+) create mode 100644 packages/vm/examples/memory.rs diff --git a/Cargo.lock b/Cargo.lock index 79cf3599a5..c9b1d05ff3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -508,6 +508,7 @@ dependencies = [ "crc32fast", "criterion", "derivative", + "dhat", "glob", "hex", "hex-literal", @@ -521,6 +522,7 @@ dependencies = [ "target-lexicon", "tempfile", "thiserror", + "time", "wasmer", "wasmer-middlewares", "wat", @@ -808,6 +810,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "deranged" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +dependencies = [ + "powerfmt", +] + [[package]] name = "derivative" version = "2.2.0" @@ -819,6 +830,22 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "dhat" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f2aaf837aaf456f6706cb46386ba8dffd4013a757e36f4ea05c20dd46b209a3" +dependencies = [ + "backtrace", + "lazy_static", + "mintex", + "parking_lot", + "rustc-hash", + "serde", + "serde_json", + "thousands", +] + [[package]] name = "difflib" version = "0.4.0" @@ -1415,6 +1442,16 @@ dependencies = [ "adler", ] +[[package]] +name = "mintex" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd7c5ba1c3b5a23418d7bbf98c71c3d4946a0125002129231da8d6b723d559cb" +dependencies = [ + "once_cell", + "sys-info", +] + [[package]] name = "more-asserts" version = "0.2.2" @@ -1483,6 +1520,16 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + [[package]] name = "parking_lot_core" version = "0.9.7" @@ -1546,6 +1593,12 @@ dependencies = [ "plotters-backend", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -1828,6 +1881,12 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustix" version = "0.37.19" @@ -2127,6 +2186,16 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sys-info" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b3a0d0aba8bf96a0e1ddfdc352fc53b3df7f39318c71854910c3c4b024ae52c" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "tap" version = "1.0.1" @@ -2178,6 +2247,41 @@ dependencies = [ "syn 2.0.28", ] +[[package]] +name = "thousands" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820" + +[[package]] +name = "time" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +dependencies = [ + "deranged", + "itoa", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +dependencies = [ + "time-core", +] + [[package]] name = "tinytemplate" version = "1.2.1" diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 9a5a9794f8..8eafec21d7 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -20,6 +20,8 @@ staking = ["cosmwasm-std/staking"] stargate = ["cosmwasm-std/stargate"] # Use cranelift backend instead of singlepass. This is required for development on Windows. cranelift = ["wasmer/cranelift"] +dhat-heap = [] # if you are doing heap profiling +dhat-ad-hoc = [] # if you are doing ad hoc profiling [lib] # See https://bheisler.github.io/criterion.rs/book/faq.html#cargo-bench-gives-unrecognized-option-errors-for-valid-command-line-options @@ -65,7 +67,17 @@ clap = "4" rand = "0.8" leb128 = "0.2" target-lexicon = "0.12" +dhat = "0.3.2" +time = { version = "0.3.28", features = ["formatting"] } [[bench]] name = "main" harness = false + +[[example]] +name = "memory" +path = "examples/memory.rs" +required-features = [] + +[profile.release] +debug = 1 diff --git a/packages/vm/examples/memory.rs b/packages/vm/examples/memory.rs new file mode 100644 index 0000000000..63d0a5d72f --- /dev/null +++ b/packages/vm/examples/memory.rs @@ -0,0 +1,198 @@ +use std::time::SystemTime; +use tempfile::TempDir; +use time::{format_description::well_known::Rfc3339, OffsetDateTime}; + +use cosmwasm_std::{coins, Checksum, Empty}; +use cosmwasm_vm::testing::{mock_backend, mock_env, mock_info, MockApi, MockQuerier, MockStorage}; +use cosmwasm_vm::{ + call_execute, call_instantiate, capabilities_from_csv, Cache, CacheOptions, InstanceOptions, + Size, +}; + +#[cfg(feature = "dhat-heap")] +#[global_allocator] +static ALLOC: dhat::Alloc = dhat::Alloc; + +// Instance +const DEFAULT_MEMORY_LIMIT: Size = Size::mebi(128); +const DEFAULT_GAS_LIMIT: u64 = u64::MAX; +const DEFAULT_INSTANCE_OPTIONS: InstanceOptions = InstanceOptions { + gas_limit: DEFAULT_GAS_LIMIT, +}; +// Cache +const MEMORY_CACHE_SIZE: Size = Size::mebi(200); + +// static HACKATHON: &[u8] = ; +// static CYBERPUNK: &[u8] = include_bytes!("../testdata/cyberpunk.wasm"); + +struct Execute { + pub msg: &'static [u8], + pub expect_error: bool, +} + +struct Contract { + pub wasm: &'static [u8], + pub instantiate_msg: &'static [u8], + pub execute_msgs: [Option; 3], +} + +const CONTRACTS: [Contract; 2] = [ + Contract { + wasm: include_bytes!("../testdata/cyberpunk.wasm"), + instantiate_msg: b"{}", + execute_msgs: [ + Some(Execute { + msg: br#"{"unreachable":{}}"#, + expect_error: true, + }), + Some(Execute { + msg: br#"{"allocate_large_memory":{"pages":1000}}"#, + expect_error: false, + }), + Some(Execute { + // mem_cost in KiB + msg: br#"{"argon2":{"mem_cost":50000,"time_cost":1}}"#, + expect_error: false, + }), + ], + }, + Contract { + wasm: include_bytes!("../testdata/hackatom.wasm"), + instantiate_msg: br#"{"verifier": "verifies", "beneficiary": "benefits"}"#, + execute_msgs: [ + Some(Execute { + msg: br#"{"release":{}}"#, + expect_error: false, + }), + None, + None, + ], + }, +]; + +const END_AFTER: u64 = 10 * 60; // seconds +const ROUNDS: usize = 1024; +const ROUND_LEN: usize = 16; + +#[allow(clippy::collapsible_else_if)] +fn app() { + let start_time = SystemTime::now(); + + let options = CacheOptions::new( + TempDir::new().unwrap().into_path(), + capabilities_from_csv("iterator,staking"), + MEMORY_CACHE_SIZE, + DEFAULT_MEMORY_LIMIT, + ); + + let checksums = { + let cache: Cache = + unsafe { Cache::new(options.clone()).unwrap() }; + + let mut checksums = Vec::::new(); + for contract in CONTRACTS { + checksums.push(cache.save_wasm(contract.wasm).unwrap()); + } + checksums + }; + + let cache: Cache = + unsafe { Cache::new(options.clone()).unwrap() }; + for round in 0..ROUNDS { + for _ in 0..ROUND_LEN { + if SystemTime::now() + .duration_since(start_time) + .unwrap() + .as_secs() + > END_AFTER + { + eprintln!("End time reached. Ending the process"); + return; // ends app() + } + + for idx in 0..=1 { + let mut instance = cache + .get_instance(&checksums[idx], mock_backend(&[]), DEFAULT_INSTANCE_OPTIONS) + .unwrap(); + + instance.set_debug_handler(|msg, info| { + let t = now_rfc3339(); + let gas = info.gas_remaining; + eprintln!("[{t}]: {msg} (gas remaining: {gas})"); + }); + + let info = mock_info("creator", &coins(1000, "earth")); + let msg = CONTRACTS[idx].instantiate_msg; + let contract_result = + call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) + .unwrap(); + assert!(contract_result.into_result().is_ok()); + + for (execution_idx, e) in CONTRACTS[idx].execute_msgs.iter().enumerate() { + let Some(execute) = e else { + continue; + }; + let info = mock_info("verifies", &coins(15, "earth")); + let msg = execute.msg; + let res = + call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg); + + if execute.expect_error { + if res.is_ok() { + panic!( + "Round {round}, Execution {execution_idx}, Contract {idx}. Expected error but got {res:?}" + ); + } + } else { + if res.is_err() { + panic!("Round {round}, Execution {execution_idx}, Contract {idx}. Expected no error but got {res:?}"); + } + } + } + } + + /* + let mut instance = cache + .get_instance(&checksums[1], mock_backend(&[]), DEFAULT_INSTANCE_OPTIONS) + .unwrap(); + // println!("Done instantiating contract {i}"); + + instance.set_debug_handler(|msg, info| { + let t = now_rfc3339(); + let gas = info.gas_remaining; + eprintln!("[{t}]: {msg} (gas remaining: {gas})"); + }); + + let info = mock_info("creator", &coins(1000, "earth")); + let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; + let contract_result = + call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); + assert!(contract_result.into_result().is_ok()); + + let info = mock_info("verifies", &coins(15, "earth")); + let msg = br#"{"release":{}}"#; + let contract_result = + call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); + assert!(contract_result.into_result().is_ok()); + */ + } + + // let stats = cache.stats(); + // // eprintln!("Stats: {stats:?}"); + // assert_eq!(stats.misses, 0); + // assert_eq!(stats.hits_fs_cache, 2); + // assert_eq!(stats.hits_memory_cache as usize, 2 * (ROUND_LEN - 1)); + } +} + +fn now_rfc3339() -> String { + let dt = OffsetDateTime::from(SystemTime::now()); + dt.format(&Rfc3339).unwrap_or_default() +} + +pub fn main() { + #[cfg(feature = "dhat-heap")] + let _profiler = dhat::Profiler::new_heap(); + + app(); +} From abf0cd41009ca5e9e02b413df531ea48d7549415 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Sat, 18 Nov 2023 10:48:46 +0100 Subject: [PATCH 1112/2372] Improve testing --- packages/vm/examples/memory.rs | 137 +++++++++++++++++++-------------- 1 file changed, 78 insertions(+), 59 deletions(-) diff --git a/packages/vm/examples/memory.rs b/packages/vm/examples/memory.rs index 63d0a5d72f..f5d1fd0d99 100644 --- a/packages/vm/examples/memory.rs +++ b/packages/vm/examples/memory.rs @@ -13,17 +13,18 @@ use cosmwasm_vm::{ #[global_allocator] static ALLOC: dhat::Alloc = dhat::Alloc; +const END_AFTER: u64 = 2 * 60; // seconds +const ROUNDS: usize = 1024; +const ROUND_LEN: usize = 16; + // Instance -const DEFAULT_MEMORY_LIMIT: Size = Size::mebi(128); +const DEFAULT_MEMORY_LIMIT: Size = Size::mebi(64); const DEFAULT_GAS_LIMIT: u64 = u64::MAX; const DEFAULT_INSTANCE_OPTIONS: InstanceOptions = InstanceOptions { gas_limit: DEFAULT_GAS_LIMIT, }; // Cache -const MEMORY_CACHE_SIZE: Size = Size::mebi(200); - -// static HACKATHON: &[u8] = ; -// static CYBERPUNK: &[u8] = include_bytes!("../testdata/cyberpunk.wasm"); +const MEMORY_CACHE_SIZE: Size = Size::mebi(5); struct Execute { pub msg: &'static [u8], @@ -32,47 +33,58 @@ struct Execute { struct Contract { pub wasm: &'static [u8], - pub instantiate_msg: &'static [u8], - pub execute_msgs: [Option; 3], + pub instantiate_msg: Option<&'static [u8]>, + pub execute_msgs: Vec, } -const CONTRACTS: [Contract; 2] = [ - Contract { - wasm: include_bytes!("../testdata/cyberpunk.wasm"), - instantiate_msg: b"{}", - execute_msgs: [ - Some(Execute { - msg: br#"{"unreachable":{}}"#, - expect_error: true, - }), - Some(Execute { - msg: br#"{"allocate_large_memory":{"pages":1000}}"#, - expect_error: false, - }), - Some(Execute { - // mem_cost in KiB - msg: br#"{"argon2":{"mem_cost":50000,"time_cost":1}}"#, +fn contracts() -> Vec { + vec![ + Contract { + wasm: include_bytes!("../testdata/cyberpunk.wasm"), + instantiate_msg: Some(b"{}"), + execute_msgs: vec![ + Execute { + msg: br#"{"unreachable":{}}"#, + expect_error: true, + }, + Execute { + msg: br#"{"allocate_large_memory":{"pages":1000}}"#, + expect_error: false, + }, + Execute { + // mem_cost in KiB + msg: br#"{"argon2":{"mem_cost":256,"time_cost":1}}"#, + expect_error: false, + }, + Execute { + msg: br#"{"memory_loop":{}}"#, + expect_error: true, + }, + ], + }, + Contract { + wasm: include_bytes!("../testdata/hackatom.wasm"), + instantiate_msg: Some(br#"{"verifier": "verifies", "beneficiary": "benefits"}"#), + execute_msgs: vec![Execute { + msg: br#"{"release":{}}"#, expect_error: false, - }), - ], - }, - Contract { - wasm: include_bytes!("../testdata/hackatom.wasm"), - instantiate_msg: br#"{"verifier": "verifies", "beneficiary": "benefits"}"#, - execute_msgs: [ - Some(Execute { + }], + }, + Contract { + wasm: include_bytes!("../testdata/hackatom_1.0.wasm"), + instantiate_msg: Some(br#"{"verifier": "verifies", "beneficiary": "benefits"}"#), + execute_msgs: vec![Execute { msg: br#"{"release":{}}"#, expect_error: false, - }), - None, - None, - ], - }, -]; - -const END_AFTER: u64 = 10 * 60; // seconds -const ROUNDS: usize = 1024; -const ROUND_LEN: usize = 16; + }], + }, + Contract { + wasm: include_bytes!("../testdata/ibc_reflect.wasm"), + instantiate_msg: None, + execute_msgs: vec![], + }, + ] +} #[allow(clippy::collapsible_else_if)] fn app() { @@ -80,22 +92,27 @@ fn app() { let options = CacheOptions::new( TempDir::new().unwrap().into_path(), - capabilities_from_csv("iterator,staking"), + capabilities_from_csv("iterator,staking,stargate"), MEMORY_CACHE_SIZE, DEFAULT_MEMORY_LIMIT, ); + let contracts = contracts(); + let checksums = { let cache: Cache = unsafe { Cache::new(options.clone()).unwrap() }; let mut checksums = Vec::::new(); - for contract in CONTRACTS { + for contract in &contracts { checksums.push(cache.save_wasm(contract.wasm).unwrap()); } checksums }; + let after = SystemTime::now().duration_since(start_time).unwrap(); + eprintln!("Done compiling after {after:?}"); + let cache: Cache = unsafe { Cache::new(options.clone()).unwrap() }; for round in 0..ROUNDS { @@ -106,32 +123,34 @@ fn app() { .as_secs() > END_AFTER { - eprintln!("End time reached. Ending the process"); + eprintln!("Round {round}. End time reached. Ending the process"); + + let metrics = cache.metrics(); + eprintln!("Cache metrics: {metrics:?}"); + return; // ends app() } - for idx in 0..=1 { + for idx in 0..contracts.len() { let mut instance = cache .get_instance(&checksums[idx], mock_backend(&[]), DEFAULT_INSTANCE_OPTIONS) .unwrap(); - instance.set_debug_handler(|msg, info| { - let t = now_rfc3339(); - let gas = info.gas_remaining; - eprintln!("[{t}]: {msg} (gas remaining: {gas})"); + instance.set_debug_handler(|_msg, info| { + let _t = now_rfc3339(); + let _gas = info.gas_remaining; + //eprintln!("[{t}]: {msg} (gas remaining: {gas})"); }); - let info = mock_info("creator", &coins(1000, "earth")); - let msg = CONTRACTS[idx].instantiate_msg; - let contract_result = - call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) - .unwrap(); - assert!(contract_result.into_result().is_ok()); + if let Some(msg) = contracts[idx].instantiate_msg { + let info = mock_info("creator", &coins(1000, "earth")); + let contract_result = + call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) + .unwrap(); + assert!(contract_result.into_result().is_ok()); + } - for (execution_idx, e) in CONTRACTS[idx].execute_msgs.iter().enumerate() { - let Some(execute) = e else { - continue; - }; + for (execution_idx, execute) in contracts[idx].execute_msgs.iter().enumerate() { let info = mock_info("verifies", &coins(15, "earth")); let msg = execute.msg; let res = From 23535946f49783e6283fe72d886df78a4e4c193e Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 27 Dec 2023 13:19:12 +0100 Subject: [PATCH 1113/2372] Add some docs --- packages/vm/examples/memory.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/vm/examples/memory.rs b/packages/vm/examples/memory.rs index f5d1fd0d99..2e36e34561 100644 --- a/packages/vm/examples/memory.rs +++ b/packages/vm/examples/memory.rs @@ -1,3 +1,6 @@ +// Run with +// cargo run --features dhat-heap --example memory --release + use std::time::SystemTime; use tempfile::TempDir; use time::{format_description::well_known::Rfc3339, OffsetDateTime}; @@ -13,6 +16,7 @@ use cosmwasm_vm::{ #[global_allocator] static ALLOC: dhat::Alloc = dhat::Alloc; +/// Number of seconds after which the test stops const END_AFTER: u64 = 2 * 60; // seconds const ROUNDS: usize = 1024; const ROUND_LEN: usize = 16; From e621bb12821071176ae5992ee18eae8b4aaed519 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 9 Jan 2024 16:57:42 +0100 Subject: [PATCH 1114/2372] Ignore dhat-heap.json --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 6f20a8ecdb..cbe15aa263 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ artifacts/ # Log files (e.g. memory profiling) *.log +dhat-heap.json From 80a2a43c8428014f62818728fd1ce83a872bf608 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 9 Jan 2024 17:03:53 +0100 Subject: [PATCH 1115/2372] Adpt example to API changes --- packages/vm/examples/memory.rs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/packages/vm/examples/memory.rs b/packages/vm/examples/memory.rs index 2e36e34561..a0d066b361 100644 --- a/packages/vm/examples/memory.rs +++ b/packages/vm/examples/memory.rs @@ -37,15 +37,18 @@ struct Execute { struct Contract { pub wasm: &'static [u8], - pub instantiate_msg: Option<&'static [u8]>, + pub instantiate_msg: Option>, pub execute_msgs: Vec, } fn contracts() -> Vec { + let api = MockApi::default(); + let verifier = api.addr_make("verifies"); + let beneficiary = api.addr_make("benefits"); vec![ Contract { wasm: include_bytes!("../testdata/cyberpunk.wasm"), - instantiate_msg: Some(b"{}"), + instantiate_msg: Some(b"{}".to_vec()), execute_msgs: vec![ Execute { msg: br#"{"unreachable":{}}"#, @@ -68,7 +71,10 @@ fn contracts() -> Vec { }, Contract { wasm: include_bytes!("../testdata/hackatom.wasm"), - instantiate_msg: Some(br#"{"verifier": "verifies", "beneficiary": "benefits"}"#), + instantiate_msg: Some( + format!(r#"{{"verifier": "{verifier}", "beneficiary": "{beneficiary}"}}"#) + .into_bytes(), + ), execute_msgs: vec![Execute { msg: br#"{"release":{}}"#, expect_error: false, @@ -76,7 +82,10 @@ fn contracts() -> Vec { }, Contract { wasm: include_bytes!("../testdata/hackatom_1.0.wasm"), - instantiate_msg: Some(br#"{"verifier": "verifies", "beneficiary": "benefits"}"#), + instantiate_msg: Some( + format!(r#"{{"verifier": "{verifier}", "beneficiary": "{beneficiary}"}}"#) + .into_bytes(), + ), execute_msgs: vec![Execute { msg: br#"{"release":{}}"#, expect_error: false, @@ -146,7 +155,7 @@ fn app() { //eprintln!("[{t}]: {msg} (gas remaining: {gas})"); }); - if let Some(msg) = contracts[idx].instantiate_msg { + if let Some(msg) = &contracts[idx].instantiate_msg { let info = mock_info("creator", &coins(1000, "earth")); let contract_result = call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg) From f20d155cf169f700363cbb5578b61c740ca8ae55 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 9 Jan 2024 17:06:23 +0100 Subject: [PATCH 1116/2372] Remove unused dhat-ad-hoc --- packages/vm/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 8eafec21d7..b5cc005ee0 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -20,8 +20,8 @@ staking = ["cosmwasm-std/staking"] stargate = ["cosmwasm-std/stargate"] # Use cranelift backend instead of singlepass. This is required for development on Windows. cranelift = ["wasmer/cranelift"] -dhat-heap = [] # if you are doing heap profiling -dhat-ad-hoc = [] # if you are doing ad hoc profiling +# For heap profiling. Used in examples. +dhat-heap = [] [lib] # See https://bheisler.github.io/criterion.rs/book/faq.html#cargo-bench-gives-unrecognized-option-errors-for-valid-command-line-options From fceaad5db8d6bcc93a28c0816aaa1610194052be Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 11 Jan 2024 13:37:33 +0100 Subject: [PATCH 1117/2372] Cleanup --- packages/vm/examples/memory.rs | 34 +--------------------------------- 1 file changed, 1 insertion(+), 33 deletions(-) diff --git a/packages/vm/examples/memory.rs b/packages/vm/examples/memory.rs index a0d066b361..0eb1ce921b 100644 --- a/packages/vm/examples/memory.rs +++ b/packages/vm/examples/memory.rs @@ -126,8 +126,7 @@ fn app() { let after = SystemTime::now().duration_since(start_time).unwrap(); eprintln!("Done compiling after {after:?}"); - let cache: Cache = - unsafe { Cache::new(options.clone()).unwrap() }; + let cache: Cache = unsafe { Cache::new(options).unwrap() }; for round in 0..ROUNDS { for _ in 0..ROUND_LEN { if SystemTime::now() @@ -182,38 +181,7 @@ fn app() { } } } - - /* - let mut instance = cache - .get_instance(&checksums[1], mock_backend(&[]), DEFAULT_INSTANCE_OPTIONS) - .unwrap(); - // println!("Done instantiating contract {i}"); - - instance.set_debug_handler(|msg, info| { - let t = now_rfc3339(); - let gas = info.gas_remaining; - eprintln!("[{t}]: {msg} (gas remaining: {gas})"); - }); - - let info = mock_info("creator", &coins(1000, "earth")); - let msg = br#"{"verifier": "verifies", "beneficiary": "benefits"}"#; - let contract_result = - call_instantiate::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); - assert!(contract_result.into_result().is_ok()); - - let info = mock_info("verifies", &coins(15, "earth")); - let msg = br#"{"release":{}}"#; - let contract_result = - call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap(); - assert!(contract_result.into_result().is_ok()); - */ } - - // let stats = cache.stats(); - // // eprintln!("Stats: {stats:?}"); - // assert_eq!(stats.misses, 0); - // assert_eq!(stats.hits_fs_cache, 2); - // assert_eq!(stats.hits_memory_cache as usize, 2 * (ROUND_LEN - 1)); } } From 1e4b8627430f7cd94543782a79a570beab385af5 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 11 Jan 2024 15:12:20 +0100 Subject: [PATCH 1118/2372] Only enable dhat dependency if feature is enabled --- packages/vm/Cargo.toml | 10 ++++++---- packages/vm/examples/memory.rs | 1 - 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index b5cc005ee0..ea65ad1a06 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -20,8 +20,8 @@ staking = ["cosmwasm-std/staking"] stargate = ["cosmwasm-std/stargate"] # Use cranelift backend instead of singlepass. This is required for development on Windows. cranelift = ["wasmer/cranelift"] -# For heap profiling. Used in examples. -dhat-heap = [] +# For heap profiling. Only used in "memory" example. +dhat-heap = ["dep:dhat"] [lib] # See https://bheisler.github.io/criterion.rs/book/faq.html#cargo-bench-gives-unrecognized-option-errors-for-valid-command-line-options @@ -45,6 +45,9 @@ thiserror = "1.0.26" wasmer = { version = "=4.2.5", default-features = false, features = ["cranelift", "singlepass"] } wasmer-middlewares = "=4.2.5" strum = { version = "0.25.0", default-features = false, features = ["derive"] } +# For heap profiling. Only used in "memory" example. This has to be a non-dev dependency +# because cargo currently does not support optional dev-dependencies. +dhat = { version = "0.3.2", optional = true } # Dependencies that we do not use ourself. We add those entries # to bump the min version of them. @@ -67,7 +70,6 @@ clap = "4" rand = "0.8" leb128 = "0.2" target-lexicon = "0.12" -dhat = "0.3.2" time = { version = "0.3.28", features = ["formatting"] } [[bench]] @@ -77,7 +79,7 @@ harness = false [[example]] name = "memory" path = "examples/memory.rs" -required-features = [] +required-features = ["dhat-heap"] [profile.release] debug = 1 diff --git a/packages/vm/examples/memory.rs b/packages/vm/examples/memory.rs index 0eb1ce921b..9c917dc883 100644 --- a/packages/vm/examples/memory.rs +++ b/packages/vm/examples/memory.rs @@ -12,7 +12,6 @@ use cosmwasm_vm::{ Size, }; -#[cfg(feature = "dhat-heap")] #[global_allocator] static ALLOC: dhat::Alloc = dhat::Alloc; From a01f9c14177c0bd93372b6ddec366b4001f41f44 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 16 Jan 2024 11:31:03 +0100 Subject: [PATCH 1119/2372] Allow running memory example without dhat --- packages/vm/Cargo.toml | 1 - packages/vm/examples/memory.rs | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index ea65ad1a06..3c7256f0e7 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -79,7 +79,6 @@ harness = false [[example]] name = "memory" path = "examples/memory.rs" -required-features = ["dhat-heap"] [profile.release] debug = 1 diff --git a/packages/vm/examples/memory.rs b/packages/vm/examples/memory.rs index 9c917dc883..0eb1ce921b 100644 --- a/packages/vm/examples/memory.rs +++ b/packages/vm/examples/memory.rs @@ -12,6 +12,7 @@ use cosmwasm_vm::{ Size, }; +#[cfg(feature = "dhat-heap")] #[global_allocator] static ALLOC: dhat::Alloc = dhat::Alloc; From c0625999f2f17a6d1905b514c0c021e3e3c49167 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 8 Jan 2024 13:20:31 +0100 Subject: [PATCH 1120/2372] Keep track of number of functions, args and ouputs --- packages/vm/src/parsed_wasm.rs | 37 ++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/packages/vm/src/parsed_wasm.rs b/packages/vm/src/parsed_wasm.rs index 6de9fbaed4..37e5041899 100644 --- a/packages/vm/src/parsed_wasm.rs +++ b/packages/vm/src/parsed_wasm.rs @@ -1,5 +1,6 @@ use wasmer::wasmparser::{ - Export, Import, MemoryType, Parser, TableType, ValidPayload, Validator, WasmFeatures, + Export, Import, MemoryType, Parser, Payload, TableType, Type, ValidPayload, Validator, + WasmFeatures, }; use crate::VmResult; @@ -13,6 +14,10 @@ pub struct ParsedWasm<'a> { pub imports: Vec>, pub tables: Vec, pub memories: Vec, + pub function_count: usize, + pub type_count: u32, + pub max_func_params: usize, + pub max_func_results: usize, } impl<'a> ParsedWasm<'a> { @@ -34,6 +39,10 @@ impl<'a> ParsedWasm<'a> { imports: vec![], tables: vec![], memories: vec![], + function_count: 0, + type_count: 0, + max_func_params: 0, + max_func_results: 0, }; let mut fun_allocations = Default::default(); @@ -45,20 +54,36 @@ impl<'a> ParsedWasm<'a> { let mut fun_validator = fv.into_validator(fun_allocations); fun_validator.validate(&body)?; fun_allocations = fun_validator.into_allocations(); + + this.function_count += 1; } match p { - wasmer::wasmparser::Payload::Version { num, .. } => this.version = num, - wasmer::wasmparser::Payload::ImportSection(i) => { + Payload::TypeSection(t) => { + this.type_count = t.get_count(); + for t_res in t { + let ty: Type = t_res?; + match ty { + Type::Func(ft) => { + this.max_func_params = + core::cmp::max(ft.params().len(), this.max_func_params); + this.max_func_results = + core::cmp::max(ft.results().len(), this.max_func_results); + } + } + } + } + Payload::Version { num, .. } => this.version = num, + Payload::ImportSection(i) => { this.imports = i.into_iter().collect::, _>>()?; } - wasmer::wasmparser::Payload::TableSection(t) => { + Payload::TableSection(t) => { this.tables = t.into_iter().collect::, _>>()?; } - wasmer::wasmparser::Payload::MemorySection(m) => { + Payload::MemorySection(m) => { this.memories = m.into_iter().collect::, _>>()?; } - wasmer::wasmparser::Payload::ExportSection(e) => { + Payload::ExportSection(e) => { this.exports = e.into_iter().collect::, _>>()?; } _ => {} // ignore everything else From 04a353454772887410b25cedca4e4439bc4273d2 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 8 Jan 2024 13:34:29 +0100 Subject: [PATCH 1121/2372] Add function number checks --- packages/vm/src/compatibility.rs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index b6dd6a65be..77719e5c3d 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -71,6 +71,12 @@ const TABLE_SIZE_LIMIT: u32 = 2500; // entries /// when a user accidentally includes wasm-bindgen, they get a bunch of unsupported imports. const MAX_IMPORTS: usize = 100; +const MAX_FUNCTIONS: usize = 10000; + +const MAX_FUNCTION_PARAMS: usize = 50; + +const MAX_FUNCTION_RESULTS: usize = 1; + /// Checks if the data is valid wasm and compatibility with the CosmWasm API (imports and exports) pub fn check_wasm(wasm_code: &[u8], available_capabilities: &HashSet) -> VmResult<()> { let module = ParsedWasm::parse(wasm_code)?; @@ -81,6 +87,7 @@ pub fn check_wasm(wasm_code: &[u8], available_capabilities: &HashSet) -> check_wasm_exports(&module)?; check_wasm_imports(&module, SUPPORTED_IMPORTS)?; check_wasm_capabilities(&module, available_capabilities)?; + check_wasm_functions(&module)?; Ok(()) } @@ -228,6 +235,25 @@ fn check_wasm_capabilities( Ok(()) } +fn check_wasm_functions(module: &ParsedWasm) -> VmResult<()> { + if module.function_count > MAX_FUNCTIONS { + return Err(VmError::static_validation_err(format!( + "Wasm contract contains more than {MAX_FUNCTIONS} functions" + ))); + } + if module.max_func_params > MAX_FUNCTION_PARAMS { + return Err(VmError::static_validation_err(format!( + "Wasm contract contains function with more than {MAX_FUNCTION_PARAMS} parameters" + ))); + } + if module.max_func_results > MAX_FUNCTION_RESULTS { + return Err(VmError::static_validation_err(format!( + "Wasm contract contains function with more than {MAX_FUNCTION_RESULTS} results" + ))); + } + Ok(()) +} + #[cfg(test)] mod tests { use super::*; From 076c426c7a08fb3ae62dcde1a3581d4cc9a93228 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 18 Dec 2023 18:12:00 +0100 Subject: [PATCH 1122/2372] Catch panic --- packages/vm/src/modules/file_system_cache.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index decf16c4ac..eab461a3e3 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -1,6 +1,7 @@ use std::fs; use std::hash::Hash; use std::io; +use std::panic::catch_unwind; use std::path::{Path, PathBuf}; use thiserror::Error; @@ -179,9 +180,12 @@ impl FileSystemCache { .map_err(|_e| VmError::cache_err("Error creating modules directory"))?; let path = self.module_file(checksum); - module - .serialize_to_file(&path) - .map_err(|e| VmError::cache_err(format!("Error writing module to disk: {e}")))?; + catch_unwind(|| { + module + .serialize_to_file(&path) + .map_err(|e| VmError::cache_err(format!("Error writing module to disk: {e}"))) + }) + .map_err(|_| VmError::cache_err("Could not write module to disk"))??; let module_size = module_size(&path)?; Ok(module_size) } From 03a49e52bb78249933b1141360d26fcb18e5c938 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 18 Jan 2024 17:07:00 +0100 Subject: [PATCH 1123/2372] Add changelog entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c739f9082..2a1b09f3cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,8 +10,10 @@ and this project adheres to - cosmwasm-vm: Fix memory increase issue (1.3 -> 1.4 regression) by avoiding the use of a long running Wasmer Engine. ([#1978]) +- cosmwasm-vm: Fix CWA-2023-004. ([#1996]) [#1978]: https://github.com/CosmWasm/cosmwasm/issues/1978 +[#1996]: https://github.com/CosmWasm/cosmwasm/issues/1996 ### Added From 907d48d2b90f8e09ef9c979ac9ef466ea9f4a432 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 22 Jan 2024 15:07:19 +0100 Subject: [PATCH 1124/2372] Rename `GovMsg::Vote` --- .../schema/ibc-reflect-send.json | 20 +++++++++---------- .../schema/ibc/packet_msg.json | 20 +++++++++---------- .../ibc-reflect-send/schema/raw/execute.json | 20 +++++++++---------- .../ibc-reflect/schema/ibc/packet_msg.json | 20 +++++++++---------- contracts/reflect/schema/raw/execute.json | 20 +++++++++---------- contracts/reflect/schema/reflect.json | 20 +++++++++---------- packages/std/src/results/cosmos_msg.rs | 9 ++++----- 7 files changed, 64 insertions(+), 65 deletions(-) diff --git a/contracts/ibc-reflect-send/schema/ibc-reflect-send.json b/contracts/ibc-reflect-send/schema/ibc-reflect-send.json index d17a18b5ad..89fb96f395 100644 --- a/contracts/ibc-reflect-send/schema/ibc-reflect-send.json +++ b/contracts/ibc-reflect-send/schema/ibc-reflect-send.json @@ -332,7 +332,7 @@ "type": "object" }, "GovMsg": { - "description": "This message type allows the contract interact with the [x/gov] module in order to cast votes.\n\n[x/gov]: https://github.com/cosmos/cosmos-sdk/tree/v0.45.12/x/gov\n\n## Examples\n\nCast a simple vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); use cosmwasm_std::{GovMsg, VoteOption};\n\n#[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::Vote { proposal_id: 4, vote: VoteOption::Yes, })) } ```\n\nCast a weighted vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); # #[cfg(feature = \"cosmwasm_1_2\")] use cosmwasm_std::{Decimal, GovMsg, VoteOption, WeightedVoteOption};\n\n# #[cfg(feature = \"cosmwasm_1_2\")] #[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::VoteWeighted { proposal_id: 4, options: vec![ WeightedVoteOption { option: VoteOption::Yes, weight: Decimal::percent(65), }, WeightedVoteOption { option: VoteOption::Abstain, weight: Decimal::percent(35), }, ], })) } ```", + "description": "This message type allows the contract interact with the [x/gov] module in order to cast votes.\n\n[x/gov]: https://github.com/cosmos/cosmos-sdk/tree/v0.45.12/x/gov\n\n## Examples\n\nCast a simple vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); use cosmwasm_std::{GovMsg, VoteOption};\n\n#[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::Vote { proposal_id: 4, option: VoteOption::Yes, })) } ```\n\nCast a weighted vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); # #[cfg(feature = \"cosmwasm_1_2\")] use cosmwasm_std::{Decimal, GovMsg, VoteOption, WeightedVoteOption};\n\n# #[cfg(feature = \"cosmwasm_1_2\")] #[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::VoteWeighted { proposal_id: 4, options: vec![ WeightedVoteOption { option: VoteOption::Yes, weight: Decimal::percent(65), }, WeightedVoteOption { option: VoteOption::Abstain, weight: Decimal::percent(35), }, ], })) } ```", "oneOf": [ { "description": "This maps directly to [MsgVote](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/gov/v1beta1/tx.proto#L46-L56) in the Cosmos SDK with voter set to the contract address.", @@ -344,22 +344,22 @@ "vote": { "type": "object", "required": [ - "proposal_id", - "vote" + "option", + "proposal_id" ], "properties": { - "proposal_id": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "vote": { - "description": "The vote option.\n\nThis should be called \"option\" for consistency with Cosmos SDK. Sorry for that. See .", + "option": { + "description": "The vote option.\n\nThis used to be called \"vote\", but was changed for consistency with Cosmos SDK.", "allOf": [ { "$ref": "#/definitions/VoteOption" } ] + }, + "proposal_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 } } } diff --git a/contracts/ibc-reflect-send/schema/ibc/packet_msg.json b/contracts/ibc-reflect-send/schema/ibc/packet_msg.json index 2026a4a8cb..dd763dfc22 100644 --- a/contracts/ibc-reflect-send/schema/ibc/packet_msg.json +++ b/contracts/ibc-reflect-send/schema/ibc/packet_msg.json @@ -270,7 +270,7 @@ "type": "object" }, "GovMsg": { - "description": "This message type allows the contract interact with the [x/gov] module in order to cast votes.\n\n[x/gov]: https://github.com/cosmos/cosmos-sdk/tree/v0.45.12/x/gov\n\n## Examples\n\nCast a simple vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); use cosmwasm_std::{GovMsg, VoteOption};\n\n#[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::Vote { proposal_id: 4, vote: VoteOption::Yes, })) } ```\n\nCast a weighted vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); # #[cfg(feature = \"cosmwasm_1_2\")] use cosmwasm_std::{Decimal, GovMsg, VoteOption, WeightedVoteOption};\n\n# #[cfg(feature = \"cosmwasm_1_2\")] #[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::VoteWeighted { proposal_id: 4, options: vec![ WeightedVoteOption { option: VoteOption::Yes, weight: Decimal::percent(65), }, WeightedVoteOption { option: VoteOption::Abstain, weight: Decimal::percent(35), }, ], })) } ```", + "description": "This message type allows the contract interact with the [x/gov] module in order to cast votes.\n\n[x/gov]: https://github.com/cosmos/cosmos-sdk/tree/v0.45.12/x/gov\n\n## Examples\n\nCast a simple vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); use cosmwasm_std::{GovMsg, VoteOption};\n\n#[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::Vote { proposal_id: 4, option: VoteOption::Yes, })) } ```\n\nCast a weighted vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); # #[cfg(feature = \"cosmwasm_1_2\")] use cosmwasm_std::{Decimal, GovMsg, VoteOption, WeightedVoteOption};\n\n# #[cfg(feature = \"cosmwasm_1_2\")] #[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::VoteWeighted { proposal_id: 4, options: vec![ WeightedVoteOption { option: VoteOption::Yes, weight: Decimal::percent(65), }, WeightedVoteOption { option: VoteOption::Abstain, weight: Decimal::percent(35), }, ], })) } ```", "oneOf": [ { "description": "This maps directly to [MsgVote](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/gov/v1beta1/tx.proto#L46-L56) in the Cosmos SDK with voter set to the contract address.", @@ -282,22 +282,22 @@ "vote": { "type": "object", "required": [ - "proposal_id", - "vote" + "option", + "proposal_id" ], "properties": { - "proposal_id": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "vote": { - "description": "The vote option.\n\nThis should be called \"option\" for consistency with Cosmos SDK. Sorry for that. See .", + "option": { + "description": "The vote option.\n\nThis used to be called \"vote\", but was changed for consistency with Cosmos SDK.", "allOf": [ { "$ref": "#/definitions/VoteOption" } ] + }, + "proposal_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 } } } diff --git a/contracts/ibc-reflect-send/schema/raw/execute.json b/contracts/ibc-reflect-send/schema/raw/execute.json index 74b0ac6177..10ccfcc5b8 100644 --- a/contracts/ibc-reflect-send/schema/raw/execute.json +++ b/contracts/ibc-reflect-send/schema/raw/execute.json @@ -321,7 +321,7 @@ "type": "object" }, "GovMsg": { - "description": "This message type allows the contract interact with the [x/gov] module in order to cast votes.\n\n[x/gov]: https://github.com/cosmos/cosmos-sdk/tree/v0.45.12/x/gov\n\n## Examples\n\nCast a simple vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); use cosmwasm_std::{GovMsg, VoteOption};\n\n#[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::Vote { proposal_id: 4, vote: VoteOption::Yes, })) } ```\n\nCast a weighted vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); # #[cfg(feature = \"cosmwasm_1_2\")] use cosmwasm_std::{Decimal, GovMsg, VoteOption, WeightedVoteOption};\n\n# #[cfg(feature = \"cosmwasm_1_2\")] #[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::VoteWeighted { proposal_id: 4, options: vec![ WeightedVoteOption { option: VoteOption::Yes, weight: Decimal::percent(65), }, WeightedVoteOption { option: VoteOption::Abstain, weight: Decimal::percent(35), }, ], })) } ```", + "description": "This message type allows the contract interact with the [x/gov] module in order to cast votes.\n\n[x/gov]: https://github.com/cosmos/cosmos-sdk/tree/v0.45.12/x/gov\n\n## Examples\n\nCast a simple vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); use cosmwasm_std::{GovMsg, VoteOption};\n\n#[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::Vote { proposal_id: 4, option: VoteOption::Yes, })) } ```\n\nCast a weighted vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); # #[cfg(feature = \"cosmwasm_1_2\")] use cosmwasm_std::{Decimal, GovMsg, VoteOption, WeightedVoteOption};\n\n# #[cfg(feature = \"cosmwasm_1_2\")] #[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::VoteWeighted { proposal_id: 4, options: vec![ WeightedVoteOption { option: VoteOption::Yes, weight: Decimal::percent(65), }, WeightedVoteOption { option: VoteOption::Abstain, weight: Decimal::percent(35), }, ], })) } ```", "oneOf": [ { "description": "This maps directly to [MsgVote](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/gov/v1beta1/tx.proto#L46-L56) in the Cosmos SDK with voter set to the contract address.", @@ -333,22 +333,22 @@ "vote": { "type": "object", "required": [ - "proposal_id", - "vote" + "option", + "proposal_id" ], "properties": { - "proposal_id": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "vote": { - "description": "The vote option.\n\nThis should be called \"option\" for consistency with Cosmos SDK. Sorry for that. See .", + "option": { + "description": "The vote option.\n\nThis used to be called \"vote\", but was changed for consistency with Cosmos SDK.", "allOf": [ { "$ref": "#/definitions/VoteOption" } ] + }, + "proposal_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 } } } diff --git a/contracts/ibc-reflect/schema/ibc/packet_msg.json b/contracts/ibc-reflect/schema/ibc/packet_msg.json index fa0da797ce..9d459fff9d 100644 --- a/contracts/ibc-reflect/schema/ibc/packet_msg.json +++ b/contracts/ibc-reflect/schema/ibc/packet_msg.json @@ -257,7 +257,7 @@ "type": "object" }, "GovMsg": { - "description": "This message type allows the contract interact with the [x/gov] module in order to cast votes.\n\n[x/gov]: https://github.com/cosmos/cosmos-sdk/tree/v0.45.12/x/gov\n\n## Examples\n\nCast a simple vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); use cosmwasm_std::{GovMsg, VoteOption};\n\n#[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::Vote { proposal_id: 4, vote: VoteOption::Yes, })) } ```\n\nCast a weighted vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); # #[cfg(feature = \"cosmwasm_1_2\")] use cosmwasm_std::{Decimal, GovMsg, VoteOption, WeightedVoteOption};\n\n# #[cfg(feature = \"cosmwasm_1_2\")] #[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::VoteWeighted { proposal_id: 4, options: vec![ WeightedVoteOption { option: VoteOption::Yes, weight: Decimal::percent(65), }, WeightedVoteOption { option: VoteOption::Abstain, weight: Decimal::percent(35), }, ], })) } ```", + "description": "This message type allows the contract interact with the [x/gov] module in order to cast votes.\n\n[x/gov]: https://github.com/cosmos/cosmos-sdk/tree/v0.45.12/x/gov\n\n## Examples\n\nCast a simple vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); use cosmwasm_std::{GovMsg, VoteOption};\n\n#[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::Vote { proposal_id: 4, option: VoteOption::Yes, })) } ```\n\nCast a weighted vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); # #[cfg(feature = \"cosmwasm_1_2\")] use cosmwasm_std::{Decimal, GovMsg, VoteOption, WeightedVoteOption};\n\n# #[cfg(feature = \"cosmwasm_1_2\")] #[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::VoteWeighted { proposal_id: 4, options: vec![ WeightedVoteOption { option: VoteOption::Yes, weight: Decimal::percent(65), }, WeightedVoteOption { option: VoteOption::Abstain, weight: Decimal::percent(35), }, ], })) } ```", "oneOf": [ { "description": "This maps directly to [MsgVote](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/gov/v1beta1/tx.proto#L46-L56) in the Cosmos SDK with voter set to the contract address.", @@ -269,22 +269,22 @@ "vote": { "type": "object", "required": [ - "proposal_id", - "vote" + "option", + "proposal_id" ], "properties": { - "proposal_id": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "vote": { - "description": "The vote option.\n\nThis should be called \"option\" for consistency with Cosmos SDK. Sorry for that. See .", + "option": { + "description": "The vote option.\n\nThis used to be called \"vote\", but was changed for consistency with Cosmos SDK.", "allOf": [ { "$ref": "#/definitions/VoteOption" } ] + }, + "proposal_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 } } } diff --git a/contracts/reflect/schema/raw/execute.json b/contracts/reflect/schema/raw/execute.json index db71bcc390..65a3e108d7 100644 --- a/contracts/reflect/schema/raw/execute.json +++ b/contracts/reflect/schema/raw/execute.json @@ -345,7 +345,7 @@ ] }, "GovMsg": { - "description": "This message type allows the contract interact with the [x/gov] module in order to cast votes.\n\n[x/gov]: https://github.com/cosmos/cosmos-sdk/tree/v0.45.12/x/gov\n\n## Examples\n\nCast a simple vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); use cosmwasm_std::{GovMsg, VoteOption};\n\n#[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::Vote { proposal_id: 4, vote: VoteOption::Yes, })) } ```\n\nCast a weighted vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); # #[cfg(feature = \"cosmwasm_1_2\")] use cosmwasm_std::{Decimal, GovMsg, VoteOption, WeightedVoteOption};\n\n# #[cfg(feature = \"cosmwasm_1_2\")] #[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::VoteWeighted { proposal_id: 4, options: vec![ WeightedVoteOption { option: VoteOption::Yes, weight: Decimal::percent(65), }, WeightedVoteOption { option: VoteOption::Abstain, weight: Decimal::percent(35), }, ], })) } ```", + "description": "This message type allows the contract interact with the [x/gov] module in order to cast votes.\n\n[x/gov]: https://github.com/cosmos/cosmos-sdk/tree/v0.45.12/x/gov\n\n## Examples\n\nCast a simple vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); use cosmwasm_std::{GovMsg, VoteOption};\n\n#[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::Vote { proposal_id: 4, option: VoteOption::Yes, })) } ```\n\nCast a weighted vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); # #[cfg(feature = \"cosmwasm_1_2\")] use cosmwasm_std::{Decimal, GovMsg, VoteOption, WeightedVoteOption};\n\n# #[cfg(feature = \"cosmwasm_1_2\")] #[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::VoteWeighted { proposal_id: 4, options: vec![ WeightedVoteOption { option: VoteOption::Yes, weight: Decimal::percent(65), }, WeightedVoteOption { option: VoteOption::Abstain, weight: Decimal::percent(35), }, ], })) } ```", "oneOf": [ { "description": "This maps directly to [MsgVote](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/gov/v1beta1/tx.proto#L46-L56) in the Cosmos SDK with voter set to the contract address.", @@ -357,22 +357,22 @@ "vote": { "type": "object", "required": [ - "proposal_id", - "vote" + "option", + "proposal_id" ], "properties": { - "proposal_id": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "vote": { - "description": "The vote option.\n\nThis should be called \"option\" for consistency with Cosmos SDK. Sorry for that. See .", + "option": { + "description": "The vote option.\n\nThis used to be called \"vote\", but was changed for consistency with Cosmos SDK.", "allOf": [ { "$ref": "#/definitions/VoteOption" } ] + }, + "proposal_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 } } } diff --git a/contracts/reflect/schema/reflect.json b/contracts/reflect/schema/reflect.json index aaf5d1dea0..0eb4351c4a 100644 --- a/contracts/reflect/schema/reflect.json +++ b/contracts/reflect/schema/reflect.json @@ -355,7 +355,7 @@ ] }, "GovMsg": { - "description": "This message type allows the contract interact with the [x/gov] module in order to cast votes.\n\n[x/gov]: https://github.com/cosmos/cosmos-sdk/tree/v0.45.12/x/gov\n\n## Examples\n\nCast a simple vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); use cosmwasm_std::{GovMsg, VoteOption};\n\n#[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::Vote { proposal_id: 4, vote: VoteOption::Yes, })) } ```\n\nCast a weighted vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); # #[cfg(feature = \"cosmwasm_1_2\")] use cosmwasm_std::{Decimal, GovMsg, VoteOption, WeightedVoteOption};\n\n# #[cfg(feature = \"cosmwasm_1_2\")] #[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::VoteWeighted { proposal_id: 4, options: vec![ WeightedVoteOption { option: VoteOption::Yes, weight: Decimal::percent(65), }, WeightedVoteOption { option: VoteOption::Abstain, weight: Decimal::percent(35), }, ], })) } ```", + "description": "This message type allows the contract interact with the [x/gov] module in order to cast votes.\n\n[x/gov]: https://github.com/cosmos/cosmos-sdk/tree/v0.45.12/x/gov\n\n## Examples\n\nCast a simple vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); use cosmwasm_std::{GovMsg, VoteOption};\n\n#[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::Vote { proposal_id: 4, option: VoteOption::Yes, })) } ```\n\nCast a weighted vote:\n\n``` # use cosmwasm_std::{ # HexBinary, # Storage, Api, Querier, DepsMut, Deps, entry_point, Env, StdError, MessageInfo, # Response, QueryResponse, # }; # type ExecuteMsg = (); # #[cfg(feature = \"cosmwasm_1_2\")] use cosmwasm_std::{Decimal, GovMsg, VoteOption, WeightedVoteOption};\n\n# #[cfg(feature = \"cosmwasm_1_2\")] #[entry_point] pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result { // ... Ok(Response::new().add_message(GovMsg::VoteWeighted { proposal_id: 4, options: vec![ WeightedVoteOption { option: VoteOption::Yes, weight: Decimal::percent(65), }, WeightedVoteOption { option: VoteOption::Abstain, weight: Decimal::percent(35), }, ], })) } ```", "oneOf": [ { "description": "This maps directly to [MsgVote](https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/gov/v1beta1/tx.proto#L46-L56) in the Cosmos SDK with voter set to the contract address.", @@ -367,22 +367,22 @@ "vote": { "type": "object", "required": [ - "proposal_id", - "vote" + "option", + "proposal_id" ], "properties": { - "proposal_id": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "vote": { - "description": "The vote option.\n\nThis should be called \"option\" for consistency with Cosmos SDK. Sorry for that. See .", + "option": { + "description": "The vote option.\n\nThis used to be called \"vote\", but was changed for consistency with Cosmos SDK.", "allOf": [ { "$ref": "#/definitions/VoteOption" } ] + }, + "proposal_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 } } } diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index 874c0c2a1e..791076be2a 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -252,7 +252,7 @@ pub enum WasmMsg { /// // ... /// Ok(Response::new().add_message(GovMsg::Vote { /// proposal_id: 4, -/// vote: VoteOption::Yes, +/// option: VoteOption::Yes, /// })) /// } /// ``` @@ -302,9 +302,8 @@ pub enum GovMsg { proposal_id: u64, /// The vote option. /// - /// This should be called "option" for consistency with Cosmos SDK. Sorry for that. - /// See . - vote: VoteOption, + /// This used to be called "vote", but was changed for consistency with Cosmos SDK. + option: VoteOption, }, /// This maps directly to [MsgVoteWeighted](https://github.com/cosmos/cosmos-sdk/blob/v0.45.8/proto/cosmos/gov/v1beta1/tx.proto#L66-L78) in the Cosmos SDK with voter set to the contract address. #[cfg(feature = "cosmwasm_1_2")] @@ -611,7 +610,7 @@ mod tests { // Vote let msg = GovMsg::Vote { proposal_id: 4, - vote: VoteOption::NoWithVeto, + option: VoteOption::NoWithVeto, }; let json = to_json_binary(&msg).unwrap(); assert_eq!( From 1541f8e2bcdb37e71b86fd6db591f152f086a518 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 22 Jan 2024 15:28:58 +0100 Subject: [PATCH 1125/2372] Add changelog entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a1b09f3cc..4f14c928a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -93,6 +93,7 @@ and this project adheres to from Rust into Go. - cosmwasm-vm: Upgrade Wasmer to 4.2.5; Bump `MODULE_SERIALIZATION_VERSION` to "v9". ([#1992]) +- cosmwasm-std: Rename `GovMsg::vote` to `GovMsg::option` ([#1999]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 @@ -115,6 +116,7 @@ and this project adheres to [#1973]: https://github.com/CosmWasm/cosmwasm/pull/1973 [#1977]: https://github.com/CosmWasm/cosmwasm/pull/1977 [#1992]: https://github.com/CosmWasm/cosmwasm/pull/1992 +[#1999]: https://github.com/CosmWasm/cosmwasm/pull/1999 ### Removed From 8bb643d09da3a9f13a91e792360f95fe254fd11f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 22 Jan 2024 15:48:37 +0100 Subject: [PATCH 1126/2372] Fix test --- packages/std/src/results/cosmos_msg.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index 791076be2a..62c9ffbd90 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -615,7 +615,7 @@ mod tests { let json = to_json_binary(&msg).unwrap(); assert_eq!( String::from_utf8_lossy(&json), - r#"{"vote":{"proposal_id":4,"vote":"no_with_veto"}}"#, + r#"{"vote":{"proposal_id":4,"option":"no_with_veto"}}"#, ); // VoteWeighted From abe6ecf47dd09942329e8eeaea649e7ca6900461 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 22 Jan 2024 17:10:14 +0100 Subject: [PATCH 1127/2372] Set version: 2.0.0-beta.1 --- Cargo.lock | 14 +++++++------- contracts/burner/Cargo.lock | 12 ++++++------ contracts/crypto-verify/Cargo.lock | 12 ++++++------ contracts/cyberpunk/Cargo.lock | 12 ++++++------ contracts/empty/Cargo.lock | 12 ++++++------ contracts/floaty/Cargo.lock | 12 ++++++------ contracts/hackatom/Cargo.lock | 12 ++++++------ contracts/ibc-reflect-send/Cargo.lock | 12 ++++++------ contracts/ibc-reflect/Cargo.lock | 12 ++++++------ contracts/queue/Cargo.lock | 12 ++++++------ contracts/reflect/Cargo.lock | 12 ++++++------ contracts/staking/Cargo.lock | 12 ++++++------ contracts/virus/Cargo.lock | 12 ++++++------ packages/check/Cargo.toml | 6 +++--- packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/go-gen/Cargo.toml | 4 ++-- packages/schema-derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 6 +++--- packages/std/Cargo.toml | 6 +++--- packages/vm/Cargo.toml | 6 +++--- 21 files changed, 96 insertions(+), 96 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c9b1d05ff3..40c49a902f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -406,7 +406,7 @@ dependencies = [ [[package]] name = "cosmwasm-check" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "anyhow", "assert_cmd", @@ -419,7 +419,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "criterion", "digest 0.10.6", @@ -438,7 +438,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "cosmwasm-std", "syn 1.0.109", @@ -446,7 +446,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "anyhow", "cosmwasm-schema-derive", @@ -461,7 +461,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -470,7 +470,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "base64", "bech32", @@ -495,7 +495,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "bech32", "bitflags", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index d92f81cdf0..621ad68e43 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -199,7 +199,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "digest 0.10.7", "ecdsa", @@ -211,14 +211,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -229,7 +229,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -238,7 +238,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "base64", "bech32", @@ -258,7 +258,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "bech32", "bitflags", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index dc7a627bd8..0c7133c55d 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "bech32", "bitflags", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 2571ba38d8..c8ad6ebdab 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -223,7 +223,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "digest 0.10.7", "ecdsa", @@ -235,14 +235,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -253,7 +253,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -262,7 +262,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "base64 0.21.2", "bech32", @@ -282,7 +282,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "bech32", "bitflags", diff --git a/contracts/empty/Cargo.lock b/contracts/empty/Cargo.lock index 146ab7517a..32ff767933 100644 --- a/contracts/empty/Cargo.lock +++ b/contracts/empty/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "bech32", "bitflags", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 4db346a2f2..5c82f7d206 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "bech32", "bitflags", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 5be46e6271..a86d6169f5 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "bech32", "bitflags", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 5a539d9979..cbdb7a170c 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "bech32", "bitflags", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index b10255338f..e46281be18 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "bech32", "bitflags", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 42340af8f4..bcdc28add7 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "bech32", "bitflags", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 642e48c489..285bd4b624 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "bech32", "bitflags", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 9de0959f3a..5df3b1ba72 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "bech32", "bitflags", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 3941b68013..eb63192114 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -188,7 +188,7 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "digest 0.10.7", "ecdsa", @@ -200,14 +200,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "proc-macro2", "quote", @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "base64", "bech32", @@ -247,7 +247,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" dependencies = [ "bech32", "bitflags", diff --git a/packages/check/Cargo.toml b/packages/check/Cargo.toml index 7fa3b33ad8..962bac2de1 100644 --- a/packages/check/Cargo.toml +++ b/packages/check/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-check" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" authors = ["Mauro Lacy "] edition = "2021" description = "A CLI tool for verifying CosmWasm smart contracts" @@ -11,8 +11,8 @@ license = "Apache-2.0" anyhow = "1.0.57" clap = "4" colored = "2" -cosmwasm-vm = { path = "../vm", version = "=2.0.0-beta.0" } -cosmwasm-std = { path = "../std", version = "=2.0.0-beta.0" } +cosmwasm-vm = { path = "../vm", version = "=2.0.0-beta.1" } +cosmwasm-std = { path = "../std", version = "=2.0.0-beta.1" } [dev-dependencies] assert_cmd = "2.0.12" diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 1236dcfa8f..c1f0798ae7 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" authors = ["Mauro Lacy "] edition = "2021" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index 2218b2edac..773338cf81 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" authors = ["Simon Warta "] edition = "2021" description = "A package for auto-generated code used for CosmWasm contract development. This is shipped as part of cosmwasm-std. Do not use directly." diff --git a/packages/go-gen/Cargo.toml b/packages/go-gen/Cargo.toml index 07524dae43..e8e7fcabfa 100644 --- a/packages/go-gen/Cargo.toml +++ b/packages/go-gen/Cargo.toml @@ -9,8 +9,8 @@ publish = false [dependencies] schemars = "0.8.3" -cosmwasm-std = { path = "../std", version = "2.0.0-beta.0", features = ["cosmwasm_2_0", "staking", "stargate"] } -cosmwasm-schema = { path = "../schema", version = "2.0.0-beta.0" } +cosmwasm-std = { path = "../std", version = "2.0.0-beta.1", features = ["cosmwasm_2_0", "staking", "stargate"] } +cosmwasm-schema = { path = "../schema", version = "2.0.0-beta.1" } anyhow = "1" Inflector = "0.11.4" indenter = "0.3.3" diff --git a/packages/schema-derive/Cargo.toml b/packages/schema-derive/Cargo.toml index 56a3beee64..cb663a747f 100644 --- a/packages/schema-derive/Cargo.toml +++ b/packages/schema-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema-derive" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" authors = ["Tomasz Kurcz "] edition = "2021" description = "Derive macros for cosmwasm-schema" diff --git a/packages/schema/Cargo.toml b/packages/schema/Cargo.toml index e61c6f4e8e..a0101cfb19 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" authors = ["Simon Warta ", "Ethan Frey "] edition = "2021" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." @@ -8,7 +8,7 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/schema" license = "Apache-2.0" [dependencies] -cosmwasm-schema-derive = { version = "=2.0.0-beta.0", path = "../schema-derive" } +cosmwasm-schema-derive = { version = "=2.0.0-beta.1", path = "../schema-derive" } schemars = "0.8.3" serde = "1.0" serde_json = "1.0.40" @@ -16,6 +16,6 @@ thiserror = "1.0.26" [dev-dependencies] anyhow = "1.0.57" -cosmwasm-std = { version = "2.0.0-beta.0", path = "../std" } +cosmwasm-std = { version = "2.0.0-beta.1", path = "../std" } semver = "1" tempfile = "3" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index c3a6b5f699..dd43a54f72 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" authors = ["Ethan Frey "] edition = "2021" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -52,7 +52,7 @@ cosmwasm_2_0 = ["cosmwasm_1_4"] [dependencies] base64 = "0.21.0" -cosmwasm-derive = { path = "../derive", version = "2.0.0-beta.0" } +cosmwasm-derive = { path = "../derive", version = "2.0.0-beta.1" } derivative = { version = "2", features = ["use_core"] } forward_ref = "1" hex = "0.4" @@ -66,7 +66,7 @@ static_assertions = "1.1.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] bech32 = "0.9.1" -cosmwasm-crypto = { path = "../crypto", version = "2.0.0-beta.0" } +cosmwasm-crypto = { path = "../crypto", version = "2.0.0-beta.1" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 3c7256f0e7..641784c0da 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "2.0.0-beta.0" +version = "2.0.0-beta.1" authors = ["Ethan Frey "] edition = "2021" description = "VM bindings to run cosmwams contracts" @@ -33,8 +33,8 @@ clru = "0.6.1" crc32fast = "1.3.2" bech32 = "0.9.1" # Uses the path when built locally; uses the given version from crates.io when published -cosmwasm-std = { path = "../std", version = "2.0.0-beta.0", default-features = false, features = ["std"] } -cosmwasm-crypto = { path = "../crypto", version = "2.0.0-beta.0" } +cosmwasm-std = { path = "../std", version = "2.0.0-beta.1", default-features = false, features = ["std"] } +cosmwasm-crypto = { path = "../crypto", version = "2.0.0-beta.1" } derivative = "2" hex = "0.4" schemars = "0.8.3" From 6b987d508fffdc2ba40dd8661797e8c27a6c9544 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 22 Jan 2024 17:11:59 +0100 Subject: [PATCH 1128/2372] Update changelog --- CHANGELOG.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f14c928a0..123e53b878 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [2.0.0-beta.0] - 2023-12-21 +## [Unreleased] + +## [2.0.0-beta.1] - 2023-01-22 ### Fixed @@ -738,9 +740,9 @@ and this project adheres to The CHANGELOG for versions before 1.0.0 was moved to [CHANGELOG-pre1.0.0.md](./CHANGELOG-pre1.0.0.md). -[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v2.0.0-beta.0...HEAD -[2.0.0-beta.0]: - https://github.com/CosmWasm/cosmwasm/compare/v1.5.0...v2.0.0-beta.0 +[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v2.0.0-beta.1...HEAD +[2.0.0-beta.1]: + https://github.com/CosmWasm/cosmwasm/compare/v1.5.0...v2.0.0-beta.1 [1.5.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.4.1...v1.5.0 [1.4.1]: https://github.com/CosmWasm/cosmwasm/compare/v1.4.0...v1.4.1 [1.4.0]: https://github.com/CosmWasm/cosmwasm/compare/v1.3.3...v1.4.0 From 601e6f71eb6be40237ba726fdc2f0b9042b99021 Mon Sep 17 00:00:00 2001 From: llllllluc <58892938+llllllluc@users.noreply.github.com> Date: Sun, 17 Sep 2023 00:05:43 -0700 Subject: [PATCH 1129/2372] attempt to support secp256r1 --- Cargo.lock | 41 ++- packages/crypto/Cargo.toml | 1 + packages/crypto/README.md | 4 +- packages/crypto/benches/main.rs | 1 + packages/crypto/src/lib.rs | 3 + packages/crypto/src/secp256k1.rs | 3 + packages/crypto/src/secp256r1.rs | 277 +++++++++++++++ packages/crypto/testdata/secp256k1_tests.json | 2 +- packages/crypto/testdata/secp256r1_tests.json | 122 +++++++ packages/std/src/imports.rs | 32 ++ packages/std/src/testing/mock.rs | 13 + packages/std/src/traits.rs | 7 + packages/vm/src/compatibility.rs | 3 + packages/vm/src/environment.rs | 9 + packages/vm/src/imports.rs | 325 +++++++++++++++++- packages/vm/src/instance.rs | 10 +- 16 files changed, 840 insertions(+), 13 deletions(-) create mode 100644 packages/crypto/src/secp256r1.rs create mode 100644 packages/crypto/testdata/secp256r1_tests.json diff --git a/Cargo.lock b/Cargo.lock index 40c49a902f..dcbacd74dc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -429,6 +429,7 @@ dependencies = [ "hex", "hex-literal", "k256", + "p256", "rand_core 0.6.4", "serde", "serde_json", @@ -807,6 +808,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", + "pem-rfc7468", "zeroize", ] @@ -948,9 +950,9 @@ checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -958,6 +960,7 @@ dependencies = [ "ff", "generic-array", "group", + "pem-rfc7468", "pkcs8", "rand_core 0.6.4", "sec1", @@ -1521,13 +1524,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] -name = "parking_lot" -version = "0.12.1" +name = "p256" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" dependencies = [ - "lock_api", - "parking_lot_core", + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.6", ] [[package]] @@ -1543,6 +1548,15 @@ dependencies = [ "windows-sys 0.45.0", ] +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.2.0" @@ -1636,6 +1650,15 @@ dependencies = [ "termtree", ] +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -2907,6 +2930,6 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index c1f0798ae7..9569dd9dff 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -22,6 +22,7 @@ rand_core = { version = "0.6", features = ["getrandom"] } thiserror = "1.0.38" # Not used directly, but needed to bump transitive dependency, see: https://github.com/CosmWasm/cosmwasm/pull/1899 for details. ecdsa = "0.16.2" +p256 = { version = "0.13.2", features = ["ecdsa"] } [dev-dependencies] criterion = "0.5.1" diff --git a/packages/crypto/README.md b/packages/crypto/README.md index cf927879a7..180fcb07ab 100644 --- a/packages/crypto/README.md +++ b/packages/crypto/README.md @@ -8,7 +8,9 @@ and [cosmwasm-std](`https://crates.io/crates/cosmwasm-std`) crates. ## Implementations -- `secp256k1_verify()`: Digital signature verification using the ECDSA sepc256k1 +- `secp256k1_verify()`: Digital signature verification using the ECDSA secp256k1 + scheme, for Cosmos signature / public key formats. +- `secp256r1_verify()`: Digital signature verification using the ECDSA secp256r1 scheme, for Cosmos signature / public key formats. - `ed25519_verify()`: Digital signature verification using the EdDSA ed25519 scheme, for Tendermint signature / public key formats. diff --git a/packages/crypto/benches/main.rs b/packages/crypto/benches/main.rs index ce4b8d2eb3..cd43e59c8f 100644 --- a/packages/crypto/benches/main.rs +++ b/packages/crypto/benches/main.rs @@ -12,6 +12,7 @@ use sha2::Sha256; use cosmwasm_crypto::{ ed25519_batch_verify, ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, + secp256r1_verify, }; use std::cmp::min; diff --git a/packages/crypto/src/lib.rs b/packages/crypto/src/lib.rs index b586502e7b..f0b7234271 100644 --- a/packages/crypto/src/lib.rs +++ b/packages/crypto/src/lib.rs @@ -7,6 +7,7 @@ mod ed25519; mod errors; mod identity_digest; mod secp256k1; +mod secp256r1; #[doc(hidden)] pub use crate::ed25519::EDDSA_PUBKEY_LEN; @@ -18,4 +19,6 @@ pub use crate::errors::{CryptoError, CryptoResult}; pub use crate::secp256k1::{secp256k1_recover_pubkey, secp256k1_verify}; #[doc(hidden)] pub use crate::secp256k1::{ECDSA_PUBKEY_MAX_LEN, ECDSA_SIGNATURE_LEN, MESSAGE_HASH_MAX_LEN}; +#[doc(hidden)] +pub use crate::secp256r1::secp256r1_verify; pub(crate) use backtrace::BT; diff --git a/packages/crypto/src/secp256k1.rs b/packages/crypto/src/secp256k1.rs index d77f71181d..098ccab93b 100644 --- a/packages/crypto/src/secp256k1.rs +++ b/packages/crypto/src/secp256k1.rs @@ -45,6 +45,9 @@ pub fn secp256k1_verify( ) -> CryptoResult { let message_hash = read_hash(message_hash)?; let signature = read_signature(signature)?; + // panic!("{}", signature); + println!("Valid signature: {:?}", signature); + check_pubkey(public_key)?; // Already hashed, just build Digest container diff --git a/packages/crypto/src/secp256r1.rs b/packages/crypto/src/secp256r1.rs new file mode 100644 index 0000000000..52aaf96c1e --- /dev/null +++ b/packages/crypto/src/secp256r1.rs @@ -0,0 +1,277 @@ +use digest::{Digest, Update}; // trait +use p256::{ + ecdsa::signature::DigestVerifier, // traits + ecdsa::{Signature, VerifyingKey}, // type aliases + elliptic_curve::sec1::ToEncodedPoint, +}; +use std::convert::TryInto; + +use crate::errors::{CryptoError, CryptoResult}; +use crate::identity_digest::Identity256; + +/// Max length of a message hash for secp256r1 verification in bytes. +/// This is typically a 32 byte output of e.g. SHA-256 or Keccak256. In theory shorter values +/// are possible but currently not supported by the implementation. Let us know when you need them. +pub const MESSAGE_HASH_MAX_LEN: usize = 32; + +/// ECDSA (secp256r1) parameters +/// Length of a serialized signature +pub const ECDSA_SIGNATURE_LEN: usize = 64; + +/// Length of a serialized compressed public key +const ECDSA_COMPRESSED_PUBKEY_LEN: usize = 33; +/// Length of a serialized uncompressed public key +const ECDSA_UNCOMPRESSED_PUBKEY_LEN: usize = 65; +/// Max length of a serialized public key +pub const ECDSA_PUBKEY_MAX_LEN: usize = ECDSA_UNCOMPRESSED_PUBKEY_LEN; + +/// ECDSA secp256r1 implementation. +/// +/// This function verifies message hashes (typically, hashed using SHA-256) against a signature, +/// with the public key of the signer, using the secp256r1 elliptic curve digital signature +/// parametrization / algorithm. +/// +/// The signature and public key are in "Cosmos" format: +/// - signature: Serialized "compact" signature (64 bytes). +/// - public key: [Serialized according to SEC 2](https://www.oreilly.com/library/view/programming-bitcoin/9781492031482/ch04.html) +/// (33 or 65 bytes). +pub fn secp256r1_verify( + message_hash: &[u8], + signature: &[u8], + public_key: &[u8], +) -> CryptoResult { + let message_hash = read_hash(message_hash)?; + let signature = read_signature(signature)?; + check_pubkey(public_key)?; + + // Already hashed, just build Digest container + let message_digest = Identity256::new().chain(message_hash); + + let mut signature = Signature::from_bytes(&signature.into()) + .map_err(|e| CryptoError::generic_err(e.to_string()))?; + + // High-S signatures require normalization since our verification implementation + // rejects them by default. If we had a verifier that does not restrict to + // low-S only, this step was not needed. + if let Some(normalized) = signature.normalize_s() { + signature = normalized; + } + + let public_key = VerifyingKey::from_sec1_bytes(public_key) + .map_err(|e| CryptoError::generic_err(e.to_string()))?; + + match public_key.verify_digest(message_digest, &signature) { + Ok(()) => Ok(true), + Err(_) => Ok(false), + } +} + +/// Error raised when hash is not 32 bytes long +struct InvalidSecp256r1HashFormat; + +impl From for CryptoError { + fn from(_original: InvalidSecp256r1HashFormat) -> Self { + CryptoError::invalid_hash_format() + } +} + +fn read_hash(data: &[u8]) -> Result<[u8; 32], InvalidSecp256r1HashFormat> { + data.try_into().map_err(|_| InvalidSecp256r1HashFormat) +} + +/// Error raised when signature is not 64 bytes long (32 bytes r, 32 bytes s) +struct InvalidSecp256r1SignatureFormat; + +impl From for CryptoError { + fn from(_original: InvalidSecp256r1SignatureFormat) -> Self { + CryptoError::invalid_signature_format() + } +} + +fn read_signature(data: &[u8]) -> Result<[u8; 64], InvalidSecp256r1SignatureFormat> { + data.try_into().map_err(|_| InvalidSecp256r1SignatureFormat) +} + +/// Error raised when public key is not in one of the two supported formats: +/// 1. Uncompressed: 65 bytes starting with 0x04 +/// 2. Compressed: 33 bytes starting with 0x02 or 0x03 +struct InvalidSecp256r1PubkeyFormat; + +impl From for CryptoError { + fn from(_original: InvalidSecp256r1PubkeyFormat) -> Self { + CryptoError::invalid_pubkey_format() + } +} + +fn check_pubkey(data: &[u8]) -> Result<(), InvalidSecp256r1PubkeyFormat> { + let ok = match data.first() { + Some(0x02) | Some(0x03) => data.len() == ECDSA_COMPRESSED_PUBKEY_LEN, + Some(0x04) => data.len() == ECDSA_UNCOMPRESSED_PUBKEY_LEN, + _ => false, + }; + if ok { + Ok(()) + } else { + Err(InvalidSecp256r1PubkeyFormat) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + // use elliptic_curve::rand_core::OsRng; + // use elliptic_curve::sec1::ToEncodedPoint; + + use hex_literal::hex; + use p256::{ + ecdsa::signature::DigestSigner, // trait + ecdsa::SigningKey, // type alias + elliptic_curve::rand_core::OsRng, + }; + use serde::Deserialize; + use sha2::Sha256; + use std::fs::File; + use std::io::BufReader; + + // For generic signature verification + const MSG: &str = "Hello World!"; + + // Cosmos secp256r1 signature verification + // tendermint/PubKeySecp256r1 pubkey + const COSMOS_SECP256R1_PUBKEY_HEX: &str = + "049a2c7b27b132246e170dfb9167db5c5bd302033dbece2bc3f2541a6cd11851821a775f1fc6c4f89e0d019888057f0d574f1c4eb1f90a7a41c4ea9b99b538d932"; + + const COSMOS_SECP256R1_MSG_HEX1: &str = "6265206b696e64"; + const COSMOS_SECP256R1_MSG_HEX2: &str = "6265206b696e64"; + const COSMOS_SECP256R1_MSG_HEX3: &str = "6265206b696e64"; + + const COSMOS_SECP256R1_SIGNATURE_HEX1: &str = "453020029250fb9eb22b21b881319a123244e463a329356b75ce804fc2dda174e715104621028d009abee7d523894b425d974bc38cfae5d05cdf5a550c8eceae1f20f0c9913f0038"; + const COSMOS_SECP256R1_SIGNATURE_HEX2: &str = "30450220658fc9271b09bd53edf3a5bd31b7bd99bd3c3de7859cd8dd1133e76ed44fcb580221009e43d091911de0fc90d22960517211f5cf6c624b326759e219326f3af807ac31"; + const COSMOS_SECP256R1_SIGNATURE_HEX3: &str = "30450220658fc9271b09bd53edf3a5bd31b7bd99bd3c3de7859cd8dd1133e76ed44fcb580221009e43d091911de0fc90d22960517211f5cf6c624b326759e219326f3af807ac31"; + + // Test data originally from https://github.com/cosmos/cosmjs/blob/v0.24.0-alpha.22/packages/crypto/src/secp256k1.spec.ts#L195-L394 + const COSMOS_SECP256R1_TESTS_JSON: &str = "./testdata/secp256r1_tests.json"; + + #[test] + fn test_secp256r1_verify() { + // Explicit / external hashing + let message_digest = Sha256::new().chain(MSG); + let message_hash = message_digest.clone().finalize(); + + // Signing + let secret_key = SigningKey::random(&mut OsRng); // Serialize with `::to_bytes()` + + // Note: the signature type must be annotated or otherwise inferrable as + // `Signer` has many impls of the `Signer` trait (for both regular and + // recoverable signature types). + let signature: Signature = secret_key.sign_digest(message_digest); + + let public_key = VerifyingKey::from(&secret_key); // Serialize with `::to_encoded_point()` + + // Verification (uncompressed public key) + assert!(secp256r1_verify( + &message_hash, + signature.to_bytes().as_slice(), + public_key.to_encoded_point(false).as_bytes() + ) + .unwrap()); + + // Verification (compressed public key) + assert!(secp256r1_verify( + &message_hash, + signature.to_bytes().as_slice(), + public_key.to_encoded_point(true).as_bytes() + ) + .unwrap()); + + // Wrong message fails + let bad_message_hash = Sha256::new().chain(MSG).chain("\0").finalize(); + assert!(!secp256r1_verify( + &bad_message_hash, + signature.to_bytes().as_slice(), + public_key.to_encoded_point(false).as_bytes() + ) + .unwrap()); + + // Other pubkey fails + let other_secret_key = SigningKey::random(&mut OsRng); + let other_public_key = VerifyingKey::from(&other_secret_key); + assert!(!secp256r1_verify( + &message_hash, + signature.to_bytes().as_slice(), + other_public_key.to_encoded_point(false).as_bytes() + ) + .unwrap()); + } + + // #[test] + // fn test_cosmos_secp256r1_verify() { + // let public_key = hex::decode(COSMOS_SECP256R1_PUBKEY_HEX).unwrap(); + + // for ((i, msg), sig) in (1..) + // .zip(&[ + // COSMOS_SECP256R1_MSG_HEX1, + // //COSMOS_SECP256R1_MSG_HEX2, + // //COSMOS_SECP256R1_MSG_HEX3, + // ]) + // .zip(&[ + // COSMOS_SECP256R1_SIGNATURE_HEX1, + // //COSMOS_SECP256R1_SIGNATURE_HEX2, + // //COSMOS_SECP256R1_SIGNATURE_HEX3, + // ]) + // { + // let message = hex::decode(msg).unwrap(); + // let signature = hex::decode(sig).unwrap(); + + // // Explicit hash + // let message_hash = Sha256::digest(&message); + + // // secp256r1_verify works + // let valid = secp256r1_verify(&message_hash, &signature, &public_key).unwrap(); + // assert!(valid, "secp256r1_verify() failed (test case {i})",); + // } + // } + + // #[test] + // fn test_cosmos_extra_secp256r1_verify() { + // use std::fs::File; + // use std::io::BufReader; + + // use serde::Deserialize; + + // #[derive(Deserialize, Debug)] + // struct Encoded { + // message: String, + // message_hash: String, + // signature: String, + // #[serde(rename = "pubkey")] + // public_key: String, + // } + + // // Open the file in read-only mode with buffer. + // let file = File::open(COSMOS_SECP256R1_TESTS_JSON).unwrap(); + // let reader = BufReader::new(file); + + // let codes: Vec = serde_json::from_reader(reader).unwrap(); + + // for (i, encoded) in (1..).zip(codes) { + // let message = hex::decode(&encoded.message).unwrap(); + + // let hash = hex::decode(&encoded.message_hash).unwrap(); + // let message_hash = Sha256::digest(&message); + // assert_eq!(hash.as_slice(), message_hash.as_slice()); + + // let signature = hex::decode(&encoded.signature).unwrap(); + + // let public_key = hex::decode(&encoded.public_key).unwrap(); + + // // secp256r1_verify() works + // let valid = secp256r1_verify(&message_hash, &signature, &public_key).unwrap(); + // assert!( + // valid, + // "secp256r1_verify failed (test case {i} in {COSMOS_SECP256R1_TESTS_JSON})" + // ); + // } + // } +} diff --git a/packages/crypto/testdata/secp256k1_tests.json b/packages/crypto/testdata/secp256k1_tests.json index 223c6938e1..edb4c15b9a 100644 --- a/packages/crypto/testdata/secp256k1_tests.json +++ b/packages/crypto/testdata/secp256k1_tests.json @@ -119,4 +119,4 @@ "signature": "5c707b6df7667324f950216b933d28e307a0223b24d161bc5887208d7f880b3a4b7bc56586dc51d806ac3ad72807bc62d1d06d0812f121bd91e9770d84885c39", "pubkey": "0436748f1a531e91a40b9e6bfc502488cfd749c3b9529633d4e4dabdb058708b7ac4b0672c9a7105b6dbf63b8054e5d266d43d37cf51241ce289d8f9140fe28996" } -] \ No newline at end of file +] diff --git a/packages/crypto/testdata/secp256r1_tests.json b/packages/crypto/testdata/secp256r1_tests.json new file mode 100644 index 0000000000..edb4c15b9a --- /dev/null +++ b/packages/crypto/testdata/secp256r1_tests.json @@ -0,0 +1,122 @@ +[ + { + "message": "5c868fedb8026979ebd26f1ba07c27eedf4ff6d10443505a96ecaf21ba8c4f0937b3cd23ffdc3dd429d4cd1905fb8dbcceeff1350020e18b58d2ba70887baa3a9b783ad30d3fbf210331cdd7df8d77defa398cdacdfc2e359c7ba4cae46bb74401deb417f8b912a1aa966aeeba9c39c7dd22479ae2b30719dca2f2206c5eb4b7", + "message_hash": "5ae8317d34d1e595e3fa7247db80c0af4320cce1116de187f8f7e2e099c0d8d0", + "signature": "207082eb2c3dfa0b454e0906051270ba4074ac93760ba9e7110cd9471475111151eb0dbbc9920e72146fb564f99d039802bf6ef2561446eb126ef364d21ee9c4", + "pubkey": "04051c1ee2190ecfb174bfe4f90763f2b4ff7517b70a2aec1876ebcfd644c4633fb03f3cfbd94b1f376e34592d9d41ccaf640bb751b00a1fadeb0c01157769eb73" + }, + { + "message": "17cd4a74d724d55355b6fb2b0759ca095298e3fd1856b87ca1cb2df5409058022736d21be071d820b16dfc441be97fbcea5df787edc886e759475469e2128b22f26b82ca993be6695ab190e673285d561d3b6d42fcc1edd6d12db12dcda0823e9d6079e7bc5ff54cd452dad308d52a15ce9c7edd6ef3dad6a27becd8e001e80f", + "message_hash": "586052916fb6f746e1d417766cceffbe1baf95579bab67ad49addaaa6e798862", + "signature": "626d61b7be1488b563e8a85bfb623b2331903964b5c0476c9f9ad29144f076fe2002a2c0ab5e48626bf761cf677dfeede9c7309d2436d4b8c2b89f21ee2ebc6a", + "pubkey": "04ff28290d214a783da7d76098b632c387b3dd5fd33677df8ca7109e3c941e5df2e5a6530c0bb58fbba14ecbc3d76a2a3d5017c66fc260f9214a028b8b3a7b2dce" + }, + { + "message": "db0d31717b04802adbbae1997487da8773440923c09b869e12a57c36dda34af11b8897f266cd81c02a762c6b74ea6aaf45aaa3c52867eb8f270f5092a36b498f88b65b2ebda24afe675da6f25379d1e194d093e7a2f66e450568dbdffebff97c4597a00c96a5be9ba26deefcca8761c1354429622c8db269d6a0ec0cc7a8585c", + "message_hash": "c36d0ecf4bfd178835c97aae7585f6a87de7dfa23cc927944f99a8d60feff68b", + "signature": "83de9be443bcf480892b8c8ca1d5ee65c79a315642c3f7b5305aff3065fda2789747932122b93cec42cad8ee4630a8f6cbe127578b8c495b4ab927275f657658", + "pubkey": "048f83776cbb355dbe59756c6b3d9b40a3470b6c64d49d9361a73bafcc1e7ba69beb05acb126fc4358b3c7008e1e864b4327086157412a84700d82672de27cb627" + }, + { + "message": "47c9deddfd8c841a63a99be96e972e40fa035ae10d929babfc86c437b9d5d495577a45b7f8a35ce3f880e7d8ae8cd8eb685cf41f0506e68046ccf5559232c674abb9c3683829dcc8002683c4f4ca3a29a7bfde20d96dd0f1a0ead847dea18f297f220f94932536ca4deacedc2c6701c3ee50e28e358dcc54cdbf69daf0eb87f6", + "message_hash": "a761293b02c5d8327f909d61a38173556c1f1f770c488810a9b360cf7786c148", + "signature": "723da69da81c8f6b081a9a728b9bba785d2067e0ed769675f8a7563d22ed8a163a993793cf39b96b3cd625df0e06f206e17579cd8ebcb7e704174c3d94dba684", + "pubkey": "0429b0c44bd3887a9ab60fd1c9bb81c9ab421e51b4736cedfa75e4cf960e6098315eab750d173d20842dfdebf861ea7898fdea0527211f8c86f31d9d48b6b65e63" + }, + { + "message": "f15433188c2bbc93b2150bb2f34d36ba8ae49f8f7e4e81aed651c8fb2022b2a7e851c4dbbbc21c14e27380316bfdebb0a049246349537dba687581c1344e40f75afd2735bb21ea074861de6801d28b22e8beb76fdd25598812b2061ca3fba229daf59a4ab416704543b02e16b8136c22acc7e197748ae19b5cbbc160fdc3a8cd", + "message_hash": "08ec76ab0f1bc9dc27b3b3bd4f949c60ecc8bbf27678b28f2ee8de055ee8bf59", + "signature": "0e0c5228e6783bee4d0406f4f7b7d79f705f0dbb55126966f79e631bd8b23079faae33aec5b0fafd3413c14bfdef9c7c9ac6abd06c923c48ab136a2c56826118", + "pubkey": "04441ef6e211e3fa6cffce9d34b4765487bc0d98d95b21ccfaeef42d7de2fef9a57886a20b6b10f97f5d05caa904ca3e287b92955658566639031e67cd243d8657" + }, + { + "message": "1bc796124b87793b7f7fdd53b896f8f0d0f2d2be36d1944e3c2a0ac5c6b2839f59a4b4fad200f8035ec98630c51ef0d40863a5ddd69b703d73f06b4afae8ad1a88e19b1b26e8c10b7bff953c05eccc82fd771b220910165f3a906b7c931683e431998d1fd06c32dd11b4f872bf980d547942f22124c7e50c9523321aee23a36d", + "message_hash": "ffbe3fd342a1a991848d02258cf5e3df301974b7a8f0fe10a88222a9503f67e0", + "signature": "b9d3962edadc893f8eeff379f136c7b8fc6ea824a5afc6cbda7e3cb4c7a1e860bb1c1f901cf450edfdce20686352bb0cf0a643301123140ec87c92480d7f9d6a", + "pubkey": "04ad98fbf6748401963e4c732b0ba4c4b5016f1d87935c5edf84b55c38b28eb3cf35f91b470e007cc5f5c2e12c9b8725bc92a6feb259968436881c72906a14ca84" + }, + { + "message": "18e55ac264031da435b613fc9dc6c4aafc49aae8ddf6f220d523415896ff915fae5c5b2e6aed61d88e5721823f089c46173afc5d9b47fd917834c85284f62dda6ed2d7a6ff10eb553b9312b05dad7decf7f73b69479c02f14ea0a2aa9e05ec07396cd37c28795c90e590631137102315635d702278e352aa41d0826adadff5e1", + "message_hash": "434fea583df79f781e41f18735a24409cf404f28e930290cc97c67ef158e5789", + "signature": "9369ab86afae5e22ed5f4012964804d2a19c36b8b58cf2855205b1cfcc937422a27dfc38d899b78edcf38a1b2b53578e72270b083d7d69424c4b4a7d25d39f4d", + "pubkey": "04061d7152dc6263a6764c6e810ee02f6333c844d90d70043b2bb6d4efacfac78e4391f7f17063bd69bd0d19061cc09eeb429561f3d88a3b38019ac82ca152c35c" + }, + { + "message": "a5290666c97294d090f8da898e555cbd33990579e5e95498444bfb318b4aa1643e0d4348425e21c7c6f99f9955f3048f56c22b68c4a516af5c90ed5268acc9c5a20fec0200c2a282a90e20d3c46d4ecdda18ba18b803b19263de2b79238da921707a0864799cdee9f02913b40681c02c6923070688844b58fe415b7d71ea6845", + "message_hash": "c352f58e118fc0d7810b8020bdb306b7dc115b41bbb0b642c7ea73a60cc2a4eb", + "signature": "c5e439cef76b28dc0fe9d260763bec05b5e795ac8d90b25d9fccbc1918bc32f31b06144e6b191224d5eda822a5b3b2026af6aa7f25a9061c9e81c312728aa94a", + "pubkey": "043eab98ab69bca21ad18136a092a4f398cb0a7d34c4bf18bbe9c81bdfce3dde752f8a82a4c1cbe5535d4acd9218ba6df4a96db88963d36108d562795473dedeae" + }, + { + "message": "13ad0600229c2a66b2f11617f69c7210ad044c49265dc98ec3c64f56e56a083234d277d404e2c40523c414ad23af5cc2f91a47fe59e7ca572f7fe1d3d3cfceaedadac4396749a292a38e92727273272335f12b2acea21cf069682e67d7e7d7a31ab5bb8e472298a9451aeae6f160f36e6623c9b632b9c93371a002818addc243", + "message_hash": "6ff9153ede285fc0e486f1dd4dd9e32a0fb23e9653c55841b67c2e5a090aac63", + "signature": "ee8615a5fab6fc674e6d3d9cde8da2b18dece076ae94d96662e16109db12d7203171705cdab2b3d34c58e556c80358c105807e98243f5754b70b771071308b94", + "pubkey": "042aaf49401b01083bf0657a379530f1b2b5db414e3fe91fca07048c89df05a4dae584ef2fe20d2f3293ff46df73155a76218349336977250055dc9ae7f28e57e0" + }, + { + "message": "51ad843da5eafc177d49a50a82609555e52773c5dfa14d7c02db5879c11a6b6e2e0860df38452dc579d763f91a83ade23b73f4fcbd703f35dd6ecfbb4c9578d5b604ed809c8633e6ac5679a5f742ce94fea3b97b5ba8a29ea28101a7b35f9eaa894dda54e3431f2464d18faf8342b7c59dfe0598c0ab29a14622a08eea70126b", + "message_hash": "8e19143e34fee546fab3d56e816f2e21586e27912a2ad7d80af75942e0ff585a", + "signature": "f753c447161aa3a58e5deeca31797f21484fb0ec3a7fe6e464ab1914896f253b99640fbcce1f25fd66744b046e0dfd57fa23070555f438af6c5e5828d47e9fa7", + "pubkey": "048c59a63c27b0b4e1e1b67f6e97180d5fa679791cde6af650271a274c369361421b42e36a7029f8982d346264f81f46cbc2e8c823568b2ad15649794fc835f87e" + }, + { + "message": "678b505467d55ce01aec23fd4851957137c3a1de3ff2c673ec95a577aa9fb011b4b4a8eb7a0e6f391d4236a35b7e769692ace5851d7c53700e180fa522d3d37dbaa496163f3de6d96391e38ff83271e621f2458729ff74de462cdce6b3029f308d4eb8aef036357b9de06d68558e0388a6e88af91340c875050b8c91c4e26fc8", + "message_hash": "6fe86a3b533114e1db444217999ce5907237e69acc47cfb8d30b4e14ee58817a", + "signature": "439fd0423bde36a1616a6fa4343bb7e07a6b3f6dc629aa8c93c91831055e476c20998a26ae4b96ef36d48d83e8af0288f0bbc2db5ca5c8271a42f3fdc478fcb2", + "pubkey": "04817e21214a40f8135e2053656dc3d9a66eade80f9428f347d11ea249095e9513df446f64d7db0e8161fc1c03c60ddae5d73a8d80ad134600acefc06b3c8c9eda" + }, + { + "message": "9bf457159f0d44b78d0e151ee53c41cecd98fb4e4129fcda8cc84a758636f84dcad9032f3ec422219d8a7ec61ea89f45d19cab3c3d451de1a634e3d2532231bc03031973d7150cf8e83d8b6a34f25fc136446878e3851b780abdca069c8e981b3ea3f1bf1ff6e47a03f97aed64c1cc90dd00389fa21bb973f142af5e8ceccef4", + "message_hash": "03b3e33ade25fad2eeb530433b6785fb1e977228e0049e572437caa33baa059e", + "signature": "4ce72a83cf1d148db4d1e46e2f773c677f72933c40d7100b9192750a1c8222a89d5fbd67ce89ba8c79df9dc3b42922026a8498921c2bdb4ea8f36496d88c2cfb", + "pubkey": "04571a598076a318dcd7af6ff35c2ab35198197faa1df9612f951d516456c97ef7a30a1405958f554fdf1bad22d22333acb4fe4c968c74a281c524020ad949c9ef" + }, + { + "message": "2469172b7a046e6112dfe365590dfddb7c045cccd4ab353edc3076091aad1c780a9a73ff93f3dbf9e2189c5d1fdd6f6167d0ae8cc0f53dc8950e60dd0410e23589999d4ce4fa49e268774defd4edce01c05b205014b63591a041745bfffc6ae4d72d3add353e49478106653cc735b07b0fe665c42d0e6766e525bb9718264c87", + "message_hash": "b90651535080381884a0917c02fdf9e176798c4d65bed76568ec1de95e3c9641", + "signature": "1f1e1fb673e9a7dee09961c6824b473189904deb4f0d8e28da51f77f4de2efe6ae8df1fcdb226fac8b46e494720e45f6d9a5350174faaf22e47b6329ee6c5e1b", + "pubkey": "048db80c468a88ffb4bcdb5ccddbfc9da8cf728a651ab937edf729ad279d9375b50b97422368aa4b3ac13aa18c89ca2af86c14b1948325f1477d5ea9f5156bcc52" + }, + { + "message": "6f8983e74f304c3657cffde0682b42699cb2c3475b925058ff37292c40a0aa296690ad129730339ac60cf784225b2fd3db58297c8ce5889df7a48d3e74a363ae4135e8a234cab53ca4c11c031d561a6cf7dd47b925ed5bc4c2794ba7b74a868b0c3da31ff1e4540d0768612192a236d86f74fb8c73f375b71c62f1648c0e6126", + "message_hash": "1095c90de2734d4b9dfedefbdd3f76f592f0a3e1697d1321f0eab3f78129c8ce", + "signature": "9cf7d941dcbbbe61c2a6f5112cb518094e79e5d203891de2247e75fd532c3f21fc5a04579b2526f2543efd2a57e82b647da08b6924bff39cf021398a56ad70de", + "pubkey": "0406e22a39ec06c32bcb4d235f23630a198a884a43e8c200a7c3b3f68ef4002de902c574035c08d39857caa492088d35cff9b1d4e1b73e8414b7d71fe53167f7cf" + }, + { + "message": "6fbe6f0f178fdc8a3ad1a8eecb02d37108c5831281fe85e3ff8eeb66ca1082a217b6d602439948f828e140140412544f994da75b6efc203b295235deca060ecfc7b71f05e5af2acc564596772ddbfb4078b4665f6b85f4e70641af26e31f6a14e5c88604459df4eeeed9b77b33c4b82a3c1458bd2fd1dc7214c04f9c79c8f09b", + "message_hash": "164025d15dfec124cd37db98daf196cfbe44716968112dc8a4be24e350abd559", + "signature": "59cd6c2a30227afbd693d87b201d0989435d6e116c144276a5223466a822c0f2b01495efda969b3fd3a2c05aa098a4e04b0d0e748726fc6174627da15b143799", + "pubkey": "04db6816cec58836ef290e39429f506f00c5541376128bedea089b88094f42cd950b23e68cd57203d9fedeeacef680c26baf25be682ad808f308d2ddd5828fdeae" + }, + { + "message": "2b49de971bb0f705a3fb5914eb7638d72884a6c3550667dbfdf301adf26bde02f387fd426a31be6c9ff8bfe8690c8113c88576427f1466508458349fc86036afcfb66448b947707e791e71f558b2bf4e7e7507773aaf4e9af51eda95cbce0a0f752b216f8a54a045d47801ff410ee411a1b66a516f278327df2462fb5619470e", + "message_hash": "00c6fc53c1986d19a8a8b580ee553dc1240745d760647d1c0adf442c133c7f56", + "signature": "9eaf69170aeba44966afe957295526ee9852b5034c18dc5aeef3255c8567838aebd4c8de2c22b5cb8803d6e070186786f6d5dae2202b9f899276fa31a66cb3bb", + "pubkey": "04d2a23e34dcb8e1fbaaf2c3c0e83500824b3a122e83737f1251fa34ccf0d2fb8719030b3d567ed019ba62ee392990a9a23f88ee990f26ed50783e4f671572371f" + }, + { + "message": "1fa7201d96ad4d190415f2656d1387fa886afc38e5cd18b8c60da367acf32c627d2c9ea19ef3f030e559fc2a21695cdbb65ddf6ba36a70af0d3fa292a32de31da6acc6108ab2be8bd37843338f0c37c2d62648d3d49013edeb9e179dadf78bf885f95e712fcdfcc8a172e47c09ab159f3a00ed7b930f628c3c48257e92fc7407", + "message_hash": "fb5dd3b8d280fe7c4838f01b2a5c28493ed3084f46b40642600ba39e43fbff7b", + "signature": "91058d1b912514940e1002855cc930c01a21234bad88f607f213af495c32b69f005d387ce3de25f1b9bad1fb180de110686d91b461ae2972fa4e4a7018519870", + "pubkey": "048a86bbf4f7014a8ef557ff6a87681b5728957fc68342a1b2b0164eef5a3c7bb1cbe75d53a1a222990470161143bf18b5cec7c75616bbacdddf2f0af45514f9ca" + }, + { + "message": "74715fe10748a5b98b138f390f7ca9629c584c5d6ad268fc455c8de2e800b73fa1ea9aaee85de58baa2ce9ce68d822fc31842c6b153baef3a12bf6b4541f74af65430ae931a64c8b4950ad1c76b31aea8c229b3623390e233c112586aa5907bbe419841f54f0a7d6d19c003b91dc84bbb59b14ec477a1e9d194c137e21c75bbb", + "message_hash": "f4083aebe08c9bdb8c08ff844ffc207f80fa4406fb73bdbc1c6020f71281bdae", + "signature": "fe43eb9c38b506d118e20f8605ac8954fc0406efd306ba7ea5b07577a2735d15d589e91bf5014c7c360342ad135259dd7ae684e2c21234d7a912b43d148fcf19", + "pubkey": "04ab11970c6a01f45f6730b57d8eee6c9e1e7be824b34b27f9b45d2c5f5b6e601d4d946af7e4f5b98647634cfbacb4eecf7507c2fea1b114117902e4bafe9e1eb0" + }, + { + "message": "d10131982dd1a1d839aba383cd72855bf41061c0cb04dfa1acad3181f240341d744ca6002b52f25fb3c63f16d050c4a4ef2c0ebf5f16ce987558f4b9d4a5ad3c6b81b617de00e04ba32282d8bf223bfedbb325b741dfdc8f56fa85c65d42f05f6a1330d8cc6664ad32050dd7b9e3993f4d6c91e5e12cbd9e82196e009ad22560", + "message_hash": "cb017b280093879c4b114b52ea670f14e97b661074abccc8539a23280fe136b4", + "signature": "ccdbbd2500043bf7f705536d5984ab5f05fdc0fa3cf464d8c88f861e3fc8e54cd5c6342c08dcd8242e1daf3595cae968e320a025aa45ec4bc725795da3d1becb", + "pubkey": "040827dce898102fa27e52172e8246368b062ade896d34b7f25d8c24fca4a424f91d283f6ebac2b4f6167477ee624e2249c52a7c321e67b6fef711fba2f90d20d7" + }, + { + "message": "ef9dbd90ded96ad627a0a987ab90537a3e7acc1fdfa991088e9d999fd726e3ce1e1bd89a7df08d8c2bf51085254c89dc67bc21e8a1a93f33a38c18c0ce3880e958ac3e3dbe8aec49f981821c4ac6812dd29fab3a9ebe7fbd799fb50f12021b48d1d9abca8842547b3b99befa612cc8b4ca5f9412e0352e72ab1344a0ac2913db", + "message_hash": "5f1d77f456d7ed30acad33795b50733d54226e57df4281a43d3821d0762f12fe", + "signature": "5c707b6df7667324f950216b933d28e307a0223b24d161bc5887208d7f880b3a4b7bc56586dc51d806ac3ad72807bc62d1d06d0812f121bd91e9770d84885c39", + "pubkey": "0436748f1a531e91a40b9e6bfc502488cfd749c3b9529633d4e4dabdb058708b7ac4b0672c9a7105b6dbf63b8054e5d266d43d37cf51241ce289d8f9140fe28996" + } +] diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index fbe891c8ca..4a310ce7bd 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -58,6 +58,12 @@ extern "C" { recovery_param: u32, ) -> u64; + /// Verifies message hashes against a signature with a public key, using the + /// secp256r1 ECDSA parametrization. + /// Returns 0 on verification success, 1 on verification failure, and values + /// greater than 1 in case of error. + fn secp256r1_verify(message_hash_ptr: u32, signature_ptr: u32, public_key_ptr: u32) -> u32; + /// Verifies a message against a signature with a public key, using the /// ed25519 EdDSA scheme. /// Returns 0 on verification success, 1 on verification failure, and values @@ -407,6 +413,32 @@ impl Api for ExternalApi { } } + fn secp256r1_verify( + &self, + message_hash: &[u8], + signature: &[u8], + public_key: &[u8], + ) -> Result { + let hash_send = build_region(message_hash); + let hash_send_ptr = &*hash_send as *const Region as u32; + let sig_send = build_region(signature); + let sig_send_ptr = &*sig_send as *const Region as u32; + let pubkey_send = build_region(public_key); + let pubkey_send_ptr = &*pubkey_send as *const Region as u32; + + let result = unsafe { secp256r1_verify(hash_send_ptr, sig_send_ptr, pubkey_send_ptr) }; + match result { + 0 => Ok(true), + 1 => Ok(false), + 2 => panic!("MessageTooLong must not happen. This is a bug in the VM."), + 3 => Err(VerificationError::InvalidHashFormat), + 4 => Err(VerificationError::InvalidSignatureFormat), + 5 => Err(VerificationError::InvalidPubkeyFormat), + 10 => Err(VerificationError::GenericErr), + error_code => Err(VerificationError::unknown_err(error_code)), + } + } + fn ed25519_verify( &self, message: &[u8], diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 9f9096082d..676120ebe2 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -178,6 +178,19 @@ impl Api for MockApi { Ok(pubkey.to_vec()) } + fn secp256r1_verify( + &self, + message_hash: &[u8], + signature: &[u8], + public_key: &[u8], + ) -> Result { + Ok(cosmwasm_crypto::secp256r1_verify( + message_hash, + signature, + public_key, + )?) + } + fn ed25519_verify( &self, message: &[u8], diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 4dea2819da..c493957297 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -165,6 +165,13 @@ pub trait Api { recovery_param: u8, ) -> Result, RecoverPubkeyError>; + fn secp256r1_verify( + &self, + message_hash: &[u8], + signature: &[u8], + public_key: &[u8], + ) -> Result; + fn ed25519_verify( &self, message: &[u8], diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index 77719e5c3d..1945ba7661 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -22,6 +22,7 @@ const SUPPORTED_IMPORTS: &[&str] = &[ "env.addr_humanize", "env.secp256k1_verify", "env.secp256k1_recover_pubkey", + "env.secp256r1_verify", "env.ed25519_verify", "env.ed25519_batch_verify", "env.debug", @@ -624,6 +625,7 @@ mod tests { (import "env" "addr_humanize" (func (param i32 i32) (result i32))) (import "env" "secp256k1_verify" (func (param i32 i32 i32) (result i32))) (import "env" "secp256k1_recover_pubkey" (func (param i32 i32 i32) (result i64))) + (import "env" "secp256r1_verify" (func (param i32 i32 i32) (result i32))) (import "env" "ed25519_verify" (func (param i32 i32 i32) (result i32))) (import "env" "ed25519_batch_verify" (func (param i32 i32 i32) (result i32))) )"#, @@ -643,6 +645,7 @@ mod tests { (import "env" "addr_humanize" (func (param i32 i32) (result i32))) (import "env" "secp256k1_verify" (func (param i32 i32 i32) (result i32))) (import "env" "secp256k1_recover_pubkey" (func (param i32 i32 i32) (result i64))) + (import "env" "secp256r1_verify" (func (param i32 i32 i32) (result i32))) (import "env" "ed25519_verify" (func (param i32 i32 i32) (result i32))) (import "env" "ed25519_batch_verify" (func (param i32 i32 i32) (result i32))) (import "env" "spam01" (func (param i32 i32) (result i32))) diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index 23ac343845..9e7edc9566 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -35,6 +35,10 @@ pub struct GasConfig { pub secp256k1_verify_cost: u64, /// secp256k1 public key recovery cost pub secp256k1_recover_pubkey_cost: u64, + /// secp256r1 signature verification cost + pub secp256r1_verify_cost: u64, + /// secp256r1 public key recovery cost + pub secp256r1_recover_pubkey_cost: u64, /// ed25519 signature verification cost pub ed25519_verify_cost: u64, /// ed25519 batch signature verification cost @@ -52,6 +56,10 @@ impl Default for GasConfig { secp256k1_verify_cost: 154 * GAS_PER_US, // ~162 us in crypto benchmarks secp256k1_recover_pubkey_cost: 162 * GAS_PER_US, + // ~154 us in crypto benchmarks + secp256r1_verify_cost: 154 * GAS_PER_US, + // ~162 us in crypto benchmarks + secp256r1_recover_pubkey_cost: 162 * GAS_PER_US, // ~63 us in crypto benchmarks ed25519_verify_cost: 63 * GAS_PER_US, // Gas cost factors, relative to ed25519_verify cost @@ -501,6 +509,7 @@ mod tests { "addr_humanize" => Function::new_typed(&mut store, |_a: u32, _b: u32| -> u32 { 0 }), "secp256k1_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), "secp256k1_recover_pubkey" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u64 { 0 }), + "secp256r1_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), "ed25519_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), "ed25519_batch_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), "debug" => Function::new_typed(&mut store, |_a: u32| {}), diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index a02bd496b8..adab68c77c 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -4,7 +4,8 @@ use std::cmp::max; use std::marker::PhantomData; use cosmwasm_crypto::{ - ed25519_batch_verify, ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, CryptoError, + ed25519_batch_verify, ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, + secp256r1_verify, CryptoError, }; use cosmwasm_crypto::{ ECDSA_PUBKEY_MAX_LEN, ECDSA_SIGNATURE_LEN, EDDSA_PUBKEY_LEN, MESSAGE_HASH_MAX_LEN, @@ -312,6 +313,48 @@ pub fn do_secp256k1_recover_pubkey< } } +/// Return code (error code) for a valid signature +const SECP256R1_VERIFY_CODE_VALID: u32 = 0; + +/// Return code (error code) for an invalid signature +const SECP256R1_VERIFY_CODE_INVALID: u32 = 1; + +pub fn do_secp256r1_verify( + mut env: FunctionEnvMut>, + hash_ptr: u32, + signature_ptr: u32, + pubkey_ptr: u32, +) -> VmResult { + let (data, mut store) = env.data_and_store_mut(); + + let hash = read_region(&data.memory(&mut store), hash_ptr, MESSAGE_HASH_MAX_LEN)?; + let signature = read_region(&data.memory(&mut store), signature_ptr, ECDSA_SIGNATURE_LEN)?; + let pubkey = read_region(&data.memory(&mut store), pubkey_ptr, ECDSA_PUBKEY_MAX_LEN)?; + + let gas_info = GasInfo::with_cost(data.gas_config.secp256r1_verify_cost); + process_gas_info(data, &mut store, gas_info)?; + let result = secp256r1_verify(&hash, &signature, &pubkey); + let code = match result { + Ok(valid) => { + if valid { + SECP256R1_VERIFY_CODE_VALID + } else { + SECP256R1_VERIFY_CODE_INVALID + } + } + Err(err) => match err { + CryptoError::InvalidHashFormat { .. } + | CryptoError::InvalidPubkeyFormat { .. } + | CryptoError::InvalidSignatureFormat { .. } + | CryptoError::GenericErr { .. } => err.code(), + CryptoError::BatchErr { .. } | CryptoError::InvalidRecoveryParam { .. } => { + panic!("Error must not happen for this call") + } + }, + }; + Ok(code) +} + /// Return code (error code) for a valid signature const ED25519_VERIFY_CODE_VALID: u32 = 0; @@ -671,6 +714,7 @@ mod tests { "addr_humanize" => Function::new_typed(&mut store, |_a: u32, _b: u32| -> u32 { 0 }), "secp256k1_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), "secp256k1_recover_pubkey" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u64 { 0 }), + "secp256r1_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), "ed25519_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), "ed25519_batch_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), "debug" => Function::new_typed(&mut store, |_a: u32| {}), @@ -1644,6 +1688,285 @@ mod tests { assert_eq!(force_read(&mut fe_mut, pubkey_ptr), expected); } + #[test] + fn do_secp256r1_verify_works() { + let api = MockApi::default(); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + + let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash_ptr = write_data(&mut fe_mut, &hash); + let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig_ptr = write_data(&mut fe_mut, &sig); + let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); + + assert_eq!( + do_secp256r1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + 0 + ); + } + + #[test] + fn do_secp256r1_verify_wrong_hash_verify_fails() { + let api = MockApi::default(); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + + let mut hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + // alter hash + hash[0] ^= 0x01; + let hash_ptr = write_data(&mut fe_mut, &hash); + let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig_ptr = write_data(&mut fe_mut, &sig); + let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); + + assert_eq!( + do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + 1 + ); + } + + #[test] + fn do_secp256r1_verify_larger_hash_fails() { + let api = MockApi::default(); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + + let mut hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + // extend / break hash + hash.push(0x00); + let hash_ptr = write_data(&mut fe_mut, &hash); + let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig_ptr = write_data(&mut fe_mut, &sig); + let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); + + let result = do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr); + match result.unwrap_err() { + VmError::CommunicationErr { + source: CommunicationError::RegionLengthTooBig { length, .. }, + .. + } => assert_eq!(length, MESSAGE_HASH_MAX_LEN + 1), + e => panic!("Unexpected error: {e:?}"), + } + } + + #[test] + fn do_secp256r1_verify_shorter_hash_fails() { + let api = MockApi::default(); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + + let mut hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + // reduce / break hash + hash.pop(); + let hash_ptr = write_data(&mut fe_mut, &hash); + let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig_ptr = write_data(&mut fe_mut, &sig); + let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); + + assert_eq!( + do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + 3 // mapped InvalidHashFormat + ); + } + + #[test] + fn do_secp256r1_verify_wrong_sig_verify_fails() { + let api = MockApi::default(); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + + let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash_ptr = write_data(&mut fe_mut, &hash); + let mut sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + // alter sig + sig[0] ^= 0x01; + let sig_ptr = write_data(&mut fe_mut, &sig); + let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); + + assert_eq!( + do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + 1 + ); + } + + #[test] + fn do_secp256r1_verify_larger_sig_fails() { + let api = MockApi::default(); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + + let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash_ptr = write_data(&mut fe_mut, &hash); + let mut sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + // extend / break sig + sig.push(0x00); + let sig_ptr = write_data(&mut fe_mut, &sig); + let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); + + let result = do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr); + match result.unwrap_err() { + VmError::CommunicationErr { + source: CommunicationError::RegionLengthTooBig { length, .. }, + .. + } => assert_eq!(length, ECDSA_SIGNATURE_LEN + 1), + e => panic!("Unexpected error: {e:?}"), + } + } + + #[test] + fn do_secp256r1_verify_shorter_sig_fails() { + let api = MockApi::default(); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + + let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash_ptr = write_data(&mut fe_mut, &hash); + let mut sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + // reduce / break sig + sig.pop(); + let sig_ptr = write_data(&mut fe_mut, &sig); + let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); + + assert_eq!( + do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + 4 // mapped InvalidSignatureFormat + ) + } + + #[test] + fn do_secp256r1_verify_wrong_pubkey_format_fails() { + let api = MockApi::default(); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + + let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash_ptr = write_data(&mut fe_mut, &hash); + let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig_ptr = write_data(&mut fe_mut, &sig); + let mut pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + // alter pubkey format + pubkey[0] ^= 0x01; + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); + + assert_eq!( + do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + 5 // mapped InvalidPubkeyFormat + ) + } + + #[test] + fn do_secp256r1_verify_wrong_pubkey_fails() { + let api = MockApi::default(); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + + let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash_ptr = write_data(&mut fe_mut, &hash); + let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig_ptr = write_data(&mut fe_mut, &sig); + let mut pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + // alter pubkey + pubkey[1] ^= 0x01; + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); + + assert_eq!( + do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + 10 // mapped GenericErr + ) + } + + #[test] + fn do_secp256r1_verify_larger_pubkey_fails() { + let api = MockApi::default(); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + + let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash_ptr = write_data(&mut fe_mut, &hash); + let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig_ptr = write_data(&mut fe_mut, &sig); + let mut pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + // extend / break pubkey + pubkey.push(0x00); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); + + let result = do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr); + match result.unwrap_err() { + VmError::CommunicationErr { + source: CommunicationError::RegionLengthTooBig { length, .. }, + .. + } => assert_eq!(length, ECDSA_PUBKEY_MAX_LEN + 1), + e => panic!("Unexpected error: {e:?}"), + } + } + + #[test] + fn do_secp256r1_verify_shorter_pubkey_fails() { + let api = MockApi::default(); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + + let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash_ptr = write_data(&mut fe_mut, &hash); + let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig_ptr = write_data(&mut fe_mut, &sig); + let mut pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + // reduce / break pubkey + pubkey.pop(); + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); + + assert_eq!( + do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + 5 // mapped InvalidPubkeyFormat + ) + } + + #[test] + fn do_secp256r1_verify_empty_pubkey_fails() { + let api = MockApi::default(); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + + let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash_ptr = write_data(&mut fe_mut, &hash); + let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig_ptr = write_data(&mut fe_mut, &sig); + let pubkey = vec![]; + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); + + assert_eq!( + do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + 5 // mapped InvalidPubkeyFormat + ) + } + + #[test] + fn do_secp256r1_verify_wrong_data_fails() { + let api = MockApi::default(); + let (fe, mut store, mut _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + + let hash = vec![0x22; MESSAGE_HASH_MAX_LEN]; + let hash_ptr = write_data(&mut fe_mut, &hash); + let sig = vec![0x22; ECDSA_SIGNATURE_LEN]; + let sig_ptr = write_data(&mut fe_mut, &sig); + let pubkey = vec![0x04; ECDSA_PUBKEY_MAX_LEN]; + let pubkey_ptr = write_data(&mut fe_mut, &pubkey); + + assert_eq!( + do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + 10 // mapped GenericErr + ) + } + #[test] fn do_ed25519_verify_works() { let api = MockApi::default(); diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index adf82c2e2f..e6dc6a2461 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -16,7 +16,7 @@ use crate::errors::{CommunicationError, VmError, VmResult}; use crate::imports::{ do_abort, do_addr_canonicalize, do_addr_humanize, do_addr_validate, do_db_read, do_db_remove, do_db_write, do_debug, do_ed25519_batch_verify, do_ed25519_verify, do_query_chain, - do_secp256k1_recover_pubkey, do_secp256k1_verify, + do_secp256k1_recover_pubkey, do_secp256k1_verify, do_secp256r1_verify, }; #[cfg(feature = "iterator")] use crate::imports::{do_db_next, do_db_next_key, do_db_next_value, do_db_scan}; @@ -154,6 +154,14 @@ where Function::new_typed_with_env(&mut store, &fe, do_secp256k1_recover_pubkey), ); + // Verifies message hashes against a signature with a public key, using the secp256r1 ECDSA parametrization. + // Returns 0 on verification success, 1 on verification failure, and values greater than 1 in case of error. + // Ownership of input pointers is not transferred to the host. + env_imports.insert( + "secp256r1_verify", + Function::new_typed_with_env(&mut store, &fe, do_secp256r1_verify), + ); + // Verifies a message against a signature with a public key, using the ed25519 EdDSA scheme. // Returns 0 on verification success, 1 on verification failure, and values greater than 1 in case of error. // Ownership of input pointers is not transferred to the host. From 3238cb2eb68736874bdad211e70bcc56521b129b Mon Sep 17 00:00:00 2001 From: llllllluc <58892938+llllllluc@users.noreply.github.com> Date: Sun, 17 Sep 2023 00:07:21 -0700 Subject: [PATCH 1130/2372] nit --- packages/crypto/src/secp256k1.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/crypto/src/secp256k1.rs b/packages/crypto/src/secp256k1.rs index 098ccab93b..cf0139a1b3 100644 --- a/packages/crypto/src/secp256k1.rs +++ b/packages/crypto/src/secp256k1.rs @@ -44,10 +44,7 @@ pub fn secp256k1_verify( public_key: &[u8], ) -> CryptoResult { let message_hash = read_hash(message_hash)?; - let signature = read_signature(signature)?; - // panic!("{}", signature); - println!("Valid signature: {:?}", signature); - + let signature = read_signature(signature)?;signature); check_pubkey(public_key)?; // Already hashed, just build Digest container From 593f8055de101e0e2cb90e857f69fa75878eb89e Mon Sep 17 00:00:00 2001 From: llllllluc <58892938+llllllluc@users.noreply.github.com> Date: Sun, 17 Sep 2023 00:36:12 -0700 Subject: [PATCH 1131/2372] nit --- packages/crypto/src/secp256k1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/crypto/src/secp256k1.rs b/packages/crypto/src/secp256k1.rs index cf0139a1b3..d77f71181d 100644 --- a/packages/crypto/src/secp256k1.rs +++ b/packages/crypto/src/secp256k1.rs @@ -44,7 +44,7 @@ pub fn secp256k1_verify( public_key: &[u8], ) -> CryptoResult { let message_hash = read_hash(message_hash)?; - let signature = read_signature(signature)?;signature); + let signature = read_signature(signature)?; check_pubkey(public_key)?; // Already hashed, just build Digest container From 86af1422296373af01b1ff0093d09d89e60d8067 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Sun, 7 Jan 2024 11:18:01 +0100 Subject: [PATCH 1132/2372] Fix clippy warnings --- packages/crypto/benches/main.rs | 1 - packages/crypto/src/secp256r1.rs | 173 ++++++++++++++----------------- 2 files changed, 78 insertions(+), 96 deletions(-) diff --git a/packages/crypto/benches/main.rs b/packages/crypto/benches/main.rs index cd43e59c8f..ce4b8d2eb3 100644 --- a/packages/crypto/benches/main.rs +++ b/packages/crypto/benches/main.rs @@ -12,7 +12,6 @@ use sha2::Sha256; use cosmwasm_crypto::{ ed25519_batch_verify, ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, - secp256r1_verify, }; use std::cmp::min; diff --git a/packages/crypto/src/secp256r1.rs b/packages/crypto/src/secp256r1.rs index 52aaf96c1e..7dc7856c36 100644 --- a/packages/crypto/src/secp256r1.rs +++ b/packages/crypto/src/secp256r1.rs @@ -2,28 +2,16 @@ use digest::{Digest, Update}; // trait use p256::{ ecdsa::signature::DigestVerifier, // traits ecdsa::{Signature, VerifyingKey}, // type aliases - elliptic_curve::sec1::ToEncodedPoint, }; use std::convert::TryInto; use crate::errors::{CryptoError, CryptoResult}; use crate::identity_digest::Identity256; -/// Max length of a message hash for secp256r1 verification in bytes. -/// This is typically a 32 byte output of e.g. SHA-256 or Keccak256. In theory shorter values -/// are possible but currently not supported by the implementation. Let us know when you need them. -pub const MESSAGE_HASH_MAX_LEN: usize = 32; - -/// ECDSA (secp256r1) parameters -/// Length of a serialized signature -pub const ECDSA_SIGNATURE_LEN: usize = 64; - /// Length of a serialized compressed public key const ECDSA_COMPRESSED_PUBKEY_LEN: usize = 33; /// Length of a serialized uncompressed public key const ECDSA_UNCOMPRESSED_PUBKEY_LEN: usize = 65; -/// Max length of a serialized public key -pub const ECDSA_PUBKEY_MAX_LEN: usize = ECDSA_UNCOMPRESSED_PUBKEY_LEN; /// ECDSA secp256r1 implementation. /// @@ -120,19 +108,12 @@ fn check_pubkey(data: &[u8]) -> Result<(), InvalidSecp256r1PubkeyFormat> { mod tests { use super::*; - // use elliptic_curve::rand_core::OsRng; - // use elliptic_curve::sec1::ToEncodedPoint; - - use hex_literal::hex; + use ecdsa::RecoveryId; use p256::{ - ecdsa::signature::DigestSigner, // trait - ecdsa::SigningKey, // type alias - elliptic_curve::rand_core::OsRng, + ecdsa::signature::DigestSigner, ecdsa::SigningKey, elliptic_curve::rand_core::OsRng, }; use serde::Deserialize; use sha2::Sha256; - use std::fs::File; - use std::io::BufReader; // For generic signature verification const MSG: &str = "Hello World!"; @@ -143,12 +124,12 @@ mod tests { "049a2c7b27b132246e170dfb9167db5c5bd302033dbece2bc3f2541a6cd11851821a775f1fc6c4f89e0d019888057f0d574f1c4eb1f90a7a41c4ea9b99b538d932"; const COSMOS_SECP256R1_MSG_HEX1: &str = "6265206b696e64"; - const COSMOS_SECP256R1_MSG_HEX2: &str = "6265206b696e64"; - const COSMOS_SECP256R1_MSG_HEX3: &str = "6265206b696e64"; + // const COSMOS_SECP256R1_MSG_HEX2: &str = "6265206b696e64"; + // const COSMOS_SECP256R1_MSG_HEX3: &str = "6265206b696e64"; const COSMOS_SECP256R1_SIGNATURE_HEX1: &str = "453020029250fb9eb22b21b881319a123244e463a329356b75ce804fc2dda174e715104621028d009abee7d523894b425d974bc38cfae5d05cdf5a550c8eceae1f20f0c9913f0038"; - const COSMOS_SECP256R1_SIGNATURE_HEX2: &str = "30450220658fc9271b09bd53edf3a5bd31b7bd99bd3c3de7859cd8dd1133e76ed44fcb580221009e43d091911de0fc90d22960517211f5cf6c624b326759e219326f3af807ac31"; - const COSMOS_SECP256R1_SIGNATURE_HEX3: &str = "30450220658fc9271b09bd53edf3a5bd31b7bd99bd3c3de7859cd8dd1133e76ed44fcb580221009e43d091911de0fc90d22960517211f5cf6c624b326759e219326f3af807ac31"; + // const COSMOS_SECP256R1_SIGNATURE_HEX2: &str = "30450220658fc9271b09bd53edf3a5bd31b7bd99bd3c3de7859cd8dd1133e76ed44fcb580221009e43d091911de0fc90d22960517211f5cf6c624b326759e219326f3af807ac31"; + // const COSMOS_SECP256R1_SIGNATURE_HEX3: &str = "30450220658fc9271b09bd53edf3a5bd31b7bd99bd3c3de7859cd8dd1133e76ed44fcb580221009e43d091911de0fc90d22960517211f5cf6c624b326759e219326f3af807ac31"; // Test data originally from https://github.com/cosmos/cosmjs/blob/v0.24.0-alpha.22/packages/crypto/src/secp256k1.spec.ts#L195-L394 const COSMOS_SECP256R1_TESTS_JSON: &str = "./testdata/secp256r1_tests.json"; @@ -165,7 +146,8 @@ mod tests { // Note: the signature type must be annotated or otherwise inferrable as // `Signer` has many impls of the `Signer` trait (for both regular and // recoverable signature types). - let signature: Signature = secret_key.sign_digest(message_digest); + let (signature, _recovery_id): (Signature, RecoveryId) = + secret_key.sign_digest(message_digest); let public_key = VerifyingKey::from(&secret_key); // Serialize with `::to_encoded_point()` @@ -205,73 +187,74 @@ mod tests { .unwrap()); } - // #[test] - // fn test_cosmos_secp256r1_verify() { - // let public_key = hex::decode(COSMOS_SECP256R1_PUBKEY_HEX).unwrap(); - - // for ((i, msg), sig) in (1..) - // .zip(&[ - // COSMOS_SECP256R1_MSG_HEX1, - // //COSMOS_SECP256R1_MSG_HEX2, - // //COSMOS_SECP256R1_MSG_HEX3, - // ]) - // .zip(&[ - // COSMOS_SECP256R1_SIGNATURE_HEX1, - // //COSMOS_SECP256R1_SIGNATURE_HEX2, - // //COSMOS_SECP256R1_SIGNATURE_HEX3, - // ]) - // { - // let message = hex::decode(msg).unwrap(); - // let signature = hex::decode(sig).unwrap(); - - // // Explicit hash - // let message_hash = Sha256::digest(&message); - - // // secp256r1_verify works - // let valid = secp256r1_verify(&message_hash, &signature, &public_key).unwrap(); - // assert!(valid, "secp256r1_verify() failed (test case {i})",); - // } - // } - - // #[test] - // fn test_cosmos_extra_secp256r1_verify() { - // use std::fs::File; - // use std::io::BufReader; - - // use serde::Deserialize; - - // #[derive(Deserialize, Debug)] - // struct Encoded { - // message: String, - // message_hash: String, - // signature: String, - // #[serde(rename = "pubkey")] - // public_key: String, - // } - - // // Open the file in read-only mode with buffer. - // let file = File::open(COSMOS_SECP256R1_TESTS_JSON).unwrap(); - // let reader = BufReader::new(file); - - // let codes: Vec = serde_json::from_reader(reader).unwrap(); - - // for (i, encoded) in (1..).zip(codes) { - // let message = hex::decode(&encoded.message).unwrap(); - - // let hash = hex::decode(&encoded.message_hash).unwrap(); - // let message_hash = Sha256::digest(&message); - // assert_eq!(hash.as_slice(), message_hash.as_slice()); - - // let signature = hex::decode(&encoded.signature).unwrap(); - - // let public_key = hex::decode(&encoded.public_key).unwrap(); - - // // secp256r1_verify() works - // let valid = secp256r1_verify(&message_hash, &signature, &public_key).unwrap(); - // assert!( - // valid, - // "secp256r1_verify failed (test case {i} in {COSMOS_SECP256R1_TESTS_JSON})" - // ); - // } - // } + #[test] + fn test_cosmos_secp256r1_verify() { + let public_key = hex::decode(COSMOS_SECP256R1_PUBKEY_HEX).unwrap(); + + for ((i, msg), sig) in (1..) + .zip(&[ + COSMOS_SECP256R1_MSG_HEX1, + //COSMOS_SECP256R1_MSG_HEX2, + //COSMOS_SECP256R1_MSG_HEX3, + ]) + .zip(&[ + COSMOS_SECP256R1_SIGNATURE_HEX1, + //COSMOS_SECP256R1_SIGNATURE_HEX2, + //COSMOS_SECP256R1_SIGNATURE_HEX3, + ]) + { + let message = hex::decode(msg).unwrap(); + let signature = hex::decode(sig).unwrap(); + + // Explicit hash + let message_hash = Sha256::digest(&message); + + // secp256r1_verify works + let valid = secp256r1_verify(&message_hash, &signature, &public_key).unwrap(); + assert!(valid, "secp256r1_verify() failed (test case {i})",); + } + } + + #[test] + #[ignore] + fn test_cosmos_extra_secp256r1_verify() { + use std::fs::File; + use std::io::BufReader; + + use serde::Deserialize; + + #[derive(Deserialize, Debug)] + struct Encoded { + message: String, + message_hash: String, + signature: String, + #[serde(rename = "pubkey")] + public_key: String, + } + + // Open the file in read-only mode with buffer. + let file = File::open(COSMOS_SECP256R1_TESTS_JSON).unwrap(); + let reader = BufReader::new(file); + + let codes: Vec = serde_json::from_reader(reader).unwrap(); + + for (i, encoded) in (1..).zip(codes) { + let message = hex::decode(&encoded.message).unwrap(); + + let hash = hex::decode(&encoded.message_hash).unwrap(); + let message_hash = Sha256::digest(&message); + assert_eq!(hash.as_slice(), message_hash.as_slice()); + + let signature = hex::decode(&encoded.signature).unwrap(); + + let public_key = hex::decode(&encoded.public_key).unwrap(); + + // secp256r1_verify() works + let valid = secp256r1_verify(&message_hash, &signature, &public_key).unwrap(); + assert!( + valid, + "secp256r1_verify failed (test case {i} in {COSMOS_SECP256R1_TESTS_JSON})" + ); + } + } } From 26b9e69fa2888c932e46bb7b3f1bf715ccc3a23d Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Sun, 7 Jan 2024 19:05:46 +0100 Subject: [PATCH 1133/2372] Add valid test vectors for secp256r1 verification --- packages/crypto/src/secp256r1.rs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/crypto/src/secp256r1.rs b/packages/crypto/src/secp256r1.rs index 7dc7856c36..adc51ed944 100644 --- a/packages/crypto/src/secp256r1.rs +++ b/packages/crypto/src/secp256r1.rs @@ -120,16 +120,19 @@ mod tests { // Cosmos secp256r1 signature verification // tendermint/PubKeySecp256r1 pubkey + // ECDSA/P-256 test vectors adapted from the FIPS 186-4 ECDSA test vectors. + // (P-256, SHA-256, from `SigGen.txt` in `186-4ecdsatestvectors.zip`) + // const COSMOS_SECP256R1_PUBKEY_HEX: &str = - "049a2c7b27b132246e170dfb9167db5c5bd302033dbece2bc3f2541a6cd11851821a775f1fc6c4f89e0d019888057f0d574f1c4eb1f90a7a41c4ea9b99b538d932"; + "041ccbe91c075fc7f4f033bfa248db8fccd3565de94bbfb12f3c59ff46c271bf83ce4014c68811f9a21a1fdb2c0e6113e06db7ca93b7404e78dc7ccd5ca89a4ca9"; - const COSMOS_SECP256R1_MSG_HEX1: &str = "6265206b696e64"; - // const COSMOS_SECP256R1_MSG_HEX2: &str = "6265206b696e64"; - // const COSMOS_SECP256R1_MSG_HEX3: &str = "6265206b696e64"; + const COSMOS_SECP256R1_MSG_HEX1: &str = "5905238877c77421f73e43ee3da6f2d9e2ccad5fc942dcec0cbd25482935faaf416983fe165b1a045ee2bcd2e6dca3bdf46c4310a7461f9a37960ca672d3feb5473e253605fb1ddfd28065b53cb5858a8ad28175bf9bd386a5e471ea7a65c17cc934a9d791e91491eb3754d03799790fe2d308d16146d5c9b0d0debd97d79ce8"; + // const COSMOS_SECP256R1_MSG_HEX2: &str = ""; + // const COSMOS_SECP256R1_MSG_HEX3: &str = ""; - const COSMOS_SECP256R1_SIGNATURE_HEX1: &str = "453020029250fb9eb22b21b881319a123244e463a329356b75ce804fc2dda174e715104621028d009abee7d523894b425d974bc38cfae5d05cdf5a550c8eceae1f20f0c9913f0038"; - // const COSMOS_SECP256R1_SIGNATURE_HEX2: &str = "30450220658fc9271b09bd53edf3a5bd31b7bd99bd3c3de7859cd8dd1133e76ed44fcb580221009e43d091911de0fc90d22960517211f5cf6c624b326759e219326f3af807ac31"; - // const COSMOS_SECP256R1_SIGNATURE_HEX3: &str = "30450220658fc9271b09bd53edf3a5bd31b7bd99bd3c3de7859cd8dd1133e76ed44fcb580221009e43d091911de0fc90d22960517211f5cf6c624b326759e219326f3af807ac31"; + const COSMOS_SECP256R1_SIGNATURE_HEX1: &str = "f3ac8061b514795b8843e3d6629527ed2afd6b1f6a555a7acabb5e6f79c8c2ac8bf77819ca05a6b2786c76262bf7371cef97b218e96f175a3ccdda2acc058903"; + // const COSMOS_SECP256R1_SIGNATURE_HEX2: &str = ""; + // const COSMOS_SECP256R1_SIGNATURE_HEX3: &str = ""; // Test data originally from https://github.com/cosmos/cosmjs/blob/v0.24.0-alpha.22/packages/crypto/src/secp256k1.spec.ts#L195-L394 const COSMOS_SECP256R1_TESTS_JSON: &str = "./testdata/secp256r1_tests.json"; From f34226fdd83b553d2c16b82eeb2ccb3e6f9d2c24 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Sun, 7 Jan 2024 19:23:57 +0100 Subject: [PATCH 1134/2372] Add a couple more test vectors --- packages/crypto/src/secp256r1.rs | 37 ++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/packages/crypto/src/secp256r1.rs b/packages/crypto/src/secp256r1.rs index adc51ed944..943347e6b0 100644 --- a/packages/crypto/src/secp256r1.rs +++ b/packages/crypto/src/secp256r1.rs @@ -118,21 +118,22 @@ mod tests { // For generic signature verification const MSG: &str = "Hello World!"; - // Cosmos secp256r1 signature verification - // tendermint/PubKeySecp256r1 pubkey - // ECDSA/P-256 test vectors adapted from the FIPS 186-4 ECDSA test vectors. - // (P-256, SHA-256, from `SigGen.txt` in `186-4ecdsatestvectors.zip`) + // Cosmos secp256r1 signature verification. Matches tendermint/PubKeySecp256r1 pubkey format. + // ECDSA/P-256 test vectors adapted from the FIPS 186-4 ECDSA test vectors (P-256, SHA-256, from + // `SigGen.txt` in `186-4ecdsatestvectors.zip`). // - const COSMOS_SECP256R1_PUBKEY_HEX: &str = + const COSMOS_SECP256R1_PUBKEY_HEX1: &str = "041ccbe91c075fc7f4f033bfa248db8fccd3565de94bbfb12f3c59ff46c271bf83ce4014c68811f9a21a1fdb2c0e6113e06db7ca93b7404e78dc7ccd5ca89a4ca9"; + const COSMOS_SECP256R1_PUBKEY_HEX2: &str = "04e266ddfdc12668db30d4ca3e8f7749432c416044f2d2b8c10bf3d4012aeffa8abfa86404a2e9ffe67d47c587ef7a97a7f456b863b4d02cfc6928973ab5b1cb39"; + const COSMOS_SECP256R1_PUBKEY_HEX3: &str = "0474ccd8a62fba0e667c50929a53f78c21b8ff0c3c737b0b40b1750b2302b0bde829074e21f3a0ef88b9efdf10d06aa4c295cc1671f758ca0e4cd108803d0f2614"; const COSMOS_SECP256R1_MSG_HEX1: &str = "5905238877c77421f73e43ee3da6f2d9e2ccad5fc942dcec0cbd25482935faaf416983fe165b1a045ee2bcd2e6dca3bdf46c4310a7461f9a37960ca672d3feb5473e253605fb1ddfd28065b53cb5858a8ad28175bf9bd386a5e471ea7a65c17cc934a9d791e91491eb3754d03799790fe2d308d16146d5c9b0d0debd97d79ce8"; - // const COSMOS_SECP256R1_MSG_HEX2: &str = ""; - // const COSMOS_SECP256R1_MSG_HEX3: &str = ""; + const COSMOS_SECP256R1_MSG_HEX2: &str = "c35e2f092553c55772926bdbe87c9796827d17024dbb9233a545366e2e5987dd344deb72df987144b8c6c43bc41b654b94cc856e16b96d7a821c8ec039b503e3d86728c494a967d83011a0e090b5d54cd47f4e366c0912bc808fbb2ea96efac88fb3ebec9342738e225f7c7c2b011ce375b56621a20642b4d36e060db4524af1"; + const COSMOS_SECP256R1_MSG_HEX3: &str = "3c054e333a94259c36af09ab5b4ff9beb3492f8d5b4282d16801daccb29f70fe61a0b37ffef5c04cd1b70e85b1f549a1c4dc672985e50f43ea037efa9964f096b5f62f7ffdf8d6bfb2cc859558f5a393cb949dbd48f269343b5263dcdb9c556eca074f2e98e6d94c2c29a677afaf806edf79b15a3fcd46e7067b7669f83188ee"; const COSMOS_SECP256R1_SIGNATURE_HEX1: &str = "f3ac8061b514795b8843e3d6629527ed2afd6b1f6a555a7acabb5e6f79c8c2ac8bf77819ca05a6b2786c76262bf7371cef97b218e96f175a3ccdda2acc058903"; - // const COSMOS_SECP256R1_SIGNATURE_HEX2: &str = ""; - // const COSMOS_SECP256R1_SIGNATURE_HEX3: &str = ""; + const COSMOS_SECP256R1_SIGNATURE_HEX2: &str = "976d3a4e9d23326dc0baa9fa560b7c4e53f42864f508483a6473b6a11079b2db1b766e9ceb71ba6c01dcd46e0af462cd4cfa652ae5017d4555b8eeefe36e1932"; + const COSMOS_SECP256R1_SIGNATURE_HEX3: &str = "35fb60f5ca0f3ca08542fb3cc641c8263a2cab7a90ee6a5e1583fac2bb6f6bd1ee59d81bc9db1055cc0ed97b159d8784af04e98511d0a9a407b99bb292572e96"; // Test data originally from https://github.com/cosmos/cosmjs/blob/v0.24.0-alpha.22/packages/crypto/src/secp256k1.spec.ts#L195-L394 const COSMOS_SECP256R1_TESTS_JSON: &str = "./testdata/secp256r1_tests.json"; @@ -192,20 +193,24 @@ mod tests { #[test] fn test_cosmos_secp256r1_verify() { - let public_key = hex::decode(COSMOS_SECP256R1_PUBKEY_HEX).unwrap(); - - for ((i, msg), sig) in (1..) + for (((i, pk), msg), sig) in (1..) + .zip(&[ + COSMOS_SECP256R1_PUBKEY_HEX1, + COSMOS_SECP256R1_PUBKEY_HEX2, + COSMOS_SECP256R1_PUBKEY_HEX3, + ]) .zip(&[ COSMOS_SECP256R1_MSG_HEX1, - //COSMOS_SECP256R1_MSG_HEX2, - //COSMOS_SECP256R1_MSG_HEX3, + COSMOS_SECP256R1_MSG_HEX2, + COSMOS_SECP256R1_MSG_HEX3, ]) .zip(&[ COSMOS_SECP256R1_SIGNATURE_HEX1, - //COSMOS_SECP256R1_SIGNATURE_HEX2, - //COSMOS_SECP256R1_SIGNATURE_HEX3, + COSMOS_SECP256R1_SIGNATURE_HEX2, + COSMOS_SECP256R1_SIGNATURE_HEX3, ]) { + let public_key = hex::decode(pk).unwrap(); let message = hex::decode(msg).unwrap(); let signature = hex::decode(sig).unwrap(); From 0e8b076af4e3de7043acab8c626967f6e2ad8afd Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Sun, 7 Jan 2024 19:26:05 +0100 Subject: [PATCH 1135/2372] Improve comments for consistency --- packages/crypto/src/secp256k1.rs | 4 ++-- packages/crypto/src/secp256r1.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/crypto/src/secp256k1.rs b/packages/crypto/src/secp256k1.rs index d77f71181d..2b0d8dce2f 100644 --- a/packages/crypto/src/secp256k1.rs +++ b/packages/crypto/src/secp256k1.rs @@ -10,6 +10,7 @@ use crate::identity_digest::Identity256; /// Max length of a message hash for secp256k1 verification in bytes. /// This is typically a 32 byte output of e.g. SHA-256 or Keccak256. In theory shorter values /// are possible but currently not supported by the implementation. Let us know when you need them. +// TODO: Move these to their own module for generality pub const MESSAGE_HASH_MAX_LEN: usize = 32; /// ECDSA (secp256k1) parameters @@ -191,8 +192,7 @@ mod tests { // For generic signature verification const MSG: &str = "Hello World!"; - // Cosmos secp256k1 signature verification - // tendermint/PubKeySecp256k1 pubkey + // "Cosmos" secp256k1 signature verification. Matches tendermint/PubKeySecp256k1 pubkey. const COSMOS_SECP256K1_PUBKEY_HEX: &str = "034f04181eeba35391b858633a765c4a0c189697b40d216354d50890d350c70290"; diff --git a/packages/crypto/src/secp256r1.rs b/packages/crypto/src/secp256r1.rs index 943347e6b0..88fc1feb6f 100644 --- a/packages/crypto/src/secp256r1.rs +++ b/packages/crypto/src/secp256r1.rs @@ -118,7 +118,7 @@ mod tests { // For generic signature verification const MSG: &str = "Hello World!"; - // Cosmos secp256r1 signature verification. Matches tendermint/PubKeySecp256r1 pubkey format. + // "Cosmos" secp256r1 signature verification. Matches tendermint/PubKeySecp256r1 pubkey format. // ECDSA/P-256 test vectors adapted from the FIPS 186-4 ECDSA test vectors (P-256, SHA-256, from // `SigGen.txt` in `186-4ecdsatestvectors.zip`). // From a4bcab134a08d0e3b9159fd2b8b65b2dc6a9cbc9 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Sun, 7 Jan 2024 20:10:24 +0100 Subject: [PATCH 1136/2372] Add extra secp256r1 tests --- packages/crypto/src/secp256r1.rs | 5 - packages/crypto/testdata/secp256r1_tests.json | 135 ++++++------------ 2 files changed, 45 insertions(+), 95 deletions(-) diff --git a/packages/crypto/src/secp256r1.rs b/packages/crypto/src/secp256r1.rs index 88fc1feb6f..7d4177afb9 100644 --- a/packages/crypto/src/secp256r1.rs +++ b/packages/crypto/src/secp256r1.rs @@ -224,7 +224,6 @@ mod tests { } #[test] - #[ignore] fn test_cosmos_extra_secp256r1_verify() { use std::fs::File; use std::io::BufReader; @@ -234,7 +233,6 @@ mod tests { #[derive(Deserialize, Debug)] struct Encoded { message: String, - message_hash: String, signature: String, #[serde(rename = "pubkey")] public_key: String, @@ -248,10 +246,7 @@ mod tests { for (i, encoded) in (1..).zip(codes) { let message = hex::decode(&encoded.message).unwrap(); - - let hash = hex::decode(&encoded.message_hash).unwrap(); let message_hash = Sha256::digest(&message); - assert_eq!(hash.as_slice(), message_hash.as_slice()); let signature = hex::decode(&encoded.signature).unwrap(); diff --git a/packages/crypto/testdata/secp256r1_tests.json b/packages/crypto/testdata/secp256r1_tests.json index edb4c15b9a..37cec7b2e2 100644 --- a/packages/crypto/testdata/secp256r1_tests.json +++ b/packages/crypto/testdata/secp256r1_tests.json @@ -1,122 +1,77 @@ [ { - "message": "5c868fedb8026979ebd26f1ba07c27eedf4ff6d10443505a96ecaf21ba8c4f0937b3cd23ffdc3dd429d4cd1905fb8dbcceeff1350020e18b58d2ba70887baa3a9b783ad30d3fbf210331cdd7df8d77defa398cdacdfc2e359c7ba4cae46bb74401deb417f8b912a1aa966aeeba9c39c7dd22479ae2b30719dca2f2206c5eb4b7", - "message_hash": "5ae8317d34d1e595e3fa7247db80c0af4320cce1116de187f8f7e2e099c0d8d0", - "signature": "207082eb2c3dfa0b454e0906051270ba4074ac93760ba9e7110cd9471475111151eb0dbbc9920e72146fb564f99d039802bf6ef2561446eb126ef364d21ee9c4", - "pubkey": "04051c1ee2190ecfb174bfe4f90763f2b4ff7517b70a2aec1876ebcfd644c4633fb03f3cfbd94b1f376e34592d9d41ccaf640bb751b00a1fadeb0c01157769eb73" + "message": "5905238877c77421f73e43ee3da6f2d9e2ccad5fc942dcec0cbd25482935faaf416983fe165b1a045ee2bcd2e6dca3bdf46c4310a7461f9a37960ca672d3feb5473e253605fb1ddfd28065b53cb5858a8ad28175bf9bd386a5e471ea7a65c17cc934a9d791e91491eb3754d03799790fe2d308d16146d5c9b0d0debd97d79ce8", + "pubkey": "041ccbe91c075fc7f4f033bfa248db8fccd3565de94bbfb12f3c59ff46c271bf83ce4014c68811f9a21a1fdb2c0e6113e06db7ca93b7404e78dc7ccd5ca89a4ca9", + "signature": "f3ac8061b514795b8843e3d6629527ed2afd6b1f6a555a7acabb5e6f79c8c2ac8bf77819ca05a6b2786c76262bf7371cef97b218e96f175a3ccdda2acc058903" }, { - "message": "17cd4a74d724d55355b6fb2b0759ca095298e3fd1856b87ca1cb2df5409058022736d21be071d820b16dfc441be97fbcea5df787edc886e759475469e2128b22f26b82ca993be6695ab190e673285d561d3b6d42fcc1edd6d12db12dcda0823e9d6079e7bc5ff54cd452dad308d52a15ce9c7edd6ef3dad6a27becd8e001e80f", - "message_hash": "586052916fb6f746e1d417766cceffbe1baf95579bab67ad49addaaa6e798862", - "signature": "626d61b7be1488b563e8a85bfb623b2331903964b5c0476c9f9ad29144f076fe2002a2c0ab5e48626bf761cf677dfeede9c7309d2436d4b8c2b89f21ee2ebc6a", - "pubkey": "04ff28290d214a783da7d76098b632c387b3dd5fd33677df8ca7109e3c941e5df2e5a6530c0bb58fbba14ecbc3d76a2a3d5017c66fc260f9214a028b8b3a7b2dce" + "message": "c35e2f092553c55772926bdbe87c9796827d17024dbb9233a545366e2e5987dd344deb72df987144b8c6c43bc41b654b94cc856e16b96d7a821c8ec039b503e3d86728c494a967d83011a0e090b5d54cd47f4e366c0912bc808fbb2ea96efac88fb3ebec9342738e225f7c7c2b011ce375b56621a20642b4d36e060db4524af1", + "pubkey": "04e266ddfdc12668db30d4ca3e8f7749432c416044f2d2b8c10bf3d4012aeffa8abfa86404a2e9ffe67d47c587ef7a97a7f456b863b4d02cfc6928973ab5b1cb39", + "signature": "976d3a4e9d23326dc0baa9fa560b7c4e53f42864f508483a6473b6a11079b2db1b766e9ceb71ba6c01dcd46e0af462cd4cfa652ae5017d4555b8eeefe36e1932" }, { - "message": "db0d31717b04802adbbae1997487da8773440923c09b869e12a57c36dda34af11b8897f266cd81c02a762c6b74ea6aaf45aaa3c52867eb8f270f5092a36b498f88b65b2ebda24afe675da6f25379d1e194d093e7a2f66e450568dbdffebff97c4597a00c96a5be9ba26deefcca8761c1354429622c8db269d6a0ec0cc7a8585c", - "message_hash": "c36d0ecf4bfd178835c97aae7585f6a87de7dfa23cc927944f99a8d60feff68b", - "signature": "83de9be443bcf480892b8c8ca1d5ee65c79a315642c3f7b5305aff3065fda2789747932122b93cec42cad8ee4630a8f6cbe127578b8c495b4ab927275f657658", - "pubkey": "048f83776cbb355dbe59756c6b3d9b40a3470b6c64d49d9361a73bafcc1e7ba69beb05acb126fc4358b3c7008e1e864b4327086157412a84700d82672de27cb627" + "message": "3c054e333a94259c36af09ab5b4ff9beb3492f8d5b4282d16801daccb29f70fe61a0b37ffef5c04cd1b70e85b1f549a1c4dc672985e50f43ea037efa9964f096b5f62f7ffdf8d6bfb2cc859558f5a393cb949dbd48f269343b5263dcdb9c556eca074f2e98e6d94c2c29a677afaf806edf79b15a3fcd46e7067b7669f83188ee", + "pubkey": "0474ccd8a62fba0e667c50929a53f78c21b8ff0c3c737b0b40b1750b2302b0bde829074e21f3a0ef88b9efdf10d06aa4c295cc1671f758ca0e4cd108803d0f2614", + "signature": "35fb60f5ca0f3ca08542fb3cc641c8263a2cab7a90ee6a5e1583fac2bb6f6bd1ee59d81bc9db1055cc0ed97b159d8784af04e98511d0a9a407b99bb292572e96" }, { - "message": "47c9deddfd8c841a63a99be96e972e40fa035ae10d929babfc86c437b9d5d495577a45b7f8a35ce3f880e7d8ae8cd8eb685cf41f0506e68046ccf5559232c674abb9c3683829dcc8002683c4f4ca3a29a7bfde20d96dd0f1a0ead847dea18f297f220f94932536ca4deacedc2c6701c3ee50e28e358dcc54cdbf69daf0eb87f6", - "message_hash": "a761293b02c5d8327f909d61a38173556c1f1f770c488810a9b360cf7786c148", - "signature": "723da69da81c8f6b081a9a728b9bba785d2067e0ed769675f8a7563d22ed8a163a993793cf39b96b3cd625df0e06f206e17579cd8ebcb7e704174c3d94dba684", - "pubkey": "0429b0c44bd3887a9ab60fd1c9bb81c9ab421e51b4736cedfa75e4cf960e6098315eab750d173d20842dfdebf861ea7898fdea0527211f8c86f31d9d48b6b65e63" + "message": "0989122410d522af64ceb07da2c865219046b4c3d9d99b01278c07ff63eaf1039cb787ae9e2dd46436cc0415f280c562bebb83a23e639e476a02ec8cff7ea06cd12c86dcc3adefbf1a9e9a9b6646c7599ec631b0da9a60debeb9b3e19324977f3b4f36892c8a38671c8e1cc8e50fcd50f9e51deaf98272f9266fc702e4e57c30", + "pubkey": "04322f80371bf6e044bc49391d97c1714ab87f990b949bc178cb7c43b7c22d89e13c15d54a5cc6b9f09de8457e873eb3deb1fceb54b0b295da6050294fae7fd999", + "signature": "d7c562370af617b581c84a2468cc8bd50bb1cbf322de41b7887ce07c0e5884cab46d9f2d8c4bf83546ff178f1d78937c008d64e8ecc5cbb825cb21d94d670d89" }, { - "message": "f15433188c2bbc93b2150bb2f34d36ba8ae49f8f7e4e81aed651c8fb2022b2a7e851c4dbbbc21c14e27380316bfdebb0a049246349537dba687581c1344e40f75afd2735bb21ea074861de6801d28b22e8beb76fdd25598812b2061ca3fba229daf59a4ab416704543b02e16b8136c22acc7e197748ae19b5cbbc160fdc3a8cd", - "message_hash": "08ec76ab0f1bc9dc27b3b3bd4f949c60ecc8bbf27678b28f2ee8de055ee8bf59", - "signature": "0e0c5228e6783bee4d0406f4f7b7d79f705f0dbb55126966f79e631bd8b23079faae33aec5b0fafd3413c14bfdef9c7c9ac6abd06c923c48ab136a2c56826118", - "pubkey": "04441ef6e211e3fa6cffce9d34b4765487bc0d98d95b21ccfaeef42d7de2fef9a57886a20b6b10f97f5d05caa904ca3e287b92955658566639031e67cd243d8657" + "message": "dc66e39f9bbfd9865318531ffe9207f934fa615a5b285708a5e9c46b7775150e818d7f24d2a123df3672fff2094e3fd3df6fbe259e3989dd5edfcccbe7d45e26a775a5c4329a084f057c42c13f3248e3fd6f0c76678f890f513c32292dd306eaa84a59abe34b16cb5e38d0e885525d10336ca443e1682aa04a7af832b0eee4e7", + "pubkey": "041bcec4570e1ec2436596b8ded58f60c3b1ebc6a403bc5543040ba829630572448af62a4c683f096b28558320737bf83b9959a46ad2521004ef74cf85e67494e1", + "signature": "18caaf7b663507a8bcd992b836dec9dc5703c080af5e51dfa3a9a7c38718260477c68928ac3b88d985fb43fb615fb7ff45c18ba5c81af796c613dfa98352d29c" }, { - "message": "1bc796124b87793b7f7fdd53b896f8f0d0f2d2be36d1944e3c2a0ac5c6b2839f59a4b4fad200f8035ec98630c51ef0d40863a5ddd69b703d73f06b4afae8ad1a88e19b1b26e8c10b7bff953c05eccc82fd771b220910165f3a906b7c931683e431998d1fd06c32dd11b4f872bf980d547942f22124c7e50c9523321aee23a36d", - "message_hash": "ffbe3fd342a1a991848d02258cf5e3df301974b7a8f0fe10a88222a9503f67e0", - "signature": "b9d3962edadc893f8eeff379f136c7b8fc6ea824a5afc6cbda7e3cb4c7a1e860bb1c1f901cf450edfdce20686352bb0cf0a643301123140ec87c92480d7f9d6a", - "pubkey": "04ad98fbf6748401963e4c732b0ba4c4b5016f1d87935c5edf84b55c38b28eb3cf35f91b470e007cc5f5c2e12c9b8725bc92a6feb259968436881c72906a14ca84" + "message": "600974e7d8c5508e2c1aab0783ad0d7c4494ab2b4da265c2fe496421c4df238b0be25f25659157c8a225fb03953607f7df996acfd402f147e37aee2f1693e3bf1c35eab3ae360a2bd91d04622ea47f83d863d2dfecb618e8b8bdc39e17d15d672eee03bb4ce2cc5cf6b217e5faf3f336fdd87d972d3a8b8a593ba85955cc9d71", + "pubkey": "04a32e50be3dae2c8ba3f5e4bdae14cf7645420d425ead94036c22dd6c4fc59e00d623bf641160c289d6742c6257ae6ba574446dd1d0e74db3aaa80900b78d4ae9", + "signature": "8524c5024e2d9a73bde8c72d9129f57873bbad0ed05215a372a84fdbc78f2e68d18c2caf3b1072f87064ec5e8953f51301cada03469c640244760328eb5a05cb" }, { - "message": "18e55ac264031da435b613fc9dc6c4aafc49aae8ddf6f220d523415896ff915fae5c5b2e6aed61d88e5721823f089c46173afc5d9b47fd917834c85284f62dda6ed2d7a6ff10eb553b9312b05dad7decf7f73b69479c02f14ea0a2aa9e05ec07396cd37c28795c90e590631137102315635d702278e352aa41d0826adadff5e1", - "message_hash": "434fea583df79f781e41f18735a24409cf404f28e930290cc97c67ef158e5789", - "signature": "9369ab86afae5e22ed5f4012964804d2a19c36b8b58cf2855205b1cfcc937422a27dfc38d899b78edcf38a1b2b53578e72270b083d7d69424c4b4a7d25d39f4d", - "pubkey": "04061d7152dc6263a6764c6e810ee02f6333c844d90d70043b2bb6d4efacfac78e4391f7f17063bd69bd0d19061cc09eeb429561f3d88a3b38019ac82ca152c35c" + "message": "dfa6cb9b39adda6c74cc8b2a8b53a12c499ab9dee01b4123642b4f11af336a91a5c9ce0520eb2395a6190ecbf6169c4cba81941de8e76c9c908eb843b98ce95e0da29c5d4388040264e05e07030a577cc5d176387154eabae2af52a83e85c61c7c61da930c9b19e45d7e34c8516dc3c238fddd6e450a77455d534c48a152010b", + "pubkey": "048bcfe2a721ca6d753968f564ec4315be4857e28bef1908f61a366b1f03c974790f67576a30b8e20d4232d8530b52fb4c89cbc589ede291e499ddd15fe870ab96", + "signature": "c5a186d72df452015480f7f338970bfe825087f05c0088d95305f87aacc9b25484a58f9e9d9e735344b316b1aa1ab5185665b85147dc82d92e969d7bee31ca30" }, { - "message": "a5290666c97294d090f8da898e555cbd33990579e5e95498444bfb318b4aa1643e0d4348425e21c7c6f99f9955f3048f56c22b68c4a516af5c90ed5268acc9c5a20fec0200c2a282a90e20d3c46d4ecdda18ba18b803b19263de2b79238da921707a0864799cdee9f02913b40681c02c6923070688844b58fe415b7d71ea6845", - "message_hash": "c352f58e118fc0d7810b8020bdb306b7dc115b41bbb0b642c7ea73a60cc2a4eb", - "signature": "c5e439cef76b28dc0fe9d260763bec05b5e795ac8d90b25d9fccbc1918bc32f31b06144e6b191224d5eda822a5b3b2026af6aa7f25a9061c9e81c312728aa94a", - "pubkey": "043eab98ab69bca21ad18136a092a4f398cb0a7d34c4bf18bbe9c81bdfce3dde752f8a82a4c1cbe5535d4acd9218ba6df4a96db88963d36108d562795473dedeae" + "message": "51d2547cbff92431174aa7fc7302139519d98071c755ff1c92e4694b58587ea560f72f32fc6dd4dee7d22bb7387381d0256e2862d0644cdf2c277c5d740fa089830eb52bf79d1e75b8596ecf0ea58a0b9df61e0c9754bfcd62efab6ea1bd216bf181c5593da79f10135a9bc6e164f1854bc8859734341aad237ba29a81a3fc8b", + "pubkey": "04a88bc8430279c8c0400a77d751f26c0abc93e5de4ad9a4166357952fe041e7672d365a1eef25ead579cc9a069b6abc1b16b81c35f18785ce26a10ba6d1381185", + "signature": "9d0c6afb6df3bced455b459cc21387e14929392664bb8741a3693a1795ca6902d7f9ddd191f1f412869429209ee3814c75c72fa46a9cccf804a2f5cc0b7e739f" }, { - "message": "13ad0600229c2a66b2f11617f69c7210ad044c49265dc98ec3c64f56e56a083234d277d404e2c40523c414ad23af5cc2f91a47fe59e7ca572f7fe1d3d3cfceaedadac4396749a292a38e92727273272335f12b2acea21cf069682e67d7e7d7a31ab5bb8e472298a9451aeae6f160f36e6623c9b632b9c93371a002818addc243", - "message_hash": "6ff9153ede285fc0e486f1dd4dd9e32a0fb23e9653c55841b67c2e5a090aac63", - "signature": "ee8615a5fab6fc674e6d3d9cde8da2b18dece076ae94d96662e16109db12d7203171705cdab2b3d34c58e556c80358c105807e98243f5754b70b771071308b94", - "pubkey": "042aaf49401b01083bf0657a379530f1b2b5db414e3fe91fca07048c89df05a4dae584ef2fe20d2f3293ff46df73155a76218349336977250055dc9ae7f28e57e0" + "message": "558c2ac13026402bad4a0a83ebc9468e50f7ffab06d6f981e5db1d082098065bcff6f21a7a74558b1e8612914b8b5a0aa28ed5b574c36ac4ea5868432a62bb8ef0695d27c1e3ceaf75c7b251c65ddb268696f07c16d2767973d85beb443f211e6445e7fe5d46f0dce70d58a4cd9fe70688c035688ea8c6baec65a5fc7e2c93e8", + "pubkey": "041bc487570f040dc94196c9befe8ab2b6de77208b1f38bdaae28f9645c4d2bc3aec81602abd8345e71867c8210313737865b8aa186851e1b48eaca140320f5d8f", + "signature": "2f9e2b4e9f747c657f705bffd124ee178bbc5391c86d056717b140c153570fd9f5413bfd85949da8d83de83ab0d19b2986613e224d1901d76919de23ccd03199" }, { - "message": "51ad843da5eafc177d49a50a82609555e52773c5dfa14d7c02db5879c11a6b6e2e0860df38452dc579d763f91a83ade23b73f4fcbd703f35dd6ecfbb4c9578d5b604ed809c8633e6ac5679a5f742ce94fea3b97b5ba8a29ea28101a7b35f9eaa894dda54e3431f2464d18faf8342b7c59dfe0598c0ab29a14622a08eea70126b", - "message_hash": "8e19143e34fee546fab3d56e816f2e21586e27912a2ad7d80af75942e0ff585a", - "signature": "f753c447161aa3a58e5deeca31797f21484fb0ec3a7fe6e464ab1914896f253b99640fbcce1f25fd66744b046e0dfd57fa23070555f438af6c5e5828d47e9fa7", - "pubkey": "048c59a63c27b0b4e1e1b67f6e97180d5fa679791cde6af650271a274c369361421b42e36a7029f8982d346264f81f46cbc2e8c823568b2ad15649794fc835f87e" + "message": "4d55c99ef6bd54621662c3d110c3cb627c03d6311393b264ab97b90a4b15214a5593ba2510a53d63fb34be251facb697c973e11b665cb7920f1684b0031b4dd370cb927ca7168b0bf8ad285e05e9e31e34bc24024739fdc10b78586f29eff94412034e3b606ed850ec2c1900e8e68151fc4aee5adebb066eb6da4eaa5681378e", + "pubkey": "04b8188bd68701fc396dab53125d4d28ea33a91daf6d21485f4770f6ea8c565dde423f058810f277f8fe076f6db56e9285a1bf2c2a1dae145095edd9c04970bc4a", + "signature": "1cc628533d0004b2b20e7f4baad0b8bb5e0673db159bbccf92491aef61fc9620880e0bbf82a8cf818ed46ba03cf0fc6c898e36fca36cc7fdb1d2db7503634430" }, { - "message": "678b505467d55ce01aec23fd4851957137c3a1de3ff2c673ec95a577aa9fb011b4b4a8eb7a0e6f391d4236a35b7e769692ace5851d7c53700e180fa522d3d37dbaa496163f3de6d96391e38ff83271e621f2458729ff74de462cdce6b3029f308d4eb8aef036357b9de06d68558e0388a6e88af91340c875050b8c91c4e26fc8", - "message_hash": "6fe86a3b533114e1db444217999ce5907237e69acc47cfb8d30b4e14ee58817a", - "signature": "439fd0423bde36a1616a6fa4343bb7e07a6b3f6dc629aa8c93c91831055e476c20998a26ae4b96ef36d48d83e8af0288f0bbc2db5ca5c8271a42f3fdc478fcb2", - "pubkey": "04817e21214a40f8135e2053656dc3d9a66eade80f9428f347d11ea249095e9513df446f64d7db0e8161fc1c03c60ddae5d73a8d80ad134600acefc06b3c8c9eda" + "message": "f8248ad47d97c18c984f1f5c10950dc1404713c56b6ea397e01e6dd925e903b4fadfe2c9e877169e71ce3c7fe5ce70ee4255d9cdc26f6943bf48687874de64f6cf30a012512e787b88059bbf561162bdcc23a3742c835ac144cc14167b1bd6727e940540a9c99f3cbb41fb1dcb00d76dda04995847c657f4c19d303eb09eb48a", + "pubkey": "0451f99d2d52d4a6e734484a018b7ca2f895c2929b6754a3a03224d07ae61166ce4737da963c6ef7247fb88d19f9b0c667cac7fe12837fdab88c66f10d3c14cad1", + "signature": "9886ae46c1415c3bc959e82b760ad760aab66885a84e620aa339fdf102465c422bf3a80bc04faa35ebecc0f4864ac02d349f6f126e0f988501b8d3075409a26c" }, { - "message": "9bf457159f0d44b78d0e151ee53c41cecd98fb4e4129fcda8cc84a758636f84dcad9032f3ec422219d8a7ec61ea89f45d19cab3c3d451de1a634e3d2532231bc03031973d7150cf8e83d8b6a34f25fc136446878e3851b780abdca069c8e981b3ea3f1bf1ff6e47a03f97aed64c1cc90dd00389fa21bb973f142af5e8ceccef4", - "message_hash": "03b3e33ade25fad2eeb530433b6785fb1e977228e0049e572437caa33baa059e", - "signature": "4ce72a83cf1d148db4d1e46e2f773c677f72933c40d7100b9192750a1c8222a89d5fbd67ce89ba8c79df9dc3b42922026a8498921c2bdb4ea8f36496d88c2cfb", - "pubkey": "04571a598076a318dcd7af6ff35c2ab35198197faa1df9612f951d516456c97ef7a30a1405958f554fdf1bad22d22333acb4fe4c968c74a281c524020ad949c9ef" + "message": "3b6ee2425940b3d240d35b97b6dcd61ed3423d8e71a0ada35d47b322d17b35ea0472f35edd1d252f87b8b65ef4b716669fc9ac28b00d34a9d66ad118c9d94e7f46d0b4f6c2b2d339fd6bcd351241a387cc82609057048c12c4ec3d85c661975c45b300cb96930d89370a327c98b67defaa89497aa8ef994c77f1130f752f94a4", + "pubkey": "048fb287f0202ad57ae841aea35f29b2e1d53e196d0ddd9aec24813d64c0922fb71f6daff1aa2dd2d6d3741623eecb5e7b612997a1039aab2e5cf2de969cfea573", + "signature": "490efd106be11fc365c7467eb89b8d39e15d65175356775deab211163c2504cb644300fc0da4d40fb8c6ead510d14f0bd4e1321a469e9c0a581464c7186b7aa7" }, { - "message": "2469172b7a046e6112dfe365590dfddb7c045cccd4ab353edc3076091aad1c780a9a73ff93f3dbf9e2189c5d1fdd6f6167d0ae8cc0f53dc8950e60dd0410e23589999d4ce4fa49e268774defd4edce01c05b205014b63591a041745bfffc6ae4d72d3add353e49478106653cc735b07b0fe665c42d0e6766e525bb9718264c87", - "message_hash": "b90651535080381884a0917c02fdf9e176798c4d65bed76568ec1de95e3c9641", - "signature": "1f1e1fb673e9a7dee09961c6824b473189904deb4f0d8e28da51f77f4de2efe6ae8df1fcdb226fac8b46e494720e45f6d9a5350174faaf22e47b6329ee6c5e1b", - "pubkey": "048db80c468a88ffb4bcdb5ccddbfc9da8cf728a651ab937edf729ad279d9375b50b97422368aa4b3ac13aa18c89ca2af86c14b1948325f1477d5ea9f5156bcc52" + "message": "c5204b81ec0a4df5b7e9fda3dc245f98082ae7f4efe81998dcaa286bd4507ca840a53d21b01e904f55e38f78c3757d5a5a4a44b1d5d4e480be3afb5b394a5d2840af42b1b4083d40afbfe22d702f370d32dbfd392e128ea4724d66a3701da41ae2f03bb4d91bb946c7969404cb544f71eb7a49eb4c4ec55799bda1eb545143a7", + "pubkey": "0468229b48c2fe19d3db034e4c15077eb7471a66031f28a980821873915298ba76303e8ee3742a893f78b810991da697083dd8f11128c47651c27a56740a80c24c", + "signature": "e67a9717ccf96841489d6541f4f6adb12d17b59a6bef847b6183b8fcf16a32eb9ae6ba6d637706849a6a9fc388cf0232d85c26ea0d1fe7437adb48de58364333" }, { - "message": "6f8983e74f304c3657cffde0682b42699cb2c3475b925058ff37292c40a0aa296690ad129730339ac60cf784225b2fd3db58297c8ce5889df7a48d3e74a363ae4135e8a234cab53ca4c11c031d561a6cf7dd47b925ed5bc4c2794ba7b74a868b0c3da31ff1e4540d0768612192a236d86f74fb8c73f375b71c62f1648c0e6126", - "message_hash": "1095c90de2734d4b9dfedefbdd3f76f592f0a3e1697d1321f0eab3f78129c8ce", - "signature": "9cf7d941dcbbbe61c2a6f5112cb518094e79e5d203891de2247e75fd532c3f21fc5a04579b2526f2543efd2a57e82b647da08b6924bff39cf021398a56ad70de", - "pubkey": "0406e22a39ec06c32bcb4d235f23630a198a884a43e8c200a7c3b3f68ef4002de902c574035c08d39857caa492088d35cff9b1d4e1b73e8414b7d71fe53167f7cf" + "message": "72e81fe221fb402148d8b7ab03549f1180bcc03d41ca59d7653801f0ba853add1f6d29edd7f9abc621b2d548f8dbf8979bd16608d2d8fc3260b4ebc0dd42482481d548c7075711b5759649c41f439fad69954956c9326841ea6492956829f9e0dc789f73633b40f6ac77bcae6dfc7930cfe89e526d1684365c5b0be2437fdb01", + "pubkey": "040a7dbb8bf50cb605eb2268b081f26d6b08e012f952c4b70a5a1e6e7d46af98bbf26dd7d799930062480849962ccf5004edcfd307c044f4e8f667c9baa834eeae", + "signature": "b53ce4da1aa7c0dc77a1896ab716b921499aed78df725b1504aba1597ba0c64bd7c246dc7ad0e67700c373edcfdd1c0a0495fc954549ad579df6ed1438840851" }, { - "message": "6fbe6f0f178fdc8a3ad1a8eecb02d37108c5831281fe85e3ff8eeb66ca1082a217b6d602439948f828e140140412544f994da75b6efc203b295235deca060ecfc7b71f05e5af2acc564596772ddbfb4078b4665f6b85f4e70641af26e31f6a14e5c88604459df4eeeed9b77b33c4b82a3c1458bd2fd1dc7214c04f9c79c8f09b", - "message_hash": "164025d15dfec124cd37db98daf196cfbe44716968112dc8a4be24e350abd559", - "signature": "59cd6c2a30227afbd693d87b201d0989435d6e116c144276a5223466a822c0f2b01495efda969b3fd3a2c05aa098a4e04b0d0e748726fc6174627da15b143799", - "pubkey": "04db6816cec58836ef290e39429f506f00c5541376128bedea089b88094f42cd950b23e68cd57203d9fedeeacef680c26baf25be682ad808f308d2ddd5828fdeae" - }, - { - "message": "2b49de971bb0f705a3fb5914eb7638d72884a6c3550667dbfdf301adf26bde02f387fd426a31be6c9ff8bfe8690c8113c88576427f1466508458349fc86036afcfb66448b947707e791e71f558b2bf4e7e7507773aaf4e9af51eda95cbce0a0f752b216f8a54a045d47801ff410ee411a1b66a516f278327df2462fb5619470e", - "message_hash": "00c6fc53c1986d19a8a8b580ee553dc1240745d760647d1c0adf442c133c7f56", - "signature": "9eaf69170aeba44966afe957295526ee9852b5034c18dc5aeef3255c8567838aebd4c8de2c22b5cb8803d6e070186786f6d5dae2202b9f899276fa31a66cb3bb", - "pubkey": "04d2a23e34dcb8e1fbaaf2c3c0e83500824b3a122e83737f1251fa34ccf0d2fb8719030b3d567ed019ba62ee392990a9a23f88ee990f26ed50783e4f671572371f" - }, - { - "message": "1fa7201d96ad4d190415f2656d1387fa886afc38e5cd18b8c60da367acf32c627d2c9ea19ef3f030e559fc2a21695cdbb65ddf6ba36a70af0d3fa292a32de31da6acc6108ab2be8bd37843338f0c37c2d62648d3d49013edeb9e179dadf78bf885f95e712fcdfcc8a172e47c09ab159f3a00ed7b930f628c3c48257e92fc7407", - "message_hash": "fb5dd3b8d280fe7c4838f01b2a5c28493ed3084f46b40642600ba39e43fbff7b", - "signature": "91058d1b912514940e1002855cc930c01a21234bad88f607f213af495c32b69f005d387ce3de25f1b9bad1fb180de110686d91b461ae2972fa4e4a7018519870", - "pubkey": "048a86bbf4f7014a8ef557ff6a87681b5728957fc68342a1b2b0164eef5a3c7bb1cbe75d53a1a222990470161143bf18b5cec7c75616bbacdddf2f0af45514f9ca" - }, - { - "message": "74715fe10748a5b98b138f390f7ca9629c584c5d6ad268fc455c8de2e800b73fa1ea9aaee85de58baa2ce9ce68d822fc31842c6b153baef3a12bf6b4541f74af65430ae931a64c8b4950ad1c76b31aea8c229b3623390e233c112586aa5907bbe419841f54f0a7d6d19c003b91dc84bbb59b14ec477a1e9d194c137e21c75bbb", - "message_hash": "f4083aebe08c9bdb8c08ff844ffc207f80fa4406fb73bdbc1c6020f71281bdae", - "signature": "fe43eb9c38b506d118e20f8605ac8954fc0406efd306ba7ea5b07577a2735d15d589e91bf5014c7c360342ad135259dd7ae684e2c21234d7a912b43d148fcf19", - "pubkey": "04ab11970c6a01f45f6730b57d8eee6c9e1e7be824b34b27f9b45d2c5f5b6e601d4d946af7e4f5b98647634cfbacb4eecf7507c2fea1b114117902e4bafe9e1eb0" - }, - { - "message": "d10131982dd1a1d839aba383cd72855bf41061c0cb04dfa1acad3181f240341d744ca6002b52f25fb3c63f16d050c4a4ef2c0ebf5f16ce987558f4b9d4a5ad3c6b81b617de00e04ba32282d8bf223bfedbb325b741dfdc8f56fa85c65d42f05f6a1330d8cc6664ad32050dd7b9e3993f4d6c91e5e12cbd9e82196e009ad22560", - "message_hash": "cb017b280093879c4b114b52ea670f14e97b661074abccc8539a23280fe136b4", - "signature": "ccdbbd2500043bf7f705536d5984ab5f05fdc0fa3cf464d8c88f861e3fc8e54cd5c6342c08dcd8242e1daf3595cae968e320a025aa45ec4bc725795da3d1becb", - "pubkey": "040827dce898102fa27e52172e8246368b062ade896d34b7f25d8c24fca4a424f91d283f6ebac2b4f6167477ee624e2249c52a7c321e67b6fef711fba2f90d20d7" - }, - { - "message": "ef9dbd90ded96ad627a0a987ab90537a3e7acc1fdfa991088e9d999fd726e3ce1e1bd89a7df08d8c2bf51085254c89dc67bc21e8a1a93f33a38c18c0ce3880e958ac3e3dbe8aec49f981821c4ac6812dd29fab3a9ebe7fbd799fb50f12021b48d1d9abca8842547b3b99befa612cc8b4ca5f9412e0352e72ab1344a0ac2913db", - "message_hash": "5f1d77f456d7ed30acad33795b50733d54226e57df4281a43d3821d0762f12fe", - "signature": "5c707b6df7667324f950216b933d28e307a0223b24d161bc5887208d7f880b3a4b7bc56586dc51d806ac3ad72807bc62d1d06d0812f121bd91e9770d84885c39", - "pubkey": "0436748f1a531e91a40b9e6bfc502488cfd749c3b9529633d4e4dabdb058708b7ac4b0672c9a7105b6dbf63b8054e5d266d43d37cf51241ce289d8f9140fe28996" + "message": "21188c3edd5de088dacc1076b9e1bcecd79de1003c2414c3866173054dc82dde85169baa77993adb20c269f60a5226111828578bcc7c29e6e8d2dae81806152c8ba0c6ada1986a1983ebeec1473a73a04795b6319d48662d40881c1723a706f516fe75300f92408aa1dc6ae4288d2046f23c1aa2e54b7fb6448a0da922bd7f34", + "pubkey": "04105d22d9c626520faca13e7ced382dcbe93498315f00cc0ac39c4821d0d737376c47f3cbbfa97dfcebe16270b8c7d5d3a5900b888c42520d751e8faf3b401ef4", + "signature": "542c40a18140a6266d6f0286e24e9a7bad7650e72ef0e2131e629c076d9626634f7f65305e24a6bbb5cff714ba8f5a2cee5bdc89ba8d75dcbf21966ce38eb66f" } ] From b81696f33c9c8e0dcdc279cd4677cb497a574b9f Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Sun, 7 Jan 2024 20:38:23 +0100 Subject: [PATCH 1137/2372] Add source test vectors and extraction script for reference --- .../testdata/186-4ecdsatestvectors/Readme.txt | 19 + .../testdata/186-4ecdsatestvectors/SigGen.txt | 5878 +++++++++++++++++ packages/crypto/testdata/extract_sig_gen.sh | 15 + 3 files changed, 5912 insertions(+) create mode 100644 packages/crypto/testdata/186-4ecdsatestvectors/Readme.txt create mode 100644 packages/crypto/testdata/186-4ecdsatestvectors/SigGen.txt create mode 100755 packages/crypto/testdata/extract_sig_gen.sh diff --git a/packages/crypto/testdata/186-4ecdsatestvectors/Readme.txt b/packages/crypto/testdata/186-4ecdsatestvectors/Readme.txt new file mode 100644 index 0000000000..2d36c32ae9 --- /dev/null +++ b/packages/crypto/testdata/186-4ecdsatestvectors/Readme.txt @@ -0,0 +1,19 @@ +Example test files for FIPS 186-3 ECDSA +Updated May 5, 2015 to include examples for truncated SHAs and to remove SigGen P-192, K-163, and B-163 curves and to remove SHA1 + + +1. The files with extension '.rsp' are response files in the proper format for +CAVS validation. + + a. SigVer.rsp contains examples of every curve with SHA1, SHA224, SHA256, SHA384, and SHA512. + b. SigVer_TruncatedSHAs.rsp contains examples of every curve with the truncated +SHAs - SHA512/224 and SHA512/256. + +2. The file SigGen.txt contains values for ECDSA signature generation for every curve with SHA224, SHA256, SHA384, and SHA512. The file SigGen_TruncatedSHAs.txt contains values for ECDSA signature generation for every curve with the truncated SHAs - SHA512/224 and SHA512/256. + + a. These txt files contain values for ECDSA signature generation with the +following additional values needed to calculate r and s as in Section 6.4: + 1. 'd' -- The private key. + + 2. 'k' -- The Per-message secret number (PMSN) used to compute (r, s). + See Section 6.3 and Appendix B.5 for more information on the PMSN. \ No newline at end of file diff --git a/packages/crypto/testdata/186-4ecdsatestvectors/SigGen.txt b/packages/crypto/testdata/186-4ecdsatestvectors/SigGen.txt new file mode 100644 index 0000000000..5e3b4ebb0e --- /dev/null +++ b/packages/crypto/testdata/186-4ecdsatestvectors/SigGen.txt @@ -0,0 +1,5878 @@ +# CAVS 11.2 +# "SigVer" information for "ecdsa_values" +# Curves/SHAs selected: P-224,SHA-224 P-224,SHA-256 P-224,SHA-384 P-224,SHA-512 P-256,SHA-224 P-256,SHA-256 P-256,SHA-384 P-256,SHA-512 P-384,SHA-224 P-384,SHA-256 P-384,SHA-384 P-384,SHA-512 P-521,SHA-224 P-521,SHA-256 P-521,SHA-384 P-521,SHA-512 K-233,SHA-224 K-233,SHA-256 K-233,SHA-384 K-233,SHA-512 K-283,SHA-224 K-283,SHA-256 K-283,SHA-384 K-283,SHA-512 K-409,SHA-224 K-409,SHA-256 K-409,SHA-384 K-409,SHA-512 K-571,SHA-224 K-571,SHA-256 K-571,SHA-384 K-571,SHA-512 B-233,SHA-224 B-233,SHA-256 B-233,SHA-384 B-233,SHA-512 B-283,SHA-224 B-283,SHA-256 B-283,SHA-384 B-283,SHA-512 B-409,SHA-224 B-409,SHA-256 B-409,SHA-384 B-409,SHA-512 BB-571,SHA-224 B-571,SHA-256 B-571,SHA-384 B-571,SHA-512 +# Generated on Tue Aug 16 15:27:42 2011 + + + + +[P-224,SHA-224] + +Msg = 699325d6fc8fbbb4981a6ded3c3a54ad2e4e3db8a5669201912064c64e700c139248cdc19495df081c3fc60245b9f25fc9e301b845b3d703a694986e4641ae3c7e5a19e6d6edbf1d61e535f49a8fad5f4ac26397cfec682f161a5fcd32c5e780668b0181a91955157635536a22367308036e2070f544ad4fff3d5122c76fad5d +d = 16797b5c0c7ed5461e2ff1b88e6eafa03c0f46bf072000dfc830d615 +Qx = 605495756e6e88f1d07ae5f98787af9b4da8a641d1a9492a12174eab +Qy = f5cc733b17decc806ef1df861a42505d0af9ef7c3df3959b8dfc6669 +k = d9a5a7328117f48b4b8dd8c17dae722e756b3ff64bd29a527137eec0 +R = 2fc2cff8cdd4866b1d74e45b07d333af46b7af0888049d0fdbc7b0d6 +S = 8d9cc4c8ea93e0fd9d6431b9a1fd99b88f281793396321b11dac41eb + +Msg = 7de42b44db0aa8bfdcdac9add227e8f0cc7ad1d94693beb5e1d325e5f3f85b3bd033fc25e9469a89733a65d1fa641f7e67d668e7c71d736233c4cba20eb83c368c506affe77946b5e2ec693798aecd7ff943cd8fab90affddf5ad5b8d1af332e6c5fe4a2df16837700b2781e08821d4fbdd8373517f5b19f9e63b89cfeeeef6f +d = cf020a1ff36c28511191482ed1e5259c60d383606c581948c3fbe2c5 +Qx = fa21f85b99d3dc18c6d53351fbcb1e2d029c00fa7d1663a3dd94695e +Qy = e9e79578f8988b168edff1a8b34a5ed9598cc20acd1f0aed36715d88 +k = c780d047454824af98677cf310117e5f9e99627d02414f136aed8e83 +R = 45145f06b566ec9fd0fee1b6c6551a4535c7a3bbfc0fede45f4f5038 +S = 7302dff12545b069cf27df49b26e4781270585463656f2834917c3ca + +Msg = af0da3adab82784909e2b3dadcecba21eced3c60d7572023dea171044d9a10e8ba67d31b04904541b87fff32a10ccc6580869055fec6216a00320a28899859a6b61faba58a0bc10c2ba07ea16f214c3ddcc9fc5622ad1253b63fe7e95227ae3c9caa9962cffc8b1c4e8260036469d25ab0c8e3643a820b8b3a4d8d43e4b728f9 +d = dde6f173fa9f307d206ce46b4f02851ebce9638a989330249fd30b73 +Qx = fc21a99b060afb0d9dbf3250ea3c4da10be94ce627a65874d8e4a630 +Qy = e8373ab7190890326aac4aacca3eba89e15d1086a05434dd033fd3f3 +k = 6629366a156840477df4875cfba4f8faa809e394893e1f5525326d07 +R = 41f8e2b1ae5add7c24da8725a067585a3ad6d5a9ed9580beb226f23a +S = a5d71bff02dce997305dd337128046f36714398f4ef6647599712fae + +Msg = cfa56ae89727df6b7266f69d6636bf738f9e4f15f49c42a0123edac4b3743f32ea52389f919ceb90575c4184897773b2f2fc5b3fcb354880f15c93383215d3c2551fcc1b4180a1ac0f69c969bbc306acd115ce3976eff518540f43ad4076dbb5fbad9ce9b3234f1148b8f5e059192ff480fc4bcbd00d25f4d9f5ed4ba5693b6c +d = aeee9071248f077590ac647794b678ad371f8e0f1e14e9fbff49671e +Qx = fad0a34991bbf89982ad9cf89337b4bd2565f84d5bdd004289fc1cc3 +Qy = 5d8b6764f28c8163a12855a5c266efeb9388df4994b85a8b4f1bd3bc +k = 1d35d027cd5a569e25c5768c48ed0c2b127c0f99cb4e52ea094fe689 +R = 2258184ef9f0fa698735379972ce9adf034af76017668bfcdab978de +S = 866fb8e505dea6c909c2c9143ec869d1bac2282cf12366130ff2146c + +Msg = c223c8009018321b987a615c3414d2bb15954933569ca989de32d6bf11107bc47a330ab6d88d9b50d106cf5777d1b736b14bc48deda1bc573a9a7dd42cd061860645306dce7a5ba8c60f135a6a21999421ce8c4670fe7287a7e9ea3aa1e0fa82721f33e6e823957fe86e2283c89ef92b13cd0333c4bb70865ae1919bf538ea34 +d = 29c204b2954e1406a015020f9d6b3d7c00658298feb2d17440b2c1a4 +Qx = 0e0fc15e775a75d45f872e5021b554cc0579da19125e1a49299c7630 +Qy = cb64fe462d025ae2a1394746bdbf8251f7ca5a1d6bb13e0edf6b7b09 +k = 39547c10bb947d69f6c3af701f2528e011a1e80a6d04cc5a37466c02 +R = 86622c376d326cdf679bcabf8eb034bf49f0c188f3fc3afd0006325d +S = 26613d3b33c70e635d7a998f254a5b15d2a3642bf321e8cff08f1e84 + +Msg = 1c27273d95182c74c100d85b5c08f4b26874c2abc87f127f304aedbf52ef6540eba16dd664ae1e9e30ea1e66ff9cc9ab5a80b5bcbd19dde88a29ff10b50a6abd73388e8071306c68d0c9f6caa26b7e68de29312be959b9f4a5481f5a2ad2070a396ed3de21096541cf58c4a13308e08867565bf2df9d649357a83cdcf18d2cd9 +d = 8986a97b24be042a1547642f19678de4e281a68f1e794e343dabb131 +Qx = 2c070e68e8478341938f3d5026a1fe01e778cdffbebbdd7a4cd29209 +Qy = cde21c9c7c6590ba300715a7adac278385a5175b6b4ea749c4b6a681 +k = 509712f9c0f3370f6a09154159975945f0107dd1cee7327c68eaa90b +R = 57afda5139b180de96373c3d649700682e37efd56ae182335f081013 +S = eb6cd58650cfb26dfdf21de32fa17464a6efc46830eedc16977342e6 + +Msg = 069ae374971627f6b8503f3aa63ab52bcf4f3fcae65b98cdbbf917a5b08a10dc760056714db279806a8d43485320e6fee0f1e0562e077ee270ace8d3c478d79bcdff9cf8b92fdea68421d4a276f8e62ae379387ae06b60af9eb3c40bd7a768aeffccdc8a08bc78ca2eca18061058043a0e441209c5c594842838a4d9d778a053 +d = d9aa95e14cb34980cfddadddfa92bde1310acaff249f73ff5b09a974 +Qx = 3a0d4b8e5fad1ea1abb8d3fb742cd45cd0b76d136e5bbb33206ad120 +Qy = c90ac83276b2fa3757b0f226cd7360a313bc96fd8329c76a7306cc7d +k = 1f1739af68a3cee7c5f09e9e09d6485d9cd64cc4085bc2bc89795aaf +R = 09bbdd003532d025d7c3204c00747cd52ecdfbc7ce3dde8ffbea23e1 +S = 1e745e80948779a5cc8dc5cb193beebb550ec9c2647f4948bf58ba7d + +Msg = d0d5ae3e33600aa21c1606caec449eee678c87cb593594be1fbb048cc7cfd076e5cc7132ebe290c4c014e7a517a0d5972759acfa1438d9d2e5d236d19ac92136f6252b7e5bea7588dcba6522b6b18128f003ecab5cb4908832fb5a375cf820f8f0e9ee870653a73dc2282f2d45622a2f0e85cba05c567baf1b9862b79a4b244e +d = 380fb6154ad3d2e755a17df1f047f84712d4ec9e47d34d4054ea29a8 +Qx = 4772c27cca3348b1801ae87b01cb564c8cf9b81c23cc74468a907927 +Qy = de9d253935b09617a1655c42d385bf48504e06fa386f5fa533a21dcb +k = 14dbdffa326ba2f3d64f79ff966d9ee6c1aba0d51e9a8e59f5686dc1 +R = ff6d52a09ca4c3b82da0440864d6717e1be0b50b6dcf5e1d74c0ff56 +S = 09490be77bc834c1efaa23410dcbf800e6fae40d62a737214c5a4418 + +Msg = 79b7375ae7a4f2e4adad8765d14c1540cd9979db38076c157c1837c760ca6febbb18fd42152335929b735e1a08041bd38d315cd4c6b7dd2729de8752f531f07fe4ddc4f1899debc0311eef0019170b58e08895b439ddf09fbf0aeb1e2fd35c2ef7ae402308c3637733802601dd218fb14c22f57870835b10818369d57d318405 +d = 6b98ec50d6b7f7ebc3a2183ff9388f75e924243827ddded8721186e2 +Qx = 1f249911b125348e6e0a473479105cc4b8cfb4fa32d897810fc69ffe +Qy = a17db03b9877d1b6328329061ea67aec5a38a884362e9e5b7d7642dc +k = ab3a41fedc77d1f96f3103cc7dce215bf45054a755cf101735fef503 +R = 70ccc0824542e296d17a79320d422f1edcf9253840dafe4427033f40 +S = e3823699c355b61ab1894be3371765fae2b720405a7ce5e790ca8c00 + +Msg = 8c7de96e6880d5b6efc19646b9d3d56490775cb3faab342e64db2e388c4bd9e94c4e69a63ccdb7e007a19711e69c06f106b71c983a6d97c4589045666c6ab5ea7b5b6d096ddf6fd35b819f1506a3c37ddd40929504f9f079c8d83820fc8493f97b2298aebe48fdb4ff472b29018fc2b1163a22bfbb1de413e8645e871291a9f6 +d = 8dda0ef4170bf73077d685e7709f6f747ced08eb4cde98ef06ab7bd7 +Qx = 7df67b960ee7a2cb62b22932457360ab1e046c1ec84b91ae65642003 +Qy = c764ca9fc1b0cc2233fa57bdcfedaab0131fb7b5f557d6ca57f4afe0 +k = 9ef6ebd178a76402968bc8ec8b257174a04fb5e2d65c1ab34ab039b9 +R = eef9e8428105704133e0f19636c89e570485e577786df2b09f99602a +S = 8c01f0162891e4b9536243cb86a6e5c177323cca09777366caf2693c + +Msg = c89766374c5a5ccef5823e7a9b54af835ac56afbbb517bd77bfecf3fea876bd0cc9ea486e3d685cfe3fb05f25d9c67992cd7863c80a55c7a263249eb3996c4698ad7381131bf3700b7b24d7ca281a100cf2b750e7f0f933e662a08d9f9e47d779fb03754bd20931262ff381a2fe7d1dc94f4a0520de73fa72020494d3133ecf7 +d = 3dbe18cd88fa49febfcb60f0369a67b2379a466d906ac46a8b8d522b +Qx = b10150fd797eb870d377f1dbfa197f7d0f0ad29965af573ec13cc42a +Qy = 17b63ccefbe27fb2a1139e5757b1082aeaa564f478c23a8f631eed5c +k = 385803b262ee2ee875838b3a645a745d2e199ae112ef73a25d68d15f +R = 1d293b697f297af77872582eb7f543dc250ec79ad453300d264a3b70 +S = 517a91b89c4859fcc10834242e710c5f0fed90ac938aa5ccdb7c66de + +Msg = 30f0e3b502eec5646929d48fd46aa73991d82079c7bd50a38b38ec0bd84167c8cf5ba39bec26999e70208af9b445046cd9d20c82b7629ca1e51bdd00daddbc35f9eb036a15ac57898642d9db09479a38cc80a2e41e380c8a766b2d623de2de798e1eabc02234b89b85d60154460c3bf12764f3fbf17fcccc82df516a2fbe4ecf +d = c906b667f38c5135ea96c95722c713dbd125d61156a546f49ddaadc6 +Qx = 3c9b4ef1748a1925578658d3af51995b989ad760790157b25fe09826 +Qy = 55648f4ff4edfb899e9a13bd8d20f5c24b35dc6a6a4e42ed5983b4a0 +k = b04d78d8ac40fefadb99f389a06d93f6b5b72198c1be02dbff6195f0 +R = 4bdd3c84647bad93dcaffd1b54eb87fc61a5704b19d7e6d756d11ad0 +S = fdd81e5dca54158514f44ba2330271eff4c618330328451e2d93b9fb + +Msg = 6bbb4bf987c8e5069e47c1a541b48b8a3e6d14bfd9ac6dfaa7503b64ab5e1a55f63e91cf5c3e703ac27ad88756dd7fb2d73b909fc15302d0592b974d47e72e60ed339a40b34d39a49b69ea4a5d26ce86f3ca00a70f1cd416a6a5722e8f39d1f0e966981803d6f46dac34e4c7640204cd0d9f1e53fc3acf30096cd00fa80b3ae9 +d = 3456745fbd51eac9b8095cd687b112f93d1b58352dbe02c66bb9b0cc +Qx = f0acdfbc75a748a4a0ac55281754b5c4a364b7d61c5390b334daae10 +Qy = 86587a6768f235bf523fbfc6e062c7401ac2b0242cfe4e5fb34f4057 +k = 854b20c61bcdf7a89959dbf0985880bb14b628f01c65ef4f6446f1c1 +R = a2601fbb9fe89f39814735febb349143baa934170ffb91c6448a7823 +S = bf90f9305616020a0e34ef30803fc15fa97dffc0948452bbf6cb5f66 + +Msg = 05b8f8e56214d4217323f2066f974f638f0b83689fc4ed1201848230efdc1fbca8f70359cecc921050141d3b02c2f17aa306fc2ce5fc06e7d0f4be162fcd985a0b687b4ba09b681cb52ffe890bf5bb4a104cb2e770c04df433013605eb8c72a09902f4246d6c22b8c191ef1b0bece10d5ce2744fc7345307dd1b41b6eff0ca89 +d = 2c522af64baaca7b7a08044312f5e265ec6e09b2272f462cc705e4c3 +Qx = 5fad3c047074b5de1960247d0cc216b4e3fb7f3b9cd960575c8479fc +Qy = e4fc9c7f05ff0b040eb171fdd2a1dfe2572c564c2003a08c3179a422 +k = 9267763383f8db55eed5b1ca8f4937dc2e0ca6175066dc3d4a4586af +R = 422e2e9fe535eb62f11f5f8ce87cf2e9ec65e61c06737cf6a0019ae6 +S = 116cfcf0965b7bc63aecade71d189d7e98a0434b124f2afbe3ccf0a9 + +Msg = e5c979f0832242b143077bce6ef146a53bb4c53abfc033473c59f3c4095a68b7a504b609f2ab163b5f88f374f0f3bff8762278b1f1c37323b9ed448e3de33e6443796a9ecaa466aa75175375418186c352018a57ce874e44ae72401d5c0f401b5a51804724c10653fded9066e8994d36a137fdeb9364601daeef09fd174dde4a +d = 3eff7d07edda14e8beba397accfee060dbe2a41587a703bbe0a0b912 +Qx = 6dd84f4d66f362844e41a7913c40b4aad5fa9ba56bb44c2d2ed9efac +Qy = 15f65ebcdf2fd9f8035385a330bdabec0f1cd9cc7bc31d2fadbe7cda +k = 7bb48839d7717bab1fdde89bf4f7b4509d1c2c12510925e13655dead +R = 127051d85326049115f307af2bc426f6c2d08f4774a0b496fb6982b1 +S = 6857e84418c1d1179333b4e5307e92abade0b74f7521ad78044bf597 + +[P-224,SHA-256] + +Msg = 2b49de971bb0f705a3fb5914eb7638d72884a6c3550667dbfdf301adf26bde02f387fd426a31be6c9ff8bfe8690c8113c88576427f1466508458349fc86036afcfb66448b947707e791e71f558b2bf4e7e7507773aaf4e9af51eda95cbce0a0f752b216f8a54a045d47801ff410ee411a1b66a516f278327df2462fb5619470e +d = 888fc992893bdd8aa02c80768832605d020b81ae0b25474154ec89aa +Qx = 4c741e4d20103670b7161ae72271082155838418084335338ac38fa4 +Qy = db7919151ac28587b72bad7ab180ec8e95ab9e2c8d81d9b9d7e2e383 +k = 06f7a56007825433c4c61153df1a135eee2f38ec687b492ed40d9c90 +R = 0909c9b9cae8d2790e29db6afdb45c04f5b072c4c20410c7dc9b6772 +S = 298f4fcae1fe271da1e0345d11d07a1fca43f58af4c113b909eedea0 + +Msg = 1fa7201d96ad4d190415f2656d1387fa886afc38e5cd18b8c60da367acf32c627d2c9ea19ef3f030e559fc2a21695cdbb65ddf6ba36a70af0d3fa292a32de31da6acc6108ab2be8bd37843338f0c37c2d62648d3d49013edeb9e179dadf78bf885f95e712fcdfcc8a172e47c09ab159f3a00ed7b930f628c3c48257e92fc7407 +d = 5b5a3e186e7d5b9b0fbdfc74a05e0a3d85dc4be4c87269190c839972 +Qx = 897089f4ef05b943eeac06589f0e09ccc571a6add3eb1610a2fc830f +Qy = 62ba3f6b3e6f0f062058b93e6f25b6041246c5be13584a41cae7e244 +k = 5b6f7eca2bcc5899fce41b8169d48cd57cf0c4a1b66a30a150072676 +R = f12c9985d454ffbc899ebbbb6cf43e3debcac7f19029f8f2f35cce31 +S = 12fcb848adbd8b1b4c72b2b54a04d936e4a5f480ae2a3ea2e3c1baae + +Msg = 74715fe10748a5b98b138f390f7ca9629c584c5d6ad268fc455c8de2e800b73fa1ea9aaee85de58baa2ce9ce68d822fc31842c6b153baef3a12bf6b4541f74af65430ae931a64c8b4950ad1c76b31aea8c229b3623390e233c112586aa5907bbe419841f54f0a7d6d19c003b91dc84bbb59b14ec477a1e9d194c137e21c75bbb +d = f60b3a4d4e31c7005a3d2d0f91cb096d016a8ddb5ab10ecb2a549170 +Qx = 40a4ab1e6a9f84b4dedb81795e6a7124d1cfdfd7ec64c5d4b9e32666 +Qy = 83aa32a3c2fc068e62626f2dafce5d7f050e826e5c145cd2d13d1b27 +k = c31150420dfb38ba8347e29add189ec3e38c14b0c541497fb90bf395 +R = bf6c6daa89b21211ea2c9f45192d91603378d46b1a5057962dafaf12 +S = cb6b237950e0f0369323055cd1f643528c7a64616f75b11c4ddd63c7 + +Msg = d10131982dd1a1d839aba383cd72855bf41061c0cb04dfa1acad3181f240341d744ca6002b52f25fb3c63f16d050c4a4ef2c0ebf5f16ce987558f4b9d4a5ad3c6b81b617de00e04ba32282d8bf223bfedbb325b741dfdc8f56fa85c65d42f05f6a1330d8cc6664ad32050dd7b9e3993f4d6c91e5e12cbd9e82196e009ad22560 +d = c8fc474d3b1cba5981348de5aef0839e376f9f18e7588f1eed7c8c85 +Qx = 66f49457ed15f67ed4042195856f052fe774077f61cebcb9efddc365 +Qy = 3a6e3f3423eec7308a69eb1b0416d67cc3b84d24f251d7cbdb45c079 +k = 5e5405ae9ab6164bb476c1bb021ec78480e0488736e4f8222920fbd9 +R = 7b7beaf9f696ca1a8051527478c4c075ab45aa4768937886dbf38618 +S = 93d4cf110a37c5a6f15c4e6024822118539e860dee2f60b8c3f462f6 + +Msg = ef9dbd90ded96ad627a0a987ab90537a3e7acc1fdfa991088e9d999fd726e3ce1e1bd89a7df08d8c2bf51085254c89dc67bc21e8a1a93f33a38c18c0ce3880e958ac3e3dbe8aec49f981821c4ac6812dd29fab3a9ebe7fbd799fb50f12021b48d1d9abca8842547b3b99befa612cc8b4ca5f9412e0352e72ab1344a0ac2913db +d = 04ef5d2a45341e2ace9af8a6ebd25f6cde45453f55b7a724eb6c21f6 +Qx = 8d642868e4d0f55ee62a2052e6b806b566d2ac79dbde7939fe725773 +Qy = 79505a57cd56904d2523b3e1281e9021167657d38aeb7d42fc8ec849 +k = ec60ea6f3d6b74d102e5574182566b7e79a69699a307fee70a2d0d22 +R = 2fd7fcbb7832c97ce325301dd338b279a9e28b8933284d49c6eabcf6 +S = 550b2f1efc312805a6ed8f252e692d8ee19eaa5bcd5d0cda63a1a3f0 + +Msg = 4cc91f744ac858d3577e48813219aa3538dd813b186b42d1e6218376f07cc1cc448ddd6b37240e98bf953f49cf54d65c12878b33c0bf6eb1c60254f0b6fa974f847e53abc56773eef6f29885dfc619e6a48fc15a667ca94001a0c945b6357a53221b0f4b266181456b0d2d25e90708777f1a6f85971c00140c631c1991e0fd06 +d = 35d4bbe77d149812339e85c79483cb270bdac56bbf30b5ef3d1f4d39 +Qx = 7924b1d7f5920cce98e25094e40f2eb3eb80d70b17e14b3d36c3671c +Qy = 26c5af35f71e61858582b7cc2b41790597c53ee514ffdf7a289d108c +k = 751869c1d0e79eb30aae8fbfb6d97bfa332123fd6b6c72c9cd3c1796 +R = 26bb1b92b0f01e94eba5fa429271371db527ce857abba13bd1103f64 +S = 836aba9c63e1252c2b2d72a21e6a41b82241ebe32647e7f814652bcb + +Msg = 58f43cc1924de4bc5867664adbc9d26b4f096a43aca47c27c52851b006dc2a658919ef9ce5b5ac48372703be15ac51631c2bd84b88f479f113b0569a9a09e230ec1e8e573474c6075284d3e57d973829af35325d9e7dab4a5f9b065155bbcaff3642a82ef4c9b9e127d3575c050721653da3b087d3fa394192897a5519527d19 +d = 2c291a393281b75264c9b8817af684fa86a1cdc900822f74039dc5d6 +Qx = 18cb5826ad60e6696bf07655032a3749f6577ca36da3ccd6e66a137c +Qy = 194e14820fe02d784fd1363ff7a30399518309765bd3f4412d646da2 +k = e2a860416229dfd3f5a5cc92344ca015093a543943a0d8f73bf2b2fd +R = 00e300c1ef4a8c4ca5da6413856f8981db49de29bdf03f32ffc3ceab +S = f250f18a51ba5f63e1584097841099fa6ae4e98ee458c061d1d5aed7 + +Msg = 113a2806b052fde683ee09453098e402204155afb3776fd1cad3a9103421d327eab8f9ec0dd050ffcc83f93b34ea707705fabeccfe43ab1a71c95298fd3ec769d99ead1066950eee677d225816e0faad19cf69e1b35d16771689e2092cafe16d7c0dd7b0db73fffb8d0f3eaed83004dd21e753530ec939c89ba25578fa5f785b +d = 831ea25dbeda33d272a1382c5def0e83929170ab06a629eed6ee244b +Qx = 076518e393940d42dfd09819409d66966d8c9189c83d554a9cc8a082 +Qy = 44d0ceaf4c0f50e46bea4a52e30423ce3ada19edd363ac5694c65cb8 +k = 6be6dd9f6a083915ccba54626caf12d246d3aece0a7eda7d8d85599c +R = ff1460946e06fb6f5d35e8d2625ca70ffb9b45308e3fabf6ad8351b1 +S = 6029aa3990918e8cb8a388d53b0772e5cdfff49c3405fe0d3a95933a + +Msg = 64cbfc8f2e2149a31b3e8a80c4a552f6c62aaeb7990b6e0ee55500a9d17be04213406578caf315951086dff5c2af3b5ce17d425d185101ef26f86396ba3a129a4f3f8e2dd595f59efb6c0f5c2dcc394569d7268695e9ac7daa84203f1f1895f1f9e4b514a5c9cd23baa63454710144fe735ad9b8f42d8c43267aa434a26d7e5f +d = 70f74c7324ef137318b610ead8ddc5b964e0eed3750b20612fc2e67b +Qx = 279649e2a2918e683520cde3fc98b0ae58a7100e8de35e7c9cc797b6 +Qy = aa4de6be34be61f02880139787b9038f4554a8ef1c994b887c2974b5 +k = 8e984864f86f7a2a73f3edda17dbccd13fac8fa4b872814abf223b1b +R = 3b18736fa11d04e27e2614cda03a63ec11a180f357b0b3192920d09c +S = 2f0f3dbd570727b14fbb29155538e62c930dd51c4035275c1365dc60 + +Msg = a10a11c8e30fff118d371daf824f16c08200b83ea059436466a4611ccac93b2dea2de8c1006f946196aef7fe9b0c251a391b0340f21797798278b412ff2b53842eec6450728e2bca062f8337a2c204b9ea04ff660cd4d4db559f2f11c4d8ef199021339fcc82396f7a93926cf5f247e37d8067fe50692de54f102bd5ab51925c +d = 026be5789886d25039c11d7d58a11a6e1d52cb1d5657561f2165b8a8 +Qx = 3fa617c50b177da1a2bdb98b780ad21ad1195c4bd24465f6187de3c9 +Qy = e3fd8d8876dfd03a4a4e31a1acad3a08d983826d286c250c4e5620c1 +k = 0128b8e3f50731eb5fcc223517fc0cf6b96cd1d2807eb4524bc46f77 +R = 3a6b633f96f3d0b6d54f7fb29ac33709e4f0dd8fa0e51606ed9765ca +S = 63e8c119dfa51784decd864f6911f2210a80f8f02d472d88df10d119 + +Msg = b3f720bf566ffa369259f4361959ae0641d2755ec264a4c4349981df2b02563275b2b9adb5aee47f7a456760a971991ffed6b17809bb9694138d1677fa916123795239353158fc6b22d10f20d26f5d2dcd8c56c44373eea5b93067dba2d7c5318dac2e9e8714873cb1b37f58c011fd14fa1e535554efe05f468bfc8e11cd8b99 +d = e79c18d935c2839644762867aa793201f96a3cde080c5968412ce784 +Qx = b7ae1e992b1c7fde1141f40bd913358538ca0f07f62b729f13cea327 +Qy = 811252d12120e04805fc171a439d382c43b68a21e1a0bdf5e4ec1da4 +k = 7abedab1d36f4f0959a03d968b27dd5708223b66e0fc48594d827361 +R = d35047d74e1e7305bb8c1a94e8ae47cb1591c3437a3e185e00afe710 +S = d9c425c9d5feb776ac8952e6c4eee0ecd68aef2f0e7bff2e49c9185e + +Msg = 0a398a46df7ccc48d1e7833f8bbc67100f1ef77a62dc78bbc115b2a662f9591fbaaa91ad3d788e2fdd1b3164e45293d4f5686c151296901768028ac80ded4bf89c647ad35f0c7c4cb318c0c757c1d83c44d850e5fd4677281b3f13b1ee54de79c8c042813f9d3312dcc6111a68299cb7e829557d7f3d96e702f65aefc6499415 +d = 0d087f9d1f8ae29c9cf791490efc4a5789a9d52038c4b1d22494ad8c +Qx = cd95cf8fb1cd21690f40d647f2353672a1076cc6c46bddaad2d0fc56 +Qy = 934262f74d9ee0f8a2754f64cb7415923d64bf00c94a39b52803f577 +k = 557d0e3995dc6377b3911546dd7aeaeec62a6d8f2af6a274382fc37f +R = 56df0ea6afdcc232ceb41729eec00cf906b69b6e28423a36d3c92cc5 +S = f4f70fd948c9a147f55317fdea7b8a84c33e721014552d5800d63edc + +Msg = 8c33616821a6038b448d8918668977fcf1ef5aa0cf7c341837b39bbcc9bca875a3757f4b392630e9995b9bbe4eb66978b877586adaa02f99d2344dae082a7603351d8ffcfca081ab403cd0acb90d078dd1d0789c2eb3185c62bff2d9f04cd38e509e3b83c12ed0a5c6808fc42f7ba5b06acdc496c8ad9be648ee6a4505f8560f +d = 0830aebb6577d3a3be3ba54a4501c987b0e0bb593267b9bbadb66583 +Qx = b88652020e083ccc1c43dc83d1881884dd4c7e3b4e3460b344b1ea64 +Qy = 22b69b517f86d7c26dc37c0f8feb4bb07fe876149fbcc3334fd2805b +k = e4f4a3280574c704c2fde47ca81ec883d27f2c5a961a294db7cda9d2 +R = b30b8a0079d9a134b5e1618c2ac63e3fbe0e95866b9dbc5f423f2707 +S = 3dc36746610271ef66e0aa52cc2ccadc5c9b08dc769e4dc4f6538c11 + +Msg = 94d56535fd4edfe67a0daa6579f9d53bf6b7b8830ae2aeb62892ff59f18756ddf2811b449c7d20d65d54f8507de4e7c50eaa084830637812aa4b250a4d61ab67845be36e4a41cdc0a70f8d6e3a63d4514f0dc197e6486015046a316153d5f3a3a4a0ae1ed7ea5fa55e12e73d333333685c02e0eb636234ea7e6d4b76b4b76b5a +d = 2acc9b97e625263e8e4cd164302c7d1e078bfcdd706111a13ccda5b2 +Qx = ce1a06f82df874dded37cca03b56c0648e4e8917ecd40ee73ee61588 +Qy = ceb6177b8f1ac7c5c6e6e1f7737cc3026952ee392badd2cd7af32f9d +k = e401fa80f96480d437ed4f61a783888062ec33d530b188fd48016a6d +R = 28674f447c4742e4087bbccfb522fbad4e18b56031d2ce8f532b078a +S = a5a7a13d15b423dd17771f73cea98d89dbffa846cc209b45c0e29b76 + +Msg = 5d8ebdf9eb28b47bdafaa36bf0b66a9eaf99b6c83959da4f2b1151b4f4ecd28fb115a64c0cb9491093a7e9b9c53ec423e4c72e7765bb9c818da0e8c428667e44474a71db4867130c77c40bfd8544b2d7b9d6464d2b8e6a48482153256a32437c3a747231f51134dd14c703407e31146a6fcde23bededcf16950486e90ca69ac0 +d = f4e873d4fb944fb52323406f933815092b7672221de4d1c45917f3fc +Qx = 0dc2cdddb990341adb1de73f02d87fc3822485a659a15145f4251d5f +Qy = cf78b2a83c7352eda1af2c74e1804ea04b35f76c04e89d90281dc2bb +k = 5d1476c682a64162fd2fdc82696fc8cab1469a86f707ea2757416e40 +R = 82982b38ed465138df4018d7cfb835edcb591cb57446ca49d163782b +S = 8ef1d7b326cabee7f7ab95b7b98d3c27a069c0fd95a1599c0ccb422b + +[P-224,SHA-384] + +Msg = 25e4416695f77551fdce276355528ccf1ddc2483821c5d22d751d50111ca2fadc6593b52c74f4b5957494f1df25b0b2f86950d0d19229ec6506fee8581d2dd09d48418b146ff16bd84a17ca0dc83b1888eb407376da6c8a88fa1e60b8c2a2471dfde4b3996ef673d5bde3d70c434dc9f2488e9de16ae657d29e5e59ec922a1ec +d = 62c572ee0d6f81b27e591d788bfc2f42b5105d2663078dfb58069ebd +Qx = bd6ba605639b98fa8113a16a3bb004ddfaec901c98a931206165f4a5 +Qy = a3190b10ef39e88abd60b2293b4707512b45c6c5ed5794cc11454427 +k = 0f0bb1e428bcdebf4dc62a5278068efc0f8ce75f89e89b3630f102b2 +R = aac0ea27e129f544abcc77f110e70bbdd5aa3e425dc39d5e8887025d +S = 10e5dd06aee6b8419a04aa33d9d5678b0039c3acc3c4b61fe106bfdc + +Msg = 9164d633a553deccf3cbd2effccf1387fa3177cd28c95d94a7d1a3e159c5e5c027758cc26493301b2f4d141d8d07a5fe5fead987ce5f30abeafcb48c302afc6c2309f0e93d9b6818cbb6972d222cb7b01302dfe202ae83b89f53150ae4a0e2b8fc0fd1091f19b4ab2e6ab213ab322d04f2c5f57113bfad3c5675227237abf773 +d = e2f86bf73ba9336fa023343060f038e9ad41e5fe868e9f80574619a3 +Qx = f5d5346f17898ea6bbdfff19c216a8757a5dc37b95315f5481628381 +Qy = ae61fd172ac8b7a4f13870a932dece465834cbd4f50bbcfb802c824e +k = 35724ac043e3b44b73b5a7919cf675190306d26aa67c27c28c873534 +R = 535147c265af138eec50c7fb570bcc8d2e6f675597b0fcc034e536bc +S = 743812c188a1dddf9fb34b90738f8b2e58760d6cd20ccceb1bb9c516 + +Msg = 019df05929321ecea7ee1de4f412aba1c8d3c24437db04b194a68a0a59dd871be10bd3a4be6edf551350ea49fc7155a4d887e1221486291abe77a30633a4c4f7868fe2df24311cba0c73804883954460e122387ed414111ff96ff1aebac8b6a6491d8a0d16e48a63bf3d027c0f68ee4a4b234d73b412196706af8ea022b4dcef +d = b0a203438e2586d7575bc417a4a798e47abc22aa3955b58fc2789f17 +Qx = dc5d217862a1e5b00c95affa9d8b925a72b9beaeb7a86dc397e788d8 +Qy = 5f05f8e976ae1eb1036eca6d683a82850795bf9127dee5f8b2859445 +k = 408e9c8b1f33136d6ddb93ff3a498bc09d4eee99bf69cdd5af0aa5a2 +R = 1b5a964c8b1fc634c6e2b82322499df1d7f0c12a4d2a77723c816ab8 +S = cf54599a36ca064fae0aa936de5266f87704409d22a15d28c01b7f2a + +Msg = 5d09d2b1d3fa6e12c10d8b26dc9aabc8dc02bd06e63ff33f8bb91ede4b8694592a69e4ed4cdf6820069e2b9c7803658949e877ffe23bf90bcf5ce1409c06c71d86885a94048b05ac0ec9db193e489a5a2bfa367caf6aa8ecdb032be366174343f6875d2fe1785e8d77334f5f469cec64998e08d3303e5c9a1923b34fdc105d65 +d = efcfa50fad6fb2065f9a55f28c0c42fa24c809ccb19b6fc6d8ffb085 +Qx = 61521a0cfb72be77ba33cb3b8e022743cd9130ff49e97093b71aa178 +Qy = ce0819aedaf6fce639d0e593f8ab0147eeb6058f5f2b448231584ea9 +k = d1eea821f286eae6ebc1f61b08f9ad4323a3787e94af4c32cd31351b +R = b37caaa71103752ac559f9eb4943324409ebfa8b585f684dcaa5c411 +S = 7c28e7619e2944ab4b7be022878c8052ebdf2cae5dff4f976c49686a + +Msg = 50f6dfc81c6cf189e0a310f992907fe93356cee9dea9a41c7671a8daf3f4cfe0c459ce6122c1e731dbf7593419d7114cb73b46956158a982c5d52c72f43f0f822046093c69aeff1f7e4cd8af00ba655c5baa2e7b6a400b4be1f6fd51b3e4cfb35a69c80a28c5cafb771b6c2e52e0aeef0e3fd045e8d40745f3f8b74fd969f816 +d = 61a17816937987764cdc064dc7b5b4f5b16db1023acdfe25902957dd +Qx = a7e975c0a8f87c683bb8e31bc160843a7b69c945f4850bd60e1c08c0 +Qy = 8930a454dcc2aa13bed7ea89368b2c9d689d816b2acf4e52585ee9c4 +k = 44b1fdec2629f9075f89c134ac28ff19bfddaa9db02a5d7f853582b4 +R = b0f5635d8bc9c53a1d54a3ec63de59ed66e6b2358d4ab79755414326 +S = 67c68fe265c7e5aba4232deeafb88545a2aa266fb9f2c2bb3f3ae8d2 + +Msg = e90129ac6672c85bb7b6b18e9dc199c96c81fd65034b53c77818364d512366fb9cd1bc7c82404c451e561fc1ed916c0948f6ac561b33a1ccca093f07684b8c2bafa9e966377bd208556018a5bafb9edcecf70498c7140fe9c8cf3ad8b8c3b0aa489df797944465047465415bb0e24333235fcdd59a98829a3941eaaf62033e82 +d = 79d5367314ec664aa0f6ca36f95549502a05bf8400bf532d669fab8d +Qx = 3191f0237102dac159032ab2dde53cf56c9ec827b5caddfe9e83c02a +Qy = b496b1bdcca4434ac0d0d91ea38ff3bc33f9f54095bfe17796d5a9e2 +k = da529c52f5cc1f435d873109cd991d6cd7e1631d9ff1dd9521dd5db6 +R = 8e0ac63903f4921755430572c3f08bc272790639bdf1009fe2a9a714 +S = 6278c841a2d0a270791fe54b36c49d426d67907aa4e4f59c8638ad97 + +Msg = 3c9a483c9bee33b601549c592a82e95b4319b1e74b777877f0971bcb4273716b268e8f99f876e42f942f4cf08284896bbc1ffbf094ac0956c3cedfc3580cffa8c74fc6db29a371f2da2d05edb9185ece741fe0d3fabfe9d5b4d373755ebed13dc6840cfa3283b9ea46ec8b95c434f253ae86998182e9cc0e95ee64f323fc74b0 +d = 1320eedad4745121793a7eaf732b0b4498f7cb456cac8cf45a1f66f0 +Qx = 9fdd99906ab77fd29e9021bde947d05a7a9eb153612269bfb0899bc9 +Qy = 681b65b9ac8e4c2899bb622dafb253b7bf5a6e38e5f6595f997c291a +k = 66ed8d8934633f4125f593cf1b1d3745c4db1f15dde60cf46ca1c7f2 +R = 80199485a3a96447b39f7679cd47412a78675ba17dcbd10465dc5b48 +S = a251fd9f136a3cb0dd0bc80659ae032e4a761ba7045da0034553fb8c + +Msg = bfc073fdda63c5fccaa0ca8770c293e8154e7aec56128bbac4fdbd541d602216ebf7ca1e02b514d6e396f20683802ba3f334310a9226576926e3bb19ceee27738d13377cbafeb09d091043501702a07aa31d1f29d50ddc55adcf16ffd40578e734a4e6cb6535f26ad48e0c62ad90e79720000e87d419e92dca3e11f943655b03 +d = e18821329447d3f65ba7279e96bd4624ffa1b32b90f6e8331b1e876d +Qx = 46c9ed837232c47022df2f1a1578fbe65ac9f2e81c98a74cc22ea31a +Qy = 6fc5e9568ae62b31412a0b0b367242e9fd7e518c83aa06a069e1d90d +k = a4c1eb402a2fb3af26e0e14a3d2fc8ed3bc1a8b2475270356a79fdd3 +R = d478b68733d8ad44be46766e7b66af782fbdc7ff7ed0b191176da98a +S = 5eae9160ccf71fd1d359d89cecce72ef8afaeee2365f6ba828aa450a + +Msg = 08079955d1a1f33728128c73673ec9f21a6ce138dcab5adc4dc068e6ab57314b9fbd8b013123b2fdafa9524fbdd0288777a233de8055cccfad83046ada6a19f01c47817496667bba8fc8b9456fc0e044a562d931dab1adcb66af8b66325bdf28d83ded3e2937958ccd19da540d70ef2c189f55a506c9c0d63406394c5bd3823b +d = f73e030d5a696b358986d3efaca121cf71f775f8835a21e6135145d7 +Qx = 9ca2c6ea87ac8dd3a23a5b4010841a7c8af309038882ae44634bcf55 +Qy = b0a347dbd5ded3b8702ac5a457e8b32bd4de06fd315095fa1b7d5fe1 +k = e3cc786c1288ea567836c51d6d69dd0cab5c015987d936ccc3a4beb3 +R = f1234da71761b7a0f49e661a419d2a739bdc4544bf87690e3d2f96db +S = 096d16bf8020c3d3c233894ad8eb81206010e62c6e692a215e088fd4 + +Msg = 23900b768f6cd42b8a8df0dcbc9cb5daec8de36b9d5c619adcc1ba2b649103d5af123746cdf19c3fd0665a6fb9338156182aa06181e3c6e37ce56979612af2927440424f89cef43fc754854b8a5c43370808cf5f9929cf47712512ce2f8a2a20d2e9f568c2848b27dfbe09142843c83905ffa5da3b15501761b03dbc2c5398b6 +d = 7a0789323f8741c157a1753ae165ecaf8e8b03a60561f8b80cee467c +Qx = 101271a9addd4bd1f19d00bf116c8524f52cefd598e85dc381597acb +Qy = 2f17d14f4d8ccb28b216553718152ba7c104646d8eca986dd9ddea39 +k = d169f04f05b60c625cda864d187938863964dab7bb3b9dfc04b05519 +R = e4a51be686a764b709da23ab48b1985e153c6ee238d945e743907afc +S = 118a8f1ffe3cd556ce6345bd1a398dd9cc3729b7fd6d8af9bfd82f40 + +Msg = 1eb28c0bcdd18f73e347f957ece15b4cc83a771b0877e1feaac38e24028fb38ccea8b54ee017dc7c3d5a1327bc6f40b294aa65d7dc487f278846cd101ee84202f14b38aa2c275046aa2577f65ebaea41cd383e8def2fd0b4444dcf426fa75c4082cd7fa035cdb1e0d34a3c79d42130f5b0273eae75bc701dda3aebe7358f41b5 +d = 78e795d0edb11fd9e28dc26b21e751aa89bea0d87932ef11c95c0e18 +Qx = 9edd544107977134bf6360d43ccabb3c94d627c03963c0a04b439627 +Qy = ece4c61d319a0e41f3de7863e7c355bac94395aaa74cdb5f74a87a5b +k = 36f7c0f76808b826a0a974a1fd6e155e00a73f1d34674a8f88be405a +R = 3e319444438bc2cc92f323ea842cb402b3c3c2448c89869ef7998edb +S = 3420cc38f058f41c31e71f4b1ad488f801111c73541de69fcee60695 + +Msg = efab51855407438fd5c250670366bca3c026ecec4a59394f00d8a4b51746d0c4564366656d507e3e13e62fe7abeb976b8859895848dbaecf6582f1898ea06f00d4247702ed9721bd375aa83ae4c67c2eaa6e080777ea5ecf2cf787d785389560ac91cf63a52f0373c3185e18a3b8a466e21b61a239f1b77624eb1acacc76c4e1 +d = bee02d8bc5bffb3fd3b4c9d6f686409f02662d10150d1e58d689966a +Qx = 8848f964c847fe9dddc774618d4588c9cd56bbe588d7b1fb369c8bfa +Qy = ebbb699fbd0dc08859fe9132285fe20dff3b9d561c0640b6e0717607 +k = 59f1450d857b40e5552a4b8cd4ab0df2f01716635d172c1106840f21 +R = a206d8398a16a991bc217f77f23c6f648384f254f255a8a876404444 +S = eb1169cb5b1423dc0bfaffe565ae57f986e00de06405e3e7b605862e + +Msg = 31c29ca10279a417f0cc9b1382cf54dbfdfc89f2e6ef08c403c11f580cbf8674b141ed1a417563282d99a55fc616d836421cde9424815c95e7fb7668bf3f137b29937f14882d74e034b732d78d91af7721aac4950734f5fa5d4b4d35534974f8cab6d2e6dca75ddb57e99148c8a59df9fc5bcd723e546e8356f671cf2f65640a +d = dc0ddf6e501418bb8eafc5d7ccc143369e2aa441df8fc57d5f94a738 +Qx = 063a5d632f4144376e14cfb03ad8ccf1489b613acd184d20dff66545 +Qy = e77727f057b043d8a0f7458196b72e92d11f85b0891c6aaa9d915f58 +k = ff0e5cae2671db7a1b90e22c63e7570bdd27352d45bac31e338debe0 +R = 5bc0b4998481ecbd3b6609184a84ca41d69b08c37138097f559259f8 +S = 0df8828eb1ca85e46405b94e1a2972c34c5e620a54e2f640f04aecc5 + +Msg = 8db476f92e332519c1a0ece5d8deded6efbd2d8e8784eea0a6b4c3b4296c35f5f8de4317e5c1627b91fb1973fee86c06e4992aa5a20cb7475c8808ff1da354d07a488dffa7838c6ec1e3f99e3acba831f27bee8434eeda3eb36d0c6df3658883cd40068b1bed841310f6eb38d4a3d07d85848770ff7933c054cd8b34662660b1 +d = 229d89b2fcf8441ffc95ebb2ac2ef156e25825782044b2b8bd6a3e01 +Qx = de616848d8044a44789ef1ba3a6dd66fe9257ddc57f7534e59a701be +Qy = 26cbf74a6d25e5b34b96d30f327abd574cff7f7dbe6686573a7d6c5c +k = 3b18ca6ec8e8e255ac88f64302745ca0b73ff94b2b2d48be95b4aaee +R = fa94fd8b827c06115c1eefd50afc02ce5926ee0e789667783c01c34b +S = edf766a66973cfc33e4159966c07321a7f6549c3c60e8586ef41402b + +Msg = fcb272c828fe8fd3c6f8de9410c7b6e2b36717c1b0e5e359e9109bd7fc378978aa98182a9d99961898ed88999b050d3b64d1457d7a899d6d273b9f4dde2aafa36d76329d62509043c338f265fc4c7d938459b7fa3b230a9f6cb632b61489546bb4181a5ad7f0d7369b8caced48eb374b075b2b325bc86add0f3b680cd9e80acd +d = 97d747068147c0393a0bb5c159e2c9f1bd538f6204823294883abe28 +Qx = 3858a576eef2ce24d01766997fb81b3f3f78b6104cd188610be221d7 +Qy = 95ffc677ac7bfe3e0bb4cffb17355a964c8356a807151b3cba5d1f4e +k = c1a2ec1ef16cfd5107c892790daefbed061be78bd8576696b60f64d5 +R = 18c908541843fcdac99b9ff6bb397f3f8094d16b42670216e4eaa2d7 +S = c107a8a508ff57c5d4f78f86cc37e129c864d1c44ed5e73909613b74 + +[P-224,SHA-512] + +Msg = 7522492bdb916a597b8121f3e5c273b1d2800ef8c1db4f7dcbae633b60d7da5193ba53a63d7a377b351897c3b24903ae1cd1994211b259be3e6ae2cbc8970e4957fdf782c7d1bc7a91c80c8ef65468d4ef35428f26e2940ae8b0bd9b8074236bf6c00d0ebe83f9ddb2ade0f835138d39f33b59f244e0037c171f1ba7045a96f5 +d = ba5374541c13597bded6880849184a593d69d3d4f0b1cb4d0919cbd6 +Qx = ac635fe00e8b7a3c8ef5655bdfb7f83e8532e59c0cc0b6534d810ffa +Qy = 1d067aebeba66e79b28ecfe59ac6fdf5e1970dc3a84499c9d90cd8e2 +k = 187ed1f45c466cbafcd4b9577fb222408c011225dcccfd20f08b8d89 +R = f83d54945997584c923c09662c34cf9ad1e987da8bfd9be600e7a098 +S = 4ff2dba9dba992c98a095b1144a539310e1a570e20c88b7d0aa1955c + +Msg = 61097114ff855c3e34a62d9b853f8982d35f29cfa4a89893badbca7849e5fb437a1a38d6451bf0ca5a0d528e352b8e4b57f2ea359a7fc8841d49dd3e570f9b016f14156b0bbc4be822e260bd147ec081454969e11cb0034b7450ef4deb7ed6edb977e2f4ed60121aa095fb0ab40240dc329ecc917f5c64b4410612af065ee9dd +d = 1e27187134d0a63542adf4665fba22f00cfc7b0a1e02effe913ceedc +Qx = ecaea8ceea55c3bd418fd34a4ff2499e25e66a104eed846bc00c31d2 +Qy = 3933a356ab1f2dabc303ff0a5d076131e77032e6f502336883bf78a7 +k = 34cb597deae9a3b1cada937abcd247161b19b2b336b20e2e42ae01f1 +R = 58177ba46fb291490b39368774accf72736412c1fb5ee0f27b9b1e02 +S = 58337d78b95a080bfcabb5809bee012501b4da84b8ef310a4628f11c + +Msg = dd09ae6c982bb1440ca175a87766fefeacc49393ff797c446200662744f37a6e30c5d33ba70cbd8f12277fd6cc0704c17478bbab2a3047469e9618e3c340a9c8caaff5ce7c8a4d90ecae6a9b84b813419dec14460298e7521c9b7fdb7a2089328005bd51d57f92a1bcbeecd34aa40482b549e006bbf6c4ce66d34a22dda4e0e0 +d = 0905b40e6c29bfcbf55e04266f68f10ca8d3905001d68bb61a27749b +Qx = d656b73b131aa4c6336a57849ce0d3682b6ab2113d013711e8c29762 +Qy = 6328335ffc2029afbfe2a15cc5636978778c3f9dab84840b05f2e705 +k = dc82840d147f893497a82f023d7d2cbf0a3a5b2ac6cc1b9b23e504be +R = 583af080e0ec7c1ba5a491a84889b7b7b11ccfe18927c7c219b11757 +S = b23700035349df25d839f0973bef78a7515287de6c83707907074fa6 + +Msg = 37a73e2774d3b274db426c89b945696daa96035031f72cea01894b24508c7f81961ec254d36ed6a0f448e11cf7950af769dc6cd2c47e52c6caf0ea92c270974f0214b4db436c36a60fb722060a6bb544462a82e1714f5906ec32886f7d59ebf289541c3a00ec1e004892ef2b1286a0194f55d083c6ec92c64b8fd1452e1c68ba +d = afbaede5d75e4f241dd5b53220f3f5b9c1aa1d5d298e2d43236452dc +Qx = fe83e59fc8ea8b939355d3258fe53a64d45f63031a0716b7cc416173 +Qy = f151d23060f1c856eb7f1f58be72a7228c3af89e43b56e9695b558c7 +k = 0fbbe7b40136c81a8fb894498d5502157a1cf5a89d0643de92cd38f6 +R = 24f3f457c7b72b7e759d5a8afbf330e31c5d8d2e36f92c0e79c5d87d +S = 36fd1193def34f12a960740fd79fb38bf2b480726ccad540eb42cdf8 + +Msg = 9dc2046ffdc6804544db964481abe5d2d276a2a9eeec4c7ad40215b1de23561d402db69bd0f6eec2254711eea4487c64d9a6b62c3ebaf5ffa8db6e7e3a6e17154d126967a47a853a6f8339bdca9be306a13c7f992ded7619b0da59909a49b1e0930360e05b47f18628a36d69b2f87f2bfddd6a5d4a72f84dc76dbdd43f3a6a35 +d = 950b07b0c2b7539a21b5135bfede214733f2e009647d38d8b21d760c +Qx = f43d13bbfcee3b724063b3910fea49fd591b81e86fdb813b1a492d0c +Qy = 6b4c8d6fa5dc661889e3cf5ec64997a78222837885f85d2fe9b684fb +k = 83e110d0d1e700d2f36543028737d2a2f1474aa3b4b28998a39e4793 +R = 2685265bc878e85d10ab13293dec190881a57c4a467f8fc2170432ea +S = 80a347bb49036522369339bd6485a967cdda818915d8eb947302fcf9 + +Msg = d9c6847fce688c5e7525a1098b545cb6c15dcd21a02761fc82fc664372a667390680135f91c01a2fa5430c634b1a6d1cd6002d8aa021e7bf5956a7901c2f81bc25d502ba5f55a55f30c0323dc68205cbefec0538e68654e7b327ac1743641896c3e740d8f66f400902b304eafaa4e0d8cffae140536f0922444cc3216a675697 +d = 015bd9f5dfef393b431c3c7fced24385d861ccb563542574a5d2a9bc +Qx = e868690641e2cda13b289a6c5d2fb175940396044d9cf27b4f2240af +Qy = 4c78c9abdf2b7fc67ed4497001d7bcf1daca1739dc14a661f91d7c40 +k = e2374350f47c08f3c1359d4edf87e61d1ba4e7dd1540d8d9062efa79 +R = e12dc088d2bc032bb214c77d0e0fb749fc8e61ebe1ed72996f1084b6 +S = 0ab58aa31e0bba5fbc76855e6549f1036fba0a589aeab978ab01b8fb + +Msg = 69df8a01b66f04930efd2012ff2243874f256ca8758145d2a9e4ecc84d0dbdbd0dc494ae06db0ccbe819918137c90957114558580d6623efbafdd342b38dad9f08708084d32f874fba04782ce26aaab78de2102ad171f8a8f2b30b5bd3d55fdac5fa3acd6f7def7e61c2533938572b331ba6d1c02bd74bfdbf7337ade8f4a190 +d = 0a3c259df933247445acffb6d8265b601d597fb9997dc2a1eb4deef4 +Qx = e67f4385a9da54253cc371ee9bc6739ae6385a4b87669c7baf0c460d +Qy = 2bb00b6ddd7b67d9ac5653ec04ca8529fbf16f815c04da3c2e58e82d +k = 8bf5859665b6a23e6b05a311580f60187ba1c4ae89e44877fb48af66 +R = 653675fb993c3fa9e57b32e33029ec230b966e8077c72c1ec90ddefc +S = 792723bf87e315147cd4303de7f1dfe95cd7658ebb95c38c1a196140 + +Msg = 927524982b8d60777c1105c86fac05f634abf58c73f84fb95d81ba0b86e1e43592c4fcad2e395a40fbe7005697d86088e2fb3bb7287eb3f917d4f2dc281f5cbe65d05b4f9623bca849b10a03beca6aa2056a12ebb91cf257ac448c5e9a78f8349a6a29b17c8978bef43a443cbb8a149eb23f794844fc41693f2dbb97181444be +d = a1c8ef463f9e7e3dd63e677412f87cf9ea4ac9a6a2dae629da5b9916 +Qx = 400e5cd4b315ceb309545cd3277acb70bdae2073fda6ad896ea14b27 +Qy = fbe1d2466cd2e116f38248bd5cabaa6cbe6c4a2694d998abd7b0c991 +k = 82f55a25d3ed6e47c22a6eed0fa52ed0818b87d6ea7950281dfefc09 +R = 16305a46a3f6f9e216ef8f6a6f5f0760d064a885657c864e1c1ea035 +S = 58fd97050bfbca6f87e64e1458c4ad80bae26e280356da344ad3b25d + +Msg = 5f9042283561e7f19a436d01c7ef5a950a6d77ede5629cd7e43c0a5d58e8c5673c37945a453291d12938253c71dbe12c8b022ba7276eda6be034ef5ec1ec77dbd1e08f0d7b8e7725b7ec671c075e008a20f77f4ab266f97079b0aa6337df59a33b881954084057b21f294dd14bcb0869a4a6f1f597955ec7bf9d19bb3537a66a +d = fa511dbf6fef7e5e9c73e4555eb75d435f7884322d9faf5d78cacc0b +Qx = e8dccd706c31f895f2f261ab979cbab51b8ae28196bcc12a42046380 +Qy = ec246be8e71ea3859cb717a59990fe22e4b76858ff49becd70739a01 +k = a37d665fe4314aa4cd03eb8e6a1f366b43e11fdb419c96b48f787b62 +R = 05e4909bcc172ab4140be291aad4660e375032bce2d762b6269ba764 +S = e347a1c9d3670690e1d8d1d4cd9579848f442199c10526488da5cebf + +Msg = c2ae5573d3bf396523bfb703db8502fd0760cd1be528f6ddbfb95aad399e0b19f3bd9e0fabdb05d49e3f893dffec5b627c9c2f7ad5f32e92e4e27a38cb5c28657657377fdfa1b66cd7ac3d15c6d49df92d284db99f69744f37dc7cb4e7d52920fdb200a7942623a7057ba82e467dcccaa5da416b48510d8364446a6a5e2a5aa8 +d = a58bd53646400a646f0e4208320dc679a9664d1c6bfb27fdc8eac7ea +Qx = e22e0dc4ecd96eb0071b72ba4b4988bf784f3fe73cb81bfb93d9ac4f +Qy = b3e213e518bee1367a4fb3703b9008bac9d95a1fc4aa61225fff9f3c +k = 42c5b6f87d3bb1ed74f5ee8398d8f8c61e9e50ffa7a1da12d39893f9 +R = 5c0e5c6f057de1e99ef5d237a60d7a07fa9a42b120a82f573d9fb7b2 +S = 2fffc0bf550bd2f650fed085a84501cacfa6a1bb984df1f9237eaa59 + +Msg = 03c1a1cd30a039d0dcb22fee2450a7fa79495a0d0f4f43d2de4d75bce003c0334a8860f5c164dbd94888a9f751235a3e570d31070e3e1293a7be616af7176600585d36ac013600157d2569d491da4b8a3bf3630c26e0b9925412189f50b0ae6f04c86477932e2ecd8c3546106ae1ebc684cc3adb27ed665eddece886adea4ce3 +d = 64bd4452b572cc95510ac2e572f41136299ff17f6e8448f4ffb571d0 +Qx = 92521fa25c2e034d127e0921efdb167f0b2ff8b20504487ed87fa264 +Qy = e72c770e37375ad7dc2c4e63e5701826f6606f6ffb9461ee61b4e872 +k = eaf76ee4d7e00d13d8a6d03dffd07ad9a8bb6dc8176c9f93059b1b7f +R = cf5058e2a6cf5e61a138b013eb292f38a1b9f07239ae5941dbce8919 +S = d14198621650d985d270bc997da6e78588fd0ef843b874c66a3de3c3 + +Msg = 888f6d9bc7c86c0079fbfd42d8c08d6958f40f6e570fb0b1f03d2f8f8a63df4fcc87b379a222cf835820a999d34996e08961f13b86b075e7fd1c303cd3baa44de42168561589012f7e5300da4f8bdf470c07119a5d9f7ba7293568cd7c6a1b7fc1e41cda40bed7d46e5a28af67ae2aabfefe67a86a1c601e6f5ee543e09bd7b6 +d = 7f3edb710df9d982f486233d0c176aa88f5a0ee81efa9b8145020294 +Qx = e7611e013e7b43ff5b8b57ad83333bffcc9e469ad23070b5791dc594 +Qy = 7784da0a11dbe16208c6e0b6d5029e71fbec4dffc9fa046d3eeb71c9 +k = 94db7ef9a232593091eb9a74f289529c7e0d7fef21f80b3c8556b75e +R = a971f45bab10b1d16d7234ca8e4ec987da20d9e867f28aa063296e23 +S = e38c538d65a7e1a28fd3ec53f015a7e5beb60e9d309f1e3ba4b2c3d2 + +Msg = 48453340f1317769e6ee6e103153714365731163dc18f84e9f2fa4b120f9c5a9645ee2f9b66c84c26d95912b422b009b64af96aa418b2427a4209f2e7513ba8e43ec8cf20b34e7529b22eb1199545afe9a9f7d9bcb320aec9ee0162f91c0d1dd9674c9c284f25199c5e109f6f84d7ed0d269cc6413edb81bc2c83e37d644d8b9 +d = b569f8296ff1d9cc01fffd9919016e5730c1858bdb7b99527153751a +Qx = 242f34959516a4706172f7dede23110efa314bff22eb320ab88feeff +Qy = 45e3227710900a8acfc9bcce728119d042f64ca40876c2b380ee46e0 +k = ae61523866a8f43e6cdd42ba27a34ed06527e8a5842901a64c393f76 +R = c2732a4e0815f9f785500e80147e9486994446beccf8a6a352b97585 +S = 6ecaece6487d7920e398f7f951ab7c7aba5832dabf03704106ad1244 + +Msg = 4bdfd3b91d83108409ad765b256e0c9b9937ecf647f8e6f9fc807e2e72af8246178b3fe046b4ea10170450d71a4eec790ecb05f03d7077341de26c4db7eeae24d55c9a9093e837dfdb38168fe8230cb9605825a1282fecd741989bfcdb34678fe077477927f66bd26d003e5dda22043341a14dd31841ba483ad5ce2701e0f68e +d = 41a4dd8eee39232b728516e2f21e66011e7426a6b25986c3ffa237e4 +Qx = c32988171caab178bf50dc7310bc7f604df5a9d19a8e602519c72d8a +Qy = f8985d112ad9de05969e5364d943c1cc5cd198359f4c62b19da0e117 +k = 827d4999da81fa920c8492ccc1e2d5cdafed9754cf7382a859952071 +R = 89c61da7422ccd676baec07e2185c12e947a2374eede87847304be6c +S = 2685379624717ea28422e8d001c090405a130b4ef9f1ac726c3ca502 + +Msg = e6cdee8558bc1eacc24e82f0624ce8d02cc8d925b4dd3dec3a72f4a4e0fb76076bfa3ef2e2c33bdd7c27b322bdc09bbfee8fe46f75dbd7bbd2af09690b7137943efe21706e0a1b6d3089540fc58d85ddb55ea836616db573e36c521be008893f40a0a7c349602cc178ea43be59d31ec6449e7ff2c5379379f7d7645134df1bc3 +d = 67fa50569257c8cc89ac0325db4902003a62f30b917f53e4035a7e04 +Qx = 6773a0436a9c42635730413b19aa4166f08c69c0e5002953da42253b +Qy = 555138290b093bf2fe79acda9131d920cd1e7ac43fb8775776cd713c +k = 557cb45fd3a30b3bdbf08c56eabbd4478736024aaa52bf8448096453 +R = 8e92cf7a674aa5f7542dd95c695589a05747431692edd04804299b8f +S = af4908b41f8180b71a6ff10fd51f3d143147af6ddddf7534d3284ed9 + + +[P-256,SHA-224] + +Msg = ff624d0ba02c7b6370c1622eec3fa2186ea681d1659e0a845448e777b75a8e77a77bb26e5733179d58ef9bc8a4e8b6971aef2539f77ab0963a3415bbd6258339bd1bf55de65db520c63f5b8eab3d55debd05e9494212170f5d65b3286b8b668705b1e2b2b5568610617abb51d2dd0cb450ef59df4b907da90cfa7b268de8c4c2 +d = 708309a7449e156b0db70e5b52e606c7e094ed676ce8953bf6c14757c826f590 +Qx = 29578c7ab6ce0d11493c95d5ea05d299d536801ca9cbd50e9924e43b733b83ab +Qy = 08c8049879c6278b2273348474158515accaa38344106ef96803c5a05adc4800 +k = 58f741771620bdc428e91a32d86d230873e9140336fcfb1e122892ee1d501bdc +R = 4a19274429e40522234b8785dc25fc524f179dcc95ff09b3c9770fc71f54ca0d +S = 58982b79a65b7320f5b92d13bdaecdd1259e760f0f718ba933fd098f6f75d4b7 + +Msg = 9155e91fd9155eeed15afd83487ea1a3af04c5998b77c0fe8c43dcc479440a8a9a89efe883d9385cb9edfde10b43bce61fb63669935ad39419cf29ef3a936931733bfc2378e253e73b7ae9a3ec7a6a7932ab10f1e5b94d05160c053988f3bdc9167155d069337d42c9a7056619efc031fa5ec7310d29bd28980b1e3559757578 +d = 90c5386100b137a75b0bb495002b28697a451add2f1f22cb65f735e8aaeace98 +Qx = 4a92396ff7930b1da9a873a479a28a9896af6cc3d39345b949b726dc3cd978b5 +Qy = 475abb18eaed948879b9c1453e3ef2755dd90f77519ec7b6a30297aad08e4931 +k = 36f853b5c54b1ec61588c9c6137eb56e7a708f09c57513093e4ecf6d739900e5 +R = 38b29558511061cfabdc8e5bb65ac2976d1aa2ba9a5deab8074097b2172bb9ad +S = 0de2cde610502b6e03c0b23602eafbcd3faf886c81d111d156b7aa550f5bcd51 + +Msg = b242a7586a1383368a33c88264889adfa3be45422fbef4a2df4e3c5325a9c7757017e0d5cf4bbf4de7f99d189f81f1fd2f0dd645574d1eb0d547eead9375677819297c1abe62526ae29fc54cdd11bfe17714f2fbd2d0d0e8d297ff98535980482dd5c1ebdc5a7274aabf1382c9f2315ca61391e3943856e4c5e616c2f1f7be0d +d = a3a43cece9c1abeff81099fb344d01f7d8df66447b95a667ee368f924bccf870 +Qx = 5775174deb0248112e069cb86f1546ac7a78bc2127d0cb953bad46384dd6be5b +Qy = a27020952971cc0b0c3abd06e9ca3e141a4943f560564eba31e5288928bc7ce7 +k = a0d9a7a245bd9b9aa86cecb89341c9de2e4f9b5d095a8150826c7ba7fb3e7df7 +R = b02a440add66a9ff9c3c0e9acf1be678f6bd48a10cbdec2ad6d186ffe05f3f2a +S = a98bea42aec56a1fcecec00a1cc69b01fcbcf5de7ac1b2f2dcc09b6db064f92b + +Msg = b64005da76b24715880af94dba379acc25a047b06066c9bedc8f17b8c74e74f4fc720d9f4ef0e2a659e0756931c080587ebdcd0f85e819aea6dacb327a9d96496da53ea21aef3b2e793a9c0def5196acec99891f46ead78a85bc7ab644765781d3543da9fbf9fec916dca975ef3b4271e50ecc68bf79b2d8935e2b25fc063358 +d = 7bbc8ff13f6f921f21e949b224c16b7176c5984d312b671cf6c2e4841135fc7f +Qx = f888e913ec6f3cd8b31eb89e4f8aaa8887d30ae5348ed7118696949d5b8cc7c1 +Qy = 08895d09620500d244e5035e262dea3f2867cd8967b226324d5c05220d8b410c +k = 21c942f3b487accbf7fadc1c4b7a6c7567ce876c195022459fa1ebf6d04ffbaa +R = 2e6cc883b8acc904ee9691ef4a9f1f5a9e5fbfde847cda3be833f949fb9c7182 +S = 2ac48f7a930912131a8b4e3ab495307817c465d638c2a9ea5ae9e2808806e20a + +Msg = fe6e1ea477640655eaa1f6e3352d4bce53eb3d95424df7f238e93d8531da8f36bc35fa6be4bf5a6a382e06e855139eb617a9cc9376b4dafacbd80876343b12628619d7cbe1bff6757e3706111ed53898c0219823adbc044eaf8c6ad449df8f6aab9d444dadb5c3380eec0d91694df5fc4b30280d4b87d27e67ae58a1df828963 +d = daf5ec7a4eebc20d9485796c355b4a65ad254fe19b998d0507e91ea24135f45d +Qx = 137c465085c1b1b8cccbe9fccbe9d0295a331aaf332f3ed2e285d16e574b943b +Qy = d3e8d5a24cd218c19760b0e85b35a8569945aa857cbf0fd6a3ce127581b217b6 +k = 343251dffa56e6a612fec7b078f9c3819eab402a72686b894a47a08fd97e6c23 +R = 775e25a296bd259510ae9375f548997bec8a744900022945281dc8c4d94f2b5b +S = d87592ceab773ae103daebbb56a04144aaccb1e14efc1024dc36c0e382df1f70 + +Msg = 907c0c00dc080a688548957b5b8b1f33ba378de1368023dcad43242411f554eb7d392d3e5c1668fad3944ff9634105343d83b8c85d2a988da5f5dc60ee0518327caed6dd5cf4e9bc6222deb46d00abde745f9b71d6e7aee6c7fdfc9ed053f2c0b611d4c6863088bd012ea9810ee94f8e58905970ebd07353f1f409a371ed03e3 +d = 8729a8396f262dabd991aa404cc1753581cea405f0d19222a0b3f210de8ee3c5 +Qx = 82b1f1a7af9b48ca8452613d7032beb0e4f28fe710306aeccc959e4d03662a35 +Qy = 5e39f33574097b8d32b471a591972496f5d44db344c037d13f06fafc75f016fd +k = 6de9e21f0b2cacc1762b3558fd44d3cf156b85dbef430dd28d59713bfb9cfa0b +R = a754b42720e71925d51fcef76151405a3696cc8f9fc9ca7b46d0b16edd7fb699 +S = 603924780439cc16ac4cf97c2c3065bc95353aa9179d0ab5f0322ca82f851cf2 + +Msg = 771c4d7bce05610a3e71b272096b57f0d1efcce33a1cb4f714d6ebc0865b2773ec5eedc25fae81dee1d256474dbd9676623614c150916e6ed92ce4430b26037d28fa5252ef6b10c09dc2f7ee5a36a1ea7897b69f389d9f5075e271d92f4eb97b148f3abcb1e5be0b4feb8278613d18abf6da60bfe448238aa04d7f11b71f44c5 +d = f1b62413935fc589ad2280f6892599ad994dae8ca3655ed4f7318cc89b61aa96 +Qx = e0bbfe4016eea93e6f509518cbffc25d492de6ebbf80465a461caa5bdc018159 +Qy = 3231ee7a119d84fa56e3034d50fea85929aec2eb437abc7646821e1bf805fb50 +k = 7a33eeb9f469afd55de2fb786847a1d3e7797929305c0f90d953b6f143bb8fc6 +R = 96d1c9399948254ea381631fc0f43ea808110506db8aacf081df5535ac5eb8ad +S = 73bf3691260dddd9997c97313f2a70783eacf8d15bdfb34bb13025cdfae72f70 + +Msg = a3b2825235718fc679b942e8ac38fb4f54415a213c65875b5453d18ca012320ddfbbc58b991eaebadfc2d1a28d4f0cd82652b12e4d5bfda89eda3be12ac52188e38e8cce32a264a300c0e463631f525ae501348594f980392c76b4a12ddc88e5ca086cb8685d03895919a8627725a3e00c4728e2b7c6f6a14fc342b2937fc3dd +d = 4caaa26f93f009682bbba6db6b265aec17b7ec1542bda458e8550b9e68eed18d +Qx = e3c58c1c254d11c7e781ad133e4c36dd1b5de362120d336a58e7b68813f3fbee +Qy = 59760db66120afe0d962c81a8e5586588fd19de2f40556371611c73af22c8a68 +k = c0d37142dc8b0d614fad20c4d35af6eb819e259e513ddeac1e1c273e7e1dc1bb +R = 25dd8e4086c62a40d2a310e2f90f6af5cb7e677b4dfdb4dc4e99e23ea2f0e6dc +S = 90ad62c179b0c9d61f521dde1cd762bfd224b5525c39c3706f2549313ddb4f39 + +Msg = 3e6e2a9bffd729ee5d4807849cd4250021d8184cda723df6ab0e5c939d39237c8e58af9d869fe62d3c97b3298a99e891e5e11aa68b11a087573a40a3e83c7965e7910d72f81cad0f42accc5c25a4fd3cdd8cee63757bbbfbdae98be2bc867d3bcb1333c4632cb0a55dffeb77d8b119c466cd889ec468454fabe6fbee7102deaf +d = 7af4b150bb7167cb68037f280d0823ce5320c01a92b1b56ee1b88547481b1de9 +Qx = cb3634ec4f0cbb99986be788f889e586026d5a851e80d15382f1bdb1bda2bc75 +Qy = 51e4e43bc16fb114896b18198a1aebe6054ba20ed0c0317c1b8776158c0e6bfb +k = 98edd59fafbcaee5f64e84eb5ed59fff45d14aabada47cee2fa674377173627a +R = 261a1cdb0fd93c0fb06ea6068b6b03c330a12f621a7eba76682a1d152c0e8d08 +S = 7ca049bad54feee101d6db807635ffb8bdb05a38e445c8c3d65d60df143514c5 + +Msg = 52e5c308e70329a17c71eaedb66bbee303c8ec48a6f1a2efb235d308563cd58553d434e12f353227a9ea28608ec9c820ed83c95124e7a886f7e832a2de1032e78dc059208f9ec354170b2b1cab992b52ac01e6c0e4e1b0112686962edc53ab226dafcc9fc7baed2cd9307160e8572edb125935db49289b178f35a8ad23f4f801 +d = 52ad53e849e30bec0e6345c3e9d98ebc808b19496c1ef16d72ab4a00bbb8c634 +Qx = 7cca1334bfc2a78728c50b370399be3f9690d445aa03c701da643eeb0b0f7fa8 +Qy = 3f7522238668e615405e49b2f63faee58286000a30cdb4b564ac0df99bc8950f +k = 8650c30712fc253610884fbba4a332a4574d4b7822f7776cab1df8f5fa05442a +R = a18194c7ac5829afc408d78dde19542837e7be82706c3941b2d9c5e036bb51e0 +S = 188ead1cdf7c1d21114ff56d0421ffd501ab978ef58337462c0fa736d86299af + +Msg = d3e9e82051d4c84d699453c9ff44c7c09f6523bb92232bcf30bf3c380224249de2964e871d56a364d6955c81ef91d06482a6c7c61bc70f66ef22fad128d15416e7174312619134f968f1009f92cbf99248932efb533ff113fb6d949e21d6b80dfbbe69010c8d1ccb0f3808ea309bb0bac1a222168c95b088847e613749b19d04 +d = 80754962a864be1803bc441fa331e126005bfc6d8b09ed38b7e69d9a030a5d27 +Qx = 0aaeed6dd1ae020d6eefc98ec4241ac93cbd3c8afed05bb28007e7da5727571b +Qy = 2dda1d5b7872eb94dfffb456115037ff8d3e72f8ebdd8fcfc42391f96809be69 +k = 738e050aeefe54ecba5be5f93a97bbcb7557d701f9da2d7e88483454b97b55a8 +R = 8cb9f41dfdcb9604e0725ac9b78fc0db916dc071186ee982f6dba3da36f02efa +S = 5c87fe868fd4282fb114f5d70e9590a10a5d35cedf3ff6402ba5c4344738a32e + +Msg = 968951c2c1918436fe19fa2fe2152656a08f9a6b8aa6201920f1b424da98cee71928897ff087620cc5c551320b1e75a1e98d7d98a5bd5361c9393759614a6087cc0f7fb01fcb173783eb4c4c23961a8231ac4a07d72e683b0c1bd4c51ef1b031df875e7b8d5a6e0628949f5b8f157f43dccaea3b2a4fc11181e6b451e06ceb37 +d = cfa8c8bd810eb0d73585f36280ecdd296ee098511be8ad5eac68984eca8eb19d +Qx = c227a2af15dfa8734e11c0c50f77e24e77ed58dd8cccf1b0e9fa06bee1c64766 +Qy = b686592ce3745eb300d2704083db55e1fa8274e4cb7e256889ccc0bb34a60570 +k = 2d6b449bb38b543d6b6d34ff8cb053f5e5b337f949b069b21f421995ebb28823 +R = 5e89d3c9b103c2fa3cb8cebeec23640acda0257d63ffbe2d509bfc49fab1dca6 +S = d70c5b1eeb29e016af9925798d24e166c23d58fedd2f1a3bbdb1ef78cdbfb63a + +Msg = 78048628932e1c1cdd1e70932bd7b76f704ba08d7e7d825d3de763bf1a062315f4af16eccefe0b6ebadccaf403d013f50833ce2c54e24eea8345e25f93b69bb048988d102240225ceacf5003e2abdcc90299f4bf2c101585d36ecdd7a155953c674789d070480d1ef47cc7858e97a6d87c41c6922a00ea12539f251826e141b4 +d = b2021e2665ce543b7feadd0cd5a4bd57ffcc5b32deb860b4d736d9880855da3c +Qx = 722e0abad4504b7832a148746153777694714eca220eced2b2156ca64cfed3dd +Qy = f0351b357b3081e859c46cad5328c5afa10546e92bc6c3fd541796ac30397a75 +k = b15bbce4b382145de7ecd670d947e77555ef7cd1693bd53c694e2b52b04d10e1 +R = 9d086dcd22da165a43091991bede9c1c14515e656633cb759ec2c17f51c35253 +S = 23595ad1cb714559faaecaf946beb9a71e584616030ceaed8a8470f4bf62768f + +Msg = 9b0800c443e693067591737fdbcf0966fdfa50872d41d0c189d87cbc34c2771ee5e1255fd604f09fcf167fda16437c245d299147299c69046895d22482db29aba37ff57f756716cd3d6223077f747c4caffbecc0a7c9dfaaafd9a9817470ded8777e6355838ac54d11b2f0fc3f43668ff949cc31de0c2d15af5ef17884e4d66a +d = 0c9bce6a568ca239395fc3552755575cbcdddb1d89f6f5ab354517a057b17b48 +Qx = 4814d454495df7103e2da383aba55f7842fd84f1750ee5801ad32c10d0be6c7d +Qy = a0bd039d5097c8f0770477f6b18d247876e88e528bf0453eab515ffab8a9eda3 +k = d414f1525cdcc41eba1652de017c034ebcc7946cb2efe4713d09f67c85b83153 +R = 84db02c678f9a21208cec8564d145a35ba8c6f26b4eb7e19522e439720dae44c +S = 537c564da0d2dc5ac4376c5f0ca3b628d01d48df47a83d842c927e4d6db1e16d + +Msg = fc3b8291c172dae635a6859f525beaf01cf683765d7c86f1a4d768df7cae055f639eccc08d7a0272394d949f82d5e12d69c08e2483e11a1d28a4c61f18193106e12e5de4a9d0b4bf341e2acd6b715dc83ae5ff63328f8346f35521ca378b311299947f63ec593a5e32e6bd11ec4edb0e75302a9f54d21226d23314729e061016 +d = 1daa385ec7c7f8a09adfcaea42801a4de4c889fb5c6eb4e92bc611d596d68e3f +Qx = f04e9f2831d9697ae146c7d4552e5f91085cc46778400b75b76f00205252941d +Qy = bd267148174cd0c2b019cd0a5256e2f3f889d1e597160372b5a1339c8d787f10 +k = 7707db348ee6f60365b43a2a994e9b40ed56fe03c2c31c7e781bc4ffadcba760 +R = 5d95c385eeba0f15db0b80ae151912409128c9c80e554246067b8f6a36d85ea5 +S = db5d8a1e345f883e4fcb3871276f170b783c1a1e9da6b6615913368a8526f1c3 + +[P-256,SHA-256] + +Msg = 5905238877c77421f73e43ee3da6f2d9e2ccad5fc942dcec0cbd25482935faaf416983fe165b1a045ee2bcd2e6dca3bdf46c4310a7461f9a37960ca672d3feb5473e253605fb1ddfd28065b53cb5858a8ad28175bf9bd386a5e471ea7a65c17cc934a9d791e91491eb3754d03799790fe2d308d16146d5c9b0d0debd97d79ce8 +d = 519b423d715f8b581f4fa8ee59f4771a5b44c8130b4e3eacca54a56dda72b464 +Qx = 1ccbe91c075fc7f4f033bfa248db8fccd3565de94bbfb12f3c59ff46c271bf83 +Qy = ce4014c68811f9a21a1fdb2c0e6113e06db7ca93b7404e78dc7ccd5ca89a4ca9 +k = 94a1bbb14b906a61a280f245f9e93c7f3b4a6247824f5d33b9670787642a68de +R = f3ac8061b514795b8843e3d6629527ed2afd6b1f6a555a7acabb5e6f79c8c2ac +S = 8bf77819ca05a6b2786c76262bf7371cef97b218e96f175a3ccdda2acc058903 + +Msg = c35e2f092553c55772926bdbe87c9796827d17024dbb9233a545366e2e5987dd344deb72df987144b8c6c43bc41b654b94cc856e16b96d7a821c8ec039b503e3d86728c494a967d83011a0e090b5d54cd47f4e366c0912bc808fbb2ea96efac88fb3ebec9342738e225f7c7c2b011ce375b56621a20642b4d36e060db4524af1 +d = 0f56db78ca460b055c500064824bed999a25aaf48ebb519ac201537b85479813 +Qx = e266ddfdc12668db30d4ca3e8f7749432c416044f2d2b8c10bf3d4012aeffa8a +Qy = bfa86404a2e9ffe67d47c587ef7a97a7f456b863b4d02cfc6928973ab5b1cb39 +k = 6d3e71882c3b83b156bb14e0ab184aa9fb728068d3ae9fac421187ae0b2f34c6 +R = 976d3a4e9d23326dc0baa9fa560b7c4e53f42864f508483a6473b6a11079b2db +S = 1b766e9ceb71ba6c01dcd46e0af462cd4cfa652ae5017d4555b8eeefe36e1932 + +Msg = 3c054e333a94259c36af09ab5b4ff9beb3492f8d5b4282d16801daccb29f70fe61a0b37ffef5c04cd1b70e85b1f549a1c4dc672985e50f43ea037efa9964f096b5f62f7ffdf8d6bfb2cc859558f5a393cb949dbd48f269343b5263dcdb9c556eca074f2e98e6d94c2c29a677afaf806edf79b15a3fcd46e7067b7669f83188ee +d = e283871239837e13b95f789e6e1af63bf61c918c992e62bca040d64cad1fc2ef +Qx = 74ccd8a62fba0e667c50929a53f78c21b8ff0c3c737b0b40b1750b2302b0bde8 +Qy = 29074e21f3a0ef88b9efdf10d06aa4c295cc1671f758ca0e4cd108803d0f2614 +k = ad5e887eb2b380b8d8280ad6e5ff8a60f4d26243e0124c2f31a297b5d0835de2 +R = 35fb60f5ca0f3ca08542fb3cc641c8263a2cab7a90ee6a5e1583fac2bb6f6bd1 +S = ee59d81bc9db1055cc0ed97b159d8784af04e98511d0a9a407b99bb292572e96 + +Msg = 0989122410d522af64ceb07da2c865219046b4c3d9d99b01278c07ff63eaf1039cb787ae9e2dd46436cc0415f280c562bebb83a23e639e476a02ec8cff7ea06cd12c86dcc3adefbf1a9e9a9b6646c7599ec631b0da9a60debeb9b3e19324977f3b4f36892c8a38671c8e1cc8e50fcd50f9e51deaf98272f9266fc702e4e57c30 +d = a3d2d3b7596f6592ce98b4bfe10d41837f10027a90d7bb75349490018cf72d07 +Qx = 322f80371bf6e044bc49391d97c1714ab87f990b949bc178cb7c43b7c22d89e1 +Qy = 3c15d54a5cc6b9f09de8457e873eb3deb1fceb54b0b295da6050294fae7fd999 +k = 24fc90e1da13f17ef9fe84cc96b9471ed1aaac17e3a4bae33a115df4e5834f18 +R = d7c562370af617b581c84a2468cc8bd50bb1cbf322de41b7887ce07c0e5884ca +S = b46d9f2d8c4bf83546ff178f1d78937c008d64e8ecc5cbb825cb21d94d670d89 + +Msg = dc66e39f9bbfd9865318531ffe9207f934fa615a5b285708a5e9c46b7775150e818d7f24d2a123df3672fff2094e3fd3df6fbe259e3989dd5edfcccbe7d45e26a775a5c4329a084f057c42c13f3248e3fd6f0c76678f890f513c32292dd306eaa84a59abe34b16cb5e38d0e885525d10336ca443e1682aa04a7af832b0eee4e7 +d = 53a0e8a8fe93db01e7ae94e1a9882a102ebd079b3a535827d583626c272d280d +Qx = 1bcec4570e1ec2436596b8ded58f60c3b1ebc6a403bc5543040ba82963057244 +Qy = 8af62a4c683f096b28558320737bf83b9959a46ad2521004ef74cf85e67494e1 +k = 5d833e8d24cc7a402d7ee7ec852a3587cddeb48358cea71b0bedb8fabe84e0c4 +R = 18caaf7b663507a8bcd992b836dec9dc5703c080af5e51dfa3a9a7c387182604 +S = 77c68928ac3b88d985fb43fb615fb7ff45c18ba5c81af796c613dfa98352d29c + +Msg = 600974e7d8c5508e2c1aab0783ad0d7c4494ab2b4da265c2fe496421c4df238b0be25f25659157c8a225fb03953607f7df996acfd402f147e37aee2f1693e3bf1c35eab3ae360a2bd91d04622ea47f83d863d2dfecb618e8b8bdc39e17d15d672eee03bb4ce2cc5cf6b217e5faf3f336fdd87d972d3a8b8a593ba85955cc9d71 +d = 4af107e8e2194c830ffb712a65511bc9186a133007855b49ab4b3833aefc4a1d +Qx = a32e50be3dae2c8ba3f5e4bdae14cf7645420d425ead94036c22dd6c4fc59e00 +Qy = d623bf641160c289d6742c6257ae6ba574446dd1d0e74db3aaa80900b78d4ae9 +k = e18f96f84dfa2fd3cdfaec9159d4c338cd54ad314134f0b31e20591fc238d0ab +R = 8524c5024e2d9a73bde8c72d9129f57873bbad0ed05215a372a84fdbc78f2e68 +S = d18c2caf3b1072f87064ec5e8953f51301cada03469c640244760328eb5a05cb + +Msg = dfa6cb9b39adda6c74cc8b2a8b53a12c499ab9dee01b4123642b4f11af336a91a5c9ce0520eb2395a6190ecbf6169c4cba81941de8e76c9c908eb843b98ce95e0da29c5d4388040264e05e07030a577cc5d176387154eabae2af52a83e85c61c7c61da930c9b19e45d7e34c8516dc3c238fddd6e450a77455d534c48a152010b +d = 78dfaa09f1076850b3e206e477494cddcfb822aaa0128475053592c48ebaf4ab +Qx = 8bcfe2a721ca6d753968f564ec4315be4857e28bef1908f61a366b1f03c97479 +Qy = 0f67576a30b8e20d4232d8530b52fb4c89cbc589ede291e499ddd15fe870ab96 +k = 295544dbb2da3da170741c9b2c6551d40af7ed4e891445f11a02b66a5c258a77 +R = c5a186d72df452015480f7f338970bfe825087f05c0088d95305f87aacc9b254 +S = 84a58f9e9d9e735344b316b1aa1ab5185665b85147dc82d92e969d7bee31ca30 + +Msg = 51d2547cbff92431174aa7fc7302139519d98071c755ff1c92e4694b58587ea560f72f32fc6dd4dee7d22bb7387381d0256e2862d0644cdf2c277c5d740fa089830eb52bf79d1e75b8596ecf0ea58a0b9df61e0c9754bfcd62efab6ea1bd216bf181c5593da79f10135a9bc6e164f1854bc8859734341aad237ba29a81a3fc8b +d = 80e692e3eb9fcd8c7d44e7de9f7a5952686407f90025a1d87e52c7096a62618a +Qx = a88bc8430279c8c0400a77d751f26c0abc93e5de4ad9a4166357952fe041e767 +Qy = 2d365a1eef25ead579cc9a069b6abc1b16b81c35f18785ce26a10ba6d1381185 +k = 7c80fd66d62cc076cef2d030c17c0a69c99611549cb32c4ff662475adbe84b22 +R = 9d0c6afb6df3bced455b459cc21387e14929392664bb8741a3693a1795ca6902 +S = d7f9ddd191f1f412869429209ee3814c75c72fa46a9cccf804a2f5cc0b7e739f + +Msg = 558c2ac13026402bad4a0a83ebc9468e50f7ffab06d6f981e5db1d082098065bcff6f21a7a74558b1e8612914b8b5a0aa28ed5b574c36ac4ea5868432a62bb8ef0695d27c1e3ceaf75c7b251c65ddb268696f07c16d2767973d85beb443f211e6445e7fe5d46f0dce70d58a4cd9fe70688c035688ea8c6baec65a5fc7e2c93e8 +d = 5e666c0db0214c3b627a8e48541cc84a8b6fd15f300da4dff5d18aec6c55b881 +Qx = 1bc487570f040dc94196c9befe8ab2b6de77208b1f38bdaae28f9645c4d2bc3a +Qy = ec81602abd8345e71867c8210313737865b8aa186851e1b48eaca140320f5d8f +k = 2e7625a48874d86c9e467f890aaa7cd6ebdf71c0102bfdcfa24565d6af3fdce9 +R = 2f9e2b4e9f747c657f705bffd124ee178bbc5391c86d056717b140c153570fd9 +S = f5413bfd85949da8d83de83ab0d19b2986613e224d1901d76919de23ccd03199 + +Msg = 4d55c99ef6bd54621662c3d110c3cb627c03d6311393b264ab97b90a4b15214a5593ba2510a53d63fb34be251facb697c973e11b665cb7920f1684b0031b4dd370cb927ca7168b0bf8ad285e05e9e31e34bc24024739fdc10b78586f29eff94412034e3b606ed850ec2c1900e8e68151fc4aee5adebb066eb6da4eaa5681378e +d = f73f455271c877c4d5334627e37c278f68d143014b0a05aa62f308b2101c5308 +Qx = b8188bd68701fc396dab53125d4d28ea33a91daf6d21485f4770f6ea8c565dde +Qy = 423f058810f277f8fe076f6db56e9285a1bf2c2a1dae145095edd9c04970bc4a +k = 62f8665fd6e26b3fa069e85281777a9b1f0dfd2c0b9f54a086d0c109ff9fd615 +R = 1cc628533d0004b2b20e7f4baad0b8bb5e0673db159bbccf92491aef61fc9620 +S = 880e0bbf82a8cf818ed46ba03cf0fc6c898e36fca36cc7fdb1d2db7503634430 + +Msg = f8248ad47d97c18c984f1f5c10950dc1404713c56b6ea397e01e6dd925e903b4fadfe2c9e877169e71ce3c7fe5ce70ee4255d9cdc26f6943bf48687874de64f6cf30a012512e787b88059bbf561162bdcc23a3742c835ac144cc14167b1bd6727e940540a9c99f3cbb41fb1dcb00d76dda04995847c657f4c19d303eb09eb48a +d = b20d705d9bd7c2b8dc60393a5357f632990e599a0975573ac67fd89b49187906 +Qx = 51f99d2d52d4a6e734484a018b7ca2f895c2929b6754a3a03224d07ae61166ce +Qy = 4737da963c6ef7247fb88d19f9b0c667cac7fe12837fdab88c66f10d3c14cad1 +k = 72b656f6b35b9ccbc712c9f1f3b1a14cbbebaec41c4bca8da18f492a062d6f6f +R = 9886ae46c1415c3bc959e82b760ad760aab66885a84e620aa339fdf102465c42 +S = 2bf3a80bc04faa35ebecc0f4864ac02d349f6f126e0f988501b8d3075409a26c + +Msg = 3b6ee2425940b3d240d35b97b6dcd61ed3423d8e71a0ada35d47b322d17b35ea0472f35edd1d252f87b8b65ef4b716669fc9ac28b00d34a9d66ad118c9d94e7f46d0b4f6c2b2d339fd6bcd351241a387cc82609057048c12c4ec3d85c661975c45b300cb96930d89370a327c98b67defaa89497aa8ef994c77f1130f752f94a4 +d = d4234bebfbc821050341a37e1240efe5e33763cbbb2ef76a1c79e24724e5a5e7 +Qx = 8fb287f0202ad57ae841aea35f29b2e1d53e196d0ddd9aec24813d64c0922fb7 +Qy = 1f6daff1aa2dd2d6d3741623eecb5e7b612997a1039aab2e5cf2de969cfea573 +k = d926fe10f1bfd9855610f4f5a3d666b1a149344057e35537373372ead8b1a778 +R = 490efd106be11fc365c7467eb89b8d39e15d65175356775deab211163c2504cb +S = 644300fc0da4d40fb8c6ead510d14f0bd4e1321a469e9c0a581464c7186b7aa7 + +Msg = c5204b81ec0a4df5b7e9fda3dc245f98082ae7f4efe81998dcaa286bd4507ca840a53d21b01e904f55e38f78c3757d5a5a4a44b1d5d4e480be3afb5b394a5d2840af42b1b4083d40afbfe22d702f370d32dbfd392e128ea4724d66a3701da41ae2f03bb4d91bb946c7969404cb544f71eb7a49eb4c4ec55799bda1eb545143a7 +d = b58f5211dff440626bb56d0ad483193d606cf21f36d9830543327292f4d25d8c +Qx = 68229b48c2fe19d3db034e4c15077eb7471a66031f28a980821873915298ba76 +Qy = 303e8ee3742a893f78b810991da697083dd8f11128c47651c27a56740a80c24c +k = e158bf4a2d19a99149d9cdb879294ccb7aaeae03d75ddd616ef8ae51a6dc1071 +R = e67a9717ccf96841489d6541f4f6adb12d17b59a6bef847b6183b8fcf16a32eb +S = 9ae6ba6d637706849a6a9fc388cf0232d85c26ea0d1fe7437adb48de58364333 + +Msg = 72e81fe221fb402148d8b7ab03549f1180bcc03d41ca59d7653801f0ba853add1f6d29edd7f9abc621b2d548f8dbf8979bd16608d2d8fc3260b4ebc0dd42482481d548c7075711b5759649c41f439fad69954956c9326841ea6492956829f9e0dc789f73633b40f6ac77bcae6dfc7930cfe89e526d1684365c5b0be2437fdb01 +d = 54c066711cdb061eda07e5275f7e95a9962c6764b84f6f1f3ab5a588e0a2afb1 +Qx = 0a7dbb8bf50cb605eb2268b081f26d6b08e012f952c4b70a5a1e6e7d46af98bb +Qy = f26dd7d799930062480849962ccf5004edcfd307c044f4e8f667c9baa834eeae +k = 646fe933e96c3b8f9f507498e907fdd201f08478d0202c752a7c2cfebf4d061a +R = b53ce4da1aa7c0dc77a1896ab716b921499aed78df725b1504aba1597ba0c64b +S = d7c246dc7ad0e67700c373edcfdd1c0a0495fc954549ad579df6ed1438840851 + +Msg = 21188c3edd5de088dacc1076b9e1bcecd79de1003c2414c3866173054dc82dde85169baa77993adb20c269f60a5226111828578bcc7c29e6e8d2dae81806152c8ba0c6ada1986a1983ebeec1473a73a04795b6319d48662d40881c1723a706f516fe75300f92408aa1dc6ae4288d2046f23c1aa2e54b7fb6448a0da922bd7f34 +d = 34fa4682bf6cb5b16783adcd18f0e6879b92185f76d7c920409f904f522db4b1 +Qx = 105d22d9c626520faca13e7ced382dcbe93498315f00cc0ac39c4821d0d73737 +Qy = 6c47f3cbbfa97dfcebe16270b8c7d5d3a5900b888c42520d751e8faf3b401ef4 +k = a6f463ee72c9492bc792fe98163112837aebd07bab7a84aaed05be64db3086f4 +R = 542c40a18140a6266d6f0286e24e9a7bad7650e72ef0e2131e629c076d962663 +S = 4f7f65305e24a6bbb5cff714ba8f5a2cee5bdc89ba8d75dcbf21966ce38eb66f + +[P-256,SHA-384] + +Msg = e0b8596b375f3306bbc6e77a0b42f7469d7e83635990e74aa6d713594a3a24498feff5006790742d9c2e9b47d714bee932435db747c6e733e3d8de41f2f91311f2e9fd8e025651631ffd84f66732d3473fbd1627e63dc7194048ebec93c95c159b5039ab5e79e42c80b484a943f125de3da1e04e5bf9c16671ad55a1117d3306 +d = b6faf2c8922235c589c27368a3b3e6e2f42eb6073bf9507f19eed0746c79dced +Qx = e0e7b99bc62d8dd67883e39ed9fa0657789c5ff556cc1fd8dd1e2a55e9e3f243 +Qy = 63fbfd0232b95578075c903a4dbf85ad58f8350516e1ec89b0ee1f5e1362da69 +k = 9980b9cdfcef3ab8e219b9827ed6afdd4dbf20bd927e9cd01f15762703487007 +R = f5087878e212b703578f5c66f434883f3ef414dc23e2e8d8ab6a8d159ed5ad83 +S = 306b4c6c20213707982dffbb30fba99b96e792163dd59dbe606e734328dd7c8a + +Msg = 099a0131179fff4c6928e49886d2fdb3a9f239b7dd5fa828a52cbbe3fcfabecfbba3e192159b887b5d13aa1e14e6a07ccbb21f6ad8b7e88fee6bea9b86dea40ffb962f38554056fb7c5bb486418915f7e7e9b9033fe3baaf9a069db98bc02fa8af3d3d1859a11375d6f98aa2ce632606d0800dff7f55b40f971a8586ed6b39e9 +d = 118958fd0ff0f0b0ed11d3cf8fa664bc17cdb5fed1f4a8fc52d0b1ae30412181 +Qx = afda82260c9f42122a3f11c6058839488f6d7977f6f2a263c67d06e27ea2c355 +Qy = 0ae2bbdd2207c590332c5bfeb4c8b5b16622134bd4dc55382ae806435468058b +k = 23129a99eeda3d99a44a5778a46e8e7568b91c31fb7a8628c5d9820d4bed4a6b +R = e446600cab1286ebc3bb332012a2f5cc33b0a5ef7291d5a62a84de5969d77946 +S = cf89b12793ee1792eb26283b48fa0bdcb45ae6f6ad4b02564bf786bb97057d5a + +Msg = 0fbc07ea947c946bea26afa10c51511039b94ddbc4e2e4184ca3559260da24a14522d1497ca5e77a5d1a8e86583aeea1f5d4ff9b04a6aa0de79cd88fdb85e01f171143535f2f7c23b050289d7e05cebccdd131888572534bae0061bdcc3015206b9270b0d5af9f1da2f9de91772d178a632c3261a1e7b3fb255608b3801962f9 +d = 3e647357cd5b754fad0fdb876eaf9b1abd7b60536f383c81ce5745ec80826431 +Qx = 702b2c94d039e590dd5c8f9736e753cf5824aacf33ee3de74fe1f5f7c858d5ed +Qy = 0c28894e907af99fb0d18c9e98f19ac80dd77abfa4bebe45055c0857b82a0f4d +k = 9beab7722f0bcb468e5f234e074170a60225255de494108459abdf603c6e8b35 +R = c4021fb7185a07096547af1fb06932e37cf8bd90cf593dea48d48614fa237e5e +S = 7fb45d09e2172bec8d3e330aa06c43fbb5f625525485234e7714b7f6e92ba8f1 + +Msg = 1e38d750d936d8522e9db1873fb4996bef97f8da3c6674a1223d29263f1234a90b751785316444e9ba698bc8ab6cd010638d182c9adad4e334b2bd7529f0ae8e9a52ad60f59804b2d780ed52bdd33b0bf5400147c28b4304e5e3434505ae7ce30d4b239e7e6f0ecf058badd5b388eddbad64d24d2430dd04b4ddee98f972988f +d = 76c17c2efc99891f3697ba4d71850e5816a1b65562cc39a13da4b6da9051b0fd +Qx = d12512e934c367e4c4384dbd010e93416840288a0ba00b299b4e7c0d91578b57 +Qy = ebf8835661d9b578f18d14ae4acf9c357c0dc8b7112fc32824a685ed72754e23 +k = 77cffa6f9a73904306f9fcd3f6bbb37f52d71e39931bb4aec28f9b076e436ccf +R = 4d5a9d95b0f09ce8704b0f457b39059ee606092310df65d3f8ae7a2a424cf232 +S = 7d3c014ca470a73cef1d1da86f2a541148ad542fbccaf9149d1b0b030441a7eb + +Msg = abcf0e0f046b2e0672d1cc6c0a114905627cbbdefdf9752f0c31660aa95f2d0ede72d17919a9e9b1add3213164e0c9b5ae3c76f1a2f79d3eeb444e6741521019d8bd5ca391b28c1063347f07afcfbb705be4b52261c19ebaf1d6f054a74d86fb5d091fa7f229450996b76f0ada5f977b09b58488eebfb5f5e9539a8fd89662ab +d = 67b9dea6a575b5103999efffce29cca688c781782a41129fdecbce76608174de +Qx = b4238b029fc0b7d9a5286d8c29b6f3d5a569e9108d44d889cd795c4a385905be +Qy = 8cb3fff8f6cca7187c6a9ad0a2b1d9f40ae01b32a7e8f8c4ca75d71a1fffb309 +k = d02617f26ede3584f0afcfc89554cdfb2ae188c192092fdde3436335fafe43f1 +R = 26fd9147d0c86440689ff2d75569795650140506970791c90ace0924b44f1586 +S = 00a34b00c20a8099df4b0a757cbef8fea1cb3ea7ced5fbf7e987f70b25ee6d4f + +Msg = dc3d4884c741a4a687593c79fb4e35c5c13c781dca16db561d7e393577f7b62ca41a6e259fc1fb8d0c4e1e062517a0fdf95558b7799f20c211796167953e6372c11829beec64869d67bf3ee1f1455dd87acfbdbcc597056e7fb347a17688ad32fda7ccc3572da7677d7255c261738f07763cd45973c728c6e9adbeecadc3d961 +d = ecf644ea9b6c3a04fdfe2de4fdcb55fdcdfcf738c0b3176575fa91515194b566 +Qx = c3bdc7c795ec94620a2cfff614c13a3390a5e86c892e53a24d3ed22228bc85bf +Qy = 70480fc5cf4aacd73e24618b61b5c56c1ced8c4f1b869580ea538e68c7a61ca3 +k = 53291d51f68d9a12d1dcdc58892b2f786cc15f631f16997d2a49bace513557d4 +R = a860c8b286edf973ce4ce4cf6e70dc9bbf3818c36c023a845677a9963705df8b +S = 5630f986b1c45e36e127dd7932221c4272a8cc6e255e89f0f0ca4ec3a9f76494 + +Msg = 719bf1911ae5b5e08f1d97b92a5089c0ab9d6f1c175ac7199086aeeaa416a17e6d6f8486c711d386f284f096296689a54d330c8efb0f5fa1c5ba128d3234a3da856c2a94667ef7103616a64c913135f4e1dc50e38daa60610f732ad1bedfcc396f87169392520314a6b6b9af6793dbabad4599525228cc7c9c32c4d8e097ddf6 +d = 4961485cbc978f8456ec5ac7cfc9f7d9298f99415ecae69c8491b258c029bfee +Qx = 8d40bf2299e05d758d421972e81cfb0cce68b949240dc30f315836acc70bef03 +Qy = 5674e6f77f8b46f46cca937d83b128dffbe9bd7e0d3d08aa2cbbfdfb16f72c9a +k = 373a825b5a74b7b9e02f8d4d876b577b4c3984168d704ba9f95b19c05ed590af +R = ef6fb386ad044b63feb7445fa16b10319018e9cea9ef42bca83bdad01992234a +S = ac1f42f652eb1786e57be01d847c81f7efa072ba566d4583af4f1551a3f76c65 + +Msg = 7cf19f4c851e97c5bca11a39f0074c3b7bd3274e7dd75d0447b7b84995dfc9f716bf08c25347f56fcc5e5149cb3f9cfb39d408ace5a5c47e75f7a827fa0bb9921bb5b23a6053dbe1fa2bba341ac874d9b1333fc4dc224854949f5c8d8a5fedd02fb26fdfcd3be351aec0fcbef18972956c6ec0effaf057eb4420b6d28e0c008c +d = 587907e7f215cf0d2cb2c9e6963d45b6e535ed426c828a6ea2fb637cca4c5cbd +Qx = 660da45c413cc9c9526202c16b402af602d30daaa7c342f1e722f15199407f31 +Qy = e6f8cbb06913cc718f2d69ba2fb3137f04a41c27c676d1a80fbf30ea3ca46439 +k = 6b8eb7c0d8af9456b95dd70561a0e902863e6dfa1c28d0fd4a0509f1c2a647b2 +R = 08fabf9b57de81875bfa7a4118e3e44cfb38ec6a9b2014940207ba3b1c583038 +S = a58d199b1deba7350616230d867b2747a3459421811c291836abee715b8f67b4 + +Msg = b892ffabb809e98a99b0a79895445fc734fa1b6159f9cddb6d21e510708bdab6076633ac30aaef43db566c0d21f4381db46711fe3812c5ce0fb4a40e3d5d8ab24e4e82d3560c6dc7c37794ee17d4a144065ef99c8d1c88bc22ad8c4c27d85ad518fa5747ae35276fc104829d3f5c72fc2a9ea55a1c3a87007cd133263f79e405 +d = 24b1e5676d1a9d6b645a984141a157c124531feeb92d915110aef474b1e27666 +Qx = b4909a5bdf25f7659f4ef35e4b811429fb2c59126e3dad09100b46aea6ebe7a6 +Qy = 760ae015fa6af5c9749c4030fdb5de6e58c6b5b1944829105cf7edf7d3a22cfb +k = 88794923d8943b5dbcc7a7a76503880ff7da632b0883aaa60a9fcc71bf880fd6 +R = 6ec9a340b77fae3c7827fa96d997e92722ff2a928217b6dd3c628f3d49ae4ce6 +S = 637b54bbcfb7e7d8a41ea317fcfca8ad74eb3bb6b778bc7ef9dec009281976f7 + +Msg = 8144e37014c95e13231cbd6fa64772771f93b44e37f7b02f592099cc146343edd4f4ec9fa1bc68d7f2e9ee78fc370443aa2803ff4ca52ee49a2f4daf2c8181ea7b8475b3a0f608fc3279d09e2d057fbe3f2ffbe5133796124781299c6da60cfe7ecea3abc30706ded2cdf18f9d788e59f2c31662df3abe01a9b12304fb8d5c8c +d = bce49c7b03dcdc72393b0a67cf5aa5df870f5aaa6137ada1edc7862e0981ec67 +Qx = c786d9421d67b72b922cf3def2a25eeb5e73f34543eb50b152e738a98afb0ca5 +Qy = 6796271e79e2496f9e74b126b1123a3d067de56b5605d6f51c8f6e1d5bb93aba +k = 89e690d78a5e0d2b8ce9f7fcbf34e2605fd9584760fa7729043397612dd21f94 +R = 07e5054c384839584624e8d730454dc27e673c4a90cbf129d88b91250341854d +S = f7e665b88614d0c5cbb3007cafe713763d81831525971f1747d92e4d1ca263a7 + +Msg = a3683d120807f0a030feed679785326698c3702f1983eaba1b70ddfa7f0b3188060b845e2b67ed57ee68087746710450f7427cb34655d719c0acbc09ac696adb4b22aba1b9322b7111076e67053a55f62b501a4bca0ad9d50a868f51aeeb4ef27823236f5267e8da83e143047422ce140d66e05e44dc84fb3a4506b2a5d7caa8 +d = 73188a923bc0b289e81c3db48d826917910f1b957700f8925425c1fb27cabab9 +Qx = 86662c014ab666ee770723be8da38c5cd299efc6480fc6f8c3603438fa8397b9 +Qy = f26b3307a650c3863faaa5f642f3ba1384c3d3a02edd3d48c657c269609cc3fc +k = ec90584ab3b383b590626f36ed4f5110e49888aec7ae7a9c5ea62dd2dc378666 +R = 13e9ad59112fde3af4163eb5c2400b5e9a602576d5869ac1c569075f08c90ff6 +S = 708ac65ff2b0baaccc6dd954e2a93df46016bd04457636de06798fcc17f02be5 + +Msg = b1df8051b213fc5f636537e37e212eb20b2423e6467a9c7081336a870e6373fc835899d59e546c0ac668cc81ce4921e88f42e6da2a109a03b4f4e819a17c955b8d099ec6b282fb495258dca13ec779c459da909475519a3477223c06b99afbd77f9922e7cbef844b93f3ce5f50db816b2e0d8b1575d2e17a6b8db9111d6da578 +d = f637d55763fe819541588e0c603f288a693cc66823c6bb7b8e003bd38580ebce +Qx = 74a4620c578601475fc169a9b84be613b4a16cb6acab8fd98848a6ec9fbd133d +Qy = 42b9e35d347c107e63bd55f525f915bcf1e3d2b81d002d3c39acf10fc30645a1 +k = 4d578f5099636234d9c1d566f1215d5d887ae5d47022be17dbf32a11a03f053b +R = 113a933ebc4d94ce1cef781e4829df0c493b0685d39fb2048ce01b21c398dbba +S = 3005bd4ec63dbd04ce9ff0c6246ad65d27fcf62edb2b7e461589f9f0e7446ffd + +Msg = 0b918ede985b5c491797d0a81446b2933be312f419b212e3aae9ba5914c00af431747a9d287a7c7761e9bcbc8a12aaf9d4a76d13dad59fc742f8f218ef66eb67035220a07acc1a357c5b562ecb6b895cf725c4230412fefac72097f2c2b829ed58742d7c327cad0f1058df1bddd4ae9c6d2aba25480424308684cecd6517cdd8 +d = 2e357d51517ff93b821f895932fddded8347f32596b812308e6f1baf7dd8a47f +Qx = 7e4078a1d50c669fb2996dd9bacb0c3ac7ede4f58fa0fa1222e78dbf5d1f4186 +Qy = 0014e46e90cc171fbb83ea34c6b78202ea8137a7d926f0169147ed5ae3d6596f +k = be522b0940b9a40d84bf790fe6abdc252877e671f2efa63a33a65a512fc2aa5c +R = a26b9ad775ac37ff4c7f042cdc4872c5e4e5e800485f488ddfaaed379f468090 +S = f88eae2019bebbba62b453b8ee3472ca5c67c267964cffe0cf2d2933c1723dff + +Msg = 0fab26fde1a4467ca930dbe513ccc3452b70313cccde2994eead2fde85c8da1db84d7d06a024c9e88629d5344224a4eae01b21a2665d5f7f36d5524bf5367d7f8b6a71ea05d413d4afde33777f0a3be49c9e6aa29ea447746a9e77ce27232a550b31dd4e7c9bc8913485f2dc83a56298051c92461fd46b14cc895c300a4fb874 +d = 77d60cacbbac86ab89009403c97289b5900466856887d3e6112af427f7f0f50b +Qx = a62032dfdb87e25ed0c70cad20d927c7effeb2638e6c88ddd670f74df16090e5 +Qy = 44c5ee2cf740ded468f5d2efe13daa7c5234645a37c073af35330d03a4fed976 +k = 06c1e692b045f425a21347ecf72833d0242906c7c1094f805566cdcb1256e394 +R = eb173b51fb0aec318950d097e7fda5c34e529519631c3e2c9b4550b903da417d +S = ca2c13574bf1b7d56e9dc18315036a31b8bceddf3e2c2902dcb40f0cc9e31b45 + +Msg = 7843f157ef8566722a7d69da67de7599ee65cb3975508f70c612b3289190e364141781e0b832f2d9627122742f4b5871ceeafcd09ba5ec90cae6bcc01ae32b50f13f63918dfb5177df9797c6273b92d103c3f7a3fc2050d2b196cc872c57b77f9bdb1782d4195445fcc6236dd8bd14c8bcbc8223a6739f6a17c9a861e8c821a6 +d = 486854e77962117f49e09378de6c9e3b3522fa752b10b2c810bf48db584d7388 +Qx = 760b5624bd64d19c866e54ccd74ad7f98851afdbc3ddeae3ec2c52a135be9cfa +Qy = feca15ce9350877102eee0f5af18b2fed89dc86b7df0bf7bc2963c1638e36fe8 +k = e4f77c6442eca239b01b0254e11a4182782d96f48ab521cc3d1d68df12b5a41a +R = bdff14e4600309c2c77f79a25963a955b5b500a7b2d34cb172cd6acd52905c7b +S = b0479cdb3df79923ec36a104a129534c5d59f622be7d613aa04530ad2507d3a2 + +[P-256,SHA-512] + +Msg = 6c8572b6a3a4a9e8e03dbeed99334d41661b8a8417074f335ab1845f6cc852adb8c01d9820fcf8e10699cc827a8fbdca2cbd46cc66e4e6b7ba41ec3efa733587e4a30ec552cd8ddab8163e148e50f4d090782897f3ddac84a41e1fcfe8c56b6152c0097b0d634b41011471ffd004f43eb4aafc038197ec6bae2b4470e869bded +d = 9dd0d3a3d514c2a8adb162b81e3adfba3299309f7d2018f607bdb15b1a25f499 +Qx = 6b738de3398b6ac57b9591f9d7985dd4f32137ad3460dcf8970c1390cb9eaf8d +Qy = 83bc61e26d2bbbd3cf2d2ab445a2bc4ab5dde41f4a13078fd1d3cc36ab596d57 +k = 9106192170ccb3c64684d48287bb81bbed51b40d503462c900e5c7aae43e380a +R = 275fa760878b4dc05e9d157fedfd8e9b1c9c861222a712748cb4b7754c043fb1 +S = 699d906bb8435a05345af3b37e3b357786939e94caae257852f0503adb1e0f7e + +Msg = 7e3c8fe162d48cc8c5b11b5e5ebc05ebc45c439bdbc0b0902145921b8383037cb0812222031598cd1a56fa71694fbd304cc62938233465ec39c6e49f57dfe823983b6923c4e865633949183e6b90e9e06d8275f3907d97967d47b6239fe2847b7d49cf16ba69d2862083cf1bccf7afe34fdc90e21998964107b64abe6b89d126 +d = f9bf909b7973bf0e3dad0e43dcb2d7fa8bda49dbe6e5357f8f0e2bd119be30e6 +Qx = f2a6674d4e86152a527199bed293fa63acde1b4d8a92b62e552210ba45c38792 +Qy = c72565c24f0eee6a094af341ddd8579747b865f91c8ed5b44cda8a19cc93776f +k = e547791f7185850f03d0c58419648f65b9d29cdc22ed1de2a64280220cfcafba +R = 4782903d2aaf8b190dab5cae2223388d2d8bd845b3875d37485c54e1ded1d3d8 +S = dfb40e406bfa074f0bf832771b2b9f186e2211f0bca279644a0ca8559acf39da + +Msg = d5aa8ac9218ca661cd177756af6fbb5a40a3fecfd4eea6d5872fbb9a2884784aa9b5f0c023a6e0da5cf6364754ee6465b4ee2d0ddc745b02994c98427a213c849537da5a4477b3abfe02648be67f26e80b56a33150490d062aaac137aa47f11cfeddba855bab9e4e028532a563326d927f9e6e3292b1fb248ee90b6f429798db +d = 724567d21ef682dfc6dc4d46853880cfa86fe6fea0efd51fac456f03c3d36ead +Qx = 70b877b5e365fcf08140b1eca119baba662879f38e059d074a2cb60b03ea5d39 +Qy = 5f56f94d591df40b9f3b8763ac4b3dbe622c956d5bd0c55658b6f46fa3deb201 +k = 79d6c967ed23c763ece9ca4b026218004c84dc2d4ccc86cf05c5d0f791f6279b +R = 2ba2ea2d316f8937f184ad3028e364574d20a202e4e7513d7af57ac2456804d1 +S = 64fe94968d18c5967c799e0349041b9e40e6c6c92ebb475e80dd82f51cf07320 + +Msg = 790b06054afc9c3fc4dfe72df19dd5d68d108cfcfca6212804f6d534fd2fbe489bd8f64bf205ce04bcb50124a12ce5238fc3fe7dd76e6fa640206af52549f133d593a1bfd423ab737f3326fa79433cde293236f90d4238f0dd38ed69492ddbd9c3eae583b6325a95dec3166fe52b21658293d8c137830ef45297d67813b7a508 +d = 29c5d54d7d1f099d50f949bfce8d6073dae059c5a19cc70834722f18a7199edd +Qx = 3088d4f45d274cc5f418c8ecc4cbcf96be87491f420250f8cbc01cdf2503ec47 +Qy = 634db48198129237ed068c88ff5809f6211921a6258f548f4b64dd125921b78b +k = 0508ad7774908b5705895fda5c3b7a3032bf85dab7232bf981177019f3d76460 +R = acd9f3b63626c5f32103e90e1dd1695907b1904aa9b14f2132caef331321971b +S = 15c04a8bd6c13ed5e9961814b2f406f064670153e4d5465dcef63c1d9dd52a87 + +Msg = 6d549aa87afdb8bfa60d22a68e2783b27e8db46041e4df04be0c261c4734b608a96f198d1cdb8d082ae48579ec9defcf21fbc72803764a58c31e5323d5452b9fb57c8991d31749140da7ef067b18bf0d7dfbae6eefd0d8064f334bf7e9ec1e028daed4e86e17635ec2e409a3ed1238048a45882c5c57501b314e636b9bc81cbe +d = 0d8095da1abba06b0d349c226511f642dabbf1043ad41baa4e14297afe8a3117 +Qx = 75a45758ced45ecf55f755cb56ca2601d794ebeaeb2e6107fe2fc443f580e23c +Qy = 5303d47d5a75ec821d51a2ee7548448208c699eca0cd89810ffc1aa4faf81ead +k = 5165c54def4026ab648f7768c4f1488bcb183f6db7ffe02c7022a529a116482a +R = ebc85fc4176b446b3384ccc62fc2526b45665561a0e7e9404ac376c90e450b59 +S = 8b2c09428e62c5109d17ed0cf8f9fd7c370d018a2a73f701effc9b17d04852c6 + +Msg = 1906e48b7f889ee3ff7ab0807a7aa88f53f4018808870bfed6372a77330c737647961324c2b4d46f6ee8b01190474951a701b048ae86579ff8e3fc889fecf926b17f98958ac7534e6e781ca2db2baa380dec766cfb2a3eca2a9d5818967d64dfab84f768d24ec122eebacaab0a4dc3a75f37331bb1c43dd8966cc09ec4945bbd +d = 52fe57da3427b1a75cb816f61c4e8e0e0551b94c01382b1a80837940ed579e61 +Qx = 2177e20a2092a46667debdcc21e7e45d6da72f124adecbc5ada6a7bcc7b401d5 +Qy = 550e468f2626070a080afeeb98edd75a721eb773c8e62149f3e903cf9c4d7b61 +k = 0464fe9674b01ff5bd8be21af3399fad66f90ad30f4e8ee6e2eb9bcccfd5185c +R = f8250f073f34034c1cde58f69a85e2f5a030703ebdd4dbfb98d3b3690db7d114 +S = a9e83e05f1d6e0fef782f186bedf43684c825ac480174d48b0e4d31505e27498 + +Msg = 7b59fef13daf01afec35dea3276541be681c4916767f34d4e874464d20979863ee77ad0fd1635bcdf93e9f62ed69ae52ec90aab5bbf87f8951213747ccec9f38c775c1df1e9d7f735c2ce39b42edb3b0c5086247556cfea539995c5d9689765288ec600848ecf085c01ca738bbef11f5d12d4457db988b4add90be00781024ad +d = 003d91611445919f59bfe3ca71fe0bfdeb0e39a7195e83ac03a37c7eceef0df2 +Qx = 7b9c592f61aae0555855d0b9ebb6fd00fb6746e8842e2523565c858630b9ba00 +Qy = d35b2e168b1875bbc563bea5e8d63c4e38957c774a65e762959a349eaf263ba0 +k = ef9df291ea27a4b45708f7608723c27d7d56b7df0599a54bc2c2fabbff373b40 +R = 66d057fd39958b0e4932bacd70a1769bbadcb62e4470937b45497a3d4500fabb +S = 6c853b889e18b5a49ee54b54dd1aaedfdd642e30eba171c5cab677f0df9e7318 + +Msg = 041a6767a935dc3d8985eb4e608b0cbfebe7f93789d4200bcfe595277ac2b0f402889b580b72def5da778a680fd380c955421f626d52dd9a83ea180187b850e1b72a4ec6dd63235e598fd15a9b19f8ce9aec1d23f0bd6ea4d92360d50f951152bc9a01354732ba0cf90aaed33c307c1de8fa3d14f9489151b8377b57c7215f0b +d = 48f13d393899cd835c4193670ec62f28e4c4903e0bbe5817bf0996831a720bb7 +Qx = 82a1a96f4648393c5e42633ecdeb1d8245c78c5ea236b5bab460dedcc8924bc0 +Qy = e8cbf03c34b5154f876de19f3bb6fd43cd2eabf6e7c95467bcfa8c8fc42d76fd +k = efed736e627899fea944007eea39a4a63c0c2e26491cd12adb546be3e5c68f7d +R = cf7fc24bdaa09ac0cca8497e13298b961380668613c7493954048c06385a7044 +S = f38b1c8306cf82ab76ee3a772b14416b49993fe11f986e9b0f0593c52ec91525 + +Msg = 7905a9036e022c78b2c9efd40b77b0a194fbc1d45462779b0b76ad30dc52c564e48a493d8249a061e62f26f453ba566538a4d43c64fb9fdbd1f36409316433c6f074e1b47b544a847de25fc67d81ac801ed9f7371a43da39001c90766f943e629d74d0436ba1240c3d7fab990d586a6d6ef1771786722df56448815f2feda48f +d = 95c99cf9ec26480275f23de419e41bb779590f0eab5cf9095d37dd70cb75e870 +Qx = 42c292b0fbcc9f457ae361d940a9d45ad9427431a105a6e5cd90a345fe3507f7 +Qy = 313b08fd2fa351908b3178051ee782cc62b9954ad95d4119aa564900f8ade70c +k = 4c08dd0f8b72ae9c674e1e448d4e2afe3a1ee69927fa23bbff3716f0b99553b7 +R = f2bc35eb1b8488b9e8d4a1dbb200e1abcb855458e1557dc1bf988278a174eb3b +S = ed9a2ec043a1d578e8eba6f57217976310e8674385ad2da08d6146c629de1cd9 + +Msg = cf25e4642d4f39d15afb7aec79469d82fc9aedb8f89964e79b749a852d931d37436502804e39555f5a3c75dd958fd5291ada647c1a5e38fe7b1048f16f2b711fdd5d39acc0812ca65bd50d7f8119f2fd195ab16633503a78ee9102c1f9c4c22568e0b54bd4fa3f5ff7b49160bf23e7e2231b1ebebbdaf0e4a7d4484158a87e07 +d = e15e835d0e2217bc7c6f05a498f20af1cd56f2f165c23d225eb3360aa2c5cbcf +Qx = 89dd22052ec3ab4840206a62f2270c21e7836d1a9109a3407dd0974c7802b9ae +Qy = e91609ba35c7008b080c77a9068d97a14ca77b97299e74945217672b2fd5faf0 +k = c9f621441c235fc47ec34eef4c08625df1ec74918e1f86075b753f2589f4c60b +R = a70d1a2d555d599bfb8c9b1f0d43725341151d17a8d0845fa56f3563703528a7 +S = 4e05c45adf41783e394a5312f86e66871c4be4896948c85966879d5c66d54b37 + +Msg = 7562c445b35883cc937be6349b4cefc3556a80255d70f09e28c3f393daac19442a7eecedcdfbe8f7628e30cd8939537ec56d5c9645d43340eb4e78fc5dd4322de8a07966b262770d7ff13a071ff3dce560718e60ed3086b7e0003a6abafe91af90af86733ce8689440bf73d2aa0acfe9776036e877599acbabfcb03bb3b50faa +d = 808c08c0d77423a6feaaffc8f98a2948f17726e67c15eeae4e672edbe388f98c +Qx = b0c0ad5e1f6001d8e9018ec611b2e3b91923e69fa6c98690ab644d650f640c42 +Qy = 610539c0b9ed21ac0a2f27527c1a61d9b47cbf033187b1a6ada006eb5b2662ed +k = 1f6d4a905c761a53d54c362976717d0d7fc94d222bb5489e4830080a1a67535d +R = 83404dcf8320baf206381800071e6a75160342d19743b4f176960d669dd03d07 +S = 3f75dcf102008b2989f81683ae45e9f1d4b67a6ef6fd5c8af44828af80e1cfb5 + +Msg = 051c2db8e71e44653ea1cb0afc9e0abdf12658e9e761bfb767c20c7ab4adfcb18ed9b5c372a3ac11d8a43c55f7f99b33355437891686d42362abd71db8b6d84dd694d6982f0612178a937aa934b9ac3c0794c39027bdd767841c4370666c80dbc0f8132ca27474f553d266deefd7c9dbad6d734f9006bb557567701bb7e6a7c9 +d = f7c6315f0081acd8f09c7a2c3ec1b7ece20180b0a6365a27dcd8f71b729558f9 +Qx = 250f7112d381c1751860045d9bcaf20dbeb25a001431f96ac6f19109362ffebb +Qy = 49fba9efe73546135a5a31ab3753e247034741ce839d3d94bd73936c4a17e4aa +k = 68c299be2c0c6d52d208d5d1a9e0ffa2af19b4833271404e5876e0aa93987866 +R = 7b195e92d2ba95911cda7570607e112d02a1c847ddaa33924734b51f5d81adab +S = 10d9f206755cef70ab5143ac43f3f8d38aea2644f31d52eaf3b472ee816e11e5 + +Msg = 4dcb7b62ba31b866fce7c1feedf0be1f67bf611dbc2e2e86f004422f67b3bc1839c6958eb1dc3ead137c3d7f88aa97244577a775c8021b1642a8647bba82871e3c15d0749ed343ea6cad38f123835d8ef66b0719273105e924e8685b65fd5dc430efbc35b05a6097f17ebc5943cdcd9abcba752b7f8f37027409bd6e11cd158f +d = f547735a9409386dbff719ce2dae03c50cb437d6b30cc7fa3ea20d9aec17e5a5 +Qx = 4ca87c5845fb04c2f76ae3273073b0523e356a445e4e95737260eba9e2d021db +Qy = 0f86475d07f82655320fdf2cd8db23b21905b1b1f2f9c48e2df87e24119c4880 +k = 91bd7d97f7ed3253cedefc144771bb8acbbda6eb24f9d752bbe1dd018e1384c7 +R = 008c1755d3df81e64e25270dbaa9396641556df7ffc7ac9add6739c382705397 +S = 77df443c729b039aded5b516b1077fecdd9986402d2c4b01734ba91e055e87fc + +Msg = efe55737771070d5ac79236b04e3fbaf4f2e9bed187d1930680fcf1aba769674bf426310f21245006f528779347d28b8aeacd2b1d5e3456dcbf188b2be8c07f19219e4067c1e7c9714784285d8bac79a76b56f2e2676ea93994f11eb573af1d03fc8ed1118eafc7f07a82f3263c33eb85e497e18f435d4076a774f42d276c323 +d = 26a1aa4b927a516b661986895aff58f40b78cc5d0c767eda7eaa3dbb835b5628 +Qx = 28afa3b0f81a0e95ad302f487a9b679fcdef8d3f40236ec4d4dbf4bb0cbba8b2 +Qy = bb4ac1be8405cbae8a553fbc28e29e2e689fabe7def26d653a1dafc023f3cecf +k = f98e1933c7fad4acbe94d95c1b013e1d6931fa8f67e6dbb677b564ef7c3e56ce +R = 15a9a5412d6a03edd71b84c121ce9a94cdd166e40da9ce4d79f1afff6a395a53 +S = 86bbc2b6c63bad706ec0b093578e3f064736ec69c0dba59b9e3e7f73762a4dc3 + +Msg = ea95859cc13cccb37198d919803be89c2ee10befdcaf5d5afa09dcc529d333ae1e4ffd3bd8ba8642203badd7a80a3f77eeee9402eed365d53f05c1a995c536f8236ba6b6ff8897393506660cc8ea82b2163aa6a1855251c87d935e23857fe35b889427b449de7274d7754bdeace960b4303c5dd5f745a5cfd580293d6548c832 +d = 6a5ca39aae2d45aa331f18a8598a3f2db32781f7c92efd4f64ee3bbe0c4c4e49 +Qx = c62cc4a39ace01006ad48cf49a3e71466955bbeeca5d318d672695df926b3aa4 +Qy = c85ccf517bf2ebd9ad6a9e99254def0d74d1d2fd611e328b4a3988d4f045fe6f +k = dac00c462bc85bf39c31b5e01df33e2ec1569e6efcb334bf18f0951992ac6160 +R = 6e7ff8ec7a5c48e0877224a9fa8481283de45fcbee23b4c252b0c622442c26ad +S = 3dfac320b9c873318117da6bd856000a392b815659e5aa2a6a1852ccb2501df3 + + + +[P-384,SHA-224] + +Msg = 39f0b25d4c15b09a0692b22fbacbb5f8aee184cb75887e2ebe0cd3be5d3815d29f9b587e10b3168c939054a89df11068e5c3fac21af742bf4c3e9512f5569674e7ad8b39042bcd73e4b7ce3e64fbea1c434ed01ad4ad8b5b569f6a0b9a1144f94097925672e59ba97bc4d33be2fa21b46c3dadbfb3a1f89afa199d4b44189938 +d = 0af857beff08046f23b03c4299eda86490393bde88e4f74348886b200555276b93b37d4f6fdec17c0ea581a30c59c727 +Qx = 00ea9d109dbaa3900461a9236453952b1f1c2a5aa12f6d500ac774acdff84ab7cb71a0f91bcd55aaa57cb8b4fbb3087d +Qy = 0fc0e3116c9e94be583b02b21b1eb168d8facf3955279360cbcd86e04ee50751054cfaebcf542538ac113d56ccc38b3e +k = e2f0ce83c5bbef3a6eccd1744f893bb52952475d2531a2854a88ff0aa9b12c65961e2e517fb334ef40e0c0d7a31ed5f5 +R = c36e5f0d3de71411e6e519f63e0f56cff432330a04fefef2993fdb56343e49f2f7db5fcab7728acc1e33d4692553c02e +S = 0d4064399d58cd771ab9420d438757f5936c3808e97081e457bc862a0c905295dca60ee94f4537591c6c7d217453909b + +Msg = 5a3c80e608ed3ac75a6e45f6e94d374271a6d42b67a481860d5d309cc8b37c79cb61f1716dc8aa84cb309ef9d68eb7fc6cf4b42333f316a5c30e74198c8b340926e340c5de47674a707293c4aa2a1a2274a602f01c26b156e895499c60b38ef53fc2032e7485c168d73700d6fa14232596a0e4997854a0b05d02e351b9d3de96 +d = 047dd5baab23f439ec23b58b7e6ff4cc37813cccb4ea73bb2308e6b82b3170edfe0e131eca50841bf1b686e651c57246 +Qx = de92ff09af2950854a70f2178d2ed50cc7042a7188301a1ea81d9629ad3c29795cb7f0d56630a401e4d6e5bed0068d1e +Qy = 6135adbd8624130735e64e65ecbd43770dcc12b28e737b5ed033666f34c918eb5589508e4a13b9243374a118a628dd0b +k = f3922351d14f1e5af84faab12fe57ded30f185afe5547aeb3061104740ecc42a8df0c27f3877b4d855642b78938c4e05 +R = 38e181870cb797c1f4e6598cfd032add1cb60447d33473038d06df73919f844eddd16f40f911075f8a4bacc0d924e684 +S = a58dd1ca18aa31277de66c30c3bb7a14b53705ce6c547ed2cb0e336f63c42809422efffcc722d1155f2254330a02b278 + +Msg = e7d974c5dbd3bfb8a2fb92fdd782f997d04be79e9713944ce13c5eb6f75dfdec811b7ee4b3859114b07f263846ae13f795eec8f3cb5b7565baff68e0fdd5e09ba8b176d5a71cb03fbc5546e6937fba560acb4db24bd42de1851432b96e8ca4078313cb849bce29c9d805258601d67cd0259e255f3048682e8fdbdda3398c3e31 +d = 54ba9c740535574cebc41ca5dc950629674ee94730353ac521aafd1c342d3f8ac52046ed804264e1440d7fe409c45c83 +Qx = 3db95ded500b2506b627270bac75688dd7d44f47029adeff99397ab4b6329a38dbb278a0fc58fe4914e6ae31721a6875 +Qy = 049288341553a9ac3dc2d9e18e7a92c43dd3c25ca866f0cb4c68127bef6b0e4ba85713d27d45c7d0dc57e5782a6bf733 +k = 04324bd078807f6b18507a93ee60da02031717217ee5ce569750737be912be72da087ac00f50e13fdf7249a6ae33f73e +R = b2752aa7abc1e5a29421c9c76620bcc3049ecc97e6bc39fcca126f505a9a1bfae3bde89fb751a1aa7b66fa8db3891ef0 +S = f1c69e6d818ca7ae3a477049b46420cebd910c0a9a477fd1a67a38d628d6edaac123aebfca67c53a5c80fe454dba7a9d + +Msg = a670fda4d1d56c70de1d8680328043b2b7029633caf0ee59ffe1421c914bb937133d5a0f9214846b2e0b350455a74c4ab434c56de65a17139bb8212bf1c76071a37536fa29348f871dbb26baa92eb93d97e923a6d2ffd9be25cbc33075e494e6db657bd8dc053fe4e17148d8cf6e2058164f2b5766750eb01bbe7b361cdb848c +d = dabe87bbe95499bac23bc83c8b7307fe04be198f00059e2bf67c9611feaffb2c8f274f6aa50eb99c3074186d8067d659 +Qx = c2aa0a695125279705917e02a4f258cade4c3ff9140a071414babf87764f426f7f36ffda9d5f3394375d24864235476f +Qy = 8f9808da0ce0227cf453f9e456f557db9752e23b45cce4baad5fee3844ddd7e1112bcec01ea9d67c7a76f3535bd0cb58 +k = 65a0305854033cbc6fe3ca139c40ca354d45801ecb59f4a923c251dc6b25d12d452d99b5d6711fdb5efac812aa464cc4 +R = c7fc32997d17ac79baf5789e4503f5f1a8863872bc350a91f12dd3ef8cf78c254e829217809e8e00b6b8d4d85be3f1fd +S = 1422e1838a22496df93486bce1142961dbd8478ae844b8dda54e210afdae0d9e930d587c91bb600b0bde7237186d94e6 + +Msg = 7843f918fe2588bcfe756e1f05b491d913523255aa006818be20b676c957f4edb8df863c6f5f8c15b3b80c7a2aa277b70d53f210bdfb856337980c406ea140e439dd321471407f374f69877b2d82367eed51e3c82c13948616dcb301d0c31f8f0352f2846abd9e72071f446a2f1bd3339a09ae41b84e150fd18f4ba5d3c6bfa0 +d = df43107a1deb24d02e31d479087bd669e2bc3e50f1f44b7db9484a7143cdca6a3391bddfea72dc940dbce8ec5efbd718 +Qx = 76bd4be5d520471162cb5c36f80038301b325f845d9642204a84d78b3e721098932827bf872bde0a9f86383953667d29 +Qy = 415116b8b878f896a5aa4dbbdc21076f27135d8bbcaaca02489ef639d742bd63f377da0c8e8ab36ff19b4a7cc5d4ceb4 +k = 798abad5a30d1805794540057388ee05e2422901c6335f985b9d4447b3ef75524751abfeab6409ad6bf77d4ae3014558 +R = 98744e5c6742fa5118a74a70db4957647a3cc12add4e876b45974a6a8707809f871daadbfc0b865e01624f706b65f10c +S = 9e256e8da8eff5a0c83baaa1ef4f7be798eba9543bf97adb0fff8719f5406ea1207a0cf703d99aa8f02169724b492273 + +Msg = caa83d5ab07febbd2e0fe2d63738b9b7b8752594bea7aaf50345b3d2f316653a8c9222f2b7877b64679e9573e81461a426029e45b8873a575094a1d572e0d32a9f0a9c6bcb9a2868543b7d8bbe4a69a09e7321f05f8366cced1b72df526f895b60aed2c39c249653c7839538770d4e5f47d3926ec0d168ab6a1af15bf1dca1f7 +d = ea7a563ba2a7f5ab69973dca1f1a0d1572f0c59817cd3b62ad356c2099e2cdca1c553323563f9dfbb333b126d84abc7f +Qx = cf4717c5f5de668b785f06bdc9845df5a09e4edd83f4669756407cbb60807305c632bc49f818f4a84b194369aa07736f +Qy = 7391e4982af8a2218f704f627d01f0508bfc8304992a2d598a420bf2eb519f33bd7caf79380793733b3dba0cc5e2b9d8 +k = 7b9606b3df7b2a340dbc68d9754de0734e1faeb5a0135578a97628d948702235c60b20c8002c8fcf906783e1b389e754 +R = 0d680010bed373287f9767955b5d2850e150b6713b49e453eb280148e45230c853d99ea2d2f8fcbd3ddcba19aeec0af1 +S = 64329763a930ab5452afdb0557fef16ff71810d6343dfc9c6ae18905c3d274db6554cdc69d6078a1ca03284474a94f30 + +Msg = 594603458d6534974aeeafba919c4d0f4cb6843a3af41204bbb88aeb2fca2772d305163dba863da050aabedbaf89db521955d1715de95bbcef979ecdc0c976181ece00355385f8a8f8cce127c9eac15ce3e958a3ed686184674ec9a50eb63271606ee7fdcb1323da3c3db8e89cad1fb42139a32d08abcfbf0d4ccfca18c89a86 +d = 4cc70cb35b3ddeb0df53a6bd7bd05f8ff4392a2db7344f2d443761484b3a468a4ee3d1a8b27113d57283fd18b05f7829 +Qx = 40e1fe21df34bb85a642a0abe819ebd128f7e39b84d8dcc4a9a599b372fb9588da1484600ec28b1297bb685f9ae77831 +Qy = f3aa69ada57879fdcbe8df19cefabc308add7d03b17b1fac2f7783fece6a8dfe20bc36f518692677d96e3f730a67a671 +k = 8eda401d98f5688c34d8dbebcd3991c87c0442b0379154eaa2e5287dabe9a9e34cfc1305d11ff68781df25d5611b331d +R = ff2d772786e159448bba26afd8c3281941a4cb0c56fec6f5cccb4c292c4ee0f7af9bd39bbe2d88148732585e104fdb30 +S = 07a1d890770daa949a17797dca7af3e8163da981ec330c03d63d1a8312c152be6a718163205ffa08da7dcc163ba261f4 + +Msg = 733252d2bd35547838be22656cc7aa67eff0af0b13b428f77267a513c6824c3dbae533068b6817e82665f009560affcfe4b2ddb5b667a644fc1a42d24f24e0947e0dc50fb62c919bc1fe4e7ded5e28f2e6d80fcf66a081fb2763526f8def5a81a4ddd38be0b59ee839da1643eeeaee7b1927cec12cf3da67c02bc5465151e346 +d = 366d15e4cd7605c71560a418bd0f382fd7cd7ad3090ff1b2dfbed74336166a905e1b760cf0bccee7a0e66c5ebfb831f1 +Qx = a143f277ab36a10b645ff6c58241ea67ffdc8acf12d60973068390f06b4d8f4d773b10c1ebf6889b1cfa73ebb90f6ca1 +Qy = 7a17cad29bb507b309021f6f92cb5c10ba535f4a3e317fcc68cfd02d3ccd269f465169c73d30ff308f5350d881b08aec +k = dbe545f920bc3d704c43d834bab21e40df12ec9e16a619a3e6b3f08760c26aae6e4fd91fad00f745194794b74bb1baee +R = cdc39b12bba30da66fe9554713c05880ddc27afa4d2d151440f124c351fb9496dc95046516b0921083347d64369846ac +S = 797d0344e49f9ba87a187c50f664e5015d449e346b1a7bd9427c5be559fc58173651880d5aadf053f81899d3368d6181 + +Msg = 5a182bd174feb038dfae3346267156bf663167f713dea1ce936b0edb815cd9b8c8e4d411c786ba2494a81442617255db7158b142e720d86c9b56680fb9efd4298cdd69079a28153494c42a24251c7ad42ecf7e97eabc1b3997529b2a297cbad2474269b87a0b1e385f2d7f8b6eb8d1cd75eaf7e91d1acbecd45d7b2bfbbe3216 +d = e357d869857a52a06e1ece5593d16407022354780eb9a7cb8575cef327f877d22322c006b3c8c11e3d7d296a708bdb6d +Qx = ce9a2185a68d6094aa5849a6efe78b349946f7380f0c79aa9664246cfcc71a879e90ad78a0474f58644c6a208168150e +Qy = 8354fa47673cb3e07d446521345706c5515584b2602f921c3b9c44dded9e2c3f90ce47adb36d7e5f9f95a8c5ad8af397 +k = 1e77367ac4e10924854d135ad2f2507f39e2bafdbce33ff256bcbe9a7329b8d27185218bcc3550aafbe3390e84c77292 +R = df3182d49ad70959fb0c95bc7312750ce70fc87f1a328d39d9b29ac05d31305ce7209d6c24d13225d9567b489f7a187b +S = d812b05abab0e96de13291e1f0da6479444ed5cd9d959b76f6cb43d394769035364f7c831a104dc7b5bd9b4a8e64df64 + +Msg = aaa99fb1c71340d785a18f6f668e898c25cf7a0ac31d13c5b388b7233408493a5a109af6d07065376b96f4903df7aba2b2af671a18772bb0472490d1240cde28967680727dd4acd47e0308920a75da857a6eeedee5b6586d45dff3d8a680599665aa895c89dd7770b824b7dee477ac5e7602d409d3cc553090c970b50811dbab +d = 745a18db47324a3710b993d115b2834339315e84e7006eafd889fb49bd3cc5a8b50c90526e65e6c53bddd2916d14bead +Qx = f692578c6f77531210aef55c9e004ce3b66cf268c6900dde31a8bbb76e7562e3fb76242de34ca330d2501030aa119466 +Qy = 40965833b28de926c46de060aa25beaeda98f8415a6b1e3564aa77870cf4c89bd4fde92c8f5d9bf0eb41721586859d8e +k = 11b9b36720abcac084efdb44c9f5b7d039e3250cb1e9c47850189ba3cfc1489d858b2a44df357772b61d919c7e729c0f +R = 02b252c99820cf50e6ce060ab55bd4f682276e29b4ae4197417432e6a7bfb8cf0bac89dfe105456af805d822cee77696 +S = 8e248bbf7d7028d63177e565c9d1666ee5be4d1ffbfffc9c7814b0cd38f74b98f3f2cd59be42b9f132bfe5ee789cd96c + +Msg = 1fadfa8254d3a0b82d137cfdd82043d5dc1fef195d5297b09cc5cfb061f59c933451c0dc2a11b4037f34f88dacb803251f8880c4b72585c3c196e6fb23484ca43a191f8e41b9b9a37e2e6fcaab6738c3c62d1c98e1c620bb788b7b51a04f998a510efdba0d3418622fe8ce203b3fcd553b9b4206365a39031797ad11e49745ec +d = 93f20963ea5011ff4f26481e359309e634195f6289134087bd2e83eee008c962780a679784ee7ac6acda03d663ed27e0 +Qx = 0edcde3533ea019e18f1a3cd97b7962e8823dda36c389f8f9287549f796d11376392b8a01c7a80f127a8f75795e04f54 +Qy = 63d7c458dccfc02f5148d755d59f9bbc8e3c3ea34908777928440747795955741296abcdd5386676419ed8049fedb489 +k = 3ad308faf04c42ee5ac69d36bc0aa9a96aacf55ea0f27dac4f52e088f023d206340a6324874ffad169ff80624de24c96 +R = 209b72f9aae72c4339813573c3a8408a9e0be641ca863d81d9d14c48d0bf4cd44a1a7985cff07b5d68f3f9478475645b +S = f6292e599b22a76eda95393cf59f4745fa6c472effd1f781879ad9a4437a98080b0b07dadad0c249631c682d2836a977 + +Msg = 9ecb6f5ed3ba666a8536a81ef65012c2cb8b433508798d84708abb06dfb75503886f78384fb8c7a4d2d49ef539d9b8a0b60938c7f07471dda91f258b0d99691b38a8403a2bb3f956bdfd09baba16d9b6877097a9b6213481b47a06e139d23ec7abad5668d21f912fdb70d31bb9adf9b3ce80e308252fa81a51674f88d02db72b +d = f175e6ac42fd48ec9d652c10707c039c67c4cc61d8c45a373dcda6e4ca6c53e947e49c24e01b48e7cdf92edfe6d316a1 +Qx = a40c64f595491ce15790a5a87fbe64c1800247b42acd08fe5257700719f46afc8acce0e4ede0517a312092d5e3d089cd +Qy = d565df9dc2f381cc0c5d84f382a43a98018524c0b4708a44b3e2817f9719f29fbf9c15803591ed9b4790c5adaba9f433 +k = 812dcaa6d4f9a43ccc553288065d13761581485aa903a500a690ccafbd330ba4818c977b98c4bb57f8a182a1afacfae9 +R = d000f18d3e4c162ff0d16f662e6703e7a6f5bff7a333ed266fa4f44c752415946c34945c342c20f739677186b1d80ab3 +S = ae7f1271c89e0aaa238710d039ea73a69110cc28fcf426f2fe6754b63a59e417fa84f903cf7dccb5468b43ff083bbfd5 + +Msg = e55bfca78d98e68d1b63688db12485578f36c489766f4d0bfaa0088433ff12133aaca455805095f2e655940860958b3ead111d9070778ee3bbf3e47e43d9eba8b8d9b1fdf72f793fcde2bcaa334f3e35fa2cca531ea7cf27fe9ccba741e38ac26129b2d612bf54a34e0ae6c166c0fef07fcd2b9ac253d7e041a500f7be7b8369 +d = 46c4f0b228b28aaa0ec8cfdf1d0ed3408b7ae049312fb9eaf5f3892720e68684cc8ad29844a3dc9d110edf6916dfb8bb +Qx = 13ddec844731b7e30c467451df08ca11d6c581cb64abd8a257671cffd26f5ccad4df7b9ee8924047a88a5d2d7567609c +Qy = d74ca94f590fd1d13e190cc1e03c3da6c3faab15c7dda034af3deefee8aeec3628fa8b1978c54cfcd071baa319a46ec0 +k = 2a9dd520207c40a379cd4036adef9ee60fa8bc8c0d39b3ad91850ac93fd543f218b1688581f23481a090b0e4c73792ac +R = 94e08cca20fe3866f643f53ec65faf3f2b4d80cd9bcc8ff8f88bb28da9eada324fc2d048908dd3d08a9e0ebb547731bc +S = 8e6f82c4d3069b14f4c844b4ca133a9503493265c9f77a7d4775eda67de76798a23dd7ea48e0ac3c337dd62bf058319d + +Msg = 02c6b3c83bd34b288d96409162aa4ff114e9d134bf948046eb5ebcc0c7fe9dfceadda83ed69da2fac00c8840f6c702a3fc5e6959d70f7e8af923e99e4937232ae3b841ffefd2e62fab3671a7c94a0281b8ea5bc176add57c5c9b6893fe7f5d48ce7256b96510810c4e046168a3c5be9843b84d5268a50349b3444341aa5490dd +d = 1d7b71ef01d0d33a8513a3aed3cabb83829589c8021087a740ca65b570777089be721a61172b874a22a1f81aef3f8bb6 +Qx = 8d2721370df8f097d5a69396249a315f6037dc7045b3da11eacae6d43036f779d5de7053d101768b42cc2b1283a3aaea +Qy = a046039ae662141f9954d278183eaa2e03917fe58583e32d344074d59d60caa5b0949c53066525d5cca923e2f201502e +k = d1b25ad25581cad17e96f1d302251681fee5b2efbb71c3c15ff035b2145d015d18e0e52dc3187ab5a560277b3a3929b0 +R = d836f52b14c7391744868daa2d5cf27eb9380b9b6176195573d5b04842e9f2fc3794d6cf877feafee63d11b05f6a6bee +S = 8b89042fef2c04d4bd6c9d66a06a010514321d623a5f8d57ba5ac3686872eaabca9e0ba2d058ae7028e870acf03ca32d + +Msg = 94f8bfbb9dd6c9b6193e84c2023a27dea00fd48356909faec2161972439686c146184f80686bc09e1a698af7df9dea3d24d9e9fd6d7348a146339c839282cf8984345dc6a51096d74ad238c35233012ad729f262481ec7cd6488f13a6ebac3f3d23438c7ccb5a66e2bf820e92b71c730bb12fd64ea1770d1f892e5b1e14a9e5c +d = cf53bdd4c91fe5aa4d82f116bd68153c907963fa3c9d478c9462bb03c79039493a8eaeb855773f2df37e4e551d509dcd +Qx = 3a65b26c08102b44838f8c2327ea080daf1e4fc45bb279ce03af13a2f9575f0fff9e2e4423a58594ce95d1e710b590ce +Qy = fe9dcbcb2ec6e8bd8ed3af3ff0aa619e900cc8bab3f50f6e5f79fac09164fb6a2077cc4f1fed3e9ec6899e91db329bf3 +k = df31908c9289d1fe25e055df199591b23e266433ab8657cc82cb3bca96b88720e229f8dfd42d8b78af7db69342430bca +R = 6770eea9369d6718e60dd0b91aee845ff7ed7e0fcc91675f56d32e5227fd3a4612bbcb1556fe94a989b9e3bcc25bb20e +S = c43072f706c98126d06a82b04251e3ecb0ba66c4bb6cd7c025919b9cc6019cdc635256d2a7fa017b806b1e88649d2c0d + +[P-384,SHA-256] + +Msg = 663b12ebf44b7ed3872b385477381f4b11adeb0aec9e0e2478776313d536376dc8fd5f3c715bb6ddf32c01ee1d6f8b731785732c0d8441df636d8145577e7b3138e43c32a61bc1242e0e73d62d624cdc924856076bdbbf1ec04ad4420732ef0c53d42479a08235fcfc4db4d869c4eb2828c73928cdc3e3758362d1b770809997 +d = c602bc74a34592c311a6569661e0832c84f7207274676cc42a89f058162630184b52f0d99b855a7783c987476d7f9e6b +Qx = 0400193b21f07cd059826e9453d3e96dd145041c97d49ff6b7047f86bb0b0439e909274cb9c282bfab88674c0765bc75 +Qy = f70d89c52acbc70468d2c5ae75c76d7f69b76af62dcf95e99eba5dd11adf8f42ec9a425b0c5ec98e2f234a926b82a147 +k = c10b5c25c4683d0b7827d0d88697cdc0932496b5299b798c0dd1e7af6cc757ccb30fcd3d36ead4a804877e24f3a32443 +R = b11db00cdaf53286d4483f38cd02785948477ed7ebc2ad609054551da0ab0359978c61851788aa2ec3267946d440e878 +S = 16007873c5b0604ce68112a8fee973e8e2b6e3319c683a762ff5065a076512d7c98b27e74b7887671048ac027df8cbf2 + +Msg = 784d7f4686c01bea32cb6cab8c089fb25c341080d9832e04feac6ea63a341079cbd562a75365c63cf7e63e7e1dddc9e99db75ccee59c5295340c2bba36f457690a8f05c62ab001e3d6b333780117d1456a9c8b27d6c2504db9c1428dad8ba797a4419914fcc636f0f14ede3fba49b023b12a77a2176b0b8ff55a895dcaf8dbce +d = 0287f62a5aa8432ff5e95618ec8f9ccaa870dde99c30b51b7673378efe4ccac598f4bbebbfd8993f9abb747b6ad638b9 +Qx = b36418a3014074ec9bbcc6a4b2367a4fb464cca7ec0a324cb68670d5c5e03e7a7eb07da117c5ea50b665ab62bd02a491 +Qy = 4ea299c30e7d76e2c5905babada2d3bb4ee5eb35a5a23605cdb0d5133471a53eb9e6758e49105a4eaf29d2267ba84ef2 +k = 935eeab3edeb281fbd4eead0d9c0babd4b10ff18a31663ee9de3bfa9ae8f9d266441158ea31c889ded9b3c592da77fd7 +R = 738f9cb28f3b991335ef17b62559255faf75cad370a222464a492e27bb173c7f16b22100ada6b695875c7e4b1a28f158 +S = bc998c30e1491cd5d60dc7d1c38333165efe036b2a78db9b8f0e85ee68619cfba654e11ae5ca5ee5a87099c27cf22442 + +Msg = 45e47fccc5bd6801f237cdbeac8f66ebc75f8b71a6da556d2e002352bd85bf269b6bc7c928d7bb1b0422601e4dd80b29d5906f8fcac212fe0eaaf52eda552303259cbcbe532e60abd3d38d786a45e39a2875bce675800a3eaeb9e42983d9fd9031180abd9adccc9ba30c6c198b4202c4dd70f241e969a3c412724b9b595bc28a +d = d44d3108873977036c9b97e03f914cba2f5775b68c425d550995574081191da764acc50196f6d2508082a150af5cd41f +Qx = c703835d723c85c643260379d8445b0c816fe9534351921e14a8e147fe140ec7b0c4d704f8dc66a232b2333b28f03dee +Qy = c5d0bb054053fd86c26f147c4966757aa04b00513a02d427b8d06c16055c607955efdc518d338abfe7927c195dc28588 +k = c80f63e080650c8a21e4f63a62ec909adfb7d877f365d11ee1cb260baf112eb4730c161c1d99dba98fc0d5bbd00dc97d +R = 81de2810cde421997013513951a3d537c51a013110d6dbb29251410bcb5ba001a9686b8490f1e581e282fd2ed0974b22 +S = 9cab0bbaffe91c7677ec3dd1f17060211a3cc0be574cbca064aa8c4b66ba6e64f3d80e83da895042ca32d311c388d950 + +Msg = c33ff63b4e6891e00b2349b3f2907c417ca355560544a91e24a7a0ee260d6850aeded29fc0176b6039ca6187e8333391047cceaf14b1077df8f147dad84d36b2dac5666dc2f69dc9b58b88cc73956efdb3b47f91831d5875051c76b0c4e9fc087012a1f03eeee85d6745b46aa50bd9cb0110c2c94508765cec162ee1aa841d73 +d = d5b72cbb6ec68aca46b9c27ad992afd8ffa02cb3067b234fcfa6e272e3b31be760695ff7df988b57663057ab19dd65e3 +Qx = 135a6542612f1468d8a4d01ff1914e532b1dd64d3627db9d403dc325651d3f82b0f6f0fd1dbdeca2be967c4fb3793b5f +Qy = cbbd40f6d3a38d0dfb64582ff4789d7b268241bc0c36de2884bccfaeeff3b7b2b46a30bb35719804e0d11124b4e7f480 +k = 9da6de7c87c101b68db64fea40d97f8ad974ceb88224c6796c690cbf61b8bd8eede8470b3caf6e6106b66cf3f0eebd55 +R = 17840911ecdf6ae0428b2634f442163c2c11b8dbf0cc7a5596fbe4d33e3e52f9d99e99ad169867b1f39e89c9180cedc2 +S = dd7ed67e480866d0474379ea4afff72870746f4feef2153be42f13bf472b1613d7faa5c0abb7f7464070f94d7cf3f234 + +Msg = f562f2b9d84b0e96a52532c3b43c39c8018c738bd8dc3797a7de7353971b2729d522d6961b1f2e4df3f6a4bd3653e6d72b74fc0dba92ab939c4b542e994e5db6dd8ed4f56f651e699052e791237ae1f552f990ad156226ae8f7bf17fcbfa564f749604f97e9df0879d50985747d981422a23040fe52f5ec74caf1d4aaad8a710 +d = 218ee54a71ef2ccf012aca231fee28a2c665fc395ff5cd20bde9b8df598c282664abf9159c5b3923132983f945056d93 +Qx = 01989ff07a7a452d8084937448be946bfedac4049cea34b3db6f7c91d07d69e926cce0af3d6e88855a28120cf3dba8df +Qy = eb064e029d7539d4b301aabafe8de8870162deffe6383bc63cc005add6ee1d5ced4a5761219c60cd58ad5b2a7c74aaa9 +k = c5d39b436d851d94691f5f4aa9ef447f7989d984f279ae8b091aef5449ac062bcc0567740f914624ad5b99fc32f9af0b +R = 07d5b1b12877e8cb5e0aa5e71eeeb17bf0aa203064c7e98b3a1798a74dc9717252dc47c7f06aaf1d5fe15b868323bbb9 +S = 69428cf101a7af5d08161a9fd7af212e02e33b6062aebdce4c96bf3a0684b5394cb902ca7c2dec6e2f01f40c4576009d + +Msg = ace953ae851f571d71779aa120915f27450b236da23e9106f8d0756abdd25861937941228d225d5fb1aa1b1ebf759b1e326aeb3b6cd0cd87edd2ab9f6a7ad67b63d2c501d6a550edb2e7c9d216cc8af78dd33546af64d00abed4d0d2cfc5c9a7b5a055dbe8f7547902d185cf46937314832bc5c602419a82ab83dbd9d3bd5aff +d = e6ab171f6937c000e144950801ad91023ae8e8476856c2592d9f7d5bb7180fd729211803d39a412ead6c0be761cfa5d1 +Qx = 38bc42b8c9d8866d09b214398d584b1b24a488dfacc3420d1e9506aa825b19fdf1ba74e7b8f547f47b571467fe8c4d1f +Qy = 5179d62668d3f6a7ab5c8e3761a685e12008fb87d0529a97645f65cfb5364376c1b6682e0ffcddd0bcd995c41d013ad3 +k = 05e9718aea9669c9e434f73866da5f252dec6d24c47a1c4ee3233450b6ec626de9746ebe095b285558dfc89fc1b622fe +R = df9bab9dd1f22ec6f27116f38831cb2089aa78aa8c073024a0faddd9a48e810a5e8e2cadd80fbf8dbd6088c71fe30b5b +S = 1e0e8718567d12d18558c57f9e87a755c309e4ffb497335a3adfc8d7475ce8fd882d5dc33a8f5a16274b7ad74bb7862a + +Msg = 9635ab832240be95301bedb94c5aec169eedc198cbbdfedcf41e9b586143d829b4597a6b2a81902828332825fd84a785f187a3894e21bd99d22c4f94dcf34453fc052f15ec64d1447c932cb38fcdd30b7be851963409c11881438cbaad7e96f9efbde317f2235d66af804477a5dfe9f0c51448383830050ecf228889f83631e1 +d = 14acd516c7198798fd42ab0684d18df1cd1c99e304312752b3035bed6535a8975dff8acfc2ba1675787c817b5bff6960 +Qx = 29909d143cf7ee9c74b11d52f1a8f3ebd4a720c135612ca5618d3f432f03a95602ee75a2057e1d7aab51d0648ac0b334 +Qy = 404b6c5adffbadfa1b0380ae89fed96ec1ca16cc28661e623d0f1c8b130fbaa96dd7257eae2bf03c2d3dcbc3dbc82c58 +k = 7f623c103eaa9099a0462e55f80519c565adaeffcb57a29993f3a8a92e63a560be8f0fb9d23dc80bff1064bb41abad79 +R = 932ab291950c16b2b19a8036cd2e905714c6229cb190a73b3ea49c48dd8e76063a453c7c3267a57597d2973678216296 +S = d17d4c5ddbb9c27beebf526f113b416c8abfad53d11c4224813c7f351ba41a77dd4e77d6e4a65bef2c9f62cc37a469a5 + +Msg = d98b9a7d4fe9d0fd95de5056af164a8b7882cd34ab5bde83a2abb32dc361eb56a479a3a6119db3b91dcad26a42d2206749567f0d97c34a981a91fc734921821a429f6a53401743a5c406ba9d560f956203abc9d1f32f1a13e7d7b290f75c95fdbf857ea597021461c06a3aacfa554ede3d69e4ff03bbbee5b7463ec77de2b3b2 +d = 2e780550984f3a00cb1e412429b33493c6eb6cd86d12f9d80588c247dcf567bd04296d2d4b24b889d9c54954b7f38f57 +Qx = 37dac42ef04663238443ef33e8addee2e78c40d50a1751913a7f5c37d1f23a26c7f86e16055c788b8ca9554f06b2f2ef +Qy = bbed1549652904e3d00c39b01cc0460dbaf3185e6190c2705677a9701de1fe56dff4f4d8418ee15059ff8fc36800982d +k = b788ca82811b0d4e4841765c71eafaa1e575378beedcd3860d8b92db3d070ac5aef7c425067860fbee6c50cf0c642bbb +R = 7292b3851870daeb2555a8a2fb198ead78739fcfb75327e5c32a82c6b77d58983e5ad548ccb75dcf9411039c9576d9b9 +S = a378c61802d9f1dd062b6e18f16416a954018f77df4df95ad1b983570377d5cfce4cc7861759e802c52f81abc4f49aac + +Msg = 1b4c754ac1c28dc415a71eac816bde68de7e8db66409af835838c5bb2c605111108a3bf13606ed5d8ade5ed72e50503e0de664416393d178ea4eec834d8d6f15039847b410080fd5529b426e5aadd8451c20ebd92d787921f33e147bcbeb327b104d4aab1157fc1df33e4d768404b5ccb7110055c2508c600f429fd0c21b5784 +d = a24d0fe90808aecc5d90626d7e6da7c9be5dfd4e1233c7f0f71f1b7c1c6fd318fafe18559c94718f044cf02ed5107cb1 +Qx = ec8ae1fb9bb88589d27d6f27d790392853396f37bc0c381631d85800fc668eea0886bf1c6cff801147df19778d5b1604 +Qy = 1e1a8336c1e2506f8ee388b55cc648ae73b9295ea78467979d2affb364536fad28120f51ec62a67cbb6ce7784780389f +k = 755d025509b73cf1ea8817beb772ad150b4c17a52378be187daffe3db0158921e5e552d1ca3c85df28519939f3cb794d +R = 23ff2ffa62bbd427d49995d9c9950116e0d5a06ef076a4553448bc109e6482c5e87d4c833bc88de0bc722bc98cae2e61 +S = 9aea13d487c3ea6917e16374caafcf0321c12a80d28902dd8cd81909bb04b8c439e2491e504756742d0d0bfb15a9c34c + +Msg = 3cd8c053741dd9f974c6c5dbf8a1e5728e9b5eafb1cbcfc3452f5fbbda32a8c7564dee157e8d902c52514361da6d972934a56b3276e2a9379e328e24282e0db697c5bc29090fc489ec46b7b188325dd4e96494c250de0f4a89fe2ccf919eaefcfb50c288113e6df92714feb7f46e0822478c796d0f4ff3447a32997e892693ce +d = 1c172e25732555afee7ded67a496f3f11babc0875898619f4519c29321e201e8ba1149f2c20b48e5efba235d58fea7c3 +Qx = 13e9e2c8bbcfe26e8f5f43c86268c5980ee693236a6b8777f3a7323718baa21005b482d08aafc6fa6e3667d91353544c +Qy = 9ba181b3ee505be030f87ecd249b00670a791489b42af04976013483ff95b630c91c01e95757e906129f2f9b4ce719a8 +k = 08aec9a9e58bdc028805eb5dc86073d05fff1f5fb3fd17f510fc08f9272d84ba7aa66b6f77d84fe6360bd538192bf01a +R = 2b4337c3dfbc886ffad7858ae2480cb62227e12205a70361c42f1a5ca9e658ee30fc3cf4030d85bd065edad83b99821f +S = 2550cef8574bf17fb3d6b0c9d04ab266962bac3621bac233ff2e4989712d2a4a07171c0aebd3040cd6a32c3bd3efb8b5 + +Msg = ed955dda6d9650124804d3deb6aeef900e520faf98b1ef6f14efcada7ca2433f09329b70897305e59c89024d76e466b28fe02cb2a9b12e2478c66470259d7c282137a19e5a04ffadea55245c0f34a681593fedc42931d8b3321b3d82e9cc102cd00540ad311ec7bd8c9d06db21bea4ca3dc74d98931ae0d40494aefc2345132c +d = 5b96555dbd602e71d4d5d3aee19fd1ea084ee23d4f55c10937056762bc2015cbded2e898a487f5482ab7e1e971245907 +Qx = 6e14c17bb831b0112d7f3543c5fd17c78379a516c9e0539b03b8b4bfdead2820343fc84b0382807573ded6c4d97b7003 +Qy = 7f60021d2de77546db666721c9aec84c3e2ba8de0ba77443600dc77e6839bbf9316271adb22d4cb47d08f745ecb1dafd +k = 7ad6f4ffd2b429ba10c6f112f800cacf1ad508cf8eba880893bb9659c1ddaaec57dcdc093a114500460d457bdde324f2 +R = faea950ca513806bc59028c638d6302ffc86978c3ff1f06db015dd7c4777050186cb8dd871f5e926e1416539c1939c2f +S = 2c592240eabb8a1f9878e1b5c9d5d3ced7b3a7ae571f5a86494ed2ca567a36eb72e7bea8934bded29594bccf67ca84bd + +Msg = ce395b001da2a58e49691605d44af4206306f62f561bf2394060d2a5591a350277166bed043819035f1e60b5b3fb5ae113ddd0473f8ef6b2b050c472c2a264e1d8b3ca82a4f158c40f2d78d9ce5e5ea6de243f2e1f13f47f6c6f403b270912c81c636be35b396ca58468b3fb60aa83911d61441a0528d973bc31f965d4059080 +d = 8df9c3c710a25192f3dea970910bb3784e3509874cccf4334823eb9f7a8d05b067f2d812d61e878e24b093089a0b8245 +Qx = 92c9e32b20cbe6d4ed0727c6c942cf804a72031d6dfd69078b5e78ebce2d192268f1f5e2abce5aaf1f8d6a35f136837f +Qy = d5167905fa7689e03b9fb1487c566f62b36f2bc1c4a2bfb6a836113b5c8d46f7c1ca51b628b14397fbc06ec9a07f4849 +k = 258dd05919735cd48627c9fe9fac5c252604aa7c2ae0460d7c1149cd96b7bd2ba195ad393bf392a2499f06aead5ba050 +R = 413793bcce52eda0f5b675a8d687cce86d5c9e1659b38a89e96246b5e05f8b0934d17dbba3b2ea44c838aa5fd87125d1 +S = ce7309fc2d6e3438818a1a29a997410b025b0403de20795b97c86c46034a6b02afeed279aeb06522d4de941bfdf50469 + +Msg = ffefe316455ae4ffdb890bb804bf7d31424ea060ecacff419d0f7134ff76ad434063c0ec0f8bb7059584d3a03f3625bb9e9f66ace1a47ac4b8f3e76fc7c420c55edb1427d1fa15b387ad73d02b0595c4e74321be8822752230a0dcfb85d60bfa186da7623a8ec3eb1633f0a294b23ae87216b14ccee9ef56418dcfab9427371e +d = 6002cb01ad2ce6e7101665d47729c863b6435c3875de57a93f99da834f73e3e6e2b3880e06de3e6bd1d51ea1807ab0d7 +Qx = e4216e1a20af8e8e3e74653ac016545001066e53e64af679ad1c85841bb475aed3e00ead052ae9955f48d675ff4ace56 +Qy = 8804c17641be21d4c6386902c9c5c888af25d97ca383703ea4a85cf93bbab360c0bbd2993374da499a303778650270b9 +k = 6b9507fd2844df0949f8b67b6fde986e50173713ac03df2edf65cb339859321cd3a2b9aab8356f95dec62460ab19c822 +R = 018891f6381ed358b422f79a299cf0789cee783ba388af4d82cbbe17f3709751b7fd9400e9702820c28b9afc62fdf489 +S = aef73bd590802b2fd2a65c4f7fec89f9b24ecc199a69254785925f334cd1977c5e1f858bd9830d7d7d243ea707b1af0b + +Msg = 304bccb718b3a9e12669913490cc5bcc1979287b56c628fad706c354241e88d10e81445a2853e3fc32ece094ba1abc3fdcab61da27f9a0fca739371049fed462ee6b08fa31cde12720f8144a6f00ce9b1a7a6eadd231f126717074b4efb5c72ce673ca5859000a436f67a338d698759f12c461247c45a361fb6cb661fdbe6714 +d = d8559c3543afc6f7b3dc037a687bad2630283757ba7862fd23ed14e2151a4cf5fed3d249268f780e0b96b6b46274a2d5 +Qx = 5f94223918f2ec9f0a08342cb99e724881c92453957c59672860f69daac01b660331a0f5845e50f1f27766b219c89e7e +Qy = d76d83396130d10d1168d76c7fc83742ffffbe66d9f4da4ca3f95f5ad6dac8cc7bb65d16d317d37aa99fdbf30ec7439c +k = 4ad5a92b5b8e170b71c8a7ed419dc624c7680004562b8d16a37b6e639f581ce81d5f0d98cce44d54c4e7136229148340 +R = f7baa6a5488ab462ea59aa31a36402b15880c68110b6069f51ede0c3b52a7b1e5bf926fdbe95768931b7d5f87058835c +S = 28b1c4ef448a432f7c91b98b0c6471691e888211b6af907369a8930859b8cdb2e94f466a44f4e52f46df9b0d65e35de6 + +Msg = 64f9f05c2805acf59c047b5f5d2e20c39277b6d6380f70f87b72327a76170b872bfe4b25c451602acfb6a631bb885e2655aee8abe44f69c90fb21ffde03cef2a452c468c6369867dfd8aa26ac24e16aa53b292375a8d8fbf988e302bf00088e4c061aa12c421d8fe3cbd7273b0e8993701df1c59431f436a08b8e15bd123d133 +d = b9208cbfd186ddfa3efd5b71342ae1efb01a13ebc4c2a992a2cbee7254b7846a4252ece1104b89d13d835911f8511224 +Qx = 166e6d96cb60d916fd19888a2dd945a3306ff0d7b0a5e30729f47d3dac3de2be3fd5cd7437e9a80d6c48cf960d2d36f8 +Qy = e6b2b70f131092ae210f29cc6bad701318bddb31bddf921695855c6208941100d0cee5d10799f8b835afe3ea510e8229 +k = da706ab5f61531f2378b3c0a2b342108cd119eadaa88b859df64923bccfb0ec2393fd312826f65c15a6587d1d460015b +R = d9124c42858080c62400e4d4d8136304e03d910cbe9b9b3487f4d27c7e0540a314d34bef8c850045c8746ca631c11c42 +S = bbf6424a3b70166fa799f49e918439d515327039258ef9bd88435a59c9c19659f8ec3c8660720b0c08354ff60e0f5a76 + +[P-384,SHA-384] + +Msg = 6b45d88037392e1371d9fd1cd174e9c1838d11c3d6133dc17e65fa0c485dcca9f52d41b60161246039e42ec784d49400bffdb51459f5de654091301a09378f93464d52118b48d44b30d781eb1dbed09da11fb4c818dbd442d161aba4b9edc79f05e4b7e401651395b53bd8b5bd3f2aaa6a00877fa9b45cadb8e648550b4c6cbe +d = 201b432d8df14324182d6261db3e4b3f46a8284482d52e370da41e6cbdf45ec2952f5db7ccbce3bc29449f4fb080ac97 +Qx = c2b47944fb5de342d03285880177ca5f7d0f2fcad7678cce4229d6e1932fcac11bfc3c3e97d942a3c56bf34123013dbf +Qy = 37257906a8223866eda0743c519616a76a758ae58aee81c5fd35fbf3a855b7754a36d4a0672df95d6c44a81cf7620c2d +k = dcedabf85978e090f733c6e16646fa34df9ded6e5ce28c6676a00f58a25283db8885e16ce5bf97f917c81e1f25c9c771 +R = 50835a9251bad008106177ef004b091a1e4235cd0da84fff54542b0ed755c1d6f251609d14ecf18f9e1ddfe69b946e32 +S = 0475f3d30c6463b646e8d3bf2455830314611cbde404be518b14464fdb195fdcc92eb222e61f426a4a592c00a6a89721 + +Msg = d768f41e6e8ec2125d6cf5786d1ba96668ac6566c5cdbbe407f7f2051f3ad6b1acdbfe13edf0d0a86fa110f405406b69085219b5a234ebdb93153241f785d45811b3540d1c37424cc7194424787a51b79679266484c787fb1ded6d1a26b9567d5ea68f04be416caf3be9bd2cafa208fe2a9e234d3ae557c65d3fe6da4cb48da4 +d = 23d9f4ea6d87b7d6163d64256e3449255db14786401a51daa7847161bf56d494325ad2ac8ba928394e01061d882c3528 +Qx = 5d42d6301c54a438f65970bae2a098cbc567e98840006e356221966c86d82e8eca515bca850eaa3cd41f175f03a0cbfd +Qy = 4aef5a0ceece95d382bd70ab5ce1cb77408bae42b51a08816d5e5e1d3da8c18fcc95564a752730b0aabea983ccea4e2e +k = 67ba379366049008593eac124f59ab017358892ee0c063d38f3758bb849fd25d867c3561563cac1532a323b228dc0890 +R = fb318f4cb1276282bb43f733a7fb7c567ce94f4d02924fc758635ab2d1107108bf159b85db080cdc3b30fbb5400016f3 +S = 588e3d7af5da03eae255ecb1813100d95edc243476b724b22db8e85377660d7645ddc1c2c2ee4eaea8b683dbe22f86ca + +Msg = 6af6652e92a17b7898e40b6776fabaf0d74cf88d8f0ebfa6088309cbe09fac472eeac2aa8ea96b8c12e993d14c93f8ef4e8b547afe7ae5e4f3973170b35deb3239898918c70c1056332c3f894cd643d2d9b93c2561aac069577bbab45803250a31cd62226cab94d8cba7261dce9fe88c210c212b54329d76a273522c8ba91ddf +d = b5f670e98d8befc46f6f51fb2997069550c2a52ebfb4e5e25dd905352d9ef89eed5c2ecd16521853aadb1b52b8c42ae6 +Qx = 44ffb2a3a95e12d87c72b5ea0a8a7cb89f56b3bd46342b2303608d7216301c21b5d2921d80b6628dc512ccb84e2fc278 +Qy = e4c1002f1828abaec768cadcb7cf42fbf93b1709ccae6df5b134c41fae2b9a188bfbe1eccff0bd348517d7227f2071a6 +k = 229e67638f712f57bea4c2b02279d5ccad1e7c9e201c77f6f01aeb81ea90e62b44b2d2107fd66d35e56608fff65e28e4 +R = b11db592e4ebc75b6472b879b1d8ce57452c615aef20f67a280f8bca9b11a30ad4ac9d69541258c7dd5d0b4ab8dd7d49 +S = 4eb51db8004e46d438359abf060a9444616cb46b4f99c9a05b53ba6df02e914c9c0b6cc3a9791d804d2e4c0984dab1cc + +Msg = b96d74b2265dd895d94e25092fb9262dc4f2f7a328a3c0c3da134b2d0a4e2058ca994e3445c5ff4f812738e1b0c0f7a126486942a12e674a21f22d0886d68df2375f41685d694d487a718024933a7c4306f33f1a4267d469c530b0fed4e7dea520a19dd68bf0203cc87cad652260ed43b7b23f6ed140d3085875190191a0381a +d = de5975d8932533f092e76295ed6b23f10fc5fba48bfb82c6cc714826baf0126813247f8bd51d5738503654ab22459976 +Qx = f1fabafc01fec7e96d982528d9ef3a2a18b7fe8ae0fa0673977341c7ae4ae8d8d3d67420343d013a984f5f61da29ae38 +Qy = 1a31cf902c46343d01b2ebb614bc789c313b5f91f9302ad9418e9c797563e2fa3d44500f47b4e26ad8fdec1a816d1dcf +k = fc5940e661542436f9265c34bce407eff6364bd471aa79b90c906d923e15c9ed96eea4e86f3238ea86161d13b7d9359d +R = c2fbdd6a56789024082173725d797ef9fd6accb6ae664b7260f9e83cb8ab2490428c8b9c52e153612295432fec4d59cd +S = 8056c5bb57f41f73082888b234fcda320a33250b5da012ba1fdb4924355ae679012d81d2c08fc0f8634c708a4833232f + +Msg = 7cec7480a037ff40c232c1d2d6e8cd4c080bbeecdaf3886fccc9f129bb6d202c316eca76c8ad4e76079afe622f833a16f4907e817260c1fa68b10c7a151a37eb8c036b057ed4652c353db4b4a34b37c9a2b300fb5f5fcfb8aa8adae13db359160f70a9241546140e550af0073468683377e6771b6508327408c245d78911c2cc +d = 11e0d470dc31fab0f5722f87b74a6c8d7414115e58ceb38bfcdced367beac3adbf1fe9ba5a04f72e978b1eb54597eabc +Qx = 1950166989164cbfd97968c7e8adb6fbca1873ebef811ea259eb48b7d584627f0e6d6c64defe23cbc95236505a252aa1 +Qy = 41ef424b5cb076d4e32accd9250ea75fcf4ffd81814040c050d58c0a29b06be11edf67c911b403e418b7277417e52906 +k = e56904028226eb04f8d071e3f9cefec91075a81ca0fa87b44cae148fe1ce9827b5d1910db2336d0eb9813ddba3e4d7b5 +R = c38ef30f55624e8935680c29f8c24824877cf48ffc0ef015e62de1068893353030d1193bf9d34237d7ce6ba92c98b0fe +S = 651b8c3d5c9d5b936d300802a06d82ad54f7b1ba4327b2f031c0c5b0cb215ad4354edc7f932d934e877dfa1cf51b13fe + +Msg = 00ce978603229710345c9ad7c1c2dba3596b196528eea25bd822d43ca8f76a024e29217703dd0652c8a615284fc3edcc1c5ad1c8d5a8521c8e104c016a24e50c2e25066dcb56596f913b872767e3627aa3e55ec812e9fdac7c2f1beade83aef093e24c9c953982adf431a776880ae4583be158e11cdab1cbca3ad3a66900213d +d = 5c6bbf9fbcbb7b97c9535f57b431ed1ccae1945b7e8a4f1b032016b07810bd24a9e20055c0e9306650df59ef7e2cd8c2 +Qx = 2e01c5b59e619e00b79060a1e8ef695472e23bf9a511fc3d5ed77a334a242557098e40972713732c5291c97adf9cf2cf +Qy = 563e3fe4ad807e803b9e961b08da4dde4cea8925649da0d93221ce4cdceabc6a1db7612180a8c6bef3579c65539b97e9 +k = 03d23f1277b949cb6380211ad9d338e6f76c3eedac95989b91d0243cfb734a54b19bca45a5d13d6a4b9f815d919eea77 +R = abab65308f0b79c4f3a9ff28dd490acb0c320434094cef93e75adfe17e5820dc1f77544cfaaacdc8cf9ac8b38e174bef +S = 11b783d879a6de054b316af7d56e526c3dce96c85289122e3ad927cfa77bfc50b4a96c97f85b1b8221be2df083ff58fb + +Msg = 54a255c18692c6162a46add176a0ae8361dcb8948f092d8d7bac83e160431794d3b9812849bf1994bcdcfba56e8540c8a9ee5b93414548f2a653191b6bb28bda8dc70d45cc1b92a489f58a2d54f85766cb3c90de7dd88e690d8ebc9a79987eee1989df35af5e35522f83d85c48dda89863171c8b0bf4853ae28c2ac45c764416 +d = ffc7dedeff8343721f72046bc3c126626c177b0e48e247f44fd61f8469d4d5f0a74147fabaa334495cc1f986ebc5f0b1 +Qx = 51c78c979452edd53b563f63eb3e854a5b23e87f1b2103942b65f77d024471f75c8ce1cc0dfef83292b368112aa5126e +Qy = 313e6aaf09caa3ba30f13072b2134878f14a4a01ee86326cccbff3d079b4df097dc57985e8c8c834a10cb9d766169366 +k = c3de91dbe4f777698773da70dd610ef1a7efe4dc00d734399c7dd100728006a502822a5a7ff9129ffd8adf6c1fc1211a +R = f4f477855819ad8b1763f53691b76afbc4a31a638b1e08c293f9bcd55decf797f9913ca128d4b45b2e2ea3e82c6cf565 +S = 7c26be29569ef95480a6d0c1af49dc10a51a0a8931345e48c0c39498bfb94d62962980b56143a7b41a2fddc8794c1b7f + +Msg = 692a78f90d4f9d5aee5da536314a78d68c1feabbfe5d1ccea7f6059a66c4b310f8051c411c409ccf6e19a0cbd8b8e100c48317fe8c6d4f8a638b9551ce7ee178020f04f7da3001a0e6855225fb3c9b375e4ed964588a1a41a095f3f476c42d52ffd23ce1702c93b56d4425d3befcf75d0951b6fd5c05b05455bdaf205fe70ca2 +d = adca364ef144a21df64b163615e8349cf74ee9dbf728104215c532073a7f74e2f67385779f7f74ab344cc3c7da061cf6 +Qx = ef948daae68242330a7358ef73f23b56c07e37126266db3fa6eea233a04a9b3e4915233dd6754427cd4b71b75854077d +Qy = 009453ef1828eaff9e17c856d4fc1895ab60051312c3e1db1e3766566438b2990cbf9945c2545619e3e0145bc6a79004 +k = a2da3fae2e6da3cf11b49861afb34fba357fea89f54b35ce5ed7434ae09103fe53e2be75b93fc579fedf919f6d5e407e +R = dda994b9c428b57e9f8bbaebba0d682e3aac6ed828e3a1e99a7fc4c804bff8df151137f539c7389d80e23d9f3ee497bf +S = a0d6b10ceffd0e1b29cf784476f9173ba6ecd2cfc7929725f2d6e24e0db5a4721683640eaa2bbe151fb57560f9ce594b + +Msg = 3b309bb912ab2a51681451ed18ad79e95d968abc35423a67036a02af92f575a0c89f1b668afe22c7037ad1199e757a8f06b281c33e9a40bab69c9874e0bb680b905d909b9dc24a9fe89bb3d7f7d47082b25093c59754f8c19d1f81f30334a8cdd50a3cb72f96d4b3c305e60a439a7e93aeb640dd3c8de37d63c60fb469c2d3ed +d = 39bea008ec8a217866dcbdb1b93da34d1d3e851d011df9ef44b7828b3453a54aa70f1df9932170804eacd207e4f7e91d +Qx = 5709ec4305a9c3271c304face6c148142490b827a73a4c17affcfd01fffd7eaa65d2fdedfa2419fc64ed910823513faf +Qy = b083cda1cf3be6371b6c06e729ea6299213428db57119347247ec1fcd44204386cc0bca3f452d9d864b39efbfc89d6b2 +k = 3c90cc7b6984056f570542a51cbe497ce4c11aeae8fc35e8fd6a0d9adeb650e8644f9d1d5e4341b5adc81e27f284c08f +R = d13646895afb1bfd1953551bb922809c95ad65d6abe94eb3719c899aa1f6dba6b01222c7f283900fe98628b7597b6ea6 +S = 4a9a38afda04c0a6b0058943b679bd02205b14d0f3d49b8f31aac289129780cdb1c555def8c3f9106b478729e0c7efaa + +Msg = f072b72b8783289463da118613c43824d11441dba364c289de03ff5fab3a6f60e85957d8ff211f1cb62fa90216fb727106f692e5ae0844b11b710e5a12c69df3ed895b94e8769ecd15ff433762d6e8e94d8e6a72645b213b0231344e2c968056766c5dd6b5a5df41971858b85e99afbf859400f839b42cd129068efabeea4a26 +d = e849cf948b241362e3e20c458b52df044f2a72deb0f41c1bb0673e7c04cdd70811215059032b5ca3cc69c345dcce4cf7 +Qx = 06c037a0cbf43fdf335dff33de06d34348405353f9fdf2ce1361efba30fb204aea9dbd2e30da0a10fd2d876188371be6 +Qy = 360d38f3940e34679204b98fbf70b8a4d97f25443e46d0807ab634ed5891ad864dd7703557aa933cd380e26eea662a43 +k = 32386b2593c85e877b70e5e5495936f65dc49553caef1aa6cc14d9cd370c442a0ccfab4c0da9ec311b67913b1b575a9d +R = 5886078d3495767e330c7507b7ca0fa07a50e59912a416d89f0ab1aa4e88153d6eaf00882d1b4aa64153153352d853b5 +S = 2cc10023bf1bf8ccfd14b06b82cc2114449a352389c8ff9f6f78cdc4e32bde69f3869da0e17f691b329682ae7a36e1aa + +Msg = cf4945350be8133b575c4ad6c9585e0b83ff1ed17989b6cd6c71b41b5264e828b4e115995b1ae77528e7e9002ac1b5669064442645929f9d7dd70927cb93f95edeb73e8624f4bc897ec4c2c7581cb626916f29b2d6e6c2fba8c59a71e30754b459d81b912a12798182bcff4019c7bdfe929cc769bcc2414befe7d2906add4271 +d = d89607475d509ef23dc9f476eae4280c986de741b63560670fa2bd605f5049f1972792c0413a5b3b4b34e7a38b70b7ca +Qx = 49a1c631f31cf5c45b2676b1f130cbf9be683d0a50dffae0d147c1e9913ab1090c6529a84f47ddc7cf025921b771355a +Qy = 1e207eece62f2bcc6bdabc1113158145170be97469a2904eaaa93aad85b86a19719207f3e423051f5b9cbbe2754eefcb +k = 78613c570c8d33b7dd1bd1561d87e36282e8cf4843e7c344a2b2bb6a0da94756d670eeaffe434f7ae7c780f7cf05ca08 +R = 66f92b39aa3f4aeb9e2dc03ac3855406fa3ebbab0a6c88a78d7a03482f0c9868d7b78bc081ede0947c7f37bf193074ba +S = e5c64ed98d7f3701193f25dd237d59c91c0da6e26215e0889d82e6d3e416693f8d58843cf30ab10ab8d0edd9170b53ad + +Msg = d9b5cf0b50416573ff3c63133275a18394dd4326be2041e8d97e6e4e3855a4a177e9d26dfd223fe8aa74564edb49bd72de19916fb6f001f44530d5c18e2c332bce1b7415df5927ece5f3824f34d174b963136b53aef1fb78fb0c06a201a40b2db38e4d8216fc1e392a798c8ab4b3a314496b7f1087804ebfa89bf96e9cdb80c0 +d = 083e7152734adf342520ae377087a223688de2899b10cfcb34a0b36bca500a4dfa530e2343e6a39da7ae1eb0862b4a0d +Qx = 70a0f16b6c61172659b027ed19b18fd8f57bd28dc0501f207bd6b0bb065b5671cf3dd1ed13d388dcf6ccc766597aa604 +Qy = 4f845bf01c3c3f6126a7368c3454f51425801ee0b72e63fb6799b4420bfdebe3e37c7246db627cc82c09654979c700bb +k = 28096ababe29a075fbdf894709a20d0fdedb01ed3eeacb642a33a0da6aed726e13caf6cf206792ec359f0c9f9b567552 +R = ee2923f9b9999ea05b5e57f505bed5c6ba0420def42c6fa90eef7a6ef770786525546de27cdeb2f8586f8f29fb4ee67c +S = 50ef923fb217c4cf65a48b94412fda430fac685f0da7bd574557c6c50f5b22e0c8354d99f2c2f2c2691f252f93c7d84a + +Msg = 9e4042d8438a405475b7dab1cd783eb6ce1d1bffa46ac9dfda622b23ac31057b922eced8e2ed7b3241efeafd7c9ab372bf16230f7134647f2956fb793989d3c885a5ae064e85ed971b64f5f561e7ddb79d49aa6ebe727c671c67879b794554c04de0e05d68264855745ef3c9567bd646d5c5f8728b797c181b6b6a876e167663 +d = 63578d416215aff2cc78f9b926d4c7740a77c142944e104aa7422b19a616898262d46a8a942d5e8d5db135ee8b09a368 +Qx = cadbacef4406099316db2ce3206adc636c2bb0a835847ed7941efb02862472f3150338f13f4860d47f39b7e098f0a390 +Qy = 752ad0f22c9c264336cde11bbc95d1816ed4d1b1500db6b8dce259a42832e613c31178c2c7995206a62e201ba108f570 +k = 7b69c5d5b4d05c9950dc94c27d58403b4c52c004b80a80418ad3a89aabc5d34f21926729e76afd280cc8ee88c9805a2a +R = db054addb6161ee49c6ce2e4d646d7670754747b6737ca8516e9d1e87859937c3ef9b1d2663e10d7e4bd00ec85b7a97a +S = fcc504e0f00ef29587e4bc22faada4db30e2cb1ac552680a65785ae87beb666c792513f2be7a3180fc544296841a0e27 + +Msg = 0b14a7484a40b68a3ce1273b8a48b8fdb65ba900d98541c4bbd07b97e31bcc4c85545a03e9deab3c563f47a036ff60d0361684ba241b5aa68bb46f440da22181ee328a011de98eff34ba235ec10612b07bdfa6b3dc4ccc5e82d3a8d057e1862fef3def5a1804696f84699fda2ec4175a54a4d08bcb4f0406fdac4eddadf5e29b +d = ed4df19971658b74868800b3b81bc877807743b25c65740f1d6377542afe2c6427612c840ada31a8eb794718f37c7283 +Qx = 33093a0568757e8b58df5b72ea5fe5bf26e6f7aeb541b4c6a8c189c93721749bcaceccf2982a2f0702586a9f812fc66f +Qy = ebe320d09e1f0662189d50b85a20403b821ac0d000afdbf66a0a33f304726c69e354d81c50b94ba3a5250efc31319cd1 +k = d9b4cd1bdfa83e608289634dbfcee643f07315baf743fc91922880b55a2feda3b38ddf6040d3ba10985cd1285fc690d5 +R = 009c74063e206a4259b53decff5445683a03f44fa67252b76bd3581081c714f882f882df915e97dbeab061fa8b3cc4e7 +S = d40e09d3468b46699948007e8f59845766dbf694b9c62066890dd055c0cb9a0caf0aa611fb9f466ad0bbb00dbe29d7eb + +Msg = 0e646c6c3cc0f9fdedef934b7195fe3837836a9f6f263968af95ef84cd035750f3cdb649de745c874a6ef66b3dd83b66068b4335bc0a97184182e3965c722b3b1aee488c3620adb835a8140e199f4fc83a88b02881816b366a09316e25685217f9221157fc05b2d8d2bc855372183da7af3f0a14148a09def37a332f8eb40dc9 +d = e9c7e9a79618d6ff3274da1abd0ff3ed0ec1ae3b54c3a4fd8d68d98fb04326b7633fc637e0b195228d0edba6bb1468fb +Qx = a39ac353ca787982c577aff1e8601ce192aa90fd0de4c0ed627f66a8b6f02ae51315543f72ffc1c48a7269b25e7c289a +Qy = 9064a507b66b340b6e0e0d5ffaa67dd20e6dafc0ea6a6faee1635177af256f9108a22e9edf736ab4ae8e96dc207b1fa9 +k = b094cb3a5c1440cfab9dc56d0ec2eff00f2110dea203654c70757254aa5912a7e73972e607459b1f4861e0b08a5cc763 +R = ee82c0f90501136eb0dc0e459ad17bf3be1b1c8b8d05c60068a9306a346326ff7344776a95f1f7e2e2cf9477130e735c +S = af10b90f203af23b7500e070536e64629ba19245d6ef39aab57fcdb1b73c4c6bf7070c6263544633d3d358c12a178138 + +[P-384,SHA-512] + +Msg = 67d9eb88f289454d61def4764d1573db49b875cfb11e139d7eacc4b7a79d3db3bf7208191b2b2078cbbcc974ec0da1ed5e0c10ec37f6181bf81c0f32972a125df64e3b3e1d838ec7da8dfe0b7fcc911e43159a79c73df5fa252b98790be511d8a732fcbf011aacc7d45d8027d50a347703d613ceda09f650c6104c9459537c8f +d = 217afba406d8ab32ee07b0f27eef789fc201d121ffab76c8fbe3c2d352c594909abe591c6f86233992362c9d631baf7c +Qx = fb937e4a303617b71b6c1a25f2ac786087328a3e26bdef55e52d46ab5e69e5411bf9fc55f5df9994d2bf82e8f39a153e +Qy = a97d9075e92fa5bfe67e6ec18e21cc4d11fde59a68aef72c0e46a28f31a9d60385f41f39da468f4e6c3d3fbac9046765 +k = 90338a7f6ffce541366ca2987c3b3ca527992d1efcf1dd2723fbd241a24cff19990f2af5fd6419ed2104b4a59b5ae631 +R = c269d9c4619aafdf5f4b3100211dddb14693abe25551e04f9499c91152a296d7449c08b36f87d1e16e8e15fee4a7f5c8 +S = 77ffed5c61665152d52161dc13ac3fbae5786928a3d736f42d34a9e4d6d4a70a02d5af90fa37a23a318902ae2656c071 + +Msg = 45db86829c363c80160659e3c5c7d7971abb1f6f0d495709bba908d7aa99c9df64b3408a51bd69aba8870e2aaff488ef138f3123cf94391d081f357e21906a4e2f311defe527c55e0231579957c51def507f835cceb466eb2593a509dcbee2f09e0dde6693b2bfe17697c9e86dd672f5797339cbe9ea8a7c6309b061eca7aef5 +d = 0a3f45a28a355381a919372f60320d6610cfb69c3e318eb1607db3cadfc42b728b77a6a9e9e333de9183c58933daf60f +Qx = 832cbb7061a719a316e73dbad348fa67cd17c33f40b9000a3d3b691a2a2cd821052566717c3ead01089b56086af1366f +Qy = 1e15a048d1dce642d9ebcbfac7f92b1bcee90fd0240cc79abd29e32e0e655c4ee1fd34fb88178bba92aca100e7794ed0 +k = 2a78e651623ba604c42cf094fc7d046629306f508853427ba091448800d1092c041bb2323035fc9d19a8d44950f7dcc3 +R = 0db0cc9a2bda8dd7e565ad36f91b1c5756d78164dc8a72a5bee4b6bc45ea38c7a16b01d05b1893d4e06b62db24c30385 +S = abd383edaeda7d0b8de1b54fcd3c28874fed62ab266f1f84c8ba796a7b54e5e0695fdb43ce7fe90ed00fa468d87bca64 + +Msg = 4672fce0721d37c5be166bffa4b30d753bcf104b9b414db994b3ed33f36af4935ea59a0bb92db66448b3f57dad4fc67cef10ce141bf82c536be604b89a0bc0e8bca605b867880049d97142d30538fc543bd9d4fab7fdbe2f703815cdb6361beb66acff764bc275f910d1662445b07b92830db69a5994857f53657ed5ca282648 +d = 2e408c57921939f0e0fe2e80ce74a4fa4a1b4fa7ab070206298fe894d655be50e2583af9e45544b5d69c73dce8a2c8e7 +Qx = a2b24a5ad4a2e91f12199ed7699e3f297e27bf8b8ea8fbe7ed28366f3544cd8e680c238450f8a6422b40829d6647b25c +Qy = 2732be0075536e6519f6a099b975a40f8e0de337fa4d48bd0762b43f41cab8deafdef9cfbb9973e457801e3bf9c93304 +k = b10b6258afdde81f9c971cc1526d942e20cafac02f59fee10f98e99b8674636bff1d84a6eaa49c0de8d8cfdc90d8ce84 +R = be428a8de89a364a134719141ee8d776a3a8338f1132b07e01b28573d8eaf3b9008b63304c48821e53638b6141f9660b +S = 866181dbef5c147d391bed6adcee408c339982c307adc718c2b9ab9e5642d8dedc36dd6402559a3ab614c99c1e56b529 + +Msg = 9ae48fdd9bfc5cb0f4d4761e28b2073bda05a3e3fe82c212e66701dc4573cc67a829b0f82d7520b1bf11db0c6d1743822bbe41bb0adbd7222aa5fae70fbd1a31f2d4453a01c81e064d775388468be96f6063f8673b7b8d4455fe1bd4c801ad5e625a015eaa4a1a18da490d2af8642201eaba3c611cbd65f861d8e19ca82a1ee6 +d = 1c285da72a8eb1c3c38faab8d3bb4e68dc95c797082b9a3991a21c1de54759071ecf2265fb1eff504ab24174bc6710cf +Qx = 11acb1b5cc59a4f1df1913a8d6e91cbdafb8206dc44aff7d9da45906b664fc33194d9935a82aa4d62f39618897c86025 +Qy = 832ed0b9575fff52a3603bfe89f312751b4c396da98324117a61b3f525d27b2266f6cfb22be07e50b6874435e380ed62 +k = 2513075e02cc7fb3cff7b7adde46da31c5493749b5cf02758bd5b098a838bfd4d5e4c7fb8268bdc37e219c30efebe878 +R = b3d638b3be45f14f170da5bdc22d2114deac93ab340a25b3af2b5c18584bb9147e00dc6c67a2274f79aa4838793eb63f +S = 876112bdca2c725eb2f6dbd76d07710a31f0c16d38430cb0817f320a25a9ecfec8a66137d0304612ae29a6a484fd3319 + +Msg = 817d6a110a8fd0ca7b4d565558f68b59a156744d4c5aac5c6610c95451793de2a756f774558c61d21818d3ebeeeb71d132da1c23a02f4b305eccc5cd46bd21dfc173a8a91098354f10ffbb21bf63d9f4c3feb231c736504549a78fd76d39f3ad35c36178f5c233742d2917d5611d2073124845f1e3615b2ef25199a7a547e882 +d = 9da37e104938019fbdcf247e3df879a282c45f8fb57e6655e36b47723af42bec3b820f660436deb3de123a21de0ca37b +Qx = 722d0ea6891d509b18b85ca56f74deb5c3030d2a30433824123d430d03c99279572c3b28ecf01e747b9db8acc55d0ba3 +Qy = 7e2605ea7092214f366f3639037bffd89fe103c646e990839d3a1ced8d78edb5b9bc60d834fd8e2a3c17e920bdae023a +k = c8c18e53a9aa5915288c33132bd09323638f7995cd89162073984ed84e72e07a37e18c4c023933eace92c35d10e6b1b6 +R = 6512a8a2be731e301dcf4803764297862bbfa0ac8daed64d8e98b34618ecb20520fc5d3cf890b7783edf86e7ea407541 +S = 4ff10301f7b4168fae066361376007c1d7aa89a75c87719d0b54711ffef5ef3726f3eef84f7ebc025c110bde511b17f6 + +Msg = 464f10ec6fb229a51db5fd0e122f2cb8a9a022117e2987f4007bf5565b2c16aba0714e2e3cdd0c100d55ac3017e36fc7501ad8309ab9572aa65424c9eb2e580a119c55777676ec498df53ef6ae78fd8a988130ee0e6082bf1ef71cd4c946021018a8ca7154d13b174c638912613b0bdb9001c302bf7e443ad2124ab2c1cce212 +d = 0661ab3bf9f7bef51bec7dff758de289154557beb9ce18cc4b8cc09a871e8322af259cf188b593dc62f03a19e75f7f69 +Qx = b4f100558043858efa728082d9b99ad5192b59b0947434f5ba7ff2514508a6d71ba54e7221c31cb0712103272b3f6fa4 +Qy = 34f6df4eeb2da11498044635067c2715ed15ae251c78ffb9030d87909ea8539b66394e93109ca54c0406cf99960c3e93 +k = 84a87137edb6894f96c5a8e94a3765162034feb84dfea94e1c71411170c285a80321ec7999e25861844143209804882c +R = 4dc9d1b949b36e3c3847ac1c7ed114e1bc9cbe76119cf6fcd3f1b69ee6ee54e3255f1bb288fe2f8bd6d4049a21793c27 +S = 56a561d647b62ccae1e6df818b1a6fbde66c82ef0ff69ee415f183e7daf76be22630c7e02cd3fd729dfa490f26824584 + +Msg = 4e3e0fb96320ddccde8b463c273654c4f7164920b1d63430921d2e808dee403e6420eedda0a557b911d00736a4f8798dd4ef26673efd6d190988ad4929ec64f8685cfb76070a36cd6a3a4bf2f54fb08a349d44642b6f614043fef9b2813b63457c76537d23da7b37310334f7ba76edf1999dad86f72aa3446445a65952ac4e50 +d = 66e7cfdeb7f264cf786e35210f458c32223c3a12a3bc4b63d53a5776bc9b069928452484f6241caa3781fd1a4109d4db +Qx = 3c7682de540ab231daf21bf9fc80bda6abf7e17dcc79d476c7b7c3bd4d42d386877fd8ba495c1b0333e04fb5fd2a1505 +Qy = 0a1582e4f4d72abea9d3476aff8369c41261f0c5dddf2ca82e10f7a163f73df09473d9e5e2552187104e4cc7c6d83611 +k = 2fa266f5cce190eb77614933ca6a55121ad8bae168ff7a9043d96d13b5ca2fe70101ff9fe1e2b2cd7413e6aa8f49abde +R = e7ecda9da0c52d0474a9f70094dc8f061d7d6a22210d3b69a7be8f389aa666f256322099b87d16ad35357ea856574dba +S = ba348eb40a2830ec5a1130264ac0a8675420b1ae243e808a778135809ece21f42c0c881166321102b4f02df4c5c7ed9d + +Msg = c466b6b6baf7e6ffa876ec06105e2d43534e0517c07b1c4c9fb67ba81ce09525a7721ec3c290f2b1f65b6463d41598e7a25b2238501629953a5ca955b644354fb6856733a2e5bb8f5bc21a0c803493f5539f9fb83aab3dba2c982989c2270c61ab244b68bfe1b948d00c2ed975e09c29b5f8a7effcad8652a148cc880d503217 +d = 92c2f7ee64af86d003ab484e12b82fcf245fc330761057fec5b7af8f7e0a2d85b468c21d171460fcb829cae7b986316d +Qx = ca43a306479bf8fb537d4b9ff9d635bbb2a0d60d9e854d5b7e269d09d91f78c6b90b616e4c931629453645a2bb371e14 +Qy = 356c4d7f10e690614eaf7f82ba0f9dc1aad98130c0ad9fe353deec565cc04bef789a0a4242322e0058b46cd02f2de77d +k = 6ec81fb74f8725ba225f317264460ee300cfd2f02092000989acbdad4799cf55c244a65c557113328fe20282e6badb55 +R = cd7a4309bcebc25a8e10899fe2eda5f8b2dbcf329cd2f3d65befd67393e83fba2f8a67a15c01a6ac8314f9f5e87a9dca +S = 6dcfc0426bc148e67e91d4784e3d7e9bc3b7ce3676be62daa7f3f55dfdff6d9dc735b5e3e0bbd0785db1f76f7ac065f3 + +Msg = feac892b7720af80b3c9eede51e923f18d3d0c5de4c31f4aa75e36df7c7c2fd8f41778851a24b69e67dccb65e159dd5c383243bad7cfedcc5e85c8a01c34b0b94ba8e07e4c024c09d279b3731e8b62f9562d3c4f5042567efe42a9d0eaaabab28bc6f11232fc8ceaaf4518d9f3b2bebf020294496b7f6b879e69503f75fecd3d +d = 15347caaad1067f1848a676bd0a8c52021ae604b79d02775a0459226e0391a3acd26653c916fcfe86149fb0ee0904476 +Qx = e5a0463163964d984f5bad0072d45bc2059939e60a826ccca36c151460ae360f5d6679f60fe43e999b6da5841c96e48a +Qy = 30f2dd425a3fa2c95d34124217250b39e3b4a14f3e6e415ae8e5b0409eb72f43f78b64d0ce6f2d49980d6f04cd1391db +k = 1a2d224db4bb9c241ca5cab18920fad615fa25c1db0de0f024cb3ace0d11ef72b056885446659f67650fdff692517b1c +R = 87b4de0fb21df38dfc9a4b1e350da67547e307f55b5b9dd6615e408afe7c3553a6e02722847367439e636074faa2182b +S = 375d965753b9ed6c6c08576726f8308c2f8dbd2737824464e71265d47907e26f615bbeb8203ec617520d4ecd1851dc44 + +Msg = cf2982e3bf174ce547741b969403cd11e9553067e6af8177d89511a0eb040db924530bdba65d8b1ff714228db0737c1756f509e1506014a10736e65be2f91980a73891496e90ff2714a3601c7565cdcef5a395e2e0e1652f138d90d61eaa9cba993b823245647f6e07cec9b8b4449cd68a29741cd1579c66e548ca0d0acf33aa +d = ac1cb5e59bda2eff3413a3bab80308f9fb32c595283c795de4c17fdae8d4647b5f108fd0801aee22adb7db129283b5aa +Qx = bc6b1a718284803553c173089c397870aaaecca579bb8e81a8cfa12473cd2057567fa8726a19ed427cc035baeec2c551 +Qy = 14f82997d1129b669f0015350e47ad561b1b13441af4fb44656f15ed0c5706984d66655accc52f2e943eef39cb1cdc21 +k = 8053a46e875f446056b06d4318fa3e8977622de7207cbf0996bf35b0e9b19aaa507f642bcf0be9f048f1af09806f6946 +R = a994eb15b64114ce8a9342d18b5edda96a6d76314a5ac03da723699177d352a4a9f3b7121b11a91e43a6af4025da51d6 +S = 8183ae33a888e99aa76882da0a6705ad102f2bbd9572fad0d2e4d6d70151970469e00c5220e59c14724d771c1384b302 + +Msg = bf9fdd4107ef5a6070108771ac9eee4f0c8043bf0d04db772a47294f4137e2439d94b337114b074e57e0cb78d0ccf352a2833e9788ee2a1a9ffeacd34f38fcefb86653d70c7dadd4cf6548d608e70acdef6c7530974b92c813798add659752a8c72b05e1ad9c65c21834ce6fbe49d8a1426b5a54270794436d284364fac6ec1a +d = 205f1eb3dfacff2bdd8590e43e613b92512d6a415c5951bda7a6c37db3aae39b9b7ec6edd256609e75373419087fa71f +Qx = c9f1f63a18c761b077a1ec35fbb2de635db9b8592c36194a01769b57728c7755d4c79b3d5b97a1a4631e30c86d03f13c +Qy = f8c4a38770054d5cc9bb9182e6d4638242c4fd16e869ac22e44c4b9402d594e0c6f5df6a9a7de32a4893d9f6588f1950 +k = ecd395c5d8b7d6e6b2b19644e0d2e6086c912c6a0f5b8ed4b94b7290b65852c9741ce8eeb08d8751ead8a183e17d76c6 +R = e81331d78b438b0b8d98c1be03385ba5d614af182f1677f259126cc3de7eaac6c19b02be955d936b6bf9c27c6796e6f0 +S = 17c2b7a8e0fc93909762aa9f86f9561e759ecb88f02337b2018363be6095d9e4324a6d3296046686624b5efad6b52878 + +Msg = 5d634fb39a2239256107dc68db19751540b4badac9ecf2fce644724401d6d632b3ae3b2e6d05746b77ddc0c899878032248c263eda08d3d004d35952ad7a9cfe19343d14b37f9f632245e7b7b5fae3cb31c5231f82b9f1884f2de7578fbf156c430257031ba97bc6579843bc7f59fcb9a6449a4cd942dffa6adb929cf219f0ad +d = e21e3a739e7ded418df5d3e7bc2c4ae8da76266a1fc4c89e5b09923db80a72217f1e96158031be42914cf3ee725748c1 +Qx = 0f753171922b5334f3dd2778a64ce2da8295121939beae71ad85e5344e893be0fd03cf14e1f031adec098e0c4409449c +Qy = 45c10a0ffc0eb2f1cec5c89b698061108313ee7d449ad580efad344f0e7cf35be8a18fca620f112e57bdc746abdace55 +k = d06bea06b25e6c30e866b1eb0657b45673e37b709013fb28fd7373afc8277cbc861354f821d0bd1927e52ec083a0f41f +R = e8d4a31dd0e7d2522be62a32608e744c3775ceb606dc897899f0c73f1a40ce9a8be854cd506e65cd81fd7fa2c616cb7b +S = 8151b681b6b6046d3c36f332d06d9ba7751e740631cdb759f88c50a25a8e950d5023df8a15c77243743733c4feaf21d5 + +Msg = c9b4ff721b3e886f0dc05856ffff0aabb64a8504b1746a47fdd73e6b7ebc068f06ac7ffa44c757e4de207fc3cbfaf0469d3ac6795d40630bcafe8c658627e4bc6b86fd6a2135afbc18ccc8e6d0e1e86016930ca92edc5aa3fbe2c57de136d0ea5f41642b6a5d0ddeb380f2454d76a16639d663687f2a2e29fb9304243900d26d +d = 93434d3c03ec1da8510b74902c3b3e0cb9e8d7dccad37594d28b93e065b468d9af4892a03763a63eae060c769119c23c +Qx = a52c25f2af70e5bc6a992ecef4ea54e831ed5b9453747d28aec5cffb2fcfee05be80c5cbab21606b5507aa23878adee1 +Qy = 2cf2a9afeff83f3041dc8a05f016ccae58aa1a0e0dc6be9d928e97f2598c9ba5e9718d5eb74c9cfb516fd8c09f55f5b9 +k = 13d047708ae5228d6e3bbada0e385afdb3b735b31123454fdf40afe3c36efed563fd2cce84dcc45c553b0993d9ca9ec3 +R = a0203f6f2c456baac03538ed506a182e57a25151802cf4b2557613b2fb615ebd4c50ddc505f87c048a45bad3b2fc371c +S = 0eab56457c4080400fa3af124761d5a01fef35f9649edba8b97d22116386f3b8b363e97ef3f82616d5d825df1cf865ef + +Msg = db2ad659cf21bc9c1f7e6469c5f262b73261d49f7b1755fc137636e8ce0202f929dca4466c422284c10be8f351f36333ebc04b1888cba217c0fec872b2dfc3aa0d544e5e06a9518a8cfe3df5b20fbcb14a9bf218e3bf6a8e024530a17bab50906be34d9f9bba69af0b11d8ed426b9ec75c3bd1f2e5b8756e4a72ff846bc9e498 +d = e36339ddbe8787062a9bc4e1540690915dd2a2f11b3fe9ee946e281a0a2cbed426df405ed9cb0eca42f85443efd09e0c +Qx = a1ffb4b790d1593e907369b69de10b93cddbb02c6131f787422364d9d692768ef8097970306cce16c97f2b10c538efa7 +Qy = d0692028601ea794d2563ffe9facc7273938fab47dd00b8960be15549a9c2b3f8552583eb4c6cd212fe486c159c79153 +k = 2226f7329378cecd697f36ae151546643d67760856854661e31d424fae662da910e2157da9bb6dfbe3622296e0b5710c +R = 20dcc25b67dd997621f437f65d78347fb57f8295b1b14453b1128203cda892bcfe726a2f107d30975d63172e56f11d76 +S = 51cff592cbef75ef8321c8fa1e4229c4298b8180e427bee4e91d1e24fc28a729cf296beb728960d2a58cf26773d8e2e2 + +Msg = dbd8ddc02771a5ff7359d5216536b2e524a2d0b6ff180fa29a41a8847b6f45f1b1d52344d32aea62a23ea3d8584deaaea38ee92d1314fdb4fbbecdad27ac810f02de0452332939f644aa9fe526d313cea81b9c3f6a8dbbeafc899d0cdaeb1dca05160a8a039662c4c845a3dbb07be2bc8c9150e344103e404411668c48aa7792 +d = 5da87be7af63fdaf40662bd2ba87597f54d7d52fae4b298308956cddbe5664f1e3c48cc6fd3c99291b0ce7a62a99a855 +Qx = 54c79da7f8faeeee6f3a1fdc664e405d5c0fb3b904715f3a9d89d6fda7eabe6cee86ef82c19fca0d1a29e09c1acfcf18 +Qy = 926c17d68778eb066c2078cdb688b17399e54bde5a79ef1852352a58967dff02c17a792d39f95c76d146fdc086fe26b0 +k = 1b686b45a31b31f6de9ed5362e18a3f8c8feded3d3b251b134835843b7ae8ede57c61dc61a30993123ac7699de4b6eac +R = 9dbfa147375767dde81b014f1e3bf579c44dd22486998a9b6f9e0920e53faa11eed29a4e2356e393afd1f5c1b060a958 +S = e4d318391f7cbfe70da78908d42db85225c85f4f2ff413ecad50aad5833abe91bdd5f6d64b0cd281398eab19452087dd + + +[P-521,SHA-224] + +Msg = 58ec2b2ceb80207ff51b17688bd5850f9388ce0b4a4f7316f5af6f52cfc4dde4192b6dbd97b56f93d1e4073517ac6c6140429b5484e266d07127e28b8e613ddf65888cbd5242b2f0eee4d5754eb11f25dfa5c3f87c790de371856c882731a157083a00d8eae29a57884dbbfcd98922c12cf5d73066daabe3bf3f42cfbdb9d853 +d = 1d7bb864c5b5ecae019296cf9b5c63a166f5f1113942819b1933d889a96d12245777a99428f93de4fc9a18d709bf91889d7f8dddd522b4c364aeae13c983e9fae46 +Qx = 1a7596d38aac7868327ddc1ef5e8178cf052b7ebc512828e8a45955d85bef49494d15278198bbcc5454358c12a2af9a3874e7002e1a2f02fcb36ff3e3b4bc0c69e7 +Qy = 184902e515982bb225b8c84f245e61b327c08e94d41c07d0b4101a963e02fe52f6a9f33e8b1de2394e0cb74c40790b4e489b5500e6804cabed0fe8c192443d4027b +k = 141f679033b27ec29219afd8aa123d5e535c227badbe2c86ff6eafa5116e9778000f538579a80ca4739b1675b8ff8b6245347852aa524fe9aad781f9b672e0bb3ff +R = 06b973a638bde22d8c1c0d804d94e40538526093705f92c0c4dac2c72e7db013a9c89ffc5b12a396886305ddf0cbaa7f10cdd4cd8866334c8abfc800e5cca365391 +S = 0b0a01eca07a3964dd27d9ba6f3750615ea36434979dc73e153cd8ed1dbcde2885ead5757ebcabba117a64fcff9b5085d848f107f0c9ecc83dfa2fa09ada3503028 + +Msg = 2449a53e0581f1b56d1e463b1c1686d33b3491efe1f3cc0443ba05d65694597cc7a2595bda9cae939166eb03cec624a788c9bbab69a39fb6554649131a56b26295683d8ac1aea969040413df405325425146c1e3a138d2f4f772ae2ed917cc36465acd66150058622440d7e77b3ad621e1c43a3f277da88d850d608079d9b911 +d = 17e49b8ea8f9d1b7c0378e378a7a42e68e12cf78779ed41dcd29a090ae7e0f883b0d0f2cbc8f0473c0ad6732bea40d371a7f363bc6537d075bd1a4c23e558b0bc73 +Qx = 0156cd2c485012ea5d5aadad724fb87558637de37b34485c4cf7c8cbc3e4f106cb1efd3e64f0adf99ddb51e3ac991bdd90785172386cdaf2c582cc46d6c99b0fed1 +Qy = 1edeeda717554252b9f1e13553d4af028ec9e158dbe12332684fc1676dc731f39138a5d301376505a9ab04d562cc1659b0be9cb2b5e03bad8b412f2699c245b0ba2 +k = 1dc3e60a788caa5f62cb079f332d7e5c918974643dca3ab3566a599642cd84964fbef43ce94290041fe3d2c8c26104d9c73a57a7d4724613242531083b49e255f33 +R = 12592c0be6cce18efb2b972cd193d036dcb850f2390fa8b9b86b2f876548bc424fb3bc13c1e5c415fa09d0ecfcae5bf76fb23e8322d7eecb264a2ae6d20ef50d405 +S = 11bc9713be88e3b9912a3e5f5d7b56f20573e979b1a75d04ce339f724bddffa4665d25995fe24d32507d8a07c5e10169f5338ef2827737f7b0291752b21237217e3 + +Msg = 7ba05797b5b67e1adfafb7fae20c0c0abe1543c94cee92d5021e1abc57720a6107999c70eacf3d4a79702cd4e6885fa1b7155398ac729d1ed6b45e51fe114c46caf444b20b406ad9cde6b9b2687aa645b46b51ab790b67047219e7290df1a797f35949aaf912a0a8556bb21018e7f70427c0fc018e461755378b981d0d9df3a9 +d = 135ea346852f837d10c1b2dfb8012ae8215801a7e85d4446dadd993c68d1e9206e1d8651b7ed763b95f707a52410eeef4f21ae9429828289eaea1fd9caadf826ace +Qx = 18d40cc4573892b3e467d314c39c95615ee0510e3e4dbc9fa28f6cd1f73e7acde15ad7c8c5339df9a7774f8155130e7d1f8de9139ddd6dfe1841c1e64c38ea98243 +Qy = 17021782d33dc513716c83afe7ba5e7abef9cb25b31f483661115b8d6b5ae469aaf6f3d54baa3b658a9af9b6249fd4d5ea7a07cb8b600f1df72b81dac614cfc384a +k = 0c24acc1edb3777212e5b0bac744eadf4eda11fa150753b355bf96b189e6f57fc02284bb22d8b3cd8bba7a09aae9f4ea955b382063425a6f8da2f99b9647b147172 +R = 183da7b8a9f9d5f08903359c1a2435b085fcf26a2ed09ab71357bb7634054acc569535e6fe81d28233e4703005fc4bf83ce794d9463d575795aa0f03398e854cefd +S = 0b3621145b9866ab7809139795cc30cd0404127a7f0fafa793660491009f6c53724fdb0b1ffbf0fd51c131180b8a957fe66e76d2970247c024261c768dee9abbfb9 + +Msg = 716dabdb22a1c854ec60420249905a1d7ca68dd573efaff7542e76f0eae54a1828db69a39a1206cd05e10e681f24881b131e042ed9e19f5995c253840e937b809dfb8027fed71d541860f318691c13a2eb514daa5889410f256305f3b5b47cc16f7a7dad6359589b5f4568de4c4aae2357a8ea5e0ebaa5b89063eb3aa44eb952 +d = 1393cb1ee9bfd7f7b9c057ecc66b43e807e12515f66ed7e9c9210ba1514693965988e567fbad7c3f17231aacee0e9b9a4b1940504b1cd4fd5edfaa62ba4e3e476fc +Qx = 1e855c935139c8092092cfa733db1292530506eeb2bbb1687f9602c36d97a6714e998892d5d3b842d1896a6ece9d549e9792881a256256137b3dff180c96cc5d07b +Qy = 18d83b6e93cd287311f7bf7c1d7f9eeabcf0b69c12f2d8f40e333e81e956d968532a37a4c04d761874df293b484cd7053b03fdbc2fdcd3b4c412d6f272fb7c93fe6 +k = 1d98619bdc04735d30c222fc67da82c069aea5f449af5e8c4db10c1786c0cb9e6f2cc0bb66fa6be18c485570d648dafcd0a973c43d5c94e9a9dacbd3170e53fa2a0 +R = 0bf47fabe107ce0ec03e2ad60a79b058e1bebb18568b6a8cdbe86032e71aa30c15766105b2ea952cfa79bcab046df601159f96e179bbcf252dc68ac73d31481fdae +S = 1f918fec69cd07d90f9d892b7117e7519c3224947f4262f1fd97077dd5386a6c78aeddff3ee97e59ea353f06029f1336f0d6ef5c0f4b17ca59343a55319b7bfc3db + +Msg = 9cc9c2f131fe3ac7ea91ae6d832c7788cbbf34f68e839269c336ceef7bef6f20c0a62ea8cc340a333a3002145d07eba4cf4026a0c4b26b0217a0046701de92d573d7c87a386a1ea68dc80525b7dcc9be41b451ad9f3d16819e2a0a0b5a0c56736da3709e64761f97cae2399de2a4022dc4c3d73c7a1735c36dbde86c4bc5b6f7 +d = 179fa164e051c5851e8a37d82c181e809a05fea9a3f083299b22684f59aa27e40dc5a33b3f7949338764d46bfe1f355134750518b856d98d9167ef07aac3092c549 +Qx = 1857cc7bbed20e87b3fd9a104956aa20c6502192910e0e7598410526ebfe1c99397b85189612a60c51fb8f4dd5cb08a8cd2e702563062dcb043410715c5323a0046 +Qy = 1fce8d135284310d2f38c216030634b32cd223222f0d9d8d2b7c55477c4b8b74fc6c96a6092f34b05ca44d3633a5037c2166c479a032bb4f949f89fc1ba5236d07d +k = 16d9704c0cee791f2938bb2a8a595752a3635c2f557efeecefd719414b5f2aaf846080f582c76eae7a8fddf81859b49d0131c212524d55defa67dca1a9a28ca400f +R = 1c9a4e51774384e8362876a87c572e6463a54413c7c6252c552ebb182f83e45ace436ade4ca373d8a7216e83efb62c8b41c4d5132a0afa65078f16d189baca39187 +S = 1e92a7dd5fea29a666398e1df5775cbb5664fe6943fe4c1d2bba516b7543c84df584458e53919c4ffab579a26fb3c892a5d1a77b0a07428c89350f8b559e627b014 + +Msg = 14c69f8d660f7a6b37b13a6d9788eff16311b67598ab8368039ea1d9146e54f55a83b3d13d7ac9652135933c68fafd993a582253be0deea282d86046c2fb6fd3a7b2c80874ced28d8bed791bd4134c796bb7baf195bdd0dc6fa03fdb7f98755ca063fb1349e56fd0375cf94774df4203b34495404ebb86f1c7875b85174c574c +d = 13dabca37130ba278eae2b3d106b5407711b0d3b437fbf1c952f0773571570764d2c7cb8896a8815f3f1975b21adc6697898e5c0a4242092fc1b80db819a4702df4 +Qx = 0bc2aebf40cd435bc37d73c09d05f2fd71321111a767c2b0d446f90dd4a186839c694ceb734e027e7ee948f0f63e4d3f1656d3d543df23c342a599306909b347109 +Qy = 1f4c98ac03f0718e58d5d1762c920445b11dbdd60ec7f60095809204e14965a4ecb0be6fea06adbac8ba431d6f144c75c199225df2a619a34be99897125b3a10af8 +k = 0401187c8b89945a1e48cda9ee52167789f4121e67482a7ac797899f5d3d2e623aed31e4adae08a8d43e69028fa074d2650317cbc765f6ed191cf0317b4bae57881 +R = 1e572afed754016fba43fc33e352932c4db65efcb84e2bd159b40fc5925893b161effc40240be28d8c07154d2615f605c6f0451b976522d95afd37f46602df7a12a +S = 030370c1c5352c2b663ac1858b42f69545b2f58ed5b2c007f303726977d3c756b5d644ec6788f94c886f78269aa190a3d8d1ae10e4fd24d937c4556fb9e1953fd6d + +Msg = 8d8e75df200c177dbfe61be61567b82177ea5ec58e2781168d2277d2fd42668f01248ca3eb29ffa2689b12ae40f9c429532b6d2e1f15891322b825a0a072a1c68fa09e78cfdef3e95ed6fdf7233a43cb68236560d49a3278f0b3f47cb08f475bd9ab2f60755ea4a1767de9313b71a1b9ea87ef33f34682efbda263b0f8cc2f52 +d = 198681adbde7840d7ccd9cf1fb82056433fb4dd26bddf909af7b3b99da1ca2c05c8d4560ecd80ba68f376f8b487897e374e99a9288ed7e3645cc0d00a478aae8d16 +Qx = 057ce3777af7032f1f82308682e71fe09f88bf29dacd5018a725e1caa4b1e2bfdd894fe618f9266f31ba089856dc9c1b70e4a2faa08b4b744d1aafcd5ae99e2c736 +Qy = 199bcfef2021bc5890d7d39ec5dc0c26956801e84cae742cf6c50386eb289b6e97754dd25a94abf81f1cb1b36935b5eb29f4b32a6516d2ff6a7d23064a0daec94b3 +k = 19d2d74ad8ee2d85048f386998a71899ef6c960b4ab324e5fd1c0a076c5a632fd0009500076522e052c5c9806eef7056da48df6b16eb71cdf0f1838b0e21715fce0 +R = 18ecacbcffd5414bbb96728e5f2d4c90178e27733d13617e134ec788022db124374bbaa11e2c77fe3f38d1af6e998e1b0266b77380984c423e80ffa6ff2bcafd57a +S = 1c727f34b6a378f3087721a54e9796499b597ecf6666b8f18312d67e1190a8a66e878efc2367b551267494e0245979ef4deed6d2cbf2c3711af6d82ccfeb101a377 + +Msg = 10631c3d438870f311c905e569a58e56d20a2a560e857f0f9bac2bb7233ec40c79de145294da0937e6b5e5c34fff4e6270823e5c8553c07d4adf25f614845b2eac731c5773ebbd716ab45698d156d043859945de57473389954d223522fbafecf560b07ef9ba861bcc1df9a7a89cdd6debf4cd9bf2cf28c193393569ccbd0398 +d = 08c4c0fd9696d86e99a6c1c32349a89a0b0c8384f2829d1281730d4e9af1df1ad5a0bcfccc6a03a703b210defd5d49a6fb82536f88b885776f0f7861c6fc010ef37 +Qx = 164ac88ed9afe137f648dd89cdd9956682830cac5f7c1a06d19a1b19f82bb1d22dfeefea30d35c11202fed93fd5ce64835d27c6564d6e181287fa04a2d20994986b +Qy = 05cb83669265f5380ccefe6b4f85fdf0049e6703f6f378a0b2e52ed0fbbcf300afebb722f4ed48e3819cb976c1d60e2ba05646b478f6dfecfbae730e9644c297f00 +k = 189801432cba9bf8c0763d43b6ec3b8636e62324587a4e27905b09a58e4aa66d07d096dbce87824e837be1c243dd741f983c535a5dd2f077aac8beee9918258d3cb +R = 0917723f7241e8dc7cd746b699ab621d068dd3a90e906aaf0a4862744b96fd4e5ccdb9c7796c27f7196e693d06ec209464c3ea60ad6313e9b77cceaa14767e6651c +S = 0957b0ecdc3668f6efa5d0957615bcfffd6419c5e57579b74f960f65ae3fb9e8284322ff710b066f7e0959ac926d3cf9a594bdb70bbec756c96910b26a2486dee9e + +Msg = 80aad6d696cbe654faa0d0a24d2f50d46e4f00a1b488ea1a98ed06c44d1d0c568beb4ab3674fc2b1d2d3da1053f28940e89ba1244899e8515cabdd66e99a77df31e90d93e37a8a240e803a998209988fc829e239150da058a300489e33bf3dcdaf7d06069e74569fee77f4e3875d0a713ccd2b7e9d7be62b34b6e375e84209ef +d = 1466d14f8fbe25544b209c5e6a000b771ef107867e28ed489a42015119d1aa64bff51d6b7a0ac88673bbc3618c917561cff4a41cdb7c2833dab5ebb9d0ddf2ca256 +Qx = 1dc8b71d55700573a26af6698b92b66180cf43e153edadb720780321dbb4e71d28e0a488e4201d207fc4848fe9dd10dcabec44492656a3ff7a665fe932445c82d0b +Qy = 1920b16331b7abeb3db883a31288ef66f80b7728b008b3cc33e03a68f68d9e653a86e3177bbc00014fa5ea4c1608c0d455c2e2ac7bd8ab8519ebf19955edf1baf8d +k = 160d04420e0d31b0df476f83393b1f9aff68389cc3299e42ef348d97646f7531a722b66ddfb9501bbb5c4a41d84c78be7233b11489bceb817d23060e6017433fab8 +R = 08077aabd0a342f03f912007c586cfedfc63f93d1118f720d5b62b3ce141a60f86f111dfd8fc2e31a6778981f1a5e28f29a7369bd7897bb41240c8d3a9c170e0ee0 +S = 00abc75fc154b93840579457820957e89d1260fee0a4b9bb1946f61ca1e71afd76bb5e1077b3e38ceb39d1fac5ef8b217c4110617b3ad118e02b3fcc2a39ef38613 + +Msg = 8a7792a2870d2dd341cd9c4a2a9ec2da753dcb0f692b70b64cef2e22071389c70b3b188dea5f409fb435cbd09082f59de6bc2ff9e65f91b7acc51e6e7f8e513148cb3c7c4664f227d5c704626b0fda447aa87b9d47cd99789b88628eb642ed250312de5ba6b25f3d5342a3cbb7ebd69b0044ee2b4c9ba5e3f5195afb6bea823d +d = 01a99fcf54c9b85010f20dc4e48199266c70767e18b2c618044542cd0e23733817776a1a45dbd74a8e8244a313d96c779f723013cd88886cb7a08ef7ee8fdd862e7 +Qx = 1912d33b01d51e2f777bdbd1ada23f2b1a9faf2be2f2a3b152547db9b149b697dd71824ca96547462e347bc4ef9530e7466318c25338c7e04323b1ba5fd25ea7162 +Qy = 0bbe9b1e3a84accd69b76b253f556c63e3f374e3de0d1f5e3600fc19215533b2e40d6b32c3af33314d223ea2366a51d1a337af858f69326389276f91be5c466e649 +k = 14fafd60cb026f50c23481867772411bb426ec6b97054e025b35db74fe8ea8f74faa2d36e7d40b4652d1f61794878510b49b7b4fe4349afccd24fc45fec2fd9e9e7 +R = 18b1df1b6d7030a23a154cacce4a2e3761cc6251ff8bf6c9f6c89d0a15123baef9b338ada59728349ce685c03109fcde512ed01a40afd2ca34e1bc02ecf2871d45c +S = 0a399f9b9e21aeddf450429fec2dc5749e4a4c7e4f94cee736004dcc089c47635da22845992cd076a4f0a01d2cc1b0af6e17b81a802361699b862157ad6cad8bd1d + +Msg = f971bcd396efb8392207b5ca72ac62649b47732fba8feaa8e84f7fb36b3edb5d7b5333fbfa39a4f882cb42fe57cd1ace43d06aaad33d0603741a18bc261caa14f29ead389f7c20536d406e9d39c34079812ba26b39baedf5feb1ef1f79990496dd019c87e38c38c486ec1c251da2a8a9a57854b80fcd513285e8dee8c43a9890 +d = 1b6015d898611fbaf0b66a344fa18d1d488564352bf1c2da40f52cd997952f8ccb436b693851f9ccb69c519d8a033cf27035c27233324f10e9969a3b384e1c1dc73 +Qx = 110c6177ceb44b0aec814063f297c0c890671220413dbd900e4f037a67d87583eaf4b6a9a1d2092472c17641362313c6a96f19829bb982e76e3a993932b848c7a97 +Qy = 0f6e566c4e49b2ee70a900dc53295640f3a4a66732df80b29f497f4ae2fa61d0949f7f4b12556967bb92201a4f5d1384d741120c95b617b99c47a61e11c93a482d6 +k = 1a88667b9bdfe72fb87a6999a59b8b139e18ef9273261549bc394d884db5aa64a0bc7c7d38a8ef17333478d2119d826e2540560d65f52b9a6dc91be1340cfd8f8f8 +R = 015f73def52ea47ddb03e0a5d154999642202e06e6734ac930c1dc84756c67bbb1cca9f21f92d61bfdb2052c5dd2833349610f68139393d77250a7662ef7bd17cbe +S = 155c744a729f83b27d1f325a91e63a0d564fe96ff91eaa1bad3bff17d2abffa065d14a1d20a04dd993f6ed3260b60bcc6401e31f6bc75aaafe03e8c1a9cd14d2708 + +Msg = ec0d468447222506b4ead04ea1a17e2aa96eeb3e5f066367975dbaea426104f2111c45e206752896e5fa7594d74ed184493598783cb8079e0e915b638d5c317fa978d9011b44a76b28d752462adf305bde321431f7f34b017c9a35bae8786755a62e746480fa3524d398a6ff5fdc6cec54c07221cce61e46fd0a1af932fa8a33 +d = 05e0d47bf37f83bcc9cd834245c42420b68751ac552f8a4aae8c24b6064ae3d33508ecd2c17ec391558ec79c8440117ad80e5e22770dac7f2017b755255000c853c +Qx = 1a6effc96a7f23a44bf9988f64e5cfafdae23fa14e4bee530af35d7a4ddf6b80dcd0d937be9dd2db3adcda2f5216fecbce867ee67e7e3773082f255156e31358c2f +Qy = 1e7760190dfbe07ec2df87067597087de262c1e0a12355456faba91b2e7277050d73b924e14c0e93b8457a8b3e1f4207ce6e754274f88ad75c000d1b2977edc9c1a +k = 18afea9a6a408db1e7a7bb1437a3d276f231eacfc57678bfa229d78681cbe4e800e6065332a3128db65d3aa446bb35b517dca26b02e106e1311881a95b0302d15e8 +R = 01c49b3c1d21f1678bdbe1ac12167e95e06617190bdee1a729c1c649210da19e2e210f6689e1310513bfe2ac6c0f4ee5f324f344b31b18df341eaadb826d07adc9b +S = 129d4931ba457443012f6ffecd002f2abc3a4b65a58fee8457917ebcf24b29a1d3055b7fc62939a74ebb0c3582172ee7c3c75e0b2fa2367c6e04df63a7a91d593ad + +Msg = d891da97d2b612fa6483ee7870e0f10fc12a89f9e33d636f587f72e0049f5888782ccde3ea737e2abca41492bac291e20de5b84157a43c5ea900aef761006a4471072ab6ae6d515ffe227695d3ff2341355b8398f72a723ae947f9618237c4b6642a36974860b452c0c6202688bc0814710cbbff4b8e0d1395e8671ae67ada01 +d = 1804ab8f90ff518b58019a0b30c9ed8e00326d42671b71b067e6f815ac6752fa35016bd33455ab51ad4550424034419db8314a91362c28e29a80fbd193670f56ace +Qx = 0a79529d23a832412825c3c2ad5f121c436af0f29990347ecfa586ce2e57fd3c7e0624d8db1f099c53473dbc2578f85416ad2ac958a162051014fb96bf07f9e1d17 +Qy = 17c0750f26df0c621d2d243c6c99f195f0086947b1bf0f43731555f5d677e2d4a082fb5fe8da87e1592a5fa31777da3299cede5a6f756edf81c85b77853388bb3ab +k = 042d7c36fec0415bc875deb0fab0c64548554062e618aee3aa6670ffd68ab579fe620d3a9316357267fd3111c0ed567dca663acd94b646d2ba0771953cd9690ef42 +R = 0d01dfbef126febbdfa03ef43603fd73bc7d2296dce052216e965fed7bb8cbbc24142bfcddb60c2e0bef185833a225daa0c91a2d9665176d4ad9986da785f4bfcf0 +S = 16627e2614dbcd371693c10bbf579c90c31a46c8d88adf59912c0c529047b053a7c7715142f64dcf5945dbc69ff5b706c4b0f5448d04dd1f0b5a4c3765148bf253d + +Msg = 924e4afc979d1fd1ec8ab17e02b69964a1f025882611d9ba57c772175926944e42c68422d15f9326285538a348f9301e593e02c35a9817b160c05e21003d202473db69df695191be22db05615561951867f8425f88c29ba8997a41a2f96b5cee791307369671543373ea91d5ed9d6a34794d33305db8975b061864e6b0fe775f +d = 0159bff3a4e42b133e20148950452d99681de6649a56b904ee3358d6dd01fb6c76ea05345cb9ea216e5f5db9ecec201880bdff0ed02ac28a6891c164036c538b8a8 +Qx = 12d7f260e570cf548743d0557077139d65245c7b854ca58c85920ac2b290f2abfeccd3bb4217ee4a29b92513ddce3b5cbf7488fb65180bb74aeb7575f8682337ef5 +Qy = 17560186230c7e8bff0bffce1272afcd37534f317b453b40716436a44e4731a3ec90a8f17c53357bc54e6ff22fc5b4ca892321aa7891252d140ece88e25258b63d5 +k = 14b8a30f988cefdc0edec59537264edb0b697d8c4f9e8507cf72bc01c761304bd2019da1d67e577b84c1c43dd034b7569f16635a771542b0399737025b8d817e1c3 +R = 0fc50939ebca4f4daa83e7eaf6907cb08f330c01d6ea497b86becda43dfcad47cb5c48f5eb2cc924228628070bcd144088c449a7873242ba86badf796097dbecd6d +S = 0ccb6463c4301ba5c043e47ed508d57dd908fd0d533af89fd3b11e76343a1cf2954ce90b0eb18cbc36acd6d76b3906612d8a0feec6ebed13d88650ed9c708b28a11 + +Msg = c64319c8aa1c1ae676630045ae488aedebca19d753704182c4bf3b306b75db98e9be438234233c2f14e3b97c2f55236950629885ac1e0bd015db0f912913ffb6f1361c4cc25c3cd434583b0f7a5a9e1a549aa523614268037973b65eb59c0c16a19a49bfaa13d507b29d5c7a146cd8da2917665100ac9de2d75fa48cb708ac79 +d = 17418dfc0fc3d38f02aa06b7df6afa9e0d08540fc40da2b459c727cff052eb0827bdb3d53f61eb3033eb083c224086e48e3eea7e85e31428ffe517328e253f166ad +Qx = 00188366b9419a900ab0ed9633426d51e25e8dc03f4f0e7549904243981ec469c8d6d938f6714ee620e63bb0ec536376a73d24d40e58ad9eb44d1e6063f2eb4c51d +Qy = 09889b9203d52b9243fd515294a674afd6b81df4637ffdddc43a7414741eda78d8aa862c9cbbb618acec55bb9a29aac59616fc804a52a97a9fc4d03254f4469effe +k = 1211c8824dcbfa0e1e15a04779c9068aed2431daeac298260795e6a80401f11f6d52d36bcee3cfa36627989c49d11475163aa201d2cd4c5394144a6bb500bbaf02b +R = 1d59401b8ac438855d545a699991142685077a409de2418c7ccfe01a4771b3870e76287a9654c209b58a12b0f51e8dc568e33140a6b630324f7ef17caa64bf4c139 +S = 143af360b7971095b3b50679a13cd49217189eaee4713f4201720175216573c68f7ac6f688bfe6eb940a2d971809bf36c0a77decc553b025ed41935a3898685183b + +[P-521,SHA-256] + +Msg = 8ab8176b16278db54f84328ae0b75ef8f0cd18afdf40c04ad0927ed0f6d9e47470396c8e87cde7a9be2ffbfe6c9658c88b7de4d582111119c433b2e4a504493f0a1166e3a3ea0d7b93358f4a297d63f65a5e752f94e2ee7f49ebcc742fa3eb03a617d00c574245b77a20033854d82964b2949e2247637239ab00baf4d170d97c +d = 1e8c05996b85e6f3f875712a09c1b40672b5e7a78d5852de01585c5fb990bf3812c3245534a714389ae9014d677a449efd658254e610da8e6cad33414b9d33e0d7a +Qx = 07d042ca19408524e68b981f1419351e3b84736c77fe58fee7d11317df2e850d960c7dd10d10ba714c8a609d163502b79d682e8bbecd4f52591d2748533e45a867a +Qy = 197ac6416111ccf987d290459ebc8ad9ec56e49059c992155539a36a626631f4a2d89164b985154f2dddc0281ee5b5178271f3a76a0914c3fcd1f97be8e8376efb3 +k = 0dc8daaacddb8fd2ff5c34a5ce183a42261ad3c64dbfc095e58924364dc47ea1c05e2599aae917c2c95f47d6bb37da008af9f55730ddbe4d8ded24f9e8daa46db6a +R = 09dd1f2a716843eedec7a6645ac834d4336e7b18e35701f06cae9d6b290d41491424735f3b57e829ad5de055eaeef1778f051c1ee152bf2131a081e53df2a567a8a +S = 02148e8428d70a72bc9fa986c38c2c97deda0420f222f9dc99d32c0acba699dc7ba0a2b79ce5999ff61bd0b233c744a893bc105bca5c235423e531612da65d72e62 + +Msg = c4bc2cec829036469e55acdd277745034e4e3cc4fcd2f50ec8bd89055c19795a1e051ccf9aa178e12f9beab6a016a7257e391faa536eaa5c969396d4e1ade36795a82ebc709d9422de8497e5b68e7292538d4ccdc6dd66d27a3ece6a2844962b77db073df9489c9710585ba03d53fa430dbc6626dc03b61d53fc180b9af5dea6 +d = 0b65bf33b2f27d52cbfabcadce741e691bf4762089afd37964de1a0deda98331bf8c74020a14b52d44d26e2f6fa7bcddbe83be7db17a0c8a1b376469cf92c6da27c +Qx = 10038bb9a7aea626de68c14c64243150e72c69e2f8a1ab922bfbdaa6f33d24fb4542c0324357b0dd640bbcd07632ecd253f64ca2bfbfbf3de9b24fffd0568ab82da +Qy = 0faf867d95308cc36d6f46844a0f535dc70f9768eed011a2464d2f308fa1d8e72c3616aec7e70516908183ffce7fdd36984a15f73efaa3858c2edf16a784d40e6c2 +k = 14aeb96c57d99677a1f5e4588064215e7e9af4027bfb8f31ff6126dbf341b8e6f719465e4273e91ba32670feca802549808322b7ee108bb20653cf20f93284d365f +R = 075ead62edf7d86c5d1bc2443d1aeb5dc034fd999e6ea012cef7499d9d050cd97d262095884e9fc89a42e15bd3dee80fe3c1ba10f4caabc4aabb86347023028b663 +S = 129a992a6ff66d41948d11fa680f732b1a74315b804c982805190ed9d2fae223f2b149980b9241998cdea0c5672595a8a49d5186a0ef7a46c0a376f925bdda81726 + +Msg = 1c1b641d0511a0625a4b33e7639d7a057e27f3a7f818e67f593286c8a4c827bb1f3e4f399027e57f18a45403a310c785b50e5a03517c72b45ef8c242a57b162debf2e80c1cf6c7b90237aede5f4ab1fcaf8187be3beb524c223cc0ceff24429eb181a5eea364a748c713214880d976c2cd497fd65ab3854ad0d6c2c1913d3a06 +d = 02c4e660609e99becd61c14d043e8b419a663010cc1d8f9469897d7d0a4f076a619a7214a2a9d07957b028f7d8539ba7430d0b9a7de08beeeae8452d7bb0eac669d +Qx = 0fb3868238ca840dbb36ecc6cf04f5f773ea0ab8e8b0fdcf779dc4039a8d7146a417504e953c0cb5e7f4e599cc2c168deda8b7f16084b5582f89f2ece4cae5167f7 +Qy = 1f90b5c15eeda48e747cf3ee8183166a49dbfac6161cbd09d29d40a6854f4c495e88a435892a920cdaad20d41985890b648badd4f0a858ffcbd9afdfc23134ede18 +k = 1f875bbf882cd6dd034a87916c7b3ba54b41b2ea2ce84ebaf4e393fcf7291fee09dec2b5bb8b6490997c9e62f077c34f0947fe14cec99b906dd6bf0b5d301e75ca1 +R = 07aa70425697736b298233249f5d0cf25c99e640c9ff88035ef1804820e1bfe7d043755f02d7a079494f7fa6dc26740c4e6b7b430c63f29c67bbd3a5c88d2f0e8d1 +S = 0e0d42e4ff11cf5be37a9fda348514d5097a662f214687cbfb28ff42d635b13029871ca4f464bb1fbce02d5da4d5fb61b2a071844259fc863d136197bec3a61e7c7 + +Msg = adb5f069b2b501a3ebb83d4f1808eb07710ac4a7b12532996855a20bcc54b2f76812915f632163c3654ff13d187d007152617cf859200194b59c5e81fc6cc9eb1ceb75d654050f260caa79c265254089270ccd02607fdcf3246119738c496dc3a4bd5d3be15789fc3d29a08d6d921febe2f40aef286d5d4330b07198c7f4588e +d = 17c3522007a90357ff0bda7d3a36e66df88ca9721fb80e8f63f50255d47ee819068d018f14c6dd7c6ad176f69a4500e6f63caf5cf780531004f85009c69b9c1230c +Qx = 13a4bea0eed80c66ea973a9d3d4a90b6abbb5dee57d8affaf93390a8783a20982eba644d2e2809f66530adeeee7f9a1da7515447e9ba118999f76f170c375f621f7 +Qy = 12f9dfaee40a75d8442b39b37a5c19ea124b464236e9b9a31bae6780cfd50f7ea4a700154b5ea0feeb64e9b35a1b0e33e46900cca1f34d13bb17e5017769841af27 +k = 18388a49caeda35859ef02702c1fd45ff26991998bd9d5e189c12c36cdae3f642ddd4a79561bd1d3e1cd9359de8f5c9e1604a312d207a27b08a6033f2741794ced5 +R = 15c6264795837dfea19f91876455f564f073c5c84a3c9d76e67872ae0447ba0d4850d8721302b25bec7ebfedd2721de140b2f3dead547042b24b0876117e7093cc1 +S = 060eb74236c189a28ed20bd0822eb22d75f7d97c9043a3c8e3f6d4c90bc8ca02ac4d37c1171c799a1c7dfd2fcbf83406b5e48c051e0fbf0fd937bfe6c3db4e18154 + +Msg = f253484d121d1ce8a88def6a3e9e78c47f4025ead6f73285bf90647102645b0c32d4d86742a50b8b7a42d5f6156a6faf588212b7dc72c3ffd13973bdba732b554d8bffc57d04f8167aef21ee941ee6ffb6cce0f49445bd707da8deb35dca650aaf761c3aa66a5ebccddd15aee21293f63061a7f4bfc3787c2cd62c806a1a9985 +d = 0c4dad55871d3bd65b016d143ddd7a195cc868b3048c8bbcb1435622036bdb5e0dec7178ca0138c610238e0365968f6ddd191bbfacc91948088044d9966f652ff25 +Qx = 014858a3b9bd426b678fdcf93fc53d17e7a9e8fe022442aaaba65399d12fd3a6a381958fb0f07ac6088f4e490506ec0f1ab4d0dbd461126f7eb46ff69cfa8bd88af +Qy = 18c18ce29ecc6d79d26a2de0cd31c4b32e84b5e90f6ba748f86c5afbd89618aceb9079460cbd1a8261ed5476973e61bf1d17ea78b022387443800c9247d21dde550 +k = 05577108f4187a173e5c29e927a8fc8f5ffd37e184254a6e381ff1018955aec91a35f30085e8cee6a7555c10f9efdce26d62f2b4b52dfdbaeafc3a30983e2d50d5b +R = 0344375ae7c804cbe32ced7a20976efae5d9c19eb88b6e24514d1d0cfb728b0f4601098b18b2e98f42b5222dd5237d4d87767007bf5acb185c5526d72047e2cb1a1 +S = 02de4cfa908c73c1102d6fb7062baf54a056a9517701e036c9c51e09899d60051612d59348945f845dffebec5aa395b2fac7229929033615788777306ccad96d0a3 + +Msg = 33bab1c369c495db1610965bc0b0546a216e8dd00cd0e602a605d40bc8812bbf1ffa67143f896c436b8f7cf0bed308054f1e1ff77f4d0a13c1e831efbd0e2fcfb3eadab9f755f070ba9aeaceb0a5110f2f8b0c1f7b1aa96a7f2d038a1b72e26400819b1f73d925ea4e34d6acaf59d0a461a34ce5d65c9c937a80e844e323a16d +d = 03d4749fadcc2008f098de70545a669133c548ce0e32eec1276ff531bcff53533144555728ad8906d17f091cc0514571691107350b6561858e90dbe19633aaf31bf +Qx = 10fe5986b65f6e65d13c88c4d2aed781a91026904f82129d46779bdadaf6b733c845a934e941ab4a285efdea9c96ecc9dc784d87e4d937b42c337b3a9cb111a9600 +Qy = 077853768a2a4d6f596f57414e57ec60b76d3cd5ece8351cd1f335ebcb8801a3d91fb82c65caaeb5c31eea9918367bb5906863ff3ccaf7a6cee415e0d75c15ac2e0 +k = 1fbb4de337b09e935a6dc6215ffcfcb85d236cc490585e73251a8b8bac37cfa36c5d1df5f4536d33659be1e7a442529a783452f7efda74a4f661b6a127f9248aaf7 +R = 09d8f10eeff6178594c89d6e8184f9502117384813243ddf9ccf3c8eac5dc6502c472dfc1487a5caffc569f7dedd14a8ebcb310e9bacdb79fb6655aba026cdf87f2 +S = 0f74236c7915d638708d17c9f10e39dda358faf9bbb821d8dcda0d151aac143bfb165ad0a23a65cd3de532e32cad928728f5ae1c16f58fc16577f3ca8e36f9e708b + +Msg = 08c8b7faaac8e1154042d162dca1df0f66e0001b3c5ecf49b6a4334ce4e8a754a1a8e4daf8ec09cf1e521c96547aed5172ef852e82c03cddd851a9f992183ac5199594f288dbcc53a9bb6128561ff3236a7b4b0dce8eaf7d45e64e782955ee1b690ce6a73ece47dc4409b690de6b7928cbe60c42fc6a5ddf1d729faf1cc3885e +d = 096a77b591bba65023ba92f8a51029725b555caf6eff129879d28f6400e760439d6e69ce662f6f1aecf3869f7b6057b530a3c6ff8ed9e86d5944f583ee0b3fbb570 +Qx = 0fdf6aed933dba73913142ef8bdcd4b760db8500831cd11d7707ab852a6372c05d112a1e7fbc7b514c42142c7370d9f4129493cd75cc6f2daf83747078f15229db6 +Qy = 0ef91dffb3c43080a59534b95ca585ee87f6145f6a0199b2b82c89f456d8bd8e6ac71c78039c08177184484eb2ebd372f189db3a58fab961a75a18afec1ee32764a +k = 13aa7b0471317a2a139c2f90df1c40d75e5a8a830fbaf87030fffdb2ef6f2c93d1310c9ed7fe9d7bcd4fe46537ff2495bc9c4f0aaff11461f5e4bebbfbce9a8740a +R = 1c7a21800962c91d4651553633b18612d931bb88bff8b743ed595b4e869437e50f8e84fbf334c99061db123a1c40b73b07e203790561a37df65a660355ba2017d78 +S = 1301e1782559a38f1ca0eebe9bed0f5c7c33103d506a24f8a688f500ee1fe37f97b6685319279e82e6fe43cfd823ccbc123309974cffa76c4f8d41ec02a3cbc45f1 + +Msg = ba74eed74282811631bd2069e862381e4e2a1e4e9a357b1c159a9ce69786f864b60fe90eeb32d8b72b099986fc594965a33285f7185b415df58fead7b8b50fc60d073680881d7435609ad1d22fd21e789b6730e232b0d2e888889fb82d6ad0337ab909308676164d4f47df44b21190eca8ba0f94995e60ad9bb02938461eee61 +d = 015152382bfd4f7932a8668026e705e9e73daa8bade21e80ea62cf91bd2448ebc4487b508ca2bdaaf072e3706ba87252d64761c6885a65dcafa64c5573c224ae9e6 +Qx = 00b8c7c0186a77dc6e9addd2018188a6a40c3e2ba396f30bbd9293dba2841d57d60866b37f587432719b544d8bf7eb06d90a8c0dc9c93b0c53d53b2f667077228ca +Qy = 1dd2e5c73ab908ae34f701689f1cd3cf5186d3a2bc941e208bf3ef970e5e429ee9b154d73286b2e5da423e75b7c7b78c7bdf915da92279db43265a0cdefca51f86a +k = 0d03506999f5cc9ec3304072984a20a9c64a22ad9b418495ca904f4bbddc96e76d34672cb52763339d3f3bc5b1701c00a675b972797e3a086314da1a8d338436566 +R = 085406c0ff5ec91f598bb579ad8714ad718c3e133d5dcc2e67c5d2339c146b69919cac07f3bc2bda218f4c7c8be04855e2ca6fff7fbdc4fc0fda87c8c3081cad4f5 +S = 1b45f2066e583636215ae135afc202b8bf3f301eccff2e1c0198b9aeddf695fa8179488e7b622fc307f601e2f6551815117cc836bb09ef888f8e64a45d9c84ad30c + +Msg = dc71f171a28bdc30968c39f08f999b88dc04c550e261ecf1124d67f05edeae7e87fe9b8135a96fe2bc3996a4f47213d9d191184a76bd6310e1ee5cb67ea7fc3ef6f641a0ba165198040fa668192b75a4754fc02c224bd4a74aade5a8c814adf151c2bfeda65165a04ef359e39847c84e312afb66d4cd1db50d41ef3fe5f31296 +d = 1750ff0ca0c166560b2034bc5760fe0b3915340bc43216e9de0c1d4a76550e8b2036e8b874230f8d29354aed43e183610f24fd4abd4b0be2f111dae942bd7a121f7 +Qx = 1b4b8947192a7c0166c0e0b2791e217370836283e805f3ee11cfb78445aba3c5bc39fe594e01916617ad59e7c8e740d8f2d07d88905d3f33bd5e51aafd4943c5dc6 +Qy = 1175d117232836c28e717ce2a55e59f4ec550effde30d18e3d99e42c6aa2283c7b3e7f2f6ff1fca605dde78c3a5bffa689347b4c93f51ba59a1787bb7d5e43861dc +k = 023645023d6bdf20652cdce1185c4ef225c66d54f18632d99ccf743bf554d04c214c88ce52a4f71ec75c899ad1b3c07c34112ca20b55c217ff1d72c9528e2774ce8 +R = 1e933f68ce0f8403cb16822b8e0564b1d39a35f27b53e4ae0bcdff3e051759464afbc34998ba7c8a7ee34ef6c1aaa722cffe48356fd0b738058358d4c768b3186c1 +S = 0a67368a305508ce6d25d29c84f552a4a513998990fef4936244f891a2909c30d5fdc9e8a267ecbf3c597138f4a08f7e92bee57d5420eadd700fee864bf78b2614b + +Msg = b895788d7828aaeace4f6b61a072ffa344d8ea324962ba6dab5efda93f65bf64a0f2ac6d5721d03ee70e2aef21cdba69fd29040199160e3a293b772ffb961ed694a8dc82800dab79367a4809a864e4aff6bc837aaa868e952b771b76591c0bb82249034e3208e593d85973d3fea753a95b16e221b2561644535c0131fe834ae7 +d = 023048bc16e00e58c4a4c7cc62ee80ea57f745bda35715510ed0fc29f62359ff60b0cf85b673383b87a6e1a792d93ab8549281515850fa24d6a2d93a20a2fff3d6e +Qx = 0ba3dc98326a15999351a2ec6c59e221d7d9e7ee7152a6f71686c9797f3f330d3150123620d547813ba9d7cc6c6d35cc9a087d07dff780e4821e74ad05f3762efd6 +Qy = 18b051af9824b5f614d23ecadd591e38edbfe910ad6cbebc3e8a6bec11ea90691c17deb3bc5f34a4a3acd90b7b10f521f6ee7b3cfbfdc03b72d5a8783a4a77c3e4c +k = 06099d2667f06c58798757632d07d8b3efbe9c1323efb0c244be6b12b3b163ba1b7cf5246c98dcc0771665a66696d687af5f28ed664fd87d5093df6427523d4db84 +R = 10dc80ea853064a2ba5a781f108aca3785c5ec0aa45aa05ba31d4de671170797589e863d54a3a986aadf6f670277f50355713dfb27d4ec7e348f787910b3cd668cd +S = 018572bfad4f62e3694d1f2e6ffd432faed2e2b9d7e3611a07138212f1e79e6c394839f7cfae96bc368422630016fb9346681eadc5f9699e7331c3b5fde6d65e4c6 + +Msg = 2c5bd848c476e34b427cfe5676692e588e1957957db7b5704492bd02104a38216535607f5d092dc40020130c04a3aaf0f1c52409834926d69a05d3f3188187a71d402a10ba34eac8629b4c6359b1095f30f710219298bf06b9f19bfc299981d7e251ca232a0a85338a7e02464731d1b25d4a1f68baf97064516590644820c998 +d = 02b8b866ce4503bb40ffc2c3c990465c72473f901d6ebe6a119ca49fcec8221b3b4fa7ec4e8e9a10dbd90c739065ad6a3a0dd98d1d6f6dcb0720f25a99357a40938 +Qx = 1b8c7a169d5455f16bfe5df1ba5d6ec9c76e4bad9968d4f5f96be5878a7b6f71d74bfac0076dd278bc4630629f3294646f17d6b6c712b0087e2c4d576039cfdc8b9 +Qy = 18faffd5422dfd1b61432fa77b9a288b2b7d546656c0dcca3032179e6f45ee3cf61d6a447fc51731cb54457343a41569fcf78cef42895f4da5efcb14ea1fc065f8d +k = 0ac89e813f94042292aa1e77c73773c85cf881a9343b3f50711f13fa17b50f4e5cb04ac5f6fc3106a6ef4c9732016c4e08e301eefac19199459129a41a7589e0628 +R = 05bc7a253a028ee8b7253979b8d689d41d8df6fae7736341f22e28b6faf0cbbdebbd2ef4d73e56d2021af2c646dc15539a7c1e1c4dc9c7674808bd7968d8a66f947 +S = 0fd71575837a43a4cf1c47d0485cfd503c2cf36ebcea0fdef946ad29acb7fb2e7c6daf6b4eb741eb211081aed6207d02569f1518988f275ad94c7fd4735cb18a92e + +Msg = 65a0b97048067a0c9040acbb5d7f6e2e6ac462e1e0064a8ce5b5bbf8e57059e25a3ef8c80fc9037ae08f63e63f5bdb9378c322ad9b2daf839fad7a75b1027abb6f70f110247da7e971c7c52914e5a4f7761854432fa16b2a521e7bcaee2c735a87cad20c535bf6d04a87340c229bf9af8647eedca9e2dc0b5aa90f7fea3cdc0a +d = 0a43b32ad7327ec92c0a67279f417c8ada6f40d6282fe79d6dc23b8702147a31162e646291e8df460d39d7cdbdd7b2e7c6c89509b7ed3071b68d4a518ba48e63662 +Qx = 172fb25a3e22c2a88975d7a814f3e02d5bb74cfb0aaa082c5af580019b429fddd8c7f9e09b6938f62e8c31019b25571aaceef3c0d479079db9a9b533ee8e1670abd +Qy = 0ff5516223b6cc7c711705f15b91db559014e96d3839249c5c849f2aced228a8998177a1e91177abbb24b57a8ea84d944e0c95da860ae0925f1b40c0e1b7c9e0a46 +k = 0383eda042e06c0297fbd279a2ad40559c5c12ad458f73458eebcc92b308d3c4fcec20a5b59f698e16fa6ea02dba8661b6955f67c052f67b0a56460869f24cfdf7d +R = 1b9c35356b9d068f33aa22a61370dae44a6cb030497a34fb52af23c6b684677370268f06bb4433be6795a71de570088aec17ce0c9933d2f76c7edce7f406f62fedd +S = 06f07ea453cfa20ad604ba855332f62834657b0b795684d50c1562a675456e37f4dae45f0df47d8e27e47bc9ce9c9cbba1554c5b94b0b17401b73c8d0c0902c6cc4 + +Msg = d6e366a87808eea5d39fe77cac4b8c754e865a796062e2ec89f72165cd41fe04c48148068c570e0d29afe9011e7e7a2461f4d9897d8c1fa14b4ff88cab40059d17ab724f4039244e97fcecb07f9ffeec2fb9d6b1896700fe374104a8c44af01a10e93b268d25367bf2bef488b8abcc1ef0e14c3e6e1621b2d58753f21e28b86f +d = 03c08fdccb089faee91dac3f56f556654a153cebb32f238488d925afd4c7027707118a372f2a2db132516e12ec25f1664953f123ac2ac8f12e0dcbbb61ff40fb721 +Qx = 193301fc0791996ca29e2350723bd9aa0991ddbb4a78348ee72bdcd9ed63ce110ba3496f2ce0331b5c00d4d674c1b70114e17ce44a73c3e16bab14ed1ee924202e4 +Qy = 0aea9b288cfb2933ec0a40efa8e2108774e09b3863b3193d0dac6cc16ccaa5bd5f9ce133aec5cd3b62cbaeec04703e4b61b19572705db38cfaa1907c3d7c785b0cd +k = 0d0e90d5ee7b5036655ad5c8f6a112c4b21c9449ca91c5c78421e364a2160bbac4428303657bc11ea69f59fb0fe85a41b8f155a362343094456fd2a39f2a79e4804 +R = 1a8c23a2965d365a4c2ffd0802ae8b3a69c6b84a1ba77fd8a5f2f61e8ec3a1dcb336f136e2a997252eaa94caf9b5ad6c9ecff5bf33abf547ca84985bb89908a11d7 +S = 1cc42a2dd97aa42b9df5ea430e0d4cb13106dd6da6e8c9315c96ed7b052db365bbde6960c9a965954a4398c18ea7db9593bbfc3c3b6b3466ff806fccac3de6424ab + +Msg = f99e1d272d0f5fb9c4f986e873d070ec638422bc04b47c715595e2cf1a701cdf88bc6c4b20085b357bad12ccba67cac8a5ca07f31ba432f9154ff1fadefd487a83a9c37e49fb70a2f170e58889cab0552e0a3806ccfa2a60d96e346851d84b7de6d1a4b8cf37567dc161a84f13421e3412457d4bc27f6213453c8519a2d7daa2 +d = 0969b515f356f8bb605ee131e80e8831e340902f3c6257270f7dedb2ba9d876a2ae55b4a17f5d9acd46c1b26366c7e4e4e90a0ee5cff69ed9b278e5b1156a435f7e +Qx = 0fc7ae62b05ed6c34077cbcbb869629528a1656e2e6d403884e79a21f5f612e91fc83c3a8ac1478d58852f0e8ba120d5855983afd1a719949afa8a21aec407516c3 +Qy = 0aa705da6459a90eaa2c057f2e6614fb72fc730d6fdebe70e968c93dbc9858534768ea2666553cd01db132331441823950a17e8d2345a3cab039c22b21bfe7bd3b9 +k = 19029260f88e19360b70c11107a92f06faa64524cfbd9f70fecf02bd5a94f390582a7f4c92c5313bb91dc881596768d86f75a0d6f452094adbe11d6643d1a0b2135 +R = 07f2158e9b9fa995199608263969498923cf918fdc736427c72ce27ce4a3540dce2e8e5e63a8fc7ba46f7fa42480efbf79c6ed39521f6e6ec056079e453e80a89d9 +S = 08e349eed6f1e28b0dbf0a8aeb1d67e59a95b54a699f083db885f50d702f3c6a4069591afaa5b80b3c75efb1674ebd32c7ead0040d115945f9a52ee3a51806cad45 + +Msg = 91f1ca8ce6681f4e1f117b918ae787a888798a9df3afc9d0e922f51cdd6e7f7e55da996f7e3615f1d41e4292479859a44fa18a5a006662610f1aaa2884f843c2e73d441753e0ead51dffc366250616c706f07128940dd6312ff3eda6f0e2b4e441b3d74c592b97d9cd910f979d7f39767b379e7f36a7519f2a4a251ef5e8aae1 +d = 013be0bf0cb060dbba02e90e43c6ba6022f201de35160192d33574a67f3f79df969d3ae87850071aac346b5f386fc645ed1977bea2e8446e0c5890784e369124418 +Qx = 167d8b8308259c730931db828a5f69697ec0773a79bdedbaaf15114a4937011c5ae36ab0503957373fee6b1c4650f91a3b0c92c2d604a3559dd2e856a9a84f551d9 +Qy = 19d2c1346aadaa3090b5981f5353243300a4ff0ab961c4ee530f4133fe85e6aab5bad42e747eee0298c2b8051c8be7049109ad3e1b572dda1cac4a03010f99f206e +k = 1a363a344996aac9a3ac040066a65856edfb36f10bb687d4821a2e0299b329c6b60e3547dde03bdbd1afa98b0b75d79cf5aac0ef7a3116266cadf3dfbd46f8a4bfc +R = 1ff097485faf32ce9e0c557ee064587c12c4834e7f0988cf181d07ba9ee15ae85a8208b61850080fc4bbedbd82536181d43973459f0d696ac5e6b8f2330b179d180 +S = 0306dc3c382af13c99d44db7a84ed813c8719c6ed3bbe751ead0d487b5a4aa018129862b7d282cce0bc2059a56d7722f4b226f9deb85da12d5b40648bf6ec568128 + +[P-521,SHA-384] + +Msg = dbc094402c5b559d53168c6f0c550d827499c6fb2186ae2db15b89b4e6f46220386d6f01bebde91b6ceb3ec7b4696e2cbfd14894dd0b7d656d23396ce920044f9ca514bf115cf98ecaa55b950a9e49365c2f3a05be5020e93db92c37437513044973e792af814d0ffad2c8ecc89ae4b35ccb19318f0b988a7d33ec5a4fe85dfe +d = 095976d387d814e68aeb09abecdbf4228db7232cd3229569ade537f33e07ed0da0abdee84ab057c9a00049f45250e2719d1ecaccf91c0e6fcdd4016b75bdd98a950 +Qx = 13b4ab7bc1ddf7fd74ca6f75ac560c94169f435361e74eba1f8e759ac70ab3af138d8807aca3d8e73b5c2eb787f6dcca2718122bd94f08943a686b115d869d3f406 +Qy = 0f293c1d627b44e7954d0546270665888144a94d437679d074787959d0d944d8223b9d4b5d068b4fbbd1176a004b476810475cd2a200b83eccd226d08b444a71e71 +k = 0a8d90686bd1104627836afe698effe22c51aa3b651737a940f2b0f9cd72c594575e550adb142e467a3f631f4429514df8296d8f5144df86faa9e3a8f13939ad5b3 +R = 02128f77df66d16a604ffcd1a515e039d49bf6b91a215b814b2a1c88d32039521fbd142f717817b838450229025670d99c1fd5ab18bd965f093cae7accff0675aae +S = 008dc65a243700a84619dce14e44ea8557e36631db1a55de15865497dbfd66e76a7471f78e510c04e613ced332aa563432a1017da8b81c146059ccc7930153103a6 + +Msg = 114187efd1f6d6c46473fed0c1922987c79be2144439c6f61183caf2045bfb419f8cddc82267d14540624975f27232117729ccfeacccc7ecd5b71473c69d128152931865a60e6a104b67afe5ed443bdbcdc45372f1a85012bbc4614d4c0c534aacd9ab78664dda9b1f1e255878e8ac59e23c56a686f567e4b15c66f0e7c0931e +d = 04ceb9896da32f2df630580de979515d698fbf1dd96bea889b98fc0efd0751ed35e6bcf75bc5d99172b0960ffd3d8b683fbffd4174b379fbdecd7b138bb9025574b +Qx = 0e7a3d30d5bd443549d50e9b297aaa87bc80b5c9e94169602d9d43d6d0c490c0bed8cc2170288b106bdbf4c9f1ce53fd699af0b4c64b494b08520e57dc01ab9a8b0 +Qy = 1d81056d37aec8a75d588f6d05977416e6f24ad0117a7f4450036d695612e7bc2771caed80e580314eebc88c8fc51c453f066e752481f212b57165d67f8a44f375a +k = 046639c5a3ec15afae5e4a7a418ac760846512d880c359bc2c751b199ce43b10887e861b14127809754dbea47f6cc0140d2817e3f5b9a80ce01abd81f81b748433a +R = 0f913de91e19bd8f943d542ae357bacc942a0967abc9be6c06239a379db8cc733fa50013e0b0f088bce9d630262feaa33b30d84f91bcf5ce9976e4e740fcb112f84 +S = 08a73a5c9c24235e0d9cecaac653f68ce5a6fb186ce67fa058d6ddbbd4d0a8c4d194e571148e8ad6c8882b4e33d2f60fb23dd7d07a1ae60864e8277918f592b3dc6 + +Msg = 6744b69fc2420fe00f2352399bd58719e4ecdd6d602e2c80f194d607e58b27a0854745bfd6d504de2eb30b04cee0f44af710dd77e2f816ac3ac5692fad2d1d417893bb0edba2707a4c146a486f8728ca696d35cc52e9c7187c82d4bdb92eb954794e5ad15133f6bfea1f025da32ada710a3014cf11095b3ff69a94d087f17753 +d = 00a8db566bd771a9689ea5188c63d586b9c8b576dbe74c06d618576f61365e90b843d00347fdd084fec4ba229fe671ccdd5d9a3afee821a84af9560cd455ed72e8f +Qx = 04f5b790cbe2984b71d41af5efed6c6893d15e13f31816d55a9c2926a104eee66f1ada83115d1388551218773b8b9d1138e3e3f027bb4392c90c14fd232580b4a11 +Qy = 0660eb160e9bfc8c5619e70e948e238c6fd37739bc1bb657b8e8436e63628f91992be7e63d9a7359623a1340642777b22026feb51116a6c50c54c3589b9bd39b6cb +k = 1e7b5e53571a24bd102dd7ad44a4b8d8a4e60e5957bc3c4e5d3c73109f55233f072e572c7892f425ba5e64d3cb7966096bb34a47e26cd5b3e3b44108b310d9f681b +R = 1a88bcd7e2bdff6e497d943dde432fb3f855a7177c466319cb53b701230c299db030276269685857d1e3f28110e690f2f529c8d18115eb381f313bc891d92ad278e +S = 146f1984ea879274dfd5e86ad92e564a4de081523ddbb1c397b8f9595911ef2e6501bc081584d5340f7aa47e1af036234ac6f27a5ac31f78dd3b0ff1a62693c630d + +Msg = 16001f4dcf9e76aa134b12b867f252735144e523e40fba9b4811b07448a24ef4ccf3e81fe9d7f8097ae1d216a51b6eefc83880885e5b14a5eeee025c4232319c4b8bce26807d1b386ad6a964deb3bdca30ee196cfdd717facfad5c77d9b1d05fdd96875e9675e85029ecbf4f94c524624746b7c42870c14a9a1454acf3354474 +d = 1a300b8bf028449344d0e736145d9dd7c4075a783cb749e1ec7988d60440a07021a25a3de74ea5e3d7bd4ab774d8ad6163adae31877ef0b2bd50e26e9e4be8a7b66 +Qx = 05055b9ad726ba8a48219b0ecbfffb89f8428de895b231f676705b7de9f2022d9ff4e0114ebb52dea342f9bf76b2fb060c020e29d92074ebb1fbfe5290a58c8bc10 +Qy = 0415af7f20a6e945315adbf757316bb486c80780a0a3a15b4b9609f126d7341053a2b726ab63cb46feee527b0bf532b32b477e5671aea23d9b3c3e604b9029954b5 +k = 05a2e92717bb4dab3ee76724d4d9c2d58a32b873e491e36127985f0c9960c610962ca1c4510dba75c98d83beebdc58b1d8678e054640951d11db1bd2d8a4ab8476b +R = 104a78ce94f878822daaf00ee527fbdbf6cceb3cbb23a2caa485e4109466de8910252f92379ab292cac8d1eda164f880c0067696e733fc8588a27703a3e1f5b8f1f +S = 1ffe23e8ab5a31668a81161a234ea14879771fe9866f8872eb6edb672e0fe91d2bb75c9767a2dfbac7c15c802211236b22ea41ecd055a0b8b311ffc4255f86d5c67 + +Msg = a9824a7b810aa16690083a00d422842971baf400c3563baa789c5653fc13416111c0236c67c68e95a13cec0df50324dcc9ae780ce4232607cb57dd9b2c61b382f0fa51fd4e283e2c55ffe272597651659fbd88cd03bfa9652cd54b01a7034c83a602709879e1325c77969bebfd93932ce09a23eae607374602201614ff84b141 +d = 06a253acd79912a74270fc0703ed6507ab20a970f2bc2277f782062092cf0e60ae1ca1bb44dec003169bc25ef6e7123dd04692f77b181a6d7e692e66b09d35a540c +Qx = 1f15c6b1df156fdd8381cd7446e039435e445f8f36f0247475058da0e371bf72753f6e39f98066bc79370b038c39687ba18e16cb118fe6538b7568c5403c251f6b7 +Qy = 12d2b4f46b854eeae75f1c63f55b76bf0c604d47f870c28a50ecdeb52bba1dd9a0ff12e680804ff864111207652da7dd10b49edf66bb86be00bc06672de91982457 +k = 165faf3727e42fd61345cfa7b93e55fb4bf583b24bdc14ce635b6c99dbd788012f14da9a210b677c44acdd851e672f1a48188d6b8946c0efeebfe8a597ba0090a2c +R = 1ad9463d2759abd568626548578deefdcd8b2d050ce6d9c7ed05feca20167484b86e89bdcc936fd647e0f8aedd7b6add2b8cf13ff6ff013c2b5540c6c56fda97a0c +S = 1645a7d0e11015256cfb034adca198695eea6aedd44d9fbf496850ccfed950f43fffd8dbf41e113f2d3837d8a5dd62b2ed580112ff05800b1f73196e5576810e15b + +Msg = 90d8bbf714fd2120d2144022bf29520842d9fbd2dc8bb734b3e892ba0285c6a342d6e1e37cc11a62083566e45b039cc65506d20a7d8b51d763d25f0d9eaf3d38601af612c5798a8a2c712d968592b6ed689b88bbab95259ad34da26af9dda80f2f8a02960370bdb7e7595c0a4fffb465d7ad0c4665b5ec0e7d50c6a8238c7f53 +d = 0d5a5d3ddfd2170f9d2653b91967efc8a5157f8720d740dd974e272aab000cc1a4e6c630348754ab923cafb5056fc584b3706628051c557fce67744ee58ba7a56d0 +Qx = 128a4da5fc995678e457ceb3929adee93c280f851abe900fa21f4f809dafad4e33b381e0cd49ce8dd50e2e281cea162bfd60a1d6a1c0ee2228e6a011e171b559ab8 +Qy = 06eb0917cd72256992c49ea527f6bb0315f13d8047794a0f1da1e93737703b1c2a74a00441ef3b47b6a2ff789c49ae32d91cabe7b29247aeec44f6c40a76597a2ca +k = 03269983a5c2bcc98e9476f5abf82424566b1f08b17204d29e310ece88f99eb677a537f86fe2529e409cfef2c12929644100099e0de2f27c0f0ac11105a4dca935b +R = 1a5257ae1e8187ba954f535b86ff9b8d6a181a3b95c250d090cb4e9c3bfbd03aa64696a76c569728ef67780d6338d70ce46da40b87a3e49bfe154b93930890dfa93 +S = 05b6ccdfd5c63c7db76d3a0478064a2a376e0e050cb093be795a72a549247c2e4adba9183145c63d46479dbbdcf09986a6f64c09c7e16abc4853f6376c9558b014a + +Msg = 09952b1e09995e95bf0022e911c6ab1a463b0a1fdd0eec69117b34af1103c720b57600217de7cd178fef92de5391e550af72a8dcf7badf25b06dd039417f9a7d0f5be88fcd4e9655931d5b605452a667c9d1bae91d3476e7d51cff4108f116a49966fb3a7cff8df1c09734ce5620faf2dccb3dc5d94e7e9ac812da31f6d07a38 +d = 1bcedf920fa148361671b43c64e3186e1937eb1bd4b28cbd84c421472394552889bc05509aa732ef69d732b21b750523fdfd811f36467690fe94e01e64c9d5cbbe9 +Qx = 0d33c151d202a5d4d831348e940b027ee32e4b0b9b48d823a05c67ff3bdaee0189fc6680565f352c062e99968afc643208b4f9c7af185b861658a88c4ad0fcc8ba2 +Qy = 0e4441ddb546468ad8ffa6074f137edfbb81e82e0e7d8f05c4c54598aa996a9cde54cb371f642bfdd4ae7eca5b769696030027129a4183da93567ad142a2dff5183 +k = 046e619b83aac868b26d0b3cbfab55e630e0b55c461985b5d00f94ff3a5ce90ff412cebf46bbd84550d2031d573ca27d924624428360708c8d8491c29eb01d30f2e +R = 08427c0f0ac0263472cd423c0fb554bf3c851b9c775c566ab0f6878717bd57665830767b05b7789c5c0b078195bd943dc737325552d32877ecb04a7c41bd07cd80c +S = 10bb6652d6a624c40a7dd06828f15774130d02369ceb1a7d03b553e16e17b7fa5b5401f15885d5e4fc2e55c0c7a1b97871ab02f76386b93a16aa6e7eb65debac6dd + +Msg = 0bb0f80cff309c65ff7729c59c517d50fc0ed5be405ef70cb910c3f62c328c90853d4473530b654dda6156e149bc2222a8a7f9be665240e2fbe9d03f78a2356af0bacd1edb84c4801adc8293a8a0bd6123d1cf6ba216aca807a7eb4dca76b493eb6e3dbb69d36f0f00f856222f24d9b93ec34c3b261be2fca0451c00571928e5 +d = 03789e04b3a2a0254ade3380172c150d2fad033885e02ea8bea5b92db3f4adbab190ae423080a1154dfedec694c25eab46ce638be3db4e4cba67bc39f62d6e7db2d +Qx = 1dbc2cf19627bdccf02432b1761f296275230c150cdde823ce3141ec315d7d05e16b2c29e2a67491078d5316883e933d85b4b10d4f64c477d3c4e0442dc928983a2 +Qy = 07562e720807dd118d3d8b265b3abc61a71fce43e3dce0e7b5ae18b7a4cb01ecc00d39c1f22e150a9a8728997e502144f5b3f6fa9b4cb8a4136212b082ca394e3f6 +k = 0fbccd8d7804bdd1d1d721b5ec74d4ba37603bc306f9fce2ec241853d8e07334e6b4b12c4ecca0c54bd71193dd7146507933a20737c5f3e15085830fab9b30ca57b +R = 181915a3998d8fa214f9715f4ca928d09c36de168dc15c6970a8a062b5cea2dc969b2437ca17b684f78a1fd583aad8e6c762c8f4ab0c91b86a497145e3ca440d307 +S = 15a6c18c5c77f5470b27d061eafdc26b78561941a3b2ab0f5c81d40899fc053c3d9ed12d7d61e298abbae470009c7b2157731c58d7b16a66fa5abaf5e8a1b8ed394 + +Msg = 7efacf213382ce30804e78b7256854d759147dba9729c51b2759465715bf2c421034c23dc651c13d6cce95f71fe6a84dfbee5768163ac5789ac0474c5ddf4115684683c5f7c204b33b8bcc0c03ac58f66cef2f53b721fe2fac91ad841126101a88f512a7c2ded38549d9f050d4b7961dda48a1489f026c5d111701762418cfe3 +d = 124700aa9186353e298edefc57bec0c7d0201cca10c1d80dd408d5d71040592b0ac59facdadfa8712445f5977ef8d4854022720c3f02d60e0732dbb2f171fcf1490 +Qx = 0c80fc4cecae5d53348524ddba6a160b735c75b22fdb39af17e2a613d09246e3bb0fd3f2978577f6db5d2118e05c7898024808f8eb8e021d7969cdcf7fc981200bb +Qy = 1a880c93943fd446d4b3923b574d2221c1bb7b645fb5534dda60e827b497666ff586b77921f7e7f605147947194cffd2fef0678880b89cc0bc7fb74fa96d4b112d7 +k = 01a05238d595ded5c61d3bf6fde257dbf13095af8a5cb3a2e579e8e4c550fe31d12b71cc2dbcb295e6c4fd0fb8c22d1b741c097cc59d826ced1a8771f09983143c4 +R = 132762bc81e9922a8d642e3a9d0218affa21fa2331cfcb9e452545c5981c64a8f7e4cc8e68056023b2aa78bead59061d19c7f646c931163a91e544b106b3be8de9e +S = 0c3a1b0b000c3169984132add51d611e2cb7069a262a6983d2ae72b459c36e6469509bdb0f473600b8686700b08910779dee9ba83f82e755d4a4ef5f124eb09397f + +Msg = 28edff8b9d85f5f58499cc11f492abdfab25e8945975bbaeee910afa2b8fc1295ec61406309ce4e09f4ab4f462959fc2a2786802466eb26d3b01be6919893ae75d0fdc2dc8a82e662550f9fce9627dd364188aaba5c6faa1b2d8a2235adfa5ad0dc140f88a2b2f103f5690e877d07fe8fd30d02d2b2729bd3d8eb5b23a21f54c +d = 1f532d01af885cb4ad5c329ca5d421c5c021883bd5404c798d617679bb8b094cbb7e15c832fb436325c5302313ce5e496f9513455e7021ffad75777a19b226acfa1 +Qx = 0c0bd76b0027b85bdd879052220da1494d503f6a4bb972105a48ae98e7dda8c2d9fd9336f5646385b961ef68e8464e3a95b00f96614b1a408ceaa2c87b077b6a8fb +Qy = 17eb7eb5c78db7819af92e8537d110d9f05a5e24f954f4dde21c224d4040f059ec99e051702f390413d2708d18f84d82998c61847475250fb844b20082cbe651a6b +k = 14e66853e0f7cd3300ebcae06048532e19cbb95bee140edc1c867ce7310637651445b6dfeb1d99d2e32f2ffb787ebe3fe35032277f185d3dad84f95806924550abe +R = 0c5b3a57161098e2e8e16e0a5ae8ecf4a14df14927eea18ed4925d11dc429dda145159323ba970174b194b9b4608a8fa2373b7a825c5e8bd80574e49698285c2c82 +S = 1a0c038a51796158b42eb5b0dac37aff9ab93b903a47e06ebbdd15946e4bcc9a3b3875b18cf6294c33fc6c3693cef04ed1a43d08951e664c760e2cf3fb4e47490d2 + +Msg = bae2a8897c742fd99fbf813351cd009d3f2e18d825ca22e115276484bce8f82f8c7c0c21dd2af208404d8ef45bb5a6c41693912b630897d5246801bf0775aa9bbac8be98cb861d172c3563dc59e78a58ed13c66dea496471b3ad0eeae8995293e4ab97373edc1837ffc95ff1cc0c1e90e64ea8680b2ca5f1e09bf86b99b343b6 +d = 11abf508bca68a85a54bc0659e77efad3c86112c9db04db2883e76144aa446918bb4bb0784b0b6a0e9aa47399fe3de5aaecfd8894a0d130bb0c366c40d9d5050745 +Qx = 05c0ea363a3a12633ea39d564587ebdd3a22a175ef32b9ebfc7311304b19cb3a62b5adc36f6afb6a6f7fabbf810ee89fdb72854fefd613e7798e9b9ff5938ea54c6 +Qy = 0bd06a85e47b885c08124b55a3fcc07ca61647cda6efbfdbd21b24d1ea7a4c7300d46cd798e76063aa979adef6f0698b15e5b7ae8a2ab39ab4f50b2d20614db6317 +k = 19cadb8c7eb10565aa4567e0709873918720f0e4b42b4817afb0b0547c70cd1100229deae97a276b9c98ea58b01d4839fee86336d749d123b03e8b1a31166acc110 +R = 0667448a8bbef1c810d40646977dc22f3dfb52a4d80928ded5e976e199cbed02fbd5a08546756ece14548d721a6eb380d0e1a71ad0660dbcac6163c776eedd3e249 +S = 0ae7f0a238daaddb7fb4a1707fe5132daf653f8e19f732347134c96f1dd798f867c479a4a4609a568a15b61afed70790adbde13ac5f68c468d0230852c1a2c22581 + +Msg = d57a26a9593e72bfc87322524639bcaae5f2252d18b99cdaa03b14445b0b8a4dd53928f66a2e4f202fb25b19cad0eb2f1bfda2ab9b0eb668cdcd0fe72f5d9ef2e45e0218590f7ab9d2c9342202610c698bc786cce108a7d4a6730a13e9ea1b470e781f1237d3f84f44abde808516975546bd89075ef9a9732bfd7ee33b6f4399 +d = 18dbf520d58177e4b7a0627674d220137983f486dd2fd3639f19751804e80df0655db6afd829cdf75238de525e1a7a9f048049b593dd64b4b96cc013f970c05ea1f +Qx = 18b872690c37995be324ddb5c2bd5462841bb062f8e63da248a853de79c3d6bb9a2eb1e6933afda0998ca43491cc807b08ace2d5336a43d0ab50563a2d3d98755f0 +Qy = 002ff31221aa32aa6546f35e8fe5b9361f938362a5e89e77ae130ba8bce3729e912dfac35a2fd21efe84b45b8be2a340850e4b574e1885b35c2afbe196b57c6cf4c +k = 098faeb73054639cb2e4442cd68e7b3a13f4b3f397a7b26f303afa40789f8ddd3d918f1ce4f0be53c8cb69c380744e2297d7fc01e2b3daef4ce64dd3a2644234753 +R = 09c0e7649f814f70a8416cb78bc4601472a363fe97f5c587305778169677860dd97f87b5ab07c3a953bc4615fc34634509d6a25621bdded33ed42446d059509c190 +S = 120b90e1cfb8a1b5e530df7b17d1128bc051ca4f1a65dd9c9d9d3c59d2f00c7c1e994c52b8671d40294b4d574d2c04475d5bebeacd3a0d3870a54dc7a4805614f40 + +Msg = 8fdcf5084b12cfc043dd3416b46274e021bbed95d341d3c500c102a5609d3a34de29f8fa9f0adb611a1f47a97ad981f8129d718fc0d6c709eab1a3490db8d550f34eb905b9e00663543afc5bc155e368e0bc919a8b8c9fa42093603537a5614927efa6be819ed42ececbf1a80a61e6e0a7f9b5bc43b9238e62d5df0571fea152 +d = 002764f5696aa813cd55d30948585f86288ae05aeb264ca157cd09e1d09a10515a849b0791b755ccc656a34707be9e52f5762d290a7d2bcd6de52c600ff862eaf4e +Qx = 127279c88719dc614db387f102e55104ea1c704ac7f57f3bca936f728439b76556730dd7cde2ac1ad0a4c2c2f036ab6f00cf34cb87ea36113571f300713044106d2 +Qy = 134a0786c31f5f2291b83c50fb579ae4c620b95e5a8bdc0c7e1ee6b996c89d764f1b20403e7faa203f397425ada297045dd8ba0e4b155d4900da249e934faab7991 +k = 08bffb0778cbb06466cecc114b9e89ca243a2b2b5e2597db920bc73a8bbcbe3f57144ad33409ef7faaab430e13f4c42d304d11347360c84972ca20b1539cce3a288 +R = 1f8f504e64a502e51e7c129517931c3b71f0d8a63b19cfe01ff7c951c6525249608b3ef5d00061d77eb6b3d69581adeaa3732c773bbb9b919c3e7c71fdc09f44d06 +S = 058044fc64b340604ffd02a5b2918d76fd6fb59ea895feab7aa218e6f1e8c8f226eb9ee345ef8140183a69272582005077b008006aab11597e808d7ff1e8382c924 + +Msg = 00669f433934992257bed55861df679804107d7fa491672574a7624949c60049b0533383c88d6896c8de860704c3e6a6aefce83efa57c4d57e9ab253da5d15e1f53ab6dce218b592772ab0bc01fee8e63368e85c0639301456fe2d44cd5396a7f2b22761cd03b80eba7883eede8249a2f5db2183bf00550c5c002f45a5e4fb31 +d = 1b0c9acd3eeb618b4b0de4db402206f0f29adc69d7ad324b6db6601b351f723ac8fe949eeacd34228649bf0126276e5aceb0137d00c30dd858aef2d6b6449de2e89 +Qx = 1811c8884486aaa083ddee1c51cb6e861cb830bd5eaa929f72efadbbd1286566ae7e7ba7fde7e02529900d35ee64591652d28798bfc1bed0d192602a9cf5a7d22e3 +Qy = 06d7fc9dd494816cfd29613d4689af67f7d0a2e6fbad5d4d6e0130189172a1ab601c5ca71deaa8bfcb5a190d49da191672ff6fc048e146cb902acec5eae6d87e60a +k = 1fdc4f108070af3c66c9ba7b6c1f2603a19ceb4760399df81228cfc7eafde1082b5a0716a3ff82fbe84726f14dd0db3376ca184a78c3c60679bab6cd45f77f9b9ce +R = 1ec310339ff056faeb341c4499c43782078b04be1725ae9a6cdcb6011c46d1a4eb3d75c358225e4ec142fd1cd344186f5eb597f7ba559ddfa954824365d5b6edaec +S = 005b679a33fdb7e04834f071cd0ac514c04add9f2614ab9bbd9b407b1420fed3f3e02a108e7e279899e43dcf64ae4083c289a87cd7d2103bdc036a95d36800ac7c6 + +Msg = 4be81dcfab39a64d6f00c0d7fff94dabdf3473dc49f0e12900df328d6584b854fbaebaf3194c433e9e21743342e2dd056b445c8aa7d30a38504b366a8fa889dc8ecec35b3130070787e7bf0f22fab5bea54a07d3a75368605397ba74dbf2923ef20c37a0d9c64caebcc93157456b57b98d4becb13fecb7cc7f3740a6057af287 +d = 181e1037bbec7ca2f271343e5f6e9125162c8a8a46ae8baa7ca7296602ae9d56c994b3b94d359f2b3b3a01deb7a123f07d9e0c2e729d37cc5abdec0f5281931308a +Qx = 0cfa5a8a3f15eb8c419095673f1d0bd63b396ff9813c18dfe5aa31f40b50b82481f9ed2edd47ae5ea6a48ea01f7e0ad0000edf7b66f8909ee94f141d5a07efe315c +Qy = 18af728f7318b96d57f19c1104415c8d5989565465e429bc30cf65ced12a1c5856ac86fca02388bc151cf89959a4f048597a9e728f3034aa39259b59870946187bf +k = 09078beaba465ba7a8b3624e644ac1e97c654533a58ac755e90bd606e2214f11a48cb51f9007865a0f569d967ea0370801421846a89f3d09eb0a481289270919f14 +R = 19cf91a38cc20b9269e7467857b1fc7eabb8cea915a3135f727d471e5bfcfb66d321fabe283a2cf38d4c5a6ecb6e8cbee1030474373bb87fcdfcc95cf857a8d25d0 +S = 1cf9acd9449c57589c950f287842f9e2487c5610955b2b5035f6aacfd2402f511998a1a942b39c307fc2bcab2c8d0dae94b5547ddccfb1012ca985b3edf42bbba8b + +[P-521,SHA-512] + +Msg = 9ecd500c60e701404922e58ab20cc002651fdee7cbc9336adda33e4c1088fab1964ecb7904dc6856865d6c8e15041ccf2d5ac302e99d346ff2f686531d25521678d4fd3f76bbf2c893d246cb4d7693792fe18172108146853103a51f824acc621cb7311d2463c3361ea707254f2b052bc22cb8012873dcbb95bf1a5cc53ab89f +d = 0f749d32704bc533ca82cef0acf103d8f4fba67f08d2678e515ed7db886267ffaf02fab0080dca2359b72f574ccc29a0f218c8655c0cccf9fee6c5e567aa14cb926 +Qx = 061387fd6b95914e885f912edfbb5fb274655027f216c4091ca83e19336740fd81aedfe047f51b42bdf68161121013e0d55b117a14e4303f926c8debb77a7fdaad1 +Qy = 0e7d0c75c38626e895ca21526b9f9fdf84dcecb93f2b233390550d2b1463b7ee3f58df7346435ff0434199583c97c665a97f12f706f2357da4b40288def888e59e6 +k = 03af5ab6caa29a6de86a5bab9aa83c3b16a17ffcd52b5c60c769be3053cdddeac60812d12fecf46cfe1f3db9ac9dcf881fcec3f0aa733d4ecbb83c7593e864c6df1 +R = 04de826ea704ad10bc0f7538af8a3843f284f55c8b946af9235af5af74f2b76e099e4bc72fd79d28a380f8d4b4c919ac290d248c37983ba05aea42e2dd79fdd33e8 +S = 087488c859a96fea266ea13bf6d114c429b163be97a57559086edb64aed4a18594b46fb9efc7fd25d8b2de8f09ca0587f54bd287299f47b2ff124aac566e8ee3b43 + +Msg = b3c63e5f5a21c4bfe3dbc644354d9a949186d6a9e1dd873828782aa6a0f1df2f64114a430b1c13fe8a2e09099e1ed05ef70de698161039ded73bcb50b312673bb073f8a792ac140a78a8b7f3586dffb1fc8be4f54516d57418ccc9945025ce3acf1eb84f69ceee5e9bd10c18c251dbc481562cd3aae54b54ab618cb1eeda33cf +d = 1a4d2623a7d59c55f408331ba8d1523b94d6bf8ac83375ceb57a2b395a5bcf977cfc16234d4a97d6f6ee25a99aa5bff15ff535891bcb7ae849a583e01ac49e0e9b6 +Qx = 04d5c8afee038984d2ea96681ec0dccb6b52dfa4ee2e2a77a23c8cf43ef19905a34d6f5d8c5cf0981ed804d89d175b17d1a63522ceb1e785c0f5a1d2f3d15e51352 +Qy = 014368b8e746807b2b68f3615cd78d761a464ddd7918fc8df51d225962fdf1e3dc243e265100ff0ec133359e332e44dd49afd8e5f38fe86133573432d33c02fa0a3 +k = 0bc2c0f37155859303de6fa539a39714e195c37c6ea826e224c8218584ae09cd0d1cc14d94d93f2d83c96e4ef68517fdb3f383da5404e5a426bfc5d424e253c181b +R = 1a3c4a6386c4fb614fba2cb9e74201e1aaa0001aa931a2a939c92e04b8344535a20f53c6e3c69c75c2e5d2fe3549ed27e6713cb0f4a9a94f6189eb33bff7d453fce +S = 16a997f81aa0bea2e1469c8c1dab7df02a8b2086ba482c43af04f2174831f2b1761658795adfbdd44190a9b06fe10e578987369f3a2eced147cff89d8c2818f7471 + +Msg = 6e0f96d56505ffd2d005d5677dbf926345f0ff0a5da456bbcbcfdc2d33c8d878b0bc8511401c73168d161c23a88b04d7a9629a7a6fbcff241071b0d212248fcc2c94fa5c086909adb8f4b9772b4293b4acf5215ea2fc72f8cec57b5a13792d7859b6d40348fc3ba3f5e7062a19075a9edb713ddcd391aefc90f46bbd81e2557b +d = 14787f95fb1057a2f3867b8407e54abb91740c097dac5024be92d5d65666bb16e4879f3d3904d6eab269cf5e7b632ab3c5f342108d1d4230c30165fba3a1bf1c66f +Qx = 0c2d540a7557f4530de35bbd94da8a6defbff783f54a65292f8f76341c996cea38795805a1b97174a9147a8644282e0d7040a6f83423ef2a0453248156393a1782e +Qy = 119f746c5df8cec24e4849ac1870d0d8594c799d2ceb6c3bdf891dfbd2242e7ea24d6aec3166214734acc4cbf4da8f71e2429c5c187b2b3a048527c861f58a9b97f +k = 186cd803e6e0c9925022e41cb68671adba3ead5548c2b1cd09348ab19612b7af3820fd14da5fe1d7b550ed1a3c8d2f30592cd7745a3c09ee7b5dcfa9ed31bdd0f1f +R = 10ed3ab6d07a15dc3376494501c27ce5f78c8a2b30cc809d3f9c3bf1aef437e590ef66abae4e49065ead1af5f752ec145acfa98329f17bca9991a199579c41f9229 +S = 08c3457fe1f93d635bb52df9218bf3b49a7a345b8a8a988ac0a254340546752cddf02e6ce47eee58ea398fdc9130e55a4c09f5ae548c715f5bcd539f07a34034d78 + +Msg = 3f12ab17af3c3680aad22196337cedb0a9dba22387a7c555b46e84176a6f8418004552386ada4deec59fdabb0d25e1c6668a96f100b352f8dabd24b2262bd2a3d0f825602d54150bdc4bcbd5b8e0ca52bc8d2c70ff2af9b03e20730d6bd9ec1d091a3e5c877259bcff4fd2c17a12bfc4b08117ec39fe4762be128d0883a37e9d +d = 15807c101099c8d1d3f24b212af2c0ce525432d7779262eed0709275de9a1d8a8eeeadf2f909cf08b4720815bc1205a23ad1f825618cb78bde747acad8049ca9742 +Qx = 160d7ea2e128ab3fabd1a3ad5455cb45e2f977c2354a1345d4ae0c7ce4e492fb9ff958eddc2aa61735e5c1971fa6c99beda0f424a20c3ce969380aaa52ef5f5daa8 +Qy = 14e4c83f90d196945fb4fe1e41913488aa53e24c1d2142d35a1eed69fed784c0ef44d71bc21afe0a0065b3b87069217a5abab4355cf8f4ceae5657cd4b9c8008f1f +k = 096731f8c52e72ffcc095dd2ee4eec3da13c628f570dba169b4a7460ab471149abdede0b63e4f96faf57eab809c7d2f203fd5ab406c7bd79869b7fae9c62f97c794 +R = 1e2bf98d1186d7bd3509f517c220de51c9200981e9b344b9fb0d36f34d969026c80311e7e73bb13789a99e0d59e82ebe0e9595d9747204c5f5550c30d934aa30c05 +S = 12fed45cc874dc3ed3a11dd70f7d5c61451fbea497dd63e226e10364e0718d3722c27c7b4e5027051d54b8f2a57fc58bc070a55b1a5877b0f388d768837ef2e9cec + +Msg = a1eed24b3b7c33296c2491d6ee092ec6124f85cf566bb5bc35bffb5c734e34547242e57593e962fb76aee9e800eed2d702cc301499060b76406b347f3d1c86456978950737703c8159001e6778f69c734a56e5ce5938bd0e0de0877d55adeee48b0d8dfa4ac65fd2d3ce3e12878bac5c7014f9284d161b2a3e7d5c88569a45f6 +d = 18692def0b516edcdd362f42669999cf27a65482f9358fcab312c6869e22ac469b82ca9036fe123935b8b9ed064acb347227a6e377fb156ec833dab9f170c2ac697 +Qx = 1ceee0be3293d8c0fc3e38a78df55e85e6b4bbce0b9995251f0ac55234140f82ae0a434b2bb41dc0aa5ecf950d4628f82c7f4f67651b804d55d844a02c1da6606f7 +Qy = 1f775eb6b3c5e43fc754052d1f7fc5b99137afc15d231a0199a702fc065c917e628a54e038cbfebe05c90988b65183b368a2061e5b5c1b025bbf2b748fae00ba297 +k = 161cf5d37953e09e12dc0091dc35d5fb3754c5c874e474d2b4a4f1a90b870dff6d99fb156498516e25b9a6a0763170702bb8507fdba4a6131c7258f6ffc3add81fd +R = 14dfa43046302b81fd9a34a454dea25ccb594ace8df4f9d98556ca5076bcd44b2a9775dfaca50282b2c8988868e5a31d9eb08e794016996942088d43ad3379eb9a1 +S = 120be63bd97691f6258b5e78817f2dd6bf5a7bf79d01b8b1c3382860c4b00f89894c72f93a69f3119cb74c90b03e9ede27bd298b357b9616a7282d176f3899aaa24 + +Msg = 9aace26837695e6596007a54e4bccdd5ffb16dc6844140e2eeeb584b15acb2bbffd203c74440b6ee8db676fd200b4186a8c3e957c19e74d4d865ada83f80655323dfa3570907ed3ce853b6e8cc375ed2d758a2f5ad265dd3b47650517a49b3d02df9e0c60c21576378c2b3a08481eec129b2a75608e13e6420127a3a63c8a3f1 +d = 0a63f9cdefbccdd0d5c9630b309027fa139c31e39ca26686d76c22d4093a2a5e5ec4e2308ce43eb8e563187b5bd811cc6b626eace4063047ac0420c3fdcff5bdc04 +Qx = 14cab9759d4487987b8a00afd16d7199585b730fb0bfe63796272dde9135e7cb9e27cec51207c876d9214214b8c76f82e7363f5086902a577e1c50b4fbf35ce9966 +Qy = 1a83f0caa01ca2166e1206292342f47f358009e8b891d3cb817aec290e0cf2f47e7fc637e39dca03949391839684f76b94d34e5abc7bb750cb44486cce525eb0093 +k = 01e51fd877dbbcd2ab138fd215d508879298d10c7fcbdcc918802407088eb6ca0f18976a13f2c0a57867b0298512fc85515b209c4435e9ef30ab01ba649838bc7a0 +R = 11a1323f6132d85482d9b0f73be838d8f9e78647934f2570fededca7c234cc46aa1b97da5ac1b27b714f7a171dc4209cbb0d90e4f793c4c192dc039c31310d6d99b +S = 0386a5a0fc55d36ca7231a9537fee6b9e51c2255363d9c9e7cb7185669b302660e23133eb21eb56d305d36e69a79f5b6fa25b46ec61b7f699e1e9e927fb0bceca06 + +Msg = ac2175940545d4fbab6e2e651c6830aba562e0c11c919e797c43eff9f187a68a9e5a128e3e2a330b955a3f4577d3f826529ad1b03d7b60f7ad678f005053b41dc0f8d267f3685c6abe1a0e9a733c44b2f3ca48b90806f935141c842e3a6c06a58f5343d75e3585971a734f4ae1074ce5b54f74bd9342f4bbca738d260393f43e +d = 024f7d67dfc0d43a26cc7c19cb511d30a097a1e27e5efe29e9e76e43849af170fd9ad57d5b22b1c8840b59ebf562371871e12d2c1baefc1abaedc872ed5d2666ad6 +Qx = 09da1536154b46e3169265ccba2b4da9b4b06a7462a067c6909f6c0dd8e19a7bc2ac1a47763ec4be06c1bec57d28c55ee936cb19588cc1398fe4ea3bd07e6676b7f +Qy = 14150cdf25da0925926422e1fd4dcfcffb05bdf8682c54d67a9bd438d21de5af43a15d979b320a847683b6d12ac1383a7183095e9da491c3b4a7c28874625e70f87 +k = 1c1308f31716d85294b3b5f1dc87d616093b7654907f55289499b419f38ceeb906d2c9fe4cc3d80c5a38c53f9739311b0b198111fede72ebde3b0d2bc4c2ef090d2 +R = 00dbf787ce07c453c6c6a67b0bf6850c8d6ca693a3e9818d7453487844c9048a7a2e48ff982b64eb9712461b26b5127c4dc57f9a6ad1e15d8cd56d4fd6da7186429 +S = 0c6f1c7774caf198fc189beb7e21ca92ceccc3f9875f0e2d07dc1d15bcc8f210b6dd376bf65bb6a454bf563d7f563c1041d62d6078828a57538b25ba54723170665 + +Msg = 6266f09710e2434cb3da3b15396556765db2ddcd221dce257eab7399c7c490135925112932716af1434053b8b9fe340563e57a0b9776f9ac92cbb5fba18b05c0a2fafbed7240b3f93cd1780c980ff5fe92610e36c0177cabe82367c84cee9020cf26c1d74ae3eb9b9b512cb8b3cb3d81b17cf20dc76591b2b394ef1c62ac12ee +d = 0349471460c205d836aa37dcd6c7322809e4e8ef81501e5da87284b267d843897746b33016f50a7b702964910361ed51d0afd9d8559a47f0b7c25b2bc952ce8ed9e +Qx = 00bbd4e8a016b0c254e754f68f0f4ed081320d529ecdc7899cfb5a67dd04bc85b3aa6891a3ed2c9861ae76c3847d81780c23ad84153ea2042d7fd5d517a26ff3ce4 +Qy = 0645953afc3c1b3b74fdf503e7d3f982d7ee17611d60f8eb42a4bddbec2b67db1f09b54440c30b44e8071d404658285cb571462001218fc8c5e5b98b9fae28272e6 +k = 00eb2bd8bb56b9d2e97c51247baf734cc655c39e0bfda35375f0ac2fe82fad699bf1989577e24afb33c3868f91111e24fefe7dec802f3323ac013bec6c048fe5568 +R = 14bf63bdbc014aa352544bd1e83ede484807ed760619fa6bc38c4f8640840195e1f2f149b29903ca4b6934404fb1f7de5e39b1ea04dba42819c75dbef6a93ebe269 +S = 05d1bcf2295240ce4415042306abd494b4bda7cf36f2ee2931518d2454faa01c606be120b057062f2f3a174cb09c14f57ab6ef41cb3802140da22074d0e46f908d4 + +Msg = 3de9e617a6868dca1a1432d503f923535da3f9b34426b2a4822174399c73b1c1ee67311410a58c17202ac767844b2024d8aa21a205707d93865693ac25a24fc87034fa3a7a7e27c3344cb03b87602c15180a5fe6a9dd90cd11af4a0f150207bf2d83f55b12c088adae99aa8cfa659311b3a25beb99056643760d6a282126b9b2 +d = 07788d34758b20efc330c67483be3999d1d1a16fd0da81ed28895ebb35ee21093d37ea1ac808946c275c44454a216195eb3eb3aea1b53a329eca4eb82dd48c784f5 +Qx = 0157d80bd426f6c3cee903c24b73faa02e758607c3e102d6e643b7269c299684fdaba1acddb83ee686a60acca53cddb2fe976149205c8b8ab6ad1458bc00993cc43 +Qy = 16e33cbed05721b284dacc8c8fbe2d118c347fc2e2670e691d5d53daf6ef2dfec464a5fbf46f8efce81ac226915e11d43c11c8229fca2327815e1f8da5fe95021fc +k = 0a73477264a9cc69d359464abb1ac098a18c0fb3ea35e4f2e6e1b060dab05bef1255d9f9c9b9fbb89712e5afe13745ae6fd5917a9aedb0f2860d03a0d8f113ea10c +R = 07e315d8d958b8ce27eaf4f3782294341d2a46fb1457a60eb9fe93a9ae86f3764716c4f5f124bd6b114781ed59c3f24e18aa35c903211b2f2039d85862932987d68 +S = 1bcc1d211ebc120a97d465b603a1bb1e470109e0a55d2f1b5c597803931bd6d7718f010d7d289b31533e9fcef3d141974e5955bc7f0ee342b9cad05e29a3dded30e + +Msg = aa48851af7ef17abe233163b7185130f4646203c205e22bcc2a5a3697bcab998c73a9ffe1d3ea0b7978ce7df937a72586eb5ca60b0d939a7d1c115c820171c89c8116b7e2c7b98cf0f14e4c4df3cb2f319ad3ab0ea25ff14526ddc037469f000bf82100acd4cdf94feb4eba4ea1726f0569336604a473aee67d71afebb569209 +d = 1f98696772221e6cccd5569ed8aed3c435ee86a04689c7a64d20c30f6fe1c59cc10c6d2910261d30c3b96117a669e19cfe5b696b68feeacf61f6a3dea55e6e5837a +Qx = 07002872c200e16d57e8e53f7bce6e9a7832c387f6f9c29c6b75526262c57bc2b56d63e9558c5761c1d62708357f586d3aab41c6a7ca3bf6c32d9c3ca40f9a2796a +Qy = 1fe3e52472ef224fb38d5a0a14875b52c2f50b82b99eea98d826c77e6a9ccf798de5ffa92a0d65965f740c702a3027be66b9c844f1b2e96c134eb3fdf3edddcf11c +k = 1a277cf0414c6adb621d1cc0311ec908401ce040c6687ed45a0cdf2910c42c9f1954a4572d8e659733d5e26cbd35e3260be40017b2f5d38ec42315f5c0b056c596d +R = 0d732ba8b3e9c9e0a495249e152e5bee69d94e9ff012d001b140d4b5d082aa9df77e10b65f115a594a50114722db42fa5fbe457c5bd05e7ac7ee510aa68fe7b1e7f +S = 134ac5e1ee339727df80c35ff5b2891596dd14d6cfd137bafd50ab98e2c1ab4008a0bd03552618d217912a9ec502a902f2353e757c3b5776309f7f2cfebf913e9cd + +Msg = b0d5d52259af364eb2d1a5027e5f7d0afe4b999cc5dd2268cfe76f51d2f17b541bdd7867e23a1bb897705153d9432a24012108979c6a2c9e2567c9531d012f9e4be764419491a52eae2e127430b0ab58cb8e216515a821b3db206447c235bf44ee304201b483b2a88844abaa18bca0147dfff7e502397dd62e15524f67eb2df2 +d = 13c3852a6bc8825b45fd7da1754078913d77f4e586216a6eb08b6f03adce7464f5dbc2bea0eb7b12d103870ef045f53d67e3600d7eba07aac5db03f71b64db1cceb +Qx = 0c97a4ebcbbe701c9f7be127e87079edf479b76d3c14bfbee693e1638e5bff8d4705ac0c14597529dbe13356ca85eb03a418edfe144ce6cbf3533016d4efc29dbd4 +Qy = 11c75b7a8894ef64109ac2dea972e7fd5f79b75dab1bf9441a5b8b86f1dc1324426fa6cf4e7b973b44e3d0576c52e5c9edf8ce2fc18cb3c28742d44419f044667f8 +k = 1e25b86db041f21c2503d547e2b1b655f0b99d5b6c0e1cf2bdbd8a8c6a053f5d79d78c55b4ef75bff764a74edc920b35536e3c470b6f6b8fd53898f3bbc467539ef +R = 1dce45ea592b34d016497882c48dc0c7afb1c8e0f81a051800d7ab8da9d237efd892207bc9401f1d30650f66af8d5349fc5b19727756270722d5a8adb0a49b72d0a +S = 0b79ffcdc33e028b1ab894cb751ec792a69e3011b201a76f3b878655bc31efd1c0bf3b98aea2b14f262c19d142e008b98e890ebbf464d3b025764dd2f73c4251b1a + +Msg = 9599788344976779383a7a0812a096943a1f771ee484d586af1a06207478e4c0be9c200d42460fe837e24b266c8852d80d3c53cc52ffb1913fc3261145fc6da575611efd16c026059a2e64f802517ffd1b6b34de10ad2909c65c2155e8d939b8115400c1d793d23955b15f5d1c13c962ff92b4a815cee0e10f8e14e1f6e6cd38 +d = 1654eaa1f6eec7159ee2d36fb24d15d6d33a128f36c52e2437f7d1b5a44ea4fa965c0a26d0066f92c8b82bd136491e929686c8bde61b7c704daab54ed1e1bdf6b77 +Qx = 1f269692c47a55242bb08731ff920f4915bfcecf4d4431a8b487c90d08565272c52ca90c47397f7604bc643982e34d05178e979c2cff7ea1b9eaec18d69ca7382de +Qy = 0750bdd866fba3e92c29599c002ac6f9e2bf39af8521b7b133f70510e9918a94d3c279edec97ab75ecda95e3dd7861af84c543371c055dc74eeeff7061726818327 +k = 1b7519becd00d750459d63a72f13318b6ac61b8c8e7077cf9415c9b4b924f35514c9c28a0fae43d06e31c670a873716156aa7bc744577d62476e038b116576a9e53 +R = 183bddb46c249e868ef231a1ebd85d0773bf8105a092ab7d884d677a1e9b7d6014d6358c09538a99d9dca8f36f163ac1827df420c3f9360cc66900a9737a7f756f3 +S = 0d05ee3e64bac4e56d9d8bd511c8a43941e953cba4e5d83c0553acb87091ff54f3aad4d69d9f15e520a2551cc14f2c86bb45513fef0295e381a7635486bd3917b50 + +Msg = fdde51acfd04eb0ad892ce9d6c0f90eb91ce765cbe3ce9d3f2defe8f691324d26b968b8b90e77706b068585f2a3ee7bf3e910528f7403c5af745a6f9d7ba6c53abd885c3b1be583415b128f4d3f224daf8563476bd9aa61e9c8518c144335f8f879c03696bddbe3ac37a8fbede29861611feaa87e325e2f60278b4893ed57fb0 +d = 1cba5d561bf18656991eba9a1dde8bde547885ea1f0abe7f2837e569ca52f53df5e64e4a547c4f26458b5d9626ed6d702e5ab1dd585cf36a0c84f768fac946cfd4c +Qx = 12857c2244fa04db3b73db4847927db63cce2fa6cb22724466d3e20bc950a9250a15eafd99f236a801e5271e8f90d9e8a97f37c12f7da65bce8a2c93bcd25526205 +Qy = 0f394e37c17d5b8e35b488fa05a607dbc74264965043a1fb60e92edc212296ae72d7d6fe2e3457e67be853664e1da64f57e44bd259076b3bb2b06a2c604fea1be9d +k = 0e790238796fee7b5885dc0784c7041a4cc7ca4ba757d9f7906ad1fcbab5667e3734bc2309a48047442535ff89144b518f730ff55c0c67eeb4c880c2dfd2fb60d69 +R = 1d7ce382295a2a109064ea03f0ad8761dd60eefb9c207a20e3c5551e82ac6d2ee5922b3e9655a65ba6c359dcbf8fa843fbe87239a5c3e3eaecec0407d2fcdb687c2 +S = 161963a6237b8955a8a756d8df5dbd303140bb90143b1da5f07b32f9cb64733dc6316080924733f1e2c81ade9d0be71b5b95b55666026a035a93ab3004d0bc0b19f + +Msg = beb34c997f905c77451ac392f7957a0ab8b23325bd5c63ca31c109ac8f655a1e3094240cb8a99284f8091de2ab9a7db2504d16251980b86be89ec3a3f41162698bab51848880633e0b71a38f8896335853d8e836a2454ecab2acdcc052c8f659be1d703b13ae1b090334ac50ab0137ddb5e8b924c0e3d2e5789daaef2fdd4a1e +d = 0972e7ff25adf8a032535e5b19463cfe306b90803bf27fabc6046ae0807d2312fbab85d1da61b80b2d5d48f4e5886f27fca050b84563aee1926ae6b2564cd756d63 +Qx = 1d7f1e9e610619daa9d2efa563610a371677fe8b58048fdc55a98a49970f6afa6649c516f9c72085ca3722aa595f45f2803402b01c832d28aac63d9941f1a25dfea +Qy = 1571facce3fcfe733a8eef4e8305dfe99103a370f82b3f8d75085414f2592ad44969a2ef8196c8b9809f0eca2f7ddc71c47879e3f37a40b9fecf97992b97af29721 +k = 0517f6e4002479dc89e8cbb55b7c426d128776ca82cf81be8c1da9557178783f40e3d047db7e77867f1af030a51de470ee3128c22e9c2d642d71e4904ab5a76edfa +R = 1c3262a3a3fb74fa5124b71a6c7f7b7e6d56738eabaf7666b372b299b0c99ee8a16be3df88dd955de093fc8c049f76ee83a4138cee41e5fe94755d27a52ee44032f +S = 072fd88bb1684c4ca9531748dfce4c161037fcd6ae5c2803b7117fb60d3db5df7df380591aaf3073a3031306b76f062dcc547ded23f6690293c34a710e7e9a226c3 + +Msg = 543c374af90c34f50ee195006d5f9d8dd986d09ad182fcbefa085567275eee1e742bfe0af3d058675adeb5b9f87f248b00a9fbd2aa779129123a5b983f2f26fc3caf2ea34277550c22fe8c814c739b46972d50232993cddd63a3c99e20f5c5067d9b57e2d5db94317a5a16b5c12b5c4cafbc79cbc2f9940f074bbc7d0dc71e90 +d = 1f0ec8da29295394f2f072672db014861be33bfd9f91349dad5566ff396bea055e53b1d61c8c4e5c9f6e129ed75a49f91cce1d5530ad4e78c2b793a63195eb9f0da +Qx = 09ec1a3761fe3958073b9647f34202c5e8ca2428d056facc4f3fedc7077fa87f1d1eb30cc74f6e3ff3d3f82df2641cea1eb3ff1529e8a3866ae2055aacec0bf68c4 +Qy = 0bed0261b91f664c3ff53e337d8321cb988c3edc03b46754680097e5a8585245d80d0b7045c75a9c5be7f599d3b5eea08d828acb6294ae515a3df57a37f903ef62e +k = 0ac3b6d61ebda99e23301fa198d686a13c0832af594b289c9a55669ce6d62011384769013748b68465527a597ed6858a06a99d50493562b3a7dbcee975ad34657d8 +R = 0cef3f4babe6f9875e5db28c27d6a197d607c3641a90f10c2cc2cb302ba658aa151dc76c507488b99f4b3c8bb404fb5c852f959273f412cbdd5e713c5e3f0e67f94 +S = 0097ed9e005416fc944e26bcc3661a09b35c128fcccdc2742739c8a301a338dd77d9d13571612a3b9524a6164b09fe73643bbc31447ee31ef44a490843e4e7db23f + + +[K-233,SHA-224] + +Msg = f23f784fe136c9fc0d169503d361e9c6148b0f1fbdcae0a97fae1af7033ddef25cb7489c9963cfcb009a8cbfe44a8510a64a073eb1deae4c324ceb9302008c92c69b2dafcc9077fd3cc3c7c119edc3ced36d176ceaa55ac036bf7f07f6fa215e8bb8196e59a5e1c9af4f98b90ab4970885bd7015fa26a09e03c7cf6b4b23d929 +d = 04c1d414696cc3657dd9df73ace56eda2636769ce7082e064c260be45a5 +Qx = 1f228c0a75b057eb07fe7ce8223ed4163148c1fdab61e0f787271f836a9 +Qy = 0cdfa5655d96ffd5ffb6027bfaa04da7b5d8fbdbb6202c8bb79f056ce43 +k = 058f8511089fcd59324469f6736b92693afe26bd4719e198f1f2287dc5f +R = 016bafefb4933ffd00bd1db6d6c4fac8a06375603adc0aa2a5664083ff4 +S = 03bcb84b8f1990cfc7b88f2b8cc817105cd8e150808e7c87b310cdc47e3 + +Msg = 400bcb297552bb37f2f8135a9314a35f5126788bb6fa4dc74152731ff64c5dab4b902103d85443dec20e16b1d6629930cdc2bd183d4099f0e96295a63c2fe266f5e9d050c401a8681b4a438efe53cbd8f2f43e2a31e9f88926a9c82917d873f6e8cd5ff5eb8c1ca36126b0bfc8c2b0e85a7c9e7a45f1875ca9c82019ebedb729 +d = 027cb1d84865a16992476c9e353283d5d6a40c349a8e9179d1b1f403531 +Qx = 1191227d064176f4ab020faea61330df5eb59163ecb4ea59c23e6f1f6c8 +Qy = 12dbfbf85b3624b9f56446f840602f9b839bab1368295b3ae919cb07c07 +k = 01a41af270269be052a62a9879638e3432a1479b05776ce61f45c0c361b +R = 041a5f1d28b70bfa2925b9428ab8bac9fa174d88ae27d754824c7d16ead +S = 044d359065672b3d3dfe8389fbc6fc751ca6a46820626c466174fb9b922 + +Msg = 5f74d4b35c49fa454c97c05fdb6b9f6822cf1a2295f15bd766dbcb413d77c910bd8f4147e8f317fac2300fa21cb80134d1b6f8ae8e50518c1f648a28506e419f5a6e8f05abffdb3dd2587606c7e9c223ecff4f46b121216730ea13202b59128a7616bb2fd23a7e4a5aa08641cc07b669641313febfc88d64d99447353dae3f06 +d = 031b443f46c4b5224237fac1022ee1570173f664aba0c84dbaa4246bdc1 +Qx = 05f57b0e5f2e175006f4058cbb4ca9a0cac912c551ef1b94e97498fcc5a +Qy = 0f3a554d077b751478f8a2b7c2a9cf15effed958e0ac1a9e3db1e023c5f +k = 07ff6ef3026c5a960e632beeb7313b3bca0baec76cea1fd9b82cedc3245 +R = 0099741698549c32a4e86aab6194527cea703ff869849c538a938585a83 +S = 02ad706c6f5dcff512498d84f1877eb997dfbe9b3d13b339917632d3cb1 + +Msg = 8f92096876d9f81bcd992369d42d0b5877ac969004d17c8627c58d8b8b7bbf7a37e8cb6afa962b9b043bbbaa5bef4a5ee38d8bd31cb5866b828265a2f4102a616f87009cd346fcb8af5519fb577c60d8792472232f33dc615655e53d2b715b15a2697b492f108b7906e1e3597c6911f8cc30c7121ae338a6b747ec368f8e4a36 +d = 048f6ca29f35f253a4962734357c995920967b9eeff1ba5fd2080bfede5 +Qx = 12b7ca7c21292f8795b2fbfd63a28c5a4ec8c850d6240f973c903bc8170 +Qy = 1be9855e5c5a5064c27d1862010b2fd0d7be5a0180c861a288ceac89d6d +k = 07dcb9725323fd7668991ce9a907b7129d53fae9016e253c53d057d195d +R = 0498c4fca6ed7c2998347b464d3e562a74b0e4f3a6c1dc453aaa61bb710 +S = 03a77a13f011404d5c5341dcd2ca44dc2b08f21f09f524045c281fb221e + +Msg = 3d275dbde44494c45fc15fe89e2ae32aa26426a17e923e895c7941a5582fb95df4d49873ab1bde358017f336b911b886b626b744806ab8113418473c441f1964159ded1b12122d53ac56573167588e4b55f36b8bca8c67823883a51fb6e7f204d1c6b07ea49b577bfab9ca6b8d51f72268b022e3a4db6f9d265ee8382f9b7b66 +d = 019b940eabbe682f961d9f3d90432e347fef3910e641656825d775705b1 +Qx = 1efcc9f4576047c43eab1c13e0547b1c5ec1cd2afd2345fda72b5e1b50f +Qy = 0c7b5968af47e58f4ec15c0cd82ccd0b9f5bfde06c7f86fe5cd0105d693 +k = 03f783a94d1de73e4593f5d6d02238cfa0486e3ddf2bc0b95a528038e3c +R = 013c467531f3f6508534ad072edb210e4182ce5a798d8a46674e92a0b4d +S = 0685982aa8e2f3e46ecc03e00e7323f3b891da437235cfe9800139ee8d7 + +Msg = d2fa68e1f7dad02916b12fa38f1849d6d409dbad0344438520b4dd9b77d62d39ac9ae3cdeab03ccbcfd4de703c6e798873671731c108f322b9f2a68145e3e210c9b15b879798e5c53c5022742e9819b99edabb2f44d89ae221f7a99dc84421a6905695ff91928db608f861745f17584d56e34b75c47281435b1b0b34e490692d +d = 07a884b22e29fa9fe945e9ba13c0df8d786dc87cef0f77f069e182dd56c +Qx = 11e831647d0ffd53d75e44abceda753ab470b3cc93b457590617d925a19 +Qy = 03db5bd0aecd6504d904bcf9dcce131abd239aeadb9a64a9811eac823cc +k = 00241b763c6245b83afe61762b161c41467ef35b7f27a9c1066f02babd3 +R = 0514adca3481ac5f99287e6e966a5c223296b07a9456eb582ec5568688c +S = 07ff6a2f7cb1d2594a11d8d0adb6fe50b4e740f025e7b4333ee26163d92 + +Msg = 3830f75cf9df4eb2998c7c1b5fe11c1476bcf849c3a8fa7d3d0b5bc2292e5d07465ab8cc9381c575d909e509c5dac49c78817c04e4bef18bd51bb09aa5897f21634633a5ce6d20bb4638cb6c3927351eaec7b62cf4a33956916045c392f325adafb10a88a5f86d7e41dd77908fa7284210071c22aa40ef40da6339c02da05392 +d = 05da61f881d5a0dc085bb93764f584352882923cd237d878220ec624c1a +Qx = 18d740441eff1f785a14d04da4ba69540cbb469780ffd36e1dfae4f1de2 +Qy = 18072ab30e999ae26b872ef46a9a0604296d02c08fba9477d9e03f0f75d +k = 000f95c5678fd08dda790cc60bfa578118f8687228a2ef5f31e71a6884b +R = 074a6599b8cab75e0cf752e3f41288fbc673d52074950edb14f76524949 +S = 03523804351e3224e816cd4fb7191f332585f68053ddb32a85cc0fadc03 + +Msg = 65b9fe15e6c35d453caa6bad39ee78a720a04b60d8a0a0f049186d2f777e48ae2d657e174df53edb7beb9f7d8f21904ed674add0cda5b62a7308de76c324a144021e8c6d387daaba4ce48bf7dfe9c8aeee2c64e434ece1fa5ddcafcf3e5d0013a1eeec1742a00d384cc2ec0d7eda83bb4dccfb0e57045ebfc27a4f404d03da37 +d = 03fe9f04647f6d82b13ec1ae5a8c2e49bc66b05649ad778eb16149ad83a +Qx = 158eecc6b8918e7813ef990217c603b28ed1774c740382a8af5c9af6133 +Qy = 1bbffeccd41107c7e6f83e24c822d634a7ec064fae125dc8a3ecc4fc9b3 +k = 07731edfb3ef523a165a1b5817ab2805a5cf88043c98ea2393898e19551 +R = 01fa44fa18ebafee6f419fdb9de0e8365520617558b57e9ee89f2c8fc88 +S = 053f1b2da4cabad04fea1111d525f341417587823fce71e5bfd2353c2f1 + +Msg = d26521fd41eb5d46ece6836e188bf9cb1b461d011c41e002a935d256654d01725378e845920ec4a7fd3f379df54772493df50d312c7c6aa4e909e7b83f2442c3a5e85c37d68aa015098ecfb0a5e077370f4576f4bc63bf37e1dee06d780a3b6949af5e21c2a0960fcd20821ef5f17bebf5fd5b3bdda260842cbbfad45667287a +d = 05ebce648ace4cd555413de6a456fc487d14bf4b0b9a72311ef480d2f26 +Qx = 020b46ecbdc36b4dc01111932090ba185eab2cdc4fa89775f2a6177c592 +Qy = 104cac1c800103c79642321a216bcfae497b037b29888cf9f70c507114e +k = 027733120626e564b06ba71c4946c9c8bfae43f88511ec6352d2a52f407 +R = 0592de5184510e6ecb7be8a011f862470b918354a1ad82458cf716137fe +S = 010a9c5fb6e4b70571a35c56744b57baf0108728bea2bf639af1960d1dc + +Msg = b778c021b1a92c41dbd09963da07018075d73e54d62df5c2b7bf8abe137151650d1c1c6abce7eebd8f32e8c3e6d1433773f257bb3ba4a4fb6a02c0db1e47d03c27d3a90898ebd1927c21df24c4c5443ca5b81f8ef2cc0f5e8b3d08f472bf07085df737adaedec63d99acd77b87ba98225f198b791124ac2d9b191cb9251b4b00 +d = 056653c2f85593f789a926ba49fa3da9d7f946d8f1020508c5a527ce813 +Qx = 10d65f6f5415dd86a83bb10118abfc1b1670a1664eb6dae99fb68b85019 +Qy = 12c1e673e575086ec1e76b90d59c2cbd2727f726f88298552b678ba7e60 +k = 021e26c098c9f9da9c782857fe640ff6abb21caf20a093f2277845bd10d +R = 01d67cbc8209494dca1a74cee5d9894f98f03728214f7bbdac29b0c0e78 +S = 02215f758fcf0d8dd603e79658a8061ab45bfe6d854e52ea7074fd5654e + +Msg = ec14e07f615960015a489ef999e308b42a4c571473b9bd64b433dabd9a1b1ad02e33eee9100064405175928a94543a80f440040afa2965b4e5f95f768e7fab6d3c0a5f5e1bf1df7822f78384e80f2955ea85f044ac60537d895747979f935bb0cd3673193c4a32dd7803e48d7daf70a71bc2aa97236615b6411e28fc9a652145 +d = 049a91d320783cc70a5952c32036cfc75d41f1aa84127db2dc759fb291c +Qx = 190528df8fc3ae4db6e12930f176ec9c833d1668ac5808f1046366445a4 +Qy = 1f647d55ce80b18a9add47fd1a8e4aa725297d9da03246f5c1ce503dd56 +k = 01eb80e2596d6c01431e7a4fd9e22903ea85547a31d675ff157a789a137 +R = 04523776d88199ebac2f96f9faa434bd81bde770ad4458ef126fde9198a +S = 054665f31f92f8897482d34fcb63141a7539577037c84496167e9d3389f + +Msg = 89c645339ad0eb850e4e2fe583cee175b35feb02ed7541d7e9aace24cdd3939584f73ad39526de6399c86b36de77a018e2c70b532bd0f032f9137d10480acc30c49f9baaa86f9df0033b77e98b485bf7a69cb5c281e527d3ccd1fce2415f0dda4a268ce68a0a34b16afda54ed922cd6810ac8dc766df2a3a6c5e55972e9786fc +d = 016a20016602fc7088a60469843e1d29ad67e3c3cb9500b1e2a00d4050a +Qx = 04f157541dc3a8bc8a2ad4dfb3933039b67e331b7353a2fa9ede322f4ad +Qy = 1348a7b8c9495bcbecd556870715faf3d543cb8f2368805473bca17b82e +k = 01df1ee39217d7f0d838e8b2d30a1159d8003b06e50a00d637edf08d6d1 +R = 045d16826bbc425637e7a05b826bc907f7453c70141d1bbd2cda63dd490 +S = 01ae1703cf179dfd1d5407ba2b7324cc7cac15235ee9c3756177444e122 + +Msg = ace14c4b101d2d8453c2bc22b756af016b5de537df9c3e639d208ad04ae0bf6232dc90b90c33228dc85de956db771ffde05fb4d0b15e4f218ed2771d703ae5bf981252a5bcd60c16f14483131a481cbe04dc0adb1fb8aa32cb48bb5008e8a8e5c7b7465be2fd7afbc811cf5ea6293b1a464669b49f55f57b93a8707e6042fda6 +d = 00ba922149bada2551b7be1c3df076f3f97ce93c13c50c285fef3f42363 +Qx = 12daff2cfab994b9d1d1ba73bd2f8e7883b2d92f760b0d16351ec125fd4 +Qy = 115666f7c65b95ec2d713c5ab1a3eeaaf0f931b1859733416c3c778aa2a +k = 07fc7c9503fabba0972e0e8892ec6331e0812c6452d211c5561fde79048 +R = 06477ec9d8d8d45418b9efe7ae47c0863ff94c43d8f392c079b870a7cf4 +S = 06b5a5d020b3d980b9d7880130802435ddb4e7362e36a70d193f18a7fe6 + +Msg = cec2ba0d1772c87e87d5bbbd67220692bea4301aa1a66e8dbdd7e651d45c26dc2a0d45cfc32c34d76ae3e1c61db7b0fe1863457b93937d929e6ece7462ebd16adfd708353d6f7c27aafe06593c76da7149b0cc574a4290b0d8fe219f3eada7082aca38dba3f78ed0d5942d095fa5556fc8bcef331ff0a6d5d1f4e6c51d4ff5af +d = 02d635e12a58cc6dea44e71e87c37f91e8d08659f0b7955d24f65ab55ba +Qx = 1dd33d8224ffe63a32f2de5d4fcb0e5f1fca7ca2ade5b35ffbe75cdc658 +Qy = 0bfbe9dfe13f99258c787af82631ce2133dc73207c579b29869c7463943 +k = 04ef333049c575d6688aa04f87a6162185e4a57bb752a7f903e3aff86ff +R = 01ade04af08ea1c1877779fbf6335156b1a1437f3e449f07458d700c67e +S = 010fa82467d39e5ad51cda8fcedc72ee6a78dccd0c90544814e53ba9cb4 + +Msg = ffa13cd0f51ae2643d5d4edecb493ddd653e9faddcffc370e7e958abf726a5d67a2ab36cef42ea8ebe22a6f01b9c31f6ffad01e6894487d979acb5e618f765ac0ec3550ac5dbbcede8f9fdbe52fbaba5c087ff382b6d7a09b2b5084227d324d98ff98793040884799b96d2ca593201f4414f18c43b51c53c5e5059e0641aca02 +d = 0073883e5064e06814fc4de32e15f7a6cf825d2daf6eb1df8c83e25d80a +Qx = 00d3c79d627ee0d2d88f2de2dd082112c20dbc5ed66089454f7b8fd9f81 +Qy = 1a2580e779753bcb023acba1b0852492b989c767f664c7047de8e6689fb +k = 020231e05166271f47a91dd883c580ee313e9a07195ae511f0ee62173ec +R = 0303eb4a0df97577c4cff531b3f54aa282e76669c0c5ebf4c9779c9bb82 +S = 0692432a7dfde09db7743f08130b3d3327dd98cbdc323627603518f70d7 + +[K-233,SHA-256] + +Msg = c73e3dbac9513d0361dabe94071faf03a11cba18c06d131a172d5f0125b01a5eeb6055bf72c7106fe3f4be3bd2b1771cbe7f85366dccfbc3bac20538510c3f51179cc540ddafb2f3b05a0d276899674ab1d7d8fb4f6838f04e4f9e26b8c6af31540f63f4953c85840af4c57dfa78c704f637dfc8dd750fe45e2c1e149986d127 +d = 01532271bfae8d4dfe60f69b88d3006d58e28aacfa701861cde8d624db6 +Qx = 041c1ca965338976b4c45c28b1cb64836b3b4d3e7ba2b1323ea26fbcca2 +Qy = 1a177d042fba7903007db122eabc459e37c2c7fe82e42752b267fafe4b0 +k = 06a54894825644901baf2ec3681ce5aaf93a18757d93ec9cbce7ccd9d65 +R = 03edb77fc7686b520493604db18fc69edb4cad8195a958e27ef289c4bac +S = 004337ecfac57abb9271909aa43ff4e32851df7818dcd87216d051189c0 + +Msg = d00dcd0f3212a3167403abed91c20e76f5e7a7678a4fd970f944d11e6a8cd149d0aa6fd3164c5a74c0f55193a4fa3d8ba6f99cabed10544625a7bd92b3e0b46edbd4a269bbc10518c5268c3910a2aea567ccd32d4c7a0cbef09ea42c20b636d1f711d220e23dacdb9d1146e0494401349749e5ed88e38295232a7effbae3aed6 +d = 0550406c0db882c6aee6cf3b6baf377375208c3e90cc44a067cee43efcf +Qx = 073348eaa8f2885fca3baf31830a2b28bfe983e3046418561f62ac5d247 +Qy = 0033de5aee6d0bd4de286f1de1e80bf72e5e17083032bd4dc24577b6d2d +k = 05c0e7ad0f9bbd522c862326a5734a766423fff7efbe57c51c315fa574c +R = 02103f1a0200883850b6476c7d7e7d2b3e2f60923d028ee6f8227b1ec48 +S = 007cbbc3c6295ceafb3d9cf8411f85a045b11ef8472c5ed45346d26192a + +Msg = 3d36221f87157ca4db84884b8666660c4e2b6af330480c516cded9f3bfe132543626a39bb6aed1964eb5c33ea0b95b9841665417679fceb95d199d55accfce35dd3f2283c1a7ced57d0c4b9ebe3da6e1ff2f979b6440db27caf9f6a4bbfa47e20d29ae304f4d0551fce9cc4097eb2fbedb9b24680bb17d207bdccdbe799d5b0d +d = 0257dc63752920b6854d6c2d1cca68589a38418c3d036e73760a12214ab +Qx = 11a42e9f66ecf030d0446cfb751136347d4df0ee4e031058ebdcc04df80 +Qy = 0fb7161fac8cc5ad7bc4477a39350e419776f76f184e28abce886ae9cc5 +k = 00391d36c4044896ddcd68604d5f677d1df298f46abc00eb12f1165e8a1 +R = 04e19bdc6755a603085b66355256bce98d5fdd49b4f06b628e3e185574a +S = 07697b29ce5546de969c9c4bbb5ea65f712d6cda3410f3dbfa0cd5b1a8c + +Msg = 033d82a42d0eddf58fbe3e91ddff7190e3f9fc2b1e2eede977d2c0473b358b5fce1f981ca6f88fd61ce2f79e453e3a2b77d1baab2b970ed28d5dcff58873a620e195085e61c4b8480d829525a1a944e8a4b63352f0291f0311f1f98ceb262804beec1c74947618f8e3b067866255878c2502966cefcdda4f5fa2b13d92ce7840 +d = 029025352297a7be850f8852411c09259b83219135e0e8949c1bd5b94c1 +Qx = 184345e37f07077cc8df5947c1b1fcd8404b3c31586d6ebd91b240cf42b +Qy = 19dbc9091a5d282fd6e62c34676a06a425e098567b990c47e61ef14d77e +k = 02b2663a449ead3f8cce2459e04cf84333376624d994fd9312401ae57f1 +R = 03af223fd3a6b6b240e59dca83ce2477a577494438ddee3fd09632ea67f +S = 0606576d89f2094572f0bbcb58a15d9a4bf10ae3667d4e35cdd8da32102 + +Msg = 671a7c81b64b2919722d7b258bdbd90165bb757b53106e0af03d0eef27452942f40cf52bc95cc7f6567df2613cce795f8bcfc723b2735efc35375c001d37c58480d89343697146b524835df3dbd333f7c06c98e36d3c4592ecd1f34ab57c341bb0f4c785f5b8372775f74b4bce60763fad1788e77ea158d735a64861320b36c6 +d = 02dc82d0e69e498528925c0e62a13fda9af8cefd047c10c3ffc2e41da3e +Qx = 0e5463926235ce53a85b489c3c278320ed986003962a5fc7ad4cbab0d9f +Qy = 1453e6edde95670a4653186ebd8246c28a94dd84f5a669bd3293176f1f0 +k = 034a8dfbbdc98bb1d9b175600bffd866306dffadcc4bbb6f24e7f918da5 +R = 03cf1407445cf1a619a280e139242056c23c58979f0b3f0aa7e1fc074e2 +S = 02e55f27593f2c76fafccb71493f14daf50073b35cc85f002528cc6d691 + +Msg = 0ef677f4799298f4aab73b7393598041f56e902ced1726af49657b6601a06186212e3ee8cd4bd33b760dfa2ea3c38884f94358d51dd479f2ccc8b0b352fa4e44fcfdcfbb24919d04e6ee1108527b8e8d60e8d1b467c30c18c5455e5835d483161d3fc26b4a67d6df9e3ddd9331247cb18450188752a1ca219f3396a872cb13d8 +d = 041535fff5d279bcd744b04e643458ce20b81df8a9e01b1181d52bb14e4 +Qx = 021e1227457be78e49db22335139a136ba290d34871f90ab5e6a8db6ac1 +Qy = 0df43b381a4d757864c39ce8d0b64d6a32e9e8be30f92a10a252d46a2e2 +k = 03019bd459b34133dc7331caa8976bee67f76db3a45b1793cb545e26c68 +R = 0025611bd4e3473aaea85228b2bf37eb1b4458d8166012aa098d9c1cab8 +S = 07acd38506e984fb7f1607b50837018f9b4246623dcfc9d7aceb486e76d + +Msg = 9290df0cc50c3cab6655f3a6de1f4cf613d9bc06ea7c99f38038369ff2fadefa57a3c7ae7940c1b98bb1d03503cc271f7a891bf38eec93c31dcec7892dfd2e1ab337bedde3e5325ed8d9cb7fa3096f6fafc3beb3a66cba66ba826d1032debfb4908cc9dded8c0099c85072daac4373fbc428fcaa9a6da02181ebc33f0cf926fb +d = 000ecfe580a624df66c25e87e7689fc3b471d205970ff9ab51a64aa12ed +Qx = 02ca7b9c98bb8106ae14a87d5f9f7ae1f99a5524992116e68af89da6daa +Qy = 0a2fbee769eec313cf3c8519d3f96167477f0f06dcc470408e3f637b6c2 +k = 044f065c49bb7ff0772d628104bc2e222f1fde42aaa8b9345d324d7f936 +R = 046301f3f07922d338d5b7d82104597fc50941e4bc0a15ab5e0408f9fa1 +S = 03495e335905b4842b97f00b344313ca7d6a4ff60cfeaa5d589e0a31782 + +Msg = 855c7be75fda372f062709827f333630acf28954a62a5193ff675f0dfeb63f32bca418f7cbdb346bf388d62315b19a592267ca407120db93d4e3d7125b867c4c4670b7a57a76f61734cead2caf2425eb9ff0a63293e8cd6defc9648257b401463f4533a2425e0024f1ea93365eeee3c6da20d25928602ec8b426f9b39f97f3fe +d = 013c72c73358ffa168423149ecdd897f0a5f75a641de008649f00134944 +Qx = 1c70e1b6c01477f95e718f193e13c093b101e9f16024082ac699ed6ebb6 +Qy = 1f8013a88264266cb5cc5bd38e477fe0a1aa49ae4a5ff94cb58439a7c1b +k = 07ad8a117f34bf2fcf7d689b8124e08118e28ebd172f8c220d57d3f0b88 +R = 012bc7d380192f2efe55625e39927ef799993af9451c662b562a239dfe7 +S = 035961b27e88d6731220f70e96d555f63853d14149df7bf6d24fc29441d + +Msg = 9c896f800281812ed57d31623d563377a5c725cec84313472b90e73f77d400f5d4fb236255741b73d46f7e5254d04099bec274db8a9af5fc7cc220d42cc172cbd3c3595c49ff74bfaab7b5e46c90855b611f74753ccdbbabf92e011d52e9ba753b83ed2a251a632e1bd5c6d346e38e743950c8ce0f394a837028575fa44bcc26 +d = 00ac60e2e70b7c4cda64071c7738f68773c94df9456a8ec3bbb468fa7f8 +Qx = 00109614a2ca27b7a749e53777e0f3ee2f57013ee83ea539ada6d98d8a9 +Qy = 05668f4b27213a8a024455b398de2cd7635cb620d7401f5deb4fa9ab2f4 +k = 00098489f0966e27555268a94378b7b8685ac610fb0964694aae9aa716d +R = 06d151437a0aac232a472af038b0fac095d224ce0e5487510e30c31d605 +S = 0563dbfd021c1b77f980530d0120e93c9ee4f1f092a268bd8aba7d3110e + +Msg = 139a14ead998d1a962fa47c47ef2953aa136bd912fe940709b8c560bc2a0c4bf8f3aab30a8e21b7d5f487d30b0097e3da723f11b5cb4e8c5724f5a2fe0d68ee4bacbb85e5eacf18094d2a8ec4506cf8497836a4a905059a998ea750adc54c27c69cbd0b0c1f9743a62f3d988f3fa0a9865a73fc071f526623085a2ef12838888 +d = 060bf720052e8b9508a801340c213cf53bbecf4975faee63d4b44fc647a +Qx = 196e37671def44b35c9e8c719130389b40c7ebc0ed5ae354dc73e0c40c7 +Qy = 0d3fa0a45a3cc5dfb61085290f6d18d710ad5d0d3ab31ce65b0e6915a72 +k = 0729c7e1de10e92634857a65a2ed75103df6bd4bf63b1ad6383c37a0435 +R = 06808491ffebf088476de7daf541bca3fd943d4c2089b848a130abdc0d3 +S = 02c0dcfff06a07e928c15a1fc2aceaa4b4dd6fe8eb67ccd4d01240f249f + +Msg = cf4a8e754b23d0fffc1c5c80b0cb11deeaba3064b315bc2cee96db5b9881baf90d30af4b69066f757b3020706def77a5fc1632d96bafba22a9c8cd3b52d535d941b3c7cc02b7fe6b51639d5e2084478ab3a29d2f5e0e16639fc2833a47b58e2c3fb5b2ea1830fe2ff68e571a8f281617a23d9a28db1c64ddfb1083d055030e5a +d = 07cf3c216592febd8630a478b5b3e3a605084020322adb13ac0a626bc7b +Qx = 08eee2ea13a08d4e4d71ecd2547f6d80b8f88879c9edfab5a675831fef2 +Qy = 05117c0d8a0442ad7b95cac1a984dfb9efbb7eb3c3866955da60e6cea8a +k = 038de0be25c23cbde9ed9fb259cd9a06b69bf15dafed723970dfcb91307 +R = 051c9c5fe50eb81a11c8e7b2db145c6b5dbff2c51def56f4981774c357c +S = 053887c6cc2f21bff461c9182c17f634ee2b301c3cc4af0bb1d3075f74e + +Msg = ae64030d4af9b36c8d3a6af0aff34e5ab201df04274691fb420b7d5c40c401ed7f3ade96065d34f2490d17943e27156e7bed83cd7222d0d5a73d167855fbe7ff6c3ed87f20986ad8bbbd80fed5f9705c6c783b423f641d40ff1f367f9648af5a79ea3cea0236997558bd9dcb011ea4dc64d61ea1e1f85b4f696ed586bc7705be +d = 061eda5999e5a9ed4485d2a0ac5510549b76ca37df858ea5d95aeed571b +Qx = 1642d56359cc0a5f261fdc405030d45b0d6f9c08a182d354bf2687dd9d5 +Qy = 11bf0dcbf62749a99e4b02b284aa7a6479b59b363d25319a5315423a589 +k = 03094fac5381a1b31e53f43a537d9e22ebe6bd2c149f2f69d792bd56f53 +R = 053c8c4f9a30e0500e01100bb97c00ce98f5cc6578686daa1bdbd679373 +S = 047086a88ea014f06d6345608bd0a6010e650b9f6f984b6efea9a4fb277 + +Msg = 94a9d9cd9efa3e4ccf2a37f904dd9cab5624ec9393cf8816ea591c5e70cccd2f105388ae133708fb974998ae61d218c71785f9eb808d1c28d953cc7eed00dd9854b6b4568c5ed5ee3df3b58a1e04c64f1c87fee4365ec9aa41b08a6bae234dc43a0bf2f61420acdb891a40f17f246972afee75a4c0b249dee0fc8f9b9c8a243d +d = 07e7e73171e4d2f2989dc024757c186485435b82544a448f5cfca05f281 +Qx = 181c8cf579d9259020461184979757b097d5a94245a2b9a1f8a6931ee0a +Qy = 14baf1b761a0af3dd9c0521c6489f9a778da824283c94087698daa7cf78 +k = 02b57fabe6b866fd25ad8802c6b02b680c137ea9b623457b35a24d5a5f3 +R = 07421dbfa83859354345b9c3f1ce6242605094d924a4d38c7bd952e3910 +S = 05ee48a3a5119bb3433b53a625101492216421ce67fc04dacf947ec600e + +Msg = 4db998df7b90678b8aa4ec6233c9b4629800ad1f3e2cf8f7afcac62fc6982dcb290e44587015eca8dfe77dbb4a80f9bffe75b11e961e70deed14555db6dae47d49e73004f000eb8677c18f7e8234bf0a5a104266167a05ef07152e7acc2f0368b37efe69c0c2feb51eedf7338cf9ed398f066cf1f66bacd89ab9376d41da35a2 +d = 05f7270764a0444c7159d2db867930fdb0fb9fa6b8fc80ca02e11753095 +Qx = 06806c7164a09e11629e16608b7312d9d988acefa626fe8e34e03203d11 +Qy = 19c4200c9522618dab8a16e217beb3011599ed6cc09291fe9d451f0cf02 +k = 04a8958c80481a18c6e0893da9ab2d48fa6ae30a0f1d0512196e658eba0 +R = 01d301da51eccd15e09ce0bc2d0bdcb215a43ed13792084e2969260d46f +S = 031f96a2f322d27d0bef23ba7c457fdc45a6e612f7d13e9277d36c8def3 + +Msg = dbf9b8a4ae316bd2df0c80db1cb5d7038364a2634925ff957d7c03511b57d486274b2ecf191746827c325a14dc94daacd66ad86d369e3f598f176c4f0eadec7e9edd13e34043efbe0a801b75b8186b4a6d89ceae4fb250ab570d65b6dd7c04382738fe3f6f6c867a7d84b35b20720cb0036a5d81a87126f236833831d9ff00b1 +d = 0179b924afa4acf30ecbe2b3c12de533a1f9675687876a7e5e5ddc8e03b +Qx = 175bf95ac8e768727d3b4a74c2b8a04b221247a3b8386ddf35fc39976ad +Qy = 122f32f941066150c151b9db92b86f86a10cab0828a77e4f0d5c4026540 +k = 0210c75a63699b424585f65497c6e46988c28eff3e0977e3ade599581dc +R = 06087e46c0677e3ca64a0cf030236583935d0dc03c896685dc6e446d9e2 +S = 0252e42b8f03b085f38c6849bd420837d985c9fe14750a654b584c4cc5d + +[K-233,SHA-384] + +Msg = 986d9e5d636526f4deb7545c037fe81b09c74496ddb8e42e61650c74b6fe348593f0cf8f8eca5e839baf62f17bf6ad96ec0c71dc44fdf11259dbfe7499157e402f6bd5076972354150723afb632799a990c44cd0a4fa9609ec4db133e3b4700be3ea4a338e8ba1873d345e80163ed60d0de274d7617a8382980bc2138b0a2a01 +d = 02c9eb4d392d7f2eef606e1861183acb1fc753d666225f0f154d9eda147 +Qx = 0d58fd7b5aa570b1c4b2190ec413fbcc9ef44d33ef191b6e23abcb38690 +Qy = 173e85377bdd8dac58222cd1d0f7ed98d73d6fb6c2eaf34819b08ececa9 +k = 064f9fb13784c99185f334700ccfcc4ff60b7f4d613c3de6dc5d1b8dd5a +R = 03bff54e3610ade656bbe002867168db1b521c49225eb9662950b01955c +S = 01da3fd8c08d8e17692059c669da3c7c4c146df6d3cbeaf34598d28eaae + +Msg = 68d0be2883598bfb1433886aff118349157708690380c42b8919859d96db069c7fde6e117a3669f2cff94a0f1b66b27b09e3f1b24d26299e11552a084be428446f3174da2e0414655bdceb38e58fcb065b6661190862db39c6545dead34a03584632e988d0459659dc7c7c78d4d00fc2aa10465cf24b2410f14e2a62173c9962 +d = 024661c89b77b2c743cc175a6130904461138ddc4ef771ffb9fc2c8679a +Qx = 090383de7ca48f1e71a43845565a9f0c53d2c9f8c2e0f6c4ec7eb6437fc +Qy = 1676582272e7ebc9fd56e1010a570d744ae4fa70eed3e6eeaeb0e0eda7c +k = 05cc5b36c7300a1cc3f624e9e663861b4e296f7e7a27e8f8f0a2d54eecd +R = 039c6f5b484411c434ee161ebeda7aa21b7bb26bde0301d9ff92921337e +S = 02aaae737aedecfd5d53af56ef154ac6430a45ff03a3495a34a5fe0e97e + +Msg = f0ba0407485fecd7337f4b22236533a926cc744a5f06dd08276750196f1bf7ea7984278f789f92dd07e36895a8bfe297ea43d4a1177c0368900e3b969d3083cbe626f0e27e7ab38e185c923dff46d9ba187b2acb9cf4b23ec8eedbb8044b96b5263d956e50cd6240c66d5d96517130c743752404ed09473f05d0004dc5971ff5 +d = 0065e20e5ce534576d7c17616cd4ede3bf4f500894850723bcc9f895f4b +Qx = 01413f6dd5349e94311f1d25e400b69c0f0ea446294eba4bbeb10278b85 +Qy = 066a05055d856621161d4f0e33dac82e5c0cd91ed8aa56e9abba9ec80cb +k = 07377147b59dba008ed0e6b366e511f94c7f7c9088615c6d46f46736b97 +R = 05515a6bdfde3b4b78489194d39f4bb439f58a6b3c3f9e16c8a71590b14 +S = 00778f79083d11efc8ff959f607c4cee7cc8f38b855028ea248fe291adc + +Msg = 3827276694e413c886129c452c9a66e7d09dee84f5f09bf34e4baa308b4627e096c7d45cf6ef45ba1d9a4019a60399feec10fa80e333e2aff1251c85ca48574d9b9e1affb9666828dff5afcef3edaf5e8cae823505a0c73afe76c1bf130399fb06b092ba34ab0ae15ac6c682f9ee8479b065ce75b57213b8aae0f55e4e386de5 +d = 014c85f66fbbd653f1e4e590cffe62c343ba6062df4b271fbd02e5d42f7 +Qx = 18930b4a59a1c0e92febe650347c49e29a4e83cb8c507e30ad835dbc94b +Qy = 0a237bcd130235e34b4439293f15e7a3913d659089e38e5619fa52e3c0c +k = 03c1f8d076fb4fbea91a97800607b2db3fb5a45149c0d30dce79f07e963 +R = 04b9d2c66d8cc55b64f3f62dc629ce8e50ae0bad8a4d14e8b6567fc87e4 +S = 00b9dfdbeecb061a455dd052258f3828d4b7174af972c65bd0043a9776f + +Msg = d1afb8965b48d66b9acb1ece674d9548f83395275f2d8135554cfcc7ceb96450d850dd874529433883709483d0743798db5e0dee955a4f30ba328c7934b8dd9207f3c336cf89141a175ebe23d2faed629eb4236a8aea8300604c3eb7704512f240fda66acedf1494a85058dc6a31bf9531958c332b93cfe5545046876c6b99e0 +d = 030ac7a78593b570b29f6d3d267abb6ba7e5870ee1c8ee4f1ab2f141051 +Qx = 0a409e90eb4314f95967607ea3de9817a0fdb439cf406135262624e7fac +Qy = 04b1dd719434e8dfa5861887736f32ecd635878ed4b9e290c423da09059 +k = 027c4987ff872fe499039b4432dc889960ea8e3f07be42e36a5827b3964 +R = 06829b5e02b5849689d152ceacdddbfa8f68d782b3ae8da23ea48b1acbd +S = 03dba0d2b4400495ee098325ae4450b32b83689349e82a69b799dac2cbc + +Msg = 4f95b71669fdfe5dc46d4b951b085e099de349fc740535175337127910acf24e9a0e4b2f23196ad23880da47b740d77d74fe9bcfdcc44dd7d8d1a181ac290de5cf4da22d5034cda3d8020bcc776dde8cef1786c9ce4d2c2cfb035da61406af745efb7ef1a55f2eccc5000319cf1d6380963025dcea641cfd15a3106751fec286 +d = 06d7516aa040f7d559cae248e485834e8d9bb608279ed4d4f7e1dbcd2b3 +Qx = 127a92888fdac8d4ba9c0243c9aca516bcb431911254bc2cf51883623a1 +Qy = 0606c30fbb9958fb1140643f32c5dd582c2319f71bff197d58ba3e598bb +k = 01104b6ad82327b0445e75cff0efa1281d266a9dfe4019ba2ed22dd6976 +R = 01f247b2850463e362ff8879054d3459b2cbae84b9d4bc005a2ccf4736b +S = 05b3dbdf04758d546e54c43ca5973bd8ceba646a4dd5d17ae5d2f8ec516 + +Msg = 2ad9e17780c824c4f2d1e1cbf19ab85638f2f71cb4fa3518f08085b8b358f54d4f08394a5ac29cbb3cab828c5f07f41eec51e6cd61a5f2cf44dbfa46834370cebdeb328fd3bf681e61011b5c2ebc8945ac7a2a8467606051008b15c89390e111999255bfe28634ce9bc2850a2b55a4af1c4c2f94403c78aba1ebc87386ab7b32 +d = 0137050d7b455f43a8dc2516cfff5a91062c1a2727b27df41488f3dcf18 +Qx = 15ccc90a5f3906469e3ecf7a70c429f5b50fd0ce74065d41f1bd6dccc1f +Qy = 0fe5611b8b1b35a907bc188ad2b1fb7507d1043d148283911af3ad782e9 +k = 04881e879d7c76eb2ee61fe1844567316d7efaef047b96979e6dceb7858 +R = 03799e90bc64cfd7d0246a7fc89a4d8ed0399277cab2af40fa2ec8196d8 +S = 067e8728f4d8398e4e1c25775620865bcc2d4cfe635a1f4c6b7306f6d9f + +Msg = 958773c37d3eba003aa5c489f72118b3022c52b93399e9d8001695664918b86893f4922c7b6e55b1855ed0fd1d8de5dc61af403ad660fec60d7c44bd0102c069957ed804d0d416facdc1a95355ef58554606579ef89b1842f1055cfa2ae118abbc485356824cc09dddb77d0671cb3011b33bc86cac526e3f6bb3293c7bdca1ff +d = 001fd447b33a2ee3595b9f885c290d241422afdd74c3dc4981955a7e9ad +Qx = 0e706408803188263cb149428c60de57ac757f0776e5b27a2d5a859f58c +Qy = 153b5e13f17f0178cd90427f7d608a5659b9e03effebc89da65d59698d5 +k = 0339300c00cf7e8c6195ffb71e509613018e6a417782e4f52704026a510 +R = 0227c80e36e3571e1c783358c9ffed237b251332e8ed05a8d3b454c53b5 +S = 0679a32cee8ae001a18d9a9d0ed7e99e5ae67ffcd54de7b48c62e76ac8c + +Msg = 9cb2c496b1bc7f040228571e005e7e936e48e8f469e295edf914f5648701249a20bff6b98b5e862603dd9f12bb71c160aafe9df02e2e383e9b8a9a9d700f4425ce408feabbf754be543f52204c849fed6c9d3e36e03dfbd9e35c18d7bb2295f1c484a66e73440a0a5aece5fe80b9ade9321ef18cde3eb2db15e4b18e788b0441 +d = 06a061e10b4a6e7001d95411cb31bdea9c84670a59ed61b14fbbb05c8e7 +Qx = 00ad2b726b805919cabc90d058c78896d2dd8a78484c1fec5bd5fb0e07b +Qy = 07e048ddb487f667633d6d030338ded21a2ac5f65373ddcfe1e4a3424ae +k = 013b4a86b70f0e4de6efdafd7ecc993f0d6f231b3d743ee5adf82db1515 +R = 0541c2d3b2c6f0655dd415e327f0ef07b03356f8047117c41e704169698 +S = 00300f45026200b8cc84fd564778281bd1d7e03727c242a249d9ad33338 + +Msg = 9a4bc0a029e97742ed3bca207d5912cb568e4403cda106b00247520ea02008b14c041b8c9b976294252da835f4ff27456039d79d90315abcb0b9b6958a22352672e229665457ec79571ca80447c8ff2a86e6af3dabe7427c8bdcae65e3c6746a56079ce2cf8d22235180f46646a21cd9e86032cfad874cb9c67f882fb037a13f +d = 027ec31ca31acb4d2fbacb49fc085f1261b0042cc755cc97f9b199e7a37 +Qx = 1d521f7abc2fd3b0a10732ed641cc1b7fdd7b49cf61909b215220c5253e +Qy = 019e9095c67af1b89ae6c486c4f9889c3f2994743eafe55bd9eafe438d9 +k = 0151aa44fd97be14578d68f87dbb884c960ab59d950c392e607ecae6bac +R = 07be427f46958538004186d52aa50a0f83d184a9d2f4da2974163854eec +S = 029d4ea73ab5b336ed44556f6944e734e531a5c71dc6c929e7253323906 + +Msg = 8d89e22cf802dc68ff22d43c436c79311e705ff6fd845e77c880f399f403e6d5e9e2b35511553c978171189e288cb2200fd95f84ec5ee9865c0eb9190aff6dacf783ef200e82027fa992741876456472bdf27f2bd8ee55db15408c957a120eb64cd24d299818726a73fbb0697eba726a326719765735b37a2dcff0c853c906bd +d = 04c6f4d88e5a4f4f83196f2dda9dcf2a66eaf94d50c851f59bfcea1d876 +Qx = 1e2677c1305f545472e373615d195d1f7a315f592e26fbbf44c42558050 +Qy = 1638140f48bad525625a87d0e537db5500f034e71e60e8a8c48eea04108 +k = 02185d8ec6f35d5c3f965cd00597d93caf45bbe186d4128bf877ec304eb +R = 075199f4d8af090e4666754a7dac0c1599c207735c0f54c9f11e305727c +S = 008cadf59a224f812d64c2f492e7ad4a923f3463b878dffc75eca5f8fb2 + +Msg = aa1bf5a79e5339fb9ef6c2817bd95725551d064bc5064d6586c5a879901adf808dc2ef7c78ec3b434b84569988db58b5e8e9782b1cbc2cc7c9b68e66f32d4ac4ebe7e75b345f654c7b8a5e650acc9f170f75b7aaa3957cce248cc69cf93faf8d72abc6fc1cfa9ae2d18a7b31ce720147e88e84f6563b2197882fe302449ac5ce +d = 01aa169ea84365c22981bb766bfdad27e373440850569957544b0f9332a +Qx = 1f97d91302c70798e2278348e36bbe01587e0031ac3c422141e3d4c1504 +Qy = 0a95108f6b7ff41546c98f4ea4d1b587a3280e49c6cd0d33abdebf9a1e7 +k = 03c9efc0f72d88168c2b1f7fa1c6e275839303c2bddca136dd19ef446c9 +R = 0639d1a1066465b4b2f443cd9677cfe3bf5bb33e3e9b14cab2d37f4a859 +S = 04582792ba78f782f112711ceaf36f5f0774b92a6fcaee327d687658835 + +Msg = 475664d5e22cbe0da0d0289ca9a666a37270dc71c81cffac91f6229fa39315c1d55f7e0a89b6a7a07df7d391dbdf8fb7af63d2da46ecc3b60110dbcd842da97f98d2b67f562b0364ef8e1c589519024177c8ea079794f271f6d35554c0e9d0a39062383c95721b72f4e74eaafb6fbfbda02cb670a7c4c94f67b8ebc6442e84e3 +d = 04a665b92c0c33a3f8b9eb4b0ec061d40b603de36c87096455102ffe57b +Qx = 0f0ac5238553f0cd74e6f34f7f82563cb01138e5c9bac6d5e7b8b7ad4fe +Qy = 1903e9fd8a5a2aa32913b18bddef20667061f919f8d61a5b3c814ba4aab +k = 070ef25950a795b5e22fe4cf5402f49029c5d97cf9f57f0806c0bbb5855 +R = 01248dcf1993ac2eeacd062f853ebb4b2072357e728f0589258399ea95a +S = 069800eb2e2b3a9162196dbaaf67cab4ae123ea817f223acb6e889f6d7b + +Msg = 9e5397d94465390a82a3c07e3ebf21b515776d18b4463aa5810e6b2f96ca61e92d13e034fa853c3fa45411f51f79df6f799a2c6906e6a5b7896a4576a4464f9e0be2b529a43e1f503fb640d79db6b68f3a3a7deac1b5832fbe86673784ff6db1f8438f7dd332cdd1e7ad9df8b6731aad1b6a72bde52e6bc62d80b8da57822c48 +d = 00531540d94823e19ab2b95cbc6e7492e1effcbabce875de6ba96f53aa9 +Qx = 031ba225249916a5380235220b9657162eef43d59ccab507639e19bcd6c +Qy = 062e85d61366a73b62255c741a065708701c8fa024a15401a4cd58640b0 +k = 05375df0a23646e8033ec9e3ad269e7167a663b97b4f52cf18fbb5f50f4 +R = 05bdf7d643ffde5ea191553a9c99eb42fba9a8b6e2013dcc520298d224d +S = 06cdd9e0d58bd4c5cfe66589ed7c7d15331f3e164dff562b6971af1a41d + +Msg = 3cc4c4192f317e52df6f8cefba6d4cd823c942aaee11b9a0ef5de5c2d181073b7085a55805e9554def8dc13eb978e7396044d4f4a14be2c7605998c062095c929b9c23b2b1b2fa73dd19a0c0af44ca4789f9841fa62dee8a5f91b3cc4b3264f5f67334c3f0772b30bd7431c3fbbf1f34318ce1889b6e8a76ce6d42079a451e56 +d = 022a89addd8b85809e87e0aa2c038593ec277054842854de1197833a51c +Qx = 08e760b282d0ae4eeb2fcbbfdec851468fd8e04c4dec71fc2d5d3a98a13 +Qy = 0849a56b9b0b0a1ede6b9f9522685e7ace3baa57f72709aba705814d138 +k = 05515b025d6196ffdc8bf275479d72b29a752eb3e70ebf07d4c4e7bf74d +R = 041902f9b7bc81d3a88066b03e4111ad8ff4d99dd868d5608d1f43eead4 +S = 059adb96af9f404d2f04d89fb39cf38ba5689f47bda749ae9aa1ecb097a + +[K-233,SHA-512] + +Msg = 72cdef5bdf710978e0aa334b86b8ff4a58630da314eabe98b4d611aab56f55c526983d54d19bbbf9ddba30a84b18aa0bae9f9503e9b222f842f084db83aa39625403213ca321cc0d9c8a136c826e6ea4ec108b913dd0a9ce9d5b8c7e3af53c3876e56a2037ebd6d99f037a097111c837647bedfe4c494e4288ed6427c15969e3 +d = 01df252a11ff97b4421b3a2361db94e908e8243cd50d9179f9e03e331f1 +Qx = 129f011fd5fedf3526f0437ae800a110435db907af60e16912d58523202 +Qy = 08026ed86afa7ec80277f322dfc8cf693089968ed9ceb8c95c930415a23 +k = 04fce14bc83be6f862f06680a32e9a51d1a569fdf1d9b10a89eb9fef4bf +R = 04d7b8d19dd9cabc3c2245a9d2c8431c3151eeb6f49676a865e78c26c2f +S = 0373e69da1fe35ce41ff344447fa7ffe6fc71e28dc68244372745739fc2 + +Msg = 8e4eb88c0b2d525b2c58b8e00f32def90e6dd382301de49e0ac053dbc6b61afe926d85193e2c4948f7402a3d7c614cb2c58e060362b0516a1ba4a7425f1b3d09aa20d4c3c8993a387a3248aeec51e6efa8f558dbdcfcaa13ee08413227c8351e3107e9a3e3ac124224aaea91bfe50c11c1c8ae582e718f50bc5d5c06076517d6 +d = 01d7125c299ebd0dbcc050f07de931c7ad0450af590d0a2d0228a66ac5d +Qx = 13ebde8790a113bdde87c11ccdcbc39e354b193d772921b86657f53f74a +Qy = 0aae910b0e22f1a2505f55fef2eae47ab6d47db6e49190a5469b4b6dce5 +k = 0113d1737bee59f9f477f71f77a0ac1aea86aa67002c34a1b31c421cd7c +R = 066f9871da9a22f07c9b2a44fb6c01ac74ba17649cecc33b729afcb488b +S = 037fad90c288510d0cd8e99e5d930f4fe197df779dfd6088da48986c601 + +Msg = 370fdd80f330311dbb3959666001bba61cdacf20f72f78953d946fa6cba02d24b5003f5452d535609e489b9434f192011f99f918defe877d51349870e7e75502f61145f7c261dbd2a0840926d824ebe9be3c5a77a3a84340aea930378367ed3615a47e3f792c7773f83f91ebea718a05fc62e9ed1d78629b2c27ae44fe8f8d4e +d = 021238e66119844b146d40e48341f522f6ac2f9c8a0b33aaf95a3099a41 +Qx = 1dc3ac1ecb670f867337b752cdbf48bed9f32589366f7c6ba7424af1d66 +Qy = 1e3a38ded8148bf45484ab6b77e0beff759812493347e32d2d54a322a2a +k = 03626adf8e70506e74ea27ce740f7eed1c8b37d50415be6a2681c67ad2b +R = 07a9c9056b51f1fe3e7733c6f54ed96662aa7f5a08a961f91fd6d0276df +S = 05e7600e9fda45bb966fbbb5a9404af961058a128824b6d84d9d47ebdbf + +Msg = f86c4433787c3ec3cb1663389ccf53d62f9425274ccef05fd14b1b8fef676208867764eb98d16d006ee6ebdc27b8d9a8ddd303d941fdd82b630694cdc698bbe6bd524411907834286c94b24ee199fe6d646064277f244b7df3ea2d9d52a9dc6a33d7c8d6dbc919da0fa987a67621ef0829e48310e0ea2bb86fedcf4effc0b94b +d = 015e1bdfdacd87c42ed439f3e243abf27fd42e54f3ebdfb47f60dbae5fe +Qx = 0fb7fa51c1a96baab65fc85c3b769ac84ca7b63a1fe9f507a2ee0c49395 +Qy = 05d450aed449f8f1aeaa9df0131f696c2bcd4528808d2f52b6a73f72811 +k = 070ca3f5dc30c70e576e2d2b30935b05b6e68598eeaafa1bfcb9e156e05 +R = 07e3cdc4207456773aa52b44156801b316a7ac850b3a9e717a9ae7fcdb0 +S = 07ad6de3ba8730ac887f045cae80fe2fb5237a8594e7125c4792d478594 + +Msg = 4117d593aa92e3eae1124ec7482737cd3573fe5f0f2a5051a7ce86946a2abb9e47a0c6ea75b262689b0b486476d2ab09a20efc2fb921419b1811b51a2e15891ae9e45a17ab4b96c665c6c423fc00e2d66df5804a164f0f3c958df6f25d7da6829b1fe162a0a8cf130858c83f3555d6ad627db70cb41303cc6380f7b3fed2563e +d = 00e09410548c17bbbf28a68c3963a52d39743a4f1ac28e6dfe7a6ede281 +Qx = 1f5f36a21a3b7fc5ea37528566da695922d7d9b7e6800af9c1a00f68242 +Qy = 03df4e2ba0c8648cb1fa19663f31786b850e6b80068b8c007f41de08608 +k = 03c0a2a4bea270eaf66adfb297c0e3213254cd87b11edcd90cfcd6f3104 +R = 07b684e337d6778f84bdb7a6835e91877b41d6af4b76311258fbb8339d8 +S = 064a0c22057a858b153ecdf4d275cf5523dacafdfcb46423b5613c85691 + +Msg = 882ecaff3ec8f4023df5397167f238869f78a5c499be19aea85c7486e73f66f0e08e71cf85f3f1b6f6a70796bf46a18e6b555a0a87c2088640ca73051b3dd59ebfef922be0372208fce602d8001681297b285701dbbe24ccb42541b5db4aac1a1c7f407e11c83db15b38cdbc25e930fdc6558f64d9503e214571a435d890169b +d = 049f5bea6e72d98579b78cb07d89f64503f8759dd7a73cd73713c120428 +Qx = 0974dcd68cd85117f363812a0473e972c89551e31c74c8d99f1073eaafc +Qy = 0f306c9051cf3b84803307beb3dc0d34a9758a4f535100e846462a49053 +k = 022a5564b468e706762e3ff934aa22d9aea0bf2b116b61182c9f7be19fe +R = 02e050afb84e1b0591fb64d46dd7d4a939552d68bdb4213f16c5d7ec5ec +S = 063225df0057d5368b2e103eb2181ff5760e6b2a9c13c83da042722c3e4 + +Msg = 99b3b8f876f8359bd6369ce84f9261581c52d744b90261a1427ab9e447e6d833b6b3e89af8dc770f1dd55692d01c8bbc4277a729fddfa7cbdb2ec99133201dde44ac691a77904ca816feb0a1aaacbb9fba85048bc63d73506eb908ecd697caf582747051a3a38ac8930c9a4365f407ed94ca7f2d26913c53f4c010c7ed9d7ca4 +d = 005eaa818690d1ca4838f0bc667be5721d178c3869884260fb230277c3b +Qx = 1f7b3b50167cb2ff7482240bade95f2850a02805742e6e29eabf7f9ad34 +Qy = 0f8038a8cffa0f798a01e333251996662bc3c0ee56d94c392269b63edb7 +k = 064d518f7b8c87325d8edfd42a52793d87ef8db283606dd676be8584562 +R = 07128123004a515e277dd5b571e31bbc877cc966e27ed5b2ab2c16e881b +S = 051d70485148996ec30f92097e4a12b5edf804e03e312072336bd912268 + +Msg = 8c1a83023930a85c5b2f9930521b8b8963d5523a3323d87f862a17d3505ccee01246ee1029b8b8c2b608772c4096d1e914cb398f027d91184a8e94e4feeae121eabb504a2a35c8bc9294edd15ddd979946c14c792ad787dc2d4deffa284830fc90b3f8c0ced6a99fc6de7c41b9ed261402a6b3d702ff86a9392731ecc37430c0 +d = 0603d89cd2f741d734587e77554fe6bbb1e5739d5ff73084d4de8ed69c4 +Qx = 122f2b7802917e4164ac2f54033621c78cbc7040217e5ded6b9217f95bb +Qy = 1f867df743e73806957066c2ab45c04bf1af158e146a9d1eda9e974e0d4 +k = 076850b8ca9e454bdb320da624c0dc63e14ad279185e4f8c9e49905666c +R = 04bc63bafd5bad022fe5db246680a0a0ccd0b50ff50482d3849c92eec7e +S = 07b6d8a8446ddfc64392af0aa1763d45877023c0be9ec78db47efd3c366 + +Msg = f3c9dedd7115339dd3ede7d8d06a44de66bf80b4888ab7bc386cd40a92789042440a13d2cc90dbcacca5feeec1e0e3c51724146e2c4904ed6b05c7b4e9b49d7f458ada695c5d2fc36f1193329b87c1268aa38eda9151430aa0bc004e5d2a61b9390accfc699f2efabfec785eb34f52b1beff1e4c5492e922acc348667d2a3986 +d = 07977b3aba53616dac27b4d74930da23966a88ad98f1769674789c0be3d +Qx = 0aa61b4bd2fa9c61914ae306d69d3ade7d6cf621399e5791dda8a054dcd +Qy = 12e8d9274d5593f5074c49ca34a7e2d64f9d9ccdf42df6087134b811762 +k = 03b8ee56bebb59207e107bb0c16938cab707e425f38b70f0bc918fc1b8a +R = 068502a3e5e51f5481aad31eb6614152f4957eef1becfe3a297b023a94c +S = 07b6b43be63aa79c10876179703b69caf9b03c5401b999a3c5be4737999 + +Msg = d878c4ee0bd6c84652d7f9e68df7b90cc78776d8d1b60f3e4d7465032bf401f1527ca7bfd4a3dd916e13e93fadaa5e5f20c9f47d12f8fc922a9a3aaeeeef294c221ca1adf7df85b888faec8002f17ff202da1be837827619904121167bee2d2cd694a263d9a99062cada3399dcbfcb283597a96ebec129c65e0850ec4cb4e2d7 +d = 050cd20e7eabd29008cc977d0a17e1195d79587b8f15ac2447e15daafc0 +Qx = 01ff23ff4ea1f30663b17d8f1c67ea37b8c5df7009d0c0301db483803a4 +Qy = 0ec6bde92921b83d4d84be8a67a23e1718e575101b93d9a800550a20e7d +k = 041ba36d2e810e47c3de583772e9b5908c257b2aec232d855669d4dae2e +R = 079e96ed1dfc4e31774159ef311805b5f8001203cf37a72921efaf5cbe5 +S = 00b8abcd623b17357f65ac365301a8823365ab948ae3f7fc6a4a0b8ab5d + +Msg = ac3c118cc9cbc8eb3b74d8ccc9ecbd81d1996fb25ca43c8a43bffeb244f722b93c9e969241d45d5b81fda0b399f1e3623687190e428dae077e54cad1eff75ec2f7fbb9434bf716833421bc2634885677579c237340f76787b2eb19b446d56c0f2206099b81493349f4db0ecad0e2dbe85dbff7d7070abb3d3b12ef0cec828af4 +d = 02dbb24fcaf9f3cd5d50d209937f0e2d134fa20ee3c9c2f1fff3dfbf302 +Qx = 0a07240c52e385ecf75525201f9810859123bfd8ce04a5e8f4dc4ec88b2 +Qy = 09bd811196ca9ac45b28031b9f65f9a5c4ec497d995f7dec6eb06dd2874 +k = 05785beb1ff70c7bea89b1fa14be09332ef94b09eebcc9fb1150bfe0d55 +R = 05279bb1b1ad8174e88bec4c723d65eda768c1d08d1c64c332a240a284f +S = 015a90383c2c40ddcf721067b3435915a843f9c4708cc133fd1ee53f442 + +Msg = 700313698cdfdcf0044ca07bf9e5f0702ece7cc66e35decb28d5f8cb7e7e5367a95cc1728a90cc9a53a2b5fcd4702028b742538e9b386f5d8b4a2411579ed9553021a95bd00a73f03c4184a6145aaa367e3af76659d677fe7a2e98f9ddf4aa20eb8d1a1db72c3f5590598801be7ebf44255fd7376d89d998b7068bd1296fdc38 +d = 0047142197d3d43fa46545b547968680ec81688589d1ec8d7c7e90eb969 +Qx = 179450d83cd6dd1609830ec78011143eb64d2d1509ed1adfa085a58d786 +Qy = 03ee40673ac564c6b5732868d0f8a57727150a23c484228890d768dae54 +k = 064f8892245a198c9c819152edc168e69dc7b562ef1f54dcc1960cc7db1 +R = 0293f2f989fb6b6e7cf304faf3f63eef61ab89a626cf8152e15f38bf93b +S = 04948643075cea6413b1c88a9bf11aa176611f56d027f2b165d00d46e87 + +Msg = 0374673e1a685bdee55504ce3cd333f70084dd4ae685464a16924eccea34531663fda60229166478b30193459a3113253cd6494dc26154156252dc6e822552c7c04d790eb9f8fcef2ea8dd79e72f881f7f20fff93cd73ad303c0918ec27c6486c4da61f82bcd55422d16650cc68bfd4b0132c1e7075bbf17dad919095860d445 +d = 031352b49ecde5434aac05f898e6ce4337304845d748f114c14319fe97f +Qx = 187ae6bc9167d9c69ce5544ad650055cb9a4e69c1772322d5722e68e7e0 +Qy = 0042187e9d11a921adafc694b5cc8da9226ddad1b65f764274954b17333 +k = 0761189e63fc0c3b5db92b281e5a4bc0d6fdb30bd14f8e69ca85a211bc7 +R = 0453560e6e725a2bfe0383884ba3b3dd0816d8522d9e0762f781f6b6340 +S = 01aaec4bd98c765e4830de6593280779d1222918d4acf08c8fc3d0aa351 + +Msg = 8b237085f135d6e94592f8d855ca397c8c1028236a3b412adefdac888245874f586d06950ee18118f751bfe26f4c31465ec34b578caa44cf1b7109ac4f6eab7f97ff9699b34271df035d3bf58a2ed4bcbf7577cf8e5792b1945ebb9389b680baeb8518c8fdc5540e192aa4fde0eed0d7c82be2e362b286f582d65752c8db7038 +d = 0176f124c24e4420f6e726a6ca25f09dfa0c5a37e5bf879e7bdd36c3b65 +Qx = 098c37cbd44aac5d5c749524b840fd849652349fb3e02cc8f8fd0a23790 +Qy = 151a9a88da407ae41e52b3dad1ea6031c7a36bd834007c0cb1e2c2f2f0f +k = 022e299985cf289f2fbe2b1b270fbf12ba818cd2b506f642e659cd541bf +R = 0686ac0c09f90a077cb446c910e07fdf23e845487d0333efc65b9b84147 +S = 01688b18cb42082bea69f18511b0fd9fa35da83d738763cf13ef92a119b + +Msg = e3a086ec15574f7017b3cd5f5a47ab7a73980f11074333490dfe9f8ad8926f9ea7c82271aaa74e77133b1025b0b22a6900fbb71251bb6549341a23d194e79d03462cdad52ee0d1b6f5d0d14e1136026961fa3467ccf0864bf7ae3fcc3b68cb35df7324bd9bbe58fc8aa9f63c19feedf19d935b71bf5981c74fb2a487f84e453c +d = 0755c48c3dbaf71042c58cb137f3632e3cf9d90b7b9a58fd378feef3d19 +Qx = 0bd9a720553afbfc5349e4a65a21fed0444c30304f7018ec1ff6fc8d1f9 +Qy = 109a1d6b9cc4fbd0e888d0a2b6883fd06a5da347c0d4f7882fd29eabcf0 +k = 04fedf8785c6648798748504b1c9b6a066ab6606bc9a69534f93e908f4f +R = 001e71744a1b683858444da0d270f43b0d5644424f2b38ef48a639685b3 +S = 07ff8199ffe723abacf1947a828e8596dc49ce655319087e4aca6ca34ee + + +[K-283,SHA-224] + +Msg = ef90f85fbda05e693006e4c64e1dac56223becaf0890f73b5274e6e289a5a1de2c141b825c24d595b3fd18ca855b5c1aa60dac6b5356275b11be670692cdbe5f282f93ac7b2e410a96cb9e9f80defcde98f3449f99e192bfd62040421a0ab8f99acb85369f25e5efbf81439efa8a5e1d9cf781355a0f47b037b09fe4086389a0 +d = 1e846c830a8ec04e8572d1a9d2df044ab47352fb346f67403a3bf87243871b164511c53 +Qx = 12e43e20941f2641154bb66a56f2e0428a7ad22d607fb8af658df0b382bedc7d5ae22cc +Qy = 22f226cd65052071066963b112aa302973fe2b5fdd7bb827d13da7634dd2fb9e3852ddb +k = 03a76f87ede2b5d40a0f10e15e90e29198fc3a03943efea39ddf7afc37ed4e18832af8b +R = 1be2c776c707098438fbd0561de578e4b9449f955a25626f2fbea257fc578ffa1bbbb70 +S = 1aeef69983da1a535b10a47e66d890c4413c7a8cd6a2511a1a670a4c573d4808f46e23a + +Msg = a3ebc17c867cc9c7c28797f6364f6574b80c7ec5b2d8e1542a6f5db8568c15032f92cfbceefa3fe4ee654f690b0455ee5d38dd84bb8665ffc1ff8c849bdbc4aa0ddfdbbca4eb37972fcbcee8cecc1aae21ec736ef61781716b60247b7551ec4e552d0b59a53cec5964c67cf7988787cedf769eabcc9cd5243f58034d96f0e43d +d = 101c5ed48231a56ca0ea85eb45de0e395e6df2efd4987a226ae36489dd8b2dfbf7c465c +Qx = 7011260f504d809baefb54af48c890f94fa5984c8bf228baa4b6ea14d46372390d1a8ac +Qy = 2bbfabb680659aa2611435c4058ed773467a41cdda8250f3490e4f491f1bbae452c5c36 +k = 12a3c7f0b3d64614ff97133873d75c7c1406e316e8cf60d22139dba462055baffe6c8f5 +R = 0a9933496d60716a39e1c3f3bf22a7da546eafebef80dc6f25d0c109ecbc430fdb3e80a +S = 0be56197a0098b022a7914c10f40207da58403d6c7d04edaf7efc96de740cd71f67e0de + +Msg = 60269efa4d0ffafbbc655f6f00578eadce7fc0a7eb7db923dca49b6f2bf3e13f7f829cc6133e022c3c92143c075ab9ced0531a91e6e79848194ab98bb852f40c84e7aebe71fb8bc0fd1f97ed5bb6bad6783d8dc048df42738e841d978456e055e1b8a781dfecfce2218701c7af77e7894ccac5bfff360aab0b6136b978bc39c4 +d = 019679dc589440b11f82b3716e5b2a2bd42c3b1c83e88a28e304cf5148877faf760b4de +Qx = 743ae04e4b07d154ca0749a011c97a31ac68d8e1da3491f331136873598896e5320ddcf +Qy = 776c05891c27fd912267ac166bc9acbaecbf80ccdd887aded2d7b8c2a4a5d139833aad3 +k = 099ad7fba5284e406f6cf200a39e398aa0426448c09b95e691f653d6096a63adbd39965 +R = 0285a82340d9a6d96ed9ad0fd0916216fd20edf979df41a55835ef8fafa00d242ef6f11 +S = 0a8548b405c171d2a428507f7adda4944bade7cda6dc580b1d3f94e15d7e10f0a08e008 + +Msg = 59d704d5b1f3a0605f1497f22f71b8f45b26138bc86371f00a4517554e7f6e7fa5d35189fc656ce68bd2cb8510fa3e3c3df815dfdd749b2b6ac997d443f3954c7a927e138b579801ffd035cea90840733e7884ccfe43d8d3a4a26b430673274aae312abe4ac1e1d7c67b73580fedf2d8de46572493c9205ebf0e8b4d75ccc88c +d = 1703c21fb1e09f8947e12fddf166fda6f685221fbd803d75a0ae377a54a1e494e6c5e7b +Qx = 767564e13ae544dab22c3763c5d330a5571e07ff8f2f5ba3fd729379709b1fb184f990c +Qy = 27f9e5efbd1ff6ac53a6174670eb463b12f70a603354e25c577ea292b13b8e5f022ac9c +k = 10d875acb4d0dc211a82e78c0249e74de16768003b53830bf5648cf911fef6a57f8f048 +R = 02af92243b9dadcf21561ce32ca0744810478f8d5be8e0f83d9632ecd8e86ff467268b6 +S = 1f6c50fb3bdea228a6b623be9e2ea2c371dcfeb0e604ef1029b6766c43b193d86c02f27 + +Msg = 12c8fdba3bc5f68e13f7ff8e7bee876fa68a970afc6924314dae0c2482763ced8d4752cec29ea288d350acd8a06c69289ae41ad345a1b88bcccaac903f2bff39015c289a8ad608606bfd65270a7bcdb5fb10c89bbc2d16dcb91fc9735d66103f6b1f3575622cf4d8209290315b033ee1f79968939410f465a2d37add46af2d59 +d = 071de8eb14cbfb88e61b908990ce08b81e624ef4f2cd9cdf3dd7ca9097d5ffed9ae9a71 +Qx = 136d50e1aa8203a0cd2c2d545b81d00b95c6b43b74b1fba3a6402abf756d38087affd49 +Qy = 46bec77240de7bde85ca4345f27c6df341c72a4eccd2cd495e86376c183ccb34f271cd6 +k = 1d80734927505d8d4818b3bdf1aa2e5c557e5f717a5b3fb856ca9a2161bfd74a130ee38 +R = 07894bf10885a698899b118f57e7da22222e3d187a0aabfb99fac0ce0e134b6b44a5f90 +S = 07b4a87592004d6ef8345415064b4b4672db2943c7e6098a9e6d59ee3324847e753703e + +Msg = 26013a3ddf687bb2f37d9700923906f118d5cba5d8ed5113a0e3e84cff00918125108f74f4b243e351aa5d07fa7c6ece29f5700f23e50286447883d2a058c3258a12e4ed8770cabe627ebea7ef6e8c77811ed7d9a19c53287093e39226236587ddbc63b7ad5e7ad9895c64d1d03ee432d45a067afe27d4cca920ae88a7a68db1 +d = 1d156eb15762ed00c4021884adbfc2426e910b18a5bc474268196f4b74e593a8f38702b +Qx = 0a99b45860615d7caab2f4e9bc01196a61f52f95c6c7fef615a4746d48553692d5fcf13 +Qy = 56f81a0088dec1382f8a3a863901d3443c8792cd13ce13a8f63b02d107b66d9d23bc492 +k = 1999524ce9525d85b562fd13634fd9ac50fb76d83b9d72d6976d6fbc47af7e1f354eee7 +R = 067748d49389c9b87a85b518f84f41b18f52569ba531985b8fe5e1f0cf9cffa958da3f0 +S = 00c44a583c704f69160c6258332f3121b022759b163c74c7c96058fa8e3a9928afee948 + +Msg = c4dbf70b9a2165e7279122460d05ceb8e43e03fbe2ae7c314007fe2b1d8567cac727a10fba5cbead0ddb167d387da8e8f3d6bc0ad851cc32885809d07a776fd4a95a979fe3833610af89df0f454d9edfabe12495a118fe83add5eabb2acf54ba7ba7c4be20fc77478c0a0f0726c4e60317422a612a234a7567648603b63f1c12 +d = 17d6eb1219cab8577168be86b61f372b27ca70fb1f1a767947895c185344e966db17aea +Qx = 65d8e43a290a6957230501509b95a208a6c37ddcacd1e882d97c73c38b2a256caef5e8b +Qy = 02169cefa6ce170ce20a0b5463f5bd146224e0813acff304307da88830b0777b86cd3d2 +k = 1519e37a66b4e665b2e3e59b8e836869a886c879aa1ed47901a6c8a8f365efbc67fb410 +R = 1734a8bc9a13f51d921a297bc6b2d38610c20b32b0adfd5efdd01a4db5084f3b0697904 +S = 0f9f00b25a33b166f09e2a819dfda80d87f6a2419a7b4162e435ee02c0fc10a669df6d4 + +Msg = b1d53b6af1face9b59af11c726b0099111d1adb3666209ba46b1744a528ed0f72be5a1b82423153b896384faebef0362343e2a4599803c08b8513708938aa8a498145fca1c63ba41aff06d1a18aa2a045fce7fcd7e5552a2b98d0df97b6876f06a9cf52a7a40fb737996adda97c3cedf7fe421235ac6951060eba9c0377e72a2 +d = 10ede9be6615b3b2a294d67da78127ffbf3a15bdba6f4fd78be7a60415b5d1a097c0cff +Qx = 6418eac385ce94c1982c216ffeb0b26f9c061ccdfd785ded75efc6a329385898331fda3 +Qy = 7d41f9cf1248a37fb8baea7f3545bbca707a903966019ad56e4dc810b6863e243968b48 +k = 134ac4de6ed71106d11fa736960eef2873223aa87b1c5bf5c823de6c78092cba4726ec8 +R = 12a37587ddf224faaf8dab61210310792d4ccef650c98155a227bf468b7f323575115cd +S = 10982c965331cf8529ef6adfe17dc3fde63dc2a557cab451d7c9408a089229e22b73d43 + +Msg = e78f538b1ac21602b00a09e3db243ef4803b447329c94a1476cd91a88ff790da71421b60092c8a6e55327c7982e7655eb1fd6e40fa9b9fd2f10107dfc585994dfc5bc2143d18794a39f7f69ae679b27dd11ed22040d5e93aa83f71783525a4db0c3fd7b43e57dafd0033d5317680df19c2ecaadcb37ef896c61a758a5e455206 +d = 14f237cface123b64e8578ff33f86bfd2a8181b9c81f36b9ca31e2a446f0d91dbbe2249 +Qx = 7aa347c03d8845f1566bbc3fa1d66ecb41ed1dab0a402405d8300591a1f3078f9fa532c +Qy = 63bd10274437c2690ed6df60ea632f3d4faefcc07a72ae8d85c2f999bafd373053265dd +k = 0570bf3b42aa44c11603d94e14b524b8cb1363306196924082ae71021707c3138503031 +R = 10f7f4af1c1e3f9e8e0c95f991c348bce6725f60aa12ee7b398be64728242088a469a58 +S = 17145a39fa4dd237e31a98daf3974138638b9462a31b87ada3eade6bf7f597195eb28b6 + +Msg = 8a6ca8ec436d2c706fcbec6486b5665b21c174edee7ebe108211c388b1219a8224179f7438e0bb7d6e41ac4a67337b52d4cd9a069fe6c88960ae20be29c8060efd7c62cb7a9a37136a250e68f253e7f27755df53ce7c570135641ad49b43507e5483e17b919cedffdc0d4913b1d5e0ca0629876c0a551841a0fc2090d2857cce +d = 08dbecb26587cb2ed7df2404e680fcfa5bf8cf6a58e87a350a1600211b3c844ca86daa5 +Qx = 66610ce348821a77e8a6eb74a675ad9312b2622ad2e1e6d8dcd0be8b27d8384844a7234 +Qy = 014c15776bbd144c0c24bf419237db9401fb7f97a7c4c0ef50a9afd27c3964088f79643 +k = 0204586a9314bc14bef8ccce8b9ca3874572b375d01c6b4a41c743c16502a27e91a9fb4 +R = 0fabfeb17bb8c1a57af7af81d99cfb7b0ecbf4e5e4a6ed483aee4be8ee4c70c2ef23941 +S = 08071e162dfeb068e3cad256c3603e07ae48b35f1bafdb726cf4ce32844e1a2181f23f9 + +Msg = 95bee02b423d2c6e60252da4632f693a2d8f6597b4f9c6e356f670c3a9e4e80063e92facb6421d0325b99dc150464ed2ec1d0bac72a042b35d56d33d2fda686a75d582d4756522218b4ddd25ed45503d90d3d185cba6cf0ac211b22aa4e1318a8316c369186f7130446dafad64f7966f5414f43af37a87127534060a23c6165f +d = 191badec2d28cbbe62c072c6b57eb5d4644d0c0b3283951bb66096cd15edd43a1bbde53 +Qx = 020224b00428031056ed370147c51e68ffc02e7fe269ca15b22310a2974d383c6c83fcc +Qy = 1686568fc4768158e75b4ef0427d8e262cd0638801ab158311749e0f432d5b69a667f0d +k = 03b1b6ca5e627f00176b599b68fe54e1b5a272c323a06b55e4871875c0e729c4c79326a +R = 1ade251b9360a6ca1b48c2fce0768a01193a415bd23956fee1e5c4c5076b3571abae082 +S = 0adff25020af4e2b4908a33ce1d75c793934921267b6c4a0542924300fce40fc0031021 + +Msg = ccd7f7c0e04d1ef9a3c5617d77480bc624beed6582bc28e9e3a369b12144fcd96b735ee41713f4173b64b28c6102d82dcfc7876e06e76fc497d1d238bf6d85bb5feca630bbd0c0f0fa7c0c72e28e9259087698973ac66244bc6e69c04deb22eaeaee7b20da239ab6333576f01349c76f594498620933b8969450ac2bae66db8b +d = 0ff5e3d66eb57fd35ba4472effd6e7a016ca461e39000a7125e99080f6ab6ef4380dd7a +Qx = 19d8c1d9aca39de0e627981d21e35a628c35fd4096aaa86f61625fcd078f0400f615cd5 +Qy = 52ba2854ccd64407f6779c5e259917b251c9e34ec0d95c05488f30802b82cf4b25b5389 +k = 16c9cabed653c57676ee46c8912cbc507b246078834f1667d0708e4c666346299c1fc03 +R = 12ac0ec9501ac91a2b57220e9c00ec6e815399ede94a658c36f9e89bbf1674316d65dc4 +S = 0c9480160c4e9db4e82b4ad26cb79e083e9e2056e68a2ea554aca45802bbb188389bc4f + +Msg = 65e9124a2606c8784c9489add2999f4cbe6186395df20838d653b263a207ec46995d2685b55d1874e7ef05a6a3bb5b60a7be6751ad568cef1bcea2debfc494d1e2ece0dc8028c88f1b2c6e4ee26b639c5e81f6448bd25b73ec4608a8e8cf4e0155c29b6f0a62781493b03bb7384c9808529d5f87da6564ae196a365bd282f46f +d = 1f3591eec4a8a3fe6ae6debe230d238a6b73cf3791cb735add1abee64239bb100f15166 +Qx = 483e7e2b8f7ff95b86008c3042ab83a4b6a48f15ce1cedbaf3b586b56ab606e6f23a4ef +Qy = 287cbc8c609426f1665976e8120afb8de96b43978762ed44bea5aa1418b9af6922c6066 +k = 08165da5f5427b38c447382c8dd0940c3bddf8f048185e6cad260031f7c0a2ffb83027e +R = 09034633dbd735cec6208bb6f4455b295b7d730c9301bbd1c0e9f101399f2b3425a13fd +S = 0204ec149b416ca3467e92194449cf2ca0f41ca1fde79145f3af856085b298149a3253b + +Msg = e793c60fc725fd537d5fd38e9b4fb52e268722ae6bde5a058de8d20db301f5e8d8e1ad85532198835a04b76f27ca3c972be5617a55677cffa8219eb64fe53ced242efe1b889990979227dbaaa15ed39d3b6be8c5a3237ebe12bd96f333d947f80048463d3859e34f865d83faf03894c2243a06cc96788ed952e606c2d8948271 +d = 05af03cdb45961e7ff35fb0146904ddd6c2bfd3cce814073d3aa56eaa9f13b4f7423926 +Qx = 70bf676b9b0db558eeb8bb94a1248bcb599d1e8975ee13cd37dcb78af19307d1b7e57d5 +Qy = 6ed9bf30c627062b99ff9d05ca03441b6194c34364cbe7b73b46ec9716ad8a9970cbc99 +k = 192c7b1fa8f221edecbeaa51447818474dd9fc89e962e8e87400938ef0dff432a6c4b86 +R = 1df1a4f9578e9cae8102aab5eac70eddbabe4ced99b5bab1b1dee59c41b81e392968c14 +S = 0f2b1319335ee497fe3ebf1891a71cded59704365774e1ed9950f79100e70950783bc7c + +Msg = a57682d21cebb48190199e9f57493696eae3a59acd22f64d5ef4729decf6c2615b326817a6bc118bb7234bebfc7276dd998838c009a7348e46431574638dadc48538d6048d572e50d9c5974d2049ebe1837dd857bcd1447b1514b62808a4e7a88162ae1bb08a0f6d3db6f25874c6cd0cd4ca6333f1bd57bd192ef67e4616d182 +d = 1ec9710ada06e6270720692a06d488ae2ba863b905dd2fc323e7ce68dedacb35fc8c7d8 +Qx = 5cda72b5b068f70b3c431def41b8ca1d4381e8c2fdf0821cfc17eceadf5e3eabf7987b7 +Qy = 79ae508354fe31899cda71e01cbc80e5192d24f1f13c954208d2ab8412802407ae3763f +k = 04f7b9372a8fed536396f0b87d4b20494786bdb8db77200c1aac1896486a05d3c940cb5 +R = 072ecde2a8f506f0fef273c8915a9edc29e440d48fc6cefb50e7117492fb4a13e123bed +S = 0010dbd6229d770c468f5d8bd20edd6928bd8824b7fc2b10dc45fbd3242191e7557b984 + +[K-283,SHA-256] + +Msg = f646e7334e191c2bf0056d3bfd23f03ef7f0777b923f962519a8399d311b8f68414c689ca34b96871fae99eb7ea534fcd83e788e56eeef817cbfe33677283c736b99bf6a626f9515291e842bf99f694e4e8aa7c9911c591a87d5f112b3d96b064594e2b368e6d1bf1a1cd343d54916a66da22c26355266aa2884120fffb8b94d +d = 0668de088c6913640fbefbe6d2c44ab26e481802dbf957044a4957c3c5d0a0fde331501 +Qx = 0d3a50cb9d347cfe45d2a313813fec8b928a9b1defca6ff4b89c4787717f275c6b7337f +Qy = 762e47b0669f625c39c74d50e2b46875ef366b7c3b005c16ede69a2fba161faf6b3d0db +k = 0b24bf54795fa02eb9527f21ead5497a6db2bcc7849a16d206239f830df313dfb7a2716 +R = 0852d8b6fe93b0b36af5d99530eed08669eb9a25972fbea59f32dafe88b722bada98ab5 +S = 0e5b08d410f2252f724dfcecaedb37b92a6c09cde646ff6237007f4199068f945ebebe2 + +Msg = a2d7e69ea381d3edfde4664c56c4cb140d01cc4425df757975cedc995b89640dc016ab419b137ff25a6a6d64a309b23890439d2ba157262393cf93d15ca1b1ffd19373ef12367f8898aaf56d5544c2f019a4854f69b3d8d320e03135bb7b675e588a5c3fe4b703938fa0f964916501297cee2fd04af767155c7739419f9dbb7b +d = 0e6af57cf47de1e6f07041eb5e1a413fb7ddd82f8c7f7ce957eb28a118004930bec4dbd +Qx = 21e31c4e4d412a261e40483b9106bbc1b0d7e7414e53d7b9fd84175229c8cefbbf6defc +Qy = 46ff2dc601dd407883af7dc71a6ef4286cd3b1b6ccee4fd861865bff8fb38ad51b63d49 +k = 08f9e2113d0b223c04e678e8ebdd3aab4816681a9ef08b18a38afecc57d79c971421469 +R = 0d2c9113a18bd51008fd327a55c214c9584b6f1b816cf3b95e7346080da2cb07dcef8aa +S = 19167051872759c36ba9eeb5d620cafd3289e8b7660fc847ff385b5143b3aca38780639 + +Msg = 7088f60e9375ec6a42f705f851fc76cc833c4dcbb3352adcce9f59197c1b7121e7aa661c4f8ad9f4ef280af3a2981e90c01291f7d1cf7d3ae2d96b37fe6975e11b7c6c02b8ef044d1470b1a26b9c72e8c4e7b1dd83c8acc9542e2fc7d211b87841dcceea2ab8128d0ff7bb622b60faa4a89ea7008f7d55f8f9de675bc4596fd8 +d = 19f9b63fde8c6aa6177f2a38981505d04f8ac62bcc21007b05615d028cfe851ab9cbbc6 +Qx = 5a3e567b227869f948180547c2713703c90698dc04864140d22b24bdf81b3996829aca5 +Qy = 5b2ba535040afed0bf6f9d850713e54013729bc6dcbaa336ebbfb9c461f7ac61af48001 +k = 051e20545a0a98dc3fec59e4ebdf101c6aa2768f344c1e19424c1eaae4aaf7ffeb5205f +R = 05fb3329f63587e8febcdec49f92de88366a9f75d0b9a0f374dadc6e7a62b833753e990 +S = 12edfabf1ce434c850b58804f1f31f8afb20fbb36ee69b68668e231e4c04fa75e658478 + +Msg = ffd6044ab991849939e8a29184b4d0ac3e07acb63c7e6b886df9e8254073fa800d5910b9fe34fceb547565a2344eed4de394ce2251ed51ec882ee9207eb7340464c742d9d140fa0964f6bcb1efcc2d13919af4f727953de41b20728ab975c1ae0ce784865f23ed1325c68daa95ed5c932893610179be94f13b9a4149f09833b3 +d = 17704c1f436beb52f7ec97192e23e206ec09f9e8986e06bef71467c192bad6f0066b3c2 +Qx = 329294a36ceae2b2c56bb6e21e52ec32af11aca9ab7785be9c2d79652e7960c0cf7a8ae +Qy = 658a89a48fb95cb7028252fa9792d91b989d7cef3fda8ba9c8e4ffaf19269f2a69f0a24 +k = 0aa8d2e210ae40ba1f9f051ad85d37f7cdea43aad890ef802519cc5773e9a0984fe5d6b +R = 1908e3a2740fa04ec0b23c964c4c3cca51c4603e7553461dd02f8319a7ca2ca09d0aef5 +S = 12d7860d7b438df4653fe40fb9e986cb035b1384464e061bc4ee3bb29aec74d16b0a694 + +Msg = c9f81c9ff7d80011fd41f2de97a6c1e6a22cc2da7b2b9e4c50e1354c3e139b44529ac786ce795fc501dcbf11a935d4728a7bba44b4e86b5e5990fed4d3e24fa5ab6f303e1842918f156e00dccebed6897c852207ae5941c630014a41696882066c2b296d39cd8658cb5830eee78e29a00335a99a0ba90722ceca5a2e9a99a2c6 +d = 0c7d1ac8faa689698f5c6325a3b3f35e7730bdbddabd0693f2bfdc5c838bd62f84508d4 +Qx = 095a930071ce56f28a79a66b751283c756c4f2566ebc2a10770ca60cced6914bc9a0d77 +Qy = 46f70021e7a949c7f55b059d4c8e81ee23b13809a35932d83b8398fc8684c5a90f3ec71 +k = 038ae832c25dcd30c1ee3f5fbe84bd8779c876c0641907695aa598132b0e581ea528332 +R = 0eb27c86d3ca86ef53aef0465d257e6b681f891a6357cfbf51260dc6e35a82799de0e97 +S = 0e8207959e8be94e7407543df80d38d9e662106ed68e1456dd1826602c5b73f27ddc901 + +Msg = a60de761eb32490184dc1d29e21fa33889295ca587b994746874c7289eb9c83e9c7bacbb4066c761a06b65ecd78d701bd41f305cd7eb258c630f3febfbb0a367ad16737b146fd793dab23562e8001cd113135b1c981d1ca23eb3be0fe3e24fe3fe1089caf9fd8f4f0d1f90dcc7dbea4a9e2357793b65daf342b8e6d109c6dd10 +d = 1a173d158866db0ec665ee632b5fc397893f6a44ee17c348e7452800aadd8ce676e7fdc +Qx = 6a9369a93e0b5165ac6e692db035495c5cdd6df243d9756098385ad616374ac1e1efee2 +Qy = 32f72a02c36954cd8221126e4eaec02668f454214e4508cf72b6d945e14d9b7c5d404c8 +k = 0200713a78f58c755db4897f9b7e52057a087816a07fc388d66d34ea9e0bcf2f47e182a +R = 11a26ee24610e705a42329f86aaa80d78934b4bbf19314f06eec46067d85c8377e04d91 +S = 077e35add124574e98e0056bbb106cd28ba8c3bc0c47063ceebbbf2684983a2a0061950 + +Msg = 2cd0320cc73120ef13e83c8144b270c9a1f2049a9250ef7ee83ccc7584025140a51e2227a5ebb824deff55b3affcda63ecb1fd3f337c67c08054dc82fdace0c4bb9cef1bea9dd792635f655363d05903cd6b5ed50ee669bcd8157509366cd85aa40d19593265da26e5641590ccf04672a6df52badd4b99964a8643d9687b499d +d = 05523cfacf4ed3b74ebc30f608292e45173001d80cc801f729c5f71fc213b243f041ad5 +Qx = 410751ae7d8bb2295f584ba3d55eda41a80b8520b02bb4e5ca669a1003d6f2829e0a01e +Qy = 5fe16244f76f0c8b24bd3ca3b53c697097e3ab0e2b44962ea534a655d6c7d80b857c21e +k = 0a634f4cef0ba37c9ab211c57fe6574c67933280c91c8b175fa4164755bcde867fe1772 +R = 0b9f6946a578ee38433e98478a4c31b67e838939cbf128f023090c4848471482fd1dec7 +S = 157159e15a2d16da2e913c5ef00833a8e5513ee4e7d6cdc849fd822c59886d0ca3695ec + +Msg = a743d8337bdefc4753f937e869a36439da1f8c75e1278c3f6a4a969d93787dac93293818b1cbef5b8636e1a6cb3acaac1e15dbe0841c8001512b689292f3f4805997ae26ff52f7fe1842512a020c448ed01af2a061f3638689446ed5f6bed9fc70726ce4104bc11142de63873fa7039830223e8f152996388417c48e0c1fa81b +d = 09f6bd008c04b8823ccc3ee7d5aca535c211f35e9d9e7cfaec518b98647fbe6d28283de +Qx = 70019957dac0e9be0fce6abdfc00ca737096ba2d2bea9ba570acab6d73eae2132d7eb06 +Qy = 559545f82741ddd1cbb9dab0cd06454fda8abbd9d1eca752e57ec05498b14e4189f1b9e +k = 0fe407c226fb15bc63d37cc9840a1a1fb0ac4fc2939fbbcb6e1236831379d367669ffd9 +R = 0e96e301bf1193dfdd2815597e016e0a282d6e8f9d1d67a7f7e7d05288594f1ea92584e +S = 07488687f13c3a2b9ae90536db7868f2bde1529ccdc0c84eb85c53ea979228d1fda7c94 + +Msg = 6a7a3ad614a3a09d2dc5a80204815d0c6471057acc0fa73f3cbbf1801902c3e1cba3c1134a79a8ce61994a94a5afa85ae1a44b2cdcf5153f8625713c872da36aba0afcc5c2f26636dc3f60e04c256a5b023e20e2e7a3f7305bd5b3033fcf05368589f19021f8c9096a88679904b657bbe5b9bee67d6e53d176fce1de9e54c64b +d = 150d2812505c82584201e93f6e0cb875d29dc7bd99d9c0f98e0ed20128886e67e1f1071 +Qx = 12c7750172bea15487a05580891aed51bf81548f4b65c51c6c54b990bae8857a20115b0 +Qy = 3db9e7a17dc8b24ff080d80842f0488f17f7d43a40ce6ffad52c65f5a875b4b33efe3fd +k = 0c5c52dfb50b210ae13c2f664d958b2491bfa91ced638f925941234bcc4d66de1eeeb73 +R = 03887a270eeb515a59a7387d8acbb4e72dcdf13f317a6a93ace5cc98d69a79c64a9e7ea +S = 0e922b2d021cd71e213bdb36ce3ebf56a34617d4dcca30fc05f238a1c097e38d7cbcf91 + +Msg = 65bcd77a3ab345cc99b9c1300755288102a6ccf140bc7d1ad25df246ef01fd57a8614b352033b88cc6ffffe5b38b99ecf03baa365ab5529d6751a3c020d0198561969aade09091434d84ffe13b46df043d0a61e20a08e9c32b646771fea1b29e202d40aae1c7079873c3af494ecf6ef5eda855736c9338b4a5c29a086a8266fa +d = 1b3fb9e1ff70f94bc9d7742ea535ca982215af3df381b5ebdf1db40c7c849a7978ceb98 +Qx = 769a897a443c41ae7a8c1e45290ef39c40887ab8f4aa3f9ee8f3096921222ed7de45739 +Qy = 72621bfa30973da61fb6d363d66db25daf818ce79dd3268ac0520fc99ca7917fa3a2360 +k = 03fa84ee38587f9c848b65b07c47551e27f15e7a87ed0ab705c99c8b7a4ee9e86a8e4ea +R = 11b214ebe67eda2bd6e84c33be05c4373d2536e2cccf152e56b1569cc96d261e50910cd +S = 0e100646cbffa016664bb57c1a67108645238573867c0b595c46e6053f844e5482a993a + +Msg = ed1acc360d02ee6c36bbc223d91bc1d2009a3e8f8dfc4c3796cd8555b0d2b46716f4c8058bf34c2d4954e098274ab9c2cbacff46a0578a14e77fe104196cbc6d2753e3bb5422b8b79fd004ac0aa920eea94925c016ece16ed4dea916fd92563ec65692a61b28ee84bef0007120bb1e31bb75b8ecf68406a71af9a18b4edf5320 +d = 147fa46fccf0805d14c1b84ea59bb8b8283d54ca0ceefb29b5585e7141340c55b7232f7 +Qx = 4ace4c65ce07fe5ec22c560bc553bd791434a691c2d865c52b5e38d541ef191ef419067 +Qy = 76250c829de137b6549d22a12f196629d9d34cdd83758e5daf45fae41872c9b15190ce5 +k = 18c4f89cc022236a0da6105f19c6661a8325d36fa285e3ca71c1a4af3dccb016cac186a +R = 0271b421fd572de8a71d1b18ad2325bc0fb58cabaabacc1f015ee6b14bec49762f1f8ce +S = 12e679010ccb143b7de0c3f6c82cf99a961a4f154be6c87abb111cde2d721d864d7a1bf + +Msg = 2debdb95a21d72b69c545988727366a42b819ca6398a82129c5e3772aea93fac0aae9a27b11969ff0ffb9dc0301132ca2452cd863316cf24ae7696422d4dc68e37316161abc146e86f04b72d9a27a350d8545cca245b2be43c33bb822dd813d13e08a718f784845df8a4ef49b02529871ec76bb3fc1ba31089359f2ede73e767 +d = 0fae097ea56b35a517be5480802f450eb832b244558d0cc922cd4a5b40b84d02ef11216 +Qx = 4f6bda2dcb9560174ffa54f13fa5edf17bebd41399a1dce1fe13e82a2b487eddfe25a19 +Qy = 76dd375f2c5f24c342a8e2491271cebf5b97ac666aacecc8d693a85ebd2a93eaccd4059 +k = 05e3a67091b9e10c7fd20fd70d51162e5d78555059802d0c3b133f49b89f37be6a119ad +R = 0ddf93ef8797571af3cc9a66660c569445a2b5384f95a12d680c570694bce49bf2264cf +S = 02f50d68bda006b88798d87c232f5ed1796c841074f063da03a471e0c00f08b10f410b3 + +Msg = e4e0c6c8fc01244abf81e139c961b6a6e2d95de5dff1083e8a48b40e3e5b9ed909152c92b1cf2263179629cdf76ae553b58bb2e9223ce4f9ffb5f170f5f0c5ec97294c34a7529a897e9397f71198cbcd68bb4055cb8cd6b690290761b3b73303f82788379df145358afe28f2997d191d968929b7a4b9a0f6228797dfaa17c613 +d = 026cd72e6ae19b3f4c53493fba1e8082a8df1fb7da6dc111b47a41f713f49b33f618d0c +Qx = 1c411f5e298c9b61023fb26765cf4132cc78ed77c07c3e815fd43032cdf0ae8b8920f96 +Qy = 35647b4c0807b287014043560d70c9b14651cddff4bdf6d44ead5e87720294ff8954406 +k = 10e9bc449e8480474afffd20b8acd6dd08344981c4a6cc789c5338ad7e486c526d6c4fa +R = 0e81594f1064e018aa3504bac75946d77f9e745673043417a47c0c82488e224cc4104d7 +S = 111bf8635b1bc3f6cb7f9b685077b38d67160d143ede2bd8b6ae93327d7f55c5317f00f + +Msg = 04710947b7c90855ba4e59107b919d4a1df22b503c5c4c33b286b6b08e451e6fbef8ba40852f9f0ee62c9217abe6156bed46ad6f0e25f70f528f3a73d099338c578bebd6879d810e6e173c2b0af1f7caacb3531ff0e6a7856e4c84db355d110febdb21c683223eb5990ef2038d462ddb7962bc0feea5f850954943d53041f66a +d = 198e13c7d95bbbb6e226688719639bda988867764ffa9b029018b5547850daecf58fe1f +Qx = 30b511d719217c485866273ffe2996a19e0a670b7a3fb077944a21f63ca2f22fe5a524a +Qy = 3a4d9a808e8d77c9dfcec6d033139fc33e67d7c8dfd7329c895bfb77f565391c37c8d8f +k = 1721f1ad4adf3c32614feb7f8df3374e24f76a32e27854a57dcafcbaaa3082b13e461ce +R = 14b2622432adcfed7c2ecd2b52e43be7f611680ceb4bedbfa9dd9af54532911a07440de +S = 0ece991128b10399188b18933c0d185e85d111ad401baee5ac376b84c523f130f70fee2 + +Msg = c62d07bb1ef756b6b2fad355c66b5be086b6dc387b37cbc4a63c841dba3fce65b09d3de8f239e3649382d172f065b78f8a53e0283cf345de06b4ee0b4b7d8611bfce92a7d993b1938419afe817611bc6df3ef74191e7e39ca2339fcb5b5cfee3166d09cd52a1a7d3779722aec328d326a11bbafb6aa417920225ac453146b9b7 +d = 19098a39956747de24ded56435fa1e6c30cc2b8088fe9a75f5d07b2f5939c7a60db64ad +Qx = 68cf5a2023753717d89d12d6861c8411e6081c3158339573dc5598b1700148d00b39dc5 +Qy = 76a22dcd4ff4f062eeff83a58d2ce6a1808af8733ae254f5157efa8ea35a85cc744692b +k = 142e4907ce239cdaba562d1fa7305bacff05a75e2927800c7b7ea322b47c9ea47846e12 +R = 104620d752b73379e1e5d35e5b24a793d7a309685c00f8bdb97bba9876999ed9c763d0b +S = 059cab3abb0738d8af4ea6dcbfca6d0ef11b6e591ca109b040347d7d4736724953cd9fa + +[K-283,SHA-384] + +Msg = e4d8d49c9bc566261d9134d5e237d9cbd6b67d2619a9bd06b7c9c139e091aa10682cbede114e1d4777d9cd67a16b7d64278e99eed62bbf25ec5a5a8fabcb0a3468b0e73fd02ac6533e04b1110d29da3e34f33eaa228b78341b357a5d892a61beb2168c3bd5e66bffe3f2080a1e246f55a41ebf9d579e188d16991aa060460d6a +d = 1636bd2be121e07ee83ac5e880cfdfca6a56f2b9d0badff003e872348368c7c2cd96b6c +Qx = 007acf46ab68744a9baaa33ebf6be20c1c093242b0056bb9885d93a4a9bb4640f17b2ef +Qy = 15415c1b671e98f00c1fa364bd69cf998c0ae140485159b0a341994a4e27000e108f4fb +k = 0d0d4886c3500bff68455c41f5840d0313f33ac0155a693d27c66fbdb12791c2b5f8552 +R = 0256b8ff7d37fff7dcc8cc4461984a9bd9661643fd3a68d07fd30d426d10b8c7f4dfa34 +S = 1f516f8ed4372780380a798d2da04d691aec379483bc0d10560ca79edaab453d3e77585 + +Msg = 2d1358fdffc14630fbc421b443d3c22ba10ef34f15c6c5bb3c73a9b8714e4c411de69b9cd6628fe2eba5efc4862af66ff916505023e0514f564164b389ea422d0f1beb92adcd65baf43556614eba25e43852ba65af78f62d64b36696519ef8284ef7316ea52c365b99f63a39e6701f81ad520d7445cfc0113c38ecdad4bf5b7a +d = 15e5f555119c19b055b15b0c0d2813068bfc184f864e250b202384f5728bbbda1cb0f5a +Qx = 13cae2f0c3ba04d039c42cae27de4cf5842a3e24be35d7a3cc7f05083f02951cbeaa63b +Qy = 5d69ad5b7d64d6b19772a1794562b1fa5c2fea03909bc509e7d47b0e8144acb3c26fddd +k = 1b881d95b7de9aed9fb5ff0085ca4da2fbd413b9b947066c98aa0257142c9000bbb30e2 +R = 176f9e3c9e9f98b2f5f352ca74310badf9f598f4d42cd2b26e5ea0999ae31e3c678fad2 +S = 1f2dba4e17470cdf7e1815d30771f352807b38080d44465f86044f5969b017c9059daf3 + +Msg = d6336faa5c3e838f4fa58626eb353d4cff9ba8f0aa0e6c3d0d850e8b22f5b0f047afc97767f1afe2040b85d4e401ba688a4da7a0caca7fac450899092c4fea789231ba9b07782010720f45d16d353798867dd7fef4a324520014ad5cb32684ec50cab742b750e05db040ff51140e8d740f6774a059feeb493b10d8ac722f23fa +d = 190c8f17bdd38669e345440d2c7631d67cee9c6548c4e7b9452377adb9303430efeda0e +Qx = 3235a8b7981b3ff376b6b0959a42cb56631fbb9f82f1694b9e273e6b7131e758fa0d370 +Qy = 444e5747420d7f5ffd6119ef43b998d4ea4a58da13ff6fe7f241ccdfd4b6fd33aa93e3d +k = 0b2a690793107257d7bdc37c492eca48c4c9650ba0d657e6eb62042b16169fbe27f8984 +R = 168a83fcc67e0c155f1fa2329363729872e254f2e0c3ef85f3b3c84fa3406de4191b6e8 +S = 18c0f8e6b486e6d7d16b4103506d74bb2021232c0b1638858295a63ca35e0d6d26a6266 + +Msg = 07384a3f650bd270b14ca388a441af201b7767a2d47e9033f50cefd3af8257ecb38f5267e141cbbb2ab7327d8fc78cf27198ca3543d39553e178390bf1b921618432ad895e4f8153783a7ac22f4ca3cad4560e64f1ee4a7bcad05df98ea49a3847dc2143b27c243e48be59c869a547988e2205358e8db98b635ca21b745df4d2 +d = 0dbbc2a0409ca58a9e39e33b95fdd15080443c1dbdb5874bee991bd1b127047f08ec9f3 +Qx = 5a687605e54e49e3c40fc5ee8fc014a62d72e8595280a66ce7d367aac2df4d16b98deb3 +Qy = 30abd03dfc224f459dccd1606287cc30016be317c6207532a0725c957ca5fde692a9c43 +k = 16bc5aa29cea64ce3297172f36fe4ce820c943908c21c9967697db0cd93bb8a12e42348 +R = 1b1fdf26a6eb2d736b8c1ab165af2ac31a4c206c5410f61ac7805a68992dbd62b457708 +S = 14e9a22ce703d942a4fe2e84a4c1c1b44538a33fbfe904bfbb17af6490d372acae4668e + +Msg = 824f26dcb4ce0ca020982814d5c727e629cbeeaa818c49668f8f6d743f0d0ad362b24cbac48027898f386889ca5411d7d1f9afc69493b1d9ae4d7b695c9fa0a30bb59e6be2cbff79231767e96cd8bba349fa2f97955d56f05430ab4ebd007064e3d5add94dfe255b6deff19650883ce9966e1a2affaf84d9540f65c87ab1f936 +d = 05495e6c59ca1873f36b756579632fd47f9fb95b64f52589d70f2739aa6a3bf8cf8c198 +Qx = 6df40d8259be64c8ac64a28359290bd52e843f330a68c2b605ba4f777d7bd7a798e9344 +Qy = 458667cd7021b291c3415d64f9b054db71d3fe20f232f2a2286aede89ddaf1ee8c68aa0 +k = 138f05303ea63bad47c4c9a9d43c52c264725a668db5b631d9892daa1b71f62656cbf73 +R = 05e35c1f3b30b43cc9d60bf8779f3b31e053de0a390da50ea676dc9722a17ef00d68aec +S = 1691ecfb826fef1ea0895242129cc3e9a14e1f84fac49d62ffc0a3455ad9c97becd5980 + +Msg = 07de1e4bb9be15a710a74806d4447b093bc08ed04392d1bd5abb414f5f4b4d9d43520d0e46fc81c2a97e71086b28e53242449ed37fd7ed1c5772dbabc430fcf82ad20437b38eac15820421e51912325c872894452c3f8a10ddb040b35308e583c155c3707b52df467c4945f4e1071126ed46611a3253c297f5cbca9e27f58448 +d = 1724987c9b698519b6c225cf1261b77d0300045e5fd774dcbf13f285e6bd74512cb7edf +Qx = 46adc9bd5f0cc0d8bc64f4ba491eae3b7f6fb4229bf94b804807c6137787adc0fed4b2f +Qy = 41375e2c89da41af84529811ce7aef26b983ea8add6e37c32f2b00bd47f23f25e5fe194 +k = 02ea4ed0e87687a50dc3acc7f4c089040ddd367d1a3f470a711501ccaad63c201b87ea6 +R = 1be198a1b6e91453018513902f0a8a085c76a2798a2a0538ede30dab65afb6b9b0496d7 +S = 16342f87a813780aec006ee218a615c4e1c78c0c759d48d4094639b5b4c32a9658c4d9a + +Msg = 1edbbbe71057bf7d0bfda922be21a3a4dff57b017ebf6fa99651246cd173bdc9b11eefd048ea599c1f98e907932aa04f64ed0a007831f30daf186c88807400970904d6090b2cf181e0f65f03b4234aceeb420867812562e47f452152bb1ddaaa48487170d06e47c5e9a7c0faa4fe494663d2fec22f7665ceffffc214b21c6b8f +d = 1a5489091cfd51a0970508ee3e8449081ed175928ff8386592c83043a7911bbc2f8778b +Qx = 0aa1562c94bd16a3f8a1d6c465908ce3b83ba6711e7d8b0b9353d3c55d13dee213aba70 +Qy = 103a789854f63a139e31348f1b2608f1e71c88b5d42809f2460642ff46a470ad8573543 +k = 18435a6d3bc02b3019e1b156ddd6f3e1bb9c5af70d1a2cd2089e677cbacc21624ec8947 +R = 031f561b668aeeb4df43a3a34716c4e67232f56959104b7237b26e3c95dd40e15eb076b +S = 0f2ddb6e6d18a7393425c16b3e5a5aa232cc48198d63e46a601cd3ed221a8427178a0bb + +Msg = db5cf1de38a5187af11c1f0f19a36db52f8417de997229e83072fb51a3b7152a3b383e9919c1b8427582e53d4e7e25433d46cdf01492021c237ea0a87d38c71634743115a6b2aba66d3faa8003158340a5078171e0bd55a6e5d8c7fb2631a31c1204e1479bbfe79ac70d5e5823af502922a900576f0088a33e42ec3e26c0089e +d = 1a45ecda0788fbd7cb7a716dcf4c6e83d4148bf63ed58078690ebd238c00329c462590a +Qx = 7a1e2fb4e8e79e3946086fa65042362418db0dce51541121c73972a435aecb99f634023 +Qy = 06bb02df9899ac3f207732fa7cdbc36a60c17592af7ce06b8df4255110e26a02b231800 +k = 1c986f88ba3d5109c0afa2c213dda8df462282f024cc8efc758a5342a0de91c40452443 +R = 1efbd9e0d912e170c9c55bfbdfa6106fea4a4e013e7dc26628a1aea4f6b806a51866003 +S = 0b1347f4f85adef612f5c3a436cfa59eaced5c7cfdbb69444936d71812a2ab2461bbb5b + +Msg = 4adaa850eec8272d25d76600aacf2cf66e754f6c5efa65c55a2a31b7bc69437d9a7e47c6f51c5da93895a45221f5f92c2e20ee6a95eed3cc7249688261a35d82872284900eb54dd1df6024ec48963ce43e8ed8b8cca8ed22beee8f0aadeae53726cca05443316537840ab824cd1b595f36064e9a19333748d4f4972178e7f5ae +d = 11461776c33f20b176dc8f2b0cb2446a9b69e55b6c7bc7457a7fb4639116b452b79661a +Qx = 043ba7157559659954ac58b44f19262bef9e3a00829c70af66d07cef08ad899d7f8ec23 +Qy = 1e8dd9c947b5a6decd1a26fc5d0eecc9605d22abda747fca038571bb37036d9034e8061 +k = 18b231de7fc499b461afed9b80f4405bc005011865cdfeb25570b7c0ff79b6ae94b6ce9 +R = 0fb203f47a4e2e9365ce070ee7fd4540f3f7e9ecf69b4400eeded0f5a7bf6e5a5c6d004 +S = 0e635dc65233f27b8350db22b90a3b8611e6fd1b3e0f515e42fe8788b1376079816308e + +Msg = 11d212a99c39fb5e4ca0096bbe6c81ae1490e1b8e07374b4e773bee4fdd24a3c13d653919db663d2c32aa4db140c4ae2d472d4f878946e527ad33b3dc93012d97458f96cb622ddb56f1ce7c2474ad0d5291dc35545de47b7053d137a8e79dabe06757ab53e26eaf751111bd27690e57ffdab5337eb6f81889e9d1b1ac729012f +d = 025a65f627db2b4d6cf83c5b0c00265b9b63f7656c5e3382139e4992bcdf3cab502844a +Qx = 5a35e7e0b914a3e01ce3a885192d2ecd27418e09898631de122db0c48e8b58658720fcc +Qy = 009eab47197d5f56927848855b6ff96db7c36f810ee7c89b305ef780ba8c993d65537ab +k = 18516ceafb61cf2c7e7c511a8918bfe394c7fb2fbc40fb3052e156cd4020fc674684f84 +R = 1892ac13b86ad00e38ce2427c8c78c93b08605a75ca22b3658132dcf9d9df7c4b5540a0 +S = 0437b33615c16a85ccb8c4769ee7c5f94122d31e2b5fe66291b401fd90257ebefe33818 + +Msg = 9e4ec74c09528fdf3153a0f6955f20c70915ff524b2e19c991ec4c5b41ea9185e3e876a02ed6f27c9b3479dba951bee8680c4c99be1a626808114408856994be7444ccbd5ef9859fa479b1050bb836034e20c531b4d618f5843fe1d4b613a731895b489a2363f3f5397d5ff964cf037e9b11e3ff5e1c3d403e5a46b8387c1241 +d = 173b28fc29f10245221a907778708b3ee62e0480aa9051d4c3eb4e8d552e6aad5509943 +Qx = 24bb9bdef975af892ddc1bbd31314926a9c81f8f1864829edafdfe2744e793c100c0483 +Qy = 28ddde61b4361ced9c391c86c28ece9b902c48d14c61684962007dfd69d0468dfd65e7f +k = 199af64f79ebbc5b789d4676a07c224e4f6fd33285e5a555ac90cf65d0b669bc58ced4f +R = 137d746d515b90890a413685bd9b26a1c05efee4c11a4b40bb621c9fa2580c46c20a687 +S = 1647f70ab7c68a0f522420893a466940ccf79067b323d940369f8b8694ccc3fc0daccad + +Msg = 5fe8253d2134c434cb0866796013722e82184638b024a5a30938039929ccd8415c71f71f239c5c5a81f7a9cb493dde209f189bcf766c17c6d9589cd0c7de7f07ff9f24d2320669b589d084f8a8ea71127b9760b7355b162616afb34bcdcd416f1a062035102e29b70069b2b4dbf70179b8d60bc2ee5a455efd40194533bf560a +d = 0624616adcd45e1fdc6cfeab2b17230d73d91fe0b39f4664f3c6891554f9b8e238257f7 +Qx = 10917ef84bd5c0b36c97cb5586d3057a34f2827f239cab2af2e6081c5bdffd48dccb0b2 +Qy = 78ab47fe1bd3e28055c688c78e617ddcf6c5060123e9d65c562df2e94cac973ab3b1807 +k = 0795e229185bc1b3d6d69b08189fdd7a822cd18ac55971e4b35e51838bf12eacbc50e2e +R = 185483378a162b8edd6a12f44e3aa4ff829630fe3a1c9ccc66e34775f69bb6a94282489 +S = 01662cde6cd497be7966a0a77b0626ba3c4b82e20bb3f2e839178a31aaf440aa0e059cd + +Msg = db49891838fe23f0530abd4a4fbba5ea970afa5747f6a0a10d2cf4d841581ea2178705c1203f00cafec91d0a72d25448072c9cf7d7ca5580b39f8589ec63128faa95cb0689574a6bebd515049a1eb9699922cde0366b5cd58aa8f3d3e847706896f7e1cac667fbfe94b2eca9e7be79a810806ca4bf53f219bb30532ca2254c11 +d = 199757ffaa2c59e198d66824eaad37cc42d49b2e241b6a60382d05e425e800eaaf32470 +Qx = 6ad18bdb3e51cc053f56b9f9c35e2d6eaecbc9749f41a9ffbf54634838d7745ca064890 +Qy = 5dd77c42b31aebbbb46277176df08d81919ee0d9ddf14c3e4c0cccb207bf649c48fc8b9 +k = 109d6332ceec5ea211f642a746a6ce055986b4a2feeed7e847904f7f411bf8361318d92 +R = 1a49fe690a34151056d290790a6bfa7b70958e69e9baeb30c55efc61dc5dc4934f2fc95 +S = 1710a4ba5b404d65f66a8fca2751a920224db0cc0266f7b0bc054069ea4cc51b1f017bb + +Msg = 29d385d09c1142a7c181fe4b6e6132e414c15aa8605b44208c0399464613b966edcc2d46cf203a3f85d943d8eae658695dac74366224a0d0348083bec0106f5eb8809ae8d07f792fdd7c48fb1a25d5ef3bb9acd40b20c61c821024a9acb2ede321bd2d0dda849c22d76f421cbd8d51565d3c4266f666455ca1c0c3777aa44107 +d = 06e51381dcf21050aef2e9b97e35303cf3bd91956854ecf9b6b9827871d2efbe8201c5e +Qx = 52fee805d7938b8b97459b9fcb4b80cbe29f20a9aaebc07ac019539a4a966c5ee41751d +Qy = 78aaae02974de6530f285b4bbe87fd5d0c9a2ecfde5fdc9a3303e4b988f673c778004bc +k = 0b426ebda6628125d73efd84e6bbab6c4c8fcf7fa29ffb3c8d6b0a861dbf81cd18d088f +R = 1270045e963b59e4a4f1237c2240a5b26a7ba8e28ea01326fbec00e5d95d40e859d88b3 +S = 1d721477ee1df1388e1b7f92c048e5759c060ce1291098a2fa647974a62a258a189b4cd + +Msg = 774c1cb8fb4f69ecfb5c7857d46415568d88f1f9f05a4bf64a1e1ff6d64aec16e1d09292010d1f067c68dddbcde06ea49be2ad3838053f0b9c0c2383edc451ef0188565118e7b3c66a4fa372b96633dc8a753106283b02d0322df273d58cc9bd061ec219f1e1a9c8ca1400e5e39c1b2c254273377dc98a1a2c44e5c2a5b89167 +d = 018adcc22cb9a2db64bad3d60f1608c353e091637b948914115ebd43679904f955c8732 +Qx = 0630bdd8937e961d5396f9ea5310123a340ba316fbb7d79bf8573f27a0065c6fd6f8890 +Qy = 737a0ac1116e0e2979f973cd705588a71cec5e2a9f22e7e81fc61a4375624f55a6182bc +k = 10a0c04762d02f9d3014bbff287864743426cee14daa43b22149ce73d1ba609c0ba6be6 +R = 0ac29b041a6b95f9ab685470f50445d416df5f7ee06313185794f2b542fcc00606bed69 +S = 00a4241b97b6ccf0dcd533a15867f5889349ec353395d47e31c9eb6b8785736b3e285cf + +[K-283,SHA-512] + +Msg = c406aa4295f85c854b4db2de5a7a2defae53a319866921a3673af5b48c85ef22f6eb4cef892c790d8e64530fc20c729b2821b5f5e515560b1ac764106560c3a6a05657e34cd6deadfe2884bd288cef4ca92e1f25adde7d68a30fb0a1b3678156ced62e466718e68e9d67099ad82613b8d06bdda1a7b867c2455422818ae9eeac +d = 1898276f159c10d92d8d4b6ae214d68c72792a4b5f1f79936ca3c063dc8d9a88be439e2 +Qx = 394cf9bb273923c88be7a1c49412ab8599e0cc5509926102c122326bc0b34243f7d1cf3 +Qy = 72330906f47e8fe95f63d0f0aca1115e77fc702a923c32a16505bcd9021da05fd9cf63b +k = 058772fbb30227a136de616ace4a0334be0996d60e9772ae9bf672b7c38fe3ee1b24f98 +R = 10e0cd3fccd1728e99e2294efd6dd4797b6492ad95a789aab7fbd177475a047f1e5d38f +S = 0c5e0b2d1991718355be14bc57e2d6ff9fa63e0812b9adae69f64da610cc6cbe36fe4c5 + +Msg = cb2809152f8258660933472c06ddcdb65f6d5221fa29d5b0efec9c2a7914dbbf9ce0a468ce146fb333d26f510a87a6bb01bf8816756a1b5df81c5f65360957cae84ba038e37e88777580e91c34e2f5aef4fb55af7b81ad28aeba05e0b1c64a15381a6719fd2c16e38a441516e1b394952d984baf9e051b1dc1bda2e12f8ba5b8 +d = 12ff37c808c3cc029a9cfbb67a5ed21f3bf362b49270d4ed0f1e38fad25ebd79f112a50 +Qx = 0cc00fb36bf62e777a9f6048761e53633b92866158200c43900db95aa1342b576029090 +Qy = 55d7e57221ad939f5639282cbfc203114ee69baab4fdf194f4d2a937d8a57b70b54a907 +k = 163d8eec726d01a1bbb19995777919f68689f7c2920f3549fef966593c4fb012a5c3a1e +R = 0cbf5c3bf1ee58869e1d3c15a05c23217f1c252da97f79334bc79efe3f5c62164669ac9 +S = 1fd51644f471ea497b0560b65fdfa2fd0a6cef469021303f97753d22ce1993d1ae5b96f + +Msg = e060af96d4a7fe512bbf26be9a27bb6a8ff37547d4a7bbbfa710db24cffcfc760dac120f89f642880db2df6307f9ea5441d5932d49762d182b29d8e7fb067a61ab0df622f75cecc917e27d0326085d34581e052c85f50a37713e27518aed7c4434f86970e00a0a4b8503989e72614131b7164c1bdc82d2b6aeac0787f9838476 +d = 02b8c1fef9c6def32b5f4127273ce384b6add4aecec957c1662f52334f5ee97f49852d4 +Qx = 36a4fe1d77bc431012d25ff49fb5468f975353be70e7507d71966a0ef433df51dc32324 +Qy = 58d705cc883a690641f0ab85af4959ef4258a7ba9cde36dab77c125a1de1d395366584b +k = 0865f59502382b324e1dbd75db150f342336fb19145fb43a733971da555ac5828a3457f +R = 1ccb2e56c02cbe8038bf78dea256704ee6e51054668ba8c2ba11aef4ac6f9320d46ee8d +S = 030e662c0e7d47cb3b835c63599d0c9c2e77ca47dbecd7ac834c2babeb039eb630cd0ef + +Msg = d235c31f0a82957a087c7597673970aa39321d4c2640685a03df8388b5eae4825d1fee29926f416d5e62a2e9ca1ea7cefffd31607e750fa9675983608e0f8dc895371b190574d065c5c0c23ffdaf49e65362914363a3fffbc2c1bb487cbd4f69ec22dda5c7dc3bbab805c81faa85787cc176bc0e5703924f395d8c9e7e7701e2 +d = 0afb1c45e9a9f02942b8e04da4b815498454dde6643de186625a98b3c1c6993abc8bba4 +Qx = 02fed49c59e9d5c09202a5dc29d8dd527a870a180feded66ea6fc94ee094122ae97656b +Qy = 3620820bdd5910037f5877649be38db3571a9c6ac632602d2013d0d5abe1f00133f6cde +k = 1fe749d9916f11100af525ee343b3b74a493f92339e432a482dc8e86ffb5affc4630037 +R = 120f6f13331cd4d1a5b9707483c74dc0722452062cd4534e94cf40840d22ae263244a51 +S = 0bc2e37a481478f879de612cf4a833f7e12b8df33f5b0d6ac5f5aa431678ff053e2bc1a + +Msg = 1a2559777a5fd8f269048feda82c4d9fceca95803f84a813789d6ed070422240e443789c5231d63d5268ddebc060dfb99c4eff2ff115d2984d8bbc5c05314562ea6864fd543e7e0a3b8572c017d8ae3563027d79bbe164d40a5bab354720e45094b9b26391ceb55339592fc2f10b97dc9c2649f7227648f5cd2fc46d78d31c0e +d = 0ff537d73a4da0ae3a4894016b71dccef3bc886f3d24a5abb7dd96cf8fdcbdf0fdc5e51 +Qx = 01bd0537dfb29f727f91fb469c31164e1bb0ee192a5b89b880f3fa40e3e5437f0d2f9e1 +Qy = 6df9bab2f9198494094a63f2ea091f60108449f0741806400694a93702f61fb0351a81e +k = 0bbc511c6e1772ca6cd1cd308126c18c5db498055a4b3f1cb0dba3285f6d38b083e647f +R = 1ba756f3c89b732398b90bfa2f92b2a77159c530a8020b75cdb9697c6d75c18d36040b4 +S = 18207cf326bfe97d657ac4197ee5c20c75431ee552681a92a5815db0d984fe597700bbf + +Msg = 658c0d3f764bbc952fa55a258bac16a5bb5184bfa76cee06baf9ee6b9ac3f116e08bb2406b1dd4be487b057f3b29c2043ebc33019b2017c4deccb86f50ff15fc9248ea5fb64261120b1960525aec3cc18827c23291722c5add8a3761ff8516c61956c62b8cbb13f3d92bf3eb45a70704c01bb3625d21c38ffa83a6db086ee968 +d = 16000d2e879906d1040b32eb6ba3caff700e5565871ac75f10c5c15b509964bbe5e14c7 +Qx = 2ba89255d1c89e42518662611e2efe3b5e3b8043926ae9c43974ee2986185269246a433 +Qy = 2b87762b9ada81bde958d1f9b81246f49098695391ba3b4b3b9ac5727f19fe42fd07946 +k = 14e837476e628007b2df21b5035a39c24cd4869bb52dbbe13c9666ddd8a7e3eeae29f65 +R = 1b5091fc755c0f908ee13ef9bee40dd16a5710befd1e265a312e595842d52cc135fd722 +S = 0fa25f43c3c074d702e45d216e3704d942e9d67b3c0728645ac6c53b9be7300061e5fe5 + +Msg = 4f10001e3517c2c1f973b555f4827681e096d860c4db08f1f4aef8000c9c24bebe59f8bf3d7d3cac959a1a5477bb0ea43f2e746b5d14ed48a58ef35484b0ac786d2fec669f945e846ad73e6b77a9e47012a951b398941566330d89125eb3c1fbb2f06adb951ff5f047d102fdf28b5cadb4a3e1a10412eb3474d2ed5c3fce78f5 +d = 019528d505bf0584628d0214bc857150a929d3f59619bf8f3acab545fff0977c9bcdc97 +Qx = 0cc8863e1443e61fedc61abaff87d80450345489728d78c333b36fa28d8754a29cf3ba1 +Qy = 0205ae70c35396c07f9f96aa7c59cf8a28aa2a365b4a1b68e7414d8c4ae5220c8bae9ae +k = 13d555426101fa3c239b7830fe0b6cf08a1c01f9a991f806c84baae20daddf5dec8f868 +R = 0af8bd9856dfd783217cf81b09b464614aa824b0298f35308e6427c679607853eb66c7d +S = 0e6c1933d6ce25d0a00effbaf1db2cb2542cbe7521330c34286cf3bdffc20c001cd7722 + +Msg = c43ec3c3232cae59bdea7cfaf18a4672035dbd2b8b6b1b44ede376b36cc2d8baeb921e416aa177f5977da8bf1d713509e5251278b6622790056271715cd5feac58bee5baf50b216e8eb886279c5a384cdb696470275b7487fe9ac4c506706f6b0f9809d1ccb102546a4297d2017c2a8df9f02f30d3d1bd9aebf6a92a02e0d202 +d = 067795ce117bc0a389397fc22a01cfd9422cfbfb5aa44131938a8c45e48e1d5a718539c +Qx = 07924de08acfae6260009cc2f02daa2fc2a809e6ab4cd8858a9e9c2c15b17e29f1bc5ee +Qy = 04f36cc2d36df63474a579b96f6e59b890782ad8fa865efd80abd798ca2938bacbf8212 +k = 1bf3242e75f8331fe70113ec8e14ad0814850bb8cb262c7d0a44ca69de52d32dfcabd0c +R = 145148d59c5be2b6d39dfa33e904c161456822ec0ad64b9dc52befbd6496c9303fc062f +S = 0b75c3c404d694e086c0f5aafd534e7d8596601f675b2fac9384fca6084711e35149f9c + +Msg = 9b7d675a3d2cdeb280ea28289b5fc2a3ef6b535ebee8ad242fb031e2e1f364e8ee806568b2f8627c5a5b4f51f4f65c71acdc1152c08b9211b81907b551e0ff47f5a6aca45dcfa06f09bf195d19d7b165b52111b601fbd97b192f62465f8ba20773b1599c8041e91448eac7a5763ca0628f40768324c5304e1119ca6a1fdb0778 +d = 19269dbfe4184249952a651a507584746c5b62c64cb3b17e0158aaf4d086a4afb0330c1 +Qx = 6c60a475f2a3635fa523e1b138edc36f51e94a34e75989c2cacdf8949115d96f11ae752 +Qy = 494d5e23ba9071b3e52c58b1d0740cf90cee7b084b9ef7a4a7be8aa47ce7b3d97c8c51d +k = 111f4dc771b6ce5cc2f42172d3d70fe77c73683bdd2ea331ff711b7e9d8c3e4f2d7d6cb +R = 027f224c01847c52ebc180ae81009923ae3453be1e0d94b5c2934603577f36653ecfccb +S = 1e7b771631e5e72b7ddfb9c73f684b93270269ba4216cf3926e43b2ceb49756e7e7e0e6 + +Msg = f4a08daf8f66ce57a986f14b918099bcadcc4308bcde7c169ce8536a40d94a928cfc0968180a2c2a242c59df73ff79a03687998c421cf9a0e661630378779a4744ae2a6cd24ff61d7fcd6c11a4c8bcaf358075e96f864df0998ee98ee393b37bb38747b70bb7a208740959b45174a60153ee566e0f62528e9a5e4466186fa650 +d = 03835814de0d6441cd80a44e40350cc8bd62ffcc81e939a4410bb9c9259e30463c453b5 +Qx = 5ce9f6c979bc1d6bc41f41095b7677cc184da8918265a7f0e5b9dbece2ca9e0667cfbad +Qy = 39a395aeaa04f5168de809164285974d306e474a610d89fd401c375c9b73f0d23dbbcf0 +k = 0b714d734d063aa81a389be69c56dcc23bcced3517e330572f79c769645e7dd2fd55c20 +R = 0e4d4494f91e79f2b1d1c0e22ebf744ef448f57c951f1b5f4da3592fe60008ab00f5f7e +S = 02edaa4d8731b598c24b993dc5bb4888ea3c2dfe2807daf88170982667e69b76a8ecfe0 + +Msg = 864647405c70939fdb4c026bcad53218ba1d438d82c9138f0f0ecac815dbfb242307cca52c84826cf6556c51082a23f14252dfaea43ba229f7493db2bf8ae9cdb0228dab9e25cf385b504b92cca94f813acceaa1f18de851b8936c4dfe9e4e17002f02dded6b4c231ea5e614ab46fcdd637b8c6193e8d0c2df1b3d883b97e1e8 +d = 0aee83dbed3b703cb6e60d51e373eb20e298ac005fa6a572d02fa1e6da0345558ad2a46 +Qx = 0dc25760af992a8ecc108373281bd0d246f95933ec943f6346c1b2b941a03b33951f622 +Qy = 6e35f02d225ba11d2ed7ea392898f78ca0deb2a47871eba6cd2be7440a410d910097de2 +k = 1df142187f8b27f4888075a3784aebe0fb7d80b0b6d3497a7adbb88cb6bd26cb82109c4 +R = 05a530bf1135ea6d599928cb0383f5d391d19be333b1577ee4eb6f2a78b54e4aac0e09b +S = 06f3033cf392f698d1a1141cabf138c411f4e20687920f2915e17e805e8657a887c7953 + +Msg = c87c8f3ad5c28a027b28ae5021dbe8d425f74181d519451f1fead7a1f9dd102fa6785b147b610610cb59bfa91fa363bb79ea602a7d7e1439f874c5dce748e5c320560c2d9676f3a948754c72b6db249478b7e19c9829ab4de2e344535d3e0b7c20c272f82556a280ef491524b255c4fafb9c8ecb87b0149ddd9d7bf6159e3337 +d = 17b65c66514019ff935e9d571a4e68e9ee4463b7b9a754b93f4f7741693f4399879fa8a +Qx = 5bfb704629596ed05096783e49864a11874f319b4020917f1ba700ddb0606e6e72c1793 +Qy = 69194592be64c33c2f63771af0e4100d060e9750031048002680541815b311ba8f7ffa9 +k = 171b5c698175300b95dfd5ed8d3fd7cf4e19105ed7193b6013103555808743501ee8c46 +R = 13f001f287dd5c7ad9af8d0105b47caed66ede41dc1e121a602610ce20e41af91cbe586 +S = 1433d5263d5233c40c0ca526b3657fcce8cb88ee65105b5f5ec82b26e12bfff11c8812a + +Msg = ac7da7611e2ade20aad64b418a16e02e79ab4894d758550210eb10013a9b5533132be701f8843c840807c4167c38d21dff168d3baa65d5bcf285b73dcbb75819f8d7a20a849de335e19bae2aab2ca560b93d340731f291599a5b28afd7737460d291105cbba6d0290e836f6f6c1113d1b2faf90ac5de7c64e25206d79380a4ed +d = 17d2071f39ba35515a8ec977ddd36ca15983e15bcda626f15af61d87d58114f4c80a8be +Qx = 6f09c255fdaf78d7d341fde4586526fcdec34a28448c7fe65685a67b6c33564ce9249a3 +Qy = 24ae4483fcbe3f823a7ce53db96ef2f6c68670e107e68cee4f358dfa844112d6b2144e1 +k = 1403078da10f55724fe7b56dfc55990507307386ba82ca8f6340d33769ab1f6ca894bdd +R = 0a54a35767a1cc77b2332b04694404fe5a31ed8851ccc2abfa5542b0f5acd9be9b1f02e +S = 0577e0a1937172a6d45177c2b328d72f75a08a8a774a31151b89fd451d531348695d870 + +Msg = 5757c472fa2f81430dd920f39b61066a28c870b80e6c96f822f8f19b398c3574d159cc22120454dcd7e97be8211916e4bc8db365b2dbb99a6e597d06e6645046a0abdccbd06741e9c0eedf33cb78d78a540c2a390719acc498331e694e6b0118cf4f787b51c7b7237458a6149d6dbd0a08bae8097e919f970fde920485e9a0ac +d = 11504659e12235855fe55220287a101e511d39a627f8a0d414446385d4a88f31507fe74 +Qx = 192fb9bcd157c7ef385d48470c3173ccf1ef9650da7d680d8473d45ab2064a073232ac3 +Qy = 14ddf872b711157d121b0a61b88a7eeb7cd260f1f82ec5f62fa2681e28c7f2640e305e7 +k = 17e10962721f041946bb5ffcce724c9f284b1c8970f974a069c36dd4391adb8cecb8bde +R = 1546450d25e2536aa14b8751e3b3e7eeec8a6c1cd967ba0f03e6bfe64c0a59072280636 +S = 0159c8d6499fcfe8ac7b2e84990a714d7888d883c16c016c4b165f36d62c3493afa67f1 + +Msg = e350383d04af0f4081bf09b95d1d53040e7acc64e56b13b653df31dd119617b800e0cdfeb935dfa5d94f1d7814688d8ce41021810958759cec76560e1e5c0581456acd1a020165849b2203f1c11d318d816697f36a86b59f160faeac7dba71682d3c031d0d547725ef69cbaa28345512e38b75ab011911d8924b2d17a857a96b +d = 16e4cbabb03215767249ba2a608708b78d7387be9e77f5efd2462467fa05e8dcde2c036 +Qx = 112b7ea5d21df8ce52772a1b76a52ef6f0da62cb7718a467a034618b7ce701a05cd2467 +Qy = 649e0ad181437b4eeec87e202d8fab1c240f9dd9b31311284c24d89160b1895be541319 +k = 120e4bce412311d3e7adb36dc11d4cc1da8a4b9d6cd5219e772b3dc2b2b8ce08833748f +R = 1ff2d53a8e6c1c23807eee681156a146e8f2cc1a8c262850dc69dece31860bf094e7f73 +S = 1e8906c0bf2a5f922ca271def90d704a1425e5cacc64bc5761b000c7df0f8f9fab51f2c + + +[K-409,SHA-224] + +Msg = f153cc61981a46d8a47d17d29ec157fa93fcf644beb84558db7c99c57fb131dcbc5b65581ced5ff0b29bfdc66ff703ecdd4290f7c353c02a3e6d6867f33f3dccd1a0b6752b8a35fa143f8921a5078af9c85b212564c5b795da9858c7955095938fcd10c21e35e1abe905e84c8b4bc05f2a06091ce876d9519b96951d08c7ac9e +d = 011c6528939672bed3e8c905b7ba594c3ce95f37fb28044f210cccd01dfdb42c10e8e1a0b5d6fc757834ca7f08e98cbc52b0edd +Qx = 00b570ec1fd09d7b4d102f83cf37129d94c9cf2f982b702c5d1172bae2df558008518493c08dac6f76a6646156f123c4f33e798 +Qy = 0e3cfe1aafbf25a5a4536d6c0cfe13a540b4a3c97d4e7bc6c0346addb4b0c32dce089a7a5385e8a3e67606b45e2062c642bbbad +k = 027cecbe83853037cf46aa98e1e1e552a96af0bb24e57756d8239fea5d769b51b83f195b7801b562259ee644ab4047764d130a0 +R = 06a1601e07dfdff9d3b4ffdbff124b717403490853099fb4a00ea98f84ddd64e908f99b40a2ba6ab88b2491a8d948fcc2f207db +S = 0741d27c0dddca3641b56ba1e9bacb0da1fcee46b9e33ecc6990b98cf0db74668ef1009a50e5d55f80e6642ea48689a529c8a08 + +Msg = 258c91524423b5c876432b1930c7b07b56eb5e3945f1e2296a4e5bfb9b9123f800ad195d6104641b1f1970bca553c2032f83d17252e52403a9381c1fc18eaffdf026f7537aa27d84c5e3d6e39e651a92a41139cec5181fe794457f556b390943093be719acd23fa1ddf7ff0aaf0479484a381a309b4f681af74bf97caef08c22 +d = 07e3b714496dd118d8f3f597961eec5c43d0265bf85723b0b9b0616977e0acc2cf686cb6afa6cdc19114e27ab000e762dfe467b +Qx = 07dea0ceb73b9bfaff7147a36436cfa7955eab02ce7fe9b60dcff3e088c5c9281be5907de3e06ebb2e21dce8bf3ff85feeed500 +Qy = 1cfa9b30af20612666e5df798f91eb4647d8f5e1747c1b18adc6b73a848d987434c56d13ad78b775c4096e9f20d4878bbd9572c +k = 028a8353c05129dcaa7caf0343130bf2e2186b9cb5ed0a27a565e1c24eb882617cc299d486be76fe0f8f3c52678b6992288d7c8 +R = 034299ca2aaaad51f12c90e8205da305523713516ba6e7d245eed8ef94a1b2409b98ae93476aed6c9b9aef50406860b4e490db6 +S = 01a1adc76c65d77ea686d769dcd007c0101b4cdd0934402fa47dac22f8ecac28fc05c2f6763a6781655ed5e7d84c41157255a4c + +Msg = a16a0d6fd57240fe88c7c36b9f7f9040cfcaa9afc4beeb8300818c5f90cce73b819a12c31d42af33146399cdfa4ed4954d068dbb0f1f342269dd29f1fe357e7224304b67b0f924b794780fe7e6aa9dfa3380252fe7177b43e7b1789718949b9ec1b943c83ed4399491482f0f59d2cb8050ab6f8b5854d76c50651428cd29c40a +d = 0182d1e937b037bf7f84144f7d4c94c935269c9aae7d500aa459a7a0ec113b232dcf282908eee4c84b8106cd38cdc41db3f89e1 +Qx = 0bd4f1ee6a967123d70d488dbf0fb43aa5e93dee5794b4492277fe559776f740754850477e275cee9f1c375403a4933dc986920 +Qy = 191a544b98ba954cc6e060ba26a52fecbd1f0dc7c15381004cccb799a9f7960a3cedd02d36fcaeb0ceb844bb4683998d776dc5b +k = 07904af733742716366f8ba07086f924697ac8a01bb4895bdb5715081ee89eaeafbff4cec44eb0ce14e774dba71bb9b091d2594 +R = 0723b2068957c4f2ac1df69378fc013797a3b071de30b514c3e610002dc8bfced32bd2f9e8f692b653e736696cf818b0ecc1e10 +S = 058455b8f9abd5fcc28a4ef839ac0245c3feda1fdcbc3c171b6928c6abc931e8b0ec34382d63e414657e9319d2965fdc9eb74cc + +Msg = d02ff569828fd1add21f6bd1c50cbdcd09222e458ee79fd5dfdba3cbb84e9d926fcf196cccedece77d5aa17f8c8cbf3a9facf0f02c71d5c1c8aeda9d75f6fd7b6f2c5c70dff992ef6e02c438fb3c66da5a503b3c39acbe2a069da457595b542190d818015d462670b0807c401e36b1bfe05baff3a8ccf8d1f5f8de7840e87993 +d = 07ed09428f460724c8a5225a31151e031d9949493fff5703369c401762345d002c4ce424294baab22d9e71edc4f854510cf0e6a +Qx = 07fcd003a8cde5503f5582a42738738ac7efc6cdb3813a00c072fc114006be9881c0a881ca35988dcfb8088f3d07a03943cf230 +Qy = 0e7041e666c1bed3b80a691ecff60ad4afe3a544ce58030bbbcc130045e2c611d65f322ec78aff6757cb5df8ad54ee8a09616ea +k = 02828c8c4bb1722b0f03262de32ca8a605c4046badb20d8eb9f19aecc5c69f199aa48d09b61f285254425cb4bb5e0763dd471bb +R = 06c99d796c5d4fa21c5cb7cee0b7570edc9d7e9d7c3604f5ca3766b17e44bc71d8a74ac268b8713cc2ea0adc3dc1971c062b4a1 +S = 075962e0ccbda2280e502559f48c8d37704964f67f8cd3b443b89be740976f1bd929c175560fc8cfb282661c0fa792a5b200401 + +Msg = 57befce973b225cfce7f996fa5a1a43acd160681b88a87b7de04544eb7b6a719718f1ca7f559b6531bfc18fca3836d2be7f7a6e48387b7579a6845796d30e46f0dda9d82680f8c96c5f0989741adef9762c3db763cae2699cb6c112543635e20ed5cfb4b55ca2ccb32d2d13936085a8ff95ed658a54be73f80c912ccfe5f0ca0 +d = 0390f05b9619c27b800e99aeaf61ef7f6249367d5cfaeae3c7b523a8b29153eb8a77132f6c4412545a842d6deb7b7aea7e2bda5 +Qx = 1cbcfc492a2a6bb8a7341df67ef2bcdcd706afabad5e7ed1d63387ad9b0dbc47ed17b82de6de936752632e43c393a93fc5cec0e +Qy = 111768994b2dfe9677d9dbc45d4b55fbbafdaaa2b2638ba1605c35301fa557d628a87d0a7febcad9f8eb4b51fc9c807652579f6 +k = 00b8d236a9f8edba7b5207b4c7848807b933b214fa25cfc5a0e73f750d30051264bb9f6702837b0f65a451d4ef24f047ec4e9dd +R = 076bd4755427fda22a0f177624477c59de12a12621aac274b980b5e1ce5dc700591eec13dc5bb48c5c8643de287a07a48a6a7fd +S = 065a5b0a00548bcd7f59518f122d79c7552ca6097f3867604b462201add5f326807f0e8779f2177f277e5ed25253885ca81220b + +Msg = 4277ba40cb462860ca722cb4ee71c61836d2ceba18bc91f3fad7dea478972c6da0ebc02815eaaada1d1a5e93d7ab353855ccfdfc94a5742fe18daee2328871e06c1ab0a9a989d1239df2d2d27f96c415e7ef9a941f06c6790675361173cc229aac7045f49eaca207f59c497619ba32e932b5c1c6576812ee5b146e2cc7de5e62 +d = 007d18652732596add3db31f7a0ce6020d03f3df58131b0c7c633faf619b8210cd309d6c0c4083aef1a1b6d2a756adad0bfe344 +Qx = 15ad0682962b4dfc8901a0dc77d548ed616286733cd9b3ede937cdf4401ab8b3e3516d466ba43b6ab5356c4e72845767d55d27c +Qy = 17e4de3288ed44b48e7c47b16e2afb513c9763d5bf4cbf9a357c128c94a758e3ff946957df461531def2b8d8411b81f45f0c2dd +k = 01a896c30fcfdbe583d6b0119f467f47758ee01d4d601eb698f444ed0f76515c2b8053b11ae7abd0eef7aa61145a53d12d560d7 +R = 053b1cd57dfdd8d1802f3e295e450a155c366bdc2bd222d18a4d08369c25e53f1f633958b22d80755ecaf8362d548b28dff1ba8 +S = 069339fc6058762a99576a96e76f75275f848102bcbc281e59fda26c98fc48a3f1061755e80740a233e03287f510f4549bb1874 + +Msg = 57ff6792ed4b12220d179bc0ea57ff217f322c85bd3676a681d32d7e4a3e0c8e891fd267df17caba5992f68c35ff670b60b4bbdfff82404f6ed996c30539bc395120f97d4d7a652eaee82bd8f9360bf8bb73748b8bbda9f9480eb54f7eaf2609d4259329e8a5ea020521e7dbd3ec56f23c849932cbdf2875f5d5c774a9d6b0c9 +d = 02a91244ea4623b63403dba807d60b914ca3b901a2523244c322f2f11251446d3f15e869d086ebecfa1a39ce304e8b5c8de23e2 +Qx = 0b7ad8f0a52ec21e54e28ef603d76652dbfecc7dd2427cfaaff3d280f0d1f62187d77effcb433b5bd44c3d0c0d26c38d3f5930e +Qy = 080641bb0163130be4444f79c500ceb8d6a9b2cac42d21d31b2fb29da075bd41c6613f278944adfe92d3c99d494be9d4714e9b6 +k = 070125c89a1262a88f22e874c55ed149de6d961d6abaab2d13db9174e3cecb8f497529957058a0afe5361ddf9d3a5a3b923c7ef +R = 01a28cfad13969c6449e5a0f879e01ef7dc1cdcd0bc77d20f3989c588a9cad12a4b52743c12f4f6e2154ad963bf234ec96263f5 +S = 066d7f0b364a640c6c620e3d030448d155cffc9ffd46a6adfa1c13e1b01892463a4724465aba3eb07009fa604f3af18109cb72b + +Msg = f85113eda64478f460b60f8084220134933de049200a5f37884da7901471542e26690a5fabc3cbf9e679ade71b6e54d869bc136c3d34cc4a9efcafb777abf046b5ae5429136112a9a36a475121eb1f33f1f43481286fc1ada98a41064a1fa38c89e99a93065bb2a119348a9e452497fd5a0d2b83a66b09da9f47a0583732adf4 +d = 0068c56c6b5d50d1d4e13d3837d8c5e8ba2f825e121b63e97603fdfe78bb6899600ff0dc87b6b3b6868ad0d2f62b7b7a31603ff +Qx = 0d9a4f5992308013573f97864c23b98d276975d80cd6455e9f0d8a62d6674f3aee3d27dec15903da4e9d5908cebeb765ee02c80 +Qy = 01f61189caacb05dfb982bcccd603a769d0e1be8f9223288b5426e7f88854356fe825f11a88918085692f33b0f4c61ab09a861f +k = 02ea7f0d81fbe3d4c865ff5315d1cc38f9e9a8653fc91dbdf445b62fe09b30ccddf508783ad87c8a48a6ccd5c9e817fe2977f90 +R = 02d7847479c16c4cba834ce5962724f185be06cc04a9a8d710cc72e6063a7b64fbf2694f5b62de65d3d347d34c0dbfd5a4d93b7 +S = 069e32bb19d20e873d0e62b306db4d5663576e4b2fe75e8ec79b7a63f38c8f1007a817ce30612e8578d48c63b04b1d34904010f + +Msg = 42811e9ee6dc509572e1cddbe5baf00afeb0c5c13e3755b922eee9e210001676082bc9edc3d78db2b5bebea7a2c0cd2b369226c2b8f83b28f33fb513407ab9d287d14b112d6c3be2493805ace5cf6fd366d03cfb28f4ce3f0f060880db64d6962e997463ba7c05b6fcd1e66babe4b94afc5c2d38c7050c69571d27b66ef0090b +d = 03c88084f8b78446db431bd6e240a0c050813d2a763675b0ea869cbe183df697146cf29c03479af3d34587a95cd257027fbeed8 +Qx = 15a09436de00d8d129e297ea60e04b704c0a8183d64a77d1c527189e25e21d6bb62be8ef5eb2dbd833e5f9c7d5c3e69c9c01882 +Qy = 001c32ba376d2e9de28fca644b0d567ce1f4ef0aaddb2adec6213d03bc8cc99f9140005bed3cb6c3c0f5533275734aaec47404c +k = 0132f4763959863a32919eb591799ffb8613797bd0b617c73654ec9eb32e2fb86631b66e28e1b4cc4aeba65ba8c75aa1cfacd73 +R = 05fe0ccbd430d9459e0093cfe2c1d1d3edff8c1ae7111299d2e04f414c46ed2cc88ce9cc9e23e187e87ef551de993f52214d609 +S = 0557acfe6347baafe031dc16032c45559693e2793d9b6d372670b09757c6f4a3e5ae5e55264137d1859c8d9f8f03c25de409bf9 + +Msg = b38f76ede7441ae0887e689d556f43155b38dab7cde487ce9ef9a46f2957c830d4d28006873fe2368197a6931f6fcaad755102686a457a7edccc8d344e2d2a9162e3d71d41c09a022539ae6d404955a6ad748231aee1f974d4f159940532fb3b1fa0254bfc5805d2fc68696856fadea386c542d3cefd1be3af04ca595e54be25 +d = 051af7b63bf3297ae20517faaa1552f4fde65819dbbff6a52721611e5b7dc1242ed6e69768cdc37ea8cdfd1a5971f06b84b5803 +Qx = 09cd1280a2a79b182ddbd1712dbfd12cee3345a89636d7673a5fc3e1e51400603176e27d538e90005625aacf5cadcc8a8c25532 +Qy = 08b5aabedce498476b4c65ab3cdc81f819c2db670a7236c0357a86f9087b83e7568cc6e5139fb92f81975756d7dc4f48be87df2 +k = 00bba308a3eee9e3ab6d2482bb728bf44cde9eedde15af7300c57c2c1e6fed2ee4e404aeee3923e7871a2ff4ba6df64f9d01a87 +R = 07a9e69664b7b81edc5d47c014696d194b2ca4705b2e79af692b285ec476169d041dd9eef20f7d496fc49b8597574d2602757ca +S = 01521d7cf6aeaf1c8dd54a7776cfac02967983083770346d9768a2629d606be90d58ea82377413a0fcc3e4e66f05a0d05d933ef + +Msg = 356dc86cef7979148e995fc5abe2b14a7d5e4e42c9b3509b4363bb80c581a66f4e7e4aa53a4bfd37f9a7eccf75fdd726f348f6a3f779e6599f61bd1d668517f40453b39bcf35db0852a6a6218198f52b7ceda2ec55fca5abe8e5d93af9a42b9ae4de9530c5870211bacc27c39aa094013db703de2fd3121f08d7e97dbd4e8946 +d = 03d65bdec48972d03811b78150a06956eb22d337dbec5416bbd8185a6322cd8c0ff8000210dbd1326422289071cab65175f5d10 +Qx = 00c9c1bb0a80c4b4863d78003e21ee60fc553ff72968c165f6eb6940250a6cb7d545c6aed3760e42370df79b0d37c2d1433c486 +Qy = 01a9d994828ac09a86c18b9758b3f6b91a5775931a7a6e4d8b052204c972b993a3b420eb8ff7e91df77253a9f5847c5968b5636 +k = 0156d12708324cd30037753c78225d183723d3f15930f23bae854f121094bfffb5d7dece1fca93bbe7457a2237760aef3db8e3f +R = 071466e80e2a7cd8e6cb6dfde259a08619f880a71899c58bd4cd33c29f7b321d269533720101f2ef70f5b8e8f05c9cbe1ebc303 +S = 077330e08712ad709f855d92355cfb7d565efd806c6a853712916f7c943bfc79e496366deba79ef7491abad23086db341f339e5 + +Msg = 06fd39a50bf25e89f1071ff81fec5d1e35b6dd68990414ee403dfdebb792627b6a4ae3d2236c159e4441ff90b61ec87b1592c538515f0486b19e58583394a05e6411e69b4285d6d6589982ac0eeb2c912c4948789cad741183663fc070943389d4e9a1150b8f6088fc50605915e9e24b2d98a1f539024770e4820e14ae42ea8e +d = 01f1a8b5f35dbbf82c102df550c72216a243f986f0325920f6186a16d1da74228cc02be6024c7411160c183c923c743354f9438 +Qx = 157ae8d90fe2416f70a7ce0669acdc0b5064ba650cb5416e59e6672e45b591774ebb2f793c3a58e953da1ac08272d0b949e7b50 +Qy = 06d49b9784f8423812967b857e25dc3af1312a6ff29579f6acb6e155b6848ffac6fbce51bd2d41a22ef955f690e2487a4bbff00 +k = 04cc45e00847818397c6abb3d176cb8bd77814abfc253e3b0d799dff2c3e09a5195ed5e6232873f2783c8e670b52a839e06bc30 +R = 067b418a5395216b83ab00d5568eeb62ae0693af2b0e4d052c6feb70562dcc06ef852002687099dda114477871b924775e8460a +S = 061d1e4d713689b2036272ad41571759b52a78e0f8a84d1f3a277aaa33ad558f0b71f3c5a99d403e49df1afab66059db20f9f32 + +Msg = 6daaa41150ea252a3e966a338377307d909b95080e006f13027f2be5059d9208930c5a329994c0b794ef50eb059bc6c215f68cf42260bd410f9bd86d2ad5ab7179c7c92de4a93a5f6aa17de5aefea815e7c0b78a8cc53c21dc4dee037b29c9df4e12343109283ffd5d8a3b81fba1b5e95506c7e01ac056c86dd0ee23bc21af0a +d = 031dc621200cd174193d95e9092ffb86189c52cdbb9ed937593f2cde7c4a0264b9100e1b8407336c8dfb5520d28a18dc4e39a89 +Qx = 0904bb904d50bff09bae5dd21f425c808b41001ac917b022f7e1cda6e46504781a69baab4a6f0f100c4fff9ced26f871159cd30 +Qy = 15cc300b0efbac707635c72bf855de4290f1b8b70c16f9bd0cb771ed5c760ada04d0ff648f118d64e0aff6a6de16def15cf7437 +k = 07e32b1fc1cebeec3d84f56a67c8ea2b78723e7010a725ca4745e849e573e8e4a4ce11d1af4ee508b80fb5336de3cb53161bf44 +R = 071cd81dfbacbb67be5903cbcbe402c0420adfa9d14148bea600b178fd06278572d34eb46d857085a2a4f48cd4ee9109d607dae +S = 0347b1029e67a6ea2a45af1f7410dc951db813eabfd3c7f3e2c294b81e1c54fa8c98569efc580b68007bfa316424ac6eb353ac2 + +Msg = 6378dd1c12c5197b57d47dc46a67949bdd1e0809004e94d49b0234126a08ad5bf8723ebfd132145813136d8b7dd096f56c34248f09a65c34f60c2f80f9a51b3795f3d2518b11aaeaf6dd45a323794080b78f85d629e5fa719b6ab0b14c78cd908befeaef0dbfaa08cec9318bbcb376d48b11b68735c9554a45293db5e9239ae1 +d = 016e6750245a88340b0f0665b890459f8038e9b1366f2fc1326245a88d4c523ec94429f21869ce3dbf75126e58f77241c99efaa +Qx = 10184fd47e8e1e4d534ca1cf67f15bc8a80921b07e251c22eb88f25395e08d7a9283774aed204fb5c14aa13c63a94ee691b4ff4 +Qy = 1252ad972bb8c0b286c222f42f7d42ca6561bac5e517921bda53e51043f13e711da8a813bb6880678e4d6a16820bab819d62e59 +k = 07f18539d00152f5b9a75d4f114812b87024e8a8f9c9a8d12139d0a74d87986f4305bde60375918ff2dfdb88b6deda640e17364 +R = 0735a15e7bd1f69f4e90739d42ae239a8e9238ad28b63ce291b57cb5b99922fbd5dbb7f74fcc23117243efbd036eded6ee0f28b +S = 07bb3dc77cdd4138a02e2d5fd4f6ff8516b4c95b8255c629132ea8705c399fc60f8fb660ed3aae52db283aabc3626a5559dfe85 + +Msg = b898d0f9bd80e083fa541f457d14d853bba55b120424a95e1d9511c8833f48444329e0349d68204c4b4581ef1c4dee23ed0a4445727a72e1e6cde422f7c10ae132a3fe681f9d741fda263e73f7cdf10759467c9d76164086abf6780ad474772771eee22d195339bb8f6235e0d992bbe282b13ce4fe01417f507a2c4fa155e108 +d = 0788fabdafeebb72f6385301e30024b56639e629a400f9c50d402cfc9b5817844f06a451fbda29c7ece41dc9ffcfc625fe0ff0a +Qx = 09b2c36d221d18189e1617cb2f2ddcd64cdf8a42ba6acc55f04e9722b11588f7fa861a3940820d9dabbab631d7fd4106c60f37e +Qy = 0da099cdb10dfe2d7c0a16ed332b459e7be31f44b0b2d595dc948f0b073ac4e439f24f215fba5ed50aef3702731d6561eee1986 +k = 00581369aca680beb705f52b6bef075de83ad29034c3d6b2949b551a0bbd100897a079b49d41d5030e1a6950fdb14d70dbbdb41 +R = 04f62415c99c8e6750f9c41c31cf050eb58f61f62eb0b0023d61dfc30e7879d4f5a87e88faf55522631a29fb69d16e15c354323 +S = 06df238f34b5ae664860b43ea11defe3120591cfa371367096006c03e83d372bfb70da6f789665136b7dd1c59894a2fc5038c4b + +[K-409,SHA-256] + +Msg = dbe04561ea8579672a2b3afa94426a3cbc274b55263989d41a778bcb082da797d84d930ca847a481789524940701cd5f1d11b460bdac0bffb0b3a3abe1ab689c519700de85a0a571494ba0cfc3c865450eba7a9e916b7fa9df55e8a1c246c992e6a0b44b78274e008472bed8d8411633e6520e1a906c5d0c8aafd572fe6f1f64 +d = 01b8dfd64563dc219d6eeb53f2e3ad1d771140d0960b211dc1f757af5e297dc7548d6133ddb574711d466688f80dbd65a7bbcdc +Qx = 1ec530638ea0663cd3a9b237dd66402adf50d3094391f2343d7d6c52c1d14145c245464a3b771e4b1894462fbfaf440e53eef7e +Qy = 18349e244b24c8353811c29a60d8e02caf195a424aeafdfd0361846d5ce5eb83da1901700f00fcb85a0c2543b49a8a3ccbac157 +k = 026a26cd09c9329cd45ceb4c798846dd81af67759794f5cadab84de19a835f8a0ae49b12853b1e92822477a73891f85acce4216 +R = 04d83a5f9dad246717135bec6e386ec6b73be9ea6d1a17334ea2003a723d510914167d136254d6cb64b16ef7eec5044b8f2ba28 +S = 03e81601d0c66b507a491c530075edc5b09d770633a4c2355b3b1c7df9b200ebc7dcb706be1696aab70d4c6e1c4a7e532284670 + +Msg = 48a8300820fea2ad83c83f7d6b24192715329c3f159d56644e11ed25efcbd3d31600a813b909812987b97d1087e74a63b4494cc031c63492b6615e9d6e5b36f62cb2ef88b9f736595800de465789f43811165a5fc093ee6d776008739de8de2a84e878748641be8bd52e5b891c4145f52bbd46644852a43108e93d86352b2a3c +d = 0422131829608ff730c24ddf7e8b4a2600eaa9681eaf45432daa7d41fe2fb488fd0199d431a1ed823801ce21f4f01a4dd4248ca +Qx = 06ff24eb0ab812303bdc9a23719caa789eb75775e686b9511bf6e07d60447d1601a48ae7f3041cef5aaf3ed2adb6feb422fbc54 +Qy = 09a351fdc9422a81ebef5407d0d74b52a348caf3cf6e1c6c2af722c408941de154619a1d54bc23a9dfc0c4964f3936d62daa6a4 +k = 0313ec63c34ed325d770664aed3bfd1a16eb636516eb686e806b0acf6f0d117998b30fd52068a36f03d0db3ec13e6989c6f196a +R = 0088167f96d807bdd61e65fadaf0c56b623db42b831909d12641e4d00e7bca6077b36cfa759fcbbf087c31f294f20a09e0bdc96 +S = 01cbd06232b4c73cdd13208dd254ebf9351745ee6196e3a94b9213e931f141e4cc71f3d318a67e7b8060e11e88783fca0be41cb + +Msg = 276e3a986ce33256014aaa3e55cc1f4c75fe831746b342eadb017676b0cba7c353b3a2b554522c12e6aeaf1364cd2eb765a404b3d0aa61258194a30219d76d2bfa98ad20e7e91756cf65e50d7914157f283f2ba3930c0ad3a97532cc747b1cb9c806fff497f0322025a3d02ff407fc7b5808585b91d95523c9d5864efdf7d983 +d = 0095ae8e4c7e55eb5da01acc05ecfe72a4dcd8ec152f1c8dc165014f70eb4e4a7861aeb2b96c418b2d4db58659e76184e013a49 +Qx = 0a3987d7262dc30e8ec11458ff7091ca993bc61f142ee535d544a2c88a47f9601107619617a5e65cdd6d5e1a034aaa223044342 +Qy = 1fc8af29d5134ca9baf92041b6d6aefabccaca4013c55c1581ac05db6141290235ea09650a289907785d282cef1b9efb381ae66 +k = 066015a77c99015ed6983bb379772bd90e03b9c010e695853ebf8e461a20fc12b20bdda47eef856f162dfbd9fd4fc1ec49105d3 +R = 067c49b96e5bfb6a6d625346c3ecff13b8c8b7e59c764b73b256ac970aa4056460000e599a8195f2d235a75cee8e5634acfa7ed +S = 03ce25ef1af0784645f0579da381542f5b8aef377e5b79193314f84853e2a07a4f1aaa4d8210f3a3c249a879cfa3ea8af43a929 + +Msg = 6a4fc1827c3a7256faa8ec6a0f3d23559d6949f8cc20e7f76111dc4ebd59213951cbf0eadacaeb8862d6baa0cb298645e4314b1c303bd0d5e9893304d4b7fbd36ab05fb6a5edc3fef763e3a4124d61539eb616b359c5cb55b5e2bec50c91dd95fc39ddf521aa854216eb5a707819fa6f067b316a17a3b146e7cc2dd517f7d63f +d = 006f2075bd730f34df111ebda919167b1d3358ada32cd6747cb3353bcfb814a77ac70cd51b31a0e538539453bf9eaf9d8b384c9 +Qx = 0bbc153deaec0bcc36c03d24afd20dacd9e78d104d94c279278d04b597ccccae43cd3e64c9e1e58fb5408f376dd7827ede9dc3a +Qy = 15ae0d803acf12d9d3fd41f74357b1c93cec0480f2e586d0e18f15e569d27d3d106e192ee0c1c570351eff1f463dc07d3bea933 +k = 0314330098250e38145d11a48f5043190c6b44f8572ae57cf83b1f3c4c03ce38b90ed5e157464c2613c82943d78c938fcde89d7 +R = 0160b20c370ef4b9cca3f7dd3c23f70efe6bd80751ca021731bdfb0f45ae07e5f2144c77795aafdb0c3a92ebbef75fb2d334dee +S = 045188dd2402ad36ae4278a9910648ed5e71d64737651c133aa89850e3bef2207d58ba4169e471a4737962f5fafd50a37a28e1b + +Msg = 4b088199bd8c94775d8ee508377d672dbf50f6d2c7370e99821ec8f9387492fb2eebdbea473ea18465565f79e2af418555f10c4a527e05a9e20c9c00b807dc8b350cd4ccc2d87e91f66addf02ce4f43597aa258ac6fbe9365cc2c8e8bbe5c884abc929710e8423cd6722a8f473bb55804159a92a3d8b6661a536b4fb9293bb0a +d = 03887d284e9ad17d38bc6da9d83c192a434c509340a7f233cebb032b09ab7c4c6e8730b4a80844898616c9abcd16b753c6bb4c5 +Qx = 12a6d5c5690ebf14ecfa54ac97b73e88e16e757c34c6bbfdc9a3a119f298860d330af295756dec41eedeadc5257b202451faa06 +Qy = 19f40ff28bb72af659d5319286fe21f01819952d471ce2433ade745042a47c2dae798199c364ceb99029c2dd5cf57ef5daa2b00 +k = 035945b45221300f83c5fafbaf0645a7386e209d025b3e1dc367819728f630663fb732b251a019e08dde0f64dd3f60a10065c50 +R = 00c323c86e8cc548123d1337936d4be948bd4bce4631a2194c2bf04e1fd714df2c90e3681e41a21d58d9567a5df9fc478dca8e8 +S = 0493d3f4d22cf8517c301f15bde52cef17c05fed2482f3ef15cdbe32c5f0975e054d45b13faf906896201942f29e5693bfbb229 + +Msg = 848a13465ddcfb2dc14f7bc0db0756832c22dde1e31e4d8b3ae0dd1aafbdf15e954889e95d3bdfd6e5ebb6171fad62592c23277a89e8ba53978c9b1afedfef7e1c3f6d9f31077530460b47834b30bbd84a4da601be988738aa815d3d7e72043243a5288751ee08b4815a017fb5d9bd55833698a0d526b1ed79da35ef0fac93da +d = 02ea5430610864257c9dc393c3addcd0d8d5bc8aab1067643b08857210464428aa85cf1ae6c743fd2682255d4c8eaa46ca21e73 +Qx = 1e502d3f47823ac7207861855fe6f6aad1fa4f2149bff2643b079da23fb270599f744669b3c8ceb4cb0989aabd43d26d93c8146 +Qy = 0cdcfc138451bb59f34dc82b8128088b5ae0cb8a77dce1895d5ffdfc8b4be24a206b9856954508b82b80d0163b276683489074a +k = 0426b90275d720d19c6ef5c8c74c568a636257740530e3ad10de0d518c4eaad8bc58cf4506cf5cdf7f2b03edd1caadb28fa3787 +R = 0123ad87c094c4ccfe4346dadad54a6b1ee1bffaa1b7b9094fe2e6ae785a2b77ce3f5e568e43e8b7fa997206262645f56078657 +S = 00d56cd5cc64736ff7ea0d9840916b1e1c94e11611f93b1b11c2ee98c79d92a8af1a560c9938dc4bdd0b84252e259ae5669d1c3 + +Msg = d1850545c04ea65528849973c220205c35eae98826d169348970d1420b4d872ce233af1daa9e62f6a562544ae3a0633a954a493e9766dd5d87e47486559fdf86229a7c9e1726de21895abdcf2422d438f4ad98d88b45c56742694ad5e11894253270997c049f0f419842482f21c792fbe5613e2defecd485585f1835b6f4c578 +d = 062c757c92eaef41f5d81169ec4968145b5aa2bc1d2a3a5fd000634777748ecb93677b3da12e3be33272a8f0a52300f4a5a37c4 +Qx = 139660fb8bbba59e8f4e95e5ee5b97227220f0e1b293901fedcc6dab86e7c5a9d20c1a097ee2e926a934cce679fb8dcd8d2ed6c +Qy = 08ac510ddf735184e8fa9693da264194fb78da5d1cdc0bf5faadb33950ca191fe233eb8dac8adcbfe15b4f7c09d5ddeef6bcd1a +k = 026868bf1764993d650aaebf117521cd146ea20067cc14a5843f726a3d68e41c3fba82a83d406b2275b3459748b3bd1a8d32f1a +R = 05b17d13ae4d9535d062a2653bae4d15b9b859a87c33e175adc3ef04781bced888f3e93e9804b2251a40b9344c0f8c6bd5be0ba +S = 01ec3322c5beba4423b13a0528c71739a6b39f7b0e0e58a8274a8386167cadef51e5560a3e9d97447e3d3c06288459fe6569345 + +Msg = 421c9784d6fd507c82904e1054edf9bdd1efb58a0b211340086069ad38b7b0dd15c2345fa8767ef71254ed1bd5c35f742b1d3f4765ff9007a5477ba9e5d3d5a5cb5fab4efc1cad73701d4776c6c4343f42b5d94a9eb78ae428dfe5fbdd8e6ece09d5b75cf4346cf27db856352225ab04e6ea56661554fbc39916accebecb3935 +d = 048a313c0c11489939fc0cffc6ccb9f179093c4e13141b92dbbaac441b7ae878c9d412066e95615174a24692555cbbe904a14cf +Qx = 0677c2d364fa86b8b0c79af754e675ea3e806d5583e62087e01590b824d2730e31326591167f02bdd29f8178787c4e1ba9d2496 +Qy = 0e7f78c423baeebf6defe9feb8ada8874cecab083ca2e71d9d8a3fbe846eda69262a1f5b4a3baccaaa4f2cc87220edb1fa6b6bf +k = 012b8df87dd935775b80c62ed6c76974fa5772939a9e7372cb74e033fbae4f78d75b8bfbb82240cf91009b5bef4d63ded04cbc9 +R = 000590a9e8de60b5cb181a1c11c2f6115c66b05e71e0c558ae203ee18e54de68016f4c7ed2f01cb0cbaf1bdc45218c0fe2b1552 +S = 0521844eee9168a501e235de5fd19c84f052445fb0e68bba687ace45d8630070ddd3b73034d1d65788a51acf91273fd187a24ed + +Msg = 7910bab15b6429947655e33a67f41b76f1d7b71534f8904d6a0472c2faded038565272d0b5f51aa915e0d624e9ff48d50ebfa2f09324864f26c29ab73eb39b436c5c459c7cff4d2b62992e3489cb4ddfc05d7366b161a463aa1b782641d93507de43c8cd0a0a0a9d1c644f4554e3edaf7fd794248110ca9387e73ae5d00d299e +d = 046e2adfe5d3549e1e6fa1fe69a7cbb4ac9b111c8903d544268f8318b0b47d4b78fe3e56eb5e639ad5382e7cd5bd4b2c3e70ef6 +Qx = 12902439be50c97aae7b40328984934d6c843415f76f3821c8e8323aba96ee41359e2ce5ad3179063ea5e2c7deeda4d728d5852 +Qy = 1eb59fe96b269cc973b1fe1f3720aa9aa6ec4cf303c5cccbaaebe6ef7c9f5356ec5e76b26b09479d9831d9f5aa41ae1d61f4c47 +k = 031893aef1baee0e21b50cff7002435b058d73dc4d8301ffdcf1e0c315d18c2b16f282e5b294dc88369b25e2a1a19abffb578ab +R = 039281ef10b9a2664b755a2db67b3c410276a424edf7681a5c97244eaac5826368a8095f1b9b76f8e490e2783694d5bcf3565ea +S = 039edd50721dd35d1704167e8cb609f309b9ed73d3c1eece181f9582aabc647c5ec8bd258e5802fb0647372e4c3929cf59ae2d5 + +Msg = e6fc96e060b956c25d50ad25443f3c30a12d199a47451a49ce88307201dfb15ed816982e8888a28daa92eaf3c5584ca6ab2ca9e14577f84396de2e0ac214b24a2279f5e7b344fb7387e9afc8f0a2b77a4d024a20ce6183499b17096947444bbb753d9b39e5c694239d28f9c454bb05468d17ab564ee6cea3741747ccb7f108af +d = 0480103fd6180a431c837643566706e2b9597de0a1346a224d176a5b2c54aa4d064418ed654a5d39f4773fb509f86473ebb373f +Qx = 1d39e2772ff3d26c5936ab347bd5a2940ece42b1964f030c59ab453acd7f44716ba9d88f0828de1a4e730ab27fe1859915818c6 +Qy = 140b1b66b0a87de29ba2cfa799d944b3b898fe7ac43de68b01fb41464506e2f014e0d11bbc0c24996428c93bc1a5ecee5956bb2 +k = 06e9bd0290548d35168f7db7fc292bc161a7710b78ac49ec6a42c9423afea1310597e5978b22b4dfa192489323b2317e4714d37 +R = 055dbf88b6221dff098345226d59d396b6773611ca6e747d26d5d758760d830693df0f5c602859f9caffd0dc3790dfa08c527c2 +S = 03e679447b622c4b06871f2337f5a24150e76efcef9698c6fd463867508e9d7b803667c32989a881c98a90998944c070aa58b17 + +Msg = c8a8a0d41f35537e6fd523ee099eb45e1ad6ab54bed4d3e315e20227db03292e39dc1a91bab439c0d20e36e7fea6ef08983f390a6b5551ac3b4f1895220b2867fab95552cef9bd8702962839bd9b2c72772640e7d3be3c5889d226acbefdcb448432bc503e5a5fe7ae9ae7696c720a799f9882c64ae0385f656074dd8a6821f5 +d = 013c489e8311c6bef02c8f58903b2ba2a98a27cb935d75a30d320af9a14fa3cbc6adcce09235a9eaf333dd05f4b2f1694985dc4 +Qx = 046a1c0e7753cb499d19b2805df770ba54f1c6e03611c302c73c72902867c51c1cf9ed154b8f30f72002421029de7ba2d8fad22 +Qy = 02aef9c34c7c8216a805a58dd88185f40493086213cb4c85e4d226bb5e892aa37be353d9123e9900f8b0790a43d55a19d78c48a +k = 0491dcc881731112ad5e9e1df459c27381a7bf8270f97743466e178bf5ca903971b362b73fdbef8a75d4292e63e225396c7b32f +R = 048425b76147427b8b1969bba3809dd70f0fda24cfb0e92509a7824f027b61cd38441a691efe213f3c331da8c82f94bbde511d9 +S = 00df36683f22e9e86c88097d75409ea297d391550440e4327f67b7af1b09141a0e7a1db40c4b0bf4d60376a6636dbeeff0b6b91 + +Msg = 3407cd6d2845197cd7414a30fc3df7184da204222ffd65c4d16a12cadabf603de8043ea14f5e6ddcc22d3572dc06dec1a23cd924e1847ae285ecf01754e2d1247876431eb98e897e47412a2330bb32990f9714122109e94b38f82cfdbbf2eeb4c6f88f5dbf9f0ccb47939df8be321dcd9bfd9bb99cac9f94885fee7d443fbd87 +d = 02419bd2200f8e1d87db848b0379741685e680d9affe693eed49d82931030b6cb05d21a4965f4e1df2045c8513a8f574ca9f2e7 +Qx = 0641a6ac72455ceb142e00d6854acc5f8b86db7bb239a5054c1ed48dffb6d050458ffea8adb68613ad3cf5977ea7330268abaa2 +Qy = 1a954ab7d62796e5aed370285d3bf91ddd34eff3b995d04967db41c2171cb2157d85032c998795ed476c891702d63ff0108f45a +k = 02e9928f427a86c4491a47b31454ea7d497435af81c07bc96fa61f4507494fbe4ffc1fffa8faadc2a44c7e69c4f976661750f8b +R = 01e8ff4cb8c58fa48aaf61488cc4118df90e8c06cbd88234cc920e5795597ffdc0ab967fa7461082a49de56f02f84cd9d564316 +S = 06e77ac43fc7af3c126f997fe15011fa87a27479fbd5af48e28ccc2c1bedb6c0695291dd67beeec3f17cbfecefbea46b6325fdd + +Msg = ad43f8440071285d01fd79244907803601aff4bc5d14c77483a87cd742144d41c68269d76c9a83c09d2178bbcbdf99f927b378497ffdc907a75a3b0ad019e69758dfffa480871eb6e1e17c8539373de611a557fad120d0bd147f8debe5f09a02e56fb607e9c1253ed592071f042e42fee39775b407225a2b86a950d81bb7d7ef +d = 0722951879a65bfcb414e11712ee9431eeb32319e0ff28601112f89276ffc2b96eb65c7fd77d023f09914a53e2aae2c84652bad +Qx = 0a0304caec1b68b34c822a2a031145677fe515dda977f6932ea2a3291c6bb4fe8f297b7d3c632f9b3806a8cd26e32403c27fc7a +Qy = 0012d4c3231898a4202f3f251802c690353ae9cc28ae5089e259149bce444d31a38927dcb42ed613d4818e235884749057ebd02 +k = 0331611e81d3e6e3a24cc829c1cb9087a8c6f64c286e5f1acfb1ba764eea5ca55be544d3cb95fb98407fb6c8f9eb1b3f7ae7386 +R = 056901f11ec69f91b31f7f41f7856752568b7d34ff3af1a2259fe15ae0b01391eeaffb629976525fce5d182663b7b23a8001bb3 +S = 04e89c3155afda2e64c749536392554cc299b70020362e6701e3a649f0a63ae5a5da4efed5c73b5e8098c0cf47d6f4c45c6fab9 + +Msg = d61a3765229dcd0b4fa6c57280f851ec2bd54d3ee2436935cd6d94e0120d0844adda163995fbc4cd9d7275da859ad8ebf30af9efbdcfc31c7c9ef42bce9011d37cf9d15fb018e117bbc102f7d05750e5072f73d02c2f45509a55627a78cbd9082cbf36807759d1fe2ecbb92ab30cf28434941712d38bdd100955d611987b5968 +d = 03f5b5a772d24bd5454bf26759dbd433fcc7bae4f5c593664c4d75da0cdf9430d7d9162bce3d7f6e13a344259da5a7d6a1635bb +Qx = 1ca1441b1f6e13138880196e69743206ce09c439a507a11c0fed069d4ed23676b27a3a337c976c276809ae725229c9001708742 +Qy = 13c47b14e3069af070869c12f0f39e35a6f334d98210d33c9da01ac80057911f5a392fb5c8cafeea01c1953e97d47e744160243 +k = 01484461d02c0337e8113e51aa7d46330f57d423b79b580a544d372524a853db9dac0c0d16f733b273bf888271135a5162e70f2 +R = 0256d7ab133904a792987f8cea69e8e3cc674cd3c577f40ef6f12b31f52ac6366a2a3ea2b2272c7bab8be00ca0d17989b6801a5 +S = 020d82cb9b3b1f25d993fc18b7303db4cfab91c03a97b249176f9bb2aa5ae7f589c74060d25058c7acb6de1e888ff44481185b1 + +Msg = 1f3c23636414ced48fab6763eed5b22537968e6bf08c178b3d31fb1f6ea773c6979759701d94bc1bee7c354272811edec58eff50c93331b22723d460e56dbee90466b894354777b23b13a37d15a84c762caca70c01518bf34d0c2f072145d274b3b6c932b48bd815fe81161d8507ffbc2f783bd212c29b2887af6d2ffa9d2b4d +d = 046bb4a141c9099d531dd23ac440eff1f5b10f7cf34920b6b702311d490d25344c665ed5211d401def24986c8094165d10f8934 +Qx = 13db47ac0e33af0cc7d74f6ce647fd80cdc1849b15c349bf501c95893be5a440f85b9b029713339fb888d7a93632ea4e0bd8136 +Qy = 1f26f7009cede02e054d6499c9280794184e212e3e1091032fe0e3c189de26d04aa8a5909569017cf06ac2a20acf579ca81f3fd +k = 046e55a908f13441bab63e5327ac346781399d5a9035a72aa21df708b814b67e420b455e1410014cb53e6ab00f526ceb396bcf6 +R = 06db7a7b03d6a85069a943fcc332cb8c54ac978810374b12eaed4a5fa5342c8eabaec238bfc6107fd03d75dc2c6d258c218a186 +S = 010a4115161765dd0c22a0915a0d8cc01905de91d3f08c6d2d85a6a92e1dc00904f3be67fef000ce19f57157deb9afba7582b59 + +[K-409,SHA-384] + +Msg = ec69f2937ec793aaa3486d59d0c960ee50f640a9ce98a3becffc12d6a6c1c6c2f255d37d29f9b4d068373a96beadac98fd5203a9f229bfc70bcd449640165ae5128e3f8d057769e28356e73e35d8e9af7876f608390090892c67391ddfcc1c332aa61efbf72d54bc615998b3be8ab0a9d372784bea48c9fab244482c75cb2de3 +d = 06f2c6e9ea8109223d9a349fce14927618fc4fa95e05ecf9aba1546619eaeaca7b5815cc07e97ae8cd1e9973ac603f84d838393 +Qx = 1f5a9824584cbb0d5ed57f677caf62df77933ce19495d2df86855fb16456a50f157d18f35ff79b8a841a44ee821b36ea93b4f40 +Qy = 1a88299000c07a9ad0e57c22fa8f15218cd90ea1de5b8c56d69506ad0fd12b513ffbd224cb6ad590b79c7677a8eda47a8bdc484 +k = 042325aded3f71fc3ff0c84106f80a10af08d76d5e710a35d462e880e015a36d063599573ce2044537b9f62b51ed4fd2ed8b860 +R = 0667c74ee2d632aed13cad47e0b46a5176940652d7da613e4965876e7e22d89994bdeadd6b5d9361c516fd51a4fb6b60b537e9c +S = 026a01220a1166a4d0172428753e98caf0aaac5b0a09c5a3f11b2645d243991d141f59d6cc502ac44b70e7c48d6b0d7b6ec4869 + +Msg = 70e11efc78d7f079ae41ac3c31c96d3220f4abfe23814a2a4a78d9b1a25e838c3408bd416062e4b0a5cdadf0c6e16a11e00f59711b417751f5e4b43ecad99efbdb2a81c91a034e89edc94eb552c3eba62808563cdf64453a1db07daff8742aea4a9fa738e1322da316b26dbca2954b2bc0de6da7518d28e6677dec6ba8af4285 +d = 004212b7fd913d794fc6bb33e0276e349c052c969ecbf6afc89b28f75a599a9242acf74dec9f374361ba296ba42a38407f9b7d6 +Qx = 19220ebacedc60762877881262c0c3dc0c8a709fe2ea16cdaad3b680d7cc8aae8617f0acc9b5c9861ede651481f39927a24ecb2 +Qy = 18afd77bc7fe54266275fcadc0fe8d4c0dba7a1264c79bc31479f4bcd02245cde991791a7b7e65fbfa907457fb6d450c0985ae4 +k = 04c01ff477786304b24cb9c95ed70ba376ed6e4f6b3ab2f99ac575c92d3801e7f43bab072268705d61d3e2fd881f754b9c84235 +R = 00987cf8ef2b382fb25a6a542e688aa96c098f5d16be0c7d46e961b4a4152c372cc0683993843bf5a04f81e6068843582fca48c +S = 036fba32f80cd2e66bf31baf87616027c5b107f72f11fc766b42e2774e29e10e860577c0d3a27a3b49754e6a189680b7a638408 + +Msg = d922fa515e3bed60b517a2d37cafe4c041e5ab4b5c8d8d4011bf9fc4013dd8abf7add71fcfde5e71d6abe76bd0f749e960cbed55711c87b5629a2c39cff48ed7d0feaf5cc4765e576a4959521f9a45fcba0dc65ae618826447e02ce6e1cab5ce8d6c96c3211adbb0660de7df7453f3aa726016941d00d8ee536cc106a603d126 +d = 06baeebb5ffc89c94c3e8b37b9b0904e7c4b251d204894655bf3b1235710215c29820b9d401c9ca7df1404d2d62d708aafe208a +Qx = 0a0b2a185ad7ddcaa0d8d21b643a14948d3552e25875506d64e236a90d274ad1ca678e628acc208bfe6b56c02df9f5a36aa94ec +Qy = 0fef210c7137237da8ecfc2f069cb9390c132d1c6ce961f2bb3ca925ee727c967f8a46727c8811c94ef66f20836c661a5cd1c59 +k = 02185be104ad16abfe4fb83de5db067d37ca58510b786b109514debef56cceb4dd6ebe53b25127b85faf9c28b56d6586c26d60e +R = 0404831192b4bd453c0a7e850815ac3fad88c7a2da27d29e83ca6f22213635a366018ac0038b1fb1e4c512cac15b614fb69b3e2 +S = 06f677c361547c91428d0e200dd00777262a138afcd828238d132c56b2c232e2b446cc693fdc4013f05ce7021aea5b5b2f1b34f + +Msg = 4f64d0f6bfc542a0d4347576935bd68ca88524ead03b8d2c494061d0658e6c3e14576b5bcea5f2f992f54cfb52b5c7cf1dfc517205e0454510eef1b7054a8cd06ab53ed2468193f98ff0dd62faf076549ab2a270f259276d5729996c120792c6f466a74ab65035bf38ff2c055b43e2a8b8e2449a2375ddbfc18242157bd905f8 +d = 008e5f66ba53e7caad1feda122a80c32c82d2c32a7237b8ee8ead44ea8f2f01d77c7056b9dd60b92d051f060da8532c1fd0e8f4 +Qx = 1a3d020a0c7e3f3fe5b3d9fa6b6148cd0c481b4f9e14dc85aeffff35e62545654fc313f930ca2e33dced28ec28d0fce6ceaeaa2 +Qy = 13c1ac166c3c088e8a4a9d44556e3344e52e8741ed1a8b526a45268086e2fe54c24d398553d509439ad4957454eb68af594e683 +k = 0095caaf063abba5073aa7123b2c0e1666d29bfdfdfb0c484e18931d756ed0845ea15dee1e9abcbbe4576113a8806aab9476b16 +R = 04d6e33001933221e9eaa78da5874f639749c7396dae90f2da4ccfca15b50ee9e50521cd84d78a098e0c383fab0186b3dfe1b3e +S = 001e17cc7baa3e9ff4d882da970caf7d55b4e0fb7f0cdaaaa8290fe2fc9cc31d51b34b5dcc825bf6799ce22fc95382d46f3f98c + +Msg = 7047d478ec5282d55db8c19c97af10951982d908c759ff590f27d57e2664f08d526cbb2bfde39bdbb1aa3dca5a8d3feb50b868be6651f197abccc9d8040b623de367e2ea1d20ecd302afb9e273f4be9f3f64f2c2eb3f92d5e0e375db6549da2a589f0604bc7146562ccefd15995a7c4208f640e7a17afbca69cda4e173380523 +d = 04ecb22b44e809f89b16abb10be062c89b41ee34e110403e42a20ce59a99afdc22f6f6dda56e1d9d1b8ce1d057f390db111def3 +Qx = 0dbb4a6ed11f36eb78417269c1b1e9725eba1666591afaffb5582c8b4d5bee1d73922b0164a05bf21a12052171abbdd31305552 +Qy = 1eb385afe8588ceaac9f39a5cb4455e02bca48f3d2242730e0f9e06ff1db24344379f96356531676cd5af234a120f4b61f7e041 +k = 01cc97a718ebeffed4ca7a9a4389d6b0fafb73ab000463b68b5580267aec203b6231cfb5afbf7ad8192f0947c7f40d9e060ab32 +R = 021a29f56c31227daf0dc5dc919434978943b80f4b18748bb5f7d6702153b966a0a4af6f209ecfa3aae0e4f32a1b7c6ae58a55f +S = 06921b2e2ab81517a0785c4ac3be3d7d4b4c917d7a1e4313b123ae96056a2a4a66d9e00819d8c1cca5bc0d75e4e05477c1fcbff + +Msg = 1a8384b4771a410663e56eb36c5d9ede8d161a8fb0e31d3f74bcb017b9e31232bb2e2f4c65a2d85bcd1cedd93ef08d4bb4af0095731574ab3f2762788a1ba3bf0ee46684da8d9dd384432fee99ed3c69213d790a5d81b351063eaf2bda71ca4868ac36be1b571024a8bf09039b347fa996d5d161078314e24b7d073e05cb3d48 +d = 051f9500c15ae73d6d479b9f3d2caccc2039d8d03820befc2aae3bbaf65d59bd9cb3c4e3aa8bed5b3acb70a5566047ffad80729 +Qx = 0ee8ca7f55225760c515bae053ebbf4ab23567f95c7091fee2acfff079eda297ec6a7e9d526e12e5976431f9d7e52a2318ddcd8 +Qy = 185e2c17705a2555fbb8afbe8e41ced8ace95c83e198be3c7dcdeac8c2c5bdd988800f1194e553bd0348ebe6c29c16f35d50895 +k = 073f96451cab2d3ca9810e265b3461e0fbe7f32fd6702f06891b97969b133eafd68e53b526b5e32b0d06ab61ecd75e1bbb21b7c +R = 067d55e709f6966cb2082d8021a313850c53305a3bcc926b6f9a122181665328fdc8e05a88de812357be85d22c61c919876fec3 +S = 063d5ee4a63b1fae39f266a9f826754f5bca4d7bd414dedd16858b5c6ac2d4162e28ab57215c6713320d3d6960f6b55e3f1897b + +Msg = 43513d6dd8bb0af7a6f5a2b35f99957d335a48d54f2c4019ce9518b35441d4935518976ab1df37110b5b53532cd9e2c66d9f87ae7f683d7efdbe1775a6c15eecee84c6f879999d0706f6779dc158c111fe8d7201983883bc8334f51dec60004eb1087347bfdab20f8f2f260556681e05fdbb8a6139857fd3bb2df5bc1f2dc143 +d = 00cf01dc4462cca764f4f8cbef48c51980737b9b98d1384b8de9f4c733829db7718a9b5eaa46a8475c2144fe4454cb8eeb0a443 +Qx = 0806457fbb7fc577497c937600c5a9c4df2c20cf7dad4510e5ad617fb2849bfe6956c3efeab6b805cb7b63bf5d1c94e5ddb456e +Qy = 0915071cee2094efdcc155f893da8d83d9a5c234d0f04f738b7af5b8fddaf1d3aa152fc11894a13caee0009bc106a64323e9dda +k = 024968902b50febf13be11821d0d316f2daaa07737af45ce2e855aea6ed58f226d2279ebe4295c5d7674104bff75b899609561a +R = 0549f18f1d654f26ca134df4707694e5d9b3693bb34ab5123ce4d9e4c2b2d9756ddad957a4169fc9bcea29944903080f6f5d01b +S = 021887355c6360bc4ee59f1badb5325763e9428e60b31a7abed06ef03bff0b1265662d604dd2e0140c355c70fce1b56ab143201 + +Msg = 752300bc5066d0efaf807183a41725e349907b7339d77c79921ead3c685b616b0eb97e708f3880fce0136c510c8cb53b22cb424af6f1c34633600939a0647c02d8f9601f9416f1d24a51657241fb559c25dfba91402cea43bca1a13718b3945b048725f3df560e6717cfc6ebd894e29bff1e0c7763f15b8ea93e67385f059598 +d = 063a9a565497974c6dd459bea0d1196d74f263f333c31b7e8591499960e1cd79e2ef4cc8709f6d54713f873b16e7b0be42f71c8 +Qx = 18872e9d9410dbde671fc050ab88101f01d146a72d62b630b29790b20fc02cb62cd0ebb5b453a46c60ec2d2c66de8715c320578 +Qy = 1b6af51db1c42b743b89be0900d23f7da80b15f2e7a2a965c7bc13800bf58589560af4697f873b6155194badf5a19a653e63da3 +k = 01d3278e6e78386146fc15006258d7a62a1345db3c2e44fb8d3bf8101727bef254a9fbff157072326a85b5ef4e17c5b0212bedd +R = 07bd5b54d9c6d6f9c87f4a66472be2c4bb7f521ae56c1dd71781d95440b0a151d206ddf627e5ed3f9c7df2fc914a78454e97616 +S = 075e39ff66ab0e0d1b46f9679b95d10b692874d45fd6898c569aac28a53569646bb29f8556e529ef83a15c574ad5e1c82878154 + +Msg = f620603489944769c02e2f902c2299dd5f32b5fb463c841b7e1fc0249a85d2c31684bd3daacd97de8291c5d39e84d6e59d3dde1b30c181bfe8d31b8d8e080bd191690a67fa00024ac8c1b10981b40d4f88789ecc58fc69b15417fff34834e23453bb9933a43d08afab74d056f366b40ad167b51ee5f008db151a12b467d3eaa2 +d = 041074dc186193d30aac7cc6d269b938ab40b257d095e54ba79967a377a91b8f73671470cd07f0a3d1db7cf0a31ba9070625e43 +Qx = 18fe9848dc599a759d90530480a6f11d052d2ce21a7275769ba02a61658c3b69ecc546aa6599e6699353ee1d65ce533c69fb218 +Qy = 192b9c41bfeb2af4f29dcd1c43d3fe72a070b5d085d070acdb8c02f0dba00c9471df1dcca1006709676bc08b8ddad97310e25bc +k = 036447681292dc781f7f4ed60126945354ad1df5987266038c5049d698b2ae12965b6fc58f3e944c4751406087859973d8afcd2 +R = 0541c22a6cb984cafddb3269ba3ee56af64cb36d03b7cd1693b112a7df20f0422219f85c6820130ad53ef69fb66f3326bb863a9 +S = 00fa66b163ec3582760b048ba9a0fba9443d7e908b67d749d732ac9b6e89c1fcbc6d3ff4e02a43ee41414b15ead0cb83749e0a9 + +Msg = 5575f610762b42ce4e98d7bcf45a7a6a0d66ec7f27d6b8b17f1961249d905bc7e58e2ce0806d467f106b16285dce4544c72666d08b5e2276cd0c4e13187cbda8aecf57b1855afedf8fad39ee4fe009f204e60bdbec79b123456ec2d85631d382b8a2f2c7634af3992e4707f7b4215e2c9d3b0aa8fb08267953883a4213669d33 +d = 010820db54ccf0226161aeaee79cfd2797f87702b4ee91adf8543b3c9e79579d0df8a889e366ec1e0718e039b87a37c24d620e9 +Qx = 02eb4e313f158ba7497130e2d64804ac45a7db207c55d41f39979e0303dd2641c81050fb7f24f2fd2485b90f60985cbb15d56be +Qy = 0a190fb6c81c104164578da6bd4f2b193cd11935e1f87f14e824c2bf8c82c39f0be1a6de3dfc6dd68af8cb14f6a78f38773a7ca +k = 0118e911f676f004fe581d1855e5795e5f4ddb33fb8d409d557aeea87895b7c23a513ca0010f98b3a63f2c65da5e3b6c37cf5f0 +R = 060c7f7c47c16b294867cee3e65eac8fc828229a5d3adf8e68e14dee620e9d4e7b78c8b902b5042b5f19c94e621c52836c95ba8 +S = 008d036087b23319553faf835b793c73204cdbe2c1c2463e74de8f404e66ff15ce9384d26149e7300ed1a109afd1f915edef912 + +Msg = 81cf067411dde2d0ab04fe5fa1e28e6975cdcc571588de60a35bd956a535fbbda4affd0803d244f3f7e6902a2c9a7ef2488691b6bef7f8ffb33be09ccae4c5285265e4957f7928ea5cbabd6823297f59a7cfc9939a49f26bde74c4c69e2d38c1efbacbcfdef011213843158072be84ed3c1781f67a0e2d4e9ba76a585c17fc0a +d = 059d2a06e8bfd5e14a9bc8777958b85be5e97af892d2cdeb0ecbd2d5017952b5042349db5fedba2e26e7b85bbb31ad313d99434 +Qx = 0af276952a1216ac88ca7a194f5b27b7c98c78c42f852dfc1a2cd4c1a477ed16eebfdc90f613b6e264576a35c45f49aef8a564c +Qy = 0639625074b69346dc6c617d624d63ce415a36154a817f4e18c59a3b09e01589407077b19bbbdd57b04ef8fc2cc23c673d52910 +k = 002728f7e9b4772ab790af0be9ed5b3eab697c4710249169d2a5782ab3797b8fa21bf8c1de659e3060af5a286353402ab982320 +R = 02a7027c6f94cc236dc8cbae35f9c38102a663b84f66143e2fbf9a152b1a6478bd803bf3171f933f63509d539a54dd348002ef5 +S = 0549ecf85ca1bae6d9f0038dcef90c93121a654552780f5583a7d44a73a9360c6799e76a632bc8907ce4626c0439f1518e3a250 + +Msg = 8ea18387940035cff2f37278d321b344231075db43c7fa7fee9bd3fdefe5e8f03e7af9deafa1022eb108e19ec11fae34536a4fbac2e8c8139a081a997c080cbe8f3e2d2a72ff26edcc5338b21372fa1498e439e4d9bb12d51cc539f859047957b1b1f1fc30b90231eb06b365a4d404a1fd5a0e5cef171fc95b04d0b557d78ebf +d = 0405590893cbbe18f4ad99df28b5f9d17f8f1882269aff0b7eee9392859d68927a99c942a3075269ddec6d69c0df2d76ab9d801 +Qx = 06ce67ace45a9cfa0cb45e8e1d0eeb44e94bd7527fed6b563f1069140a3f36e010f85e1ae5ef14d626c78465cae43230090baa6 +Qy = 1a66a58d87621b63ca662130ea342db029acc2d99bf76cf6ec4e53ba71bde4b00e508d332081055a65fc6f44a96f4e947d729dd +k = 0035f09e0c15b41c958596ad3f5c4bd4a3685ac94f19fb97503fb5fa29115cb18fdff4bd104535847ff36650b7461550dacf2a3 +R = 051775fe1503ce80b3d581ea3e5ba761665568ce0eb7d6a7163d8d025d76002ca7bcf6d688b6477ae85d09c0d4017aba5ea8019 +S = 035cbe69edfb6fb99c9e45240b7a587c3805ab2ed6b0399c7dd8dd76187363b2ba1def66b2c3dae4bc2e40d164bf0f4837798d8 + +Msg = 6a253c1aa17b2b1e6624afc8e7456d366ef5b1bd78e740538260f395481148a64da0b6a58cd53d7e06c691beae1a616547cd95c4d259a371e51c2c0e334c8a5311ae31e4c7af325686ff9f7a36f731010ee1a9b8a29169ceac36a060dd23611dc9713c615424888bb574ad5f5755d7311bd169336ae986c977a394bf16487c4e +d = 062bbb4f565aa0f23b88ab9029d33b995729d10fcfc33ba7c4051e2fbc72f15636a834e3ebfe604b927cdfc89f53c57f36890db +Qx = 125242acf14c7e08e9f2f0194f734841758b1eea1e37ba80b9855a14100a5f0b57bc52a0200cb640121d96769e9cabc45362f56 +Qy = 0dcf52cb899470943a37d260aa85fe83c3869c862001021660ad09b4d73f7739ad331b3566bffad590534207c6db9acf98399b5 +k = 06095b4ed8d51e37f6c723648af4cd4585d9d250d7519139f58a93c75f197c4bbd1142da59769a5fe178415c677caed1c3da667 +R = 041b212a54d4396ddea2898dadc363ac3ec5385c9b3b8ef1ea17c3d2f751d4f79137238548ad759b5e1700d7d78072df3bf84e3 +S = 0149242afc524b0c3583037da153f539aad85aa0c19c6c70852e3c3923df8c3abd0189a2abba872932eee2e6f45e02f98e810bf + +Msg = 0f91d0f0139faf3b90a3d4bebd7e96ff6bb6f90f6c68321fb392637d8ab2a60d649a7b7364ee6e4e274e1a8d342caee36cc11c56c54247fb0a8e8ef81ac4322b454dc9a195dc54567bf47ec8d4fa4cd32e76d78ea2d08bcbce3edbb68fd8597e56d5a9f2df4e47b2701046df89615961db601bd8204584a6a6cfbb627e2a1190 +d = 03fad7031cf8810544a3e4bd1382c0a2e22c5a9fe4804ce67b27591fc516ee81dbac841d399327168aa6abd79e2b5ef85df1528 +Qx = 1ef0f918c683be57eeab95d5d1850bd492ace7f4b37785863647774a028e963ee2c0eea801838aa8217fad75c5780f1c36e8d4c +Qy = 1d5dfc69bcad46bde5539c58ebc89e1db2a3f65069ed963280cc2cf228b2568bd53c6e0e164d6b63a5d3c2b8e3be9d5139a62ef +k = 00eb16d784e2aed724cf1e4b72fe76b00dc80948c07f9c7524eb0e83bc59c12a8ed16fa7ff21dffb8bbaa82925848a19c93884b +R = 04a07e79b4f771363ad4c46cde0aadf3df4a233740a89168c97b54559029c51dc2c79b7cc94a0e4e3d2f94e376fe47993da28bb +S = 0360f559d37a777119b2aeebf00cc17e2edf04a2cbdf74366f5d34368d2eb2c92958e4dc2b7453d5a509407a4d4643cc0235f57 + +Msg = 50c17c1fe4dc84648e5c3c3ab8f7c971d4c58d8d56d2b5ddd92e35e6792111ed8dac7644ac8a07ca8bb4e38e071aa47b22ffe495e9083f9bf781ac1b5fba571862c909c7aaa7b8d05ddfb7ef61c99700de734d5658f44ae9fc908c85a2dac8e7f854d6d24be805fcd7f873a91252985c5c73129c60177ba8fd99daa87b25a073 +d = 03db41b4f637fe7977c90e4f1a21799baaddd1826c667102414877138436cfae1b9959842b8097b5276f15f2b982ee59df263c8 +Qx = 18eb25bbdeb41c5d14edc675fcac8a523acbfadd6456632bd593ab5f694a7734b163aceb6e6b3d8ed83fa1cf7b5adb9871a6626 +Qy = 14975abca1cb769a243936e65123167e535279197a37d8c92c7b138f31cad4e95c5f62b06f438f94c1a61634b34be7b96f09fbb +k = 055fce73c9c385f007256253281c6b9d0930d127939026495d0a30f25f77fdb6b334043c39fad4223852f7101fce72746ea205c +R = 01d7c26e0236afeac032fc5f3dbffc8c03b04417b514adc26d6a4f697b4e87a008d5ae97544a274c25ff66b98111d7c651c9381 +S = 07954191fad321e7f2de95a87d5a9c4527e658ef85faa6622d5f34f8bc2b84c881ededbe0281456e9b70eaf7a207e253d216533 + +[K-409,SHA-512] + +Msg = 3583a3226e2dc463a462fefa97024e6e969c1b13bdc1d228e2d7823d9f7c09012390c2535baf086588000e908309090daac6e6d2b06d2ede6fae838ed47f30b5b481185f607a3586f6dea47c8f84e9d3b96d5b0ebae2462fde1e49d84d36658e87dccf5e30c0937feefd8862dcdb1a1ca373f6ae41641502ac54df6633a8cec1 +d = 065b76c6093d9c49591293471286df1a4444e60d9d06cfa114e175afb5f119d2abeb273b0596019a0ec5db5b5869f2cc827b364 +Qx = 0266321fd15bf6b1af862496f467069819e3860f74a07825e68f3d023985bfbb838a49b6a41b6515cacf404ebf12ce0bd3d6d70 +Qy = 01593c7a8e629599e63d3282cbea78023518277e6731fe8d88cbe525ded554b51a7f8803ab9e330f210619dd07df8f67e1066a4 +k = 035682af873829e16b72bb86f3ee99b5d9f052e4a631b07f87d3b361c8d8260a877231dbcb3f4d461b4a1d4467824a26a5a6414 +R = 00a483dc2dc6408c256fdf63b04d71d3c58a08db7167da217f466cbbfb2d68444c10e87a9a1bb04efd71135c00226e58414d407 +S = 078acfad2f2492f74b0281d53e4224c7544588ca9ceaeb16bf759b20c2f3d3ed69c64615c247213d51800569dc8b00078de68ef + +Msg = 60ca58462d53d074b370127132f4e59f5eb8d15594dc721a94286afd082a8934e52462c9c1c3910f8b50d7aa3671dafa5972958d876d7992467b2fee3795a6f9d8a7bd3003a8582ea8c003aa1e02c08ab6804d85bcfa13a815d75c938671f0af0706c68bc70a6155708ca755cac2fbb68b2952208d63e0e2e3d816f04c61bc03 +d = 07e9993f3fc1fdc4c376ef77ecded96006ac1159740bd1b2dc6ae3d97e15a67383f1fc931e460b9af3fe14a54e47919667ed06c +Qx = 189b82003b546f94c066963239c7a590e064b88bb4548678853545920e413f2be32125e40efb82d2c9582d2d8269c1d408a7ff0 +Qy = 11583b267727ba6c1e17a244ba7acdcd836986089860ee312b6dc2d88a984b1fa232eb0419730db8fb94a5e077009c1d55979bf +k = 07574dbe04e1ac2bb34e40f32d6f6db364a95cc5770b79888d72b74bd4dbce9fd91136e9e1152424d76688dc995bbf2bea34175 +R = 009e42a63b41877e200829356a2191fbb6f2a9a234be58c76b0852e4f348ca61e7492f90a37feb8b95a6dd6df9d1a2e61c63b4b +S = 01499fdcc804fee8193de080b085b7513eb8022503de5f64dc12c04c0ba24af30e30f63f0e3eac2c82eb20c6672336f8732ec5a + +Msg = c749f9bb92ca9957ca6d0124206ebf65e860ff38a225e241950bf4526cef3f4fa9184ec83f71f813fe852dc08eca6b45b14fc7f2c6a19296529bfda007efe9d0d26492de2a902b45ed39603e22f0a763dfa5deadd97ef6feb859d860baa2cfd1d066c0be0f9f4e0e2fafa69cc51b12e814ad2e33b0acc0bcbe1df8cf018dcd4f +d = 00c11e2979498695c660a2bdfd105b115bc4ff8664ea15cfb40c725406c6fc9a13027bd1d72ffff6258f29e4e19b845243444a7 +Qx = 0904a9bfebc23607c7c89b7aa89315343852cb894f54fe42ba4225285e58c6bc318b55691aa6a6ef22eb11f44cbda89f157d7a8 +Qy = 19cc1826280e54832b455f0ce0cf89bdb62e973a8e819fb776b1a202b4f207b8baf9072929c9e3f6a8ff996d6d529de899b024e +k = 070fe023c9341df9348f08882bef47bd8dd7f13db7215d1cd52cdbe7919031a62455ca969a8cc6db0a05a0b4befb47c142c4f34 +R = 035e7130d59d92ff8c4f264fb2c346e052bc305c7f57549a0fe43cc7cdac6aadf2ce1939222decef4e1f900e3c2fb2c52bf53f5 +S = 0008d5ec1ed2091309ac11eb88157ba5122bb9b5c858a46769a130f7a941818445664ac78325e0b6d2a11bc89d08fe0e87a5bcf + +Msg = 4de8414780ea20f7943b1f1adae5e3962d96e828fee43bdbf2831bd71bd25df2976a3be37a7a667c7fbe1200de578920090d131a750c9bc09bd95b261234ea8cc25423c4ddfff5656d6b32da6e2f6f530e6673a8660aeca31273bb9a3a21bbd7031a2fa71ba37c004d3d1c64b2c0798783e47b2efe1a208959ac16e35d444245 +d = 068dfc23c6635bd1fa1076dcbd456ad6e8df7ce7c1370fe275803befc4ffad007fd062a61cf1d50b93aeb9afe1aab47a65af82a +Qx = 05591f8cb59ccea17bfbcb74e69f05218d16175f0547ab95f507ef8d7426c077b52b82dcd06baf6eae7a66bc72422236e589e42 +Qy = 126a01d5c2331a2d00949e07ea9242ebb50d830b0aaa74bce841d4e43bbaa9e9aaa01ba25db7a8a2f4d72977c0f016f625cdebb +k = 070682c9659089a703dd9fcdf2f3fa0c1d1ef5fae3f8f1b3dda55d9b611770244f8926898c904f6952c1847d287bca21db4dd59 +R = 02734111e3b736ae795929f835701bf290dd50c0fd625738ab2769242c1403197a3f4dc29ca618c2e292c6bec6dccff71adb698 +S = 0755292cc5363fa74e0193a806879d3a275b4beebc97250fb230efbb8364b2a30098c0488bcc6e20449622d6a5fd2ae24d7abe0 + +Msg = a081d54232f84bb19dbd52ec3812748e2e6486f6cf1b177b27929504ca878036547eb43531bb5b3edc81bfe105370427e92831d2239cca0106d031d9fa8da9cf89c6fb6401377d5936b6329ccad854e5567181b8f16a37c35f333eaa0ffe91d727d183fbab935fdac2d5670dafb3fba59e4fa2df1746c58dd8360fa08af7f4e6 +d = 040807fb888e1d9fd33604546656a493629d94d4a0a9de2608962225ed158167f9e2438abe2d12a11e2adb6c2b66ed78215b0b1 +Qx = 1787c0e6c55acd69bde9b0a84d6022796d5b5c60fe5357bc0fa4386c16f61b38bfeadb6cfebee7e7701bde24418b8b5642afefa +Qy = 0d9579d271ba3d5e2327eb863cfdca397070055b97714e385ffc2fc23528f696dac1a4d0e535641f6c876f1819f2672a8c31cdb +k = 010b8f5356d8a029659492c444876f1d274b82681d4f600cdb5fb2afde13598ddb71676d9ed86e83351c70678886e8237a865d1 +R = 0304f43f9705d189f47ee09a079494030b0756993a93e4c6ee6b5e664f63431f99e505747c24377e5930f13492483e6cd06ebdc +S = 0580d4707c97f0330f908042a6cb2a2b313f07bab34774ee03bbee63a4ff881b68def47cd300fb49deb49829bf486d1efad39b8 + +Msg = ea60266f1538565b3ff42fa4bbfe319be070329059c52c8bc04a7da2824f209c1145a05e551ea59ded8ca8439c328f6907da4e81d658937df614be98c7b8648818ea80ef40e49aaa4431f4a211d62acf2611f5d60c446b2b25745078c643859be1b12b3141a09ab765dd63ea1f2a2df015eca0840087a5db378c4c4cce76cba7 +d = 033bda0a02badae08fe40c239b9d59e5bfe1c4d4b9b7a5acda6790bfd77ad08dde5e93a2da80ec54a7f88146d72218bbb88aa10 +Qx = 02dec536832c8acf007daa66a47e4eeecfb6991a359f8c412299ef56c6ca2faaf18c4db708493e84786a7837ab74c5fe0644cee +Qy = 0906c8f603b579cc2384e0803d31d577f7c91c55406db3b2db91bbca323fdf3cb6d010617ad1aae7bf414c4d974f22e6f05af53 +k = 051e8d027e62db2397e4a807d98a24455a76eff6dc259ada89e794dec1484b44724894eeba842f60b73287642570460896dbe77 +R = 031769e6777444095d934d05dcdf82405c43ae91ad5fa9201568ae2aba25712717f1af2b8f49f6eef373237bd70c34889d0d271 +S = 0023498aa50ee095f33a4081bfd70a9484089c85fc7a4569f560ed67243745c823cc0217d29e2938f06ba9c8790650d10fa5b1e + +Msg = 82f38c9405ef0d26bcdd5b3fce4fb0060c3095f61403418e17c337933f0563c03691fabd32ab5e896c593439e7492a9970ae325c67196d9e83fe0f9780409a930326f7e6efae035ef8c321cb9ad12461edd5cde66c04739fe079db65406b3c2d22f2d04b1a4335285513d4ceb901d2ca2ad10c508302266c2cd6079ff14eff4b +d = 04ff431769d26b8837d3e1295f5464fe82be29edefba76323e92078a6483ea0daa96221549102509a1bdcfd46a5a2e5de10c39f +Qx = 1beb74d427d849705cf26e26312446f27a7c5ff26ea9dc1aadca763254fe53a622de29cba4fa81ee2f9e0319e752f72be46cc7e +Qy = 08dfcda35a00ab77c3c47dbc05b0678cf561f575369507097833e86e523dec879e0ae9583b4261f7a73c9dbd417accd4ae6688f +k = 005aff3ad332af23e0dc38c16853252825076d602ed4c6d947be751af5dff3f59611e6166c31740b5e5a167260adf2a5466289f +R = 035c4e8e1858b9694cfef3e864ed959638ba309ba2066a28fb9d0e02a66cd4c187dc6fd8ca5fabe68acbc2074168157b685aa6c +S = 04ec2db89645018f9845b7ae31b8418a767e3570d401f41db18e424fe861bf09114d78606a056617613447d125a283be5bdb6ae + +Msg = d8506fab4f681ba4ae86066aed447571eba4fe04e6585fe3be6af2ab1000a3da68c5b0c711a85ddf3a40cb7c8944eef81f2094650459e14f5b848e6add7e580b0198070f873eb3ed5d0728eabd92bc1398764b94cbb4cdd7cc2027b9762dd10782658cd9e8a5022ac062fec535d892198c8a387b3d2b6f7c92b1af6ab7dd9e4a +d = 03f85ca1169ca7e9df44cbc6bc7d2868c9d94e8f8b699a42ca492dca0914eb5789a9032218dcef7f95f959c9554a1cd83360439 +Qx = 0aa3c77dd4324258bebe7da5338c772d3496e3fd0e57f455459542f1a1c5b47692f51c3815c9549d0c23fdc1ff610fff6847ea8 +Qy = 05e626d6aeb86dc51f3b359b10862cd33ac9927e38127f7f17426f2369d62132a2a62fb6b8354c5ca0b3e5c7c87117b4f777a0e +k = 0495099cc73c9930333ae3f9d0b7057d7c70e2bc7c805c0c6a44404739b3fb68f9fafa53033b54b7ad7bfaf4bbf7baba0dd5a0f +R = 005612fe87c6a3a164d269da902aa43c5a4e0333770ea6334f05750be3f31ee758d169291e15b1540d40b60d1bda279599f254e +S = 011a633bbc058550a597585bbc9f33099eb517795600b019255f649493d4a6dd533be8b0965d9f9d9698677491bf929198ff34a + +Msg = b3f30d34f252a4c26f396079e773142bf61c0981d912333ade3de4e27cbc72cd8a16b31807f0c46116f87accb854487d83ec8c6a61565e6fca145eab70048245db08616779d7047db63aabd90dd15acbb05eaa510072c151c0518f1b34582b95f43ec7b9484b2993c176de79e84566764467f72392ef31619426d159c91816d4 +d = 03a97deb36d68f81f50c8829d412ee5de7f9d775633cb69c09dac558182039e275fc258240517a7c4aa592e364765321f27cb12 +Qx = 13f0f4c16a47ec3a46e7a088c1b6a63ef61eaea46aa9b2c532d8df84dbf64991bdc2c81ced3635e562d1403dbcf6aab2f8aa9da +Qy = 03aaded3b99a454b820fed989dbf6430ddcda67db58e356397d06aa137fbdb365ec43994abd9c0a9fadd2887da9539bb4ab3c44 +k = 06620ad14a5835b9e9e104607c317cc599416683a60ed8865acf78ae1e861246567cf9d91f759c2d4c82cec835a4784d3c231f4 +R = 068faabcb7c716fd73f129ebc6625f5b4660a88e47dc7dbcebab321051a61e46b74409e2b0af420e1671ef4efe04973c43471ff +S = 06851e5da033da0f28a89dbbdabe93ef11331c55cc03d5b096c0522370be681241fbe71d1349f219ce57761c85fbe208ac36a36 + +Msg = 0fb13b7c09467ad203852738eda5ddd25b17d330e82c279630b0e1f0c86681f67f6e537fb00da9419114973c8559306de58b0387d86e52d821d982a60769d2f15fd5ac2ee6dc55d8ac04ee247282cb2866b8cb8b4d7b4b6cfb33bfefdff09a73d727193e5fb939ff66ac5fcb644a44f9083a790888cc538c5eb435243c6a34a8 +d = 03b1da0ffed24e1a3b5ba22bd684337f6b08053591620541bdad50c761d66201a2cf21a4cc636426456525b598e96baf97d9851 +Qx = 0116a1790e621272b56cb4579ffe6ab629a2d077b779b73e039d74f58c476283c110bb18b9c9ed63de7288dd678064de68b7df6 +Qy = 122b43afccb88982f2e07ff35468178572bd72b644322d9e1ee68f78880169a83a5bb88c6c994762a7e8d80e09333487ac30fa4 +k = 06d7a24f0fcad549e9c36dbc70ce264a75eb37b74db98b1f6a824ad1e5635be9818f45c7544927807dc0fb3bb5fd38556e8656e +R = 0232339b50bdb772d15f2cb8973f6dd9397af45cebb69adfc089bb802e9c4029dfb2078a8a26d7197de10638ce512e5904ccc5d +S = 056add03244174966d53105c570e8fa660ae8c5d53316a24cd26f24e29e4b7459f4c9daef07442247b63665f97a3c07d91a8706 + +Msg = f9b8124281628cf4e1da0cb4f021c8d19d815644cd80c7c8de4cc62722904ec4cddd26cc4891f30b15098a25ba6923c6abf4774deb6e1883fbb409862f94467e75a725e7154be860fd58347577c83adbf18535c54b102220197afa062cc1c84f6094490ce488af4a08d2c5b808a2572e18a59de96c87162f88413795351cedc1 +d = 040bac7e0d3b54c7753c79d43469e310d876015d948fac4e3a9765444754476af72330e88d79ee6119697aafac8435ab5690754 +Qx = 0bd4fe8daffe47bfdfc43deca20b15da7c999084bee8983c62e3dd33740143c38d8f432cbacea51e6f53994265b2d8f4c393f6e +Qy = 06d88c33c31f4e143b13bedd5738bc1191fe6815a099fb7b44617fdeb08daa0cb74edab7f9a8c67ac1e9c0f0fb21a9f02ef4b6b +k = 020f2f6fcb3e471d47f21fb15301784f7cf3632dad3627a9ebfce587c0097871eca580bda051b100f991aa6de5edd3a7684e839 +R = 014f8884b5107e9ee5cf6f5d137ec9d59a85a6fa0431053d58a1400fbf0d518e8910179da1160de2c6cc8ea8ba8f3af8e0e1f6a +S = 019aa8d55c8d876989f9b9559db0576f91c4610dc9187c74aae2d4f212cd94d90dd81ee4483d88d866aec1ed469c5e3eed7d90c + +Msg = 4e3cd6100520db050af0daa69fe3cfe6603a223d4f2a6318fc5836db8640d4c7fb80bb781302036d2d6fb8e552b4eaef3133b98ba2d36b9ef0b86243b0391413c73d48ecbf1d19170f1b3b781b35ffd316afb1d55d1dda8e91eed5553780cb2714a93e7ece698b832e853e2589c5ba2b8a997bbbbf625071ded66762af8cad42 +d = 025b7eb3bdefba3c5134438caf968f615b315204f348006f82e8d61057a8a8a853230cf0500f9d0b8c1551a59b9184862dd2ed9 +Qx = 17d2029cb711e52df416c54b63a95a66602a1d15c3761d91071964e0128c91ea766b3d409f72d9fbb5161a459c3fd7990f87d88 +Qy = 1e71a9c66a4d4dcf199aa329e44b99f80640fc760fa7326f29c273aa13b153df5277feb3c049e407630173fdc9f735d7aee4e10 +k = 0575aade2692534b5a1a17d36c36973d24dc501c75c3b0b497a3d2fec80c67be7107988e47199d4863044fe9176762497b5aff3 +R = 024c6004fa92cad446b8339917f517f04d22db47b3f9bdb83d863dadb5431866ce21b13e780495bd66152ab33eeff8830cf8538 +S = 034aa568aca7be851d276d2235e42b6624df1cce2b97f6413dd3fc506f0f18483f95f911feb0eb220415ac593f2c93dca0808fb + +Msg = 5411708381a65bef4381c9e13a04cdd5ba0c15829f7f25ccadf695f635384d8e4704cb562741747831b33852567f42fedbd190d2980f1bc921ce01c17d659d4bdd7eb787b3927fcee659dd3b65132496c687f2249272a473d46326e66b3cb78dafbb522390162c168f73bdec88adb145e6afecd561979846ea4c8cee38dc1686 +d = 0673b3a2985c95904732632e5d988d8d437a60db13215bb6aa880b348f011c609a1e860461427a8cf0d622abc47f910f5c97ffa +Qx = 0c4f1c0cdc44d867ed38d093eb967bfe285df897868c83ffcc0c53463e3852a1b2039506d9508bf01d0d79ae537e42fa2070a5e +Qy = 0c2bd9343041c2c4100c5d795ef355c796a6ea7954cd729e11063b14a27fc2c3a9ffdb3647613b44238eee17d9cc49e8c5dfbe0 +k = 019a9509f5f6d947532638a3c80782b556c553edaee9ade91e457f7b5d2c9055572fb116f52cf4d3a2a0eca72fcb32b2f58e952 +R = 02def440e968d17d9904c5640619af2f447f74b7c067537db4a15be87df4fe68f44897047fa8af146462ceed4beae36d54e1aaa +S = 013d5b00fef639c556d66420090c2cab1edc57b7257dc35addd62a5337300e94ea7ee116e06b744da1b575d90da81e8ae2cd424 + +Msg = 23757fa60fcabf543e603d8b31ef0cc99b3ed16b4816a84e01dbfc858872fcb79fd03d2f8a1d4f28c25dc42a39e20c34f81ebccda1682ee9bd22fe323e7f8ea90cf4a2a6ebb634cd1153cdc35f7306f28a2efd822bf23131baa1543d0ed5ab4c8168d3199983fbee117085f90550ec3ffa2b06070d3add1d707fc2593285ff58 +d = 00db7dcac414010b816236cad584dabeaec1da76c97182d1b62f87bb7fe2946a64d10430571b2b29ccf2ef72c969a9f045f1f3b +Qx = 1f2a6cbb9c1fabc8db2848c74d918312267888d822b7dfd1634a543dcca4be7c997239f6281d1d8b5da9adc694706b7b19cfb0c +Qy = 1bde57a2ac15f4e6b26a373a624588a3379c8eec758f3c68695e2eb1856075d90085f43283d982526c5e57913cca5e2b4169f8f +k = 05a3d856ad1d6164993cc59e70f8551e2408da92c7e6cd52df51b37dc22e9ebc42fbe6b83c332eedffd4086a382056175ad7009 +R = 0489b0344ae4278a0376dcc64ef9ba8595bc2fd62ad22d42fb431d2863d8ca353cd9e59de4ac10108fc247d6ee9ef643f6bdb3f +S = 06aa27335e15dc910515385764387798cd4a9b4cd6d99d7c42e07fc04e2bfedf8dfaa7bda396f88253357d3e2545e895d9aa3b8 + +Msg = b976314d2f066f8893307a726f450dcf2cf865c170e90e6908ce9787eec48e1e2119a731b2bec3c12fd4e6282a393774251bcaef91af6ce57c63a8b45bedd72ab862cd169b7c84b8f6a72084ff823a96f2f8eff3483a7ebfabdabf0998377c5a6836d88135cf61c65a0ca7ca57727da68047dc635c17ad13731035fe9a6402af +d = 04717efef16e1ae267e155aa1daabafc68515aa391dfeb73c13d01f3132bd22c984228dddc4dff4c39979e7585acd3f730cfcfa +Qx = 1526c58a3de46c95cb0527869f7d637f9441cb5504e6a01f339907c6df3d079361a41571cf0a0f11996028a41682dab5decf786 +Qy = 1581903be8a19bf8bde1d89bee0d436f061ca1a3ddded4b7793fbc32ff852671103f34e16d469eacdbfa457643d1b18dd1c4107 +k = 05c846bf61c068b421efc472469ab1ff8d9f34847ae0065ba6f4a000be53727b3fcf97a780362566e13ebab84b9ed5f0cbbc225 +R = 00aa138e742ae81eafa820632f31e87bdcfce6b909d85805e46d87d1cdb8b968907470c7ef5806accbf6245628c70d264fdd95d +S = 04df507115384327f7b8311dfd1227c19a6124cb9bb5901bed45d8d5ca45db0903f53e7bbf136350e66bf2b4f3d978f8bc546a5 + + +[K-571,SHA-224] + +Msg = 964ad0b5acc1c4db6674e86035139f179a9d5ec711b5bae57d2988456bb136d3aade7ac9ef10813e651ae4b9602308b071d75a934a6c012eb90c5eb9b2947b50fc97b1d36c5bf9eb13a7b06c94212c3dcdab402a563262298defff62b836ead1f78f9d20713710fb48115cc5045ba15140fbb4bdf516e4150d830d02cf30963d +d = 19cf4f4d06825499949f9e0b442586fe1bfe3459813a2b92cd8de0f775a4735e02655702ead8e60824180761808d9e816d60bdb0238e1e8039ca7bb63c92e1cf8433ef447e64ead +Qx = 07b9cb1728cba80367b62872a986e4fc7f90f269453634d9946f79b1fedf42ca67af93e97ee0601bb3166e85357e8b044e39dcc19e608eaaa8a0066ffc48aa480c0e1e8d5569cbf +Qy = 580858ab9223c2b2ea58df506d703d64b387a78ef43846894e7a2e47c02252bd2c1e3d21ada7c21d50a08cef0f9a189c4e850c058cc57c37918251b5aaaff2321d7355b6b555644 +k = 0726d5e317f888dddc94c73acb14b320ff509908052868f8c6b14e531ca467c1f7c8287476674efd0d636ca94c24a69d15210bb43a368a11d3453d69ca80430cbfb8b6e45d8f21a +R = 04ec6205bdd8f7eab414110ed620dd3fbbda4cb3ad9e5559a114ca9344782847621961a3577cbbe43d94eff6ffc8dd7dd09c049239f026a928301ffcddcc910bf196853edc86d31 +S = 16535b1af98a75b9bc0f122ca3ce23a01800fa33b43584a94fd8a8d6f40077eb739f07c9f0e179a157a28023735fc8da2e2ebbee5f7308925900e657fae7c3b321f14fc45346f89 + +Msg = baddec4794effa668cde267016dda67bc70b847919a9aa595f93ba9dc27354399ef7a607fbead31e57a8ce698beabb10f313d393980425e67cf95be45d512f00e950c0c5409573ddc3d556f23daf056259ee8914e860562a674311452fed780b3e0317a7fe93baa81fb98df3ae4328b28ad0ac8f8ea33efe24faee658ad026f6 +d = 098521a732e72ed945a549afc92318fef7156ed1d1ed9bab93b581478cb2339eb32bcef705c9bf61cf2873ddbadff8ff3806740a2e30ce67d1807a8179dfd5d952e6f8a583baf81 +Qx = 1e09410bf4f84d53a2abf8d106fc64e643edefaea263dc98c308aea16ec75f083b3e6b442ab261226c59ca5fa622db68f5cb5f2d1d465b01d0048554b0ccbf67c0aaf934d2365f6 +Qy = 361e5b43d313a62c7b3897c7db8a42116127138a1009f0bf9892981fb4fd6ae231b8940e7509f96e2a49285143010dfb4516ff810a91a4d9d2974c522ff343e93e8aad00aaa78b9 +k = 128056de96666acd09b93c5db7ba1b8fabf57251ec480d42b702940b5847d2a59b04eb5101bb3990c3ae2a41181f19a2afcf08424f8b922a95df6b292b1856dc4a9dbb1c717ba5d +R = 163483a7e0d1012695ce0c113ec8fae3694bccd40fc038d4038f81bd39e71c969cc7f0af8313a9fdd3d028ab24a43279569dcba73fd78ad74897964ae715928b1cf7fcb779b12af +S = 10aac6929432a6bc7e12ffa86e4d2421e0535fc44a1160fcfbee477c29a987e783a7f753eb2278ce08954c7e90284d2ce7c42de103a9c59d8e4c459b457688ad515cf156cfc56f8 + +Msg = 7ef7138fc657492d229054f8a50dcafcfcd1dc06f1c16640af3f658907e2969248b54416066eb119adbfa23b8dc578aef18bba79610b9cc109394b900a25e55a779230bb858b2ddd9499a7775d392328db9177aa9571c2f61dd52010b48502154e914a0c55a54edcc04a6713cf7bda8744a893926118b09df877d1a4f3d95e8c +d = 0336fb21549e397a190beac38a1ee10f0551952da15f71e11dfda415e5ee08da2356f114d450c661f52b2b32cfc7b9be61732672691a079f0927989b7e9f4efe6095a242155b641 +Qx = 316800fa2d8f8f3f9aa87ffb628dd7b2f63d4d8389ee86ed41bd4c3eecd3f3836ba92e2ff7ee5626213f9ddb41b43561c5dc0bcc3df0a872e4b8026c09c7b52b89b4975a43f60b0 +Qy = 207f956df58f75286232967dc1d3e6507634f45c0014c48b42868fecce5b9434463abfcd2b3722a7f5ed25607270148466f6ffad6a8c86e538640ece80e84f7368d33c68807fed6 +k = 1517b3524b6d43dcf3964f7c35c89bf14dd1542c37606452e2035ff0bd0cd1edd6d7b801ecb1f573e957131c0b3f30d5006f6e4748a11b9db10fad41961f4ae53e848c6dc6e1a52 +R = 1ffd4865dae7387ed797c5ffe58a929cffeab521e48284bd7d4427d5856e9d2582b91363f1d353a0ab1aabfc132a778a516d4033c64cbc991d724115d72ff8e94ab4f95a9514843 +S = 10f010aaf1bb714042fb8cf06a9501dfd1ffa598d6b3e68e7addefe00e18f3a5db8414d625e374d9ae70bea43b57c6be4a590c28e50a548cdb2e30dd9d6e3ed1d9cdada9f8b0049 + +Msg = d58e1ff1d49a471d0567ecf8f29173dab5fe5f6184ab4cdd095c231fa7b82551f99a482994a46c3d8ebc07297fc9e952a5dee7d5f199b119f6f8b250f8fba45701ac252db725e75c4da27ad77d59a4eac448e54a277986740dfee6596811e59afc9755e53d24b826c09e497e29e69a22bbc85be11763064e9ecad7ae66458ca0 +d = 0e287ebfd9ba294128cbd484fc5121d271cd33e685bb1804f09b40aaacf64b5a9f2cde9b30a4a02d3a9bda97d92f46bb8787b3c61f280b1e1a0680f1f0679d3bb34d53725d62e52 +Qx = 52903a7afc17cce078b4b658766a67f2f75ac04e296757fd762fc05d6a7b4e4151598a872eb4618efcd06c43cdc3e54f437c0ef1b091ab5e4927d3ab4227fb24d4413e0327abb84 +Qy = 385e808bee8dad1a1b84d644aa29fec324dac2242709421479fa7a712d18b54db59778724ccaf4e51a27da090c6dd0b7967024db0a8684944b77295c9624ce3aba24ff48c86ac85 +k = 15e8cb22e371965801d99407d96200015ba58fd7eaea52c03269d8a374fc7aef17fbfd4480d29b781292e179936a68ed175802f34043018ed1d6b5a4df667d859cd2ae53ed3cfcf +R = 0d3a57af73b7504ef18c03ed2c52aefe1d1a3f0e27f78c11d45e9825647d5ff6e97af51a5e366e52e01e5e832e4264a1d5b6967cd9debda59c955568e4c8bf804d843a49a0c5401 +S = 064fd7ecf4470f07b4df3b3046041e49f310a463210571606f00a1915c5220a27bb7a28cd0bcdbe374651aac06d4d9e017e31879b7819301eabfe3a7afe4b53f75ccc465815b4cb + +Msg = 4949ba765c14c31f68ee0ca26bb42ba2edee63537de4a6f5c42bbd862c21288d6ff48145260365193c6fd2b56dfb014da26b8a483776b717c6874f627c9a622154b824565b23e178240f53ee9748c45759ba5c035b584df0f09504e95eb9bce0301653aadb860bb25e6ea6b9606e0ec3bdb8089e6aa0d5763d331757490715f9 +d = 149de496fa8f88b2741864d0c35b3df666b87179b7bd06cd426a45f13bc87ea9f50dea85e1fd02a532630e0e3a231cc3e7fbb7c7ba85b40cff1124e72c677c6a3ea6aa40ffc64b7 +Qx = 0bb610e4308e229e4b4ddddff5c4633ef2ab40bf74514433bd068c7d59a6260ac79366dcdc039d5585e660a4cbee990a2cb55a99ea3d26dd9df856b0f3ee5b968bcc349240a9a2d +Qy = 3e3ef4be63fde6ca09f12f8220e1d9b5016f267ca5aa09a2dca8a0e0feda9647fe0e1f7ecae7147a10ff893f69a4f74172c6e9a62f0c5bd96d49b47379c9c84f5ef8e59dea104bb +k = 1cffdb963c2c8b8609809e998075299776b44d2808df509773f310124b5f318d7431f1ef8b38fac5cd5580348abc41e6e6396767f4780656361dc9a71dcc8e7c9239d6eec5cdb94 +R = 0982b9989c92e1a5d25dce832bd8a3f602f0eaea69abcfda285cb3841fe3f019503e6faf8a693712380a48a6af8844b6bd718f0edf3b57662a4fe82ee28d036ecc4cfc7310871c0 +S = 1678bec58d69def3fe35a64810b27fd06bc29d165593990f6f42c4c7676fd5d4a965fc92cf20ab8616c7ac7b4b308ce6290c5e8b4edf6859fd6f6f01878f2601e22acaeb5ce1f36 + +Msg = 5bc63e5c50b1650f0ed4a599960f1e4e11f6c151b2123fd71d9e3c44662312a74b6854290628e20b30eaba81555acb2fb49b640bdab2528619c7fcad0f2a2880c7ea232d427d7c935fba2313370fda8863a7e7e203d63ea15d0cfa083e716ce6068c63fa616ddc225c9e413e694cdf6b355cb1293af5d6cdea51168f5634e878 +d = 17605d7c5873d870462375d741b4bc6375f3d47f7f5e9d998917adf2137a81e63b66917b3dda8968930c4b850f2270eb3187fc756e2beeaa67fe0d73053e6cc0ff0004a21250551 +Qx = 0d8ac3e76c25cdf4902426569763f4ae0638ebb1fbcee6e12a4e0b89d6d451cf420d10441a0a9984710dcac13bfd7ba70370afdfb58e2d982ac367e178f6834b4cd2d232e7f246e +Qy = 12b5fd5b686e58df08b695fc333937eafad6006be5a7bfb1426206102a79bc32fd9ef46e19869448fed0e917fe059b76c8b5a9c403c3921ad07e6c19ca7bbfeff5491b22f8bb961 +k = 09179b3ea906137dcdbb97b27f3690bbe3bc4f1f57c46ed60b8503cae97602717a0724e055a5c52199ae3f08f1586b87fbbe514667d2eef2fe44092f3c916976c7b71eed67e8fb5 +R = 05b28342703c83ec2df898458fea6f71030e4e9c567d140ab09cc95df29ccfe199837cd58ed00d07241988bf3c863504d065ebbeb8ed11cdcb02da0a945ff38ca58d629f76832f1 +S = 01442a5606791569749b5a9f20ba8eaaedd1a2ceaab2ef55d5d41271ba23f6a5b6a33c76763fc99b291b07283122596a3331fcc9ac038447f3e0cb54872c140300fea65d7809191 + +Msg = 610f6633718e49d232b3798654095e2efa0de11f41258b27aa01956480c870d901efa77e109d5f95f1f5101d3c90fc51312d9b3019d2e42e0067eed7b457dc7fbe5466923b62c83d7347e4dada571b57813bb9c21d5e308519b8eedb7a7706508ad04aa69698e03636eb30fd9fb363ef3a185756494ee01175b16847f5b68076 +d = 09214dc2da0967912c31995cb8f5bcf4bfa832c5a2d3610f3a9857e5eee7c77100d599d9ed003b4106013155dffd6c48859b846e45e0ddbc5fe24f4891c9b2df51407e9cddbd974 +Qx = 64376a92c1227c1c479260c7497147760c103bfa5be95ca1593f29a851daf2e5c3a5c73c1fe3e6e2506fcea710254ab5eb2daf8aaefc19cbce7b1c4afbaa2fcda1ef85750fc0a3e +Qy = 70638482e5c7c17a82980b863cde11294c0df717bfa4b9f884cbbbbf80a64dd2cc7c7d89ed21e10561260d372da2fb726de71863f0f60e8ad0fa5e74fb5d29bae0cbe8ad6b32f6b +k = 0621176102c6ebc2c810eabab9f60feb71083c07751c66f719370713ec2de9ee3957bba8d768b076885db1f226a9d37588abf1b141d81b70f0af711c52edd30e92e34a1d3ed214f +R = 1a21d460ae85d0703b4b10a2f77547e45135048ffea590ce86e0a1c049f8a4aa7b395f723b7480cc84e33f4772df8f181f3919f3c0b0b4f276b0f855174103a2f7bd757584425cf +S = 0b56bbdf6e2be1b9e754f9b48b3ba9a13403c17c5cfcc4910112704aceea9a34209df406ee40e0a10cbc26d03839f95e775e80ec5e29b156fa277a5ac68abd99c7005ea6ba2695b + +Msg = c548f0546cee0c0400401cd540a0aa9377f27ac64492e6baaf38e794db4df83e64ca3d83b67bbb46a6c269c04c2725287cce0dee984a0d468c9ce495a7e554a6835d72c7493bfe88dbd5a044a148c89001b8087fb03e57c2b7212d0b175d616333a9affd8a1802dd49ba9be3ab6c6d9f99a5578d26cc4707a5860c6c804d69ce +d = 042f2682e9ac8b76f3c0880e12c292524601dce9ea6982dcf68bfdb0d3fbfb50dc9229e54149ef09b95bbf624eb04ce1427077f30d8536be9f69970ddb449ca22ab8368d2689ed4 +Qx = 116135b273ef876453b9c4c39e4be5a815874857f4a72602f0d03b4ecd9a4ad73b90600c71111e317df0782fc92e6ce2b194c204340bc11e68cc22ced38e99f90dbaf0f917e970d +Qy = 36dfa65a6e9d0ba521ade7daa2f6b01e1d14fbe7b5abd29ae71c4eff66c390914bf46f09f4ab8a06dc0fad6fa257a85f993d6829b5e0add5086b8fe2ecb8027d08eec1bea981cc4 +k = 0bf116711b31ca347d41a6cee5aa13a74e042ffbf79d2ae9448598e6950d721b3773ae6f25d7b49ca9dbcd62feb011d5d556bb9f8a55a7acc9a3a166a4169351bc31a293db68eed +R = 11dcb7f4103e814439df22764f776a74aa86ce9717585712b224803f0ff193d5f541d94142812c726b75e8c2c37f2a4c33db6af118af73d3ec4fda49cfc911fef1eda9a470ff200 +S = 15fa4ada3a6e95164aa8972f14ab7572a3b898feb6cde160b8f25094f67343d35e6efdfab18793f77e09e5a42f56bae747b2b66fa9fe1e4a97e5e05ca743c058b1024cc848393b8 + +Msg = 9431c6c5237f6b4b35682a0c32f68752035c8b295a1763c5dbdfd73466cea64a00ecc11356d02d2a9211dc54548f5db1651e4471898402c887fbf45005a3bda271df0158c98319d4d6751b8ca6b07100182957d5fe0d97c4e2294406f83e9afcae4850bb089f2252490417b5afd8f07f4c795fa84c9c7cdcce26bd97273c0072 +d = 17ed9a9c75cf66528428e85b0f019e3488af8b893b12023ff1b4ca9c3691b74e594539afa0f4d7c3863d15399b862f15e27bb077392d6bbd546ddfd46728c75177338466eb2f4ff +Qx = 760779389124c702686d8d7c25dccfa74fb333317bdb414965d2c271ca5e687c4cca57e6f6149e1714551761abd4d651e7b04451d8be8e58c0c9e361fe0c6771e3d547d6ac3e8cd +Qy = 52d5725d14b9aef93b83d638377f5a19e3cd6e3584121fdfc2c3ba1a588491d7e9892be081c9e7585a15b37a9cd4c204054dadf06a9f4ebe98f95f6554941982faf109c2af98c65 +k = 104ba3049a642d9b49c4302e9173a9efaf215b67e060c5e9673521641c9c2a5b14bad25a448e46faf73810979a3a50104ec8c5230a909ae588213161fbc10381d7c75b35c84046e +R = 1bf3e89fb0beb1ab854a5513278dbd8b9c6b05c94ab67145ceb1ffcd93d1a2aa374db46ef327043518a7f272b957dbbf9d6cbd6708f4c89f05865932b7e816b12a59647d972f6e5 +S = 13a8c121c9c170b244ae3a55aa2d53f4ae5af91b1f72c066207e3f52e44723bd4ae419d24821b83648cd64fa70536605912a5a9319dc446a6b2b639cb99ed2485271acafc2bc988 + +Msg = 417cd5f60416f17081d2c70e9a510114e08be83573bf9deae75fbc3095dffc8a7f7325f61f9d6565381710eda871388cb17619e4448836076338ee309a2bba5f737319002e259b4a875cce1bb97996101c9a7abe0278dcac203a712f0809eb3c4b85a9c380550ab0bbc5067a8edfa78abf03c09b5c08f21714e1022ebfcada4a +d = 1bcc09b3f2f1d26ab9955bff7e8c0f85c8a61293511a196b53d7963f4a4503849c96fb4daa68c9852ad9185e01a35f0bf298e34a09ec352cb6da34f89a1f23e8ea27712a8f43aa7 +Qx = 1326341764a4aea222e7413a4a6f7bdc0c35ba246e3c68728ce06bdb19f2e1b9102add88a8511130ff48c0cbe4012ab52de93329670a319f6b1e7e7dbf177667d4a98d3891ec147 +Qy = 7a4aaa73713bf8fb3907d49e5653cf82a9587518c2f8269cd1e556a3be3589dad4c238e4c80681e141be93c318f0efddee3e378cd46512d778b9033dc8706bb843a3c3546e76e4a +k = 13412a98a2c14a9672ecd42db9c079a689b147ad91869c3d45a7046aa9dfd3f31edb43ce6b84e9edcd7e3ac6b96d89f13878cf5befb052a6f8a4e5577bdf916adb10d908d5e99b0 +R = 11c8a92044a30be397007a71d9af3e4222556a10f3a07a1521c1bcef73b4ddb94fefdebba5944d5bd91313560718a8f520bb5cd5666539756a5e9b66a1b2d18fde5ae72e61d584c +S = 1ea510e23ccc7596db529dfbea78c99fc78ae53da32ad7c7bdb1df01039310988ea601828fdfc59a0cd237110cfee9de8711c073be44dd4d04bca4b1cbec278b1a9ef175d93f70e + +Msg = eced8c412a153a643ccd69596389f83b6a36880286f8aeede503452bef8305942d95734fb5733f37ffeceb1c2dae7b1396c3323de11089082745c28a1756f784423fa7ad68bbfbf0d93ff8b7ad62220500df6d6895788402c1f5c69c06dd9ef55e2401cf297184e411be87c1bba657f847208c0e750f94a3df92f253b377b4da +d = 0ec52fc3d9c272ca80623e06b15c35f349b13548ef7ee400bbfa04196850b3b8cc7b239238c827f9b0a3160cd97969ce21d66752791f5896e0385b0527d4d77e4b9fc70f04d73b2 +Qx = 5cd2e63dcd48fc793c18776d030398dfe3f8b6978eec6d23f49240581fe1e141f667498421f4c40a9430587fa282441a78bb641894cb79d929c299f1aede218a0078c247f740252 +Qy = 0cd2843ca87d98f6336c0adb97bbb9c5293a03e5b86d5534e2849ebbd73dff837ffa488fad7d134908234d0d7fdac8c7fafb4729ecf0516c42995fc9337f60db2f36eeac69a4e42 +k = 1c40a15fca0c959852afcb4ca6cbcc99fb680950c64ba18ae5388bf783052b6ef3730b1fb1487189ad983b6a68bcfbb707466092da52ea8893d8bc4898eb133fd771e78379b9c13 +R = 14485cb1caf1527350587d6695ee3df2b21c13084df0c093ca5109d7c192e7e5df2232ede11dbe5ff2f46b13dc2dedb709a0fc1641c1f32857040147599d8f179fea6b2f2417646 +S = 1a16ebf12c11d2d0a64b7ea124623ffdfe2650fc9603ded571e76dbd7e3b27cd32fcb709e2ba04aee0e8e1b942a4e829cd0c9683aee67eec27d4244a2cefc36f84f7de209e22a62 + +Msg = 30e83ea39a92036e22b7bed7639eab5e5be1d00c20b4a9b9afa9a0d1653369cbef363c119cc6f921c8f84663949c8b8dc9b743ac2b1861a480476e9b64c8f333f34b6fa0e1ddf09d49618ee4f3c1f46751b5595f0aea413d4ca46f3c26b974b112cbe99c813a96a4423764c069454946f213c5f066ec38108f947abeeeb02fb8 +d = 06403de7627de22d1dcf6b8da5af62f9ec59ec065cc1ca1311bb98aa439a6d5985619b17c17a70f59e17cf180ea6828ef57f5f1f8ef05680a9fc12ab7faad5af61e4e11fb45d341 +Qx = 5575c329d73f261ab6897153d7261f87e9730eb5dad49c05d782cb02e483fac4a9ddff31d2fb695a62cdc44edef6398be8f4f84aea1d63d0b3a771fe91889dfac4780063d258325 +Qy = 183e63ee783abbd00547567bb99e9b578ad8ce63d229db41c6877534487568c423d4c389154af9627708d8d8f863597bc668e88f9412b21a6696d07bba06fe7aef93b26950c69ed +k = 0e751a4918643ba3e68bd9406a4386e876d0d66342aefb4ef75bc4dcb8cb2e2d9f8378bd02c388c776535ba85d24b206f5bef4b2f23a1c99fe2f2e8ea201009ca468e5b2e21dcda +R = 0ad6792fdff4c621219549834cf03808645171d944088f5a6d3cf1bd826b5588544a32f231e8428a03ec02d6c1c1243fb6b79b1cc6d732be5be8f2cedf03c1e5588822eec559b7c +S = 178b64bc5f9fcedab17822e831fa52d49ed10afef1c5912893df4bd8dc960b474ed25883ddc343341b696fdebd06e177f234ea45553cc83920a8c799ada2deccf1ddf1dd9aed863 + +Msg = 3ed244dc16a5cb292db4b1433b0ca3226913f07377faa20c6c1402cb4d026de808ca74a6d4ecdd7c4e662105bff6edb9fae0117c50aa053aef677c0750c7a446edbb879110030758912e8fa666489d702d8fceb719963b24a256429bbcc869a1f4ab9de9db89263e3684d4daa1df2ed94bb59dde2abba63793e5f82aa2e4db83 +d = 01fb980aef64254aeb9bb613ff2fc6967503db4bc1f337882f1566cbeb57489cf32e34f310549f41cba1b951f487453c29753a184e33330e90d4b973d2e406c99a239a5c3f96233 +Qx = 36ea761ccc71ba55aeab229aaf874a7c2d1ec15d821401e2988dccf02798c4e7bea80d9fb8d30be213fc80475a17f45d60c53249b66858d29c73e73117162934dd71096d746742e +Qy = 49bc28f4d45d29c3560915698d03271028f56c29f0ead0608cb72dd0b62490f95bbd67145a6c0adff0d6ef396b4deea6a5e2a33f242bf17e907b136c039c127d6012c88b76aab3d +k = 0ed404ee6b59ffc445b16f11b9b1471249443f8a7309ad8a662b7cb44c94866828c906fd64784c699cd29d3d972e5db3d42157452630f14536eca23cbbdd1d37e199e5a586fc352 +R = 1056938496df511d745f2cb88acad279ec2d58bb36498fcd8139d426d596de6d145b765a5b3e8366845fceae91d14075356a32515134e577937ce2af7e732b4e89a9164d083adaa +S = 0d5156c776f2184babd69c1f200b8bd94289d45a2f8b7cd8e8afb1455e8901d8c3ed14b7a23b0976b85a22b86f3ccff4ae91e286f696f39646188b675895684f33f0368098fa7ca + +Msg = 40343935d9423ad30f3fb1832bb08a5d20ddb3a55b59057cd275320db4a5835471c96cfb7d67f41ef860cf5879897b8dcf307bd1a52a6226847b768ea38ff1858f59e64cd635b51e6863773cc6c64b363ec47ca39266422406264668415c189e2f92447ac4c63ee5d74e95d1e6af05016917ad237f482ea0b02aecadd370a8bb +d = 1d96dc09dfaf602789c1dffa5c9ba130832badcf180429660daadf4cf1be5cca92fe9713173861670eebfe3a0ba25bcc76aecac60a756f07b69687e05c7e25984a39556469f62b4 +Qx = 452b1cd70e3c88bec1fd0e4b8f8e9bd5f844ffc12f3d6769eeb1c9ea90e599619908682eb5e43b1d6eea63ba9353fb64b59d6549d19cd95f2f54156c81fba53aa0dc91244e7ab8b +Qy = 20926ca366dc657d133f0ff9149738738ce68f3cc2f61dad590e2502e8fea714b89543f43d97b46b7075c58375efa379cde208ce769a16be9a377a111a8ac51459840a223f34695 +k = 1dfd064dbe64c25a832faea1819cd836d22583fc40b2ecbc19b1f5173c25f33ca8cb7f30bcd619ef73a4c14c46e610c8996059612728f508bf7db7ab3191ad61955e8b1ba409692 +R = 03cbb0ae5f7c0978ad8c10c4ff099767465ed6fefb7358f3eb58a79366707107cc88b305661526f2972bd16923375dd898ae72e81f290b86cf9a4dec086d7ef04d7a7bba5087f8e +S = 09f77a86f0da4e35c395978603cbb9c4dcccf126b7cc924cf62732593bb1aff0dabb6d58321debad4410dbfa1fb8fe249bfc336db7669e4ee13485ccf8dbde01ca4cdb9acfe5e74 + +Msg = 274567f8841183e68c4f6c6b36c5a52fb0e88492e4076b9cd768bf571facf39dad6affeb68941ee326ee461ce1f33c26e4bfb3c9e0cae8241fbcc14cc69c1af68701fd0be3def1e87b7d52b682ebbe1cc225c1bd177b0886e3698a06d0e410a1f92c9bdf7239189f6acde0d0653815a72987671b415d1e8a70e685d6e5b14c33 +d = 09d98b32c8eacd135ffb8e13223690ef02c0c1f29ea8b4da193502c8cb3f39f9eed608c02fd457f2fb685ec4595e8fc8f388d26778d225d2b18c9bc8b199d8b65c0d1a6af33854a +Qx = 775560724ab7d98407e20af12b03634a757037f8b3854957e11900d58460ca20d93ef06436921f8d4481ff9123a9eff3973e17d441511df3cd88d0d6dfc8016d2cbfb8963378463 +Qy = 3082aa4a81d4e6f0ffc94511327202f2baed72c08026e05a288eaaeaa36a1a4961f400b4712ce68778ff38be43adc2222a986ef0fecde62f861575842429816c8fc77797af018c6 +k = 1f4acd3430931ecba5e9d986c6712467526ed94a0bfff36135da3ba7dd9870ceb38fa0b658dd391ce658774c6725360dc20e5ef41daa9cf52fa863840ca91053e7287ed29ac69f5 +R = 0502abe544fc3262663524cf88a5bc256b20829b7bed3e2779f559506adce3c4f3a89e18bfd31819f78ae3809d9d0710c6591b2fc90039328678aed9df2fae38a74b66f69295d82 +S = 0b2f055248d9633cafa4db3b3cef0b76ee02f6bda3d508e19c68870e76a02c69dd1013a03fd741e854cb34f815432bf48138203177141be7209e957f4db1a958fcd45421a213c98 + +[K-571,SHA-256] + +Msg = d9c99b8da92d3c2e40dea3c4025dc37770e867c4d2746c4d726b6de24250591a586c166c88acb8ed340e161d4c81b9d14c919a1b06f1feb22c5ce5fca2693bdaf4994ac72c8983c87f331473fd094eccb3d5f3528e69d487562fb5a65c150a8217192f8aabfa7adcfd0b6916d5000248fbbddf1ca2f38e3d9ed2b388998b7cfc +d = 04d873ac744c4f68bb044783ad69e1a733cb8b8f483f2695bbd90c4211282036ad7914a53b25c3e890c6824643cffbdc4138d7ff457e3fbb99387494eb5cf2bdf1ad243a3a1e644 +Qx = 4644456a4e5c543af7a086640fa9ff6627c2d9f17066d255c3e805db31fb1ba895682e94f6ab96d6ca449b0c3f76bfd6593d182f422689b31d9dc3bc0b70df210a96d19af9ec2ac +Qy = 1d38f8572a06ce22c1586a8329f9421414b334352f1e8b961f7e0732ee01e838eb975bfb2f62132bbfd9acc6ef8899b4fd388c2b59e564fc3670da7a008ca016de678d6dded137c +k = 0b050aa7266201a42dbee063ae2a21398ee1d2a190de9fbbce2468836e416b3ec18d7340c81fd2a5283713f9aba33e8cbb105eaa2abbf0b687fe2713921bcbc02a4b77df21f762f +R = 08351115714bc8f29b84a6e3f0a23bdc219d4271a9ee18bdab54c3acc9cb3468beb1f89b0f981da5aa7d7ec7ad451bc5e91bc98440fe20f5877a4e73614820b9ab6f2bad3e2e609 +S = 0c64baaeed68178f5a1d8f095b0932fb73f9a02462df5e8378746ecf17d05971a0a287d5a8e0317db055b02d4f4b5864597d0f9a9cb1ae68577dcaf7db09c55bf3d3575197295c9 + +Msg = d2b88a01fa17703c99e5b867c645e98feec0d6d1afaa20a97b5fce9c23f0594460142af4e36a5739b8d26d3ba35a0263caa5429b4abba157f359fce701c43372500fd2ae1bc2ed80bfcaf8cab7016ff93d4a27f565b7e67fe7dde22bf02c48be12114fbff2421517c825019c0ccc72d927bef156140d7f0e9b6ee37af78c3efa +d = 18d2eb947297a054f8a789771dd875b12b26ef057fb91235dff3b062916f85aab3365609bd2a38a861439c8514e33f174c198139354e63766942f605107cb1b9709b782622b295a +Qx = 3f6454f1dd032a925c6bc3e1c62892c1dfaa700d3badf83f07c1185c31ea817641865a129572f3351340fec331f5ed466db7bea3ffa9723c951b518ce6f3c9263a7bd6866c8b0b4 +Qy = 188877b68c10cd6ee543cc5638bf0f82db25b9327b2d81269dc61250eecb976d6568a9df29277836b97973e3615e0a4345e610b33909c2340a23c61dcc6e2baf2bc363a33381802 +k = 0ec6af799d92ab52c51cebda61ab642d4876f374edb17253a1de3e880048355e58367096d3bc0402e4b93fa6a6c8d55c529b9fd68a27962c19274393ebe1bd0b1197a28125275bf +R = 095c42b3ef01c0f9ab96693526e903ef3ccf0d843776089d15e77093fa9d010872d65cee1801f821bcce747ddc5875eaa462b00424e6cdf0995b87c6cf33c37d4463848a6ad7fee +S = 0c4f0edd4b2dff4f9fd1fea5addef6d483bb51c27bf5c7aa13f9482243e5ed5571bbe0a658543c69b731de56b6b34de27795095b3676375cb4686b45d48010fe8c941208cffded3 + +Msg = a704a1428cc894f958774368979fe075353b56790555386e3b043dc6a2919b94a11c7f85883f46b4d47b324d349c28c667bf9a000daaca1d7191f2a0fd97a4867aa9f72422134a690625408a9ea4b723704690b69152655f9e9dd5fa3dd94814d97dd4f13e85c3f9bca769491c2461fbd17e28afac00bfa81371d5039013da8c +d = 0594fc0b7a5cc0216d2e78eeeb6394c8225de795f4b73bec48b2f4ede185ba622b59a16dd3eedf8cf2c94f2ccd6dcd205f64c97cf1b7f1e34129e94b5129502909f43940dba0746 +Qx = 271cbd3e0d73ac19b975559450d686ed67eeaab4175435b2801e8989966d7c5ba81ee7d749e43dffa12efba820462bdb274a57d04cd7e92c180cdf555686c78aad58444d5f17129 +Qy = 7c407b46e93d4c2b12c967cd3e41320ea8535a2ff24372a5791fac9e95865e14d545dd3627dcb4aad2350db248ef49469ff4d59a879a84a19d1c0e5d7ad3db432af927c88aa5d48 +k = 1e730d50a9747c7c1ce2918fda7575bb81a74757cf9625d0f0619aab7f1eb6954dbaab749e573290406e599eddd7d3376dcb3fb98c116ed7b65729dd04ece3eab1d7b4bed52326c +R = 00d59ebcfb30d7b27c87d56ec2fc9286b04b39e68dc49b395f374e19647bcc58f2fdce1c0dc815cb2aad55cf863a4786efd6c3a0ce56c1d92aa20a19245e74550c17fdaf7a08340 +S = 134e80d63c9b328e02ebafb75eabf0fafba886f48b25206cca9086e03658ce2047c94a5222a206c6c5a57ddb8f59c5ba1408fc56668066fef4557124c430cbd1267455e0b31a8bb + +Msg = f8a87c4acadee27a908718461e3b45060ae4ebb009b10a15926460bf219cb7e75dc3a993fb9a741b94e2fd71615c50f6df958568f452b2cc284f0516816bc0d2e2d45f663155660a26326f63f4aa42a6e1cc8462a2ec620a365257ec042f55e4047b62af689592a1a072553ff174dd629a4f51837780ca232cf479a68c1ebdda +d = 0f000631106c5851e8ae0802b01e7a8a8540b427a8a3956a1d36f0600be89318032320cc420931d825cc964e823745c60aad3437ebc1c91d32004472e9677605fb708e5a71a0d83 +Qx = 34136cc7b8e2dcade5cbb9b3d0e0857c485ee791f862273749b5d3757d072bbeccdd8eb81c67fa6927c1aa54d823193c370fc596d0d903214d7967b905292f4b96549b3dbc9b47d +Qy = 56f69b42b29ea82b9f2fc377e874b58ee785010bb7f5814907fb5531789606810b71613a36035cd257864e414fe0e6ea353f398745df87ccf25b3a25cce1c78f61f5039d66241e6 +k = 009781f5d960870a289cc20f6b1af56602e5e12d9a7353e81b89a90b0a9675686f15511157d9fb70b82e8b2e25534f8ad22e14ed518e62a88f1ae21c56d4ab7763808851762d3ec +R = 0f3eba5ddbb8c127419fe5e8cc1aae2239bfbcd2ab43a006020b96c9e7db832fb09e0bc887aaf24848491d4de935b78141f426875f7dcf2937748afb303ec5eebd01b6a82a8c4df +S = 17acc35bd81cf24f983072585ee1e096459b408da909fd82b5ea86b77154ecfbffa7fe97271f50b67ca3c29ce704b28186b831300db0aa0dd6147d2d160e4aff14348ba76e6f711 + +Msg = 10b5438294a77c7e517ecfe8f8cd58d75297b14116aa93e574996ec4acb21837e6297cc0e7e7b5861e862062f192f2206a01b1caf42c6d7181d02c7d62b76c2881f8479449b02d32c6f792714d8f70f0c75e81c7d9abb996be87f5ad9a01fe42b75855558d5f00df392b62ae0d258f3f67dbeaf07208952e679a2c573aca941b +d = 1023997206341c6147c536d034a9c38b4012035dc2c9b7ef0bb9cfe65e7d788296f055d508a1fd957b2dc7f9eb10c27790f15f30d81670945e54a508c57b70b46b4a09f4c769289 +Qx = 66bd3f503cf42a20cea4a55cab75940907f38fac7fb024c55245f02d72d80336574a72fb248b1b61e3205b31489ed789ee78d88e487db3f5a1cd48efa1487916b8707e72e4be7e6 +Qy = 10b6e4330af0270abeccf0901dad2f8f64f4993ca93a7c5281dfd71c6ec405f9a9bd78008fd22fef76fb79e20a571df16c4d97244c7356e3ad16cc489d3a9b2e3fdcd5f23b48e26 +k = 09137bd8436dd126924943e8599c87f64564297117766580e6344aa3c02056c811fb996f264ac4f8f0cb33eaed5ef8f120d43a1d2b3e5e34697765ff9db4b4683ce5c1596d74723 +R = 03b684a66e92d352847f63196181160db3de7a304b6e43679340eaa9fc828322b5b9c16a1772c981ff0febb474488daf998d4acd867e78019b61804bb675a98cef24fdad088afcb +S = 02649a94d2bc243e997bdf27be7d6364459c38845c3bc8d1c8b549ad4689c8a4b4fd55193ac769b1da607dc96458e2f6abc602bb4048cf6b0933da6785795d04d10f22e439748a8 + +Msg = d83a52d43216fdb16b1b40469863ca8eff4df9fa358deccb5ffd18b3e22a9d654aedc98f3dbdc4f5b4e56b4299e25d8a5a38d01b34eb93de382df1ae4d1c7f966e84b84c393d167aecc6f1192c4b42cae83748b1ee3d9147ce7de74cebd122695b455e8082f86e3e488fb0f51b3b7edcd579940d1cb9d045296e5e38f201b7ef +d = 11ebf320ecf6a908ea5b868afb8e22246ce84e743e1076d6185ec65dd79043380708bf8da4ba802c3b93b8d15509bb7d7de9dc29f1e9fb0f0f2cb97a26698f955b1f7ef668122be +Qx = 38b2760315b0999f9629922bcdff65cfdee4938d4aab8cc3d200aa9c1db843fcbfeb9da10afbf10280110c49f0c18f15c2aac4f39af35a79557c68eb6cf6afaab973538b98b0a6c +Qy = 7da55796396e919f9b5967608af06bd01e8870354317e76bcb8597a379129e35bcb69bbf6b38911a03c3076f7fbbe9b179e078b442c604519e330282f6f6c21aba515d6d73c0257 +k = 1c219274e54a4c5e1e1aee3bf805a7002bbfe1c030cd4c8a1617dcea2a14b1d537a64cb07c5a1385edd76f3e4ea9a38e38b458d2c7bf8eb56a57fd33166bf59a8af2e9639106929 +R = 08677167a7ea1aec4de76d1c5effdb5a1655965850bd6498aaa4fb3fa50f213fa4d99caf4145b4ba87e34797babfe614dce6ac21d9c13dd0fcd9802b1414aa92dfa18318c7e57eb +S = 048d6161a3739fbb3ee1c223bc82a46255d10a86a605f6c8e1934b13f1a8662f30f8e95f53848119c61f08037ee5a2440c8faa11a6b1800078ed476b2a3f4cfdb25367c8dc2989f + +Msg = eddf5553ed4db6e8ce72cbcb59fb1eb80671c884ebd68e24bd7abe98bb1f40806de646f4d509be50a3fabfa85c5630905ce81abfad8a55f4cd80208afffb9056bc67d9dd7f4660a5f924af2a3745eec2daec39a3fe36131fe9eea444b92d31f6a125f12125159ba095f89968a7028549466f41ad45668a861f671050d2a6f343 +d = 0746d5c824d78f42a1fd63d8fcca61f154ba3e75788b7a0b87f53e5420e23a935b02eaf67bace8dd8a8e7c1caee30154c2428e0a437cf12e235f41c416f92fb54528865fd4766d1 +Qx = 63645fd3810e2458d15b43287f329c354b07324c0707f19847c544f129e4de1799996f805fab7dd356567970e10eb21d875e8ee7bbce56c666511f9b4a4cca986683e937d6f0b3e +Qy = 595485c9a7f2a97fa7f8453df13b75682931fae10f3441042199fedba91a58c105df57b83d2a3911a2d34a2d41e451d0d2549b0a0a65b42aca40aaa618c252baec171da7937d812 +k = 0674788e75eb9d5ceaadad9fae036f129178fde1a584d73cf284acae3b4cbcc208ae7a5d35aa473f4e1201c19ee5bbe685ff9218a8e2188f3428ab45bf09b6b600fcf81fadd8d69 +R = 060d6dc42329687012a93ffc5b846b4dce3df46ad12eb61437832f81f4fcdea7392582fd75e701e106e5b83521759da6a22a21addb63b73783592d3f29347f3d484e05c19db148e +S = 197f3b2d4f3e10425f4cb60dd1ae84fd8c87f62a2cc822342d5f0be4f0841623227c5cb0f8bf83fef483a061e30ecac86cea0210036083a99fa1247b49e19a7f401a815cb68ab3b + +Msg = 3db94335f6d1a125309622c0a9d71bde1da09371f0285a93bd0aac255fa8f10a56074e0f6057f1b1aecf2d86a2319590ead96a2ad1336fe844e09339b456be32374ba2e659fbe9d0f2cdd83444d117d2ce3204ce4b4294dd05405634b84747ffb4227160c4e5c2c9da9815b0c6d20f55705f16cdbaa13d107ae666d707ccbe6c +d = 00670e72ac2de50dd2cdd975a6cdab10ac45e37ef7a28c685d77447051496b5e161f8b1b93f6c7f32fce8ea05e94ed35fd7cb28c44bf51ea29cbaf5aaa31d6abca30a89430323dc +Qx = 54db4acd0815aa7ebec4f7661d80465c64f1fd4147507549352bc07dfcc6041ad309bfb1434b60f73b3d61ebde91f849004d55257e98b6ebbbeeabe960f9429a55a36ff75c1124e +Qy = 5b6f36f76b3b3c780b6a70bb8ea150e9cd6895ff6a6765a3516acbb4f5efa91434def52dd0ab81f618ff28db10fcf39264be8e7ea76e06516335ac5ae33ba5393080f114189110c +k = 0f74a0ec1a7496043d78891e308c82b4660606642ea669e4406683d44b79dd6e6a1b810292bcd6a9f59bcc2e590518bdf2e9224755654026d85cf2a3d9768d909278448f0d63fe3 +R = 047d808febc1065646e6a5608d62d1445d922084487a64e9ced5fafff2977eb3a7e29984230946e3fc77a766820747122fdbbb9100c591ad7c9dd29d07efa2e8a43357e3c47762d +S = 04dd6c8ce75bf2792ef227cd5a3102d30a9a31690ff5c21354f8dac9f826c86ebfaa04653f0ead103b1c8ea59f0a78f5d4e8eab597ec6c028ebcc57f4ce4103ac14579bd6e15166 + +Msg = 69166ba40768d0a3930325405edfd85f3272f7b8e600b0b319f070274c91f9f03d0e6ec4bfc7b4445e91b87cecabfecf5e77c7301ee3c6b0affca2fa02c92216698705eb75443eecc25438db2d2fb4b24f4195d6b9c05c53e0868d3e58477100607ffdc31b18c40b4ad7202bb034e58653daec0f6b33c024d42a3fc84bd8f86b +d = 0369a3bb96f884983c23281bcd04e24a3e5f6359f81e3c8e46f3f6b865eb6bdf98a630e90646275c587e41b546d3ca7688cc207afda15cf9b25cf83bd6ad27908647f3f9de59de7 +Qx = 0eb02f6e741b3f83a9dc50853828b8a6e0861ffc644162515a264730c662ba388ac0d705f8b36f5388894df5c1bbc3582c85de141abb7712caadd2d616da589bdffdd9258808a41 +Qy = 5dbf831f450da6f8e503c19a7788c1317ebe556a458e2bfbf3137f986c9c966a14ca90344be1b76457159c9d70f13af7fe0013cf605010a8a3b84bc0fe187c7d93e4cfb2639de57 +k = 0ce22f7f2f01355280ba2d2cda06a55771e66f598bf79c65171e08a98f1d954e4beb3ec77ab06ee60c5fd156a7098023558e3d630641579cc179739bda6d860f8ba1d5ef717ebb2 +R = 0ae86b40d10ca45c20bdb3db55a6dc12e9b75754679eccb44c40fa57351c23c062282e1da9e1703176e4b8f7f224982f2474494772a20269c43a18a7a03fd12d8ebb975b83ade0f +S = 15ff7b34c3316d9e7ee3d7b48ebf97d98453ca32f3fc67fd08761d93cf34cfa5a2314fd0752d263c3eb7cf842aeac395d41ad3c04c1a9d3808b4fb7489e880d130c35a26b702952 + +Msg = f64cb668b72f1e6dd026a478505c0eb33446ae9a2993bc7648aaed02e172fa9a0e05eeec61e756ba246c1dad7e85d3f01baf734b1905c5bbd1b08d833c2cf1e079eca75b866d705c407eea8618d23ebbaf269c7185984b3bd4117ecfb295ee6b47eecc8d3a78bb96552f6be314656f91caff793838226662c75cd7804b6bef79 +d = 026717b039df834855511815d5665ff9b654facab469390ae257b7f0eb4dfe66ea0dc037242ed0c13bf229b8f7ff26da9b55fe4750d3451c62804aad493c179ae45d08ece5af085 +Qx = 191a6d1ab9cdda2d593d5598a966efff829c04c421804c2297e658adc5c9a6092e146b25c730ff7ee65cb9812ac9ea0c18dc6b60deda948b4b7568e8b8e14411a6969d7764652ae +Qy = 3744af98387421d958b26971d21928b73bbf5b0f0ef183e9f606d0348fa715f153a60b6c7991dcefead2ebb875d0c1dbd3665dc42a241c565ea0fb0e6349b4319c3de633883a516 +k = 0dcd28cdfe9028a4a6df1d41019bc58e4a1540ca94b717d258f2afe8bec560f3028e15ec1e8bfd422415961516659fa2b006256745e85e488c359e8cbc94cd2592bbb892a19c45e +R = 07ba5911415a3d21a3d98b400f61eb63ddda689bfff0c8c3ab83668b1e4bf8a703c853d3585b8bdc29aa2fdc41d5e7534850f4656ec949f0a13fd18295b662c9829723e5a7fe3a1 +S = 1b027e38283d74c962fe0e7b58dfbf5e21ce1d9c91651bc98284008f44fddfe4cec9441994e690d72a8ff3ba2b538718aa678e7de046b653403f3b7c064ee07c9c3c6d23e1b068f + +Msg = 51ee0b98eb6a3e3c1afcb35a33697c048dbf61374629ac5702a57801fafbea4d6fa5a26c9d1b79d1c58257ac0106387fab2d4a1b7f8c0dadcbe7c830613531b3c209bc17f792bdba1c1fae1b7528aac53dc86c2094b40194577325c05d2258303a2d17c854e7449489c43991b6877a50692a6340a528a6b188440ac0cddd4c4b +d = 1d642f2d393ed4abea37173e4a79534af87adf534ead4a0a1c46fb047619221e3577e6b8bcc776114d01159c736ab78af3e53feac339d7afe58be8e7a8ed290f1dad960f1b5de94 +Qx = 23d1ea50229b70b46578df6904fd528e9930985426eb2f1ce10eecbc0c1658395948380c4047d67bc4072be2a2624d62a301da41a5265f040642d1937fbbb7cbd205e1db85b8685 +Qy = 625c82ccff6047b1ef4b08f1913f7366c4f6c0312c21e5ab01b598d1a9618cf5c22cddc64a4732b477dd5c06e332b846c8015a2e5a195326bca46c29cedcc2f24d37ebdb7c2eaee +k = 0c9066831d61a4192ad9de23efcaf578a5d5774960a2b3e3e292e0decaef62d1701b86ec6183d8e17a699d418ef9d084b982c97a55bd76c8b038ac5c639451096ca4d331f070ad8 +R = 005778acb38b1961195d38463abd9c19d9e07dcd997f19676633fa3c44caa44ad1a9bd63435f3138ad8f22a731e749a81161c5448eb462fcbcd69ec2255cc2923ac697ed319316c +S = 1a1aa90113952608dd17dbf391ed56231ecfa7d649f3274774ed2b6034a2207c05c6d8b6cec480ae27b58495a50b1e5b74a17ce6cf2e43aa273c2b813c0e6c79976882b7e4b1c93 + +Msg = feee50aeacaccb6b1c3d95c6524044edb78322ee836d8159c4a4c2cc6982480567c4c6cc4806a564876622266e1ebd45f2f4be851b79da025bd57d0e6acce1ec1c8c255eb89713a1e4897d4ee0f7a248b9d4bd3ad5dc0e57f60ebfb65691e164bc908956a019083e923cfd33dcf37c735af3462768a1e14a8051d7aee74d5228 +d = 08cb70be29e83f697a3e2f67d86f1c1ec9a163b5335cb4a06004b6634948bf60b8ad9df9b27d2bedc4975265ce44a7884e57082d521320ca4372d38fc77b18d3fa05ad8aa5c43d6 +Qx = 4c042bde9e90b38b48e60551d832a7c80377a81e8c5b010d0e491cf765c432b5edb0771aaa5f672edf3ba108dc71459d245ad60f3884b8cf33f8cf797f36b20e4be39c8389e66b4 +Qy = 75f2454c41c0323ee1a640755077d36a65be7c2a014db36719ec217e21a9c004bae5befb499bf6be67e82d3da70475abf9dfb751c84c409fe838cf1c6ae109d27f24d75c02cc5b3 +k = 186f16dfdd7a71f20a5e634ffc465356914bb52286d3d5ac00f3ebc02497112fcd592e1ecb2ebbc819e07ea092e465e66f3e58da7a2ddd41c8787f57c135ba4c168539b4743c3a5 +R = 1c2140d294fafe3d9effb33ce73bb7e5485c93c7aa9d33b7535c7053831a1dbe79075713794c87e52bc887ded969d2dfa6a1e2630cff96760310e04cd2a75be6fa020a12fc84d3b +S = 110aa165707b7de1b3a8e05e4502701abb5ade0a27deb04fd93c6eb24ed2b67ade6c49d78e874d25247e948f704d3c5b925f84c5b07c9b289c4f8507e75d0f8927c6dad6dbce885 + +Msg = b115f7370d6a93a90fd9dfdfb292956be34b61992ce1fa5627c5e928d74bcdeea66d4040c473306a0070fa8363c4303bea32f73ea3639b5c6676fa5a1d68a2cc1f91f00580d7453a23ae70af4cb1f1657aa82c5b305374effe5d67d559e46a6cee6360503d21070506f1af30bb000d2f2f85caa6465810f89968f33abae81cb3 +d = 1eef463771f9c6285f3257691dea0844687606d4dd00b6020517f190891cc1be97cfad21d147ed8881b5a6e19b22ceeae30e1132476325f2de0e9af2e14c80b8c780a9d2d6c96de +Qx = 24de3ebe03d2d91b88794a77635aae6743e597410ae10c356a51e3af88fa7f9c4d648c7d1fdb887c8313914ed554eede282b24a2e66aeafcc0cc96907bb2f3877eeb97df491bef3 +Qy = 1ce1f9fd4d7d3870997f34f54f2ba8f08ac94ea94f74a766f2dbc02e4d5149802e3135a2d762e3b8abb01461968f1e88cfc8c7fda49c099e392e80d57f0c14de9c4fa1eea25732b +k = 026b545702baa340fb6d1bc2bb96f7fb1a77a2428cc122ea380a258c747d4e0625bbf4e3dbc2ca2f15bcfea92f2417cd5d22f2bb5f38a9ba313b3bded506d3e570dcbcb86c2debd +R = 091c162d040a12f08a416296a43501d92e2ecd6be302b5e1754b9ec119fb8a572626c509855c7c868a07b263f66070ac986f95e4c83150a5a492d5ea8a7f8ebf556c17ad2bcc996 +S = 00c217fee7bb202d6399f6b1ae4e5811d9361573ed4fe1b3fe5d474cf06d0236d59dd3580145dc0bc7632c721b6463c69490a67d1be1fae99e34318af6df939f9f7f36a9bb8d5e9 + +Msg = 726782eb0d9720daa64e4a77b5d8dd67a1a193f15eb6b5162e3d89c925ba63b7c7e1c4bfc8d6f11915b0e14d16ab53ab015317bd5958b0beb6074199e05181915496575768d026c23e92e06016598de008c3718aaabcda8b68bebca0a73ecfc7327e8d3646106b7d114dabc46cfe56265c326ee56fd2ca87abb5bed8f997c735 +d = 13bd452b0880b101df1aa65724fb60d5d85b37ed5419027481661a3617e0fb37bda1151b9b5b41f908ba832011f7850b75a07b678e5b8cb35c5fc8b94a625e4398cd5ada2b04cc9 +Qx = 31d88b62d2edd5f6ed29258c143bbcb3d29413afd8f86873698a9efb8d2021186415d301599232989a0df5ea91ca222c5781314f200c708de30751feadc277d50e64842dd355ba5 +Qy = 1c76f19ceb1be48f5540265b8b018da62fc225cc0d2d1675bf7df71456cc8e35b002a220e2e80691600a2c1ae31e980d0cd22b4741c25bfbd413f10b375a4d8adf70a65c48ff006 +k = 1b9235221a6df49e39b4cde6650e994f624fcb5084daaa62aef54bc154949f4da9074636c44f50ea40da1a3f01bf67e9b62a725ac0537a4e37ba33fdea8ba8b2286bf82901a933b +R = 01dffcb5b5eb23694da4978419110ed2bc7961c571a2e68daebe21e598c8b483b34f3178978708db6d78455cc1fb4f73c5ab7607cbb4f05d4d008c7bbeac88562fdaf7a370ba394 +S = 057018fc97d7b16d69af2b7dd4a859f09dc178a6025e1bd6839ec7c75c0383c59eee7079fe61aa6bfb3e2c780d4ac0ee074e6b13223c239aa60ea1187ca4937864f89e2c65056b9 + +Msg = 1c2418243fcd89c6382b7c3b2a8c341f26d08174a9e9296c4a5c98c5793a0fa48dce51e30811a96b515aa22bf9af89a43de06d696be1e531c5dece1f69fa6ecb7f20be063c602a16454ddafb14385ae3f8246c3f989d0566e06e7ed1864502896ea19df8393259c4dab3b3380a4a80b4103cbef4f38cb69198b7cf74ce94883b +d = 1288141ec2244e4bb3f62daf4ee588aed09ce22be55e3d42e9085a947c1f8cd16533635d170bd64ae0b417346fa4670c25d41387acb2a8e14407a1931d9f7c5358a14eca40974bb +Qx = 7ccb7b12a7d6997ed2a11eead3278a3f45ea284dfda8e17f6d926ddd6881a44d02a0f7504dadbbcb0cbd6b85c113aa0d3b4efef1ca151cc38cab1aa8360a6d22e3d6fbc0ed980d3 +Qy = 31b85dc2d2096bbba6c465629ea09ae3421cacc5581770ce3479070f23b3aa938333c7c691d9cb93a4533b2ce389ae34dbebe8f333cef530abe17cd21448f701608febd42d9bdc0 +k = 1e411ab53c48cfc1ef9eda97002dc9181a78352de13fbee3bed86cb00c10e7406033fa0ea97b50764b0eb2dc6eb8ea83e47bb3150ecb9437179c124f15fac6ac19b0c8bc324f171 +R = 14420d78f2f9f1010018848b0442ff6e6203c1dc06a4d523802190f462ed3c11c7aa7678bd03ba27df01cacf4121309551877d3a2bbcfee116c59926daafce55a4e0a7d69c5c938 +S = 16de0b369c28ffa0bd6ed8802a503929cebb5c0a4bf0c0e99b14659b48aabfd08bcb64bc2e39855d7d514d7525b3c4dfd2244f37019b5f86254cdda599bb144c8fdbaad5525cfad + +[K-571,SHA-384] + +Msg = 1de4b642ec7220c64b91561caed7832044d6e811ac909f3b199cceb0d8a7db91bcdc801412044f5c34b355b95a2c6170fe497f6d5259bc20715a38cb0341c88e93029137e94d895bab464bca6568b852340a5c5d6a225475f6eefe2fc71ffa42f857d9bab768ccaf4793c80c4751a5583269ddcfccf8283c46a1b34d84463e61 +d = 01fe06b94a27d551d409b0eb9db0b163fadcf0486e2a6074bafe167f9a3b4ce8ac11f42cf72f9a1833a126b9473163d29bca2ad139dd1a5e7fedf54798bf56507326fae73a3e9a2 +Qx = 38d4dce42bf8fffc39a5b6583a1a1864de288ef8479449d599115bfa35b37954ab288ffbe81e69d58693e2c8c81639df12e4b36f62b2ab042e92a0715b518c63d0ec630051d4be1 +Qy = 59c72c0bfb0ea1ac5e2fdd4fc380d08037a3d0eeed4990ff02e6cf5a16817ea598085e28f8269da86c547e7b34e16a06724ee73776529c5b5dea4ce3321fb168827ca1cbdf8856d +k = 0a3b18c8c9f17badd123c674869ff428d533d2ecb8c74f9784220be7a90dda591003df5259c5dfb612ac7398aa04cc9e82863eb0cbe66b6e7f45dd15dad252f74a538d5f4354c96 +R = 09c368c80f697c1718c55482b2c6c5c0edd7257a3a53f7193515629aa40a9716cc889d41c120516b54f3a106a171082364886e5d3a1e9482a103f072988f61de68f034d658bd976 +S = 0e782ef47b250f40c56e3ac4de112347174bd59fd4cc991a2b538ca90cdb222d048fec62e2773492a1d327152d1d6591740706fe2f8e1d65de888d47fdf173b2645813ac0fc3078 + +Msg = 70279be7d7ac72a32606642ecd81b5d4d0f95fbc3c0b07d85c16adf2788601e44dedb8e55e0f9e0b4ca3ca35f5be7511b0e69224a05204af67aae11ce154af6d594d47f6e3142ad183969544aa95cae1edf42bc699137f60178c12b10a67698e37ab9f3edbfb3acdf1b3513d62fe3db33b16cbb4e1f9dfe732c107f9d0c953f6 +d = 09cdc7e4945c485a41728f83d5188f539e372ff4fe38fffcaacbcb4522428e4f93ef4972556f4398fe17bdd885768f0fb5590df495badc794d4d274e22f2f4a2535555922fa43f9 +Qx = 3c6f046aa3007ba7f883bc1e0bb43a9a0a1daecdea3e2b6c10b2481d11a834af241d60cad7cab27b677c9ac11f2e5b5226c0a3de13029229af00e5a092340af9b230e0ed992acf4 +Qy = 6326ffcd62e1a68b63ac680a743130b1440bbcd3966207dbc8a8f4336eb6a7986aa53cfa4fd7bf363b30706b4fae01568020b41caa70ee3d51db982de66b0ee39777da3fecf5b01 +k = 0c717523a308418eeb2aeb816346b74149d56b9620774cab582f01681bec73adb779bcc7462fff35685a4e1e114c8fba474c68fe2650344fc9cf610908966a9dd1779f76bce0cdd +R = 0061067f377bff6a9be30c9c79d8abb7f54cc8f09eaacdc190beb27b1e6d297cd32b043b31feb49958745b78e42ac074b8722e1a7653bf03611d87c44fd3891ae410b23a2140b83 +S = 00edbe756a5dc78c8a29baac9e2059154294e3adac9a5adeb7b27ac6e4d4086821cbd55467266946ed8f6f03abff35b59434afe84067c1daa1e0bb62ee7c56b85e7f831eea99047 + +Msg = 4d7e0ad520445b6a5cb46b7c77fbd367614044ae6004494c2b3a89089287e2836c73b799cd8c90139eac427ebe335804c3788f3728ffb8edd7f49a4bcc76a9e24ce3c2299cea88c04645b82033115380f81b0c1d823e470631008d350cf0c0dba1915519985b8a389ccd8c809dbd5bb5051a79e631916e0d052d9b6cca18e0ef +d = 02bc753d007c4491cfb8ce0a6c96455acd16d37e02c982db216b8cc1afd6d10c6be4e15a3988b8b8b86b2b5b59a5c1939889024849317f27ee08a06bd8e7524d4ad83a1de208564 +Qx = 0ea922b09e902ce3847f14d3b3afc5562dddf15811cb2e7b9e06e1b919d795f8451a3dffcb92b418d30bbbd1a7ccf827ea0f1f6554387fa2fc51755799040133d7a655c7800b713 +Qy = 1f12439a0c0df9f6ef08e89eb1a62e2cedafc0460030810b2483ad9427c48dc061e4640ebbd9b4a398841c863a6e3d510e5c66934d66b317b1640bd05018a35677c6ac2c7839706 +k = 0385f9caee4731627276875dd8d725fe79626c18841562e8a13fa7531c7be9adca565c22459d519d643ea22478d7c51b4c286920b050bfa54ab7d42966e389c485b52cdb4fa1a0e +R = 02ac84262fd121bbec43e81021c0f0610fd2fc0b26d66581ddaa78714ce58be46965283851241d792ad6bc79af39f09d2d4bda83996ab41f1fd206b8293cdb6c4eb9d96f39efa25 +S = 1d9c9bc330adeee8f58ebfe8c1ba401d4433efa04a44185b0e8e20b634691bfe058770d074289e636af3e96c118edf31d72b5766c30f6fe84ade42f284fc7f2707bf27b3a309638 + +Msg = d49903f38b5c9b17542310425e59377f61f5b4f4740cd97371ee2116083f7758e69e7e2c1b0950ec6b76f96e3c91c721d6f2843afde8c7505a559c8a64bca2e665aa1131b75bdf86fb5b90581c7d3b61c2cff88f3fccf356ddf5ed282e27727be061b6925c51ea7f1a495f471dc8a5ca1a88bbe29e92338d3c9361460398965a +d = 02082c6e61d0d72f040905d8c1c20d47b029f41ec68d6cbf43ce97c3b2a0a770557a33cb803c432cfbd3958fda30ec1bba77a6613c318597a85ad02b26c44bb77ca96d9cc1194ea +Qx = 59ff339d505b307e05adb45aa314d47f2450e1b1aad840b5550a67c11940d0e78654755a8e28fb651e12e48c66cc1ce0338114bc1ffb00965b342ef3a3caf495f1d73a69c3f3d17 +Qy = 724e9474e6de57b9f8cbf6f6bb4f73f5769e6cb0e006a34c2510b379995c9e054cc4981c709ca85a3aebdf29090ca07dce5bd3c313c6153b551012d72a8f84600350e8754bc4abd +k = 18d65ca6c2ef1fb32dddfb9ad4603e03c7cb1791a9ec7b41266cb68b6048aa111f5971f3cbef3f0dbb9ce409b59c31cc59bd6f100ee5247f8c36f26ca77cb252331fc3be7346b5b +R = 12853f9d695b8ac4431c1ccc8498f3fc4916eb6a5e66b3795a3693f3f5a29ad13e58dcdaca5774f1f295e2d2d3c63c69abbcd9f388a3383371028fdcc8bd77f7554d6aa3f0431e8 +S = 0d1c324afdf01ea19e9453d2b7397584d773716d6a08b6e38f9a9fb104122ecfcc9de7bf1e5a6cfd52a08b7cecb002ebc21798d474f035fe7d4554bf632f237bce14aad88b47d4d + +Msg = 0e3f4afc3e7b25c1bf2d98098a5a87db1224d9bb45adc6e434732b8722a708ab80a1f3f6ef3c5aa70d2e1dad3e4416b12cc59171f05736c4b58bd084602c344f2f0bf3cfdcfe04c64e87597a99de23ded64b33607f7c273ec321f6462518715b11e91361e89ce5415bfc2ef520bfec378244a3bd2a4b9b6b3d68815f2f75baf6 +d = 0e298c93351323e2c5304015a4878997ae4e79d1c32f1dc64262e534d4f2c4b3e222356ffce746763373fdfb936fd330d3214a18c07f1205b20c9a941331cd676040ba1fe3dbce7 +Qx = 6ee4952a83477d89ea05ae63d5169cb0f7c7ff22f15728c6d69dfb30d1f28158e2667f9342cfd9b32f2fd537dad47c190d82f72c03043f2a9c5d97cd09d07ed4c35b96104042554 +Qy = 26d5935dcebc0ed5a07b7ffa50de3c8aac309dddb61b8c560230379696d81d72bda3c819c46387e7f026b384bb0f7b2ca90c402bb67b5e37d343cc21a8d1a0f822dbb2766030d73 +k = 12d23969d230e0e2712f96b11e196202dd3e6ac755c824f92b9c765e3fc808d4e7236c8a3c06ca2c8272c7ac953fdb936db30d892246cbdcb7f98c43177e1c30afcc162af511364 +R = 022f6dff5bc1eac1ef568588e2e512103cf56ebcb610e124a125fb004064a28291c19e83ea08171bd1b14ac729392c7c46354e795d63e3bb087fd100642465efd817b79924408a1 +S = 1785e1fd773446e3b90b8704cc2723b8da2f99d1d699e817c3c4622015d178b0cebc19b3a6dd972f75eb3828a386973c0a5e67ca192d69f1a84c825d1253f1062a990c3f1a947c7 + +Msg = 8fe32671f6927272fd3cd8dd4e34d44d27fac8c88b41bf9a48039e914990bf06d1633b38b9200ce1c2a275b9c55498e5da2d0707322c3ea0a0fd7aff598fb801628264e13047c8008153e8595a0dc95d54e70b882ac2ac9314d2b78e7b93922da818d7075215e354708994af66958954c92c074d132dbb2488e5a531c755a8e2 +d = 104f4ad56594c5cec2a988c5596d73adaa5a81802b40110dbae698ddb1f0b271fd1479c38abcdb9b234e69cd0da8a0328d2135c287d5b130a09fa0b899058e7800eb2dfcee95c1a +Qx = 4e8151aaf2aa6a6159622baad134be41c404982bb0101e820eac8f0a52166546c53927d9b419604e9b025757eaffac526d4fbebde5fba0841c6812dff2e9bab5054d4074a125ffa +Qy = 4413639ad72d6eba870e1760c71966544f3f881f88880fdef1edeff47cf6c235e8dfef1eb1d8df51f9c48b985912f1f70b61fd3d4b859e052887560872fe6e95db0f435778d5c4c +k = 0cccd1bf3424d8bb0513fda3db93e81bd34175d84aefafd26b37eda9e767618247bdc94ed2b1882bcae4c83eafc30a7a4a80806fda10a5e70b8827287eed8eac2721939a63c2175 +R = 05b1460e856548287683dfbb93efc869e80333a9ddcf292e2fa3b3c8d430563a01340685c6db1059aaa8b298c8db9e8281f36e3a9664faa17f413cb439ef24cbdc1a4d58872ff6b +S = 0c6faac191c95738f7c6ad0eceb035e5d22ae85e4bd0e27f2e65ab293717c0491be3d1b5ace80f4cb4bac7e33258706010c2aa48d84c9e39c95e30805fa7669c42bad84386f7754 + +Msg = a8fa01136a0a78313a5d160c32fe5d1805eeb3730c18ca0c47818e82c48eb4c9e5b2dfe3ee5facef9ec59b68f4e6f3213f77fba9f8ba06dcde546ae348d343233883894f4423331b536f62373a495852977a51cb192cfbec04b5582b4ece69f345979e234de32da7a120138a057a7119735c4cb19099bf48bb202e7ffac04def +d = 0c4989bf33b3136bcb4ba67906eaff2bcbc6567635aa4b057acb7353ee87ba3cb4cb9838f8f679729d5c6ed98e6c4199cf58605f009c6873a1b8321f83cd3c0973b7a3cfd9dbaa5 +Qx = 3871c7781f2b4f653f0d49a224576bd1e5363d5171bd21da89f590f49fc212d8a57ac8a140d923c2949ca287bea803afd763f15f909c099a07297e8ba1b37c70e1e8f0fd1fe9d1c +Qy = 5806bd5b4858ba0814da2167d232d55bb5c41ea0a36fb28a0a151c1b79b22cb16613ccd9dbf92174e42578ef88f4da6eb44918acf427fb7e4022da3376243e75410ba6ae012ddfe +k = 0a9eb767077886c48bc54503a0d2d62f0192d3581bd9ec253107092c22f68a15293d7c3e7aff56282f0cd35e86a2b3c55c9eec079201d99b5f49946780ce6aa18b225c2dfd72cf8 +R = 03eec6ffb390ecb2af4f5ca17fa8a7fd6938667b319f0f61e5c7523efb77afccddddb5114ca8c461b1c28dfe7eb85ab156e24e891cc6f9511d703e8b3c8443d04fd8de80f5d65f9 +S = 10cf3156cf71dafea6a0d6abbd503d72b13e6a684076ac900f390059cf3fc325966b3548b58e14a82bf291d9689783b899db7d4baba524b0b63d31f9900a84fbabc2ccad95742f3 + +Msg = ba2d83b21c783d6ef2f3b7b10e910a418a9b9f49ae0fd37990335b3a3d15627846c9a12a1f31a3d0e062ad1bec5650606ed4dd06c30e50c1e8761a29f4ea1a20f74635d5dac22e5b787ac10f4ee82b338a641484f91771c128c84d31cdab0a6b9616078c898665655ee9dd4ae73d33b94bf091b064928b959623aa71ff73b4db +d = 1a96f2ad56e31397e236cafc108087479c9823589a5fbc3dc7488d0e5d1199cf245d7f21f524cc0e8b47feca14c93fb760e631434a91188b32965053942f3bd39b3714f9d6f1a11 +Qx = 0195bfb66e20ae295cd22d59b27b3880a890fc44ef5c720b568bf7f72266293841dcf0572063a96c62736d9d4a9cce31b10c03016305a409858a79070477d3e989481ec555c8146 +Qy = 491122a199176e2492e07fae4ddbf02d2a40a21bbd99b8f742b546db2018cac27fb4b1c03cff55f61b7caf13b0f3b097ffc8e1549eacab89225e0cf1e96b268eab7f9a1a69258f1 +k = 097e28225aee5bc9a970a150502dd14bee900d3b040b0da9cb52f5824e66af46a991bbf6423fe1e089cba47593af555b07b45e47b0f4141b0412ddf6e91153213c5b8645ae7bab2 +R = 1439928b55917e93d59341532cd1f9d09de1f6e0d9a04514bd4b692603f2cfb75a579301b39b8cd92fbfc8832839691c23e0ad3efd3b4c7c3e9a366c1554c6dd13c50dd087b3055 +S = 1fb432e72be6fc524a7106b21d03fa71852c18c67edcb8b265db3b144214e7e6d10caad91f81616e03ae7913fea1e8d11e90d54b17705e8d04c8c20f0f4f46f117cc423ca178ff5 + +Msg = ea2d5f4e9797bfc2f33f0fccaf530db2bdf8abcec00f09a0338eefdba318221ec0e050cad1a85c3f76b784c6e8c18da2b062f333eeff18b7b781e67d6d0a4368b8231a892e0f4103012348e5df53ac745e4d34e2cd1ee9369f97d4801ff485fc144b2007008036bbc07cb1c302a00054b54f3713919191e1d5052978c9c2895e +d = 0c08ed8e0e0f8b0d0714b46a2164b933f8147692f18da97e5a108c44d5a5cf221cb50536e41832b83bff4026c6df156386235cf5e3e9a67b7cf9b2fa7707c5e0ff33a91601b8e34 +Qx = 2d516bdd1914c83aec1cb242710ed79efa61cbb31dcf8d238d8f5e089158b2ee2bab407e01996a1621b1a869a98227c12296cc2a71c1ef2d0f26bd6614f2ac77008048abeedafcf +Qy = 151474bef5965c455eb95ca2ffe1d589107dc251d22635f4a9fc7270358b64e4d2b81666b60c4a5c49902b0fa9963197b22f90a09cab97007842816f64fc49e351710db84980032 +k = 01125bde6086753b3bcf29b7d5a4fb0a8abffa6503b4f0b39960eba226062bdade57e4d73e8c1621792626203e83fd5c231a53b0ce10890881460802788d481f233466060f73359 +R = 199a1e40229786b966592ae6e275874ace23d5605d0c3371a4f9eca7ce4858927958bc1c2780e9f2f79767c1c72117c79c408f972006841cb621837ac002cc6510e0432d99a1f64 +S = 17f4e5e23e494ef149e4abce2d8a1ab10e3e6c2cc93998fc63baed6565ed350b220b282855e2824f398ae76b8679201b43450f62237f6fec643ea659e6c86abc24a63d82d9bf219 + +Msg = b2293b0a09f41decd9d8e637b1b08c2efe612f33c9c0beebb6e05033c6103b958f8aacd125d7c810b4c287349f5f922d2c6ed554be597fb8b3ba0e5a8c385ed8ae70d5ae19685298f20e8d844fb5ad98db12ba7e5f45baed9045c3e86b3cac9bd55b614b82fd075954fc59bfc6124cbd68edae988596575f379d8921b594c75d +d = 144090a0ee38cfa21fabcc24d35139a99656911ad4f6dbffb77dbe74e7993edfa9fd63d2c4f6bbdbc8ec21ba13c9f4a3576b5d6e3abeab5af5ac81b1f2bb6d4c42dde645d854d9c +Qx = 208729b3c7abadfc221cfad8be642588d5d1c20989fea731cfccef25886905e4b1e61cf9548d89c24f5706f5243dc8aa7d5b2675c2c6d2755ce6a12e5b12c28a2cd9c597b7dacb3 +Qy = 3db73ee445ffc0f6c77467f3add3b1e97061117e221687f5589a030f5248bb959bc2ed98c9fb66da8679dea3949b77652dcf83ab9c50a00f6a9c22bd8d16e093b2deca4b0c7596a +k = 0adcadb26626eb9f8db9ae98c6808840b65d6f886a3f0c45f0b993a8bc62bb5c08dcd87940dfef4f220f5e50234fba3a55e7127fcbb967ff78ce4fd6938a9bb653747116541cb85 +R = 18f7fb6ee028c3dd754d6e7b687560fa269b5a5fabb1d98529e0a27dc66bdb1ed79b7b5c64fb71e767d9497b9255f26b8150b9903caedb25f51594f5b7ec2870515f701bd68faf5 +S = 09ca9519388402d5d96dd9ef2d4ebfd0ebcfa58bf8c1970d04851b2409671c9d5e4aa833555df374469a4d277aab93b8df8d553399908c930f81c2d9769f1b30a13f61c02b16852 + +Msg = acce54270252e7d9e983c08c993cd6b7e3caf482a9149036afe4665bd3d0662a6818047187872862d5718b8ac063477f693caf1a9baa8bdf2f36d411a796f2b46ab56f66bc94924229f8264016d6769c85d9bbb7d6bb042fefdb8fde1be026b86af2017aacfe38c97309b4689b23fff94f1de880064f1d3ad9d74dc804c41f41 +d = 1df26b672b2e3617b6b6c631d3c6be0cb49c0a690de49643e0f416215bcdaefc03fa9c708471f1d87476d58c8f147517ec8a14aa945ef001fa01984d5c3d81f7083ea500558fef4 +Qx = 767ca8fe8f3a7addf01b230b99499b33c83db95db05e1956fb1891fed60406865291d79b0daca0c307a3ec8b1bf2ac2cbab728c6ec65c013e01775ee21a29305e9403f72883a138 +Qy = 0acfb786b09e5185dbd8abf831d12967107dc57a040d7c800d904b530eed1e19a8e52e653fe8bb824cc424d7254532d0fee62e8ee7ce8e871cbf6e4ca3bc040444585b9a4e397cc +k = 13e5e47048122c8301258c638bc0f00f8f9646cba927335535f68f4f4f51f23ac5398ecc21eb0bfe8fa6a2084e11fe67587bfa791cfbe2527797a4d98046f9df37662cb7e86a5a7 +R = 164b3500ad14063101b6c5ebabba53dc5acb4d6771d3b05a505e6a67727ca8ff73d996e1329c0f6d8f738237ee0f0be415003e2db515ef93931e09bdd853b9497826929eac9e9a8 +S = 06b65511990c061a6d2a97fe2a5053c775ce2bc5471865abb7261d0436a04b79baf41a0a852a57600cd4c6a114b3a8466f721a684aac2592640bc149980545daa271fa9b146f2fd + +Msg = e25274ded4840df0d71d3369007118f002b83e2d375c78f7e29ade067db15cce21842611f3f015db2efec57da77cb9d16eb1e00a8c1444d48dfda569e29fca1ebf40a22fc646a9fd44460f0e473bde487634bfbdac2c312f66a1c2982c6fe76c54ac72b6c8cc9345e47cb319a974b3cc4bb40634df74b4ad7e18adfa9a71ddd5 +d = 189918b832e9fa30161fdd927bfc267f6405335df3d66d225e17173af52a671138883bcb94c4403ca3e001fcf09ef4c6488934d6775af2b1da30a8f331579af2d0fbb530298d8f9 +Qx = 53e6b43c0551f32b7b34467d188985600c5c0ed12448f2e763609f40039f92002bc8e70d8dd3e337c3507fc996a1557d5f2fb3132507e49ce653482cdc86f6ca5903b77fa1619d9 +Qy = 4a9ac78a2c23be0841b96cdb1d55862e4854b530f1fa3f469ba9f7185e3f91c28d03c27d9666345bdbc7a44764595b303f49cc43bc2d0e944862913d280273cfd00e15b6b55f85b +k = 0b47a185140b583c330c64a10d50748e019134bacf153cb4a23753f140a4d607d5771a8f0f535f9c35baae5ab6c37a55f38acd12f15be18d5bd9662383b30e4d0ce487e8cb553e9 +R = 1a2ae62cc9560590177aa544945377ff6ab1b34e7e32a25140f99996c130e170015636647756a5e8522c936eb1389c206ac74c012941269165f3772373047521f69510c7f3e6acf +S = 1d86f4a6ab2bba7f6305c2df754652bad40d7c273ba2aadfbbe65c07ede4ac0e65fc0a37a0139a6ecab296f58c6c2532701bb008bd9e1ecac2771d9384aca094537fcab47f3ef06 + +Msg = d8a4aed87c316012482819b03a1d91691f2ad11a2f46082497ea8f64880d686891f7da550b2ac17199c657d4eb9d04d5cb8eaa180f743b87d23b1c86103f9e9bb60f4e19f0ff9d160f180aed7735130c03adb62502e69be5c624ed7bda2301f30580ae0921b02e103a638f5623c02c186e3bfe6ff134c762a2bcac1f879a9353 +d = 0bdcc175eca3a399b944eb0334ff33c4fd130999c8ac0e7b52ac5b774fbad53ccc3a31024f5262b2eecfeb2104b14bb244307effe3dbe8ed25686dbf46a42c4b6f8e34010ad826a +Qx = 7ab1a9279a8408828c2bd21ae6c643ad82633d636d36fd91498cfee49c8a635313f56993d02cc46da3f5b78fd243516cd23c14a4c8d79cf27dfcb05f52f0cee59cad5646a9389b8 +Qy = 799beb1ada93a48819ab70b74c36d2dcc3c5cca1f7a57ec58e643924c3ceb7a90c9cd9bf7ec762a2c428d16ef431a45cd5d069cd828601f903cb0a28182af2392b5ad12ac3a24c6 +k = 04ad8d2759df82dd70ebe9f3402d3d533a1b4635dfd0024deeee52b32373550f550b9fd4126aaa6c3a9b1f352c40c86e13f78e259abb17f85f0041e0cca9e2ae59f4ee3ba2fbc83 +R = 1cf9ce41dd5dbc3bee9f46f82e4bef10cefe79a87e8e00d002097045b9acd46364560e0fd27b0be6655e73b5cff272c8764b4c80ce0e1c91a94b8d05209a28b553f589ee2fa1b11 +S = 149fe587b144c37df2c48c2b7749c509421cfebab734003e51383cfb773c3ef5a24fbac0255cb807f5b95607121c5848d3f9656227b61d5a14042351de084d9b88745be242b6158 + +Msg = acbaa5ffc4eee0850075c0e502a70cc7a897a919f5e7bca4e798385601a26f411fdae5466ba9f6b6d8d7f819a749b799fbf4a3bda9105063e74914e8583ed8b31ea4d22164bee6f14bf53afca269b901c80cb3265be32ffd4ca4bc4ddb83e11eff82ead6d75dc4aec8e5c67f35d58a8a156cd1c0351abdccc0c5396c8fbe6920 +d = 007ab5a55a1d8ecb7f5dca2afdf9ef465569a4b0374716f604ad42a6e0271e934b09655e8e2529784b69b2894bb399b02aeeae30e9e7ae70a2a8e56b9e775bd978a04c728e3951e +Qx = 2df88e368c8162c1dcea5ceee3a4c52cfc8d6121eb81c31236ba26dfd1874c61586d2daacd96cb5ebc7053be57641bf53bf2651cfacf370cf470db86e1470bf285c7166c197e094 +Qy = 30067763f9fa6a9082ea16dcbf53c2b6f11c9ba1817198e5a4e189dd98141ab682ba4de0b3f873ae54efc080a2a03f755efeba3c0ade8ea67228b1a5a11d730302f1eb7c6bc3737 +k = 0d3dd75ec61e0f87737812fe1ac86ba336b1512bb9f7ceac2c7d1a5b4d5dbafca57a5209028cef9468ebdacb2a35988531baa094a1c901d9650f2c5d8e03a1621fb33ea85e2b506 +R = 184a98dec91b9afe52d4dd6b2d9f2d7e3c42e8e614332080aafd2621136ac7965beb4e8f97b222c1b2e5448b79534db4e710331a2f877f8fc2a9259129f0b24d24289495da22542 +S = 0fa384a04c4b0b0745abea373aabc09404a6037f302e234e7a2840ff39c2b86ae37c814e8bf3f3f7cf743748f2b88d02d66a3adef2028de94013c07075fb73f00555aa900337149 + +Msg = 9a57b63a4f418404e8f5dcf3052b9bc04a4f6d2c33bde8651506d9cbc5542ffb9023292dea463111fb78913ccdcd182faabbff9164219b8900c7f9fb394f7d9678f77b18f8d58526ec64d7c1328953b983a7c416583e05a069cd76aefe26e5f5687b70abfbf9f58f052dc0863b4fc3bef805cc3bb05bf76a83235af9d6adfe66 +d = 1e7d4da72b1d82e17a066fe387f2a0a7fa4c60ab993ee09710531789186077f2f32b42ddda497d5fb57356383e1f96973df043307f0b6519430c3f0d40d62954032872fceb7dce9 +Qx = 37c59e95132f0027f661511d1bedc3018bffa62aad7f44d7370f5b169d683882fca3dd0c4260fa8f72a47a44fb0fdcf0d7776ff0632378022bdd223753c66f98dc04904344ac741 +Qy = 2d7f19468b8e4f32eeeaabd6e402a35f38dbb9f2476cf07881d8bcff170b0a6e1ff8cb1bfdcaff734a32ae9bf34a909ae7fee689e3f1ae777812a45dd46ce13fe648016353c6bb7 +k = 18ad70fb9c5673e5a39b3a1655ff76eb84519555a6cd88e86a26f9448a54f04516c2449bab3f75e74a8d15c69926ac43fe01ebbe7e1c97e73870e3cc4c0ca431cf614f35659e3eb +R = 12abdbfb2eb08e326289fdf5615057d912749db4f17848c1ac73bf6a51fbe3e1b2732d4eb656715a6c459c6c3065b67b577f21b8eaca7d657c3b3171e8a4849f55024c69487e50d +S = 09609da5049092e0aa8ebcf10c204de54c968b09b9bfb3eff90b80bc675d557967b35f52e459f37fd198a83a858e5d7f9f5aff8b2ef7272b236dba5857e88515ed471a60bf6da49 + +[K-571,SHA-512] + +Msg = 97b79c76d9c637f51294369e0bb52c4189f2fd3bd0607f91834aa71b3555605a89ff68e84fb5bda603f502f620e14e8b0c7affefafa2f0b303009ee99653ae4550a05315e551dd12a4d8328279b8150d030b03c5650ed4f8d3ba7c3a5361f472f436b200b321e7863c771e20ddd7bdf739c51de3676f953a5501e4477aed1bd8 +d = 15b7271d4319db5743119c8103a7d4c6d57e9c62f3eb93762156d2ebd159980aa57cea948e416717d715a2e458851f1b2e9ad4172bbcc53861db29c3ee0ba8e82617a5866170847 +Qx = 03a5b9559b2058299161770166766aa65e151ac6a22a90205afd27de5eb99c5b1db369ad52f09141d3bf08884b96414c283b2669ec2a2a60c960a2f03d425dc4c229c0bb369d90f +Qy = 024f3a9cf3dd257043dceefe6617a98e222e1cc820f3e19e63c64fdcf7ce8d9c7af7323c9aaaef4df02e498597581082fa3767c8a38f508f4ca2c1eed6f298dc8142668a0027490 +k = 0c585e425ae4a34f9b7b9205f095ea07599716f1eab1a8bbd934219ad760c4606ebbeb06cbfd3952e045a040b8ce20603aea4f965d1b6e87eac7a61672823fb2de7767e3466c730 +R = 129162cce6fb05e1fc8630ec6c3a16d108bcd251719d89631497177e6fe6d1373f114ad9dde6e04a4ee0b4747f91c78703012e5a058c132d54f2ccccfc0f9326b27d60322b497e4 +S = 140163edb5f3c4b49228e4614bfc6da9f73674eab82678ad9947b2a635f733dbce99ce3209f613e2a75e62ed84db4d7d13de6d789b7cfedc0cb6a028d8316db8831db66c91791c5 + +Msg = 564ad0e37c9c37a60872a4780a723d08d1159ddc77bd834d74c1025cdf3cbd5338c3fc07a904fcad9b979b2a2ceb1a0139af35e5112305fd662a57af6312624b9bdd3a64849f95f59a46ca8feb2ed56f87f258518947474c1729275c4d89b7dd286ed65f286cbac76002cc63b92a73ab6bd13c4adef282f32297e441bdd8fd36 +d = 07219ea7917d174a5386df985d0dca798ac9f8e215ab2f0003aee929a2dbd91e37fedead0ed95b1e8aabcf516bdf54337b4aff7ace4c6b3179f2e919a49db50a41c9d4d58d4f636 +Qx = 2fd7f6ea770e0a6f1eeb3318b6b609c0e76ffeaa34e75f56910e8f658b70940cd7a5918328473b279f882816955b2e3702c22e0b3e03863f8d99c64f3a2c9d1c68f59a28eaf25ad +Qy = 6c2cca84218aa019326cadae9639069dd27df4d1e95a4c8e7d7cb426e70e2d38650b382e325dc3835afa719145d16a29e4ff67de37ac8949641f0d140072f59718450a669973206 +k = 03413376b32f18385cced4549e231e514eadfe05fffa0b252732f5c88d13d9c6e0c35be3dbf72029be5e4573b8f8829f6efbf58a12b5c161bb7055d1944eecc93f82c12c5c56d9e +R = 1c45c25f3e8eef9b92142f12e4119842122ed7672fdd82c14b3c34ade3243a4c50495c06b5984d0260376c4fa44c60b2e34b0084066d693943071bb663a44884927352668efcc62 +S = 08cdac0f4498173bf4e59de98ac9a26fc2c752cfea7a5b75141d4e1d019e25d70a717ac3ebb82884436ebe1007b0488c4ff29fa31fdf02f77fd99535c99b69c9d4e5f432516da77 + +Msg = 072ed5b14754fddaf54e20da42432df49bef38f4a3b1841b2db457ff86c44880727aca945770adb41269df41fc17f6a687bcaffaa45a3e59070526ed53b8dc3b78cf9a80a85461eaf4b477e44d5ec4c2bab9c05aa747a5a520b35fd09e8b44539d060ba1c3470267e0dda111b15dbb587614a46e1e477127f963a16cf3a43ee5 +d = 0bc623152253da24bf8d752bd78aedf7d5f6a2f889453ccdec14e10753335ea8bea83fd181a1f3680ed50f2324fbeaadae160cc85831750e021f3e44121ea1b1efc29a7d0069479 +Qx = 003f3a6cc6964ab2f6da95c0a2a7b75afe4f77faff16fa28aa67809afd9495cde1f5dce079ec4e15ec8c1a2095a12e8adc409fe8729d865f50ff31ee75d7d807afd2c15cb142be9 +Qy = 76b15c1ce931ba06dd56dd8e4f544425fba4f37f951a188c8e7eb13a2850c93b8ce60f10b3783647a2d053e2764a957656a184a385e95c2013685d4954a2b2aa20e4a15dbc43b78 +k = 1e091f4febd694879f78e83842572280daa48db65c463e66d9a7ea57b82fda531f116800530a03cef2cf7e5be5eeb6e420213ff757c27b8e8a94513e417f4acc62adc02a76a4fdd +R = 0264c499f7daa6ccaaf191d3502e86458ef088c9bf2ad989851c221364b24a1a3f4404fbd0eb44a41938ac6ab67002faba0bdde7f44ffe6bc10def8317c4e2807c3ca711cb6cd33 +S = 1b91c18fc55635c5e3cff70503e7a49572ba52b11bac193230c88d6eb65eff6b2d9a01f53ab0eb34f5e208538136811157f872a8255b4d249b6ffe021b0c0763cde4d7a7e72b0b3 + +Msg = e660dbdf3e61af39b83b95d3f1970f66d616f03273f7dddb98f768452b21cd39604a31cf80590d4a5e4b0d4917519e10fd325dd4ab7a52d70d154506329baefe0d5816f514ae109483122b4fa8fa1ebd7fdf1fc4e21e8d278a50c05d81c8f489596633d949c6c8fea96fe91430c01522a5afbd5042be8aa47da04581b2bd21cc +d = 0645947d981d258f2954558c31022a3b6ba5fa7b675312f794cb61bfff1d9ce87267e4a1dacb7c8fc58624d31c85ebe22f80d26a620fed5df5bf38515e0903f0b69a606048197d8 +Qx = 2d03e05c4b555943fd69a299249e7148e99633b286da69bbcda64e7b06ce9321d62bead7b8d095a68d9a3ab9e9cf1aeb1d8c4904a073c21806830451a79fe7a907b32df15ea4567 +Qy = 23cba4f6f1815cbe1934734a901206596c6f482011f6cb6d452329f9412d2ef4566429e7d35f2d247eaa7849ee141bb16914b64920fffe6b7923cfb19759fed6e1f80d6c40a0ae5 +k = 18955bb752f0af7d7aaccd0628dcf1f52d836fb91dc78b0fecf21ff5992d9c1f891f0eb3c139803b88736ce10ba4733a523854c4ae9ac35421beff9b20e0c8daf90bece46737579 +R = 110a428aa96277c9a13d4529f58ecc57cd7209a7340b4a78694dd9ec800f36c9c306221fa110e0b3fd65b9dcb67307b7d7678997a3143c04ba96d72be83a1cd6b01ef22acd0f82c +S = 0b7ae2da5cd36006a92a5b2e6369afc2728a93edc845ccb1500e551be361f8658819f7d3eb82ad41d7f2beea1a1cab6f103238a6025acbf03a2b08339841694022c17db8c6c6886 + +Msg = 8c9acbdc431565feae60e08bc7da113e12372ed373f1e1fdd581f98c8a7b0c79ac4aa42c7ffbc963fb4970fe26c5b5dd314b7051fe971c1186ebcb5650f7f7011a924de893f06961b8c75da7bff331847feead4abd2e8b9d6ecbedac18f4eac207b948e6e4215e4d5cb483e5c66ce7ad788cb89604d3a3e051539094079e7bdb +d = 14cf93ca69d94ee8fbea0c8da9d76aea092b73073d8f5385b65c6dd4d567fe86bc2cfb8e8be890c3c6cd9abf7dc3a17eaecee3d7a9455887863e496c48dc3e47821bd3d825b6bed +Qx = 3dfd1fac02ac4bd3e3017a3d94f29575238937824f80ba0b2eec185ce8c641e9fc72194323c779dde8c4fd6e748e09d66e82c82add75106a0e1739f2b977d40ecd3cb15a1eca420 +Qy = 6a73dd31226adba7ed8d08476b5af10a806fe8de72251400a83f6c9f6edf5e0cd6bd1fa8f3595c3ab32b4c4548729c455e4eaf83230e1335cf181cfea6b6bfa6cd4ad75ac3278cf +k = 176972d9402d5d6c9753532e5ea907f256a872c100f87bd390c4d610bc00c408a97bd55dff2de1ef2fa8b9716e33a5a39bb6ed2ab541848685040656ad0468b360f42c3742c1fd0 +R = 00be28427524a3b0979cd82fea407463647a77ac45c489744a9998b545a13516abb9213ab0d89a2f5f872d927ad48dfa502de95524f94f34b174933f3faa7b554a1c2c3a688a0ed +S = 1d49594454516c1876f23f2ba0b1fa4dd8bee028bed5524b7635a2df5b8459f4832b3db5f6074cf07c169cbfd9099a85ec2f5c42043c5b851c81a71c87affba34b11eda67e0ab69 + +Msg = 53ef87d6ac7b9698f40b3ea9f3442e7b64207b140b7f66f73fb7d5f8f98452d30a4e493b6c0e3268371e88e612b818d4d847f032ed4983817d020411a52d81fd2a17b58ebdec199d817c2a8ba77042bbd747a6fd4bcc7e844ea829fd8461b389aa0b5957d92962b6d4e86385a8fbca90b8fac40944607117e9a4ef6dccb8fc1e +d = 033feeaaaa28f16bfaf5ea9c7319cf4561ba4fc55327a8477b6cd58ef6ccad3962ee1f3edb243f3a04e7e49c8e23509fa2d63252adb186b8bc7e9255cd61fa9bc45242d42da3a68 +Qx = 6fc62c39bdd41ef7083ae10dad59e38dad217c55864a55a6a80bffe2f5e7da977d79db9ed8c9ac22d6f096129a0c680ac93fd77da4ad96e292a19b48454f91c93a3132559fecf07 +Qy = 66f1f737ad3af3df674637aa5efbb844bbc441966bae73973481628e5c2c67cb74553a7c8f2c5fc478edd8265bd6c99d6ce122a245e46fbfc21992b950f04cbda5eb220261316c5 +k = 0a5b86b76f98310a25111cc3d1b0b70fd0c20208cd0bfd8007cb569a187c3a97edd8e716aac938900c3ad8ed3a0d091a18555ab532b50f25184454d84af2beafadf754862b8ec74 +R = 0de2eade32f537727eeb82dce610b48106b277d15d8fbdb77cd312ab9983ab21bed05f05186a5cb2b530ba72c8c68b768c26d942f9224c6e6b9e7827c48e129833cb679c70aeb29 +S = 15e4fb92190bbf8dcf7548057d1bd5e5ec54a6edf54f6b88f50e96ac87ed7a7b7c0fe1e1174ba3e822fb7e7c083948296cdcdcfbdc4bde036a07f84d210001ded91c554ace71efe + +Msg = dca1b7a9a313ead11c2d54739d9017ae27f9d08b3544e418aee862bb57e427636cb6aedda28e10f12aa15d2355f4f8ef112a86fec5dc46e6acef693cb8fc37c3e4885f3be3d3ab31ea4d73a0de904e95c7135a149f77b621d642f9bd8ba192d39cfc58b6f19a797c4f3b4f3a87054298e3ce5eda0ff7f44f8134c9a108285dfa +d = 05613dfb53149bf5fdc4e08ccc1c752b0b66ab43aef2d008ed40f3df40fcbb2938d2c41e3ea2dd4428aeba9059a97efe5593119673866a19d27a2ee37dd357e22b6bc849e7e22cc +Qx = 7ef12ccf6b64c7ca64b5da45937281ec770ede572b9a8eb685f3614bc358ce550195e74666af9bb54379c1fe1304b76430d1e51a9976bba02e5781154c9bc187a31201ad99cb48e +Qy = 43d4ca20f06b26d75be1454e96f0568bd740165a2bc6e5b8429d557a79666bb7b9cfa597d392cc5b8ecd180c37f9fe2088d7908e59ff644ab05568d974ab42ec9e01676e1b24169 +k = 10b4b67007af35942216e9aab1d6561bf7684f334a80c7d909a6154cfde8ef06a148af104d534d7dda59b5cec7949de4086ae669edcc4d68b88347d2445edd3037525c97564ce78 +R = 15bfb47a27c6970fbb3256410d5c2f6c04eb308569a966790636899fdb3122f9e3015455c4b50a6bd8cf519afc22ea845794f51e6994214feacf48322af48590d02cc9812960917 +S = 090c61f6c64381845491dac81d5273d58c59d9cfeed214527a52c8f23b0146431692a25cbfd77abba22d4bc61ef24093c593c827ef645853bc8deef7c3b07bae919152b90c17f4d + +Msg = aff61d62c8f5c31bbb7d0a64a6ac589e918bbf2f13e7ad13abb9ac26405e267249a7c9922139bc28140833e10976b87e91cf28285274b2b48b63d24ac94c85c70fafa78f8ad05955c0ce6c02b841ee196dab12306e3e3d6138371217e2b474f7e67a80bbb78a47e374ffe2c9f86292e471c551da50d46e7b5c8331029f369767 +d = 11b92c8b72b86c51903387a65aa206988d443d1988253329ad3a89c902ff1ef8cf73b7f2e4aaa352443bcb833712d94c3e637ec12cbe4c2d4606878576b17fae1512fc77785b737 +Qx = 22440b63bb4557996b63faf19d9f391c5085cdc2cda3755622a6cedc676222ceb5a56ec36e220e507973c0f07e4b2e2d565a69967804ad311f0658a9854b1eddfb5270f4a86b769 +Qy = 50199c9e443555123f153249cf7256dc3e82c5d8cb611adca0cd4fbb0a9a90296bfa770c1b0c0b43e4363b0227273a9ec9f00ecf83afc605b0dd2e5e24f739dd0b4ef6bb11950a0 +k = 0e5ebd85f5fd9a9a81067fdf51b1906023e68672d160ddcedeb35787688dcdc314359ff5347907b685a718ce38a69be17de292eaef189fb9ee8c63271bd6818904cd246503dd227 +R = 051387b0d057985dce86cb962bbca7d9a047f70d96c20539ae7d6b7cb8bffff606f03b8315f15a53049c6c1c227f86d395c2217d32aec32bbd406c790a6cd2706775ed8a0ba1ebe +S = 0c7f3b7e4a8b65a58c1280110f6c2486cd2d2df7d48b49074e98accdfca4a72fa7d43bc25c6576279f4a70f22c98135ba79158bcc3452940963b556304da8e1ae88973d827bee32 + +Msg = 721017294f17ef351e41256b57a64a79f3636628c4bcbe676ac9a2d96076b913dc4b246c9945183ec9bd2d251441b5101eac44e2fa1bef59dec03ccd7fa5accf3b7d094d68dcf78c8de4e2f19f56bf0dcb3b66b9421ec3f8b353b9fd74feb2e9affe0bf9aa421b6f03eeba3ffd58fba56b3ebd094880e50de01ee62a108a24cf +d = 0c3c90d5ce4375a08b85575faa78ee6bbd9e5571ce5a90582042617b807339c282cdc3b003d82006264b1c08c20af4ad4549fbde53d262facb98d923d81b8eb6093374b6a1e84cb +Qx = 1d900b4f64c07cb959049f2bfa18012f9bc2dccec5a73e9a48a9d5d65499e31ec4a1615c4c50177c032d388263eba1a90e07ea68f081e10272e88a41389bd2626961b646c76ed8e +Qy = 5c094fedfb5b118accd64d5d46ca2ed92b3123a62042a556ffee9e3bf709092fff88231a26917d368db51d1959ad3285c7faac16ca57677651b070aa0abad96f07d35c5fb8a0ee0 +k = 14d4070307cd269cc1a3c048ec0847edbff46f64c1ba5b734d8a800e50a0a02af57cf24750d292e2c247ef1b860a9d7b5069a32f5b0546fe9e019e04af62316eb79507281fbef6d +R = 1cda7f743c47ae93a9fa533145feab4c46252afabe3d54990663b5891b4979c645ccaa05c744420ed6fa235952f370f5aa187250d7b069aea1123f19f0f18da18fde98100ff6ff0 +S = 180b4163f2eba6e3769d8345dd8cb003ea120164442efa885eda5bacd75f8d705b7f1bae2976f67cdfe984430e36f93455ee7528fa6febfe92e42a002da165c63dba8fc589e7851 + +Msg = e2d1f33681759adb7954bb5248b0db3c3885fea0d4c1c0c226eb1e6d2d3ef1b9ac281a0f1c2fe5175b67114b6a501e2426d1454bd5790dcbc4c232cf06b017de8a9bb39e6033f1edb5003e8de3b44cc3d6150c3c952afb442952483cc688908337b7c1a8b5c9da70937ccfa98b2b0098c530ff848010b8e8ee0a8d65283481a8 +d = 10f184c16228d9034271332178ed485d10b6aa76003efc160d63fea26fbbdf5552205ac7df0d8c852a1210cf0ba512f20b798827b36ad56b12a826fa7dc1db45aed264ca6822659 +Qx = 2637543ed8a11271bbbabb2cf72999f65df0104758c2fd6fbf3e1c5132ff1c1111fa5504ee86bed8f219d5025f8ae07055a7849314d2d439408ea2b2ddc40320c57f5d41255d0a6 +Qy = 14e360137ae33ce6930b844d42bcda4050b25f349e9e19fc4fe82f5e4f73cf9bb50212ea875a5735faaa1d5494f1685d6c8177448dbf356b408ffc2ba0726c9befb9de9f0cebe32 +k = 1146574a96394c82972eed1ab7ec98bd08f27653c565f0626fecb431ee4fc6f830554df35fa62b5f82eaad49524d3d4b0598cc7a2181ce9860e271812373d21be9536fc181c3f12 +R = 0dbf465de2c5242fb527f6e4a4188adb96a2030ed8417cd9431365173f569bfdd3e420f86947da10a703370d7f38dc43e2249a2476690829545992645c9c83d82af8adae893780d +S = 1499782e0163f80de68e3a580ed08fdec8d6552ec69f186a74be89480be28a0df6acdf7c65a72f115f8a59fbc28bb94af64cb3bb3cab20bd25265237a010370d9a5c781c1e26f3c + +Msg = 414fc5d2bd56b30040e105cb891788792da595583b11b8fcc7320f40dbf64d9263532dc57344dd17573c95eedf851668b5d552e8796af205f3a0043af1a829fabc2e93d9af9091fdd9e0fcbcc9d6d9ec960aa60e4e2964c29a2f375400366480e513f63d124db7745847310e69a38c8455e4e602056a6a4a14a8694155e0a9bf +d = 181baf9d497159f837cba58a11ca435c442e5ca792ea559bff9f6a1f562c05bf6bb5914afbd1bcaea75b35f88bdd832314b249a5298622c89462344d3f28a44ba3d059df432fc71 +Qx = 6f3915f884e250034db97327470197d13f0716d1d810e43055757460dc252f5281717b3ef3fdd51085e65a0e073e78b697a21bc33137213981fc05d9b34caf7dca7a4f99be78596 +Qy = 47a96ab5ebec6201b7c65ce7a6e70effeaeea1c095a0172e9e2c7bfc88f7b05ea575076caeab189f810258373cff2484f4fb9c8167989f61aa61ae27113b5140c95f7faa505d2d0 +k = 10e9e6047651362accc816389b26ea6befb0e34fe7363126f8c4ff9333266f46d63c4d45075480da9ebdd0f8da7224b470d914ea1d68cd821f563b574bdeffdd0b3ed73ecb9133a +R = 00e36644cf0861f45b333092d44fdd99f56e89bf3607f75a06920dfab0ccb1831208296aa2431bdb75c5d50f15bbea2e13d185db6d7175c221858fd2b22afbeca7431c290b15d3f +S = 023ee3b9ce817eb0a6733c85062cc3bc5f1ae62bdf3a74e3ec704baab05784dbb5ed01a6a2a73c80a3e754c013ba886108d9eed2bc210f29a4774bfe5508ecd876ab47a8527c530 + +Msg = 3b592cc8972a4782870e079b82a50f84b4c2d8ca90bd500d1ce5678982e266c391c556d8162ac3aab967154d072dbc0ba1dab5545cf2651753dee2881eca5abd412fe624bf3f9d17d33692d21ce23ad15ccffdfd250cb1949e73c9e40a64ebebb03852e92692dad1d7baef97fe109f35b7a492b343d4b643a4a7b1723eaecb64 +d = 083fae86ab96bce99a53e50b7eecff38e4e25b21c4b0f6a4986915de245eae24f16b6a00a4db159ebc27f5a6a072da94ab6be5bf75f5eb3f75c4452bf4ea7014392eb1e02706fb4 +Qx = 78003779e0287bee54df31f64c58951df7999b48b647a6bac416f844485a4cd7a53a64170f9d2d31fdef0194a0c262b90e5bd33a1782d2ad56c210cf80abb5fb118cffd71ad79c1 +Qy = 73f89ebdf0e255205a7525cc12b7e1c58303ac3b3417183179c216ab8e47f33d0af3238e3ae64d418ee89ef3a2cb4bc67a1d2fb1923947b9dbf3f4fa39ff82327d0ce3db24d2324 +k = 13d126fc4033f537b00a81372031026f6a7a2062863a68e36c6909c548833d1a8f5fb5fe25c7d9f2c65b1dfa974630204f71e96d657095b93cb54b00cb88f32adc08eeff4036654 +R = 09be9f4bcd7b8ef111337fb665379509b8b17a2212a80d5fecc685f1f362c45f930acaef9df47c33c6028cf7aae424264575b4635a11edd6b005ad26cf2021051501fdd1b77d2dd +S = 0dd196343ef76bec527c5929e02fbd5d02d5b0a4b5f2c8561978e600856de56d42943f1d74cb81b67010bae98de0efddfcddea5d354c60c1fa76138801f6cdc5bc932c136309b6c + +Msg = 0079a02cbab3dc02601fcb5c8607d555beef7cd71a66911ab6514a4ae21c5a9c0e166f8cf5fb198ec5a49a96e17cf041f35f00406b79270ebfe56dc6b8417d2529fd625686ffbc8f69685aefa2fd30a937c02f25b48be4679e6fde821de928b33b12470867def874bb8c7c8038ab6594346a2c44b39210d3610994ba60a05e06 +d = 1a663efa7bf4d8479bc535fad71e9b5e4f4281aec55967baa008ba17ac2f89cc3398d30573edef29d590fddce8cb157f655e92779f59e7a18d0327d02e7daf4c1216143b3688fed +Qx = 6b4bb31856dc516be60a0d2d9f42508738edd4f925eca9c72a13cf136720867babb38622fe97df70a1edb35735365f34c74baef9aca539aa1dfdead3324f41a16ca69bdf86b43f7 +Qy = 6c4a91d3fac9e7647a6aec6e4369158bdcca2275866bcdc5a09b2f0f1eba10551da9613eeb1e8d3233316b62a5f4641d6aaf669b975dfc511f2437d43c9eebe53c5115fb4741b80 +k = 0a843d0cf776878fa9ceb163d7aaebd29ba3aea0808c3459036b258b99ccae4e2444bc3211b5898c0769b7d7e036c07803497e13803132b3c6301412af3be8eb4a853e939a247a7 +R = 00356e282c096fe1690fdac4c0c66eda155ec42356dfc4783cff0160e1d76b33a99442d4ee0e3f6e1c5bde4a16c8e18bd18f98a178c3fa4a560d8fb8b4b1d72663576f8baf8672f +S = 0c5018c1383fc3847819726e1e940028892e1abd164b413293fe50f219f2059105218e4e3b952b912a3258c4ae52dcc03ac5f027fdfa448a8d58e3aa5c21e790b3b47bdfbf21175 + +Msg = 88573bd94ef50459814806efa868ebf92b066fbc2f7a4be9d2fa06b9dc1a72f72d783a6bcbc107b18a6314511bff217037a2252e7a5cd34cf9d5b2fe9c7846931f0133b2e95876cb800dc4ed7c4a4e4cc4f1195acf99fb0ec224b1f8fa8af71f72d390eca9d6be3879032a318734a63fec336c79035a43f70271def10c4955d3 +d = 0088d1a2c0219696a94337cd56516252b74139ea0733b17fdcbf7692c3e5f6c3989e5da2aaed7468e65a5d578571928ca273ec3b6aa72cd196f560f05095cdc8346e5d31c4c2e0c +Qx = 357801cec0888461ffde22d83afa9ca008ac88518f4b09074d29a846f5900e024a8e5947bc25ed0e5c980a58fd5e9aadfbfab31db8bec575fe886deda80134d91b3de9625465302 +Qy = 710806c7ed33f6879374c59ea144326f5948980c8013144345c5070122c0ddb7e18e9f752eadf2a9b0854dfb7d9b2f0d80ff0ba46197ce6017885939e9f59b642a8fa41639ea75e +k = 16940f69013026bafb6f400c037272176b04e35e9f1563d382dc9982968a186e3e1525775d27150b34b8ce5e70b537f0149ce1a521d056b52e75da7e39ee8a529ed987c70b8234d +R = 199058e36449ee1a3388d7357c9c1020b2e4c02144aea14b041bc584a752c94fb6e474959b24bd2c0c104f5ecfe223ebdede672298c29195033aaad5db1852ce4dc3185ba2409a6 +S = 11f3defd9b442378c461e2c68b239d2e4afaed691238c5ac4e0be46ebd461639a60176f9884133900f988e2d730d34df5e2bd8a14681014c0a213f8d233b3c50ae3064fc38d1a19 + +Msg = d0e02045ece6e338cc8ab41d4a064c982ccb1748c48fc2fe0a6f10bdc876094358a6a90a45facec798a83cc95c6795cf0f0d7c66b77e22cb114c1432bfdaa1485ff35b6a58107cac3b7e58cb4f6c87c68db60b751e78f1fdfa54b8923b98caad0a4f31226956d065c083ace5f1e9e91944dcca51879d782e40358d58ca758750 +d = 16cc8a0fd59455ed8d4de561fd518df2e008f7dfaa5f7f29ac2489a411e233917b43eb3ebe2596fc824be58871949545e667dbcf240dfb5e0c615ade0179d9ea2a1b1ebb8ab9384 +Qx = 2477e678793593e2abe837961895c7ecef71af1feb882ff27cfbabfa0ba3ed771b79223e7b2d2388efd371d5c325854cd60e48484f818e1a8146fbb780cd6ce06ba63c0db67df8a +Qy = 01b696114838bb972ec6d536abd809d3a436650191c43b2bfeefab2b400d5921a7eb78e307266acc190e05f3869017f0a66f886bd6556c58aafb1042478cc768a4f86758e9f4c32 +k = 1e1b851bb95d2913d6d35b756d49fba6f4c127dbed80fe4068260cab89c1d42f7a6843f731e83b379ccd8a4915d2e29550f3f6ccde607cd0b066dd5fa41ac2bf37bdcfc26cd4d04 +R = 10d4291346685fe070b267edad91154df83664dc115f058ea036c712929634d53662586bb50cb6473c2170db5d4ee43be0c50532015937202e193d15d5189870691ba65aead7f3e +S = 0b2a15f1ef00204bcfb5108d8f1da96ac3297aa041074b68989ff5b6b276380de7887753fe3d416ba691ba0b2ad7fc065ace02815b2323fe17f6445b0fa66dba5d99d8e7d557cd5 + + + +[B-233,SHA-224] + +Msg = f1b67fde01e60e4bb7904d906e9436a330c5cb5721fd4e0a3c75b83dade868736bb1d21cfb1b5c6407c373e386ee68ec2239b700e763728eb675a153b8ac44cf2a87be85fe8ed6683430cf4b7d718891cbf8d583d0a37cc952cc25fe803a7aa4fda80f05541a2f1f2601cdd0c095f7110f2a84f7d641b8531572269b21cbe77b +d = 056673197bfeea9bd7a8b820b4ae51a50411bf118a692bb9ed3d304da53 +Qx = 03489be62e53910c20cb508de019c3e326f65051f26749944b4454f156a +Qy = 0f775ac38baf19499675725e8190aeea16f52346b1c890d9583b38c7521 +k = 0a6c9914a55ef763913273b062475fd0188eb2d5af9c8c1dd97cb3cefc3 +R = 08601a42d7f7eb047e8ed9820ddce665c7277f8ef38c880b57109b7160d +S = 026d6f50f0508953657df5d753c595ffb8e1c19f8d092f8ce8db54f76d0 + +Msg = 1d496d96b533c632ed6a91f6e3653cdffaa5b8cc0008b35e49b2dd52fe261105c2ec7ee71a4ad5d51fdc3d36d688a3b7ccb3b3b0c3a65be17b8d8aa172e3005cfbf37a2d1b1a6e268c090c6f318e7e96f9ec9b9f5a8fbcc7558d89e840f7e76e44bed91c26ca48e6f5cbc253ca2fe8cb81c484cabd24070e488f9c00cd96ad4f +d = 0468f01d483144e514ec257f2e5fdee28a927f2adb19714c1f3524dd0d3 +Qx = 16b3cad89cc42b80bb730431963526e26ae3b415b421575dfb6ed973e17 +Qy = 1acaf7de06e20262efae01fc80969cdc1a281f68e8c8bc0d2d4fbba3a3d +k = 04d261304678301985f5bb3f6ae465f11c9fe0e5031b31f194969252703 +R = 0878a87b2867c03f55726ea2a6db822788f4aa4e9ef609997940ee8c8b6 +S = 03545153f0554a8f55301d4b948043de3057cace62c8032c8ef8a11dbf8 + +Msg = 723400655027f474446843645757f7e2cd466bf97275067b4bc4c9d79bb3b19b2421835d69db916f24b77c381fa771fc1e7a19d2b4d09411ae55acccc615b16fd24705762b441ab67083a921fd4ae569ce0de69449aa96f5b977ac7dc022fdc8335656853796f54b3fbd118577f98920624eb0a00204f1ef83827245c06646cc +d = 074052d027f05465a8083a59cdbf32600224e1f563f653b34314651517f +Qx = 06999290db440eb5b3291bd4bb4a1af6386654fc4d275ef136c0e03dbca +Qy = 1fed0b1f9284e488c7fa2a010766c340bc25dc132c7679c2598e423c3c6 +k = 06e38460379ac3fb13f64d4de654d4fa30bd8178da0bfc29fab2a1e2e39 +R = 01b18bafe55e5c24fa2df4c09112b44d24e78dd09557349ceb1b916d280 +S = 0ad7cfa003267a6b7a99894f75720cedc9cbf820d355a6b840709f42f62 + +Msg = 155860cb31a142082bcc0bad828d747e916392d21f1873b3a3c1d28ca3ff9d45ddb66a712e3856b6afd07c8d2b2a7badab296a9775b03f6fec0befa2d8d6d00fe3938df244ab46e836a3e686c8b4f918da49f0bb3940bba34a9aa22c7caf02df7758b0de01d9f47af6146344b9be3842d9c055eaf0fb399cd8db95c544a62d8a +d = 01856e7544223f55f80de72a6ef3822fa8fbd68eb397d06e2d76ddd35e0 +Qx = 1a117e52f09080625f85fbaad8ebe0d3ad410f034242bf48365e88ff735 +Qy = 008b8bb7958d191265901a3f15b2919142505efeea13df6e42da8b0dc1d +k = 0aa106ad1461353865706bee9aa092b00fcf1b0108ecc1266ad5d8b6579 +R = 0bd6fcf49029df32fe0fa47f39cb9428d95d00a84a5afb392d7b4b365e0 +S = 0b17734befefebf03d1c79e59c12ed3c57e7d120dfd993bf276de559588 + +Msg = cbd6e305cc9f0dc90caee6e65a74582e9357bd25c78e33a7b14e1ac7e9397ff4466f192fb432143e6df6d61a0ab808ec0a361a6d95a357a38cd3e241fe03ed883ccc364b248ee2a08702110745c2688bdcefa33c1a45b9c8b200e45cddf3e3f66b8d37eff07fbb3366ea1558ef304085613c56707095724b3e134c7a7d3f8dbf +d = 0860aa2b589f2defc617be73e191502e5d9952bf60547fef19eeccbca26 +Qx = 06abc5619422b7d548c612e54df0385c293632d4d97c21e2e15ad98d0c5 +Qy = 06c36c072603681c1b03f6a023c8e987f39d931bc2a200eff82239ee38f +k = 084fb252dae9a96a44212d18e15cc52d179cd5e3392ab9da57d04cd5a9d +R = 037cd554e7815699f033ca9187ddb116777ef847b92353f613152c4216b +S = 05f806dd062043420dd056998bdb9822b3177406a536d766c4aacdeee81 + +Msg = 812a218ff1ee1472c189f63386e5b8ab341671c3a4dad27a8c6249d1c0f9a29338b471b6179f17a078b6504e804ac55ca3b13e68a623041bc1a092ea2adf3fa1124bbfeb161e6d7c483433f1548763b84da00352a6386e1339f674d45dab13898147ede468e0e01d2c4e0ed66b395a16cc3ded3e952ac739205f35a83376cbce +d = 0d0dec052a00ccebd0c0c5d9a08272f75744a2582cec7ddd924a2b022b2 +Qx = 16bb8c3d319b93731f1055756e57bd56d50b6b9ffbe42735925cf6f7675 +Qy = 09dad7b87a749df130b45d9cac8011101c15abb7e64bd4fbdd94107fa31 +k = 04098547601430c723ebcb04b23e0f1ce8b1f79ff7ed3d05ba130922b01 +R = 070ea6221c0d62930b019faaa856ad2c84c3989ec54040bffc42d8dadb8 +S = 0aa20fc58beae8ccc880e7fcb48a471faa5baeb36bbe5aee71ed9f8adb9 + +Msg = 0204b1fca831919e89e108cf140b3770f531a696b1d9a4d1fb68809eb10afccc257cc90cd36717c02b2f3d6d3d1d8a93cc5c48aa7ab9f9fddfe121ce9143376535a0c65e247c6558eac49fd1d6d1bf431ba918c471cb3d536ad485ec51f6471a340ac75f160c4c54cd3ffb9dcc123124b42df1fd2eaa005e3377c5d2d55938c6 +d = 08a017d717d6d1213f2b74c53281b07258738c0c7db649ea1ac46b9a3b6 +Qx = 1eb379e27de6c04c5320cbc18e79ed9e8993710ac70ce823f1ab5762b67 +Qy = 0f552192645d350361762aae79ffba39c33c2c5c0df208219f1b339016a +k = 00e4822b2cffa327a8396301b21554da6fa52f418d67114bd58e850d935 +R = 0d64dbdadb4ada2d3a8892049f7fda3c733030522b44cd72ab850b77bd0 +S = 06fbae2d8e4fc04abd8a6e9cb011974ac851ec108e38f9c72603f7a04fc + +Msg = 2033eb48756638cb56e2cc39a3e775cfa11fce86cf71f04487dcdbc7f262bc8350a30ced54d1fcb697b28a6e96f88f782947c997872307ed963e1d68985f756435af77f57755cacbb4c6b50ed419deec9f39f0a549a13e54254fa0a5832dba2d943ad4aed8688889a2dd29dcb4ea12abd6a6c50eabcb3981c3a0c1ca5f0b9629 +d = 01b56c14442b084cfd22aeef0f8028ec57c8b571c9fc1e43de05c45e47f +Qx = 0d450c533b13b211b8c91dad0738402a5c811460426ee2f35ae068f2c12 +Qy = 15e1c9f9d398925c619f8aa0bac746eb7907d3d510814cea185a7efe771 +k = 0dca09773730a2758b7f4d9257a8e6bd942c141e46bde5ca54a79468c4f +R = 0379773ebb7a2860f3422d8f8f714b234e5abd8860defb19c659c9c6179 +S = 0cb9272a27661604425ab84632f586048483b9f9cb80b9697898e745117 + +Msg = 2986ab1cfe8873009e932dc68d4727d77ccbbf378e43fe4aa7c54416346b036b89c0aad1b82977c9fbc39a00f1dc916c0561d8dd70298c02b6cbfe572e0ef2058641e841c6875e8515f3c1082765e046c90c956d984b76e0e8e6eb433ce26c1757ac5b13422479141971c20102e9621d18f51096ae3173c2753facee2862d66e +d = 05afce37c5594586ac46a34ae291f591eacb9880a7de92701977f447fbf +Qx = 02a069ef14f2989d2b715c5006642ba966cc84df88bbc27e713e15c47bd +Qy = 0f001f60b8a8102a971faa2c42d3ea9cec37b49c7e6ec0cae9f7fb35713 +k = 09756db630ed9b708bf1ab8aae6a7559bc235c4e9f4002ed26e2f019aa1 +R = 06b9b2c1d214373647d9a2d24ba69741218064004614368915d5cfaacaf +S = 090dd607329c27483fe43b7be137c3f51c23217c939baae40b53e65af2f + +Msg = aabf5aa90ceef91c2155f90660adbcb0eedb996f5242cee15468ae217058ebeaad8cd4ff8cdc754a8ab85ba43c59fbab6386686fad5e27ad3848fe52191c7e4b203720841501792a625aef2acb6e36493b792fa55f253effca682946ad8c77e01f44e92ec3c258d0dd98d3183f4dc4a0bd3eca183794abd6232a6f9e4add8f57 +d = 00696df05dc7a54a9908a73eb18416a155cc8df4ab26032539d86eae537 +Qx = 08f9f494ddf8d0030746a8c0b8d215dda6cc2724f411a7ea407629294c3 +Qy = 1ea2e9f85f06412d29c677aecf624a83c2fbd86482dc0d564906a91d97d +k = 0d62b06628d3884f0a329a7b6b4f832fabea4ebc85ee03e63f2967e7810 +R = 02e39824f272d4b74810594810957963c777207217e53a672010605b9de +S = 0e64bc44af64b6f879f0d32f814acfbb98795ef7b2f246b3f91cacb55cc + +Msg = 29ff209eabbde02b10b3fd559671fa53e418750c32c4a18d31cc0186d1077581bbefb8770ed079f536e866414a07431ae6633955bf42a2389b6f8a565d6e4ffb4444336e0030093876a26d4e3106e9ac697788e41f8a21c755eeb86a7c60f18e5e1069f16408a4c375a6a68d42959f2fab7ac09736c7b37c80c05897d8566ce8 +d = 05ca31e88c5b2e96e433af2023a66095161710628e7bfa428944d6676b8 +Qx = 08232d4bbe25536ea7f83c145a8d2b1cd72c383eefc2adaa1ce72c7dd9a +Qy = 100b738c6f1551b3240293ee8e8ec29fad0cc485ffc2cfded96b68162bb +k = 0df9e1b418ca1d41d749ee998446ba1cc54bc8bf72eac6f30929b40b5c9 +R = 0d4248e0bb60fe46abf7bdb2effe804b9d394d8a5514a5791e149d435d3 +S = 0b89a459fb99cccebda754c4b2ae264c9aef7b5b610427f42c35dbe7d3a + +Msg = 97765d876c80819f4004a36d09ccba78e600efc71eb7e869d3a00f658d2ace6769c7ab1ef590f41fb070aa8e08615e138df45ffbb6473d4a86ba5fdf17dd6dc9ea9ee19c0332563c99e6a3451c211d286d69102b47bfa6e07d468d9bde82e5c2063fb1ebbbed6086f542cf68ba46d4f214634afb1146dd5a6f3d50912ef5b824 +d = 0ef8fe84727a2ad8bf4e646ef28a492adfaf785a3a2ba6e6f985c649a8c +Qx = 03435eb25ce9891a78c120098992c666940103eefd80d9bd64f1d4ba37b +Qy = 0ddd6a4a01e443c92afbc247f634b85f1c858a2aaad35a26f57ad4c9126 +k = 09753a236759eb32e13f19b9d2ad06f7b4db4ac7b1df96813463d0cd557 +R = 08408fc46149dcce0753d7cae0f50c8c5fcc97acf7a1a02a9f68c0b80c7 +S = 0b5ffba104acc6d0cba87523382ff928859718122c4d0d2298e74985d89 + +Msg = 21cf768d087d1e4eaa8a05e2008020e243116206d675c09be42ef2bc93617ecbb0575c873c6510ede9979215531b62126552738862fc4323d487992754e39d8f0d7e111e165ff254200e05082f59a57ef649bccaef6f980094fad3b7ef93bceb161760e200f0a2e396fbb6b6142dc84d872311bf932b84616b22231747937d58 +d = 03edb94b8c62f9af30c14a790c0f5d65e362a21cd8569b9725916d534c0 +Qx = 065133691b888cd2513964b5a905ed9334cff6367e25c09db1743045d58 +Qy = 1408e1ac721bfe2198086c1834d484b6e5692c037e09928cff87f4b5a88 +k = 01d8f800ba05d8173b0f1bb3aac0aff68c6b24cf98c28f5a69b0b5a52cf +R = 097c07d4352e39e1878c42fe97ebd4c3ba5098706879fad9be4bb2dc2f7 +S = 0bc669db3a488e613665cd26da7927c6b6a073ba6b0951c00d22ab1ffd1 + +Msg = 7b8e58eecdab3e40212bba6bf284f9379265b3d2baec3e4625aa08d0ced851da193c292ec793dab42732c07b4e94d8b19c83aed796a7e3a6c2b954a7a9a1ff9b2bd4ca62592c8b68f709f1ad38a5c8033ebb3f33d176945bfc68e9ef2b0cee2d45a13ce89d238a33c09ce2c0c63c4233aba5717b85c4c161dd7648a41a5e39d8 +d = 00a7519be62562318da1b67d22cf8e720353d22641e0cee11c7a352bb93 +Qx = 13b63dd8ca9044a3e518a67999a781a5b62994b6e20454003a9bdb8715c +Qy = 1a2f9bfaf528b7f5bc8c3b02eccb71666c83e4a598b4077de999d90fe27 +k = 0992ba1a8331bc4d88be7dee06f96098bc2ea56668f345e187f32f38171 +R = 0c55b45bc7bc3092ffa82234b06ad45525b45f8904011f1bd6cd356f0cc +S = 0e6163e70ab56d43fa27211b98b48f1cade127237bec1c6556020d39990 + +Msg = f8f268d2b04fe47e5052c8d0d653787384b9654f0bd2138a6f52b80713feeed452b976a90eea4edcfbb62d04f3eafe172ddebd7cdc3701ecd6008e3d82e8eb217b13b5228839f61075159f3bd1e1409c08903874b6dfee2789dd72c208ae769ec8c7d52552a2b1fd73dad24de8b571f88e2184d0ee7d063a121187f97e746f2f +d = 0264022fd7dc2328a6436b522793ad9406d7a586667a0daaf1bce927338 +Qx = 12d7e7f8519a7e357510adfca2f50182dc5fa12fb2a77409fb781ed500d +Qy = 0ceaa9a22b7ef9febd8a9962ce21d83fd2a2a938b9d7a78d669dd233974 +k = 026fb8fa6e746106500dd29ee32bbd03b94302ec3a123356b23b3055e51 +R = 0f416418f7aa4d437e7606afedf961b968a67d9a1524d60fe3f6df4d3d0 +S = 08d3afc975a8147fa8230fef4b16e3024180a9768702038f955357ce8df + +[B-233,SHA-256] + +Msg = d288768cbd066fad4bb2500b5683fa9e4eaedfb3dbb519b083f6b802efda0a022355565c5fc6babeccb22f3adbbda450ce5d633193d1431e40c0fe631a295cf85965cd3f5937b31866bd6a5300eaef9941daf54d49832acfceed90e572ef34ccc94eacd0fd6b903fee3c572b963d21e2881656a214d2a4c125778dbe3bbeebca +d = 0da43214e2efb7892cc1ccde6723946d2a8248a6b4d6c8872fad525ec3b +Qx = 0db09738bf0a0dd777f67e82be50dc8c2d8e91598bc0b8d4486f67c04a5 +Qy = 08ef463e2f37ac7c3d276676cbedf17ae11e767ec577da7ccd90cde3b74 +k = 0249cbd55e307a0fd10a0c70b1c0d5e2416f4d7f144779ddc11911f4a08 +R = 04d1c99f9d486fb92b132d68c0173df891ca757572f7acc03cb41d46bbf +S = 07de2deeb58d55d65fb37f600d916cfa49f889f02ef53dcce412703d1c9 + +Msg = bf0ab46e0a756c11229b0ea961f8d57218be5b00ab8b0e91d7664cdf5e0341c412c0e992d26ab12115197db39df2d1a6e18ed26a91be461432a2dfc21d98cb16003e339b0b0b1f100e4e6f4824ddac5442f22a1fac26326ed8a89cc91343d7223986d485cc8c64424e84d56be536c57e4dc5faee459b1958efd79e07e90a9811 +d = 0aeafa49d776b61f6a30d66ff64bd40dd8d79891dd5293c1b5cd3b46a7c +Qx = 1ba1b87b16122e6939da5dcadb8902177a9f9ef09194c8695008b80b588 +Qy = 08f51ee5cea1f4fc9c44c70df57326ff121268bf4e02cd9b2626fe7c1ed +k = 09d640ede5bb60b9aa78e393ed453b1643f6dade4aa20e994db53e81fac +R = 0277bbfb7479077d5fb6813670fbc7f46055718199550130b122a7cb8b3 +S = 0f8dd350bc0bd2d84cdd374c56ff2341de4102269a1e80df7e35969d4cf + +Msg = c7b1eeb7c19eb16e7f42b61d79e421b71de797a6cab4e0baee522fee7acdb533f7bbf5855316544e1b82b4f2a18ad0a2311e7622549332122171f32fc62a90e408207e0fb90d1b052821dede9c41b15b6e07d84d5d7b9e31e6396a8ed229fb6232b3051298dc5321aa589f4e289d27169f14c8cc93644916d9b72dbc92c43488 +d = 0e95db309f4305b621f51f93588a2678cb19aad0932f365fa0aaa3a3895 +Qx = 1177eefc44b6070e2c41537e75c91e2f08908c0d950bc90cd2f4720b335 +Qy = 0f751312dde55b1bcabf31665deb6c12d043d5ccc89800622a557a7ed37 +k = 00015798ef57a771d62d194389817c93de1b225398fcc0d2b81d94054a0 +R = 0eef7161a167f69a6c89b0f173db2c4a7033b5d801c0d89642ce65e377b +S = 04043f8985bbe0221fd595f9355c33e1930b5e10a1452e81c31259e1e3d + +Msg = a738eb074e1f277dc665118ca055e6328059ab26da188c16f56384c566e43df8cff3d2a10d2d15c3c1406de8f734b20be5dd1ce937a4289f0ddfd7bddabd03586556eb8233b8feefedaa1f49bdec6d45fd562c2a83fa9fcfc2013bdd77900857199e51fa9c7cbeab925ba8f6c3c5fae46bf8e9c574b302f1e5f9c44400152a78 +d = 0d4319cc8e409b8755880827f3200d3f0f1c64d6356fe74eb1f5aa42499 +Qx = 0bf65953f2d08477f7fd0428c31125184e3bad4d5da00c91991949e0562 +Qy = 0f1669d0d116817d625128ae764b3fde956432552d24d98f08a12925afc +k = 05e8704febc38bb8ea76f3c6433c1f0421dc5e5af959723a5a2f0e9a970 +R = 0307c0b838c65d1a47792cb367253bf7c9f627435f1c7ed74494b318446 +S = 00031a9b35e935be6620243f4878a38d4e617fb25f7a4883893366f39cd + +Msg = b28103d77e5457c42e026e713ea6ff03722a36512da17197140117442a976f9e2139c54a759fc26af5811b455e5a0d3a95362d9939c1e738045be9237b469ae2106ceed7e7842b44cc0a475d5af6d781e32ff1dd1f4e1833dbc7f82b27dc7e1562d0e29213fd8911105104a7a16f665b926aa137f70d868c90e72f8ee2c95b64 +d = 09e556c945052e5954915c773b2d47970c521fcc99139269c3ef46093b7 +Qx = 0db68c16ffe64bede4a849812df0b8e202f74500cb7d5349aacf7f3f026 +Qy = 084b5892ea74835e96e9dfb1bb201a4dcaf32da25dc00dca019d806f5c9 +k = 0d0c9e0b6d4526d5f6494d2c72f812fb8d26e17c7a44f6b5e3f9e684cad +R = 0a379ac253f3aaf94cc49e91fe3f2908107a9e1a4d102e02395eb18cf08 +S = 0854c2f6ecbfe95cfd14045faf71ad47561e365c1dd5f515d8817c3198e + +Msg = 463d04c84521ae671bb35c0a7acb3ae509b1b0470f39b8fe7ae5f3c9fbadbeb2bcc3a87e284cbdff07407a351f7ba743aeac50c4a1fef7375b90eb4af8ea2df040776bbf3e4389e7a80bea40530842642b9895ab9ef5ac8ed6c9ce7917d7b3ebcf80b801da845943313988c1970e7748cc306f914c37414f8247d648b580000f +d = 0becc76f8a77615c4f92ae1f91645bf5bb908e75ef22fd544aae63a3c8e +Qx = 18cd93bfe8fc8ceef2b9be14fa947b60fb122f5099cb5bcfad0cdc601e8 +Qy = 16de11e673011e30f6fd92025a60d7938412ac63b19d23e45bbf53c6c4a +k = 04e75a7b92c42ba0581eb1201fa5b3fb2ac82460e953c26ce6bc60e145f +R = 067bad23ecac0883d218b1368d822b3bf9b82453c0e5f3e336777c6a507 +S = 03788a331249463533384a61c47232aee6f057634c37560ee25895b2a03 + +Msg = 8b2379b5553ae7db6023cb010e26ae91322bc3f94dbaa369481936f90a886e5d3827d995ccf03ca59f46805fbac0337d31a8f117cc7044218a934d5bf507090e7e21178a7162c8fcb39111e6967803dbf9d752f3ae737ba024d0f4f7627e08be58efbe997a164106bfe37f67d2f19c0fcc7a6c7eebd96a72582a9c7bdf881896 +d = 020572c2a3dc3ea430cd8cde9d642081c21658e8bda165550cd9a5d37d9 +Qx = 16117486794f14d171dfc3ccffef0396cc9fe5aa45d6d39ce0f252c4168 +Qy = 1b6a12fe2adb279dbbefa4eafa273a2ddbafb2c6401067a5ef5e859fdcc +k = 0edc8d0b64496da309b10630e9e5917c9a807ccd7cc7bab14360873eeab +R = 0e1fdd3b7849806fe587ad93aef737ba0472409b7239981f0d325785fa2 +S = 0829449a0c39071a832664e8148e762efc36fda9e030e0d062458728273 + +Msg = 3090bf7373731cc44c00372c1ac59280b0f36e627ccf763fa68a7be37bb0ac8cbd4f70db54fc652566c78ad268f78f015e4bb1e41516fa56ac303a3bb4a52e1fe897d8338db5a6e37cad685e704b994504bd231c7dec0002dbd907a7ebfa809833e32eb23fffdb44fe4a18e11fa19d67356cfd703cf39a75b1a290b8a7c73afb +d = 0769cfbf2dd8248ea1e0ac9b275c9d6ddcf923fe762079b9ed62ccbaa89 +Qx = 1aadeee0e31ba9505da3e195d883643d260dac9fe5e86102c8ed7f88eef +Qy = 0d925bd5fd700fcdec60cef9c9fdd304faa102d9d721b4f21291f8c96a4 +k = 0f2e203410107c075e25c4adc2f55dcc277883d679ea307df7d52060fa3 +R = 02fc0975c2e70328da4a0ad2b8bd344a8171c2c500c55b1c92270230c27 +S = 08871b6791f7d03796a3aa537fa820f0eac8f2463c9f918468e7588b784 + +Msg = c37389cbe3f46eeebdda343e354ccd543e96b0c2a87e057aa6b9c4895a403de706d658bbc9066c140e50fef4b56af2db1f42efb70b8021254649983f1e11d04d6b10169d5a1c2093b6ab89227b88a30537c776bb7575749c3ed87bcb29effd8e4f17915b4d5dff6cab9678d88f33abead1e73dbdc5c3307ff3d3b2d5fd7bfa83 +d = 040ea4a37b388f0cc464f7e2bf92173107b268ff77a8acf5f517b4ec0e4 +Qx = 08acee84d29638a7285654d20f8e0653c7386140aba0bd2fc157d517643 +Qy = 1482ba5ebb82ba46654aa1eaa6a5f01e030177318921a0c99fa3f6eee9f +k = 0a6fbf938e9cdd009c838196ffeb61f7f545f7e7e9a6cb18d1f595a87b1 +R = 096a80172a7b3b65c0a8acfa8b89cedf9cb19f6eaa5d38436c300b7c0f4 +S = 0b7bb96ddfc9d1324bea96836c557cf88d6ede9a93ada8fbfdfcfe56244 + +Msg = 8884def8c3b9c5f856b9c2352c85ea71aae3c8d0e84ca74e70e404a21467159fc9826548d16dd1ec5a75dc2c23ca37b30312f25e1194e0f9385a0499db34c855412bbf58979ffce7fc3afeb7b8dbf9898df44023200d809f520db99eae315b5cf85674fab008a20340fae8f6974034fd3e55bf08c5522a460680218f9757e368 +d = 037fc7898df9b37b5390537352f5c0b8de22659166c19d7d4df31c3938d +Qx = 198674b40d2a68ed94d5b2c51102393d1332404f75187130669b9de0df9 +Qy = 13ee77d854a60f1aa74041ef1fb58727c09f13039bb4b33a818dfe9af2a +k = 0cf92eebec59605b1d45848f5d06e93ff2767dfa282929208ba801a9fec +R = 0f7bd93dd4df06219fb974a4e85030840c7d4877f131adccbd98cbd25de +S = 0c2c4a864459488eb5498a06b0b56ce7fc98fb29b1eb9b6238da8cc8f52 + +Msg = f1fc154d469433f56c2bd42aa52237a4a4bfc08fb6d2f3f0da70a62f54e94e3f29c629c837e7adf0474fa8f23251b9b349a16848942c0d9cf5db1d0fd99527020dbe21cf0b94a9aa21f376bf74da72d36f87b306b0696771efa7250c6182b426a4500ac14de4a1804b38db8d4f3beefb8c9bb619ac82cb63fb37c2e1d22951f7 +d = 05d5069425e7a9925d2cfc6360a708147b2c1b55ede243591885147ef3b +Qx = 1f35f161ce0963dca70066b3a6de2a74ea1941a27cdfabd9e433d8084c7 +Qy = 1d5d9cca5b741b2321d8511a777fcc2515c99ff8d13ff20266a163c94b9 +k = 01b9c83d36ada7e9367790ee850163ef4420104e0dd3299ef6d65191d7c +R = 0dca4e804bf74aa496c15025acb4232c637c9b81e9e26d6f2065d6be21d +S = 012014f77a4ddb7b266abf2c65a653988ee6f913e700f3f83f3e78c88ab + +Msg = 885cd348f7983a0721f96c0e866821223d3e5a95178b16d18652b4062b1b2278aed6f54ab06f7e37ae6ce1020aa3eb812d215194bcd212302da5b971fd86aee1dcb23057dbedb569bd0bbef80df538da69ae2358cb03bb77c64d3ead475c8c5ae5bfbdd75684b421a26f1a7b0c37548fa32d805acdc91230dd70a48232a12846 +d = 0ffe3e7b82ca62b96e057ee072a4718ca20a6cc9a3e51e4fe8ed7b4b9f9 +Qx = 10f774adc83c1893894855366f1db1962bc697b8e1d047a01a08b12da4a +Qy = 078c6ff634d5dc8ffc4d8b1a53bbf94046023095a8c2b41618c4330a4de +k = 005a4a50de4e97280d6ed1324214d91b271deb649a2dae18d21a0182022 +R = 04bc8ba9ffbca81b5f19f0d8b1306900ee642bc5cd9a9dc9867a4531b04 +S = 0353567acc062b83459017c70cff4f3b8ef0925032b51d7300261408549 + +Msg = ca3b0e2f1c7db4e73c699f06e432bb0f63705ba66954bec4a259bf31c161bb4861476e2f2f7dde9d841d1ea6bd0990cc793cd7a10432e38735c3eeda7a0d786e8821239bdd6c4972c96c2cf68ec5b935391f963a50fe16af2719c9029943b539ff0f1f5645962a6ac46c75d2037fa0c7cd46deadcdfc66e1ddcaada3a376acbf +d = 007a9cb5ce27c763646de414ca2a4dcdb774d69ed2bde7a817baddbc9de +Qx = 086d4ac1e3d54f7c154c5370f5c9a2d22cbe8f794df68974706bdc9172c +Qy = 17770a2ccac923423137731a14e97f6ca65a8cb3642eceb4e70c78ee929 +k = 0538b86e0a899281ab56d28f40bf3b7435f9a57e334a3269233766049a6 +R = 007ceaac3aa0e260c371843104f5cb91a057741b38889ee796e69f920e9 +S = 035eedd44b036b843deadb8e8df9d96b16e719ba350a634553457ae71a1 + +Msg = 4b0a31b746763beee77cecd318b90acf50fac4172cf4bfb354e5a440f651cb89d7a515e09ab19e9850803ab9167c2aee3b395a5da10dc9aff799d73756dfb0a9961d93bc32f15a96bf13962a03d5bd42ddc8b5928def7fc48fb063f42866fc5f96cf88fe0eb125b7c01906ad6a7fdade28ccb0a421ceff50ae03a974671b2c27 +d = 0c03fa9e38dc1c697f70bc6381f2bacaf860bb5632fc837f728da959ac9 +Qx = 195f386c7efe108fd1d580f0a77031e180e45a23911ba983217207a904b +Qy = 1a6837095a64f71ec53ab1c0d9a3a39d69a514065d83f1af26870e41741 +k = 0d4f48085b367787a614b57c06ee8018b2e95e989c2e8cf355e71db1091 +R = 0391710f815babf07b6287b7aab8b9d2ce04bee2a144f4d4a46fd17cf77 +S = 0ef29cbd771b8a6f414ecb73b7937ffe0a108593ffc6899f28d4030a9eb + +Msg = 3011d42792b21c0f1719faf6f744d576f72c5fdfd22b1a520d0e8d47e8c2b06823d853b13c9fa039fa30a6f2e3e27bb2100c6a35f55703806bbf0f79b09d0f629f8042ec63fa04062f15f2edb92b19237980005566f02bb12a40b4ec66e4ba6c599d928b33f72d7437c0e399a8e6a9068d1fef24917fc4f9ab5464ea6684dde9 +d = 087dba00e3fe4802e01718017510094924496bd2785d4ac1a352c530473 +Qx = 1198518db2d1255aef955b9b80471aba60cf6d8fd1feae6d8e048ab1403 +Qy = 1833332a116214e4d9fb37c8e0ab7552b87348434a67a0c41f73972dc9c +k = 0378578acdfa572b1de4e032158b28bcf00ab7dbaf07b0e772c39603216 +R = 0be2cb45d527a7685139290f1098de975b69957fff2c5c29059ce417950 +S = 06abf4afdcd2990121723b94ab8145d01cc4917cd70416620ef100c67bd + +[B-233,SHA-384] + +Msg = 05a5d3a3b79f4e51b722e513620c88092a9bb02408f5f52a32e782fd4923f4fd3094fc5536caf4b645d830260eba91b5173f3833dd65600fb9e246aec968b1f6ebdfddb4059fb2de7e636ed60bb7affdb74aefd158e54485d5f26be373cf944c6570daf8fd7e4b77fad57300667d6decf5c65db99ab8763bb4ecbb09fdf47e3a +d = 05a387e7affc54a8fbb9157b5ebd400c98e2d7bd5c3e095538987d4f8d9 +Qx = 1a97224cafc063967b25cd1a43283daa5411f3eabe9386b8b14c9768c29 +Qy = 02cefaec5141bcb084cbc9aebf28fc59780897ad1424fd439eb43eb911e +k = 0fb7ec3804654b9c3675f7b3c427f6d01f83872e96de2742e59c93151fd +R = 0808d829d78e65eea47122c92f8c2cbf5a8d6717a057ef1659fb6f8cd3c +S = 0ef338e09dac0b12fa6109d15924efb694a0b672afb4ef05f4e6f2f7b88 + +Msg = 247a101c8196eb93a440280650ad463795690bc620e46e8118db6900a71eb493d03fbcf2f73a79bb47aa8e2d8c87ef70e4cfae36fae5c45fe247d8cd0f7d0718dad106526945014b4f3bec324897d8e1fa2f457b8a68e61873b7fa0350fde3b87b7b001c13953c2050a24f71fb77eb455053e49200ebcbba7299485c0f1a40db +d = 0adae709a930d6f5a5c0e3d8ef4aab004d741d23f0ffb8287f7059890c0 +Qx = 1541eaf3dca942957c48d693d2eaf2a456646d2fb3eb8df1779b917a9b0 +Qy = 09737958276dc31852e57063119f1d2d061616b6a2fd35b4a1a3f046954 +k = 0390d5ed395f8ee3478c2765525c235587dbf5bb2316df3a1e8c664185b +R = 0ebcc4f84bf2deb9b3d669158998fc96d7516580675e24348ca58d70d2c +S = 0b99462b85e6ce6b46e5aca221250ac9de7ccf3e63b38919b61700be866 + +Msg = a16678c71976a3ce3362ca379b3272b92e8ca7085b43752473db34e4d6b61eeed3875f49f3328366fc9d0644824e0104817de458e4c1036636b18b83dbaf063f2f99818959224906571c7b28873d9c702360888df151e9ad1a7003e6130033203acf8a69889be6ebd90816f2abf0764f10be68653b1e56766ecc3150bef8b042 +d = 035d391411e6d679751092c4ea5a079c591e77ebdcb57c1d9006ae70d90 +Qx = 01298e6f1612f90dbd2eedadfa8ecce22dff1da2d1cf057c41bd37d4b06 +Qy = 073136a1caf7dae2aaaac571a900135a51ef031643e9d5f01934333b864 +k = 09e343003670f61db85aedc0249db21953d232bc45488c3d6ceaa6072bb +R = 04ac435e88f8e487b9b217e7d68fbba9bdea0b9685769878818f25e661c +S = 074d8f4dd58c922d7e79f30950bd54c10c1cc52ae3b8d00b675c8e501a4 + +Msg = bc2f080a7f0b69a6b142b8f3fb481a43bd71d07418df4f3b802568073c1a8d35729ad197f34a4e941a6dd511c63f201d1f6c34a1b66545bd5f43508c10bda1d6ef60ee5bdd25dde975e50c61f76cd36d50ee3bd8dfa2dff59524db9ef12f1e28d109b552cb42f021963f559c843476b5c889fc567b7840297c5a480e18c221dc +d = 084e79093f1947d6ab9cf399782436e36ef87c59a4c090930c9a74ddb10 +Qx = 08e756774def210e2d6f76d6e4b0b43d86adca0880f017abfc911bafb5a +Qy = 147e6a20c1aad897829339630c5edd327ef9a7e40795630504318cb71d6 +k = 0ce780ea99a344d67de7921feba6ae062817101068266d5d1a140d2b49e +R = 0fb2474b854b8e5d6920ed90e69b5b386a1b26a947b1cf28a13f7c5d3ac +S = 072722017a67ea6754873f833fc51318d41d6ef598d3ec2d3e0eb5bf41d + +Msg = ea71cede8b63ddc5648eb244184bae265cd65d50f77a9e25ff93f02b132487c08732544cb88936d4fff7c0fedb39685822dd1c9be1158f647c605c9bb5f6a1ae34722fa08882c14b36b6c93cab33c9a269c7c10f755b6453ed045ea3e56f29e95a9404ba189a0b48848120392b4dcac43148b706c3d9e4c03db410cbe5dca3da +d = 079b6be015b8006f86fd81c2792bec6b42c08bee2d295cf9dc214c326ab +Qx = 0e24338d5e33ad12d41eb623ad0905f64d5b75835fec4e693eebf9bba10 +Qy = 101b4297b5b62fcca7c61637a2a57365e911d3bc7eb0fc7adb0a9dc7bad +k = 0f06b001e5f874d16632e3c8d49f13d70f48ed4eecaff9d3b741f9d02e6 +R = 0de16d8fd7bb1783a2cc4b9ac1563eff3f87e4e6d75e6a32a4aed1ecb02 +S = 040bdb1197ee8ee51e4ecccb8d42dd985913809c131aa9224049425a052 + +Msg = 319b41d16e18059a1324c37161c937e882192cd949c420ce9c59208a0ac208ebb06f894a7fd78df2a3c5f23f25dee6595d3dacb25a699f115dd482ccd36fc54ba29dda279335424c86b07a1b1fa76a5411bcecaf4d37065b229cdce0bac75b666c6626ec37a716e9841be93c907f87453ad91d36846561f284421a89013b88c3 +d = 0ca9d751a060fde64336cdc88122819f4b3cd1b4e7df42d495197787894 +Qx = 09549785f4f9c71f20133f5a1d409b244df55445beec404cf8cd4d2cadb +Qy = 1b246647d7570f052840d4cc01182d1dc3bf357b25e5966434e1c3c2a30 +k = 09e99fe741cb23f7eb039f5df8414d069b5c2e3c144dcd6cbc6da56ef43 +R = 0cf00f519c18e7a0fcc84c1e338158399f16929ad89842ba97a4afb5bf2 +S = 05854ee1a6aa5a6a74bec0b4696e80aa275210183c86f45dde7002d7ae3 + +Msg = aebeee215e7b3d4c3b82db243a47506ffbf2263f6fe9de5b69286e8649d9218367c36ba95f55e48eebcbc99de3e652b0fecc4099714ee147d71b393de14a13e5044b1251e40c6791f533b310df9e70a746f4c68c604b41752eca9ce5ce67cdc574a742c694ada8f20b34d0eb467dce5566023f8533abfa9688d782646420c77b +d = 01dde4b2d49338a10c8ebf475b3697e8480227b39bc04253a0055839e9e +Qx = 0504bd3a97baf9852d6d46ef3db78ee7555db752120d020cd056b1b4e50 +Qy = 18dd305f6a15e91fa46d2a6d30f2ec8fbe2baec491e26d9a2ac81155c85 +k = 03b78d2772b8ce01a00ffe2e6be2f9e2ca2c89ea3b29bec6d6cf31afe33 +R = 0c0c51fba155f98900eaa2d2935acd615e917f9dd979dc8d92f1d6e00c9 +S = 08c8354f95e24ed13d8ff3755e1122dbb4117c76b21b3bdc7f4dd856f8d + +Msg = 8d353a6b6f35590baef59b638914d3e934d0145b045d221d846517ceddc8ff5e3d28826d3459f8ce1260f705e80923f39abc73d5949aa7aa8ad1734be0e992bff0c9a8f4cc9bdfa430d4cf52e29d3737b0cd3231b72b16e15e1a9040b832e4a920b4a1d94c4964ac6c8abb75bbbdb10825f882ae44c534c7154c446421a04d87 +d = 02c8bea2803fd746c874fa110a716538c179c82712f38d33d0f6d037e7a +Qx = 0a034560353561cde19db89dbcad5c9dcb74e239efc604e86ff38a0577e +Qy = 185e0b02c48be2e90c916a7c8ef2b41a57ea8d4f21d8cd3a0878a03875b +k = 02e39f851c57643bd799c4f3b2fcc5eec8ff7f9e9e279efa647f969cc6a +R = 09b2ad7efc7ed60d9cd3dedbd4159b1e05f05ce5ec2d2cdf7a0e0657482 +S = 03fcbd4ace6a140c8bfebe36ff30848966bb0d3eec323cc8ddda55faf00 + +Msg = 847f134b90f10ba3636ec24f36a94111f26d58428fda5bba4501e58c7bb55809f52320cbe9e0df55af1e40bbac9f3eaa26a55d78b60621d4356d090d98363662f406367601eaa9eb9568b1a1b319730bad7bf6a7ddf1b45eb6922faf8d065c540b671c50df758ebf8c4aca6f01878e5e0012dd038c58833e2b13ebdb9a9f3fc3 +d = 0b9119b3b4b30cbfb98ddf0a4f6953417e515fcf0e5a94e83ebc1d1d14d +Qx = 1be65d340f7e99067bbbf961c2b357e1fd47a74393cae5f93a40c5dc280 +Qy = 0c04cd8ca3ee253b99e44ee6bc0e52d2f016b16f59c738b9f2bd8c1b9d8 +k = 02c851ba0123ff0543808931ab3857b5c15d7c10c343f232913f6e0c92e +R = 0ba2b33550878e223cacb80e45e382dae84e76bca5a2ef8371b84d08572 +S = 08c370f82506e97cc15837f59e9779448decbd87bde0a463bc14b18edca + +Msg = 99d23950493bdd931915e9f9b65e4cd1329866c0071a19d4f7d6fd190689275b7b10fc07503dd1c27a4da274dbeb3aa5cb0e71e9b7b03fc2697729b7be913756e6760098951d7015df181cf14b1e0b954e6260276af553e3e59907794b863e941950718ef154669c5c262946ba120892e0239e05910c2194f712db46e37e53b7 +d = 0f4ab2a573f3771d1e4222e251faf14e06cefed544e804c299c9a8395f5 +Qx = 0b1f973d6495d277e24320622b9b99fccef8eb5c1c6952f35b82d4479ef +Qy = 161dceea4d3c9caa4f640f51b37fcbd5b8932642a94c8e7aaed5db17fdd +k = 034ff28a5ed6958514c603b3af5a991e2e9b4cc2c0a7aa73ab2d70bd05d +R = 01abe4a7b27395a37089f91eab27ccf29001ced1bb3348a6f919d466477 +S = 057449e55d3f2a4004d647ad6e8fbbd516adbb4de40b1a872ad8ecf67e2 + +Msg = 7bef2487bc2bbbcbcc1570bbd4ed437c0dbcbbf63f666a3355aec49ea6ef593da25aefe9ae0d94db50692475425dee3c88cdea975794ac69142c25732f3541457d68d9101c8be069f2b515aadadea2019dc7abefa6c12cb3f76d9f4b5e46546f77eaf636aa8f2329130922111151a4df913d18b7cf9d0308f01ad84d878adde7 +d = 0f4649cf30d4a5269296a45977de2652cb06d3ca2aff4475bb24517b927 +Qx = 100ddcc8e09ba2122a6535c6a0a2dae83abf9e17687b5f6aae7ec6a2df1 +Qy = 048f5587360ee251925b7ed02de82307ba219a707705623727f98346a26 +k = 0a38b2bd0e9a5044db19d4312ec88d19ce1a9bf0eede8c357f898b0bc67 +R = 0d0ebabc8761ea215808a2c3035b14b614f64be0c2741b3d7789a8659ff +S = 0f9e742bdca44c11bcab196f910c0d887e90f250817ee7027f6df8207a0 + +Msg = 87c717eef6dd3c7434b2c91de05723783bef603d170f654b49a04b067b077c405d2d757ce780101b930196ca4261efcfbd3fc1ebb762cc0eecf101072988aca508c41581936526d3f337053000dcf77b16172492c5d654c6612bbd2523a6ad5966d7091697a29ce882fe331f79a7eb59e5a3fe536263083cc59b8133bfd33c1d +d = 0cca24ad914c24c011f41f80d27ea41caf41fcc8dc9dc6dff5248b2b474 +Qx = 0175b73db13324a678b8afe086944a7ad257cd33fe9538c59b9177d1064 +Qy = 16a98ac9e0ff59de1ad94b50f8c709ccf4342f983c7530be64c3f1548fc +k = 029c83def3a5c386b0bc3cf2663b8f4b02f26c6e3e14fcb17e9460087f3 +R = 061df783609ceb355aba3b1753d38f42434bd75c8354029966e7a788be0 +S = 01e8a093f53a1d73d5a994b97f2b2f210125ecd3dcdf77c68ea3199856c + +Msg = 9bf48c2aebf473b3a4a928b3b6a4d2fb7e9193c9e60bc2067f9f03083a8cc7b892bdbf05601118bcc34dd283e7be996bf19b0bd36727eb9d65276b6517bf0c77ae0a9091e7a9e46182a2586eb22324939801034e5ba94ba30d1bde7d8fed51eb71036fab6224f8ff30a008422efcff7ea239ff23b9f462777e62b41b396c5dc5 +d = 0f5e12d536ef327e3b0ba65ac5fc3f7f4880f5968f3340eb8868c1d47da +Qx = 0b2910f5de9475486b3975ce91c02187e8803e68586f3a1df14df67648e +Qy = 0f28af5363ed851c42daaa810afa1fd0d2e001da7764671fd44fb6737c5 +k = 02a018753965bdfda98512c7f9da3e9235a4a77aab9804437b652182347 +R = 0b6fd02b2d84b7baf1a5eb592cde667ed6d4c2c821ca336027a72d9abdf +S = 02253faa5935885945121a374010b2257123cd5db4c54a2aa0e08c8197b + +Msg = 716d25519ae8f3717da269902be4a7566d6f62b68cd0faae94bce98c8a4ac6f66215ebac5407d6f64adf9d53f79f02e50921b6f0e8c805926a839443d30d9294eaa802faa7c5471d81fd1db148cdc621a8dd0c096e06fb0b71943337d5325e1bca77062684873fe904ed9012474ceae5b138e079f941a665a995026d13d7eed9 +d = 08c30d93536b8cb132277645021775d86c2ba8f199816c7539d560ac6de +Qx = 0d69332763cf533d48e56065e1b5255790f8c0eb23471fac9b945e62195 +Qy = 0292df8c77d9a6803f60bf0722ed57ae2aa3bc816403b000fe2940e02dd +k = 050967928d6089da5b16c88b7927de210325c8d8f5e727fa1ba3bd95b5e +R = 02434697cb5c2ad95721943154bc81e2ae16332fa6629788f505bbc1522 +S = 09a5a6792b1b9c2e200ace5a3d50c04f69084dd9222c021ef5fce14d4b6 + +Msg = 01e76755007b2ee5ac9e1d4c8adabad6d0f9c1c08ac6e2622b7c1ead89bd3ad0921b9525b49a780a262fe8fc0904a80391717ad7cac9607de55f7c744af8a132ec45ce79723f4a4a8c8b9ef658b360bd3890df164c9f1cd74eafb74feea251a34514ff2a57ae7a6d4bec2067cbf6ee4fdaabf13721bf9ae178b9034ac5e9665b +d = 0fa3f15a506ccf7b50bbbad0a54d3223f5a95eb54f0d1f4e5d0cc21469b +Qx = 0e797527d57fb3a18c71d1e82e7935e37e719439952d4b972f0c1e0c835 +Qy = 0a345bef4c5015e97a148b8991bed4b7ef48947b12f316b5621e94d49d5 +k = 075afdc12d4d50a7495f5a7d309696dca23e9356a0cab11c3b3d7b8c54d +R = 0960ef460000fe8c761038bab7e29d665100494d0874b6556862c2808aa +S = 08d3c004426dde6c18b1c9ae00a44ac947e36755d8c40eecf47bfa963fe + +[B-233,SHA-512] + +Msg = e95abeeb2c51a8cb75ab74253dbe130b5560cd52e2a63d501d26e1458aa568aca6694be91eee5fdfcf582c47c1c727084ee2b2c810281cf9b095808bf7e7c668eff00a6e48b06df3fe6a445e092c24d5687d7d89acc8063275caac186c441bc697b2f67aa71b03294e1adeb7e557c296dd91304ba0587cda3c984619f1eb4f2b +d = 06400a4830889115aa88b860b3fb65905b01fd126c4aec2785518c2543a +Qx = 1a2051662c1681bbbf6bccbd33c44c7c7fc80b81a1bce14caa36a73f7a8 +Qy = 11583d3ba8f22080488471d8103f868100a97af94809b58bff1435b16a9 +k = 0ceac6e5d10c55888b9ecab8d3f6ada7f4d0bde2f109699157d194efa42 +R = 0c148f2337008ccc3e61501dc5df3ec95d3596d97eae96a7ab085a915d8 +S = 036d1debebaaef50243005e25c791b9674cd6fa986dc3d32e089fbfb2ec + +Msg = bb8d8515365d240b2071daef0d80558fd3d0e059be9f6abb7b7a0a5f47e2ddca7d1b3b5101d5c583143258520ce8db0a87f877a395615c9bf879ef46f2f20f68bbc9706f82781fad69019396b27f292cdc70fff1772e90205a2225f80889f9daece1d03914d8776ac5bad24d8fb190ba10a2ca17768b918c2e079d83734eb372 +d = 0c7b73c324250f14fac0edc941f79bdbc6933ee8f64bf94b847bee5eef6 +Qx = 1af7266ee56bf0518f2875d4f4d9ec508a01769d9c1fd0a885a48bbd80c +Qy = 084167ada99502475478465315bf8163870a9ec1b43f15d68f0304ab03c +k = 03badc9b8098c3b4d7e943a2365093028b579519031a8643b50c0f81eec +R = 07ad4fc96c21963395f56eb63e1b0b4d2c93d827626e7bd4448697ded97 +S = 0e7504e6a9f662472e3e6f18a40f7645922fad2ef7313d600a5a6ee314d + +Msg = cd8b2403435fac9caeffa21b55eaba52d7efee0f89df7142340cdffeb89556303ca01a800429397e2ff6c746743b6bc60a87133274282d4cac02e4ca90ad95d80c93b84163b96296f67d40b2a1124b2b6534ab6b60fdee312fbcdf468d0e84eb85fce4ff360136bb31ced3998d29cfaa3ae685e638ee272058f123c4f35f8b6b +d = 03db7f28e161abf52ab0adc8c4c8544fc989af081303b8688f22b7b2eb7 +Qx = 0ab94312e53832265b929f3d529bec33dbcc5c17b969e0afbe2d559ec39 +Qy = 1d53b2c1be229e2c224e6e9fcb8bb0f044f3f9f5677c60bc9454f36eb06 +k = 034a8f980896284fe6d28b0b49703f1384d799e3f11a04b1e62da12965c +R = 0e374fb355f30d7e427bc5db99ed76a914d6e286099c72f28c07302c741 +S = 08d5ffd41f8a1fd3de6c433635fddcfc2b21809d91496ac17571afbb856 + +Msg = 4bb08eeb202564efb5bda40777d71f1bcc4c7c10b611e803e5c570876f3e319e9e2bc2d32031c56a32fc0d1fcf620d4e4377d881e9e1695bcdb78acba370b849115b86c1c4b83edfa03299da8e7fd14c7cadb81a8e4911c8e427e32c8c9b67e317575331967cf58085cff0c0d48ee0b8e7dc0b49687bb1c70c703a5dad08ec81 +d = 07e9d2fdd017d6da6029e88f78927d9ac9437f542db1f1fa99e32bfcf1a +Qx = 18429bf08752aa470a8f0801170a7ab96adfb168ee8212d76ab0b994e46 +Qy = 072a5071ce308d7daefb3e8f4da4681842ffe0f35dd8b071f0775c83f82 +k = 0a0f330e011d34714875500b70c881ff6b1c9e96da930eef75ec78ac120 +R = 0439bcdb86d40e8f64db5dbead95d85d6a771d811480c5765ffcbf75422 +S = 06c01f64e2812d18b0946ea4e6599e8cfca0a2b606c3c35c803ef2cfed3 + +Msg = 0bce683d835fe64e6484328aa13e18b0956f6887b5e4442fce36ff09aed015889794e79da8aa60b4be565c78685674c51e1e7ac60db6a763c777198a56e382a03aff8b40862f961ae23e8b8683b76a5577769422418972ab0049119382edde9e752b42e8b93f403c1ef8665d7ce8530ce4ed9ebf6d397827cba6b7645e177231 +d = 0c94052760fc74c2b405ee4dd5dd2a7d38ebc16df9cc32df706075450b5 +Qx = 1d2a5ee02d97f82ea9c8833b825cc57b0cb51d3f2a2cfa7577eba676eca +Qy = 149c68d98d0e9cb242962326a26164f3e3cb6d81b51f281474b0f8d333b +k = 0fdd3ade90da682676d40008cebeadb9b2378d8a821e9e9428018cdc768 +R = 0f6d244daea95002daff2ff6513da694eee58f8b6c2d47ad121be87559a +S = 0b04788fbb5655a053d0fb7a38c39e1fef68ff17860442ec8b8ad049842 + +Msg = a6defc770426daad4dafba3bbd2a69881334f7c31269b297e440926db54cdad3fd7ad200f5ada2b72ad221ad99a06ecac9c2563a8deed89f0d0896991d1a652f6fa282affefbdb1c1985652300d1792725071631d75a182b683a48448063c7d2563ec3d430e0fd3acea33a35cd38ec0b5b07af96af71d0bfcd879d9864ededf3 +d = 04076b93487c2da8aeaeb4725fb53b7b41b465315335c18c6ca041175b4 +Qx = 158755fd290910498f6c8eed83bcebcd1fcafef4878c860da118efa250c +Qy = 1781fdae501c2c147eca2c6c809d9428fff2f853b57c7d6add70fcfaa0e +k = 07debe933553ba3420aa06e1bc52a1653f8a19b59c0bc9c47212389442e +R = 09e09c6d96e33c845535468ec7f5b79cf30123538011d0b5ffd935d168f +S = 0963bbae921317666f5852759e9ebf05cd026a5d9f026942835ff0daeb2 + +Msg = 7803cdf4758c199962b62943f475c6c31356f5d9b997a12e21146a2399cd0dd3b97a860b2ce639e2801571599136d4a8cdbfb12fd1a5ce22374991e090533ff42823a2c58d2076b772814eea7fd7a1fde68263ef912681c72c7aa3e5a7cc44ee8c65e72228b7631e600121ea35bfbbc783b6ae3c0c8f80198ada218be533760b +d = 076ddd73ee4fc1f5e6766e229cc7236cdfce312417ea291f7c3328d5ab1 +Qx = 15185e029c0d4eb5102e0fe900ef3c921acc744feb44570a288015d0908 +Qy = 0ed56bf93394a434cd84b521040d40452bb39755da5e273a05e8c0ba792 +k = 084e9e4a9c84a602c18bbb6b183d06969c8b8538e2ff901f1c2794d5eb5 +R = 0fde8e9b1959477ddb3423661df1e7182e4b583849d6d17fafd7dc5406c +S = 01a12bd30e9c8b74912c670c0845ff5ecc77f29797160bd4992efa61f4c + +Msg = e789461e1dad0b6e21abeb6ae2e96385549d1bae39415188c8f833233da6a3328144c97ddb36e0ff4d9e19d84f869e79e609c51b32de59892fb0446dd28cc164a3e53534c950d26f87fb74e682db2038cde778bde06c3ee2eca2a077d8fcc2b0332e352e0e7e6487444a8ad60e78ff213b16fda9faf374dc6d27b7a3c4c6d196 +d = 07e1f8988ad804aae7d09a99be19384cc599e7652c02c391542be74b17b +Qx = 1fa4751e507740a7345e06a8964022fc6caa901cf0c2077a2c0fb86be8a +Qy = 0683c593a0bcd123d958deb6b430d49d5a2386d44706f4149dc526ad896 +k = 01d288de55b90dbe72cd8f1f86a3ffbc2902f4b5f0cf4e641d32aec6f20 +R = 0048d16d87dbf4fb8e994dd874c10d5d16846b9ce2cbd43d09df62ca970 +S = 0e2ee47f422095d629c188df97e2839fc6239b9e2dc26baf8161b037236 + +Msg = 9b58c145d1b6c887f2b25fb672cd49c3a1117224be697c15182d4048be92968a6500f8bcf747fcf33145c13a8d72e891a6e0c4c7310c2b62f3181bf586fe32f1ecf4feee8c2c8bf6c2bfdf9d5f88981ce080095c93e49a772d8e7b59f9cffccec3ca2f212ef4c6748f64e224f4f098334d83108bf6f8c7b43c5eb549f1526897 +d = 09b2292b0244c2aabe8b43d95039984d504ebe05eaff318760e4dee739f +Qx = 12618d89f50b7f83ac470705dbe9ed81beb03929732a3f2aa7a636eaf59 +Qy = 15f0f70c808e053b112a8c32ee422aac2b926c5b6a279a787fddf819990 +k = 0fb38174a83ceb9236fec8ea39be2b3c77c3dd2cf42d140e27838202d08 +R = 084941856a387a56022727f81a939d77d12b01dab603ea0cdef6d9cd6c0 +S = 0bb9fc30595f94d664a590ed4f163e4526809819baf96bbee629ff86bd9 + +Msg = 52310a901fe9681a23dd6e02f12974d57f2c4f653322d9a0ff8b338cc6c2bd9f4765c90c6b3c9fb17df3f492e67d204e39d81a8fdeb92c852a1dcc6151ed6c63049037235c6751c9a902748163a567b714725b4d3995e0edbde03215c645b1a1da3147f7406245432800c50f823a1f991c863427ff4c68e4e16d1b106ee40dd9 +d = 07ca463b50fdd92d9163f1c2bdfce2ee45ba1437b79162e3e959b814cab +Qx = 08eeeb146216c73ccff0096e1100008f8b1f3f0c5754c0abc4ed39f7f63 +Qy = 18c9228b11888edd66b2e661284f583a0e8d3c3e922932cd9fc1568f959 +k = 0025291ec0dc2b0c709c5e69695980564552545c2497636b814aa049ccd +R = 098dc98457ce6e69f77123d5d2460ff569786dd60fe07e847ed5bc14da9 +S = 0cd320afad2a4247fea5b74d78dc3df8967ab3159b4c8b191814d368dc2 + +Msg = ff419c011601cfaf833067cf28dbe6e935ebeddf8b5111a97f6eebf3bb28376334f329cd877a134b074790a073db766efe018fce666a34650cbac285ae856fb6b3b8b96877282bc11cd9f9c8e510ed1f69bc2725a44a1d2b35de1edfd8bc9d20c7525ab0bbc27662a7cfc1bbd1e0f4fce5b88411521e3893e027cc8c73acdabd +d = 0c3844750f63fe0c2e930bc38fe88522f4e72a2fd0db9778ade20e939b3 +Qx = 075acb00b5999f8b272a15a2cbdf8cb630dc3eeb1e78e58f58e467396f2 +Qy = 16711aca424ca335878d273eca75d804d3f009a1f3628568530ef265eaa +k = 0a63e7a20d100f14b8b709f0a6c383166c2151a36dc471f061b0f20dac6 +R = 04063be9d8e4f0f9afe0c79374c69b36910b5d2b1010e0f4db2e4cd23da +S = 06a6eb90659aa79e4a2360ea9ffb99a415175dac6c3efef104bef6fd57e + +Msg = 05a89c4824c5de66587875011e704bc6e06e991ba8f3aed331cfffe55aa266a08c729f77b8d082dca4d286b2d451ea838d726cc2cf298fddf2d7376714c5e37b64506f353917caec525a1209391449c078c5197a371feade74f8fc8a1a1d67576edfda13c14ad324342fc0b09277941dc072ec0d39434ff1cb91fc59478fcde7 +d = 0a3bea235dea86506be4476eb7999dcb8e584a34238c4a894ad6823b93f +Qx = 14093a072c21c44d1c4beddc5c8dd9a2845db0935bbb4e1c4edb0aee032 +Qy = 13286ed584deb744c9c35d7ae7eb9cad1c7ba2b670642de0399b230716d +k = 078eda19f0cced2f84c1a7b354e5a79bec035b8bb279473f32d60f5d17f +R = 0964e817f0cdc251eede4157a9bd830c476627c3f27d2931b4f593b0178 +S = 08dbf34e597ae06ad92b13900a4944e54a5bf0f16f586baad157da6dc96 + +Msg = 13e6b5241365d9d0ef9e8b05cabb3248afd221ec02eab92284b98bda3d9272184bfe5251d35705defba5085381430e99b33a3ab77d7870e5102757d065862372df2434a25556b76e54ebc39d4e6c3aba5cd6acf0c335756f7d9385c1068d4cfa37526a9a58c0ccc7f87a8189176c5d4f201499236058ec061357dcdb5acdba40 +d = 09a367cd1cffd8dfcca179e167ea437ee48e9b6f42559dda9224701d3f6 +Qx = 1052d751901f6f8e61858d3b15eb59dedd21e4e997531ef65622d575029 +Qy = 112737be67ec621509d73cd613d7b448035397fa66eb881f90a6d531ea4 +k = 0d8dd8f1cab623ba6a4e840962fb31de97a4d14aa6dd34dd21154105030 +R = 0a8276d0f069f34c60b26a55d47df69e4c9ae2981afc59e14b5bfcaa498 +S = 09351c4b3a06b839eb2e9f450d9c3d15efa45509886ea3f2610ee1dd156 + +Msg = 139a1a5090b97afb8fecfff8745efacf7dcf91a4393a7b629564e598d58d5be39c05c5830d4c8ca85d29e9e2c31ad0447864e867d0ef4788ac734f8d871daebceda98d449308c2afbe97724c3af8a468f1925065f39e52ba4b7d15728a744b1252a20476dcfff7bcb82aa72c209e72abb3c24419bc26191390ffed340c1b9c6f +d = 046f4ad2522e78b9b35297d28f361fb0ce82306322aedc119251d8241be +Qx = 0b976c53a966e0834d5f6bc3af10a5f12cb6d16cb2303a3c6cee7d35f22 +Qy = 1a1097cb56662265f4f2f52df375d70af086264752477c34c6af522f1ec +k = 06a0d21e5aadcb0c9e3f9fedd2d896b0236dc90e33778fb114e970122bc +R = 068063fe0a31b7e7925cf8959c3486985d98f58224d5f67cd0218af192b +S = 0f11a22ced98173040062ff9e69d1b2a1b5a939eda0a6944e96fc62fa4a + +Msg = 3315e5cda5f252e3291b61e493ab919c20a8af1286d9660cfa2f5ca38b6defe19ebecf820787fe692d04eae8a5f5d37abfb593309569cedf45efd0cecef6951b718924c8380ba52e8ab8c9bfb2261ed5f01cc5a5f9fc5fcdd269a0f122c597afdd9a836cf8f96838c3e8962c1788c3ce4128719b3ef4fc88569643dcad6da16f +d = 0ac82137e9c7a5ecfb8b1a7df9ab50732934566a392a6c8915ee8ca8144 +Qx = 00f7f835f8223fa6c49eaf6650e33dc9d09e1d2bb098925d908606570b2 +Qy = 06e659ce8623767e8214b076d7588746bfdcbbed59b75bb19477366cc78 +k = 080655784e3e31c6a498a63d4d84f7e5a353a66641ca17d4e223441bb1d +R = 07faf31d1d31ef4edac1c63072350536df84c417e0ef808c6be39617e74 +S = 089023aeb53ddd3e475d11c53479863739e62dd64348646581012784689 + + +[B-283,SHA-224] + +Msg = 067f27bbcecbad85277fa3629da11a24b2f19ba1e65a69d827fad430346c9d102e1b4452d04147c8133acc1e268490cd342a54065a1bd6470aabbad42fbddc54a9a76c68aceba397cb350327c5e6f5a6df0b5b5560f04700d536b384dd4b412e74fd1b8f782611e9426bf8ca77b2448d9a9f415bcfee30dda1ccb49737994f2d +d = 299ff06e019b5f78a1aec39706b22213abb601bd62b9979bf9bc89fb702e724e3ada994 +Qx = 405030ce5c073702cffd2d273a3799a91ef916fcd35dfadcdcd7111c2315eba8ca4c5e3 +Qy = 75988c6602a132fa0541c5fda62617c65cfa17062a1c72b17c975199ca05ab72e5fe9c6 +k = 2af633ac1aee8993fc951712866d629b43ed4d568afa70287f971e8320fe17b69b34b5d +R = 165ce308157f6ed7b5de4e2ffcaf5f7eff6cc2264f9234c61950ad7ac9e9d53b32f5b40 +S = 06e30c3406781f63d0fc5596331d476da0c038904a0aa181208052dc2ffbdb298568565 + +Msg = 44adcb7e2462247b44c59608cbe228ada574ecb9f6f38baf30e42b589fb9b157bb0560e5a2aa5523b71cc0d7f583b502bec45d9b8352f29ee1842f42a17a5b16136feaa2efa4a0ae306402940ecd6b71e57d1467c98e7960de2a97f88b43487e4f4016af1292381d70c18c7e6eed99a14cdeb5b3caf73688658e4c5b54c81e08 +d = 09c2804f8cab768248fb3fff8a055b3f4585c00de5c1615a19f9425b9432ea09afba8f2 +Qx = 2570ff62b03a5124f08f752aa71ddc57944cd94197fd286d5a2a107b116d7b8ff1b0421 +Qy = 37714d9abe9aa0a9668fce89a3fcd5cf2e4548102a181a777c9b3f1008ac6e8d3a31a2f +k = 0dab5ef658ae3e2ce2bc5c88a8b8022a0ca5eb8524815ffae414327e3afaea5fcb8a7cf +R = 2d99f82d92c9554722bb793988af0fd0bea776c5608f5939db7c8634eeb24ffd381dbef +S = 27ceb1d01ec9a3ec0e74d79e08024359e117488020de6458fbbcad28b173918fc7d129c + +Msg = cffee6252c7eb6d91d8fe100a1e62f0ad9f862d78ca2b747a6c17b8c9ea8980dc239b3b673310e6e7483582399163e39d889abc1a613fe77849ebc09b4f7f4fe0688b8a9869ae918a88294c7ee199be50ee9460db14725ae70b449d0cb48f30e7d817ec02c0cd586119341dba0b74f0279330807cfccc99c8c340b72c1764a45 +d = 2e625a6bc6d0ce7c06231de827068bdb0abc8ffb57c82b35ee3a0f873b9473905974d34 +Qx = 0458bf39974812a4e0964c31f40083300454104c0d65f22c5688bfff3c256b7ea958900 +Qy = 738dd33e32b9af93ade2dddf4147187a9270543afdfd66a0f2a53d6d3d815ef59795f60 +k = 0a9388815c528fdadcc5d3b125c7a38db57fa8c163ba795ee00e8e307bf760619e705c9 +R = 2481571400ecf9dd31dbd9c905fa1006cd5bc7afae759da3312ead8d5a7dd0c25a37ab9 +S = 13952fa427d348b6347b9e93d4cb2c4cae3429dbea6aafd1e58d5a34805098722b3b8da + +Msg = d058ab5dc07228253707ef224897ea0fcd09c3d5cc91fdce9e03c1c59c53fb4596be2ed929c7455e67ac7f4891aed3eb06ad88f2c4aaaabff045b959f900d1019d706b60526375851bb891494e99995928e4cd51c9616aa651ec77bd7e398916bb9ed3156391bf7fb1e29181e2b011dae2edaf803607def2ac6b194929a57f45 +d = 376ac24e1b86f8a55c052d92a0bdc6472fa03acdcdbccbf7c321ec0ccd97aa0a66b4181 +Qx = 7247c755b23bddf944e29348da82495b4f61d02a482c6111d8698cc77e8dda4c341f20b +Qy = 0f8c199138e1f4f8344facd90ac62d55f3c9a15ba7a672ce40241aa26419af790cf7dd6 +k = 25d07c7afc5a335c2bd7863c1965a48c12f2687b2a365a7c2700b008ee8a0e8e35a68a1 +R = 23fc2837a879b79e470305088acf596eb0159edc2008478cc4c3841a1bd66fab34bbb5e +S = 0a909b83bf77e74511063366ea1d1308a8a544864783459a60fb2669785ab1af8f4cb06 + +Msg = c86f2cc7ab5df5cf1a236fd83792769474cef464032800ffe98a44cf29dbfb6f24088160eb31a11a382ff2a49f3e05e983462f5304272f96c0a002b69af3d233aebe867ee63fa46666760a6889d022c18645b491f8d71b6a3b6b4ef058e280cf625198715b64b025bf0449445d3dd7e1f27153926e617bd2c96638345431d1ed +d = 2b50a6395fc02b9ac1841323de4520292f913519bc0d6a471aa28021322fc4dbcd7b802 +Qx = 696d5ac4bc40e679524e246210b7bb0f93ccfe7dc506ba87be3fd018f829c93e62ad1d8 +Qy = 65953e01d9db8fc5d64516d864a33aa14af023e601d69875ac0f7af92a1e78aff0e475d +k = 0aa25b43329de4e7739fd9134e4f4b3d68a64e55af47a2f6ccf71f518f19059b68d34cc +R = 1338a5dda5fa09667604a6a7666b0e54e6b688b98b31c25d037ddf55ee6bee7565dad09 +S = 00aec025232c16e778f90785ded5348f3d5345b8344b2a762480383777328e0a0b11cb3 + +Msg = c1328d8d2e5b6ffc850a9600bd6482518ddd9cee3fc9140febb72bcd444b0cd7e8074587d51b62cce4b3d4f34ad3355353fabe363369cf790db2df9fdac3a0ec4757e2dfb3b683eaa3e26531691ce765742e1c0bdc0e1028d347b6085fc459df0989c6a144271454eaffe413cae2ad7c8b2371fd2df1afffe56df727009765a2 +d = 24e5889722f6c35e18ca47effa9e415b1ba790066a91fb3c9f7b001ce28fc732b09bc23 +Qx = 7d4a57e6aaec6b51dce5408f6a7fbe9ba9d55f5abe2da55fcf015ca25dd74eb61c1556c +Qy = 2123390178b2992059151afb51ac652b364f562c65451eccc65d968e9e7210921c93c9c +k = 320d2a7f48cf3583e8d7e712b330d40ddbe4b6c128be5a43d72bf57d4227603762de7f0 +R = 09806a8e70742c6c4a9ee6f77fe7a36489e1fe8c442ddf9cdcfa61f019ab9b41241d949 +S = 061fda247ba7c198aa532906bc01d509088d6c2ba0f14ca3ecc5ba36f3595db1df3e64c + +Msg = 7176b7013ea27e94281977eacb976bb31c753bf80fa09680a29128a6fc15234f79f0e9900aff3217ce9be72c378042c6c34fced0158740073d1a985fa25987fb218002e425868fda5a47de51abfd04de34e2b8634cebfbdc98e80f93d94096193eaa82dc8778fc23f3765c7acdad94fdaa272df0ff0f28190c10a462ee78ac92 +d = 056d15b81f40b6378588a5efe43e21b95e18120d514bfdda0e7759a1d0766a8a35ce5ac +Qx = 306cb78fa576bdd2f43cf7b71d7e66a98b850d87ac087dd2e1ff62596a2e8d4cfff1344 +Qy = 3b1e3b12db842e00c2faef04d3e39cdb71546e4e3ecf21eacb6131c3501fa30edcc0b70 +k = 1e8969d6cad41a40d8306d2a8db3290d547106eb59f661e0d0eeb163044a92aee4483fc +R = 06786637c3bd5a95eba5ce015f151d99845255175ebb9e593d912c75cc45723612c4ed5 +S = 384471c17c45ddcf62b588993835bb913be88f7a8e46e52e211972ffb3b7768410bcb7a + +Msg = 4c3642ba040a9955b9d50dcd1c936688c17c363854358afa8ca49c6abd906dfdc4d89bb4cab0bbc363fb5b74e1f004d4b09ec9dfeed4c0bfb482a9061a1f487a3d79195ff7b65a0504bced3a28db0ebe8fcf8ab1ee4a3ae91324d15d890ac4c479144dd5538d2e36d3a587769ee9cd2d5c6f85a03362a022fe0efc4a3902b71a +d = 12fb2fb5bf5f7e42a500154823a174ba2d05af71e3b0cf47fab46e673ea1822f1563def +Qx = 2414d172d74a6281169835d18bfaae91f1f1cdfa9ed451884466e63160ecdd4a2c7906f +Qy = 2d892bb19b47a4fd9d851d3b101ba99acf6d11345596635cedd5d7557427a2896a913c9 +k = 20786f42d77195bea5761f86dbed8b452f858b447d2f3775ba2a4865d738122363b50e3 +R = 334507412368f08bd0992a5d56581ea7139e8adc88abe4bd80dfeefdc7a37a481b18609 +S = 0fd8404df06a02618cdbf6c28610d5dfac9907635d9e5f2887f11a7f18cb8b7ac95b5d5 + +Msg = e471f39c18b081362adc7da47dec254dab8d765f005ac574640d78c14222639245563912d942f3be212ee3cef134407334c8fe3602fa0e1629de5331643d76715dc1b0ffcebd484d86c5211be4b285a31688b205fa988e6c15b36daf396ccdcc209c7dde2a732f5c31c84c7ea041408ebf15e56632583af0131bd7f531b5fc45 +d = 30096c54fd480647e017f8cdbbdef292e799f054e3279d228b09816a757566a744a8266 +Qx = 2d4b28fec18cd888017fd5a27a375131bec3aa7195c0a4f255eeb3616437079e356a6cc +Qy = 27c607dcf0b068418eaa7de8da6f9707650e8d95aec571f7ec794415fc175061b451519 +k = 36880905a376faa594978713c2de1a90c8e27baee65bc60b1fa6508fab5abf843f66ecf +R = 295193f1c64181bdf749987bbc8ff2a188126131f8f932bb8ca952ffa201f109762e18a +S = 381c496b4035bba880225dcfe74fcf101103e38f9518d9427c74a5ec86ebf8f7183694e + +Msg = 8a93fe53e83075c4025228540af7e96a588520da34e3eadeb99a4ab2f3dbbb8f85fe63a3b86c1f4ec912e665ca05b43e869985eae3791b91205afb1380e16c25b74e6793fa63e4a55dcf25dc22d03f09deddeb9042b620434111afe08c5657c7d754af66ad91a1b5423301b1e8e6389a1404060d1b6a99fe0f89598482979e42 +d = 0a1b7e9c8c2dc25b494b5ef3195b294e41cd3c2c35235ab42542bd3e2a52d5826662bf9 +Qx = 6232063dbb66a56e2a92dbdfd9b3c136eade9c214d831691d9b49c56a3962d20f14b8a9 +Qy = 1b47b85bc223fde1918abf6308b74dff7f3e686af9c9d7a1855a1b77984d258c1f9aeda +k = 29b4221eebe151fe758218138535d81182c991c3b7fed93f9a6117e98c1c2f97e546937 +R = 1f8040fad671e2f32a1094413ee955ea5426bc906b8e034d87d7408e63db173b05afbfa +S = 22a353c431a9e9315ff69facfa4e15f6e6ee1be2750472823db31b49b17fc759e6b94db + +Msg = e193a8ef6f454ca1aed38bb67aca6d08280d421b196d89938c0582b7cde74dafd71716f3818940af412d4a7ff3960a8517aee108ae03576b68ee7557d35e6f1ab823d124de7243dd02b542591f62c80d822608572889573e4c9dc62f99d68e07800da6f83cb6f5e03d1f2ac15f90e38b4f25e0a75e354e4b60cc81c0bbe81d39 +d = 059b1a8fb84530bba7a607ee88310e31bc6ea6a6881603567a1081a05a3a9ff87e719ef +Qx = 0b9a71aa3cb4cff37586b1e522b0e332ad5962eec3dfeffcef3851976baadf611ae5226 +Qy = 6b1bf0b43b406b5edc6782fd391d9fb070fa3570d3cd5b2b66d7a95dbc45ccb1626172c +k = 00a77307da9845ec4572a24c9e74a17b76b6393da87a9d7b1b8456235473ff39d243ec7 +R = 36721835be490b5ffc4a42bee3c6d231417f7038c367efd9ecaf7fb3618ae8492906de0 +S = 237833bcc3e4a721e2079e579d1aaf2519c01cc238056fe0c0990dac7fe50e75eaf6f96 + +Msg = 8a99b9db191f6cabc88b430bc2293e6774d5180f019d871839289e25aec29379f14606e742190b7aa062e3b29fe0254146d9614856c5140c7315015abb98ac00da2c7e33cbcc82c24b797366f12767322c4381454d9d1eeaedb616b0ea5c66d1422da459f18081f4f966d05ce279c6ee69b1bf94b8388d38d4b770d9ed69025f +d = 30ddc2c7a4ce300cc2b75f0f977033f16c1f8bb13aae3d494c381f9a6dc8622499ae4df +Qx = 47bdfd7c77ae0c53e327c15c30d90ab1c9b670fe2241dc0ffa939fec3cf6d3c1f493f3a +Qy = 6a286aa2310a4d0468b62f3144a9da2e66d15bf86f60045824278e8986ff87a27611920 +k = 38afc3d11c66eba3441a5ea298fa593eec57b84ea29973c306ac9d46bb8d8e2f4c8b049 +R = 06c830f6c0be99fea4712f1c75f5a4e439800dcf062a16d93135c3255d3cd04bef5bc7b +S = 1eddfda0d0e02d382ae243e604f76939dc21f3ce106243b2d20aa562b78e620fb456428 + +Msg = 5c437b331831530aa94623b1736f00b986172699f0a02a5e5df0008bf25341787e2e66046f2c929dfe0058c3cb89fc5bebbe1025bb1edd1ee31522ed568e7b5b4ca3991afdc76a68cbc2c4f81863e27fdaf6a564fab2c6354e5c657de81390f8a4132669fd24a48580c716b5b7961a9c091f614d11cf45dfdaec8946a54a11d8 +d = 07899928922fbfdb5407517725edf231d15a8b62d90b7fb6d8c8d20424850dc44f797ed +Qx = 614257f54514cf37df2cd78850658a85ee362764ab8186423aa0f9a1ff486557f8f167f +Qy = 3ceae9d1370df045d20f576931ca63bdba8885f463d5c82e5edca5116ed3d2c2b0c4861 +k = 3395493478e69e6e1088166f622a4f9ec7feb998aa552b54bcf0fc67c06079f45a14993 +R = 3f31ad171dd59c9deb21851e631f223584b17f72a6807d5239ae31373512def954d5ebe +S = 28f095ae43ba5bdd899573ce6823eccd8e127c6c03cb59dff43c087ca24e1ce5504d1ed + +Msg = 91aa08567d8da4c90684dc06068f69deae240212842ff1786f04ec41b40d9187aa92c76401f9fcedced62876a34df82ad7c1e63b68bb2a972257ea8542bda6a7f1a020c9b122943b6d651abda8b8d322a8fb762eee376daa2d3637a71ed6c4f5cf96f61c0da2d6e1dda3370d80e51da2cbd8aef3267168c67359523faf910dfb +d = 2a2af63d1171930758bd3e5bfdac62cca1a83a3b55a49b3f80cf0d9ee4b2082757beac0 +Qx = 7dd6fd0868ec478e7e5c08965fa4f1efe8db4d0c04f0b6c63b5dfa397607a0d9d5ce909 +Qy = 54ff4fba9058179a2c61951fb4955cb637b01267f8f08b3aad614738c562f602d498f04 +k = 179482dddd033e8849abfd4991304137044d7433d7bf858a794340ea1cd66e736b821fb +R = 071f4cb000ca1c51c698c867a78961e6d7defbd60109f79d1d165ed045a653ddebabd10 +S = 1e2975f4a1fce0b3b0e13c3f50005fa664ee9319cf774d2e107c406d36158bcecb0e5bc + +Msg = eb5297bf408c1a55e400a20a3c10acbc5c2bc6d6ccfcc0941fb7a6fd4d2834415a6df86c3a6c4b867d1215aeb8222153da8cbbb1576c92c07ca2c36d8f243fd911f9a057e39ee25832454e28d7ed52a8d04169b9b9677a16b32d5d211b8573a8986e9bf36d7206417ad2771daa11bc21fd7ee1029b65ff7c9b2705a6dc9cf9cb +d = 35994e89e13916ad82608f74a639e6aceb756ff913aec440519946d6434af9a60a6af49 +Qx = 1f7805dfc9f90d4f8a1b241dc9d68aa41cb77b63d530cb3733cede23bb87ee5118e5bbe +Qy = 1c3f1aa3a1218de78a94ee8f88d3f787fdc68674e31792d919dbca681a6db1dabe89b61 +k = 2116684a4307c67a3d8c1014b33b928a962a8daf86c4031b0c1d47315d74bad7dab2aad +R = 33cab952e9382dc074d666f1f2ab2bd72ba394a404ce2fd02a6f7a4dc096d713827c94b +S = 33b2886738d882146c0cd715701fe4e8b94b0d28c73a6b79d2899391119ba910bcbe3be + +[B-283,SHA-256] + +Msg = f415d0adcd533dd8318b94560f86732c262ad2c6dff9dc83e2435543f429a2158cd2fbab0d96c027f71008c4895ecc644c2ceaefa80937f6cc6338d15d36e459a16bd9387a361a6d800acfd834ad5aecf442e30b70f5bfa164747cf9f89325b80976052a83a5e896c00c54f81472b14329cf23bec10a8e693005de2a506ba83d +d = 29639da33f48e4fb0d9efdf50bba550e739f0d2476385cba09d926e789191b6fb0a73ff +Qx = 770f9693777e261db9c700eb1af0b9e9d837ce5eabd8ed7864580bfb7672ced8ffca598 +Qy = 68aef01c8126889204aaca8f3ccb089596f85e2aca773634bc5775ee4d27c77f2af83e7 +k = 32a930fdb1ba2338554a252d1bf7f0169d18750a4ec4878d2968c5e735f98b9d0c25edb +R = 30cd65f1097d3fa0d05e1d6072675f1377a883b683c54b8a1f4960f90d68f3ee8c7bd98 +S = 15c61ddf43386a2b8cf557760200ac06a480797e21c92e45e6a311e1a508b03c4d9632e + +Msg = b178d86c9335b85e02178fc4551769db589ab91d823fac219c7e14e2f029753b203962389476723832f8d9631dd7764e6dd35da290afa42a794476f5c7727b3688aced848dabc9954201578cc7b25801710931f45cba1199d3788d64dc0188412e70723fb25b8ecb6718358150c4037b5b81466dac1686cb5270bb1c72d34bb1 +d = 0583a7ecbf2a975a32d07428d27ac82e5dc13d1466c4fdfc1e6a05a8d9a289f1010617d +Qx = 3775ec793ee4bff15027c70d9bb5dedfb7d2e41af8895faddddd4589cc5a00bd222b3bb +Qy = 300f7cd572d82f2f0a2d99a83977ed2034e03fdd76a0267455a524bd8199424ae5b81ca +k = 1e58b1f66c927f4ae16143856d67193d889debdac8eb03936f1b36d550c2f2639e13f8f +R = 0f897dbc8ea12f4370fcd08e8700e5e4c68dff97495f401d01b782f2ebbe259bc0dcf25 +S = 3c32424fdcca39f411663284658b8f0c1f950f0cea4354f02f4b359f18e3fefac0976e1 + +Msg = c8bfe9fa7c848531aa2762d48c153cd091100858aa0d79f994fd0e31b495ec662209a9c8761cd1d40c3d8c4262cf4dc83c4a2549a5cd477726ab6268b4b94a78b1c4a7e700812872d7f41912a723dd9abc305420ea1e1fb1fee41bf643f3a24abd6e8fbf6fde2475e290527724a6f99fd75374bf7cb01b34d3e60d8db33c4de1 +d = 0f817ab1b49131fb9bbe8c112c25a36f064efa85de7506fb9cd29d81b326bf276277f7f +Qx = 2b3a06e07fce1848494d3227ff77d1c43f4ec3c037ad73ffebfebeeae87d3bff7f7e59a +Qy = 75df52e6a34229266ff28b1c217538ae23b3912e4bae8de5cad9b57b7c1c9ca8aabb2e8 +k = 0ac57fbb899193b88fbf4ff2c502af72943b133e8d40459a833275212f6644f566f5c58 +R = 3e13307d5fc2b7ad24e9422355150578c78e1c99a6f9a24f9ca2e8bc6856936c5c4af2d +S = 05e8b77b580cdacc2660e6f8a1877d93c5983d135d63ca0e0b06aa8daedf855c9f661fa + +Msg = 9a5f563d0f9fd1f31f3a822de628ae970954f4e71292492d727109036491c29e66b9b0f2c90c26abe94c08502f5e923a9ddaf6a7d91e9541ce90d0a49f03ce4e4769753d5b7d922e1ceaac4b4cfa4262732a09550aa076b8ff9d46a50fa17de17e3b6bd606698464d116fcd5f1ae11bf45b0c48d3b738427cb47b0d1272b03cc +d = 2782af76ffebf3e2bfc0576b70e4f4bb87c762e2bb230d278ce776310a14f5b678f29af +Qx = 00dc21b3be7efaba5c7f9f22591327f0f97083d4d844415d3148d227931256d026ec9d4 +Qy = 1276f1d9e131f13bb129a1192fa24602fb508c9679ad2124e49c70a891777cd601955fe +k = 0255972b5329863f380de945574793beb0430dc416a8f2543330a125ce8d69f72dbdddf +R = 25bcb54e188aef6e362a62fd88daaacc8e697dceadc8a6b6f804ce4a36856c8da6de97b +S = 1e12e18e1e281606c16ed1f49804f8cfb33c29b0ae92c072d5c41ee3e6836cf1813d722 + +Msg = 3d6b065721da9de82cb33ec2c27107eb399b1e69ac8fa51145ed4147e20d72e27434104e76af988a3bc94f55e36677a05182fe2376dbe38195fc6a30673a4dca87336c7304f3f31d49216fbdfea00fd1e105d8b0c13ab11f8892e0045e915c17dfaab07b24ed21b06af5a8cad4f45fbee5a25bb6e87466a7bc422c0bb896440b +d = 31b827b88f14d3822244809096157df3c0aa99da90c00cd9f0b18dfe306f6881834e6b6 +Qx = 7b3ed076a2901ab2625bf05fa6db10a8c156412fd2d26741738f5eeb6a9189157526946 +Qy = 6a8cc2061352c36f264d23dc2857fbe02af34397ae5130c582e885f50f2c112f141c07f +k = 0b36f5d6da409c4a27f38ff9686cbf5f4714f4e17234fbee6e6deec97c9f0d4c585d42d +R = 356911114c9ff9ae4f3a4fcc5379c987b9d298554cdd39ce124f04707e7fd1ea25231e9 +S = 13c0a321c4c5a1e89dacddae38a9b3dda32a20627e53dcdf28ee26a550797c255eefe6c + +Msg = d125f0e2e6135567adec9e77da2afc6862e28d618416632ced829d14ee8b61116da59dfb44098a40a0b927731125617e3d2f32cfbd1546a6e758c1ab6597e75db07add52ecb61d37da2e9ed04df95b36ac249f4cbd794cb561655cbbe4b34834c497b3d392d78ed0db8db683aff0076fb6e43acba3fa2b91210cc6cf3fa594b0 +d = 27da4916f1c471cff80bfa14d12aa10270fc3b26caed010c0111f6e5a40d914a3927763 +Qx = 7d8202c88fb915446c521884fb756375a2b8d178f6a87306c1c8b67b926e830c8285c15 +Qy = 224dcebb8a7c46902532870ff855c780b2884dbce2956cd34dd6ffef8dc365b96753449 +k = 3fcb1e759418e4539f9be76354cc1914ccf9a111338890eef723431925fa132ebad8695 +R = 0d4d4f23408db58a72495aaec6dc335ce85309fedccb6ade053c23347abdc9e77a81aa1 +S = 129b6b322573dcc79704d08921cb54f31c571573da78cb09d0aab40c4036ee8f195d88a + +Msg = b380f97687ba24d617a42df1b14e5506edc4b62dfec35ed9fd886bb769832cec7f9adae10c21b7cd9152588797b4efc6b2b30a873d3f25e683ea9be070dd69731949a51121e534fabfa3a2eae0ee90a454182248bedf2595cd47ad08614177d58f7a773f5023b538f5f568682c83fb60e3fb1aa859948d01bf7b214e7f2dc719 +d = 10608eb51dc0ee97d6e488a23c582ecf0ea1df9a24db77094d87b3fb6ca98507280a934 +Qx = 399b3e571caecdfa1efb243323159a45618702600b870954cd614e494bccd70e381f68a +Qy = 2e2fc57721a500611badf48fb435a6e399cea356d281e853f55ef2cf9fc5f70dc8b3da2 +k = 0a8045b4f55115dedd8d742545f9f2bd6e5ab81cdbd318747aebfe9f74b0cbc964b6040 +R = 2d022631bb7e05d316a1b130faaca5af5eac67dd25ad609e6e2a067ff74fd4ba534db2b +S = 04595f184068433962d250394680701fbd2e2bd613a47e5de68fa1eb83cb08fb425571f + +Msg = 3f9ec57e4228e1a6ec49df02c58d756515305e48763ba1dc67298be9a1548576c28c82b4e9b3f62357d9b3c522b16d5c496a39effbdc8290edd2cadc0019e6b9fae1e61238b13b6265ad2ff413a5a0684babdb0013e7632051455e6fd943815213c555dba96cba8911e006bfddec6c3353065004538f37e48df9e339498d85c6 +d = 123f9eb8babed548df08cc3afc1d3b3bbed52b538d4654f2088fe76062fbea75b85a560 +Qx = 3b2e980ae7a847394720a9cb982fc1e41f9381b0f2e08b87fdff1bf891b9637cb22485e +Qy = 4a367d593edfaa4e17113b6b1ea3ad185b3155b1bcbd9f00f4482e509b43bf7eb67a448 +k = 2adaba166d703d4d2d431a26200acea7fb47216fd04882f91c5730a55c349770d58a452 +R = 2c83e6a7b4fd48e1ba4fda8ed7891425213764078926d8862d0eb64765ee2900b3deccd +S = 3561a949d583b7de9263d07ac427bc175b75dc52f43f3ebedf996218c94e51684ed5f9f + +Msg = bdbd7b7bf3337bd9d21a3c6db379f95408c17e49dd394e94737ceae889f45dc0ff5d48cadc53703a16b5589939506b548f8dfd34c577c084f372166cbea320c8fd07c809b211e0749ea639e68f890affa1569b66bd763c7c710989e491011371eb1d93ed9479ff0216b7f79c901a2023e2cf80b565d1c0517e73117190cd2f02 +d = 06a18e626452111922e02e31d662f4301319946a204ae8a34f06b91dd1b5b96456365e3 +Qx = 77c1fbe6a645b85fa0316ae412e8dc558c7c066d9aba900650749eb7b14a149ee57a259 +Qy = 1b2f3002ff4936653412c8ccb8a67dcae18d78dcf6dcaaa75061013d2134af2c3fa0e69 +k = 21bf4ca10d03a93d4675baa26285aaa554836bd0bab6e7fe42600ffe9137d5e304847e1 +R = 20702aa5b5cb45cbe8025b4ddda0a42a1ab746117d45382d018b2055b62791ad91abf54 +S = 12c31f9bdc096236d3ec46c4e6cdbcea47e4fba0e28d4df0fbc19e8740ce6dc0577b242 + +Msg = 436b288512ea57bc24f84fdd117da9dc1858bae8c11637f99295d88fa9d05e3c053a2584a6fe200ad190b3077d9a1608f660349dda405066c1562f6897ef69b6b674d6bc11fa470d0b96a7cf8f6e098c9ac03b0ef415aa045867ac7c11d16cee78ecf08850ccabf70f761682b561d0d0e4a889d840dc74932648ca2fb58259f7 +d = 3307fd717015b12a2dc76ada21442ac1d97519f66898b214c2ea317ab0f0905e819e4e9 +Qx = 4ff9b8d60ed177df635a3953c0f5f5c0254224bc48d34329136706d6e8fa1b16ba0916a +Qy = 2e50ef73f43ea9a5ad07c6bd68a82b7239534e195ee929aae7788c073dbe9e968c2828b +k = 14d8339f610b348f4639ac20dfe2b525517218f0c71b1908d407603b25f19971a1b5b4d +R = 2acf3dc4e3569e5038fe97920de626ddb36bf213afa0f939785dec8319eb8321234c574 +S = 01db40fa416527266a3949211fd9fec158412c447c392ed6a7c7f159a1129da864d33be + +Msg = 672faa156dc188bf16bf8933d65e091c633f294486049ce96a4a403dca28a149f4f840e8bef47412285363e9e89006614b013a41baad9885f1d9980cc897ffbd5f8a7d0e63feaeb42c07776efb307ed680ba1cebf470dd9bd8a2a9efc2b1daa569524394f9a50398add1a5bd2f7c263f9e63c2d49461acf98444fd23341ce78d +d = 14f9f412e3c7d770626e800d43cfcbba3ae6aec8563af748e8a97b67d244334b6e6d2b3 +Qx = 2293b37c84e7514564635e517bbdb9bda0b4a41217ca64c38e94a4bd00753255b4cc389 +Qy = 088c10bd909964ecfe10c373214544c6f60ab85b8f5545afb0fd2ac03d036db7ea9e67a +k = 19b21a4d73012dd2a2ec3ee280a9b855b89e6ad53438431cdb5d2cec0e5ba21300e9bd6 +R = 3baaac69d182bf1a12a024dbc9a52ba244a654716e2756c36ddf8ca634129cf9d2b23b2 +S = 13ed92730d0a6d75f2a4a56b39f82d063e1be988dc58f0ba5f553fa88b6510116005727 + +Msg = 4321334cc8ee44f1cb392a4b280a95561809dd3639ddf43b6e11cb73067597988d95b8643d86c76c3c6b932d9262b9b8b55a04fba0666dd8b8ff1e8fdf799ae3945b6e30d3af3966f1a6d634d5e012710d66cb447fc3375130968a2e1e647780aada2609d87247c90338dd71c3bcc3902311caba27d5d4ea4d73ccea960d4bfa +d = 3091a6a8bdac1e43542dce752694972e734dca31c061c7d1000754296d0748055db3f09 +Qx = 5c0761d01020a30c478617313c67008a1332a0e6f295c5a9f01b3411eef585a9dafc693 +Qy = 0eadfc6f7bb9986b0dd221b77b54287042ae8d1ae5788706b79a354fe785c66145bfe81 +k = 0afb2e2e29b26a686368b127e38c2f5726fd55a13e9f87cf00e831d3fe19d9511d07e81 +R = 2685f634a8c16ee79acf62b7a1fb3acaec0db47c6ff5f2c97a804e9550494b128b2287b +S = 12b545bd76b8d2cdfc5452291d5e4748a5e981c400daeb65c20812a65bbe936bc613219 + +Msg = 2087e22094570d39fa937f15a3ef0601709a66666344186a33b487d041793fbb9709a95af250b1df0762ea98e911aeb3ff1fa19f0aca53fd4179e454e0e91636e55cc5b17cad9e1575c82ad265dc34c4a66b7a31ecb9ef9dc756f2ac1d9dab35369a6bad4a0f47e629daab91addc6d297d1e5d81477b3966d8c3b607ed194d88 +d = 1195921b91353db9bcd00510efffe009c94f6bd8d790f5fb3e5a0101c9ca5d21c6ef2eb +Qx = 5dd8aa95e24c054d508bc5081546677b9a8e8dad40d3f8a184af7cf07cdb09ffa2e0498 +Qy = 5032f208dc3bbad6aaab63211e13e17656c750c6c2a6e3caaf55a7c30ae5ba241d8641b +k = 3223c6439db7255e89c28aeb046e906ba79f4e9b8222ba5ec201b964d3666301f74967b +R = 0fb7e194dae6420ac447e7d4f882da3c4859f53a948833a0a08f918acbe03c2e915d1eb +S = 2336f1206b46b3166b28918bdc1c817b22ab16b355030cfd635ab3dade20d2dbde08b6a + +Msg = 15c7bca449a73b03bbfa783f5a91ca0b7916889a5d99d541e2e8593c3b176a5b634ba20b34407fbd94ae1c1398f5313cab7402f3bcd7ad277a8c66d09a6df5dd086b20a0a3823fbbb80980cd86bd13e527eee15656cc977103e80113539e26695addd9eef6a1f56986168d9a53f8b5de833f8962c3826cca106ae9e8c00208d2 +d = 29dc20446e9abacb43823e12a83737b46e6e577466b5a3925e0f9d496824dadb4d4b50c +Qx = 4b3c1d41d8172ba15fc92d9586f29716821ea82274ac8e4fb3452ccca3e34925f1e736c +Qy = 23e22cec962d759bc659841f259de954911aa289e9994bd76a30149a73711bc41b29904 +k = 0931ef56f08c379d1ddce0649f45ec21eccf3dcfa178616f45b200a06f82172b91bffe1 +R = 178348d533217543af694c8d3cee8177e22740b657bc6ce6df9e57f0c1f14fc9407c440 +S = 3eb25dc4ed42495b54679653ab1cd4d61c854207994a7318026afdfd44c89cda9247388 + +Msg = d12fbb82ee7a57eaf76b63fd6bc6c0a65c85f135f019d43ff7bc295cad15d53729d904fed63d69d3ffe8b82c0ebaf0399e2717ece40e011f710b5db46aa457c23b85545953398b814816a1e7a8ab5b0b14c4a0451b0bda9d0d2ec4a374bcaae208b7fe8056bfa17d6b7ffd4ba2e9179f49b9cd781b0c06f6ce3eec26cd428cb6 +d = 3b9b77d19a42e9a555da8ab70aa5638890b2ed21daefa28ca6323fc658662dabcbfaf52 +Qx = 632fdf8ebbb755c960ebf8fa5d6b679416e488faeeb021c0782352279a7ae00eed33094 +Qy = 41aa517eff6854ba04e2de6794848823e53ca580353f2b25e45fd4efd3a369cf80fbe57 +k = 2450beeca6f1ebac3e82e3aa3239a5031f54ffe65fa6a45e2bf2ccbda448a2cf6988141 +R = 28664212774e23b6513f73a9b2da97f5eeafd10efe742e314f6913a6d0c0e3e581cc6cb +S = 025bc733edffbc1330689e7aee0dc121b64a72dff19e1d7c5990206d6daae5bae75d0b9 + +[B-283,SHA-384] + +Msg = eab0a37915c6b43b0d1e3ef92e6317b3afc8b8301b22f6059da8271fc5fe0e419ca6097daba213915855631af64e10d8382d70599d903d1535e25cbf74da3a12ba2f13c33a8562e0db03edce791f1d39af8850fd1feff0eb25f9ad0a86dfab627b96e65831bffc5f6d9693d20493bc9dd6eb3e9325dea50b055768e8aa30d49c +d = 0b9f8f3e89e9c1ef835390612bfe26d714e878c1c864f0a50190e5d2281081c5083923b +Qx = 542ea231974c079be966cf320073b0c045a2181698ae0d36a90f206ce37fa10fb905186 +Qy = 7e6eccfe1303e218b26a9f008b8b7d0c755b3c6e0892a5f572cdc16897dcf18433f9a10 +k = 31789e96e2ae53de7a7dbc3e46e9252015306d88af6bd62508554f89bb390a78fdbaf6b +R = 0fba3bd1953a9c4cf7ce37b0cd32c0f4da0396c9f347ee2dba18d636f5c3ab058907e3e +S = 15d1c9f7302731f8fcdc363ed2285be492cc03dd642335139ba71fbf962991bc7e45369 + +Msg = fdb93afd5dd1e3eaf72c7ea9a6cddb07fc2054499ffe152cb2870163eee71ace5bd420b898cb4fa80ea53fbbaece2a1eef6427b632320e9c97e38acb16b62fdbf6585b54fabf0a703307ca50f86387bed1815a05b0c8991e0743d10cdf49c8facfd7ddeb8d4a7b706b5a29e1d00ac88b0ee88b3153185495ac8388cc70104154 +d = 3a30a1c15b9ed71e102341f97c223a9b5ea3e6a335861c3cf407ef691a18cc639dbe74c +Qx = 40937b263c87461eb5d409008255d4e14c54d7a86d6e3eaf2ad9c559f7a6b9d2582542b +Qy = 7562e3a04f22ad37a1df0250215c163b45a6bd04a4b96c30fe2e2b7ded5486b172ef09d +k = 13e745c76b33e6e91f47f8423653b0056014841f4df890121655ac2044f3a6d58b9e213 +R = 22467497bf1b5d29476f24aaf5f88d905be7900406c64033913fc88601c62063a924456 +S = 19cb024c7d6be51d15337a207e66fb0e473956932faf6d755393dd5a899bf63610ff887 + +Msg = c78e35d1a5b1bbb0ec21e7ba7b7c74c859d88f3e100e40ae34128cf093885dae4e87cd09f3239dd8e79e25305220880dd352a650225d9bd193b9b84e488c458b0b5fde1af941c0c9fdf952d2fa41f665918dccae27ab7923da4710f8c27ac8ed424992568dd6f0a6c3ecead21650ed162e0292104eef3c2d8551be866a88d279 +d = 083330123cc64c11888c1fd388629d0b329a50ef31a476b909a182c930ff02d0c389b93 +Qx = 2e3a3e712676bede22893a8911ad6a683306e86487d24585bd6fe4f2657281f0bae2dc8 +Qy = 773889a95e9bd579be379fbf84dc8d26d47335253356e5b01c09eb8ed57474d6c0b0491 +k = 0d630f20623e93c274239200393cc552d03da6bb9e74f4a44a518e2642e84e761dff7a9 +R = 27b8997fb98ad04488f5dc8ae5dc88b2a3231fca76d7320550c74cc540110c0cee5d8fc +S = 1824f1050e85d527847faff236b7195965e7b93343ebac889b23425dc27226d50a5266c + +Msg = e05435f695997229cce314e50065f3c5f71981988dddccaae6efb81f936b22cb48813f506d1edf5ebd69b0be34f278592c5935f0f6db0cca1ef9d62834fbf3c4c03f4da0596cb4d67b7b767e85dde7b7c6fbef7d89babe6f97b876b33594a9e36ab87079861ee556fb03274ad4af527342a4794192b8933f28c6220f954c77de +d = 1dc2b656c207eabc9e0d6272099babca8d149c9c4258b779c2f06de75f76d77505271c0 +Qx = 2b03407b65809825a32ab50f1b556a65c3bbbd65cfcec898514637ce606182517fa1a4d +Qy = 21c97e293ec74dee17c89b962356b7bd50c7b23fcc30ec7fdd0a629d11373e28380a8c8 +k = 2d0dc9317a2af5a7d0a23c00d126b7fae4c06bda0a5c50462ba26bddf575adb091d0e50 +R = 211c396875b5dc71ba87ff2483b0ffbff60cc3656132fda7422a81964f1bfbcb5ecca23 +S = 0a0ed7bf1ca853b9b19924c706eff373b97585b692b4b535ad71cc4362073caf8f61a3f + +Msg = 0f9f36477076c4b5a7d1ceb314a397fb14646695b0803e36e98908c8a978770269f165a1fed8f4b655d4efd6ad283d7f5d51b6e1e302d360e8ebf4e887c7523a757ffd55384e114bbfc6b7a0ec8511079507b919065ca018573418f9e394854c5704227772161707b4d0246ebceb91192f0eb2ea994ce61fd98a6d14cc8246c5 +d = 0081772348ff2d7a3fd57fe703555ab2e14f5d203c4cf0292f944e827e884d95f3b1d83 +Qx = 3f7174e88ffa8bc0a770fffa4bc30a436fce331dbe7154f6e2fc0cdd09e76840f089b3f +Qy = 561e6aa3feffb2033ea716ae94b9a7402bccfed1fc4a137cb96fcdfe4685314f73a8bb5 +k = 3a8c40754ef7ddd0e289b2cdac5e06c72dc3d6ae9d0351d9295aedfd6f0e88809674bae +R = 1443b46c0e6bce31642dcf3037e25b6ba2b42daa9a83f5c0bbfb2487ce717c37b91f46b +S = 3f59d5a925fe19c795b4992c265a3c61b2452237eb34efb9aba30208ce07d1ad47e2279 + +Msg = 1d38b1c342b6611dbaf412a66c1c0b8397692755f576df33b31c2bd12b7f0707cc423376391f7b00aa4e7b7fe54532e2b39c3c5284b9c8ccce48eaf9308ed338992f1d4ecde6cbe352e46339d7d602942158387881d9b493fd40cc59d4f9b53ee4191d42352c6f7bf32c331f0c5afbd44a92901a4b713c7cf6ccddf7de4cc6e4 +d = 1eb6bf2ca1b5ffe6f6a795733eaeed12de6e87c53571e702635b9dbd0d96b47df4a005b +Qx = 0e64dbc1a08acf6ff0e820593cad79a46e3bd818ddef5ca0960fde799abacc7b840eddb +Qy = 6115d3de2bdd011ad053550471368581a5f125eb0d32090646fe4407980a42988e551aa +k = 3b28fc6d0e4a7fc449b811b78900fb9f89885f4d4f70cb5a2b3d4f8ab87bd5448f4bfd2 +R = 2601923909c8c953087b0c0acda57d8c01f814dc9722171d8409d0acd2fa4d9c1314693 +S = 3eb316cacba93bd473a4b4acae4f2b5a5b2ac9856519032e63a0c718698956e8f35673b + +Msg = 3353ad05ef90e9762bcfedd6ef44a1e8ea0392ebef30cffd48ae620f3e567e1cd44882d514e7c6759200d4bcab18afd3038c3d3f8c50f7bba32a04eee5a4b1cfb8c349939e4efe0a46fd047d02ed000d8fa1b98b0af5586f120d9ad174b3aea33905b979ece1eb3660b1e070c8821b32df41904ad68bbd8ed247aabd94066f16 +d = 3b2a3e65e5a306bf8e3955b60e856dfa9bf68c1275a678ca056207a0ec67c96eb3f8309 +Qx = 2c542cef892b06372af7d9c321ed5309995c1cbbf1a466e70bd30f3856ab7c5d18f4e3d +Qy = 2a8acdc12a7cc0b54f4dec9cf61c484a5cf86c4cf6cb5ed615479123ef1c6ecbb6c7ae4 +k = 09bb5e49188621466440a0841b007525000c2203d9821f4c6afab63ac2b97cb5e2e3dcf +R = 00a09da1c4bedff47945898f4f4ee9a0857bb56be535544aff9d729ae44e23d678fc71f +S = 2390be08ba0861b32ca35ba27a0c8dd1a4e96d28cb007133a096b52afa0126bf2a2abee + +Msg = e7ec162185fe9a5803c6b03d98041422315ccdac67e48fbd07a1ef3c5661158710abc6791bd0a75d56791b4ac0e7695d53c5989d9fa6a3b037583b2a80d2b154b024f1c36b63548be9afe1d51f2f68b2ba94d4ca1e69a35ac10e15ba72242aac20f7526b12ff9d3cde9a9bfd70d55adf9bd92c66d092d7d08e9764c84bf7f329 +d = 1fd4d1af0bb7c79ed5fea7bb45574e46534387bd916649485ef15207352d7302e81dc01 +Qx = 77057d3f93011440a78718a3cfded73e4196e7fde96e794465c51be8b679f912c10edcf +Qy = 59873441c590c43e0f00f80afad5b0166f94b62214ea45da29174874e44356b29eda6b9 +k = 3f224b35737e78ec5bc9b081a601d8fe19e33b4787449d3353d2ad225358211cf9f7f0c +R = 1a7bfe92c30ed1af478282786bdf7b5b89cd0fdba5e534bdf13899dab5af108803d73f6 +S = 2ba14810de4f5cf48b56e94bd6c439d230dfced3cb698c77627f59faff0ac5a42c43067 + +Msg = 87c8f2e3f4fdebce0ca9300fc1ebcaa934f51a12b6b8f2cb6bb6eb77965468663044afeb2a1334cb5a81e74b8427267f8b34b5e9ff0cf157a9f18be2b1942e32ca61dc23ea13c3f9fcfa16df8fe05e067938b6994982676463fb12842d4ec532cb904cf222aa805dd0d86ab9a33a83e294c6d81e8dfa273835e62e9041dc8ff6 +d = 20380b1136b5283e9b7f54b7535ebda33b129ceb177bf5d3d07b1daed5edd9fb3862530 +Qx = 5e7d0931db006c6abe04671d1aede760f2b1ac5c866570f8e5a24ed356fdab49cc5cdea +Qy = 7004920fdb0a744cc545068bf82bc5d7a46edf9265fd7c5979b9559f5421c9a98f6db89 +k = 3cfbb1204caf6011fceb8d4be987d9a41b81bcdd95b94919b220647d0e7a18feef4cd01 +R = 07096beda28c20d2e62d9b0750142d3d21b54c38c7fad1ed65e4f9b386f3dcfcc43a3c2 +S = 3d0af02aa39e329e4c39f2a1d6797f0e3d14554dedbcab9abbd158273a3c7116225abab + +Msg = 2ac53e8a50c4afe3b38904255b7cbf150c5f79dc15932dc0ac9aa631521f68a0d4b6bc5a04d55c99a36531fd4886a23a8d99f262ecd2a9feea925d7a96ebe9b6979a207b7f9378afbe404fc8e959b0333572a2c911f8743c0ba64eebc7ef12fe5435d2cb0e5091ae518b6e4233489efe3c16c6f21abf4e2c6808b733914e5a7d +d = 19f815b98836948e0a0dc9c30828c31b13e175f1e79f23d084ae1bbe64823f4866214b5 +Qx = 5109d8ce934972f5520101730d0a14b99213ea17772e3e7637d622a5de13fd2ffe3bffa +Qy = 502927e0c7baedc4bb3ed2bd1b15fd2d06dd43424393b246dd530d5d8598b56dfcb3cb7 +k = 10359d5cd8a9b7532c9902bbf1cb83d0d34bf37e73e7c0f5729b62a10bd4d8faa0f53a3 +R = 3503410a6feec71fde2feb14375d50f99ff9a2c8bef47e676bcc6c3045efa9948891ab4 +S = 159b1f65fd566ecfdc08b87e4ecf99ceea3088a750e2c3c9d868bb432de6a61f289d06f + +Msg = 0b201469cac4c078f587edecdcdb6efd5752cb4a3f43ab540463c4d908c27527aa3592f2f9acad85dd94a3c056bd28618317ebdf2e7dd6c5ad26fa3c31dd8e5c50c60418d91c93bcbb59ec1adb1db791f485ded78a5cdcddd23dd1cfa4f13443468d8a5f2d648059b9c4470d0f4fe7733d56a28a2c24456b6923703ef32cf0b8 +d = 01854e954654e726cf4bebc0e5a840e8809fd716059211c6ffeaed36829808363164684 +Qx = 7a6e7c542860e815d3fa24fbaf99989e8b9c812b08399056ae4f9a850a6711a7385b622 +Qy = 0dde6bff33891a64744dce6456600f5a6a11049906608e77f8afc38b922972c805af258 +k = 2c9cfd376903122625c7fdca50e93d4c216f0c7d07f33b3b51e54e666e13b67dc89d290 +R = 18321f9ee35d47648060213df1275ae89c2ec7d17abe8093d8a431ced23aa61d3f8df4f +S = 09e5a05a62b006a7787c97be38df6fb9fbc1433aa2241b5a788fa727229a18e07d7a8aa + +Msg = fc5e4dddf4c4a328b685035ee79069770fbebcc56c14e31afb4bbcdd5220e025f31eba794fd6c05e64f19678dab33ce4f084bc32790392f14bf35669d75b6466b4214ec30d58ca90ae285c9058f5804a1fc9d7a995958f2a0e84ee52e8a78b601bec04ab607ffc2091749cc548c6754ed14e2e5f92315bdacaa7a12823ef76bf +d = 3548f8020819588b3202f4c1ac62eaec6a47c2a19b2900c5a3cf5b4ba5804231141c647 +Qx = 38563f2482a399bf1c13f42f8b85ef64a3599c22da9688b97530718bfefdabca3ae8637 +Qy = 5c4aabf6d8a90af345008d5a244d0671cbe1afd08000c4eb37702a9bcba6dbc058ba6da +k = 32649876d776117003305f0ec9cdab5cd84bbdc747d3dad5d8d54a8fdc84d519d50df45 +R = 1f5160851981772c502088eef209f7f89a7c8ab35e630d16330bec7723e398fb37c84b1 +S = 073a7333a7037e1257d4d70be87c30bef770f9d728dd7e2615d47b399ec650aedc867c4 + +Msg = 284cad790e6207e451a6a469cee3befc3ec43e047cf91b9dff1485718aa29de36a43f7c51eacd8589f0c3a96ec18e8ccfa92941b50b2132e3612d5b45e16f60d411d1c53e373e1ba451352e28970ada9dcb9802102518a385dc571dcf6900971b00346098a58042e0d1d129bd6801fa640a895a458a45b31318fe63ebb30c6e3 +d = 3cc4505005c41142308f1489226b7b542e2e7f24f1d3089ff6b92a4b0013f490ad52e60 +Qx = 280b77ddc6648d9cc3f5557d406ea2a089c8179d4320781b2eb76ab07fcafd2535b91de +Qy = 05f23bf4171aabbf0fd50049aa017c0dae70b065964c685bc03b958cee2fc3249149d31 +k = 2ef488215648524f6caf85233736eddcd9d1d838c6a2799c3a68580492d40f9800bd119 +R = 3e8e13db22c97281307edd4037f0a75d2c70a070614e94e02c860f36a53aa738fa0db2f +S = 356f2651b51a6be0c697300a8c2641bfaa1795397eac208385c3729248e36baefc173ae + +Msg = 6d46e57abea9d115deda48b69fe8e0b36144df2f6a659509ce1b514c8cc4769d46e5f71df2a084f1db4a22fdd3ef0c2f90394f2898ce291b9f279c0664aa01419f5f6bee1fc1299871b27ecd57a5ac548f99d01871b8c238a6b46044c953b2e78e22346a0c7663af4db62799038ffb5c21ee512e26d01e70a4ed967377ab8405 +d = 144a2fc8e0aa63506e14e4307df36416f963dd9da78655832f5b991af8c3eb97df78efc +Qx = 3fe8867b560bfb21dda517b8f4d50578a11e1d0ab7ed4ab3796580d31bdf710e8e22284 +Qy = 5a302baa3795e2d132c55d90858d14d4b17aea0ab70632b135f94bb23112d163357f8ca +k = 0b5225132f19419715170f5a3f26919b4127a05b4f0406f895af1e4bba95786daf95259 +R = 0651d17b00ed9a06bfc6a913883b5cdf51bd5f2dd22307cc5ad3bb545f623516232bb6e +S = 01128d4784fc0fc050af0b97f859616d764b22f40734ba65aa15e2cf80e7bba3d15f42f + +Msg = dd750b39bd8753f4e473c4484e2b36ce2da7576813ebe05861c339ffae1d029bc793173ed394091c00685ad82f0550cb21ed1c68f0c27cb7396922239cfb886647af204e88a9101b7453a8ab662e270b87a8a13f2fe61d695597382cabeb781933bebfd7d0dcd33f77266e43e32d937f2dc89f67525e522977ce73e9ad36c8e1 +d = 24ffeaf139043ff25a395e4c560c7680c1c2155191378917eb25194136b4a69597dc277 +Qx = 0402bf61c0e36385e5fa8371a553ed8652466fdc3ed9d4a3ce1bcc567d1f451f6703dd1 +Qy = 4dbea6f67e1117116f30fe42e84383768b0da770f8a2b4cd8a4fec330a0034554a13808 +k = 3e4e78f012eaf1778c086a3bbd9e996da0ddde651236ebdb6348062f56b36f63a901561 +R = 1e2312720f6fbf44d7a6449a7f30019c38e69f2e6424d4bd1054f40798e9fe58d080b86 +S = 379d1b610a976730dfdf3300280f1c61109ad13c788e8f8f9a8d5e0130ca9482ee417da + +[B-283,SHA-512] + +Msg = 4736e59fe5812f63737eed57a570182c065538abd9fb0a1c9c2059199e7052ba57d84b5fa1cda2ad9f216610361ce1dfb9334816b6bea509283756a03aaae2e5b0597f492d078b6b015a40c9785dcc5d2ae266176980db04f5cffef40e16661a50ef871c5f531d73fd5d114fa19bae9dd2da4267a131fc31849da38c2b78d1af +d = 1d1f2e0f044a416e1087d645f60c53cb67be2efe7944b29ac832142f13d39b08ac52931 +Qx = 10b2d7b00182ee9666a6a2bf039c4358683f234ae41a9e5485fd6594e3daa880c0dfe0f +Qy = 0a419b2f40e573dc2dae4b22e6f56e842e50d631b6126153178585bd05a8b9e6e87e4c8 +k = 3e4d36b479773e7a01e57c88306404a46b6e62bf494b0966b4ed57e8a16169b9a1bbfe3 +R = 30513169c8874141cdf05a51f20273ac6b55fe12fa345609a2fede6acbeb110f98471af +S = 33fd50b214f402deed1e20bd22eba71b156305e4f5a41ab9374b481ee344ab3f27f4bcd + +Msg = e573fa7d4bf5a5601e320130de91f4ad87eb7ca6b8998488afcef69c215b0cccd221b8b66eb0af9d699af9ad6c4b4a580e82941f31e4c0a9bd83995dd076c5ac9bebb34481061e7cb1b26f6e8c6b26ee4bdf9887f7ae2eb9fad3115a21dcc96acce85d23a040c0ebbe0a56e75714dbfa803d6e279b2f4280bcb993f96ba321e1 +d = 1337362609df74d25f7adee382225e6a04dd6ee4c6b45fa31499ce9edb0ec046325caf9 +Qx = 287b288ce6f65fed9f95c99fa4b8c1aaf6de65ca563df30ac67c1066d2ba2f5a554e09c +Qy = 25567fe183dd400d256c333da92dda2e364afe84492ede9fa0e913ca7f12069b5a44b48 +k = 31b84ec438302155f2e84dd118c0d8479267f8d19c8c5d96d21177e20b23e0180dd6d33 +R = 08133e49644044bf9ba3b4c8bdc3973647d650c58fae4a7ea5a5fffabafed56e759010a +S = 1d8cc410cd04b188418b20cebc8f66ab0dc29a42f9067aa2926dbadee39abce79deb396 + +Msg = 7862864d0d78b44e2a28af44a0a16d8e9b1b8c4b794db0410c0a863ba011018ef43e1e11f2fcda2f56fdb2a69cc817df425c9cb3b458922ba00d710190cae16d61af3c304a42fbb3d0c4a74a297253fccd70aca414865b41f68b01c561be281265fa89f63f975d3101334886e85929a5a47fa8dc459b663548faf8ed7484958d +d = 1be00aa0afdfe92e24a2536594d4b41701ad4dfb223aab35ff49310bdba7566057fe8ac +Qx = 13583d8cd163fdef7c11e91f36c1d3eb2f7957d219244db883708a7c5777611b0066812 +Qy = 7a1f4df45073b838277d8da7daa7147b0f10aa98b5ec02fbbf97c89ee17f3a7ab4f3f27 +k = 26b42f369ff9b2740147914a2698cf1ec9bab44caa3b5f05957ceb9a32073729aef0fc3 +R = 37640dcfa11483b3754ea027f5f239500894dda4f4c8308f0623db256eba2113c41ae61 +S = 2096767a1f8210b175334fad61b4c7fb4e2d6c7811b5d22521af7750f101077e2fd4e44 + +Msg = e73c96d1a84cf7cc96065b3c6a45db9531cd86a397e434072a38d5eeb9a90f62bf5d20bae22b926cfe967647d2bbb5dd1f59d6d58183f2cf8d06f4ac002ead026409ca6a1f868b406c84ff8887d737f65f9664f94801b2cd1f11aec336c0dbd4ec236d1cc4fc257489dc9709dfa64eae3653ac66ab32344936c03eeb06d5852d +d = 12ad0aa248db4fbc649f503e93f86104cb705d88c58e01d3ae0099590a69aa006aa7efb +Qx = 08d262f57f9528d55cc03c10bd63ded536bee9ecc617221d9892ae1a75b7cdee175cb33 +Qy = 754e40e8823e89fe23dd2748fb74e9e93c3b33f188f80377a32bc66f6a92da1804c04cd +k = 2405a351a3bf9a6dd548e8477452c4d9d719e32762754cd807a90abddd3ad380e197137 +R = 28c5d807ea1c3ddb7f2c90f3af644c5d6a2757336ae46c2c148752a2fc150e8183cfd83 +S = 397c8c52fd67b99792229194a787518db5be8e8c291b1a30e105b00f108ce41f8ec8fa9 + +Msg = a73fb0aaec838d011110d49c5e94395ce07408917bacf7689d2cfe0948c582214b263c6b80e0a55f1e159086817605723740569eeaa1bae96b979679165c5c35ef2142525e943e595e6b4b160acd7ebe41de19775346363f779b1f80b6d5f0785b92a648028e456af8496102d19dc6526247a654bdae3368f075fa9ee92b2f4a +d = 2cfbb8f340cae8e2e2322829148981cd9e509b0c65497fd8d9da5dee9dcfd39b0f7556c +Qx = 260bb17da74429f049f3a7eb73fea9cbeb5b14ce553d7772a365376d0114ed2ef3087d0 +Qy = 5889e41bca54c09be20dd406a6e1f11f9d31d720e0c4e2e88f381ba89a97f12fa9faff0 +k = 3fd7cb455cd97f7f9cb888444f39569114589612b108657ac59178ffe31a33569c9f0bb +R = 048a10915fd3bf9ffab1cb13632359466ccc539128cd98c6273d5d8d26c64d57520394a +S = 2d0f67f9baffbb34094c5fce36f47cb73a537ff984c89e38d073678c21148056bdd6893 + +Msg = eda775984c7c9f7db47af30dab314d070fb77e9b623baa6b73e2cbda800f167b20fdc2e7219391efacf908f4ceed9b9b6bd3541b52ea087177e18c97391214758cf6455311fad336ab56cfdce57a18add8cf85b0a0bd6fa7297dbaa34bfc8585b0f06a0aae055186658c227e19cddb65de88d260f09f805c2e8854dcc524189d +d = 070e82a1f3fa6158d15b7346dd56150faee5c98c9d07c996e01a06dc9b211b12ff62d60 +Qx = 3d3ca5fe316a0820e84a8bb5d231bb14c810a87c7392d7f960e7cecacc56c337f88b0ea +Qy = 27ac0ded5633a98ec5734db9de1399c83a181d522037266d856c83e5c8047c4eff2c4e3 +k = 311b23487750c3c4b23b28424c33328c39d6f594d2a9b459a883508b985d8aca039a2b5 +R = 1465736c3c9e30e895b1544690e05108ca221cf2352ee4af1b5ee4130029a82b277b076 +S = 2819b94dca3a58cc5a96790871640fe0fae38883de6fb4712126c1c1cbfcb0c005c5af0 + +Msg = a4a13e0bfa761b9bf37fade6570d41c161e20558874911ff3bee38e5649849b159beccf321c6bc7243f99c01a2fadbab9e157e9952ca65d8ea676c74fdc976d00501c626b8465c6cf0e4fd1a7d1260aea987161b821528b0b423e62ecc5193a0a49442b0c3e4ec9c4786a3a86b199c07dd3a17033d430d2c83c100f54e0a7c31 +d = 0b471bbc5f7a07996e370da4a09e71e2119ab3a562a273f079401951fbe4df39a4493da +Qx = 333e9d5e077bc64d022e49d5d207385a19282aff1b73b307523b0f861b4ce4219308c82 +Qy = 5414e431f3b90a2d4a454d073cdd81f8b224180ac4139104166ec33ab33d079dd147ebf +k = 3e431c39ef6f4b7674a1bf414460b58998ed7aa5b1af7ddab746cbcd2ed9f42ae3827d8 +R = 151df78c0f453d396d71528032933566e176eb7f6910fa9df2e9b2f5ebb6038777ef209 +S = 08a1c4a1e21cc63fc15a78f0a11a1bc7a59a5a31f57091a12896fa670dfdc05c04053b7 + +Msg = 7ceda7a7248640f7055309ae712c19d741375d6a7e0608e07f0135bb830dc3e8863ee9e7a75331a5e1bd38c42cdd484d4f45a26c2c1d4e05ce0d0ca941f4e94ecc6b371102f31633629e9861de558bcb6407d66eb91f1062ac0e0409db68b9f2855296a7f42fc92359a7dae16c73fd2dddea52bd866a4d501aedd8fe3b3ea733 +d = 3c65cf80bfb507dff52f9bf2f93df0642020d41619b3990009409e7210fd7130ac44ffe +Qx = 3beb5b9b8785c5601093086b709c0a05955be42eca3d217e625349e5a875efa82d75ed4 +Qy = 07cd4e64475d628e6f562f0ac9c3f91075626063a52c2b621796e557799ab2f1ebf8dbb +k = 16212ce91eed7153fef806d2561912be1d988410641d5eb72d586cd4e6782deae4538a0 +R = 26ea04dded2cbeca81e75503932982c7fb5cc7d38a45a3fff8c4ed7f844dc759d8da302 +S = 061d3756e3da1c7816f0d72a8c84dd1f3b93624b631f5051c801af4e472fcf82d896c18 + +Msg = 609815edfd58c0e26a4b06dded831d2f33466a130754b96d8d7c3b4d99fd4b0789ec719bc25338d0ae8c5880560c02687d352d77c291e406eae865c3b26d00f2e63dc644ce7e01d6e96ceeac8bc1eeb257d36cbb25d89b5fff6e30b6051506a0ae54cfaf6214f30985d54cab78f708029c1fc0175bc58e888db89dea8d300abc +d = 0f4d33a9c7e6744ab3c441828bf0f1866ae1c042cc54abc754e3801263a96cbb3955dfc +Qx = 4b925b97bbe67adbb6e918acbcae0ced8dcf11d012e1a97875b750bbb7d01945bd64df3 +Qy = 4591cc9caabc0db8fe9047e6b1f8d850ac4389fe67bb84f6846b631dc3524c8dbe6a06d +k = 0483aefcad5e382351125b333dcede8ef50914b1d1f1843b075f242acba18c290c742cb +R = 1fb791c288e2cd52d3837c56b02fc99f53a6ee27ad6dd9c0a31ca08d8fa64eefccc5c87 +S = 0a041ca35422d8985c1c706dcb0b8ece64b65285bd0a934cdb41fc08223885147281869 + +Msg = 82d8ebba707b72655497320200ce719520c1ae7f46f38122958fd99322c25c9f4d4344bcb77a6658df0eece5df163412ecdca58475d56b0c2d14a0361e4cef458df146925d473a43692b15e9bbec550f1bde3444f2a5b2ecb55d2abd273ae999f16a32333529d94455e485ca4585e6b07bedbfc2bd1eb766abf0d28bdb1ae6ec +d = 3a4824bdcea6a144d85f1b194431724cc49849b6cb949b4766d641ae95477d1ec3d1464 +Qx = 2c9eb36eca01dc2fe921933f4cebe8046b3679abed80d2f8fbcf8f254bf17be3d551a56 +Qy = 34c836aa4e946425fc9f49f3f62e33d8a0afd320292a34d0ef8bde8ad79a10e3f95f2f1 +k = 23d8725af57d835018e8737fb4e8b2eed3ec5a83fda137c710fc1df875416ff82fba90a +R = 0d9f57ba8b6a9a1cbba67adfbb938211ed2d267468f79ad39ea1eca7271d135bb67c18c +S = 0f09a600d97c69ab521bd1ed6bcf0c0f69255c334e0aea06c68bba81d53e810cc553c9d + +Msg = 9c6fce18a6a96349b10c9f2f5f1505c8ab727a650b44bc0782a5f39fcb48b45fc7c1b82180d5f229b8abfc807071f931d333d265fc940c93fae7520d8d40ef59d7c6e3678c6a2ecde52b6a8827b1ffc6ed269cb9832feb20e593a7e3d4708309342875199eb2ffceba7ecd707b122516c815e83e27872eda812e3ea52ee3c4a8 +d = 27ba543ea785df1d53d4ae4c1bd0a3a994cddf0c25d2b4e8ff17ea7aa00619e858da1a5 +Qx = 7d375a9e78ccee85fd795e3fe6bc07f50af3456edda1ab00303f6de6b5b02fe09859c63 +Qy = 08d0d54ab9a239b5ff955452b32bfd2372fe095751bea4b56d52f79b4fda0fa635f57f9 +k = 00ee7010af4a517502cc5d5433d98916f6750e8a9009ea04b8132268673d4a02a3e2031 +R = 3c147b66efa47a842eb90371eeae907f0c813ca0937e488da95ff8ee16d389f3ab902ff +S = 01469d005eacd9ac84a140c93ed0aee09083a4822730a28df35058cad29267eacf03968 + +Msg = 5eac15a64c7653d125605869012b8f036804817aedacbb5a5248a595ee0c12329f91e8179c187192d3ed0d4ca2e202d8d4d9c93ad3f3ed931121c193af5b47a8a5dc39775b6c2d702708e5134f77a31bd62eaf87e39e6fd3f2b9f782c3057e162dd53b3addf92bf0ab99835c7f6649abd1c5322a1ebb2ba313df9464a74c14d3 +d = 0708d0907d14dcd5f40e2903e1e90e48a0ffaa6d4d9b84ca14df4e985c294f74eb9f2d2 +Qx = 6fb0fe1c3d5bfee5399c98518bc3ff135e0c351243fa0540717a9b1f7990eb8cf43597f +Qy = 5212fd4d6a50c08cd99ee5988103fa639b1123c878d416cc553639bdcee1f8e927bdc8f +k = 151465f40204d76f3bfc2e4052549869c19da82c678c332f536ef24567ea034358866c8 +R = 0803d3e8c876d46a9198f2f769faa76c4f66bc5ff4298b9640ccb8e67ff8d10f86342c4 +S = 00da3344354114d163d14d4c288785adbf9a8b31371c6e4420383c80ba0a430019c6acf + +Msg = df735a7e60bc267b18f313ad56bff830be5ef119baf43ce27c6368ff1dd89f010afd4f48740b11c12101c5903bfa71d6cb3d6462cf875bbd55a570ffedf3564088dfe8c8d3148231b78b5adaa6c53696737d4704daa59eab8d986fc6e519e81540f201e77b923a6a4af65d7173635b3b19b2023022186a7b8e869e1ed51717ab +d = 21fb0a6b94080da8b8299b87457dc09d21bc430ba5f3359d92aacc1151be9941739567e +Qx = 179831c55ead3d11844fea2e18d25cd4d658822e626550aef1afe37d88aadbcc9bfd666 +Qy = 75f8087d759ede340157667c1bb12be272b8318aedf2e8f8b487f4bcd12a50ca66f9281 +k = 37833e9aab843a6b967264fdb705b419ed63fbb09c12170491019acc7c21b9ee28a00ba +R = 1c9601440d109a3f4eb69a1a669bdaab9f4222a34a04ace8ae313b10bbb66811bea7d5b +S = 3d2f9ad7595dcff69b65f035ce600f2667f8499d3bd25f789d3f3c1bf83d2855f68eafc + +Msg = bb107b0eeaf175a786a61db923bc6d51dad5e922e85e57536118e032167b197b1a1f62d9bbcde04922fde781665c1094181c16ac914cf6fbbfb27bb8346b2134f05c55a8c6b9b481273758e380666d6e22c28577c29446cecc5c3df9ed9f1be060ca55ab2b7fda36a147aeb46df0275bb923e0876b703452fab42f6b7ad2ceb0 +d = 2c80151f91301fb6b0c7685bd172f20515b46bf94dbc4160d0720fbaedd40ec00084447 +Qx = 4a62b0c9749ae9ff00dc1d50d2b4a4941741abfdf13c8e416549ea27fc26b14f191f243 +Qy = 2c9cdab7c6512c322bd200167eb9657f8e8c84864b57480a80a3c6efbaa289ab8cbe4d8 +k = 3df951f8c4490fc7c2d50a72a93e0e82c5a20be8d91afd890d6846bfd146169ab58b382 +R = 1f2accc7f7c4b5f877e12cc17b227e1ba110577c9f4e1785e6dacd8491bc6017129d798 +S = 27a167e6f2b43ce9663b810ed4f8ef15029fb6f2be2ddf25c014d844953f501d1dcf6d6 + +Msg = f47e49ae30b09b7666600b7a95e81b0afa1553da5e01fd917e4ce1b58dfaddb8dc8c03c0f5591f533610deb6a7bb5faf5dd1ec4103a587a1a4c58a110a706b0f301a5c408b3d984c210d5b4a0b347d2b5447271f25b527b3c7864f7cdfa735dfded47c63b723fa0f0413c57a24ffde9a95c35f743f892ab1ed1df704cde82d9c +d = 1538abd7ce8a6028d01604b1b87db3aaf720e04220edf4d1d28c2d731aa25f509e58f2f +Qx = 3076b5c3a12b8a2e1368c7e3458458dd7ba6c5a6dda8c82cc6b30d1ef767d36e015207f +Qy = 369c7a80cf01e9f32c08f9924db08a7d0dfa5e9a8e0e29b57f5eea8506841e6e3da04f0 +k = 3f0052ba6ae6bd7a7aeb077a764d21caced6b241f63616ae4e4f0d98d2bfc0e44dca592 +R = 01281bc0bd36ba1f3e1c262d98ddf4e9bf1d80dbf97db02089fdf1d2e625abb5733ec3d +S = 076db2215d9f33054efb397c449f05db198d38a24749f046ee20032f5899dc142052e37 + + + +[B-409,SHA-224] + +Msg = f2380acb0d869d1cf2e25a6bd46ebe49d1c9270624c5507be4299fe773749596d07d10f7c2be1c0b27e86f27b4a6f8dff68cfe5c0b4c58dad1b4ebec7bd00ab195fdd635d9fa8a15acf81816868d737b8922379648ed70022b98c388ede5355e4d50e6bc9ec57737d8843fabda78054e92777c4b90466a5af35dd79e5d7a81ce +d = 0beb0df3b0e05a4b5cf67abef2b1827f5f3ada4a0e6c3f23d698f15a3176cb40e85bf741c9fbc78c9e207fa7302657527fd92fb +Qx = 1da1761981a65cb5c77ec50ebf7acc11eaf44bdd2f70242340ec26ffada7a4b5f661e13d6e7ad341cd7dd1ca491cb7a0b580be3 +Qy = 19ba11e4c4f2f5507d6bd2aa2f96b03510a03d5f8c38bcc8acd08080d9effd1f8ae5a5586603b2e112964514c831bf786b2fcb2 +k = 091e575fc79444fd2d9021bc267a1a076438d73464726bd0fe4ac2884a374e71bd462b1516b3e97c3202854bd0a286214b9e92c +R = 057ab9d5cf4d18f05eaf17d3b5a4af96c3eda8ee48acf5e02eefdfe2f542cde32a37c04f285794ddccbb14383a645db040bda81 +S = 05275de4157b32723366a0d63831e6512241e3e4416f3af02e22da8faeabbddd761160304927a71cfff4d6e8937347c9b78cd3b + +Msg = 22a97fc0a9694dabc6f274ab52eb592dbbe8beeb646ebe6cef60eff341a13017eef980aba6d24ab3afd976e2f6a84cf652654d4a54a36b2f2f62fab8858f8b0479a48fe9f47f8fd5a4a1f3141a91cbca186507b2bbfef5e4c4d2df525f04ef7c4720fb443ccad540f03a2be468d88c9545d1dad579fd7cbcd103bbebc9e9f961 +d = 0504865a30984a9b273d1bc289d734d10e0aa56e93ab14720f1a42a27d8cc932cb8804b963175de6fe57d8eafa8ab7ea0592dfa +Qx = 02de5872c40a79d5238722fcb94d5158009e28fb41ea012e92028dc3c87855fba71f50e6d0dff709867de185f9a9671e7a91e2f +Qy = 0fbf607f69609ae96982bda3f0317fe46ad1e0207030fdca702cd97fb5d5732f3abab24b10669875a64bd2a74c8603897c78d22 +k = 032d0f950d10d028db6e9115e9944e7c768e2da731df49dc9128bf145a747662de08cbe0517fca6fa185abdfcc4e3ab604e196f +R = 0e7d16daa689ddeb08074285f5293bd9f1c051ca5589e69e4b62c32af110b6f3981d9624df15c7cac0ddd62aee9c41c7b6d690b +S = 02f6bdcc551aef0e4e8da2df38288dcc29fe600de2f8b6cd8149f88146150790915148f069372151c3bdc4d719526eff252e610 + +Msg = af36c04af0e3fd64bf52dedf52fb788d2d1bd67fe05d98880cc7ad3c20436abf02f637fcec209fbf888903fdec8682717299f8a4386768153b7faeb6581db57fb9aaf4615b4ea8d924198fdd158363a1f40312527d6bd14c13d19985b668c6b88a7548104b1ff057d07082eea421f50062a315bc3866378f2d2d634f03fbc0cf +d = 0cc08a4ea5ebe32027885a8c212870e7c45b6c610117994d6a42a284c05199414a3a0e8e6645ac5c2ebf21c505a601f69c62b85 +Qx = 09d2beb607f2bab64451327e1dc67f04f7569ffc0c67b410c6db06dc04edddb1362ce8d8b8220be77c447640e7d0c676e5ad1d5 +Qy = 0ab813e800e75b6012faea43be56fe9d5a22cd46fb1f4f1ba65eab19f75f2ce9d8187e4940fddc485c42cd18d40d47415a80b02 +k = 0cfcc307f847eb696f16af32502690711ffbaa2e60e75f80cbcf7704152d5eeb9ddeb701952dd58fefb159926a83245fefa6196 +R = 068d1c646dca56393caf3239d9fb30d1dc56f991a8dfdbc0a7b69d273aec69a53056d9553e105c7917e522ffe446cbea23227c8 +S = 01db30aceed2b126cf45163b9d878a6590e9ac8284a31ccb0faeba2202679f181eaebb664b5537f408b693800f24da590082dfe + +Msg = 6bd6f52a6204b60f37929aeff28c87ef61ddeecc231e52a7772275f9329add899c130956f8c50ac2698aad3654fdb49b74a6427a62a11eca0a8ee8b719b8c0df7b9f0bb0af5fef4918a8c83367d29fddd04b6a1ecad904471e5b59c8fe3cdb06b4f8f96419518dda960845d83c49a49f1b1f2fd1d2682a9d60c25fe3ce982cf7 +d = 07156ef0a74ee1119532a2a7e8c02be1559c3c21897af9d5b34553c3d0feca4a8d5929d1945df824478e0c0b92a6fac8c84f639 +Qx = 01df419310cf133408e9bdb32fd85f8f0950263e1886f2e2e108a596e7e76153ec47bf9b33f69c1128dfbf52557f3c382de85f1 +Qy = 16a15517a811c77cc67ec4fe2bcba1290e4981880c071318aee28e30854692ed2d6bfb71e6e74fa97af750889ae8d010189733c +k = 063f127c38160e85acdd4d5dee1db1c32cd9da6075b2d2f46b010636e374e0262a0453394aaa8bbb5fe7b2dbcbcd62ad601cf51 +R = 0250cf50d52a5950999b9c0ddef219218f76dd9f22a2213def9ba98d258c2f8359d08d0efc208e23ea3614c9e27b2e4576b9c12 +S = 063479550873dea8a3ec0306ffa9252739c34c87bbac56d3d9138764347d5220bea9c27d6a308dc2ec53724d6d3ac4862d1735a + +Msg = 0eb8de25f63abc9cba16823270e9b6f3fdedf0fb90f6652a34688970932e3ae98f6d3bf0fefc5f247f72960a6975bff1f1acc2188a1775fe8974b2bb2b4c8d226ceb735113a14009e8ce66d58808fada4e6f697fd016829913352c0f659b6be354a067df00cf74919580750aa6064f21264d89dcb28b3b2d4d699115c36d1310 +d = 0a95c7abffa92e2c637611ccba66ff9d2ab121b40a85c5b71454cb0dca1f098ce1be8d9ea4933d1a91bcd270c5a33687835d6e4 +Qx = 048e6b8614c0c7156dc41884e17e36ef528a493c28c9e6275c3454d83beb939ccc74952732c18424ba21b8ea9c528966c692141 +Qy = 00ef9efe1145029d8d60d14dcf079d43e3cea0e18010f680bddc2729ffbff9a981cef2cb595a69142b25a0a39863a929adb635a +k = 0f43af45b0dd631bfe38d85979ff1612140b9cf80b4504857df17279d9d8ea12d5bcd2920fcec81326f15832df6774b9c4bf5b9 +R = 099f403ced566fde4d9755258445b6d6c2a4e234f99425aaa78ef118321f8579fb513ccbb71cc2732e31668a6a6bb0fdc7f4018 +S = 0d8568971a4f219d6d3d8bea6aecb4bf7de53886d2e6bbb0f71d054c63768c34d4d1883000019c59168fbb32f4317330084f979 + +Msg = cad58ca7a3b9967dc0ab62a43037764f8074ef9177d60bd98f623d693333971c24a575ed03cb61f4dc2e3d6285fb1204502a540f3c0bbbf23f5bbbd1544f322ce35d949d8b1d8edeb82e90927ac67ad49c91007056bf5096bd690d15ac00e1874fe33293d8003a4a2b094078cf09af799dde384143350c54a99e1f99cc31f2d1 +d = 02c438b07c6e0685d1f94a4bbafc013f8f21265d893f54e54c3ac2071606ad1ffacace0b8367aad724b1d9508c65ce52282e397 +Qx = 1fca66bdddefcc3c2072ea32f026c975a2c392dd7ed7e93e94a810e1125ec161bed698d8305830eb66fca5eeb71934ab3fd79b1 +Qy = 189c22a2c9f1fd7624f805fdf4faeeb931709d745a3feaa3cf04824f5fa58bbda144d4e96d83ce1e3282bd5fc9c50bcd68f5408 +k = 09230aa7b58505e2dc2f205b70a09cb9f4d8272f465b7380195ede0f7770af2a33f7623c310a0520e7436835cfcaf32467f154e +R = 013d0e70d8f4b1563efbd3c46feee15b88358562f769046f39df6d00477815e6b8763c023807eda87a86338c7b64214784fa2cb +S = 0662f43fabd03a0c05ebba700203fa2188e16504f8655bfd0fd090b109e68220122dff7a6cbb8bae08612e0d516e9f95ac15368 + +Msg = 281ce2643799bbfacc7d5993683a4fa656040517854f3c2dc7c4f8848dc305382e34e894d433caf12d8b493020a6a08d1fa05b08bf6c53127ad5f33bbe75b9db0615e3dd94408d028dcf3cb7598f6e7cb4c787681dabac7cba2cc06fccb7506fece6c7c1c1bf622d525ae9737085ab4ac578905950002024f30159cf0d99f50c +d = 09e8658f8f9e6cd98c0f4f0fd20d64d725653aeba339504def17f3ad12a63dc6157d80804e5f43f4ff48fc5573fde2c615ed31b +Qx = 15088531d914113a25f1598ba1d3cc611e27ea92ce8dc807fe8d446db14ef62ae2f06c293bcdd739f916cfedfc481fd941b4feb +Qy = 0a9135dc1b0384e7169fb4648973559e508319235a3f41ba174d5f58307448671cf22a3649168495c36b0bced09ac6df98f14db +k = 0d398fbed52228fe16d32a6ef539e4ee3858a1df327bec999ca25cdbc357de5a75903909973bbb0a5d0269862a74623a38da515 +R = 0e38910abb3d84b2b26ed17d2124f4787dc5612942e98521d9f94baac3d14159eeef9e09b9b20c807b479ba84640730a4ced4c8 +S = 0e370e575302ab0d8d08d5270fe89ba524b5bf21e43e70c4d335ec1525ff5696ced37f0de17e109fd833e5d179bcd4df42d7882 + +Msg = 0c061da1a16f2be130ae3b20b89745e840bee09633fb49671db28ec9a051545f57ee07e2410ae7ebc61c9af79868d3047705bfc64ac0c04ef0b286e579b650c7165443631e49e6a53c84cefa5625b1e1035a6ed89b8e839540040151132a937666524265e099272c1849f806db0fdf2be64960d5b5853965099459968e5beb32 +d = 0c4c13f65eacce85a51881caa6f82d9e48ec2ac574947d2751823a7f072d38bd9da0cdf30b6f19084a6d291052e7bbc2e1349e1 +Qx = 0af93430dd77e6016d1b076a52126a729f77e34bb3db11328d9edd56e29a7a09a7b6a54f72076fcba886ea78ab6ad81de43a821 +Qy = 1419e1bc339c03a8b4413ff009d76f9a19e201876ebbfbb3dc771b7df07bc19eb893ce23e40c679d7909c33af2bcd7d6306c0bc +k = 0889be0918e7ef34d3ed226f967301a10fc30111b3559e37f5fa5a57dd5c73ff672c5279d096c5b04c68b71d55e549d019281a5 +R = 0a4bddba9b7a402b584ceb82a54baab61e81973b7347e6dc9e3ce0f1e50dc21c9569d8ecf8a7da97c38e92e52636eb13d3b4c02 +S = 063c7291656466f7bd647073a50f410a2cd9e8c938aa1fd3b28ddc1cbdd7b78b757689dd661f5173f79896780ac3fdd4f3171ac + +Msg = 74ac2e1303297efc3ed8e624722df505df55b7f33964cc0d270604cc48b58205d8a11952232a8feb0079baa30d7d33660268b56a5a3dd90105f0703abef8f6636a99bc63bd47d9df100351bee32d8205dab0dbd2af36fd173409ff8d1fb7b24570f3c1e968458f58aea5aa2f46731ee91ffd6d3a060af6b3d5020daf1362af3e +d = 0da591461791ae7847e6d8dd8df46a63d3021644abe9520e158406c96540d8fd82ecfb1c3f6f5cfd7688c7656cc3e3dc94e586e +Qx = 1f48c95301956c62e2fd931df49953519b88ec3915c8de495dcb4ccba97bee023b1a6cd9a66dca29aeef8f4f1117eb954e47cdb +Qy = 10db6bf78cfeb92d29a922c4b05daa3cdff3917ba6978fe738296956ed141c749a938ca9f8f13f711aec930e0f1948ce7daf9f6 +k = 00576a91862cd63acc067563626977fee6f074d5726cf4f68e80d25029d4b8efe5ea845745c45e4cd42879e52854c3f385a10b1 +R = 0806435400248ec38a6d362e8b2cafc3f3bd46ba5baf538cd97683f76a733ba2b4ca85fa7d13b99f4076e7616e68d66f05ebd8b +S = 00ecae395fb324b4366f238f0df22d011bde5db6b0cf4189e3ad47101067ba87336ca47d637f09f7a40a1bc64de8c4aef7f497c + +Msg = 2afd17344552ccc577b0118caeb7dd56a0766e25f84df17c0505f9798931374b48df89a48c64e199108c36e00c0bf00a97ccde55787bb97c6765601765ab5417f3e75e35a9fe5e0f85a721d9f08440ed617afcdc200b318940a1e496040a6ad9090476b0fb4fcceee77b3fea11de09e7fb14853d1fff8ab12d66c101257e2d4f +d = 0b5eb943f0dd390b737510e2bb703a67f2dd89dc9f6dca6790bc7a260cb2d0fb8e1a81ad6009ed51010e7686d5b48233c6c1686 +Qx = 01ac00da454bc329f7c13950c848392cb4f31594fb7837f0986f61601fe244eca3db6c4f92accc2fbd1a4b8597b70e72d88b103 +Qy = 09a364065a9f67a0aa7518b75a0b4a9140787a67f852fa31342d6275c14713d484dec3116b9dbbb8af1d4945639997ded09cbc7 +k = 049176093dcde8549f95a8f1d1c87230046fd4b18a73243c3599815d4df8387a843bc8fe1fd67f3c6bbe394547e11866f41acaf +R = 09d7c4ddee55f61c5c4c2ac6efbba6164900344004976381c7b18c1de541a97cb58e14d14b6e433c4eb6d4bfe6d3e0a4e457469 +S = 0a9acf355bad544b3b120522365bcaa1e1dc6f1d3df1e30d3beb94f639e26147a81d154a684bbafac965bc39974c505fd0f811d + +Msg = 174b2b083541f8284645a810801e72631a11bd7bb805f684a7159e055afc44357f2c80df2b7853678d34a04144e0ede2327d03db6df23769ec41194a8d9d86af74d51c5bc11ea878c6a80689af71d3fdaf1c651003385332a512e03dd040c33d9c328ca89ec7ee9026bbacf30a7f3a68e0d894fb9f7100ffbc64bf17679dedd1 +d = 09cc63f32152284fca27ab2837bf1343144336a1fdf15b9727c47e877ac69ac9cf4c97b4bf42f1ab10d73de8597a554ed099efa +Qx = 044e655ad66ca9af330c33bc6d00ccbe4533a4c6a44a3f23c921b62eeec8cc1918e19956f3ed848fed93a7fd7ddea57096d1f23 +Qy = 03a71b221c85607821cd864af6f533f216b641ceae104b8e16dbfdfe7edcb2cf9ee0dc1679b696149ff42a051c51c861a3c7530 +k = 0db9bfe4c2e659006d31a7b44eb7bcd6dd23810f27c74dd587ab9af23aa5962dd18aef1e95da4ebf4aabfd558cbf72d2951bd44 +R = 0c3b91bf0794eca7faf227c4ee4085eac6d6918803242bff4da9c5dbac2e23fc32a4d4a192d7737be22810812558f820b0a2c13 +S = 03120a558c0edb58ae7ba36e886084801e7604558238c85a199af6c9e7506ea4e748791b04f3a92354a4f1407837d87faab66ad + +Msg = 758df71a952cdcffdc417b9fffdfb57582ab5c5473a8bdf0c2101953b023b77824263353dea0e2ede1f800a5757ec6ac0e1e4e3ab5a4cd85567d2d19acc6b7069a6e7368401cba2b6e642373654bec0ddd19fbf032794c15b7ef7e714e13e36875262c01e77766ed53cbcf735936dc9b33eaf2152a396349c82ca0297dbae4a5 +d = 09950355e8667bea8bbe3a2c4988436ab5394551b375e27fdc0c1a1d1b07ae957932f428f1aca0a486e54cd0b5bb0a5c5650641 +Qx = 02f623f81fb9a299b71ea8c58d5bd7d89e7be66ed8cfd7370de515eaceac90364438338a3fcf9981f1b6f0b30bc61c4b7c15791 +Qy = 16130b7c4061422d70b21251fa9c3d4e9636f5a08cea794a0fddf74ff5ab1b750cce0f2768d54fb2fb75e2851c2296b39c0ddd2 +k = 038e8c70cd35591012f45f27980095c4bcbb3bd36bec594927968d3747618c7f5810ea9e0a126e4d3e1e08185b031dbe0b37e5c +R = 0cf957d59b03aed0e48189d2b9256b5472c8a48b4911f9cec14adce5c6b4aa22d093a116364bcae01c1a739a4023da12a29c058 +S = 04cc2c22b243064758f52264ed84e757ff67c4f6596edcfe956b70f777d865d01e529f0a8a9a6e1895168780ab60950a62d2d2c + +Msg = b96d9f66b2000e9408d602096f032b112f0e05ea874229ab9daf6e05bee49b4722e4f2d8bf2eeaab9dad94438c76b7cc64dcbb59cb4e03f9ac70487a1d24d8d6b72d7462fe738a17edf381d52179b3acc0c0177c113eb4d10e8e78041deac1d56abda0ddf892edb8be956d285e7236bc6794168f8a180f622dd5f2b9e690c275 +d = 0a995493d6971c2d7e8fac3da9f8c0b5afd877cfb94924cfecc167f9d87002136ab253e3a4f9ddf5c9c99bb1dc1af0c6a3a3c4c +Qx = 0ac0e558dbca0fa6f013b7282e02717e91eb73304b4f7ac5e04f12f55824c441faebe5bb5af82189044827007bffb1e26557941 +Qy = 1178bb726242c718b416b21cdc9fd90b31ba6a8350f9b4ce3a188b1b5dffd0e8894ae6a417c4d74c920fda585624eed4c1d3f99 +k = 0d581293ab1e509baa50852bd3f21f6493cc524a2c16206e461e320c7f2c1c201b9d2a1dd4207227592a6457670a67cb72eeb58 +R = 022624cbbae5214d2c29e273c334b9ea78e10c7efff3611574d5fdf6f67a81472b606e0236aa47106097b9147fc1b56d062966e +S = 08895d107ba789d88a17c30a537402591ed788206487697a72f69285ee5eb4f03cdad6c2604e174ef4b9bb919d8b39bee6231c7 + +Msg = e7ae60ac55e6ba62a75d5328bbc15269d4638764169de0bf0df043d15f9152bed909b1fb8c7a8d8e88ac4f552c1092b62db00958a3a827f64896f6de4bbd8fa5258d6c36e3904d82d3eacf6eedba50b0242eb6b01212288448c3a9821c4fa493869c01149ff1850e8115cf9de1618cb8744626b1951d1de305745507c8b21045 +d = 070daf435cdc26ad66c3186267ad12d10f28d32d863f950cbfcf042fe9dfce553750ad098f82f7f1650c1126b3e4451bee6e11f +Qx = 19b41af3b557c274cf117d501ce7ccd04d8bff2dfc737d7efcd7888f2dda24737a6788f16b3b6cd589d3f65bd95194799d65659 +Qy = 11983077a2c371fcadbf47b10494f6ffc7ca8873b3d812c45a87c48e1b49edacc0ac37e5038cf1aba20360b74c0903c23a62331 +k = 043fb8cb87591747d12f4897dfbbc79644b87907bdefdbd7ff0f6f2e7970c7d40bb2fc08c17443d029a92487869f640607af460 +R = 05ea3493a8c04723de9de2cbd523481e3a8593ae8f010ecbd5add6db5a82d9b13ee7d24ecb417419639d0e9f4e68d14f6799829 +S = 0a9bbaded0a2894e384184e166bc06e1b2fabdc70536caeb3d0cd46b955743cfa8ac6edd03760d1b613fb445367734fa4270139 + +Msg = 666b0dc2ddffaa7ffd57ea3b2768f02d4b77c16fa007c6d1918400d195f068cae2dcaa69817e6e4c70d5b29c5598efe2d957bd12d0fafdcf5ac52dee80a2d46e77fc18cce2a49bfd787ff77b942c753974d22434742bdb494590d17c42af725b1309e54566276af3bcfbf5e174d3cf191b85903faafa1583282c97e66c5da6c4 +d = 0f8121980dfbe9ad0bf92383c7cab95fb72d5caba96e1de7772c6a179e85414802fbb86d725401451329287305570ec7fdd873a +Qx = 0c62f4e7eaf3f1bbae71734c86b8a40ed1297b9ba1151729f9363824425193e8605c2bcd6094aecc9d7ef2a41aa6b12877291cd +Qy = 1882a45555b68596dbc8bb093dbf1aab9900cf46653c58f5656f3688fbc72c5236297be2f0586a4031279b9014f2d3655adef41 +k = 0b4b5b19922bf6a34a00454374589f9c89745eb194b0352061a79401e23c0c0e1fecd7597b5a7cc1c463b76cce7ab921867de00 +R = 0f1fcb80a4fb49348fb326e808d8ed8c21c376f0713429a22bfe16d68cab0295b21d44029083769761c4fb853662d440eba4cfa +S = 0252a94a40008cc2c1a69113d8e14e989e7fe13918a2852de6930973a91784eb35e20d8ae150a88c459167f8ece998cbf6c5eb7 + +[B-409,SHA-256] + +Msg = 3e967cbc2bd936e0b6125dc5cf885735bdcd2d95b2f764de6931c4578ac8e0e87abdf96375481df67dbe1b6c43537e84ec62bfca6672cc5f3ea4125abd4a4119edffe04e42411d338e8b10abb1f1f818c50a9631a3f89feb5be5367bdcb0a8a82c96a427ba6ce99f9631d4411a2b7f5b14d32cb3901dc9d285e4cf5508940942 +d = 047682b2e3bcb5800a531858e8137692a9b1ee98ea74e929ce4c919c26ae3b3f1d4122d07fd9a70d8315fab727ccb67004187a3 +Qx = 17ffffc1d2009e844f8e625a3bf11749a8b4ea0b0fe3532d124112edddf72d518ef577f160962b88ee38b11445fdd356a26bcc5 +Qy = 0ca356fa8e90325aafb1826a694a55a80b2af52e70ad8d507d48946392da8b9fa27b8ff6927fe5130c69809d9a2c4b1d7eff309 +k = 058edc8f3665ff9166af55e69aab9d468f576bcc8f652e950082a48224b4923cb9396ed4ae06f05bcf7797352035484fdc501fe +R = 09b46600fb3b8204d4cb63ddfaad1482dd8cf8652f63c926895b8b8ebfe27295c052b3bb81dddd8687f4864f258a433010c89d0 +S = 0832f7674eea791b5f17db7cf9e2ab13253d870c6ab46ad01cdda30e78db8b8f51fd377dd55ec7786ccc92b17364a3c17ad5be4 + +Msg = ca1c90012eba4e7c5f01d8cb3814c58f48c03a16be6ed86934014365eee547070b870d1d26a872cfd28b60d9ee0a66dea223e9eaa90ee28076188d6091f26f665684f4b486af70669555db9058d485c677b2a34d4a98aa8d6f43bf6f44aff2a23c5d765e98f0438ab81be0585a5be29daece5d4116f44ce6062753a3ddc505f3 +d = 040cd1a06233ac27f3ddd108de7c6c0982793ee620d71982697713be9fd5143658929924cc88747a680779bb00da8a44e1e7d3f +Qx = 164e518a6719b1ad61a38a214ebb06dfb0553bc760799e668b1d0d098ae3f06dffd9b84c16de90db19043d72bed2601fda14b1d +Qy = 18e022ceb850eb1db59e6cf63c4a7c73bea0b70448a7dea77d5ee8a2e1a36cbc46454bacd5954792de82f3ec21ca6a509b0c7aa +k = 04a936fccec003bd9e8eb45d27c0eaedbd452e6fe99abaa62cbd0739bcf259cfb6884d1e60b82522c6146f081663f6f863576c9 +R = 0dec1635f2698d4666df2c217fbe3e644d27592c5607a5549c877257cba7bee29a8cac75a044e72d039747d0d18de1c34acf072 +S = 0138493216ffc3b8aa2e0c26f4fafaccd6609e6b15f767da7c907db64b5181bfdb447d73ede786144c70ddce7df7eff46dee4f2 + +Msg = a54c4351ebdb075d6a42a787647390f864b2bbfd8bb3d0e0ea9d767200fa344d1a9ff091bddb186acd69bcaecd767068efe4d752d185bfe63f6674279d0e7192d2077c400bbc0d5599ee28507c1253f05eae0687b965a015e1f3a292b4650106765266f5c95b77ad2d82a6a6e012f233169eb6b8d83576901cfd4a927c54d7f4 +d = 01ca6f752aae4eb7fc9c73a08d6fbd96bfde5030d759a2507bd45b6e1d1487e53abbe98fad4f41976364e0a1d830910ccf97abc +Qx = 0f6b7220bd24652572b37a0ff25e75f72d583c71c159857482ca9944b956a117a6b2ff96614898757b8a587e3c2b78d9943003d +Qy = 118fe425768bbf3a4acade281c41c745c9ac946c2f8b95d65787fb6b64deb71e6b38fd8c721e01c87efc7c2a6d8066fe3b35a0c +k = 04963aa161b5ffbe5d7e5058f0b1457ca1b9cd61d731a0470beefe5f8998904cf4594f98dcb41283f66e2b07c5c5d6a6c587826 +R = 0abf824d43d993107b552d7ded13f49ea0ae7bb845e56ad7e53cc5f9d64f99f9f250e4305ccd9f6594c92defa7f6860fab1c349 +S = 090a541f1844357f618e5ea34c0398ccbdab0cb363e266980ad304dfd675bc81c0345a4d723fbcc76ab5ed4cb0ba0af1b71bcd9 + +Msg = 6723dbddc8720feeb75e2a061b7fc49079f999fbc79ec8a8e01ab8d35b438b7049da5a23c49a58101742791f84f45d5f5cf551cd7de6926a0e2c4ffa1e378f038da597368c62df8cd8349bf046de46d02183dc05b3a3575f5f232dd2970057200e2c9cb60eaa6b4d72f8b73d4d40b98d1cc801d1a69cb5ed780a75a4064623b2 +d = 0fb9b1a9597d216028902abf743d25944258b48c9762d4589fe660396130b75f6006cacfde60f6204463cb8c18b032de1dd68d2 +Qx = 19b07f7f4ba100aa9e749bcf93a2c9955c442730c5e1f6f72c1b1d132b780d92f414a533282f7b66677c8cc8a3d5ba8b3cd3cf7 +Qy = 06ec6e9c495ccf600f8c19597e9cfdb639406b04f57a29dcd1a7a843c2c44e8321bb8508953e9c0503f77d36bdef24d5d39f85b +k = 0757f6acf74eb02b7ff3161b476dfd8349854154186c959179f11b9a15da3dface40ae6ed771096e053976866433382e640283a +R = 08fe276e7f63ce5f85fce19d1739a8a9986cd3c3fbe26fd59324efd98826f9db3b228321b3ad1d96145ca23cc02616d9e9d7aa6 +S = 016e06de8e3e0abf4a4f52bd2f827ca4c57412adcce3271fb4014069713f3723a038bf560788d8dd48430d3b30faf15ad9c0d69 + +Msg = ed53cec5e5500d62d38c829002916c657674ede4439c6f405ba672327ec677490e656bdd698f114c2ab5e6a1fc94a1a8d64466cfe9eaabd23a8b5c37f76a3c0decdef73b3e7b751cbf3b0817f4079560b5ea34cead88ba374201236bffc48eaf289bbaa4e828afa7d732473c228ad00588c9b443d65b998f21c3d7a9e9196c08 +d = 032109202d754da290c266f74f47805a06e6b5c3f721a72fc97a3bffeb8887e0c642d49a6bd034847d0a5ba09239c5dfdf0772d +Qx = 0f4dc8b94dfe0a27d4d41399005b242c3e5b14bc7cec55ff3a1561c894d73f365fa8fa2ccde1fd7bf3760b96ab2db78d2d50b03 +Qy = 13ac66e95c335b71fd1a98f101a392dd4696a806239fbdd0708acc69333febb48d4b649f14f42841d66ce03f1fb557a361c12c1 +k = 0b010ef786c13ece3a10eaff79b93ef3899aa385dcc1914e16abba90de0ca6389d664082fa727fa7c7907dc4c88bd621e6124c1 +R = 0488b8956c5999c317830206fc8b9f6760845c31bc4ba77584925dfe25c05a1e7d298a62e9748c7278eba622713df59accdd78c +S = 082701053ddfaa376c99cc42ad4587d84a358d9d8a9533888cc382623114aef51170de77ecf64af02e09bee203851abb22f5d11 + +Msg = 13829401bd41e9fe01329e9f5a002f90f1a6ecbf25fc63e7c1345f265ff02e496230f706c6ab377ea52d8707b54f8fc5c7f089044e2bec1dfc66a07da76ee12fb9ea0697d87706b0ebf677600bd2fe117f6cdefb8bd636a1b6b97549ee78f992c24acdf3a946053f06fd012a9c703efb8bd929a66aa74b05d61bff0395232b00 +d = 080536e820fac59b3203aea928475043b2576446619001647e35693a9e65d15236c3cbc12e1bbe0eb305973535c882b70197a92 +Qx = 16d7448c0afe992f8c59b19d6cec64d8fc5b10026a806760bbdbbf0012063f46d31e521a34771f826669c4d1ddd58d3aa13ebc9 +Qy = 1a3742a6f231546f0704345b9b83c72d5036522449cf60c1b3bdfa4c8d36e499d4ce62e6e7bb05c6132bed1ae44eed17414d2da +k = 042753a515e607cf9992dd1f249820dafe53993b59b1e57d8f2f9100f609cc15713d27f5dff4007e078d6da1061ddd36c169c21 +R = 07eeb1cc19ac45f52c0b63ff8ecf4f4f35958e86cc3e3a071a35446d490a426b48b6c287027b003488573a4834a06dad48520c3 +S = 01410d85f3f2adf065b60a126170c43e34e0883338118cd33b0b3eafea1d142480b236ce49d35fefd1ce4ad3d25e0cc9268b1d2 + +Msg = e696acdfcc96a6c088069b7595ea9516a36d8fe04dedeb789fbd965db0cc64b7017a821015f6210b6989e515def5a9605fec0d337e4ac59f3101a505168bf72ab6d98ec62a71d2f94071fc05b95e98d4efc59fedc138e3e49c5d0b44d1f48f7b1e7c1944ee189b242950d2bc804d31c7eeb45283c84638f043ab9533976433a4 +d = 0b05e5f0dad9583ea18fb8fc4d8c75fd2e3cf9e92cdd9b737485c953620d345006c31c288b380258b6500b84f729ce6730e5303 +Qx = 157c083ad9789966905c212dcfd7c049a8ba3863fd4886e4b118b3f06445fb0d4745c2a8a1193dc68915722089d0d382253b675 +Qy = 0867e8efb575800f834c978ee2ecf0f84f72e75dbbac86926b73fab8b47f38eee17a63baa02e3edb9d4f6b2fd2afc88b6de36bb +k = 0c72eb08acb1d422999ee8d51f9ddef9f897dccfafd886998edd3ddf30a638dbd0ed59d68885ce242fb838f022bccd4f3b5f854 +R = 01f4dddcacb088f6e24d331e8b111e390735a41e1fc29da8f5ffdbf7342f4b9056786f2a67159d1e57570bd69d69235ec562416 +S = 0809840df1ef8fce9b2edf8f970c07bdb5fb755e9d5bacd7996275c4f890173142c39299ce9eeb51d21a32acfc7761d5a2cd7ef + +Msg = 4058b9a8cc15ac148909eb97fa32aafbb6077b168dde91a411dbc973df7db056dc57ff78f0abcb70f70f800bd752197d681f44df4a7817c0e7f60f8f65489ecb6167c14b525e91fd2cc5d8b80ba380a83d031d5827c8b1262c687c90ef0e62723d9b565557f9f6fed0db48f3799274c2cd60a14303406c35802cba6261121296 +d = 0be1d277813e79051ca1611c783d66003ef759b9e104f32298017fb97667b94dcee1ce807dc6b4d62416e65d4120523bf6a4edc +Qx = 1fed0171b5b3c6d9092a6592944680a08a0d4f99f08a3ad1c22b5bbf11c0e4ab3cdae9526b0ca2b1bbd961362faccd5caeb1d37 +Qy = 1ae7d57db848e5c86c31f542f1995c76e916dea9aba882865febca630bc6a10ceb6732bd5f07f51bf2f37ecae7b7fbbca618ae0 +k = 09e3585213c6d6706524e3c8e753a2eb0edced626498eacd842d44a73c602d801a079f94b781ae1ac5d44209e8e3c729ed4e820 +R = 01098d98cf83c705515494cdef8c3f50ea8316d95b3ca5f9a1296f09021de57930184ee4b9f563aebf5fd0d5abc0885cd24c0f2 +S = 0d9706f4474a8fb0c701505516699025fde546a21a3fe519a173a3ac01f683d40b4db2642330bcdfe188693b15a476cd9339ae7 + +Msg = e793237d46e265ab84ba9929b196405faa3b0e4686e8693567e53f68e6991e57677974677682a2510c4c35b1968a90b32c4941af7813775c061c008a60f9f671cf7419c94253d6106b61e65034497f2d273a5058379bd986e3d917f708f0a2bebdba150f6d78a3af9c722a2430ab0f4bad602e91e18aaf258e3785fee78e4502 +d = 073c807bd7e07379782ab790720de4ae5106f16d34e80ed70da5b1594e660c9b775db94066b93e74f855f57d88b6ecc6228aace +Qx = 0301526b630ac3fca5085f633deadec27af353233e6f241772c7fdbfa42e47a04b0d3ae38c04eef2109390a71fa9fda652343cf +Qy = 137eacd97a8449ce83f19a13a248af52e512cfab3e2ce1ceb789874cb08757dd9e47ac21b5c0846498d8d7cd90122c437602d52 +k = 09245ba1873114ee2a3e642c5b15049a3566a2f003cb3d25250028655fba98203feef5f307a9f4c77f232976d83723f2621eaa6 +R = 0c8136d4b998ca0544ca1430abf55601f259aac7756c75d1371de63d1471053c789833c5cc257e323a71f80e21783df4efa169a +S = 0e2ecc6f0a418bee5de7c2418c4ad85d981b18048f94865821de696488ee19291912ae7da1cf5fe9708e2beb18e6cad4e3f7849 + +Msg = ffb8bc80e7619a562d8506eba7658bef0c25ace3dc1d01bdc2ef00933d4fa07b80364e5e5826074edd46a707dbc3b0ab19eec7ea8990839d7fc0a80b70661204c52bcbef57c1a7bdc861c10766033a82dafbead283d911a9502d5f9ef0a39d35ef26f3616212d4bafcd413ffd18b424fe09b48ba02ca5d97ec996205cd49d22e +d = 0a68379b2296a6c944ad5dacb593b302d8ef0b05873ce12bbc371d705f308c739d21f343349524aa72f05341e64f7435daef112 +Qx = 07fa0f698535b011833dac1ac96f3739ecf0c29f7fc1f8bd635f4f98daa70a39310611ef51b2fdc8b37eee3573dc34cd2528d39 +Qy = 0be1a9dc30dabee3403da4f2dac6622e6fb8496e72f3f17c169e7b554efd84ac655e727ae9520feaecc752601d5391270cf0cfc +k = 0630547017103c3f97de48ab6b942db94b2db9ed7dab0391ea9e71c1b788c547abc90088de5b3e36c9ee4280bb454c7c3710999 +R = 0916aac91ad329d6f330cb051941c781b9e59bfbfe45c4d4f6ce0d1aca982e1c612952bcea06784c57c121b14cc0dcca783d0c2 +S = 06a83d93f9bb81c61ac290906d74e2d3b964c39b4e96370f19cfb4a55a3f7901bca3deef4bb79ca6a798fb9b3a9b0137c5a9324 + +Msg = 946bde90a5b903dd281a51d7fa93d80f3fed07eaf50c18fe9fac5acf67326bb18effa3144e25c151efc006a50a274ec6c6a5d573051c4e2d117ceb0fa125acad07a10fb6534a8e5f5b3da2a1136779c51377bf76c3a4a93c0c6158f729f2293e414fcb952c9509f228c804f0adc1daa327a8991d48ccf4f3957c5f8ccbe3ad4a +d = 026046bbb269ddb1ec14ade56175482343a21b7c265026cef3c7d6a1ae0f6a68166b9e6c49a6e733ad2ad64df7137ef230038fb +Qx = 0d09d8118519f9d00df7514d2ff99483473f680b750604580b61017513870a3cf1c403495cba488309e2c084079d53139a36953 +Qy = 0d25e41038c18e4ba6f4e9d14f210b71f27b8ef2c1d4cdd5f63edf8fe11d548d070177e9ddae382fed2b163ff2b58546f10a99a +k = 0d6b0e5d83155a035248ccea95feb0b4d1af818e5ac6d5f41f1a255dd8b482a94de0f4e037b10339d1805dbb6b22af6ba834219 +R = 08059524790304a37f2a0d57bb2b93cec79a827b1fdc9ce2d7dfd4d277e0f71844d335314a30bbec5598a399e197a852b5528dd +S = 0e7870e2a0ed16cf340a04fed4d2048e4e231cb8918345e1852bcd3e30413a2219864851121a34fc98dd99976e2b20cf1d1bf2e + +Msg = 07f3fe1369ebfcbcacd66675bd4ab22edbbff72e68709cb57d4f590e49440f01691f490c58b5117bd24aa2fe2101b59c61c417c918ea08ea34bbb9b8aa17491ae5d9329affe894f42d7586017877fae3ce35bb80c97f92a004380374ec91e151995166e14ac00505fd1fa810cf02981bacbcebf5f81b2e633d3a3db6737890f4 +d = 0bbcda66978ea526f7bd867c3303b625f11b94dd9ee6e2c2f8688ff07f2bba83c662949d47ad47fa882cb7d203a7f0ef5dbc52a +Qx = 04cf5bc624553e833ffbee05ab863e5def062e0d57c28e71d758d6ffd3839504d7ed9d3b1a040bdce8e187ae0b4ca23aa565b01 +Qy = 0fc1a15b4f273737eb92a56928395f6518e05bf946afb65ebca3787f7f8bb3d946dfd26c4831cfd171b4c66c2237409ebf224d9 +k = 0a2cd205d957a20c79699e91684cd22746c476a79245f11e7cdf7e6b74f07cf2fd9eea65eda97e8994aaf51942e15695545abc3 +R = 0aa1da120fc19523e8162e6018e4ee053eb680ebc7e31d00db34f7b177c74c5e6ea344bba3c39ab7ebcd92996a1c156180b7dc9 +S = 071aa4588741208344b323642fe03f1cea73865ba645169df9c84bdbf7488829b83b8da172f1927de1c8cc318ede545c748c782 + +Msg = 3a1cb13438e3bac9ad4ab1d319e90e2c9f118dcf1eb54d6333c674a665d41451f93cd4a9334cd057a44c010edb668254517a63700a31eb0ca474c84873e486f2f8e158a1a7735362ea0cff8ef17d959ffd851b21a91412709b3c729474d2cb40f6ca0e397030eb2611b402916e4b656f0fd868247d80be3ce33d52054b7661f0 +d = 09be3dd3442e0330750f0a6252bf9cb317f32f942ae516a4038dea2c40ca6484fb33611bef016cc64baf166c122e87c15466fd8 +Qx = 0f05a6fdbe6f80c0f5ef3322d8accda4b9ae28c91b6198b888be713afa5e652e907e5ca9aff5fe77b6546115b4c732bbd4010fd +Qy = 00923d07aeb8c947688e7d3dcb16ca69440e2a89539a41b8fbb797523d3b766b46d257b87472f5084992422cebdc4e45556f5e4 +k = 094fe051a13ea8dbc89c4cc5511881a48ef5554de265f0badf8741ae5027eef25c617bb6a3f454a992fc68f5a548903809de09f +R = 0162687730f0ab2f57e348476d1fa4eaf13199ee44f44dad5807bbea4e5ba79e92556f287cacbbf1fdec9a8b78f37e78e52dc1c +S = 01acc734e2d0c81a56ee8c0465661c365edae56228ca43184ea1d7503da3d38e7607b1590f59f5190e5c7264cd0d7a39be71069 + +Msg = e58e7b881a563d54772125b2863718690a5276c93d9e1c5feabbdb5d6f7c7293ff0f89805b53663bb417fdd46874b8e6a466e7e3ff6737930a0662af1d5879b071b0dc4d014778dff26a2eca5992e763bf4c4698c382ac947215aa116515876008a56e5bf547857049c38a2d3737ed3393705fd346897c3beb80caab88e5b8cf +d = 0ed321fa283c662e87eaab99b7715e6cdc9b42e14fa5bbe2c56fdfb381369191a42da7e574839f90a85577485f19446fccaf6cd +Qx = 1bbb34e6bfb1c1335c48e8b44cddd8a46486fad4313581df216002b382db1d58adcae74af0d38445cac2f6cd9e2b439d106f595 +Qy = 084473a5da9f910b4807ec5ff450be353a187af6ace821b18e096c47752b6336dbedfc4b481e356e689fd9c03ffcdbf3e4ea39f +k = 06ae69e55ac1f7b0f844f5ee0b583e652e0e5bbfa4eae85c59eea1485148e34f4d33c9ddd7ac071a28ac0a6191d5ed03e88bb86 +R = 0c3509b6c0356e4a30a82fa7411d1fe17ed190b7eebf9310c44fd568494c894a4f4a1a09e58a4d030d47227e54f7220f3f79f4d +S = 0d44ccff47d9fe82627393c03f882d4b98633961a897381ce8b2cd18f38d69742802d18e6c988a23eb425b294f2c1b84cf42cd1 + +Msg = 8889ea1da1cbed98963941f6ac24f47253ff6af52de920765214f2024aeb04f7ad46936830a8eb04d95aba64ed7cda6ef242f454b67bc2de38a46b6524bd5c96739c4b580e89829a61a8249ec8dc27a50f43b8554cfb6f4fa4ca6875983d4b60a1c6b49f32ddff6fac0cafb64d55c6f594b195c207a9bd920dcf20e0080920bf +d = 0396b805073f3c3b552b1024dcf35559ac44f255b688871a3c6657f727a4b09f3806cbb75d26a00ae1728be632387e804775a8c +Qx = 09957f897a17241eec5b8415ed7ec1bde5df11583255e0a8136d076d72ef377ab3f553d6f56c054332a24098aed6d12878abbd3 +Qy = 1f58eee295765e8a55e388e235e833bc5cdc5d51a1d98e13429bcb7891b25487b7fd8ed804b1856cb6071cc28756bf00924bf1e +k = 021959970a6ad070d1ac518493e309289f3d9d6e2a8933bca715f53cee4ab9000ba2d0147282495e15e63f258dca87a5db7eaca +R = 0d1ca34413341c115f780e647519547602e0361ed4d70402f42d735353696eac6e4024ed2eacf9577252d40c27297e9389d1f7e +S = 08cd5bd43794b32d5bd2ccf7ae4deafffa0e0deb92b1eef9d3ef807d456e459f92e9f10627b7e7574ebe3c2faa858bd3e62e187 + +[B-409,SHA-384] + +Msg = 55053af9370901e38622734a5bc5589f6a20e258627f381fb0c366f3dbe58394e5997e978eb7ebbc530f6e6186f48294149b8594fb551c31c50521a8c4d67e5862921695604afb23977b6a69b21abe75966fdd11bfbdb6b51ab0a474c5fa07c4de7872a3bd81acc417655090558dfcd5af449b3347e61fa9e839bb9457de64c1 +d = 0a8fe323f6736bcabe971c7d964e75dece70cb54561da48a11c40027ebddb23e41c7b48600f569500fe8ea2abebdf480171dde4 +Qx = 020f2dfee967949643b6cb8a3810524044a4b873a4984e9795e4dd7976536a2d748b8cc636ef5c8fc92aba5677c4a0951a33327 +Qy = 0956ec5433d73162c9683558f0dfe8870cfe66575f2c34c765372c7c3bc3b291e95c4e3665e4ec5e72131975f0b1f5f30b0c844 +k = 013f26e13d43ba05e01f92457374fe2ad1ccf94ebf22334447f9360f7f9748bf3665ec3058ff6184fbfdbf7de9e1e2131cd3991 +R = 013c4c290cf89789bd6dc523deffa20c94e92e88a76eebe88457e30cddb066c7a43aadeb0493b264cdae67532db7dadf879d991 +S = 043bb7a8db3d79938beedcd6ce02f375e26ce807a2afd4fc446f372fb09a69fb34734df5dc8f6393f86577a8d29014494379624 + +Msg = c4264330534a6c2bbd8a3b757e0912558302ce302f835ad8c5474993832fd30036fdef40b10ee37293e871db5b0b149654f9e543e22111f9709ef45732125f713c031ccfbc9a2f3aba160c241d27be4dab87ab2fa9a795752ab2daf20f9d06a98d90d01c07133adfe83cb11d5176525e1bba6a9ba70ea48b224d46ddd8103f65 +d = 0105938ba9f25034da3e032dee121bdb192ac2128b50a2ed4bca042e96cfaf4660c9d35f3e67bafd4c99f9447e6dc408e0c4471 +Qx = 0f1a9243920d7cc26741eb828bb55e34c140b0e52837792ed6274a9aa6b5534cdc5c596a1141a746dee380c0d9c2f77094c36ef +Qy = 1393ed8c609751550ffd077347712f3b27a869cfb1b532c5b19c381365ae5dc8fbffcb2182777a17690616d71c66524017d861b +k = 0fc52aa8c590aa28c5353568c9dc69734adfae840f1e0642b57863dc7f4faa37bf3ca789a3d7afb32c57f66a61780e253f50af4 +R = 0c45b1629bbf3273c0e785a28cb8187ef387502ac4438a3372a5c72206a15d7c5ecf9203ecfd7e0ac910b6ceee3be50c6664f81 +S = 0a0c2d31a47ad5f9dc2d42dc36714cdce47666f6e2f05ce0e7136f166647540d1e5fbdc7c9fa0def8962f44f2f8bc9addc10057 + +Msg = 3236f1ad164e1b25d828f5202e3513c80c72a577aa9af56f041fd96cf5a3363f4b827723b1511a2f16360e32eac90ac55f4ee1146791420ef9e2af333c17d157b00e43992ef6f2be2d2f211361e468413dd93fb69232f0a0d110bc5fff361c0410344aa0636bf809062c73a7ac7c142063912b6ad7e1626fd2a384f35faffaad +d = 0ce11677ca818537dbaeb880fc967dc8bead203a2538a55e756679c4a9e7975b9b3e6aba4e6c6eab4152d0c0939027e9b0bd92a +Qx = 023c78eda396efa28c92b120c4ca1e19dc6c467234f9f73701d8966bd0826c20122af5f7c9ad5a5b855b6dc517c22131fb0b5af +Qy = 1ea47619f91ed4a010dd49ece7ec78c5e98297220b4c239ff4a8c29aaec008011acbf7e4f985c02311ca703bf4ce4ba43412ecd +k = 0dae763fced0e498e3efa1c6c412a25774c9bd6cd4bce25ab0a7266705cdd54040ec55bd7e6708e71b09ffe9c19af9a1ed9c878 +R = 0a70694fe5da7646184b23b4b434bca1b754257b8e7fa9994dce4a7a92b7ec8c7f8cc69f18d17915c6bbca24f6621f9563f7c35 +S = 009e6ba97ac2be8537afe7f8f8b9cde8841323b5cc63cf2ed46a7913096ff8d96040296a1bf9aad691b60e1f18233964a421fe1 + +Msg = 6c400ed098d8369dab6fde3553afbbd4d47836d0d12dd16015f15cb8d067a39391c85ca4e78c62b8b72c1592349ff8dc52db8ccb7fd80c085fae456dba6f4a2378e184dd59238c92cf04e40d43a66b342d2a1325a0bab12b1ac857f0564c27b35e6abed02ff5bbbdc3770ddbb2ee0513df48bcba925da6d61583076cd3129603 +d = 05a239ae0f40d76d8d3589f1662b5ca12176a4b2784faa8339b54e96a1e1294433a4d83bf904196f939bd8b33bdb4be340ec703 +Qx = 09d03b7985647027a17c06b30ce9fa1b43d0484195f584fc347f7003802613b524cb5641db3425ab4b3839e12c012853ea83843 +Qy = 0818f5e270baf5a771627b098a6f9ad8a8262e331c299fa0722a0df6ca09bdb9c92d22d72a73567cd5497d06639aa47349df207 +k = 0c22251c73998a3a49b3fc65acf01438941a8885d1c5072a5d41d779af70c044153fed4080151b524af402a4e8ede4448b717d4 +R = 02d3a7ebe5de23e0e601c6e41616bf2a9a7fb6193fef8e3f0a7fb8128a925f7bec3833669d1a304652b7bb1af5186b2f612da1e +S = 0b7bb17155068a8d9b3412d04d407556ee133e1a704ec5da87ed19dfde60517501af345e2e744d35d844f8ac8ad08b13b17c498 + +Msg = 039a149eaef2de30b0ae457b376ce6fbf88afd4cfdec02d3c5e00400d3b0484c1cd6ba74db5de65d6f2fe39871349b30fdf1ef29bcbb9e182eb3ec5629d07d98354a5dfa82d7f0db3dd10d1510c0dce086848a198893ca5ad24a663494f0596b4eee86199ea85e7e8f2f76e7a6bd4a052c54287f61b391f1e52f96b606151c34 +d = 0077390c62ac41aca995640fde0c79c76f4ea8a8dbb22323ed812bee837ab8798c5d0ba976c7aa634d4b1c2c155de2709e7352c +Qx = 1a9357770270c528f2af991c447bed86194d458f693a871ca38f271a9e6a566f5b9ba3ef3d2f9bde959e42934c95867b280e9d1 +Qy = 01f3a0516fed36d3622fae3f44d87c4bc67cee0a995cea242e530451d43781f2ebd163f6f521497fd7a1a6c7b93d33b77083a5c +k = 02555cc113c8516d741b47ca41f53ed07d509845f140dfe7dffbd01a3f751ea9f22e12c939a2ecb1827c0e56b1b1c5459b66aa2 +R = 0e88333875a507520d0b62b35146e37e7ce4e2f2478a61adfcbc6e1aa9fd0195a4960c633d9d6aa9a79323b7ee00ab802768436 +S = 094595255e8862d14980893c095608113737f42b05b561771f56ac1d54eb521bcefeb3928917c07c1bae74cb9aa80dbd34962d0 + +Msg = 08617d04fffd6644c40f7dd57919f7dcf3c888f4147535d12ca658302305bb8e220bb17ccdc480254004b9035b357120580882ef86aa5a061b2850100285b7d61588a664dd4f5394f5478e68a80f610c9204d056009c1c9e902161eda33ef61aa902e96b6f094a9f053135692182943d38b9763055a38739a2a2d133c5dbee89 +d = 08bf23b09fbbed1b55769907aafb97f4759cec98649b2c9da5157517d4f85bb70157076b5e4aaa7a940af042302f8be06a84ab6 +Qx = 0883c31c474333f74ab2b86f3eac865c4b2b54975ce19c5cfd23682d041ef3deaa43c9f9e2c194ccd3add6677de31fc9e07dfad +Qy = 0a5a36b54f4eea6b300491ca22054280b3f09b202b2a6b55df9e3271c763b6d8360a330c16f936d69fa463bc0c4071707c9cf95 +k = 0812c83aa9dc4139f8c3f7c55509f9e10e6cceed30e16afc028b1904b4d260ed0e77acc26e711a7a8e24c75fd780ed893c0bbca +R = 0fce07c6f791a05de29609b59d55b7062e82fb554341b2b2a8187baecb9c95b01ca5dbf8ac88c60babe10af2edf5985b35e10db +S = 02bd026a3e45ac439647a483261107829411c1b4a9ab603c080b92f605cf742754b654981460cf7aa72b5186b59d224dd015314 + +Msg = 34c959f549a307f21b850ae105f41299b8bc94fc292aefc61aefbe0a1bf57576ba8d9b80caac635e4edeb22530163fa9629665fcd43959f68eee32482f1845a78ed7278e6e43d09ed6fedf465001afc0d61f1d2e1d747623e82a762576b879c7024e34f43104593cdd691d53bccaeb8f212dc29bec6bc94cf69d0a8491db124a +d = 0082ad05d19b8e16f80e53a4cccf6869ab5128c5e622ed146fa8555985ccd2aa3b9957dd374586115d4d75b1c01cf98ecfc3646 +Qx = 04428d05366b0a46e6578fc7528d185a3f85da06c4179e9c9055dc0a7fb4afbc53c94954f268e36d2ba8731882bdd27d9684c81 +Qy = 136ba6048ec672601987e9b7402fea24f88c1a94717ed5a83794add0f31680592d6cafdec147dfbc400e73a6ba1d23d4cb0d707 +k = 0c00c897edea7bbfe1913e3da303d64d0d657a83c1eac9c111722b17c65391f2cf67b78219e748ceb269d6c65f01e92e6952979 +R = 0624c5bcfd8e0ef22ee6b34a8b26bc051912cabac102cbf56c364a743e8150195fc55a3fec90a8fabed5eacc1799b565745bfd1 +S = 0cddd4937da8176ddf0de7f52a4babb1f6fccf861533f796a487f35d060ad9ed4435e5a67166782b53c20bc06fd1b36c265c1b0 + +Msg = 514f4de08a6f49edbb6797c9dad6d33bfa367cc1a1b58a5becfe646c7f3352d5c5d95f7456e7112c4ddc746b9076b9756ae3916c07bbe6d3823895774a42d25d44b3309d18bfe7e3ccb1f85dacfec1654778c19e2981a853c1f40a7eafd16d331093110698c957fe9f1d86582706a6885543248b944bb70cdf9d2ea89190cb02 +d = 0af7e581aa4f9be5815f0c447e39de00da9194eee5e5f609668b9b69930b5b48a948614c2250260d1917f0ebcb00ebda4bb52f8 +Qx = 044703e0b49437315a64e397085ea2ba3f2e2c383b168f31a922e5916d590344906bd2a911074b7481aae7f3f8f4807b110f2e1 +Qy = 05a13607a3bb89a2a88e27d5eb5cac4eb498d34e6ea861c80271ed0c73e1fa893adce0c1982b8a8af6a0249796e5276d369c3f7 +k = 08e7fcadc844456f14ce9354b218d519d86c0c5211d62904c937d6fbe8cb16264d7d41d98a15e9f73a636ac3739770738d6b46d +R = 07aebfd1681bd5a2f995ad4a709e8681da742649c0530684fac251494263e98d67247e1e4fc174b409e7e24a7b055500920cc82 +S = 07b83b9b5133aec165316021472307b8b481e6381754a9d0b4f9d683c2ee7cac94ed4d8a72cef61fa1f6349b6c4a54ec38975cf + +Msg = 4e5d16cb1dcaa1abab1e371e1de02f31ef4e0944dfe1fdec45ab64326435b2af9aaf1a6ed8fdf1a6ab1182bb53a844c7cfd66da30aec0d41757f5988ada0017c4ca752597a9fd3637668bc1a92bb1556553f28d66805bb47f1ef91908ce098d452872da9800e77e1fbd43ffb0ed6fe6a62185d4be73ae96c9241b82cefb2da22 +d = 06d14107b08354e6a41d7d7d50c004419db8bdc50db43428df5e86084551237223c498bce71a17e25695bc438c5c09e009c60e2 +Qx = 088c1517355cd417a698b648508fd07a457ac13a49d1bad17dbfbc9735ee58343316e3eca570bca130c753e17a69fe5bd7baff3 +Qy = 1397a697d2113d94daefe6be491ed3edce9449c707a57af3a164d172cafece564d686fe0d25725c2919c60889af4d0354b05117 +k = 0f3bb2dd9eece25c56159f501af8b619a8c279d7ecbc08ee2af6b82ead80375e9c07227b73a10918d8c89d1a2b12cb76427a7b4 +R = 0407b224d8d9c0f11a8e09ac8d654dc6e1119e2c2804510a84ec61f9017899f9613e37d8166e0fcaae16c3cc11e9f739968c687 +S = 08c2bd7d02c4c537a308fa40db786ec64fbc2dd4c142b18cf9bcad66199afd4f44cbf221adb3837e84173d174e9c0d534720ad3 + +Msg = e29e75269754ec1194270f5c9e8267dfdd8c696008b5ebc92bb840981fd065672f07f6a0f1b19841adfc51b478371e1a0db9c3346a9f0a4ccbdecb7040191a00ddfd0a8faa0e69fcf544319c0155d02797eeef99fabbc55078f9d852927c23fd931685424249b87ed0c70a4a3e2d3b9a2f92830e7d8f7650c0bffa8f8986b7d5 +d = 099d96d2dc9c79549f031bd5346cf6a8544c312a3fbfc560dc8e378efdfe025b0e6e61e09c04c8bf4133396f993b0906c33dd30 +Qx = 0883e00d72c60f22ab085a90901ba3e8a510f19c3d62dcb3ee5066e0be094cceb30bfbed7068d0bfdf634a53e2fd002dc9e454d +Qy = 194baa5d7ae2399965fc4009ea83273676e66a56fd35a5939c26ccaf85633adf78b33dbed6da305979077418c625354c7fb6283 +k = 0c213540a452c4f2ef275dd844402dd5ea590f7df41ad35523edff09b7fbb096f8ae8a4baee95428fee03a9e6f6a14ceb90e289 +R = 071779b477245007ba1ef5f05446c4a08d1c2eab550db9c053e4588c9935f07ba87764f0fce14d4a7b982ebba89cb056aad8cec +S = 08174bb56cc85ebe7bca1de1f44cf93cf478d7fe59001c5947c66b837bd3a6d116f99dc4f9acb4f378b0321228518e1ba0057e2 + +Msg = 1a538eb447c18494ad5a5ad27be67fa60eb2c5cb2404eec1dbd7244cd802b17ca5497e779d5f779b981b165dab53ad19fd7bf2ea7dbb9b4baea782a43d758202f147e59d6b6b8ed54f4ea084bc18519943f6894d603e253ba3e8e339a6933bc3a0a47126087038e1c813c3f2997aae321b7c95a802b4b73fc7db95897b7c91e3 +d = 049f347dfd361a65910e97fcefbf60013a54837f2ae657d65e02397f59dc6bca27704fed3affdc3d833fdc621cc5e5f99b92a63 +Qx = 17942b58d42da750a366d7e4cf4cf465c856cd911e5352b50bc8a12704c1ac6ad54f9465e4fc5402b373d8bd4e4f8519341f133 +Qy = 10abcea49c66730ddad7734eb1311b2626b75ebbb299a28c9d60937e6833a9b3dda052379fbcf7875f18680924274fa1764158c +k = 0134c70f031648bf470ccca4ec19c837051bf700c851df564ef3ceb99d7d41439293bcea0c656c0e5361db92a03def51d7e4f26 +R = 06c0f9935abc5034a8b0a05e8d04de699b5916cb367e834f13642f0003510bfb68714be75c9e35b5e593eba45fe151d1df56d40 +S = 0930baf426b33eb4afbed64869a22712591db11acee7c4d3a221a1e98048f05900fe14816006854cb90631de5797f91176fdcd7 + +Msg = 7502c755bbd385079a4001b8cd653287dc3054f3b57de19d0ff8f63c0308c64c56f035117a8971d43654f89b52e923947e4760ac72be073136da70c5ad7ca1658cc0a2d2a880d3a0c0fe636fdb27b77ff260c4c1ef8a18da8e9fd777d732a37ae9906e6c4f381f0a3d941048d5a1f6f2cb8593873fa4bb1621a44bc2bebfbcd1 +d = 0dd226de602af4e9f8e25784bd1bbd4cadb0a8aef525d5e2d57b9f3555feb698765672c5099a7d6dd5faaded69d8d68b4804f26 +Qx = 07ee34cc7a24e2e693f9409f52796427ed86fa71bf88c923db305ebd5a83bf3b6f7612847f16d00f4a25614299a2df92bb693c3 +Qy = 1f63f177b54f8dd5c907ff318b66c2bfc1cee09348c035a4413fa3cf5acde0db1c8af4fb8deaaf8a3a6f8f06b0acfd20c6f0049 +k = 0e19c21b05c82dd8c873e5f30c1e3aa9348327f959a4dbd9c741e233c649a426cf7bd9d8e93232e496d0b93ce835f80fbcfdb2d +R = 042a3907a480329a6169b439a6945cdbe8e4572779c43fa6cd1f15062559dae9eda2712402ccbdf03d88a8a68b691f1f16f8f52 +S = 0d09fa4966d171a662a9ba6827fda830b5404f96f635edd8482ee009ec5c7b64a2a6c17793993610ae8297efa9fe4c35ceb5001 + +Msg = 95eca932d03f1df2e8bc90a27b9a1846963437cdafc49116ccf52e71e5a434cdb0aad5eccb2b692ca76e94f43a9f11fa2bdf94fe74af5c40e6bfd067a719523eea6b4e65730365ee498ac84c46e1588b9b954f1c218920cbf71b167fc977ee2a89429590f43bf637eecd91b0ce3be2d66bac5847205f76c06b914a970f543e59 +d = 0b6fdbc9c8c76cb2b822a940d8675889ca6f5132429da795462381ce29313a23bc132976fbeb346ed4c691e651028f873ce7971 +Qx = 147647d267afb4bdadf54baa3f5131e79dae8103f5b2ddf70e4652f9fc5495123be97215b811554241c53023a247936053288bd +Qy = 15205cd5bf0c5154b2dad8367e1b487689b898acbbf44f9ed67a37babbec739804dfe737b324ad663cd2cad79274344397099e7 +k = 07321d12d616dd2ee5f843d6ed7e92d18968b3a76c0e4ccc167790afabad1b7c0dd53d82aacac93d98679b203bad88d5ef0cd75 +R = 0672c5607acc646c67456ee77f2c02117cabd241f728ace5117626bdf91662323e7565438f46a3e25c048a8e2130e27fa1fa2d3 +S = 064aaebf9f2fcbc843ae1128eb6c7e7d1fce2b9901dae0f60afbcb08c7f2ea1b550e159947deb87dd8959921846e2923880db6c + +Msg = 8ff68cb00d03e730dddb05fe0b2344689529096c3da6eeecaf097f22c7fa340593106b1f6726f06b7ce7358edbcf801ead959438a42f94cdb467b3cd5b17fbbcf75739805f9eadc869c33c604cc58f81591b0b8bf4d42bd53a801f0f829a31af6c129fb4f20f1250f959754eff8c629b85a716b6a18465b6495798c0c5166c8c +d = 0203d77fac64591eb9a18de20a9d5eacaa1c3ec58a5ecdb3008c2d642e197141d16b3a9fdffe61429264f5b420f5e9926659a4c +Qx = 00f66ca09d15d0991b48ce7afde9a148565b73807e435ae0f16c14cd439454745f8ae153786d7c40cce3f43a8aa4f0564cdcbc3 +Qy = 00f4c919b7a97beba2559a8ad0f85dee40e8df28e23732d7de655262209a5170f94791e255e77e8c8cd64c8c9900092e0ff9d5c +k = 0859bc752300d4ba5014e302aa4cd2a979b3097dcfde5c59f4bafc5bc8a99411174d2ef3f7377df5a09269e3d9461be61801942 +R = 0691ea76acbd5e8137924bee13326ceac8231688af8595718e210bb857d6619c152e1fb46e03fa83bd6b5d81e2463f9260407eb +S = 054df52eb86c679d8f8514a09f5a3062d2424cdc19fbf6927f744aaa8c444223f1c28ddc84b1d135a886eb7ac7eab3c7b0a42e7 + +Msg = 01451c4f09720cd53377a5ed04c907a735477378ed960235a833049d6bad6e6e89958b4c4249bf0f6d4f043530c9e5426deb0ec3a12b7feb4860757b41bf602ca95655155356ec35a2db8e2657998f56529be4b714364f83a140846308a2973907ed7b08e935173ebbce5e29afe1444cd51c92824ede960056439555e7e74450 +d = 057a2e6a59d4871c3d547690237dd9846d6d5dc4ec0678aafc9c8669af8a641eed67bfea4b05fd6b3b5357ec4d0caf352691ea4 +Qx = 0351aaee4207bdac826ba17e3b08dd7f94c0c8ba0d9829d7bf0eeee7e6375458b5457bd787f0ff38564734b3a0412bbddd7c371 +Qy = 0e09c4dfbc33d61d69b5a8517baf5e4e1614920cbdd89bb05f0420be757253fb92308dfe1de8db822f57b67b393d8a70d989b26 +k = 0fbe560003dc220e4c966b21c874b828874a33a93bb69c49909376df67e5df1652fd91a1d73c7733f26c121e7a3b2d1246c9a61 +R = 08b85cf3a14fdfc69cd42750baf362286940994479f6ed7ce1d87af12c5ae075b311754f1d37d8ed10bea092bd3d9f7afd2f1e2 +S = 02360bc1f7a98cc87ee2a4feadb98554cce59aa0fbfc087747c7253e54c38815cf91c8517f5692f95bc7c3a713fb6ac43a34f7d + +[B-409,SHA-512] + +Msg = ccd494ca005ad706db03a3df6d5c6e876ef859ec77a54de11fe20d104377df1900b6b192126c598944d19a2364b2ae87ad7fd32265d59e1f22be5833f20767793677b628f18e9619f8ca32f3af3b41c31e87a98d1527e5e781bff33c1a8be3a82ea503e76afec5768d7f7dd1f17dc98a9e7f92fd8c96fca0db518bd143d82e6d +d = 00a3da7a6633608fcee9ce4253bbcec08d41ee6b00178ceb017de74e24d48fd89107c9f2db3556063abe3cb011938f4b4871795 +Qx = 0a6123b122d7d0d766897b15ba6b18b3a975d3d8058c9d359c6c6594cc0dc07d9ef6033224b4aed63d319cc2747c0660e38897b +Qy = 1ab5fad5e78f380aeffca8d15e60731720184ed456800967b2ca47d482957d38409ca07ea798bd892b529774e44080eb8510e6a +k = 0da042642b3117f30ea5f4b354047b164bd128696b8c00cc6fcc767246daf7483284e411009e05218246830940178cb4ebabf1b +R = 0e4ce613e6976e9e1c30c0c93214a0a37f0632de85eaa25464b69a251d592560b2039fc59b15ed7045c29c268693d7c9e06d8ce +S = 0ff3ad5ca70aac94facd842fecdf6a28afbceab80b549507954b7dea6da06d1facd11e0a88e9c2a549e6971a08d1af75aba8363 + +Msg = 5719e50d939a8d74efb444eb5a77cda48cbb59e7f976cdb2ea2848bfc558718b39ce27b893c229db94bf77992222d1746f8f52f858f85124a28193ae0da039c53d484681785f3367f6516fbb8a86560aea9e3428551facc98cdb1e9df8e2f37db823a7abc589f667b5c93c4c47061400220a2014197d514217fc252cef5a2433 +d = 0384723c8b4a316b450d1fce0b2645912b8acaeb3cad50860cca43bdc0206ed5b3b60ebdc29b3eda305d0d60eeaec261edc24d5 +Qx = 0fb89d87ca4282ccd048606e4d321e7ca73244b4d0c9d3df87d54e038a14939138bff33c81a9ddd64abdfd698bf103e45c96f97 +Qy = 04ff7e1706688a53a5544f4ed0f3f5e1f0fbd6f21174166d25a690f260766646cc6fb39020de9327199225e44f3d95c5984fda9 +k = 03a9f5f26eac81dc8ca0a17acc44322d43bfd18edcbafe24113f5e5fad0ef0a3db75ad1b2422c7321593e41e76eb2a767a14268 +R = 0c311000c27539247059e4a8d789ed4db93fbaea021272a90045bf6fdd70f4f32cd1e195b99ee6f03f4fb57c3a115ffeb459af1 +S = 00db8bb46fe0f99b4e6e1394a5db283e310b24d6006319986dd2c4cc169c775c89d4ad98d0fdbc3c0bef6b7fb6b43ef21049bd8 + +Msg = c84e5702a339259a61b5ba8ec1957f23ffc4f1eeef3a58f383d3731bbaabfcf49ce2ebb597960ac5115a2af1c62b193d4ab6c24433d5f168a1752e40145f19aeb6dee889a53a4fadd13eef60e28fcc7ed6a9b8b0ca286c1b3d66a4b2c327a629d15c148049e3a0ccdccf05cf22c31956014595e417060627c8125bd7c00f8850 +d = 0bd3136647572fef3de51b12e64b36460bd3a27dc660c164fc705417339cab21f9e1f9be0f3da926df459c5ba58b701d306e67a +Qx = 0f45e18834d1933a2a26e95467b6db85d8c3da372e607907798745cd9847bb8f8b51f996c7293b51550144f227933ba26722685 +Qy = 05d8b108eb3591b164745d116c80afdd4870187061c75af9b0c3e87dc8262586af14f4d6b1504d274c07c8e89247196d8ce8166 +k = 047a494645b99a3469369b72cc918708ebf453957b49ac4e209f2edd7a4861d014543754e37e1d1a0f477951a0ac2b5826a470a +R = 09de9e0147e1a268f80836d7db43779ce12e7947caa851d109273ba7e7dc7fc52c601f5bf69cffd5adf0695cd7db8de2a64781f +S = 0561aa76e1e9f2c1d4aaf6e2da143f67166f09199e1705b631d650528e94d643768cd611467284a9f543e50520e3e738e5d56b9 + +Msg = c90bf11d04a708e64b6f94d4cca64b92463eae878c377b188c82c1c5f05a038be20eca2e18034d46f00d9a6fc73c4084981748ee9d2915d87aee4e2321f4f9e11c176f01281913e324700d9cb474b7134fcc408fb4a7006acd9e63d4578ed4c2729d8e0d01b1e6174a43a024ad261eb644ae98979c3cdab75af357f6dbdf5db1 +d = 0495be0b0a9d357f6155fac008cec90442200bb842d89292fde38b7256e4117284a60249b3101b3f19f778b680c0d1d7422b84a +Qx = 11119cd910d4e962f54c9776c9180e7eac2f71cb9748ace4b7dfd2d2b3caef4964c7a55caa9763e008de600b727068eda9b9865 +Qy = 000b48246cfb7c86e9dff4ba77a3a53dbb1cefa168026b8929c42c3b0251fee5746897916e50f07dfe8b57baab7964447a2fea9 +k = 0ad4ab5ecb84118c33a4b06d1a9f5d2c4f1f3dd1cf71af596eea771f851d0371d2d72593c926d7b69b39cdf72931f6bb11d10cb +R = 0e959201622673d81ca16ed94e9e5be3f38bb8db48f9c09a585aa31ff39f14128d79d604a5f93c80aa961c85bbf99e276937f4d +S = 083099697856c780936ac01aea5e3a4d9b6e183639cd200464a5cc05232df30ff5220dce4e2af714c580d561b72dc4969166a6a + +Msg = e9b2a33906a1079280100039787377c2971c378b92e70a38ab41dc23979d6fb0c41e53a21b37632407adac6f212341cf6af8605b4978c85c9c16960e1674247f1795cd73b99ff28cdca024f5078490513c77114c2f52288f5376872c331151d7b2c08f7794f2c1f9e0d849d32d73636f0aa899988ca561a76f74543b37cbf3a3 +d = 079626354dfc4eeeb51fcf232ee9e6b0130c9bd40f15ed45606bb7faeca8f359e0c3e18bf12769254522fd4077eb24bd5454871 +Qx = 07ad047bb38bde6ae2593e1e41c36b7efbce1e0ad08def9b23d25b7ea9aa336eaf10217df16d32ada4af03dc193d44e6c77e677 +Qy = 0d2b9466ecf321605b9f4f9528124108007203ac32cfdc7cb87e1790ebf4bae497fb87011e0a81068e66a840d29583bb970e24c +k = 0074548d1a3df580e45babda6096f4c78cd70945ff190d9da463fbb03a511c45d45dd1c46dc0b9521579fb506bf015f8b835680 +R = 09e04e9ffc2cafdefb600cf61e803eb78cb416304210165fa7c93c1bfefb02cd4a255512622d524141de02c2cbd193991dcef67 +S = 01a7960232455f27768acd825b8ef91d4efacc38684d05a900a8512682ce19787033cd08c1f2412b481b88ad02dacc0ddaa0ec2 + +Msg = 672db3fb8cc8e5f831be700498d3ab3aef14b7548e8011b21351215fb6dfa09460d18f52c02c8815baf396d856a429bb9afd602a10c213af34db80447f4c06ab4bd28873c88eb9639b199042d4b2cb13cc364f734fd4ab7bebede7dd4da63decc0cc1f84e34d760013f66d71641073f16c08078880b67230f2d6c6bfe17d206b +d = 0ab42bc7d0e3c23f8bcf928e25f9f027b56f270398a1d37bea0ee5426b944a9c9ba6d0d7796899543feedb470f70b2ab148234f +Qx = 1415fe81100f208ec8afd5e882e5773a0c1d46e44627732900c7e1722cd77b3ae24438a8463bf571fd6bb422d7c583439c07cff +Qy = 19c3ef3688ed397640e873dcb20cee9755437d0023646d05612e8c360717a2e80e80f2b85860d71f9876f3a68548da7099f601d +k = 08b44ec25214602de46046b2c94a45f64e9d0903f6148dfedb76a80b8e6314e87bf7dce8e73b14bb274a88fa39136a00537779b +R = 00ec4c5bc88a959a1234413026700bf5d4287a0263fe75daa16693bf74cb5071a64eb18778da0a31210347aaa33130602f6b597 +S = 0b6c29b9177e89880f3eee3aff204b866020b3bf77d7c31204af383d9770804660711a8579a3f1ffe325f225fc7e7894ecc601f + +Msg = d7fd06b89226cfd66671ce5b4b656228c52d986afa7f6f30161680eb0c9cca177992a8a8c40167a64165c518c55f678702125709361b536bd928567c97737bd750d0e2e6e0c00296a6ca565f7c05cc8c54ae7a4e0c334c6a968fc18a959c18ebbd924457701316a4e999fb11084520dac68dc2d69187134c40891af0355ba89b +d = 07f7aa2216164ba689459ee5d5ca29e70ef75a5b2a4416ab588df1dcb9164330c0b405a9d80c3acc41c19f58e24e17ecbc0fa7b +Qx = 1decae837c7258ea9d90314ac87c57aa6d49828787054cc068edc1955245271acae72dce5c9cba422bee54f22e11810721c1ed5 +Qy = 024cdc9e1b27e5d4bd024654df000bc9a0181f7c0f4a90572c75e16b679f4362446993f9920e2244527801e8f6b1e9398bd8382 +k = 0463202dff25e6b9c633b60a3edcffc1a22031cff44dc1b0a5769214693ba02038fe5dcfb4a48db7ec49b33068061616daf2fa9 +R = 08c06b72b73dc2655645892447fc0c0f8055838b194e8fad99fc6bd50774e1ed08313eba4141018af33af95a3faa20b69bcc0bb +S = 0958f104326df6008135bfbaf5c2980cba2833af1b4f04b5918bb51ab0a0df637d6a4af902a5e07db3022c134c72315f25972c2 + +Msg = 83b7e9d3ec638fef51d2885fff5490c94e2509c126608f82660e5fc523032f3e85d69d9b76af145f6bd916dda35775abbb6d1902bf38880f8b9259822055c5b1bc726c51029972cf7474cf2a812f3251aa71813476bff55598d079f075a40c6c41498bd865ce960c518bef75a873b9d010965f342dc4b35ef5c5972efe6fdd18 +d = 021d84f070c6823a70f1a74225a472118c93ce9dc509aa6064051ca4574939dcfa96be862069424bdf1a23f62f2868326422e64 +Qx = 0f568f018b0dc4400bca3e9e4b0e5bd5245f15dc7acbcf4360b0be2ea5abbb87a3cd76aa653d32858438051cbefbcc4feee6f6b +Qy = 1fdf1e1bd7a2d3825df14f8bf8d5de825095663c3014f2eeedb9bed3c3416d56f805b623f40b847090d6b4b3bd5abc98ea55e48 +k = 03344dc1cd950a9c3d039b6fb6af8c5745395d2a3343d86dc6670580e331d59f6c0034367a6df52423a625d70292893961ceddc +R = 0fb010ba41d651fcc854762fa1437262eadfcabb95b9502a40b50f20cb34fa19ec570dad2e0521809ecdb2bff3f4e7055c02bec +S = 05a9c2dc0c1f946ce33f2f434c156c236b09098365a7f31e238b4685e7cd8c86a0b2455e5c83907167c1324bbb37e66e0b2768d + +Msg = c62c7bcc860f0e175128e1127dacf935ce62ae794cc4a0ce7966bceb023ac0498641d7281fbc86f9ef470bbc77f608f83f8d0dd6299cf08f2cdacc7a9642e4246df131820220e5c05d0dbfceda7f16b86add4793e9b6244d96b5c07cfa23574ceb43e8e8b5483192a92b301aa3b37702b8f94f0129d8af1617896b34990c9b02 +d = 0b6645344d17528968c719091b6e2072388881dc10bdb4c7fbf41906cadf3699b30f9c1dbfb4796d009480664e6276c0359e5db +Qx = 0b164b075b80fc8b8ec785d5c2ef84d49f2f4d276546c9cf2e17ea4d367828e9aaab985c5cd0882204e293dba0359d47d9bdc05 +Qy = 0a0c61f181d5d06ff20d0c41cf6d6cf7fea860075cdcbbab2efa0950e2276dafd4258a39c0fe4c45f3c04f76efa7d41392b4d34 +k = 0c497c621c5cd230fb1e4a4cb3af1cc9d8edf4af5c4af7f15c4ad0a8835b54de52d83bdb3433808a67628912a85c5d00aa222c9 +R = 00b22e5773aca4d97d2da846c3947bf9cf2474101a6f0d39d31629a6aa2a4c3a77076a671e37aeb4cee0a94e82e914c8c553e04 +S = 06ccd79ab93e344e6f112c1e4a39e8505a2aaf5cf85595cadc6ddd1afb0b1583d9334cf1c48f26e5baa38e05b6b52f9f12c141f + +Msg = b5bf38fd9e822925254418475a1ce762a94e336f12b156b1625a4574fee11ee472d537ef94b4a4b1c0a73b0140d0b818cd06636653e6c07f0f100118242a7703756f1cb1119b3477c4ced99cf45e07e83b7f2749c1a5f8d8c9272d221fe17f7c6a5fb0f8a16af46f232ce406aaf565c6b2766a2f6528c82e74fa1c0a7fcfd49e +d = 0f8c2f770cf5f8e1f900e996ecdcd84fcff5cd959777fd005d721a419123221a3237e39834b270d37752470deaa6cea023c5058 +Qx = 1f861984fa06f15b801216a1c33672cff43740f0f736b4f4abed5656a1bee33a2aec431680942f2b0b0dce9a9196b49263fe183 +Qy = 18633f4e057bb6d70a434f919b9ce4b7d9e61fbf46c1d9638100d77881755fe9829a69d696d555b1a26e25ac1a1c27b40f909a2 +k = 0bdd99022dd964306955c57b226aef036527eca481622618fa7395f53e60aa95a275f1f2d6e7354d8b55d3e83c85819e818199d +R = 02f1330f41a86c09205004215c24f42fe582da189906fb23fbcc52136fcb4970a33b896113eeabcec8151cf3b150eaf1ec2dd88 +S = 0439507edbd36ebe4fa5df34d220c1441e1a4175c9b0373fc85669facebb5bda7a4b415c269a7add207b461525c6cc94b7f7b22 + +Msg = 6d3474770933ec01b76be789304b6fda423b12a0ae8c87a5ea8d7ee9f71300f39440e1c7f5aa4b47c1a8628cfc3a490b15ef292a741344f40a8fcdd02cf3863bf3e32d53031f503703deab17fc52b3d4032f4e237dcc27231b85d3fd60b49ed7ee40c3344948d87c3f47564d20a11d50e4e520bd16c8701694fc70901a5da625 +d = 0144adae951fe897d5812ee4a16c0be4c86c5e57e615c398f5768a1223a9be20fa82ceccf8a16a31432bbfd17e594a4cd8a6a07 +Qx = 0bce072255f7cbaf565f82db122e9c582ffcfbefadab6d79680b2506792028b200ca7732a98322c290916c66c8a8ef77df6a2e5 +Qy = 1b4b6f65e678223bdbe5f8ecb68573ae3d7f111dac37d4fe3c0eb768c461187fc5859b13452381fe676257aa445bc7f38b4919d +k = 0128c12479b7f0630374880b214aa26e4e8626deca57148a6c6a0e37a97e89da8acbadbbfe7db28a0c5bd17303e1342af711f25 +R = 0a95124ec95e35747fb568e6659ff31867a4cb7c00985b36584201d1bac0775653e0a8b54cd9a9067ab3de434bc2cdf29ae287b +S = 0257e5410a6f0bd94fb3b5b10500fb45b501a3734f0c718035a9a1516d2f88e10d1e38b70c791028e262e0c3128cb84e6064ea3 + +Msg = 92ba7aaf71f625f7a2e024058dc8739da3567c306da4a812ed9e1542b7d1e982c16082166a59720203f4524c3bd463a662c26a82ec7b4376545206e650eed0d3dd7909dfe3810981393070d15c45dc4a75a8c5bdeba533cad1ec34fd20466a61e4cde3b25af9a80a9a54afdd7de1cf2a74ba32d4ea0082a037775413c61a8d1f +d = 0a51f065fb32c55bf4ff6f18ba9d488d35d9f8da593adb0ab1632533284e0adc43ccdbda9d9507b9862ac63b5ae7b0f78b479bb +Qx = 080e2f7ef17a11ae66172cf1c18eab12aca4c2ae06b8106aa1066677a93538e3dca0626e836249eb884a382c3b726736565c3c3 +Qy = 1e98d37a17ea736ae58eab093fa7dce3f10791ee9ef5ec00bfb27bf3c705dd633badc94642c385dcc276f9b1fd5e01dd76ce944 +k = 0d5cf7b3d28459db8dd69c314f6464f770c31f239a12656368c84c64693f23733661081d20dca9bec9c9659a8124b57a71ffd55 +R = 072ba8c1b4bfeca62e96a5649e851e9a311d7685603a11c1c299f5ed8605adaf27cae656cd31335a7ae363cbae5dc7a39512c1b +S = 01bb9819d25a211548461de4ff973ffbf475230baa161558d9cb7ee6f2e682dad21a465fc2ae058121224f8680296d30e3692cc + +Msg = b3fb9e48c333201324755a81f3ae5d4f0e2ae7cd24238fcc66d858e3aeb1ee03328660d6399676eb1b7d8285ba571e214d935bb45516fccfab57b8eb4c3d5f1d7357c768eb7b5e7b5710f599614bd4e92706eaba31f8a5e7e57af7ed13066af50b4540ccdc126b677789920cef8543907f0ba9dc92aae343d3425bd784ef483d +d = 095351c0bc07acfabe6477fe85f97eab520dc96bdd58b44b036328ceadaa56a1904d2217c5fd25155ff2aaf9005a3e2687fec81 +Qx = 1c1311230cfdf5824323448c68ead5e5885ba540a21ff90b951f85d84d78e26da035bfd99341b5901e1ebb18648a8dbb996fc9d +Qy = 017a037929496e560cd1c936d9eb15f79fbff737201dd880a69dfec31209faf5bd2846e3e664c668ad3d6500c5ed620f1bcc970 +k = 02234bafb54cad0d0d51f4b8508dbc8d014c303d90d21bc3f749ed7acc42f0335c5ab6d60002d3bb57cf07018e9c13b92c0a39f +R = 04d0609f06320d69870a3e66f19cd46a2e0e3e13fb8b7785163a7b567bf2c0f437b4e30cc67da288a3b34ce3110f6d87affe0f5 +S = 06c46d0248f7c309c1e5b80ac4b1459bf897e42f8f037031f5bbce0fde50af50cfdc4f60d5ad3d1af152298cfe77dcab287874d + +Msg = 9ec5f7d65082264b8a50be772c44277a73ed19199eb275fe5976f9799d8629fcb4a59a8d55074cd2eb2a0e02062d3f7cdeb05e62931a24fd1aaf14c257944d1b42eebd52726d6fe281211b39038e52baae077ea4df89675d860d6ba5a0f998d049614201b872e134367acc90066ac602e478ac3e43c3ddf4b0ca0aac1a68591a +d = 050245c1682344fef23bd549ac8d1e8e44b2840c43eec1cecd33daa4e9ef6b53f496104d7432e14248682cfd6f5b4853b65adac +Qx = 0d2f8fe524b2108e375c9603598b555d6c4c7724c7d11039178037b3a4dc82b66c3aeffcccd89cc34dc2b2f6695892323bdd805 +Qy = 1f98df95fc1837ec4d5239cf55e97d6b489b0a8d7bf12c1ccf95f689ad23e46dcf20dbb531f5179e754f0c29c8757a1dc67493b +k = 0c683f98253406c6587d87c57991fe5caa3f43b451875859feeb81176b732f1c1eed0ee44d1905d41922878617e03dac53562a7 +R = 00cdc9bc7d670a1b6794fd7da82d2ad1a0e92b82ae32656ddec3aca4de75f407f20fe782daa0004317fa3f12cefc48518298d5d +S = 03ee7c75810c2c05946b53e2f24feaa697af35174402c069b9fb03d89d73964c997eca4a5d6f9482cb23c8ce337a374ffc3e186 + +Msg = 61d657bf472676301503f6784b7286fb39fb4186bb88abf1edacb4a2693d0a1e2b77bbf2758c84f2cbfd1753e20841b1cd4b456400d53f4d686e666943f9b6ffcdb77f510be97536e9698fc84ae347d483bc8984548d1cf86b9b40d360f9c0dc5bd1c55868e26fce1460ba94ef5e94eb63c9f0776a0f446c0cfd4106d9f36352 +d = 08d3b0277f0e9fe54581d3a9499ccd7f015c08339591326859af969d2a26284e3b3beac4a0b74d324ce5cb5f38c7995e4e3a41f +Qx = 0ae18564ac04b54769e17df84aa54903df58decb870591dad73dbd712693d901f3f9ad43a71f23b77705de2b4ec1c3bc616356f +Qy = 19810f92e80560979ac6e72bee505dcdef15b4146185d2f8f5a955a4555523d982c34bbfc1326024410dbad3349e4c4e01c242d +k = 0e52dea77fc59298cb06fb1401d11c662a04500f0470965c4cfaded13b339bde52f4fa04c76a955faac16784f443b1ad9dfa0bc +R = 00c917d487d2aae1651d76147de2a706a01c8b3d223afde7d20c9dd77cc2329bd3e0e4fc01255b7c4ed1baae7d26667bc2e9ec6 +S = 0058c766fd514a405de91a4b9e99fc0b0146d954dc2e2decc2f3f066d0fe192832ad37a940949ca4e9abae0602248b3b56100ce + + +[B-571,SHA-224] + +Msg = 8e14f713a2c427b1f79491033994f76acbead614d12e73ac6f3f518f2052a10c1273aabe628ab38e0d3d5f8ff254802e9f44a51367bf80325b6fc39d907a37f731372864747b10749ea5cb3d3a83da39c21a7b02885a8c1770e4397cedc958e4baa21d5007569dc9dd1e45d2181709d900a394454090badbd0cd9c2cd2369aad +d = 0f42afce7f7b3d45f3f925ab29fc3882a89c9f585177887584703cf8bd8fc572e677adfa55b402446fe1e90dc855358d92c3267c35be9674b40c2ad5ce8dbe6a533c44b0ad8d2b2 +Qx = 63dbcfc2d9171a7cc1835c1f56ecadcb59aa6d5852fde264ab25603f06817a20f2787446445be8b2ba05c70fa25d9b9e34d5374febffeb536facd3da52d43d69fa7af4d4792c792 +Qy = 7686e0629de47916af19f9013f65fa3b5f9d196916cab2f765aff31adb5a959515e83fe3e00e91843c532041ba15f047e978bf2fc69627bb5cd7f3ecd74cdf1a8d623c1efd23fc0 +k = 3fae665eb7a54f51c522ad5721d9e2648f13f3d84e3d64c8148d59c662872b5cb7d911c27bf45884f2ef717d72bd0569d9901f2308d9a68d128c042effea148cc963a8252f1426e +R = 1df705ef13ce900ed61babed02e121dacd55a881ae32bd4f834fa8e362d059223b29ff3db835fa2b2db8fdb98c21dda5ef744cf24d0a798f501afa3a720a238ebd4fe3976a179b8 +S = 1b1e98db422fd48f1dfa049f38865f8bf9ec5618fdbfb50f21cc838051a1493e4b1e4f9ea81156481e5fd84124fbab740421173862c63920e3a833aebf0762e7b5b39a1591d27c8 + +Msg = 38b60d27ff08fb191811036dbfd5b39e1cc3427ff70efb67c851e9cb407f9fac6f348d289df98d055eec73299fcac068bd0fd9ffa3c5d244659e4f714a58d79f6727f323a7ee26369000e90e34e106f99f5ae2ae1b64ee89e5a1d304ef20c071a7773e9b977ed3d49f467d300a881c8371041394910f9c366942449045568f01 +d = 2f36613043cbf53ad36e2b38998bb867503359ae082d07d040e5a10a43e06ba9c91e7c73308e41e2391b65e634f83b162cbdf4e7a44ad818fb93a978af00f06be06731d8c5886c6 +Qx = 0fe1afd356670e1dc6bc195f9513f1dc6b03017416b5252c7b56153da538422e557d9918298ba6c78283efa0288c0ac61298846a6f8adf74df21747cbe7c18a2b825a330e843cd8 +Qy = 18b7659f0a7e8e7ae5d636ea4d1d5f3a1f846d4bf3dfbd96c6ae874354db6faedf02f75c4d1d8bd6a3b61e70ce58e38ea5de8cc16828f87a0667614f6640a3023b7f4aa93fba577 +k = 3fe351ff6ddf50752f7dfd8e5a72c9faad77dbea303fd97dc939eaad3aa7fed466fc8939a7a6bb7abee63455284a5338e59dc067236dd699bdeeae1424d993a9c76fb2fe9595423 +R = 04a0e13a9fde9f2fef417199f8584d0f60b2f04aa6b7524cd2a2826d63043b2188ca977c9567fc1ff292ed480dabc01589db8734c15aadb4ff54a552a7d9e66829fec1dc919dae6 +S = 01bc7d2c4ca9300d7a3001755ef25231d2852a7b9a3e91baf21f2a2bd2ff305be8a9de1d1bcd7bd9eac4ce12ecf8a91c0a409726085382fb8d2428adf1b42b37b50c9e8e0535d7e + +Msg = 21709eeaf9e1953822294a478dfacfb205fc25f447a73a76a32601c00784cbf2f9ebd41c22721d70cdb3842dcaff4a4f208d41c0816990e421cc4b8538ac2f347cdd0aa2a39f1aa26ace8cb6a606b23f6244894d4594a0f6a5b8f6a695fd66e1a41e2eb6a377017177fec56bb58c837e311cd04c5b50575faee32606b9636ec1 +d = 2e74948c46930cbcd9dbe2325539c7dfdd910f309fd610e6599d425aad9ae230a8d4681970a14f2a71fd08030d0a40ff40dade7de1b06a80441bbf7e2fcf1809cff39c7ef88bf9f +Qx = 1b75f2d281592c288fe6d5479a4e21ef626471819850cbbdf814593bae7e6ce2a35a978aea354649d979f161543fd4c12dae0efcdc2d95e82ae5874b9c04a2143535097b8a17c68 +Qy = 0c7160c2efa3aea1d18afc1a00b47209dfc750a5317ddebff04bc4d181f238d339a7690c24e55be2cb0c01719d34ec986a07727f2e412aa72434efef4d64ecf7c16e2e75ebd7ad8 +k = 0d3ae3d8e5e01ad838a7cc9a4d9b3e41eaf9894aed1d1ba597458391d4a2ae38c5d6efdb4d91761a415812d77fd9ceaebbf1ad49c282e693d71d89f0e2d1bbd94698a47f1f30890 +R = 1e2e9e2633885c85f70208de30ae9b7f72950e2de980607f6d0e73fc1fb2a4a8afc6388206c11b081540bb528a94e5386ce77a2d5c7830fca19223d57c1efe7ac488e69ae07e660 +S = 1250d1b920324919ef81865513db461409f6f8ad82f658dbfccfae4425906da306ba10cac84cf5379b6c1d8b252f3c6f86439413c617deadfad38a234bf2b0050fdabf7719bcc9e + +Msg = 3a131fabf3dc97334f212fce41c44300440d16de1d6060450875f7276f53c026e2a511681b5a8d75fc0d578546339542833145f7ee13c708df33e584445a75a5538829286480d339be7c777c03c998a6d3f037b25799ab2d541021502a0b02a9b9c337a8b176c4f30e5b186485a6103b1d1563ad4ae73ca806a5e4daa92e9100 +d = 1b5fab1d36f6f6d559f65d8b01edba610620fc3a38307b1fb1c5bd63e7ffbd4a9098cb8bdf50975a873f5d047ee2b627b090897a7fb5f56d3f4a0f3528179e7c969926fc0d3b0e5 +Qx = 5eb8c5a2bfc86aa9a82830d665296f74aeffa9c5b38750d0ff51d01c2dd0fb6f2209f8ba89ff07297ab9b1b06168757f48cb6eee618a7b44f1b3902187c33208288f35a06665920 +Qy = 5334c203f4ee44fdfd5f99686b18696b3433f203dd148324dcfaa03a0a250cf606486ef11ebcc1ed1839a76ad70909d835a4b30a014104a6ecbb284b33f50bfec33d8b5ede85ac5 +k = 243889e7ad32076a3ea436356eb572c1b4ae402d0218d3ee43927eca0b4fc21a19926eea35c37f09de4766f54e6079c34fb3c174afb953be1aac46d675bd300e717dfc2d0c3fae7 +R = 1d87b52dde9f502f02a502e7a331ca6dfc6204922fb94886efbe3013446d08240f6dba1210a76eaf804562aa92a14d220d59b6310d6caea0274a5e1e8aa3c6b57f239191a71fe3d +S = 2a5342df6908841b719f80ff905cee0ec3fd8be46396922c3f2f142393714b97128e083907a3a2343f0cf9aac73313279ed29eb44017e2a1cdd0fc86e4b7c536e9f7eb1bbd192a7 + +Msg = 679d85a762f2574b0b31b516270b7d33d5e166c83e91a0f48e0f3db20b52f42f9e6ee9648cf58267ffe3b713723cf3df52b5fab5c14db1e7189f7cb7170bc6ec7cc71946745e152b39180f828688a5b6c0b2957ab94283b90052a3c6e36843c391aa8810f9253b639a8d5a69aec10070603ad7a99dcedb544858d057a1d66b89 +d = 383e70c71b431eedd4574f65d01fb0304f7744d668408c847f7899eae44770a7f3243109740f177d7146a27748886b7b77ecf3792b512e8d8e37c3bf4ecef2b1253df7066498f01 +Qx = 769dd91fad550980225877d98f7c86963c88be141f91f7a3f1607e0cc6dab767aaa6ceabaf46b65a7c80b6a494b0dac1da5d2fc8c5b07ef7085ed1bbdf4273da3665a6517ea1e5a +Qy = 282fb94b4726472248f01ee43607f7ef969446313e849998fbf0058c8ad5e24457006b84fc0460b74d86ca281caa174e69fbb68673e1d28ccba17eae045eabc1839870831246a14 +k = 336909099a1540e6f69172d55e0c88a1afa99808005bf09cc803ae1e4e4fbeac2f77f984bddb482f1f13e4430e25e36962b1a4cae00f1fcd7f2c7a17372c91673d8286f9829bbdc +R = 290055d578012a5b7d88fe2f70581a0fff976756b4581875cf5db07e01f09c0bdf6ab70ffb5839567583d53c68e31a27c3fde12bd4f1e1315af2f742746277b1fb1349141ed3043 +S = 1480c63c8b90c7b51e092597fd8391a237b07f0ff7dbf615e6bdddd5aa880db29c9b9add5bde7e0e81d9a37f852c26f21d750cd2f95520d16da7404c2c3feee1489aff09f298d7f + +Msg = 236152ad31ce2ffc0dead3c142cf6c770672cd2e75af4a82fda1a72e1c775cec9b481c6f3e411644df7e7ee901c501405620af4b6e9667dfd46091788daa95ef2c6c9f5c240c06b15cb0df51f5f058d8a7934bd7845f007a35f99fa97200b20f3b5b14fbf1e372507f3b2f377e8d07d30fd3e222f398f26d8f428e320327f901 +d = 02261d4ead21f02fab19bbb0da8c272286704c8f0c6842ba47ded121e5cddef79fb34e6b9694f725ca502949faecfb21e3cc062a2b4c654bd542d9a1fe8d97bdd0905c510aa0999 +Qx = 3ef03980ea9b754b655948da63469fe526ff0ba2c0f572981d02f5693bff620b55b8e9e9f9d553a78a0138072369775c7976f028631e65887cbed62fb447c9f41da86022f4b41ef +Qy = 4446eed90f2716a7aedefa1385db9f5f803434517fcd80571adc9b7f086c9787b76306380a375668b05fbed30922746fecc0cc16f189dddab676516ed1fe4d02855a34a90975389 +k = 0b309f6c53dee8a8956358df45e72126ec76266d38babff185d4db1d449c8fa9baa4b0651af5f5b0aa70dee3dd55623060097e2f94ed12636961a7c0744b38f2f137bca239f974b +R = 2b42395206ae79bd9df1c729856101ec3c4a719616701f836c9d69b542b59ce973d91951853f89a0717abd4b929bc69e59cc379c941349dfb4f98d49f9dff572c614242fd370e56 +S = 1ecad482a8eadec6800a9d876a382125eafaa7bbd950fe5f0588126764126eb1b384424015c52ed6a335668506f25124aa78d98ec5739fe282af0c143c07da0fca53b9733e159b8 + +Msg = ba3f02c4847fae035d747db246fe4e82fb9224ff9cf568a6ae548f5dc2befb2079541d2cf9aaa6b18c281a05e7ddfcdbcefb25f41dd91cb3092b3343e16985e91c912215cd99ae4a099baf628e33a7b277e3c36a13aaef85418fca99f64d73b789f23ecbb76c3095ade0a5f7f34836a98c5be933b44a94a2eaa3f99b1d8e7937 +d = 316c78f289e1860bb623082be9d9238b88e38c5e978a868bb90f776235bdff4eff591877b7f350cf14c40356922b2b6aa51d64990360b2b0e44d6941b5dd9492b4f4e1f42ca163a +Qx = 6f4137a2c63b6b79138027464135021b034f97bcb2493943df6be844f1657a97632ac80541a3b43ccc828789517efdd9f86ba171c1262a07a6b337bdb0c8d5f018302a8046a1a8c +Qy = 425cf553554d18f6cc97f0caca2a7eebbf266d57030014273f701562d5b1444240b9d22060ac9bebb37deec393cebdad21ec7f13fe5c7f1752b4261cc2feddeb737284a6eec3663 +k = 1e0321344bf364f1ede39a49c8051f36875ad78e4b080ece9088111739041b121f3f334c6e923777fd716a52be669d6e45f381da11262fb4d09ad66dea74ca115838e19fe94b7f9 +R = 04f24ec978c52ffc7675a09334a895e044eb8eaf04d26c094d7607b77ac4168a02a972f577880a0d0c73f218815e3a7a70c91c50734c08d374a15fb42fd13367dbbe08fe9c2d4b5 +S = 060740270df0e1fdfb8e829c9601b9901223b19d07e9d7d422b9bade88a50fd6d4ec96842afc45900a0107ce85ea6d083d66ae202dba3a32e50c7c3af951cac7acdc6f4c406740b + +Msg = 6d0372b40559e075af56af853cbe18ba2d471b0fc8917764abcc69102b03d5bbe1fc12458215be66409c26c89f67c72a8933677a07f88993af6918acb074fa915fe883b24bc3d191ff1b08852f07eda98977e70eba072d8bf189cd545230f59559ac05f1fa3f4e65886d0bc274a6e02e2399812b2bf91abae81e21279c5de996 +d = 2c1bc13f8320d97a82f3d9354e195481902214e16a4fd89332a0499208e91d50e5cabeb4927ba030cb42f5bc53b10f500fa646a8c88508cb0d63ebfce5c4bd574c527d686c735ce +Qx = 2210791ca48aafed20de84ef9896a9c7584081f850b75884908c7b3dccc94e221401a6ffd982f292a9d5f9c1d066ed493da948ac7e93977dabd7b820bfc0fd21cd8d99c072bb69c +Qy = 33574c6ce7da749ceb480b4e00bb1a58203bbbca5c16923992cc9767aba5483e4d46ed39e71000a1fe920a4c1c211a14e63ace03635a2d77e72808e0664334890b819b3caff64a3 +k = 2e3db2d82c4b9de2bc0dd0a93c1c5b385f75ad03d0da527a034da2876b42e43cd88dc64833efef54af902d85c568bb8e71684bb16b28c32d80bb3e9911cb1b74be6ec520d99b381 +R = 065f4715e87ca3541ea695878ed5ccb7d2ea6eed5d6fc5ec29f9aa8deb4001cc7c06185d6ab2dde4347344d44f8300a1e92513af4690d713762336d2e6a94d3324a224f06eeadeb +S = 20104e0767530ce2f4351af4977b52339f34d13e458de0482bcd58ab38ee041c9adc7b05650260d919b2648e2f820407fd60a8d6b4b991b86eaf29c2c4d12d3b0b45cac2ab22c5a + +Msg = bbfe66c82bc060bd14fd0e40769d9b3a026eb447550dd9f118c30d8448f725f8366edef042447962ba7f7f833b9e9094d0ff600714697e632626e7d12a592e040bdcee166dcda93952323191021bd12f3b1647d0f25a41739994659dcbb19333ca30f46f539c6f0a5c354cda8969a1eda572a309950c84c7607eb8ac20163912 +d = 13bd80eafa67663e75d7ae139bf285d2b9f1e03d8e32153c73e26d06e86d7acad22bde9f121a3f1ea674dcc1fe67bc7f5398d5e92555056bc046a02b0ba86c2a0dfe32e91add5b6 +Qx = 4c01fef7f2fd8ee61726af1a2d046c7ac67716403b99e021082e96d733368c6c64d046986fb01a6b55cc930517762387eb2fa4a8eda23c700d88065bced8595188760170881a329 +Qy = 189bfdc8e7a710522ab5416182c9579ca255c5009e6ee6604ab033c1388639c0f7aad84642290954db9f4f7fbffd17481eabed38151160457d68ebdfd8695b5035e4e6e06532c0d +k = 3c5868345c5314aad5ed3a74488a85b2f049396022cdd1de855a0b33c2877f72e871805af3ed8fd7e7a392c4ff63acac6a6f0c431ce7af680984e8c81d0350abe491a01f0f9268f +R = 0c7e96b9e9a5935ccd51b901aadab6e01ebde44f57e6f0b84e7b58ab4f62ffc0f3f3f980665c581ee3de233ee49d11599529348f1ad3d362837c041cf98192bb324f577e973e1c7 +S = 2226922271fe8307bf597742618ea9c1c271c22c25b49aaa7c9292a81ecce2a55250415ea2ec8ffec54bf0508e64426cb9cd7177265fecc40e056e96cab661485e789f0c435b72b + +Msg = b35e9bf686717ce3b16a59963a32a2116130453b161a4e7ceb27b755856add836d779696edcaee3b5c986523891c8836109d431e55c23afbca022437ad19e6777efabb6da3bba1f5f44f905395b4cc7c9210590fd38da621582d059598e5e4569e904358e0dfc0dbfda4ce75538aa97480912852bccd433a9b96c9c66e9597d2 +d = 30834b0a4284097cdda2ada6947c6c281f7290a49b56becefea1e2788ea3ef78fb96807633c47c25138341768b241164ce0d42f7301728b928be2c047f2eb60fc2f844ab77306d2 +Qx = 03a21f0d8e01a64b235cc455c291e3fec8de12682f05544de207d910c7c24c4cd56f3354500d994380ebaa0b49a7604c6233a9aa24934c550c0e609f65fd4073cd6c1ee4170d77e +Qy = 67c83513e4acbdeb8343b3add40261edbf7c8fe0af7417264830edabfc40200283b92484630741378b997c3f8bed7285decc6ef8633aa804b3846d3b4517e5ad836dbb1df475818 +k = 0031afb24fbc52b01480754837cd84a5165d5f2ad1a1d572b92ab546c049413806f0f5239a77c751af4d57a84786ed1c11bc76123a82e7db3c0495b2fdc5fb9c8720eb7afb640c1 +R = 07a222cddfaea617f1190a0bd88af4d1983d2543dfba25c5036fe24529bbe2e382de89dc1e36c1f6df59c8291d1c4277198084902e5619b64128c265bcf03b7d8cd6b663c225f11 +S = 1ca84c146ebbd16300b813621d503d8c754e4b11446d5ee31cbebc71f4b85ed09c5c94bbdfc3570e8882ef790393234c5ee9e52f7d5b74ff4171d930af817eafc40ef203a1ce613 + +Msg = 57b5ae7e95c638b258d1e09b3fcb4341e203f5706862e199b103c8fdac72cbc5155e5cf8b300a0b3fb0ce1f897c45f7aefcc528182f73dd450cd84d5fe9eadff3f704dc2a01b4e847c22df430efd1c66b0199f3e5b59348af5386962a5ef25204fd230b54d58d7fae801c086f8f405d3d0aa7a9a9da15c22b868817cd897d853 +d = 0c81a79ced1eaaafc31b69a40d9939f4e484d625db6364a8e589b6b4d336d458b44287ea6c6aa7661113fc07806b147ff98216fa0c08708dc9d651821b922741deda522b4e436ad +Qx = 25f9b767b8796466c1cc8a1fe6286d591c04a0d115133fc7910640032b898a5c86547f57794e5aac0148996151d3ecbe0d5939dbff5722679ecff378e3f21bbf1354b1eb294d1a3 +Qy = 074c2b91ef3472e60426d2fe182ccc678aa0abb8dda15a428e4f6f1ac401b015b2b7d83535a0a92770cff7666659e1cd33941bea1168cffde82db0ea83668c2d387e6f4bdf28cc5 +k = 27b407a29553203b829a87eb25d6d140e41184634ae1c64c6ec38e9012d0b06a1f4ad9877d7ac4236a22145095990233e6c102a0052ba18cf6e47e289cce4f2ca21514d8868bd68 +R = 02416e11fe2f8e4738ecff1710dc827f4e03c8e7f04a4f52e755f0c1676abbd122eb9751ec1fdf6c7ba04b4e29f8dee52bff7e9e726e28cb3de6f9abf2dbf58c0519ccc7d70f076 +S = 0b96f107a26097a468c1d410bf90e223cd72c5ec98d4ee4ec2e32259d7670d7e7689e62d36549086139f6111884530e20f908d7be1edab75180c81a70ece341f7eda6e4a43a5ad3 + +Msg = daebfef74b452f039c999ba0528be3bd9e16deb5f46f6eae87b63db8b89952c949fd7db08311871eb2596865eed107aa065f030226ea675ee3256c31a3f85ddf4c21760582144e07af208f33c5f47cc026db5403186a65a47940691ea2d74ffb1245676260ef5717dd879d8b5b72d96f87fef5f762d4fd17454cb5ed83d8a11f +d = 2f24670c0f77d2ca0266a743023d2c7413d56d0b5ec77b454ac59087efc4ea4d46179e10278e4ba416ffd8c3f9786ed202faf8251c0ef5a9ea5371fbb35b7afe3d15a9cb4bad975 +Qx = 2da72b8ae64c5ee717c33758ec26153a342936f9d41dcbb136590e1303b0e220ee84c8a06b83d4d9fc924b8808de94dbd780cc8243bc4448efd27dfaa1572aae6abe574be664939 +Qy = 3b3a95d962c48a81c48713247801e4ee630ec7956c9989023ba16f02f5bd1ef2edcdd1c8d314be933225c64b7f8a80542b209b944e1f3fab95795ffa134e7e28e82307dc62c2962 +k = 2bbb9abd2732994011c8d294c5342e8b1f7f3c1f5718187e9f75832604b43bf75abad5ddc85e8d92cdc42656cc9f3349afad3f9022ccbb4937d9ffa9cf48314b604e82bda13475e +R = 3986059f2e096a3675215698e23b53f471c578891f6d721a34a0d231d16348d5bf9853c79c4f4aa94642ad06cb7bfd11f724800cb5477636b6fc0586fb6efb8eb9bbef62329a884 +S = 2beda064eb3ffa1c3b5336613704b3bc3d4ff7b0e977df16477c7e33d480d678804bbdc08088186fbc4764be398a26c13f88bdd23e844be0d7ce598bb87c1b3430da02ae96b3767 + +Msg = 62af0493ae79d71b552c4647d1fb7ab2f282a91cd44aebd8ef344dfd77b521b0c0a3f72e4513c8ecc0e4b84efef3df9482a07ccc1b740c571c5e69cb913740a792aa231b9dc87edfb72bac188293c6c6e788cb3dff32e8f483f8f34e21ee7efec71302cc3bdbfa47908a135f6ef3ff179dcef26d1a3987f7be967a6c0f799b0c +d = 20985f2c6fe3ea04bdbab66a8b6167e5969c073b9d53cf3c77cebbf73f4dbf75e601620ec9c3107bf3fbfc6c79f8f063409bf8fe1d14b19e323d857e23dc05157d270c7514137e4 +Qx = 010712d50ba7752962b140cfb943d9e8dc3bfa497bfe81c42606f4da5157656fe2ba5cfd33ddffa0f27fabef8e267688943514df45e642ee0454e05b49f7c00f5785777897d225b +Qy = 1a2c7db6595c6d4c55110210c564cf102739760e7f5a29706fcb2515d99ca00949d5b4f291716d0aa1e3a47efb9632410f60e2fee1ada47171f902f632bee85da75c7f3c895c24e +k = 2f26eaba6452e687af452d5e1208fa011e4c84ada92a38f0a204a254641c23ffe1c184fa8bfaff047db590ab40accda408717e4f30811b75cf3a5877ef99279476ab924d92565bf +R = 1280adcac1c79352635f4165f9c5c1b6e1e6e33bd74d781773f483f637462f80340f8d22cb24c9db5e49ace95a676df3dde53c8721f672006382ff806410bfcdbceda50e53285e6 +S = 07dd52973ef30dbd480047732622fb1b695fe3cfd080264d2aa30a6ff3dab4ab362518c4f3de4fae042fce78c0c8fa0e763eb187eae2ff8f2e79b3f38cc3c1aea897e1f28b71a19 + +Msg = 566f17851951777ebea3f8285610cd8ee5f882a68e7a4205e6fc9e2d66d210ee2505ee73d6503169f7b903012d43e7e99efa493a8e6ef926b16b9ad8f52156840ab561fc6b680120a88714fd66d1d0742189bf06c155e1138ee5314707173f7352e2cea0fc26e1553643f2490428718e44afd8372cbb7bf5b88234318ebf4355 +d = 2b3d641607b8a141f876f6d285ee46aea543880e772dadd5dd83d595b9643191d9597218e1d6adb081df133304037bcd2c05c24a54e6c4cca64fb2cc4569d6882315360059496d8 +Qx = 42f2bffe25142ac6c1af26643b0f1c317b34950a8a0f112a0cd4ea4131303674328e0bed5d9bc7ffcbb9712387cf67129365b4fa8a9e785b787c170463b24f6a7962c1e003c8732 +Qy = 070962ac4d3220f367f18caa7ceaadcb82fdba45cd2c034a97aab71f7f7546c09736cb080c10d9a95a5f984aa4a3ed32d22636a7b3d5ab29c86d85db59f6f17ba29eb220bb141b5 +k = 23d7021f5376e7b11be07288a0e47b4326c026df80d7e08c9a0fff11deccdadd479dad503ef2d4fa3f0ab2aada604b57fa7e09dbf5c8d493070b5faebb27cf68ad0b78bb6f3a9aa +R = 3059720e7a2dfff03789e7a514f75f2af5ed18cf1568fa2a5354dcddc9d3c7a90605e9b9a3d0d6fbfebddd615cdd52845ff922873079e06c4f349f7798410ee18e0c69045193668 +S = 1cc40209692cf5f8ed8b82372c95033e4199d378a28b9edcba516820ba21af1bcf5c5df2ef4146b91fd37dff89ec8f9962eecce5c5e285d76a5f03eaf99fa132e98cc40ad66c296 + +Msg = 25155825fc4f9a1c4dd1db837008e7e2594a879052431f5bfc76d0d2565b8fa726008befaeddceef73f3c60fa2cdf6d9a70e56d27210bd013034b38861ae49640ef208d3fe294ac4362f8eea44f58af3af8a9167a36b5acafb7ec95652d5885a0e08067ce1dfbb45a0c89ad1acb53eb404bf88fa5c3c463a0f912b5a2522a0d9 +d = 1afeb5ca87c81025ddf09c2b2c5ee22ba0105c0e619b67a324467485bd839030d149fee44d8bac6f5902a1245a50c3437046b7c89a84116b2147cddc645b6d2fd24d68e8d53bf5b +Qx = 119c46988a79e3ae8833ef096b0a1e2886c4b114ccfe881886859abc031df2b1e75818c82be8c5abafcbc5d7b3b8344e98e3f413d737938845e6eab5aec7e507f7baf0d339a362f +Qy = 3190912dfb5a1a31fbbbb50784b18051489a3cc0f44c42c71d3a54886ecf40507c3240395e8ced37b5253b915fdedd38f75bb26df2a0a8edba865f898a15f2d96f632f7f0638864 +k = 1facccc127c856db1994c4d9e9c76de6bffff81a88d7aa0ca1645e250e07674fba73447911c5b47a1aae815d5e96164854636d3168d0344b2d2d913127011b6434d5a5e545d3bcd +R = 21da49326f39577ee9f65cee64006525de88a834365a00f4f8cfb9a01dcfd6349a3d06bf95990a2c17b7e95cc0589714b7a795c7016b29bc844ae9031488ca354548976eed68415 +S = 3364def38a8ee3116cbd971794c859776107154234d8b198efb19655647bb9228c7c6be2e703672f795ed37481e994b6764d0b7c1bbeb2bd1db90b34f460278a54bd480bf4e9adf + +[B-571,SHA-256] + +Msg = 29acb0fca27e2a10d7b9e7e84a79af73e420abdb0f80dd2665696638951b52dd39ca028166b47a3b6a2eaeceb1a11c152383f0bec64e862db1c249672b3770909f775b794e0b9b28a5ec8635a996d912d837a5f22471b40ec2e84701a8804127a9f1a0b3c96ff654700bad3167240c2518fb5dedcc1be9f56a807083e587bc56 +d = 32c97639b69c7cdbf419286d0a1b406d9b1f2886521a8b979a36118d2a368aace5b02dd8c515f2041e6fb9f026d1e82e789dc826a56d2ef732b1bb0f49be2b696ab5d3d5694a2de +Qx = 0087ff1d8a4644edebd43c2d43d49e140940d215f272676fdfb72ccf58a12021de3d668f2766848044ac404fb45cf6e18fc6700f87aa53b4fac1e35e1731814f8a9d0233e2942d7 +Qy = 29fad3638177541d8392111064837bfa77b4455c21c5f7652e3fb302f4bff4a35b74de8aff3806538ef9ac86964cff755a81cb3002b6fb241ffcae8ac9621b8e034967d650836ee +k = 16a06e3d25873f6dae16bb2e569720ee9c6ae7b5ba36854c321a80be8b4be502b895e1a3d161b001f6cbcf53d164b5485d8a5efa0476f581f9c79b3a291025be01a435e2fc5ded3 +R = 347138a43f3ed1a1a26f5f11549eb8a41f64aad302b6383879886216ebb6d08a4ce270d07a5bec6018eb313430ff017c1bbf78556436d9255e97aba1481f0f16b85e7320df79d69 +S = 28f35e1aeae288122b043deff9ac87d39478607da60cc33d999b6add6209f452f631c6ce896afd92ab871387f5ea0eae5f6d5cf532e7a6ab44dcf44acb1fd1daafaf1ad5423d8e8 + +Msg = c92d67cf6536f5046e15b02158da698bcbba4ff1e4e9e9c882cda67f817210402ef917ae93682c9c3dd817b21b73c6c00b7bf92ea80ecbbef2e67f4f4379d078a2b0f297742b2bb9c3fa3297a7e8079f488555bd37715eec92b4b1cbf897640ae8a1d2a0fbcee5423ab31a37629f98630275e35094a896cc574be0a449bb1bc3 +d = 0f93672159276c5a293582b9f49607bbdb970112f6c63b2b3b5d32ad3c8240c86b1af13a8dff6502c6b6a17712cfd988f8cd23a60693d64104143b3f91adb37f852e9e11a0ef110 +Qx = 19dda59a839aa2ed28f69a62a3e3a753c6fc789fe0d8551bf59095f009d0327386e6df5437846c6803df2442e0359a367d04f117e3965397576d4287398b4b8c92ad278df4a447f +Qy = 4159ced60503f7cfcfcd587bb3608699f54693068101a838d575715de02fff81058d025dbdda430e176f60e423e6fcbba889914f6409ce51d51e89e4cd7bbde6d24404e5b043e79 +k = 10dd216d4b3da2fa6a75de60f722f1f128776741cba002c055d1445581242a175318291fae313eea11fd905b20d26cec845f57a3d5bf23ae4dc93d886c0594f1cf7be4f59f3e3eb +R = 128d5c00a48c7352eb980d9c80781f8abcfdc1ddae415b7ac94b4d85c3d7d4f7316e2b3344ca50c6ae82938bc728e640e59e2d733f0c7f7025e66c15c81e98a845c1ed4843b589d +S = 1ab59ce5e54bffc68fda96c920b839fe03d1976ab36978bedd973715ed631bfc8e3edd100043ac527aeb5ca121da848bce4ec9799f55b22454e9af32848943058b257e815b04056 + +Msg = 15413f614c4551e3b138b64f66d15f8964c40326a42b0afce820778eee4a88edb127fbf575da5263e5a2627b5461d311813ea868e6417615e7c4938313675009caac28bc7a2f4c0bc37572d9bf36a3b1794294e09c0121ceecaa4b916df45b0dd31225415e6c87cfeeb092a008fce2c543cd62365779ae28f29fa02a15d9dcd5 +d = 3db080bc99c5fe7e06d5032167af56783cb423fae59fb5b3c6bce5fbedf56b7b39b17810e48ea9a172881aa1f42f5e267349b60294d4a208b4437666b44abcfee5a1829e9467908 +Qx = 59d1b3f680da784b49dde3b361eee819d67339447d7bdf7965550264eb63bcc7674b0921f02e15d45466dee52b4c0a50c2bbbdf226af1662086476a9eb1236e3d4c2b6219af1bdb +Qy = 4e3466200dd6ecbc268cdc1937ac5123cbe33f32110cfdb8b7536987ddf5c9ef2464d2334f315b9b489cf227a6300b6e054fe40d36c057a692f2fd3e762624069e2adefb65d24d7 +k = 37fb32a902eae0c5d7cc9f9018a5d1a906a3d1b9adf5bfb696ff63f105cb2e736d9bc1961677fc897fd3a9e9bedd370be6f25a03fad425b5a293c66180df78db33aec4a188d3db6 +R = 3aa8ab9fc9073429e52469088aea91f00cfba271b9dbb84818460883effa0c51d6a48c1905d6f58d1312af073dc8735c29957f30324b467797acf86e028410de016338b972013ab +S = 198a746411333172daef76359e7ad23035a0f5d14c283cb268828bd876b96b5f767e0c1e2796def7a51429f39ab2332ac25d8e4f263f8dfb9c4c98da2ccc398fb3bb9a6b28ca28b + +Msg = 9f901557451ae2f8ec79b6d4adc794cbfd9b2e6d28f19409532d91682820205308b41498a4e1ca247a2baa8da93de95e3c0f7afd6ca46bafdbdcc6d3374a12684676a50988b86a960a82180648c8c1e38f8fd9af604c7be3be4b24799f4544ac96d6360cdb83d1d0847fda21642934fd6cf65385b50d86d4656987901fb88d0c +d = 06ee767f6f36bb8f364f324d8346455c899a49237d759003dd52cfa13b9baa4c71347b134b24ecaee32d247c34e3787a0c64bc5d299b55c86f64b47521d22f2c09db225b0c84cc6 +Qx = 3f971125860f4598fa310eb7a8c6b4e0c31bb721fdc17ce6df9af557beded6006b8eab10ebe7f3c4f3d759d4a87dcfc1fb767ef87beb1f5c845e3f41503a33b28b2b5aa1644dd1a +Qy = 3296062514d4e89d2105dda5bd65a315b9770c45afe4050d8c3d15001405b1e32be5867ee90cafbe4e239dd44d030b4fda855182f1fcf80963c1300cb842459aaa8c2827371876c +k = 2b247e2dd0024f534ed2797110df6ea4ba166c34d91c94e43b045c0ff80f124bfec1cf3be3da7c58389d352c8c5c1bc2a2e876a7e56301b1e688a085ea0222697fc63141564365c +R = 2858eadd14373aeca65ee5a2cbbaceae4b54a50e0941a696406dd86d05c07c5599379c066b2288d01b2a43c9ae34bcb8c36f59d490aa8d066fd3d7e539ebc620a7176507ccfb232 +S = 33c20d26dca20af2c56982fcfa6f085bc5c317d01f3b1dfe0ade1ef6e3e960b18b626d17d6696c936f04090ecd9606c2a6ecea1cd1883bbbca8b3dce3b0acb2688fb2834aaf922a + +Msg = 959fe5a19d7aea2ba611c7203e19f8e3f3cc101e03a98f91adfef602c424c580d5a868659368a930f9883d699fc633bd07f6cf8de474937db0bea86fa7cd140ec2f202663813033a757b93bd72afba15be5e47a4eb93e8a666aa1c72c241ca3922547d63fa3732fec54afea7ade84302e2f044275bb67433fb6b125b7913143c +d = 38e2571d9f22309a636586d62863ed67a70538287f3ef88b88c3c2fa1a2900d48c342b6f15c26b8e7fb4875cda4093b7de7ceda48fe1e2cc2975afe958040881de61f309931e48d +Qx = 5a221634ca85059543e2caf8bdf79c43bb78deb35e9c89e07d553bafb6b31750a1d85ffa7689e528c11d8a3dae442b4fb2a4a21238d636eb04ccc04c8b5d794b0a213fe0480b1d2 +Qy = 225ff457b6cbc12d152b08025cdb7e1e921ee553add9cbf83228d678d5a9f5d3d1fb4327a74c1dcb5d69a5b98f3ed1aebef0af09bd49d253a903636ef5a66844c500fa221470f2f +k = 3b4de49d57040141f3584ff596eda457e2835085d350b75391d90abe728723e1d1ac6413979d4fc3eba98d72a01248e6510c722df15df876da881ad50539e4248facafcf311b464 +R = 00f259038b4d3d036bde101aab29f4558e88e604c62f967bc7a35eeacc6a56294268f8ab00a34f9a0319b07754f502c98718e8b5c91093cdbff2c8496fd63d6fc2c50a35f87f423 +S = 2350d5406922e8822a91f7c95cfe8524f017a14cf7174ce534c60aeb351510d06ac20dc1249129247b21c72c14b02b710c26c10899bcf995143aee632e294176e903645b660e998 + +Msg = 97b9688d9ed5101b8cfb19e84b89cd644262ca1c7ee18944e29ddd3b4cca78e06338b270385b00a5e8b91ca5e628de3bba50e36ecc695b3ea737a9cf8b36871c473a54ba17819f49e730c0f253b0c769aefa6c16366fd2dd612f330e95fb119fcf3bf7f3e254438c0ab635ec04a8b2424a05b483ecf65b74a93636fbab7bf1d8 +d = 0c8f5736f1ae65592f3ca850f43d06441aaad8c03820f3b08d8a6db46488dcfb828459f8b3f34af73cce8dc7a5e3834e085a64523d890028e194214cef4003210e6eb530005b01a +Qx = 667ce3db45b8772f717ce20755ffaba968aa1314d75c84073042436823fb54bf8dda34a6bb45a61d610745b1fc10eb0eef71c4f55b26acceb442d822d6e2a27761c73b740f47289 +Qy = 56035da1adaae894e361f5283b3ea07b7d9f64a298be11de9fb487c2479b120381f1c60cefe5d32d37e4644ac86a170f82b1c4443eb71b940b21c7a016b559c6c79835532c276fd +k = 190468668989a607a3aa966cad071ca8e8eb152b0dfca9205bc9417a3d612ca1105c7b90340b04acd96a5223658adda16bf6b598ea9f32a2f8d1b61c2c2bdc08d6a49de246240b3 +R = 291e1fb18edb7a93badd6fab6f56ee0d390f3b6d298e97312d5277358511fc7621534ac035f3518cb140fa4ad5ef7d889c0d5f3f52a4e4d06bc9f647f99695531f85a4b76cb1184 +S = 2d916734e02b0a98406bb5a9723486a7ed40bdd0b39c4cb802af4bafd519803d23c6bed59a80c256a14eb878229942f67e0b8159d5cbf24b719043171b3958fd669adfc72eb7289 + +Msg = f08b250bf4a3980cb455338b3f4173723b3f44c97bacc9cf550149794a71426e398cb4a74bde141d8b7b4a72942f1c069676a9918e27792cb8f085ee037c78e3c468adea5123c4c64d8ca6a39f2f90140c5d2d80b669cbf0d1ccb466b18ded83a1d5f042c36188a04111c34ff769abba9aedda40a87be1e24b700225e2078056 +d = 1ee68c3994adaaa9e0d61bfcd3bc1cdf198d3fbfe28a44e5dd518867ea04b20e795eadacc48bfcf8e8216dceeaa069b756e8e99ed87b6b1d31154cc9310bc3b4555162a890b0c6c +Qx = 3efc83ad15d9bf889c9afbd769bdd1dc8925b0462c93868d85ca7554b540d8c3ef7b9a63becc85981972eee8a70b7f948098ac050ad594ef2ec249cc3b557844bae9cb2cacbf397 +Qy = 42a012b3a1d9e46cece4fc3460a2bedc9af4ce0289e95f69550eb3544f7c105b5769fa52234ac88f9045ea5cdd4937664846d26deecf511ba6996ce4072e763e8ebdfe709660888 +k = 031df03a6cec2346b92d9ae7d3d983edf577d9a1bb88098f886f38536d8d8cf25def57726790604e674d036cbcb864bdedf8475ba9c850d510ef93b844c037e04348d5f48098c20 +R = 112dcafb63bb125d9610e59883df481bfde43589e46656b5952cdd72238cfbcfee79e9165e3c9b89c9ffed12d303225ba2af19e00048e20e4edd3968807e4885003d148403321ef +S = 2ded1456df54a24214d8c1d3fb314db52b046ca31458bed69bb3aeb6a9ece509ee521fb8046ed43accc7e605440a09fd96db659c98a7dd606758c0c47e47acfa326b9ed73ba4b28 + +Msg = 1cabd16fc29d7d919622810dc8b23c770b790b98b119eeab1b20900fa94fc2ebaf76be4f5eea91fc5276c5621c8677d4d117c4a5a782ee2ca1d5b0db997fdc8a05b6b3fbb833d7a7b81c3c615c2a662929760a96feefcf89e46b563314c9b77c86bf34438458b43b694ceba741b97dfcdacc0ed57652ae62856ce10ed2690770 +d = 3a6fbf66ebc1365ea7699c72cdac2dd85907ec59cd26e2d18713354b619ccb83b7fc0db9193aa8493c1855f1a83fd987cbbb65de17c59fbe79256aa5392f4eba045346e9ba26592 +Qx = 559dd556241f9b11d0f91c5458ef6adb783f9f5051bc12cac9f0b214f836f7b149d00ba8218e873410a50445da9fbf68673f3282d783988981fb221d0579341892ba6824e0cf4a5 +Qy = 05dd0e594ce41122882538e51e9bf29d159fcbb8b29b97c5546582390ad5c59c975271c58ba1e75d70c3898fea929ef7316ee830eeefbdc69bd80d7b0e8133b977cd573a3b422ee +k = 1c5a193179ab859ec1166575007c3cacb30d31f341a0e82ed6d4ddb32da909dce08acfa10fb14183258caa743010fac6f7d0fb1f8c8f55c246e49a97f2bf571129144c23de8d68c +R = 2625d0bdf37396585d22811a12ae7e0c3f512ffdd0bf4d048379434af46c03c6067dbe7c271c417ac5307123bf58a9f2064bd2b3a2d4b4efa3027959bfe63e13a851f46a21da6e6 +S = 13f16b211b314a7e9918f3254da2f1aceb5340713985610f03ec1d0a33ecf9217d61076eb153d8f27aa31aed3c9b165be52f8d857de362b2c88db5dccfd708a996a46b76b4ebd09 + +Msg = 7bc8bbf5ebeacf40b3c82eb6eba5d994dcc6a3f2e12ef741f90f90e176d20c21e006ecdaf14cb5beef35bff46b2c374d9ee224516679b1a9e9255cd8ad8e60ed234f8ee7e0fc53c9021488158217d4b4369cc597d6053746efa1e73340bdd73c1bd2eed57b92426fd4d278d6a86e8be0f0a66ab3dfadefca8831b2f488636251 +d = 145748871a0b5c1cee628de04a12fd68ff2b154fda96e47afaa96389d66d22802968584f6753d36618d49ed205260f09d3f5ccc2b27a34390ce58179b9834ff92a86d66ea0a97ca +Qx = 6cc7ce2782dd67cf1fc16f1b24ae46fd085b969d936fefc409a9bde354cfd33a154a3113e837cfb88284d75a96f5fbe85274fdd0990af4a033a6c40b904a5e0f666e4d8b8bc3532 +Qy = 7adfea166087502657bf9e2c437beb2f62dab041553a06411f6c9dae83a2a2749a4e5a2a36fbe23d40816b1b8d206b9f5cea20ef200b9150061ca22fee2076e31c88d60a006ef4c +k = 26c820dc92f97dbf545f51db7d5ba649333dde38eaa47d8a7edad9a3cf3e6780442db234632458ff17e1d7b70019916708c128601ff547ac84dfb0173cf0a3c5d69ac96c3d7d395 +R = 338c88d1bbd0b93f3f1fe1ccfcbda65fa1667ec471730a40eda87f57b3eb63d979d8d6d819b974619799c90b09f33c051b8b522c3a1acede101857265ce1b58cc7eb5698049f494 +S = 3637bf89f9b66c7ebd8f91a8324eb70a510284b39f0f2e45578f26f5f1e4504ad70a389427f4d58960cbd918c2f8279de52096e25a1b0b0c3929fd5ef56bab6cde7c0d8e9d2fb30 + +Msg = 0cd2a45392871c0c262e7e6f036946354bb41f9c2187b8c4d399231280682f3e0a09731fbfd52c76ee63b9828c2d731f4cefee0a8c46419c398205b2ff80c67d7756db300a0a8385fa287dd37d9126f75998ae1cbab5136560592118db52fbf102b7ff0a1ed45b8a91a7d99d13a0f7fd4366392264aa1248d7324901467457ca +d = 3c71911d24ad19c20fc1d8a044d63c9bb417abc3778d7e6234c6af79b898cbfc2f2787244708d2fe203be786edbdc4c9b12b413156b7b0bab0be8af895d191d853cd58aafe1ccce +Qx = 6cc47aa586a73acddbc91398ff5782457e6da2b10e265153c678789d3d7fcfc485b03b089eb67e6d6955d5c8c7ed5f933d84853576e76fc60332e5f0a62c3ab23690317bf1b423e +Qy = 15604d94ab9f2ae1d74fe46b1a070160513709de2ba8e74fbf9922e9bbe7f6e743b25701a13f73eae0db0c98dc80c5f8528e16610fcf18f60eda3357ad5878add2554a6befc9d39 +k = 3681fcc5fc1f0d7d413abf2e44cb5cce9a4a252ec449ec4f550df4a172305eecc072454efe2040aabaf4fee58ed19c9090061d3c4835c5fec38996f013e5512c0147cb14a4f0fe7 +R = 0d3c26796bb86b1a20ed4935bc3824bcb9742513ce91a66dd523a3c0d8a5abe63488aabb806b5b113e90d3f3c80e3ffa01ad051e6b0d4edfc641689953ed65fafbaf3e554be31ff +S = 2e3129ff95b06c274f7ac08882dc1da6660269f3dbd21a3e48377a628f6d81326084bbb8d32b794fcbde8e574f853636fbbaba480fb36960b0994210bea319a99a46e29b79217b3 + +Msg = e97092625b09c9ae6e152e1cbee207d83361f34cb9b0e727c816a5ed851f12f91fbf88ad9d4c8f9d07350f5d828fd8574eafc768bc72a2b18aaf4d2b48fb10f7c3431137b51850154de9706487d69a40a8f4cb2c799f48c5d8f518aff752500de93cbb94ab04ae1e0c7183a32d79a27291dd07b5fb6e6a4fab76e85c3a8607e2 +d = 18bd74698bac36ef11add6b3e3fad227ecd868f370ec04569462565d2f0af2340bf793486953a7b79ab04f0ab1f0e4fd16bf6b576cce677d543e73aa8edb0e50372f24ddfbff966 +Qx = 231f891e63bc1c43377faa56c5799eb1c877954ca2cafdeb4883ae40bd78816ca5634f48f5ef5c22dc7d3d0df208bab4149815274d7b134cadb700d166a5e3fc73e9be1bab72522 +Qy = 469ea29ef860adf24afdd386347763008ef6fe2488d902c4d513bc0183fc52742782a6fe500d6b581902ccd4f9bf077f975bd5fa89bf240723b99f726c9fab4f953380745ff9e17 +k = 1590570de563ea96eddd900e4a0a7efa2e4a0b389854e96af32bb7555f098a8cb52d160abcfbde65998c34f91338a40d40cc03e4a9a241d3b16b0e893d3f7ffdbf8912f35c7f538 +R = 32402fbee4831b16d762ea2cb218279f4db5e20bc8b6e2e53e89a2ef3646cfb0abbac36116c8c708a1342db2fa0abd39d149e09db57aef65ad8092f37f7962f98c28331f0f20b64 +S = 2d1e38f40965e2697abc7df5896cf051ce5646f135d1ea0bb470a43250af8df0abf2a04ca1e0f1f31013025b4136a8a6bdaa474bf50752c571f883829bc3a5482ec20e2b4a72c90 + +Msg = ae6723b8df5d6ab5fcfaa22d32fdf106d211514cb1892c7c43ca6cd85c2532f85929c8a259ed251215063cf92e1502528d1e22d5cf67efa0b8ef21e8eb2f5dff881ba1433e8bcf2b6af8742ecb2bccde081e534615a305562cc22d3398f61f277d8ca785842bda85d8a40438d9bf1aceaedcfc22c85533794a69cfc320931d3f +d = 335699bfd058ee2e6163f55d1816bf3669acea8b73be9c4ddfe775230925e6093cff7a66813adf22222c8376faa106d85ac9f3c67929bc58d8986795b6d35d5b9fa546dceabbedc +Qx = 7995e02dd3d40f9bc2e6f4cb1c0d29923c9022169e64532d1b357f36264d18059c44a8617a6f1136e72648c9051a27714a0dc833428762275a1b5635a3ad91e65d2713236c20f50 +Qy = 6167d5839cd4476a638c50db218979a93da44dbf97281d90daa8b9b530960c689279fff6c342af97880db1e9c5ae57b91d7be727fd1c6210ec59416d1b675f4dd666e0b121d144b +k = 3f037ebe0e4c3910953e123becc09c0862490e7f590245c4cdf9ea5fce930a7d7ca5d17f5689edae1ce706b90efdf84cd82e06e4ab95e9e2368db91d50110eb91cf44e50cdce2cc +R = 2baaf025290897a5d68c5e63543256523fb086a6f1166ddfd3d50fb307e0f0cf78b5fa895f8b71944a7b67b8afe5f3e10f2d248aedf573860c42cd7aff258055ee7cce472e8efb1 +S = 0f4d239f5af023ff6c94ad7f66d43201c7e40262cd92467c4ab54be8d2b8e6577d14375064fbd00a6327da62f03f75262392add0ec119d820205065aa6238433fadc8d1734b8481 + +Msg = ee20c6b61886e02ed94359dff3559522ff550ca126fed4b2240ea7d999a182b7bb618c50528fcbd261d5e497a991fbac0cf4c105c0f664d6a00a9001c1ed522962fb44dd4159677ce8f1531019f86457c055c9cea6247086cdfe0442485cbbc4386ad002b4bd39a1a187752437f04569705cb7adc0c68f0fd059d946deb63f0b +d = 2c3eaf801330b3f1b0504f2399f1d24455db29911f750c246ba0a134c3b59da8b3562911197764699a92ea1d95a2aac587e24f743df1dad3e1cf7edf955203e24a0225717f8d2df +Qx = 703d69e2dfb13fb6e695b0b30b31d89c8789e8523a7eea15673aeb4f1909192c06c27558eb55f0315f395b1f3ce84d9c304905cfda1d119bec33af9ade4420de2edbe75cc5460e3 +Qy = 75e35b2d6a8550969d49ac5d656afacf68d3a1dc6d17666f46ce3413c855b627f0891912e373af2ba91211c20f067d66056e6bbc0814ff3921d944008b25d8772cc8d696bfe1d09 +k = 0a9ebaea478893aa0e3bbfd5d007bcec5ad787d9bb5a8e9b8b79865c584966f0bf040d36f62a8e97c123d2adb7f38eb49a86e9c2ce1294d04fef1b6fec7908c4ca1a70bd1699a9e +R = 2d495eb5f6fb187a0ee1fa772ccefbb969e854abb445ec19ac3860f40ee65f53b92f6a797003574bccf0b9de8014ad4e5745ed264eb3ae88040ef6518809b4c66f691d496a85d51 +S = 1840b2977ff137f2a8f2f7c25e347cf1262fd128e008e30e4752315deb5231098c65e9a585496a9d6b5b56cd0b6d7dcb7150a077fd199be2d2de0262aa84dad414e100ac6162346 + +Msg = 734a9eb8288e32f5a67cc1d88704523ca2c68b798d90e188d871d9f50d2da2063baf1ee6685c45832a1818aabc9afc0bc935e97969dc983a484f16d2bedb3c7c0b8221408be2480a5562d5d1e5d8763d1e474bf2826aa93a68c3b870e3bf34f4941cf590d88e1f5a8cd782a33992213f3f6b4b4f6dbfb3c3c8f21f5eaf4ef609 +d = 1c3ff067497e5d387f31f0ecc9c67b3c0dd6ec8c81318c492aad83c9dec6c99e4fa47447f6f7082d636c2591d0df940b947d0a4ae3778e2b7cc8fb92214638399def894ada276b8 +Qx = 2e56655e37b3e753f35eedca95f8ec07b7a3d3e14e365ec041cd9003bdb78a7a8b8ad277a67da5d63dcdeb0ee8d8efb68fe61aad9b1fbef4373ab13c44efacf68cc499faf5b5dbe +Qy = 47bbec643d74874b77f0fdbbd2df3f3ff0d35f4b3e1534b2c4d5c76b8cc51693a70e17d1d4cd64713c5c05966c826458fb5411ac840ab5998bf3cd64a0769c3e075259a70aaf94d +k = 149848f4534eeeb45fc38ddeace59e8f83f0bfb4cfcd2b8b7acd0bf19303051a6a8fe75d4cdec1be036645beb075c772aef4a58785c16d984eb43b9b0317446bc3b3abfe7ec2cb7 +R = 17eb68556224f995733077501ed295088cc1184fa3872f5f11e97cf67c7bc1febebd31206a406c4479b60246a517cada5859d4f1aeb98dfc108e96e9898c6e71e59e39b6284895e +S = 22904497dc7a98fbe117e4427d74f4ecfc4e14d4467c99227427e3abb8d3dcc406f3704a7783d822ec1118a1d91d5945d5b902a2ad325bcc9c17c68ddf8b5323df9c2bde392710d + +Msg = 68e27cc72fec8f3f1f3882c6efa08efdf21d74d13be5171da35ef2855666ad2ea6919d21dbc1cb6d296663dcbceeba2fe47a2c6507d3d4a67a61b55b0f81c93412d7e1fbe15a590e342a05f55daa55f8591171303154e615e81189a523b855829a5c96621ad118f522e397e2eea05c2603eeae6e3591215e29b2289bc384d8d4 +d = 04b4e04281b210fe78d516a5b69f878b7fa058941ee9ae8cc63b061d1eb9e12c3e0ecb8717ff4623ff5bbbcdb53c48adbd9c69636506ab929c5507d7ebafae5654aad65a263e48d +Qx = 538049d071158c62f0102fb664a47431afe320474a173463819d5f83f6737b43880ed378470d774d32ad59cd9d75e5bb06b118f1297af3f6fa910f40aaffe11e46cd56cbd29aa51 +Qy = 0a4a843af9841e2427357bdf26817656637bf4650e443ef303dd458ed092dca3cacf2857d10aa190c256467ff834bc804f8557f6c3bdde89927a5f2bd55bb9d9f1f08a044cbc208 +k = 1191110485f56335f0e65fe04b9ad8fac1c3573cb4690db3e9f62086312d394b0e354890c0f74e3df7c43e718ecf18caf6904e03bd6c0912f906de1d2bb4c49823bc6c0dbfe37f4 +R = 0dff371ac365cb7de248ddb2b2fdee624c527c6c1908dd287a294bb43a4be94c130bfa83710b0655f21695dd91703acca64fe2e7927eaf9c2b9b230de8002798224f9505379bf34 +S = 2f30f31c863bdd68fae16f97fba756e033eada18cb0a23d7d4b2c9ea3c832e61b52185fcd654d9eb281b92a9b102c3b17ebf02422a0e4a7a56a73974208371ef65434c38f4d7d1d + +[B-571,SHA-384] + +Msg = e67cecedf35058b80787589514a9c81c6b9f4bced4260411d2af75bc46b8b2c962dc9d260dc99ebbf8ee64950766efc0e394184bdc8e2891d66bd3300ecc880e9d6a3d0eb615322378afc3dba89938704e9a8d0c949d4bae9838805c00377e3fe5ec6a1a98ad7eaaba6b500973dac48b26b7fb2e1b9889f8c387de535d4b2363 +d = 30f2849a713aeac95fde5ce3af853e9d070ee60709eccf35a076567be2c43f0fa34420b0fc097ff577221275a3a56e759efc32183be2d76058a7d20e5dd59f00415114d73a15b8f +Qx = 6d4ed3cf180e0e307745faa49247f269c3fa0a69042b3b78ad645f43eaa50d479622e27429a6b6b1889944f85975fec8018d3321ed38f6c7d91f2efc98467a027ba4a02c7f231b4 +Qy = 5f2ebf6abf7d53fa32865a9b6ada9bee51c1fe26cad74dd6ef78f13872f340d64170031becb5073001fbca373be4e32ac3425d705ee942e6c4e639bf72379e34776680a387a0c6d +k = 0da9d8647d0950f558a3831b47858168b3379656e603f2bd44046ac7546892d1a7318c5a9873c6ff85683edd3881a0f1af5501d17939f0825ed37bfc9a2d95faf43d3be92b237ef +R = 0fc7eaeef74806606fe51882c6928a06bf552d18dcc4d326d44a540abb728146657048b20e5fe2868beb5f04f32d43e9ac23a7f22c6bf325bca24f5e3161c868911ee61baa8a3c6 +S = 33d63693268f3762635373fc901fd72e525965ac17e2cc009177f03bd3524107b30e4c6d80bbc4f87fb1f288ed56812994541fe063f1d91afa7213bed8be5693dc6c17ec9a0714f + +Msg = 2baa1ac3f07e34b67b6af087400f261e138b070c8475378063286c16fa73578303380236a4af2484ea01ba56c1c619f6ae4e5e6ac2594c8e5aae7e7f196f96fc5d0f507bebedd4d818e77b9120e5b4bc01c7ab6339e88b71d0886631cc7fd89659bf513faf149c61eb14d55060c8dfc7e6e4c2b4ec8edaaa6bc36eca50a6feef +d = 2ebb73d04e6e5361e20629e3ad119b33db5163ed91fd9a8aec4b774898784b6822a08992118a8fe6013094bad0be1e9bf01b27c069e4335bff7e0abd28a10443818f6b825e9cef1 +Qx = 01710eb0167e8c948d381e3a75aa1e036b70c414f69260aab434ee20b6724dd7393fc487b5b3822e5e8065b06d0785a4a7be7193352d5b9eee66755ba106ba6e40f98a08c730a0c +Qy = 6006f98fc25a641a7c6e67fedd37aaad77a9102be3e1e7d32dcb4c68029e623a42f4ca7d1ea725bfd475756b80e18904107c460fc03b9bd68aa46f9dfbd60618670c4d9a68a3287 +k = 1861e2a356a6fa8096418cde7fa17f1b893a7b63810f3fd807a82bf4c745aafdc4963eb7a0ad0488a776e915b64d2b684e46d244703eb63b77835167908f2d6b06a2ed7b53f0717 +R = 046688e12d26cd96bb05d3f418d8ec34f4426f594acd2bfd8e9abd79405e612d60737007440424bc4f546c54b7402d11880f68edd996f49277b729450f7dda5d05986b014b5244f +S = 341a80e74f3a69b966ef81ae95dbdd60ed5a0446416653c4df431ff7c4b4272665a523379d76725e9fbe196018f0e747100084c823b95d7c7b1785d3623e52e9adbe773b81b49d3 + +Msg = 0e640581f573068d8ebd2899a6aaeed0bf987ee11e22b05d25e88e9a1c3451f45ee3800d976f4603c18a041febef07a01086832a6f7ecd5d498d52e796a9d90758c87c36f4a5b704a39c456aaee2d5278183d5815d619c193da9fbc427d701bab0874bded848cb4bb066f56e119b637c78aeb6eaa387c41bec6cdd4bf7b2061a +d = 1bfab717d6f6e16d9bc6e89d2ffac7cbe0f808cc8ca2eb515af7ecce5f3b230303775710a21bd25c2cc4566bb53c78c78e3774a9f306c751cc6e149929e45eef60f56c1d2388c6d +Qx = 6935c3e8b58f7bacd045e745054c227687800ddd86d6e0c8b1e426f4df0e4b71feedefa9172c43becebbeee8ee382a75396fc5f29ef3d2cc55f8afa9232038609b5034513b222cf +Qy = 138463efe3b32259dd90b759062f848deda84f2bcc0d687c410f1ad2dd745517c96c3451432b1e490902208cabb68bb872ec493eabdf1f3b07595d23a54c53e512777abffb7fc65 +k = 00025bd48e2dbbf1ed8bd9c1514303dc503dd0799c7815870b902249cd1d7368380853d36f7fdefad973700ded1e0d66950181b0aeac73eb622c880571315f09504ed26e28e85a1 +R = 1b9d6ccb19b208022d3a579a66957429682517e84a71be42fd571fbbd0247609d0b5b33808189efb52d21e6421d3b08821d82900577791b1c54e239b0d908bfbcdc060cfedaefb2 +S = 3356320389ffde577496c5b46a0de6d53005f5ae3489c0d292c5f460a3b7adc5bd204bc50a3bcc8538e0f8319c79b9024b065223b7ed9b0f211c5c224d363f5bdfe04db97f99e19 + +Msg = 51a2a560ba226d629127ce1ea7e812219ceaddd23561256331458c9f11fe73990f21d0dcd974a3773040090cfdc8e0f01692d951a0cbb60f8448a016c67abf46a9c150466ac77e656ea827b0ea7d1e77ea32071ba8314fc8a2edf69008f498bd1c18061d7d00f3340a7e2cd73e9766862378d8702e804a1870b442beb2d0aa14 +d = 00cc53bf7f1cad5e3dede4b4f4b082831604c92dd2b147869cdf1107259305b1d50359647f9f3d7d4e1e608865c65dc7c9ea46bc324dcb8423b554dc369d621743cbfb592b70eb5 +Qx = 20187d7de90652caf1210703ef65cada3b88f978e14ce6055847be7127602ba7a5391cef0fc9b009134105da7b09b49beb7ba2f961b84e6d66bd818ea99ec106c6e8428b17394a6 +Qy = 197aef36e47b571ccc0b41f948392d6061060063137d8c3b999ae507b76132fea1563775be555616cb5816b9b19e42b34f9673aab833f4beb9d1a0848a4bbf2f6f44cd03982748c +k = 08acd0f8f9660d21d62f391112908be73a4342767328d3375a8806dffd2598b6d77fcb4793e69f2390389a78c2b11866cf0f03666a60ad088d2c77bbc49fff6efc5b7283d02bf36 +R = 1004bfb78dc0e4fc0f2624bec6893d717a476fc76bb5c1d94c1dbf157aab5d1dc80f98a3aeabaac94d9cf9e26e1dd172f5d8fcd5b2d48cb3b7f0a4863813357b5cf8eae84478e44 +S = 30b1c8857977181d12c53cc2efc53a427801cde2890cf2ea2c99c6958b6869d0ac78ee2c846c241362c885835af49c47d20c30f3cbfab27d9cfeaa6d858694bab059229e30bf845 + +Msg = 90eeecff0a2e37df318c441df220dfea013ef29774ee92a56b213e13a798858f31e52b6ccb7599e7314f12b48a89884b113c1ba0526a54f3e9a33c940944319e084bff320cf5f391c02c731c4c4f8b05afa273374a1705d6c85337782ba7d36b9c00767180cad6422c11c581672ff631fa4c49d41b02481568ec87ea97220400 +d = 2b009530cb9d586e35dd8951ccb686833afb7a37ec253e547e85b253ba999f0f186b6d4ba41091615fe57678e9801b4dc94fa683511da25637b2acc9fe60936be15af16234c4ee7 +Qx = 5913ab6a2287d946b5b6d1e6c3d64117e085da7cf6388e333cf58d22494f4b067c684dca770ddbcea5db73f048b296e9c17284a8912b3cb722d9eaa17b6b1209311fb8e8757cbf5 +Qy = 007124ac6c48ac56746563db247bcfe6b20215ccc5cfb1d43c923daa07d429c8f0513bd1ff1180ef0f7927fa23fda1af25d20b22c935c426f9ccb402c358b57b812516c43111779 +k = 27a80a19e9c320b57146845fcf97d6debcffbcae877c33c62aec62a3351ef40bd90ef4c2ca39f9e51086931d82eec4ee7870365cb14e9c54ae735069801ef12c571bf1c7c1cf6e6 +R = 1de22c8984c593a0948164e6cc8631489133972482f6a7fb1c3c13f97e4584604930d369224850a1d24f267f41bc6fca04ad79326aef61f0d429e0e1b9e9d9686ee10f2bc52b104 +S = 085c6b34687081e280a180cd0c4ffe95cebbb0ad6d3b20a7341e467812f88c23973701cbf3cd2bcd2811415d0bf0cd9df229a88754f4cb0c225a2d11f57369a29edfd7b04639055 + +Msg = d3740cad41e2e365d80ae81da97fdf06d8b6c278b505e34cb683fb55ddc5189da543540914c0accd405dbf0063f6222885fda4b316dad4a83fd03e8d7b7e936f87fc0a5b095defc8a4b22fa97f00b394e672d5efd3e0a230c7e44dfeebda88641143502a400ed62e2a51f9561e5d652a43d616f16699e875deb9610c77de8e1c +d = 2cc2d0d7189cc8fb3565a039aee7633ddc00ff427cafad32fd2010b10fe249c9724d91785e7080203626038109158e3a61a3970aa3e51688aa7f5184b22f63af63f80d3540ec023 +Qx = 5fe95a030efac2e5d9522680da58606e3e7544a317a3f24d726b69238367d30fa586864d8c143c3695126ce8dffbc7e7fb789f956dbf53aabbc38af988ce50f1fb30294ea3e2d48 +Qy = 193d1e745d82781ae5c3b3d2233e502959d6862fa7987c6416584504f65639ca765578378b75d3844df179cefdeccff3c4c43aeb8865063e176fd43a27c93e329f8d4f6fd5bad21 +k = 02df3920fe4d328315353ff11b0264045248b32f48e860dc59d931ad65f39e97e3a683c7b5c64b21c3fa50a9685fa11f49df9b14ddaae03eb02754b01e03f60fc6aef1e5d6d7d3c +R = 1b91c4217b1580cfab56812c16bb5aefc1534ee8d049aa2e1d52a5bfc11519ff89f0d36ea2bfdfce8b5d3cf1527dcf700c0208a70595e9ebe4feafd0eb597e05df54212fd6eca3e +S = 21ce52440267fb16e713eabb8bf2d502c81939799f9d09cf48a50dce5da999f3b457dcd73c212d5d070056b1f373b07ad06e90d96febb7f8cdb4c423ef946f0799c038a3ee68ff4 + +Msg = 5eb53b5f92121396c5ff30e0c92da48db4fbbdbf27297f9bc82614ab78f7fd863e34096c615a02e349d8bc7ae4b0700130704bedf32756b5ee6af10da1cd717d624fadc57a9aa6db4a6c5d6254c0e8f8c3c0d4d03c264eeeafd52cac2c1968d9d85b106167a49d0ccdbefb20bdc10a2555f8149203af52853169a02db94e5e2a +d = 3d8936c00c131e38c6566d2464c4e207c878070bbf681695a6cd98cab2c6e80fe98cda80c66a5cf584e90a071144dda59c07b8fc7bb42464dbee5b6f739b0f2ee5fdff7e5a4e7cf +Qx = 0fc3a8a320e816305772bd5116cec2795d58633a9f490be8a1a360f21d2aebed6038ca4a5081288b6bdb1066307c26897ce38c24f8ccc98a63e371ff6b54f6016917b430c267af7 +Qy = 69719c868d8fd25a38a7338811904e3330a7b2289a8384bf24f6dad5312160f0093bf556fa061ca5e52d6676a8f1a3e4656740c82d3cddf0ac4f903ea885d42610bf1b45d9e57a1 +k = 050da632cd7aa58340adeb20389a2cb9897b8ec944c47e7177da65d9386a9dec5d63be7bb2d0f5b4943932e1fd7d87d5d7a80bc50a63dfd101a6a28005c894c6a6fa4c652dc519c +R = 0e6152b9050127bf306662f6beee81d024492b91efe87a56e70596a4a72cd02dd2f10b970c9a69909f85bf4783dcd3c32505d7c148166ab43b503ab098b6d95ef09a7932359f60e +S = 1f7d68d53ba161b61eeb17139eeae1587a6bd148e288c1f73a6bfb3a0d1f6dd8f9cdc27fa9e8c7a681410500c097ad01f320303421f1239b4a9c4d5446562b5b3cb2fc45a6fe239 + +Msg = 5aced64f702a57ed7fabd045a40c967a485d2a70b0a5e82561d5141ef329469b2da5964a34df203a980111a77adca376c643b9030aa74516f054648c1534d912ea66582adf3c655dbd71ca55e47412315df5e2893e43b2e2dfe6e4dedf426f11846ebef34a99f5615460ce0475f7bc54b4a4fd99e83c982097c3136ac6188a5c +d = 3dc7de970bce28a943d7599f2a9010fc99435b93bc4ba884d42503ac2941aa63fd07db34bcbb1127d56d6a4e277d6ca32051ea3467e376f74f98c3999d2f276b282ef8a28cf0cbc +Qx = 2066a50b9f961a58620f473fcf7d5eb635da47f4ce362f428669ea578d50d1c1513c145adcc03ba98f3d67bb422141c73e2f94ef9559ccfdc0be20eb206d3d114a5db302bd0751f +Qy = 4437e655bd255e7f013d197210bed70c5c1a6cc1daccb96145c9c438c8a44b4074629830d8df9914166c9378b33040d71918cdd0f47fa64b7c69f43eee0f34414b8f64882f90ac3 +k = 3b2e20f4e258b7f0cf69a460fece9b4794a12a37c0f8e7aa6f4f51dbfaf508f6f1e0160ab4388891efb09f0ca1f73178f0e8598750c9debd3ff856cb3a2872762ef9e16487a9513 +R = 2f265aa99ff806ffeacbf9ef7be575ce5300d3cfd4225b1835774ee075d7e530c9fdcd681584223f84a497119b4eb1fe34cd31d654c2fa262d7549acc251cece9530b26cfa3ab35 +S = 2c05ce4b35544bd1f20a68eae7f3483e0a0628dbb53f0466166257f69a7a110d2838a76d204e7a955a8977508e65f2ef6d7deee13e4e2ec0f2b9a8b4bedc26b3502813b0334a1b0 + +Msg = 43c24aea343d4e088bea25be69a332c631275c36677093e057de69cc83a4c5e70ab270e5a8930f55846f1a22ec10e03007dcf0942c6761e89c65c6a4f032eed97dc3a2c7f7ed1e82552fe48828a132ba16c41f6bd82a49335428a24fa1679522000e6a1d12c646e0e4b4c584398577ea9493bb334fa3cee8bfdb6c2e66f46436 +d = 2de6ee12eefa7a4a736484b19b42a513dfc059a060976edc3b0aa4b50e98d72df6506fed0499ff8480986748e938289e54a5e86c0c29733a9bcf5985aa63d8a2b57933a04a8e8e0 +Qx = 073fa1b62d469f2991d54f1472b60da87ba51be0a9dea361d417b91a4a75373695e9f27b3c672322315d7b566b1f22b96c54adce3e958080fa8a02836955f6264dad3a87fd11f06 +Qy = 452c0a07ff65fff741c96851657a5afc7eeca239622e1260414ed736a04e487157c52da98a7845bcf6f311e0f2e59bb92248b6d47dcb93da6f7e0af644b7aec7603a01950293d8c +k = 1c87653066057636f9a98a7c69a84e103df480a92739abc4d5ba53891591e3aaaef6ef3ef5e89213abbf71af9c84d3b30898580e782f557a03694446492afb05ab801d7dd631c8c +R = 086d539546c61e82d74319f0180411172acaf08b5296dc6435d4ed7bd50cf23d3a071deb3be01f74408e64ad244f069cd41227ba127145df5a357489f944b61606ec75e8377db81 +S = 0a34d9975fbd601614d04aa41506b03fc15189ee8102c0431272d691a322f3e77bcfd19d8bddd19b307012b6c6349f5ecf88b5a69e83588b0e18096117f207304b38c16a9a8592b + +Msg = e89210565959d93b483659e62cf41f0a0147ea23890c2f1a694c377a826165e363860e4b084016cda878a43eb68465f81f397ecd50087a25215ce7c4ededa3552218071fa3acd7ae380655fc8fa884998209ffc8a2c26f1ca19dfcfee455dad35a4e72caecd8da47eb9ee21b889162f5d3032724abfd1a31e68612e18bfa9006 +d = 05468f0df2c9854f5f655743e79c750fd8812db28b096d97207bae7f5aafc6b6090c9c636ead9e0fde32a1ff8d539b53813733ca812b41b58ff85a941abe4f128d59fdf9847baa4 +Qx = 6591750fbc104f82c213fe88aa620e8a960fd6140598e2e6282e0d5c5ecffd09d22ed94166109561a7f4f694e171189056d8b300b54c8134485500effc7123aaa23862e89791242 +Qy = 05bf8ec10a9ac6a92c54e7fb2135e2aa4f84da571d33227bde0aa2e6c1532074882235f3103d9a51e80b7a9a19067f35047ddc52462db7c634c291e8fc5eb2154f6913bd0846b88 +k = 242308c430de514be1b9084a7e6c96894cd5615a7c71ea22316e539986e9702080ff6ceef2980144c55d9749830c20c9ea90b93dfcdd28fd862b6a15748dbb3d982e4a275129c75 +R = 361e1b7a0f981bcc65480b370c5e09b1c2e2a67cf41646f6a3d829f663c09115892237400317601fcee78a04269411d267dad3e8fc6f069529fbdf0bcf9b5f13c9c6de1681e8b0a +S = 2620c29f86cbf698cca5f79de364ae131345a802c0cccfaefdd7375dcc9ba6ccac91f70943eb606506e51e2ced50491eb8f48769810b6dc178d56702838f1c2f0930f2a9e4f1db6 + +Msg = 48629ec97f56273599cd9903f8a84ac2ba74275b40e1e42fa47649568babe05cf63c8417d828251acc2eec525b56dc9082b68d51b0c2bbaa7389fbee15d058cf482993b2bedc5a9101f1afdc79989a812478245d191550109fc17215679553c508c84e3d4cfdea377088d09eb214e6f92410facee4790beeecafe72b2e3ed192 +d = 3d3c6a7ab9450c94aa3b8a1ffb678e5b647af24cbfd66ee3944e6f264f406295b803767471fc67936fdfed1714b4b8761a07eec86543b7c4da6bd2fcb33fa8cda4077737f398e18 +Qx = 42d536f1b15a22f4ba80066798d8d1c2704988eeb9423319c1850a1ae6bba4097307b515640ed3112e93f1f6ae67c60a4b0d2b6634aa7038a60b52b2b447fd1651857b71711c975 +Qy = 79eb18cc7493a1c7f2f9b621969b9ce9ee37fc0701f6cf56f5d5dc6efb13a384517a387f253aae1e93bb0a919b0c22e4d6cbc79b449b268a068b7eb2853324b96715d75b8c26f27 +k = 23ce112d60a2f7c29d77d64acd9f587e0eb75ef8e739b8548e154681efc24243594eef5e33d845b1e4e89bac56f2e9586e042e0fff38bcf79c73fc9aa5fc908261df5cd2c6cb821 +R = 3a770df8a2bc35e122c1bd551c38400be47f2499ff57618ccd01e14a2e35e87a67b0e40f9a10eee7efcc3d37b474f2840fb8c24a9adf93734680ae6b25818369c8608a2f8f338f1 +S = 0728a4eae5f5638a51579e224a24ecd4c997001bb8681e23a7476fbf78b4fab84497000f20c1e67e8a4e4116498bcee49ff00026009af31c1037172188aacd264fde8db15c97167 + +Msg = aa3a9fe467b1ca638dd0622c9ea235a418b39b2e15ad81fee01b6892b240783d8db3c72e16c13df8016dac6addbfb85232158325bd7432fca3b8bf5db3abd0b4c5ccd0999609dc42199ca4680692a0805cdd68108bcb493a558ab507cec0a2782a9e976928985352edb2abc0c07078b59d2fd86fda7fc76cfe573181d934c46c +d = 01ce010ea8e6e1a0c26ab22eb90f0700dc73b232c429d36371e68e429792afb7223f10327708bcff779ea55fb5f22ad87aa054e84d10f5450f1bc9a89279062ea2173f55ab0f76c +Qx = 4b2b5acef5921e691f10ade81b91ba8e68e73b33a2494cf4ca6617707861f334eb07ca96dfd681dd63f78102f8d792d66102117b739d477e431d9a3efd79bfcc18cea156db58a0e +Qy = 7e421337d4cb7a98cf9c9c6fdf9fa242904d9906d8a6759ef64a82cbf923b2a57073ea0eabd14aa4295bec84d50a1722fecad3e5f064bd3171facdfff45b170e49f185a3c193f2a +k = 326b62065b7c779dc398ee03a8332cfb940b0f24a7d3de4a90323d9e390ad3fb1f0036abf6f525d8d88ab6641302d10db447b78780d366f32ce36ae571e323124b21984c48aea7d +R = 3d2b207b428829ed5100a92f7276e16978e374c734834b0d627cddf6aff5cab72dafefc6c038a91426e35ee0f2c1acc11c55a34a89874100b89588aba7b02e19490e66eb49ef6ed +S = 3259fef5c2a0779ae408b26e6c7d581fa973156cdb07c329dde0c12b6c498e7a94577719865b7fcc0db078ba72a27bf338ec6b8aa41c15963538c329c55dee67833faebe3b643ad + +Msg = 6c3937014361799f1461f652841b5137eb0dcaf01dd293298d002f27e9a770b9e1a30367e35c04603881f0c814cf8ecfbe1619cc49cd516b1d60d27de37ed52a5e1cc300e2face4669f308ebe6747255a3d386f16778e494a7cdd10b45171b2bfcdabd91b805bf24857708c1b75e368edb2874321324f83a19154d3a1578c767 +d = 1e7410d012aeef02b3723346d24ebafd684c99087ecccaea1cf3735d52c4c81dda41812c09f1e874dc964d858ca240a19963d5dc89451f5dd6764426ae41cb23f19cbfdca0fc562 +Qx = 400a3bb3ff07a339ff98f7c45fe032cf42c0e25de8dee2934ce42dfb0c9894f4fce27fef299b41beb8579270efc7b01c0663c3f72d7bdd9f6ff5186eca9c42d15faaef8784211a5 +Qy = 06fe998f7a0db06efed050d178865a2b7de6ca7c789cedff7f2158a5e07ac1d335ec0dbd213fc9465399028fad8b7f4d2cd16fb8ceae4d3d53abefd2b4037efd7f7245296bfdf9d +k = 2bb0fb9c428e42482d5dbdb35157ad0fa713fe732dac8604c0194e3f9738fac5cf3874bd863718712a3da45b7c4612c8685465ecaec0930d9fec32ab25818d2f25fad580009b698 +R = 1062386d3e77043298eb88be46bd4e6f33c83a7358926b30ca06a6b7139815f6e1630f73d352a2cb9bc0619d08a89d4bde1636c74b6580543ed743073eec2ae0037bea2b3c9228e +S = 1ceef759d804ff7de526559636d0bc7930c096c7b959f04f8fec5d7e96129fba14c8341b0ed84a64c6cce7cd5b058fab7f44dcf3e714544c9b6f9c1d46ce512870deb51856e9dec + +Msg = 12fea55ffda15db902aa6a4388b9807c89c193cbf75b5d2a4c95206fa43dedc45974c80079933451bdc5b3ea015ed3ca2c54156dc61afb1bc82adefed1491302a48b9d3d2f474ab45343c611677d360515b93fb36da7a1c1b2341c9cce185c881c0beef33d43967134a190c09034ae3261f3295b79aebd3fe123616f73cf2089 +d = 2139839ce38eb879d266065dde5e5ea227244323b330e3ad5a0bc690f3c210f794cf18f0d730693887548bfbc434f48ee10ed34cb41d52172b06e448df938170a5e17311cab8e88 +Qx = 2ecf46b90616b534ea25cc9993942fd7576a1c4f2f443d3b1f56d4490bf0af669c9eb9d110fe2a65609875e1a924bc4b9ed2ed2315047bbaeadaa1029b38a7a87dd8751d4128e80 +Qy = 2aec3a2f2557c7152a4907af68aa39485274f20927b2da70823440fbd09cbc308d46e30bd6b705f615b7074fe5421ca36b4aa53861983eceae9a69649495952e75b0f060b5d26e4 +k = 2e3412b61eb23d33ca2910dc25dd14c04d2c8b403d8077a72b9511d71ee9da6d7e1db093b92287f8fb00aea0576f6712c56d80cc4e3554e0faa9c7d911e3d17682de831bf649bd9 +R = 06a3075efec81a86175cd1dc2bfe82e83aff1db640184a6a3ed7a0dcdef51aa0be0005c54ac05f9b65af265af7f2ec3d1d7c137184b0d695d701ff1aed194faf2efa98ce6c5e502 +S = 237d7ff92480fa7d6d1f5a0564a2608afe5e95ce2c29dd88853d1ad9d4d2beb8d1f0423edb883faadd592394f52048bf2dc26d2dc19279477ed86621c7a5960ee3c3e2d345fda29 + +Msg = c8395546842ddb545d8ea3db4efe970453dcb06025ac3b7a25aa5ef62070f3021b9a1fea91ff7055b6c398073e7886a6f71afe53c82c47b71377dfe291972503bbeb25bd477bf0e7adc8a5d3f8b34ccd0080d61e121214e1b29802b711cdd8a6bb2275a2395c467ec2c1571952992e448d736d8bd70ee629c75b5e32b8323a00 +d = 274f70fe69e4dbb55c5d404e39f5196335047113087f8711f2f67f2be4964e4fbcb865680758df1c401cd677b0971654b7a6aeb7bee0d6d80ac0de14d4f46f356b2d5545c185aa6 +Qx = 2b2321e0a1df083919628dd8b4c318b9ded8a3e660ce5585b21e46843228b4d32da765a3776c181654aad0ce90724bf85b01b051d236342b48d41a1dbda1e9904d659c98a039a97 +Qy = 20227182fcf099d46d9882c0b0f26b0595a2a3166248898df2f3fd27c78e7c0b8b59ef0ed6745660c0dea1acb567f9d943928864dd1e94f8eb6b5b8473c0c91485643189cf679d2 +k = 2f234066c936625fca10dd080cbbb1228c4d2054cbdeafc8a0a248c0d22807fc92c661b4f69586ecf9469bc4c22895cc73ecf492fb2165a12b027194d409677e7185de24f6870a3 +R = 3a48daa8e379b3b2f377049a4d462530c9ea67019752f4af4b4192b02d6e028386dcb9ef95c8019e90e09dfc8dff5e6f6812df491906ced39befedf16caef614d8c174e7ea95fc1 +S = 33f18738cb26d88c8c048c58a210c7be70c71636dc62c022df1bd7747d8c67bfcf5ff2fb3990ed35becf6c77755ac62aed480df55efea578671bd8d50536a10e2c0192bd42d78e2 + +[B-571,SHA-512] + +Msg = 10d2e00ae57176c79cdfc746c0c887abe799ee445b151b008e3d9f81eb69be40298ddf37b5c45a9b6e5ff83785d8c140cf11e6a4c3879a2845796872363da24b10f1f8d9cc48f8af20681dceb60dd62095d6d3b1779a4a805de3d74e38983b24c0748618e2f92ef7cac257ff4bd1f41113f2891eb13c47930e69ddbe91f270fb +d = 03e1b03ffca4399d5b439fac8f87a5cb06930f00d304193d7daf83d5947d0c1e293f74aef8e56849f16147133c37a6b3d1b1883e5d61d6b871ea036c5291d9a74541f28878cb986 +Qx = 3b236fc135d849d50140fdaae1045e6ae35ef61091e98f5059b30eb16acdd0deb2bc0d3544bc3a666e0014e50030134fe5466a9e4d3911ed580e28851f3747c0010888e819d3d1f +Qy = 3a8b6627a587d289032bd76374d16771188d7ff281c39542c8977f6872fa932e5daa14e13792dea9ffe8e9f68d6b525ec99b81a5a60cfb0590cc6f297cfff8d7ba1a8bb81fe2e16 +k = 2e56a94cfbbcd293e242f0c2a2e9df289a9480e6ba52e0f00fa19bcf2a7769bd155e6b79ddbd6a8646b0e69c8baea27f8034a18796e8eb4fe6e0e2358c383521d9375d2b6b437f9 +R = 2eb1c5c1fc93cf3c8babed12c031cf1504e094174fd335104cbe4a2abd210b5a14b1c3a455579f1ed0517c31822340e4dd3c1f967e1b4b9d071a1072afc1a199f8c548cd449a634 +S = 22f97bb48641235826cf4e597fa8de849402d6bd6114ad2d7fbcf53a08247e5ee921f1bd5994dffee36eedff5592bb93b8bb148214da3b7baebffbd96b4f86c55b3f6bbac142442 + +Msg = b61a0849a28672cb536fcf61ea2eb389d02ff7a09aa391744cae6597bd56703c40c50ca2dee5f7ee796acfd47322f03d8dbe4d99dc8eec588b4e5467f123075b2d74b2a0b0bbfd3ac5487a905fad6d6ac1421c2e564c0cf15e1f0f10bc31c249b7b46edd2462a55f85560d99bde9d5b06b97817d1dbe0a67c701d6e6e7878272 +d = 2e09ffd8b434bb7f67d1d3ccf482164f1653c6e4ec64dec2517aa21b7a93b2b21ea1eebb54734882f29303e489f02e3b741a87287e2dcdf3858eb6d2ec668f8b5b26f442ce513a2 +Qx = 36f1be8738dd7dae4486b86a08fe90424f3673e76b10e739442e15f3bfafaf841842ac98e490521b7e7bb94c127529f6ec6a42cc6f06fc80606f1210fe020ff508148f93301c9d3 +Qy = 4d39666ebe99fe214336ad440d776c88eb916f2f4a3433548b87d2aebed840b424d15c8341b4a0a657bf6a234d4fe78631c8e07ac1f4dc7474cd6b4545d536b7b17c160db4562d9 +k = 378e7801566d7b77db7a474717ab2195b02957cc264a9449d4126a7cc574728ed5a4769abd5dde987ca66cfe3d45b5fc52ffd266acb8a8bb3fcb4b60f7febbf48aebe33bd3efbdd +R = 3d8105f87fe3166046c08e80a28acc98a80b8b7a729623053c2a9e80afd06756edfe09bdcf3035f6829ede041b745955d219dc5d30ddd8b37f6ba0f6d2857504cdc68a1ed812a10 +S = 34db9998dc53527114518a7ce3783d674ca8cced823fa05e2942e7a0a20b3cc583dcd930c43f9b93079c5ee18a1f5a66e7c3527c18610f9b47a4da7e245ef803e0662e4d2ad721c + +Msg = ba6be551bc60653192401ed8ff9e1acd9013d8811a7a1389528bf07438366f5772cd7aedad010c19c47622cec03a4d35b8003b39ed901b720629ab59de55a03c1ca50a62987f8da159e356245df58d5ae1936e65f3cd3acbe03ad1d0fcab4aaf2a7a947549ae776772201efbc6fab1aebfa1d99994d4f43dc28f39c0f279b992 +d = 2a69bc1df069c6e89722521a63675f318252be629e7558f3716917998e660ac960b0b750562846fe6c12ef492951e51e224754bab84a6eacd4147a5f26ae85ee4381bb14ec2a8c7 +Qx = 4685c0358ca31883cdfd7d609afa8b1e47540a97f473e0ebe98b0aaaab9418877aeead3a26fb01a4725fda20e7223a4fe7de0df6891c0812555b8b146918d3b80edd11615d95b77 +Qy = 67c92736447946c7577965b613e18950d813a4df049a6000895f9dac34d73ea46a83c6a4e7c83831af0d33026825664c44090953521175b9da2a7ac563a0fc5e13c85d34aaf49f2 +k = 1700d9ac00a987ff3a1d0be4290979317fe60f4f8ce1e0e72a026fc89e28c0070b76ada14f7a1a66ac2e8aef17eec18b568ada4fd59c05414e55356fc17d9e5079e6cabfc1f220d +R = 23a279662efec48f6cf8c7334862525b52ac37a9b03da6a063da2849f87801563242783434fca02fa23e32249666ddc6f596e07750ed21de303f4f10de56f1d37101cb0826bb8bf +S = 3b449467b150cba0d7c2b44280c5ac452f1217384ce121c979625d313394f6cef501b81980a02567ca55da2bc313dc0754b5256b08d8e3b63ea033253b205cc5dcb014574b8e9a0 + +Msg = 295720a79ac8201f40a66b06ae5d970afb15f36582897eed25cd92edcd00f70ac8e31c556eed4375ea044c2e8b227a8e02c0a3e996c9272d52ac7b3ad43b80f217295dddc84b177cf1e800ad08bf7fdd021fb2f49b54162092f8d628679c4ee335abbc90c027264c8b288c6e16eca3172eaa297ba50626b00fe0a0ad3a9dbeeb +d = 0d11ed1b78b22b3420df4ddc4acc7c2286d9569dd6dd88e0fa3ecae69bcced68bb81bbb4ca6e9b54e67856e7fdf39155aa27aecb9cc827ccb9cdcf9ac633561b27d8eebfc261aee +Qx = 1868a1335058a69e3ce24ea4e6e8dc25851777bb28d3a5da67b741ec9c46e26f2d2ae70a48c3e4feabb3b15b3c3ebd561f667ef3b95a587621de6073b9c8a904755566c5f7a3b42 +Qy = 6365a03c3f3066eca1af17bbbd08cd52e89f8095075b415cd4b82f3364cbff008fe3642fe71e8a8c634ad0e5d9979251e6cedd42cb97c2203f743210051f5ee1b70c861d2a72c00 +k = 075e49d2ff6f2aa8b44fad90446474ee0e72323a3c39e731b6c2b075cce0cb9d193bc3356f8fdae0e0143603a57028836ee6451cab101a6eb550042cb41b5c4233d3ad3e87034d1 +R = 207a8eed0b87efe65ec558a0ccbecb13b9215e176abd93c1a4803fcae713927ece70ec6c41c621357d78a13a950958871a52621f1de7ab74befd964a0e8f4820b84af3e0811bc67 +S = 2f02017714f54089652e02af36ac5165e44ac4a83747c805a9e003fde4bdb29561dcead2c76b02c195074396a2dcc1b93a256c721716f8eeda8dae443c3eea446118fec3cebc4dc + +Msg = a9cff41c6dfdc4a12f31dc375a5455950077ae323d0b7a3d9a8dde73b76e9d7b94ddf9c88ae8e6c262d704052ac47681fc35adfc56c904baaa6e146eb653984369d76a85596cb744941aa7b558c945ff2e81bd5ef7f00ecb4f43af23b4cea3bd4ba7b1899f1868a0c0ecfc62ccb1d588955597ffbbaf34cab2838efc2b866669 +d = 2c36ef754b5bd065e9eadde684750acc52795be80f54dd3d7a7d743d968a18f7e404bd71f8a76eb0395f396df5a7c2ff7e0ab6de35df34282fda6ee01fe5b9b68ecb4e378dbe32e +Qx = 4805e1a23b6eadcf91647b40903bc1fd3b9921861c942fc24d2c03d0544e7c01f004caeed04b5c4ebbce366a098a878c322cbebe7910bfb0f91b284ac1aef344152fc5831669b79 +Qy = 4f589ddb4da482ba1e9a59241b1dfbc7e9b9b69e8f69f8e90460ad58fdecc48a56842ea6aa0537abec0a605ebfb713e588685a98f62e05a7d52082bfd57e3d68fb7851b37ec5567 +k = 2f2002bdde0c0b0fd92e96abe76c0858e42fd7d94a181c711fc6753572539e18effa8155cde7b1e9ceab2394f9eba874b7ea257d7c308c8ac08500f4944af5f33057650608db8fe +R = 27f9109799bced42730faecdeea68259383a45033c6d5dc8d87adf994b46beb34177e013700b13f1253cf756a8866218e9c8adc180f3c242c56b3de28405b36940d53c2aab24f1a +S = 20a762ffb2f5a88b0e1356964fb558b555c424946109d16c7548f41a33cfe41da1f483276a27b188faf948a56670716ddf3b187570c9f514869c4492d7773d6ce453a075f9bc64f + +Msg = efa6c582d7fcf5e431aa89b3b00180c0e78efd7ccb0384d90b80e59a115a13e55001d951528c42860132531c9b8ab29dda7a657c53c2ce96fd85549f6f1810e121eb89961295335eaa0e40532d85814a4206e6fffdf9bff76599da9b2e71a22ed572910b0e3bae38ad72c7042579f106739a8628dea5a745168bd918736e488a +d = 19ffee50be5496507e3ef5c40ee88a49625e46d1dd1686a52b09ad4a8e3ee9ef364f953bfcd97c52104eecb6138067192997cd4ebadaccb73c7b2560879289a46353a756b73cc43 +Qx = 77dca410e722009ef11b37742c2c003ab3015d0ca0328a70d9d41aae04cb64f7746f1c348b08458eb3bb1788f9ffe7d0570a9b689a9b7aca43e05400bace7630d598f5b484d13c4 +Qy = 7291f74cddd9ff69470cf0d92afaaddcc4c8c274d4a7a64fd94292ddc8bf080606795376bb725ab4d32c72ef77dff34cfedd34aff2f463d635bfcd7e1fd002d84383dc5bf8d5d23 +k = 2ea37750fc3bbdeec100694068d55f92fdf35bff9ed49251c4b8bbfb2dec2dd4446999af8848e05c7b819aeb1864430ab4e8c1d684e1cf78947a71b04d5ab8ad61cc7e3e4e24205 +R = 12ff1852eaff37fee997531039adb1fb2f9b4f4199670c022e8534625fff1fa93390ee9bc7204ad2ba3efc2233260943f1d2381a3cc025b78c6d1f660a7bd6f42e5ed3c123055a9 +S = 1b4d8abb28ef1a9d77066921ed50eba64b8433cf00c66b8467269a4a914f568cdb86c766a7a6a52437c5d98cfc9a2130dfaba20f3c2001f31bba7071647d51fb9fbd5fc67ee120f + +Msg = 211acebfaf13bba33a9dd16722ec53baab92a140127d61372cbf1850f2fc894e942e25d780778235f880743953d04eca7a9205602e388172aec2abf35412b483490751f93b51239b6701cb0aab14e5179b0d7f55d8586358381dd83e3e436bf69a6820317d1701750cb1fea1293467ba589eec5f5779c2dbf2a9b8f28c4dc239 +d = 3129e96fd28c4198cc5242c1e3531a3979fae643d527044e98d7721aa56b5b4b45dfddfa17a4115e10a2b4f46d92f81cbdd7e86e588a4c6d8c2b3a83f54cebcee1d1dd33e85d81a +Qx = 73a92abcc991e3f89d82c47fa0fec48e3e7c4d97e2525f8dc2d24da39f616af4a5a804d2603703f6db7cc9324c5b56a21009373f6605f561c8503394e7746e51273b5722ffbc23d +Qy = 0684c842f03a53a60cce087f4fcdbf23b7a28c48b6b6544f583342a65d97dd87037c6fef176a1f00513713468273494a5be683b68c5e75bc08995fde763bb6f965da1acb7e894f1 +k = 0165e52640fcaf8cbdbfe73cb8058c53045e7670aafb2def28d2c9eceb5ed1634b5339cc47ba981eb6eb03ba714c7717e9ed5acc15c8f304702a0409bd4508015d4626cfc5484b1 +R = 27dcdf16b7156a7a05a752da28b5bd6b233e8a7c16eb7f9030f29c4352e6508f8424d1b5ba789dac4152ac4812ff7975cce69908371a81a4d7d9dd70a8dabebdc4e3af27234f0d0 +S = 32a654a31f09a9803e502a1440c2bcf122780f4f47aa37e15991d9a548583fdca48800804712816b212cd3c657e6bd4cb7443a0288592541473c5086e1277250612c21346538374 + +Msg = ee592e20e0a45c18089c2e41460e65a7d22ed9714379f095d43a308bdd383128aaa6fb24e9d35fd28fc95c5b792ad75c980d2cdf0f460ac60b12c5919d3cb28dac4d488196be6c2dfe462b1b0ce59f8501692255840f5215c0fd8b74b1996a267a5e3b22d2841cf0a0b6315ef4ec7180f1c8494f4c07d5869c01fa2711739efc +d = 3d723d2697cd07dd8444f992f2ab4a063db334034c25ea9be99fd7a1f495e3a644e5ea033a41264e0d24a911e55741d0cab80a0bd678eaec2bd1e60424d4491eb86d664900d907e +Qx = 0c7a229b5fb9fc774c1b6250f3bba2f0972d1aada7080641c014d012db0637a0656a43024ec0ea25ff70012646dc19eeb1033aebcc96a001ba876b2f5def6e198b8d4a53f7c7f4a +Qy = 09228a68eafaac214fdfa19923a0c19629de31ac0967c9d02c53dbf221f9affb735d3bad732f381f1ca414d70920231a78f742254d895a33ffab492f8e6094a542e77962a324ba4 +k = 3b3724a5933353bb9ff5f742f59385e780caa517a963590b7fc89882bed95cf90ca6365ce8b882f2d96e56bd866a5c437733b681308c570c51ec893ea95fede66c7aaf4561173f7 +R = 2a487c1fc29426e8e85f0a35c177cd168a444959b2f5cd4519b9edd52af3ea829cfe964ac2b59198af8e2d3859ebdf9885ebf57bdf5767da1611d3958de286f91ef397230d65599 +S = 10fc01efcb22b982f992efb71887bc79c3f32a9088bc2011c269924cee0f47c36452399d499f2933587081b872e9fd2191c20cd5cd94927839228ebcf22cf7acdf4608a2fa66310 + +Msg = fffca41927debbd53455821441d9115db99fb31bfc69752a382f57bc7abe021f148346ee29e17512c64b4918ab2391d12d6e5643bee6b5682885dc28177b292e23a37ff99b359b9cf7578432af56e0ad1028a6cce7428980654c145af8daf09addbb3be11228d3c742defca9d3b1667f48c63091fe3307ecf72667b02e008f24 +d = 1999ab45d66cd1d3a0fe6aa43bf5ef1e2a67637d53674f6fbbfb9b582be91fc42a12cdcad94b50b0fc7ac55030de24a0b99fbc4314fa743ef4b5198bcc5f54d8b669fbed78e2e91 +Qx = 0cbf3b0bb4a2e6c225aa922bea3b233da4661df5da7e0a1cd343a9b6655ee87fc60cd763dee21eaa2b81c4dd5af6f4fadc3ceea643b37a6b17a6501e1b9b689fb0c4716911c1f10 +Qy = 14b5a9ae025f09066fffa6797ddf95f27eeade06b8ca5be5738f770362d5213c46ecfca58e3c60cb2bae1f8ab1bf0577c80b4fdad02819fc174cafb33df64fc0ec79713f7b25209 +k = 253b533d3ad1c7095363e3fc80cb32471061e44dab3f9ae0ea6252f6ef169cee8badd3eccb77096ae9224f89baeee7e183058579680661655fb689419e36a61e8573de5ecb4cd09 +R = 3ba94f7682fb61de725a35caf1d4d799c4b05a1d1c44eb1c251dd8efab6b7d713c3fb917776902a1bb202f9226558f4c1e75964349717e6dff938d0befea07a9ca1bbd429dd6318 +S = 226f43be8e24062180c726b5cb721cc04ffd3acd82183925523ff9e8631aecbec2c224d5a291bb225f0da726d256aa822ee7cc2c7d69df3f2a5beb21132d91bea22e4c5db900cec + +Msg = a2f71619ea04f7057e6943c2cece8594b341ec3b96c3915d924f94ba13fd7aaeed41ffa0e842ade414784f1ef825fcf2dbcf7bd8263b802def45f94de596aec0c121fc06558c7bb06b9f27a9bf56c42090b5dc344e82b69c4f528d33be166764a593483f6fda0cf56e6000ff363ba220f5ea0ea2c3191615c7ae3bb4fa575324 +d = 2ce1cae0716205330d730e6bc6dbfb6b951dc83ee3b4a7dae75d057e32e8a46e22be75b5f09135452b29c34dfe81a9be2e8dcd243fbd946a0ed14a832a7802e20cfe1abfd3d6e4b +Qx = 75971399fa621ce535144ec1d57f544d798a0a59207166c3d657e5a80ac00e8f5b643448e3546064d68ae624aaabf36face3016561a248256ff9131950ab8b04710551e12222d0c +Qy = 224a50f321647f47de3db4fbe1bf1e3a3dce8a834312779f66037315e3326721e3fd63d4d6ef92b7ba1fa9aeb70f92e2a6701458ac8da49ac386491f2306adcd8dd781fe75e99e1 +k = 0ad95aa69cf9f40e13f8a72ed6d93388168abc8001670ee4d95fb4b726b1f958205ab2f458df8bb9ccf2405680d0e6951abbb922cc11d47cfded93c0efdb70caf0c54e7ae96d7e5 +R = 09ce019161bf29eeaf323933045f59d2efc372904ba50c4a6602b8305234a851d95f06a5b56193ad5d28488102ec25e3f421a5f5c4626b435b423d612e6ab60e0a4fe5d4952e2c5 +S = 04f7b7ac787b361c2bdfa767da9c22152e402184a7ac133f651fdcd928239215dc917401122a6d41e78299b4235e085399e594465b7f8dbfaae9bf302d83470b4295ea06bb9bd1e + +Msg = b60415a831eca2cf60c79a334ef2f327a76d290846ee588d5d33d0a826bb0c7ec3e11dbb384a7f89c8d180425dfae7463e0ea6497d2eec1dde112f1c1efccb532a2e2b66a28e2d36d4252a4c3b12850d465fe21bddc441b92e6a7b0f67744f7f6e7812a0603211a26518b311a5b190ed890ad852bed4f6ed13377cab3eebedf4 +d = 2c9d0fcfcee7e75c3245ba955ae04188b1033c55ec9c821d8de7685276bda3e9a93c3ae1b003e5ea722913e7b169d67b1aa2dc8cd42adbd9368672a3f81a6817bf3e5529dcb0c8b +Qx = 19cba4c8ddadb596d7303331f2a22461849ebfbc78ea69277f72dcfe23d08397025ff6691c61ed9958d68a9c5dd8a32048a89a2553afb9077ec43358763756b1473ab2cd8f25b53 +Qy = 319eeaa78444b7cc5d8cff4e9199ddd2c6dc7bd935a1be1d8b1c657dd5ac49bc92b0cd91304ef44ddb7ecac05518301bfa0e533402043533f99549621e31dcc282a52186478df2b +k = 385e12170ed0b23c9c65ff7edd413145fd343dd841e85c498fae5f36e57764168899902817d4dc39127010faa1da68000a511ac69f80708be5afe1631432f3bab7aaec2bdeb11b4 +R = 231ef400c6a3a0c7b26ba1b92341b72e138ca62d04ea2172854631c40c48081a18a57e9f055748245d3e83d10d21af39935b0e50c9c86956ac46c1ea03ac4ae023d84b24f830973 +S = 24d37d67afafb0676cd7b5da2960cabfc804b0b3244b5e6739f8fe43d0841693d28c61b8e76181f8aa24940d76fc5ea8ef3a95f72f67303e1ed85ad6e83cd2c44fd0e0f3f2f44f4 + +Msg = 5d15a08226cc74cf495be681b795d0bde26b19f29aca1a8c6ef77d50271ebdcb4e5fa2df23961fe11620b1c6580183f6ebdceb2c09516c8127be576496fb71449bbbf0a9d3d1c48a25024619b97c3e0d8b165897db96ae9758d13ac28441d7cbfb75b23cb423e0002046358bb6d64779974a5995dfe54b398f95f7d64fc52d96 +d = 10c057bbaa44ef0f565edc288bfe66d4f6acd8686899359bca418ba89fb690429489a37bd3c6c9f3a8714b2ca225868c6a45fee360e378a676f7ea39321790f32a4b005b81dce43 +Qx = 43b1e7d7b2aee3563813a6692f0b4b61ba82b801697c3e23724a2fbab2af80a2c56be55af41def0a90cbfce7a45ec61629906055a8b2a5013740e96859e580c444ae9f0ddf73afe +Qy = 6742f13244f1bf156d321eab2c3095ca548c3182c405187c3de2fbcb01d0e16e1fef246012c87d4d32378629a75b694572ec8583ae0cc813ac64f10bb05a9e52e4805590482f289 +k = 2b8076102a6448bd4c4e192e93cdb96ea9a6c7f6753818267ee9e67644df1a4a6c9ff64bbe9f64904648cc640fb7f0cce69f9e02878ee950b91ad559a9ec0ae15b676d933f1620f +R = 1ad97f4997037adfe306f3859d550f9fd89bce8b566e657d5742feb17466b6b8d507d5810a8cbba44d671b043ddb557df084bf5d1de74ef8bbd6a93690459fc16a17b80dd6c0f28 +S = 3262ef6e4175e7afe095d18157f67b3d12564d54954e9964e991c31bcfe1dee7e86b35491ce818400cc0f83b819f478f2f2c2d21c6c7a6be43938841559e09bce70b0d61fe51245 + +Msg = 9eca4bd88200baf61b901fca53dc1f1e7e3f83b94d58a6cc6a2adbc9b1a35fe3f8ec61787c76ed9a0d696167cd4fe46e1a0883fda564666131753c576a720125e0b712db1da0278067cb899bdb14eec08737e864544663abb1d62f34a2114be07e8e3cf56e2d17099299ce6b6d83b1a34e6153d7c6a32a72c7b1bf4583fcbcf7 +d = 2c182df7976ea93d996f3ba5d2221f3cb755cc7847bc3fe9e022fa4285046f5bfb426bafa3580beea206de36f87593ae561b4b74a03fcd61fbd0e8d6fd5668f2148819a88a650aa +Qx = 6004b26a184ed710a5fb67e9d042f7fb9c8f5584b1f70a91b0b3be41c3fd2cd1a537e962fdac8756df33f80fce2bb1bc7241d325bfc36dbaef7cf625918d589b6352fa744718910 +Qy = 36a29b04a494abfe809d956c3cd6f84ea51a7fa28cb39a52f16137a13f72f0726a84f6ae53ae24f5b468733f4cbfa0ce5bbbc1cc7b348fb996d33a45ff656a6a7557619f598a6b7 +k = 2ab349232bcb4f4816b26bd0049e130fffc90ca0b9308edd50fb9055358a87fe798d00140b0ae01ed8b1f6bb9bfb726b253c3d4949ce9eecaa6c7fa84d1ef812669fa929f26be0f +R = 0bbf2f9765b12742224ba7d064358c0305fb63e9b54a831e302a4546aa02cace798d82a188d2f536d78544c1571f481289d6ec69d117648026490e781f1eb9fca59bee05234ba7e +S = 27e07ee0a1a99c90753cdc8c0291da25a82c116e62ec58b93f91086ac1cc039b35ce7d8b53cdaa92a5ade65a7684b6e7ab79873dce33dcd467c39d0c764ee390b7fb25ca18912c3 + +Msg = 707450bd84141f3b61beb12ffa5ae89d812dd11badcdf6a88a2d50fc70e23f6d822ff4477047abc58cdfa28f97ad7f4911ae0773c04ebed1f51bb2308cf6e5712c4aaed461edd6987fdd1796aab70198276b601241f6a14225dce575830ff60f935fd9f567d1d210652e4710922fa793da78c8fdc30c273cb08365c9fc887f50 +d = 2d3a65bbe133cc98cf0eb56ee1362195968b4eab960a1d55d8b762f1361fc21348d6f275d4bea1de7158fb97c995e20b92a9c887a3e332d154667ad167acc632eb88a0ead6113a2 +Qx = 34355b54d00c3df7c2762ee2982cb777491aaf78e550c4d2ff5d5a893416eb3517671dbe522b8c553fd71edfe0306cd7628324f4f748091fc5d84ad8af33b896985674649a6f4e5 +Qy = 7e322a04eb600a3faf3e045959f1e9f798e1c965ced40fd4c0383c0d4e79a96bf693a91d7662780990d0c9dfca77a9bc0e13551d2ab35af8a153fa34ea903961fe66996ca053b64 +k = 0a59ac1240bcefc52456486ce23b780cc92c8b89314b8442a6898c373bd0adc3725e3ebac580546d1ec82ebfb2e04c608441d962d759ab5f5af1596c6623487e1347537a3c35bf4 +R = 0c47ef55d93ac36cee537160bbe39c3d4504184188533edfe589a5ab6e5a3e06ef413aa48710d304f0b2bc380fd69a34aa0b8e2e9466fd8a131cb056dffe4b809a59fd83e594483 +S = 2d8de1e8e2a52dd1be08435cda69e673b328573edeb1767849536e6f2d5fc8f18f7bfde936d8c32ecbfa97bf976133d65641320ca1c41e81c388fd6088884bbd89274b1976470fc + +Msg = d5ce9d59391cdc47ef942dd2a818d024ae3917deea8a5a4214e4db6a0c5e6b0936f3e632fdb68a3f0006e05c44b7232013e1da5f877cd197f44fd6f60c1fd2378995e9a47534948c5a09e33750f07a7165072ab38095373b07a50bc1391eb6b650ee13acd63d0352e7d9c31695ea1ec6323f9b5f57b426ace56aa7fdbf419be0 +d = 2a920e8dc928acdd56e3655b2340d4371c793e66f67405fb7a90f31e9c4ef466cc44331d1d2fe3ff7391d2576dc6640772166ef8c154a5ff1808f5dab2f03061070ec8b3f786c36 +Qx = 5edc0fb974314e21ad40d73524d5620b7279084e3ecb9e58b06340ae53d2383efd206b8b1eb3dd60c38f593efc05e2ba5fb8989472bac7db60fcada2d18d4108ab36e8c20cc710d +Qy = 0444cf65175f6bbaf647739cfd8407e7036fc6cc6208ccb9d776eb13e13b377136c683e108775d85b6bc5638926432a17344de965d45e042a0a8e0b63c7fc3a36fc15cf718f3baf +k = 35a0215892d0c52ece29559ebfa061011da8d597af6b3d1ee988ea4819be194c79a42681476140738b1b5dc191485bd20c96c282ab38ddbc3987343155366b6a5d1ce7053efcd83 +R = 1a69a9a51f6b0dc196b2a8db2e8bf61764d4c65b038f43b5ed6b5dc2673971c32928606f92b7caafb4dab3cd61ee724bba71a0d5c788cde4b96ef6b453f2a69126dafc20dbc7c82 +S = 13b5463636b8462cd9f479de8d114e29e7011489bcb9735ffe9ca0707a07df3c0aba05043eab387bfedd9fe982fbf04968f2be200e9e052cb4b02223b8579913d713acf94e7dc80 + diff --git a/packages/crypto/testdata/extract_sig_gen.sh b/packages/crypto/testdata/extract_sig_gen.sh new file mode 100755 index 0000000000..08473a5711 --- /dev/null +++ b/packages/crypto/testdata/extract_sig_gen.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +SIGGEN="$1" +[ -z "$SIGGEN" ] && echo "Usage: $0 .txt [CURVE] [HASH]" && echo "Eg.: $0 186-4ecdsatestvectors/SigGen.txt P-256 SHA-224" && exit 1 +CURVE="$2" +[ -z "$CURVE" ] && CURVE="P-256" +HASH="$3" +[ -z "$HASH" ] && HASH="SHA-256" + +cat $SIGGEN | sed 's/ //' | \ +sed -n -E "/^\[$CURVE,$HASH\]/,/^\[/{s/\[$CURVE,$HASH\]/\[/;s/^Msg = *([^ ]*)/ {\n \"message\": \"\1\",/;/^Qx =/{N;s/^Qx = *([^ ]*)\nQy = *([^ ]*)/ \"pubkey\": \"04\1\2\",/};/^R =/{N;s/^R = *([^ ]*)\nS = *([^ ]*)/ \"signature\": \"\1\2\"\n\ },/};s/^\[.*\]/\]/;p}" | \ +grep -E '[[{}"]|]' | \ +tac | \ +sed '2s/},/}/' | \ +tac From eacb91c34000fd5961105668bf0244ca4c0708d2 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Sun, 7 Jan 2024 20:39:50 +0100 Subject: [PATCH 1138/2372] cargo fmt --- packages/crypto/src/secp256r1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/crypto/src/secp256r1.rs b/packages/crypto/src/secp256r1.rs index 7d4177afb9..7bb05efa2b 100644 --- a/packages/crypto/src/secp256r1.rs +++ b/packages/crypto/src/secp256r1.rs @@ -198,7 +198,7 @@ mod tests { COSMOS_SECP256R1_PUBKEY_HEX1, COSMOS_SECP256R1_PUBKEY_HEX2, COSMOS_SECP256R1_PUBKEY_HEX3, - ]) + ]) .zip(&[ COSMOS_SECP256R1_MSG_HEX1, COSMOS_SECP256R1_MSG_HEX2, From ad3ec1fa15bca22a84bedaefcc4e25d22b60a6d1 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Sun, 7 Jan 2024 21:20:46 +0100 Subject: [PATCH 1139/2372] Add ecdsa mod --- packages/crypto/src/ecdsa.rs | 15 +++++++++++++++ packages/crypto/src/lib.rs | 5 +++-- packages/crypto/src/secp256k1.rs | 18 +----------------- packages/crypto/src/secp256r1.rs | 6 +----- 4 files changed, 20 insertions(+), 24 deletions(-) create mode 100644 packages/crypto/src/ecdsa.rs diff --git a/packages/crypto/src/ecdsa.rs b/packages/crypto/src/ecdsa.rs new file mode 100644 index 0000000000..53778a6d1d --- /dev/null +++ b/packages/crypto/src/ecdsa.rs @@ -0,0 +1,15 @@ +/// Max length of a message hash for secp256k1 verification in bytes. +/// This is typically a 32 byte output of e.g. SHA-256 or Keccak256. In theory shorter values +/// are possible but currently not supported by the implementation. Let us know when you need them. +pub const MESSAGE_HASH_MAX_LEN: usize = 32; + +/// ECDSA (secp256k1) parameters +/// Length of a serialized signature +pub const ECDSA_SIGNATURE_LEN: usize = 64; + +/// Length of a serialized compressed public key +pub(crate) const ECDSA_COMPRESSED_PUBKEY_LEN: usize = 33; +/// Length of a serialized uncompressed public key +pub(crate) const ECDSA_UNCOMPRESSED_PUBKEY_LEN: usize = 65; +/// Max length of a serialized public key +pub const ECDSA_PUBKEY_MAX_LEN: usize = ECDSA_UNCOMPRESSED_PUBKEY_LEN; diff --git a/packages/crypto/src/lib.rs b/packages/crypto/src/lib.rs index f0b7234271..e37b1946dc 100644 --- a/packages/crypto/src/lib.rs +++ b/packages/crypto/src/lib.rs @@ -3,12 +3,15 @@ //! they might change frequently, or be removed in the future. //! This crate does not adhere to semantic versioning. mod backtrace; +mod ecdsa; mod ed25519; mod errors; mod identity_digest; mod secp256k1; mod secp256r1; +#[doc(hidden)] +pub use crate::ecdsa::{ECDSA_PUBKEY_MAX_LEN, ECDSA_SIGNATURE_LEN, MESSAGE_HASH_MAX_LEN}; #[doc(hidden)] pub use crate::ed25519::EDDSA_PUBKEY_LEN; #[doc(hidden)] @@ -18,7 +21,5 @@ pub use crate::errors::{CryptoError, CryptoResult}; #[doc(hidden)] pub use crate::secp256k1::{secp256k1_recover_pubkey, secp256k1_verify}; #[doc(hidden)] -pub use crate::secp256k1::{ECDSA_PUBKEY_MAX_LEN, ECDSA_SIGNATURE_LEN, MESSAGE_HASH_MAX_LEN}; -#[doc(hidden)] pub use crate::secp256r1::secp256r1_verify; pub(crate) use backtrace::BT; diff --git a/packages/crypto/src/secp256k1.rs b/packages/crypto/src/secp256k1.rs index 2b0d8dce2f..6fc27adc85 100644 --- a/packages/crypto/src/secp256k1.rs +++ b/packages/crypto/src/secp256k1.rs @@ -4,26 +4,10 @@ use k256::{ ecdsa::{RecoveryId, Signature, VerifyingKey}, // type aliases }; +use crate::ecdsa::{ECDSA_COMPRESSED_PUBKEY_LEN, ECDSA_UNCOMPRESSED_PUBKEY_LEN}; use crate::errors::{CryptoError, CryptoResult}; use crate::identity_digest::Identity256; -/// Max length of a message hash for secp256k1 verification in bytes. -/// This is typically a 32 byte output of e.g. SHA-256 or Keccak256. In theory shorter values -/// are possible but currently not supported by the implementation. Let us know when you need them. -// TODO: Move these to their own module for generality -pub const MESSAGE_HASH_MAX_LEN: usize = 32; - -/// ECDSA (secp256k1) parameters -/// Length of a serialized signature -pub const ECDSA_SIGNATURE_LEN: usize = 64; - -/// Length of a serialized compressed public key -const ECDSA_COMPRESSED_PUBKEY_LEN: usize = 33; -/// Length of a serialized uncompressed public key -const ECDSA_UNCOMPRESSED_PUBKEY_LEN: usize = 65; -/// Max length of a serialized public key -pub const ECDSA_PUBKEY_MAX_LEN: usize = ECDSA_UNCOMPRESSED_PUBKEY_LEN; - /// ECDSA secp256k1 implementation. /// /// This function verifies message hashes (typically, hashed unsing SHA-256) against a signature, diff --git a/packages/crypto/src/secp256r1.rs b/packages/crypto/src/secp256r1.rs index 7bb05efa2b..5fac380689 100644 --- a/packages/crypto/src/secp256r1.rs +++ b/packages/crypto/src/secp256r1.rs @@ -5,14 +5,10 @@ use p256::{ }; use std::convert::TryInto; +use crate::ecdsa::{ECDSA_COMPRESSED_PUBKEY_LEN, ECDSA_UNCOMPRESSED_PUBKEY_LEN}; use crate::errors::{CryptoError, CryptoResult}; use crate::identity_digest::Identity256; -/// Length of a serialized compressed public key -const ECDSA_COMPRESSED_PUBKEY_LEN: usize = 33; -/// Length of a serialized uncompressed public key -const ECDSA_UNCOMPRESSED_PUBKEY_LEN: usize = 65; - /// ECDSA secp256r1 implementation. /// /// This function verifies message hashes (typically, hashed using SHA-256) against a signature, From c02c490890c2384b687ca4ee33405342214b3fb2 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Sun, 7 Jan 2024 21:52:16 +0100 Subject: [PATCH 1140/2372] cargo clippy --- packages/std/src/errors/std_error.rs | 5 +++-- packages/std/src/results/mod.rs | 2 +- packages/vm/src/imports.rs | 6 +++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index 588511346c..76394c5beb 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -765,8 +765,9 @@ mod tests { #[test] fn from_std_str_utf8error_works() { - let broken = Vec::from(b"Hello \xF0\x90\x80World" as &[u8]); - let error: StdError = str::from_utf8(&broken).unwrap_err().into(); + let broken = b"Hello \xF0\x90\x80World"; + #[allow(invalid_from_utf8)] + let error: StdError = str::from_utf8(broken).unwrap_err().into(); match error { StdError::InvalidUtf8 { msg, .. } => { assert_eq!(msg, "invalid utf-8 sequence of 3 bytes from index 6") diff --git a/packages/std/src/results/mod.rs b/packages/std/src/results/mod.rs index effbf9ed73..2df471c3ea 100644 --- a/packages/std/src/results/mod.rs +++ b/packages/std/src/results/mod.rs @@ -23,5 +23,5 @@ pub use empty::Empty; pub use events::{attr, Attribute, Event}; pub use query::QueryResponse; pub use response::Response; -pub use submessages::{MsgResponse, Reply, ReplyOn, SubMsg, SubMsgResponse, SubMsgResult}; +pub use submessages::{Reply, ReplyOn, SubMsg, SubMsgResponse, SubMsgResult}; pub use system_result::SystemResult; diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index adab68c77c..c8495200b2 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -327,9 +327,9 @@ pub fn do_secp256r1_verify VmResult { let (data, mut store) = env.data_and_store_mut(); - let hash = read_region(&data.memory(&mut store), hash_ptr, MESSAGE_HASH_MAX_LEN)?; - let signature = read_region(&data.memory(&mut store), signature_ptr, ECDSA_SIGNATURE_LEN)?; - let pubkey = read_region(&data.memory(&mut store), pubkey_ptr, ECDSA_PUBKEY_MAX_LEN)?; + let hash = read_region(&data.memory(&store), hash_ptr, MESSAGE_HASH_MAX_LEN)?; + let signature = read_region(&data.memory(&store), signature_ptr, ECDSA_SIGNATURE_LEN)?; + let pubkey = read_region(&data.memory(&store), pubkey_ptr, ECDSA_PUBKEY_MAX_LEN)?; let gas_info = GasInfo::with_cost(data.gas_config.secp256r1_verify_cost); process_gas_info(data, &mut store, gas_info)?; From d4ee302e3a5a40f1b1d2f09f2b45db10d9036863 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Sun, 7 Jan 2024 22:08:26 +0100 Subject: [PATCH 1141/2372] Fix / improve secp256r1 verification tests --- packages/vm/src/imports.rs | 173 +++++++++++++++++++------------------ 1 file changed, 88 insertions(+), 85 deletions(-) diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index c8495200b2..e680c17069 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -673,9 +673,12 @@ mod tests { const TESTING_GAS_LIMIT: u64 = 500_000_000; // ~0.5ms const TESTING_MEMORY_LIMIT: Option = Some(Size::mebi(16)); - const ECDSA_HASH_HEX: &str = "5ae8317d34d1e595e3fa7247db80c0af4320cce1116de187f8f7e2e099c0d8d0"; - const ECDSA_SIG_HEX: &str = "207082eb2c3dfa0b454e0906051270ba4074ac93760ba9e7110cd9471475111151eb0dbbc9920e72146fb564f99d039802bf6ef2561446eb126ef364d21ee9c4"; - const ECDSA_PUBKEY_HEX: &str = "04051c1ee2190ecfb174bfe4f90763f2b4ff7517b70a2aec1876ebcfd644c4633fb03f3cfbd94b1f376e34592d9d41ccaf640bb751b00a1fadeb0c01157769eb73"; + const ECDSA_P256K1_HASH_HEX: &str = "5ae8317d34d1e595e3fa7247db80c0af4320cce1116de187f8f7e2e099c0d8d0"; + const ECDSA_P256K1_SIG_HEX: &str = "207082eb2c3dfa0b454e0906051270ba4074ac93760ba9e7110cd9471475111151eb0dbbc9920e72146fb564f99d039802bf6ef2561446eb126ef364d21ee9c4"; + const ECDSA_P256K1_PUBKEY_HEX: &str = "04051c1ee2190ecfb174bfe4f90763f2b4ff7517b70a2aec1876ebcfd644c4633fb03f3cfbd94b1f376e34592d9d41ccaf640bb751b00a1fadeb0c01157769eb73"; + const ECDSA_P256R1_HASH_HEX: &str = "b804cf88af0c2eff8bbbfb3660ebb3294138e9d3ebd458884e19818061dacff0"; + const ECDSA_P256R1_SIG_HEX: &str = "35fb60f5ca0f3ca08542fb3cc641c8263a2cab7a90ee6a5e1583fac2bb6f6bd1ee59d81bc9db1055cc0ed97b159d8784af04e98511d0a9a407b99bb292572e96"; + const ECDSA_P256R1_PUBKEY_HEX: &str = "0474ccd8a62fba0e667c50929a53f78c21b8ff0c3c737b0b40b1750b2302b0bde829074e21f3a0ef88b9efdf10d06aa4c295cc1671f758ca0e4cd108803d0f2614"; const EDDSA_MSG_HEX: &str = ""; const EDDSA_SIG_HEX: &str = "e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b"; @@ -1392,11 +1395,11 @@ mod tests { let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash = hex::decode(ECDSA_P256K1_HASH_HEX).unwrap(); let hash_ptr = write_data(&mut fe_mut, &hash); - let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig = hex::decode(ECDSA_P256K1_SIG_HEX).unwrap(); let sig_ptr = write_data(&mut fe_mut, &sig); - let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let pubkey = hex::decode(ECDSA_P256K1_PUBKEY_HEX).unwrap(); let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( @@ -1411,13 +1414,13 @@ mod tests { let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let mut hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let mut hash = hex::decode(ECDSA_P256K1_HASH_HEX).unwrap(); // alter hash hash[0] ^= 0x01; let hash_ptr = write_data(&mut fe_mut, &hash); - let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig = hex::decode(ECDSA_P256K1_SIG_HEX).unwrap(); let sig_ptr = write_data(&mut fe_mut, &sig); - let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let pubkey = hex::decode(ECDSA_P256K1_PUBKEY_HEX).unwrap(); let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( @@ -1432,13 +1435,13 @@ mod tests { let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let mut hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let mut hash = hex::decode(ECDSA_P256K1_HASH_HEX).unwrap(); // extend / break hash hash.push(0x00); let hash_ptr = write_data(&mut fe_mut, &hash); - let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig = hex::decode(ECDSA_P256K1_SIG_HEX).unwrap(); let sig_ptr = write_data(&mut fe_mut, &sig); - let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let pubkey = hex::decode(ECDSA_P256K1_PUBKEY_HEX).unwrap(); let pubkey_ptr = write_data(&mut fe_mut, &pubkey); let result = do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr); @@ -1457,13 +1460,13 @@ mod tests { let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let mut hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let mut hash = hex::decode(ECDSA_P256K1_HASH_HEX).unwrap(); // reduce / break hash hash.pop(); let hash_ptr = write_data(&mut fe_mut, &hash); - let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig = hex::decode(ECDSA_P256K1_SIG_HEX).unwrap(); let sig_ptr = write_data(&mut fe_mut, &sig); - let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let pubkey = hex::decode(ECDSA_P256K1_PUBKEY_HEX).unwrap(); let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( @@ -1478,13 +1481,13 @@ mod tests { let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash = hex::decode(ECDSA_P256K1_HASH_HEX).unwrap(); let hash_ptr = write_data(&mut fe_mut, &hash); - let mut sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let mut sig = hex::decode(ECDSA_P256K1_SIG_HEX).unwrap(); // alter sig sig[0] ^= 0x01; let sig_ptr = write_data(&mut fe_mut, &sig); - let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let pubkey = hex::decode(ECDSA_P256K1_PUBKEY_HEX).unwrap(); let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( @@ -1499,13 +1502,13 @@ mod tests { let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash = hex::decode(ECDSA_P256K1_HASH_HEX).unwrap(); let hash_ptr = write_data(&mut fe_mut, &hash); - let mut sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let mut sig = hex::decode(ECDSA_P256K1_SIG_HEX).unwrap(); // extend / break sig sig.push(0x00); let sig_ptr = write_data(&mut fe_mut, &sig); - let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let pubkey = hex::decode(ECDSA_P256K1_PUBKEY_HEX).unwrap(); let pubkey_ptr = write_data(&mut fe_mut, &pubkey); let result = do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr); @@ -1524,13 +1527,13 @@ mod tests { let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash = hex::decode(ECDSA_P256K1_HASH_HEX).unwrap(); let hash_ptr = write_data(&mut fe_mut, &hash); - let mut sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let mut sig = hex::decode(ECDSA_P256K1_SIG_HEX).unwrap(); // reduce / break sig sig.pop(); let sig_ptr = write_data(&mut fe_mut, &sig); - let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let pubkey = hex::decode(ECDSA_P256K1_PUBKEY_HEX).unwrap(); let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( @@ -1545,11 +1548,11 @@ mod tests { let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash = hex::decode(ECDSA_P256K1_HASH_HEX).unwrap(); let hash_ptr = write_data(&mut fe_mut, &hash); - let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig = hex::decode(ECDSA_P256K1_SIG_HEX).unwrap(); let sig_ptr = write_data(&mut fe_mut, &sig); - let mut pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let mut pubkey = hex::decode(ECDSA_P256K1_PUBKEY_HEX).unwrap(); // alter pubkey format pubkey[0] ^= 0x01; let pubkey_ptr = write_data(&mut fe_mut, &pubkey); @@ -1566,11 +1569,11 @@ mod tests { let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash = hex::decode(ECDSA_P256K1_HASH_HEX).unwrap(); let hash_ptr = write_data(&mut fe_mut, &hash); - let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig = hex::decode(ECDSA_P256K1_SIG_HEX).unwrap(); let sig_ptr = write_data(&mut fe_mut, &sig); - let mut pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let mut pubkey = hex::decode(ECDSA_P256K1_PUBKEY_HEX).unwrap(); // alter pubkey pubkey[1] ^= 0x01; let pubkey_ptr = write_data(&mut fe_mut, &pubkey); @@ -1587,11 +1590,11 @@ mod tests { let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash = hex::decode(ECDSA_P256K1_HASH_HEX).unwrap(); let hash_ptr = write_data(&mut fe_mut, &hash); - let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig = hex::decode(ECDSA_P256K1_SIG_HEX).unwrap(); let sig_ptr = write_data(&mut fe_mut, &sig); - let mut pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let mut pubkey = hex::decode(ECDSA_P256K1_PUBKEY_HEX).unwrap(); // extend / break pubkey pubkey.push(0x00); let pubkey_ptr = write_data(&mut fe_mut, &pubkey); @@ -1612,11 +1615,11 @@ mod tests { let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash = hex::decode(ECDSA_P256K1_HASH_HEX).unwrap(); let hash_ptr = write_data(&mut fe_mut, &hash); - let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig = hex::decode(ECDSA_P256K1_SIG_HEX).unwrap(); let sig_ptr = write_data(&mut fe_mut, &sig); - let mut pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let mut pubkey = hex::decode(ECDSA_P256K1_PUBKEY_HEX).unwrap(); // reduce / break pubkey pubkey.pop(); let pubkey_ptr = write_data(&mut fe_mut, &pubkey); @@ -1633,9 +1636,9 @@ mod tests { let (fe, mut store, _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash = hex::decode(ECDSA_P256K1_HASH_HEX).unwrap(); let hash_ptr = write_data(&mut fe_mut, &hash); - let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig = hex::decode(ECDSA_P256K1_SIG_HEX).unwrap(); let sig_ptr = write_data(&mut fe_mut, &sig); let pubkey = vec![]; let pubkey_ptr = write_data(&mut fe_mut, &pubkey); @@ -1694,11 +1697,11 @@ mod tests { let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash = hex::decode(ECDSA_P256R1_HASH_HEX).unwrap(); let hash_ptr = write_data(&mut fe_mut, &hash); - let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig = hex::decode(ECDSA_P256R1_SIG_HEX).unwrap(); let sig_ptr = write_data(&mut fe_mut, &sig); - let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let pubkey = hex::decode(ECDSA_P256R1_PUBKEY_HEX).unwrap(); let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( @@ -1713,17 +1716,17 @@ mod tests { let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let mut hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let mut hash = hex::decode(ECDSA_P256R1_HASH_HEX).unwrap(); // alter hash hash[0] ^= 0x01; let hash_ptr = write_data(&mut fe_mut, &hash); - let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig = hex::decode(ECDSA_P256R1_SIG_HEX).unwrap(); let sig_ptr = write_data(&mut fe_mut, &sig); - let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let pubkey = hex::decode(ECDSA_P256R1_PUBKEY_HEX).unwrap(); let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( - do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_secp256r1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), 1 ); } @@ -1734,16 +1737,16 @@ mod tests { let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let mut hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let mut hash = hex::decode(ECDSA_P256R1_HASH_HEX).unwrap(); // extend / break hash hash.push(0x00); let hash_ptr = write_data(&mut fe_mut, &hash); - let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig = hex::decode(ECDSA_P256R1_SIG_HEX).unwrap(); let sig_ptr = write_data(&mut fe_mut, &sig); - let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let pubkey = hex::decode(ECDSA_P256R1_PUBKEY_HEX).unwrap(); let pubkey_ptr = write_data(&mut fe_mut, &pubkey); - let result = do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr); + let result = do_secp256r1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr); match result.unwrap_err() { VmError::CommunicationErr { source: CommunicationError::RegionLengthTooBig { length, .. }, @@ -1759,17 +1762,17 @@ mod tests { let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let mut hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let mut hash = hex::decode(ECDSA_P256R1_HASH_HEX).unwrap(); // reduce / break hash hash.pop(); let hash_ptr = write_data(&mut fe_mut, &hash); - let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig = hex::decode(ECDSA_P256R1_SIG_HEX).unwrap(); let sig_ptr = write_data(&mut fe_mut, &sig); - let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let pubkey = hex::decode(ECDSA_P256R1_PUBKEY_HEX).unwrap(); let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( - do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_secp256r1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), 3 // mapped InvalidHashFormat ); } @@ -1780,17 +1783,17 @@ mod tests { let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash = hex::decode(ECDSA_P256R1_HASH_HEX).unwrap(); let hash_ptr = write_data(&mut fe_mut, &hash); - let mut sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let mut sig = hex::decode(ECDSA_P256R1_SIG_HEX).unwrap(); // alter sig sig[0] ^= 0x01; let sig_ptr = write_data(&mut fe_mut, &sig); - let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let pubkey = hex::decode(ECDSA_P256R1_PUBKEY_HEX).unwrap(); let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( - do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_secp256r1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), 1 ); } @@ -1801,16 +1804,16 @@ mod tests { let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash = hex::decode(ECDSA_P256R1_HASH_HEX).unwrap(); let hash_ptr = write_data(&mut fe_mut, &hash); - let mut sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let mut sig = hex::decode(ECDSA_P256R1_SIG_HEX).unwrap(); // extend / break sig sig.push(0x00); let sig_ptr = write_data(&mut fe_mut, &sig); - let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let pubkey = hex::decode(ECDSA_P256R1_PUBKEY_HEX).unwrap(); let pubkey_ptr = write_data(&mut fe_mut, &pubkey); - let result = do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr); + let result = do_secp256r1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr); match result.unwrap_err() { VmError::CommunicationErr { source: CommunicationError::RegionLengthTooBig { length, .. }, @@ -1826,17 +1829,17 @@ mod tests { let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash = hex::decode(ECDSA_P256R1_HASH_HEX).unwrap(); let hash_ptr = write_data(&mut fe_mut, &hash); - let mut sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let mut sig = hex::decode(ECDSA_P256R1_SIG_HEX).unwrap(); // reduce / break sig sig.pop(); let sig_ptr = write_data(&mut fe_mut, &sig); - let pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let pubkey = hex::decode(ECDSA_P256R1_PUBKEY_HEX).unwrap(); let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( - do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_secp256r1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), 4 // mapped InvalidSignatureFormat ) } @@ -1847,17 +1850,17 @@ mod tests { let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash = hex::decode(ECDSA_P256R1_HASH_HEX).unwrap(); let hash_ptr = write_data(&mut fe_mut, &hash); - let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig = hex::decode(ECDSA_P256R1_SIG_HEX).unwrap(); let sig_ptr = write_data(&mut fe_mut, &sig); - let mut pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let mut pubkey = hex::decode(ECDSA_P256R1_PUBKEY_HEX).unwrap(); // alter pubkey format pubkey[0] ^= 0x01; let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( - do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_secp256r1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), 5 // mapped InvalidPubkeyFormat ) } @@ -1868,17 +1871,17 @@ mod tests { let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash = hex::decode(ECDSA_P256R1_HASH_HEX).unwrap(); let hash_ptr = write_data(&mut fe_mut, &hash); - let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig = hex::decode(ECDSA_P256R1_SIG_HEX).unwrap(); let sig_ptr = write_data(&mut fe_mut, &sig); - let mut pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let mut pubkey = hex::decode(ECDSA_P256R1_PUBKEY_HEX).unwrap(); // alter pubkey pubkey[1] ^= 0x01; let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( - do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_secp256r1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), 10 // mapped GenericErr ) } @@ -1889,16 +1892,16 @@ mod tests { let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash = hex::decode(ECDSA_P256R1_HASH_HEX).unwrap(); let hash_ptr = write_data(&mut fe_mut, &hash); - let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig = hex::decode(ECDSA_P256R1_SIG_HEX).unwrap(); let sig_ptr = write_data(&mut fe_mut, &sig); - let mut pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let mut pubkey = hex::decode(ECDSA_P256R1_PUBKEY_HEX).unwrap(); // extend / break pubkey pubkey.push(0x00); let pubkey_ptr = write_data(&mut fe_mut, &pubkey); - let result = do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr); + let result = do_secp256r1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr); match result.unwrap_err() { VmError::CommunicationErr { source: CommunicationError::RegionLengthTooBig { length, .. }, @@ -1914,17 +1917,17 @@ mod tests { let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash = hex::decode(ECDSA_P256R1_HASH_HEX).unwrap(); let hash_ptr = write_data(&mut fe_mut, &hash); - let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig = hex::decode(ECDSA_P256R1_SIG_HEX).unwrap(); let sig_ptr = write_data(&mut fe_mut, &sig); - let mut pubkey = hex::decode(ECDSA_PUBKEY_HEX).unwrap(); + let mut pubkey = hex::decode(ECDSA_P256R1_PUBKEY_HEX).unwrap(); // reduce / break pubkey pubkey.pop(); let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( - do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_secp256r1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), 5 // mapped InvalidPubkeyFormat ) } @@ -1935,15 +1938,15 @@ mod tests { let (fe, mut store, mut _instance) = make_instance(api); let mut fe_mut = fe.into_mut(&mut store); - let hash = hex::decode(ECDSA_HASH_HEX).unwrap(); + let hash = hex::decode(ECDSA_P256R1_HASH_HEX).unwrap(); let hash_ptr = write_data(&mut fe_mut, &hash); - let sig = hex::decode(ECDSA_SIG_HEX).unwrap(); + let sig = hex::decode(ECDSA_P256R1_SIG_HEX).unwrap(); let sig_ptr = write_data(&mut fe_mut, &sig); let pubkey = vec![]; let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( - do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_secp256r1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), 5 // mapped InvalidPubkeyFormat ) } @@ -1962,7 +1965,7 @@ mod tests { let pubkey_ptr = write_data(&mut fe_mut, &pubkey); assert_eq!( - do_secp256k1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), + do_secp256r1_verify(fe_mut, hash_ptr, sig_ptr, pubkey_ptr).unwrap(), 10 // mapped GenericErr ) } From 72d7fe40f7888c56c3e5304add6affccb84055cd Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Sun, 7 Jan 2024 22:18:14 +0100 Subject: [PATCH 1142/2372] cargo fmt --- packages/crypto/src/secp256r1.rs | 3 +-- packages/vm/src/imports.rs | 6 ++++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/crypto/src/secp256r1.rs b/packages/crypto/src/secp256r1.rs index 5fac380689..e26362fd1b 100644 --- a/packages/crypto/src/secp256r1.rs +++ b/packages/crypto/src/secp256r1.rs @@ -118,8 +118,7 @@ mod tests { // ECDSA/P-256 test vectors adapted from the FIPS 186-4 ECDSA test vectors (P-256, SHA-256, from // `SigGen.txt` in `186-4ecdsatestvectors.zip`). // - const COSMOS_SECP256R1_PUBKEY_HEX1: &str = - "041ccbe91c075fc7f4f033bfa248db8fccd3565de94bbfb12f3c59ff46c271bf83ce4014c68811f9a21a1fdb2c0e6113e06db7ca93b7404e78dc7ccd5ca89a4ca9"; + const COSMOS_SECP256R1_PUBKEY_HEX1: &str = "041ccbe91c075fc7f4f033bfa248db8fccd3565de94bbfb12f3c59ff46c271bf83ce4014c68811f9a21a1fdb2c0e6113e06db7ca93b7404e78dc7ccd5ca89a4ca9"; const COSMOS_SECP256R1_PUBKEY_HEX2: &str = "04e266ddfdc12668db30d4ca3e8f7749432c416044f2d2b8c10bf3d4012aeffa8abfa86404a2e9ffe67d47c587ef7a97a7f456b863b4d02cfc6928973ab5b1cb39"; const COSMOS_SECP256R1_PUBKEY_HEX3: &str = "0474ccd8a62fba0e667c50929a53f78c21b8ff0c3c737b0b40b1750b2302b0bde829074e21f3a0ef88b9efdf10d06aa4c295cc1671f758ca0e4cd108803d0f2614"; diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index e680c17069..b50126a451 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -673,10 +673,12 @@ mod tests { const TESTING_GAS_LIMIT: u64 = 500_000_000; // ~0.5ms const TESTING_MEMORY_LIMIT: Option = Some(Size::mebi(16)); - const ECDSA_P256K1_HASH_HEX: &str = "5ae8317d34d1e595e3fa7247db80c0af4320cce1116de187f8f7e2e099c0d8d0"; + const ECDSA_P256K1_HASH_HEX: &str = + "5ae8317d34d1e595e3fa7247db80c0af4320cce1116de187f8f7e2e099c0d8d0"; const ECDSA_P256K1_SIG_HEX: &str = "207082eb2c3dfa0b454e0906051270ba4074ac93760ba9e7110cd9471475111151eb0dbbc9920e72146fb564f99d039802bf6ef2561446eb126ef364d21ee9c4"; const ECDSA_P256K1_PUBKEY_HEX: &str = "04051c1ee2190ecfb174bfe4f90763f2b4ff7517b70a2aec1876ebcfd644c4633fb03f3cfbd94b1f376e34592d9d41ccaf640bb751b00a1fadeb0c01157769eb73"; - const ECDSA_P256R1_HASH_HEX: &str = "b804cf88af0c2eff8bbbfb3660ebb3294138e9d3ebd458884e19818061dacff0"; + const ECDSA_P256R1_HASH_HEX: &str = + "b804cf88af0c2eff8bbbfb3660ebb3294138e9d3ebd458884e19818061dacff0"; const ECDSA_P256R1_SIG_HEX: &str = "35fb60f5ca0f3ca08542fb3cc641c8263a2cab7a90ee6a5e1583fac2bb6f6bd1ee59d81bc9db1055cc0ed97b159d8784af04e98511d0a9a407b99bb292572e96"; const ECDSA_P256R1_PUBKEY_HEX: &str = "0474ccd8a62fba0e667c50929a53f78c21b8ff0c3c737b0b40b1750b2302b0bde829074e21f3a0ef88b9efdf10d06aa4c295cc1671f758ca0e4cd108803d0f2614"; From 83bce9d5e852dec69313dbed35ba57401d280dc0 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Sun, 7 Jan 2024 22:26:03 +0100 Subject: [PATCH 1143/2372] cargo +1.70.0 clippy --- packages/std/src/errors/std_error.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index 76394c5beb..31cd692ae1 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -766,7 +766,6 @@ mod tests { #[test] fn from_std_str_utf8error_works() { let broken = b"Hello \xF0\x90\x80World"; - #[allow(invalid_from_utf8)] let error: StdError = str::from_utf8(broken).unwrap_err().into(); match error { StdError::InvalidUtf8 { msg, .. } => { From a96af28ce9df8b70ea09040a54c0e50b652ad052 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Sun, 7 Jan 2024 23:03:53 +0100 Subject: [PATCH 1144/2372] Update contract lock files --- contracts/burner/Cargo.lock | 41 ++++++++++++++++++++++++--- contracts/crypto-verify/Cargo.lock | 41 ++++++++++++++++++++++++--- contracts/cyberpunk/Cargo.lock | 41 ++++++++++++++++++++++++--- contracts/empty/Cargo.lock | 41 ++++++++++++++++++++++++--- contracts/floaty/Cargo.lock | 41 ++++++++++++++++++++++++--- contracts/hackatom/Cargo.lock | 41 ++++++++++++++++++++++++--- contracts/ibc-reflect-send/Cargo.lock | 41 ++++++++++++++++++++++++--- contracts/ibc-reflect/Cargo.lock | 41 ++++++++++++++++++++++++--- contracts/queue/Cargo.lock | 41 ++++++++++++++++++++++++--- contracts/reflect/Cargo.lock | 41 ++++++++++++++++++++++++--- contracts/staking/Cargo.lock | 41 ++++++++++++++++++++++++--- contracts/virus/Cargo.lock | 41 ++++++++++++++++++++++++--- 12 files changed, 444 insertions(+), 48 deletions(-) diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 621ad68e43..3d7ab7cbd5 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -205,6 +205,7 @@ dependencies = [ "ecdsa", "ed25519-zebra", "k256", + "p256", "rand_core 0.6.4", "thiserror", ] @@ -533,6 +534,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", + "pem-rfc7468", "zeroize", ] @@ -637,9 +639,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -647,6 +649,7 @@ dependencies = [ "ff", "generic-array", "group", + "pem-rfc7468", "pkcs8", "rand_core 0.6.4", "sec1", @@ -1031,6 +1034,18 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.3", +] + [[package]] name = "parking_lot_core" version = "0.9.8" @@ -1044,6 +1059,15 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.0" @@ -1066,6 +1090,15 @@ dependencies = [ "spki", ] +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1996,6 +2029,6 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 0c7133c55d..f1fbd75f6b 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -194,6 +194,7 @@ dependencies = [ "ecdsa", "ed25519-zebra", "k256", + "p256", "rand_core 0.6.4", "thiserror", ] @@ -538,6 +539,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", + "pem-rfc7468", "zeroize", ] @@ -642,9 +644,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -652,6 +654,7 @@ dependencies = [ "ff", "generic-array", "group", + "pem-rfc7468", "pkcs8", "rand_core 0.6.4", "sec1", @@ -1048,6 +1051,18 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.3", +] + [[package]] name = "parking_lot_core" version = "0.9.8" @@ -1061,6 +1076,15 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.0" @@ -1083,6 +1107,15 @@ dependencies = [ "spki", ] +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -2039,6 +2072,6 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index c8ad6ebdab..187c6be253 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -229,6 +229,7 @@ dependencies = [ "ecdsa", "ed25519-zebra", "k256", + "p256", "rand_core 0.6.4", "thiserror", ] @@ -569,6 +570,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", + "pem-rfc7468", "zeroize", ] @@ -673,9 +675,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -683,6 +685,7 @@ dependencies = [ "ff", "generic-array", "group", + "pem-rfc7468", "pkcs8", "rand_core 0.6.4", "sec1", @@ -1129,6 +1132,18 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.3", +] + [[package]] name = "parking_lot_core" version = "0.9.8" @@ -1142,6 +1157,15 @@ dependencies = [ "windows-targets 0.48.0", ] +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.0" @@ -1164,6 +1188,15 @@ dependencies = [ "spki", ] +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -2208,6 +2241,6 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/contracts/empty/Cargo.lock b/contracts/empty/Cargo.lock index 32ff767933..577b6432d2 100644 --- a/contracts/empty/Cargo.lock +++ b/contracts/empty/Cargo.lock @@ -194,6 +194,7 @@ dependencies = [ "ecdsa", "ed25519-zebra", "k256", + "p256", "rand_core 0.6.4", "thiserror", ] @@ -522,6 +523,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", + "pem-rfc7468", "zeroize", ] @@ -626,9 +628,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -636,6 +638,7 @@ dependencies = [ "ff", "generic-array", "group", + "pem-rfc7468", "pkcs8", "rand_core 0.6.4", "sec1", @@ -1030,6 +1033,18 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.3", +] + [[package]] name = "parking_lot_core" version = "0.9.8" @@ -1043,6 +1058,15 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.0" @@ -1065,6 +1089,15 @@ dependencies = [ "spki", ] +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1995,6 +2028,6 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 5c82f7d206..3198567e1a 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -194,6 +194,7 @@ dependencies = [ "ecdsa", "ed25519-zebra", "k256", + "p256", "rand_core 0.6.4", "thiserror", ] @@ -522,6 +523,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", + "pem-rfc7468", "zeroize", ] @@ -626,9 +628,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -636,6 +638,7 @@ dependencies = [ "ff", "generic-array", "group", + "pem-rfc7468", "pkcs8", "rand_core 0.6.4", "sec1", @@ -1032,6 +1035,18 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.3", +] + [[package]] name = "parking_lot_core" version = "0.9.8" @@ -1045,6 +1060,15 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.0" @@ -1073,6 +1097,15 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -2013,6 +2046,6 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index a86d6169f5..8a2583418d 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -194,6 +194,7 @@ dependencies = [ "ecdsa", "ed25519-zebra", "k256", + "p256", "rand_core 0.6.4", "thiserror", ] @@ -522,6 +523,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", + "pem-rfc7468", "zeroize", ] @@ -626,9 +628,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -636,6 +638,7 @@ dependencies = [ "ff", "generic-array", "group", + "pem-rfc7468", "pkcs8", "rand_core 0.6.4", "sec1", @@ -1033,6 +1036,18 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.3", +] + [[package]] name = "parking_lot_core" version = "0.9.8" @@ -1046,6 +1061,15 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.0" @@ -1068,6 +1092,15 @@ dependencies = [ "spki", ] +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1998,6 +2031,6 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index cbdb7a170c..8463c4a731 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -194,6 +194,7 @@ dependencies = [ "ecdsa", "ed25519-zebra", "k256", + "p256", "rand_core 0.6.4", "thiserror", ] @@ -522,6 +523,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", + "pem-rfc7468", "zeroize", ] @@ -626,9 +628,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -636,6 +638,7 @@ dependencies = [ "ff", "generic-array", "group", + "pem-rfc7468", "pkcs8", "rand_core 0.6.4", "sec1", @@ -1031,6 +1034,18 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.3", +] + [[package]] name = "parking_lot_core" version = "0.9.8" @@ -1044,6 +1059,15 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.0" @@ -1066,6 +1090,15 @@ dependencies = [ "spki", ] +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1996,6 +2029,6 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index e46281be18..cb4fea39ec 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -194,6 +194,7 @@ dependencies = [ "ecdsa", "ed25519-zebra", "k256", + "p256", "rand_core 0.6.4", "thiserror", ] @@ -522,6 +523,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", + "pem-rfc7468", "zeroize", ] @@ -626,9 +628,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -636,6 +638,7 @@ dependencies = [ "ff", "generic-array", "group", + "pem-rfc7468", "pkcs8", "rand_core 0.6.4", "sec1", @@ -1031,6 +1034,18 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.3", +] + [[package]] name = "parking_lot_core" version = "0.9.8" @@ -1044,6 +1059,15 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.0" @@ -1066,6 +1090,15 @@ dependencies = [ "spki", ] +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1996,6 +2029,6 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index bcdc28add7..648560862f 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -194,6 +194,7 @@ dependencies = [ "ecdsa", "ed25519-zebra", "k256", + "p256", "rand_core 0.6.4", "thiserror", ] @@ -522,6 +523,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", + "pem-rfc7468", "zeroize", ] @@ -626,9 +628,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -636,6 +638,7 @@ dependencies = [ "ff", "generic-array", "group", + "pem-rfc7468", "pkcs8", "rand_core 0.6.4", "sec1", @@ -1020,6 +1023,18 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.3", +] + [[package]] name = "parking_lot_core" version = "0.9.8" @@ -1033,6 +1048,15 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.0" @@ -1055,6 +1079,15 @@ dependencies = [ "spki", ] +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1996,6 +2029,6 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 285bd4b624..c5416bc3c2 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -194,6 +194,7 @@ dependencies = [ "ecdsa", "ed25519-zebra", "k256", + "p256", "rand_core 0.6.4", "thiserror", ] @@ -522,6 +523,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", + "pem-rfc7468", "zeroize", ] @@ -626,9 +628,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -636,6 +638,7 @@ dependencies = [ "ff", "generic-array", "group", + "pem-rfc7468", "pkcs8", "rand_core 0.6.4", "sec1", @@ -1020,6 +1023,18 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.3", +] + [[package]] name = "parking_lot_core" version = "0.9.8" @@ -1033,6 +1048,15 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.0" @@ -1055,6 +1079,15 @@ dependencies = [ "spki", ] +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1997,6 +2030,6 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 5df3b1ba72..8aae5655e0 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -194,6 +194,7 @@ dependencies = [ "ecdsa", "ed25519-zebra", "k256", + "p256", "rand_core 0.6.4", "thiserror", ] @@ -522,6 +523,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", + "pem-rfc7468", "zeroize", ] @@ -632,9 +634,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -642,6 +644,7 @@ dependencies = [ "ff", "generic-array", "group", + "pem-rfc7468", "pkcs8", "rand_core 0.6.4", "sec1", @@ -1026,6 +1029,18 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.3", +] + [[package]] name = "parking_lot_core" version = "0.9.8" @@ -1039,6 +1054,15 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.0" @@ -1061,6 +1085,15 @@ dependencies = [ "spki", ] +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -2024,6 +2057,6 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index eb63192114..4e9087cc8a 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -194,6 +194,7 @@ dependencies = [ "ecdsa", "ed25519-zebra", "k256", + "p256", "rand_core 0.6.4", "thiserror", ] @@ -522,6 +523,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", + "pem-rfc7468", "zeroize", ] @@ -626,9 +628,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -636,6 +638,7 @@ dependencies = [ "ff", "generic-array", "group", + "pem-rfc7468", "pkcs8", "rand_core 0.6.4", "sec1", @@ -1020,6 +1023,18 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.3", +] + [[package]] name = "parking_lot_core" version = "0.9.8" @@ -1033,6 +1048,15 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.0" @@ -1055,6 +1079,15 @@ dependencies = [ "spki", ] +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1997,6 +2030,6 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" From 4c153a3458d4ada97903e7cc7fd9adc32b2fbbf5 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Mon, 8 Jan 2024 08:46:44 +0100 Subject: [PATCH 1145/2372] format_sh --- packages/crypto/testdata/extract_sig_gen.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/crypto/testdata/extract_sig_gen.sh b/packages/crypto/testdata/extract_sig_gen.sh index 08473a5711..527d384f9a 100755 --- a/packages/crypto/testdata/extract_sig_gen.sh +++ b/packages/crypto/testdata/extract_sig_gen.sh @@ -7,9 +7,9 @@ CURVE="$2" HASH="$3" [ -z "$HASH" ] && HASH="SHA-256" -cat $SIGGEN | sed 's/ //' | \ -sed -n -E "/^\[$CURVE,$HASH\]/,/^\[/{s/\[$CURVE,$HASH\]/\[/;s/^Msg = *([^ ]*)/ {\n \"message\": \"\1\",/;/^Qx =/{N;s/^Qx = *([^ ]*)\nQy = *([^ ]*)/ \"pubkey\": \"04\1\2\",/};/^R =/{N;s/^R = *([^ ]*)\nS = *([^ ]*)/ \"signature\": \"\1\2\"\n\ },/};s/^\[.*\]/\]/;p}" | \ -grep -E '[[{}"]|]' | \ -tac | \ -sed '2s/},/}/' | \ -tac +cat $SIGGEN | sed 's/ //' | + sed -n -E "/^\[$CURVE,$HASH\]/,/^\[/{s/\[$CURVE,$HASH\]/\[/;s/^Msg = *([^ ]*)/ {\n \"message\": \"\1\",/;/^Qx =/{N;s/^Qx = *([^ ]*)\nQy = *([^ ]*)/ \"pubkey\": \"04\1\2\",/};/^R =/{N;s/^R = *([^ ]*)\nS = *([^ ]*)/ \"signature\": \"\1\2\"\n\ },/};s/^\[.*\]/\]/;p}" | + grep -E '[[{}"]|]' | + tac | + sed '2s/},/}/' | + tac From ff5e6661c245a12fec6df2bdcb5a563a73ebcbc9 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Mon, 8 Jan 2024 09:04:42 +0100 Subject: [PATCH 1146/2372] Fix / adjust supported imports checks --- packages/vm/src/compatibility.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index 1945ba7661..09eecb52a9 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -739,7 +739,6 @@ mod tests { (import "env" "spam89" (func (param i32 i32) (result i32))) (import "env" "spam90" (func (param i32 i32) (result i32))) (import "env" "spam91" (func (param i32 i32) (result i32))) - (import "env" "spam92" (func (param i32 i32) (result i32))) )"#, ) .unwrap(); From e7f99177469af4ef9e1373ea3bb79543569d6f0c Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Mon, 8 Jan 2024 22:10:08 +0100 Subject: [PATCH 1147/2372] Add report curves and hashes options --- packages/crypto/testdata/extract_sig_gen.sh | 34 +++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/packages/crypto/testdata/extract_sig_gen.sh b/packages/crypto/testdata/extract_sig_gen.sh index 527d384f9a..8bc2e35d3c 100755 --- a/packages/crypto/testdata/extract_sig_gen.sh +++ b/packages/crypto/testdata/extract_sig_gen.sh @@ -1,13 +1,43 @@ #!/bin/bash +function usage() { + echo "Usage: $0 [-c|--curves] [-h|--hashes] .txt [CURVE] [HASH]" + echo "Eg.: $0 186-4ecdsatestvectors/SigGen.txt P-256 SHA-224" + exit 1 +} + +CURVES=0 +HASHES=0 +while [[ $# -gt 0 ]]; do + KEY="$1" + case $KEY in + -c | --curves) + CURVES=1 + shift + ;; + -h | --hashes) + HASHES=1 + shift + ;; + *) + break + ;; + esac +done + SIGGEN="$1" -[ -z "$SIGGEN" ] && echo "Usage: $0 .txt [CURVE] [HASH]" && echo "Eg.: $0 186-4ecdsatestvectors/SigGen.txt P-256 SHA-224" && exit 1 +[ -z "$SIGGEN" ] && usage +[ $CURVES -eq 1 ] && grep '^\[' "$SIGGEN" | cut -f2 -d[ | cut -f1 -d, | sort -u +[ $HASHES -eq 1 ] && grep '^\[' "$SIGGEN" | cut -f1 -d] | cut -f2 -d, | sort -u +[ $CURVES -eq 1 ] || [ $HASHES -eq 1 ] && exit 0 + CURVE="$2" [ -z "$CURVE" ] && CURVE="P-256" HASH="$3" [ -z "$HASH" ] && HASH="SHA-256" -cat $SIGGEN | sed 's/ //' | +cat $SIGGEN | + sed 's/ //' | sed -n -E "/^\[$CURVE,$HASH\]/,/^\[/{s/\[$CURVE,$HASH\]/\[/;s/^Msg = *([^ ]*)/ {\n \"message\": \"\1\",/;/^Qx =/{N;s/^Qx = *([^ ]*)\nQy = *([^ ]*)/ \"pubkey\": \"04\1\2\",/};/^R =/{N;s/^R = *([^ ]*)\nS = *([^ ]*)/ \"signature\": \"\1\2\"\n\ },/};s/^\[.*\]/\]/;p}" | grep -E '[[{}"]|]' | tac | From 2d8f875f0c6f890634fd49be4ebd6a4c0b7b41f2 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 10 Jan 2024 00:06:17 +0100 Subject: [PATCH 1148/2372] Revert wrongly removed exports --- packages/std/src/results/mod.rs | 2 +- packages/vm/src/modules/mod.rs | 2 +- packages/vm/src/wasm_backend/mod.rs | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/std/src/results/mod.rs b/packages/std/src/results/mod.rs index 2df471c3ea..effbf9ed73 100644 --- a/packages/std/src/results/mod.rs +++ b/packages/std/src/results/mod.rs @@ -23,5 +23,5 @@ pub use empty::Empty; pub use events::{attr, Attribute, Event}; pub use query::QueryResponse; pub use response::Response; -pub use submessages::{Reply, ReplyOn, SubMsg, SubMsgResponse, SubMsgResult}; +pub use submessages::{MsgResponse, Reply, ReplyOn, SubMsg, SubMsgResponse, SubMsgResult}; pub use system_result::SystemResult; diff --git a/packages/vm/src/modules/mod.rs b/packages/vm/src/modules/mod.rs index ec3804c914..c871963e87 100644 --- a/packages/vm/src/modules/mod.rs +++ b/packages/vm/src/modules/mod.rs @@ -5,7 +5,7 @@ mod pinned_memory_cache; mod versioning; pub use cached_module::CachedModule; -pub use file_system_cache::FileSystemCache; +pub use file_system_cache::{FileSystemCache, NewFileSystemCacheError}; pub use in_memory_cache::InMemoryCache; pub use pinned_memory_cache::PinnedMemoryCache; pub use versioning::current_wasmer_module_version; diff --git a/packages/vm/src/wasm_backend/mod.rs b/packages/vm/src/wasm_backend/mod.rs index 1b64e39398..59707b8d2f 100644 --- a/packages/vm/src/wasm_backend/mod.rs +++ b/packages/vm/src/wasm_backend/mod.rs @@ -5,3 +5,4 @@ mod limiting_tunables; pub use compile::compile; pub use engine::{make_compiling_engine, make_runtime_engine}; +pub use limiting_tunables::LimitingTunables; From 48bf039042e95aa81932fe916772d708115bf8af Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 10 Jan 2024 20:39:35 +0100 Subject: [PATCH 1149/2372] Fix test vectors reference --- packages/crypto/src/secp256r1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/crypto/src/secp256r1.rs b/packages/crypto/src/secp256r1.rs index e26362fd1b..d77dc1329e 100644 --- a/packages/crypto/src/secp256r1.rs +++ b/packages/crypto/src/secp256r1.rs @@ -130,7 +130,7 @@ mod tests { const COSMOS_SECP256R1_SIGNATURE_HEX2: &str = "976d3a4e9d23326dc0baa9fa560b7c4e53f42864f508483a6473b6a11079b2db1b766e9ceb71ba6c01dcd46e0af462cd4cfa652ae5017d4555b8eeefe36e1932"; const COSMOS_SECP256R1_SIGNATURE_HEX3: &str = "35fb60f5ca0f3ca08542fb3cc641c8263a2cab7a90ee6a5e1583fac2bb6f6bd1ee59d81bc9db1055cc0ed97b159d8784af04e98511d0a9a407b99bb292572e96"; - // Test data originally from https://github.com/cosmos/cosmjs/blob/v0.24.0-alpha.22/packages/crypto/src/secp256k1.spec.ts#L195-L394 + // Test data extracted from https://csrc.nist.gov/projects/cryptographic-algorithm-validation-program/digital-signatures const COSMOS_SECP256R1_TESTS_JSON: &str = "./testdata/secp256r1_tests.json"; #[test] From 9d236b3c10fda63608217861d50888e3f36aa568 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 10 Jan 2024 20:40:12 +0100 Subject: [PATCH 1150/2372] Add secp256r1_recover_pubkey --- packages/crypto/src/secp256r1.rs | 55 ++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/packages/crypto/src/secp256r1.rs b/packages/crypto/src/secp256r1.rs index d77dc1329e..6be6a52e77 100644 --- a/packages/crypto/src/secp256r1.rs +++ b/packages/crypto/src/secp256r1.rs @@ -1,4 +1,5 @@ use digest::{Digest, Update}; // trait +use ecdsa::RecoveryId; use p256::{ ecdsa::signature::DigestVerifier, // traits ecdsa::{Signature, VerifyingKey}, // type aliases @@ -50,6 +51,60 @@ pub fn secp256r1_verify( } } +/// Recovers a public key from a message hash and a signature. +/// +/// This is required when working with Ethereum where public keys +/// are not stored on chain directly. +/// +/// `recovery_param` must be 0 or 1. The values 2 and 3 are unsupported by this implementation, +/// which is the same restriction as Ethereum has (https://github.com/ethereum/go-ethereum/blob/v1.9.25/internal/ethapi/api.go#L466-L469). +/// All other values are invalid. +/// +/// Returns the recovered pubkey in compressed form, which can be used +/// in secp256r1_verify directly. +/// +/// This implementation accepts both high-S and low-S signatures. This is the +/// same behavior as Ethereum's `ecrecover`. The reason is that high-S signatures +/// may be perfectly valid if the application protocol does not disallow them. +/// Or as [EIP-2] put it "The ECDSA recover precompiled contract remains unchanged +/// and will keep accepting high s-values; this is useful e.g. if a contract +/// recovers old Bitcoin signatures.". +/// +/// See also OpenZeppelin's [ECDSA.recover implementation](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.1/contracts/utils/cryptography/ECDSA.sol#L138-L149) +/// which adds further restrictions to avoid potential signature malleability. +/// Please note that restricting signatures to low-S does not make signatures unique +/// in the sense that for each (pubkey, message) there is only one signature. The +/// signer can generate an arbitrary amount of valid signatures. +/// +/// +/// [EIP-2]: https://eips.ethereum.org/EIPS/eip-2 +pub fn secp256r1_recover_pubkey( + message_hash: &[u8], + signature: &[u8], + recovery_param: u8, +) -> Result, CryptoError> { + let message_hash = read_hash(message_hash)?; + let signature = read_signature(signature)?; + + // params other than 0 and 1 are explicitly not supported + let id = match recovery_param { + 0 => RecoveryId::new(false, false), + 1 => RecoveryId::new(true, false), + _ => return Err(CryptoError::invalid_recovery_param()), + }; + + // Compose extended signature + let signature = p256::ecdsa::Signature::from_bytes(&signature.into()) + .map_err(|e| CryptoError::generic_err(e.to_string()))?; + + // Recover + let message_digest = Identity256::new().chain(message_hash); + let pubkey = p256::ecdsa::VerifyingKey::recover_from_digest(message_digest, &signature, id) + .map_err(|e| CryptoError::generic_err(e.to_string()))?; + let encoded: Vec = pubkey.to_encoded_point(false).as_bytes().into(); + Ok(encoded) +} + /// Error raised when hash is not 32 bytes long struct InvalidSecp256r1HashFormat; From 6723584cea7a9233375907995905a71302ae2aec Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 10 Jan 2024 21:08:35 +0100 Subject: [PATCH 1151/2372] Add secp256r1_recover_pubkey tests --- packages/crypto/src/lib.rs | 2 +- packages/crypto/src/secp256r1.rs | 68 ++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/packages/crypto/src/lib.rs b/packages/crypto/src/lib.rs index e37b1946dc..f8a3967655 100644 --- a/packages/crypto/src/lib.rs +++ b/packages/crypto/src/lib.rs @@ -21,5 +21,5 @@ pub use crate::errors::{CryptoError, CryptoResult}; #[doc(hidden)] pub use crate::secp256k1::{secp256k1_recover_pubkey, secp256k1_verify}; #[doc(hidden)] -pub use crate::secp256r1::secp256r1_verify; +pub use crate::secp256r1::{secp256r1_recover_pubkey, secp256r1_verify}; pub(crate) use backtrace::BT; diff --git a/packages/crypto/src/secp256r1.rs b/packages/crypto/src/secp256r1.rs index 6be6a52e77..9d8cebba4d 100644 --- a/packages/crypto/src/secp256r1.rs +++ b/packages/crypto/src/secp256r1.rs @@ -158,7 +158,10 @@ fn check_pubkey(data: &[u8]) -> Result<(), InvalidSecp256r1PubkeyFormat> { #[cfg(test)] mod tests { use super::*; + use std::fs::File; + use std::io::BufReader; + use crate::secp256r1_recover_pubkey; use ecdsa::RecoveryId; use p256::{ ecdsa::signature::DigestSigner, ecdsa::SigningKey, elliptic_curve::rand_core::OsRng, @@ -188,6 +191,15 @@ mod tests { // Test data extracted from https://csrc.nist.gov/projects/cryptographic-algorithm-validation-program/digital-signatures const COSMOS_SECP256R1_TESTS_JSON: &str = "./testdata/secp256r1_tests.json"; + #[derive(Deserialize, Debug)] + struct Encoded { + message: String, + // message_hash: String, + signature: String, + #[serde(rename = "pubkey")] + public_key: String, + } + #[test] fn test_secp256r1_verify() { // Explicit / external hashing @@ -310,4 +322,60 @@ mod tests { ); } } + + #[test] + fn secp256r1_recover_pubkey_works() { + let file = File::open(crate::secp256r1::tests::COSMOS_SECP256R1_TESTS_JSON).unwrap(); + let reader = BufReader::new(file); + let codes: Vec = serde_json::from_reader(reader).unwrap(); + for (i, encoded) in (1..).zip(codes) { + let message = hex::decode(&encoded.message).unwrap(); + let signature = hex::decode(&encoded.signature).unwrap(); + let public_key = hex::decode(&encoded.public_key).unwrap(); + let message_hash = Sha256::digest(message); + + // Since the recovery param is missing in the test vectors, we try both 0 and 1 + let try0 = secp256r1_recover_pubkey(&message_hash, &signature, 0); + let try1 = secp256r1_recover_pubkey(&message_hash, &signature, 1); + match (try0, try1) { + (Ok(recovered0), Ok(recovered1)) => { + // Got two different pubkeys. Without the recovery param, we don't know which one is the right one. + assert!(recovered0 == public_key || recovered1 == public_key) + }, + (Ok(recovered), Err(_)) => assert_eq!(recovered, public_key), + (Err(_), Ok(recovered)) => assert_eq!(recovered, public_key), + (Err(_), Err(_)) => panic!("secp256r1_recover_pubkey failed (test case {i} in {COSMOS_SECP256R1_TESTS_JSON})"), + } + } + } + + #[test] + fn secp256r1_recover_pubkey_fails_for_invalid_recovery_param() { + let r_s = hex::decode(COSMOS_SECP256R1_SIGNATURE_HEX1).unwrap(); + let message_hash = Sha256::digest(hex::decode(COSMOS_SECP256R1_MSG_HEX1).unwrap()); + + // 2 and 3 are explicitly unsupported + let recovery_param: u8 = 2; + match secp256r1_recover_pubkey(&message_hash, &r_s, recovery_param).unwrap_err() { + CryptoError::InvalidRecoveryParam { .. } => {} + err => panic!("Unexpected error: {err}"), + } + let recovery_param: u8 = 3; + match secp256r1_recover_pubkey(&message_hash, &r_s, recovery_param).unwrap_err() { + CryptoError::InvalidRecoveryParam { .. } => {} + err => panic!("Unexpected error: {err}"), + } + + // Other values are garbage + let recovery_param: u8 = 4; + match secp256r1_recover_pubkey(&message_hash, &r_s, recovery_param).unwrap_err() { + CryptoError::InvalidRecoveryParam { .. } => {} + err => panic!("Unexpected error: {err}"), + } + let recovery_param: u8 = 255; + match secp256r1_recover_pubkey(&message_hash, &r_s, recovery_param).unwrap_err() { + CryptoError::InvalidRecoveryParam { .. } => {} + err => panic!("Unexpected error: {err}"), + } + } } From bba064c7bdf0d526d75684ddc693b39b0b588ed1 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 10 Jan 2024 21:10:15 +0100 Subject: [PATCH 1152/2372] Improve / consolidate naming --- packages/crypto/src/secp256r1.rs | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/packages/crypto/src/secp256r1.rs b/packages/crypto/src/secp256r1.rs index 9d8cebba4d..01b18616ea 100644 --- a/packages/crypto/src/secp256r1.rs +++ b/packages/crypto/src/secp256r1.rs @@ -192,9 +192,8 @@ mod tests { const COSMOS_SECP256R1_TESTS_JSON: &str = "./testdata/secp256r1_tests.json"; #[derive(Deserialize, Debug)] - struct Encoded { + struct TestVector { message: String, - // message_hash: String, signature: String, #[serde(rename = "pubkey")] public_key: String, @@ -290,21 +289,11 @@ mod tests { use std::fs::File; use std::io::BufReader; - use serde::Deserialize; - - #[derive(Deserialize, Debug)] - struct Encoded { - message: String, - signature: String, - #[serde(rename = "pubkey")] - public_key: String, - } - // Open the file in read-only mode with buffer. let file = File::open(COSMOS_SECP256R1_TESTS_JSON).unwrap(); let reader = BufReader::new(file); - let codes: Vec = serde_json::from_reader(reader).unwrap(); + let codes: Vec = serde_json::from_reader(reader).unwrap(); for (i, encoded) in (1..).zip(codes) { let message = hex::decode(&encoded.message).unwrap(); @@ -327,7 +316,7 @@ mod tests { fn secp256r1_recover_pubkey_works() { let file = File::open(crate::secp256r1::tests::COSMOS_SECP256R1_TESTS_JSON).unwrap(); let reader = BufReader::new(file); - let codes: Vec = serde_json::from_reader(reader).unwrap(); + let codes: Vec = serde_json::from_reader(reader).unwrap(); for (i, encoded) in (1..).zip(codes) { let message = hex::decode(&encoded.message).unwrap(); let signature = hex::decode(&encoded.signature).unwrap(); From 14ea586bab191f393bdc5d04b5a801041070a13a Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 10 Jan 2024 21:11:34 +0100 Subject: [PATCH 1153/2372] Improve naming in secp256k1 tests as well --- packages/crypto/src/secp256k1.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/crypto/src/secp256k1.rs b/packages/crypto/src/secp256k1.rs index 6fc27adc85..4af77ccb14 100644 --- a/packages/crypto/src/secp256k1.rs +++ b/packages/crypto/src/secp256k1.rs @@ -192,7 +192,7 @@ mod tests { const COSMOS_SECP256K1_TESTS_JSON: &str = "./testdata/secp256k1_tests.json"; #[derive(Deserialize, Debug)] - struct Encoded { + struct TestVector { message: String, message_hash: String, signature: String, @@ -286,7 +286,7 @@ mod tests { let file = File::open(COSMOS_SECP256K1_TESTS_JSON).unwrap(); let reader = BufReader::new(file); - let codes: Vec = serde_json::from_reader(reader).unwrap(); + let codes: Vec = serde_json::from_reader(reader).unwrap(); for (i, encoded) in (1..).zip(codes) { let message = hex::decode(&encoded.message).unwrap(); @@ -353,7 +353,7 @@ mod tests { let file = File::open(COSMOS_SECP256K1_TESTS_JSON).unwrap(); let reader = BufReader::new(file); - let codes: Vec = serde_json::from_reader(reader).unwrap(); + let codes: Vec = serde_json::from_reader(reader).unwrap(); for (i, encoded) in (1..).zip(codes) { let message = hex::decode(&encoded.message).unwrap(); let signature = hex::decode(&encoded.signature).unwrap(); From ae5782b539916e323437cb861aac39b176cf346f Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 10 Jan 2024 21:14:00 +0100 Subject: [PATCH 1154/2372] cargo fmt --- packages/crypto/src/secp256r1.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/crypto/src/secp256r1.rs b/packages/crypto/src/secp256r1.rs index 01b18616ea..2f4829d763 100644 --- a/packages/crypto/src/secp256r1.rs +++ b/packages/crypto/src/secp256r1.rs @@ -316,7 +316,8 @@ mod tests { fn secp256r1_recover_pubkey_works() { let file = File::open(crate::secp256r1::tests::COSMOS_SECP256R1_TESTS_JSON).unwrap(); let reader = BufReader::new(file); - let codes: Vec = serde_json::from_reader(reader).unwrap(); + let codes: Vec = + serde_json::from_reader(reader).unwrap(); for (i, encoded) in (1..).zip(codes) { let message = hex::decode(&encoded.message).unwrap(); let signature = hex::decode(&encoded.signature).unwrap(); From b58166c44bc855a43405a5f1a260d7058b6e1308 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Sat, 20 Jan 2024 07:07:39 +0100 Subject: [PATCH 1155/2372] Update lock file --- Cargo.lock | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index dcbacd74dc..2e33ce2f9e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1535,6 +1535,16 @@ dependencies = [ "sha2 0.10.6", ] +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + [[package]] name = "parking_lot_core" version = "0.9.7" From 7cb25d12554139dd457611467e6612b8ab20c046 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Sat, 20 Jan 2024 07:42:55 +0100 Subject: [PATCH 1156/2372] Add secp256r1_verify benchmark --- packages/crypto/benches/main.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/packages/crypto/benches/main.rs b/packages/crypto/benches/main.rs index ce4b8d2eb3..d23ed9e7cd 100644 --- a/packages/crypto/benches/main.rs +++ b/packages/crypto/benches/main.rs @@ -12,6 +12,7 @@ use sha2::Sha256; use cosmwasm_crypto::{ ed25519_batch_verify, ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, + secp256r1_verify, }; use std::cmp::min; @@ -20,6 +21,10 @@ const COSMOS_SECP256K1_SIGNATURE_HEX: &str = "c9dd20e07464d3a688ff4b710b1fbc027e const COSMOS_SECP256K1_PUBKEY_HEX: &str = "034f04181eeba35391b858633a765c4a0c189697b40d216354d50890d350c70290"; +const COSMOS_SECP256R1_MSG_HEX: &str = "5905238877c77421f73e43ee3da6f2d9e2ccad5fc942dcec0cbd25482935faaf416983fe165b1a045ee2bcd2e6dca3bdf46c4310a7461f9a37960ca672d3feb5473e253605fb1ddfd28065b53cb5858a8ad28175bf9bd386a5e471ea7a65c17cc934a9d791e91491eb3754d03799790fe2d308d16146d5c9b0d0debd97d79ce8"; +const COSMOS_SECP256R1_SIGNATURE_HEX: &str = "f3ac8061b514795b8843e3d6629527ed2afd6b1f6a555a7acabb5e6f79c8c2ac8bf77819ca05a6b2786c76262bf7371cef97b218e96f175a3ccdda2acc058903"; +const COSMOS_SECP256R1_PUBKEY_HEX: &str = "041ccbe91c075fc7f4f033bfa248db8fccd3565de94bbfb12f3c59ff46c271bf83ce4014c68811f9a21a1fdb2c0e6113e06db7ca93b7404e78dc7ccd5ca89a4ca9"; + // TEST 3 test vector from https://tools.ietf.org/html/rfc8032#section-7.1 const COSMOS_ED25519_MSG_HEX: &str = "af82"; const COSMOS_ED25519_SIGNATURE_HEX: &str = "6291d657deec24024827e69c3abe01a30ce548a284743a445e3680d7db5ac3ac18ff9b538d16f290ae67f760984dc6594a7c15e9716ed28dc027beceea1ec40a"; @@ -107,6 +112,16 @@ fn bench_crypto(c: &mut Criterion) { }); }); + group.bench_function("secp256r1_verify", |b| { + let message = hex::decode(COSMOS_SECP256R1_MSG_HEX).unwrap(); + let message_hash = Sha256::digest(message); + let signature = hex::decode(COSMOS_SECP256R1_SIGNATURE_HEX).unwrap(); + let public_key = hex::decode(COSMOS_SECP256R1_PUBKEY_HEX).unwrap(); + b.iter(|| { + assert!(secp256r1_verify(&message_hash, &signature, &public_key).unwrap()); + }); + }); + group.bench_function("ed25519_verify", |b| { let message = hex::decode(COSMOS_ED25519_MSG_HEX).unwrap(); let signature = hex::decode(COSMOS_ED25519_SIGNATURE_HEX).unwrap(); From 8e96cb78b006fb6011154976061f55d2e9879dc5 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Sat, 20 Jan 2024 07:52:03 +0100 Subject: [PATCH 1157/2372] Add secp256r1_recover_pubkey benchmark --- packages/crypto/benches/main.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/crypto/benches/main.rs b/packages/crypto/benches/main.rs index d23ed9e7cd..74422cdc1a 100644 --- a/packages/crypto/benches/main.rs +++ b/packages/crypto/benches/main.rs @@ -12,7 +12,7 @@ use sha2::Sha256; use cosmwasm_crypto::{ ed25519_batch_verify, ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, - secp256r1_verify, + secp256r1_recover_pubkey, secp256r1_verify, }; use std::cmp::min; @@ -122,6 +122,20 @@ fn bench_crypto(c: &mut Criterion) { }); }); + group.bench_function("secp256r1_recover_pubkey", |b| { + let message_hash = + hex!("aea3e069e03c0ff4d6b3fa2235e0053bbedc4c7e40efbc686d4dfb5efba4cfed"); + let expected = + hex!("04105d22d9c626520faca13e7ced382dcbe93498315f00cc0ac39c4821d0d737376c47f3cbbfa97dfcebe16270b8c7d5d3a5900b888c42520d751e8faf3b401ef4"); + let r_s = hex!("542c40a18140a6266d6f0286e24e9a7bad7650e72ef0e2131e629c076d9626634f7f65305e24a6bbb5cff714ba8f5a2cee5bdc89ba8d75dcbf21966ce38eb66f"); + let recovery_param: u8 = 1; + + b.iter(|| { + let pubkey = secp256r1_recover_pubkey(&message_hash, &r_s, recovery_param).unwrap(); + assert_eq!(pubkey, expected); + }); + }); + group.bench_function("ed25519_verify", |b| { let message = hex::decode(COSMOS_ED25519_MSG_HEX).unwrap(); let signature = hex::decode(COSMOS_ED25519_SIGNATURE_HEX).unwrap(); From c7a109d2522cd2cd709b32768fe0a10da760f861 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Sat, 20 Jan 2024 10:23:51 +0100 Subject: [PATCH 1158/2372] Update secp256[kr]1_* gas cost estimations based on CI benchs --- packages/vm/src/environment.rs | 12 ++++++------ packages/vm/src/imports.rs | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index 9e7edc9566..bae3a6e787 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -53,13 +53,13 @@ impl Default for GasConfig { const GAS_PER_US: u64 = 1_000_000; Self { // ~154 us in crypto benchmarks - secp256k1_verify_cost: 154 * GAS_PER_US, + secp256k1_verify_cost: 119 * GAS_PER_US, // ~162 us in crypto benchmarks - secp256k1_recover_pubkey_cost: 162 * GAS_PER_US, - // ~154 us in crypto benchmarks - secp256r1_verify_cost: 154 * GAS_PER_US, - // ~162 us in crypto benchmarks - secp256r1_recover_pubkey_cost: 162 * GAS_PER_US, + secp256k1_recover_pubkey_cost: 233 * GAS_PER_US, + // ~525 us in crypto benchmarks + secp256r1_verify_cost: 374 * GAS_PER_US, + // ~582 us in crypto benchmarks + secp256r1_recover_pubkey_cost: 834 * GAS_PER_US, // ~63 us in crypto benchmarks ed25519_verify_cost: 63 * GAS_PER_US, // Gas cost factors, relative to ed25519_verify cost diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index b50126a451..2a40d50184 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -670,7 +670,7 @@ mod tests { const INIT_AMOUNT: u128 = 500; const INIT_DENOM: &str = "TOKEN"; - const TESTING_GAS_LIMIT: u64 = 500_000_000; // ~0.5ms + const TESTING_GAS_LIMIT: u64 = 1_000_000_000; // ~1ms const TESTING_MEMORY_LIMIT: Option = Some(Size::mebi(16)); const ECDSA_P256K1_HASH_HEX: &str = From eb466a55bf761fff174a45f4136f699f5daeca5f Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Sat, 20 Jan 2024 10:52:36 +0100 Subject: [PATCH 1159/2372] Add secp256r1 branch to CI benchmarks --- .circleci/config.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 78ba6b30c3..c22b1b9731 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -84,8 +84,7 @@ workflows: - main - /^[0-9]+\.[0-9]+$/ # Add your branch here if benchmarking matters to your work - - fix-benchmarking - - w3 + - secp256r1-support - coverage deploy: jobs: From 5cf4ba80b4a3dafba7047b44d703b21161bc6889 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Sat, 20 Jan 2024 15:11:21 +0100 Subject: [PATCH 1160/2372] Secp256r1 plumbing / tests --- README.md | 12 +++ packages/std/src/imports.rs | 34 +++++++++ packages/std/src/testing/mock.rs | 123 +++++++++++++++++++++++++++++++ packages/std/src/traits.rs | 7 ++ packages/vm/src/compatibility.rs | 4 +- packages/vm/src/environment.rs | 1 + packages/vm/src/imports.rs | 64 +++++++++++++++- packages/vm/src/instance.rs | 8 +- 8 files changed, 250 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 30f40e051f..9338f6653f 100644 --- a/README.md +++ b/README.md @@ -227,6 +227,18 @@ extern "C" { recovery_param: u32, ) -> u64; + /// Verifies message hashes against a signature with a public key, using the + /// secp256r1 ECDSA parametrization. + /// Returns 0 on verification success, 1 on verification failure, and values + /// greater than 1 in case of error. + fn secp256r1_verify(message_hash_ptr: u32, signature_ptr: u32, public_key_ptr: u32) -> u32; + + fn secp256r1_recover_pubkey( + message_hash_ptr: u32, + signature_ptr: u32, + recovery_param: u32, + ) -> u64; + /// Verifies a message against a signature with a public key, using the /// ed25519 EdDSA scheme. /// Returns 0 on verification success, 1 on verification failure, and values diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index 4a310ce7bd..bbea4b5e18 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -64,6 +64,12 @@ extern "C" { /// greater than 1 in case of error. fn secp256r1_verify(message_hash_ptr: u32, signature_ptr: u32, public_key_ptr: u32) -> u32; + fn secp256r1_recover_pubkey( + message_hash_ptr: u32, + signature_ptr: u32, + recovery_param: u32, + ) -> u64; + /// Verifies a message against a signature with a public key, using the /// ed25519 EdDSA scheme. /// Returns 0 on verification success, 1 on verification failure, and values @@ -439,6 +445,34 @@ impl Api for ExternalApi { } } + fn secp256r1_recover_pubkey( + &self, + message_hash: &[u8], + signature: &[u8], + recover_param: u8, + ) -> Result, RecoverPubkeyError> { + let hash_send = build_region(message_hash); + let hash_send_ptr = &*hash_send as *const Region as u32; + let sig_send = build_region(signature); + let sig_send_ptr = &*sig_send as *const Region as u32; + + let result = + unsafe { secp256r1_recover_pubkey(hash_send_ptr, sig_send_ptr, recover_param.into()) }; + let error_code = from_high_half(result); + let pubkey_ptr = from_low_half(result); + match error_code { + 0 => { + let pubkey = unsafe { consume_region(pubkey_ptr as *mut Region) }; + Ok(pubkey) + } + 2 => panic!("MessageTooLong must not happen. This is a bug in the VM."), + 3 => Err(RecoverPubkeyError::InvalidHashFormat), + 4 => Err(RecoverPubkeyError::InvalidSignatureFormat), + 6 => Err(RecoverPubkeyError::InvalidRecoveryParam), + error_code => Err(RecoverPubkeyError::unknown_err(error_code)), + } + } + fn ed25519_verify( &self, message: &[u8], diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 676120ebe2..238eeabf73 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -191,6 +191,17 @@ impl Api for MockApi { )?) } + fn secp256r1_recover_pubkey( + &self, + message_hash: &[u8], + signature: &[u8], + recovery_param: u8, + ) -> Result, RecoverPubkeyError> { + let pubkey = + cosmwasm_crypto::secp256r1_recover_pubkey(message_hash, signature, recovery_param)?; + Ok(pubkey.to_vec()) + } + fn ed25519_verify( &self, message: &[u8], @@ -1119,6 +1130,11 @@ mod tests { const SECP256K1_SIG_HEX: &str = "207082eb2c3dfa0b454e0906051270ba4074ac93760ba9e7110cd9471475111151eb0dbbc9920e72146fb564f99d039802bf6ef2561446eb126ef364d21ee9c4"; const SECP256K1_PUBKEY_HEX: &str = "04051c1ee2190ecfb174bfe4f90763f2b4ff7517b70a2aec1876ebcfd644c4633fb03f3cfbd94b1f376e34592d9d41ccaf640bb751b00a1fadeb0c01157769eb73"; + const SECP256R1_MSG_HASH_HEX: &str = + "5eb28029ebf3c7025ff2fc2f6de6f62aecf6a72139e1cba5f20d11bbef036a7f"; + const SECP256R1_SIG_HEX: &str = "e67a9717ccf96841489d6541f4f6adb12d17b59a6bef847b6183b8fcf16a32eb9ae6ba6d637706849a6a9fc388cf0232d85c26ea0d1fe7437adb48de58364333"; + const SECP256R1_PUBKEY_HEX: &str = "0468229b48c2fe19d3db034e4c15077eb7471a66031f28a980821873915298ba76303e8ee3742a893f78b810991da697083dd8f11128c47651c27a56740a80c24c"; + const ED25519_MSG_HEX: &str = "72"; const ED25519_SIG_HEX: &str = "92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c00"; const ED25519_PUBKEY_HEX: &str = @@ -1352,6 +1368,113 @@ mod tests { } } + // Basic "works" test. Exhaustive tests on VM's side (packages/vm/src/imports.rs) + #[test] + fn secp256r1_verify_works() { + let api = MockApi::default(); + + let hash = hex::decode(SECP256R1_MSG_HASH_HEX).unwrap(); + let signature = hex::decode(SECP256R1_SIG_HEX).unwrap(); + let public_key = hex::decode(SECP256R1_PUBKEY_HEX).unwrap(); + + assert!(api + .secp256r1_verify(&hash, &signature, &public_key) + .unwrap()); + } + + // Basic "fails" test. Exhaustive tests on VM's side (packages/vm/src/imports.rs) + #[test] + fn secp256r1_verify_fails() { + let api = MockApi::default(); + + let mut hash = hex::decode(SECP256R1_MSG_HASH_HEX).unwrap(); + // alter hash + hash[0] ^= 0x01; + let signature = hex::decode(SECP256R1_SIG_HEX).unwrap(); + let public_key = hex::decode(SECP256R1_PUBKEY_HEX).unwrap(); + + assert!(!api + .secp256r1_verify(&hash, &signature, &public_key) + .unwrap()); + } + + // Basic "errors" test. Exhaustive tests on VM's side (packages/vm/src/imports.rs) + #[test] + fn secp256r1_verify_errs() { + let api = MockApi::default(); + + let hash = hex::decode(SECP256R1_MSG_HASH_HEX).unwrap(); + let signature = hex::decode(SECP256R1_SIG_HEX).unwrap(); + let public_key = vec![]; + + let res = api.secp256r1_verify(&hash, &signature, &public_key); + assert_eq!(res.unwrap_err(), VerificationError::InvalidPubkeyFormat); + } + + #[test] + fn secp256r1_recover_pubkey_works() { + let api = MockApi::default(); + + let hash = hex!("17b03f9f00f6692ccdde485fc63c4530751ef35da6f71336610944b0894fcfb8"); + let signature = hex!("9886ae46c1415c3bc959e82b760ad760aab66885a84e620aa339fdf102465c422bf3a80bc04faa35ebecc0f4864ac02d349f6f126e0f988501b8d3075409a26c"); + let recovery_param = 0; + let expected = hex!("0451f99d2d52d4a6e734484a018b7ca2f895c2929b6754a3a03224d07ae61166ce4737da963c6ef7247fb88d19f9b0c667cac7fe12837fdab88c66f10d3c14cad1"); + + let pubkey = api + .secp256r1_recover_pubkey(&hash, &signature, recovery_param) + .unwrap(); + assert_eq!(pubkey, expected); + } + + #[test] + fn secp256r1_recover_pubkey_fails_for_wrong_recovery_param() { + let api = MockApi::default(); + + let hash = hex!("17b03f9f00f6692ccdde485fc63c4530751ef35da6f71336610944b0894fcfb8"); + let signature = hex!("9886ae46c1415c3bc959e82b760ad760aab66885a84e620aa339fdf102465c422bf3a80bc04faa35ebecc0f4864ac02d349f6f126e0f988501b8d3075409a26c"); + let expected = hex!("0451f99d2d52d4a6e734484a018b7ca2f895c2929b6754a3a03224d07ae61166ce4737da963c6ef7247fb88d19f9b0c667cac7fe12837fdab88c66f10d3c14cad1"); + + // Wrong recovery param leads to different pubkey + let pubkey = api.secp256r1_recover_pubkey(&hash, &signature, 1).unwrap(); + assert_eq!(pubkey.len(), 65); + assert_ne!(pubkey, expected); + + // Invalid recovery param leads to error + let result = api.secp256r1_recover_pubkey(&hash, &signature, 42); + match result.unwrap_err() { + RecoverPubkeyError::InvalidRecoveryParam => {} + err => panic!("Unexpected error: {err:?}"), + } + } + + #[test] + fn secp256r1_recover_pubkey_fails_for_wrong_hash() { + let api = MockApi::default(); + + let hash = hex!("17b03f9f00f6692ccdde485fc63c4530751ef35da6f71336610944b0894fcfb8"); + let signature = hex!("9886ae46c1415c3bc959e82b760ad760aab66885a84e620aa339fdf102465c422bf3a80bc04faa35ebecc0f4864ac02d349f6f126e0f988501b8d3075409a26c"); + let recovery_param = 0; + let expected = hex!("0451f99d2d52d4a6e734484a018b7ca2f895c2929b6754a3a03224d07ae61166ce4737da963c6ef7247fb88d19f9b0c667cac7fe12837fdab88c66f10d3c14cad1"); + + // Wrong hash + let mut corrupted_hash = hash; + corrupted_hash[0] ^= 0x01; + let pubkey = api + .secp256r1_recover_pubkey(&corrupted_hash, &signature, recovery_param) + .unwrap(); + assert_eq!(pubkey.len(), 65); + assert_ne!(pubkey, expected); + + // Malformed hash + let mut malformed_hash = hash.to_vec(); + malformed_hash.push(0x8a); + let result = api.secp256r1_recover_pubkey(&malformed_hash, &signature, recovery_param); + match result.unwrap_err() { + RecoverPubkeyError::InvalidHashFormat => {} + err => panic!("Unexpected error: {err:?}"), + } + } + // Basic "works" test. Exhaustive tests on VM's side (packages/vm/src/imports.rs) #[test] fn ed25519_verify_works() { diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index c493957297..f7a0d1aa7a 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -172,6 +172,13 @@ pub trait Api { public_key: &[u8], ) -> Result; + fn secp256r1_recover_pubkey( + &self, + message_hash: &[u8], + signature: &[u8], + recovery_param: u8, + ) -> Result, RecoverPubkeyError>; + fn ed25519_verify( &self, message: &[u8], diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index 09eecb52a9..bb24de4fc7 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -23,6 +23,7 @@ const SUPPORTED_IMPORTS: &[&str] = &[ "env.secp256k1_verify", "env.secp256k1_recover_pubkey", "env.secp256r1_verify", + "env.secp256r1_recover_pubkey", "env.ed25519_verify", "env.ed25519_batch_verify", "env.debug", @@ -626,6 +627,7 @@ mod tests { (import "env" "secp256k1_verify" (func (param i32 i32 i32) (result i32))) (import "env" "secp256k1_recover_pubkey" (func (param i32 i32 i32) (result i64))) (import "env" "secp256r1_verify" (func (param i32 i32 i32) (result i32))) + (import "env" "secp256r1_recover_pubkey" (func (param i32 i32 i32) (result i64))) (import "env" "ed25519_verify" (func (param i32 i32 i32) (result i32))) (import "env" "ed25519_batch_verify" (func (param i32 i32 i32) (result i32))) )"#, @@ -646,6 +648,7 @@ mod tests { (import "env" "secp256k1_verify" (func (param i32 i32 i32) (result i32))) (import "env" "secp256k1_recover_pubkey" (func (param i32 i32 i32) (result i64))) (import "env" "secp256r1_verify" (func (param i32 i32 i32) (result i32))) + (import "env" "secp256r1_recover_pubkey" (func (param i32 i32 i32) (result i64))) (import "env" "ed25519_verify" (func (param i32 i32 i32) (result i32))) (import "env" "ed25519_batch_verify" (func (param i32 i32 i32) (result i32))) (import "env" "spam01" (func (param i32 i32) (result i32))) @@ -738,7 +741,6 @@ mod tests { (import "env" "spam88" (func (param i32 i32) (result i32))) (import "env" "spam89" (func (param i32 i32) (result i32))) (import "env" "spam90" (func (param i32 i32) (result i32))) - (import "env" "spam91" (func (param i32 i32) (result i32))) )"#, ) .unwrap(); diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index bae3a6e787..0ceb71b66a 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -510,6 +510,7 @@ mod tests { "secp256k1_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), "secp256k1_recover_pubkey" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u64 { 0 }), "secp256r1_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), + "secp256r1_recover_pubkey" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u64 { 0 }), "ed25519_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), "ed25519_batch_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), "debug" => Function::new_typed(&mut store, |_a: u32| {}), diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 2a40d50184..4dfaeea6a6 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -5,7 +5,7 @@ use std::marker::PhantomData; use cosmwasm_crypto::{ ed25519_batch_verify, ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, - secp256r1_verify, CryptoError, + secp256r1_recover_pubkey, secp256r1_verify, CryptoError, }; use cosmwasm_crypto::{ ECDSA_PUBKEY_MAX_LEN, ECDSA_SIGNATURE_LEN, EDDSA_PUBKEY_LEN, MESSAGE_HASH_MAX_LEN, @@ -355,6 +355,45 @@ pub fn do_secp256r1_verify( + mut env: FunctionEnvMut>, + hash_ptr: u32, + signature_ptr: u32, + recover_param: u32, +) -> VmResult { + let (data, mut store) = env.data_and_store_mut(); + + let hash = read_region(&data.memory(&store), hash_ptr, MESSAGE_HASH_MAX_LEN)?; + let signature = read_region(&data.memory(&store), signature_ptr, ECDSA_SIGNATURE_LEN)?; + let recover_param: u8 = match recover_param.try_into() { + Ok(rp) => rp, + Err(_) => return Ok((CryptoError::invalid_recovery_param().code() as u64) << 32), + }; + + let gas_info = GasInfo::with_cost(data.gas_config.secp256r1_recover_pubkey_cost); + process_gas_info(data, &mut store, gas_info)?; + let result = secp256r1_recover_pubkey(&hash, &signature, recover_param); + match result { + Ok(pubkey) => { + let pubkey_ptr = write_to_contract(data, &mut store, pubkey.as_ref())?; + Ok(to_low_half(pubkey_ptr)) + } + Err(err) => match err { + CryptoError::InvalidHashFormat { .. } + | CryptoError::InvalidSignatureFormat { .. } + | CryptoError::InvalidRecoveryParam { .. } + | CryptoError::GenericErr { .. } => Ok(to_high_half(err.code())), + CryptoError::BatchErr { .. } | CryptoError::InvalidPubkeyFormat { .. } => { + panic!("Error must not happen for this call") + } + }, + } +} + /// Return code (error code) for a valid signature const ED25519_VERIFY_CODE_VALID: u32 = 0; @@ -720,6 +759,7 @@ mod tests { "secp256k1_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), "secp256k1_recover_pubkey" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u64 { 0 }), "secp256r1_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), + "secp256r1_recover_pubkey" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u64 { 0 }), "ed25519_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), "ed25519_batch_verify" => Function::new_typed(&mut store, |_a: u32, _b: u32, _c: u32| -> u32 { 0 }), "debug" => Function::new_typed(&mut store, |_a: u32| {}), @@ -1972,6 +2012,28 @@ mod tests { ) } + #[test] + fn do_secp256r1_recover_pubkey_works() { + let api = MockApi::default(); + let (fe, mut store, _instance) = make_instance(api); + let mut fe_mut = fe.into_mut(&mut store); + + let hash = hex!("12135386c09e0bf6fd5c454a95bcfe9b3edb25c71e455c73a212405694b29002"); + let sig = hex!("b53ce4da1aa7c0dc77a1896ab716b921499aed78df725b1504aba1597ba0c64bd7c246dc7ad0e67700c373edcfdd1c0a0495fc954549ad579df6ed1438840851"); + let recovery_param = 0; + let expected = hex!("040a7dbb8bf50cb605eb2268b081f26d6b08e012f952c4b70a5a1e6e7d46af98bbf26dd7d799930062480849962ccf5004edcfd307c044f4e8f667c9baa834eeae"); + + let hash_ptr = write_data(&mut fe_mut, &hash); + let sig_ptr = write_data(&mut fe_mut, &sig); + let result = + do_secp256r1_recover_pubkey(fe_mut.as_mut(), hash_ptr, sig_ptr, recovery_param) + .unwrap(); + let error = result >> 32; + let pubkey_ptr: u32 = (result & 0xFFFFFFFF).try_into().unwrap(); + assert_eq!(error, 0); + assert_eq!(force_read(&mut fe_mut, pubkey_ptr), expected); + } + #[test] fn do_ed25519_verify_works() { let api = MockApi::default(); diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index e6dc6a2461..8baf998350 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -16,7 +16,8 @@ use crate::errors::{CommunicationError, VmError, VmResult}; use crate::imports::{ do_abort, do_addr_canonicalize, do_addr_humanize, do_addr_validate, do_db_read, do_db_remove, do_db_write, do_debug, do_ed25519_batch_verify, do_ed25519_verify, do_query_chain, - do_secp256k1_recover_pubkey, do_secp256k1_verify, do_secp256r1_verify, + do_secp256k1_recover_pubkey, do_secp256k1_verify, do_secp256r1_recover_pubkey, + do_secp256r1_verify, }; #[cfg(feature = "iterator")] use crate::imports::{do_db_next, do_db_next_key, do_db_next_value, do_db_scan}; @@ -162,6 +163,11 @@ where Function::new_typed_with_env(&mut store, &fe, do_secp256r1_verify), ); + env_imports.insert( + "secp256r1_recover_pubkey", + Function::new_typed_with_env(&mut store, &fe, do_secp256r1_recover_pubkey), + ); + // Verifies a message against a signature with a public key, using the ed25519 EdDSA scheme. // Returns 0 on verification success, 1 on verification failure, and values greater than 1 in case of error. // Ownership of input pointers is not transferred to the host. From a377f84d16f8b6b4e5e5791090acc14681d546ac Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Sat, 20 Jan 2024 15:23:22 +0100 Subject: [PATCH 1161/2372] Add crypto-verify verify secp256r1 support --- contracts/crypto-verify/src/contract.rs | 30 +++++++++++++++++++++++++ contracts/crypto-verify/src/msg.rs | 21 ++++++++++++++--- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/contracts/crypto-verify/src/contract.rs b/contracts/crypto-verify/src/contract.rs index f52716df73..2c250f8831 100644 --- a/contracts/crypto-verify/src/contract.rs +++ b/contracts/crypto-verify/src/contract.rs @@ -38,6 +38,16 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { signature.as_slice(), public_key.as_slice(), )?), + QueryMsg::VerifySecp256R1Signature { + message, + signature, + public_key, + } => to_json_binary(&query_verify_secp256r1( + deps, + message.as_slice(), + signature.as_slice(), + public_key.as_slice(), + )?), QueryMsg::VerifyEthereumText { message, signature, @@ -106,6 +116,25 @@ pub fn query_verify_cosmos( } } +pub fn query_verify_secp256r1( + deps: Deps, + message: &[u8], + signature: &[u8], + public_key: &[u8], +) -> StdResult { + // Hashing + let hash = Sha256::digest(message); + + // Verification + let result = deps + .api + .secp256r1_verify(hash.as_ref(), signature, public_key); + match result { + Ok(verifies) => Ok(VerifyResponse { verifies }), + Err(err) => Err(err.into()), + } +} + pub fn query_verify_ethereum_text( deps: Deps, message: &str, @@ -695,6 +724,7 @@ mod tests { ListVerificationsResponse { verification_schemes: vec![ "secp256k1".into(), + "secp256r1".into(), "ed25519".into(), "ed25519_batch".into() ] diff --git a/contracts/crypto-verify/src/msg.rs b/contracts/crypto-verify/src/msg.rs index e2a353e2f4..d04ffd779b 100644 --- a/contracts/crypto-verify/src/msg.rs +++ b/contracts/crypto-verify/src/msg.rs @@ -17,7 +17,17 @@ pub enum QueryMsg { /// Serialized compressed (33 bytes) or uncompressed (65 bytes) public key. public_key: Binary, }, - /// Ethereum text verification (compatible to the eth_sign RPC/web3 enpoint). + /// Cosmos format (secp256r1 verification scheme). + #[returns(VerifyResponse)] + VerifySecp256R1Signature { + /// Message to verify. + message: Binary, + /// Serialized signature. Cosmos format (64 bytes). + signature: Binary, + /// Serialized compressed (33 bytes) or uncompressed (65 bytes) public key. + public_key: Binary, + }, + /// Ethereum text verification (compatible to the eth_sign RPC/web3 endpoint). /// This cannot be used to verify transaction. /// /// See https://web3js.readthedocs.io/en/v1.2.0/web3-eth.html#sign @@ -29,7 +39,7 @@ pub enum QueryMsg { /// Serialized signature. Fixed length format (64 bytes `r` and `s` plus the one byte `v`). signature: Binary, /// Signer address. - /// This is matched case insensitive, so you can provide checksummed and non-checksummed addresses. Checksums are not validated. + /// This is matched case insensitive, so you can provide check-summed and non-check-summed addresses. Checksums are not validated. signer_address: String, }, #[returns(VerifyResponse)] @@ -85,5 +95,10 @@ pub struct ListVerificationsResponse { } pub(crate) fn list_verifications(_deps: Deps) -> Vec { - vec!["secp256k1".into(), "ed25519".into(), "ed25519_batch".into()] + vec![ + "secp256k1".into(), + "secp256r1".into(), + "ed25519".into(), + "ed25519_batch".into(), + ] } From 8932d692db6772e7f36a05a3c0af4a59957f77f6 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Sat, 20 Jan 2024 15:33:05 +0100 Subject: [PATCH 1162/2372] crypto-verify verify secp256r1 integration tests --- contracts/crypto-verify/tests/integration.rs | 68 ++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/contracts/crypto-verify/tests/integration.rs b/contracts/crypto-verify/tests/integration.rs index 1ef58efbb7..738cc6b043 100644 --- a/contracts/crypto-verify/tests/integration.rs +++ b/contracts/crypto-verify/tests/integration.rs @@ -37,6 +37,11 @@ const SECP256K1_MESSAGE_HEX: &str = "5c868fedb8026979ebd26f1ba07c27eedf4ff6d1044 const SECP256K1_SIGNATURE_HEX: &str = "207082eb2c3dfa0b454e0906051270ba4074ac93760ba9e7110cd9471475111151eb0dbbc9920e72146fb564f99d039802bf6ef2561446eb126ef364d21ee9c4"; const SECP256K1_PUBLIC_KEY_HEX: &str = "04051c1ee2190ecfb174bfe4f90763f2b4ff7517b70a2aec1876ebcfd644c4633fb03f3cfbd94b1f376e34592d9d41ccaf640bb751b00a1fadeb0c01157769eb73"; +const SECP256R1_MESSAGE_HEX: &str = + "4d55c99ef6bd54621662c3d110c3cb627c03d6311393b264ab97b90a4b15214a5593ba2510a53d63fb34be251facb697c973e11b665cb7920f1684b0031b4dd370cb927ca7168b0bf8ad285e05e9e31e34bc24024739fdc10b78586f29eff94412034e3b606ed850ec2c1900e8e68151fc4aee5adebb066eb6da4eaa5681378e"; +const SECP256R1_SIGNATURE_HEX: &str = "1cc628533d0004b2b20e7f4baad0b8bb5e0673db159bbccf92491aef61fc9620880e0bbf82a8cf818ed46ba03cf0fc6c898e36fca36cc7fdb1d2db7503634430"; +const SECP256R1_PUBLIC_KEY_HEX: &str = "04b8188bd68701fc396dab53125d4d28ea33a91daf6d21485f4770f6ea8c565dde423f058810f277f8fe076f6db56e9285a1bf2c2a1dae145095edd9c04970bc4a"; + // TEST 3 test vector from https://tools.ietf.org/html/rfc8032#section-7.1 const ED25519_MESSAGE_HEX: &str = "af82"; const ED25519_SIGNATURE_HEX: &str = "6291d657deec24024827e69c3abe01a30ce548a284743a445e3680d7db5ac3ac18ff9b538d16f290ae67f760984dc6594a7c15e9716ed28dc027beceea1ec40a"; @@ -132,6 +137,68 @@ fn cosmos_signature_verify_errors() { ) } +#[test] +fn secp256r1_signature_verify_works() { + let mut deps = setup(); + + let message = hex::decode(SECP256R1_MESSAGE_HEX).unwrap(); + let signature = hex::decode(SECP256R1_SIGNATURE_HEX).unwrap(); + let public_key = hex::decode(SECP256R1_PUBLIC_KEY_HEX).unwrap(); + + let verify_msg = QueryMsg::VerifySecp256R1Signature { + message: Binary::new(message), + signature: Binary::new(signature), + public_key: Binary::new(public_key), + }; + + let raw = query(&mut deps, mock_env(), verify_msg).unwrap(); + let res: VerifyResponse = from_slice(&raw, DESERIALIZATION_LIMIT).unwrap(); + + assert_eq!(res, VerifyResponse { verifies: true }); +} + +#[test] +fn secp256r1_signature_verify_fails() { + let mut deps = setup(); + + let mut message = hex::decode(SECP256R1_MESSAGE_HEX).unwrap(); + // alter hash + message[0] ^= 0x01; + let signature = hex::decode(SECP256R1_SIGNATURE_HEX).unwrap(); + let public_key = hex::decode(SECP256R1_PUBLIC_KEY_HEX).unwrap(); + + let verify_msg = QueryMsg::VerifySecp256R1Signature { + message: Binary::new(message), + signature: Binary::new(signature), + public_key: Binary::new(public_key), + }; + + let raw = query(&mut deps, mock_env(), verify_msg).unwrap(); + let res: VerifyResponse = from_slice(&raw, DESERIALIZATION_LIMIT).unwrap(); + + assert_eq!(res, VerifyResponse { verifies: false }); +} + +#[test] +fn secp256r1_signature_verify_errors() { + let mut deps = setup(); + + let message = hex::decode(SECP256R1_MESSAGE_HEX).unwrap(); + let signature = hex::decode(SECP256R1_SIGNATURE_HEX).unwrap(); + let public_key = vec![]; + + let verify_msg = QueryMsg::VerifySecp256R1Signature { + message: Binary::new(message), + signature: Binary::new(signature), + public_key: Binary::new(public_key), + }; + let res = query(&mut deps, mock_env(), verify_msg); + assert_eq!( + res.unwrap_err(), + "Verification error: Invalid public key format" + ) +} + #[test] fn ethereum_signature_verify_works() { let mut deps = setup(); @@ -488,6 +555,7 @@ fn query_works() { ListVerificationsResponse { verification_schemes: vec![ "secp256k1".into(), + "secp256r1".into(), "ed25519".into(), "ed25519_batch".into() ] From 5469b7961111b518d9e2f5d817106eb891c4e2d9 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Sat, 20 Jan 2024 19:23:11 +0100 Subject: [PATCH 1163/2372] Allow broken utf8 / unknown lint --- packages/std/src/errors/std_error.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index 31cd692ae1..ca3e9254b0 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -766,6 +766,8 @@ mod tests { #[test] fn from_std_str_utf8error_works() { let broken = b"Hello \xF0\x90\x80World"; + #[allow(unknown_lints)] + #[allow(invalid_from_utf8)] let error: StdError = str::from_utf8(broken).unwrap_err().into(); match error { StdError::InvalidUtf8 { msg, .. } => { From 8093926b842b3540a58fd0c1c9939e53f41b9f43 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Sat, 20 Jan 2024 19:30:25 +0100 Subject: [PATCH 1164/2372] cargo schema --- .../crypto-verify/schema/crypto-verify.json | 63 ++++++++++++++++++- contracts/crypto-verify/schema/raw/query.json | 49 ++++++++++++++- ...sponse_to_verify_secp256_r1_signature.json | 14 +++++ 3 files changed, 122 insertions(+), 4 deletions(-) create mode 100644 contracts/crypto-verify/schema/raw/response_to_verify_secp256_r1_signature.json diff --git a/contracts/crypto-verify/schema/crypto-verify.json b/contracts/crypto-verify/schema/crypto-verify.json index aae5dd104b..d0f56c07a2 100644 --- a/contracts/crypto-verify/schema/crypto-verify.json +++ b/contracts/crypto-verify/schema/crypto-verify.json @@ -59,7 +59,52 @@ "additionalProperties": false }, { - "description": "Ethereum text verification (compatible to the eth_sign RPC/web3 enpoint). This cannot be used to verify transaction.\n\nSee https://web3js.readthedocs.io/en/v1.2.0/web3-eth.html#sign", + "description": "Cosmos format (secp256r1 verification scheme).", + "type": "object", + "required": [ + "verify_secp256_r1_signature" + ], + "properties": { + "verify_secp256_r1_signature": { + "type": "object", + "required": [ + "message", + "public_key", + "signature" + ], + "properties": { + "message": { + "description": "Message to verify.", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "public_key": { + "description": "Serialized compressed (33 bytes) or uncompressed (65 bytes) public key.", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "signature": { + "description": "Serialized signature. Cosmos format (64 bytes).", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Ethereum text verification (compatible to the eth_sign RPC/web3 endpoint). This cannot be used to verify transaction.\n\nSee https://web3js.readthedocs.io/en/v1.2.0/web3-eth.html#sign", "type": "object", "required": [ "verify_ethereum_text" @@ -86,7 +131,7 @@ ] }, "signer_address": { - "description": "Signer address. This is matched case insensitive, so you can provide checksummed and non-checksummed addresses. Checksums are not validated.", + "description": "Signer address. This is matched case insensitive, so you can provide check-summed and non-check-summed addresses. Checksums are not validated.", "type": "string" } }, @@ -339,6 +384,20 @@ }, "additionalProperties": false }, + "verify_secp256_r1_signature": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "VerifyResponse", + "type": "object", + "required": [ + "verifies" + ], + "properties": { + "verifies": { + "type": "boolean" + } + }, + "additionalProperties": false + }, "verify_tendermint_batch": { "$schema": "http://json-schema.org/draft-07/schema#", "title": "VerifyResponse", diff --git a/contracts/crypto-verify/schema/raw/query.json b/contracts/crypto-verify/schema/raw/query.json index dbb6e99374..93fc054900 100644 --- a/contracts/crypto-verify/schema/raw/query.json +++ b/contracts/crypto-verify/schema/raw/query.json @@ -48,7 +48,52 @@ "additionalProperties": false }, { - "description": "Ethereum text verification (compatible to the eth_sign RPC/web3 enpoint). This cannot be used to verify transaction.\n\nSee https://web3js.readthedocs.io/en/v1.2.0/web3-eth.html#sign", + "description": "Cosmos format (secp256r1 verification scheme).", + "type": "object", + "required": [ + "verify_secp256_r1_signature" + ], + "properties": { + "verify_secp256_r1_signature": { + "type": "object", + "required": [ + "message", + "public_key", + "signature" + ], + "properties": { + "message": { + "description": "Message to verify.", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "public_key": { + "description": "Serialized compressed (33 bytes) or uncompressed (65 bytes) public key.", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "signature": { + "description": "Serialized signature. Cosmos format (64 bytes).", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Ethereum text verification (compatible to the eth_sign RPC/web3 endpoint). This cannot be used to verify transaction.\n\nSee https://web3js.readthedocs.io/en/v1.2.0/web3-eth.html#sign", "type": "object", "required": [ "verify_ethereum_text" @@ -75,7 +120,7 @@ ] }, "signer_address": { - "description": "Signer address. This is matched case insensitive, so you can provide checksummed and non-checksummed addresses. Checksums are not validated.", + "description": "Signer address. This is matched case insensitive, so you can provide check-summed and non-check-summed addresses. Checksums are not validated.", "type": "string" } }, diff --git a/contracts/crypto-verify/schema/raw/response_to_verify_secp256_r1_signature.json b/contracts/crypto-verify/schema/raw/response_to_verify_secp256_r1_signature.json new file mode 100644 index 0000000000..a2cdc3461c --- /dev/null +++ b/contracts/crypto-verify/schema/raw/response_to_verify_secp256_r1_signature.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "VerifyResponse", + "type": "object", + "required": [ + "verifies" + ], + "properties": { + "verifies": { + "type": "boolean" + } + }, + "additionalProperties": false +} From 7f9669201c0eea41acd12161da4407941e661fdc Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Tue, 23 Jan 2024 10:46:52 +0100 Subject: [PATCH 1165/2372] Fix rebase errors --- packages/std/src/errors/std_error.rs | 6 ++---- packages/vm/src/modules/mod.rs | 2 +- packages/vm/src/wasm_backend/mod.rs | 1 - 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index ca3e9254b0..588511346c 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -765,10 +765,8 @@ mod tests { #[test] fn from_std_str_utf8error_works() { - let broken = b"Hello \xF0\x90\x80World"; - #[allow(unknown_lints)] - #[allow(invalid_from_utf8)] - let error: StdError = str::from_utf8(broken).unwrap_err().into(); + let broken = Vec::from(b"Hello \xF0\x90\x80World" as &[u8]); + let error: StdError = str::from_utf8(&broken).unwrap_err().into(); match error { StdError::InvalidUtf8 { msg, .. } => { assert_eq!(msg, "invalid utf-8 sequence of 3 bytes from index 6") diff --git a/packages/vm/src/modules/mod.rs b/packages/vm/src/modules/mod.rs index c871963e87..ec3804c914 100644 --- a/packages/vm/src/modules/mod.rs +++ b/packages/vm/src/modules/mod.rs @@ -5,7 +5,7 @@ mod pinned_memory_cache; mod versioning; pub use cached_module::CachedModule; -pub use file_system_cache::{FileSystemCache, NewFileSystemCacheError}; +pub use file_system_cache::FileSystemCache; pub use in_memory_cache::InMemoryCache; pub use pinned_memory_cache::PinnedMemoryCache; pub use versioning::current_wasmer_module_version; diff --git a/packages/vm/src/wasm_backend/mod.rs b/packages/vm/src/wasm_backend/mod.rs index 59707b8d2f..1b64e39398 100644 --- a/packages/vm/src/wasm_backend/mod.rs +++ b/packages/vm/src/wasm_backend/mod.rs @@ -5,4 +5,3 @@ mod limiting_tunables; pub use compile::compile; pub use engine::{make_compiling_engine, make_runtime_engine}; -pub use limiting_tunables::LimitingTunables; From e49d83422f743cc58057f13b6bc67766d1a09592 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Tue, 23 Jan 2024 10:53:54 +0100 Subject: [PATCH 1166/2372] Fix timings in comments --- packages/vm/src/environment.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index 0ceb71b66a..f62b1952f7 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -52,13 +52,13 @@ impl Default for GasConfig { // Target is 10^12 per second (see GAS.md), i.e. 10^6 gas per µ second. const GAS_PER_US: u64 = 1_000_000; Self { - // ~154 us in crypto benchmarks + // ~119 us in crypto benchmarks secp256k1_verify_cost: 119 * GAS_PER_US, - // ~162 us in crypto benchmarks + // ~233 us in crypto benchmarks secp256k1_recover_pubkey_cost: 233 * GAS_PER_US, - // ~525 us in crypto benchmarks + // ~374 us in crypto benchmarks secp256r1_verify_cost: 374 * GAS_PER_US, - // ~582 us in crypto benchmarks + // ~834 us in crypto benchmarks secp256r1_recover_pubkey_cost: 834 * GAS_PER_US, // ~63 us in crypto benchmarks ed25519_verify_cost: 63 * GAS_PER_US, From b48882c7d7f4d5462eaaebc81a0bf2806de779e2 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 23 Jan 2024 16:58:58 +0100 Subject: [PATCH 1167/2372] Bump serde-json-wasm and bnum --- Cargo.lock | 8 ++++---- contracts/burner/Cargo.lock | 8 ++++---- contracts/crypto-verify/Cargo.lock | 8 ++++---- contracts/cyberpunk/Cargo.lock | 8 ++++---- contracts/empty/Cargo.lock | 8 ++++---- contracts/hackatom/Cargo.lock | 8 ++++---- contracts/ibc-reflect-send/Cargo.lock | 8 ++++---- contracts/ibc-reflect/Cargo.lock | 8 ++++---- contracts/queue/Cargo.lock | 8 ++++---- contracts/reflect/Cargo.lock | 8 ++++---- contracts/staking/Cargo.lock | 8 ++++---- contracts/virus/Cargo.lock | 8 ++++---- packages/std/Cargo.toml | 4 ++-- 13 files changed, 50 insertions(+), 50 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 40c49a902f..9862d3f598 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -223,9 +223,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" +checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" [[package]] name = "bstr" @@ -1995,9 +1995,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" +checksum = "f05da0d153dd4595bdffd5099dc0e9ce425b205ee648eb93437ff7302af8c9a5" dependencies = [ "serde", ] diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 621ad68e43..f3c96d85fb 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -105,9 +105,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" +checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" [[package]] name = "bumpalo" @@ -1334,9 +1334,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" +checksum = "f05da0d153dd4595bdffd5099dc0e9ce425b205ee648eb93437ff7302af8c9a5" dependencies = [ "serde", ] diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 0c7133c55d..520a186bc1 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -105,9 +105,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" +checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" [[package]] name = "bumpalo" @@ -1367,9 +1367,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" +checksum = "f05da0d153dd4595bdffd5099dc0e9ce425b205ee648eb93437ff7302af8c9a5" dependencies = [ "serde", ] diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index c8ad6ebdab..06652c5718 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -134,9 +134,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" +checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" [[package]] name = "bumpalo" @@ -1458,9 +1458,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" +checksum = "f05da0d153dd4595bdffd5099dc0e9ce425b205ee648eb93437ff7302af8c9a5" dependencies = [ "serde", ] diff --git a/contracts/empty/Cargo.lock b/contracts/empty/Cargo.lock index 32ff767933..e2ef687ca6 100644 --- a/contracts/empty/Cargo.lock +++ b/contracts/empty/Cargo.lock @@ -105,9 +105,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" +checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" [[package]] name = "bumpalo" @@ -1333,9 +1333,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" +checksum = "f05da0d153dd4595bdffd5099dc0e9ce425b205ee648eb93437ff7302af8c9a5" dependencies = [ "serde", ] diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index a86d6169f5..02c30500ab 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -105,9 +105,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" +checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" [[package]] name = "bumpalo" @@ -1336,9 +1336,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" +checksum = "f05da0d153dd4595bdffd5099dc0e9ce425b205ee648eb93437ff7302af8c9a5" dependencies = [ "serde", ] diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index cbdb7a170c..1797bea8ae 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -105,9 +105,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" +checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" [[package]] name = "bumpalo" @@ -1334,9 +1334,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" +checksum = "f05da0d153dd4595bdffd5099dc0e9ce425b205ee648eb93437ff7302af8c9a5" dependencies = [ "serde", ] diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index e46281be18..d9f4d0cea7 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -105,9 +105,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" +checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" [[package]] name = "bumpalo" @@ -1334,9 +1334,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" +checksum = "f05da0d153dd4595bdffd5099dc0e9ce425b205ee648eb93437ff7302af8c9a5" dependencies = [ "serde", ] diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index bcdc28add7..831f473fcd 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -105,9 +105,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" +checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" [[package]] name = "bumpalo" @@ -1334,9 +1334,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" +checksum = "f05da0d153dd4595bdffd5099dc0e9ce425b205ee648eb93437ff7302af8c9a5" dependencies = [ "serde", ] diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 285bd4b624..3d9ba25124 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -105,9 +105,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" +checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" [[package]] name = "bumpalo" @@ -1335,9 +1335,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" +checksum = "f05da0d153dd4595bdffd5099dc0e9ce425b205ee648eb93437ff7302af8c9a5" dependencies = [ "serde", ] diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 5df3b1ba72..cbc36980f2 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -105,9 +105,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" +checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" [[package]] name = "bumpalo" @@ -1329,9 +1329,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" +checksum = "f05da0d153dd4595bdffd5099dc0e9ce425b205ee648eb93437ff7302af8c9a5" dependencies = [ "serde", ] diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index eb63192114..91c051fdbd 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -105,9 +105,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" +checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" [[package]] name = "bumpalo" @@ -1323,9 +1323,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" +checksum = "f05da0d153dd4595bdffd5099dc0e9ce425b205ee648eb93437ff7302af8c9a5" dependencies = [ "serde", ] diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index dd43a54f72..91a66ec2b0 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -59,9 +59,9 @@ hex = "0.4" schemars = "0.8.3" sha2 = "0.10.3" serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } -serde-json-wasm = { version = "1.0.0", default-features = false } +serde-json-wasm = { version = "1.0.1", default-features = false } thiserror = "1.0.26" -bnum = "0.8.0" +bnum = "0.10.0" static_assertions = "1.1.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] From d4023a489fc0dcf2462bacb107116313b984e9fc Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 23 Jan 2024 18:17:39 +0100 Subject: [PATCH 1168/2372] Upgrade CI image to node:20.11.0-bookworm --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 78ba6b30c3..9262050f73 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -809,7 +809,7 @@ jobs: fmt_extra: docker: - - image: node:16.3.0-buster + - image: node:20.11.0-bookworm steps: - checkout - run: From 8a836cf4e8ea74d8dfeb8e4d7e0991d275862013 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 24 Jan 2024 11:47:21 +0100 Subject: [PATCH 1169/2372] Use bytes for reading region from wasm memory --- packages/vm/src/memory.rs | 47 ++++++++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/packages/vm/src/memory.rs b/packages/vm/src/memory.rs index 5143de0bd4..3e2e6d6507 100644 --- a/packages/vm/src/memory.rs +++ b/packages/vm/src/memory.rs @@ -1,4 +1,4 @@ -use std::mem::MaybeUninit; +use std::mem::{size_of, MaybeUninit}; use wasmer::{ValueType, WasmPtr}; @@ -25,6 +25,35 @@ pub struct Region { /// The number of bytes used in this region pub length: u32, } +type RegionBytes = [u8; size_of::()]; + +impl Region { + fn from_wasm_bytes(bytes: RegionBytes) -> Self { + let offset = u32::from_le_bytes(bytes[0..4].try_into().unwrap()); + let capacity = u32::from_le_bytes(bytes[4..8].try_into().unwrap()); + let length = u32::from_le_bytes(bytes[8..12].try_into().unwrap()); + Region { + offset, + capacity, + length, + } + } + + fn into_wasm_bytes(self) -> RegionBytes { + let Region { + offset, + capacity, + length, + } = self; + + let mut bytes = [0u8; 12]; + // wasm is little endian + bytes[0..4].copy_from_slice(&offset.to_le_bytes()); + bytes[4..8].copy_from_slice(&capacity.to_le_bytes()); + bytes[8..12].copy_from_slice(&length.to_le_bytes()); + bytes + } +} unsafe impl ValueType for Region { fn zero_padding_bytes(&self, _bytes: &mut [MaybeUninit]) { @@ -91,10 +120,10 @@ pub fn write_region(memory: &wasmer::MemoryView, ptr: u32, data: &[u8]) -> VmRes /// Reads in a Region at offset in Wasm memory and returns a copy of it fn get_region(memory: &wasmer::MemoryView, offset: u32) -> CommunicationResult { - let wptr = WasmPtr::::new(offset); - let region = wptr.deref(memory).read().map_err(|_err| { + let wptr = WasmPtr::::new(offset); + let region = Region::from_wasm_bytes(wptr.deref(memory).read().map_err(|_err| { CommunicationError::deref_err(offset, "Could not dereference this pointer to a Region") - })?; + })?); validate_region(®ion)?; Ok(region) } @@ -122,10 +151,12 @@ fn validate_region(region: &Region) -> RegionValidationResult<()> { /// Overrides a Region at offset in Wasm memory fn set_region(memory: &wasmer::MemoryView, offset: u32, data: Region) -> CommunicationResult<()> { - let wptr = WasmPtr::::new(offset); - wptr.deref(memory).write(data).map_err(|_err| { - CommunicationError::deref_err(offset, "Could not dereference this pointer to a Region") - })?; + let wptr = WasmPtr::::new(offset); + wptr.deref(memory) + .write(data.into_wasm_bytes()) + .map_err(|_err| { + CommunicationError::deref_err(offset, "Could not dereference this pointer to a Region") + })?; Ok(()) } From da1e6b93e0a47f9a713a6338acd089b8cb922a5a Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 24 Jan 2024 13:08:22 +0100 Subject: [PATCH 1170/2372] Add doc to RegionBytes --- packages/vm/src/memory.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/vm/src/memory.rs b/packages/vm/src/memory.rs index 3e2e6d6507..5c9a9fa6ec 100644 --- a/packages/vm/src/memory.rs +++ b/packages/vm/src/memory.rs @@ -25,6 +25,8 @@ pub struct Region { /// The number of bytes used in this region pub length: u32, } + +/// Byte representation of a [Region] struct in Wasm memory. type RegionBytes = [u8; size_of::()]; impl Region { From 04e98c282b1ba9b584382f71f835ec8c899c96be Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 24 Jan 2024 13:15:30 +0100 Subject: [PATCH 1171/2372] Add big endian compiler error --- packages/vm/src/memory.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/vm/src/memory.rs b/packages/vm/src/memory.rs index 5c9a9fa6ec..e8e2a45b23 100644 --- a/packages/vm/src/memory.rs +++ b/packages/vm/src/memory.rs @@ -65,6 +65,14 @@ unsafe impl ValueType for Region { } } +// Wasm is little endian, and we want to be able to just reinterpret slices of +// wasm memory as a Region struct, so we only support little endian systems. +// If we ever need to support big endian systems, we can use more fine-grained checks +// in the places where we read/write the Region struct +// (and possibly other interactions between Wasm and host). +#[cfg(target_endian = "big")] +compile_error!("big endian systems are not supported"); + /// Expects a (fixed size) Region struct at ptr, which is read. This links to the /// memory region, which is copied in the second step. /// Errors if the length of the region exceeds `max_length`. From b9b80222aed8efe651230e54a78a6014940a4039 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 24 Jan 2024 13:58:51 +0100 Subject: [PATCH 1172/2372] Add changelog entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 123e53b878..8c83a60698 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -96,6 +96,8 @@ and this project adheres to - cosmwasm-vm: Upgrade Wasmer to 4.2.5; Bump `MODULE_SERIALIZATION_VERSION` to "v9". ([#1992]) - cosmwasm-std: Rename `GovMsg::vote` to `GovMsg::option` ([#1999]) +- cosmwasm-vm: Read `Region` from Wasm memory as bytes and convert to `Region` + afterwards ([#2005]) [#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874 [#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876 @@ -119,6 +121,7 @@ and this project adheres to [#1977]: https://github.com/CosmWasm/cosmwasm/pull/1977 [#1992]: https://github.com/CosmWasm/cosmwasm/pull/1992 [#1999]: https://github.com/CosmWasm/cosmwasm/pull/1999 +[#2005]: https://github.com/CosmWasm/cosmwasm/pull/2005 ### Removed From e68dd99fba0ffc902b45de42870a41fc60111927 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 24 Jan 2024 20:49:45 +0100 Subject: [PATCH 1173/2372] Avoid unnecessary error handling in from_wasm_bytes --- packages/vm/src/memory.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/vm/src/memory.rs b/packages/vm/src/memory.rs index e8e2a45b23..5870b23711 100644 --- a/packages/vm/src/memory.rs +++ b/packages/vm/src/memory.rs @@ -31,9 +31,9 @@ type RegionBytes = [u8; size_of::()]; impl Region { fn from_wasm_bytes(bytes: RegionBytes) -> Self { - let offset = u32::from_le_bytes(bytes[0..4].try_into().unwrap()); - let capacity = u32::from_le_bytes(bytes[4..8].try_into().unwrap()); - let length = u32::from_le_bytes(bytes[8..12].try_into().unwrap()); + let offset = u32::from_le_bytes([bytes[0], bytes[1], bytes[2], bytes[3]]); + let capacity = u32::from_le_bytes([bytes[4], bytes[5], bytes[6], bytes[7]]); + let length = u32::from_le_bytes([bytes[8], bytes[9], bytes[10], bytes[11]]); Region { offset, capacity, From 8e4cf060796582da2242851f23f9a21bc69057f3 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 24 Jan 2024 22:36:20 +0100 Subject: [PATCH 1174/2372] Add test vectors from Project Wycheproof --- Cargo.lock | 20 + packages/crypto/Cargo.toml | 1 + packages/crypto/testdata/wycheproof/README.md | 21 + .../ecdsa_secp256r1_sha256_test.json | 6502 +++++++++++++++ .../ecdsa_secp256r1_sha3_256_test.json | 6582 +++++++++++++++ .../ecdsa_secp256r1_sha3_512_test.json | 7246 +++++++++++++++++ .../ecdsa_secp256r1_sha512_test.json | 7206 ++++++++++++++++ packages/crypto/tests/wycheproof_secp256r1.rs | 394 + 8 files changed, 27972 insertions(+) create mode 100644 packages/crypto/testdata/wycheproof/README.md create mode 100644 packages/crypto/testdata/wycheproof/ecdsa_secp256r1_sha256_test.json create mode 100644 packages/crypto/testdata/wycheproof/ecdsa_secp256r1_sha3_256_test.json create mode 100644 packages/crypto/testdata/wycheproof/ecdsa_secp256r1_sha3_512_test.json create mode 100644 packages/crypto/testdata/wycheproof/ecdsa_secp256r1_sha512_test.json create mode 100644 packages/crypto/tests/wycheproof_secp256r1.rs diff --git a/Cargo.lock b/Cargo.lock index 2e33ce2f9e..75bea72e57 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -434,6 +434,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.6", + "sha3", "thiserror", ] @@ -1342,6 +1343,15 @@ dependencies = [ "signature", ] +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -2103,6 +2113,16 @@ dependencies = [ "digest 0.10.6", ] +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.6", + "keccak", +] + [[package]] name = "shared-buffer" version = "0.1.4" diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 9569dd9dff..035c3cbbbe 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -29,6 +29,7 @@ criterion = "0.5.1" serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } serde_json = "1.0.40" sha2 = "0.10" +sha3 = "0.10" hex = "0.4" hex-literal = "0.3.1" english-numbers = "0.3" diff --git a/packages/crypto/testdata/wycheproof/README.md b/packages/crypto/testdata/wycheproof/README.md new file mode 100644 index 0000000000..077ea37b8b --- /dev/null +++ b/packages/crypto/testdata/wycheproof/README.md @@ -0,0 +1,21 @@ +# Wycheproof test data + +This folder contains test vectors from +[Project Wycheproof](https://github.com/google/wycheproof) to increase the test +coverage of signature verification implementations. + +This test data is used by integration tests in `test/wycheproof_*.rs`. + +## Update + +To ensure integrety if the files and update them to the latest version, run this +from the repo root: + +```sh +(cd packages/crypto/testdata/wycheproof \ + && curl -sSL https://github.com/google/wycheproof/raw/master/testvectors_v1/ecdsa_secp256r1_sha256_test.json > ecdsa_secp256r1_sha256_test.json \ + && curl -sSL https://github.com/google/wycheproof/raw/master/testvectors_v1/ecdsa_secp256r1_sha512_test.json > ecdsa_secp256r1_sha512_test.json \ + && curl -sSL https://github.com/google/wycheproof/raw/master/testvectors_v1/ecdsa_secp256r1_sha3_256_test.json > ecdsa_secp256r1_sha3_256_test.json \ + && curl -sSL https://github.com/google/wycheproof/raw/master/testvectors_v1/ecdsa_secp256r1_sha3_512_test.json > ecdsa_secp256r1_sha3_512_test.json \ + ) +``` diff --git a/packages/crypto/testdata/wycheproof/ecdsa_secp256r1_sha256_test.json b/packages/crypto/testdata/wycheproof/ecdsa_secp256r1_sha256_test.json new file mode 100644 index 0000000000..684042f6f4 --- /dev/null +++ b/packages/crypto/testdata/wycheproof/ecdsa_secp256r1_sha256_test.json @@ -0,0 +1,6502 @@ +{ + "algorithm" : "ECDSA", + "schema" : "ecdsa_verify_schema.json", + "generatorVersion" : "0.9rc5", + "numberOfTests" : 471, + "header" : [ + "Test vectors of type EcdsaVerify are meant for the verification", + "of ASN encoded ECDSA signatures." + ], + "notes" : { + "ArithmeticError" : { + "bugType" : "EDGE_CASE", + "description" : "Some implementations of ECDSA have arithmetic errors that occur when intermediate results have extreme values. This test vector has been constructed to test such occurences.", + "cves" : [ + "CVE-2017-18146" + ] + }, + "BerEncodedSignature" : { + "bugType" : "BER_ENCODING", + "description" : "ECDSA signatures are usually DER encoded. This signature contains valid values for r and s, but it uses alternative BER encoding.", + "effect" : "Accepting alternative BER encodings may be benign in some cases, or be an issue if protocol requires signature malleability.", + "cves" : [ + "CVE-2020-14966", + "CVE-2020-13822", + "CVE-2019-14859", + "CVE-2016-1000342" + ] + }, + "EdgeCasePublicKey" : { + "bugType" : "EDGE_CASE", + "description" : "The test vector uses a special case public key. " + }, + "EdgeCaseShamirMultiplication" : { + "bugType" : "EDGE_CASE", + "description" : "Shamir proposed a fast method for computing the sum of two scalar multiplications efficiently. This test vector has been constructed so that an intermediate result is the point at infinity if Shamir's method is used." + }, + "IntegerOverflow" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an r and s that has been modified, so that the original value is restored if the implementation ignores the most significant bits.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "InvalidEncoding" : { + "bugType" : "CAN_OF_WORMS", + "description" : "ECDSA signatures are encoded using ASN.1. This test vector contains an incorrectly encoded signature. The test vector itself was generated from a valid signature by modifying its encoding.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "InvalidSignature" : { + "bugType" : "AUTH_BYPASS", + "description" : "The signature contains special case values such as r=0 and s=0. Buggy implementations may accept such values, if the implementation does not check boundaries and computes s^(-1) == 0.", + "effect" : "Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.", + "cves" : [ + "CVE-2022-21449", + "CVE-2021-43572", + "CVE-2022-24884" + ] + }, + "InvalidTypesInSignature" : { + "bugType" : "AUTH_BYPASS", + "description" : "The signature contains invalid types. Dynamic typed languages sometime coerce such values of different types into integers. If an implementation is careless and has additional bugs, such as not checking integer boundaries then it may be possible that such signatures are accepted.", + "effect" : "Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.", + "cves" : [ + "CVE-2022-21449" + ] + }, + "MissingZero" : { + "bugType" : "LEGACY", + "description" : "Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.", + "effect" : "While signatures are more malleable if such signatures are accepted, this typically leads to no vulnerability, since a badly encoded signature can be reencoded correctly." + }, + "ModifiedInteger" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an r and s that has been modified. The goal is to check for arithmetic errors.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "ModifiedSignature" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an invalid signature that was generated from a valid signature by modifying it.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "ModularInverse" : { + "bugType" : "EDGE_CASE", + "description" : "The test vectors contains a signature where computing the modular inverse of s hits an edge case.", + "effect" : "While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.", + "cves" : [ + "CVE-2019-0865" + ] + }, + "PointDuplication" : { + "bugType" : "EDGE_CASE", + "description" : "Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission.", + "cves" : [ + "2020-12607", + "CVE-2015-2730" + ] + }, + "RangeCheck" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an r and s that has been modified. By adding or subtracting the order of the group (or other values) the test vector checks whether signature verification verifies the range of r and s.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "SmallRandS" : { + "bugType" : "EDGE_CASE", + "description" : "The test vectors contains a signature where both r and s are small integers. Some libraries cannot verify such signatures.", + "effect" : "While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.", + "cves" : [ + "2020-13895" + ] + }, + "SpecialCaseHash" : { + "bugType" : "EDGE_CASE", + "description" : "The test vector contains a signature where the hash of the message is a special case, e.g., contains a long run of 0 or 1 bits." + }, + "ValidSignature" : { + "bugType" : "BASIC", + "description" : "The test vector contains a valid signature that was generated pseudorandomly. Such signatures should not fail to verify unless some of the parameters (e.g. curve or hash function) are not supported." + } + }, + "testGroups" : [ + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0404aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad587d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d", + "wx" : "04aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad5", + "wy" : "0087d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000404aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad587d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEBKrsc2NXJvIT+4qeZNo7hjLkFJWp\nRNAEW1IuunJA+tWH2TFXmKqjpboBd1eHztBeqve04J/IHW0apUboNl1SXQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 1, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "", + "sig" : "3045022100b292a619339f6e567a305c951c0dcbcc42d16e47f219f9e98e76e09d8770b34a02200177e60492c5a8242f76f07bfe3661bde59ec2a17ce5bd2dab2abebdf89a62e2", + "result" : "valid" + }, + { + "tcId" : 2, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "4d7367", + "sig" : "30450220530bd6b0c9af2d69ba897f6b5fb59695cfbf33afe66dbadcf5b8d2a2a6538e23022100d85e489cb7a161fd55ededcedbf4cc0c0987e3e3f0f242cae934c72caa3f43e9", + "result" : "valid" + }, + { + "tcId" : 3, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100a8ea150cb80125d7381c4c1f1da8e9de2711f9917060406a73d7904519e51388022100f3ab9fa68bd47973a73b2d40480c2ba50c22c9d76ec217257288293285449b86", + "result" : "valid" + }, + { + "tcId" : 4, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "0000000000000000000000000000000000000000", + "sig" : "3045022100986e65933ef2ed4ee5aada139f52b70539aaf63f00a91f29c69178490d57fb7102203dafedfb8da6189d372308cbf1489bbbdabf0c0217d1c0ff0f701aaa7a694b9c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", + "wx" : "2927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838", + "wy" : "00c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKSexBRK64+3c/kZ4KBKLrSkDJpkZ\n9whgacjE32xzKDjHeHlk6qwA5ZIfsUmKYPRgZ2az2WhQAVWNGpdOc0FRPg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 5, + "comment" : "signature malleability", + "flags" : [ + "ValidSignature" + ], + "msg" : "313233343030", + "sig" : "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802204cd60b855d442f5b3c7b11eb6c4e0ae7525fe710fab9aa7c77a67f79e6fadd76", + "result" : "valid" + }, + { + "tcId" : 6, + "comment" : "Legacy: ASN encoding of s misses leading 0", + "flags" : [ + "MissingZero" + ], + "msg" : "313233343030", + "sig" : "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180220b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 7, + "comment" : "valid", + "flags" : [ + "ValidSignature" + ], + "msg" : "313233343030", + "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "valid" + }, + { + "tcId" : 8, + "comment" : "length of sequence [r, s] uses long form encoding", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "30814502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 9, + "comment" : "length of sequence [r, s] contains a leading 0", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "3082004502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 10, + "comment" : "length of sequence [r, s] uses 70 instead of 69", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304602202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 11, + "comment" : "length of sequence [r, s] uses 68 instead of 69", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 12, + "comment" : "uint32 overflow in length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3085010000004502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 13, + "comment" : "uint64 overflow in length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308901000000000000004502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 14, + "comment" : "length of sequence [r, s] = 2**31 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30847fffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 15, + "comment" : "length of sequence [r, s] = 2**31", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30848000000002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 16, + "comment" : "length of sequence [r, s] = 2**32 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3084ffffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 17, + "comment" : "length of sequence [r, s] = 2**40 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3085ffffffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 18, + "comment" : "length of sequence [r, s] = 2**64 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3088ffffffffffffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 19, + "comment" : "incorrect length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30ff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 20, + "comment" : "replaced sequence [r, s] by an indefinite length tag without termination", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 21, + "comment" : "removing sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "", + "result" : "invalid" + }, + { + "tcId" : 22, + "comment" : "lonely sequence tag", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30", + "result" : "invalid" + }, + { + "tcId" : 23, + "comment" : "appending 0's to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000", + "result" : "invalid" + }, + { + "tcId" : 24, + "comment" : "prepending 0's to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047000002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 25, + "comment" : "appending unused 0's to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000", + "result" : "invalid" + }, + { + "tcId" : 26, + "comment" : "appending null value to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0500", + "result" : "invalid" + }, + { + "tcId" : 27, + "comment" : "prepending garbage to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a498177304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 28, + "comment" : "prepending garbage to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30492500304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 29, + "comment" : "appending garbage to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3047304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0004deadbeef", + "result" : "invalid" + }, + { + "tcId" : 30, + "comment" : "including undefined tags", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304daa00bb00cd00304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 31, + "comment" : "including undefined tags", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d2228aa00bb00cd0002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 32, + "comment" : "including undefined tags", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182229aa00bb00cd00022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 33, + "comment" : "truncated length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3081", + "result" : "invalid" + }, + { + "tcId" : 34, + "comment" : "including undefined tags to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304baa02aabb304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 35, + "comment" : "using composition with indefinite length for sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3080304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000", + "result" : "invalid" + }, + { + "tcId" : 36, + "comment" : "using composition with wrong tag for sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3080314502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000", + "result" : "invalid" + }, + { + "tcId" : 37, + "comment" : "Replacing sequence [r, s] with NULL", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "0500", + "result" : "invalid" + }, + { + "tcId" : 38, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "2e4502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 39, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "2f4502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 40, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "314502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 41, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "324502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 42, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "ff4502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 43, + "comment" : "dropping value of sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3000", + "result" : "invalid" + }, + { + "tcId" : 44, + "comment" : "using composition for sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30493001023044202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 45, + "comment" : "truncated sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847", + "result" : "invalid" + }, + { + "tcId" : 46, + "comment" : "truncated sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3044202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 47, + "comment" : "sequence [r, s] of size 4166 to check for overflows", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3082104602202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 48, + "comment" : "indefinite length", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000", + "result" : "invalid" + }, + { + "tcId" : 49, + "comment" : "indefinite length with truncated delimiter", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db00", + "result" : "invalid" + }, + { + "tcId" : 50, + "comment" : "indefinite length with additional element", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db05000000", + "result" : "invalid" + }, + { + "tcId" : 51, + "comment" : "indefinite length with truncated element", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db060811220000", + "result" : "invalid" + }, + { + "tcId" : 52, + "comment" : "indefinite length with garbage", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000fe02beef", + "result" : "invalid" + }, + { + "tcId" : 53, + "comment" : "indefinite length with nonempty EOC", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0002beef", + "result" : "invalid" + }, + { + "tcId" : 54, + "comment" : "prepend empty sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047300002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 55, + "comment" : "append empty sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db3000", + "result" : "invalid" + }, + { + "tcId" : 56, + "comment" : "append zero", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304802202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db020100", + "result" : "invalid" + }, + { + "tcId" : 57, + "comment" : "append garbage with high tag number", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304802202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847dbbf7f00", + "result" : "invalid" + }, + { + "tcId" : 58, + "comment" : "append null with explicit tag", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847dba0020500", + "result" : "invalid" + }, + { + "tcId" : 59, + "comment" : "append null with implicit tag", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847dba000", + "result" : "invalid" + }, + { + "tcId" : 60, + "comment" : "sequence of sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 61, + "comment" : "truncated sequence: removed last 1 elements", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "302202202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18", + "result" : "invalid" + }, + { + "tcId" : 62, + "comment" : "repeating element in sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "306802202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 63, + "comment" : "flipped bit 0 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30432ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e19022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 64, + "comment" : "flipped bit 32 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30432ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af8bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 65, + "comment" : "flipped bit 48 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30432ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cd6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 66, + "comment" : "flipped bit 64 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30432ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee858b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 67, + "comment" : "length of r uses long form encoding", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "30460281202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 68, + "comment" : "length of r contains a leading 0", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "3047028200202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 69, + "comment" : "length of r uses 33 instead of 32", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502212ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 70, + "comment" : "length of r uses 31 instead of 32", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045021f2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 71, + "comment" : "uint32 overflow in length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a028501000000202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 72, + "comment" : "uint64 overflow in length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304e02890100000000000000202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 73, + "comment" : "length of r = 2**31 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902847fffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 74, + "comment" : "length of r = 2**31", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30490284800000002ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 75, + "comment" : "length of r = 2**32 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30490284ffffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 76, + "comment" : "length of r = 2**40 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a0285ffffffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 77, + "comment" : "length of r = 2**64 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d0288ffffffffffffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 78, + "comment" : "incorrect length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502ff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 79, + "comment" : "replaced r by an indefinite length tag without termination", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502802ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 80, + "comment" : "removing r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3023022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 81, + "comment" : "lonely integer tag", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "302402022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 82, + "comment" : "lonely integer tag", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "302302202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802", + "result" : "invalid" + }, + { + "tcId" : 83, + "comment" : "appending 0's to r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702222ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 84, + "comment" : "prepending 0's to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3047022200002ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 85, + "comment" : "appending unused 0's to r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 86, + "comment" : "appending null value to r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702222ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180500022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 87, + "comment" : "prepending garbage to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a222549817702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 88, + "comment" : "prepending garbage to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30492224250002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 89, + "comment" : "appending garbage to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d222202202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180004deadbeef022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 90, + "comment" : "truncated length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30250281022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 91, + "comment" : "including undefined tags to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304b2226aa02aabb02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 92, + "comment" : "using composition with indefinite length for r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049228002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 93, + "comment" : "using composition with wrong tag for r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049228003202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 94, + "comment" : "Replacing r with NULL", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30250500022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 95, + "comment" : "changing tag value of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304500202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 96, + "comment" : "changing tag value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304501202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 97, + "comment" : "changing tag value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304503202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 98, + "comment" : "changing tag value of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304504202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 99, + "comment" : "changing tag value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045ff202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 100, + "comment" : "dropping value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30250200022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 101, + "comment" : "using composition for r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049222402012b021fa3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 102, + "comment" : "modifying first byte of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3045022029a3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 103, + "comment" : "modifying last byte of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e98022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 104, + "comment" : "truncated r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3044021f2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 105, + "comment" : "truncated r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3044021fa3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 106, + "comment" : "r of size 4129 to check for overflows", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30821048028210212ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 107, + "comment" : "leading ff in r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30460221ff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 108, + "comment" : "replaced r by infinity", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3026090180022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 109, + "comment" : "replacing r with zero", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 110, + "comment" : "flipped bit 0 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304302202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1800b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847da", + "result" : "invalid" + }, + { + "tcId" : 111, + "comment" : "flipped bit 32 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304302202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1800b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b48156847db", + "result" : "invalid" + }, + { + "tcId" : 112, + "comment" : "flipped bit 48 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304302202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1800b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c124b49156847db", + "result" : "invalid" + }, + { + "tcId" : 113, + "comment" : "flipped bit 64 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304302202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1800b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4097c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 114, + "comment" : "length of s uses long form encoding", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "304602202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802812100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 115, + "comment" : "length of s contains a leading 0", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180282002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 116, + "comment" : "length of s uses 34 instead of 33", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022200b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 117, + "comment" : "length of s uses 32 instead of 33", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 118, + "comment" : "uint32 overflow in length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180285010000002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 119, + "comment" : "uint64 overflow in length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304e02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18028901000000000000002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 120, + "comment" : "length of s = 2**31 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802847fffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 121, + "comment" : "length of s = 2**31", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802848000000000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 122, + "comment" : "length of s = 2**32 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180284ffffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 123, + "comment" : "length of s = 2**40 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180285ffffffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 124, + "comment" : "length of s = 2**64 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180288ffffffffffffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 125, + "comment" : "incorrect length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802ff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 126, + "comment" : "replaced s by an indefinite length tag without termination", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18028000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 127, + "comment" : "appending 0's to s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022300b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000", + "result" : "invalid" + }, + { + "tcId" : 128, + "comment" : "prepending 0's to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180223000000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 129, + "comment" : "appending null value to s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022300b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0500", + "result" : "invalid" + }, + { + "tcId" : 130, + "comment" : "prepending garbage to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182226498177022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 131, + "comment" : "prepending garbage to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1822252500022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 132, + "comment" : "appending garbage to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182223022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0004deadbeef", + "result" : "invalid" + }, + { + "tcId" : 133, + "comment" : "truncated length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "302402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180281", + "result" : "invalid" + }, + { + "tcId" : 134, + "comment" : "including undefined tags to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304b02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182227aa02aabb022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 135, + "comment" : "using composition with indefinite length for s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182280022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000", + "result" : "invalid" + }, + { + "tcId" : 136, + "comment" : "using composition with wrong tag for s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182280032100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000", + "result" : "invalid" + }, + { + "tcId" : 137, + "comment" : "Replacing s with NULL", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "302402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180500", + "result" : "invalid" + }, + { + "tcId" : 138, + "comment" : "changing tag value of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 139, + "comment" : "changing tag value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18012100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 140, + "comment" : "changing tag value of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18032100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 141, + "comment" : "changing tag value of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18042100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 142, + "comment" : "changing tag value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18ff2100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 143, + "comment" : "dropping value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "302402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180200", + "result" : "invalid" + }, + { + "tcId" : 144, + "comment" : "using composition for s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1822250201000220b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 145, + "comment" : "modifying first byte of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022102b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 146, + "comment" : "modifying last byte of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b491568475b", + "result" : "invalid" + }, + { + "tcId" : 147, + "comment" : "truncated s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847", + "result" : "invalid" + }, + { + "tcId" : 148, + "comment" : "s of size 4130 to check for overflows", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3082104802202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180282102200b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 149, + "comment" : "leading ff in s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304602202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180222ff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 150, + "comment" : "replaced s by infinity", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "302502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18090180", + "result" : "invalid" + }, + { + "tcId" : 151, + "comment" : "replacing s with zero", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "302502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18020100", + "result" : "invalid" + }, + { + "tcId" : 152, + "comment" : "replaced r by r + n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "30460221012ba3a8bd6b94d5ed80a6d9d1190a436ebccc0833490686deac8635bcb9bf5369022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 153, + "comment" : "replaced r by r - n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "30460221ff2ba3a8bf6b94d5eb80a6d9d1190a436f42fe12d7fad749d4c512a036c0f908c7022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 154, + "comment" : "replaced r by r + 256 * n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "3047022201002ba3a7be6b94d6ec80a6d9d1190a432be6dfbb2cb98d6d4d72972df620817f18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 155, + "comment" : "replaced r by -r", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30450220d45c5741946b2a137f59262ee6f5bc91001af27a5e1117a64733950642a3d1e8022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 156, + "comment" : "replaced r by n - r", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "3046022100d45c5740946b2a147f59262ee6f5bc90bd01ed280528b62b3aed5fc93f06f739022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 157, + "comment" : "replaced r by -n - r", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30460221fed45c5742946b2a127f59262ee6f5bc914333f7ccb6f979215379ca434640ac97022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 158, + "comment" : "replaced r by r + 2**256", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "30460221012ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 159, + "comment" : "replaced r by r + 2**320", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "304e02290100000000000000002ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 160, + "comment" : "replaced s by s + n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "3046022101b329f478a2bbd0a6c384ee1493b1f518276e0e4a5375928d6fcd160c11cb6d2c022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 161, + "comment" : "replaced s by s - n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "30450220b329f47aa2bbd0a4c384ee1493b1f518ada018ef05465583885980861905228a022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 162, + "comment" : "replaced s by s + 256 * n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "304702220100b329f379a2bbd1a5c384ee1493b1f4d55181c143c3fc78fc35de0e45788d98db022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 163, + "comment" : "replaced s by -s", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30460221ff4cd60b865d442f5a3c7b11eb6c4e0ae79578ec6353a20bf783ecb4b6ea97b825022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 164, + "comment" : "replaced s by -n - s", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30460221fe4cd60b875d442f593c7b11eb6c4e0ae7d891f1b5ac8a6d729032e9f3ee3492d4022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 165, + "comment" : "replaced s by s + 2**256", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "3046022101b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 166, + "comment" : "replaced s by s - 2**256", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "30450220b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 167, + "comment" : "replaced s by s + 2**320", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "304e0229010000000000000000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + "result" : "invalid" + }, + { + "tcId" : 168, + "comment" : "Signature with special case values r=0 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100020100", + "result" : "invalid" + }, + { + "tcId" : 169, + "comment" : "Signature with special case values r=0 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100020101", + "result" : "invalid" + }, + { + "tcId" : 170, + "comment" : "Signature with special case values r=0 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201000201ff", + "result" : "invalid" + }, + { + "tcId" : 171, + "comment" : "Signature with special case values r=0 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 172, + "comment" : "Signature with special case values r=0 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 173, + "comment" : "Signature with special case values r=0 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 174, + "comment" : "Signature with special case values r=0 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 175, + "comment" : "Signature with special case values r=0 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 176, + "comment" : "Signature with special case values r=1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101020100", + "result" : "invalid" + }, + { + "tcId" : 177, + "comment" : "Signature with special case values r=1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101020101", + "result" : "invalid" + }, + { + "tcId" : 178, + "comment" : "Signature with special case values r=1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201010201ff", + "result" : "invalid" + }, + { + "tcId" : 179, + "comment" : "Signature with special case values r=1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 180, + "comment" : "Signature with special case values r=1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 181, + "comment" : "Signature with special case values r=1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 182, + "comment" : "Signature with special case values r=1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 183, + "comment" : "Signature with special case values r=1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 184, + "comment" : "Signature with special case values r=-1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff020100", + "result" : "invalid" + }, + { + "tcId" : 185, + "comment" : "Signature with special case values r=-1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff020101", + "result" : "invalid" + }, + { + "tcId" : 186, + "comment" : "Signature with special case values r=-1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff0201ff", + "result" : "invalid" + }, + { + "tcId" : 187, + "comment" : "Signature with special case values r=-1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 188, + "comment" : "Signature with special case values r=-1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 189, + "comment" : "Signature with special case values r=-1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 190, + "comment" : "Signature with special case values r=-1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 191, + "comment" : "Signature with special case values r=-1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 192, + "comment" : "Signature with special case values r=n and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020100", + "result" : "invalid" + }, + { + "tcId" : 193, + "comment" : "Signature with special case values r=n and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101", + "result" : "invalid" + }, + { + "tcId" : 194, + "comment" : "Signature with special case values r=n and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510201ff", + "result" : "invalid" + }, + { + "tcId" : 195, + "comment" : "Signature with special case values r=n and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 196, + "comment" : "Signature with special case values r=n and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 197, + "comment" : "Signature with special case values r=n and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 198, + "comment" : "Signature with special case values r=n and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 199, + "comment" : "Signature with special case values r=n and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 200, + "comment" : "Signature with special case values r=n - 1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550020100", + "result" : "invalid" + }, + { + "tcId" : 201, + "comment" : "Signature with special case values r=n - 1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550020101", + "result" : "invalid" + }, + { + "tcId" : 202, + "comment" : "Signature with special case values r=n - 1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325500201ff", + "result" : "invalid" + }, + { + "tcId" : 203, + "comment" : "Signature with special case values r=n - 1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 204, + "comment" : "Signature with special case values r=n - 1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 205, + "comment" : "Signature with special case values r=n - 1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 206, + "comment" : "Signature with special case values r=n - 1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 207, + "comment" : "Signature with special case values r=n - 1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 208, + "comment" : "Signature with special case values r=n + 1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552020100", + "result" : "invalid" + }, + { + "tcId" : 209, + "comment" : "Signature with special case values r=n + 1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552020101", + "result" : "invalid" + }, + { + "tcId" : 210, + "comment" : "Signature with special case values r=n + 1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325520201ff", + "result" : "invalid" + }, + { + "tcId" : 211, + "comment" : "Signature with special case values r=n + 1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 212, + "comment" : "Signature with special case values r=n + 1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 213, + "comment" : "Signature with special case values r=n + 1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 214, + "comment" : "Signature with special case values r=n + 1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 215, + "comment" : "Signature with special case values r=n + 1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 216, + "comment" : "Signature with special case values r=p and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff020100", + "result" : "invalid" + }, + { + "tcId" : 217, + "comment" : "Signature with special case values r=p and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff020101", + "result" : "invalid" + }, + { + "tcId" : 218, + "comment" : "Signature with special case values r=p and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0201ff", + "result" : "invalid" + }, + { + "tcId" : 219, + "comment" : "Signature with special case values r=p and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 220, + "comment" : "Signature with special case values r=p and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 221, + "comment" : "Signature with special case values r=p and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 222, + "comment" : "Signature with special case values r=p and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 223, + "comment" : "Signature with special case values r=p and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 224, + "comment" : "Signature with special case values r=p + 1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000001000000000000000000000000020100", + "result" : "invalid" + }, + { + "tcId" : 225, + "comment" : "Signature with special case values r=p + 1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000001000000000000000000000000020101", + "result" : "invalid" + }, + { + "tcId" : 226, + "comment" : "Signature with special case values r=p + 1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff000000010000000000000000000000010000000000000000000000000201ff", + "result" : "invalid" + }, + { + "tcId" : 227, + "comment" : "Signature with special case values r=p + 1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 228, + "comment" : "Signature with special case values r=p + 1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 229, + "comment" : "Signature with special case values r=p + 1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 230, + "comment" : "Signature with special case values r=p + 1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 231, + "comment" : "Signature with special case values r=p + 1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 232, + "comment" : "Signature encoding contains incorrect types: r=0, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3008020100090380fe01", + "result" : "invalid" + }, + { + "tcId" : 233, + "comment" : "Signature encoding contains incorrect types: r=0, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100090142", + "result" : "invalid" + }, + { + "tcId" : 234, + "comment" : "Signature encoding contains incorrect types: r=0, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100010101", + "result" : "invalid" + }, + { + "tcId" : 235, + "comment" : "Signature encoding contains incorrect types: r=0, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100010100", + "result" : "invalid" + }, + { + "tcId" : 236, + "comment" : "Signature encoding contains incorrect types: r=0, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201000500", + "result" : "invalid" + }, + { + "tcId" : 237, + "comment" : "Signature encoding contains incorrect types: r=0, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201000c00", + "result" : "invalid" + }, + { + "tcId" : 238, + "comment" : "Signature encoding contains incorrect types: r=0, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201000c0130", + "result" : "invalid" + }, + { + "tcId" : 239, + "comment" : "Signature encoding contains incorrect types: r=0, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201003000", + "result" : "invalid" + }, + { + "tcId" : 240, + "comment" : "Signature encoding contains incorrect types: r=0, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201003003020100", + "result" : "invalid" + }, + { + "tcId" : 241, + "comment" : "Signature encoding contains incorrect types: r=1, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3008020101090380fe01", + "result" : "invalid" + }, + { + "tcId" : 242, + "comment" : "Signature encoding contains incorrect types: r=1, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101090142", + "result" : "invalid" + }, + { + "tcId" : 243, + "comment" : "Signature encoding contains incorrect types: r=1, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101010101", + "result" : "invalid" + }, + { + "tcId" : 244, + "comment" : "Signature encoding contains incorrect types: r=1, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101010100", + "result" : "invalid" + }, + { + "tcId" : 245, + "comment" : "Signature encoding contains incorrect types: r=1, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201010500", + "result" : "invalid" + }, + { + "tcId" : 246, + "comment" : "Signature encoding contains incorrect types: r=1, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201010c00", + "result" : "invalid" + }, + { + "tcId" : 247, + "comment" : "Signature encoding contains incorrect types: r=1, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201010c0130", + "result" : "invalid" + }, + { + "tcId" : 248, + "comment" : "Signature encoding contains incorrect types: r=1, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201013000", + "result" : "invalid" + }, + { + "tcId" : 249, + "comment" : "Signature encoding contains incorrect types: r=1, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201013003020100", + "result" : "invalid" + }, + { + "tcId" : 250, + "comment" : "Signature encoding contains incorrect types: r=-1, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201ff090380fe01", + "result" : "invalid" + }, + { + "tcId" : 251, + "comment" : "Signature encoding contains incorrect types: r=-1, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff090142", + "result" : "invalid" + }, + { + "tcId" : 252, + "comment" : "Signature encoding contains incorrect types: r=-1, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff010101", + "result" : "invalid" + }, + { + "tcId" : 253, + "comment" : "Signature encoding contains incorrect types: r=-1, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff010100", + "result" : "invalid" + }, + { + "tcId" : 254, + "comment" : "Signature encoding contains incorrect types: r=-1, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201ff0500", + "result" : "invalid" + }, + { + "tcId" : 255, + "comment" : "Signature encoding contains incorrect types: r=-1, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201ff0c00", + "result" : "invalid" + }, + { + "tcId" : 256, + "comment" : "Signature encoding contains incorrect types: r=-1, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff0c0130", + "result" : "invalid" + }, + { + "tcId" : 257, + "comment" : "Signature encoding contains incorrect types: r=-1, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201ff3000", + "result" : "invalid" + }, + { + "tcId" : 258, + "comment" : "Signature encoding contains incorrect types: r=-1, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201ff3003020100", + "result" : "invalid" + }, + { + "tcId" : 259, + "comment" : "Signature encoding contains incorrect types: r=n, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551090380fe01", + "result" : "invalid" + }, + { + "tcId" : 260, + "comment" : "Signature encoding contains incorrect types: r=n, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551090142", + "result" : "invalid" + }, + { + "tcId" : 261, + "comment" : "Signature encoding contains incorrect types: r=n, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551010101", + "result" : "invalid" + }, + { + "tcId" : 262, + "comment" : "Signature encoding contains incorrect types: r=n, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551010100", + "result" : "invalid" + }, + { + "tcId" : 263, + "comment" : "Signature encoding contains incorrect types: r=n, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510500", + "result" : "invalid" + }, + { + "tcId" : 264, + "comment" : "Signature encoding contains incorrect types: r=n, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510c00", + "result" : "invalid" + }, + { + "tcId" : 265, + "comment" : "Signature encoding contains incorrect types: r=n, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510c0130", + "result" : "invalid" + }, + { + "tcId" : 266, + "comment" : "Signature encoding contains incorrect types: r=n, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325513000", + "result" : "invalid" + }, + { + "tcId" : 267, + "comment" : "Signature encoding contains incorrect types: r=n, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325513003020100", + "result" : "invalid" + }, + { + "tcId" : 268, + "comment" : "Signature encoding contains incorrect types: r=p, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff090380fe01", + "result" : "invalid" + }, + { + "tcId" : 269, + "comment" : "Signature encoding contains incorrect types: r=p, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff090142", + "result" : "invalid" + }, + { + "tcId" : 270, + "comment" : "Signature encoding contains incorrect types: r=p, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff010101", + "result" : "invalid" + }, + { + "tcId" : 271, + "comment" : "Signature encoding contains incorrect types: r=p, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff010100", + "result" : "invalid" + }, + { + "tcId" : 272, + "comment" : "Signature encoding contains incorrect types: r=p, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0500", + "result" : "invalid" + }, + { + "tcId" : 273, + "comment" : "Signature encoding contains incorrect types: r=p, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0c00", + "result" : "invalid" + }, + { + "tcId" : 274, + "comment" : "Signature encoding contains incorrect types: r=p, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0c0130", + "result" : "invalid" + }, + { + "tcId" : 275, + "comment" : "Signature encoding contains incorrect types: r=p, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff3000", + "result" : "invalid" + }, + { + "tcId" : 276, + "comment" : "Signature encoding contains incorrect types: r=p, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff3003020100", + "result" : "invalid" + }, + { + "tcId" : 277, + "comment" : "Signature encoding contains incorrect types: r=0.25, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300a090380fe01090380fe01", + "result" : "invalid" + }, + { + "tcId" : 278, + "comment" : "Signature encoding contains incorrect types: r=nan, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006090142090142", + "result" : "invalid" + }, + { + "tcId" : 279, + "comment" : "Signature encoding contains incorrect types: r=True, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010101010101", + "result" : "invalid" + }, + { + "tcId" : 280, + "comment" : "Signature encoding contains incorrect types: r=False, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010100010100", + "result" : "invalid" + }, + { + "tcId" : 281, + "comment" : "Signature encoding contains incorrect types: r=Null, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300405000500", + "result" : "invalid" + }, + { + "tcId" : 282, + "comment" : "Signature encoding contains incorrect types: r=empyt UTF-8 string, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30040c000c00", + "result" : "invalid" + }, + { + "tcId" : 283, + "comment" : "Signature encoding contains incorrect types: r=\"0\", s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060c01300c0130", + "result" : "invalid" + }, + { + "tcId" : 284, + "comment" : "Signature encoding contains incorrect types: r=empty list, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300430003000", + "result" : "invalid" + }, + { + "tcId" : 285, + "comment" : "Signature encoding contains incorrect types: r=list containing 0, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300a30030201003003020100", + "result" : "invalid" + }, + { + "tcId" : 286, + "comment" : "Signature encoding contains incorrect types: r=0.25, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3008090380fe01020100", + "result" : "invalid" + }, + { + "tcId" : 287, + "comment" : "Signature encoding contains incorrect types: r=nan, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006090142020100", + "result" : "invalid" + }, + { + "tcId" : 288, + "comment" : "Signature encoding contains incorrect types: r=True, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010101020100", + "result" : "invalid" + }, + { + "tcId" : 289, + "comment" : "Signature encoding contains incorrect types: r=False, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010100020100", + "result" : "invalid" + }, + { + "tcId" : 290, + "comment" : "Signature encoding contains incorrect types: r=Null, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050500020100", + "result" : "invalid" + }, + { + "tcId" : 291, + "comment" : "Signature encoding contains incorrect types: r=empyt UTF-8 string, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050c00020100", + "result" : "invalid" + }, + { + "tcId" : 292, + "comment" : "Signature encoding contains incorrect types: r=\"0\", s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060c0130020100", + "result" : "invalid" + }, + { + "tcId" : 293, + "comment" : "Signature encoding contains incorrect types: r=empty list, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30053000020100", + "result" : "invalid" + }, + { + "tcId" : 294, + "comment" : "Signature encoding contains incorrect types: r=list containing 0, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30083003020100020100", + "result" : "invalid" + }, + { + "tcId" : 295, + "comment" : "Edge case for Shamir multiplication", + "flags" : [ + "EdgeCaseShamirMultiplication" + ], + "msg" : "3639383139", + "sig" : "3044022064a1aab5000d0e804f3e2fc02bdee9be8ff312334e2ba16d11547c97711c898e02206af015971cc30be6d1a206d4e013e0997772a2f91d73286ffd683b9bb2cf4f1b", + "result" : "valid" + }, + { + "tcId" : 296, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "343236343739373234", + "sig" : "3044022016aea964a2f6506d6f78c81c91fc7e8bded7d397738448de1e19a0ec580bf2660220252cd762130c6667cfe8b7bc47d27d78391e8e80c578d1cd38c3ff033be928e9", + "result" : "valid" + }, + { + "tcId" : 297, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37313338363834383931", + "sig" : "30450221009cc98be2347d469bf476dfc26b9b733df2d26d6ef524af917c665baccb23c8820220093496459effe2d8d70727b82462f61d0ec1b7847929d10ea631dacb16b56c32", + "result" : "valid" + }, + { + "tcId" : 298, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3130333539333331363638", + "sig" : "3044022073b3c90ecd390028058164524dde892703dce3dea0d53fa8093999f07ab8aa4302202f67b0b8e20636695bb7d8bf0a651c802ed25a395387b5f4188c0c4075c88634", + "result" : "valid" + }, + { + "tcId" : 299, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33393439343031323135", + "sig" : "3046022100bfab3098252847b328fadf2f89b95c851a7f0eb390763378f37e90119d5ba3dd022100bdd64e234e832b1067c2d058ccb44d978195ccebb65c2aaf1e2da9b8b4987e3b", + "result" : "valid" + }, + { + "tcId" : 300, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31333434323933303739", + "sig" : "30440220204a9784074b246d8bf8bf04a4ceb1c1f1c9aaab168b1596d17093c5cd21d2cd022051cce41670636783dc06a759c8847868a406c2506fe17975582fe648d1d88b52", + "result" : "valid" + }, + { + "tcId" : 301, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33373036323131373132", + "sig" : "3046022100ed66dc34f551ac82f63d4aa4f81fe2cb0031a91d1314f835027bca0f1ceeaa0302210099ca123aa09b13cd194a422e18d5fda167623c3f6e5d4d6abb8953d67c0c48c7", + "result" : "valid" + }, + { + "tcId" : 302, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "333433363838373132", + "sig" : "30450220060b700bef665c68899d44f2356a578d126b062023ccc3c056bf0f60a237012b0221008d186c027832965f4fcc78a3366ca95dedbb410cbef3f26d6be5d581c11d3610", + "result" : "valid" + }, + { + "tcId" : 303, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31333531353330333730", + "sig" : "30460221009f6adfe8d5eb5b2c24d7aa7934b6cf29c93ea76cd313c9132bb0c8e38c96831d022100b26a9c9e40e55ee0890c944cf271756c906a33e66b5bd15e051593883b5e9902", + "result" : "valid" + }, + { + "tcId" : 304, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36353533323033313236", + "sig" : "3045022100a1af03ca91677b673ad2f33615e56174a1abf6da168cebfa8868f4ba273f16b7022020aa73ffe48afa6435cd258b173d0c2377d69022e7d098d75caf24c8c5e06b1c", + "result" : "valid" + }, + { + "tcId" : 305, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31353634333436363033", + "sig" : "3045022100fdc70602766f8eed11a6c99a71c973d5659355507b843da6e327a28c11893db902203df5349688a085b137b1eacf456a9e9e0f6d15ec0078ca60a7f83f2b10d21350", + "result" : "valid" + }, + { + "tcId" : 306, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34343239353339313137", + "sig" : "3046022100b516a314f2fce530d6537f6a6c49966c23456f63c643cf8e0dc738f7b876e675022100d39ffd033c92b6d717dd536fbc5efdf1967c4bd80954479ba66b0120cd16fff2", + "result" : "valid" + }, + { + "tcId" : 307, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3130393533323631333531", + "sig" : "304402203b2cbf046eac45842ecb7984d475831582717bebb6492fd0a485c101e29ff0a802204c9b7b47a98b0f82de512bc9313aaf51701099cac5f76e68c8595fc1c1d99258", + "result" : "valid" + }, + { + "tcId" : 308, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35393837333530303431", + "sig" : "3044022030c87d35e636f540841f14af54e2f9edd79d0312cfa1ab656c3fb15bfde48dcf022047c15a5a82d24b75c85a692bd6ecafeb71409ede23efd08e0db9abf6340677ed", + "result" : "valid" + }, + { + "tcId" : 309, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33343633303036383738", + "sig" : "3044022038686ff0fda2cef6bc43b58cfe6647b9e2e8176d168dec3c68ff262113760f520220067ec3b651f422669601662167fa8717e976e2db5e6a4cf7c2ddabb3fde9d67d", + "result" : "valid" + }, + { + "tcId" : 310, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "39383137333230323837", + "sig" : "3044022044a3e23bf314f2b344fc25c7f2de8b6af3e17d27f5ee844b225985ab6e2775cf02202d48e223205e98041ddc87be532abed584f0411f5729500493c9cc3f4dd15e86", + "result" : "valid" + }, + { + "tcId" : 311, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33323232303431303436", + "sig" : "304402202ded5b7ec8e90e7bf11f967a3d95110c41b99db3b5aa8d330eb9d638781688e902207d5792c53628155e1bfc46fb1a67e3088de049c328ae1f44ec69238a009808f9", + "result" : "valid" + }, + { + "tcId" : 312, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36363636333037313034", + "sig" : "3046022100bdae7bcb580bf335efd3bc3d31870f923eaccafcd40ec2f605976f15137d8b8f022100f6dfa12f19e525270b0106eecfe257499f373a4fb318994f24838122ce7ec3c7", + "result" : "valid" + }, + { + "tcId" : 313, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31303335393531383938", + "sig" : "3045022050f9c4f0cd6940e162720957ffff513799209b78596956d21ece251c2401f1c6022100d7033a0a787d338e889defaaabb106b95a4355e411a59c32aa5167dfab244726", + "result" : "valid" + }, + { + "tcId" : 314, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31383436353937313935", + "sig" : "3045022100f612820687604fa01906066a378d67540982e29575d019aabe90924ead5c860d02203f9367702dd7dd4f75ea98afd20e328a1a99f4857b316525328230ce294b0fef", + "result" : "valid" + }, + { + "tcId" : 315, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33313336303436313839", + "sig" : "30460221009505e407657d6e8bc93db5da7aa6f5081f61980c1949f56b0f2f507da5782a7a022100c60d31904e3669738ffbeccab6c3656c08e0ed5cb92b3cfa5e7f71784f9c5021", + "result" : "valid" + }, + { + "tcId" : 316, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32363633373834323534", + "sig" : "3046022100bbd16fbbb656b6d0d83e6a7787cd691b08735aed371732723e1c68a40404517d0221009d8e35dba96028b7787d91315be675877d2d097be5e8ee34560e3e7fd25c0f00", + "result" : "valid" + }, + { + "tcId" : 317, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31363532313030353234", + "sig" : "304402202ec9760122db98fd06ea76848d35a6da442d2ceef7559a30cf57c61e92df327e02207ab271da90859479701fccf86e462ee3393fb6814c27b760c4963625c0a19878", + "result" : "valid" + }, + { + "tcId" : 318, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35373438303831363936", + "sig" : "3044022054e76b7683b6650baa6a7fc49b1c51eed9ba9dd463221f7a4f1005a89fe00c5902202ea076886c773eb937ec1cc8374b7915cfd11b1c1ae1166152f2f7806a31c8fd", + "result" : "valid" + }, + { + "tcId" : 319, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36333433393133343638", + "sig" : "304402205291deaf24659ffbbce6e3c26f6021097a74abdbb69be4fb10419c0c496c9466022065d6fcf336d27cc7cdb982bb4e4ecef5827f84742f29f10abf83469270a03dc3", + "result" : "valid" + }, + { + "tcId" : 320, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31353431313033353938", + "sig" : "30450220207a3241812d75d947419dc58efb05e8003b33fc17eb50f9d15166a88479f107022100cdee749f2e492b213ce80b32d0574f62f1c5d70793cf55e382d5caadf7592767", + "result" : "valid" + }, + { + "tcId" : 321, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3130343738353830313238", + "sig" : "304502206554e49f82a855204328ac94913bf01bbe84437a355a0a37c0dee3cf81aa7728022100aea00de2507ddaf5c94e1e126980d3df16250a2eaebc8be486effe7f22b4f929", + "result" : "valid" + }, + { + "tcId" : 322, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3130353336323835353638", + "sig" : "3046022100a54c5062648339d2bff06f71c88216c26c6e19b4d80a8c602990ac82707efdfc022100e99bbe7fcfafae3e69fd016777517aa01056317f467ad09aff09be73c9731b0d", + "result" : "valid" + }, + { + "tcId" : 323, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "393533393034313035", + "sig" : "3045022100975bd7157a8d363b309f1f444012b1a1d23096593133e71b4ca8b059cff37eaf02207faa7a28b1c822baa241793f2abc930bd4c69840fe090f2aacc46786bf919622", + "result" : "valid" + }, + { + "tcId" : 324, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "393738383438303339", + "sig" : "304402205694a6f84b8f875c276afd2ebcfe4d61de9ec90305afb1357b95b3e0da43885e02200dffad9ffd0b757d8051dec02ebdf70d8ee2dc5c7870c0823b6ccc7c679cbaa4", + "result" : "valid" + }, + { + "tcId" : 325, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33363130363732343432", + "sig" : "3045022100a0c30e8026fdb2b4b4968a27d16a6d08f7098f1a98d21620d7454ba9790f1ba602205e470453a8a399f15baf463f9deceb53acc5ca64459149688bd2760c65424339", + "result" : "valid" + }, + { + "tcId" : 326, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31303534323430373035", + "sig" : "30440220614ea84acf736527dd73602cd4bb4eea1dfebebd5ad8aca52aa0228cf7b99a880220737cc85f5f2d2f60d1b8183f3ed490e4de14368e96a9482c2a4dd193195c902f", + "result" : "valid" + }, + { + "tcId" : 327, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35313734343438313937", + "sig" : "3045022100bead6734ebe44b810d3fb2ea00b1732945377338febfd439a8d74dfbd0f942fa02206bb18eae36616a7d3cad35919fd21a8af4bbe7a10f73b3e036a46b103ef56e2a", + "result" : "valid" + }, + { + "tcId" : 328, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31393637353631323531", + "sig" : "30440220499625479e161dacd4db9d9ce64854c98d922cbf212703e9654fae182df9bad2022042c177cf37b8193a0131108d97819edd9439936028864ac195b64fca76d9d693", + "result" : "valid" + }, + { + "tcId" : 329, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33343437323533333433", + "sig" : "3045022008f16b8093a8fb4d66a2c8065b541b3d31e3bfe694f6b89c50fb1aaa6ff6c9b20221009d6455e2d5d1779748573b611cb95d4a21f967410399b39b535ba3e5af81ca2e", + "result" : "valid" + }, + { + "tcId" : 330, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "333638323634333138", + "sig" : "3046022100be26231b6191658a19dd72ddb99ed8f8c579b6938d19bce8eed8dc2b338cb5f8022100e1d9a32ee56cffed37f0f22b2dcb57d5c943c14f79694a03b9c5e96952575c89", + "result" : "valid" + }, + { + "tcId" : 331, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33323631313938363038", + "sig" : "3045022015e76880898316b16204ac920a02d58045f36a229d4aa4f812638c455abe0443022100e74d357d3fcb5c8c5337bd6aba4178b455ca10e226e13f9638196506a1939123", + "result" : "valid" + }, + { + "tcId" : 332, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "39363738373831303934", + "sig" : "30440220352ecb53f8df2c503a45f9846fc28d1d31e6307d3ddbffc1132315cc07f16dad02201348dfa9c482c558e1d05c5242ca1c39436726ecd28258b1899792887dd0a3c6", + "result" : "valid" + }, + { + "tcId" : 333, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34393538383233383233", + "sig" : "304402204a40801a7e606ba78a0da9882ab23c7677b8642349ed3d652c5bfa5f2a9558fb02203a49b64848d682ef7f605f2832f7384bdc24ed2925825bf8ea77dc5981725782", + "result" : "valid" + }, + { + "tcId" : 334, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "383234363337383337", + "sig" : "3045022100eacc5e1a8304a74d2be412b078924b3bb3511bac855c05c9e5e9e44df3d61e9602207451cd8e18d6ed1885dd827714847f96ec4bb0ed4c36ce9808db8f714204f6d1", + "result" : "valid" + }, + { + "tcId" : 335, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3131303230383333373736", + "sig" : "304502202f7a5e9e5771d424f30f67fdab61e8ce4f8cd1214882adb65f7de94c31577052022100ac4e69808345809b44acb0b2bd889175fb75dd050c5a449ab9528f8f78daa10c", + "result" : "valid" + }, + { + "tcId" : 336, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "313333383731363438", + "sig" : "3045022100ffcda40f792ce4d93e7e0f0e95e1a2147dddd7f6487621c30a03d710b3300219022079938b55f8a17f7ed7ba9ade8f2065a1fa77618f0b67add8d58c422c2453a49a", + "result" : "valid" + }, + { + "tcId" : 337, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "333232313434313632", + "sig" : "304602210081f2359c4faba6b53d3e8c8c3fcc16a948350f7ab3a588b28c17603a431e39a8022100cd6f6a5cc3b55ead0ff695d06c6860b509e46d99fccefb9f7f9e101857f74300", + "result" : "valid" + }, + { + "tcId" : 338, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3130363836363535353436", + "sig" : "3045022100dfc8bf520445cbb8ee1596fb073ea283ea130251a6fdffa5c3f5f2aaf75ca8080220048e33efce147c9dd92823640e338e68bfd7d0dc7a4905b3a7ac711e577e90e7", + "result" : "valid" + }, + { + "tcId" : 339, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3632313535323436", + "sig" : "3046022100ad019f74c6941d20efda70b46c53db166503a0e393e932f688227688ba6a576202210093320eb7ca0710255346bdbb3102cdcf7964ef2e0988e712bc05efe16c199345", + "result" : "valid" + }, + { + "tcId" : 340, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37303330383138373734", + "sig" : "3046022100ac8096842e8add68c34e78ce11dd71e4b54316bd3ebf7fffdeb7bd5a3ebc1883022100f5ca2f4f23d674502d4caf85d187215d36e3ce9f0ce219709f21a3aac003b7a8", + "result" : "valid" + }, + { + "tcId" : 341, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35393234353233373434", + "sig" : "30440220677b2d3a59b18a5ff939b70ea002250889ddcd7b7b9d776854b4943693fb92f702206b4ba856ade7677bf30307b21f3ccda35d2f63aee81efd0bab6972cc0795db55", + "result" : "valid" + }, + { + "tcId" : 342, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31343935353836363231", + "sig" : "30450220479e1ded14bcaed0379ba8e1b73d3115d84d31d4b7c30e1f05e1fc0d5957cfb0022100918f79e35b3d89487cf634a4f05b2e0c30857ca879f97c771e877027355b2443", + "result" : "valid" + }, + { + "tcId" : 343, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34303035333134343036", + "sig" : "3044022043dfccd0edb9e280d9a58f01164d55c3d711e14b12ac5cf3b64840ead512a0a302201dbe33fa8ba84533cd5c4934365b3442ca1174899b78ef9a3199f49584389772", + "result" : "valid" + }, + { + "tcId" : 344, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33303936343537353132", + "sig" : "304402205b09ab637bd4caf0f4c7c7e4bca592fea20e9087c259d26a38bb4085f0bbff11022045b7eb467b6748af618e9d80d6fdcd6aa24964e5a13f885bca8101de08eb0d75", + "result" : "valid" + }, + { + "tcId" : 345, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32373834303235363230", + "sig" : "304502205e9b1c5a028070df5728c5c8af9b74e0667afa570a6cfa0114a5039ed15ee06f022100b1360907e2d9785ead362bb8d7bd661b6c29eeffd3c5037744edaeb9ad990c20", + "result" : "valid" + }, + { + "tcId" : 346, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32363138373837343138", + "sig" : "304502200671a0a85c2b72d54a2fb0990e34538b4890050f5a5712f6d1a7a5fb8578f32e022100db1846bab6b7361479ab9c3285ca41291808f27fd5bd4fdac720e5854713694c", + "result" : "valid" + }, + { + "tcId" : 347, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31363432363235323632", + "sig" : "304402207673f8526748446477dbbb0590a45492c5d7d69859d301abbaedb35b2095103a02203dc70ddf9c6b524d886bed9e6af02e0e4dec0d417a414fed3807ef4422913d7c", + "result" : "valid" + }, + { + "tcId" : 348, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36383234313839343336", + "sig" : "304402207f085441070ecd2bb21285089ebb1aa6450d1a06c36d3ff39dfd657a796d12b50220249712012029870a2459d18d47da9aa492a5e6cb4b2d8dafa9e4c5c54a2b9a8b", + "result" : "valid" + }, + { + "tcId" : 349, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "343834323435343235", + "sig" : "3046022100914c67fb61dd1e27c867398ea7322d5ab76df04bc5aa6683a8e0f30a5d287348022100fa07474031481dda4953e3ac1959ee8cea7e66ec412b38d6c96d28f6d37304ea", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "040ad99500288d466940031d72a9f5445a4d43784640855bf0a69874d2de5fe103c5011e6ef2c42dcd50d5d3d29f99ae6eba2c80c9244f4c5422f0979ff0c3ba5e", + "wx" : "0ad99500288d466940031d72a9f5445a4d43784640855bf0a69874d2de5fe103", + "wy" : "00c5011e6ef2c42dcd50d5d3d29f99ae6eba2c80c9244f4c5422f0979ff0c3ba5e" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040ad99500288d466940031d72a9f5445a4d43784640855bf0a69874d2de5fe103c5011e6ef2c42dcd50d5d3d29f99ae6eba2c80c9244f4c5422f0979ff0c3ba5e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECtmVACiNRmlAAx1yqfVEWk1DeEZA\nhVvwpph00t5f4QPFAR5u8sQtzVDV09Kfma5uuiyAySRPTFQi8Jef8MO6Xg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 350, + "comment" : "k*G has a large x-coordinate", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "303502104319055358e8617b0c46353d039cdaab022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e", + "result" : "valid" + }, + { + "tcId" : 351, + "comment" : "r too large", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000000fffffffffffffffffffffffc022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04ab05fd9d0de26b9ce6f4819652d9fc69193d0aa398f0fba8013e09c58220455419235271228c786759095d12b75af0692dd4103f19f6a8c32f49435a1e9b8d45", + "wx" : "00ab05fd9d0de26b9ce6f4819652d9fc69193d0aa398f0fba8013e09c582204554", + "wy" : "19235271228c786759095d12b75af0692dd4103f19f6a8c32f49435a1e9b8d45" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ab05fd9d0de26b9ce6f4819652d9fc69193d0aa398f0fba8013e09c58220455419235271228c786759095d12b75af0692dd4103f19f6a8c32f49435a1e9b8d45", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEqwX9nQ3ia5zm9IGWUtn8aRk9CqOY\n8PuoAT4JxYIgRVQZI1JxIox4Z1kJXRK3WvBpLdQQPxn2qMMvSUNaHpuNRQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 352, + "comment" : "r,s are large", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0480984f39a1ff38a86a68aa4201b6be5dfbfecf876219710b07badf6fdd4c6c5611feb97390d9826e7a06dfb41871c940d74415ed3cac2089f1445019bb55ed95", + "wx" : "0080984f39a1ff38a86a68aa4201b6be5dfbfecf876219710b07badf6fdd4c6c56", + "wy" : "11feb97390d9826e7a06dfb41871c940d74415ed3cac2089f1445019bb55ed95" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000480984f39a1ff38a86a68aa4201b6be5dfbfecf876219710b07badf6fdd4c6c5611feb97390d9826e7a06dfb41871c940d74415ed3cac2089f1445019bb55ed95", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEgJhPOaH/OKhqaKpCAba+Xfv+z4di\nGXELB7rfb91MbFYR/rlzkNmCbnoG37QYcclA10QV7TysIInxRFAZu1XtlQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 353, + "comment" : "r and s^-1 have a large Hamming weight", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100909135bdb6799286170f5ead2de4f6511453fe50914f3df2de54a36383df8dd4", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "044201b4272944201c3294f5baa9a3232b6dd687495fcc19a70a95bc602b4f7c0595c37eba9ee8171c1bb5ac6feaf753bc36f463e3aef16629572c0c0a8fb0800e", + "wx" : "4201b4272944201c3294f5baa9a3232b6dd687495fcc19a70a95bc602b4f7c05", + "wy" : "0095c37eba9ee8171c1bb5ac6feaf753bc36f463e3aef16629572c0c0a8fb0800e" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044201b4272944201c3294f5baa9a3232b6dd687495fcc19a70a95bc602b4f7c0595c37eba9ee8171c1bb5ac6feaf753bc36f463e3aef16629572c0c0a8fb0800e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEQgG0JylEIBwylPW6qaMjK23Wh0lf\nzBmnCpW8YCtPfAWVw366nugXHBu1rG/q91O8NvRj467xZilXLAwKj7CADg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 354, + "comment" : "r and s^-1 have a large Hamming weight", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022027b4577ca009376f71303fd5dd227dcef5deb773ad5f5a84360644669ca249a5", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04a71af64de5126a4a4e02b7922d66ce9415ce88a4c9d25514d91082c8725ac9575d47723c8fbe580bb369fec9c2665d8e30a435b9932645482e7c9f11e872296b", + "wx" : "00a71af64de5126a4a4e02b7922d66ce9415ce88a4c9d25514d91082c8725ac957", + "wy" : "5d47723c8fbe580bb369fec9c2665d8e30a435b9932645482e7c9f11e872296b" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a71af64de5126a4a4e02b7922d66ce9415ce88a4c9d25514d91082c8725ac9575d47723c8fbe580bb369fec9c2665d8e30a435b9932645482e7c9f11e872296b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEpxr2TeUSakpOAreSLWbOlBXOiKTJ\n0lUU2RCCyHJayVddR3I8j75YC7Np/snCZl2OMKQ1uZMmRUgufJ8R6HIpaw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 355, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020105020101", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "046627cec4f0731ea23fc2931f90ebe5b7572f597d20df08fc2b31ee8ef16b15726170ed77d8d0a14fc5c9c3c4c9be7f0d3ee18f709bb275eaf2073e258fe694a5", + "wx" : "6627cec4f0731ea23fc2931f90ebe5b7572f597d20df08fc2b31ee8ef16b1572", + "wy" : "6170ed77d8d0a14fc5c9c3c4c9be7f0d3ee18f709bb275eaf2073e258fe694a5" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046627cec4f0731ea23fc2931f90ebe5b7572f597d20df08fc2b31ee8ef16b15726170ed77d8d0a14fc5c9c3c4c9be7f0d3ee18f709bb275eaf2073e258fe694a5", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEZifOxPBzHqI/wpMfkOvlt1cvWX0g\n3wj8KzHujvFrFXJhcO132NChT8XJw8TJvn8NPuGPcJuyderyBz4lj+aUpQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 356, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020105020103", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "045a7c8825e85691cce1f5e7544c54e73f14afc010cb731343262ca7ec5a77f5bfef6edf62a4497c1bd7b147fb6c3d22af3c39bfce95f30e13a16d3d7b2812f813", + "wx" : "5a7c8825e85691cce1f5e7544c54e73f14afc010cb731343262ca7ec5a77f5bf", + "wy" : "00ef6edf62a4497c1bd7b147fb6c3d22af3c39bfce95f30e13a16d3d7b2812f813" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045a7c8825e85691cce1f5e7544c54e73f14afc010cb731343262ca7ec5a77f5bfef6edf62a4497c1bd7b147fb6c3d22af3c39bfce95f30e13a16d3d7b2812f813", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWnyIJehWkczh9edUTFTnPxSvwBDL\ncxNDJiyn7Fp39b/vbt9ipEl8G9exR/tsPSKvPDm/zpXzDhOhbT17KBL4Ew==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 357, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020105020105", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04cbe0c29132cd738364fedd603152990c048e5e2fff996d883fa6caca7978c73770af6a8ce44cb41224b2603606f4c04d188e80bff7cc31ad5189d4ab0d70e8c1", + "wx" : "00cbe0c29132cd738364fedd603152990c048e5e2fff996d883fa6caca7978c737", + "wy" : "70af6a8ce44cb41224b2603606f4c04d188e80bff7cc31ad5189d4ab0d70e8c1" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cbe0c29132cd738364fedd603152990c048e5e2fff996d883fa6caca7978c73770af6a8ce44cb41224b2603606f4c04d188e80bff7cc31ad5189d4ab0d70e8c1", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEy+DCkTLNc4Nk/t1gMVKZDASOXi//\nmW2IP6bKynl4xzdwr2qM5Ey0EiSyYDYG9MBNGI6Av/fMMa1RidSrDXDowQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 358, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020105020106", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042ef747671c97d9c7f9cb2f6a30d678c3d84757ba241ef7183d51a29f52d87c2ea8fb2ea635b761baefc1c4ded2099281b844e13e044c328553bbbafa337d8a76", + "wx" : "2ef747671c97d9c7f9cb2f6a30d678c3d84757ba241ef7183d51a29f52d87c2e", + "wy" : "00a8fb2ea635b761baefc1c4ded2099281b844e13e044c328553bbbafa337d8a76" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042ef747671c97d9c7f9cb2f6a30d678c3d84757ba241ef7183d51a29f52d87c2ea8fb2ea635b761baefc1c4ded2099281b844e13e044c328553bbbafa337d8a76", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAELvdHZxyX2cf5yy9qMNZ4w9hHV7ok\nHvcYPVGin1LYfC6o+y6mNbdhuu/BxN7SCZKBuEThPgRMMoVTu7r6M32Kdg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 359, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020106020101", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04931cc49cda4d87d25b1601c56c3b83b4f45e44971998f2d3e7d3c55152214edf058dc140abbba42fc1ddbf30dab8eb9b46ee7338b3f7ee96242bf45e1df5e995", + "wx" : "00931cc49cda4d87d25b1601c56c3b83b4f45e44971998f2d3e7d3c55152214edf", + "wy" : "058dc140abbba42fc1ddbf30dab8eb9b46ee7338b3f7ee96242bf45e1df5e995" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004931cc49cda4d87d25b1601c56c3b83b4f45e44971998f2d3e7d3c55152214edf058dc140abbba42fc1ddbf30dab8eb9b46ee7338b3f7ee96242bf45e1df5e995", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEkxzEnNpNh9JbFgHFbDuDtPReRJcZ\nmPLT59PFUVIhTt8FjcFAq7ukL8HdvzDauOubRu5zOLP37pYkK/ReHfXplQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 360, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020106020103", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04899a4af61867e3f3c190dbb48f8bc9fc74b70a467a4a1f06477b3af2f39ab8ed47ac000f9ea8a3034939bf48ad5d061a69fc8495ae4df2dbec7effa03a0062b3", + "wx" : "00899a4af61867e3f3c190dbb48f8bc9fc74b70a467a4a1f06477b3af2f39ab8ed", + "wy" : "47ac000f9ea8a3034939bf48ad5d061a69fc8495ae4df2dbec7effa03a0062b3" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004899a4af61867e3f3c190dbb48f8bc9fc74b70a467a4a1f06477b3af2f39ab8ed47ac000f9ea8a3034939bf48ad5d061a69fc8495ae4df2dbec7effa03a0062b3", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEiZpK9hhn4/PBkNu0j4vJ/HS3CkZ6\nSh8GR3s68vOauO1HrAAPnqijA0k5v0itXQYaafyEla5N8tvsfv+gOgBisw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 361, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020106020106", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04d03eb09913cc20c6a8d0070f0d8d2a7f63527fafa44117fce6bd1ef2aa4ae3c46d5df3f45ac58fa334c6d102381b3120b7a2455600dcaff3d1a845514f12bf46", + "wx" : "00d03eb09913cc20c6a8d0070f0d8d2a7f63527fafa44117fce6bd1ef2aa4ae3c4", + "wy" : "6d5df3f45ac58fa334c6d102381b3120b7a2455600dcaff3d1a845514f12bf46" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d03eb09913cc20c6a8d0070f0d8d2a7f63527fafa44117fce6bd1ef2aa4ae3c46d5df3f45ac58fa334c6d102381b3120b7a2455600dcaff3d1a845514f12bf46", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE0D6wmRPMIMao0AcPDY0qf2NSf6+k\nQRf85r0e8qpK48RtXfP0WsWPozTG0QI4GzEgt6JFVgDcr/PRqEVRTxK/Rg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 362, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020106020107", + "result" : "valid" + }, + { + "tcId" : 363, + "comment" : "r is larger than n", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632557020107", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "043a72476291571193b4d109b2c37b59f2807e8fe9cffd804eacded903e77ca0da592dbc74fee0ca7508cc7bc282b0c51a143286ff53c60131668e7a0929e4ed04", + "wx" : "3a72476291571193b4d109b2c37b59f2807e8fe9cffd804eacded903e77ca0da", + "wy" : "592dbc74fee0ca7508cc7bc282b0c51a143286ff53c60131668e7a0929e4ed04" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043a72476291571193b4d109b2c37b59f2807e8fe9cffd804eacded903e77ca0da592dbc74fee0ca7508cc7bc282b0c51a143286ff53c60131668e7a0929e4ed04", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEOnJHYpFXEZO00Qmyw3tZ8oB+j+nP\n/YBOrN7ZA+d8oNpZLbx0/uDKdQjMe8KCsMUaFDKG/1PGATFmjnoJKeTtBA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 364, + "comment" : "s is larger than n", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3026020106022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc75fbd8", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04d0f73792203716afd4be4329faa48d269f15313ebbba379d7783c97bf3e890d9971f4a3206605bec21782bf5e275c714417e8f566549e6bc68690d2363c89cc1", + "wx" : "00d0f73792203716afd4be4329faa48d269f15313ebbba379d7783c97bf3e890d9", + "wy" : "00971f4a3206605bec21782bf5e275c714417e8f566549e6bc68690d2363c89cc1" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d0f73792203716afd4be4329faa48d269f15313ebbba379d7783c97bf3e890d9971f4a3206605bec21782bf5e275c714417e8f566549e6bc68690d2363c89cc1", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE0Pc3kiA3Fq/UvkMp+qSNJp8VMT67\nujedd4PJe/PokNmXH0oyBmBb7CF4K/XidccUQX6PVmVJ5rxoaQ0jY8icwQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 365, + "comment" : "small r and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3027020201000221008f1e3c7862c58b16bb76eddbb76eddbb516af4f63f2d74d76e0d28c9bb75ea88", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "044838b2be35a6276a80ef9e228140f9d9b96ce83b7a254f71ccdebbb8054ce05ffa9cbc123c919b19e00238198d04069043bd660a828814051fcb8aac738a6c6b", + "wx" : "4838b2be35a6276a80ef9e228140f9d9b96ce83b7a254f71ccdebbb8054ce05f", + "wy" : "00fa9cbc123c919b19e00238198d04069043bd660a828814051fcb8aac738a6c6b" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044838b2be35a6276a80ef9e228140f9d9b96ce83b7a254f71ccdebbb8054ce05ffa9cbc123c919b19e00238198d04069043bd660a828814051fcb8aac738a6c6b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAESDiyvjWmJ2qA754igUD52bls6Dt6\nJU9xzN67uAVM4F/6nLwSPJGbGeACOBmNBAaQQ71mCoKIFAUfy4qsc4psaw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 366, + "comment" : "smallish r and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "302c02072d9b4d347952d6022100ef3043e7329581dbb3974497710ab11505ee1c87ff907beebadd195a0ffe6d7a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "047393983ca30a520bbc4783dc9960746aab444ef520c0a8e771119aa4e74b0f64e9d7be1ab01a0bf626e709863e6a486dbaf32793afccf774e2c6cd27b1857526", + "wx" : "7393983ca30a520bbc4783dc9960746aab444ef520c0a8e771119aa4e74b0f64", + "wy" : "00e9d7be1ab01a0bf626e709863e6a486dbaf32793afccf774e2c6cd27b1857526" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047393983ca30a520bbc4783dc9960746aab444ef520c0a8e771119aa4e74b0f64e9d7be1ab01a0bf626e709863e6a486dbaf32793afccf774e2c6cd27b1857526", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEc5OYPKMKUgu8R4PcmWB0aqtETvUg\nwKjncRGapOdLD2Tp174asBoL9ibnCYY+akhtuvMnk6/M93Tixs0nsYV1Jg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 367, + "comment" : "100-bit r and small s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3032020d1033e67e37b32b445580bf4eff0221008b748b74000000008b748b748b748b7466e769ad4a16d3dcd87129b8e91d1b4d", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "045ac331a1103fe966697379f356a937f350588a05477e308851b8a502d5dfcdc5fe9993df4b57939b2b8da095bf6d794265204cfe03be995a02e65d408c871c0b", + "wx" : "5ac331a1103fe966697379f356a937f350588a05477e308851b8a502d5dfcdc5", + "wy" : "00fe9993df4b57939b2b8da095bf6d794265204cfe03be995a02e65d408c871c0b" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045ac331a1103fe966697379f356a937f350588a05477e308851b8a502d5dfcdc5fe9993df4b57939b2b8da095bf6d794265204cfe03be995a02e65d408c871c0b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWsMxoRA/6WZpc3nzVqk381BYigVH\nfjCIUbilAtXfzcX+mZPfS1eTmyuNoJW/bXlCZSBM/gO+mVoC5l1AjIccCw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 368, + "comment" : "small r and 100 bit s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "302702020100022100ef9f6ba4d97c09d03178fa20b4aaad83be3cf9cb824a879fec3270fc4b81ef5b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "041d209be8de2de877095a399d3904c74cc458d926e27bb8e58e5eae5767c41509dd59e04c214f7b18dce351fc2a549893a6860e80163f38cc60a4f2c9d040d8c9", + "wx" : "1d209be8de2de877095a399d3904c74cc458d926e27bb8e58e5eae5767c41509", + "wy" : "00dd59e04c214f7b18dce351fc2a549893a6860e80163f38cc60a4f2c9d040d8c9" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200041d209be8de2de877095a399d3904c74cc458d926e27bb8e58e5eae5767c41509dd59e04c214f7b18dce351fc2a549893a6860e80163f38cc60a4f2c9d040d8c9", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHSCb6N4t6HcJWjmdOQTHTMRY2Sbi\ne7jljl6uV2fEFQndWeBMIU97GNzjUfwqVJiTpoYOgBY/OMxgpPLJ0EDYyQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 369, + "comment" : "100-bit r and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3032020d062522bbd3ecbe7c39e93e7c25022100ef9f6ba4d97c09d03178fa20b4aaad83be3cf9cb824a879fec3270fc4b81ef5b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04083539fbee44625e3acaafa2fcb41349392cef0633a1b8fabecee0c133b10e99915c1ebe7bf00df8535196770a58047ae2a402f26326bb7d41d4d7616337911e", + "wx" : "083539fbee44625e3acaafa2fcb41349392cef0633a1b8fabecee0c133b10e99", + "wy" : "00915c1ebe7bf00df8535196770a58047ae2a402f26326bb7d41d4d7616337911e" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004083539fbee44625e3acaafa2fcb41349392cef0633a1b8fabecee0c133b10e99915c1ebe7bf00df8535196770a58047ae2a402f26326bb7d41d4d7616337911e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECDU5++5EYl46yq+i/LQTSTks7wYz\nobj6vs7gwTOxDpmRXB6+e/AN+FNRlncKWAR64qQC8mMmu31B1NdhYzeRHg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 370, + "comment" : "r and s^-1 are close to n", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d50220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04e075effd9607d08d5f34e3652f64cfa3bd6d20c58d0a232f058491260ab212a4cc61760ac8b0680c1b644c03cc628ba9dc4a3c0561368489c692bd40f43aa3ca", + "wx" : "00e075effd9607d08d5f34e3652f64cfa3bd6d20c58d0a232f058491260ab212a4", + "wy" : "00cc61760ac8b0680c1b644c03cc628ba9dc4a3c0561368489c692bd40f43aa3ca" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004e075effd9607d08d5f34e3652f64cfa3bd6d20c58d0a232f058491260ab212a4cc61760ac8b0680c1b644c03cc628ba9dc4a3c0561368489c692bd40f43aa3ca", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE4HXv/ZYH0I1fNONlL2TPo71tIMWN\nCiMvBYSRJgqyEqTMYXYKyLBoDBtkTAPMYoup3Eo8BWE2hInGkr1A9Dqjyg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 371, + "comment" : "r and s are 64-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30160209009c44febf31c3594f020900839ed28247c2b06b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04cffb758c3073ea3c08efd9f7f17a85b6ae385c5a140c146ad5f1f5a826718bc8dfdc6bebc894144c6d418ac5d97339726ad2ae925df868426e5628e9f4e62342", + "wx" : "00cffb758c3073ea3c08efd9f7f17a85b6ae385c5a140c146ad5f1f5a826718bc8", + "wy" : "00dfdc6bebc894144c6d418ac5d97339726ad2ae925df868426e5628e9f4e62342" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cffb758c3073ea3c08efd9f7f17a85b6ae385c5a140c146ad5f1f5a826718bc8dfdc6bebc894144c6d418ac5d97339726ad2ae925df868426e5628e9f4e62342", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEz/t1jDBz6jwI79n38XqFtq44XFoU\nDBRq1fH1qCZxi8jf3GvryJQUTG1BisXZczlyatKukl34aEJuVijp9OYjQg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 372, + "comment" : "r and s are 100-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "301e020d09df8b682430beef6f5fd7c7cd020d0fd0a62e13778f4222a0d61c8a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04b98740e69e61a325d5f772e3b5c4f67fb7150b16a9afeca9ddc4afcbb6fa0549c446e814138e4ebc82dbf86a390056d4595dcf45e381fef217a4597d7bd51498", + "wx" : "00b98740e69e61a325d5f772e3b5c4f67fb7150b16a9afeca9ddc4afcbb6fa0549", + "wy" : "00c446e814138e4ebc82dbf86a390056d4595dcf45e381fef217a4597d7bd51498" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b98740e69e61a325d5f772e3b5c4f67fb7150b16a9afeca9ddc4afcbb6fa0549c446e814138e4ebc82dbf86a390056d4595dcf45e381fef217a4597d7bd51498", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuYdA5p5hoyXV93LjtcT2f7cVCxap\nr+yp3cSvy7b6BUnERugUE45OvILb+Go5AFbUWV3PReOB/vIXpFl9e9UUmA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 373, + "comment" : "r and s are 128-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30260211008a598e563a89f526c32ebec8de26367c02110084f633e2042630e99dd0f1e16f7a04bf", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0484536a270c3932bb2084732adf2c768efc6d3977e5220229ea9a44888b8f9d7b1766398cdac2fc8000017b29a7ba15a58f196037f35f7008ed4286ddff00fd46", + "wx" : "0084536a270c3932bb2084732adf2c768efc6d3977e5220229ea9a44888b8f9d7b", + "wy" : "1766398cdac2fc8000017b29a7ba15a58f196037f35f7008ed4286ddff00fd46" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000484536a270c3932bb2084732adf2c768efc6d3977e5220229ea9a44888b8f9d7b1766398cdac2fc8000017b29a7ba15a58f196037f35f7008ed4286ddff00fd46", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhFNqJww5MrsghHMq3yx2jvxtOXfl\nIgIp6ppEiIuPnXsXZjmM2sL8gAABeymnuhWljxlgN/NfcAjtQobd/wD9Rg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 374, + "comment" : "r and s are 160-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "302e021500aa6eeb5823f7fa31b466bb473797f0d0314c0bdf021500e2977c479e6d25703cebbc6bd561938cc9d1bfb9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "048aeb368a7027a4d64abdea37390c0c1d6a26f399e2d9734de1eb3d0e1937387405bd13834715e1dbae9b875cf07bd55e1b6691c7f7536aef3b19bf7a4adf576d", + "wx" : "008aeb368a7027a4d64abdea37390c0c1d6a26f399e2d9734de1eb3d0e19373874", + "wy" : "05bd13834715e1dbae9b875cf07bd55e1b6691c7f7536aef3b19bf7a4adf576d" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048aeb368a7027a4d64abdea37390c0c1d6a26f399e2d9734de1eb3d0e1937387405bd13834715e1dbae9b875cf07bd55e1b6691c7f7536aef3b19bf7a4adf576d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEius2inAnpNZKveo3OQwMHWom85ni\n2XNN4es9Dhk3OHQFvRODRxXh266bh1zwe9VeG2aRx/dTau87Gb96St9XbQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 375, + "comment" : "s == 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30250220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70020101", + "result" : "valid" + }, + { + "tcId" : 376, + "comment" : "s == 0", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30250220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70020100", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0461722eaba731c697c7a9ba4d0afdbb5713d8aa12b0eab601bb33dbaf792c5adc272cd993b2b663aba5b3a26c101182ff178684945e83879e71598b95fe647dfc", + "wx" : "61722eaba731c697c7a9ba4d0afdbb5713d8aa12b0eab601bb33dbaf792c5adc", + "wy" : "272cd993b2b663aba5b3a26c101182ff178684945e83879e71598b95fe647dfc" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000461722eaba731c697c7a9ba4d0afdbb5713d8aa12b0eab601bb33dbaf792c5adc272cd993b2b663aba5b3a26c101182ff178684945e83879e71598b95fe647dfc", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYXIuq6cxxpfHqbpNCv27VxPYqhKw\n6rYBuzPbr3ksWtwnLNmTsrZjq6WzomwQEYL/F4aElF6Dh55xWYuV/mR9/A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 377, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022002f676969f451a8ccafa4c4f09791810e6d632dbd60b1d5540f3284fbe1889b0", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04c4c91981e720e20d7e478ff19d09b95a98f58c0f469b72801a8ce844a347316594afcd4188182e7779889b3258d0368ece1e66797fe7c648c6f0b9e26bd71871", + "wx" : "00c4c91981e720e20d7e478ff19d09b95a98f58c0f469b72801a8ce844a3473165", + "wy" : "0094afcd4188182e7779889b3258d0368ece1e66797fe7c648c6f0b9e26bd71871" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004c4c91981e720e20d7e478ff19d09b95a98f58c0f469b72801a8ce844a347316594afcd4188182e7779889b3258d0368ece1e66797fe7c648c6f0b9e26bd71871", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExMkZgecg4g1+R4/xnQm5Wpj1jA9G\nm3KAGozoRKNHMWWUr81BiBgud3mImzJY0DaOzh5meX/nxkjG8Lnia9cYcQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 378, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002204e260962e33362ef0046126d2d5a4edc6947ab20e19b8ec19cf79e5908b6e628", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04d58d47bf49bc8f416641f6f760fcbca80aa52a814e56a5fa40bab44fd6f6317216deaa84d45d8e0e29cc9ecf5653f8ee6444750813becae8deb42b04ba07a634", + "wx" : "00d58d47bf49bc8f416641f6f760fcbca80aa52a814e56a5fa40bab44fd6f63172", + "wy" : "16deaa84d45d8e0e29cc9ecf5653f8ee6444750813becae8deb42b04ba07a634" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d58d47bf49bc8f416641f6f760fcbca80aa52a814e56a5fa40bab44fd6f6317216deaa84d45d8e0e29cc9ecf5653f8ee6444750813becae8deb42b04ba07a634", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE1Y1Hv0m8j0FmQfb3YPy8qAqlKoFO\nVqX6QLq0T9b2MXIW3qqE1F2ODinMns9WU/juZER1CBO+yujetCsEugemNA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 379, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220077ed0d8f20f697d8fc591ac64dd5219c7932122b4f9b9ec6441e44a0092cf21", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0491e305822e5e44f3fdb616e2ef42cd98f241b86e9f68815bc4dba6a945e4eefb3c5937e2ac1d9466f6d65e49b35fc8d75ffc22e1fe2f32af42f5fa3c26f9b4b0", + "wx" : "0091e305822e5e44f3fdb616e2ef42cd98f241b86e9f68815bc4dba6a945e4eefb", + "wy" : "3c5937e2ac1d9466f6d65e49b35fc8d75ffc22e1fe2f32af42f5fa3c26f9b4b0" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000491e305822e5e44f3fdb616e2ef42cd98f241b86e9f68815bc4dba6a945e4eefb3c5937e2ac1d9466f6d65e49b35fc8d75ffc22e1fe2f32af42f5fa3c26f9b4b0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEkeMFgi5eRPP9thbi70LNmPJBuG6f\naIFbxNumqUXk7vs8WTfirB2UZvbWXkmzX8jXX/wi4f4vMq9C9fo8Jvm0sA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 380, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002203e0292a67e181c6c0105ee35e956e78e9bdd033c6e71ae57884039a245e4175f", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0424a0bc4d16dbbd40d2fd81a7c3f8d8ec741607d5bb406a0611cc60d0e683bd46b575cad039c15f7f3dffcfc007b4b0f743c871ecc76a504a32672fd84526d861", + "wx" : "24a0bc4d16dbbd40d2fd81a7c3f8d8ec741607d5bb406a0611cc60d0e683bd46", + "wy" : "00b575cad039c15f7f3dffcfc007b4b0f743c871ecc76a504a32672fd84526d861" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000424a0bc4d16dbbd40d2fd81a7c3f8d8ec741607d5bb406a0611cc60d0e683bd46b575cad039c15f7f3dffcfc007b4b0f743c871ecc76a504a32672fd84526d861", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEJKC8TRbbvUDS/YGnw/jY7HQWB9W7\nQGoGEcxg0OaDvUa1dcrQOcFffz3/z8AHtLD3Q8hx7MdqUEoyZy/YRSbYYQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 381, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022013d22b06d6b8f5d97e0c64962b4a3bae30f668ca6217ef5b35d799f159e23ebe", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04d24dd06745cafb39186d22a92aa0e58169a79ab69488628a9da5ed3ef747269b7e9209d98faeb95355948adae61d5291c6015d3ee9513486d886fb05cbd25c6a", + "wx" : "00d24dd06745cafb39186d22a92aa0e58169a79ab69488628a9da5ed3ef747269b", + "wy" : "7e9209d98faeb95355948adae61d5291c6015d3ee9513486d886fb05cbd25c6a" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d24dd06745cafb39186d22a92aa0e58169a79ab69488628a9da5ed3ef747269b7e9209d98faeb95355948adae61d5291c6015d3ee9513486d886fb05cbd25c6a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE0k3QZ0XK+zkYbSKpKqDlgWmnmraU\niGKKnaXtPvdHJpt+kgnZj665U1WUitrmHVKRxgFdPulRNIbYhvsFy9Jcag==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 382, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002204523ce342e4994bb8968bf6613f60c06c86111f15a3a389309e72cd447d5dd99", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "048200f148e7eab1581bcd1e23946f8a9b8191d9641f9560341721f9d3fec3d63ece795669e0481e035de8623d716a6984d0a4809d6c65519443ee55260f7f3dcb", + "wx" : "008200f148e7eab1581bcd1e23946f8a9b8191d9641f9560341721f9d3fec3d63e", + "wy" : "00ce795669e0481e035de8623d716a6984d0a4809d6c65519443ee55260f7f3dcb" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048200f148e7eab1581bcd1e23946f8a9b8191d9641f9560341721f9d3fec3d63ece795669e0481e035de8623d716a6984d0a4809d6c65519443ee55260f7f3dcb", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEggDxSOfqsVgbzR4jlG+Km4GR2WQf\nlWA0FyH50/7D1j7OeVZp4EgeA13oYj1xammE0KSAnWxlUZRD7lUmD389yw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 383, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022037d765be3c9c78189ad30edb5097a4db670de11686d01420e37039d4677f4809", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04a8a69c5ed33b150ce8d37ac197070ed894c05d47258a80c9041d92486622024de85997c9666b60a393568efede8f4ca0167c1e10f626e62fc1b8c8e9c6ba6ed7", + "wx" : "00a8a69c5ed33b150ce8d37ac197070ed894c05d47258a80c9041d92486622024d", + "wy" : "00e85997c9666b60a393568efede8f4ca0167c1e10f626e62fc1b8c8e9c6ba6ed7" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a8a69c5ed33b150ce8d37ac197070ed894c05d47258a80c9041d92486622024de85997c9666b60a393568efede8f4ca0167c1e10f626e62fc1b8c8e9c6ba6ed7", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEqKacXtM7FQzo03rBlwcO2JTAXUcl\nioDJBB2SSGYiAk3oWZfJZmtgo5NWjv7ej0ygFnweEPYm5i/BuMjpxrpu1w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 384, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022044237823b54e0c74c2bf5f759d9ac5f8cb897d537ffa92effd4f0bb6c9acd860", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04ed0587e75b3b9a1dd0794f41d1729fcd432b2436cbf51c230d8bc7273273181735a57f09c7873d3964aa8102c9e25fa53070cd924cb7e3a459174740b8b71c34", + "wx" : "00ed0587e75b3b9a1dd0794f41d1729fcd432b2436cbf51c230d8bc72732731817", + "wy" : "35a57f09c7873d3964aa8102c9e25fa53070cd924cb7e3a459174740b8b71c34" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ed0587e75b3b9a1dd0794f41d1729fcd432b2436cbf51c230d8bc7273273181735a57f09c7873d3964aa8102c9e25fa53070cd924cb7e3a459174740b8b71c34", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE7QWH51s7mh3QeU9B0XKfzUMrJDbL\n9RwjDYvHJzJzGBc1pX8Jx4c9OWSqgQLJ4l+lMHDNkky346RZF0dAuLccNA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 385, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220266d30a485385906054ca86d46f5f2b17e7f4646a3092092ad92877126538111", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04077091d99004a99ee08224e59a46a70495e6fba4eff681c3ce42127e588681ef4f1c16c77dfa440dde18245c9de76243d8f2fd9dea3f2782d6c04974d02f25dc", + "wx" : "077091d99004a99ee08224e59a46a70495e6fba4eff681c3ce42127e588681ef", + "wy" : "4f1c16c77dfa440dde18245c9de76243d8f2fd9dea3f2782d6c04974d02f25dc" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004077091d99004a99ee08224e59a46a70495e6fba4eff681c3ce42127e588681ef4f1c16c77dfa440dde18245c9de76243d8f2fd9dea3f2782d6c04974d02f25dc", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEB3CR2ZAEqZ7ggiTlmkanBJXm+6Tv\n9oHDzkISfliGge9PHBbHffpEDd4YJFyd52JD2PL9neo/J4LWwEl00C8l3A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 386, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220538c7b3798e84d0ce90340165806348971ed44db8f0c674f5f215968390f92ee", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04616a8b8e57d82c11678f5827911024cd23a16cb52a65f230fb554a7b110c35a5bb466660be5cab3e4b587c12b45bd998bd56c7d66c2f94d03a1a6d2028d8a154", + "wx" : "616a8b8e57d82c11678f5827911024cd23a16cb52a65f230fb554a7b110c35a5", + "wy" : "00bb466660be5cab3e4b587c12b45bd998bd56c7d66c2f94d03a1a6d2028d8a154" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004616a8b8e57d82c11678f5827911024cd23a16cb52a65f230fb554a7b110c35a5bb466660be5cab3e4b587c12b45bd998bd56c7d66c2f94d03a1a6d2028d8a154", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYWqLjlfYLBFnj1gnkRAkzSOhbLUq\nZfIw+1VKexEMNaW7RmZgvlyrPktYfBK0W9mYvVbH1mwvlNA6Gm0gKNihVA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 387, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002206fef0ef15d1688e15e704c4e6bb8bb7f40d52d3af5c661bb78c4ed9b408699b3", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0471dc92b2b1baa7612c4a53427a0d2dfe548fa9cf829bb6b248f736a5eb30b513f91c7dff1144cb36057c2b859f35bd666a7961833b06de0f45159fbae208e326", + "wx" : "71dc92b2b1baa7612c4a53427a0d2dfe548fa9cf829bb6b248f736a5eb30b513", + "wy" : "00f91c7dff1144cb36057c2b859f35bd666a7961833b06de0f45159fbae208e326" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000471dc92b2b1baa7612c4a53427a0d2dfe548fa9cf829bb6b248f736a5eb30b513f91c7dff1144cb36057c2b859f35bd666a7961833b06de0f45159fbae208e326", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEcdySsrG6p2EsSlNCeg0t/lSPqc+C\nm7aySPc2peswtRP5HH3/EUTLNgV8K4WfNb1manlhgzsG3g9FFZ+64gjjJg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 388, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002206f44275e9aeb1331efcb8d58f35c0252791427e403ad84daad51d247cc2a64c6", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04662f43ae614bd9c90ff3fcded25cf0ef186b6967a47aa6aa7ae7f396594df931f5f94a525edd50d3738f7a28d03d7a2a70095c8f89de9bb2c645fea8d8bac9e0", + "wx" : "662f43ae614bd9c90ff3fcded25cf0ef186b6967a47aa6aa7ae7f396594df931", + "wy" : "00f5f94a525edd50d3738f7a28d03d7a2a70095c8f89de9bb2c645fea8d8bac9e0" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004662f43ae614bd9c90ff3fcded25cf0ef186b6967a47aa6aa7ae7f396594df931f5f94a525edd50d3738f7a28d03d7a2a70095c8f89de9bb2c645fea8d8bac9e0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEZi9DrmFL2ckP8/ze0lzw7xhraWek\neqaqeufzlllN+TH1+UpSXt1Q03OPeijQPXoqcAlcj4nem7LGRf6o2LrJ4A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 389, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022021323755b103d2f9da6ab83eccab9ad8598bcf625652f10e7a3eeee3c3945fb3", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04dff107959bd2f7386497a5624430a0ab35e552c1a4e4dc9c298caeb96353170dcb5065d7947a676c76287ca8e430324f8a534b0ba6f21200e033c4b88852a3cc", + "wx" : "00dff107959bd2f7386497a5624430a0ab35e552c1a4e4dc9c298caeb96353170d", + "wy" : "00cb5065d7947a676c76287ca8e430324f8a534b0ba6f21200e033c4b88852a3cc" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004dff107959bd2f7386497a5624430a0ab35e552c1a4e4dc9c298caeb96353170dcb5065d7947a676c76287ca8e430324f8a534b0ba6f21200e033c4b88852a3cc", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE3/EHlZvS9zhkl6ViRDCgqzXlUsGk\n5NycKYyuuWNTFw3LUGXXlHpnbHYofKjkMDJPilNLC6byEgDgM8S4iFKjzA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 390, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002206c50acfe76de1289e7a5edb240f1c2a7879db6873d5d931f3c6ac467a6eac171", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04bd0862b0bfba85036922e06f5458754aafc3075b603a814b3ac75659bf24d7528258a607ffca2cfe05a300cb4c3c4e1963bbb1bc54d320e16969f85aad243385", + "wx" : "00bd0862b0bfba85036922e06f5458754aafc3075b603a814b3ac75659bf24d752", + "wy" : "008258a607ffca2cfe05a300cb4c3c4e1963bbb1bc54d320e16969f85aad243385" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004bd0862b0bfba85036922e06f5458754aafc3075b603a814b3ac75659bf24d7528258a607ffca2cfe05a300cb4c3c4e1963bbb1bc54d320e16969f85aad243385", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvQhisL+6hQNpIuBvVFh1Sq/DB1tg\nOoFLOsdWWb8k11KCWKYH/8os/gWjAMtMPE4ZY7uxvFTTIOFpafharSQzhQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 391, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220755b7fffb0b17ad57dca50fcefb7fe297b029df25e5ccb5069e8e70c2742c2a6", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04b533d4695dd5b8c5e07757e55e6e516f7e2c88fa0239e23f60e8ec07dd70f2871b134ee58cc583278456863f33c3a85d881f7d4a39850143e29d4eaf009afe47", + "wx" : "00b533d4695dd5b8c5e07757e55e6e516f7e2c88fa0239e23f60e8ec07dd70f287", + "wy" : "1b134ee58cc583278456863f33c3a85d881f7d4a39850143e29d4eaf009afe47" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b533d4695dd5b8c5e07757e55e6e516f7e2c88fa0239e23f60e8ec07dd70f2871b134ee58cc583278456863f33c3a85d881f7d4a39850143e29d4eaf009afe47", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEtTPUaV3VuMXgd1flXm5Rb34siPoC\nOeI/YOjsB91w8ocbE07ljMWDJ4RWhj8zw6hdiB99SjmFAUPinU6vAJr+Rw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 392, + "comment" : "point at infinity during verify", + "flags" : [ + "PointDuplication", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a80220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04f50d371b91bfb1d7d14e1323523bc3aa8cbf2c57f9e284de628c8b4536787b86f94ad887ac94d527247cd2e7d0c8b1291c553c9730405380b14cbb209f5fa2dd", + "wx" : "00f50d371b91bfb1d7d14e1323523bc3aa8cbf2c57f9e284de628c8b4536787b86", + "wy" : "00f94ad887ac94d527247cd2e7d0c8b1291c553c9730405380b14cbb209f5fa2dd" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004f50d371b91bfb1d7d14e1323523bc3aa8cbf2c57f9e284de628c8b4536787b86f94ad887ac94d527247cd2e7d0c8b1291c553c9730405380b14cbb209f5fa2dd", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE9Q03G5G/sdfRThMjUjvDqoy/LFf5\n4oTeYoyLRTZ4e4b5StiHrJTVJyR80ufQyLEpHFU8lzBAU4CxTLsgn1+i3Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 393, + "comment" : "edge case for signature malleability", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a902207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a8", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0468ec6e298eafe16539156ce57a14b04a7047c221bafc3a582eaeb0d857c4d94697bed1af17850117fdb39b2324f220a5698ed16c426a27335bb385ac8ca6fb30", + "wx" : "68ec6e298eafe16539156ce57a14b04a7047c221bafc3a582eaeb0d857c4d946", + "wy" : "0097bed1af17850117fdb39b2324f220a5698ed16c426a27335bb385ac8ca6fb30" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000468ec6e298eafe16539156ce57a14b04a7047c221bafc3a582eaeb0d857c4d94697bed1af17850117fdb39b2324f220a5698ed16c426a27335bb385ac8ca6fb30", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaOxuKY6v4WU5FWzlehSwSnBHwiG6\n/DpYLq6w2FfE2UaXvtGvF4UBF/2zmyMk8iClaY7RbEJqJzNbs4WsjKb7MA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 394, + "comment" : "edge case for signature malleability", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a902207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0469da0364734d2e530fece94019265fefb781a0f1b08f6c8897bdf6557927c8b866d2d3c7dcd518b23d726960f069ad71a933d86ef8abbcce8b20f71e2a847002", + "wx" : "69da0364734d2e530fece94019265fefb781a0f1b08f6c8897bdf6557927c8b8", + "wy" : "66d2d3c7dcd518b23d726960f069ad71a933d86ef8abbcce8b20f71e2a847002" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000469da0364734d2e530fece94019265fefb781a0f1b08f6c8897bdf6557927c8b866d2d3c7dcd518b23d726960f069ad71a933d86ef8abbcce8b20f71e2a847002", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEadoDZHNNLlMP7OlAGSZf77eBoPGw\nj2yIl732VXknyLhm0tPH3NUYsj1yaWDwaa1xqTPYbvirvM6LIPceKoRwAg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 395, + "comment" : "u1 == 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30450220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04d8adc00023a8edc02576e2b63e3e30621a471e2b2320620187bf067a1ac1ff3233e2b50ec09807accb36131fff95ed12a09a86b4ea9690aa32861576ba2362e1", + "wx" : "00d8adc00023a8edc02576e2b63e3e30621a471e2b2320620187bf067a1ac1ff32", + "wy" : "33e2b50ec09807accb36131fff95ed12a09a86b4ea9690aa32861576ba2362e1" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d8adc00023a8edc02576e2b63e3e30621a471e2b2320620187bf067a1ac1ff3233e2b50ec09807accb36131fff95ed12a09a86b4ea9690aa32861576ba2362e1", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE2K3AACOo7cAlduK2Pj4wYhpHHisj\nIGIBh78GehrB/zIz4rUOwJgHrMs2Ex//le0SoJqGtOqWkKoyhhV2uiNi4Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 396, + "comment" : "u1 == n - 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022044a5ad0ad0636d9f12bc9e0a6bdd5e1cbcb012ea7bf091fcec15b0c43202d52e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "043623ac973ced0a56fa6d882f03a7d5c7edca02cfc7b2401fab3690dbe75ab7858db06908e64b28613da7257e737f39793da8e713ba0643b92e9bb3252be7f8fe", + "wx" : "3623ac973ced0a56fa6d882f03a7d5c7edca02cfc7b2401fab3690dbe75ab785", + "wy" : "008db06908e64b28613da7257e737f39793da8e713ba0643b92e9bb3252be7f8fe" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043623ac973ced0a56fa6d882f03a7d5c7edca02cfc7b2401fab3690dbe75ab7858db06908e64b28613da7257e737f39793da8e713ba0643b92e9bb3252be7f8fe", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENiOslzztClb6bYgvA6fVx+3KAs/H\nskAfqzaQ2+dat4WNsGkI5ksoYT2nJX5zfzl5PajnE7oGQ7kum7MlK+f4/g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 397, + "comment" : "u2 == 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04cf04ea77e9622523d894b93ff52dc3027b31959503b6fa3890e5e04263f922f1e8528fb7c006b3983c8b8400e57b4ed71740c2f3975438821199bedeaecab2e9", + "wx" : "00cf04ea77e9622523d894b93ff52dc3027b31959503b6fa3890e5e04263f922f1", + "wy" : "00e8528fb7c006b3983c8b8400e57b4ed71740c2f3975438821199bedeaecab2e9" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cf04ea77e9622523d894b93ff52dc3027b31959503b6fa3890e5e04263f922f1e8528fb7c006b3983c8b8400e57b4ed71740c2f3975438821199bedeaecab2e9", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzwTqd+liJSPYlLk/9S3DAnsxlZUD\ntvo4kOXgQmP5IvHoUo+3wAazmDyLhADle07XF0DC85dUOIIRmb7ersqy6Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 398, + "comment" : "u2 == n - 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30450220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022100aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04db7a2c8a1ab573e5929dc24077b508d7e683d49227996bda3e9f78dbeff773504f417f3bc9a88075c2e0aadd5a13311730cf7cc76a82f11a36eaf08a6c99a206", + "wx" : "00db7a2c8a1ab573e5929dc24077b508d7e683d49227996bda3e9f78dbeff77350", + "wy" : "4f417f3bc9a88075c2e0aadd5a13311730cf7cc76a82f11a36eaf08a6c99a206" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004db7a2c8a1ab573e5929dc24077b508d7e683d49227996bda3e9f78dbeff773504f417f3bc9a88075c2e0aadd5a13311730cf7cc76a82f11a36eaf08a6c99a206", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE23osihq1c+WSncJAd7UI1+aD1JIn\nmWvaPp942+/3c1BPQX87yaiAdcLgqt1aEzEXMM98x2qC8Ro26vCKbJmiBg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 399, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100e91e1ba60fdedb76a46bcb51dc0b8b4b7e019f0a28721885fa5d3a8196623397", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04dead11c7a5b396862f21974dc4752fadeff994efe9bbd05ab413765ea80b6e1f1de3f0640e8ac6edcf89cff53c40e265bb94078a343736df07aa0318fc7fe1ff", + "wx" : "00dead11c7a5b396862f21974dc4752fadeff994efe9bbd05ab413765ea80b6e1f", + "wy" : "1de3f0640e8ac6edcf89cff53c40e265bb94078a343736df07aa0318fc7fe1ff" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004dead11c7a5b396862f21974dc4752fadeff994efe9bbd05ab413765ea80b6e1f1de3f0640e8ac6edcf89cff53c40e265bb94078a343736df07aa0318fc7fe1ff", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE3q0Rx6WzloYvIZdNxHUvre/5lO/p\nu9BatBN2XqgLbh8d4/BkDorG7c+Jz/U8QOJlu5QHijQ3Nt8HqgMY/H/h/w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 400, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100fdea5843ffeb73af94313ba4831b53fe24f799e525b1e8e8c87b59b95b430ad9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04d0bc472e0d7c81ebaed3a6ef96c18613bb1fea6f994326fbe80e00dfde67c7e9986c723ea4843d48389b946f64ad56c83ad70ff17ba85335667d1bb9fa619efd", + "wx" : "00d0bc472e0d7c81ebaed3a6ef96c18613bb1fea6f994326fbe80e00dfde67c7e9", + "wy" : "00986c723ea4843d48389b946f64ad56c83ad70ff17ba85335667d1bb9fa619efd" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d0bc472e0d7c81ebaed3a6ef96c18613bb1fea6f994326fbe80e00dfde67c7e9986c723ea4843d48389b946f64ad56c83ad70ff17ba85335667d1bb9fa619efd", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE0LxHLg18geuu06bvlsGGE7sf6m+Z\nQyb76A4A395nx+mYbHI+pIQ9SDiblG9krVbIOtcP8XuoUzVmfRu5+mGe/Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 401, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022003ffcabf2f1b4d2a65190db1680d62bb994e41c5251cd73b3c3dfc5e5bafc035", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04a0a44ca947d66a2acb736008b9c08d1ab2ad03776e02640f78495d458dd51c326337fe5cf8c4604b1f1c409dc2d872d4294a4762420df43a30a2392e40426add", + "wx" : "00a0a44ca947d66a2acb736008b9c08d1ab2ad03776e02640f78495d458dd51c32", + "wy" : "6337fe5cf8c4604b1f1c409dc2d872d4294a4762420df43a30a2392e40426add" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a0a44ca947d66a2acb736008b9c08d1ab2ad03776e02640f78495d458dd51c326337fe5cf8c4604b1f1c409dc2d872d4294a4762420df43a30a2392e40426add", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEoKRMqUfWairLc2AIucCNGrKtA3du\nAmQPeEldRY3VHDJjN/5c+MRgSx8cQJ3C2HLUKUpHYkIN9DowojkuQEJq3Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 402, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02204dfbc401f971cd304b33dfdb17d0fed0fe4c1a88ae648e0d2847f74977534989", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04c9c2115290d008b45fb65fad0f602389298c25420b775019d42b62c3ce8a96b73877d25a8080dc02d987ca730f0405c2c9dbefac46f9e601cc3f06e9713973fd", + "wx" : "00c9c2115290d008b45fb65fad0f602389298c25420b775019d42b62c3ce8a96b7", + "wy" : "3877d25a8080dc02d987ca730f0405c2c9dbefac46f9e601cc3f06e9713973fd" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004c9c2115290d008b45fb65fad0f602389298c25420b775019d42b62c3ce8a96b73877d25a8080dc02d987ca730f0405c2c9dbefac46f9e601cc3f06e9713973fd", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEycIRUpDQCLRftl+tD2AjiSmMJUIL\nd1AZ1Ctiw86Klrc4d9JagIDcAtmHynMPBAXCydvvrEb55gHMPwbpcTlz/Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 403, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bc4024761cd2ffd43dfdb17d0fed112b988977055cd3a8e54971eba9cda5ca71", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "045eca1ef4c287dddc66b8bccf1b88e8a24c0018962f3c5e7efa83bc1a5ff6033e5e79c4cb2c245b8c45abdce8a8e4da758d92a607c32cd407ecaef22f1c934a71", + "wx" : "5eca1ef4c287dddc66b8bccf1b88e8a24c0018962f3c5e7efa83bc1a5ff6033e", + "wy" : "5e79c4cb2c245b8c45abdce8a8e4da758d92a607c32cd407ecaef22f1c934a71" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045eca1ef4c287dddc66b8bccf1b88e8a24c0018962f3c5e7efa83bc1a5ff6033e5e79c4cb2c245b8c45abdce8a8e4da758d92a607c32cd407ecaef22f1c934a71", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEXsoe9MKH3dxmuLzPG4jookwAGJYv\nPF5++oO8Gl/2Az5eecTLLCRbjEWr3Oio5Np1jZKmB8Ms1AfsrvIvHJNKcQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 404, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220788048ed39a5ffa77bfb62fa1fda2257742bf35d128fb3459f2a0c909ee86f91", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "045caaa030e7fdf0e4936bc7ab5a96353e0a01e4130c3f8bf22d473e317029a47adeb6adc462f7058f2a20d371e9702254e9b201642005b3ceda926b42b178bef9", + "wx" : "5caaa030e7fdf0e4936bc7ab5a96353e0a01e4130c3f8bf22d473e317029a47a", + "wy" : "00deb6adc462f7058f2a20d371e9702254e9b201642005b3ceda926b42b178bef9" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045caaa030e7fdf0e4936bc7ab5a96353e0a01e4130c3f8bf22d473e317029a47adeb6adc462f7058f2a20d371e9702254e9b201642005b3ceda926b42b178bef9", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEXKqgMOf98OSTa8erWpY1PgoB5BMM\nP4vyLUc+MXAppHretq3EYvcFjyog03HpcCJU6bIBZCAFs87akmtCsXi++Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 405, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220476d9131fd381bd917d0fed112bc9e0a5924b5ed5b11167edd8b23582b3cb15e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04c2fd20bac06e555bb8ac0ce69eb1ea20f83a1fc3501c8a66469b1a31f619b0986237050779f52b615bd7b8d76a25fc95ca2ed32525c75f27ffc87ac397e6cbaf", + "wx" : "00c2fd20bac06e555bb8ac0ce69eb1ea20f83a1fc3501c8a66469b1a31f619b098", + "wy" : "6237050779f52b615bd7b8d76a25fc95ca2ed32525c75f27ffc87ac397e6cbaf" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004c2fd20bac06e555bb8ac0ce69eb1ea20f83a1fc3501c8a66469b1a31f619b0986237050779f52b615bd7b8d76a25fc95ca2ed32525c75f27ffc87ac397e6cbaf", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwv0gusBuVVu4rAzmnrHqIPg6H8NQ\nHIpmRpsaMfYZsJhiNwUHefUrYVvXuNdqJfyVyi7TJSXHXyf/yHrDl+bLrw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 406, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0221008374253e3e21bd154448d0a8f640fe46fafa8b19ce78d538f6cc0a19662d3601", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "043fd6a1ca7f77fb3b0bbe726c372010068426e11ea6ae78ce17bedae4bba86ced03ce5516406bf8cfaab8745eac1cd69018ad6f50b5461872ddfc56e0db3c8ff4", + "wx" : "3fd6a1ca7f77fb3b0bbe726c372010068426e11ea6ae78ce17bedae4bba86ced", + "wy" : "03ce5516406bf8cfaab8745eac1cd69018ad6f50b5461872ddfc56e0db3c8ff4" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043fd6a1ca7f77fb3b0bbe726c372010068426e11ea6ae78ce17bedae4bba86ced03ce5516406bf8cfaab8745eac1cd69018ad6f50b5461872ddfc56e0db3c8ff4", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEP9ahyn93+zsLvnJsNyAQBoQm4R6m\nrnjOF77a5LuobO0DzlUWQGv4z6q4dF6sHNaQGK1vULVGGHLd/Fbg2zyP9A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 407, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220357cfd3be4d01d413c5b9ede36cba5452c11ee7fe14879e749ae6a2d897a52d6", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "049cb8e51e27a5ae3b624a60d6dc32734e4989db20e9bca3ede1edf7b086911114b4c104ab3c677e4b36d6556e8ad5f523410a19f2e277aa895fc57322b4427544", + "wx" : "009cb8e51e27a5ae3b624a60d6dc32734e4989db20e9bca3ede1edf7b086911114", + "wy" : "00b4c104ab3c677e4b36d6556e8ad5f523410a19f2e277aa895fc57322b4427544" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200049cb8e51e27a5ae3b624a60d6dc32734e4989db20e9bca3ede1edf7b086911114b4c104ab3c677e4b36d6556e8ad5f523410a19f2e277aa895fc57322b4427544", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEnLjlHielrjtiSmDW3DJzTkmJ2yDp\nvKPt4e33sIaRERS0wQSrPGd+SzbWVW6K1fUjQQoZ8uJ3qolfxXMitEJ1RA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 408, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022029798c5c0ee287d4a5e8e6b799fd86b8df5225298e6ffc807cd2f2bc27a0a6d8", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04a3e52c156dcaf10502620b7955bc2b40bc78ef3d569e1223c262512d8f49602a4a2039f31c1097024ad3cc86e57321de032355463486164cf192944977df147f", + "wx" : "00a3e52c156dcaf10502620b7955bc2b40bc78ef3d569e1223c262512d8f49602a", + "wy" : "4a2039f31c1097024ad3cc86e57321de032355463486164cf192944977df147f" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a3e52c156dcaf10502620b7955bc2b40bc78ef3d569e1223c262512d8f49602a4a2039f31c1097024ad3cc86e57321de032355463486164cf192944977df147f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEo+UsFW3K8QUCYgt5VbwrQLx47z1W\nnhIjwmJRLY9JYCpKIDnzHBCXAkrTzIblcyHeAyNVRjSGFkzxkpRJd98Ufw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 409, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02200b70f22c781092452dca1a5711fa3a5a1f72add1bf52c2ff7cae4820b30078dd", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04f19b78928720d5bee8e670fb90010fb15c37bf91b58a5157c3f3c059b2655e88cf701ec962fb4a11dcf273f5dc357e58468560c7cfeb942d074abd4329260509", + "wx" : "00f19b78928720d5bee8e670fb90010fb15c37bf91b58a5157c3f3c059b2655e88", + "wy" : "00cf701ec962fb4a11dcf273f5dc357e58468560c7cfeb942d074abd4329260509" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004f19b78928720d5bee8e670fb90010fb15c37bf91b58a5157c3f3c059b2655e88cf701ec962fb4a11dcf273f5dc357e58468560c7cfeb942d074abd4329260509", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE8Zt4kocg1b7o5nD7kAEPsVw3v5G1\nilFXw/PAWbJlXojPcB7JYvtKEdzyc/XcNX5YRoVgx8/rlC0HSr1DKSYFCQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 410, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022016e1e458f021248a5b9434ae23f474b43ee55ba37ea585fef95c90416600f1ba", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0483a744459ecdfb01a5cf52b27a05bb7337482d242f235d7b4cb89345545c90a8c05d49337b9649813287de9ffe90355fd905df5f3c32945828121f37cc50de6e", + "wx" : "0083a744459ecdfb01a5cf52b27a05bb7337482d242f235d7b4cb89345545c90a8", + "wy" : "00c05d49337b9649813287de9ffe90355fd905df5f3c32945828121f37cc50de6e" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000483a744459ecdfb01a5cf52b27a05bb7337482d242f235d7b4cb89345545c90a8c05d49337b9649813287de9ffe90355fd905df5f3c32945828121f37cc50de6e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEg6dERZ7N+wGlz1KyegW7czdILSQv\nI117TLiTRVRckKjAXUkze5ZJgTKH3p/+kDVf2QXfXzwylFgoEh83zFDebg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 411, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02202252d6856831b6cf895e4f0535eeaf0e5e5809753df848fe760ad86219016a97", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04dd13c6b34c56982ddae124f039dfd23f4b19bbe88cee8e528ae51e5d6f3a21d7bfad4c2e6f263fe5eb59ca974d039fc0e4c3345692fb5320bdae4bd3b42a45ff", + "wx" : "00dd13c6b34c56982ddae124f039dfd23f4b19bbe88cee8e528ae51e5d6f3a21d7", + "wy" : "00bfad4c2e6f263fe5eb59ca974d039fc0e4c3345692fb5320bdae4bd3b42a45ff" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004dd13c6b34c56982ddae124f039dfd23f4b19bbe88cee8e528ae51e5d6f3a21d7bfad4c2e6f263fe5eb59ca974d039fc0e4c3345692fb5320bdae4bd3b42a45ff", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE3RPGs0xWmC3a4STwOd/SP0sZu+iM\n7o5SiuUeXW86Ide/rUwubyY/5etZypdNA5/A5MM0VpL7UyC9rkvTtCpF/w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 412, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02210081ffe55f178da695b28c86d8b406b15dab1a9e39661a3ae017fbe390ac0972c3", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0467e6f659cdde869a2f65f094e94e5b4dfad636bbf95192feeed01b0f3deb7460a37e0a51f258b7aeb51dfe592f5cfd5685bbe58712c8d9233c62886437c38ba0", + "wx" : "67e6f659cdde869a2f65f094e94e5b4dfad636bbf95192feeed01b0f3deb7460", + "wy" : "00a37e0a51f258b7aeb51dfe592f5cfd5685bbe58712c8d9233c62886437c38ba0" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000467e6f659cdde869a2f65f094e94e5b4dfad636bbf95192feeed01b0f3deb7460a37e0a51f258b7aeb51dfe592f5cfd5685bbe58712c8d9233c62886437c38ba0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEZ+b2Wc3ehpovZfCU6U5bTfrWNrv5\nUZL+7tAbDz3rdGCjfgpR8li3rrUd/lkvXP1WhbvlhxLI2SM8YohkN8OLoA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 413, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207fffffffaaaaaaaaffffffffffffffffe9a2538f37b28a2c513dee40fecbb71a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042eb6412505aec05c6545f029932087e490d05511e8ec1f599617bb367f9ecaaf805f51efcc4803403f9b1ae0124890f06a43fedcddb31830f6669af292895cb0", + "wx" : "2eb6412505aec05c6545f029932087e490d05511e8ec1f599617bb367f9ecaaf", + "wy" : "00805f51efcc4803403f9b1ae0124890f06a43fedcddb31830f6669af292895cb0" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042eb6412505aec05c6545f029932087e490d05511e8ec1f599617bb367f9ecaaf805f51efcc4803403f9b1ae0124890f06a43fedcddb31830f6669af292895cb0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAELrZBJQWuwFxlRfApkyCH5JDQVRHo\n7B9Zlhe7Nn+eyq+AX1HvzEgDQD+bGuASSJDwakP+3N2zGDD2ZprykolcsA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 414, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100b62f26b5f2a2b26f6de86d42ad8a13da3ab3cccd0459b201de009e526adf21f2", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0484db645868eab35e3a9fd80e056e2e855435e3a6b68d75a50a854625fe0d7f356d2589ac655edc9a11ef3e075eddda9abf92e72171570ef7bf43a2ee39338cfe", + "wx" : "0084db645868eab35e3a9fd80e056e2e855435e3a6b68d75a50a854625fe0d7f35", + "wy" : "6d2589ac655edc9a11ef3e075eddda9abf92e72171570ef7bf43a2ee39338cfe" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000484db645868eab35e3a9fd80e056e2e855435e3a6b68d75a50a854625fe0d7f356d2589ac655edc9a11ef3e075eddda9abf92e72171570ef7bf43a2ee39338cfe", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhNtkWGjqs146n9gOBW4uhVQ146a2\njXWlCoVGJf4NfzVtJYmsZV7cmhHvPgde3dqav5LnIXFXDve/Q6LuOTOM/g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 415, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bb1d9ac949dd748cd02bbbe749bd351cd57b38bb61403d700686aa7b4c90851e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0491b9e47c56278662d75c0983b22ca8ea6aa5059b7a2ff7637eb2975e386ad66349aa8ff283d0f77c18d6d11dc062165fd13c3c0310679c1408302a16854ecfbd", + "wx" : "0091b9e47c56278662d75c0983b22ca8ea6aa5059b7a2ff7637eb2975e386ad663", + "wy" : "49aa8ff283d0f77c18d6d11dc062165fd13c3c0310679c1408302a16854ecfbd" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000491b9e47c56278662d75c0983b22ca8ea6aa5059b7a2ff7637eb2975e386ad66349aa8ff283d0f77c18d6d11dc062165fd13c3c0310679c1408302a16854ecfbd", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEkbnkfFYnhmLXXAmDsiyo6mqlBZt6\nL/djfrKXXjhq1mNJqo/yg9D3fBjW0R3AYhZf0Tw8AxBnnBQIMCoWhU7PvQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 416, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022066755a00638cdaec1c732513ca0234ece52545dac11f816e818f725b4f60aaf2", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04f3ec2f13caf04d0192b47fb4c5311fb6d4dc6b0a9e802e5327f7ec5ee8e4834df97e3e468b7d0db867d6ecfe81e2b0f9531df87efdb47c1338ac321fefe5a432", + "wx" : "00f3ec2f13caf04d0192b47fb4c5311fb6d4dc6b0a9e802e5327f7ec5ee8e4834d", + "wy" : "00f97e3e468b7d0db867d6ecfe81e2b0f9531df87efdb47c1338ac321fefe5a432" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004f3ec2f13caf04d0192b47fb4c5311fb6d4dc6b0a9e802e5327f7ec5ee8e4834df97e3e468b7d0db867d6ecfe81e2b0f9531df87efdb47c1338ac321fefe5a432", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE8+wvE8rwTQGStH+0xTEfttTcawqe\ngC5TJ/fsXujkg035fj5Gi30NuGfW7P6B4rD5Ux34fv20fBM4rDIf7+WkMg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 417, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022055a00c9fcdaebb6032513ca0234ecfffe98ebe492fdf02e48ca48e982beb3669", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04d92b200aefcab6ac7dafd9acaf2fa10b3180235b8f46b4503e4693c670fccc885ef2f3aebf5b317475336256768f7c19efb7352d27e4cccadc85b6b8ab922c72", + "wx" : "00d92b200aefcab6ac7dafd9acaf2fa10b3180235b8f46b4503e4693c670fccc88", + "wy" : "5ef2f3aebf5b317475336256768f7c19efb7352d27e4cccadc85b6b8ab922c72" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d92b200aefcab6ac7dafd9acaf2fa10b3180235b8f46b4503e4693c670fccc885ef2f3aebf5b317475336256768f7c19efb7352d27e4cccadc85b6b8ab922c72", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE2SsgCu/Ktqx9r9msry+hCzGAI1uP\nRrRQPkaTxnD8zIhe8vOuv1sxdHUzYlZ2j3wZ77c1LSfkzMrchba4q5Iscg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 418, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ab40193f9b5d76c064a27940469d9fffd31d7c925fbe05c919491d3057d66cd2", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "040a88361eb92ecca2625b38e5f98bbabb96bf179b3d76fc48140a3bcd881523cde6bdf56033f84a5054035597375d90866aa2c96b86a41ccf6edebf47298ad489", + "wx" : "0a88361eb92ecca2625b38e5f98bbabb96bf179b3d76fc48140a3bcd881523cd", + "wy" : "00e6bdf56033f84a5054035597375d90866aa2c96b86a41ccf6edebf47298ad489" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040a88361eb92ecca2625b38e5f98bbabb96bf179b3d76fc48140a3bcd881523cde6bdf56033f84a5054035597375d90866aa2c96b86a41ccf6edebf47298ad489", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECog2HrkuzKJiWzjl+Yu6u5a/F5s9\ndvxIFAo7zYgVI83mvfVgM/hKUFQDVZc3XZCGaqLJa4akHM9u3r9HKYrUiQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 419, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ca0234ebb5fdcb13ca0234ecffffffffcb0dadbbc7f549f8a26b4408d0dc8600", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04d0fb17ccd8fafe827e0c1afc5d8d80366e2b20e7f14a563a2ba50469d84375e868612569d39e2bb9f554355564646de99ac602cc6349cf8c1e236a7de7637d93", + "wx" : "00d0fb17ccd8fafe827e0c1afc5d8d80366e2b20e7f14a563a2ba50469d84375e8", + "wy" : "68612569d39e2bb9f554355564646de99ac602cc6349cf8c1e236a7de7637d93" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d0fb17ccd8fafe827e0c1afc5d8d80366e2b20e7f14a563a2ba50469d84375e868612569d39e2bb9f554355564646de99ac602cc6349cf8c1e236a7de7637d93", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE0PsXzNj6/oJ+DBr8XY2ANm4rIOfx\nSlY6K6UEadhDdehoYSVp054rufVUNVVkZG3pmsYCzGNJz4weI2p952N9kw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 420, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff3ea3677e082b9310572620ae19933a9e65b285598711c77298815ad3", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04836f33bbc1dc0d3d3abbcef0d91f11e2ac4181076c9af0a22b1e4309d3edb2769ab443ff6f901e30c773867582997c2bec2b0cb8120d760236f3a95bbe881f75", + "wx" : "00836f33bbc1dc0d3d3abbcef0d91f11e2ac4181076c9af0a22b1e4309d3edb276", + "wy" : "009ab443ff6f901e30c773867582997c2bec2b0cb8120d760236f3a95bbe881f75" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004836f33bbc1dc0d3d3abbcef0d91f11e2ac4181076c9af0a22b1e4309d3edb2769ab443ff6f901e30c773867582997c2bec2b0cb8120d760236f3a95bbe881f75", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEg28zu8HcDT06u87w2R8R4qxBgQds\nmvCiKx5DCdPtsnaatEP/b5AeMMdzhnWCmXwr7CsMuBINdgI286lbvogfdQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 421, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220266666663bbbbbbbe6666666666666665b37902e023fab7c8f055d86e5cc41f4", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0492f99fbe973ed4a299719baee4b432741237034dec8d72ba5103cb33e55feeb8033dd0e91134c734174889f3ebcf1b7a1ac05767289280ee7a794cebd6e69697", + "wx" : "0092f99fbe973ed4a299719baee4b432741237034dec8d72ba5103cb33e55feeb8", + "wy" : "033dd0e91134c734174889f3ebcf1b7a1ac05767289280ee7a794cebd6e69697" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000492f99fbe973ed4a299719baee4b432741237034dec8d72ba5103cb33e55feeb8033dd0e91134c734174889f3ebcf1b7a1ac05767289280ee7a794cebd6e69697", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEkvmfvpc+1KKZcZuu5LQydBI3A03s\njXK6UQPLM+Vf7rgDPdDpETTHNBdIifPrzxt6GsBXZyiSgO56eUzr1uaWlw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 422, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff36db6db7a492492492492492146c573f4c6dfc8d08a443e258970b09", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04d35ba58da30197d378e618ec0fa7e2e2d12cffd73ebbb2049d130bba434af09eff83986e6875e41ea432b7585a49b3a6c77cbb3c47919f8e82874c794635c1d2", + "wx" : "00d35ba58da30197d378e618ec0fa7e2e2d12cffd73ebbb2049d130bba434af09e", + "wy" : "00ff83986e6875e41ea432b7585a49b3a6c77cbb3c47919f8e82874c794635c1d2" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d35ba58da30197d378e618ec0fa7e2e2d12cffd73ebbb2049d130bba434af09eff83986e6875e41ea432b7585a49b3a6c77cbb3c47919f8e82874c794635c1d2", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE01uljaMBl9N45hjsD6fi4tEs/9c+\nu7IEnRMLukNK8J7/g5huaHXkHqQyt1haSbOmx3y7PEeRn46Ch0x5RjXB0g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 423, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff2aaaaaab7fffffffffffffffc815d0e60b3e596ecb1ad3a27cfd49c4", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "048651ce490f1b46d73f3ff475149be29136697334a519d7ddab0725c8d0793224e11c65bd8ca92dc8bc9ae82911f0b52751ce21dd9003ae60900bd825f590cc28", + "wx" : "008651ce490f1b46d73f3ff475149be29136697334a519d7ddab0725c8d0793224", + "wy" : "00e11c65bd8ca92dc8bc9ae82911f0b52751ce21dd9003ae60900bd825f590cc28" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048651ce490f1b46d73f3ff475149be29136697334a519d7ddab0725c8d0793224e11c65bd8ca92dc8bc9ae82911f0b52751ce21dd9003ae60900bd825f590cc28", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhlHOSQ8bRtc/P/R1FJvikTZpczSl\nGdfdqwclyNB5MiThHGW9jKktyLya6CkR8LUnUc4h3ZADrmCQC9gl9ZDMKA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 424, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207fffffff55555555ffffffffffffffffd344a71e6f651458a27bdc81fd976e37", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "046d8e1b12c831a0da8795650ff95f101ed921d9e2f72b15b1cdaca9826b9cfc6def6d63e2bc5c089570394a4bc9f892d5e6c7a6a637b20469a58c106ad486bf37", + "wx" : "6d8e1b12c831a0da8795650ff95f101ed921d9e2f72b15b1cdaca9826b9cfc6d", + "wy" : "00ef6d63e2bc5c089570394a4bc9f892d5e6c7a6a637b20469a58c106ad486bf37" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046d8e1b12c831a0da8795650ff95f101ed921d9e2f72b15b1cdaca9826b9cfc6def6d63e2bc5c089570394a4bc9f892d5e6c7a6a637b20469a58c106ad486bf37", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEbY4bEsgxoNqHlWUP+V8QHtkh2eL3\nKxWxzaypgmuc/G3vbWPivFwIlXA5SkvJ+JLV5sempjeyBGmljBBq1Ia/Nw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 425, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02203fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192aa", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "040ae580bae933b4ef2997cbdbb0922328ca9a410f627a0f7dff24cb4d920e15428911e7f8cc365a8a88eb81421a361ccc2b99e309d8dcd9a98ba83c3949d893e3", + "wx" : "0ae580bae933b4ef2997cbdbb0922328ca9a410f627a0f7dff24cb4d920e1542", + "wy" : "008911e7f8cc365a8a88eb81421a361ccc2b99e309d8dcd9a98ba83c3949d893e3" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040ae580bae933b4ef2997cbdbb0922328ca9a410f627a0f7dff24cb4d920e15428911e7f8cc365a8a88eb81421a361ccc2b99e309d8dcd9a98ba83c3949d893e3", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECuWAuukztO8pl8vbsJIjKMqaQQ9i\neg99/yTLTZIOFUKJEef4zDZaiojrgUIaNhzMK5njCdjc2amLqDw5SdiT4w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 426, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02205d8ecd64a4eeba466815ddf3a4de9a8e6abd9c5db0a01eb80343553da648428f", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "045b812fd521aafa69835a849cce6fbdeb6983b442d2444fe70e134c027fc46963838a40f2a36092e9004e92d8d940cf5638550ce672ce8b8d4e15eba5499249e9", + "wx" : "5b812fd521aafa69835a849cce6fbdeb6983b442d2444fe70e134c027fc46963", + "wy" : "00838a40f2a36092e9004e92d8d940cf5638550ce672ce8b8d4e15eba5499249e9" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045b812fd521aafa69835a849cce6fbdeb6983b442d2444fe70e134c027fc46963838a40f2a36092e9004e92d8d940cf5638550ce672ce8b8d4e15eba5499249e9", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEW4Ev1SGq+mmDWoSczm+962mDtELS\nRE/nDhNMAn/EaWODikDyo2CS6QBOktjZQM9WOFUM5nLOi41OFeulSZJJ6Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 427, + "comment" : "point duplication during verification", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "304502206f2347cab7dd76858fe0555ac3bc99048c4aacafdfb6bcbe05ea6c42c4934569022100bb726660235793aa9957a61e76e00c2c435109cf9a15dd624d53f4301047856b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "045b812fd521aafa69835a849cce6fbdeb6983b442d2444fe70e134c027fc469637c75bf0c5c9f6d17ffb16d2726bf30a9c7aaf31a8d317472b1ea145ab66db616", + "wx" : "5b812fd521aafa69835a849cce6fbdeb6983b442d2444fe70e134c027fc46963", + "wy" : "7c75bf0c5c9f6d17ffb16d2726bf30a9c7aaf31a8d317472b1ea145ab66db616" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045b812fd521aafa69835a849cce6fbdeb6983b442d2444fe70e134c027fc469637c75bf0c5c9f6d17ffb16d2726bf30a9c7aaf31a8d317472b1ea145ab66db616", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEW4Ev1SGq+mmDWoSczm+962mDtELS\nRE/nDhNMAn/EaWN8db8MXJ9tF/+xbScmvzCpx6rzGo0xdHKx6hRatm22Fg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 428, + "comment" : "duplication bug", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "304502206f2347cab7dd76858fe0555ac3bc99048c4aacafdfb6bcbe05ea6c42c4934569022100bb726660235793aa9957a61e76e00c2c435109cf9a15dd624d53f4301047856b", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "046adda82b90261b0f319faa0d878665a6b6da497f09c903176222c34acfef72a647e6f50dcc40ad5d9b59f7602bb222fad71a41bf5e1f9df4959a364c62e488d9", + "wx" : "6adda82b90261b0f319faa0d878665a6b6da497f09c903176222c34acfef72a6", + "wy" : "47e6f50dcc40ad5d9b59f7602bb222fad71a41bf5e1f9df4959a364c62e488d9" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046adda82b90261b0f319faa0d878665a6b6da497f09c903176222c34acfef72a647e6f50dcc40ad5d9b59f7602bb222fad71a41bf5e1f9df4959a364c62e488d9", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEat2oK5AmGw8xn6oNh4ZlprbaSX8J\nyQMXYiLDSs/vcqZH5vUNzECtXZtZ92ArsiL61xpBv14fnfSVmjZMYuSI2Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 429, + "comment" : "point with x-coordinate 0", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30250201010220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042fca0d0a47914de77ed56e7eccc3276a601120c6df0069c825c8f6a01c9f382065f3450a1d17c6b24989a39beb1c7decfca8384fbdc294418e5d807b3c6ed7de", + "wx" : "2fca0d0a47914de77ed56e7eccc3276a601120c6df0069c825c8f6a01c9f3820", + "wy" : "65f3450a1d17c6b24989a39beb1c7decfca8384fbdc294418e5d807b3c6ed7de" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042fca0d0a47914de77ed56e7eccc3276a601120c6df0069c825c8f6a01c9f382065f3450a1d17c6b24989a39beb1c7decfca8384fbdc294418e5d807b3c6ed7de", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEL8oNCkeRTed+1W5+zMMnamARIMbf\nAGnIJcj2oByfOCBl80UKHRfGskmJo5vrHH3s/Kg4T73ClEGOXYB7PG7X3g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 430, + "comment" : "point with x-coordinate 0", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022101000000000000000000000000000000000000000000000000000000000000000002203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aa9", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04dd86d3b5f4a13e8511083b78002081c53ff467f11ebd98a51a633db76665d25045d5c8200c89f2fa10d849349226d21d8dfaed6ff8d5cb3e1b7e17474ebc18f7", + "wx" : "00dd86d3b5f4a13e8511083b78002081c53ff467f11ebd98a51a633db76665d250", + "wy" : "45d5c8200c89f2fa10d849349226d21d8dfaed6ff8d5cb3e1b7e17474ebc18f7" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004dd86d3b5f4a13e8511083b78002081c53ff467f11ebd98a51a633db76665d25045d5c8200c89f2fa10d849349226d21d8dfaed6ff8d5cb3e1b7e17474ebc18f7", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE3YbTtfShPoURCDt4ACCBxT/0Z/Ee\nvZilGmM9t2Zl0lBF1cggDIny+hDYSTSSJtIdjfrtb/jVyz4bfhdHTrwY9w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 431, + "comment" : "comparison with point at infinity ", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aa9", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "044fea55b32cb32aca0c12c4cd0abfb4e64b0f5a516e578c016591a93f5a0fbcc5d7d3fd10b2be668c547b212f6bb14c88f0fecd38a8a4b2c785ed3be62ce4b280", + "wx" : "4fea55b32cb32aca0c12c4cd0abfb4e64b0f5a516e578c016591a93f5a0fbcc5", + "wy" : "00d7d3fd10b2be668c547b212f6bb14c88f0fecd38a8a4b2c785ed3be62ce4b280" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044fea55b32cb32aca0c12c4cd0abfb4e64b0f5a516e578c016591a93f5a0fbcc5d7d3fd10b2be668c547b212f6bb14c88f0fecd38a8a4b2c785ed3be62ce4b280", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAET+pVsyyzKsoMEsTNCr+05ksPWlFu\nV4wBZZGpP1oPvMXX0/0Qsr5mjFR7IS9rsUyI8P7NOKiksseF7TvmLOSygA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 432, + "comment" : "extreme value for k and edgecase s", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc476699780220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04c6a771527024227792170a6f8eee735bf32b7f98af669ead299802e32d7c3107bc3b4b5e65ab887bbd343572b3e5619261fe3a073e2ffd78412f726867db589e", + "wx" : "00c6a771527024227792170a6f8eee735bf32b7f98af669ead299802e32d7c3107", + "wy" : "00bc3b4b5e65ab887bbd343572b3e5619261fe3a073e2ffd78412f726867db589e" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004c6a771527024227792170a6f8eee735bf32b7f98af669ead299802e32d7c3107bc3b4b5e65ab887bbd343572b3e5619261fe3a073e2ffd78412f726867db589e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExqdxUnAkIneSFwpvju5zW/Mrf5iv\nZp6tKZgC4y18MQe8O0teZauIe700NXKz5WGSYf46Bz4v/XhBL3JoZ9tYng==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 433, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022100b6db6db6249249254924924924924924625bd7a09bec4ca81bcdd9f8fd6b63cc", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04851c2bbad08e54ec7a9af99f49f03644d6ec6d59b207fec98de85a7d15b956efcee9960283045075684b410be8d0f7494b91aa2379f60727319f10ddeb0fe9d6", + "wx" : "00851c2bbad08e54ec7a9af99f49f03644d6ec6d59b207fec98de85a7d15b956ef", + "wy" : "00cee9960283045075684b410be8d0f7494b91aa2379f60727319f10ddeb0fe9d6" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004851c2bbad08e54ec7a9af99f49f03644d6ec6d59b207fec98de85a7d15b956efcee9960283045075684b410be8d0f7494b91aa2379f60727319f10ddeb0fe9d6", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhRwrutCOVOx6mvmfSfA2RNbsbVmy\nB/7JjehafRW5Vu/O6ZYCgwRQdWhLQQvo0PdJS5GqI3n2BycxnxDd6w/p1g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 434, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022100cccccccc00000000cccccccccccccccc971f2ef152794b9d8fc7d568c9e8eaa7", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04f6417c8a670584e388676949e53da7fc55911ff68318d1bf3061205acb19c48f8f2b743df34ad0f72674acb7505929784779cd9ac916c3669ead43026ab6d43f", + "wx" : "00f6417c8a670584e388676949e53da7fc55911ff68318d1bf3061205acb19c48f", + "wy" : "008f2b743df34ad0f72674acb7505929784779cd9ac916c3669ead43026ab6d43f" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004f6417c8a670584e388676949e53da7fc55911ff68318d1bf3061205acb19c48f8f2b743df34ad0f72674acb7505929784779cd9ac916c3669ead43026ab6d43f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE9kF8imcFhOOIZ2lJ5T2n/FWRH/aD\nGNG/MGEgWssZxI+PK3Q980rQ9yZ0rLdQWSl4R3nNmskWw2aerUMCarbUPw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 435, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc4766997802203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aaa", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04501421277be45a5eefec6c639930d636032565af420cf3373f557faa7f8a06438673d6cb6076e1cfcdc7dfe7384c8e5cac08d74501f2ae6e89cad195d0aa1371", + "wx" : "501421277be45a5eefec6c639930d636032565af420cf3373f557faa7f8a0643", + "wy" : "008673d6cb6076e1cfcdc7dfe7384c8e5cac08d74501f2ae6e89cad195d0aa1371" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004501421277be45a5eefec6c639930d636032565af420cf3373f557faa7f8a06438673d6cb6076e1cfcdc7dfe7384c8e5cac08d74501f2ae6e89cad195d0aa1371", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEUBQhJ3vkWl7v7GxjmTDWNgMlZa9C\nDPM3P1V/qn+KBkOGc9bLYHbhz83H3+c4TI5crAjXRQHyrm6JytGV0KoTcQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 436, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022049249248db6db6dbb6db6db6db6db6db5a8b230d0b2b51dcd7ebf0c9fef7c185", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "040d935bf9ffc115a527735f729ca8a4ca23ee01a4894adf0e3415ac84e808bb343195a3762fea29ed38912bd9ea6c4fde70c3050893a4375850ce61d82eba33c5", + "wx" : "0d935bf9ffc115a527735f729ca8a4ca23ee01a4894adf0e3415ac84e808bb34", + "wy" : "3195a3762fea29ed38912bd9ea6c4fde70c3050893a4375850ce61d82eba33c5" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040d935bf9ffc115a527735f729ca8a4ca23ee01a4894adf0e3415ac84e808bb343195a3762fea29ed38912bd9ea6c4fde70c3050893a4375850ce61d82eba33c5", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEDZNb+f/BFaUnc19ynKikyiPuAaSJ\nSt8ONBWshOgIuzQxlaN2L+op7TiRK9nqbE/ecMMFCJOkN1hQzmHYLrozxQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 437, + "comment" : "extreme value for k", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022016a4502e2781e11ac82cbc9d1edd8c981584d13e18411e2f6e0478c34416e3bb", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "045e59f50708646be8a589355014308e60b668fb670196206c41e748e64e4dca215de37fee5c97bcaf7144d5b459982f52eeeafbdf03aacbafef38e213624a01de", + "wx" : "5e59f50708646be8a589355014308e60b668fb670196206c41e748e64e4dca21", + "wy" : "5de37fee5c97bcaf7144d5b459982f52eeeafbdf03aacbafef38e213624a01de" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045e59f50708646be8a589355014308e60b668fb670196206c41e748e64e4dca215de37fee5c97bcaf7144d5b459982f52eeeafbdf03aacbafef38e213624a01de", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEXln1Bwhka+iliTVQFDCOYLZo+2cB\nliBsQedI5k5NyiFd43/uXJe8r3FE1bRZmC9S7ur73wOqy6/vOOITYkoB3g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 438, + "comment" : "extreme value for k and edgecase s", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2960220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04169fb797325843faff2f7a5b5445da9e2fd6226f7ef90ef0bfe924104b02db8e7bbb8de662c7b9b1cf9b22f7a2e582bd46d581d68878efb2b861b131d8a1d667", + "wx" : "169fb797325843faff2f7a5b5445da9e2fd6226f7ef90ef0bfe924104b02db8e", + "wy" : "7bbb8de662c7b9b1cf9b22f7a2e582bd46d581d68878efb2b861b131d8a1d667" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004169fb797325843faff2f7a5b5445da9e2fd6226f7ef90ef0bfe924104b02db8e7bbb8de662c7b9b1cf9b22f7a2e582bd46d581d68878efb2b861b131d8a1d667", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFp+3lzJYQ/r/L3pbVEXani/WIm9+\n+Q7wv+kkEEsC2457u43mYse5sc+bIvei5YK9RtWB1oh477K4YbEx2KHWZw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 439, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022100b6db6db6249249254924924924924924625bd7a09bec4ca81bcdd9f8fd6b63cc", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04271cd89c000143096b62d4e9e4ca885aef2f7023d18affdaf8b7b548981487540a1c6e954e32108435b55fa385b0f76481a609b9149ccb4b02b2ca47fe8e4da5", + "wx" : "271cd89c000143096b62d4e9e4ca885aef2f7023d18affdaf8b7b54898148754", + "wy" : "0a1c6e954e32108435b55fa385b0f76481a609b9149ccb4b02b2ca47fe8e4da5" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004271cd89c000143096b62d4e9e4ca885aef2f7023d18affdaf8b7b548981487540a1c6e954e32108435b55fa385b0f76481a609b9149ccb4b02b2ca47fe8e4da5", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEJxzYnAABQwlrYtTp5MqIWu8vcCPR\niv/a+Le1SJgUh1QKHG6VTjIQhDW1X6OFsPdkgaYJuRScy0sCsspH/o5NpQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 440, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022100cccccccc00000000cccccccccccccccc971f2ef152794b9d8fc7d568c9e8eaa7", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "043d0bc7ed8f09d2cb7ddb46ebc1ed799ab1563a9ab84bf524587a220afe499c12e22dc3b3c103824a4f378d96adb0a408abf19ce7d68aa6244f78cb216fa3f8df", + "wx" : "3d0bc7ed8f09d2cb7ddb46ebc1ed799ab1563a9ab84bf524587a220afe499c12", + "wy" : "00e22dc3b3c103824a4f378d96adb0a408abf19ce7d68aa6244f78cb216fa3f8df" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043d0bc7ed8f09d2cb7ddb46ebc1ed799ab1563a9ab84bf524587a220afe499c12e22dc3b3c103824a4f378d96adb0a408abf19ce7d68aa6244f78cb216fa3f8df", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPQvH7Y8J0st920brwe15mrFWOpq4\nS/UkWHoiCv5JnBLiLcOzwQOCSk83jZatsKQIq/Gc59aKpiRPeMshb6P43w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 441, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29602203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aaa", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04a6c885ade1a4c566f9bb010d066974abb281797fa701288c721bcbd23663a9b72e424b690957168d193a6096fc77a2b004a9c7d467e007e1f2058458f98af316", + "wx" : "00a6c885ade1a4c566f9bb010d066974abb281797fa701288c721bcbd23663a9b7", + "wy" : "2e424b690957168d193a6096fc77a2b004a9c7d467e007e1f2058458f98af316" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a6c885ade1a4c566f9bb010d066974abb281797fa701288c721bcbd23663a9b72e424b690957168d193a6096fc77a2b004a9c7d467e007e1f2058458f98af316", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEpsiFreGkxWb5uwENBml0q7KBeX+n\nASiMchvL0jZjqbcuQktpCVcWjRk6YJb8d6KwBKnH1GfgB+HyBYRY+YrzFg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 442, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022049249248db6db6dbb6db6db6db6db6db5a8b230d0b2b51dcd7ebf0c9fef7c185", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "048d3c2c2c3b765ba8289e6ac3812572a25bf75df62d87ab7330c3bdbad9ebfa5c4c6845442d66935b238578d43aec54f7caa1621d1af241d4632e0b780c423f5d", + "wx" : "008d3c2c2c3b765ba8289e6ac3812572a25bf75df62d87ab7330c3bdbad9ebfa5c", + "wy" : "4c6845442d66935b238578d43aec54f7caa1621d1af241d4632e0b780c423f5d" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048d3c2c2c3b765ba8289e6ac3812572a25bf75df62d87ab7330c3bdbad9ebfa5c4c6845442d66935b238578d43aec54f7caa1621d1af241d4632e0b780c423f5d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEjTwsLDt2W6gonmrDgSVyolv3XfYt\nh6tzMMO9utnr+lxMaEVELWaTWyOFeNQ67FT3yqFiHRryQdRjLgt4DEI/XQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 443, + "comment" : "extreme value for k", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022016a4502e2781e11ac82cbc9d1edd8c981584d13e18411e2f6e0478c34416e3bb", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5", + "wx" : "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", + "wy" : "4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaxfR8uEsQkf4vOblY6RA8ncDfYEt\n6zOg9KE5RdiYwpZP40Li/hp/m47n60p8D54WK84zV2sxXs7LtkBoN79R9Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 444, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3045022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2", + "result" : "invalid" + }, + { + "tcId" : 445, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3044022044a5ad0ad0636d9f12bc9e0a6bdd5e1cbcb012ea7bf091fcec15b0c43202d52e0220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a", + "wx" : "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", + "wy" : "00b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaxfR8uEsQkf4vOblY6RA8ncDfYEt\n6zOg9KE5RdiYwpawHL0cAeWAZXEYFLWD8GHp1DHMqZTOoTE0Sb+XyECuCg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 446, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3045022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2", + "result" : "invalid" + }, + { + "tcId" : 447, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3044022044a5ad0ad0636d9f12bc9e0a6bdd5e1cbcb012ea7bf091fcec15b0c43202d52e0220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "044f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685", + "wx" : "4f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000", + "wy" : "00ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETzN8z9Z3JqgF5PFgCuKEnfOAfsoR\nc4Ajn72BaQAAAADtneoSTMjDlkFkEemIww9CfrUEr0OjFGzV336mBmbWhQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 448, + "comment" : "x-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100d434e262a49eab7781e353a3565e482550dd0fd5defa013c7f29745eff3569f10221009b0c0a93f267fb6052fd8077be769c2b98953195d7bc10de844218305c6ba17a", + "result" : "valid" + }, + { + "tcId" : 449, + "comment" : "x-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304402200fe774355c04d060f76d79fd7a772e421463489221bf0a33add0be9b1979110b0220500dcba1c69a8fbd43fa4f57f743ce124ca8b91a1f325f3fac6181175df55737", + "result" : "valid" + }, + { + "tcId" : 450, + "comment" : "x-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022100bb40bf217bed3fb3950c7d39f03d36dc8e3b2cd79693f125bfd06595ee1135e30220541bf3532351ebb032710bdb6a1bf1bfc89a1e291ac692b3fa4780745bb55677", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f49726500493584fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000", + "wx" : "3cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f497265004935", + "wy" : "0084fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f49726500493584fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPPA9YU2JOc/UmaB4c/rCgWGPBrj/\nh+gBXD9JcmUASTWE+hdNeRxyvyzjiAqJYN0qfHoTOKgvhanlnNvegAAAAA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 451, + "comment" : "y-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30440220664eb7ee6db84a34df3c86ea31389a5405badd5ca99231ff556d3e75a233e73a022059f3c752e52eca46137642490a51560ce0badc678754b8f72e51a2901426a1bd", + "result" : "valid" + }, + { + "tcId" : 452, + "comment" : "y-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502204cd0429bbabd2827009d6fcd843d4ce39c3e42e2d1631fd001985a79d1fd8b430221009638bf12dd682f60be7ef1d0e0d98f08b7bca77a1a2b869ae466189d2acdabe3", + "result" : "valid" + }, + { + "tcId" : 453, + "comment" : "y-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100e56c6ea2d1b017091c44d8b6cb62b9f460e3ce9aed5e5fd41e8added97c56c04022100a308ec31f281e955be20b457e463440b4fcf2b80258078207fc1378180f89b55", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f4972650049357b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff", + "wx" : "3cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f497265004935", + "wy" : "7b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f4972650049357b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPPA9YU2JOc/UmaB4c/rCgWGPBrj/\nh+gBXD9JcmUASTV7BeixhuONQdMcd/V2nyLVg4XsyFfQelYaYyQhf////w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 454, + "comment" : "y-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304402201158a08d291500b4cabed3346d891eee57c176356a2624fb011f8fbbf34668300220228a8c486a736006e082325b85290c5bc91f378b75d487dda46798c18f285519", + "result" : "valid" + }, + { + "tcId" : 455, + "comment" : "y-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022100b1db9289649f59410ea36b0c0fc8d6aa2687b29176939dd23e0dde56d309fa9d02203e1535e4280559015b0dbd987366dcf43a6d1af5c23c7d584e1c3f48a1251336", + "result" : "valid" + }, + { + "tcId" : 456, + "comment" : "y-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100b7b16e762286cb96446aa8d4e6e7578b0a341a79f2dd1a220ac6f0ca4e24ed86022100ddc60a700a139b04661c547d07bbb0721780146df799ccf55e55234ecb8f12bc", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffffa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e", + "wx" : "2829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffff", + "wy" : "00a01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffffa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKCnDH6ouQA40TtlLyj/NBUWVbrz+\nitD236X/jv////+gGq+vAA5SWFhVr6dnat4oQRMJkFLfV+frO9N+vrkiLg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 457, + "comment" : "x-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022100d82a7c2717261187c8e00d8df963ff35d796edad36bc6e6bd1c91c670d9105b402203dcabddaf8fcaa61f4603e7cbac0f3c0351ecd5988efb23f680d07debd139929", + "result" : "valid" + }, + { + "tcId" : 458, + "comment" : "x-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304402205eb9c8845de68eb13d5befe719f462d77787802baff30ce96a5cba063254af7802202c026ae9be2e2a5e7ca0ff9bbd92fb6e44972186228ee9a62b87ddbe2ef66fb5", + "result" : "valid" + }, + { + "tcId" : 459, + "comment" : "x-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304602210096843dd03c22abd2f3b782b170239f90f277921becc117d0404a8e4e36230c28022100f2be378f526f74a543f67165976de9ed9a31214eb4d7e6db19e1ede123dd991d", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f55a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73", + "wx" : "00fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f5", + "wy" : "5a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f55a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE////+UgIHmoEWN2PnnOPJmX/kFmt\naqwHCDGMTKmnpPVairy6LdqEdDEe5UFJuXPK4MD7iVV60L945lKaFmO9cw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 460, + "comment" : "x-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30440220766456dce1857c906f9996af729339464d27e9d98edc2d0e3b760297067421f60220402385ecadae0d8081dccaf5d19037ec4e55376eced699e93646bfbbf19d0b41", + "result" : "valid" + }, + { + "tcId" : 461, + "comment" : "x-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100c605c4b2edeab20419e6518a11b2dbc2b97ed8b07cced0b19c34f777de7b9fd9022100edf0f612c5f46e03c719647bc8af1b29b2cde2eda700fb1cff5e159d47326dba", + "result" : "valid" + }, + { + "tcId" : 462, + "comment" : "x-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100d48b68e6cabfe03cf6141c9ac54141f210e64485d9929ad7b732bfe3b7eb8a84022100feedae50c61bd00e19dc26f9b7e2265e4508c389109ad2f208f0772315b6c941", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0400000003fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71", + "wx" : "03fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e", + "wy" : "1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400000003fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAAAAA/oV+WOUnV8DpvXH+G+eABXu\nsjrrv/EXOTe6dI4QmYcgcOjofFVfoTZZzKXX+tz8sAI+qIlUjKSK8rp+cQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 463, + "comment" : "x-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100b7c81457d4aeb6aa65957098569f0479710ad7f6595d5874c35a93d12a5dd4c7022100b7961a0b652878c2d568069a432ca18a1a9199f2ca574dad4b9e3a05c0a1cdb3", + "result" : "valid" + }, + { + "tcId" : 464, + "comment" : "x-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304402206b01332ddb6edfa9a30a1321d5858e1ee3cf97e263e669f8de5e9652e76ff3f702205939545fced457309a6a04ace2bd0f70139c8f7d86b02cb1cc58f9e69e96cd5a", + "result" : "valid" + }, + { + "tcId" : 465, + "comment" : "x-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100efdb884720eaeadc349f9fc356b6c0344101cd2fd8436b7d0e6a4fb93f106361022100f24bee6ad5dc05f7613975473aadf3aacba9e77de7d69b6ce48cb60d8113385d", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015000000001352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2", + "wx" : "00bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015", + "wy" : "1352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015000000001352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvLspFMefBF6qbsu8YSgWs75dLWeW\ncH2BJen4UcGK8BUAAAAAE1K7Sg+i6kzOuatj3WhK3loRJ7zzAKaYpxk7wg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 466, + "comment" : "y-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3044022031230428405560dcb88fb5a646836aea9b23a23dd973dcbe8014c87b8b20eb0702200f9344d6e812ce166646747694a41b0aaf97374e19f3c5fb8bd7ae3d9bd0beff", + "result" : "valid" + }, + { + "tcId" : 467, + "comment" : "y-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100caa797da65b320ab0d5c470cda0b36b294359c7db9841d679174db34c4855743022100cf543a62f23e212745391aaf7505f345123d2685ee3b941d3de6d9b36242e5a0", + "result" : "valid" + }, + { + "tcId" : 468, + "comment" : "y-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502207e5f0ab5d900d3d3d7867657e5d6d36519bc54084536e7d21c336ed8001859450221009450c07f201faec94b82dfb322e5ac676688294aad35aa72e727ff0b19b646aa", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d", + "wx" : "00bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015", + "wy" : "00fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvLspFMefBF6qbsu8YSgWs75dLWeW\ncH2BJen4UcGK8BX////+7K1EtvBdFbMxRlScIpe1IqXu2EMM/1lnWObEPQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 469, + "comment" : "y-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100d7d70c581ae9e3f66dc6a480bf037ae23f8a1e4a2136fe4b03aa69f0ca25b35602210089c460f8a5a5c2bbba962c8a3ee833a413e85658e62a59e2af41d9127cc47224", + "result" : "valid" + }, + { + "tcId" : 470, + "comment" : "y-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30440220341c1b9ff3c83dd5e0dfa0bf68bcdf4bb7aa20c625975e5eeee34bb396266b34022072b69f061b750fd5121b22b11366fad549c634e77765a017902a67099e0a4469", + "result" : "valid" + }, + { + "tcId" : 471, + "comment" : "y-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022070bebe684cdcb5ca72a42f0d873879359bd1781a591809947628d313a3814f67022100aec03aca8f5587a4d535fa31027bbe9cc0e464b1c3577f4c2dcde6b2094798a9", + "result" : "valid" + } + ] + } + ] +} diff --git a/packages/crypto/testdata/wycheproof/ecdsa_secp256r1_sha3_256_test.json b/packages/crypto/testdata/wycheproof/ecdsa_secp256r1_sha3_256_test.json new file mode 100644 index 0000000000..cf4491668e --- /dev/null +++ b/packages/crypto/testdata/wycheproof/ecdsa_secp256r1_sha3_256_test.json @@ -0,0 +1,6582 @@ +{ + "algorithm" : "ECDSA", + "schema" : "ecdsa_verify_schema.json", + "generatorVersion" : "0.9rc5", + "numberOfTests" : 479, + "header" : [ + "Test vectors of type EcdsaVerify are meant for the verification", + "of ASN encoded ECDSA signatures." + ], + "notes" : { + "ArithmeticError" : { + "bugType" : "EDGE_CASE", + "description" : "Some implementations of ECDSA have arithmetic errors that occur when intermediate results have extreme values. This test vector has been constructed to test such occurences.", + "cves" : [ + "CVE-2017-18146" + ] + }, + "BerEncodedSignature" : { + "bugType" : "BER_ENCODING", + "description" : "ECDSA signatures are usually DER encoded. This signature contains valid values for r and s, but it uses alternative BER encoding.", + "effect" : "Accepting alternative BER encodings may be benign in some cases, or be an issue if protocol requires signature malleability.", + "cves" : [ + "CVE-2020-14966", + "CVE-2020-13822", + "CVE-2019-14859", + "CVE-2016-1000342" + ] + }, + "EdgeCasePublicKey" : { + "bugType" : "EDGE_CASE", + "description" : "The test vector uses a special case public key. " + }, + "EdgeCaseShamirMultiplication" : { + "bugType" : "EDGE_CASE", + "description" : "Shamir proposed a fast method for computing the sum of two scalar multiplications efficiently. This test vector has been constructed so that an intermediate result is the point at infinity if Shamir's method is used." + }, + "IntegerOverflow" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an r and s that has been modified, so that the original value is restored if the implementation ignores the most significant bits.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "InvalidEncoding" : { + "bugType" : "CAN_OF_WORMS", + "description" : "ECDSA signatures are encoded using ASN.1. This test vector contains an incorrectly encoded signature. The test vector itself was generated from a valid signature by modifying its encoding.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "InvalidSignature" : { + "bugType" : "AUTH_BYPASS", + "description" : "The signature contains special case values such as r=0 and s=0. Buggy implementations may accept such values, if the implementation does not check boundaries and computes s^(-1) == 0.", + "effect" : "Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.", + "cves" : [ + "CVE-2022-21449", + "CVE-2021-43572", + "CVE-2022-24884" + ] + }, + "InvalidTypesInSignature" : { + "bugType" : "AUTH_BYPASS", + "description" : "The signature contains invalid types. Dynamic typed languages sometime coerce such values of different types into integers. If an implementation is careless and has additional bugs, such as not checking integer boundaries then it may be possible that such signatures are accepted.", + "effect" : "Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.", + "cves" : [ + "CVE-2022-21449" + ] + }, + "MissingZero" : { + "bugType" : "LEGACY", + "description" : "Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.", + "effect" : "While signatures are more malleable if such signatures are accepted, this typically leads to no vulnerability, since a badly encoded signature can be reencoded correctly." + }, + "ModifiedInteger" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an r and s that has been modified. The goal is to check for arithmetic errors.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "ModifiedSignature" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an invalid signature that was generated from a valid signature by modifying it.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "ModularInverse" : { + "bugType" : "EDGE_CASE", + "description" : "The test vectors contains a signature where computing the modular inverse of s hits an edge case.", + "effect" : "While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.", + "cves" : [ + "CVE-2019-0865" + ] + }, + "PointDuplication" : { + "bugType" : "EDGE_CASE", + "description" : "Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission.", + "cves" : [ + "2020-12607", + "CVE-2015-2730" + ] + }, + "RangeCheck" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an r and s that has been modified. By adding or subtracting the order of the group (or other values) the test vector checks whether signature verification verifies the range of r and s.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "SmallRandS" : { + "bugType" : "EDGE_CASE", + "description" : "The test vectors contains a signature where both r and s are small integers. Some libraries cannot verify such signatures.", + "effect" : "While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.", + "cves" : [ + "2020-13895" + ] + }, + "SpecialCaseHash" : { + "bugType" : "EDGE_CASE", + "description" : "The test vector contains a signature where the hash of the message is a special case, e.g., contains a long run of 0 or 1 bits." + }, + "ValidSignature" : { + "bugType" : "BASIC", + "description" : "The test vector contains a valid signature that was generated pseudorandomly. Such signatures should not fail to verify unless some of the parameters (e.g. curve or hash function) are not supported." + } + }, + "testGroups" : [ + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0404aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad587d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d", + "wx" : "04aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad5", + "wy" : "0087d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000404aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad587d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEBKrsc2NXJvIT+4qeZNo7hjLkFJWp\nRNAEW1IuunJA+tWH2TFXmKqjpboBd1eHztBeqve04J/IHW0apUboNl1SXQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 1, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "", + "sig" : "3044022063f01899b4b0bfe9dc9929fd4526919b981acda781044ee3d2c337bf5fc748300220591381bdf1b1a9b01020b87314a128d06e4833342bf232779f61480739613927", + "result" : "valid" + }, + { + "tcId" : 2, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "4d7367", + "sig" : "3044022010228beaf773caeff22a94602e9eff1923dcc51b277f64b482ea63218c350b0d02202104c8343f8970a28c9eb221a63c857ef385e758eaccc5f7d2ae975553a1534b", + "result" : "valid" + }, + { + "tcId" : 3, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "313233343030", + "sig" : "3045022100e6e1b8c20e9d00f0b6cf1b2c39cacd9c50ee3f990553250f074a4a3eed3afe43022052f3be1ae2d2f9b2bfea8e8c22d95af4574581a9f4b09a89f7b6a4ad1c5b2776", + "result" : "valid" + }, + { + "tcId" : 4, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "0000000000000000000000000000000000000000", + "sig" : "3045022020f6203e48fc4c66ae8a74ec61d5124772daad058a74b871914d37dfe9d409c10221008b68de7a4786e29b3a726ea7fd8ef2a585b5c8dadf11281f2caa228eb3df3f96", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", + "wx" : "2927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838", + "wy" : "00c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKSexBRK64+3c/kZ4KBKLrSkDJpkZ\n9whgacjE32xzKDjHeHlk6qwA5ZIfsUmKYPRgZ2az2WhQAVWNGpdOc0FRPg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 5, + "comment" : "signature malleability", + "flags" : [ + "ValidSignature" + ], + "msg" : "313233343030", + "sig" : "30460221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e0221009364745a6a2d69f2283698fdfbee7b13de20bc93deb0230a9af3bd9fddf04401", + "result" : "valid" + }, + { + "tcId" : 6, + "comment" : "Legacy: ASN encoding of r misses leading 0", + "flags" : [ + "MissingZero" + ], + "msg" : "313233343030", + "sig" : "304402208ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 7, + "comment" : "valid", + "flags" : [ + "ValidSignature" + ], + "msg" : "313233343030", + "sig" : "30450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "valid" + }, + { + "tcId" : 8, + "comment" : "length of sequence [r, s] uses long form encoding", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "3081450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 9, + "comment" : "length of sequence [r, s] contains a leading 0", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "308200450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 10, + "comment" : "length of sequence [r, s] uses 70 instead of 69", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30460221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 11, + "comment" : "length of sequence [r, s] uses 68 instead of 69", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30440221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 12, + "comment" : "uint32 overflow in length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308501000000450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 13, + "comment" : "uint64 overflow in length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30890100000000000000450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 14, + "comment" : "length of sequence [r, s] = 2**31 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30847fffffff0221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 15, + "comment" : "length of sequence [r, s] = 2**31", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3084800000000221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 16, + "comment" : "length of sequence [r, s] = 2**32 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3084ffffffff0221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 17, + "comment" : "length of sequence [r, s] = 2**40 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3085ffffffffff0221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 18, + "comment" : "length of sequence [r, s] = 2**64 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3088ffffffffffffffff0221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 19, + "comment" : "incorrect length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30ff0221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 20, + "comment" : "replaced sequence [r, s] by an indefinite length tag without termination", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30800221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 21, + "comment" : "removing sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "", + "result" : "invalid" + }, + { + "tcId" : 22, + "comment" : "lonely sequence tag", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30", + "result" : "invalid" + }, + { + "tcId" : 23, + "comment" : "appending 0's to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30470221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e1500000", + "result" : "invalid" + }, + { + "tcId" : 24, + "comment" : "prepending 0's to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304700000221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 25, + "comment" : "appending unused 0's to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e1500000", + "result" : "invalid" + }, + { + "tcId" : 26, + "comment" : "appending null value to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30470221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e1500500", + "result" : "invalid" + }, + { + "tcId" : 27, + "comment" : "prepending garbage to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a49817730450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 28, + "comment" : "prepending garbage to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049250030450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 29, + "comment" : "appending garbage to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304730450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e1500004deadbeef", + "result" : "invalid" + }, + { + "tcId" : 30, + "comment" : "including undefined tags", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304daa00bb00cd0030450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 31, + "comment" : "including undefined tags", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d2229aa00bb00cd000221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 32, + "comment" : "including undefined tags", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d0221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e2228aa00bb00cd0002206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 33, + "comment" : "truncated length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3081", + "result" : "invalid" + }, + { + "tcId" : 34, + "comment" : "including undefined tags to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304baa02aabb30450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 35, + "comment" : "using composition with indefinite length for sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "308030450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e1500000", + "result" : "invalid" + }, + { + "tcId" : 36, + "comment" : "using composition with wrong tag for sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "308031450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e1500000", + "result" : "invalid" + }, + { + "tcId" : 37, + "comment" : "Replacing sequence [r, s] with NULL", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "0500", + "result" : "invalid" + }, + { + "tcId" : 38, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "2e450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 39, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "2f450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 40, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "31450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 41, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "32450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 42, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "ff450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 43, + "comment" : "dropping value of sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3000", + "result" : "invalid" + }, + { + "tcId" : 44, + "comment" : "using composition for sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049300102304421008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 45, + "comment" : "truncated sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30440221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e1", + "result" : "invalid" + }, + { + "tcId" : 46, + "comment" : "truncated sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304421008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 47, + "comment" : "sequence [r, s] of size 4166 to check for overflows", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308210460221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e1500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 48, + "comment" : "indefinite length", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "30800221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e1500000", + "result" : "invalid" + }, + { + "tcId" : 49, + "comment" : "indefinite length with truncated delimiter", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30800221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e15000", + "result" : "invalid" + }, + { + "tcId" : 50, + "comment" : "indefinite length with additional element", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30800221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e15005000000", + "result" : "invalid" + }, + { + "tcId" : 51, + "comment" : "indefinite length with truncated element", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30800221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150060811220000", + "result" : "invalid" + }, + { + "tcId" : 52, + "comment" : "indefinite length with garbage", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30800221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e1500000fe02beef", + "result" : "invalid" + }, + { + "tcId" : 53, + "comment" : "indefinite length with nonempty EOC", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30800221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e1500002beef", + "result" : "invalid" + }, + { + "tcId" : 54, + "comment" : "prepend empty sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304730000221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 55, + "comment" : "append empty sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30470221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e1503000", + "result" : "invalid" + }, + { + "tcId" : 56, + "comment" : "append zero", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30480221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150020100", + "result" : "invalid" + }, + { + "tcId" : 57, + "comment" : "append garbage with high tag number", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30480221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150bf7f00", + "result" : "invalid" + }, + { + "tcId" : 58, + "comment" : "append null with explicit tag", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30490221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150a0020500", + "result" : "invalid" + }, + { + "tcId" : 59, + "comment" : "append null with implicit tag", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30470221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150a000", + "result" : "invalid" + }, + { + "tcId" : 60, + "comment" : "sequence of sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304730450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 61, + "comment" : "truncated sequence: removed last 1 elements", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30230221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e", + "result" : "invalid" + }, + { + "tcId" : 62, + "comment" : "repeating element in sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30670221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e15002206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 63, + "comment" : "flipped bit 0 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3043008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36f02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 64, + "comment" : "flipped bit 32 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3043008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af43e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 65, + "comment" : "flipped bit 48 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3043008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b234af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 66, + "comment" : "flipped bit 64 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3043008ab9effd6738803fd19b92d2e9fdea1293056b793e29542a3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 67, + "comment" : "length of r uses long form encoding", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "3046028121008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 68, + "comment" : "length of r contains a leading 0", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "304702820021008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 69, + "comment" : "length of r uses 34 instead of 33", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30450222008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 70, + "comment" : "length of r uses 32 instead of 33", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30450220008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 71, + "comment" : "uint32 overflow in length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a02850100000021008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 72, + "comment" : "uint64 overflow in length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304e0289010000000000000021008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 73, + "comment" : "length of r = 2**31 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902847fffffff008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 74, + "comment" : "length of r = 2**31", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049028480000000008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 75, + "comment" : "length of r = 2**32 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30490284ffffffff008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 76, + "comment" : "length of r = 2**40 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a0285ffffffffff008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 77, + "comment" : "length of r = 2**64 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d0288ffffffffffffffff008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 78, + "comment" : "incorrect length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502ff008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 79, + "comment" : "replaced r by an indefinite length tag without termination", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30450280008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 80, + "comment" : "removing r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "302202206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 81, + "comment" : "lonely integer tag", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30230202206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 82, + "comment" : "lonely integer tag", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30240221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02", + "result" : "invalid" + }, + { + "tcId" : 83, + "comment" : "appending 0's to r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30470223008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e000002206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 84, + "comment" : "prepending 0's to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304702230000008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 85, + "comment" : "appending unused 0's to r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30470221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e000002206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 86, + "comment" : "appending null value to r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30470223008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e050002206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 87, + "comment" : "prepending garbage to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a22264981770221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 88, + "comment" : "prepending garbage to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049222525000221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 89, + "comment" : "appending garbage to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d22230221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e0004deadbeef02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 90, + "comment" : "truncated length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3024028102206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 91, + "comment" : "including undefined tags to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304b2227aa02aabb0221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 92, + "comment" : "using composition with indefinite length for r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304922800221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e000002206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 93, + "comment" : "using composition with wrong tag for r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304922800321008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e000002206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 94, + "comment" : "Replacing r with NULL", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3024050002206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 95, + "comment" : "changing tag value of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30450021008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 96, + "comment" : "changing tag value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30450121008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 97, + "comment" : "changing tag value of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30450321008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 98, + "comment" : "changing tag value of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30450421008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 99, + "comment" : "changing tag value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045ff21008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 100, + "comment" : "dropping value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3024020002206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 101, + "comment" : "using composition for r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049222502010002208ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 102, + "comment" : "modifying first byte of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30450221028ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 103, + "comment" : "modifying last byte of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c3ee02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 104, + "comment" : "truncated r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30440220008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c302206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 105, + "comment" : "r of size 4130 to check for overflows", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3082104802821022008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 106, + "comment" : "leading ff in r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30460222ff008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 107, + "comment" : "replaced r by infinity", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "302509018002206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 108, + "comment" : "replacing r with zero", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "302502010002206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 109, + "comment" : "flipped bit 0 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30430221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e6c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e151", + "result" : "invalid" + }, + { + "tcId" : 110, + "comment" : "flipped bit 32 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30430221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e6c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d221e72e150", + "result" : "invalid" + }, + { + "tcId" : 111, + "comment" : "flipped bit 48 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30430221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e6c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c70d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 112, + "comment" : "flipped bit 64 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30430221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e6c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7b58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 113, + "comment" : "length of s uses long form encoding", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "30460221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e0281206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 114, + "comment" : "length of s contains a leading 0", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "30470221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e028200206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 115, + "comment" : "length of s uses 33 instead of 32", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02216c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 116, + "comment" : "length of s uses 31 instead of 32", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e021f6c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 117, + "comment" : "uint32 overflow in length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a0221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e028501000000206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 118, + "comment" : "uint64 overflow in length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304e0221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02890100000000000000206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 119, + "comment" : "length of s = 2**31 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30490221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02847fffffff6c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 120, + "comment" : "length of s = 2**31", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30490221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e0284800000006c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 121, + "comment" : "length of s = 2**32 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30490221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e0284ffffffff6c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 122, + "comment" : "length of s = 2**40 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a0221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e0285ffffffffff6c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 123, + "comment" : "length of s = 2**64 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d0221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e0288ffffffffffffffff6c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 124, + "comment" : "incorrect length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02ff6c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 125, + "comment" : "replaced s by an indefinite length tag without termination", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02806c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 126, + "comment" : "appending 0's to s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30470221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02226c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e1500000", + "result" : "invalid" + }, + { + "tcId" : 127, + "comment" : "prepending 0's to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30470221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e022200006c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 128, + "comment" : "appending null value to s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30470221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02226c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e1500500", + "result" : "invalid" + }, + { + "tcId" : 129, + "comment" : "prepending garbage to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a0221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e222549817702206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 130, + "comment" : "prepending garbage to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30490221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e2224250002206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 131, + "comment" : "appending garbage to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d0221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e222202206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e1500004deadbeef", + "result" : "invalid" + }, + { + "tcId" : 132, + "comment" : "truncated length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30250221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e0281", + "result" : "invalid" + }, + { + "tcId" : 133, + "comment" : "including undefined tags to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304b0221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e2226aa02aabb02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 134, + "comment" : "using composition with indefinite length for s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30490221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e228002206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e1500000", + "result" : "invalid" + }, + { + "tcId" : 135, + "comment" : "using composition with wrong tag for s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30490221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e228003206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e1500000", + "result" : "invalid" + }, + { + "tcId" : 136, + "comment" : "Replacing s with NULL", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30250221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e0500", + "result" : "invalid" + }, + { + "tcId" : 137, + "comment" : "changing tag value of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e00206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 138, + "comment" : "changing tag value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e01206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 139, + "comment" : "changing tag value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e03206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 140, + "comment" : "changing tag value of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e04206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 141, + "comment" : "changing tag value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36eff206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 142, + "comment" : "dropping value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30250221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e0200", + "result" : "invalid" + }, + { + "tcId" : 143, + "comment" : "using composition for s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30490221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e222402016c021f9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 144, + "comment" : "modifying first byte of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206e9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 145, + "comment" : "modifying last byte of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30450221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e1d0", + "result" : "invalid" + }, + { + "tcId" : 146, + "comment" : "truncated s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30440221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e021f6c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e1", + "result" : "invalid" + }, + { + "tcId" : 147, + "comment" : "truncated s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30440221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e021f9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 148, + "comment" : "s of size 4129 to check for overflows", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "308210480221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e028210216c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e1500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 149, + "comment" : "leading ff in s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30460221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e0221ff6c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 150, + "comment" : "replaced s by infinity", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30260221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e090180", + "result" : "invalid" + }, + { + "tcId" : 151, + "comment" : "replacing s with zero", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30260221008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e020100", + "result" : "invalid" + }, + { + "tcId" : 152, + "comment" : "replaced r by r + n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "30450221018ab9effc67388040d19b92d2e9fdea124fec6626e540f2b02edc15b83a73e8bf02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 153, + "comment" : "replaced r by r - n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "304402208ab9effe6738803ed19b92d2e9fdea12d61e70cb9711b5a64768803241ad9e1d02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 154, + "comment" : "replaced r by r + 256 * n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "3046022201008ab9eefd6738813fd19b92d2e9fde9cf7a00192055c7d91ef4ed0df1a136146e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 155, + "comment" : "replaced r by -r", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30450221ff7546100298c77fc02e646d2d160215ed6cfa9486c1d6abd4c4ddb50ac1ef3c9202206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 156, + "comment" : "replaced r by n - r", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "304402207546100198c77fc12e646d2d160215ed29e18f3468ee4a59b8977fcdbe5261e302206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 157, + "comment" : "replaced r by -n - r", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30450221fe7546100398c77fbf2e646d2d160215edb01399d91abf0d4fd123ea47c58c174102206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 158, + "comment" : "replaced r by r + 2**256", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "30450221018ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 159, + "comment" : "replaced r by r + 2**320", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "304d02290100000000000000008ab9effd6738803fd19b92d2e9fdea1293056b793e29542b3b224af53e10c36e02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 160, + "comment" : "replaced s by s + n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "30450221016c9b8ba395d2960fd7c96702041184eb9bad38c76f7f19ff4c7fd7e61ad606a102206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 161, + "comment" : "replaced s by s - n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "30450221ff6c9b8ba595d2960dd7c96702041184ec21df436c214fdcf5650c4260220fbbff02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 162, + "comment" : "replaced s by s + 256 * n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "3046022201006c9b8aa495d2970ed7c96702041184a8c5c0ebc0e006006e1290d01f8198325002206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 163, + "comment" : "replaced s by -s", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "304402209364745b6a2d69f1283698fdfbee7b142139c1e637988485a739f2dce18d1eb002206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 164, + "comment" : "replaced s by -n - s", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30450221fe9364745c6a2d69f0283698fdfbee7b146452c7389080e600b3802819e529f95f02206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 165, + "comment" : "replaced s by s + 2**256", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "30450221016c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e15002206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 166, + "comment" : "replaced s by s - 2**256", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "30450221ff6c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e15002206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 167, + "comment" : "replaced s by s + 2**320", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "304d02290100000000000000006c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e15002206c9b8ba495d2960ed7c96702041184ebdec63e19c8677b7a58c60d231e72e150", + "result" : "invalid" + }, + { + "tcId" : 168, + "comment" : "Signature with special case values r=0 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100020100", + "result" : "invalid" + }, + { + "tcId" : 169, + "comment" : "Signature with special case values r=0 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100020101", + "result" : "invalid" + }, + { + "tcId" : 170, + "comment" : "Signature with special case values r=0 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201000201ff", + "result" : "invalid" + }, + { + "tcId" : 171, + "comment" : "Signature with special case values r=0 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 172, + "comment" : "Signature with special case values r=0 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 173, + "comment" : "Signature with special case values r=0 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 174, + "comment" : "Signature with special case values r=0 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 175, + "comment" : "Signature with special case values r=0 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 176, + "comment" : "Signature with special case values r=1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101020100", + "result" : "invalid" + }, + { + "tcId" : 177, + "comment" : "Signature with special case values r=1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101020101", + "result" : "invalid" + }, + { + "tcId" : 178, + "comment" : "Signature with special case values r=1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201010201ff", + "result" : "invalid" + }, + { + "tcId" : 179, + "comment" : "Signature with special case values r=1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 180, + "comment" : "Signature with special case values r=1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 181, + "comment" : "Signature with special case values r=1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 182, + "comment" : "Signature with special case values r=1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 183, + "comment" : "Signature with special case values r=1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 184, + "comment" : "Signature with special case values r=-1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff020100", + "result" : "invalid" + }, + { + "tcId" : 185, + "comment" : "Signature with special case values r=-1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff020101", + "result" : "invalid" + }, + { + "tcId" : 186, + "comment" : "Signature with special case values r=-1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff0201ff", + "result" : "invalid" + }, + { + "tcId" : 187, + "comment" : "Signature with special case values r=-1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 188, + "comment" : "Signature with special case values r=-1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 189, + "comment" : "Signature with special case values r=-1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 190, + "comment" : "Signature with special case values r=-1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 191, + "comment" : "Signature with special case values r=-1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 192, + "comment" : "Signature with special case values r=n and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020100", + "result" : "invalid" + }, + { + "tcId" : 193, + "comment" : "Signature with special case values r=n and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101", + "result" : "invalid" + }, + { + "tcId" : 194, + "comment" : "Signature with special case values r=n and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510201ff", + "result" : "invalid" + }, + { + "tcId" : 195, + "comment" : "Signature with special case values r=n and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 196, + "comment" : "Signature with special case values r=n and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 197, + "comment" : "Signature with special case values r=n and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 198, + "comment" : "Signature with special case values r=n and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 199, + "comment" : "Signature with special case values r=n and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 200, + "comment" : "Signature with special case values r=n - 1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550020100", + "result" : "invalid" + }, + { + "tcId" : 201, + "comment" : "Signature with special case values r=n - 1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550020101", + "result" : "invalid" + }, + { + "tcId" : 202, + "comment" : "Signature with special case values r=n - 1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325500201ff", + "result" : "invalid" + }, + { + "tcId" : 203, + "comment" : "Signature with special case values r=n - 1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 204, + "comment" : "Signature with special case values r=n - 1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 205, + "comment" : "Signature with special case values r=n - 1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 206, + "comment" : "Signature with special case values r=n - 1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 207, + "comment" : "Signature with special case values r=n - 1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 208, + "comment" : "Signature with special case values r=n + 1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552020100", + "result" : "invalid" + }, + { + "tcId" : 209, + "comment" : "Signature with special case values r=n + 1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552020101", + "result" : "invalid" + }, + { + "tcId" : 210, + "comment" : "Signature with special case values r=n + 1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325520201ff", + "result" : "invalid" + }, + { + "tcId" : 211, + "comment" : "Signature with special case values r=n + 1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 212, + "comment" : "Signature with special case values r=n + 1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 213, + "comment" : "Signature with special case values r=n + 1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 214, + "comment" : "Signature with special case values r=n + 1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 215, + "comment" : "Signature with special case values r=n + 1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 216, + "comment" : "Signature with special case values r=p and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff020100", + "result" : "invalid" + }, + { + "tcId" : 217, + "comment" : "Signature with special case values r=p and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff020101", + "result" : "invalid" + }, + { + "tcId" : 218, + "comment" : "Signature with special case values r=p and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0201ff", + "result" : "invalid" + }, + { + "tcId" : 219, + "comment" : "Signature with special case values r=p and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 220, + "comment" : "Signature with special case values r=p and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 221, + "comment" : "Signature with special case values r=p and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 222, + "comment" : "Signature with special case values r=p and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 223, + "comment" : "Signature with special case values r=p and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 224, + "comment" : "Signature with special case values r=p + 1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000001000000000000000000000000020100", + "result" : "invalid" + }, + { + "tcId" : 225, + "comment" : "Signature with special case values r=p + 1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000001000000000000000000000000020101", + "result" : "invalid" + }, + { + "tcId" : 226, + "comment" : "Signature with special case values r=p + 1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff000000010000000000000000000000010000000000000000000000000201ff", + "result" : "invalid" + }, + { + "tcId" : 227, + "comment" : "Signature with special case values r=p + 1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 228, + "comment" : "Signature with special case values r=p + 1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 229, + "comment" : "Signature with special case values r=p + 1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 230, + "comment" : "Signature with special case values r=p + 1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 231, + "comment" : "Signature with special case values r=p + 1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 232, + "comment" : "Signature encoding contains incorrect types: r=0, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3008020100090380fe01", + "result" : "invalid" + }, + { + "tcId" : 233, + "comment" : "Signature encoding contains incorrect types: r=0, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100090142", + "result" : "invalid" + }, + { + "tcId" : 234, + "comment" : "Signature encoding contains incorrect types: r=0, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100010101", + "result" : "invalid" + }, + { + "tcId" : 235, + "comment" : "Signature encoding contains incorrect types: r=0, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100010100", + "result" : "invalid" + }, + { + "tcId" : 236, + "comment" : "Signature encoding contains incorrect types: r=0, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201000500", + "result" : "invalid" + }, + { + "tcId" : 237, + "comment" : "Signature encoding contains incorrect types: r=0, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201000c00", + "result" : "invalid" + }, + { + "tcId" : 238, + "comment" : "Signature encoding contains incorrect types: r=0, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201000c0130", + "result" : "invalid" + }, + { + "tcId" : 239, + "comment" : "Signature encoding contains incorrect types: r=0, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201003000", + "result" : "invalid" + }, + { + "tcId" : 240, + "comment" : "Signature encoding contains incorrect types: r=0, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201003003020100", + "result" : "invalid" + }, + { + "tcId" : 241, + "comment" : "Signature encoding contains incorrect types: r=1, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3008020101090380fe01", + "result" : "invalid" + }, + { + "tcId" : 242, + "comment" : "Signature encoding contains incorrect types: r=1, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101090142", + "result" : "invalid" + }, + { + "tcId" : 243, + "comment" : "Signature encoding contains incorrect types: r=1, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101010101", + "result" : "invalid" + }, + { + "tcId" : 244, + "comment" : "Signature encoding contains incorrect types: r=1, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101010100", + "result" : "invalid" + }, + { + "tcId" : 245, + "comment" : "Signature encoding contains incorrect types: r=1, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201010500", + "result" : "invalid" + }, + { + "tcId" : 246, + "comment" : "Signature encoding contains incorrect types: r=1, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201010c00", + "result" : "invalid" + }, + { + "tcId" : 247, + "comment" : "Signature encoding contains incorrect types: r=1, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201010c0130", + "result" : "invalid" + }, + { + "tcId" : 248, + "comment" : "Signature encoding contains incorrect types: r=1, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201013000", + "result" : "invalid" + }, + { + "tcId" : 249, + "comment" : "Signature encoding contains incorrect types: r=1, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201013003020100", + "result" : "invalid" + }, + { + "tcId" : 250, + "comment" : "Signature encoding contains incorrect types: r=-1, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201ff090380fe01", + "result" : "invalid" + }, + { + "tcId" : 251, + "comment" : "Signature encoding contains incorrect types: r=-1, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff090142", + "result" : "invalid" + }, + { + "tcId" : 252, + "comment" : "Signature encoding contains incorrect types: r=-1, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff010101", + "result" : "invalid" + }, + { + "tcId" : 253, + "comment" : "Signature encoding contains incorrect types: r=-1, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff010100", + "result" : "invalid" + }, + { + "tcId" : 254, + "comment" : "Signature encoding contains incorrect types: r=-1, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201ff0500", + "result" : "invalid" + }, + { + "tcId" : 255, + "comment" : "Signature encoding contains incorrect types: r=-1, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201ff0c00", + "result" : "invalid" + }, + { + "tcId" : 256, + "comment" : "Signature encoding contains incorrect types: r=-1, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff0c0130", + "result" : "invalid" + }, + { + "tcId" : 257, + "comment" : "Signature encoding contains incorrect types: r=-1, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201ff3000", + "result" : "invalid" + }, + { + "tcId" : 258, + "comment" : "Signature encoding contains incorrect types: r=-1, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201ff3003020100", + "result" : "invalid" + }, + { + "tcId" : 259, + "comment" : "Signature encoding contains incorrect types: r=n, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551090380fe01", + "result" : "invalid" + }, + { + "tcId" : 260, + "comment" : "Signature encoding contains incorrect types: r=n, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551090142", + "result" : "invalid" + }, + { + "tcId" : 261, + "comment" : "Signature encoding contains incorrect types: r=n, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551010101", + "result" : "invalid" + }, + { + "tcId" : 262, + "comment" : "Signature encoding contains incorrect types: r=n, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551010100", + "result" : "invalid" + }, + { + "tcId" : 263, + "comment" : "Signature encoding contains incorrect types: r=n, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510500", + "result" : "invalid" + }, + { + "tcId" : 264, + "comment" : "Signature encoding contains incorrect types: r=n, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510c00", + "result" : "invalid" + }, + { + "tcId" : 265, + "comment" : "Signature encoding contains incorrect types: r=n, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510c0130", + "result" : "invalid" + }, + { + "tcId" : 266, + "comment" : "Signature encoding contains incorrect types: r=n, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325513000", + "result" : "invalid" + }, + { + "tcId" : 267, + "comment" : "Signature encoding contains incorrect types: r=n, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325513003020100", + "result" : "invalid" + }, + { + "tcId" : 268, + "comment" : "Signature encoding contains incorrect types: r=p, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff090380fe01", + "result" : "invalid" + }, + { + "tcId" : 269, + "comment" : "Signature encoding contains incorrect types: r=p, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff090142", + "result" : "invalid" + }, + { + "tcId" : 270, + "comment" : "Signature encoding contains incorrect types: r=p, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff010101", + "result" : "invalid" + }, + { + "tcId" : 271, + "comment" : "Signature encoding contains incorrect types: r=p, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff010100", + "result" : "invalid" + }, + { + "tcId" : 272, + "comment" : "Signature encoding contains incorrect types: r=p, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0500", + "result" : "invalid" + }, + { + "tcId" : 273, + "comment" : "Signature encoding contains incorrect types: r=p, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0c00", + "result" : "invalid" + }, + { + "tcId" : 274, + "comment" : "Signature encoding contains incorrect types: r=p, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0c0130", + "result" : "invalid" + }, + { + "tcId" : 275, + "comment" : "Signature encoding contains incorrect types: r=p, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff3000", + "result" : "invalid" + }, + { + "tcId" : 276, + "comment" : "Signature encoding contains incorrect types: r=p, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff3003020100", + "result" : "invalid" + }, + { + "tcId" : 277, + "comment" : "Signature encoding contains incorrect types: r=0.25, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300a090380fe01090380fe01", + "result" : "invalid" + }, + { + "tcId" : 278, + "comment" : "Signature encoding contains incorrect types: r=nan, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006090142090142", + "result" : "invalid" + }, + { + "tcId" : 279, + "comment" : "Signature encoding contains incorrect types: r=True, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010101010101", + "result" : "invalid" + }, + { + "tcId" : 280, + "comment" : "Signature encoding contains incorrect types: r=False, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010100010100", + "result" : "invalid" + }, + { + "tcId" : 281, + "comment" : "Signature encoding contains incorrect types: r=Null, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300405000500", + "result" : "invalid" + }, + { + "tcId" : 282, + "comment" : "Signature encoding contains incorrect types: r=empyt UTF-8 string, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30040c000c00", + "result" : "invalid" + }, + { + "tcId" : 283, + "comment" : "Signature encoding contains incorrect types: r=\"0\", s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060c01300c0130", + "result" : "invalid" + }, + { + "tcId" : 284, + "comment" : "Signature encoding contains incorrect types: r=empty list, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300430003000", + "result" : "invalid" + }, + { + "tcId" : 285, + "comment" : "Signature encoding contains incorrect types: r=list containing 0, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300a30030201003003020100", + "result" : "invalid" + }, + { + "tcId" : 286, + "comment" : "Signature encoding contains incorrect types: r=0.25, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3008090380fe01020100", + "result" : "invalid" + }, + { + "tcId" : 287, + "comment" : "Signature encoding contains incorrect types: r=nan, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006090142020100", + "result" : "invalid" + }, + { + "tcId" : 288, + "comment" : "Signature encoding contains incorrect types: r=True, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010101020100", + "result" : "invalid" + }, + { + "tcId" : 289, + "comment" : "Signature encoding contains incorrect types: r=False, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010100020100", + "result" : "invalid" + }, + { + "tcId" : 290, + "comment" : "Signature encoding contains incorrect types: r=Null, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050500020100", + "result" : "invalid" + }, + { + "tcId" : 291, + "comment" : "Signature encoding contains incorrect types: r=empyt UTF-8 string, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050c00020100", + "result" : "invalid" + }, + { + "tcId" : 292, + "comment" : "Signature encoding contains incorrect types: r=\"0\", s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060c0130020100", + "result" : "invalid" + }, + { + "tcId" : 293, + "comment" : "Signature encoding contains incorrect types: r=empty list, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30053000020100", + "result" : "invalid" + }, + { + "tcId" : 294, + "comment" : "Signature encoding contains incorrect types: r=list containing 0, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30083003020100020100", + "result" : "invalid" + }, + { + "tcId" : 295, + "comment" : "Edge case for Shamir multiplication", + "flags" : [ + "EdgeCaseShamirMultiplication" + ], + "msg" : "313733323231", + "sig" : "3044022064a1aab5000d0e804f3e2fc02bdee9be8ff312334e2ba16d11547c97711c898e0220404a1a6da158ae1473fce08d338b8d6410a6a5903358b23fdd3a54fee2c2742b", + "result" : "valid" + }, + { + "tcId" : 296, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33313930393433323838", + "sig" : "3045022100a9edb87925684bcc5b92d0f7455123656e3498a0d182be63e2e6077c2b43bc6e02202c729ea1b01d14ee8fe702096cddd9394e351d801411ec8eac6b758475ea0070", + "result" : "valid" + }, + { + "tcId" : 297, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "383433343734313535", + "sig" : "304402203fba20ca893dcaf04e89141337a96abc7e24e026a8ff4c86d950de1c31b6427202206be2eced4ce388ff8026dfd3b658144f30931b7083ee2af06e75158c15b12249", + "result" : "valid" + }, + { + "tcId" : 298, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33353732363936383239", + "sig" : "3045022100c5aa31116f6006c479586ff7070014a35f22166701be8a5f1f1e9a43cb27dca0022068d1cee35ba3893b9cc3b5df5ac6afef55ebdb7ad9236b1fa8e438a538f8cb55", + "result" : "valid" + }, + { + "tcId" : 299, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "353931383333343239", + "sig" : "304502205b5b4d890504f56c16a4ac7947ac0057cdf640d2c39bac09fedc648bb0a16f1d022100f9c12e73a56d799e2827538187f0ed0ec331f6f0c089a4f6249d04c1b0c5cc8d", + "result" : "valid" + }, + { + "tcId" : 300, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3832353330383232353839", + "sig" : "304502204338e710478e8b922e50dc947f6fa0cd1903106cf02ee0742da69e8b624c5b6702210090c73bd0fcd07a4dd4a3664d559bd4795ac950d89463680852d33915de1a5745", + "result" : "valid" + }, + { + "tcId" : 301, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3133373334383238313432", + "sig" : "304502200fc97d7744e0b2762e6b48730d44c758ab238136a72693ff27339aaebefad581022100ab68ec80cf4afcca0f7d75f3c4b00e34ed4fe9101c98ed4d8c2f97eb865b1683", + "result" : "valid" + }, + { + "tcId" : 302, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "313733383135363430", + "sig" : "3045022100825f0b4230e30182b24b65151ec83d0aadc63ecfe0a91b5879ccf7fcce9eb40a022047f0211ad5471d055fe07c75f37f3fad8aeeff1ee11a54a17bab35212c46d5d6", + "result" : "valid" + }, + { + "tcId" : 303, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32353533343636353034", + "sig" : "304502203fedd83579431889710b67b6454d43ea7eddaaa9da950424e2c4ac730065a822022100b50cef5a9da8323fccd5bf13260dea6517c8ae6ccd6495f9ed7494cfd5891573", + "result" : "valid" + }, + { + "tcId" : 304, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32313833303339313937", + "sig" : "3044022069ba62b020a36333f7a0716577dd57d280132c540f66b9e2fe8d470121e0f135022066c7811587cb9247ec6d8c223b4c6d5533948fbabf072973d74cb19d3b2c91a6", + "result" : "valid" + }, + { + "tcId" : 305, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3130353236313736353435", + "sig" : "30450221008bb763097d8ca8e9cb84e111f361f47de93499f50bc85401ea96a61d54fad7a802202587b81e277283d5c139b8e9a5f4aa0bb0b1c2b28963efddbf73a0eef341659a", + "result" : "valid" + }, + { + "tcId" : 306, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32353031353339393836", + "sig" : "30450221008260a1eb8ba8b52db95b0722887920a1f9989dfa1efd420d1f8f9ab3df0cffce02206752c5687e6889e008eb9ad6e41933796b4adcd6018420fdef250998f6adf603", + "result" : "valid" + }, + { + "tcId" : 307, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3134393533313634363139", + "sig" : "3045022100b809c133b30c3a8ff11ea9024b131664b51c2768afb8536744e041015da9380602206cd015a49e19b260da6cd32a94806fb8bdceec5dc5542a7b2b938cce75137f30", + "result" : "valid" + }, + { + "tcId" : 308, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32303633383532393036", + "sig" : "304502202069244f8e72562406d631f647a141831aca5907fbff09932797d8305ad3c19d022100dfb7a3ae1a4bdf76987d7de404c5d8b7c51a6ae8dbece9de345a4b71cb5e1f38", + "result" : "valid" + }, + { + "tcId" : 309, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37383339373634393932", + "sig" : "304402204d82e457954761001da6c5dd0fb45d3b8aae12a270cdc5b97d66f810e306532602200cc6217e3aee3839fd809b207d47dea412991932adb2de18ee86431452c22595", + "result" : "valid" + }, + { + "tcId" : 310, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32313239323634343639", + "sig" : "3045022100a81c6258489e10bb1132a6f81f76c31d7465869708d89eb018c51bf774e8a0930220304d75b7bebe9abda5daafc419a765ffb8e5c02dd91836c40c430f052d5ca59c", + "result" : "valid" + }, + { + "tcId" : 311, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34383332303432363833", + "sig" : "3045022100e8da776984d6af2b8d523d1bd6fab8b25409e669d172ef51e104648c1bf0dad1022049b4170fed1cc59ab000087a2c091b3f69a66c8562ed350472e982bd31a0d09e", + "result" : "valid" + }, + { + "tcId" : 312, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "333635323231383136", + "sig" : "3046022100c53d293775c5cfdb879b67ff4f4792942132c35c9dc7f8fda8b3a00967c75b47022100c36045151f70a5d6af2fd27cf1f13cb308b2e847151fa4b47e22f2df6220ae95", + "result" : "valid" + }, + { + "tcId" : 313, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3234393137313236393635", + "sig" : "30440220300ee6fa4de853ac6680302a9c439b82dfd046c314d7bbacb2e01274e61e9b5402200bb2b62f11b789848648fab7e0c46ca7b09cded01887ef6bda9f871bc5cc609f", + "result" : "valid" + }, + { + "tcId" : 314, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32363232373930373738", + "sig" : "3045022100ac58a18fa5973efb06adba842affbd256a1c624606b146dae5a6ef85992cb428022048b4ecb8697e4cd20e0f30721ad94f4c18943879ce5d99d8c000d90465138bd0", + "result" : "valid" + }, + { + "tcId" : 315, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "313031323537373238393237", + "sig" : "304402206ebc2857fd53656b857005eb8f95c4f6fd3c99f9636a028e5244edc60bc9e18c022027719f12eb1de6cade547cb98523bdc7108622240f38d12f415c79cd0b1344d9", + "result" : "valid" + }, + { + "tcId" : 316, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31303530383732323032", + "sig" : "3044022067e8ca1907624419e3ccd88002dd7757f595abc84bd861cd0198364a4571ff6b02200db40b6a7200cdc1a09df432a5a763436ab4130cbdee024dea2a3ddd6c023ed9", + "result" : "valid" + }, + { + "tcId" : 317, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32353037373237303332", + "sig" : "3045022100f4d8208eed5cb4bfe4ef6ddbbc3742e780e4212a39cf79c9f85605ee64a962cb022043dee8a3c45a45a91e83a18ff3f881047b4fd6ad3003b3af37fb8211eaf7d584", + "result" : "valid" + }, + { + "tcId" : 318, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "373139333435393339", + "sig" : "304402203363ccc93e2413e47528ab086408bc0521be73353f2c2371bbf2d9dc16e63fb3022068f3d1074a2e06d33fc19a567a8af0edcae923560cf38da2dab82e2249c8dbbd", + "result" : "valid" + }, + { + "tcId" : 319, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31363337333035373633", + "sig" : "304502210084960758125ad8de3df0c113ff35f1644e4d43f661c2d81848f3fe4e55846f1802205983630fc8975bab570d2c9f3cbbdecb4dd6179ec497aff312d807ec26ca940a", + "result" : "valid" + }, + { + "tcId" : 320, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34323431323733373133", + "sig" : "3044022006ca924b5686a22f2e39c0f980fd58d62bbaf33c3a57f98a315332121e9ba60b02206516b98b31048722ca25e0a6c450461823c0a35f37d671439084fbc27c4779a1", + "result" : "valid" + }, + { + "tcId" : 321, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "343735363134373337", + "sig" : "304402200093c5ef07a7d955056b88cc8240060b4ffb42835a3df353cbe16ccb62eaf3f60220364dbea6d5ead4202d6fdc253bb0c2c0522b55823e8bb890235ab09ae9030ea2", + "result" : "valid" + }, + { + "tcId" : 322, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37313632333237373334", + "sig" : "3045022100835274f3157b737975486c73e5bbdd15b61e2ebb9e580911e45fc288214d2e6702201d5dcebfc6d3ae3826b9a3211f5e2249acc967eb47dfd41a849241ffe779154f", + "result" : "valid" + }, + { + "tcId" : 323, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31323232343034313239", + "sig" : "304502203797916fb5c401a691b710050df3eec163383f855f93b61322a56d862ad5572d022100eb7bff4000738a83dd64082eff710d5eb619427198ac290b291f4599768959ca", + "result" : "valid" + }, + { + "tcId" : 324, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33353234353833333638", + "sig" : "3044022070992463694c845183db142a77bf5d73c17e9004a8b946b7b8eeb3fdf2b22e00022003843ec28e4c4d4f7726a5a5835575bb3e272f612246bc3aff288ac4a4e90c90", + "result" : "valid" + }, + { + "tcId" : 325, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3331363334333936", + "sig" : "3046022100aeaf228b41a1f311d4df74717f4134ee992e5f2922eec65ec83e2db82a866472022100f5ef65eb9fc3feaaac04f71a9a5ceb73e8cd6cb75b4595b39b250a50476cb68f", + "result" : "valid" + }, + { + "tcId" : 326, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36353332353938343339", + "sig" : "3045022100b84dbbddd3b8a2ddf67d27e4ef886f72d90cbb7ec2d6883728b27842d61505cc022032be7f0ff420ae3be212beb4c276d93e2527b0964d643c5807c8ee711e66e8e5", + "result" : "valid" + }, + { + "tcId" : 327, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "373338353138353034", + "sig" : "3046022100f7f6782978f376caf9434941535e1c87ad09b9d39ee936145a0b53b9250fd182022100fb752930c84c29e49f81a997a4d0f00fcdcb4a2f2bf8049cca5d7cf70b079cea", + "result" : "valid" + }, + { + "tcId" : 328, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31343635323636353739", + "sig" : "3045022100fb4b434112c1302ffd49ebd993cf5ec59729cbe78739db3c470264e378d56e8d02203aba99bd10be0fba04ca8d9601ae8f68ca7ffe5814f4cfbde78c1cc07a29fd8f", + "result" : "valid" + }, + { + "tcId" : 329, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32303334383839343934", + "sig" : "3046022100eafafe851aad76036013bd571772147b7257fb736ed7b4458e0dcf60a2c7b9c0022100b59c6409e51043b7e5c86a8d465978a4c8f78e13ef5b184fe5f46f201ff4efa8", + "result" : "valid" + }, + { + "tcId" : 330, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34343730383836373835", + "sig" : "304502206c74d1679d871a46a43c3fe375e09d4f1b6413c59b5e070d7984dae0aadbc37e022100ff1d22228c9e9cf9958d677eed4c3a252b10273ce2d360457faabe7f7439c0e8", + "result" : "valid" + }, + { + "tcId" : 331, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "353537363430343436", + "sig" : "3046022100cae28b592e2d5bf6f9ea541e70bceedd07adde40bc2b5f883d35ae9560fc85c202210099eaffc16f570b7837d74177dae6e6cfd873ea89424581bc690d0e49c4218402", + "result" : "valid" + }, + { + "tcId" : 332, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36333434393536363038", + "sig" : "304502206ce5133579dd044447206b9f6e1605d27f094b2c4466a5bf8e157873176baf3a022100bbe35524d9c1936bacecb6c270bf494eac75933caa8dbb2fef30f6572ed8667c", + "result" : "valid" + }, + { + "tcId" : 333, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34393432383039303331", + "sig" : "304402202855cf6e65812ea246e366ab961970d19387039a93f0bd406365d68b0356661302201b3a9593117380899d5c8f8f976ad4dee97db9f1225f735b1d41c2a115be93fb", + "result" : "valid" + }, + { + "tcId" : 334, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "323636353831393339", + "sig" : "304502210090ed3aa89579b73477e3fcba9f52a5a64b9b6d83b475a3881bc0e63d74f6bf9c022004cb5e2ca1d413b37a71607d5b5fa72ccc87a2edcd5c7f30daaa94241b749920", + "result" : "valid" + }, + { + "tcId" : 335, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33333332323134313134", + "sig" : "30450220055e38188756831ced4b01e0f9d4db6b02293c7ee2c3fd47860d38377ee0f4190221009c29f1688f16e111914d9c843c0a8f0306c1c4ddd5167cdd54338a4f4ab79a91", + "result" : "valid" + }, + { + "tcId" : 336, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "363136353237373135", + "sig" : "3045022006b28cd8538d8cc563473cf6c7abb519e4c8bb4c37915ef76512f37de02c2164022100a62dc2afb01a1a9bc877edd54f25fd1f6d0378b3fbaa219ff9ef28c560cc8065", + "result" : "valid" + }, + { + "tcId" : 337, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32333539393535383133", + "sig" : "3045022100c4b97652702efb1d1b67e966e88789efc0d9eb76d32efbeaf9c1bca36b2ea9a5022013e1b2358c7a34fef3ea738ef1a48fab63a2616455c81f8095394a2230c852e3", + "result" : "valid" + }, + { + "tcId" : 338, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "323931333631393538", + "sig" : "304502206a86100848566b5f5f89c13643515d81390952b6b5ce56b64fc3349e4edf21df022100c9ca4ba3a6fd501dae9917283a6851692f57dfbfa49d7a31aa937534df760c87", + "result" : "valid" + }, + { + "tcId" : 339, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31363230393033333936", + "sig" : "3046022100c1ea204ee71a0502fc47de5d89fad98b897b5c308a4030b4a29de9cc39ff1704022100a5261798ed9665358c31a2368c6705b53b5d7d17023c365ae532573593934481", + "result" : "valid" + }, + { + "tcId" : 340, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33333633313032383432", + "sig" : "3045022100b3c13e4907afa5a629398ff4fb50c48fae69dd3721a6f62ac13b901efcb4717c02206cb8a95728751b6274fb57e0e8fc87bd7911b1b94fb92edf09ef30fce410efe7", + "result" : "valid" + }, + { + "tcId" : 341, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "363237373433343931", + "sig" : "30460221009fafebd8841588e56116b2aa354557be814630bae5824e187405f3398f36bc5e022100f01264feb46aeefe68c967e439986f14aeb85ad99b520db572af8d1349d696a6", + "result" : "valid" + }, + { + "tcId" : 342, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33383536373938313437", + "sig" : "3046022100b45703f2c6e95c2f2378913cb78ecf7a01932b66d85e6f687dbb618b056851e8022100e1333352ea3ad42d7fd9a52a9b6dd1252848a180606d30012e142d135156720b", + "result" : "valid" + }, + { + "tcId" : 343, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32383831313830363430", + "sig" : "304502204138934da6329335702814333f4df8f907df7aa8e684cc38e2366961828ad937022100b90b1b0d77fa39c81f3df7a471499ebbe415a372e7c947eae8612646081aeb47", + "result" : "valid" + }, + { + "tcId" : 344, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3130393537333934363738", + "sig" : "3045022100a52a6cca52d60aedc270cfd2fb0e0c2dde1ec4bb61434a7f11cd126ad46bec5602201dba92bb08e5665da3847abf695dbe18aeae37d9fdcd3617fab0c648f48d8ce6", + "result" : "valid" + }, + { + "tcId" : 345, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "353432373131393834", + "sig" : "3045022100b153363d48a58d339a7e53bfedddb63ea63484569bda2630d61c129a45d352e10220592dc8769b4834fae70f2cf3eea157ea9684c56d4875d296313cdf12e4939df8", + "result" : "valid" + }, + { + "tcId" : 346, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33313530303334333235", + "sig" : "304402203516e0c8c97110170a5121b5408043f33c6efbef0e5556165812713be6422ae802205d80c5dffa87d3856083bf67beb27e90ebdc2e54d84760c1588f6432ca733195", + "result" : "valid" + }, + { + "tcId" : 347, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31393939383231333931", + "sig" : "3046022100903d8397244bfc99f2a677507db419597fef6f0cbfd49e0c022709c06c93e358022100f1705f4a19ab86893e0e022bca9081022764bd986c1c891eb80202ec46f50870", + "result" : "valid" + }, + { + "tcId" : 348, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31393731323039323631", + "sig" : "304502203ba4d01ac8cbfc4abf848253d060a4e3faede188fd01c21657c20b61d1943f43022100ca3b5365ffbb98a5539cbe3e71b3d9fc59b5f1d5bee1122870e153ded9e1ce67", + "result" : "valid" + }, + { + "tcId" : 349, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33353731383338383537", + "sig" : "30440220741b76d33821c8cac2361048f10d28060f43e2c30b42b3f1b64a432f322e705c022037331cdebe152ff84bf909183069f278f8b0779042d5486b2d9826b42546952d", + "result" : "valid" + }, + { + "tcId" : 350, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "38363832323639383935", + "sig" : "3045022100d7988135fd211a2cc09a4588f2d91de3a9a9498d5c5c3ef7e78e9bd80906a63f022025de3162aefbd6afedf01116b4e69d498eaefbf29599a7e0ab60614d64fb3db7", + "result" : "valid" + }, + { + "tcId" : 351, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32353438383536303331", + "sig" : "3045022014580cf3aae5ebbb74fed09ff193f347f69ac5b38435eeb7c38a0fd95f5b7ad8022100fcd923fdbdcecb3ece3bd0069c81396b4acf6328648fbe5324ae0c5a276fd87c", + "result" : "valid" + }, + { + "tcId" : 352, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34393935373031333139", + "sig" : "30450220130821bb00d0f4416ef06761aa283d35383cc2d46ad6be76c96d839adce2dbb6022100d9deef38e7d0f136cc535f1f8931f271cbf0b0d9e4e20fc8db7a1fb3c616bb68", + "result" : "valid" + }, + { + "tcId" : 353, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32343536363831373835", + "sig" : "3046022100ab4991cad903fc45f6afe22b939640736aec9788b9d8f94109343649d6327695022100ab126decd1743caf4b461a9c8029cf1230a54a0180e5225a79c075167c2911bc", + "result" : "valid" + }, + { + "tcId" : 354, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34313835333731323336", + "sig" : "3045022100dc3b756b20b906f02dc03b46bbef56708be649bb4b23a41ac4333cd79d72749d0220309dfe0623034d6441332aebb327bf5b0fb2f3d6df5a6c02d836fc908e37b0e0", + "result" : "valid" + }, + { + "tcId" : 355, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "373237383439303034", + "sig" : "3046022100d733b4391a4876d30acdb95977e4fdfded201e698e42be54c5c690b4c83c9036022100f55565475dc58e468b4aaee60eda224770c5b30517944c065758cd5155ae1251", + "result" : "valid" + }, + { + "tcId" : 356, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31353632383139333138", + "sig" : "3045022100aa9ea086e301728e0cac7568bf64095b9f51d070edb46679a9983500245e346802203aeb2415f10625c3a4e818da7ddecea27f56f0a393920f6a5d2f4f3054e2131f", + "result" : "valid" + }, + { + "tcId" : 357, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3231383739393238333836", + "sig" : "3045022100d5a6ffddece918c5fe4e7d3a11344612bfb0cd2735ce071dfade01244c3b303c02200ff4ee3a70b9984e49277b3b15252c9f255b9ed51c7a4473cf55a7955083a985", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0458e71ffbfd2eabf4e4a465f68100f3d23d4702537dfcca5ee89d18a75ad7f75616535d3b19f050e443bf5dc38f7f7cda9df3798d4a2f65a413a9af5df002828c", + "wx" : "58e71ffbfd2eabf4e4a465f68100f3d23d4702537dfcca5ee89d18a75ad7f756", + "wy" : "16535d3b19f050e443bf5dc38f7f7cda9df3798d4a2f65a413a9af5df002828c" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000458e71ffbfd2eabf4e4a465f68100f3d23d4702537dfcca5ee89d18a75ad7f75616535d3b19f050e443bf5dc38f7f7cda9df3798d4a2f65a413a9af5df002828c", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWOcf+/0uq/TkpGX2gQDz0j1HAlN9\n/Mpe6J0Yp1rX91YWU107GfBQ5EO/XcOPf3zanfN5jUovZaQTqa9d8AKCjA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 358, + "comment" : "k*G has a large x-coordinate", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "303502104319055358e8617b0c46353d039cdaab022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e", + "result" : "valid" + }, + { + "tcId" : 359, + "comment" : "r too large", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000000fffffffffffffffffffffffc022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "040a78dad1701d0551089d3a0ee329a22a9d8bf4263c8a50e0668d24306cf0240b03950b34bb638c683c167a00ac06232c2ef1718d3ed7ebcfc145a41031b04ee0", + "wx" : "0a78dad1701d0551089d3a0ee329a22a9d8bf4263c8a50e0668d24306cf0240b", + "wy" : "03950b34bb638c683c167a00ac06232c2ef1718d3ed7ebcfc145a41031b04ee0" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040a78dad1701d0551089d3a0ee329a22a9d8bf4263c8a50e0668d24306cf0240b03950b34bb638c683c167a00ac06232c2ef1718d3ed7ebcfc145a41031b04ee0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECnja0XAdBVEInToO4ymiKp2L9CY8\nilDgZo0kMGzwJAsDlQs0u2OMaDwWegCsBiMsLvFxjT7X68/BRaQQMbBO4A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 360, + "comment" : "r,s are large", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04e5b027e1f5daf6e52eca80e35be28651bf849ff3de70d2a34c0d782b5aaad6853c8e2cff9b02c90bf4d7d49c7ff2a261d26aed7d4022b41392c85a857d434579", + "wx" : "00e5b027e1f5daf6e52eca80e35be28651bf849ff3de70d2a34c0d782b5aaad685", + "wy" : "3c8e2cff9b02c90bf4d7d49c7ff2a261d26aed7d4022b41392c85a857d434579" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004e5b027e1f5daf6e52eca80e35be28651bf849ff3de70d2a34c0d782b5aaad6853c8e2cff9b02c90bf4d7d49c7ff2a261d26aed7d4022b41392c85a857d434579", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5bAn4fXa9uUuyoDjW+KGUb+En/Pe\ncNKjTA14K1qq1oU8jiz/mwLJC/TX1Jx/8qJh0mrtfUAitBOSyFqFfUNFeQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 361, + "comment" : "r and s^-1 have a large Hamming weight", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100909135bdb6799286170f5ead2de4f6511453fe50914f3df2de54a36383df8dd4", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0424c5462bb7d1f1763ce28b3a9f851d86d7cb4c5f7c61ed9ed7d397f1a920ffc99460936b6919f88646844b27503555262ef8a81e6704f43e07deda12aa06f4ae", + "wx" : "24c5462bb7d1f1763ce28b3a9f851d86d7cb4c5f7c61ed9ed7d397f1a920ffc9", + "wy" : "009460936b6919f88646844b27503555262ef8a81e6704f43e07deda12aa06f4ae" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000424c5462bb7d1f1763ce28b3a9f851d86d7cb4c5f7c61ed9ed7d397f1a920ffc99460936b6919f88646844b27503555262ef8a81e6704f43e07deda12aa06f4ae", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEJMVGK7fR8XY84os6n4UdhtfLTF98\nYe2e19OX8akg/8mUYJNraRn4hkaESydQNVUmLvioHmcE9D4H3toSqgb0rg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 362, + "comment" : "r and s^-1 have a large Hamming weight", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022027b4577ca009376f71303fd5dd227dcef5deb773ad5f5a84360644669ca249a5", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "046226bb83d3cef01ae27b7d04a905397682d5e4a5964b5160dba8a055a2e2aeca7a3630d49d999d0e85e59fe762c9c567cb767ca2a0a7a7756ac917e6085b18e1", + "wx" : "6226bb83d3cef01ae27b7d04a905397682d5e4a5964b5160dba8a055a2e2aeca", + "wy" : "7a3630d49d999d0e85e59fe762c9c567cb767ca2a0a7a7756ac917e6085b18e1" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046226bb83d3cef01ae27b7d04a905397682d5e4a5964b5160dba8a055a2e2aeca7a3630d49d999d0e85e59fe762c9c567cb767ca2a0a7a7756ac917e6085b18e1", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYia7g9PO8Brie30EqQU5doLV5KWW\nS1Fg26igVaLirsp6NjDUnZmdDoXln+diycVny3Z8oqCnp3VqyRfmCFsY4Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 363, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020105020101", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0465af8c23310fe060a09e7366d82ea35f48f8e2c682eab3783de7d9711f5923bebebabfaf084741fc806b9698ef87c9459246b7846fa17400094ad0bb222c2cb6", + "wx" : "65af8c23310fe060a09e7366d82ea35f48f8e2c682eab3783de7d9711f5923be", + "wy" : "00bebabfaf084741fc806b9698ef87c9459246b7846fa17400094ad0bb222c2cb6" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000465af8c23310fe060a09e7366d82ea35f48f8e2c682eab3783de7d9711f5923bebebabfaf084741fc806b9698ef87c9459246b7846fa17400094ad0bb222c2cb6", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEZa+MIzEP4GCgnnNm2C6jX0j44saC\n6rN4PefZcR9ZI76+ur+vCEdB/IBrlpjvh8lFkka3hG+hdAAJStC7Iiwstg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 364, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020105020103", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04f26ea876edab91b4070c5ec6e36663fff86f1fe5ef73938b227766b1805773cd07059506a5296d5766d4c55c06eebccf81c04e52cb14c3b198a18808d570d417", + "wx" : "00f26ea876edab91b4070c5ec6e36663fff86f1fe5ef73938b227766b1805773cd", + "wy" : "07059506a5296d5766d4c55c06eebccf81c04e52cb14c3b198a18808d570d417" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004f26ea876edab91b4070c5ec6e36663fff86f1fe5ef73938b227766b1805773cd07059506a5296d5766d4c55c06eebccf81c04e52cb14c3b198a18808d570d417", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE8m6odu2rkbQHDF7G42Zj//hvH+Xv\nc5OLIndmsYBXc80HBZUGpSltV2bUxVwG7rzPgcBOUssUw7GYoYgI1XDUFw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 365, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020105020105", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "047811e16675799076c4f5ea78e5f833be4649925165672057443c436cf4017e0d8e377d53fecdf1556b1cdfdd8270d920cf7c6d32c946af2db4c864faec6b1eba", + "wx" : "7811e16675799076c4f5ea78e5f833be4649925165672057443c436cf4017e0d", + "wy" : "008e377d53fecdf1556b1cdfdd8270d920cf7c6d32c946af2db4c864faec6b1eba" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047811e16675799076c4f5ea78e5f833be4649925165672057443c436cf4017e0d8e377d53fecdf1556b1cdfdd8270d920cf7c6d32c946af2db4c864faec6b1eba", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEeBHhZnV5kHbE9ep45fgzvkZJklFl\nZyBXRDxDbPQBfg2ON31T/s3xVWsc392CcNkgz3xtMslGry20yGT67Gseug==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 366, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020105020106", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04614ec72ada338db0177b53573827f11c5b95b577117f14580aa81e12b47aeb8cd89bf53fd6de48ec10fa6ed7213474c04c5990ca9e14dc098a4ed4b6805937cf", + "wx" : "614ec72ada338db0177b53573827f11c5b95b577117f14580aa81e12b47aeb8c", + "wy" : "00d89bf53fd6de48ec10fa6ed7213474c04c5990ca9e14dc098a4ed4b6805937cf" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004614ec72ada338db0177b53573827f11c5b95b577117f14580aa81e12b47aeb8cd89bf53fd6de48ec10fa6ed7213474c04c5990ca9e14dc098a4ed4b6805937cf", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYU7HKtozjbAXe1NXOCfxHFuVtXcR\nfxRYCqgeErR664zYm/U/1t5I7BD6btchNHTATFmQyp4U3AmKTtS2gFk3zw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 367, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020106020101", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0452c01eaee2e5c30e7db97061b0e00b44f7199a23c1db44f2428e342a71e1df6ee37cc4355d79bfa76afc34e2db9cdac7f451cc9b28f772269c8b017d964d9a67", + "wx" : "52c01eaee2e5c30e7db97061b0e00b44f7199a23c1db44f2428e342a71e1df6e", + "wy" : "00e37cc4355d79bfa76afc34e2db9cdac7f451cc9b28f772269c8b017d964d9a67" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000452c01eaee2e5c30e7db97061b0e00b44f7199a23c1db44f2428e342a71e1df6ee37cc4355d79bfa76afc34e2db9cdac7f451cc9b28f772269c8b017d964d9a67", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEUsAeruLlww59uXBhsOALRPcZmiPB\n20TyQo40KnHh327jfMQ1XXm/p2r8NOLbnNrH9FHMmyj3ciaciwF9lk2aZw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 368, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020106020103", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0478c04ef617e9ba8427a4946816e39c1319ff166ad0f248ef61b48e80e8b5a23512d07e5c45e1500c8ca4f714f68d47f762cad5ce8b798fbac0e1e2bfa395bc5e", + "wx" : "78c04ef617e9ba8427a4946816e39c1319ff166ad0f248ef61b48e80e8b5a235", + "wy" : "12d07e5c45e1500c8ca4f714f68d47f762cad5ce8b798fbac0e1e2bfa395bc5e" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000478c04ef617e9ba8427a4946816e39c1319ff166ad0f248ef61b48e80e8b5a23512d07e5c45e1500c8ca4f714f68d47f762cad5ce8b798fbac0e1e2bfa395bc5e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEeMBO9hfpuoQnpJRoFuOcExn/FmrQ\n8kjvYbSOgOi1ojUS0H5cReFQDIyk9xT2jUf3YsrVzot5j7rA4eK/o5W8Xg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 369, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020106020106", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "045a6605c4dd6006cd2575c4e5a4eeecb99513b3df4ad1482218951b44b9dc615327d7b42d22a138d10d275fc4bf3363fcabc2d3cb22d8b68e8f358f28bc765c39", + "wx" : "5a6605c4dd6006cd2575c4e5a4eeecb99513b3df4ad1482218951b44b9dc6153", + "wy" : "27d7b42d22a138d10d275fc4bf3363fcabc2d3cb22d8b68e8f358f28bc765c39" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045a6605c4dd6006cd2575c4e5a4eeecb99513b3df4ad1482218951b44b9dc615327d7b42d22a138d10d275fc4bf3363fcabc2d3cb22d8b68e8f358f28bc765c39", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWmYFxN1gBs0ldcTlpO7suZUTs99K\n0UgiGJUbRLncYVMn17QtIqE40Q0nX8S/M2P8q8LTyyLYto6PNY8ovHZcOQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 370, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020106020107", + "result" : "valid" + }, + { + "tcId" : 371, + "comment" : "r is larger than n", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632557020107", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04254166f8cc3c42f25c88ad410aa3e3003165de62377aa1eb2baf1ca00c6f6e402abea7a234b07e3f962839ba9c31fdbc3b86618e2151fe50cbcc24153e86f5d9", + "wx" : "254166f8cc3c42f25c88ad410aa3e3003165de62377aa1eb2baf1ca00c6f6e40", + "wy" : "2abea7a234b07e3f962839ba9c31fdbc3b86618e2151fe50cbcc24153e86f5d9" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004254166f8cc3c42f25c88ad410aa3e3003165de62377aa1eb2baf1ca00c6f6e402abea7a234b07e3f962839ba9c31fdbc3b86618e2151fe50cbcc24153e86f5d9", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEJUFm+Mw8QvJciK1BCqPjADFl3mI3\neqHrK68coAxvbkAqvqeiNLB+P5YoObqcMf28O4ZhjiFR/lDLzCQVPob12Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 372, + "comment" : "s is larger than n", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3026020106022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc75fbd8", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "044b2475ae911ab3e3334bd5acefce2225e35ad7f4523df52c13f581b87898cca195575d5296d1bd97efaa74a12cc0df3d556a614f176c25b06348af8d304ea6c7", + "wx" : "4b2475ae911ab3e3334bd5acefce2225e35ad7f4523df52c13f581b87898cca1", + "wy" : "0095575d5296d1bd97efaa74a12cc0df3d556a614f176c25b06348af8d304ea6c7" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044b2475ae911ab3e3334bd5acefce2225e35ad7f4523df52c13f581b87898cca195575d5296d1bd97efaa74a12cc0df3d556a614f176c25b06348af8d304ea6c7", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAESyR1rpEas+MzS9Ws784iJeNa1/RS\nPfUsE/WBuHiYzKGVV11SltG9l++qdKEswN89VWphTxdsJbBjSK+NME6mxw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 373, + "comment" : "small r and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3027020201000221008f1e3c7862c58b16bb76eddbb76eddbb516af4f63f2d74d76e0d28c9bb75ea88", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04211cc26f1f60998bccfc6ae65cfe8f1bf2e70fc28b5aaf8e2a297f3f4460662c3ffc8dbd9b58a341d5160ff03b7a503649967a9a937edbbfc4bf154aa6e1a0ae", + "wx" : "211cc26f1f60998bccfc6ae65cfe8f1bf2e70fc28b5aaf8e2a297f3f4460662c", + "wy" : "3ffc8dbd9b58a341d5160ff03b7a503649967a9a937edbbfc4bf154aa6e1a0ae" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004211cc26f1f60998bccfc6ae65cfe8f1bf2e70fc28b5aaf8e2a297f3f4460662c3ffc8dbd9b58a341d5160ff03b7a503649967a9a937edbbfc4bf154aa6e1a0ae", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIRzCbx9gmYvM/GrmXP6PG/LnD8KL\nWq+OKil/P0RgZiw//I29m1ijQdUWD/A7elA2SZZ6mpN+27/EvxVKpuGgrg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 374, + "comment" : "smallish r and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "302c02072d9b4d347952d6022100ef3043e7329581dbb3974497710ab11505ee1c87ff907beebadd195a0ffe6d7a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "040a7bb520f0cc16284831167d3622b276487a7bbf41bf911d367b484f1bd81a0c0c30d573d27d44e68fb9a109ac7faad2c57ae09de30d8203ab409cd3ca63af3a", + "wx" : "0a7bb520f0cc16284831167d3622b276487a7bbf41bf911d367b484f1bd81a0c", + "wy" : "0c30d573d27d44e68fb9a109ac7faad2c57ae09de30d8203ab409cd3ca63af3a" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040a7bb520f0cc16284831167d3622b276487a7bbf41bf911d367b484f1bd81a0c0c30d573d27d44e68fb9a109ac7faad2c57ae09de30d8203ab409cd3ca63af3a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECnu1IPDMFihIMRZ9NiKydkh6e79B\nv5EdNntITxvYGgwMMNVz0n1E5o+5oQmsf6rSxXrgneMNggOrQJzTymOvOg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 375, + "comment" : "100-bit r and small s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3032020d1033e67e37b32b445580bf4eff0221008b748b74000000008b748b748b748b7466e769ad4a16d3dcd87129b8e91d1b4d", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04d528a48fb391dd490d3f32810570613d16fe2709b82245027705e359549b0e155f4a5ac279d55c9ea6371f56403f816ee723632911df9804f01c7fa289eb2361", + "wx" : "00d528a48fb391dd490d3f32810570613d16fe2709b82245027705e359549b0e15", + "wy" : "5f4a5ac279d55c9ea6371f56403f816ee723632911df9804f01c7fa289eb2361" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d528a48fb391dd490d3f32810570613d16fe2709b82245027705e359549b0e155f4a5ac279d55c9ea6371f56403f816ee723632911df9804f01c7fa289eb2361", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE1Sikj7OR3UkNPzKBBXBhPRb+Jwm4\nIkUCdwXjWVSbDhVfSlrCedVcnqY3H1ZAP4Fu5yNjKRHfmATwHH+iiesjYQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 376, + "comment" : "small r and 100 bit s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "302702020100022100ef9f6ba4d97c09d03178fa20b4aaad83be3cf9cb824a879fec3270fc4b81ef5b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04d1f035f0a28c0c49e6248ff373874da5b26b47e7cd89c1b3bd15402dc9bd7b627a182a1884f30222976579d766da681a7f31fe55b14e770dd0f3f1c09654b29c", + "wx" : "00d1f035f0a28c0c49e6248ff373874da5b26b47e7cd89c1b3bd15402dc9bd7b62", + "wy" : "7a182a1884f30222976579d766da681a7f31fe55b14e770dd0f3f1c09654b29c" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d1f035f0a28c0c49e6248ff373874da5b26b47e7cd89c1b3bd15402dc9bd7b627a182a1884f30222976579d766da681a7f31fe55b14e770dd0f3f1c09654b29c", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE0fA18KKMDEnmJI/zc4dNpbJrR+fN\nicGzvRVALcm9e2J6GCoYhPMCIpdleddm2mgafzH+VbFOdw3Q8/HAllSynA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 377, + "comment" : "100-bit r and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3032020d062522bbd3ecbe7c39e93e7c25022100ef9f6ba4d97c09d03178fa20b4aaad83be3cf9cb824a879fec3270fc4b81ef5b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0407df495050dcb1738f4e2aac5ba2c8a1f8e09d262a3b001865af3fba086d7aa1b596cde482a6bfdc5e49e4069fce7c2d1145d1e0f7fed63f9e848446fae479ed", + "wx" : "07df495050dcb1738f4e2aac5ba2c8a1f8e09d262a3b001865af3fba086d7aa1", + "wy" : "00b596cde482a6bfdc5e49e4069fce7c2d1145d1e0f7fed63f9e848446fae479ed" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000407df495050dcb1738f4e2aac5ba2c8a1f8e09d262a3b001865af3fba086d7aa1b596cde482a6bfdc5e49e4069fce7c2d1145d1e0f7fed63f9e848446fae479ed", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEB99JUFDcsXOPTiqsW6LIofjgnSYq\nOwAYZa8/ughteqG1ls3kgqa/3F5J5AafznwtEUXR4Pf+1j+ehIRG+uR57Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 378, + "comment" : "r and s^-1 are close to n", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d50220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "047191df2d2802bf5c1c7f1a920334e7344ef340e8e5260ba6321bf1d8598099717fb768b3fe7eb246237e1ab5f42cc18d4b73e53b06ccfd7c86b0a13e7f6c411f", + "wx" : "7191df2d2802bf5c1c7f1a920334e7344ef340e8e5260ba6321bf1d859809971", + "wy" : "7fb768b3fe7eb246237e1ab5f42cc18d4b73e53b06ccfd7c86b0a13e7f6c411f" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047191df2d2802bf5c1c7f1a920334e7344ef340e8e5260ba6321bf1d8598099717fb768b3fe7eb246237e1ab5f42cc18d4b73e53b06ccfd7c86b0a13e7f6c411f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEcZHfLSgCv1wcfxqSAzTnNE7zQOjl\nJgumMhvx2FmAmXF/t2iz/n6yRiN+GrX0LMGNS3PlOwbM/XyGsKE+f2xBHw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 379, + "comment" : "r and s are 64-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30160209009c44febf31c3594f020900839ed28247c2b06b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042c85a72b248789298f58a5a26a94afa6f5d6a7eb1eaac513ab23eefd9cb4ff99a1a1d193532f4c29d6625055000985809b5e8b8a10c72917d72e01c2f94aeeb2", + "wx" : "2c85a72b248789298f58a5a26a94afa6f5d6a7eb1eaac513ab23eefd9cb4ff99", + "wy" : "00a1a1d193532f4c29d6625055000985809b5e8b8a10c72917d72e01c2f94aeeb2" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042c85a72b248789298f58a5a26a94afa6f5d6a7eb1eaac513ab23eefd9cb4ff99a1a1d193532f4c29d6625055000985809b5e8b8a10c72917d72e01c2f94aeeb2", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAELIWnKySHiSmPWKWiapSvpvXWp+se\nqsUTqyPu/Zy0/5mhodGTUy9MKdZiUFUACYWAm16LihDHKRfXLgHC+Urusg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 380, + "comment" : "r and s are 100-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "301e020d09df8b682430beef6f5fd7c7cd020d0fd0a62e13778f4222a0d61c8a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04d12e2032878b23d1de80f0c651ef0808a70dc2d70cc3dcd20b98ac1a92d5d5022fd7907dde50f2787f5624ff87e7c30b1dabfd9205628a77205543aa27f4add6", + "wx" : "00d12e2032878b23d1de80f0c651ef0808a70dc2d70cc3dcd20b98ac1a92d5d502", + "wy" : "2fd7907dde50f2787f5624ff87e7c30b1dabfd9205628a77205543aa27f4add6" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d12e2032878b23d1de80f0c651ef0808a70dc2d70cc3dcd20b98ac1a92d5d5022fd7907dde50f2787f5624ff87e7c30b1dabfd9205628a77205543aa27f4add6", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE0S4gMoeLI9HegPDGUe8ICKcNwtcM\nw9zSC5isGpLV1QIv15B93lDyeH9WJP+H58MLHav9kgViincgVUOqJ/St1g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 381, + "comment" : "r and s are 128-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30260211008a598e563a89f526c32ebec8de26367c02110084f633e2042630e99dd0f1e16f7a04bf", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04c426e874ea701e368f3b0bffb0342e6e439769cd5c0cbf412b2114318ae2bb0d8ef8853bebf73416641b4b3516c939364fe0e042a503ee5fe1e3f497371f920b", + "wx" : "00c426e874ea701e368f3b0bffb0342e6e439769cd5c0cbf412b2114318ae2bb0d", + "wy" : "008ef8853bebf73416641b4b3516c939364fe0e042a503ee5fe1e3f497371f920b" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004c426e874ea701e368f3b0bffb0342e6e439769cd5c0cbf412b2114318ae2bb0d8ef8853bebf73416641b4b3516c939364fe0e042a503ee5fe1e3f497371f920b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExCbodOpwHjaPOwv/sDQubkOXac1c\nDL9BKyEUMYriuw2O+IU76/c0FmQbSzUWyTk2T+DgQqUD7l/h4/SXNx+SCw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 382, + "comment" : "r and s are 160-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "302e021500aa6eeb5823f7fa31b466bb473797f0d0314c0bdf021500e2977c479e6d25703cebbc6bd561938cc9d1bfb9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04ccd70d8730532b28c78c27dbd3043fdde3e96f10ede406582c9cba2618dc03c195d592c366bd189683fd581dde22fb91176b55d94e48dd81467234777d8c223a", + "wx" : "00ccd70d8730532b28c78c27dbd3043fdde3e96f10ede406582c9cba2618dc03c1", + "wy" : "0095d592c366bd189683fd581dde22fb91176b55d94e48dd81467234777d8c223a" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ccd70d8730532b28c78c27dbd3043fdde3e96f10ede406582c9cba2618dc03c195d592c366bd189683fd581dde22fb91176b55d94e48dd81467234777d8c223a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzNcNhzBTKyjHjCfb0wQ/3ePpbxDt\n5AZYLJy6JhjcA8GV1ZLDZr0YloP9WB3eIvuRF2tV2U5I3YFGcjR3fYwiOg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 383, + "comment" : "s == 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30250220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70020101", + "result" : "valid" + }, + { + "tcId" : 384, + "comment" : "s == 0", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30250220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70020100", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "041f8988dacc3cad2c1b0c8ffd0a658aea1a3087fc17ff0e6b8c18460d27b85c51ff457f9c9d0f0ec9a600f80fffdd61ef4796393412e7a20fde0681d3cf459207", + "wx" : "1f8988dacc3cad2c1b0c8ffd0a658aea1a3087fc17ff0e6b8c18460d27b85c51", + "wy" : "00ff457f9c9d0f0ec9a600f80fffdd61ef4796393412e7a20fde0681d3cf459207" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200041f8988dacc3cad2c1b0c8ffd0a658aea1a3087fc17ff0e6b8c18460d27b85c51ff457f9c9d0f0ec9a600f80fffdd61ef4796393412e7a20fde0681d3cf459207", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEH4mI2sw8rSwbDI/9CmWK6howh/wX\n/w5rjBhGDSe4XFH/RX+cnQ8OyaYA+A//3WHvR5Y5NBLnog/eBoHTz0WSBw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 385, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022002f676969f451a8ccafa4c4f09791810e6d632dbd60b1d5540f3284fbe1889b0", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04f4abc335796df25dd37438ffa95f10e95a7aa151772866d4d4552f4e57bc8534cd2ffd7ce1c68f1c76273907a63efff7b37d892056e1a92ecc92011f29123149", + "wx" : "00f4abc335796df25dd37438ffa95f10e95a7aa151772866d4d4552f4e57bc8534", + "wy" : "00cd2ffd7ce1c68f1c76273907a63efff7b37d892056e1a92ecc92011f29123149" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004f4abc335796df25dd37438ffa95f10e95a7aa151772866d4d4552f4e57bc8534cd2ffd7ce1c68f1c76273907a63efff7b37d892056e1a92ecc92011f29123149", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE9KvDNXlt8l3TdDj/qV8Q6Vp6oVF3\nKGbU1FUvTle8hTTNL/184caPHHYnOQemPv/3s32JIFbhqS7MkgEfKRIxSQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 386, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002204e260962e33362ef0046126d2d5a4edc6947ab20e19b8ec19cf79e5908b6e628", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04c14f3c54383dc417e1c5b5435e22970244ca7224b5f1de57e3504ba1d3c2917f1f918ffaf92826215ce07f5f154f85a8a53da1562b21956852b9e17f89a67a30", + "wx" : "00c14f3c54383dc417e1c5b5435e22970244ca7224b5f1de57e3504ba1d3c2917f", + "wy" : "1f918ffaf92826215ce07f5f154f85a8a53da1562b21956852b9e17f89a67a30" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004c14f3c54383dc417e1c5b5435e22970244ca7224b5f1de57e3504ba1d3c2917f1f918ffaf92826215ce07f5f154f85a8a53da1562b21956852b9e17f89a67a30", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwU88VDg9xBfhxbVDXiKXAkTKciS1\n8d5X41BLodPCkX8fkY/6+SgmIVzgf18VT4WopT2hVishlWhSueF/iaZ6MA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 387, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220077ed0d8f20f697d8fc591ac64dd5219c7932122b4f9b9ec6441e44a0092cf21", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "049b2c90cfdd7a8a863e7b6c87808084e9aa3139f28f4003a70f5f4eab7451acc21e9d89ce759ca1dacc053c891d62c3cfff7825ae90939eca14144dc412246518", + "wx" : "009b2c90cfdd7a8a863e7b6c87808084e9aa3139f28f4003a70f5f4eab7451acc2", + "wy" : "1e9d89ce759ca1dacc053c891d62c3cfff7825ae90939eca14144dc412246518" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200049b2c90cfdd7a8a863e7b6c87808084e9aa3139f28f4003a70f5f4eab7451acc21e9d89ce759ca1dacc053c891d62c3cfff7825ae90939eca14144dc412246518", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEmyyQz916ioY+e2yHgICE6aoxOfKP\nQAOnD19Oq3RRrMIenYnOdZyh2swFPIkdYsPP/3glrpCTnsoUFE3EEiRlGA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 388, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002203e0292a67e181c6c0105ee35e956e78e9bdd033c6e71ae57884039a245e4175f", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04610f3e2d4c77a03ef50fa14f493f4339495a1ec17fa8f808a882a511609aa7cff3aa69595f06ad03ad66631776ab92f46bb3ba4076a6700aa8e2506c7c3465dc", + "wx" : "610f3e2d4c77a03ef50fa14f493f4339495a1ec17fa8f808a882a511609aa7cf", + "wy" : "00f3aa69595f06ad03ad66631776ab92f46bb3ba4076a6700aa8e2506c7c3465dc" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004610f3e2d4c77a03ef50fa14f493f4339495a1ec17fa8f808a882a511609aa7cff3aa69595f06ad03ad66631776ab92f46bb3ba4076a6700aa8e2506c7c3465dc", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYQ8+LUx3oD71D6FPST9DOUlaHsF/\nqPgIqIKlEWCap8/zqmlZXwatA61mYxd2q5L0a7O6QHamcAqo4lBsfDRl3A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 389, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022013d22b06d6b8f5d97e0c64962b4a3bae30f668ca6217ef5b35d799f159e23ebe", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "041d4adb9b39e60961642009a7fcf652bdf2486a2a1d81d2053e0f74cf44ee25bcfc970fa80e9254aadeaf29953a70bcfec45036e80e9ffd2fcb613e0b77f3a79b", + "wx" : "1d4adb9b39e60961642009a7fcf652bdf2486a2a1d81d2053e0f74cf44ee25bc", + "wy" : "00fc970fa80e9254aadeaf29953a70bcfec45036e80e9ffd2fcb613e0b77f3a79b" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200041d4adb9b39e60961642009a7fcf652bdf2486a2a1d81d2053e0f74cf44ee25bcfc970fa80e9254aadeaf29953a70bcfec45036e80e9ffd2fcb613e0b77f3a79b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHUrbmznmCWFkIAmn/PZSvfJIaiod\ngdIFPg90z0TuJbz8lw+oDpJUqt6vKZU6cLz+xFA26A6f/S/LYT4Ld/Onmw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 390, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002204523ce342e4994bb8968bf6613f60c06c86111f15a3a389309e72cd447d5dd99", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04e07cd7e84b60e1796d2bc60425d6d78d23d1fd8ac9307dc093f192091729098bfbddbe1f37d56cd70d724351ace73a9bafae86ff25b07f6bc5c3bb0dc9e6c5ea", + "wx" : "00e07cd7e84b60e1796d2bc60425d6d78d23d1fd8ac9307dc093f192091729098b", + "wy" : "00fbddbe1f37d56cd70d724351ace73a9bafae86ff25b07f6bc5c3bb0dc9e6c5ea" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004e07cd7e84b60e1796d2bc60425d6d78d23d1fd8ac9307dc093f192091729098bfbddbe1f37d56cd70d724351ace73a9bafae86ff25b07f6bc5c3bb0dc9e6c5ea", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE4HzX6Etg4XltK8YEJdbXjSPR/YrJ\nMH3Ak/GSCRcpCYv73b4fN9Vs1w1yQ1Gs5zqbr66G/yWwf2vFw7sNyebF6g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 391, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022037d765be3c9c78189ad30edb5097a4db670de11686d01420e37039d4677f4809", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0416721082930348f66413f7e2f857e8c274504ea66882968ae67dabd67eacf97547f56aeb5ea69ef5f148a534fc483f3aa1d81ac7fc4c2fb09528d80b7fceee8b", + "wx" : "16721082930348f66413f7e2f857e8c274504ea66882968ae67dabd67eacf975", + "wy" : "47f56aeb5ea69ef5f148a534fc483f3aa1d81ac7fc4c2fb09528d80b7fceee8b" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000416721082930348f66413f7e2f857e8c274504ea66882968ae67dabd67eacf97547f56aeb5ea69ef5f148a534fc483f3aa1d81ac7fc4c2fb09528d80b7fceee8b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFnIQgpMDSPZkE/fi+FfownRQTqZo\ngpaK5n2r1n6s+XVH9WrrXqae9fFIpTT8SD86odgax/xML7CVKNgLf87uiw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 392, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022044237823b54e0c74c2bf5f759d9ac5f8cb897d537ffa92effd4f0bb6c9acd860", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04ed6a45063ce925581a2f1311175b803d52734b1d1eb228e2b7613fb035fceb176acf1c484f0a1b69edc4a57b7034071ffcf59bbfefbfc0e26bd782001ba64648", + "wx" : "00ed6a45063ce925581a2f1311175b803d52734b1d1eb228e2b7613fb035fceb17", + "wy" : "6acf1c484f0a1b69edc4a57b7034071ffcf59bbfefbfc0e26bd782001ba64648" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ed6a45063ce925581a2f1311175b803d52734b1d1eb228e2b7613fb035fceb176acf1c484f0a1b69edc4a57b7034071ffcf59bbfefbfc0e26bd782001ba64648", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE7WpFBjzpJVgaLxMRF1uAPVJzSx0e\nsijit2E/sDX86xdqzxxITwobae3EpXtwNAcf/PWbv++/wOJr14IAG6ZGSA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 393, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220266d30a485385906054ca86d46f5f2b17e7f4646a3092092ad92877126538111", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0473b53fb23c69bd8125654f20f4d06e0c5c95bcf8517f9ddb4b2ebfdaa8cf697728c7ee3f0f7d01f7c1786cca19c2e615e6ae6f5893621c3987497e82da8e48d8", + "wx" : "73b53fb23c69bd8125654f20f4d06e0c5c95bcf8517f9ddb4b2ebfdaa8cf6977", + "wy" : "28c7ee3f0f7d01f7c1786cca19c2e615e6ae6f5893621c3987497e82da8e48d8" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000473b53fb23c69bd8125654f20f4d06e0c5c95bcf8517f9ddb4b2ebfdaa8cf697728c7ee3f0f7d01f7c1786cca19c2e615e6ae6f5893621c3987497e82da8e48d8", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEc7U/sjxpvYElZU8g9NBuDFyVvPhR\nf53bSy6/2qjPaXcox+4/D30B98F4bMoZwuYV5q5vWJNiHDmHSX6C2o5I2A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 394, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220538c7b3798e84d0ce90340165806348971ed44db8f0c674f5f215968390f92ee", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042cce7a425b581db81b8d5cf49dc91b0fc87bfb68fd39441753b95c4553df9e3817c82c0f948a7f87d369342aebb69c7b4c31e7effaeebd47613f178440079b04", + "wx" : "2cce7a425b581db81b8d5cf49dc91b0fc87bfb68fd39441753b95c4553df9e38", + "wy" : "17c82c0f948a7f87d369342aebb69c7b4c31e7effaeebd47613f178440079b04" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042cce7a425b581db81b8d5cf49dc91b0fc87bfb68fd39441753b95c4553df9e3817c82c0f948a7f87d369342aebb69c7b4c31e7effaeebd47613f178440079b04", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAELM56QltYHbgbjVz0nckbD8h7+2j9\nOUQXU7lcRVPfnjgXyCwPlIp/h9NpNCrrtpx7TDHn7/ruvUdhPxeEQAebBA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 395, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002206fef0ef15d1688e15e704c4e6bb8bb7f40d52d3af5c661bb78c4ed9b408699b3", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042def9d0d74cce8abf9392d66d5a615376287960a77d9c4c11a58a263033f09e9666783f2b5fd528738f87da459a51f6ad6be34427366bba458d8f16260427409", + "wx" : "2def9d0d74cce8abf9392d66d5a615376287960a77d9c4c11a58a263033f09e9", + "wy" : "666783f2b5fd528738f87da459a51f6ad6be34427366bba458d8f16260427409" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042def9d0d74cce8abf9392d66d5a615376287960a77d9c4c11a58a263033f09e9666783f2b5fd528738f87da459a51f6ad6be34427366bba458d8f16260427409", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAELe+dDXTM6Kv5OS1m1aYVN2KHlgp3\n2cTBGliiYwM/CelmZ4Pytf1Shzj4faRZpR9q1r40QnNmu6RY2PFiYEJ0CQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 396, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002206f44275e9aeb1331efcb8d58f35c0252791427e403ad84daad51d247cc2a64c6", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04e8d58db82caa3cbee903594e9a8d2f68b5dc005303e2272c315b5c9cd9e979c78dc83d900692ee88dd413e1a5ca79e31fcc0fb70da773be382fce154c0859d89", + "wx" : "00e8d58db82caa3cbee903594e9a8d2f68b5dc005303e2272c315b5c9cd9e979c7", + "wy" : "008dc83d900692ee88dd413e1a5ca79e31fcc0fb70da773be382fce154c0859d89" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004e8d58db82caa3cbee903594e9a8d2f68b5dc005303e2272c315b5c9cd9e979c78dc83d900692ee88dd413e1a5ca79e31fcc0fb70da773be382fce154c0859d89", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE6NWNuCyqPL7pA1lOmo0vaLXcAFMD\n4icsMVtcnNnpeceNyD2QBpLuiN1BPhpcp54x/MD7cNp3O+OC/OFUwIWdiQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 397, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022021323755b103d2f9da6ab83eccab9ad8598bcf625652f10e7a3eeee3c3945fb3", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0471434412bb06b96a7acd4d89017aa877746fd38fc7aac6c65b52443b1af8a29f242e9bdf23984bf7232d6c37a47411c653c89a9093e140e321167b28fd21eb7b", + "wx" : "71434412bb06b96a7acd4d89017aa877746fd38fc7aac6c65b52443b1af8a29f", + "wy" : "242e9bdf23984bf7232d6c37a47411c653c89a9093e140e321167b28fd21eb7b" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000471434412bb06b96a7acd4d89017aa877746fd38fc7aac6c65b52443b1af8a29f242e9bdf23984bf7232d6c37a47411c653c89a9093e140e321167b28fd21eb7b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEcUNEErsGuWp6zU2JAXqod3Rv04/H\nqsbGW1JEOxr4op8kLpvfI5hL9yMtbDekdBHGU8iakJPhQOMhFnso/SHrew==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 398, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002206c50acfe76de1289e7a5edb240f1c2a7879db6873d5d931f3c6ac467a6eac171", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04ff9dd577f73a189a2505d428db8c3b298d2c0e4ad749608a5bd69d528ee9d3a1c96de2d4d55742a132b5ce72c79e43bdfd55c8054f6a095ba2c08166bd1ec583", + "wx" : "00ff9dd577f73a189a2505d428db8c3b298d2c0e4ad749608a5bd69d528ee9d3a1", + "wy" : "00c96de2d4d55742a132b5ce72c79e43bdfd55c8054f6a095ba2c08166bd1ec583" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ff9dd577f73a189a2505d428db8c3b298d2c0e4ad749608a5bd69d528ee9d3a1c96de2d4d55742a132b5ce72c79e43bdfd55c8054f6a095ba2c08166bd1ec583", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/53Vd/c6GJolBdQo24w7KY0sDkrX\nSWCKW9adUo7p06HJbeLU1VdCoTK1znLHnkO9/VXIBU9qCVuiwIFmvR7Fgw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 399, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220755b7fffb0b17ad57dca50fcefb7fe297b029df25e5ccb5069e8e70c2742c2a6", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04fc13b37baba182ba13dfc8ca74f5896483378aa9bd6f0aa931877ddc5e77262f1bf8b9cfdcbbe0d62eed81e5874310bd51178d1c6d01b6929a345d94190fdf3b", + "wx" : "00fc13b37baba182ba13dfc8ca74f5896483378aa9bd6f0aa931877ddc5e77262f", + "wy" : "1bf8b9cfdcbbe0d62eed81e5874310bd51178d1c6d01b6929a345d94190fdf3b" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004fc13b37baba182ba13dfc8ca74f5896483378aa9bd6f0aa931877ddc5e77262f1bf8b9cfdcbbe0d62eed81e5874310bd51178d1c6d01b6929a345d94190fdf3b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/BOze6uhgroT38jKdPWJZIM3iqm9\nbwqpMYd93F53Ji8b+LnP3Lvg1i7tgeWHQxC9UReNHG0BtpKaNF2UGQ/fOw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 400, + "comment" : "point at infinity during verify", + "flags" : [ + "PointDuplication", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a80220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0420adbb6cb9e09ce8ee4b6bdbc2e8047a0b9dc811eb415a2a258906efbd8a88cec16b2111b5991d98dc4c935da619b55f784c79f000830d514ffeb6ad3fcf0640", + "wx" : "20adbb6cb9e09ce8ee4b6bdbc2e8047a0b9dc811eb415a2a258906efbd8a88ce", + "wy" : "00c16b2111b5991d98dc4c935da619b55f784c79f000830d514ffeb6ad3fcf0640" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000420adbb6cb9e09ce8ee4b6bdbc2e8047a0b9dc811eb415a2a258906efbd8a88cec16b2111b5991d98dc4c935da619b55f784c79f000830d514ffeb6ad3fcf0640", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIK27bLngnOjuS2vbwugEegudyBHr\nQVoqJYkG772KiM7BayERtZkdmNxMk12mGbVfeEx58ACDDVFP/ratP88GQA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 401, + "comment" : "edge case for signature malleability", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a902207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a8", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04f033aa211cf11ee61c247567974fb8667c78f13a35bc2e6bead4436c261f144d99b4d07b6ce8008fecf8a4c4af561b972b00e63443a2f20038ee84ed0c238a3c", + "wx" : "00f033aa211cf11ee61c247567974fb8667c78f13a35bc2e6bead4436c261f144d", + "wy" : "0099b4d07b6ce8008fecf8a4c4af561b972b00e63443a2f20038ee84ed0c238a3c" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004f033aa211cf11ee61c247567974fb8667c78f13a35bc2e6bead4436c261f144d99b4d07b6ce8008fecf8a4c4af561b972b00e63443a2f20038ee84ed0c238a3c", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE8DOqIRzxHuYcJHVnl0+4Znx48To1\nvC5r6tRDbCYfFE2ZtNB7bOgAj+z4pMSvVhuXKwDmNEOi8gA47oTtDCOKPA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 402, + "comment" : "edge case for signature malleability", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a902207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04bef2538da3d07158791556b2d0297ca9c1b306459c9323ce7d07a21282de1ace4e400c8e4eb57751faa0dde6bbebf96faaac9efc80e3de768fb4f5a37f95ead7", + "wx" : "00bef2538da3d07158791556b2d0297ca9c1b306459c9323ce7d07a21282de1ace", + "wy" : "4e400c8e4eb57751faa0dde6bbebf96faaac9efc80e3de768fb4f5a37f95ead7" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004bef2538da3d07158791556b2d0297ca9c1b306459c9323ce7d07a21282de1ace4e400c8e4eb57751faa0dde6bbebf96faaac9efc80e3de768fb4f5a37f95ead7", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvvJTjaPQcVh5FVay0Cl8qcGzBkWc\nkyPOfQeiEoLeGs5OQAyOTrV3Ufqg3ea76/lvqqye/IDj3naPtPWjf5Xq1w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 403, + "comment" : "u1 == 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002205731b7c4bd04cb9efb836935ff2e547bf2909f86824af4d8df78acf76d7b3d4e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04bf2570b58f38183fabca3ca72255bd4651cbb7e8292287809bd8e5c285d24a532f859b7f75c2f5e8d3791a5ccb60fa3888895c63237c9ea65e43f87523e104e5", + "wx" : "00bf2570b58f38183fabca3ca72255bd4651cbb7e8292287809bd8e5c285d24a53", + "wy" : "2f859b7f75c2f5e8d3791a5ccb60fa3888895c63237c9ea65e43f87523e104e5" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004bf2570b58f38183fabca3ca72255bd4651cbb7e8292287809bd8e5c285d24a532f859b7f75c2f5e8d3791a5ccb60fa3888895c63237c9ea65e43f87523e104e5", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvyVwtY84GD+ryjynIlW9RlHLt+gp\nIoeAm9jlwoXSSlMvhZt/dcL16NN5GlzLYPo4iIlcYyN8nqZeQ/h1I+EE5Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 404, + "comment" : "u1 == n - 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30450220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022100a8ce483a42fb3462047c96ca00d1ab83ca565b2724cca9ac14411dcb8ee7e803", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "049ba8f147332270987e5baab2ab0a4ebc9968eb8682c2872266a22b43c2cf55f7728d552fc65b5a3c7cee18876f1d8b46ae60153aec3b8a2b2c2527979f4a7d29", + "wx" : "009ba8f147332270987e5baab2ab0a4ebc9968eb8682c2872266a22b43c2cf55f7", + "wy" : "728d552fc65b5a3c7cee18876f1d8b46ae60153aec3b8a2b2c2527979f4a7d29" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200049ba8f147332270987e5baab2ab0a4ebc9968eb8682c2872266a22b43c2cf55f7728d552fc65b5a3c7cee18876f1d8b46ae60153aec3b8a2b2c2527979f4a7d29", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEm6jxRzMicJh+W6qyqwpOvJlo64aC\nwociZqIrQ8LPVfdyjVUvxltaPHzuGIdvHYtGrmAVOuw7iissJSeXn0p9KQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 405, + "comment" : "u2 == 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04d9e64db2ea560162dad3ec67d6ebaab9e821a81da8d4584f00fb14813c7e96e153e9e96e17eb05228ff3c9cbc5318bbb87e88bec489dec2be7a20adce06cf8bd", + "wx" : "00d9e64db2ea560162dad3ec67d6ebaab9e821a81da8d4584f00fb14813c7e96e1", + "wy" : "53e9e96e17eb05228ff3c9cbc5318bbb87e88bec489dec2be7a20adce06cf8bd" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d9e64db2ea560162dad3ec67d6ebaab9e821a81da8d4584f00fb14813c7e96e153e9e96e17eb05228ff3c9cbc5318bbb87e88bec489dec2be7a20adce06cf8bd", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE2eZNsupWAWLa0+xn1uuqueghqB2o\n1FhPAPsUgTx+luFT6eluF+sFIo/zycvFMYu7h+iL7Eid7Cvnogrc4Gz4vQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 406, + "comment" : "u2 == n - 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30450220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022100aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04857c58d9010d1f8386e279cdcc369b32a8960259a3a646f6d89ad5273252f3fc65d2384cabf6a2158b1cd1b2e2477d10b1b719125e9226e99ae90a7afaab499e", + "wx" : "00857c58d9010d1f8386e279cdcc369b32a8960259a3a646f6d89ad5273252f3fc", + "wy" : "65d2384cabf6a2158b1cd1b2e2477d10b1b719125e9226e99ae90a7afaab499e" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004857c58d9010d1f8386e279cdcc369b32a8960259a3a646f6d89ad5273252f3fc65d2384cabf6a2158b1cd1b2e2477d10b1b719125e9226e99ae90a7afaab499e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhXxY2QENH4OG4nnNzDabMqiWAlmj\npkb22JrVJzJS8/xl0jhMq/aiFYsc0bLiR30QsbcZEl6SJuma6Qp6+qtJng==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 407, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02201d109296e9ac43dfa92bcdbcaa64c6d3fb858a822b6e519d9fd2e45279d3bf1a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0489d887b0645d2f96b407b080cf6db3685cc9d4454d35a5ac7983bb5ebbfd2e20de4fcd410c3b6e11f5e4cccb19327c181c43c2d216869309f22495d34ee2796f", + "wx" : "0089d887b0645d2f96b407b080cf6db3685cc9d4454d35a5ac7983bb5ebbfd2e20", + "wy" : "00de4fcd410c3b6e11f5e4cccb19327c181c43c2d216869309f22495d34ee2796f" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000489d887b0645d2f96b407b080cf6db3685cc9d4454d35a5ac7983bb5ebbfd2e20de4fcd410c3b6e11f5e4cccb19327c181c43c2d216869309f22495d34ee2796f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEidiHsGRdL5a0B7CAz22zaFzJ1EVN\nNaWseYO7Xrv9LiDeT81BDDtuEfXkzMsZMnwYHEPC0haGkwnyJJXTTuJ5bw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 408, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220027d377d04715e43754629961c6233961b921b3283c33fcb541cc27285092e8d", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04040924291aa7975fd04f8b2e923a1f9121836fdfbf2fea123cc1870f4f6cc0f2c510ee34a325e772d232b576052f96d3ec4a33b086508682fc53099c0cd48e45", + "wx" : "040924291aa7975fd04f8b2e923a1f9121836fdfbf2fea123cc1870f4f6cc0f2", + "wy" : "00c510ee34a325e772d232b576052f96d3ec4a33b086508682fc53099c0cd48e45" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004040924291aa7975fd04f8b2e923a1f9121836fdfbf2fea123cc1870f4f6cc0f2c510ee34a325e772d232b576052f96d3ec4a33b086508682fc53099c0cd48e45", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEBAkkKRqnl1/QT4sukjofkSGDb9+/\nL+oSPMGHD09swPLFEO40oyXnctIytXYFL5bT7EozsIZQhoL8UwmcDNSORQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 409, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ce1602ee5a6d686c5b8d8a3f44f419aa6064f0d35323341d77a65a4bc9e1989b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "043e7ed2fbb89f7b643d4ab44895ff9fb16e8be7a8649e4ac4ee2f59ec8f68fc634ca91cc26043a8242e2969c871d3ca9833148135b27d377198182ceaa7e70fd4", + "wx" : "3e7ed2fbb89f7b643d4ab44895ff9fb16e8be7a8649e4ac4ee2f59ec8f68fc63", + "wy" : "4ca91cc26043a8242e2969c871d3ca9833148135b27d377198182ceaa7e70fd4" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043e7ed2fbb89f7b643d4ab44895ff9fb16e8be7a8649e4ac4ee2f59ec8f68fc634ca91cc26043a8242e2969c871d3ca9833148135b27d377198182ceaa7e70fd4", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPn7S+7ife2Q9SrRIlf+fsW6L56hk\nnkrE7i9Z7I9o/GNMqRzCYEOoJC4pachx08qYMxSBNbJ9N3GYGCzqp+cP1A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 410, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220328ab273ff681a79a9662dc174ee014ef73d597d32ef42b17f443a33f5e430fe", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04e67f559f552772b174d377b239e60750299d379b6bec6fc93adf040269d58c426c397f7984a149f07bf79fbba3b18c925a797cc6678e2eeabec47fb4ac461041", + "wx" : "00e67f559f552772b174d377b239e60750299d379b6bec6fc93adf040269d58c42", + "wy" : "6c397f7984a149f07bf79fbba3b18c925a797cc6678e2eeabec47fb4ac461041" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004e67f559f552772b174d377b239e60750299d379b6bec6fc93adf040269d58c426c397f7984a149f07bf79fbba3b18c925a797cc6678e2eeabec47fb4ac461041", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5n9Vn1UncrF003eyOeYHUCmdN5tr\n7G/JOt8EAmnVjEJsOX95hKFJ8Hv3n7ujsYySWnl8xmeOLuq+xH+0rEYQQQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 411, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ab27431e81a7976e62dc174ee014f0479c909f17919ec453013b47f1aa221858", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0488b1d30e29fe0edeb93ab469d2698d0fbc2977f77f48293d0e87acc0856a51fc3d1b4f23fa3f6ef26f0e94cb7a63907b1923e30d08197115050b9da98a2b5f56", + "wx" : "0088b1d30e29fe0edeb93ab469d2698d0fbc2977f77f48293d0e87acc0856a51fc", + "wy" : "3d1b4f23fa3f6ef26f0e94cb7a63907b1923e30d08197115050b9da98a2b5f56" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000488b1d30e29fe0edeb93ab469d2698d0fbc2977f77f48293d0e87acc0856a51fc3d1b4f23fa3f6ef26f0e94cb7a63907b1923e30d08197115050b9da98a2b5f56", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEiLHTDin+Dt65OrRp0mmND7wpd/d/\nSCk9DoeswIVqUfw9G08j+j9u8m8OlMt6Y5B7GSPjDQgZcRUFC52piitfVg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 412, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220564e863e034f2edbc5b82e9dc029e08f7c3a43817c25ea210ebcc52057e10b5f", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0423a6ed2b1064923104d08ee4392b44bb51555a395477dc52546af6c787cc65aa81105b8c72c357d75215b210286df781d6731c4f0b87e9fe7066489653dc35d3", + "wx" : "23a6ed2b1064923104d08ee4392b44bb51555a395477dc52546af6c787cc65aa", + "wy" : "0081105b8c72c357d75215b210286df781d6731c4f0b87e9fe7066489653dc35d3" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000423a6ed2b1064923104d08ee4392b44bb51555a395477dc52546af6c787cc65aa81105b8c72c357d75215b210286df781d6731c4f0b87e9fe7066489653dc35d3", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEI6btKxBkkjEE0I7kOStEu1FVWjlU\nd9xSVGr2x4fMZaqBEFuMcsNX11IVshAobfeB1nMcTwuH6f5wZkiWU9w10w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 413, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022031f2cced76db7b4d74ee014f047c96c9f3ba3e21f11248bcf451526ac376c54c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04592d27cd81fbb61ebbdd782eaa1d86d53b59eaef43496677c345adc9896c562e355b8ffda4f8683da98653f0d6067bd8134c5c3e22e3dcdee6a5cdbd826f4915", + "wx" : "592d27cd81fbb61ebbdd782eaa1d86d53b59eaef43496677c345adc9896c562e", + "wy" : "355b8ffda4f8683da98653f0d6067bd8134c5c3e22e3dcdee6a5cdbd826f4915" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004592d27cd81fbb61ebbdd782eaa1d86d53b59eaef43496677c345adc9896c562e355b8ffda4f8683da98653f0d6067bd8134c5c3e22e3dcdee6a5cdbd826f4915", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWS0nzYH7th673Xguqh2G1TtZ6u9D\nSWZ3w0WtyYlsVi41W4/9pPhoPamGU/DWBnvYE0xcPiLj3N7mpc29gm9JFQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 414, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220668fcfbedd4eed7eb6840c7f6cf1e3dde504afe5732ee0e1bcbeee15b94a2c64", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "048c4aa42ef47c4e2d7b60ca2b5a0b3038a9f8e7ee1de77d299286db3cd635b754f65438558a2271c9444b77405a1f97e84036c3146c425006e65be83f97e41191", + "wx" : "008c4aa42ef47c4e2d7b60ca2b5a0b3038a9f8e7ee1de77d299286db3cd635b754", + "wy" : "00f65438558a2271c9444b77405a1f97e84036c3146c425006e65be83f97e41191" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048c4aa42ef47c4e2d7b60ca2b5a0b3038a9f8e7ee1de77d299286db3cd635b754f65438558a2271c9444b77405a1f97e84036c3146c425006e65be83f97e41191", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEjEqkLvR8Ti17YMorWgswOKn45+4d\n530pkobbPNY1t1T2VDhViiJxyURLd0BaH5foQDbDFGxCUAbmW+g/l+QRkQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 415, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220637e57bd4f085f9d3be20506bbc2b8eab268a33871b19da56b1ba0ac25927bd1", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04f5618fb978b70f15b8e07a74edfbcea775dcb92055f9431b816cd4cb5d4fd63cbd1759fd35bae79bf5bb0394646b14fbcb1ed2614fdcc9a9f53663e09f8c6a09", + "wx" : "00f5618fb978b70f15b8e07a74edfbcea775dcb92055f9431b816cd4cb5d4fd63c", + "wy" : "00bd1759fd35bae79bf5bb0394646b14fbcb1ed2614fdcc9a9f53663e09f8c6a09" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004f5618fb978b70f15b8e07a74edfbcea775dcb92055f9431b816cd4cb5d4fd63cbd1759fd35bae79bf5bb0394646b14fbcb1ed2614fdcc9a9f53663e09f8c6a09", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE9WGPuXi3DxW44Hp07fvOp3XcuSBV\n+UMbgWzUy11P1jy9F1n9Nbrnm/W7A5RkaxT7yx7SYU/cyan1NmPgn4xqCQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 416, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100b0a105281711f1755bbfc1a0b6ea67add1085e84b73016989e20a90be3504d22", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0453c143435247e1e2144c4c32cb1c900b8e9cb160976bdcda1b24877ce7266a7441a21780d91554d349a4c7c61f799bda9ddc81a66323078245dcb3960417a660", + "wx" : "53c143435247e1e2144c4c32cb1c900b8e9cb160976bdcda1b24877ce7266a74", + "wy" : "41a21780d91554d349a4c7c61f799bda9ddc81a66323078245dcb3960417a660" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000453c143435247e1e2144c4c32cb1c900b8e9cb160976bdcda1b24877ce7266a7441a21780d91554d349a4c7c61f799bda9ddc81a66323078245dcb3960417a660", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEU8FDQ1JH4eIUTEwyyxyQC46csWCX\na9zaGySHfOcmanRBoheA2RVU00mkx8YfeZvandyBpmMjB4JF3LOWBBemYA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 417, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100f177b6b38b29de112b6a1921aacd9c95bf24356c916075b623d05899bf7945c4", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0493486f6653c2906152eb9d1c2b28e51c085f20ac54016a808f6e3c6b2cdcc02a35439b7b9ab9e86df0ca617737b49f28badf8f5636c9bbaa199bdd20063ec7ff", + "wx" : "0093486f6653c2906152eb9d1c2b28e51c085f20ac54016a808f6e3c6b2cdcc02a", + "wy" : "35439b7b9ab9e86df0ca617737b49f28badf8f5636c9bbaa199bdd20063ec7ff" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000493486f6653c2906152eb9d1c2b28e51c085f20ac54016a808f6e3c6b2cdcc02a35439b7b9ab9e86df0ca617737b49f28badf8f5636c9bbaa199bdd20063ec7ff", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEk0hvZlPCkGFS650cKyjlHAhfIKxU\nAWqAj248ayzcwCo1Q5t7mrnobfDKYXc3tJ8out+PVjbJu6oZm90gBj7H/w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 418, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100e2ef6d681653bc2156d43243559b392bc161702b7ba94ce753e6e670828f6637", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "045f2e06f0ec92b6499eb7d249ff0147639253e7abe0e4497226336a5c94caa7774eb3c28acf5012ba023971416c600a10fb6d28a23f3a2c1f77fb0686d06cdf80", + "wx" : "5f2e06f0ec92b6499eb7d249ff0147639253e7abe0e4497226336a5c94caa777", + "wy" : "4eb3c28acf5012ba023971416c600a10fb6d28a23f3a2c1f77fb0686d06cdf80" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045f2e06f0ec92b6499eb7d249ff0147639253e7abe0e4497226336a5c94caa7774eb3c28acf5012ba023971416c600a10fb6d28a23f3a2c1f77fb0686d06cdf80", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEXy4G8OyStkmet9JJ/wFHY5JT56vg\n5ElyJjNqXJTKp3dOs8KKz1ASugI5cUFsYAoQ+20ooj86LB93+waG0GzfgA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 419, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100d467241ca17d9a31823e4b650068d5c1c39eaaea65f2241883fd744745a586aa", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04c2af0b9da06d54b1a5ff93800b579cbce295d0b2719da307b028bee3c657424b28c4928f185f68312b47de31ad87fac134de90cf114cc85d45a8fefd9a3a2350", + "wx" : "00c2af0b9da06d54b1a5ff93800b579cbce295d0b2719da307b028bee3c657424b", + "wy" : "28c4928f185f68312b47de31ad87fac134de90cf114cc85d45a8fefd9a3a2350" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004c2af0b9da06d54b1a5ff93800b579cbce295d0b2719da307b028bee3c657424b28c4928f185f68312b47de31ad87fac134de90cf114cc85d45a8fefd9a3a2350", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwq8LnaBtVLGl/5OAC1ecvOKV0LJx\nnaMHsCi+48ZXQksoxJKPGF9oMStH3jGth/rBNN6QzxFMyF1FqP79mjojUA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 420, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100e70b0176ad36b436adc6c51fa27a0cd50ea5f5c07d1d695135b0128763225ef6", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042a3c0253d54dc8a2a72a31f815b0bb6c36d852f8db14edf1e1b71cd3a7389a494891bafa1767b85e36f7507fa5eebd3da0024208fcfef28d56cd49a980ba1465", + "wx" : "2a3c0253d54dc8a2a72a31f815b0bb6c36d852f8db14edf1e1b71cd3a7389a49", + "wy" : "4891bafa1767b85e36f7507fa5eebd3da0024208fcfef28d56cd49a980ba1465" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042a3c0253d54dc8a2a72a31f815b0bb6c36d852f8db14edf1e1b71cd3a7389a494891bafa1767b85e36f7507fa5eebd3da0024208fcfef28d56cd49a980ba1465", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKjwCU9VNyKKnKjH4FbC7bDbYUvjb\nFO3x4bcc06c4mklIkbr6F2e4Xjb3UH+l7r09oAJCCPz+8o1WzUmpgLoUZQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 421, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207fffffffaaaaaaaaffffffffffffffffe9a2538f37b28a2c513dee40fecbb71a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "043dd345114090328ccc0bdeaf8269396593645720b0b326849d1fe81ec956f996ceee0a81d7f65e1205bb1b6963a8e0facfd2a6124701b1a152094d037a216f4e", + "wx" : "3dd345114090328ccc0bdeaf8269396593645720b0b326849d1fe81ec956f996", + "wy" : "00ceee0a81d7f65e1205bb1b6963a8e0facfd2a6124701b1a152094d037a216f4e" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043dd345114090328ccc0bdeaf8269396593645720b0b326849d1fe81ec956f996ceee0a81d7f65e1205bb1b6963a8e0facfd2a6124701b1a152094d037a216f4e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPdNFEUCQMozMC96vgmk5ZZNkVyCw\nsyaEnR/oHslW+ZbO7gqB1/ZeEgW7G2ljqOD6z9KmEkcBsaFSCU0DeiFvTg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 422, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100b62f26b5f2a2b26f6de86d42ad8a13da3ab3cccd0459b201de009e526adf21f2", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04fc8207ca84c4af4229139de953da3bdebf694537c15406e172d631e98591f40c34a0d957e39e9686914e98ea467972cedec5a5c6bb55bec7916dc71f7a4c6f77", + "wx" : "00fc8207ca84c4af4229139de953da3bdebf694537c15406e172d631e98591f40c", + "wy" : "34a0d957e39e9686914e98ea467972cedec5a5c6bb55bec7916dc71f7a4c6f77" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004fc8207ca84c4af4229139de953da3bdebf694537c15406e172d631e98591f40c34a0d957e39e9686914e98ea467972cedec5a5c6bb55bec7916dc71f7a4c6f77", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/IIHyoTEr0IpE53pU9o73r9pRTfB\nVAbhctYx6YWR9Aw0oNlX456WhpFOmOpGeXLO3sWlxrtVvseRbccfekxvdw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 423, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bb1d9ac949dd748cd02bbbe749bd351cd57b38bb61403d700686aa7b4c90851e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0460bf7beb808286d8abff60c20faed73997395124542e6b7672089d88c14bbed57f4af9606f9be0199e4145698a62ad2545123a49eb14e0c33317f6909e3915b5", + "wx" : "60bf7beb808286d8abff60c20faed73997395124542e6b7672089d88c14bbed5", + "wy" : "7f4af9606f9be0199e4145698a62ad2545123a49eb14e0c33317f6909e3915b5" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000460bf7beb808286d8abff60c20faed73997395124542e6b7672089d88c14bbed57f4af9606f9be0199e4145698a62ad2545123a49eb14e0c33317f6909e3915b5", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYL9764CChtir/2DCD67XOZc5USRU\nLmt2cgidiMFLvtV/Svlgb5vgGZ5BRWmKYq0lRRI6SesU4MMzF/aQnjkVtQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 424, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022066755a00638cdaec1c732513ca0234ece52545dac11f816e818f725b4f60aaf2", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042dcd699362d3665b6c9260608b3faf989d45ac15b9da41fb348d5520ecdf4e0403e483670aadef4615c7a13fe1bf3bf927b4e47a667660b505ba47affee92ab6", + "wx" : "2dcd699362d3665b6c9260608b3faf989d45ac15b9da41fb348d5520ecdf4e04", + "wy" : "03e483670aadef4615c7a13fe1bf3bf927b4e47a667660b505ba47affee92ab6" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042dcd699362d3665b6c9260608b3faf989d45ac15b9da41fb348d5520ecdf4e0403e483670aadef4615c7a13fe1bf3bf927b4e47a667660b505ba47affee92ab6", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAELc1pk2LTZltskmBgiz+vmJ1FrBW5\n2kH7NI1VIOzfTgQD5INnCq3vRhXHoT/hvzv5J7TkemZ2YLUFukev/ukqtg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 425, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022055a00c9fcdaebb6032513ca0234ecfffe98ebe492fdf02e48ca48e982beb3669", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04e6205f87fa837c474a2badac671578de77d6a077cd286aed45403508767114ffc18daaf2463dea80300c1f4d7e25b9f603eefb2e2cbf012f31a819c91cad7cf2", + "wx" : "00e6205f87fa837c474a2badac671578de77d6a077cd286aed45403508767114ff", + "wy" : "00c18daaf2463dea80300c1f4d7e25b9f603eefb2e2cbf012f31a819c91cad7cf2" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004e6205f87fa837c474a2badac671578de77d6a077cd286aed45403508767114ffc18daaf2463dea80300c1f4d7e25b9f603eefb2e2cbf012f31a819c91cad7cf2", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5iBfh/qDfEdKK62sZxV43nfWoHfN\nKGrtRUA1CHZxFP/BjaryRj3qgDAMH01+Jbn2A+77Liy/AS8xqBnJHK188g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 426, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ab40193f9b5d76c064a27940469d9fffd31d7c925fbe05c919491d3057d66cd2", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04357e7687a79243d5e030eb120a3652c2fb95fcb148813f3da95d044bdc31c8d5e3ed90ea73567cb36c0fccd021da4ccccffe40dfe1b603428969788bed4416db", + "wx" : "357e7687a79243d5e030eb120a3652c2fb95fcb148813f3da95d044bdc31c8d5", + "wy" : "00e3ed90ea73567cb36c0fccd021da4ccccffe40dfe1b603428969788bed4416db" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004357e7687a79243d5e030eb120a3652c2fb95fcb148813f3da95d044bdc31c8d5e3ed90ea73567cb36c0fccd021da4ccccffe40dfe1b603428969788bed4416db", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENX52h6eSQ9XgMOsSCjZSwvuV/LFI\ngT89qV0ES9wxyNXj7ZDqc1Z8s2wPzNAh2kzMz/5A3+G2A0KJaXiL7UQW2w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 427, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ca0234ebb5fdcb13ca0234ecffffffffcb0dadbbc7f549f8a26b4408d0dc8600", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "043d9723a8ea5ebaffacab8bf87b1d63e42da7bdf94e6c2520a0786b7b534dacf33725db2fb27248274ac2e6212f9071495c90ae684d056b57ad18e72bce8f36b0", + "wx" : "3d9723a8ea5ebaffacab8bf87b1d63e42da7bdf94e6c2520a0786b7b534dacf3", + "wy" : "3725db2fb27248274ac2e6212f9071495c90ae684d056b57ad18e72bce8f36b0" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043d9723a8ea5ebaffacab8bf87b1d63e42da7bdf94e6c2520a0786b7b534dacf33725db2fb27248274ac2e6212f9071495c90ae684d056b57ad18e72bce8f36b0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPZcjqOpeuv+sq4v4ex1j5C2nvflO\nbCUgoHhre1NNrPM3JdsvsnJIJ0rC5iEvkHFJXJCuaE0Fa1etGOcrzo82sA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 428, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff3ea3677e082b9310572620ae19933a9e65b285598711c77298815ad3", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "044bab5b68667090ed13e5658cfe68f1247031aee80a8ccb52ba0505752f7cd3f085c70129c1715d9610a41bf7a063b81c1bc7ec34bb6a1c95ccd08e09f1476343", + "wx" : "4bab5b68667090ed13e5658cfe68f1247031aee80a8ccb52ba0505752f7cd3f0", + "wy" : "0085c70129c1715d9610a41bf7a063b81c1bc7ec34bb6a1c95ccd08e09f1476343" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044bab5b68667090ed13e5658cfe68f1247031aee80a8ccb52ba0505752f7cd3f085c70129c1715d9610a41bf7a063b81c1bc7ec34bb6a1c95ccd08e09f1476343", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAES6tbaGZwkO0T5WWM/mjxJHAxrugK\njMtSugUFdS980/CFxwEpwXFdlhCkG/egY7gcG8fsNLtqHJXM0I4J8UdjQw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 429, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220266666663bbbbbbbe6666666666666665b37902e023fab7c8f055d86e5cc41f4", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "047801780aaab4aaf31b7c94069609a5ecf623a6dd7e97964061c6b3e4103bb84a59c111796624cccbba09394bca04af79a31cbd36176d2ec4ceaa700730d57300", + "wx" : "7801780aaab4aaf31b7c94069609a5ecf623a6dd7e97964061c6b3e4103bb84a", + "wy" : "59c111796624cccbba09394bca04af79a31cbd36176d2ec4ceaa700730d57300" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047801780aaab4aaf31b7c94069609a5ecf623a6dd7e97964061c6b3e4103bb84a59c111796624cccbba09394bca04af79a31cbd36176d2ec4ceaa700730d57300", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEeAF4Cqq0qvMbfJQGlgml7PYjpt1+\nl5ZAYcaz5BA7uEpZwRF5ZiTMy7oJOUvKBK95oxy9NhdtLsTOqnAHMNVzAA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 430, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff36db6db7a492492492492492146c573f4c6dfc8d08a443e258970b09", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0455b0451d911e9c64516ac9e9da3da1703eaaa46a8b0a7025c8c5ed38b5474713f1fde0cdee830bf169da9ca3d70d56f4607989873fbdcfcbb740e9a42faf860a", + "wx" : "55b0451d911e9c64516ac9e9da3da1703eaaa46a8b0a7025c8c5ed38b5474713", + "wy" : "00f1fde0cdee830bf169da9ca3d70d56f4607989873fbdcfcbb740e9a42faf860a" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000455b0451d911e9c64516ac9e9da3da1703eaaa46a8b0a7025c8c5ed38b5474713f1fde0cdee830bf169da9ca3d70d56f4607989873fbdcfcbb740e9a42faf860a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEVbBFHZEenGRRasnp2j2hcD6qpGqL\nCnAlyMXtOLVHRxPx/eDN7oML8WnanKPXDVb0YHmJhz+9z8u3QOmkL6+GCg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 431, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff2aaaaaab7fffffffffffffffc815d0e60b3e596ecb1ad3a27cfd49c4", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042e19ea3a973a4c155814f8a7b641e12477d288f958b74f6031326356f5061fa41acdd1be10c052eaeb9c22d3f04cfec6e91bd23d6d3996eca9cd485e50e85909", + "wx" : "2e19ea3a973a4c155814f8a7b641e12477d288f958b74f6031326356f5061fa4", + "wy" : "1acdd1be10c052eaeb9c22d3f04cfec6e91bd23d6d3996eca9cd485e50e85909" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042e19ea3a973a4c155814f8a7b641e12477d288f958b74f6031326356f5061fa41acdd1be10c052eaeb9c22d3f04cfec6e91bd23d6d3996eca9cd485e50e85909", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAELhnqOpc6TBVYFPintkHhJHfSiPlY\nt09gMTJjVvUGH6QazdG+EMBS6uucItPwTP7G6RvSPW05luypzUheUOhZCQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 432, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207fffffff55555555ffffffffffffffffd344a71e6f651458a27bdc81fd976e37", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "046eafbcb683e05e0bdb2aa0ac0686f60b34ce66761b7ecffccd3da8fe8799d6244547b4aeca8a8e56dba45750cd9fc4f0e3f1333dcb855566c29bd14457cf489b", + "wx" : "6eafbcb683e05e0bdb2aa0ac0686f60b34ce66761b7ecffccd3da8fe8799d624", + "wy" : "4547b4aeca8a8e56dba45750cd9fc4f0e3f1333dcb855566c29bd14457cf489b" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046eafbcb683e05e0bdb2aa0ac0686f60b34ce66761b7ecffccd3da8fe8799d6244547b4aeca8a8e56dba45750cd9fc4f0e3f1333dcb855566c29bd14457cf489b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEbq+8toPgXgvbKqCsBob2CzTOZnYb\nfs/8zT2o/oeZ1iRFR7SuyoqOVtukV1DNn8Tw4/EzPcuFVWbCm9FEV89Imw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 433, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02203fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192aa", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0450f51ce959e24ac86b1054ea016c57d1da5f4cee008dd800757a817606234f78aa17f3ef6f7a6c51381c63d66697b1b5c196eb1da73d7b73c33f9115d7432d23", + "wx" : "50f51ce959e24ac86b1054ea016c57d1da5f4cee008dd800757a817606234f78", + "wy" : "00aa17f3ef6f7a6c51381c63d66697b1b5c196eb1da73d7b73c33f9115d7432d23" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000450f51ce959e24ac86b1054ea016c57d1da5f4cee008dd800757a817606234f78aa17f3ef6f7a6c51381c63d66697b1b5c196eb1da73d7b73c33f9115d7432d23", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEUPUc6VniSshrEFTqAWxX0dpfTO4A\njdgAdXqBdgYjT3iqF/Pvb3psUTgcY9Zml7G1wZbrHac9e3PDP5EV10MtIw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 434, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02205d8ecd64a4eeba466815ddf3a4de9a8e6abd9c5db0a01eb80343553da648428f", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "049c8ef36f19815572db154e8f47a8dc5cc807d551a7141fed8a2c15460fe7ee10660b936644e1ccad24578811dd45a325214e28a78e99a0ed2df7354fe9bca0ad", + "wx" : "009c8ef36f19815572db154e8f47a8dc5cc807d551a7141fed8a2c15460fe7ee10", + "wy" : "660b936644e1ccad24578811dd45a325214e28a78e99a0ed2df7354fe9bca0ad" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200049c8ef36f19815572db154e8f47a8dc5cc807d551a7141fed8a2c15460fe7ee10660b936644e1ccad24578811dd45a325214e28a78e99a0ed2df7354fe9bca0ad", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEnI7zbxmBVXLbFU6PR6jcXMgH1VGn\nFB/tiiwVRg/n7hBmC5NmROHMrSRXiBHdRaMlIU4op46ZoO0t9zVP6bygrQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 435, + "comment" : "point duplication during verification", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "304402206f2347cab7dd76858fe0555ac3bc99048c4aacafdfb6bcbe05ea6c42c4934569022056be8aaebb8627ef5e37057feb3448f726fb605312992466ee8d9ed7cd43c1b1", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "049c8ef36f19815572db154e8f47a8dc5cc807d551a7141fed8a2c15460fe7ee1099f46c98bb1e3353dba877ee22ba5cdadeb1d75971665f12d208cab016435f52", + "wx" : "009c8ef36f19815572db154e8f47a8dc5cc807d551a7141fed8a2c15460fe7ee10", + "wy" : "0099f46c98bb1e3353dba877ee22ba5cdadeb1d75971665f12d208cab016435f52" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200049c8ef36f19815572db154e8f47a8dc5cc807d551a7141fed8a2c15460fe7ee1099f46c98bb1e3353dba877ee22ba5cdadeb1d75971665f12d208cab016435f52", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEnI7zbxmBVXLbFU6PR6jcXMgH1VGn\nFB/tiiwVRg/n7hCZ9GyYux4zU9uod+4iulza3rHXWXFmXxLSCMqwFkNfUg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 436, + "comment" : "duplication bug", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "304402206f2347cab7dd76858fe0555ac3bc99048c4aacafdfb6bcbe05ea6c42c4934569022056be8aaebb8627ef5e37057feb3448f726fb605312992466ee8d9ed7cd43c1b1", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04f2a3ebc44fe94406cd6dc9bfc79a84600ae568cf533131e01505012649e39b8f0f886d549f83aa61ecd1eeb77ba7256e984f088c3b9183e84a16e96f93860e4f", + "wx" : "00f2a3ebc44fe94406cd6dc9bfc79a84600ae568cf533131e01505012649e39b8f", + "wy" : "0f886d549f83aa61ecd1eeb77ba7256e984f088c3b9183e84a16e96f93860e4f" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004f2a3ebc44fe94406cd6dc9bfc79a84600ae568cf533131e01505012649e39b8f0f886d549f83aa61ecd1eeb77ba7256e984f088c3b9183e84a16e96f93860e4f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE8qPrxE/pRAbNbcm/x5qEYArlaM9T\nMTHgFQUBJknjm48PiG1Un4OqYezR7rd7pyVumE8IjDuRg+hKFulvk4YOTw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 437, + "comment" : "point with x-coordinate 0", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30250201010220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04e30751018c302c6916c21e2239baa41f0e69c5acfc371bb3e376ad364ea63802659cceeae0cabfee3ed33abacbc490e8716b5fbf11137647b524e4b855d7d659", + "wx" : "00e30751018c302c6916c21e2239baa41f0e69c5acfc371bb3e376ad364ea63802", + "wy" : "659cceeae0cabfee3ed33abacbc490e8716b5fbf11137647b524e4b855d7d659" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004e30751018c302c6916c21e2239baa41f0e69c5acfc371bb3e376ad364ea63802659cceeae0cabfee3ed33abacbc490e8716b5fbf11137647b524e4b855d7d659", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE4wdRAYwwLGkWwh4iObqkHw5pxaz8\nNxuz43atNk6mOAJlnM7q4Mq/7j7TOrrLxJDocWtfvxETdke1JOS4VdfWWQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 438, + "comment" : "point with x-coordinate 0", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022101000000000000000000000000000000000000000000000000000000000000000002203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aa9", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04ef28340fb027dabc05a2bd3be99c6cc2730ab0c3d8289e6a242f2b76cfccf9a2405cd0530183db6640119a20ad9c1c24ec87d4d9d5de42bffab54fd6cb6f9ed6", + "wx" : "00ef28340fb027dabc05a2bd3be99c6cc2730ab0c3d8289e6a242f2b76cfccf9a2", + "wy" : "405cd0530183db6640119a20ad9c1c24ec87d4d9d5de42bffab54fd6cb6f9ed6" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ef28340fb027dabc05a2bd3be99c6cc2730ab0c3d8289e6a242f2b76cfccf9a2405cd0530183db6640119a20ad9c1c24ec87d4d9d5de42bffab54fd6cb6f9ed6", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE7yg0D7An2rwFor076ZxswnMKsMPY\nKJ5qJC8rds/M+aJAXNBTAYPbZkARmiCtnBwk7IfU2dXeQr/6tU/Wy2+e1g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 439, + "comment" : "comparison with point at infinity ", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aa9", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0401b4e8eb0cf6f321006fc107246c1996f7034f56d82706cd8f14f05da0a7c514f158ad7ff3c6a08b2f057c6c28255f9513811f20ab18f7104df554d591913f78", + "wx" : "01b4e8eb0cf6f321006fc107246c1996f7034f56d82706cd8f14f05da0a7c514", + "wy" : "00f158ad7ff3c6a08b2f057c6c28255f9513811f20ab18f7104df554d591913f78" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000401b4e8eb0cf6f321006fc107246c1996f7034f56d82706cd8f14f05da0a7c514f158ad7ff3c6a08b2f057c6c28255f9513811f20ab18f7104df554d591913f78", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAbTo6wz28yEAb8EHJGwZlvcDT1bY\nJwbNjxTwXaCnxRTxWK1/88agiy8FfGwoJV+VE4EfIKsY9xBN9VTVkZE/eA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 440, + "comment" : "extreme value for k and edgecase s", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc476699780220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "040b1cc580bb6f71e4bffb731a1e74f929c04a10ff94ac2312359d3f13213c3b4c870213c2ad3665a3d243dcb55780e21c8601c5f9803f27e31ff22f8ce77e739e", + "wx" : "0b1cc580bb6f71e4bffb731a1e74f929c04a10ff94ac2312359d3f13213c3b4c", + "wy" : "00870213c2ad3665a3d243dcb55780e21c8601c5f9803f27e31ff22f8ce77e739e" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040b1cc580bb6f71e4bffb731a1e74f929c04a10ff94ac2312359d3f13213c3b4c870213c2ad3665a3d243dcb55780e21c8601c5f9803f27e31ff22f8ce77e739e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECxzFgLtvceS/+3MaHnT5KcBKEP+U\nrCMSNZ0/EyE8O0yHAhPCrTZlo9JD3LVXgOIchgHF+YA/J+Mf8i+M535zng==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 441, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022100b6db6db6249249254924924924924924625bd7a09bec4ca81bcdd9f8fd6b63cc", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042699736fdb603e90b1d9a04fcd90ed39756ed567214033ddb5ad579213089d2e96acfb0baeec9cfe2df150aa06b01ba58d03162b497c57a0d305adb4c5f7f375", + "wx" : "2699736fdb603e90b1d9a04fcd90ed39756ed567214033ddb5ad579213089d2e", + "wy" : "0096acfb0baeec9cfe2df150aa06b01ba58d03162b497c57a0d305adb4c5f7f375" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042699736fdb603e90b1d9a04fcd90ed39756ed567214033ddb5ad579213089d2e96acfb0baeec9cfe2df150aa06b01ba58d03162b497c57a0d305adb4c5f7f375", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEJplzb9tgPpCx2aBPzZDtOXVu1Wch\nQDPdta1XkhMInS6WrPsLruyc/i3xUKoGsBuljQMWK0l8V6DTBa20xffzdQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 442, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022100cccccccc00000000cccccccccccccccc971f2ef152794b9d8fc7d568c9e8eaa7", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042a3021069e8841f9d69ad4c2992b02dc7a2f5447afa55a4683c6451cdc4e728600ca4123520611085cb10ea80bdb851a0b09dd79703c420606ff658dba94c345", + "wx" : "2a3021069e8841f9d69ad4c2992b02dc7a2f5447afa55a4683c6451cdc4e7286", + "wy" : "00ca4123520611085cb10ea80bdb851a0b09dd79703c420606ff658dba94c345" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042a3021069e8841f9d69ad4c2992b02dc7a2f5447afa55a4683c6451cdc4e728600ca4123520611085cb10ea80bdb851a0b09dd79703c420606ff658dba94c345", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKjAhBp6IQfnWmtTCmSsC3HovVEev\npVpGg8ZFHNxOcoYAykEjUgYRCFyxDqgL24UaCwndeXA8QgYG/2WNupTDRQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 443, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc4766997802203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aaa", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04535212040d83b1802cd4a9c0b6ceb0a89de68b794ddf979c2ffb9a72e59eea007650166217eb39f4e03fecd48e9e7448032da261caa68d21df639ba68ee667a6", + "wx" : "535212040d83b1802cd4a9c0b6ceb0a89de68b794ddf979c2ffb9a72e59eea00", + "wy" : "7650166217eb39f4e03fecd48e9e7448032da261caa68d21df639ba68ee667a6" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004535212040d83b1802cd4a9c0b6ceb0a89de68b794ddf979c2ffb9a72e59eea007650166217eb39f4e03fecd48e9e7448032da261caa68d21df639ba68ee667a6", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEU1ISBA2DsYAs1KnAts6wqJ3mi3lN\n35ecL/uacuWe6gB2UBZiF+s59OA/7NSOnnRIAy2iYcqmjSHfY5umjuZnpg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 444, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022049249248db6db6dbb6db6db6db6db6db5a8b230d0b2b51dcd7ebf0c9fef7c185", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04884a86a89981e216732916569f9e3f203806359ef9b9ced61ebb82d5f8030045079ceef71b8f9e1deb29aeddaf3bcc780dff88f92b705c68f572ec481139b84a", + "wx" : "00884a86a89981e216732916569f9e3f203806359ef9b9ced61ebb82d5f8030045", + "wy" : "079ceef71b8f9e1deb29aeddaf3bcc780dff88f92b705c68f572ec481139b84a" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004884a86a89981e216732916569f9e3f203806359ef9b9ced61ebb82d5f8030045079ceef71b8f9e1deb29aeddaf3bcc780dff88f92b705c68f572ec481139b84a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEiEqGqJmB4hZzKRZWn54/IDgGNZ75\nuc7WHruC1fgDAEUHnO73G4+eHesprt2vO8x4Df+I+StwXGj1cuxIETm4Sg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 445, + "comment" : "extreme value for k", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022016a4502e2781e11ac82cbc9d1edd8c981584d13e18411e2f6e0478c34416e3bb", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04cdb031f0e0bc432f0b959bc270456f6a500635732c76764010a5ea20f54a71d85cf6ce18411cdcb5056e4280e449c3ad6df90f9ae2dea4abc08280d99749643d", + "wx" : "00cdb031f0e0bc432f0b959bc270456f6a500635732c76764010a5ea20f54a71d8", + "wy" : "5cf6ce18411cdcb5056e4280e449c3ad6df90f9ae2dea4abc08280d99749643d" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cdb031f0e0bc432f0b959bc270456f6a500635732c76764010a5ea20f54a71d85cf6ce18411cdcb5056e4280e449c3ad6df90f9ae2dea4abc08280d99749643d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzbAx8OC8Qy8LlZvCcEVvalAGNXMs\ndnZAEKXqIPVKcdhc9s4YQRzctQVuQoDkScOtbfkPmuLepKvAgoDZl0lkPQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 446, + "comment" : "extreme value for k and edgecase s", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2960220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "046309ffd3c559fe1b0967213461d884b58d1cd549dbc297101d9db5a7e3fcf3d388f5fa86bd31043ca6077cd1da4b283f4179a23e9d680f66a2081ac502732714", + "wx" : "6309ffd3c559fe1b0967213461d884b58d1cd549dbc297101d9db5a7e3fcf3d3", + "wy" : "0088f5fa86bd31043ca6077cd1da4b283f4179a23e9d680f66a2081ac502732714" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046309ffd3c559fe1b0967213461d884b58d1cd549dbc297101d9db5a7e3fcf3d388f5fa86bd31043ca6077cd1da4b283f4179a23e9d680f66a2081ac502732714", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYwn/08VZ/hsJZyE0YdiEtY0c1Unb\nwpcQHZ21p+P889OI9fqGvTEEPKYHfNHaSyg/QXmiPp1oD2aiCBrFAnMnFA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 447, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022100b6db6db6249249254924924924924924625bd7a09bec4ca81bcdd9f8fd6b63cc", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "046e564ff8412e92f5ee23fd299c92c57eb6ef0cbd17c28721b92625938d0eab1cff8941068815c9ad2d3b7f05845c41c4acebb92b3dc155aa7a51046948a4eed0", + "wx" : "6e564ff8412e92f5ee23fd299c92c57eb6ef0cbd17c28721b92625938d0eab1c", + "wy" : "00ff8941068815c9ad2d3b7f05845c41c4acebb92b3dc155aa7a51046948a4eed0" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046e564ff8412e92f5ee23fd299c92c57eb6ef0cbd17c28721b92625938d0eab1cff8941068815c9ad2d3b7f05845c41c4acebb92b3dc155aa7a51046948a4eed0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEblZP+EEukvXuI/0pnJLFfrbvDL0X\nwochuSYlk40Oqxz/iUEGiBXJrS07fwWEXEHErOu5Kz3BVap6UQRpSKTu0A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 448, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022100cccccccc00000000cccccccccccccccc971f2ef152794b9d8fc7d568c9e8eaa7", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0483fe782d906023da7ba700d097f8cc9618cb23f1cd89c213b98b8f9ae8fc023db15de38b856db24d4d6cc79b6d761fbd9ac94dad5f172883ba09278ba86d9955", + "wx" : "0083fe782d906023da7ba700d097f8cc9618cb23f1cd89c213b98b8f9ae8fc023d", + "wy" : "00b15de38b856db24d4d6cc79b6d761fbd9ac94dad5f172883ba09278ba86d9955" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000483fe782d906023da7ba700d097f8cc9618cb23f1cd89c213b98b8f9ae8fc023db15de38b856db24d4d6cc79b6d761fbd9ac94dad5f172883ba09278ba86d9955", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEg/54LZBgI9p7pwDQl/jMlhjLI/HN\nicITuYuPmuj8Aj2xXeOLhW2yTU1sx5ttdh+9mslNrV8XKIO6CSeLqG2ZVQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 449, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29602203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aaa", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04d1dddc947aaf9e6930cc46072f2cf2b68eb5e32dcf4ee84ea0647a201b299fbc6b382061309943abefa5938e8465e2f6afd051eab974d261797cd483934097a4", + "wx" : "00d1dddc947aaf9e6930cc46072f2cf2b68eb5e32dcf4ee84ea0647a201b299fbc", + "wy" : "6b382061309943abefa5938e8465e2f6afd051eab974d261797cd483934097a4" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d1dddc947aaf9e6930cc46072f2cf2b68eb5e32dcf4ee84ea0647a201b299fbc6b382061309943abefa5938e8465e2f6afd051eab974d261797cd483934097a4", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE0d3clHqvnmkwzEYHLyzyto614y3P\nTuhOoGR6IBspn7xrOCBhMJlDq++lk46EZeL2r9BR6rl00mF5fNSDk0CXpA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 450, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022049249248db6db6dbb6db6db6db6db6db5a8b230d0b2b51dcd7ebf0c9fef7c185", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04d17c1c5505bc710145ef74984864fe861e64302c16bb4a4bc69b47507b3f023541480e047b19bfe4bb885ec127cf254db1041ae1d5e8fd77e08294d398b62eb0", + "wx" : "00d17c1c5505bc710145ef74984864fe861e64302c16bb4a4bc69b47507b3f0235", + "wy" : "41480e047b19bfe4bb885ec127cf254db1041ae1d5e8fd77e08294d398b62eb0" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d17c1c5505bc710145ef74984864fe861e64302c16bb4a4bc69b47507b3f023541480e047b19bfe4bb885ec127cf254db1041ae1d5e8fd77e08294d398b62eb0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE0XwcVQW8cQFF73SYSGT+hh5kMCwW\nu0pLxptHUHs/AjVBSA4Eexm/5LuIXsEnzyVNsQQa4dXo/XfggpTTmLYusA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 451, + "comment" : "extreme value for k", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022016a4502e2781e11ac82cbc9d1edd8c981584d13e18411e2f6e0478c34416e3bb", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5", + "wx" : "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", + "wy" : "4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaxfR8uEsQkf4vOblY6RA8ncDfYEt\n6zOg9KE5RdiYwpZP40Li/hp/m47n60p8D54WK84zV2sxXs7LtkBoN79R9Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 452, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "304402205731b7c4bd04cb9efb836935ff2e547bf2909f86824af4d8df78acf76d7b3d4e0220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2", + "result" : "invalid" + }, + { + "tcId" : 453, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3045022100a8ce483a42fb3462047c96ca00d1ab83ca565b2724cca9ac14411dcb8ee7e8030220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a", + "wx" : "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", + "wy" : "00b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaxfR8uEsQkf4vOblY6RA8ncDfYEt\n6zOg9KE5RdiYwpawHL0cAeWAZXEYFLWD8GHp1DHMqZTOoTE0Sb+XyECuCg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 454, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "304402205731b7c4bd04cb9efb836935ff2e547bf2909f86824af4d8df78acf76d7b3d4e0220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2", + "result" : "invalid" + }, + { + "tcId" : 455, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3045022100a8ce483a42fb3462047c96ca00d1ab83ca565b2724cca9ac14411dcb8ee7e8030220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "044f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685", + "wx" : "4f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000", + "wy" : "00ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETzN8z9Z3JqgF5PFgCuKEnfOAfsoR\nc4Ajn72BaQAAAADtneoSTMjDlkFkEemIww9CfrUEr0OjFGzV336mBmbWhQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 456, + "comment" : "x-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30440220207db605e42c96035d54352c5bc55cf27d5ded42cb6b42bdaee499ea64784db602207f83c09192aa04ce038e861699a0f27ca55bf32741dbc95bbf997dee57f538fc", + "result" : "valid" + }, + { + "tcId" : 457, + "comment" : "x-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022067c259a2580089ed52780755c75ea8a26b9057cc1995e4b044c8176cefe3cc7b022100d48f63d31333054bbd7fab676d207bbdc4dea1cf1b4f71aceb037b8dc7f79555", + "result" : "valid" + }, + { + "tcId" : 458, + "comment" : "x-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502205dc675a2beae6deeb1ef682e922c5fe47156e069acd08073a0f8d9184d6baa6c022100e33cad4ce48f22ff6e50b47ba5dd44046a78ed7873cfd3a2c8b2d4b49aad2580", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f49726500493584fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000", + "wx" : "3cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f497265004935", + "wy" : "0084fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f49726500493584fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPPA9YU2JOc/UmaB4c/rCgWGPBrj/\nh+gBXD9JcmUASTWE+hdNeRxyvyzjiAqJYN0qfHoTOKgvhanlnNvegAAAAA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 459, + "comment" : "y-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502201a3b5c4b4a2fb0c2f9efb028a9efc78993f3151683cedf76214009ea418d3e5d022100e82e87332e7bd004cad9b13857939c01467fc1c3e4207efa45ef827985a82435", + "result" : "valid" + }, + { + "tcId" : 460, + "comment" : "y-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30460221008c44ef660ab8936fe01571168435c1918d005bd24ec76f72cea8f0faeb9f777a022100d793dcb3a6d47e2451e7d62e1c284ae25bbfaa0820f58adab79c201ba8d34a3e", + "result" : "valid" + }, + { + "tcId" : 461, + "comment" : "y-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304402204227a3dbff7ac5353cd32c8b3456397a7ee7c0e6809615fcee466b1dcde3eb49022022ea6ad811b27f944abe70b47f490d255760f8c3562e6f7e2c1da3dbe45eb540", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f4972650049357b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff", + "wx" : "3cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f497265004935", + "wy" : "7b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f4972650049357b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPPA9YU2JOc/UmaB4c/rCgWGPBrj/\nh+gBXD9JcmUASTV7BeixhuONQdMcd/V2nyLVg4XsyFfQelYaYyQhf////w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 462, + "comment" : "y-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022036636162db85e8d300ee45c51b9da00a7c2cffd9a6fb200761a647ccbf5d7e8e0221009d18374cf1f87a9051e563838e75728d3f2ff7a86c10292851b6ce885c5b0c76", + "result" : "valid" + }, + { + "tcId" : 463, + "comment" : "y-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100a637fc972f3800705b8d5293096382d1c1ae7f670be45011b8bd29059f3049bd0221009c4abb6bbe06552d5d598b07728ccaed1738eac9fc985fd786fbc0a7347da828", + "result" : "valid" + }, + { + "tcId" : 464, + "comment" : "y-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3044022076bfc74f3b488b34835aee96ee96067f53da021cff4020a10996d6933a27c03202202fd1658fe4e09b2e711b10117f5c37d9c3ea8b6f55cdf1e5a5ddae2c966d7e4e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffffa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e", + "wx" : "2829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffff", + "wy" : "00a01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffffa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKCnDH6ouQA40TtlLyj/NBUWVbrz+\nitD236X/jv////+gGq+vAA5SWFhVr6dnat4oQRMJkFLfV+frO9N+vrkiLg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 465, + "comment" : "x-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30450221008e0c35240e9e5b7bf2ab351afb13ac2655653baeabc247cab2c71cc40da44c000220079cbf8c9ba9b53608b219d6989875d960bdefcde224cf7ac6f8e791adaa4364", + "result" : "valid" + }, + { + "tcId" : 466, + "comment" : "x-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022100f6ceb6c8f76c337f51f4ec3859eb16caec969fc02a61dec1a70fa4223bdfb254022010c0334298a98a6e5c12e9c0cad587dcab43199b43cdf3785bd9c36b30925ccf", + "result" : "valid" + }, + { + "tcId" : 467, + "comment" : "x-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30450220083000a8e6121939f4b83612727b2091d8abbbdf9c92bf9bdcace8366150ce6f022100ba693f4e0b96dcbeeaa78c0d744365761151740323c346a54d74b332568d939f", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f55a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73", + "wx" : "00fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f5", + "wy" : "5a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f55a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE////+UgIHmoEWN2PnnOPJmX/kFmt\naqwHCDGMTKmnpPVairy6LdqEdDEe5UFJuXPK4MD7iVV60L945lKaFmO9cw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 468, + "comment" : "x-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30460221008a1bd6ef283948184b5a32d31860e97cc0c450931f024c30bb3b261f2552cdc7022100b7e50c0513a8ec730d112109e92761a21151e4bec68268e5c79ef804b757deaa", + "result" : "valid" + }, + { + "tcId" : 469, + "comment" : "x-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502200c18337b701b6000d3ce3574664c5dc44ead6a1f2ee0c27a728ea0b0f37990b9022100c31db9b199b3e1709c44a44118d1d7cb75324ee82ada2318744eb89651e6f6c0", + "result" : "valid" + }, + { + "tcId" : 470, + "comment" : "x-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502202133d6fc78b394d4c34e173120b1e48c7fed7b89a03e55cab90b1367155b438a0221009293e67ff4b981e50c48b0304f7b1e6b530416ee35188302b1dd2f21e5cb479a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0400000003fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71", + "wx" : "03fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e", + "wy" : "1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400000003fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAAAAA/oV+WOUnV8DpvXH+G+eABXu\nsjrrv/EXOTe6dI4QmYcgcOjofFVfoTZZzKXX+tz8sAI+qIlUjKSK8rp+cQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 471, + "comment" : "x-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502203604a98e926b2f9d7585e341a5ecc73a4e811c5c8da82b65790ff8a117a75bda022100a0ff07774c9a0d4bf83db294b970f2696cc29a73637aa454d4d3b45eb964bb88", + "result" : "valid" + }, + { + "tcId" : 472, + "comment" : "x-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502206bf7e8f8bc3a5a2e2249c92725cf0dffa9b72ead3cc56d05107a4d587563beb4022100a05332b5b424d97bfc080fe0353470610931cd538d2e4bcf78c6fc59b481d271", + "result" : "valid" + }, + { + "tcId" : 473, + "comment" : "x-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502210097e099c73088fc37052180d0483987e50c155c993cba2e6c93dd9bea5798e2c302204a9ec5f05739efb4ea93790ea22c3fc423d0aeb109cd13fb1b44d87ea52ca71f", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015000000001352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2", + "wx" : "00bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015", + "wy" : "1352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015000000001352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvLspFMefBF6qbsu8YSgWs75dLWeW\ncH2BJen4UcGK8BUAAAAAE1K7Sg+i6kzOuatj3WhK3loRJ7zzAKaYpxk7wg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 474, + "comment" : "y-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502203988bce3195aaf7c9b008a9f1663a5e13a8bee7ddba33a1bc5d55aa49fd3903d022100c39f614828e2f71a4c66d86d1c3ec7e283f768033cff5ed09e93e3218d9df1c9", + "result" : "valid" + }, + { + "tcId" : 475, + "comment" : "y-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100c3eb2e8f78a31f221d6003b949f8df6c7ec1e0c53803231e12438cb2b1b1d9ba022100b97cc1fcce1d8ddbb5e1bfa6d5300d7cac155494603c66f7eee8b8e9c9643431", + "result" : "valid" + }, + { + "tcId" : 476, + "comment" : "y-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304602210089e0c23ccf61e68dc0cb9777f18b18c84b2b02b4360c79eaa40d46ebe7f3d9b1022100a5d0164e398764e7d12d696750fcb092211c22dfdd3941e59cd73bc48eb91496", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d", + "wx" : "00bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015", + "wy" : "00fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvLspFMefBF6qbsu8YSgWs75dLWeW\ncH2BJen4UcGK8BX////+7K1EtvBdFbMxRlScIpe1IqXu2EMM/1lnWObEPQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 477, + "comment" : "y-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022100bbc1bb4ffceb61a0dbe5a12d9638dc9f004e797cf72cdba8d879fdbcd84dec14022065a7c17d9a6892cf5455a1904fdd9b57ce2b41549b9b2ca5d7d182c305e9a202", + "result" : "valid" + }, + { + "tcId" : 478, + "comment" : "y-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502202f093a33c69eeaf847e332b12bd0758be41dcf75d8131878f16e6f121cb3f4f102210093c304df074aef8cc2c8cddeaffda67eb2428ea7d3a113d51363e178d8068f71", + "result" : "valid" + }, + { + "tcId" : 479, + "comment" : "y-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100b686774db39201a9462b96842adbeea16ae6003789bb18214dab9e5a758bf6ef022100ffc6b396293b94c96fcb325fae127608ebfd118a46f715b49b918caafb602a34", + "result" : "valid" + } + ] + } + ] +} diff --git a/packages/crypto/testdata/wycheproof/ecdsa_secp256r1_sha3_512_test.json b/packages/crypto/testdata/wycheproof/ecdsa_secp256r1_sha3_512_test.json new file mode 100644 index 0000000000..c03ffdce0a --- /dev/null +++ b/packages/crypto/testdata/wycheproof/ecdsa_secp256r1_sha3_512_test.json @@ -0,0 +1,7246 @@ +{ + "algorithm" : "ECDSA", + "schema" : "ecdsa_verify_schema.json", + "generatorVersion" : "0.9rc5", + "numberOfTests" : 545, + "header" : [ + "Test vectors of type EcdsaVerify are meant for the verification", + "of ASN encoded ECDSA signatures." + ], + "notes" : { + "ArithmeticError" : { + "bugType" : "EDGE_CASE", + "description" : "Some implementations of ECDSA have arithmetic errors that occur when intermediate results have extreme values. This test vector has been constructed to test such occurences.", + "cves" : [ + "CVE-2017-18146" + ] + }, + "BerEncodedSignature" : { + "bugType" : "BER_ENCODING", + "description" : "ECDSA signatures are usually DER encoded. This signature contains valid values for r and s, but it uses alternative BER encoding.", + "effect" : "Accepting alternative BER encodings may be benign in some cases, or be an issue if protocol requires signature malleability.", + "cves" : [ + "CVE-2020-14966", + "CVE-2020-13822", + "CVE-2019-14859", + "CVE-2016-1000342" + ] + }, + "EdgeCasePublicKey" : { + "bugType" : "EDGE_CASE", + "description" : "The test vector uses a special case public key. " + }, + "EdgeCaseShamirMultiplication" : { + "bugType" : "EDGE_CASE", + "description" : "Shamir proposed a fast method for computing the sum of two scalar multiplications efficiently. This test vector has been constructed so that an intermediate result is the point at infinity if Shamir's method is used." + }, + "IntegerOverflow" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an r and s that has been modified, so that the original value is restored if the implementation ignores the most significant bits.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "InvalidEncoding" : { + "bugType" : "CAN_OF_WORMS", + "description" : "ECDSA signatures are encoded using ASN.1. This test vector contains an incorrectly encoded signature. The test vector itself was generated from a valid signature by modifying its encoding.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "InvalidSignature" : { + "bugType" : "AUTH_BYPASS", + "description" : "The signature contains special case values such as r=0 and s=0. Buggy implementations may accept such values, if the implementation does not check boundaries and computes s^(-1) == 0.", + "effect" : "Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.", + "cves" : [ + "CVE-2022-21449", + "CVE-2021-43572", + "CVE-2022-24884" + ] + }, + "InvalidTypesInSignature" : { + "bugType" : "AUTH_BYPASS", + "description" : "The signature contains invalid types. Dynamic typed languages sometime coerce such values of different types into integers. If an implementation is careless and has additional bugs, such as not checking integer boundaries then it may be possible that such signatures are accepted.", + "effect" : "Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.", + "cves" : [ + "CVE-2022-21449" + ] + }, + "MissingZero" : { + "bugType" : "LEGACY", + "description" : "Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.", + "effect" : "While signatures are more malleable if such signatures are accepted, this typically leads to no vulnerability, since a badly encoded signature can be reencoded correctly." + }, + "ModifiedInteger" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an r and s that has been modified. The goal is to check for arithmetic errors.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "ModifiedSignature" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an invalid signature that was generated from a valid signature by modifying it.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "ModularInverse" : { + "bugType" : "EDGE_CASE", + "description" : "The test vectors contains a signature where computing the modular inverse of s hits an edge case.", + "effect" : "While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.", + "cves" : [ + "CVE-2019-0865" + ] + }, + "PointDuplication" : { + "bugType" : "EDGE_CASE", + "description" : "Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission.", + "cves" : [ + "2020-12607", + "CVE-2015-2730" + ] + }, + "RangeCheck" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an r and s that has been modified. By adding or subtracting the order of the group (or other values) the test vector checks whether signature verification verifies the range of r and s.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "SmallRandS" : { + "bugType" : "EDGE_CASE", + "description" : "The test vectors contains a signature where both r and s are small integers. Some libraries cannot verify such signatures.", + "effect" : "While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.", + "cves" : [ + "2020-13895" + ] + }, + "SpecialCaseHash" : { + "bugType" : "EDGE_CASE", + "description" : "The test vector contains a signature where the hash of the message is a special case, e.g., contains a long run of 0 or 1 bits." + }, + "Untruncatedhash" : { + "bugType" : "MISSING_STEP", + "description" : "If the size of the digest is longer than the size of the underlying order of the multiplicative subgroup then the hash digest must be truncated during signature generation and verification. This test vector contains a signature where this step has been omitted." + }, + "ValidSignature" : { + "bugType" : "BASIC", + "description" : "The test vector contains a valid signature that was generated pseudorandomly. Such signatures should not fail to verify unless some of the parameters (e.g. curve or hash function) are not supported." + } + }, + "testGroups" : [ + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0404aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad587d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d", + "wx" : "04aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad5", + "wy" : "0087d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000404aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad587d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEBKrsc2NXJvIT+4qeZNo7hjLkFJWp\nRNAEW1IuunJA+tWH2TFXmKqjpboBd1eHztBeqve04J/IHW0apUboNl1SXQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 1, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "", + "sig" : "3046022100ddb577670d5a9b93666df2af7f9baadd8256fca0c81deb2d5cd7301a4b39105f022100a2bcd9f6228a0aa0a4f066aa674b9b08da252b02a77fd1b2f7a2d85929e8b491", + "result" : "valid" + }, + { + "tcId" : 2, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "4d7367", + "sig" : "30440220532d672c307da2891720d11422035ea25771f4fce0dc9948d754ca4f66ef36bb02204f296181799d3e6780086d6908ab8642711bd406e481b0ce3af1c44b9f098496", + "result" : "valid" + }, + { + "tcId" : 3, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "313233343030", + "sig" : "304502201c58cde69ddb363e7a6d2612771b3e713be8bed07f37bcda4875f152db2ac1ad022100a66755b078262b6b0d90c74aee64522104aa58b5f82fc5ba98bcef5bdb9d43a8", + "result" : "valid" + }, + { + "tcId" : 4, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "0000000000000000000000000000000000000000", + "sig" : "304402206637f14369d1dd112c5691969fcc867e64bafb1f5d8f917a9acf8ecf1dc957540220457b4a8bdd1c047b12826897991241700dad09666b4f410a56993023b098fd1e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", + "wx" : "2927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838", + "wy" : "00c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKSexBRK64+3c/kZ4KBKLrSkDJpkZ\n9whgacjE32xzKDjHeHlk6qwA5ZIfsUmKYPRgZ2az2WhQAVWNGpdOc0FRPg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 5, + "comment" : "signature malleability", + "flags" : [ + "ValidSignature" + ], + "msg" : "313233343030", + "sig" : "3045022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d02201202069b6b5ffadede2fdc290da1badc989ba98a9a491db339bfe478450ef9cc", + "result" : "valid" + }, + { + "tcId" : 6, + "comment" : "Legacy: ASN encoding of r misses leading 0", + "flags" : [ + "MissingZero" + ], + "msg" : "313233343030", + "sig" : "30450220dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 7, + "comment" : "Legacy: ASN encoding of s misses leading 0", + "flags" : [ + "MissingZero" + ], + "msg" : "313233343030", + "sig" : "3045022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d0220edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 8, + "comment" : "valid", + "flags" : [ + "ValidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "valid" + }, + { + "tcId" : 9, + "comment" : "length of sequence [r, s] uses long form encoding", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "308146022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 10, + "comment" : "length of sequence [r, s] contains a leading 0", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "30820046022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 11, + "comment" : "length of sequence [r, s] uses 71 instead of 70", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3047022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 12, + "comment" : "length of sequence [r, s] uses 69 instead of 70", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 13, + "comment" : "uint32 overflow in length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30850100000046022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 14, + "comment" : "uint64 overflow in length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3089010000000000000046022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 15, + "comment" : "length of sequence [r, s] = 2**31 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30847fffffff022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 16, + "comment" : "length of sequence [r, s] = 2**31", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308480000000022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 17, + "comment" : "length of sequence [r, s] = 2**32 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3084ffffffff022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 18, + "comment" : "length of sequence [r, s] = 2**40 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3085ffffffffff022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 19, + "comment" : "length of sequence [r, s] = 2**64 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3088ffffffffffffffff022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 20, + "comment" : "incorrect length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30ff022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 21, + "comment" : "replaced sequence [r, s] by an indefinite length tag without termination", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3080022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 22, + "comment" : "removing sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "", + "result" : "invalid" + }, + { + "tcId" : 23, + "comment" : "lonely sequence tag", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30", + "result" : "invalid" + }, + { + "tcId" : 24, + "comment" : "appending 0's to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3048022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b850000", + "result" : "invalid" + }, + { + "tcId" : 25, + "comment" : "prepending 0's to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30480000022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 26, + "comment" : "appending unused 0's to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3046022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b850000", + "result" : "invalid" + }, + { + "tcId" : 27, + "comment" : "appending null value to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3048022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b850500", + "result" : "invalid" + }, + { + "tcId" : 28, + "comment" : "prepending garbage to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304b4981773046022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 29, + "comment" : "prepending garbage to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a25003046022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 30, + "comment" : "appending garbage to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30483046022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b850004deadbeef", + "result" : "invalid" + }, + { + "tcId" : 31, + "comment" : "including undefined tags", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304eaa00bb00cd003046022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 32, + "comment" : "including undefined tags", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304e2229aa00bb00cd00022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 33, + "comment" : "including undefined tags", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304e022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d2229aa00bb00cd00022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 34, + "comment" : "truncated length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3081", + "result" : "invalid" + }, + { + "tcId" : 35, + "comment" : "including undefined tags to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304caa02aabb3046022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 36, + "comment" : "using composition with indefinite length for sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30803046022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b850000", + "result" : "invalid" + }, + { + "tcId" : 37, + "comment" : "using composition with wrong tag for sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30803146022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b850000", + "result" : "invalid" + }, + { + "tcId" : 38, + "comment" : "Replacing sequence [r, s] with NULL", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "0500", + "result" : "invalid" + }, + { + "tcId" : 39, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "2e46022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 40, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "2f46022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 41, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3146022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 42, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3246022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 43, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "ff46022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 44, + "comment" : "dropping value of sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3000", + "result" : "invalid" + }, + { + "tcId" : 45, + "comment" : "using composition for sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a30010230452100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 46, + "comment" : "truncated sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b", + "result" : "invalid" + }, + { + "tcId" : 47, + "comment" : "truncated sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30452100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 48, + "comment" : "sequence [r, s] of size 4167 to check for overflows", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30821047022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 49, + "comment" : "indefinite length", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "3080022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b850000", + "result" : "invalid" + }, + { + "tcId" : 50, + "comment" : "indefinite length with truncated delimiter", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3080022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b8500", + "result" : "invalid" + }, + { + "tcId" : 51, + "comment" : "indefinite length with additional element", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3080022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b8505000000", + "result" : "invalid" + }, + { + "tcId" : 52, + "comment" : "indefinite length with truncated element", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3080022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85060811220000", + "result" : "invalid" + }, + { + "tcId" : 53, + "comment" : "indefinite length with garbage", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3080022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b850000fe02beef", + "result" : "invalid" + }, + { + "tcId" : 54, + "comment" : "indefinite length with nonempty EOC", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3080022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b850002beef", + "result" : "invalid" + }, + { + "tcId" : 55, + "comment" : "prepend empty sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30483000022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 56, + "comment" : "append empty sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3048022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b853000", + "result" : "invalid" + }, + { + "tcId" : 57, + "comment" : "append zero", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3049022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85020100", + "result" : "invalid" + }, + { + "tcId" : 58, + "comment" : "append garbage with high tag number", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3049022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85bf7f00", + "result" : "invalid" + }, + { + "tcId" : 59, + "comment" : "append null with explicit tag", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304a022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85a0020500", + "result" : "invalid" + }, + { + "tcId" : 60, + "comment" : "append null with implicit tag", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3048022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85a000", + "result" : "invalid" + }, + { + "tcId" : 61, + "comment" : "sequence of sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30483046022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 62, + "comment" : "truncated sequence: removed last 1 elements", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3023022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d", + "result" : "invalid" + }, + { + "tcId" : 63, + "comment" : "repeating element in sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3069022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 64, + "comment" : "flipped bit 0 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304400dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2c022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 65, + "comment" : "flipped bit 32 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304400dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49376ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 66, + "comment" : "flipped bit 48 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304400dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a59377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 67, + "comment" : "flipped bit 64 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304400dcbe02d38091fccba712175e1effda765021c6b8f211bc9c41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 68, + "comment" : "length of r uses long form encoding", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "304702812100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 69, + "comment" : "length of r contains a leading 0", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "30480282002100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 70, + "comment" : "length of r uses 34 instead of 33", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3046022200dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 71, + "comment" : "length of r uses 32 instead of 33", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3046022000dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 72, + "comment" : "uint32 overflow in length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304b0285010000002100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 73, + "comment" : "uint64 overflow in length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304f028901000000000000002100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 74, + "comment" : "length of r = 2**31 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a02847fffffff00dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 75, + "comment" : "length of r = 2**31", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a02848000000000dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 76, + "comment" : "length of r = 2**32 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a0284ffffffff00dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 77, + "comment" : "length of r = 2**40 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304b0285ffffffffff00dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 78, + "comment" : "length of r = 2**64 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304e0288ffffffffffffffff00dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 79, + "comment" : "incorrect length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304602ff00dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 80, + "comment" : "replaced r by an indefinite length tag without termination", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3046028000dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 81, + "comment" : "removing r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3023022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 82, + "comment" : "lonely integer tag", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "302402022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 83, + "comment" : "lonely integer tag", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3024022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d02", + "result" : "invalid" + }, + { + "tcId" : 84, + "comment" : "appending 0's to r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3048022300dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d0000022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 85, + "comment" : "prepending 0's to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30480223000000dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 86, + "comment" : "appending unused 0's to r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3048022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d0000022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 87, + "comment" : "appending null value to r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3048022300dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d0500022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 88, + "comment" : "prepending garbage to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304b2226498177022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 89, + "comment" : "prepending garbage to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a22252500022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 90, + "comment" : "appending garbage to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304e2223022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d0004deadbeef022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 91, + "comment" : "truncated length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30250281022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 92, + "comment" : "including undefined tags to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304c2227aa02aabb022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 93, + "comment" : "using composition with indefinite length for r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a2280022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d0000022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 94, + "comment" : "using composition with wrong tag for r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a2280032100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d0000022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 95, + "comment" : "Replacing r with NULL", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30250500022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 96, + "comment" : "changing tag value of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3046002100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 97, + "comment" : "changing tag value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3046012100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 98, + "comment" : "changing tag value of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3046032100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 99, + "comment" : "changing tag value of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3046042100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 100, + "comment" : "changing tag value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3046ff2100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 101, + "comment" : "dropping value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30250200022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 102, + "comment" : "using composition for r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a22250201000220dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 103, + "comment" : "modifying first byte of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3046022102dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 104, + "comment" : "modifying last byte of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57efad022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 105, + "comment" : "truncated r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3045022000dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 106, + "comment" : "r of size 4130 to check for overflows", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "308210490282102200dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 107, + "comment" : "leading ff in r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30470222ff00dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 108, + "comment" : "replaced r by infinity", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3026090180022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 109, + "comment" : "replacing r with zero", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 110, + "comment" : "flipped bit 0 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3044022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d00edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b84", + "result" : "invalid" + }, + { + "tcId" : 111, + "comment" : "flipped bit 32 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3044022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d00edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64bb7542b85", + "result" : "invalid" + }, + { + "tcId" : 112, + "comment" : "flipped bit 48 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3044022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d00edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f8e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 113, + "comment" : "flipped bit 64 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3044022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d00edfdf96394a0052221d023d6f25e4523244b51230cce80d0b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 114, + "comment" : "length of s uses long form encoding", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "3047022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d02812100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 115, + "comment" : "length of s contains a leading 0", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "3048022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d0282002100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 116, + "comment" : "length of s uses 34 instead of 33", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3046022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022200edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 117, + "comment" : "length of s uses 32 instead of 33", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3046022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022000edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 118, + "comment" : "uint32 overflow in length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304b022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d0285010000002100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 119, + "comment" : "uint64 overflow in length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304f022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d028901000000000000002100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 120, + "comment" : "length of s = 2**31 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d02847fffffff00edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 121, + "comment" : "length of s = 2**31", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d02848000000000edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 122, + "comment" : "length of s = 2**32 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d0284ffffffff00edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 123, + "comment" : "length of s = 2**40 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304b022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d0285ffffffffff00edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 124, + "comment" : "length of s = 2**64 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304e022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d0288ffffffffffffffff00edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 125, + "comment" : "incorrect length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3046022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d02ff00edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 126, + "comment" : "replaced s by an indefinite length tag without termination", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3046022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d028000edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 127, + "comment" : "appending 0's to s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3048022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022300edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b850000", + "result" : "invalid" + }, + { + "tcId" : 128, + "comment" : "prepending 0's to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3048022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d0223000000edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 129, + "comment" : "appending null value to s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3048022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022300edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b850500", + "result" : "invalid" + }, + { + "tcId" : 130, + "comment" : "prepending garbage to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304b022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d2226498177022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 131, + "comment" : "prepending garbage to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d22252500022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 132, + "comment" : "appending garbage to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304e022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d2223022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b850004deadbeef", + "result" : "invalid" + }, + { + "tcId" : 133, + "comment" : "truncated length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3025022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d0281", + "result" : "invalid" + }, + { + "tcId" : 134, + "comment" : "including undefined tags to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304c022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d2227aa02aabb022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 135, + "comment" : "using composition with indefinite length for s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d2280022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b850000", + "result" : "invalid" + }, + { + "tcId" : 136, + "comment" : "using composition with wrong tag for s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d2280032100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b850000", + "result" : "invalid" + }, + { + "tcId" : 137, + "comment" : "Replacing s with NULL", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d0500", + "result" : "invalid" + }, + { + "tcId" : 138, + "comment" : "changing tag value of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d002100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 139, + "comment" : "changing tag value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3046022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d012100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 140, + "comment" : "changing tag value of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d032100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 141, + "comment" : "changing tag value of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d042100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 142, + "comment" : "changing tag value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3046022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2dff2100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 143, + "comment" : "dropping value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3025022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d0200", + "result" : "invalid" + }, + { + "tcId" : 144, + "comment" : "using composition for s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d22250201000220edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 145, + "comment" : "modifying first byte of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022102edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 146, + "comment" : "modifying last byte of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b05", + "result" : "invalid" + }, + { + "tcId" : 147, + "comment" : "truncated s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3045022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022000edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b", + "result" : "invalid" + }, + { + "tcId" : 148, + "comment" : "s of size 4130 to check for overflows", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30821049022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d0282102200edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 149, + "comment" : "leading ff in s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d0222ff00edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 150, + "comment" : "replaced s by infinity", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d090180", + "result" : "invalid" + }, + { + "tcId" : 151, + "comment" : "replacing s with zero", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d020100", + "result" : "invalid" + }, + { + "tcId" : 152, + "comment" : "replaced r by r + n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "3046022101dcbe02d28091fccca712175e1effda760d08c16699295b22355e5e3ae9bb147e022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 153, + "comment" : "replaced r by r - n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "30450220dcbe02d48091fccaa712175e1effda76933acc0b4afa1e184deac8b4f0f4c9dc022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 154, + "comment" : "replaced r by r + 256 * n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "304702220100dcbe01d38091fdcba712175e1effda33371c746009b04190fb6f5674507d402d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 155, + "comment" : "replaced r by -r", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30460221ff2341fd2c7f6e033458ede8a1e1002589afde39470dee4362be5b6c8812a810d3022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 156, + "comment" : "replaced r by n - r", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "304502202341fd2b7f6e033558ede8a1e10025896cc533f4b505e1e7b215374b0f0b3624022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 157, + "comment" : "replaced r by -n - r", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30460221fe2341fd2d7f6e033358ede8a1e1002589f2f73e9966d6a4ddcaa1a1c51644eb82022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 158, + "comment" : "replaced r by r + 2**256", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "3046022101dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 159, + "comment" : "replaced r by r + 2**320", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "304e0229010000000000000000dcbe02d38091fccba712175e1effda765021c6b8f211bc9d41a49377ed57ef2d022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 160, + "comment" : "replaced s by s + n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "3046022101edfdf96294a0052321d023d6f25e4522e1324bd0b3e61f56adb3b10db3b750d6022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 161, + "comment" : "replaced s by s - n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "30450220edfdf96494a0052121d023d6f25e45236764567565b6e24cc6401b87baf10634022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 162, + "comment" : "replaced s by s + 256 * n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "304702220100edfdf86394a0062221d023d6f25e44e00b45feca246d05c573c4a9471a797c85022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 163, + "comment" : "replaced s by -s", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30460221ff1202069c6b5ffaddde2fdc290da1badcdbb4aedcf3317f2e460619b548abd47b022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 164, + "comment" : "replaced s by -n - s", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30460221fe1202069d6b5ffadcde2fdc290da1badd1ecdb42f4c19e0a9524c4ef24c48af2a022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 165, + "comment" : "replaced s by s + 2**256", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "3046022101edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 166, + "comment" : "replaced s by s - 2**256", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "30450220edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 167, + "comment" : "replaced s by s + 2**320", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "304e0229010000000000000000edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85022100edfdf96394a0052221d023d6f25e4523244b51230cce80d1b9f9e64ab7542b85", + "result" : "invalid" + }, + { + "tcId" : 168, + "comment" : "Signature with special case values r=0 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100020100", + "result" : "invalid" + }, + { + "tcId" : 169, + "comment" : "Signature with special case values r=0 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100020101", + "result" : "invalid" + }, + { + "tcId" : 170, + "comment" : "Signature with special case values r=0 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201000201ff", + "result" : "invalid" + }, + { + "tcId" : 171, + "comment" : "Signature with special case values r=0 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 172, + "comment" : "Signature with special case values r=0 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 173, + "comment" : "Signature with special case values r=0 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 174, + "comment" : "Signature with special case values r=0 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 175, + "comment" : "Signature with special case values r=0 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 176, + "comment" : "Signature with special case values r=1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101020100", + "result" : "invalid" + }, + { + "tcId" : 177, + "comment" : "Signature with special case values r=1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101020101", + "result" : "invalid" + }, + { + "tcId" : 178, + "comment" : "Signature with special case values r=1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201010201ff", + "result" : "invalid" + }, + { + "tcId" : 179, + "comment" : "Signature with special case values r=1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 180, + "comment" : "Signature with special case values r=1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 181, + "comment" : "Signature with special case values r=1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 182, + "comment" : "Signature with special case values r=1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 183, + "comment" : "Signature with special case values r=1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 184, + "comment" : "Signature with special case values r=-1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff020100", + "result" : "invalid" + }, + { + "tcId" : 185, + "comment" : "Signature with special case values r=-1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff020101", + "result" : "invalid" + }, + { + "tcId" : 186, + "comment" : "Signature with special case values r=-1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff0201ff", + "result" : "invalid" + }, + { + "tcId" : 187, + "comment" : "Signature with special case values r=-1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 188, + "comment" : "Signature with special case values r=-1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 189, + "comment" : "Signature with special case values r=-1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 190, + "comment" : "Signature with special case values r=-1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 191, + "comment" : "Signature with special case values r=-1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 192, + "comment" : "Signature with special case values r=n and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020100", + "result" : "invalid" + }, + { + "tcId" : 193, + "comment" : "Signature with special case values r=n and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101", + "result" : "invalid" + }, + { + "tcId" : 194, + "comment" : "Signature with special case values r=n and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510201ff", + "result" : "invalid" + }, + { + "tcId" : 195, + "comment" : "Signature with special case values r=n and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 196, + "comment" : "Signature with special case values r=n and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 197, + "comment" : "Signature with special case values r=n and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 198, + "comment" : "Signature with special case values r=n and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 199, + "comment" : "Signature with special case values r=n and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 200, + "comment" : "Signature with special case values r=n - 1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550020100", + "result" : "invalid" + }, + { + "tcId" : 201, + "comment" : "Signature with special case values r=n - 1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550020101", + "result" : "invalid" + }, + { + "tcId" : 202, + "comment" : "Signature with special case values r=n - 1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325500201ff", + "result" : "invalid" + }, + { + "tcId" : 203, + "comment" : "Signature with special case values r=n - 1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 204, + "comment" : "Signature with special case values r=n - 1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 205, + "comment" : "Signature with special case values r=n - 1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 206, + "comment" : "Signature with special case values r=n - 1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 207, + "comment" : "Signature with special case values r=n - 1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 208, + "comment" : "Signature with special case values r=n + 1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552020100", + "result" : "invalid" + }, + { + "tcId" : 209, + "comment" : "Signature with special case values r=n + 1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552020101", + "result" : "invalid" + }, + { + "tcId" : 210, + "comment" : "Signature with special case values r=n + 1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325520201ff", + "result" : "invalid" + }, + { + "tcId" : 211, + "comment" : "Signature with special case values r=n + 1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 212, + "comment" : "Signature with special case values r=n + 1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 213, + "comment" : "Signature with special case values r=n + 1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 214, + "comment" : "Signature with special case values r=n + 1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 215, + "comment" : "Signature with special case values r=n + 1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 216, + "comment" : "Signature with special case values r=p and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff020100", + "result" : "invalid" + }, + { + "tcId" : 217, + "comment" : "Signature with special case values r=p and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff020101", + "result" : "invalid" + }, + { + "tcId" : 218, + "comment" : "Signature with special case values r=p and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0201ff", + "result" : "invalid" + }, + { + "tcId" : 219, + "comment" : "Signature with special case values r=p and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 220, + "comment" : "Signature with special case values r=p and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 221, + "comment" : "Signature with special case values r=p and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 222, + "comment" : "Signature with special case values r=p and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 223, + "comment" : "Signature with special case values r=p and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 224, + "comment" : "Signature with special case values r=p + 1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000001000000000000000000000000020100", + "result" : "invalid" + }, + { + "tcId" : 225, + "comment" : "Signature with special case values r=p + 1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000001000000000000000000000000020101", + "result" : "invalid" + }, + { + "tcId" : 226, + "comment" : "Signature with special case values r=p + 1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff000000010000000000000000000000010000000000000000000000000201ff", + "result" : "invalid" + }, + { + "tcId" : 227, + "comment" : "Signature with special case values r=p + 1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 228, + "comment" : "Signature with special case values r=p + 1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 229, + "comment" : "Signature with special case values r=p + 1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 230, + "comment" : "Signature with special case values r=p + 1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 231, + "comment" : "Signature with special case values r=p + 1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 232, + "comment" : "Signature encoding contains incorrect types: r=0, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3008020100090380fe01", + "result" : "invalid" + }, + { + "tcId" : 233, + "comment" : "Signature encoding contains incorrect types: r=0, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100090142", + "result" : "invalid" + }, + { + "tcId" : 234, + "comment" : "Signature encoding contains incorrect types: r=0, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100010101", + "result" : "invalid" + }, + { + "tcId" : 235, + "comment" : "Signature encoding contains incorrect types: r=0, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100010100", + "result" : "invalid" + }, + { + "tcId" : 236, + "comment" : "Signature encoding contains incorrect types: r=0, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201000500", + "result" : "invalid" + }, + { + "tcId" : 237, + "comment" : "Signature encoding contains incorrect types: r=0, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201000c00", + "result" : "invalid" + }, + { + "tcId" : 238, + "comment" : "Signature encoding contains incorrect types: r=0, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201000c0130", + "result" : "invalid" + }, + { + "tcId" : 239, + "comment" : "Signature encoding contains incorrect types: r=0, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201003000", + "result" : "invalid" + }, + { + "tcId" : 240, + "comment" : "Signature encoding contains incorrect types: r=0, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201003003020100", + "result" : "invalid" + }, + { + "tcId" : 241, + "comment" : "Signature encoding contains incorrect types: r=1, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3008020101090380fe01", + "result" : "invalid" + }, + { + "tcId" : 242, + "comment" : "Signature encoding contains incorrect types: r=1, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101090142", + "result" : "invalid" + }, + { + "tcId" : 243, + "comment" : "Signature encoding contains incorrect types: r=1, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101010101", + "result" : "invalid" + }, + { + "tcId" : 244, + "comment" : "Signature encoding contains incorrect types: r=1, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101010100", + "result" : "invalid" + }, + { + "tcId" : 245, + "comment" : "Signature encoding contains incorrect types: r=1, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201010500", + "result" : "invalid" + }, + { + "tcId" : 246, + "comment" : "Signature encoding contains incorrect types: r=1, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201010c00", + "result" : "invalid" + }, + { + "tcId" : 247, + "comment" : "Signature encoding contains incorrect types: r=1, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201010c0130", + "result" : "invalid" + }, + { + "tcId" : 248, + "comment" : "Signature encoding contains incorrect types: r=1, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201013000", + "result" : "invalid" + }, + { + "tcId" : 249, + "comment" : "Signature encoding contains incorrect types: r=1, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201013003020100", + "result" : "invalid" + }, + { + "tcId" : 250, + "comment" : "Signature encoding contains incorrect types: r=-1, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201ff090380fe01", + "result" : "invalid" + }, + { + "tcId" : 251, + "comment" : "Signature encoding contains incorrect types: r=-1, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff090142", + "result" : "invalid" + }, + { + "tcId" : 252, + "comment" : "Signature encoding contains incorrect types: r=-1, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff010101", + "result" : "invalid" + }, + { + "tcId" : 253, + "comment" : "Signature encoding contains incorrect types: r=-1, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff010100", + "result" : "invalid" + }, + { + "tcId" : 254, + "comment" : "Signature encoding contains incorrect types: r=-1, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201ff0500", + "result" : "invalid" + }, + { + "tcId" : 255, + "comment" : "Signature encoding contains incorrect types: r=-1, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201ff0c00", + "result" : "invalid" + }, + { + "tcId" : 256, + "comment" : "Signature encoding contains incorrect types: r=-1, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff0c0130", + "result" : "invalid" + }, + { + "tcId" : 257, + "comment" : "Signature encoding contains incorrect types: r=-1, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201ff3000", + "result" : "invalid" + }, + { + "tcId" : 258, + "comment" : "Signature encoding contains incorrect types: r=-1, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201ff3003020100", + "result" : "invalid" + }, + { + "tcId" : 259, + "comment" : "Signature encoding contains incorrect types: r=n, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551090380fe01", + "result" : "invalid" + }, + { + "tcId" : 260, + "comment" : "Signature encoding contains incorrect types: r=n, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551090142", + "result" : "invalid" + }, + { + "tcId" : 261, + "comment" : "Signature encoding contains incorrect types: r=n, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551010101", + "result" : "invalid" + }, + { + "tcId" : 262, + "comment" : "Signature encoding contains incorrect types: r=n, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551010100", + "result" : "invalid" + }, + { + "tcId" : 263, + "comment" : "Signature encoding contains incorrect types: r=n, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510500", + "result" : "invalid" + }, + { + "tcId" : 264, + "comment" : "Signature encoding contains incorrect types: r=n, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510c00", + "result" : "invalid" + }, + { + "tcId" : 265, + "comment" : "Signature encoding contains incorrect types: r=n, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510c0130", + "result" : "invalid" + }, + { + "tcId" : 266, + "comment" : "Signature encoding contains incorrect types: r=n, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325513000", + "result" : "invalid" + }, + { + "tcId" : 267, + "comment" : "Signature encoding contains incorrect types: r=n, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325513003020100", + "result" : "invalid" + }, + { + "tcId" : 268, + "comment" : "Signature encoding contains incorrect types: r=p, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff090380fe01", + "result" : "invalid" + }, + { + "tcId" : 269, + "comment" : "Signature encoding contains incorrect types: r=p, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff090142", + "result" : "invalid" + }, + { + "tcId" : 270, + "comment" : "Signature encoding contains incorrect types: r=p, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff010101", + "result" : "invalid" + }, + { + "tcId" : 271, + "comment" : "Signature encoding contains incorrect types: r=p, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff010100", + "result" : "invalid" + }, + { + "tcId" : 272, + "comment" : "Signature encoding contains incorrect types: r=p, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0500", + "result" : "invalid" + }, + { + "tcId" : 273, + "comment" : "Signature encoding contains incorrect types: r=p, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0c00", + "result" : "invalid" + }, + { + "tcId" : 274, + "comment" : "Signature encoding contains incorrect types: r=p, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0c0130", + "result" : "invalid" + }, + { + "tcId" : 275, + "comment" : "Signature encoding contains incorrect types: r=p, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff3000", + "result" : "invalid" + }, + { + "tcId" : 276, + "comment" : "Signature encoding contains incorrect types: r=p, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff3003020100", + "result" : "invalid" + }, + { + "tcId" : 277, + "comment" : "Signature encoding contains incorrect types: r=0.25, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300a090380fe01090380fe01", + "result" : "invalid" + }, + { + "tcId" : 278, + "comment" : "Signature encoding contains incorrect types: r=nan, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006090142090142", + "result" : "invalid" + }, + { + "tcId" : 279, + "comment" : "Signature encoding contains incorrect types: r=True, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010101010101", + "result" : "invalid" + }, + { + "tcId" : 280, + "comment" : "Signature encoding contains incorrect types: r=False, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010100010100", + "result" : "invalid" + }, + { + "tcId" : 281, + "comment" : "Signature encoding contains incorrect types: r=Null, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300405000500", + "result" : "invalid" + }, + { + "tcId" : 282, + "comment" : "Signature encoding contains incorrect types: r=empyt UTF-8 string, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30040c000c00", + "result" : "invalid" + }, + { + "tcId" : 283, + "comment" : "Signature encoding contains incorrect types: r=\"0\", s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060c01300c0130", + "result" : "invalid" + }, + { + "tcId" : 284, + "comment" : "Signature encoding contains incorrect types: r=empty list, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300430003000", + "result" : "invalid" + }, + { + "tcId" : 285, + "comment" : "Signature encoding contains incorrect types: r=list containing 0, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300a30030201003003020100", + "result" : "invalid" + }, + { + "tcId" : 286, + "comment" : "Signature encoding contains incorrect types: r=0.25, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3008090380fe01020100", + "result" : "invalid" + }, + { + "tcId" : 287, + "comment" : "Signature encoding contains incorrect types: r=nan, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006090142020100", + "result" : "invalid" + }, + { + "tcId" : 288, + "comment" : "Signature encoding contains incorrect types: r=True, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010101020100", + "result" : "invalid" + }, + { + "tcId" : 289, + "comment" : "Signature encoding contains incorrect types: r=False, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010100020100", + "result" : "invalid" + }, + { + "tcId" : 290, + "comment" : "Signature encoding contains incorrect types: r=Null, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050500020100", + "result" : "invalid" + }, + { + "tcId" : 291, + "comment" : "Signature encoding contains incorrect types: r=empyt UTF-8 string, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050c00020100", + "result" : "invalid" + }, + { + "tcId" : 292, + "comment" : "Signature encoding contains incorrect types: r=\"0\", s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060c0130020100", + "result" : "invalid" + }, + { + "tcId" : 293, + "comment" : "Signature encoding contains incorrect types: r=empty list, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30053000020100", + "result" : "invalid" + }, + { + "tcId" : 294, + "comment" : "Signature encoding contains incorrect types: r=list containing 0, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30083003020100020100", + "result" : "invalid" + }, + { + "tcId" : 295, + "comment" : "Edge case for Shamir multiplication", + "flags" : [ + "EdgeCaseShamirMultiplication" + ], + "msg" : "3335343130", + "sig" : "3044022064a1aab5000d0e804f3e2fc02bdee9be8ff312334e2ba16d11547c97711c898e02203d4e6c69176bb9e30eec304a30d982cb3f6073a2273f36b67b1b284899b08163", + "result" : "valid" + }, + { + "tcId" : 296, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32373239373236343137", + "sig" : "3046022100f521807c1e329ac6df4df24208d1e7088b4e4de5a82ed37dbfd8d49c7406f91b022100c44f723038deea858a25d7264d1680b416ffc0d909b94def9fbda02477d69ef4", + "result" : "valid" + }, + { + "tcId" : 297, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "343331343737363137", + "sig" : "30450220219f842783028cab66f419241dee39da459e2d295d0ab1e56b29b38f50a8bd51022100f6f357077677e2669c1e289f65c6094c68b8e1efbe4c87468327c81d55979bd9", + "result" : "valid" + }, + { + "tcId" : 298, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36363033343338303333", + "sig" : "3045022015768c2623e7093c7dcb468d430007fc7338f1cfd058fe22ab09a451b61ec34c022100a609689226f073c968fc46336cfd116edb92045f2383d5376ff88272dc444ca2", + "result" : "valid" + }, + { + "tcId" : 299, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32383239363231343535", + "sig" : "3045022100bb449ace6f3b900103a09357cda16e3b14e9e99beb3b8f1928f0a66ce30b0ea502206e6b65f9798cd8c32d7068270800da5d98f06d36836ccb7c30551717fae3052f", + "result" : "valid" + }, + { + "tcId" : 300, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34333131383231373336", + "sig" : "30450220589e10e34c3fea59478a9301bde976cbd56ac15afa2f13f14f310e5e8d6bf1e1022100adf5198111939bd395bd3820742a68ae97f8595cfc8b7e1892fc360d13142158", + "result" : "valid" + }, + { + "tcId" : 301, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3131373730373734313735", + "sig" : "3046022100ad5a1daab3023a651b58e3a13ebfaefc14fb9c79ad2610be68e49bd3992e5722022100cfb91fa16a32c8724cef5714e72f2c91b1d50050b4eb272a82327604486cbbb2", + "result" : "valid" + }, + { + "tcId" : 302, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31353938353135353635", + "sig" : "3045022059d0df1176b277e12c097e9e00860dc4ad3bb7f2e4af2282beb13eff9d7b6afc022100d3da4f61e8adc8449885a52bf73eda66ac1b77ba05a1ab8397e42ecaeaff68cf", + "result" : "valid" + }, + { + "tcId" : 303, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32383831313031363138", + "sig" : "3045022100d274baceefc72a921fc4962cc9487263ec6984f0f82c0b992ae3c80ba685b423022024bd9a9f39ed02773e8ba54e3f0f99f4e806a69839b7890099be2978cd55076f", + "result" : "valid" + }, + { + "tcId" : 304, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32303034373833333332", + "sig" : "304502203411db9e53af62472c8afa3a4ae7d044fdbb78b1e3a8e8fd329bc72e9e1dfb5d0221008284d93b62242f6274a26a3419719dc0635e0604fa6da5c2dbfbb85541c88566", + "result" : "valid" + }, + { + "tcId" : 305, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "39353030323437373837", + "sig" : "3044022033b2abf92021a14fd1e5293008c8aff551fd4a0cacaf8ec6e147f40d0f521cb002204d0d3ed085477a4dc7fd86d242905637a71700ffd4c22cf962a67e9ae32b8877", + "result" : "valid" + }, + { + "tcId" : 306, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32323039353030303630", + "sig" : "30440220717f5185242ac57215d8713f902cf9012f45dba76b8e7e51c67b71e6de10f0d8022028a9ad765a6b1248807be126b9eee01e8e2d65d8528cb28f0d45763f507d97f0", + "result" : "valid" + }, + { + "tcId" : 307, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "38313933373839323237", + "sig" : "304402204e57dbece14d3d279f1e831777b28401d2990c4ae477eebb997b583e82f29c5402203e41fe090c8f14b8af7fd39c2628869258cf05b0e289b6692602c10cdcc8dd83", + "result" : "valid" + }, + { + "tcId" : 308, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33363530363033323938", + "sig" : "3045022009eb0b2bf6a2491eb35c3a902da3c6c90933dd374dfb1f60f8ef7bd749725755022100df8a0ee8f757dc599350bb0e2aec515451152ff05bb2e439ba9145fc9a0849fa", + "result" : "valid" + }, + { + "tcId" : 309, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3136333833393533353233", + "sig" : "304402201c66a303f7f548ff4c17ce6c6038879cb9d47abbb71ad69a798d0d8a99518dcd0220485ee205c6fa3ffe5411948dff2351ab9bbbc20ca419d6182da77f5579058749", + "result" : "valid" + }, + { + "tcId" : 310, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32303931373638323035", + "sig" : "3045022100ae1fd2dbad7ebc2b7f19d1789e1f68ce345f40568a576a29dadcf894c51f7a3f022069e80f80c76b57e1767484485915980b5e2493e89d8824b7922ea2cbc687d2b3", + "result" : "valid" + }, + { + "tcId" : 311, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "39333634373032383235", + "sig" : "3044022067afdc527b0003c8400ade54df5663635f811950cb34ea77435c0ce40036524902207afa3d39b8a7e52ce768e466db6da41a354c12ea2f677bf05a24fc689e347323", + "result" : "valid" + }, + { + "tcId" : 312, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "393236383638373931", + "sig" : "30450221009b1a90f8116d33d674137579528f395ed13ecbc238940a1a9a8504a72568a9d7022007f34d9400af004fd657144ce97a13b76d509f7fd4c9245ce54609f749ead3cd", + "result" : "valid" + }, + { + "tcId" : 313, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35313738313334383231", + "sig" : "30450220263040f9babb63aec7d73fdbce988fb3ca2115ab24bba0c80832e3de34b698b9022100f7d99b7738aca745b91b65c697a83ac76ce1e61568d9271631d06af1b77ad5d6", + "result" : "valid" + }, + { + "tcId" : 314, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34373335303130373531", + "sig" : "304502210082f676de71ecae7041b8788e0870a57923c71fd21db1f8864e4519ee2f65d8880220020f12d98b79d45348513696d5b4926856d953e72f267d30e7bcd57ee8147210", + "result" : "valid" + }, + { + "tcId" : 315, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3134333533393131363839", + "sig" : "304502204e3c9c22a54f1ceb9336b656bf7019c375cb7f9137d692454c6d882927f16795022100b3bde8f45d5f885948b45402b9e7a722c292e88bfadb5bb2fdadfe8e1b3f5181", + "result" : "valid" + }, + { + "tcId" : 316, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31333834353439323034", + "sig" : "3046022100b20721bd0e8c9ee6eb790cee9d88481d17d568b4c942ba437e607460031c1df50221009f13ff6a54e6a0c5041cc3690c8f3b499f05e34f235c8adf8fd455df4a17ce97", + "result" : "valid" + }, + { + "tcId" : 317, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32373632313932373839", + "sig" : "304502206b1d46eeacccf7066a0fef27f498a59a9376b2544258510452787bd4a35783b502210088328ac07938b5b9cfe62a3841382cfbe9d623480cec2a3fdb73ee36dd4aef8f", + "result" : "valid" + }, + { + "tcId" : 318, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31383331363534333331", + "sig" : "30440220257e760a54637387b443f829f1a5802c7fc92bdf033039acf68e1acea0cbcdbe022025087f120467a80cc07efb7bb27ae68d8569a38fe2908282c3c7a310322761c5", + "result" : "valid" + }, + { + "tcId" : 319, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32343336383939303330", + "sig" : "304402201869c821e271838453c88c4a867df2301d27662b72d9385bacb6740ab6d6b5c3022022ccc9a0493116556d9ffc7582253c581452d717a7e00618dce21f46f5b64fd0", + "result" : "valid" + }, + { + "tcId" : 320, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "323034303431323232", + "sig" : "304602210094a521fb3bed347b0dcbe55f2e67c0d7abc4aa32ed2e1a6fd1c209de3a25ca250221009b7631a6520ed4b14b5b2a8b57a52de31f583b8d1260eb8dc061ad965d0e9eb6", + "result" : "valid" + }, + { + "tcId" : 321, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33333337313139393735", + "sig" : "3045022100ee4913a5f83dd3310e91595ef197075600ae17785e1c0b9139cbaea8def1d6d002202818f7847c48a9a38739c71653919104db8920a816000ed21e5179980efb6b6d", + "result" : "valid" + }, + { + "tcId" : 322, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36363935363230363738", + "sig" : "3045022100e912b0e5436db2a50817c6424291ffdd41352916e956ccad9068c95125f3a1e9022073309aa384c56486b6a4c699fca446e6f67a1133892971be83b4e2dab49afc2a", + "result" : "valid" + }, + { + "tcId" : 323, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32303933303137373437", + "sig" : "3046022100eb0b719879b2fd1676b3f6f913e353c2b4dd8201facb067e15da1dae9addcc8c022100a73b3a703857aa8d12263290366a19d64e0b3efccd0623f53a7370099e9dcece", + "result" : "valid" + }, + { + "tcId" : 324, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "313233343137393136", + "sig" : "304602210095617b71dc18a99e96a95ab5384324bff797ad704dfb1e2d6b3cc06e76652ced022100b11bc49444a2e2635d4d9b1bdedeb61593b5f3e0e16ce78da813ff64b728f8d2", + "result" : "valid" + }, + { + "tcId" : 325, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31373634333530363837", + "sig" : "3045022028fbebb0c142c6d200bfb173173c03bc3aa55da6d48c1b784628f2b9f59038f2022100c0f1427005a46aac00a0af43b8f54a951e673e0480c6bf7a6b5775d4a3de5e60", + "result" : "valid" + }, + { + "tcId" : 326, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3131343137323431343431", + "sig" : "30440220457ff86369e4efd69592b161aea2b09153f37cf69006907a7558998ab34b38a4022012692ffc569849dc8e3b9fd2cd7c6f42207bb4c07832d490c9d35a702665ce58", + "result" : "valid" + }, + { + "tcId" : 327, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32323638323436343933", + "sig" : "3046022100ac70036f6058fd1eb40dc6f58dd68ab56e73dc6841eaa45a83813b6aaf75fae2022100f70f7f0563c46a07d248e80a65f38532d5759f49fc104184fa6718ca55274372", + "result" : "valid" + }, + { + "tcId" : 328, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32373234373936373737", + "sig" : "3044022059baaba3992dab0b594a2e9fbc4c344cfdabe7868e4e77f47a310d94916d30ce022020b16c383085ee74402157d4f2da5f7e3e995dbbf53ee50985d4f7096882edda", + "result" : "valid" + }, + { + "tcId" : 329, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "393733333935313139", + "sig" : "3046022100aa567a710f7010718b1e02792bc63f9049c02f798bb319214c97bc734e54d115022100ddb7c78b45c4221db6f26e845f8c30be61c29bcf38e38abaf7cbd03e5af914f7", + "result" : "valid" + }, + { + "tcId" : 330, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31353037303032373036", + "sig" : "304402206ac18c06081a51ac5fb6d0a0735af510dd0ad529206e7fc0c1b6d0ea36cec4a8022064d49524cc26ef8eda21ad5f2c371203d6eef8ddfa5da7a6c37d86f29efc1fca", + "result" : "valid" + }, + { + "tcId" : 331, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33373433353638373832", + "sig" : "3046022100cf59dfd67512e2d173a398cb648805fb41e3099f27a7867aa2dda50dcf2e1f86022100bd528be771fa1e52cab6d7485c5887befb378ceaf565aca0f32d2831a466959e", + "result" : "valid" + }, + { + "tcId" : 332, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "393437363731323438", + "sig" : "30440220455f1c4406b598fc828ddb3bc77df7ad04baad399fb4975f542b19aeedfd5a1102204e0555d9bf4211d3ab173e2e6c7edb990867f8f982f6afc1b4b6732ee96a0af0", + "result" : "valid" + }, + { + "tcId" : 333, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "373235343434333234", + "sig" : "3045022100e1dc7a439633b9bc91d37a954943bc94e5f56a0442a3528fba5c6070cf25e86f02200376b7ff7601978a47bbf7d11c6844520a442ceb167aec3a0ddf36e150a385c9", + "result" : "valid" + }, + { + "tcId" : 334, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35353334303231323139", + "sig" : "3046022100aeeeef010cf97f324e6f89f3163656305728a573b885c52ec5973eba863a08da022100904c25f931e78e2b59fa9a138cb80a5c22341601a18501d364af361d69cd0bb8", + "result" : "valid" + }, + { + "tcId" : 335, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3132333031383133373933", + "sig" : "304502200e3798e441e787dae4bf84e2748abce913f362d41d59a39d58d89c889e52229f022100e3a002023296fe6d9395fc92ba31dd35c5ada42e06db01466a24f087ae70cdb4", + "result" : "valid" + }, + { + "tcId" : 336, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "39313135333137363130", + "sig" : "30460221009bfe9e09c40fad40bb442eb045216c20dc1282d3cc4ba77fe2e3db92d312fd800221008a152afa2164548b6edfd6610046ee001fdfb06555677c98bc505b6aef297d15", + "result" : "valid" + }, + { + "tcId" : 337, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32383934333937393632", + "sig" : "304502201531f9b622d3172f72096b8afc7278eb7bee49b72e1b948e48cc1add8f01e365022100edc803cdb54bd4c54b87bc69a42df3dd11ab56bb13d8b5b78642ffa9ef88d31d", + "result" : "valid" + }, + { + "tcId" : 338, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31323333353833303333", + "sig" : "304402207973333617680ff89798c6b64bb42f436be7771887c2d14a98dd3397e6896e0a022011b70b23a62fd9ce1b27c1b669c851187c09e9081f0aa6ae011411425f694929", + "result" : "valid" + }, + { + "tcId" : 339, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "323131323639323536", + "sig" : "304502204fc40e0b3dd49c4f259c5ee2ff271b703b9b7380455167e11360bf336f72c0c4022100d219cdbfefa9ced843f947191ff11bfe4880702a4504f34b28481b424f433a38", + "result" : "valid" + }, + { + "tcId" : 340, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33303035343833383634", + "sig" : "3046022100816c369e7b8672cce325dae1ad2f2a5330d177fe0da399c8e520f361ac770389022100858c9cdf1a2ca40ef9c1e02f883b34701dc1760a9d13ba714c57dd886282acd8", + "result" : "valid" + }, + { + "tcId" : 341, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "38333536373632373235", + "sig" : "3044022051adf43cda1a938e1deb5fe08ab28df1e607f25fb2e98913d2579420b63056e602203b8920181a8ab6f9ea0a1814171db3eb4ff3d5fd9cbd2d9c1ec4018a7625562e", + "result" : "valid" + }, + { + "tcId" : 342, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "38333239353030373630", + "sig" : "3045022042ce9e0f877b7586e7c0eb2fde6f7c4b1f4cc888f54402f2b7bb99dedc2b7f07022100f0413e7636cb6605e0d7284c7804d7c9a3cc0924d37fca7d4943d9e0c9817427", + "result" : "valid" + }, + { + "tcId" : 343, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31393237303834313635", + "sig" : "304402204b2e5a797d240cd8c80b424a41dc47eaad249fc642e3c5b4bc68328fc1e26fc50220117910985597a6f7482bec7632e94676c432684f16f7f3d09a90ff4ed6ad36db", + "result" : "valid" + }, + { + "tcId" : 344, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37333032333538323838", + "sig" : "3044022042bf9a164723ef3f5cb59b528966ae648e80291785a4e0067283a7af59795bb70220017e1d24962a34d850d94187d269836ad437396a0ff134067b1baedef69b5951", + "result" : "valid" + }, + { + "tcId" : 345, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3133343733373337333833", + "sig" : "304502201ec06a62d69fca8d99473b8d5a8af3bbd701891df976e33e2f86c6084fb705f2022100b679eff436faa53c0a3c437717f574b59135d5dc49fb8524a365296db2d119e6", + "result" : "valid" + }, + { + "tcId" : 346, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32353031353533363839", + "sig" : "30440220183c81ab34a7d7c6742ede4198f5c75ed7fb79e8315899ef0dd26f95e3c4ba26022073f0196e459eb980b6e7ac44d868ab632d6421d1788b9f9651fb827b1a8e5dcc", + "result" : "valid" + }, + { + "tcId" : 347, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33353335303430303239", + "sig" : "3045022100f5bec00e6b90ab2a8f188f8163dcdd9b8185a6bbbc623c12d583c9cf55c8e3ba02205dba085bd57b5471f8547cff0aca9e51234d85c0847d01a3aa0b3cf3cace82d9", + "result" : "valid" + }, + { + "tcId" : 348, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31343230333537323930", + "sig" : "304402207c18891499af92cfa1db5538c7afbd44605b17dd0ede573206db85af23d3fe9d022028ceff96833996ebababef332b05372209844ddcc4c2134fd9311397e733b10a", + "result" : "valid" + }, + { + "tcId" : 349, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "393035313735303638", + "sig" : "304502204ed587536ba15e6707014f5ae773a423475e5e37564ffe91aec17722894cff340221009ff59fabe5e8dcf9539ea1bf9f4b880f112a26c915c14827dad9de6b251dd65e", + "result" : "valid" + }, + { + "tcId" : 350, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31363133373734323935", + "sig" : "304402204fb615772d56b6d1ba60f371eb04c557e0c9414c4eec00819c7647d91e7dee0102202623c6c4a3bffc596cb5f2f70a5a381942d350df04c35978f6607ddf7d57e4e3", + "result" : "valid" + }, + { + "tcId" : 351, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "383733363733343931", + "sig" : "3046022100c53d6697f536b8fb0e79f3b002dc626a02948e206d96de7c62bd7f9736408ace022100c9423b8575e4afe16cfebefb03e55d628270264fad0eb67c9acf0268e514584c", + "result" : "valid" + }, + { + "tcId" : 352, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34333535313036343035", + "sig" : "3044022008012cfd3713068d8ba6f3fa453be9da95afa6572a893882075ed5d64d62a41702203c5d1bf341823a4cca251cd67d43a6bcd6b5e47303082b7e54c80df5acbbac82", + "result" : "valid" + }, + { + "tcId" : 353, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34353339353735383736", + "sig" : "30450221008ad3da767111f41558fdc51723c649a87f58d42bea3431c8fdfa1f1096e3f2dd02207d1ea6859a0c932f2298f9d21c89ebea7354bbe508d2b73469dc3efe8613bc87", + "result" : "valid" + }, + { + "tcId" : 354, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "383933363633323031", + "sig" : "3045022062becf5afb08835f6768882c58a26c501f277ecd61a48d1fe683b6a78c49ce8202210089d11230de6953a1eeeb6b30774fc6bfd093c1e7c0422a7253428ba17ef969ce", + "result" : "valid" + }, + { + "tcId" : 355, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33383036303638303338", + "sig" : "3045022022b54382e2f2e6d7cffe3b34fbd567c8b503bfa6b5c3e5b8131e0ffe20747176022100a6d25ae5cab39cc83116d073cd1eb59d80ce2ed208c1c970b134be2ad29d6068", + "result" : "valid" + }, + { + "tcId" : 356, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32323332383137343937", + "sig" : "3045022100e2d9f5c37ddb25978ed4727b63a5e17546292526877e903f11d3d29874e952c802205c28ebafa2c2d285ed7f143d49b6d47daf12ad21c36f78ed7f18cb53d9c29f76", + "result" : "valid" + }, + { + "tcId" : 357, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34303734333232353538", + "sig" : "304402203b4c2fb773223c1dafa6d6de9ed2304dc25eea1fd487442a3a64ae8dc8f14927022056c21579e85fc9075c7601bd36ef8a3fa57d5bc7550c9a17bb8383e7fdbb366f", + "result" : "valid" + }, + { + "tcId" : 358, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "363130363735383237", + "sig" : "3044022005276f6159e2853fc6884c2939997b5a3be7ae615dad7517d6006208111dd6780220059ea3474bc6908c565dfb5bc72fd1a84231363cf78c4c317a061dbf1b03cc07", + "result" : "valid" + }, + { + "tcId" : 359, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3137343138373339323133", + "sig" : "304502205f856a30a8803a2276e8e5b8475f085d14f6de0c5f64eaf9e9b81c75fa831672022100a210a74c1c682de5708b9d19e6fd2f74ea047b1352edac7e4784cc008e8b0b5a", + "result" : "valid" + }, + { + "tcId" : 360, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35313237383432323837", + "sig" : "304402201c058daeb17f995cbaa4b02fc1ccf0a121fb7673d7b9b7bbaa2c9d850f9ba74102203e5400acc992698dbe9c41e25547c6ee08c841d6604de457558ee8af11d54446", + "result" : "valid" + }, + { + "tcId" : 361, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35303338363930383739", + "sig" : "304402207a6c6eb198bced25223fed630dbd2956c3799a21389e007efc23a0b3968f8aa502204535354e8fb477d0be4a16f44719d94650ed4607eabe206848ba24322406c1d5", + "result" : "valid" + }, + { + "tcId" : 362, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33383737303432333937", + "sig" : "30460221009d05a43f8dea2c4a3c0838e5987d899e63317a17fa5f609a4baa3764dac9899a022100d7c1833485f0a6914e5633115330a59b2ade5153b01b2a1af0a815f44d7f0aaa", + "result" : "valid" + }, + { + "tcId" : 363, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "333231373038313738", + "sig" : "3046022100b262a757ffcb496d880739d1937f139d39cde8e7ed29512a3be51ad470dcf5d9022100eb8dd006680530f27326f1c9c54e5c4300f1bca21bdb17245c485d7b296a2372", + "result" : "valid" + }, + { + "tcId" : 364, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37363637303434323730", + "sig" : "30440220480a6875b7bee4ed80f70206400df10264c38be42b07443c6ff19c0aab580444022078e3fa1c2fe11208c189a39e717b19a51f5172054891c083931861c7919d4745", + "result" : "valid" + }, + { + "tcId" : 365, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31313034373435303432", + "sig" : "3045022100f2be8cc615b14c289e50114ae2473b105447ec8c5311ecc3abcedcbeaeea1983022056ae20cd659370712e06bd6d5936bcaa06169737a062438c7e599bfff0099fb1", + "result" : "valid" + }, + { + "tcId" : 366, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "313533383730313534", + "sig" : "3045022100bed38f88fd52bf1cc4b4cc58bdd8a81af894c5a45bd822acf468eee08a68358402201c9f77ab2c821daa896e73b9f6ed4edf72ce62a6c48b5caae6a5ac9edd8d2953", + "result" : "valid" + }, + { + "tcId" : 367, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32323631333835303439", + "sig" : "30460221008513ed012ea7a10d2239c209e172edb565b1bfd2cdfd80269f79956a4aab5af2022100a413070c1e974643e5d5fdc56209e1421a254f47fda3312ceda244064efe69ce", + "result" : "valid" + }, + { + "tcId" : 368, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37353538373437363632", + "sig" : "3045022025bc1c38b291a5f60b7b01eec8a5025c69723b183f9090150a7f0ac87464f2f5022100c986a03025cbf9bdfa4e9a0988822dae44c48624bc63a203072c9cb1b813102d", + "result" : "valid" + }, + { + "tcId" : 369, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33343939333634313832", + "sig" : "3046022100b721214cff1779b8f407f4b1b2b2c5aa4e49a4a517031ff3d24b5af589b28b96022100e9c53670e94337535dda10a599de0a6da240ea813e8081f9caa6bae59cbd310a", + "result" : "valid" + }, + { + "tcId" : 370, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32333639323733393835", + "sig" : "30460221008695064bbd15d76b698e4bb8c0183bc2634a5c2455d6bd2c3f8323a4268edfe0022100c706f66507b52d2c8865e3eb5959267307f51fdb0565c2320132f2ca14123452", + "result" : "valid" + }, + { + "tcId" : 371, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "343933383339353635", + "sig" : "3045022100c91aad6b3c086073dafdb7688c6366be9127d9935cbc6e0c14b9f76c9d272c43022073c0f75156531aad36d2d14169c2b66797e8dd31d6f66b8ddb83f7522fba2176", + "result" : "valid" + }, + { + "tcId" : 372, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32353334333739393337", + "sig" : "30460221008125832edd19949328b170b1067eafcc17b3b79f5c139dfb6c109a1107ac76c8022100fce7f770e2245eeab16c33a230f6dea2ce1da67d11302a8ce7dc6145c30a2bf9", + "result" : "valid" + }, + { + "tcId" : 373, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "383334383031353938", + "sig" : "304402205e399962385aec963cb80dab6b5f5c341ce15e437142f4275ef9c210385348c1022018a8157a0976bb0e349a02134fad0d0286c40a5e43a47b49b5a03653e3ae9e19", + "result" : "valid" + }, + { + "tcId" : 374, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32343131303537343836", + "sig" : "3046022100ada147d5937331d037083c0bcda59adb6125485a9ea78ef6884c1432e93e4093022100b5ea223b88f45533826a8b24fc91ed80ae3560543102fed1d82360372988dd74", + "result" : "valid" + }, + { + "tcId" : 375, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "373836343638363335", + "sig" : "3046022100ff56b22aca9206d8dba458507804c9f80b94e75d2b61443a1c8d72480d8680b4022100a866f620640511357b7dd3bc0eddcddcc5a59e9162204c1d85f223ec485cdee2", + "result" : "valid" + }, + { + "tcId" : 376, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33303534373733373638", + "sig" : "3046022100cf3555d277eb8f6fa629e8ed875df1440352e53f32f9509ceecf222c4197c5de02210084829a1286f98c299ec5c2169a14d0cbf4892a97baca8310279d9b4c98fdef47", + "result" : "valid" + }, + { + "tcId" : 377, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31393237303137373338", + "sig" : "3045022100d8dd5094bc40652ddc19d04beeefee8d90fef82628edbc218a9d2de596bb023d02205c0a46804e7de7c741e5be55a7ebba092dc10a4d1691e6a04ac1690b54acf950", + "result" : "valid" + }, + { + "tcId" : 378, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31303531333235363334", + "sig" : "3044022025236b00a0a67e12ea781ae53a929e13c37994ddce784f3c0c33402a43b4a6f00220117331e5b39fe2a11f5c8bbfa5bb4fdc3659ac0a0efcd03a94362081a4c0e579", + "result" : "valid" + }, + { + "tcId" : 379, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34303139383636363832", + "sig" : "304402200f3564b771337bc8d494a04e4d0518f26d067d07c31689d5e27b503d3652117a022017144740db21874aa58c0de6a4cadb16c5d9230d4f4607980aabd161d21045ae", + "result" : "valid" + }, + { + "tcId" : 380, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3130343530323537333530", + "sig" : "3045022100bff706d27dc3c8c59951c342244e3c3552216b9225898de130c6a5a8f58eef4202200e20cb9bffd20d88fe70e5d1f909051528c55efbadbfd7cdcce67de853f64632", + "result" : "valid" + }, + { + "tcId" : 381, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "333236393538353830", + "sig" : "3045022100ec5c12881dae52168aa635c80dcb0031a43e7d1b76ea97231b819051a861a7ff022009149c000d1af12d800225c1ba3587a53e5aabd8a8fe78230b1b4c12ba7df008", + "result" : "valid" + }, + { + "tcId" : 382, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33303734363533323431", + "sig" : "3045022100caeda2ff27eef0c71a30c277dda128692e4850e589d07f84046342ddaef9842a022069d422215439150d1da00a0811d2126de5b5c5a85be18fd3c06eb638703e6031", + "result" : "valid" + }, + { + "tcId" : 383, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37373134363833343830", + "sig" : "304402203977465917472d3cb67d6fc8888834f26fa47c8d3a2c8e046f70680e3037a37e0220785adced4f3d400b286ad7eb7bdf0b7c0f46d9e7268db5a34e740166caafd14a", + "result" : "valid" + }, + { + "tcId" : 384, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31373933333831333230", + "sig" : "30450220051b252934f1c65f39652a893e9517f049af42259936832cc3f8ff56d7f3cc54022100867bc57a96eb9d8dc3afd6db11b527f19e4ad8c031134ae6ec9b2b6ee092549b", + "result" : "valid" + }, + { + "tcId" : 385, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34383830363235353636", + "sig" : "304402200162ba940a75c7a12574736d45d60bbb2c6ce7739b04429cc72352adea4666c302204c686aaafb4f3615247ff06b97bd76d49b93f65b5f66c93fc2a8a22246536c24", + "result" : "valid" + }, + { + "tcId" : 386, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3439343337363438383537", + "sig" : "3045022100f74e65ddb41c6c01564b3344fcaa8db2b7b73f8fd156e500865a04826c5e4ab002206ec0376675b8c3692f397341269667eadc60696d56d8450ced85a65de9d3cfe1", + "result" : "valid" + }, + { + "tcId" : 387, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34373038363839373836", + "sig" : "304502210091f3ccfb87b3667bea8c6bb07d554467fbb9a77685a6523da5cf97dfa710e6b202205559936f9c94c6e4a97c9febbcb2c1a418fbf9f2933dd64def686b3771dc3fa8", + "result" : "valid" + }, + { + "tcId" : 388, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33303239383732393531", + "sig" : "304402200afdcdcf68669ecc53b019d7adbe8dc943f453b74451335a631a2a3dd5672f83022077ea833468953e14bd428663eebce4b3cdef41e9821704fb91d1515d20078e92", + "result" : "valid" + }, + { + "tcId" : 389, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33303137313930333835", + "sig" : "3046022100a197d8f8fa0cccfa7eccfaea7ca4441bda9789cc3e8d22a1d1b14d6deeb2db2102210088fb12318d60b66b68fe80834172813989c24901e3adbcd4c73860fa9500bc75", + "result" : "valid" + }, + { + "tcId" : 390, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "393536333633393339", + "sig" : "304402204b3eeeaf50e9f9bae0bfe64e2776bf2db181ab44c763393136927827f3adb24e0220317abec131eddf2117e27ea2bb4008e8fd0f4a32aa41f74eec7b1659c091fd9c", + "result" : "valid" + }, + { + "tcId" : 391, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35333030373634333530", + "sig" : "30450220464bdc2db7c5a2745a5d8c96a323eb99c175e0f99baa75dbb9c6d29b98facf3b022100d9328ca00ce32934b4ed340a6e15236cb16e5364cc91ef5cd6f675e048985bac", + "result" : "valid" + }, + { + "tcId" : 392, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31393334363634383434", + "sig" : "30440220270250c591cb20c7978d9f457104afa7c3484879cfdcf9dc6ac8e785e1fd20a0022009601dc597c123ed7e76bdbe2d146863bddcf357f9217713dfe1afd8f49891b6", + "result" : "valid" + }, + { + "tcId" : 393, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3335353435303535393632", + "sig" : "30440220729a17311a2fbf9f2325117b2cdac18fd6bbe3db4c5a1bd4e4f4f3d8f3d68dc7022048dd0269cb216e2792f3b410a781c9b10e59abdc553aae2a00d4038f44a2849e", + "result" : "valid" + }, + { + "tcId" : 394, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31333031373232313038", + "sig" : "304502205228f97e5d0dfb62cec6820029175867d7d63b179db3e8a9e7eecd1ec55e0b90022100dc547d7b7b680b40bcbe0cbf9a2d749787864158af3c0e0f8ef08dfcbbb36f7e", + "result" : "valid" + }, + { + "tcId" : 395, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35363137363931363932", + "sig" : "3045022021f775d3c7f7fe68e84842b30de9fbe4ffbb4f3324b295591e36e4651c14830d022100afa24a4cd163042da5f767e7088e6fa03efe039a477fc13f6c23270cda91519f", + "result" : "valid" + }, + { + "tcId" : 396, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33353831393332353334", + "sig" : "3045022100dabec42e9c44f0c230d36c45956cd4a8250f3665b6f291f700e73d06fe203744022023b687c29e03bc69c5491774588e3c519fa1eafae2ff8ede2ffd4a004e233215", + "result" : "valid" + }, + { + "tcId" : 397, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3135373136363738373434", + "sig" : "30440220381458d6c40c888bf90aef1428bc968caace553f94287e7adaa48943dc55315d02201e0e1f75489a451fc7cc4bca61a0a7330a5b4dc4283df68e21798996d8c69bd4", + "result" : "valid" + }, + { + "tcId" : 398, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33313939373833333630", + "sig" : "3045022100e08881dacd7ad6441f80be1d5510b7e29da4c8504d658634f13e5f3cfcf2a16d02203792541548f0d891ddf95ee40b815fc3ac160cbfe8cd948e0786db7cc20b38d2", + "result" : "valid" + }, + { + "tcId" : 399, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "373430343735303832", + "sig" : "3046022100a3efb0abc9d76e6601cb23d28b0276293eb8d6f2103d0da7b06a0169db1ea6a4022100c619ab2ba23b20f90bc815d2fd4c345d0381476b164590cd932b40b2263e4054", + "result" : "valid" + }, + { + "tcId" : 400, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "343137343336353339", + "sig" : "3044022061746df1d5f3d30403f5281767cb6601172b26564e97c35d4c68fb7426db4ffd02207ca2b0a4fb0d58a119a8df391ad3f2de47cb3b1a8fdf04d6ec235f639fe44080", + "result" : "valid" + }, + { + "tcId" : 401, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31323335363538383839", + "sig" : "3045022100ce48fc4bedd4dabacc68f71c4f5b58414e9b054b445c4781cf6d9b40d335b4b602201e73b8299579684b80801d2fd70d5c6f9a904ab0735b26d27ff44021002c6107", + "result" : "valid" + }, + { + "tcId" : 402, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32343239323535343034", + "sig" : "30460221008c936b044cf6dbdbe30cffdeb9eb40b4aa48e697975805dd40455e44fa4d6dfb022100f03bd82bc73dc7a9d518012f9cab5360d6daa06dd0145765b512263b13c3d851", + "result" : "valid" + }, + { + "tcId" : 403, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3531383033303235343636", + "sig" : "304502204bfaa8c78636efe63915dabaaee914deaaf4a06ae473679160eaeca88d5cc1160221008bc24546613e4811facecf605d6b1f79b442c3d8fe458c1c69334cbee31ef532", + "result" : "valid" + }, + { + "tcId" : 404, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34343736333938323030", + "sig" : "30440220130fc664eccece7b71a0a9cadc5369fb5bd54ccc53fd2c515e5ef232acd1b96502204372a69ef34ec2b296dbe94c5e8a8881645b9c0f6b6c4270c19b81493eb59421", + "result" : "valid" + }, + { + "tcId" : 405, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "39303630303335323132", + "sig" : "304402207b675a89f3165e2ad1f3ac4950898d17e7cd869df4ef58aa54901d51193f91f302203a7ea099d7c2909ff4a5c3c286d9f7739f38b7e44605ea3f515fde117a4519ec", + "result" : "valid" + }, + { + "tcId" : 406, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31373536303533303938", + "sig" : "30440220393a056a5ce76dc161daf1a6a77afb72cacb809d4173b9126e636a01cf7ccea102200859e4195124e11e40db391a7bf04f3ecd7dffe2a5629aac9374468fe8f1701b", + "result" : "valid" + }, + { + "tcId" : 407, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34393830383630303338", + "sig" : "304402202d9738a6e36c24a5dcde61ff7fa5ecb1e96e0077a4a183e8953745cb9461e5fa022055abb27fad179d132830f7e5dff0d26a63f0141fe2288b9ff7943c3a482ac124", + "result" : "valid" + }, + { + "tcId" : 408, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33363231383735333335", + "sig" : "30440220460f528bb6f8adb55626c5166c4572a93c3825dd1a695822a81c9e75e37fe8fd02200197c8b83193110f0426a417fae7ec3b99fc669371f1e7debbbd3850f6956c14", + "result" : "valid" + }, + { + "tcId" : 409, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36363433333334373231", + "sig" : "304402202d13939455192c22b1f18f7ca82ad4265ec2c4dbd124ae4a2b0017984512c9e902203d9e4fac784be61e2decb75a1f6768af21873eb49881849b936036b19187a734", + "result" : "valid" + }, + { + "tcId" : 410, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34343534393432373832", + "sig" : "30450221008f2523bbd4a2f4d144c0b7f7b5da84ce20d0d4f551cf5e0ad2b0cb06c6a207f0022005e46a85f61e1676def59d819220edcdf421db36efbe00bda7f9e331d56e8ce1", + "result" : "valid" + }, + { + "tcId" : 411, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3230313834343032", + "sig" : "304502204f60878beb2755b35f7152a33e416e16e10f77bca2ad70b09c86eff148ca6fb3022100bcbc6fa18d8ca570b4a9a5f2a8f6ff9db3e3370ffd3e5a7e19880990f6f8e614", + "result" : "valid" + }, + { + "tcId" : 412, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3538313332313733", + "sig" : "30450221009b148c63588ee8f22436a61d52ae8a60c3f35007dde8bb6e31997d99205973b302202015548563168f496c7b115bff541fd71fc926448a4554a15f97c58fdd039015", + "result" : "valid" + }, + { + "tcId" : 413, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31313833383631383131", + "sig" : "304402202b7d769ea682af0be42866cf3ad8865b12d4b37c3708fb2ad0dc5c87eda10154022011d8c48ba6c400f7950f9dfd9ea65617b3765db0e79778bb079fbd7db67b68f8", + "result" : "valid" + }, + { + "tcId" : 414, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31393232363032393036", + "sig" : "3045022100bfd3ac436e5c4d42f15fbce06d9859ad82d460d322a8c4c1d06ec318fdff4f510220335bd5d0619a5290c7fce42aaa97ccd52d80528a09a62a4ce8d1e7cf00db7a26", + "result" : "valid" + }, + { + "tcId" : 415, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "393735313433323037", + "sig" : "3044022056a5c2c2e803e66c5751fe8fb348822609b167478cad4030e7bf6120fd535bb002207b3fee66768794c0b362f2d40ad64fdf03e0fb0e8a47f2034167aae2ca383c0e", + "result" : "valid" + }, + { + "tcId" : 416, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "38333135313136333833", + "sig" : "3044022071bc399e5643a1d8e2afc317e78a2c43d76b6d87f17a5809a7b6d19f922c2e620220057e7615a2c9033ef0d1a3d3020977002395e196d3b8206c9afecfb98abd52d8", + "result" : "valid" + }, + { + "tcId" : 417, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "333236333136383132", + "sig" : "30450221008f94bcda036e64783935456289aedcb67232932db1ac2e8ad1ca970b14d47a1a022021a71528f9e8fe6067ca74cc0d8b4b48270aad9ade9db44a98c98182a5e8f208", + "result" : "valid" + }, + { + "tcId" : 418, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34303239363837313336", + "sig" : "30450220277a0c4f34b2749fd58f55a0f373430f3c868bb1f485d477102b3e797cea5560022100bccbec7dc1e2740751b7cb8968e7d388e136d7647a29c6845bcf3759f44bf389", + "result" : "valid" + }, + { + "tcId" : 419, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36333230383831313931", + "sig" : "3045022100934762967efc8c97655cb73d7168d1abb5889e55243dc67c1c5517d6298ce2c3022044c32fb9d2b5e6f9c38226538776538a55eb1bdfbac44e3e1229337415645db6", + "result" : "valid" + }, + { + "tcId" : 420, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35323235333930373830", + "sig" : "30450221008f052802126f222ba3ade9cfedf59fc479a120ed8e59366b1be4f3039480004e02203e14e9209be9dc6d00ed76cddca1c2e5b85f112bffd2779f45f246cb60c319a8", + "result" : "valid" + }, + { + "tcId" : 421, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31333439333933363934", + "sig" : "304402204456d6792ff7e4d27517113f309177c26ef3bf6482e131d43f9d8b80e954d61e02204ffbcc50a7a69dfce92a47410f8574f7b0abfc8b4c7f74ac0dc1c1183d393482", + "result" : "valid" + }, + { + "tcId" : 422, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3130333937393630373631", + "sig" : "3045022100c0e27a8ad306f4ed4dd77edcefb61a6d8f1a9f6546a9969e794432fcb576cd49022067fdcab3395eebe53dd03b9cadd3eb62d84327de15498b60a60b023fea990436", + "result" : "valid" + }, + { + "tcId" : 423, + "comment" : "Signature generated without truncating the hash", + "flags" : [ + "Untruncatedhash" + ], + "msg" : "313233343030", + "sig" : "30450220504d070e4cf2596e560c1aadc63c573cee0bf8c4d128292c23b47a294c607703022100f181213b28b921af292ea2fbcb8af4a0e14e2c5aa603c45dab7a46f05bbd5d85", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "040fbf9d131ff8a037747ac23246c5b0e0ce09a905432d3d75477af2d2993b1e0a4b14e93d4574fc2a553f85eb3c4c0658a1bd7e1cc7f08d47396e76d6d40ed772", + "wx" : "0fbf9d131ff8a037747ac23246c5b0e0ce09a905432d3d75477af2d2993b1e0a", + "wy" : "4b14e93d4574fc2a553f85eb3c4c0658a1bd7e1cc7f08d47396e76d6d40ed772" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040fbf9d131ff8a037747ac23246c5b0e0ce09a905432d3d75477af2d2993b1e0a4b14e93d4574fc2a553f85eb3c4c0658a1bd7e1cc7f08d47396e76d6d40ed772", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAED7+dEx/4oDd0esIyRsWw4M4JqQVD\nLT11R3ry0pk7HgpLFOk9RXT8KlU/hes8TAZYob1+HMfwjUc5bnbW1A7Xcg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 424, + "comment" : "k*G has a large x-coordinate", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "303502104319055358e8617b0c46353d039cdaab022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e", + "result" : "valid" + }, + { + "tcId" : 425, + "comment" : "r too large", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000000fffffffffffffffffffffffc022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04920945522a364975ffc27bdddd7f01ec26ef8ac48d466a81fbb1d02fc89133e9ce7d01190e815daf1d18e5932ec8a3d83af59c7f66738b6521a9850d794a4ba3", + "wx" : "00920945522a364975ffc27bdddd7f01ec26ef8ac48d466a81fbb1d02fc89133e9", + "wy" : "00ce7d01190e815daf1d18e5932ec8a3d83af59c7f66738b6521a9850d794a4ba3" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004920945522a364975ffc27bdddd7f01ec26ef8ac48d466a81fbb1d02fc89133e9ce7d01190e815daf1d18e5932ec8a3d83af59c7f66738b6521a9850d794a4ba3", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEkglFUio2SXX/wnvd3X8B7CbvisSN\nRmqB+7HQL8iRM+nOfQEZDoFdrx0Y5ZMuyKPYOvWcf2Zzi2UhqYUNeUpLow==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 426, + "comment" : "r,s are large", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04e0ce6d55dae257d10a06be4fb7333e68475407a401de84ff86a931ac022a4513802ca56c9a1d2f67e8a45703b174f0562dfb7e6a532eb1743b3ceb49f9bea420", + "wx" : "00e0ce6d55dae257d10a06be4fb7333e68475407a401de84ff86a931ac022a4513", + "wy" : "00802ca56c9a1d2f67e8a45703b174f0562dfb7e6a532eb1743b3ceb49f9bea420" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004e0ce6d55dae257d10a06be4fb7333e68475407a401de84ff86a931ac022a4513802ca56c9a1d2f67e8a45703b174f0562dfb7e6a532eb1743b3ceb49f9bea420", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE4M5tVdriV9EKBr5PtzM+aEdUB6QB\n3oT/hqkxrAIqRROALKVsmh0vZ+ikVwOxdPBWLft+alMusXQ7POtJ+b6kIA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 427, + "comment" : "r and s^-1 have a large Hamming weight", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100909135bdb6799286170f5ead2de4f6511453fe50914f3df2de54a36383df8dd4", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "040c5baefb69764c3a55e9d3ef10a76f652ffa697794ab91169878116d058420e3ccd7b9153694151ee2d05048e40fe072d8e0f481af5d3d0a9e8cf39e1ef7e0bb", + "wx" : "0c5baefb69764c3a55e9d3ef10a76f652ffa697794ab91169878116d058420e3", + "wy" : "00ccd7b9153694151ee2d05048e40fe072d8e0f481af5d3d0a9e8cf39e1ef7e0bb" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040c5baefb69764c3a55e9d3ef10a76f652ffa697794ab91169878116d058420e3ccd7b9153694151ee2d05048e40fe072d8e0f481af5d3d0a9e8cf39e1ef7e0bb", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEDFuu+2l2TDpV6dPvEKdvZS/6aXeU\nq5EWmHgRbQWEIOPM17kVNpQVHuLQUEjkD+By2OD0ga9dPQqejPOeHvfguw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 428, + "comment" : "r and s^-1 have a large Hamming weight", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022027b4577ca009376f71303fd5dd227dcef5deb773ad5f5a84360644669ca249a5", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "041a4cb39a674bf0bec4be1a5b035ae18634f4b681a330c1f91b42366a0a7c75320b3f8018da54a8d0db30f7c2b3f04dc011a4a1c383221e52187632a565e5795c", + "wx" : "1a4cb39a674bf0bec4be1a5b035ae18634f4b681a330c1f91b42366a0a7c7532", + "wy" : "0b3f8018da54a8d0db30f7c2b3f04dc011a4a1c383221e52187632a565e5795c" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200041a4cb39a674bf0bec4be1a5b035ae18634f4b681a330c1f91b42366a0a7c75320b3f8018da54a8d0db30f7c2b3f04dc011a4a1c383221e52187632a565e5795c", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEGkyzmmdL8L7EvhpbA1rhhjT0toGj\nMMH5G0I2agp8dTILP4AY2lSo0Nsw98Kz8E3AEaShw4MiHlIYdjKlZeV5XA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 429, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020105020101", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "041cd72095fd856cf29fafb81c25f7ff24dee34eeaeacc0025d512091b1f1e822b427eb3bbb915209e064bfbe1a1798ff6dac8d0add6d753bff4f128fee7e00f89", + "wx" : "1cd72095fd856cf29fafb81c25f7ff24dee34eeaeacc0025d512091b1f1e822b", + "wy" : "427eb3bbb915209e064bfbe1a1798ff6dac8d0add6d753bff4f128fee7e00f89" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200041cd72095fd856cf29fafb81c25f7ff24dee34eeaeacc0025d512091b1f1e822b427eb3bbb915209e064bfbe1a1798ff6dac8d0add6d753bff4f128fee7e00f89", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHNcglf2FbPKfr7gcJff/JN7jTurq\nzAAl1RIJGx8egitCfrO7uRUgngZL++GheY/22sjQrdbXU7/08Sj+5+APiQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 430, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020105020103", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04697cd5856c8c347fdfbca4c2cb2fc1be12f1611f190333b80a5cf4e0f7d48dab5d08740936bbc46c90b1da916d5ef39c3d9fb9092f579a43d911472022a7fa90", + "wx" : "697cd5856c8c347fdfbca4c2cb2fc1be12f1611f190333b80a5cf4e0f7d48dab", + "wy" : "5d08740936bbc46c90b1da916d5ef39c3d9fb9092f579a43d911472022a7fa90" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004697cd5856c8c347fdfbca4c2cb2fc1be12f1611f190333b80a5cf4e0f7d48dab5d08740936bbc46c90b1da916d5ef39c3d9fb9092f579a43d911472022a7fa90", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaXzVhWyMNH/fvKTCyy/BvhLxYR8Z\nAzO4Clz04PfUjatdCHQJNrvEbJCx2pFtXvOcPZ+5CS9XmkPZEUcgIqf6kA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 431, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020105020105", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0469d31ff52dbc0935508755cd48cf3f30f0ea78fb670048983be0ebacf4de1076773c9dce9aa24b783d8688d63547dc987d4650f20c1179e6ae5d4f14f6d55cc1", + "wx" : "69d31ff52dbc0935508755cd48cf3f30f0ea78fb670048983be0ebacf4de1076", + "wy" : "773c9dce9aa24b783d8688d63547dc987d4650f20c1179e6ae5d4f14f6d55cc1" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000469d31ff52dbc0935508755cd48cf3f30f0ea78fb670048983be0ebacf4de1076773c9dce9aa24b783d8688d63547dc987d4650f20c1179e6ae5d4f14f6d55cc1", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEadMf9S28CTVQh1XNSM8/MPDqePtn\nAEiYO+DrrPTeEHZ3PJ3OmqJLeD2GiNY1R9yYfUZQ8gwReeauXU8U9tVcwQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 432, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020105020106", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "048742a58dac696325bb9285ca9fefbd9811456e55b5a7c37b87cb6009251a475f02dc5fd4cd5b5fab165e69663c2a0e76745303131eab5962594de66d5f75a25e", + "wx" : "008742a58dac696325bb9285ca9fefbd9811456e55b5a7c37b87cb6009251a475f", + "wy" : "02dc5fd4cd5b5fab165e69663c2a0e76745303131eab5962594de66d5f75a25e" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048742a58dac696325bb9285ca9fefbd9811456e55b5a7c37b87cb6009251a475f02dc5fd4cd5b5fab165e69663c2a0e76745303131eab5962594de66d5f75a25e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEh0KljaxpYyW7koXKn++9mBFFblW1\np8N7h8tgCSUaR18C3F/UzVtfqxZeaWY8Kg52dFMDEx6rWWJZTeZtX3WiXg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 433, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020106020101", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "040ae130e90dba4a6a03a5b1bae96bd53e43170751a19311d251d06c084723c79c0f76151d6ded09a6ad33cbe1ea098adf92db0d7a793020a7f962b0b0bd9e013e", + "wx" : "0ae130e90dba4a6a03a5b1bae96bd53e43170751a19311d251d06c084723c79c", + "wy" : "0f76151d6ded09a6ad33cbe1ea098adf92db0d7a793020a7f962b0b0bd9e013e" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040ae130e90dba4a6a03a5b1bae96bd53e43170751a19311d251d06c084723c79c0f76151d6ded09a6ad33cbe1ea098adf92db0d7a793020a7f962b0b0bd9e013e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECuEw6Q26SmoDpbG66WvVPkMXB1Gh\nkxHSUdBsCEcjx5wPdhUdbe0Jpq0zy+HqCYrfktsNenkwIKf5YrCwvZ4BPg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 434, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020106020103", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0407c0272add144c4b89fe4e96e3bfd2ab765121c8485221bce3b5e4090419a0c7c7899aba984d2fdf78f053c212476e7ec0b38a5ad389ec51d459bc96eebed1ba", + "wx" : "07c0272add144c4b89fe4e96e3bfd2ab765121c8485221bce3b5e4090419a0c7", + "wy" : "00c7899aba984d2fdf78f053c212476e7ec0b38a5ad389ec51d459bc96eebed1ba" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000407c0272add144c4b89fe4e96e3bfd2ab765121c8485221bce3b5e4090419a0c7c7899aba984d2fdf78f053c212476e7ec0b38a5ad389ec51d459bc96eebed1ba", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEB8AnKt0UTEuJ/k6W47/Sq3ZRIchI\nUiG847XkCQQZoMfHiZq6mE0v33jwU8ISR25+wLOKWtOJ7FHUWbyW7r7Rug==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 435, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020106020106", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04c26d838237a552c8b9d00f95cfd30849330fa4e50857b148f01317913423ad9fcd9308496fc1a86bc21b3cd90a6472a8164690ab7728b0545d8a9aecf07df5fa", + "wx" : "00c26d838237a552c8b9d00f95cfd30849330fa4e50857b148f01317913423ad9f", + "wy" : "00cd9308496fc1a86bc21b3cd90a6472a8164690ab7728b0545d8a9aecf07df5fa" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004c26d838237a552c8b9d00f95cfd30849330fa4e50857b148f01317913423ad9fcd9308496fc1a86bc21b3cd90a6472a8164690ab7728b0545d8a9aecf07df5fa", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwm2DgjelUsi50A+Vz9MISTMPpOUI\nV7FI8BMXkTQjrZ/NkwhJb8Goa8IbPNkKZHKoFkaQq3cosFRdiprs8H31+g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 436, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020106020107", + "result" : "valid" + }, + { + "tcId" : 437, + "comment" : "r is larger than n", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632557020107", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0441d762efd59a622d2b8a6eb6260d4d5a02ec69bf91fce3b0d3a4b00014ab26c90646963fd7309a420cfc400580c3e16fc4e39f51f937843158c2a6c4f24ef27c", + "wx" : "41d762efd59a622d2b8a6eb6260d4d5a02ec69bf91fce3b0d3a4b00014ab26c9", + "wy" : "0646963fd7309a420cfc400580c3e16fc4e39f51f937843158c2a6c4f24ef27c" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000441d762efd59a622d2b8a6eb6260d4d5a02ec69bf91fce3b0d3a4b00014ab26c90646963fd7309a420cfc400580c3e16fc4e39f51f937843158c2a6c4f24ef27c", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEQddi79WaYi0rim62Jg1NWgLsab+R\n/OOw06SwABSrJskGRpY/1zCaQgz8QAWAw+FvxOOfUfk3hDFYwqbE8k7yfA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 438, + "comment" : "s is larger than n", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3026020106022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc75fbd8", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042f5c464f48423a87806e88e2e6b4e6f947eea1a5f2c0717897406d97dd3c286561b62e969abf04b840be9587a2a16c0a83ff3bf6812b7257c106a26be2e71d25", + "wx" : "2f5c464f48423a87806e88e2e6b4e6f947eea1a5f2c0717897406d97dd3c2865", + "wy" : "61b62e969abf04b840be9587a2a16c0a83ff3bf6812b7257c106a26be2e71d25" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042f5c464f48423a87806e88e2e6b4e6f947eea1a5f2c0717897406d97dd3c286561b62e969abf04b840be9587a2a16c0a83ff3bf6812b7257c106a26be2e71d25", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEL1xGT0hCOoeAboji5rTm+UfuoaXy\nwHF4l0Btl908KGVhti6Wmr8EuEC+lYeioWwKg/879oErclfBBqJr4ucdJQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 439, + "comment" : "small r and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3027020201000221008f1e3c7862c58b16bb76eddbb76eddbb516af4f63f2d74d76e0d28c9bb75ea88", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0427527d9ba351f69285cbd9ba144b9e7c6c957d418c8bf63925fb934ab587d385216a626307e247c3d5bcf489b52ad4c1987973d7d4cc90fb5b1f488d80134656", + "wx" : "27527d9ba351f69285cbd9ba144b9e7c6c957d418c8bf63925fb934ab587d385", + "wy" : "216a626307e247c3d5bcf489b52ad4c1987973d7d4cc90fb5b1f488d80134656" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000427527d9ba351f69285cbd9ba144b9e7c6c957d418c8bf63925fb934ab587d385216a626307e247c3d5bcf489b52ad4c1987973d7d4cc90fb5b1f488d80134656", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEJ1J9m6NR9pKFy9m6FEuefGyVfUGM\ni/Y5JfuTSrWH04UhamJjB+JHw9W89Im1KtTBmHlz19TMkPtbH0iNgBNGVg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 440, + "comment" : "smallish r and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "302c02072d9b4d347952d6022100ef3043e7329581dbb3974497710ab11505ee1c87ff907beebadd195a0ffe6d7a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "041bfc106d79112f08439a4ffa4e06261bbab3031ff7ed32568172caaeabae2f90b894ecc8922ace776ed6d1526b7771f2cc43b0e84bac400541619e142319059f", + "wx" : "1bfc106d79112f08439a4ffa4e06261bbab3031ff7ed32568172caaeabae2f90", + "wy" : "00b894ecc8922ace776ed6d1526b7771f2cc43b0e84bac400541619e142319059f" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200041bfc106d79112f08439a4ffa4e06261bbab3031ff7ed32568172caaeabae2f90b894ecc8922ace776ed6d1526b7771f2cc43b0e84bac400541619e142319059f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEG/wQbXkRLwhDmk/6TgYmG7qzAx/3\n7TJWgXLKrquuL5C4lOzIkirOd27W0VJrd3HyzEOw6EusQAVBYZ4UIxkFnw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 441, + "comment" : "100-bit r and small s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3032020d1033e67e37b32b445580bf4eff0221008b748b74000000008b748b748b748b7466e769ad4a16d3dcd87129b8e91d1b4d", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0471e13191229197eefe9224be11217878635056fd8e558b74121036043cb7501709a09bc004ffc98a4051a3fb9798cb9fd5c17919ecab9ff8459a7d561f3058b2", + "wx" : "71e13191229197eefe9224be11217878635056fd8e558b74121036043cb75017", + "wy" : "09a09bc004ffc98a4051a3fb9798cb9fd5c17919ecab9ff8459a7d561f3058b2" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000471e13191229197eefe9224be11217878635056fd8e558b74121036043cb7501709a09bc004ffc98a4051a3fb9798cb9fd5c17919ecab9ff8459a7d561f3058b2", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEceExkSKRl+7+kiS+ESF4eGNQVv2O\nVYt0EhA2BDy3UBcJoJvABP/JikBRo/uXmMuf1cF5Geyrn/hFmn1WHzBYsg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 442, + "comment" : "small r and 100 bit s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "302702020100022100ef9f6ba4d97c09d03178fa20b4aaad83be3cf9cb824a879fec3270fc4b81ef5b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0415b8867217bf4d531a5618509d9cddc6a3ff4fcc55cc94df82d9952b42ae564d7234d5c43238e591501c1fada39a60057fefb46b588d47cbedb529def080fb83", + "wx" : "15b8867217bf4d531a5618509d9cddc6a3ff4fcc55cc94df82d9952b42ae564d", + "wy" : "7234d5c43238e591501c1fada39a60057fefb46b588d47cbedb529def080fb83" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000415b8867217bf4d531a5618509d9cddc6a3ff4fcc55cc94df82d9952b42ae564d7234d5c43238e591501c1fada39a60057fefb46b588d47cbedb529def080fb83", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFbiGche/TVMaVhhQnZzdxqP/T8xV\nzJTfgtmVK0KuVk1yNNXEMjjlkVAcH62jmmAFf++0a1iNR8vttSne8ID7gw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 443, + "comment" : "100-bit r and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3032020d062522bbd3ecbe7c39e93e7c25022100ef9f6ba4d97c09d03178fa20b4aaad83be3cf9cb824a879fec3270fc4b81ef5b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04e7c1fcc775b8d46770261c413291bc9d913c7785779870eb475f7437da3ee1a016ad8986f7ef63d4237a9c802e5e49471d248e4df64283e77608ee191ec61f3f", + "wx" : "00e7c1fcc775b8d46770261c413291bc9d913c7785779870eb475f7437da3ee1a0", + "wy" : "16ad8986f7ef63d4237a9c802e5e49471d248e4df64283e77608ee191ec61f3f" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004e7c1fcc775b8d46770261c413291bc9d913c7785779870eb475f7437da3ee1a016ad8986f7ef63d4237a9c802e5e49471d248e4df64283e77608ee191ec61f3f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE58H8x3W41GdwJhxBMpG8nZE8d4V3\nmHDrR190N9o+4aAWrYmG9+9j1CN6nIAuXklHHSSOTfZCg+d2CO4ZHsYfPw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 444, + "comment" : "r and s^-1 are close to n", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d50220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04e4de4956e823bcd5e6869e25ce155de0ac260bbd1eef4d005f88c9c4d025d2a16eaa99ce6e5f4c68b785594b979f04933c31a97e1362862dc5b86cbf485f4b1d", + "wx" : "00e4de4956e823bcd5e6869e25ce155de0ac260bbd1eef4d005f88c9c4d025d2a1", + "wy" : "6eaa99ce6e5f4c68b785594b979f04933c31a97e1362862dc5b86cbf485f4b1d" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004e4de4956e823bcd5e6869e25ce155de0ac260bbd1eef4d005f88c9c4d025d2a16eaa99ce6e5f4c68b785594b979f04933c31a97e1362862dc5b86cbf485f4b1d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5N5JVugjvNXmhp4lzhVd4KwmC70e\n700AX4jJxNAl0qFuqpnObl9MaLeFWUuXnwSTPDGpfhNihi3FuGy/SF9LHQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 445, + "comment" : "r and s are 64-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30160209009c44febf31c3594f020900839ed28247c2b06b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "048ec4f82d4d7a728053c1aaa73224cefa565c6f458050c25501ca4d7f60bb1f17085fdb2d7afbb08e0a439e04e8a8a2a702953d731175971787d4c84e378ea9b7", + "wx" : "008ec4f82d4d7a728053c1aaa73224cefa565c6f458050c25501ca4d7f60bb1f17", + "wy" : "085fdb2d7afbb08e0a439e04e8a8a2a702953d731175971787d4c84e378ea9b7" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048ec4f82d4d7a728053c1aaa73224cefa565c6f458050c25501ca4d7f60bb1f17085fdb2d7afbb08e0a439e04e8a8a2a702953d731175971787d4c84e378ea9b7", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEjsT4LU16coBTwaqnMiTO+lZcb0WA\nUMJVAcpNf2C7HxcIX9stevuwjgpDngToqKKnApU9cxF1lxeH1MhON46ptw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 446, + "comment" : "r and s are 100-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "301e020d09df8b682430beef6f5fd7c7cd020d0fd0a62e13778f4222a0d61c8a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04b81824d27d30da7d0d71cf9a7a89f4925688d4b414be8fa72cb04d91323e51db0aa7471634de339dd3f9011e088af81ac569fe4473a04597f3ca26124753b53f", + "wx" : "00b81824d27d30da7d0d71cf9a7a89f4925688d4b414be8fa72cb04d91323e51db", + "wy" : "0aa7471634de339dd3f9011e088af81ac569fe4473a04597f3ca26124753b53f" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b81824d27d30da7d0d71cf9a7a89f4925688d4b414be8fa72cb04d91323e51db0aa7471634de339dd3f9011e088af81ac569fe4473a04597f3ca26124753b53f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuBgk0n0w2n0Ncc+aeon0klaI1LQU\nvo+nLLBNkTI+UdsKp0cWNN4zndP5AR4IivgaxWn+RHOgRZfzyiYSR1O1Pw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 447, + "comment" : "r and s are 128-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30260211008a598e563a89f526c32ebec8de26367c02110084f633e2042630e99dd0f1e16f7a04bf", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "048e9bd1999133b7ac90cc08926645ae11edd3e636bf66411314f0abd6e381ac02543e1ab4ed25714e4d5f62908730bf3a45cb667afca5157eeafa075646cafceb", + "wx" : "008e9bd1999133b7ac90cc08926645ae11edd3e636bf66411314f0abd6e381ac02", + "wy" : "543e1ab4ed25714e4d5f62908730bf3a45cb667afca5157eeafa075646cafceb" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048e9bd1999133b7ac90cc08926645ae11edd3e636bf66411314f0abd6e381ac02543e1ab4ed25714e4d5f62908730bf3a45cb667afca5157eeafa075646cafceb", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEjpvRmZEzt6yQzAiSZkWuEe3T5ja/\nZkETFPCr1uOBrAJUPhq07SVxTk1fYpCHML86RctmevylFX7q+gdWRsr86w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 448, + "comment" : "r and s are 160-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "302e021500aa6eeb5823f7fa31b466bb473797f0d0314c0bdf021500e2977c479e6d25703cebbc6bd561938cc9d1bfb9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04cfac11bd4b7aa0a29309767eddd337d302f1f42ccab215171f9622992a671e4a1451102ad100a24e6fb5cb130c69de2a61fa50f2d07a099d73ae96f971593588", + "wx" : "00cfac11bd4b7aa0a29309767eddd337d302f1f42ccab215171f9622992a671e4a", + "wy" : "1451102ad100a24e6fb5cb130c69de2a61fa50f2d07a099d73ae96f971593588" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cfac11bd4b7aa0a29309767eddd337d302f1f42ccab215171f9622992a671e4a1451102ad100a24e6fb5cb130c69de2a61fa50f2d07a099d73ae96f971593588", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEz6wRvUt6oKKTCXZ+3dM30wLx9CzK\nshUXH5YimSpnHkoUURAq0QCiTm+1yxMMad4qYfpQ8tB6CZ1zrpb5cVk1iA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 449, + "comment" : "s == 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30250220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70020101", + "result" : "valid" + }, + { + "tcId" : 450, + "comment" : "s == 0", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30250220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70020100", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0417edf3d93090cf77f4d2942c655d693a2fe28c4db390d7298ea8abc1710057e5dc5dbdaabab0ffbbda80ee961bac9ab1596265e6d6416c97253006f1d4a4a4ee", + "wx" : "17edf3d93090cf77f4d2942c655d693a2fe28c4db390d7298ea8abc1710057e5", + "wy" : "00dc5dbdaabab0ffbbda80ee961bac9ab1596265e6d6416c97253006f1d4a4a4ee" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000417edf3d93090cf77f4d2942c655d693a2fe28c4db390d7298ea8abc1710057e5dc5dbdaabab0ffbbda80ee961bac9ab1596265e6d6416c97253006f1d4a4a4ee", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEF+3z2TCQz3f00pQsZV1pOi/ijE2z\nkNcpjqirwXEAV+XcXb2qurD/u9qA7pYbrJqxWWJl5tZBbJclMAbx1KSk7g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 451, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022002f676969f451a8ccafa4c4f09791810e6d632dbd60b1d5540f3284fbe1889b0", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04027da56bed7d56a9ac595245887992d05d6d1efc0a98298657aa40a3f603b91c108b18bcfff9c382bf6ae4f924607c3db0f39a0baf2e5319b894e7bbabb1d1b4", + "wx" : "027da56bed7d56a9ac595245887992d05d6d1efc0a98298657aa40a3f603b91c", + "wy" : "108b18bcfff9c382bf6ae4f924607c3db0f39a0baf2e5319b894e7bbabb1d1b4" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004027da56bed7d56a9ac595245887992d05d6d1efc0a98298657aa40a3f603b91c108b18bcfff9c382bf6ae4f924607c3db0f39a0baf2e5319b894e7bbabb1d1b4", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAn2la+19VqmsWVJFiHmS0F1tHvwK\nmCmGV6pAo/YDuRwQixi8//nDgr9q5PkkYHw9sPOaC68uUxm4lOe7q7HRtA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 452, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002204e260962e33362ef0046126d2d5a4edc6947ab20e19b8ec19cf79e5908b6e628", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04a5afda4dcf49a010c4e0afb54745926d69d4b53e6b255ab43f18c8fe7449c8de41f9eabf20bd50fc7592f772684ce221168c41ae7e47731dc1259f46fd0a7f3f", + "wx" : "00a5afda4dcf49a010c4e0afb54745926d69d4b53e6b255ab43f18c8fe7449c8de", + "wy" : "41f9eabf20bd50fc7592f772684ce221168c41ae7e47731dc1259f46fd0a7f3f" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a5afda4dcf49a010c4e0afb54745926d69d4b53e6b255ab43f18c8fe7449c8de41f9eabf20bd50fc7592f772684ce221168c41ae7e47731dc1259f46fd0a7f3f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEpa/aTc9JoBDE4K+1R0WSbWnUtT5r\nJVq0PxjI/nRJyN5B+eq/IL1Q/HWS93JoTOIhFoxBrn5Hcx3BJZ9G/Qp/Pw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 453, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220077ed0d8f20f697d8fc591ac64dd5219c7932122b4f9b9ec6441e44a0092cf21", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "047526afc0c4c1be20c6bc819fa2ec37509b4c8d311d57ef07effc374d73766f2c1af54f9434280547ad854c0f96139fd3437b22fa6eb6676849d659055fea2149", + "wx" : "7526afc0c4c1be20c6bc819fa2ec37509b4c8d311d57ef07effc374d73766f2c", + "wy" : "1af54f9434280547ad854c0f96139fd3437b22fa6eb6676849d659055fea2149" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047526afc0c4c1be20c6bc819fa2ec37509b4c8d311d57ef07effc374d73766f2c1af54f9434280547ad854c0f96139fd3437b22fa6eb6676849d659055fea2149", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdSavwMTBviDGvIGfouw3UJtMjTEd\nV+8H7/w3TXN2bywa9U+UNCgFR62FTA+WE5/TQ3si+m62Z2hJ1lkFX+ohSQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 454, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002203e0292a67e181c6c0105ee35e956e78e9bdd033c6e71ae57884039a245e4175f", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04ce328e614f57f32b46c888cb3302c404dfc831ecc1dfcd3a3dfec7ba0819fe287df4f1de4f31d3ccb6d2e83bfa8113d75537ba6e37177e82384c4d16f8a6ed5b", + "wx" : "00ce328e614f57f32b46c888cb3302c404dfc831ecc1dfcd3a3dfec7ba0819fe28", + "wy" : "7df4f1de4f31d3ccb6d2e83bfa8113d75537ba6e37177e82384c4d16f8a6ed5b" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ce328e614f57f32b46c888cb3302c404dfc831ecc1dfcd3a3dfec7ba0819fe287df4f1de4f31d3ccb6d2e83bfa8113d75537ba6e37177e82384c4d16f8a6ed5b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzjKOYU9X8ytGyIjLMwLEBN/IMezB\n3806Pf7HuggZ/ih99PHeTzHTzLbS6Dv6gRPXVTe6bjcXfoI4TE0W+KbtWw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 455, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022013d22b06d6b8f5d97e0c64962b4a3bae30f668ca6217ef5b35d799f159e23ebe", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "049da871b379d5ca4252d7683a9087b85fd92c910c29a5e6acffe5baf18b2c6786db7f1ba6367b62556b683e2c396813587f299b459ed98f2fe34c9fc1e29620ce", + "wx" : "009da871b379d5ca4252d7683a9087b85fd92c910c29a5e6acffe5baf18b2c6786", + "wy" : "00db7f1ba6367b62556b683e2c396813587f299b459ed98f2fe34c9fc1e29620ce" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200049da871b379d5ca4252d7683a9087b85fd92c910c29a5e6acffe5baf18b2c6786db7f1ba6367b62556b683e2c396813587f299b459ed98f2fe34c9fc1e29620ce", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEnahxs3nVykJS12g6kIe4X9kskQwp\npeas/+W68YssZ4bbfxumNntiVWtoPiw5aBNYfymbRZ7Zjy/jTJ/B4pYgzg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 456, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002204523ce342e4994bb8968bf6613f60c06c86111f15a3a389309e72cd447d5dd99", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04f5f796c6fec37a6e7bd968aac5fdcb444318b2dd93af278f766f730d1eb6972dfff606e22879e2e18de131484310e7f81396bd6e5eb9a92dad82f174f6becadc", + "wx" : "00f5f796c6fec37a6e7bd968aac5fdcb444318b2dd93af278f766f730d1eb6972d", + "wy" : "00fff606e22879e2e18de131484310e7f81396bd6e5eb9a92dad82f174f6becadc" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004f5f796c6fec37a6e7bd968aac5fdcb444318b2dd93af278f766f730d1eb6972dfff606e22879e2e18de131484310e7f81396bd6e5eb9a92dad82f174f6becadc", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE9feWxv7Dem572Wiqxf3LREMYst2T\nryePdm9zDR62ly3/9gbiKHni4Y3hMUhDEOf4E5a9bl65qS2tgvF09r7K3A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 457, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022037d765be3c9c78189ad30edb5097a4db670de11686d01420e37039d4677f4809", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "040f9e25bfb59835d1441a0d620a196f2b7bf7dfa44acec89bd44052b49480bfe468d8420f3fc3812fba033a65e2d976ad168a7bfd7d31fd987bd57caaa2715596", + "wx" : "0f9e25bfb59835d1441a0d620a196f2b7bf7dfa44acec89bd44052b49480bfe4", + "wy" : "68d8420f3fc3812fba033a65e2d976ad168a7bfd7d31fd987bd57caaa2715596" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040f9e25bfb59835d1441a0d620a196f2b7bf7dfa44acec89bd44052b49480bfe468d8420f3fc3812fba033a65e2d976ad168a7bfd7d31fd987bd57caaa2715596", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAED54lv7WYNdFEGg1iChlvK3v336RK\nzsib1EBStJSAv+Ro2EIPP8OBL7oDOmXi2XatFop7/X0x/Zh71XyqonFVlg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 458, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022044237823b54e0c74c2bf5f759d9ac5f8cb897d537ffa92effd4f0bb6c9acd860", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "048e18d19b8a0b4b158303761e77fe9e16f48871b1545ea18e87e0745e860b0ad8812ec55ed5b88338b00f178ea435b9f07540253d8e6b0f61d1f632dc76e36290", + "wx" : "008e18d19b8a0b4b158303761e77fe9e16f48871b1545ea18e87e0745e860b0ad8", + "wy" : "00812ec55ed5b88338b00f178ea435b9f07540253d8e6b0f61d1f632dc76e36290" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048e18d19b8a0b4b158303761e77fe9e16f48871b1545ea18e87e0745e860b0ad8812ec55ed5b88338b00f178ea435b9f07540253d8e6b0f61d1f632dc76e36290", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEjhjRm4oLSxWDA3Yed/6eFvSIcbFU\nXqGOh+B0XoYLCtiBLsVe1biDOLAPF46kNbnwdUAlPY5rD2HR9jLcduNikA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 459, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220266d30a485385906054ca86d46f5f2b17e7f4646a3092092ad92877126538111", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04bb8cdc50326f91f60c2d92189119fb4fa71822e42b32f418321c4e18acab753c0987643b6fc34b51e606270a5f48a116e33a0154633f8b48bcf416636ffe3e1d", + "wx" : "00bb8cdc50326f91f60c2d92189119fb4fa71822e42b32f418321c4e18acab753c", + "wy" : "0987643b6fc34b51e606270a5f48a116e33a0154633f8b48bcf416636ffe3e1d" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004bb8cdc50326f91f60c2d92189119fb4fa71822e42b32f418321c4e18acab753c0987643b6fc34b51e606270a5f48a116e33a0154633f8b48bcf416636ffe3e1d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEu4zcUDJvkfYMLZIYkRn7T6cYIuQr\nMvQYMhxOGKyrdTwJh2Q7b8NLUeYGJwpfSKEW4zoBVGM/i0i89BZjb/4+HQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 460, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220538c7b3798e84d0ce90340165806348971ed44db8f0c674f5f215968390f92ee", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "047bb31c1eb5db2b2e852ffdff6cf1922874019fd4a08fb11a7ad7a7b2d2b998f6b00332ed69bc1ee3e9d014a7828e016ad3d7fbcc9bd8c5605ee35ee4c155c9a0", + "wx" : "7bb31c1eb5db2b2e852ffdff6cf1922874019fd4a08fb11a7ad7a7b2d2b998f6", + "wy" : "00b00332ed69bc1ee3e9d014a7828e016ad3d7fbcc9bd8c5605ee35ee4c155c9a0" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047bb31c1eb5db2b2e852ffdff6cf1922874019fd4a08fb11a7ad7a7b2d2b998f6b00332ed69bc1ee3e9d014a7828e016ad3d7fbcc9bd8c5605ee35ee4c155c9a0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEe7McHrXbKy6FL/3/bPGSKHQBn9Sg\nj7EaetenstK5mPawAzLtabwe4+nQFKeCjgFq09f7zJvYxWBe417kwVXJoA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 461, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002206fef0ef15d1688e15e704c4e6bb8bb7f40d52d3af5c661bb78c4ed9b408699b3", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04c0d73ae13cd4a0d7f5e6c7e0d04a80e777610dd10dce997b29f30b56c3a8cc48a7843569178892b75825807052423a8f069e3b19b49ef16ad0f9755365bd438f", + "wx" : "00c0d73ae13cd4a0d7f5e6c7e0d04a80e777610dd10dce997b29f30b56c3a8cc48", + "wy" : "00a7843569178892b75825807052423a8f069e3b19b49ef16ad0f9755365bd438f" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004c0d73ae13cd4a0d7f5e6c7e0d04a80e777610dd10dce997b29f30b56c3a8cc48a7843569178892b75825807052423a8f069e3b19b49ef16ad0f9755365bd438f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwNc64TzUoNf15sfg0EqA53dhDdEN\nzpl7KfMLVsOozEinhDVpF4iSt1glgHBSQjqPBp47GbSe8WrQ+XVTZb1Djw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 462, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002206f44275e9aeb1331efcb8d58f35c0252791427e403ad84daad51d247cc2a64c6", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "045f5846c6688b584e2ac1a1ce618353b7f02d3238d6b90e6547031670fbc7a60b48bbe517b630ee4cbd0c1fe2eaff0b23e2710c9320c0024198bb31b4347d2034", + "wx" : "5f5846c6688b584e2ac1a1ce618353b7f02d3238d6b90e6547031670fbc7a60b", + "wy" : "48bbe517b630ee4cbd0c1fe2eaff0b23e2710c9320c0024198bb31b4347d2034" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045f5846c6688b584e2ac1a1ce618353b7f02d3238d6b90e6547031670fbc7a60b48bbe517b630ee4cbd0c1fe2eaff0b23e2710c9320c0024198bb31b4347d2034", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEX1hGxmiLWE4qwaHOYYNTt/AtMjjW\nuQ5lRwMWcPvHpgtIu+UXtjDuTL0MH+Lq/wsj4nEMkyDAAkGYuzG0NH0gNA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 463, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022021323755b103d2f9da6ab83eccab9ad8598bcf625652f10e7a3eeee3c3945fb3", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "040c51eb799d377bacf2bd1ffafe88086129b8079cacccce3f61fb69da0353877c9c656a31f5008a18b32f7bdd7f7697fa4dbef6cf8f02d06b24d08a0b6bab0dfa", + "wx" : "0c51eb799d377bacf2bd1ffafe88086129b8079cacccce3f61fb69da0353877c", + "wy" : "009c656a31f5008a18b32f7bdd7f7697fa4dbef6cf8f02d06b24d08a0b6bab0dfa" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040c51eb799d377bacf2bd1ffafe88086129b8079cacccce3f61fb69da0353877c9c656a31f5008a18b32f7bdd7f7697fa4dbef6cf8f02d06b24d08a0b6bab0dfa", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEDFHreZ03e6zyvR/6/ogIYSm4B5ys\nzM4/Yftp2gNTh3ycZWox9QCKGLMve91/dpf6Tb72z48C0Gsk0IoLa6sN+g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 464, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002206c50acfe76de1289e7a5edb240f1c2a7879db6873d5d931f3c6ac467a6eac171", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04f90cc708939129c66d61eef220921d197600f2c5dafe53a88b673d3ba5cb6efcb12a2944e5344b50a0781797f874e45c44766c91cce89a2fc000b9fee2ba7c21", + "wx" : "00f90cc708939129c66d61eef220921d197600f2c5dafe53a88b673d3ba5cb6efc", + "wy" : "00b12a2944e5344b50a0781797f874e45c44766c91cce89a2fc000b9fee2ba7c21" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004f90cc708939129c66d61eef220921d197600f2c5dafe53a88b673d3ba5cb6efcb12a2944e5344b50a0781797f874e45c44766c91cce89a2fc000b9fee2ba7c21", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+QzHCJORKcZtYe7yIJIdGXYA8sXa\n/lOoi2c9O6XLbvyxKilE5TRLUKB4F5f4dORcRHZskczomi/AALn+4rp8IQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 465, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220755b7fffb0b17ad57dca50fcefb7fe297b029df25e5ccb5069e8e70c2742c2a6", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04ca99e8cacb96b9b73a7ecf478617269f08971c307aba958692381696c244443b5c5df1f740db3016b0ad298997131cea685b2ba405c3b0f722c6992bdaa6fd3a", + "wx" : "00ca99e8cacb96b9b73a7ecf478617269f08971c307aba958692381696c244443b", + "wy" : "5c5df1f740db3016b0ad298997131cea685b2ba405c3b0f722c6992bdaa6fd3a" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ca99e8cacb96b9b73a7ecf478617269f08971c307aba958692381696c244443b5c5df1f740db3016b0ad298997131cea685b2ba405c3b0f722c6992bdaa6fd3a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEypnoysuWubc6fs9HhhcmnwiXHDB6\nupWGkjgWlsJERDtcXfH3QNswFrCtKYmXExzqaFsrpAXDsPcixpkr2qb9Og==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 466, + "comment" : "point at infinity during verify", + "flags" : [ + "PointDuplication", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a80220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "043c31be015178a9c3d3cae9103bf25bc11a709316d06ab46c01f884a8eb33da2e91f32a1352712508642c4774ea67049175161cb2bafd5524b813274b140f8e99", + "wx" : "3c31be015178a9c3d3cae9103bf25bc11a709316d06ab46c01f884a8eb33da2e", + "wy" : "0091f32a1352712508642c4774ea67049175161cb2bafd5524b813274b140f8e99" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043c31be015178a9c3d3cae9103bf25bc11a709316d06ab46c01f884a8eb33da2e91f32a1352712508642c4774ea67049175161cb2bafd5524b813274b140f8e99", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPDG+AVF4qcPTyukQO/JbwRpwkxbQ\narRsAfiEqOsz2i6R8yoTUnElCGQsR3TqZwSRdRYcsrr9VSS4EydLFA+OmQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 467, + "comment" : "edge case for signature malleability", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a902207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a8", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04355d9c3f97a282ac17f7bc98373f271d6a2bc02eb964f13c1e2d7debff4a02fd63282e78fb9b88f81413bcf95f16982d9f50e7f94a5d28685b41da997201db5e", + "wx" : "355d9c3f97a282ac17f7bc98373f271d6a2bc02eb964f13c1e2d7debff4a02fd", + "wy" : "63282e78fb9b88f81413bcf95f16982d9f50e7f94a5d28685b41da997201db5e" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004355d9c3f97a282ac17f7bc98373f271d6a2bc02eb964f13c1e2d7debff4a02fd63282e78fb9b88f81413bcf95f16982d9f50e7f94a5d28685b41da997201db5e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENV2cP5eigqwX97yYNz8nHWorwC65\nZPE8Hi196/9KAv1jKC54+5uI+BQTvPlfFpgtn1Dn+UpdKGhbQdqZcgHbXg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 468, + "comment" : "edge case for signature malleability", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a902207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "041c959964cabaa5ce966b95acda1c5264847a780426c878d716d73ae6621d3084d3fedfc4f9c3b8cc8bc6539b821ad208ec08d5737aaaf1801d666ddc37e54faf", + "wx" : "1c959964cabaa5ce966b95acda1c5264847a780426c878d716d73ae6621d3084", + "wy" : "00d3fedfc4f9c3b8cc8bc6539b821ad208ec08d5737aaaf1801d666ddc37e54faf" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200041c959964cabaa5ce966b95acda1c5264847a780426c878d716d73ae6621d3084d3fedfc4f9c3b8cc8bc6539b821ad208ec08d5737aaaf1801d666ddc37e54faf", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHJWZZMq6pc6Wa5Ws2hxSZIR6eAQm\nyHjXFtc65mIdMITT/t/E+cO4zIvGU5uCGtII7AjVc3qq8YAdZm3cN+VPrw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 469, + "comment" : "u1 == 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220342dae751a63a3ca8189cf342b3b34eaaa2565e2c7e26121c1bfd5435447f1c3", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "049842a82a83932d5a44daab14afb79968dd24d9ffc58e638586a90b0f25b521dd38b2c05c8d548bcf5ab2a906e2f3fbdde7f0b9bbdecb852297d55ae34257f8f3", + "wx" : "009842a82a83932d5a44daab14afb79968dd24d9ffc58e638586a90b0f25b521dd", + "wy" : "38b2c05c8d548bcf5ab2a906e2f3fbdde7f0b9bbdecb852297d55ae34257f8f3" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200049842a82a83932d5a44daab14afb79968dd24d9ffc58e638586a90b0f25b521dd38b2c05c8d548bcf5ab2a906e2f3fbdde7f0b9bbdecb852297d55ae34257f8f3", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEmEKoKoOTLVpE2qsUr7eZaN0k2f/F\njmOFhqkLDyW1Id04ssBcjVSLz1qyqQbi8/vd5/C5u97LhSKX1VrjQlf48w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 470, + "comment" : "u1 == n - 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30450220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022100cbd25189e59c5c367e7630cbd4c4cb1512c194cadf353d6331f9f57fa81b338e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04987a839ec570964d3a1bfc6a0334e7328c1624677c66b8fef3a5e64d1178ddae5577dfcd0fe00da9e1d8bb8bbd952aaa5bc10ecb14cae4e3f5e28c506bbc3a21", + "wx" : "00987a839ec570964d3a1bfc6a0334e7328c1624677c66b8fef3a5e64d1178ddae", + "wy" : "5577dfcd0fe00da9e1d8bb8bbd952aaa5bc10ecb14cae4e3f5e28c506bbc3a21" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004987a839ec570964d3a1bfc6a0334e7328c1624677c66b8fef3a5e64d1178ddae5577dfcd0fe00da9e1d8bb8bbd952aaa5bc10ecb14cae4e3f5e28c506bbc3a21", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEmHqDnsVwlk06G/xqAzTnMowWJGd8\nZrj+86XmTRF43a5Vd9/ND+ANqeHYu4u9lSqqW8EOyxTK5OP14oxQa7w6IQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 471, + "comment" : "u2 == 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04ab6590ad5134f8e1bf4581cf90ca0398ceb92861c2af06928cc0303d9654ca3e1d821f6a357dc173f22a3b77145c057a632bb56f31514e31d6d2ed7fddeade55", + "wx" : "00ab6590ad5134f8e1bf4581cf90ca0398ceb92861c2af06928cc0303d9654ca3e", + "wy" : "1d821f6a357dc173f22a3b77145c057a632bb56f31514e31d6d2ed7fddeade55" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ab6590ad5134f8e1bf4581cf90ca0398ceb92861c2af06928cc0303d9654ca3e1d821f6a357dc173f22a3b77145c057a632bb56f31514e31d6d2ed7fddeade55", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEq2WQrVE0+OG/RYHPkMoDmM65KGHC\nrwaSjMAwPZZUyj4dgh9qNX3Bc/IqO3cUXAV6Yyu1bzFRTjHW0u1/3ereVQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 472, + "comment" : "u2 == n - 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30450220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022100aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04cde41230f0cdf732ac76e5f284cb7f46915ed309b48debf245f3ff2f243e9366240da36ca5ad289bdfea83213847b14a73079705eab0a2a28aefc999e5ed1504", + "wx" : "00cde41230f0cdf732ac76e5f284cb7f46915ed309b48debf245f3ff2f243e9366", + "wy" : "240da36ca5ad289bdfea83213847b14a73079705eab0a2a28aefc999e5ed1504" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cde41230f0cdf732ac76e5f284cb7f46915ed309b48debf245f3ff2f243e9366240da36ca5ad289bdfea83213847b14a73079705eab0a2a28aefc999e5ed1504", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzeQSMPDN9zKsduXyhMt/RpFe0wm0\njevyRfP/LyQ+k2YkDaNspa0om9/qgyE4R7FKcweXBeqwoqKK78mZ5e0VBA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 473, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bc0f3a265e2136998083451163be66f8b6a673bf5cb08a0e8dbbce4319af6977", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0436c6faa9f6dca42ea8b0e6d02d36c3941582749251bfa88c35fc8a8e9ad51cdac44ce5f20f36b4ae75cc7291678dbff188cf8c838b8963eeb8b78891795a7364", + "wx" : "36c6faa9f6dca42ea8b0e6d02d36c3941582749251bfa88c35fc8a8e9ad51cda", + "wy" : "00c44ce5f20f36b4ae75cc7291678dbff188cf8c838b8963eeb8b78891795a7364" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000436c6faa9f6dca42ea8b0e6d02d36c3941582749251bfa88c35fc8a8e9ad51cdac44ce5f20f36b4ae75cc7291678dbff188cf8c838b8963eeb8b78891795a7364", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENsb6qfbcpC6osObQLTbDlBWCdJJR\nv6iMNfyKjprVHNrETOXyDza0rnXMcpFnjb/xiM+Mg4uJY+64t4iReVpzZA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 474, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02202a06d743967a1330ca91cc46c9394512cc85b4f1b9355eb7f4bbe53a32b76cf4", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04709e58a12b12034173395bf91e68255d90d8a3a1d5875c75f87787d9a85a092980e09b79f43489be726a4253ae6c05adce71bcc65389254923cbfacc0775bff6", + "wx" : "709e58a12b12034173395bf91e68255d90d8a3a1d5875c75f87787d9a85a0929", + "wy" : "0080e09b79f43489be726a4253ae6c05adce71bcc65389254923cbfacc0775bff6" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004709e58a12b12034173395bf91e68255d90d8a3a1d5875c75f87787d9a85a092980e09b79f43489be726a4253ae6c05adce71bcc65389254923cbfacc0775bff6", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEcJ5YoSsSA0FzOVv5HmglXZDYo6HV\nh1x1+HeH2ahaCSmA4Jt59DSJvnJqQlOubAWtznG8xlOJJUkjy/rMB3W/9g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 475, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0221008a457017b290d6edb5455e167b9944f67dc5ba958c7c8108ac56e8596b9bc9a1", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0486664a9e09db80dbe3bd0158cc4a64a2cded9c852b455f4443e97cca5569f7cc7454f96b52a27a43a1345b5d340902e147880adaf2fe691c168b4203ba2e1df4", + "wx" : "0086664a9e09db80dbe3bd0158cc4a64a2cded9c852b455f4443e97cca5569f7cc", + "wy" : "7454f96b52a27a43a1345b5d340902e147880adaf2fe691c168b4203ba2e1df4" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000486664a9e09db80dbe3bd0158cc4a64a2cded9c852b455f4443e97cca5569f7cc7454f96b52a27a43a1345b5d340902e147880adaf2fe691c168b4203ba2e1df4", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhmZKngnbgNvjvQFYzEpkos3tnIUr\nRV9EQ+l8ylVp98x0VPlrUqJ6Q6E0W100CQLhR4gK2vL+aRwWi0IDui4d9A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 476, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100cbfaf812124638c0b98c18cac3dd8d0848ff921f26aec42a708df7b6a97571c7", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04623c668c5dbae406e7b4e8e97b2bba2028586f2e3c31f694d9fe87a3de29f8433ac7eb04891898dd9077432c38cc978049cab7721630ed033095f850ade83e3e", + "wx" : "623c668c5dbae406e7b4e8e97b2bba2028586f2e3c31f694d9fe87a3de29f843", + "wy" : "3ac7eb04891898dd9077432c38cc978049cab7721630ed033095f850ade83e3e" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004623c668c5dbae406e7b4e8e97b2bba2028586f2e3c31f694d9fe87a3de29f8433ac7eb04891898dd9077432c38cc978049cab7721630ed033095f850ade83e3e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYjxmjF265AbntOjpeyu6IChYby48\nMfaU2f6Ho94p+EM6x+sEiRiY3ZB3Qyw4zJeAScq3chYw7QMwlfhQreg+Pg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 477, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100af812de3638bfed9c18cac3dd8d087e7350cc7062635266a525bff486363cc91", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04b034897e2a74a787e008b14c62882eaee0e6e53a1c8a58f709a54432713c20fd28e07de2ca64b5e215d25d0530d7807df11b98bb39c26a2405388ac0b163fafc", + "wx" : "00b034897e2a74a787e008b14c62882eaee0e6e53a1c8a58f709a54432713c20fd", + "wy" : "28e07de2ca64b5e215d25d0530d7807df11b98bb39c26a2405388ac0b163fafc" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b034897e2a74a787e008b14c62882eaee0e6e53a1c8a58f709a54432713c20fd28e07de2ca64b5e215d25d0530d7807df11b98bb39c26a2405388ac0b163fafc", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEsDSJfip0p4fgCLFMYoguruDm5Toc\nilj3CaVEMnE8IP0o4H3iymS14hXSXQUw14B98RuYuznCaiQFOIrAsWP6/A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 478, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02205f025bc7c717fdb28319587bb1a10fcead32935ea552ae4fb0fe33cdca6473d1", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0414c4f6210b628edd441651d3cb61a07f7ca87629a9e0add5a4fd92902a20cd255146bebdb22b4d49527ebc90ba6294784ae7ca664724d45a466c9fe8b8699bbf", + "wx" : "14c4f6210b628edd441651d3cb61a07f7ca87629a9e0add5a4fd92902a20cd25", + "wy" : "5146bebdb22b4d49527ebc90ba6294784ae7ca664724d45a466c9fe8b8699bbf" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000414c4f6210b628edd441651d3cb61a07f7ca87629a9e0add5a4fd92902a20cd255146bebdb22b4d49527ebc90ba6294784ae7ca664724d45a466c9fe8b8699bbf", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFMT2IQtijt1EFlHTy2Ggf3yodimp\n4K3VpP2SkCogzSVRRr69sitNSVJ+vJC6YpR4SufKZkck1FpGbJ/ouGmbvw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 479, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100de4130d1ed9120b8c3dd8d087e7630cb9a8402519439af08e96b342788c6e84e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04b5408eefbdb7480fad4c1735f378c9a1ded28cf476835f27b6fd3b8af5e4c596a60a806e244c63a798baf2fd5a66c6c0d7f77952ba2d74b0fe3652811caac6f0", + "wx" : "00b5408eefbdb7480fad4c1735f378c9a1ded28cf476835f27b6fd3b8af5e4c596", + "wy" : "00a60a806e244c63a798baf2fd5a66c6c0d7f77952ba2d74b0fe3652811caac6f0" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b5408eefbdb7480fad4c1735f378c9a1ded28cf476835f27b6fd3b8af5e4c596a60a806e244c63a798baf2fd5a66c6c0d7f77952ba2d74b0fe3652811caac6f0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEtUCO7723SA+tTBc183jJod7SjPR2\ng18ntv07ivXkxZamCoBuJExjp5i68v1aZsbA1/d5UrotdLD+NlKBHKrG8A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 480, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ec618e7b1af40be0d052f5a020388fc6cafb822933c1bffab137885f52e89d3e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04de9e22bc58f4b9c913e7f7c26fcbc5d7f6bdc9fced5f520ac88e8a03290be403746a125844509d79840e35440b312dbfdf4ab8ab0011e7c36bc9e01201b1b0e0", + "wx" : "00de9e22bc58f4b9c913e7f7c26fcbc5d7f6bdc9fced5f520ac88e8a03290be403", + "wy" : "746a125844509d79840e35440b312dbfdf4ab8ab0011e7c36bc9e01201b1b0e0" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004de9e22bc58f4b9c913e7f7c26fcbc5d7f6bdc9fced5f520ac88e8a03290be403746a125844509d79840e35440b312dbfdf4ab8ab0011e7c36bc9e01201b1b0e0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE3p4ivFj0uckT5/fCb8vF1/a9yfzt\nX1IKyI6KAykL5AN0ahJYRFCdeYQONUQLMS2/30q4qwAR58NryeASAbGw4A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 481, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100d39813c8102fe0f18cbfac4b0fa028e6e48c093c59ea00dc99fad50f2d614a3d", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04ee3bfd2e1c3d99acd88dbf6fc9a3a8f5686b50a6a3e9215f57e83a81389836a5f8ebff9a3e463d47ec36259fdde694bdbb880b0a09fe9ac649d691646ba624f6", + "wx" : "00ee3bfd2e1c3d99acd88dbf6fc9a3a8f5686b50a6a3e9215f57e83a81389836a5", + "wy" : "00f8ebff9a3e463d47ec36259fdde694bdbb880b0a09fe9ac649d691646ba624f6" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ee3bfd2e1c3d99acd88dbf6fc9a3a8f5686b50a6a3e9215f57e83a81389836a5f8ebff9a3e463d47ec36259fdde694bdbb880b0a09fe9ac649d691646ba624f6", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE7jv9Lhw9mazYjb9vyaOo9WhrUKaj\n6SFfV+g6gTiYNqX46/+aPkY9R+w2JZ/d5pS9u4gLCgn+msZJ1pFka6Yk9g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 482, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100e9fcbcad906698e02d9aba57b3c4e9eefeaf3cec7a980c422fe7f6303fc4a3ab", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "043c0c4d0ad0848d1335b12a8919d32fafc5f2b0d5c2f3cf6494b06ba8eb17cb29dd7054095454fdb519279cde10259ec5d9e5e4b5a8c4daca649a150f2dbf21ac", + "wx" : "3c0c4d0ad0848d1335b12a8919d32fafc5f2b0d5c2f3cf6494b06ba8eb17cb29", + "wy" : "00dd7054095454fdb519279cde10259ec5d9e5e4b5a8c4daca649a150f2dbf21ac" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043c0c4d0ad0848d1335b12a8919d32fafc5f2b0d5c2f3cf6494b06ba8eb17cb29dd7054095454fdb519279cde10259ec5d9e5e4b5a8c4daca649a150f2dbf21ac", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPAxNCtCEjRM1sSqJGdMvr8XysNXC\n889klLBrqOsXyyndcFQJVFT9tRknnN4QJZ7F2eXktajE2spkmhUPLb8hrA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 483, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022021f862ec50ef64b3bfbe5d774e20cc838320437725338a3b32fefe3ff159dded", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "046cf91440818ea262b9376e23f7b530b9e44edf5bc6db1a67dd60cc722975d62317c19e7d6ebc0cbdc89388242d604ae94ac4ca179ef2cd8bf33fbf738afcb39b", + "wx" : "6cf91440818ea262b9376e23f7b530b9e44edf5bc6db1a67dd60cc722975d623", + "wy" : "17c19e7d6ebc0cbdc89388242d604ae94ac4ca179ef2cd8bf33fbf738afcb39b" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046cf91440818ea262b9376e23f7b530b9e44edf5bc6db1a67dd60cc722975d62317c19e7d6ebc0cbdc89388242d604ae94ac4ca179ef2cd8bf33fbf738afcb39b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEbPkUQIGOomK5N24j97UwueRO31vG\n2xpn3WDMcil11iMXwZ59brwMvciTiCQtYErpSsTKF57yzYvzP79zivyzmw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 484, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022043f0c5d8a1dec9677f7cbaee9c419907064086ee4a67147665fdfc7fe2b3bbda", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "041b5afcf39888d2da7215f36421a85c4217b0ac883bf5957c2d066efd8bc89f18d8fb3b6aca0b3577a883948e016905065a3fdc13d6f433172ee0f16784e52c78", + "wx" : "1b5afcf39888d2da7215f36421a85c4217b0ac883bf5957c2d066efd8bc89f18", + "wy" : "00d8fb3b6aca0b3577a883948e016905065a3fdc13d6f433172ee0f16784e52c78" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200041b5afcf39888d2da7215f36421a85c4217b0ac883bf5957c2d066efd8bc89f18d8fb3b6aca0b3577a883948e016905065a3fdc13d6f433172ee0f16784e52c78", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEG1r885iI0tpyFfNkIahcQhewrIg7\n9ZV8LQZu/YvInxjY+ztqygs1d6iDlI4BaQUGWj/cE9b0Mxcu4PFnhOUseA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 485, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022065e928c4f2ce2e1b3f3b1865ea62658a8960ca656f9a9eb198fcfabfd40d99c7", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04890d36db646c27c2e6c7bc7fdc3f0cbf66fab36d13279b9ecf6e98457d8cf49207a83cfda8e9d0375404c6cbff66792eef97220239254000b4bf983e6bae26d7", + "wx" : "00890d36db646c27c2e6c7bc7fdc3f0cbf66fab36d13279b9ecf6e98457d8cf492", + "wy" : "07a83cfda8e9d0375404c6cbff66792eef97220239254000b4bf983e6bae26d7" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004890d36db646c27c2e6c7bc7fdc3f0cbf66fab36d13279b9ecf6e98457d8cf49207a83cfda8e9d0375404c6cbff66792eef97220239254000b4bf983e6bae26d7", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEiQ0222RsJ8Lmx7x/3D8Mv2b6s20T\nJ5uez26YRX2M9JIHqDz9qOnQN1QExsv/Znku75ciAjklQAC0v5g+a64m1w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 486, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100c522b80b59486b775aa2af0b3dcca27b1d565aa199ca0fc6d008598e33ff7779", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042a1571ed0ffe39574d030b406f638bf88eea5b4b50754e93431fe0172fdf2fbcbc77f601dc6dbc88cc2b560e8cca5e738f2c769810b2c8762dab917adfe24535", + "wx" : "2a1571ed0ffe39574d030b406f638bf88eea5b4b50754e93431fe0172fdf2fbc", + "wy" : "00bc77f601dc6dbc88cc2b560e8cca5e738f2c769810b2c8762dab917adfe24535" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042a1571ed0ffe39574d030b406f638bf88eea5b4b50754e93431fe0172fdf2fbcbc77f601dc6dbc88cc2b560e8cca5e738f2c769810b2c8762dab917adfe24535", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKhVx7Q/+OVdNAwtAb2OL+I7qW0tQ\ndU6TQx/gFy/fL7y8d/YB3G28iMwrVg6Myl5zjyx2mBCyyHYtq5F63+JFNQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 487, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207fffffffaaaaaaaaffffffffffffffffe9a2538f37b28a2c513dee40fecbb71a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04612b4467c8b3b8ecbf5374997ec7db8cab2bda9e431982c49727f3fcefb10b47b9d1ecc026c3665425730128138c4e181c61ec28b38910ca59e5fc496ec31f08", + "wx" : "612b4467c8b3b8ecbf5374997ec7db8cab2bda9e431982c49727f3fcefb10b47", + "wy" : "00b9d1ecc026c3665425730128138c4e181c61ec28b38910ca59e5fc496ec31f08" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004612b4467c8b3b8ecbf5374997ec7db8cab2bda9e431982c49727f3fcefb10b47b9d1ecc026c3665425730128138c4e181c61ec28b38910ca59e5fc496ec31f08", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYStEZ8izuOy/U3SZfsfbjKsr2p5D\nGYLElyfz/O+xC0e50ezAJsNmVCVzASgTjE4YHGHsKLOJEMpZ5fxJbsMfCA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 488, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100b62f26b5f2a2b26f6de86d42ad8a13da3ab3cccd0459b201de009e526adf21f2", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0434191b6ce8865c2230a514b61e2b2730c94beb072e9de309872aea3743bb3e2722d202fc59984e7421a25e6a82664b5080f72ab28df9c0af4e1e300af11ae9b0", + "wx" : "34191b6ce8865c2230a514b61e2b2730c94beb072e9de309872aea3743bb3e27", + "wy" : "22d202fc59984e7421a25e6a82664b5080f72ab28df9c0af4e1e300af11ae9b0" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000434191b6ce8865c2230a514b61e2b2730c94beb072e9de309872aea3743bb3e2722d202fc59984e7421a25e6a82664b5080f72ab28df9c0af4e1e300af11ae9b0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENBkbbOiGXCIwpRS2HisnMMlL6wcu\nneMJhyrqN0O7Pici0gL8WZhOdCGiXmqCZktQgPcqso35wK9OHjAK8RrpsA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 489, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bb1d9ac949dd748cd02bbbe749bd351cd57b38bb61403d700686aa7b4c90851e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04d533c620a8fd3d5a8342caba89eadc25907d1e9b6fea48ee8f806aa772f0c80f70e09c022fa1139da32a456ec024949824477bf0bdbf603e8faccd6b205d263c", + "wx" : "00d533c620a8fd3d5a8342caba89eadc25907d1e9b6fea48ee8f806aa772f0c80f", + "wy" : "70e09c022fa1139da32a456ec024949824477bf0bdbf603e8faccd6b205d263c" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d533c620a8fd3d5a8342caba89eadc25907d1e9b6fea48ee8f806aa772f0c80f70e09c022fa1139da32a456ec024949824477bf0bdbf603e8faccd6b205d263c", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE1TPGIKj9PVqDQsq6iercJZB9Hptv\n6kjuj4Bqp3LwyA9w4JwCL6ETnaMqRW7AJJSYJEd78L2/YD6PrM1rIF0mPA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 490, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022066755a00638cdaec1c732513ca0234ece52545dac11f816e818f725b4f60aaf2", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0491014bea8705a022972e12b176c96e84c0b61c05eb1c6f8c5c1db731d54d67e29060ef6c764d8d47ed5ebf8f6c23835cb89f8b056cdf7e457f9273b6477ece33", + "wx" : "0091014bea8705a022972e12b176c96e84c0b61c05eb1c6f8c5c1db731d54d67e2", + "wy" : "009060ef6c764d8d47ed5ebf8f6c23835cb89f8b056cdf7e457f9273b6477ece33" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000491014bea8705a022972e12b176c96e84c0b61c05eb1c6f8c5c1db731d54d67e29060ef6c764d8d47ed5ebf8f6c23835cb89f8b056cdf7e457f9273b6477ece33", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEkQFL6ocFoCKXLhKxdsluhMC2HAXr\nHG+MXB23MdVNZ+KQYO9sdk2NR+1ev49sI4NcuJ+LBWzffkV/knO2R37OMw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 491, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022055a00c9fcdaebb6032513ca0234ecfffe98ebe492fdf02e48ca48e982beb3669", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04287a7f8edfbb55cbb56d6b7be5b96c410a85a35bc6639661a92bd653e1f59688bbd133a77828493b3e0f867f34acfcac099415399a6b1106a0f9420c06f8bf94", + "wx" : "287a7f8edfbb55cbb56d6b7be5b96c410a85a35bc6639661a92bd653e1f59688", + "wy" : "00bbd133a77828493b3e0f867f34acfcac099415399a6b1106a0f9420c06f8bf94" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004287a7f8edfbb55cbb56d6b7be5b96c410a85a35bc6639661a92bd653e1f59688bbd133a77828493b3e0f867f34acfcac099415399a6b1106a0f9420c06f8bf94", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKHp/jt+7Vcu1bWt75blsQQqFo1vG\nY5ZhqSvWU+H1loi70TOneChJOz4Phn80rPysCZQVOZprEQag+UIMBvi/lA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 492, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ab40193f9b5d76c064a27940469d9fffd31d7c925fbe05c919491d3057d66cd2", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0482eca524c9ee8475ec8948721a9409b5090c6c28866d0c12669bd5cb7e685a58066b1e7135946a425ddd228076ea24d131b9bd2eae6b51c8083857628f260b80", + "wx" : "0082eca524c9ee8475ec8948721a9409b5090c6c28866d0c12669bd5cb7e685a58", + "wy" : "066b1e7135946a425ddd228076ea24d131b9bd2eae6b51c8083857628f260b80" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000482eca524c9ee8475ec8948721a9409b5090c6c28866d0c12669bd5cb7e685a58066b1e7135946a425ddd228076ea24d131b9bd2eae6b51c8083857628f260b80", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEguylJMnuhHXsiUhyGpQJtQkMbCiG\nbQwSZpvVy35oWlgGax5xNZRqQl3dIoB26iTRMbm9Lq5rUcgIOFdijyYLgA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 493, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ca0234ebb5fdcb13ca0234ecffffffffcb0dadbbc7f549f8a26b4408d0dc8600", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "049cc512b58d5b921f91075441b0df61e0381459de703a84523cda31dc18549ff85647dd4bd39f6761a144d81ef39db7bc0dedbcb15bdaf084e3a10fdd10bd906a", + "wx" : "009cc512b58d5b921f91075441b0df61e0381459de703a84523cda31dc18549ff8", + "wy" : "5647dd4bd39f6761a144d81ef39db7bc0dedbcb15bdaf084e3a10fdd10bd906a" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200049cc512b58d5b921f91075441b0df61e0381459de703a84523cda31dc18549ff85647dd4bd39f6761a144d81ef39db7bc0dedbcb15bdaf084e3a10fdd10bd906a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEnMUStY1bkh+RB1RBsN9h4DgUWd5w\nOoRSPNox3BhUn/hWR91L059nYaFE2B7znbe8De28sVva8ITjoQ/dEL2Qag==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 494, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff3ea3677e082b9310572620ae19933a9e65b285598711c77298815ad3", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04aa9d33c76ccd011ba23047a420840374b4fa3be480c65263d543baf2ccc6141e5ed3b42ad9527869fae92914b82b952d2c31c8fcc85b4c100983096694285766", + "wx" : "00aa9d33c76ccd011ba23047a420840374b4fa3be480c65263d543baf2ccc6141e", + "wy" : "5ed3b42ad9527869fae92914b82b952d2c31c8fcc85b4c100983096694285766" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004aa9d33c76ccd011ba23047a420840374b4fa3be480c65263d543baf2ccc6141e5ed3b42ad9527869fae92914b82b952d2c31c8fcc85b4c100983096694285766", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEqp0zx2zNARuiMEekIIQDdLT6O+SA\nxlJj1UO68szGFB5e07Qq2VJ4afrpKRS4K5UtLDHI/MhbTBAJgwlmlChXZg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 495, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220266666663bbbbbbbe6666666666666665b37902e023fab7c8f055d86e5cc41f4", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042812996934db1357048a1aacb07cb2a8730fbe530984a7a5166f84748ff63e4ce6e8a80e235e216e1a9e75ba3b3a321af51d2e4524ad3c8be99288463b91155a", + "wx" : "2812996934db1357048a1aacb07cb2a8730fbe530984a7a5166f84748ff63e4c", + "wy" : "00e6e8a80e235e216e1a9e75ba3b3a321af51d2e4524ad3c8be99288463b91155a" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042812996934db1357048a1aacb07cb2a8730fbe530984a7a5166f84748ff63e4ce6e8a80e235e216e1a9e75ba3b3a321af51d2e4524ad3c8be99288463b91155a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKBKZaTTbE1cEihqssHyyqHMPvlMJ\nhKelFm+EdI/2Pkzm6KgOI14hbhqedbo7OjIa9R0uRSStPIvpkohGO5EVWg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 496, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff36db6db7a492492492492492146c573f4c6dfc8d08a443e258970b09", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "048286d34afa1904ae756d73bf02a6b6a9db1eaa1b8351ad713a786dcfb829135bf97922dfe80cd4f0e438a8d842e7666853436d972860f715e622a1e876db4251", + "wx" : "008286d34afa1904ae756d73bf02a6b6a9db1eaa1b8351ad713a786dcfb829135b", + "wy" : "00f97922dfe80cd4f0e438a8d842e7666853436d972860f715e622a1e876db4251" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048286d34afa1904ae756d73bf02a6b6a9db1eaa1b8351ad713a786dcfb829135bf97922dfe80cd4f0e438a8d842e7666853436d972860f715e622a1e876db4251", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEgobTSvoZBK51bXO/Aqa2qdseqhuD\nUa1xOnhtz7gpE1v5eSLf6AzU8OQ4qNhC52ZoU0Ntlyhg9xXmIqHodttCUQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 497, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff2aaaaaab7fffffffffffffffc815d0e60b3e596ecb1ad3a27cfd49c4", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "044b7b9990a6c2c5a810107c09ee09cf3388c1a6e82aaa44c378d9886e2508c2e0867e7632fcc312fcfdc01fb6a579ce6aa6285563b1adbb3272f0e122f9de73e3", + "wx" : "4b7b9990a6c2c5a810107c09ee09cf3388c1a6e82aaa44c378d9886e2508c2e0", + "wy" : "00867e7632fcc312fcfdc01fb6a579ce6aa6285563b1adbb3272f0e122f9de73e3" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044b7b9990a6c2c5a810107c09ee09cf3388c1a6e82aaa44c378d9886e2508c2e0867e7632fcc312fcfdc01fb6a579ce6aa6285563b1adbb3272f0e122f9de73e3", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAES3uZkKbCxagQEHwJ7gnPM4jBpugq\nqkTDeNmIbiUIwuCGfnYy/MMS/P3AH7alec5qpihVY7GtuzJy8OEi+d5z4w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 498, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207fffffff55555555ffffffffffffffffd344a71e6f651458a27bdc81fd976e37", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04568426540e19be6404e6cb4745fc7a943c0c059d7c7baf3bc4fc782e9aedf2deba7fb20ad12a886c53945d3cdb019afa8b0d58ed307d55f556acf79ec89012d5", + "wx" : "568426540e19be6404e6cb4745fc7a943c0c059d7c7baf3bc4fc782e9aedf2de", + "wy" : "00ba7fb20ad12a886c53945d3cdb019afa8b0d58ed307d55f556acf79ec89012d5" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004568426540e19be6404e6cb4745fc7a943c0c059d7c7baf3bc4fc782e9aedf2deba7fb20ad12a886c53945d3cdb019afa8b0d58ed307d55f556acf79ec89012d5", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEVoQmVA4ZvmQE5stHRfx6lDwMBZ18\ne687xPx4Lprt8t66f7IK0SqIbFOUXTzbAZr6iw1Y7TB9VfVWrPeeyJAS1Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 499, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02203fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192aa", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "041bebc1a6823107d1263219e36d2ec1957d20b0b450b481c9de46ea9294d48b6672b7a811af9528e61199f4a2a7f30d8685f5a04767b59276e65a732e8f3950a1", + "wx" : "1bebc1a6823107d1263219e36d2ec1957d20b0b450b481c9de46ea9294d48b66", + "wy" : "72b7a811af9528e61199f4a2a7f30d8685f5a04767b59276e65a732e8f3950a1" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200041bebc1a6823107d1263219e36d2ec1957d20b0b450b481c9de46ea9294d48b6672b7a811af9528e61199f4a2a7f30d8685f5a04767b59276e65a732e8f3950a1", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEG+vBpoIxB9EmMhnjbS7BlX0gsLRQ\ntIHJ3kbqkpTUi2Zyt6gRr5Uo5hGZ9KKn8w2GhfWgR2e1knbmWnMujzlQoQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 500, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02205d8ecd64a4eeba466815ddf3a4de9a8e6abd9c5db0a01eb80343553da648428f", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0408a2b7fa625f09106a1a8d98f831e53d918fb330d6c388a7b80df98bb9e9c934478da818b4d94082517fa9635a8aa5be05323de604fcfa97bc3a1a57a5e80c34", + "wx" : "08a2b7fa625f09106a1a8d98f831e53d918fb330d6c388a7b80df98bb9e9c934", + "wy" : "478da818b4d94082517fa9635a8aa5be05323de604fcfa97bc3a1a57a5e80c34" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000408a2b7fa625f09106a1a8d98f831e53d918fb330d6c388a7b80df98bb9e9c934478da818b4d94082517fa9635a8aa5be05323de604fcfa97bc3a1a57a5e80c34", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECKK3+mJfCRBqGo2Y+DHlPZGPszDW\nw4inuA35i7npyTRHjagYtNlAglF/qWNaiqW+BTI95gT8+pe8OhpXpegMNA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 501, + "comment" : "point duplication during verification", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "304502206f2347cab7dd76858fe0555ac3bc99048c4aacafdfb6bcbe05ea6c42c4934569022100ae36701f241f6073608b5f77d9039a9aec44aa5a12a99227fd2911b001915de2", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0408a2b7fa625f09106a1a8d98f831e53d918fb330d6c388a7b80df98bb9e9c934b87257e64b26bf7eae80569ca5755a41facdc21afb03056843c5e5a85a17f3cb", + "wx" : "08a2b7fa625f09106a1a8d98f831e53d918fb330d6c388a7b80df98bb9e9c934", + "wy" : "00b87257e64b26bf7eae80569ca5755a41facdc21afb03056843c5e5a85a17f3cb" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000408a2b7fa625f09106a1a8d98f831e53d918fb330d6c388a7b80df98bb9e9c934b87257e64b26bf7eae80569ca5755a41facdc21afb03056843c5e5a85a17f3cb", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECKK3+mJfCRBqGo2Y+DHlPZGPszDW\nw4inuA35i7npyTS4clfmSya/fq6AVpyldVpB+s3CGvsDBWhDxeWoWhfzyw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 502, + "comment" : "duplication bug", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "304502206f2347cab7dd76858fe0555ac3bc99048c4aacafdfb6bcbe05ea6c42c4934569022100ae36701f241f6073608b5f77d9039a9aec44aa5a12a99227fd2911b001915de2", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0469aac6897b0457e54cac25f24590be255d352a20055004e7caa7cbb430b3c90f9113bffe220db9143e38514da0481df67f1717c58aab1a189fb9d4f6e53c3900", + "wx" : "69aac6897b0457e54cac25f24590be255d352a20055004e7caa7cbb430b3c90f", + "wy" : "009113bffe220db9143e38514da0481df67f1717c58aab1a189fb9d4f6e53c3900" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000469aac6897b0457e54cac25f24590be255d352a20055004e7caa7cbb430b3c90f9113bffe220db9143e38514da0481df67f1717c58aab1a189fb9d4f6e53c3900", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaarGiXsEV+VMrCXyRZC+JV01KiAF\nUATnyqfLtDCzyQ+RE7/+Ig25FD44UU2gSB32fxcXxYqrGhifudT25Tw5AA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 503, + "comment" : "point with x-coordinate 0", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30250201010220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04449ff6ddbec4bf9bcc3149b8dfe480f9a677c3b8e203d272f3e0a2cf90a2cea787fcbc0799a9323da3f7fddb4818b89b1d97b32b962e1b3edad2fbed47b58d41", + "wx" : "449ff6ddbec4bf9bcc3149b8dfe480f9a677c3b8e203d272f3e0a2cf90a2cea7", + "wy" : "0087fcbc0799a9323da3f7fddb4818b89b1d97b32b962e1b3edad2fbed47b58d41" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004449ff6ddbec4bf9bcc3149b8dfe480f9a677c3b8e203d272f3e0a2cf90a2cea787fcbc0799a9323da3f7fddb4818b89b1d97b32b962e1b3edad2fbed47b58d41", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAERJ/23b7Ev5vMMUm43+SA+aZ3w7ji\nA9Jy8+Ciz5CizqeH/LwHmakyPaP3/dtIGLibHZezK5YuGz7a0vvtR7WNQQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 504, + "comment" : "point with x-coordinate 0", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022101000000000000000000000000000000000000000000000000000000000000000002203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aa9", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04b282b1b5bc00c2bb18f28ce678e1cd48c8ced8335af5d8e4abd3d7a7d3616f563d47a55ddc11e966fde2bd87b028e62fc8133def824e3e00528f2442908fe84c", + "wx" : "00b282b1b5bc00c2bb18f28ce678e1cd48c8ced8335af5d8e4abd3d7a7d3616f56", + "wy" : "3d47a55ddc11e966fde2bd87b028e62fc8133def824e3e00528f2442908fe84c" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b282b1b5bc00c2bb18f28ce678e1cd48c8ced8335af5d8e4abd3d7a7d3616f563d47a55ddc11e966fde2bd87b028e62fc8133def824e3e00528f2442908fe84c", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEsoKxtbwAwrsY8ozmeOHNSMjO2DNa\n9djkq9PXp9Nhb1Y9R6Vd3BHpZv3ivYewKOYvyBM974JOPgBSjyRCkI/oTA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 505, + "comment" : "comparison with point at infinity ", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aa9", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04facbd6f5e996284a53cb1ca41ffc4eb0a3fd73b73c730194011169b9ada14519c5491ede60614d823b491198df7bc6c6768e064e0e43b7f053ab8f279cd4f4ec", + "wx" : "00facbd6f5e996284a53cb1ca41ffc4eb0a3fd73b73c730194011169b9ada14519", + "wy" : "00c5491ede60614d823b491198df7bc6c6768e064e0e43b7f053ab8f279cd4f4ec" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004facbd6f5e996284a53cb1ca41ffc4eb0a3fd73b73c730194011169b9ada14519c5491ede60614d823b491198df7bc6c6768e064e0e43b7f053ab8f279cd4f4ec", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+svW9emWKEpTyxykH/xOsKP9c7c8\ncwGUARFpua2hRRnFSR7eYGFNgjtJEZjfe8bGdo4GTg5Dt/BTq48nnNT07A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 506, + "comment" : "extreme value for k and edgecase s", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc476699780220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04a011801d52a75f4841e40240da49dda8f38e868b4e6f941f77ca9b86665ad5a74751eabf00fc2a7a863fec366975edbcd4885693022cd755c0d8936e660d61db", + "wx" : "00a011801d52a75f4841e40240da49dda8f38e868b4e6f941f77ca9b86665ad5a7", + "wy" : "4751eabf00fc2a7a863fec366975edbcd4885693022cd755c0d8936e660d61db" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a011801d52a75f4841e40240da49dda8f38e868b4e6f941f77ca9b86665ad5a74751eabf00fc2a7a863fec366975edbcd4885693022cd755c0d8936e660d61db", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEoBGAHVKnX0hB5AJA2kndqPOOhotO\nb5Qfd8qbhmZa1adHUeq/APwqeoY/7DZpde281IhWkwIs11XA2JNuZg1h2w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 507, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022100b6db6db6249249254924924924924924625bd7a09bec4ca81bcdd9f8fd6b63cc", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04fdfa5d35e42ef91b1842c9f28aeb6c68bd7732935f748168deb718e66608b980d6f85fa678df3cabb55b5002e63b55d7cae11e89f74940b7990a3b167dfa191b", + "wx" : "00fdfa5d35e42ef91b1842c9f28aeb6c68bd7732935f748168deb718e66608b980", + "wy" : "00d6f85fa678df3cabb55b5002e63b55d7cae11e89f74940b7990a3b167dfa191b" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004fdfa5d35e42ef91b1842c9f28aeb6c68bd7732935f748168deb718e66608b980d6f85fa678df3cabb55b5002e63b55d7cae11e89f74940b7990a3b167dfa191b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/fpdNeQu+RsYQsnyiutsaL13MpNf\ndIFo3rcY5mYIuYDW+F+meN88q7VbUALmO1XXyuEeifdJQLeZCjsWffoZGw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 508, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022100cccccccc00000000cccccccccccccccc971f2ef152794b9d8fc7d568c9e8eaa7", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "040754de71bd21f14f4927bdab77efc57f148b36275c305a86c1d7a0dcfd53bab4989fc99bc725da84197c2f284ecc6030489eda77ef92f8680130622b631af2b3", + "wx" : "0754de71bd21f14f4927bdab77efc57f148b36275c305a86c1d7a0dcfd53bab4", + "wy" : "00989fc99bc725da84197c2f284ecc6030489eda77ef92f8680130622b631af2b3" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040754de71bd21f14f4927bdab77efc57f148b36275c305a86c1d7a0dcfd53bab4989fc99bc725da84197c2f284ecc6030489eda77ef92f8680130622b631af2b3", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEB1Tecb0h8U9JJ72rd+/FfxSLNidc\nMFqGwdeg3P1TurSYn8mbxyXahBl8LyhOzGAwSJ7ad++S+GgBMGIrYxrysw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 509, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc4766997802203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aaa", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "048aad84fd5d52afd531f1068fb7a10bb365faefa89975597187470d04a8c9c8b327258e32d19cd58ddfd35bd7ea1f063c77c61b7879451bdd3e8f44cbf40241a2", + "wx" : "008aad84fd5d52afd531f1068fb7a10bb365faefa89975597187470d04a8c9c8b3", + "wy" : "27258e32d19cd58ddfd35bd7ea1f063c77c61b7879451bdd3e8f44cbf40241a2" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048aad84fd5d52afd531f1068fb7a10bb365faefa89975597187470d04a8c9c8b327258e32d19cd58ddfd35bd7ea1f063c77c61b7879451bdd3e8f44cbf40241a2", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEiq2E/V1Sr9Ux8QaPt6ELs2X676iZ\ndVlxh0cNBKjJyLMnJY4y0ZzVjd/TW9fqHwY8d8YbeHlFG90+j0TL9AJBog==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 510, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022049249248db6db6dbb6db6db6db6db6db5a8b230d0b2b51dcd7ebf0c9fef7c185", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04b4a01ec7b10acff3dace05222fae05c75368a375d8ce1faf4a1b2def1ab715ab61a6642e82ff950f373ace5c0cc298639ab9ae739e4614a93fb1122ee16d922f", + "wx" : "00b4a01ec7b10acff3dace05222fae05c75368a375d8ce1faf4a1b2def1ab715ab", + "wy" : "61a6642e82ff950f373ace5c0cc298639ab9ae739e4614a93fb1122ee16d922f" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b4a01ec7b10acff3dace05222fae05c75368a375d8ce1faf4a1b2def1ab715ab61a6642e82ff950f373ace5c0cc298639ab9ae739e4614a93fb1122ee16d922f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEtKAex7EKz/PazgUiL64Fx1Noo3XY\nzh+vShst7xq3FathpmQugv+VDzc6zlwMwphjmrmuc55GFKk/sRIu4W2SLw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 511, + "comment" : "extreme value for k", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022016a4502e2781e11ac82cbc9d1edd8c981584d13e18411e2f6e0478c34416e3bb", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "044efc2bef42b11e0929edca3b025f01b1fa37aceef4cd3e8c2d4beab500856af87716828fc1788c881ae39f534c3e270ca869a578210b5dad8a8938691d0c4b73", + "wx" : "4efc2bef42b11e0929edca3b025f01b1fa37aceef4cd3e8c2d4beab500856af8", + "wy" : "7716828fc1788c881ae39f534c3e270ca869a578210b5dad8a8938691d0c4b73" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044efc2bef42b11e0929edca3b025f01b1fa37aceef4cd3e8c2d4beab500856af87716828fc1788c881ae39f534c3e270ca869a578210b5dad8a8938691d0c4b73", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETvwr70KxHgkp7co7Al8Bsfo3rO70\nzT6MLUvqtQCFavh3FoKPwXiMiBrjn1NMPicMqGmleCELXa2KiThpHQxLcw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 512, + "comment" : "extreme value for k and edgecase s", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2960220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "044606b9fceecc47babcc78de73ca55672f09930aacd560db0a2967a99ef8a595e612a050025785c0e7c7763db0bb53c48b6ff0ed1dfb6055df90299e295092990", + "wx" : "4606b9fceecc47babcc78de73ca55672f09930aacd560db0a2967a99ef8a595e", + "wy" : "612a050025785c0e7c7763db0bb53c48b6ff0ed1dfb6055df90299e295092990" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044606b9fceecc47babcc78de73ca55672f09930aacd560db0a2967a99ef8a595e612a050025785c0e7c7763db0bb53c48b6ff0ed1dfb6055df90299e295092990", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAERga5/O7MR7q8x43nPKVWcvCZMKrN\nVg2wopZ6me+KWV5hKgUAJXhcDnx3Y9sLtTxItv8O0d+2BV35ApnilQkpkA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 513, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022100b6db6db6249249254924924924924924625bd7a09bec4ca81bcdd9f8fd6b63cc", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04b6de6de267720d16bccf71fdbe07ebe5c1149f8cfb2041b1d6cabbc9b6656d682d3e21f4025ddcacab035b5da6310361102079f1b40c1ef7c7b88427694c11c6", + "wx" : "00b6de6de267720d16bccf71fdbe07ebe5c1149f8cfb2041b1d6cabbc9b6656d68", + "wy" : "2d3e21f4025ddcacab035b5da6310361102079f1b40c1ef7c7b88427694c11c6" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b6de6de267720d16bccf71fdbe07ebe5c1149f8cfb2041b1d6cabbc9b6656d682d3e21f4025ddcacab035b5da6310361102079f1b40c1ef7c7b88427694c11c6", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEtt5t4mdyDRa8z3H9vgfr5cEUn4z7\nIEGx1sq7ybZlbWgtPiH0Al3crKsDW12mMQNhECB58bQMHvfHuIQnaUwRxg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 514, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022100cccccccc00000000cccccccccccccccc971f2ef152794b9d8fc7d568c9e8eaa7", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04efd3bd1299d4b2bb0afbce2afd90792d8c72e1d29c6092e4681540420664e275390a4dbb20d10f7360c5b794564dcd443bb1df94bf6b1f4be5909a22a6a534ba", + "wx" : "00efd3bd1299d4b2bb0afbce2afd90792d8c72e1d29c6092e4681540420664e275", + "wy" : "390a4dbb20d10f7360c5b794564dcd443bb1df94bf6b1f4be5909a22a6a534ba" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004efd3bd1299d4b2bb0afbce2afd90792d8c72e1d29c6092e4681540420664e275390a4dbb20d10f7360c5b794564dcd443bb1df94bf6b1f4be5909a22a6a534ba", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE79O9EpnUsrsK+84q/ZB5LYxy4dKc\nYJLkaBVAQgZk4nU5Ck27INEPc2DFt5RWTc1EO7HflL9rH0vlkJoipqU0ug==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 515, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29602203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aaa", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04dae9cf165867da6482ede84bfc5b94375529bcb953f26d0cd68fc877088f78d951cadc9f61c55f8e2a04dbaae1251fd15cb12df9bcd072a51971127eaa6ce612", + "wx" : "00dae9cf165867da6482ede84bfc5b94375529bcb953f26d0cd68fc877088f78d9", + "wy" : "51cadc9f61c55f8e2a04dbaae1251fd15cb12df9bcd072a51971127eaa6ce612" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004dae9cf165867da6482ede84bfc5b94375529bcb953f26d0cd68fc877088f78d951cadc9f61c55f8e2a04dbaae1251fd15cb12df9bcd072a51971127eaa6ce612", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE2unPFlhn2mSC7ehL/FuUN1UpvLlT\n8m0M1o/IdwiPeNlRytyfYcVfjioE26rhJR/RXLEt+bzQcqUZcRJ+qmzmEg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 516, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022049249248db6db6dbb6db6db6db6db6db5a8b230d0b2b51dcd7ebf0c9fef7c185", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "048418924e94161d350c9fe8dc1cc087de4b4491d0bc694a6862df4e8a555f9afbb0b391af97b0dacbdceb7a982781d0090978efbf76b8e6914250e92ade9a6126", + "wx" : "008418924e94161d350c9fe8dc1cc087de4b4491d0bc694a6862df4e8a555f9afb", + "wy" : "00b0b391af97b0dacbdceb7a982781d0090978efbf76b8e6914250e92ade9a6126" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048418924e94161d350c9fe8dc1cc087de4b4491d0bc694a6862df4e8a555f9afbb0b391af97b0dacbdceb7a982781d0090978efbf76b8e6914250e92ade9a6126", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhBiSTpQWHTUMn+jcHMCH3ktEkdC8\naUpoYt9OilVfmvuws5Gvl7Day9zrepgngdAJCXjvv3a45pFCUOkq3pphJg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 517, + "comment" : "extreme value for k", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022016a4502e2781e11ac82cbc9d1edd8c981584d13e18411e2f6e0478c34416e3bb", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5", + "wx" : "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", + "wy" : "4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaxfR8uEsQkf4vOblY6RA8ncDfYEt\n6zOg9KE5RdiYwpZP40Li/hp/m47n60p8D54WK84zV2sxXs7LtkBoN79R9Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 518, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "30440220342dae751a63a3ca8189cf342b3b34eaaa2565e2c7e26121c1bfd5435447f1c30220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2", + "result" : "invalid" + }, + { + "tcId" : 519, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3045022100cbd25189e59c5c367e7630cbd4c4cb1512c194cadf353d6331f9f57fa81b338e0220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a", + "wx" : "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", + "wy" : "00b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaxfR8uEsQkf4vOblY6RA8ncDfYEt\n6zOg9KE5RdiYwpawHL0cAeWAZXEYFLWD8GHp1DHMqZTOoTE0Sb+XyECuCg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 520, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "30440220342dae751a63a3ca8189cf342b3b34eaaa2565e2c7e26121c1bfd5435447f1c30220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2", + "result" : "invalid" + }, + { + "tcId" : 521, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3045022100cbd25189e59c5c367e7630cbd4c4cb1512c194cadf353d6331f9f57fa81b338e0220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "044f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685", + "wx" : "4f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000", + "wy" : "00ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETzN8z9Z3JqgF5PFgCuKEnfOAfsoR\nc4Ajn72BaQAAAADtneoSTMjDlkFkEemIww9CfrUEr0OjFGzV336mBmbWhQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 522, + "comment" : "x-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100ef9a4672e0a07a0efd5936a77f4ea0fcd69dae6fd95ccba8dcb685e7490623c3022100cf135d42f5e379f6ef94b6a493db01c740f441ff5b2475638b6b081f445b17e2", + "result" : "valid" + }, + { + "tcId" : 523, + "comment" : "x-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100b8cb05b278c15df7c6a311b0ce7bb5598fe3a95fdb57683ac0821aa2f5d6fa18022100a9dfa1cc0c9ae0015ae2485f22ed6b0925e82d96ff695b8c2ed593f02719f30e", + "result" : "valid" + }, + { + "tcId" : 524, + "comment" : "x-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502202fe6f2aaed0eb760223e8c580363630d3041614806e7fbc863405aa4d98825ee022100f5d2c396e45d9af9fe1b06b27f0db4d9ee66e1855f4846dae5db6b3d8afbc4f8", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f49726500493584fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000", + "wx" : "3cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f497265004935", + "wy" : "0084fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f49726500493584fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPPA9YU2JOc/UmaB4c/rCgWGPBrj/\nh+gBXD9JcmUASTWE+hdNeRxyvyzjiAqJYN0qfHoTOKgvhanlnNvegAAAAA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 525, + "comment" : "y-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100fb9e312ced9f95c91248bae25056b7bbd84a05fc92acbd304269a1269bbf4f4c022100f31426a809ceebb369278a5182bce94835f066cab8654f8bd2339595844244db", + "result" : "valid" + }, + { + "tcId" : 526, + "comment" : "y-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30440220284fe5f1c86a55fcb3c27a12d82d794eab9a0d76d1fdc4f25df5a9bf52e8e76802207aaa75e5a7948be66f06ce52fc3e4916fc93514b08c51f84b73839d2c05acf58", + "result" : "valid" + }, + { + "tcId" : 527, + "comment" : "y-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022100812950449ab90351ab0f124774a2633625d0871d42a69d2e473d8ac118b506a6022050c98878c3699c34f3049e6f9496e3199fb5d860232995205f1761c000af4e07", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f4972650049357b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff", + "wx" : "3cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f497265004935", + "wy" : "7b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f4972650049357b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPPA9YU2JOc/UmaB4c/rCgWGPBrj/\nh+gBXD9JcmUASTV7BeixhuONQdMcd/V2nyLVg4XsyFfQelYaYyQhf////w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 528, + "comment" : "y-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100eaa4f3a8805c60cff74cec78c6b7cea71ef116c333612a6e0096a4c42450936b022100fbb3508d6692b8e0854c1a1749ea065262bae7c8b831ece895a1eeda01cebe7d", + "result" : "valid" + }, + { + "tcId" : 529, + "comment" : "y-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502203d0caca44c21d34cfdcfb00098c95203e08847f4aabab5ae6ea7f365aefbbcf8022100bb99be729e51cfd167dad22182383314c9d85432309cbe36f4b1eb73e776b249", + "result" : "valid" + }, + { + "tcId" : 530, + "comment" : "y-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022100e4f8b27c3c2c5cb2a6cb9c2049011dd1060085c6e2a15380bcf5224063d3ae0802204b3a19f1be945cd649f34d965e7eecac0a05ac8030b7cd2d6bed84086fda567e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffffa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e", + "wx" : "2829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffff", + "wy" : "00a01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffffa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKCnDH6ouQA40TtlLyj/NBUWVbrz+\nitD236X/jv////+gGq+vAA5SWFhVr6dnat4oQRMJkFLfV+frO9N+vrkiLg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 531, + "comment" : "x-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30440220670ce60d0fc7224c8d06f3b01c4416ee0b3ac12f0cff3e1ad214898389ebc819022045da7b6fc8f4f766f82c5132735f2ed94130780b444e2e10c1484d5e45f64332", + "result" : "valid" + }, + { + "tcId" : 532, + "comment" : "x-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100a22928b3022fd554670a86ed519a48d8448dc90856e9c40589076baff591e076022100b4005a89aef027e5063a89709fbc66a05eb12d8d34af84f35ea7ac93f7bbd40e", + "result" : "valid" + }, + { + "tcId" : 533, + "comment" : "x-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100a277181e641edafbdb359801605791c833ff3b462dac3c4d3608d479c98090ff0221008b2ad68880cede2290a996fe5b7003610c5c9f53e1dcf2cdb2ad815e2ba5c1cf", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f55a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73", + "wx" : "00fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f5", + "wy" : "5a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f55a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE////+UgIHmoEWN2PnnOPJmX/kFmt\naqwHCDGMTKmnpPVairy6LdqEdDEe5UFJuXPK4MD7iVV60L945lKaFmO9cw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 534, + "comment" : "x-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30450220760c487841a7214e9850b5569d99fe3ff9dddc41dee7313a780921d8d3657b16022100b99d63e3cc81458801d5fd5926405d33b894e0f96a85c3c4a929a45c828d76d0", + "result" : "valid" + }, + { + "tcId" : 535, + "comment" : "x-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30450221009b7e72ac454505017c5377b2c379f31a7a0268b739fca4c97dfe1c9aa4bc548e02201e65cbee69a42ab0a7ae50e9acceaa0971574fb604958876ad6316c39eebdd96", + "result" : "valid" + }, + { + "tcId" : 536, + "comment" : "x-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502204a7e44e4a8a9fee22647923eaee0368b3fa408edaa19b406507309b13e073855022100fd8597585fa0270c8cdf855a7a69a843eb28124ecf90ac53a58a847c7b43c7a6", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0400000003fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71", + "wx" : "03fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e", + "wy" : "1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400000003fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAAAAA/oV+WOUnV8DpvXH+G+eABXu\nsjrrv/EXOTe6dI4QmYcgcOjofFVfoTZZzKXX+tz8sAI+qIlUjKSK8rp+cQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 537, + "comment" : "x-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304402204589f0c24d1b2f89c2e806f667297c844c63330d6b9a079b2bdd2d95247e3eae022075daa1da09a3f1ed8de1aacc7039a721c46f9ebcd4672750f2fd9c2f70f1e6ed", + "result" : "valid" + }, + { + "tcId" : 538, + "comment" : "x-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30450220377578a81da586eae269f05c9bb2280a517ab3184e02179aca5d64dee1a930c7022100cc1735efd4b43e8bdba8c1b44f9ec3e62577e5f4f6543051467bacd9eaaa4d4a", + "result" : "valid" + }, + { + "tcId" : 539, + "comment" : "x-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502207f722716c279f3d14563fbd8cbf3abcd51c3305795609e04c8ed7ede12ae25180221008a996a370679c3ce6232244d64481e96e47bf6611aa5490000c0b1dffc231aa1", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015000000001352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2", + "wx" : "00bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015", + "wy" : "1352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015000000001352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvLspFMefBF6qbsu8YSgWs75dLWeW\ncH2BJen4UcGK8BUAAAAAE1K7Sg+i6kzOuatj3WhK3loRJ7zzAKaYpxk7wg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 540, + "comment" : "y-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304402202f11d967790dd4387a218929b3fc0f130238ec6fd9321348fe631a1e607bd74202203b52a42606d0daa135092d89ab74b3c4e72b4ed213137406d4b50fa84c4ea049", + "result" : "valid" + }, + { + "tcId" : 541, + "comment" : "y-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30440220192d299e96272a0c49ed1b15f9047b54b4878eaf350a7b2f5439b1e3c83f9703022026513e9cbbaca7946f3d6d90b5cc65a985cdfe089734f944ab74842a4dc4127d", + "result" : "valid" + }, + { + "tcId" : 542, + "comment" : "y-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100ebd7a6f1450f8bb9e9abf9f66c4143d28c8c845b2e260ab0fff3f7ba5837f9440221009928afe57df6b8c90b7af7c3da981b71db6ae3a5a21a4c5a48b71628e5811a9e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d", + "wx" : "00bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015", + "wy" : "00fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvLspFMefBF6qbsu8YSgWs75dLWeW\ncH2BJen4UcGK8BX////+7K1EtvBdFbMxRlScIpe1IqXu2EMM/1lnWObEPQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 543, + "comment" : "y-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3044022037fd00b14ff469a8bb4d2f9c6ca228c4c24b85719389a46099653c41174e9afd02205f64dc68893cf3186df3e83af70e96e9f2103d25b8ddffecda96e8e9181619cf", + "result" : "valid" + }, + { + "tcId" : 544, + "comment" : "y-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502203ce339a63ea4cc1a6b12d1e66b91205e8af530eebe3208359c5327b242b2b669022100f2b1d6dae62bfe9c44b1cbd56cf0de865a1201c0486d658da5fc029ad47b917e", + "result" : "valid" + }, + { + "tcId" : 545, + "comment" : "y-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502207bf225bec33ce7fb4014097e350c1504d3374028cda8f6fbbac4e0fa5319a048022100aaa45d54eba6bb3ce00ce8e63de24dc7ee19069062e8d340663adcac07f097cd", + "result" : "valid" + } + ] + } + ] +} diff --git a/packages/crypto/testdata/wycheproof/ecdsa_secp256r1_sha512_test.json b/packages/crypto/testdata/wycheproof/ecdsa_secp256r1_sha512_test.json new file mode 100644 index 0000000000..c168f4be1a --- /dev/null +++ b/packages/crypto/testdata/wycheproof/ecdsa_secp256r1_sha512_test.json @@ -0,0 +1,7206 @@ +{ + "algorithm" : "ECDSA", + "schema" : "ecdsa_verify_schema.json", + "generatorVersion" : "0.9rc5", + "numberOfTests" : 541, + "header" : [ + "Test vectors of type EcdsaVerify are meant for the verification", + "of ASN encoded ECDSA signatures." + ], + "notes" : { + "ArithmeticError" : { + "bugType" : "EDGE_CASE", + "description" : "Some implementations of ECDSA have arithmetic errors that occur when intermediate results have extreme values. This test vector has been constructed to test such occurences.", + "cves" : [ + "CVE-2017-18146" + ] + }, + "BerEncodedSignature" : { + "bugType" : "BER_ENCODING", + "description" : "ECDSA signatures are usually DER encoded. This signature contains valid values for r and s, but it uses alternative BER encoding.", + "effect" : "Accepting alternative BER encodings may be benign in some cases, or be an issue if protocol requires signature malleability.", + "cves" : [ + "CVE-2020-14966", + "CVE-2020-13822", + "CVE-2019-14859", + "CVE-2016-1000342" + ] + }, + "EdgeCasePublicKey" : { + "bugType" : "EDGE_CASE", + "description" : "The test vector uses a special case public key. " + }, + "EdgeCaseShamirMultiplication" : { + "bugType" : "EDGE_CASE", + "description" : "Shamir proposed a fast method for computing the sum of two scalar multiplications efficiently. This test vector has been constructed so that an intermediate result is the point at infinity if Shamir's method is used." + }, + "IntegerOverflow" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an r and s that has been modified, so that the original value is restored if the implementation ignores the most significant bits.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "InvalidEncoding" : { + "bugType" : "CAN_OF_WORMS", + "description" : "ECDSA signatures are encoded using ASN.1. This test vector contains an incorrectly encoded signature. The test vector itself was generated from a valid signature by modifying its encoding.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "InvalidSignature" : { + "bugType" : "AUTH_BYPASS", + "description" : "The signature contains special case values such as r=0 and s=0. Buggy implementations may accept such values, if the implementation does not check boundaries and computes s^(-1) == 0.", + "effect" : "Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.", + "cves" : [ + "CVE-2022-21449", + "CVE-2021-43572", + "CVE-2022-24884" + ] + }, + "InvalidTypesInSignature" : { + "bugType" : "AUTH_BYPASS", + "description" : "The signature contains invalid types. Dynamic typed languages sometime coerce such values of different types into integers. If an implementation is careless and has additional bugs, such as not checking integer boundaries then it may be possible that such signatures are accepted.", + "effect" : "Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.", + "cves" : [ + "CVE-2022-21449" + ] + }, + "MissingZero" : { + "bugType" : "LEGACY", + "description" : "Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.", + "effect" : "While signatures are more malleable if such signatures are accepted, this typically leads to no vulnerability, since a badly encoded signature can be reencoded correctly." + }, + "ModifiedInteger" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an r and s that has been modified. The goal is to check for arithmetic errors.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "ModifiedSignature" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an invalid signature that was generated from a valid signature by modifying it.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "ModularInverse" : { + "bugType" : "EDGE_CASE", + "description" : "The test vectors contains a signature where computing the modular inverse of s hits an edge case.", + "effect" : "While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.", + "cves" : [ + "CVE-2019-0865" + ] + }, + "PointDuplication" : { + "bugType" : "EDGE_CASE", + "description" : "Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission.", + "cves" : [ + "2020-12607", + "CVE-2015-2730" + ] + }, + "RangeCheck" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an r and s that has been modified. By adding or subtracting the order of the group (or other values) the test vector checks whether signature verification verifies the range of r and s.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "SmallRandS" : { + "bugType" : "EDGE_CASE", + "description" : "The test vectors contains a signature where both r and s are small integers. Some libraries cannot verify such signatures.", + "effect" : "While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.", + "cves" : [ + "2020-13895" + ] + }, + "SpecialCaseHash" : { + "bugType" : "EDGE_CASE", + "description" : "The test vector contains a signature where the hash of the message is a special case, e.g., contains a long run of 0 or 1 bits." + }, + "Untruncatedhash" : { + "bugType" : "MISSING_STEP", + "description" : "If the size of the digest is longer than the size of the underlying order of the multiplicative subgroup then the hash digest must be truncated during signature generation and verification. This test vector contains a signature where this step has been omitted." + }, + "ValidSignature" : { + "bugType" : "BASIC", + "description" : "The test vector contains a valid signature that was generated pseudorandomly. Such signatures should not fail to verify unless some of the parameters (e.g. curve or hash function) are not supported." + } + }, + "testGroups" : [ + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0404aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad587d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d", + "wx" : "04aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad5", + "wy" : "0087d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000404aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad587d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEBKrsc2NXJvIT+4qeZNo7hjLkFJWp\nRNAEW1IuunJA+tWH2TFXmKqjpboBd1eHztBeqve04J/IHW0apUboNl1SXQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 1, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "", + "sig" : "30440220093f3825c0cf820cced816a3a67446c85606a6d529e43857643fccc11e1f705f0220769782888c63058630f97a5891c8700e82979e4f233586bfc5042fa73cb70a4e", + "result" : "valid" + }, + { + "tcId" : 2, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "4d7367", + "sig" : "3046022100e8564e3e515a09f9f35258442b99e162d27e10975fcb7963d3c26319dc093f84022100c3af01ed0fd0148749ca323364846c862fc6f4beb682b7ead3b2d89b9da8bad4", + "result" : "valid" + }, + { + "tcId" : 3, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "313233343030", + "sig" : "304502201412254f8c1dd2742a00ddee5192e7baa288741026871f3057ad9f983b5ab114022100bcdf878fa156f37040922698ad6fb6928601ddc26c40448ea660e67c25eda090", + "result" : "valid" + }, + { + "tcId" : 4, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "0000000000000000000000000000000000000000", + "sig" : "30450221009e0676048381839bb0a4703a0ae38facfe1e2c61bd25950c896aa975cd6ec86902206ea0cedf96f11fff0e746941183492f4d17272c92449afd20e34041a6894ee82", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", + "wx" : "2927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838", + "wy" : "00c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKSexBRK64+3c/kZ4KBKLrSkDJpkZ\n9whgacjE32xzKDjHeHlk6qwA5ZIfsUmKYPRgZ2az2WhQAVWNGpdOc0FRPg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 5, + "comment" : "signature malleability", + "flags" : [ + "ValidSignature" + ], + "msg" : "313233343030", + "sig" : "304402202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c002205f85a63a5be977ad714cea16b10035f07cadf7513ae8cca86f35b7692aafd69f", + "result" : "valid" + }, + { + "tcId" : 6, + "comment" : "Legacy: ASN encoding of s misses leading 0", + "flags" : [ + "MissingZero" + ], + "msg" : "313233343030", + "sig" : "304402202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00220a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 7, + "comment" : "valid", + "flags" : [ + "ValidSignature" + ], + "msg" : "313233343030", + "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "valid" + }, + { + "tcId" : 8, + "comment" : "length of sequence [r, s] uses long form encoding", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "30814502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 9, + "comment" : "length of sequence [r, s] contains a leading 0", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "3082004502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 10, + "comment" : "length of sequence [r, s] uses 70 instead of 69", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304602202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 11, + "comment" : "length of sequence [r, s] uses 68 instead of 69", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304402202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 12, + "comment" : "uint32 overflow in length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3085010000004502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 13, + "comment" : "uint64 overflow in length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308901000000000000004502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 14, + "comment" : "length of sequence [r, s] = 2**31 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30847fffffff02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 15, + "comment" : "length of sequence [r, s] = 2**31", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30848000000002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 16, + "comment" : "length of sequence [r, s] = 2**32 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3084ffffffff02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 17, + "comment" : "length of sequence [r, s] = 2**40 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3085ffffffffff02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 18, + "comment" : "length of sequence [r, s] = 2**64 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3088ffffffffffffffff02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 19, + "comment" : "incorrect length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30ff02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 20, + "comment" : "replaced sequence [r, s] by an indefinite length tag without termination", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 21, + "comment" : "removing sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "", + "result" : "invalid" + }, + { + "tcId" : 22, + "comment" : "lonely sequence tag", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30", + "result" : "invalid" + }, + { + "tcId" : 23, + "comment" : "appending 0's to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000", + "result" : "invalid" + }, + { + "tcId" : 24, + "comment" : "prepending 0's to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047000002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 25, + "comment" : "appending unused 0's to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000", + "result" : "invalid" + }, + { + "tcId" : 26, + "comment" : "appending null value to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20500", + "result" : "invalid" + }, + { + "tcId" : 27, + "comment" : "prepending garbage to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a498177304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 28, + "comment" : "prepending garbage to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30492500304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 29, + "comment" : "appending garbage to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3047304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20004deadbeef", + "result" : "invalid" + }, + { + "tcId" : 30, + "comment" : "including undefined tags", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304daa00bb00cd00304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 31, + "comment" : "including undefined tags", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d2228aa00bb00cd0002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 32, + "comment" : "including undefined tags", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c02229aa00bb00cd00022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 33, + "comment" : "truncated length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3081", + "result" : "invalid" + }, + { + "tcId" : 34, + "comment" : "including undefined tags to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304baa02aabb304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 35, + "comment" : "using composition with indefinite length for sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3080304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000", + "result" : "invalid" + }, + { + "tcId" : 36, + "comment" : "using composition with wrong tag for sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3080314502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000", + "result" : "invalid" + }, + { + "tcId" : 37, + "comment" : "Replacing sequence [r, s] with NULL", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "0500", + "result" : "invalid" + }, + { + "tcId" : 38, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "2e4502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 39, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "2f4502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 40, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "314502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 41, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "324502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 42, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "ff4502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 43, + "comment" : "dropping value of sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3000", + "result" : "invalid" + }, + { + "tcId" : 44, + "comment" : "using composition for sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30493001023044202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 45, + "comment" : "truncated sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304402202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34e", + "result" : "invalid" + }, + { + "tcId" : 46, + "comment" : "truncated sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3044202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 47, + "comment" : "sequence [r, s] of size 4166 to check for overflows", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3082104602202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 48, + "comment" : "indefinite length", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "308002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000", + "result" : "invalid" + }, + { + "tcId" : 49, + "comment" : "indefinite length with truncated delimiter", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb200", + "result" : "invalid" + }, + { + "tcId" : 50, + "comment" : "indefinite length with additional element", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "308002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb205000000", + "result" : "invalid" + }, + { + "tcId" : 51, + "comment" : "indefinite length with truncated element", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2060811220000", + "result" : "invalid" + }, + { + "tcId" : 52, + "comment" : "indefinite length with garbage", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000fe02beef", + "result" : "invalid" + }, + { + "tcId" : 53, + "comment" : "indefinite length with nonempty EOC", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20002beef", + "result" : "invalid" + }, + { + "tcId" : 54, + "comment" : "prepend empty sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047300002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 55, + "comment" : "append empty sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb23000", + "result" : "invalid" + }, + { + "tcId" : 56, + "comment" : "append zero", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304802202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2020100", + "result" : "invalid" + }, + { + "tcId" : 57, + "comment" : "append garbage with high tag number", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304802202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2bf7f00", + "result" : "invalid" + }, + { + "tcId" : 58, + "comment" : "append null with explicit tag", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304902202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2a0020500", + "result" : "invalid" + }, + { + "tcId" : 59, + "comment" : "append null with implicit tag", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2a000", + "result" : "invalid" + }, + { + "tcId" : 60, + "comment" : "sequence of sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 61, + "comment" : "truncated sequence: removed last 1 elements", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "302202202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0", + "result" : "invalid" + }, + { + "tcId" : 62, + "comment" : "repeating element in sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "306802202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 63, + "comment" : "flipped bit 0 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30432478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c1022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 64, + "comment" : "flipped bit 32 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30432478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42a98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 65, + "comment" : "flipped bit 48 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30432478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c67f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 66, + "comment" : "flipped bit 64 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30432478f1d049f6d857ac900a7af1772226a4c59b345fbb90603c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 67, + "comment" : "length of r uses long form encoding", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "30460281202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 68, + "comment" : "length of r contains a leading 0", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "3047028200202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 69, + "comment" : "length of r uses 33 instead of 32", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502212478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 70, + "comment" : "length of r uses 31 instead of 32", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045021f2478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 71, + "comment" : "uint32 overflow in length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a028501000000202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 72, + "comment" : "uint64 overflow in length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304e02890100000000000000202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 73, + "comment" : "length of r = 2**31 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902847fffffff2478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 74, + "comment" : "length of r = 2**31", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30490284800000002478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 75, + "comment" : "length of r = 2**32 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30490284ffffffff2478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 76, + "comment" : "length of r = 2**40 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a0285ffffffffff2478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 77, + "comment" : "length of r = 2**64 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d0288ffffffffffffffff2478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 78, + "comment" : "incorrect length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502ff2478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 79, + "comment" : "replaced r by an indefinite length tag without termination", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502802478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 80, + "comment" : "removing r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3023022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 81, + "comment" : "lonely integer tag", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "302402022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 82, + "comment" : "lonely integer tag", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "302302202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c002", + "result" : "invalid" + }, + { + "tcId" : 83, + "comment" : "appending 0's to r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702222478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00000022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 84, + "comment" : "prepending 0's to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3047022200002478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 85, + "comment" : "appending unused 0's to r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00000022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 86, + "comment" : "appending null value to r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702222478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00500022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 87, + "comment" : "prepending garbage to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a222549817702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 88, + "comment" : "prepending garbage to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30492224250002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 89, + "comment" : "appending garbage to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d222202202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00004deadbeef022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 90, + "comment" : "truncated length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30250281022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 91, + "comment" : "including undefined tags to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304b2226aa02aabb02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 92, + "comment" : "using composition with indefinite length for r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049228002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00000022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 93, + "comment" : "using composition with wrong tag for r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049228003202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00000022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 94, + "comment" : "Replacing r with NULL", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30250500022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 95, + "comment" : "changing tag value of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304500202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 96, + "comment" : "changing tag value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304501202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 97, + "comment" : "changing tag value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304503202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 98, + "comment" : "changing tag value of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304504202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 99, + "comment" : "changing tag value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045ff202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 100, + "comment" : "dropping value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30250200022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 101, + "comment" : "using composition for r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30492224020124021f78f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 102, + "comment" : "modifying first byte of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502202678f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 103, + "comment" : "modifying last byte of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f98140022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 104, + "comment" : "truncated r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3044021f2478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 105, + "comment" : "truncated r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3044021f78f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 106, + "comment" : "r of size 4129 to check for overflows", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30821048028210212478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 107, + "comment" : "leading ff in r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30460221ff2478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 108, + "comment" : "replaced r by infinity", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3026090180022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 109, + "comment" : "replacing r with zero", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 110, + "comment" : "flipped bit 0 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304302202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c000a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb3", + "result" : "invalid" + }, + { + "tcId" : 111, + "comment" : "flipped bit 32 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304302202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c000a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841358d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 112, + "comment" : "flipped bit 48 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304302202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c000a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84851359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 113, + "comment" : "flipped bit 64 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304302202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c000a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dd84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 114, + "comment" : "length of s uses long form encoding", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "304602202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c002812100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 115, + "comment" : "length of s contains a leading 0", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "304702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00282002100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 116, + "comment" : "length of s uses 34 instead of 33", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022200a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 117, + "comment" : "length of s uses 32 instead of 33", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022000a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 118, + "comment" : "uint32 overflow in length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00285010000002100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 119, + "comment" : "uint64 overflow in length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304e02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0028901000000000000002100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 120, + "comment" : "length of s = 2**31 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c002847fffffff00a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 121, + "comment" : "length of s = 2**31", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c002848000000000a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 122, + "comment" : "length of s = 2**32 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00284ffffffff00a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 123, + "comment" : "length of s = 2**40 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00285ffffffffff00a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 124, + "comment" : "length of s = 2**64 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00288ffffffffffffffff00a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 125, + "comment" : "incorrect length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c002ff00a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 126, + "comment" : "replaced s by an indefinite length tag without termination", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0028000a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 127, + "comment" : "appending 0's to s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022300a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000", + "result" : "invalid" + }, + { + "tcId" : 128, + "comment" : "prepending 0's to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00223000000a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 129, + "comment" : "appending null value to s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022300a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20500", + "result" : "invalid" + }, + { + "tcId" : 130, + "comment" : "prepending garbage to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c02226498177022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 131, + "comment" : "prepending garbage to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c022252500022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 132, + "comment" : "appending garbage to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c02223022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20004deadbeef", + "result" : "invalid" + }, + { + "tcId" : 133, + "comment" : "truncated length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "302402202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00281", + "result" : "invalid" + }, + { + "tcId" : 134, + "comment" : "including undefined tags to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304b02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c02227aa02aabb022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 135, + "comment" : "using composition with indefinite length for s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c02280022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000", + "result" : "invalid" + }, + { + "tcId" : 136, + "comment" : "using composition with wrong tag for s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c02280032100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000", + "result" : "invalid" + }, + { + "tcId" : 137, + "comment" : "Replacing s with NULL", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "302402202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00500", + "result" : "invalid" + }, + { + "tcId" : 138, + "comment" : "changing tag value of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0002100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 139, + "comment" : "changing tag value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0012100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 140, + "comment" : "changing tag value of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0032100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 141, + "comment" : "changing tag value of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0042100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 142, + "comment" : "changing tag value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0ff2100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 143, + "comment" : "dropping value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "302402202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00200", + "result" : "invalid" + }, + { + "tcId" : 144, + "comment" : "using composition for s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c022250201000220a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 145, + "comment" : "modifying first byte of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022102a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 146, + "comment" : "modifying last byte of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34e32", + "result" : "invalid" + }, + { + "tcId" : 147, + "comment" : "truncated s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304402202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022000a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34e", + "result" : "invalid" + }, + { + "tcId" : 148, + "comment" : "s of size 4130 to check for overflows", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3082104802202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00282102200a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 149, + "comment" : "leading ff in s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304602202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00222ff00a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 150, + "comment" : "replaced s by infinity", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "302502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0090180", + "result" : "invalid" + }, + { + "tcId" : 151, + "comment" : "replacing s with zero", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "302502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0020100", + "result" : "invalid" + }, + { + "tcId" : 152, + "comment" : "replaced r by r + n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "30460221012478f1cf49f6d858ac900a7af177222661ac95e206d32ee63020beee955ca711022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 153, + "comment" : "replaced r by r - n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "30460221ff2478f1d149f6d856ac900a7af1772226e7dea086b8a3f1dc48ad29689c965c6f022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 154, + "comment" : "replaced r by r + 256 * n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "3047022201002478f0d049f6d957ac900a7af17721e38bc048db775a1554f631b727fc1ed2c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 155, + "comment" : "replaced r by -r", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30450220db870e2fb60927a8536ff5850e88ddd95b3a64cba0446f9ec3990bd467067e40022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 156, + "comment" : "replaced r by n - r", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "3046022100db870e2eb60927a9536ff5850e88ddd918215f79475c0e23b752d6976369a391022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 157, + "comment" : "replaced r by -n - r", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30460221fedb870e30b60927a7536ff5850e88ddd99e536a1df92cd119cfdf41116aa358ef022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 158, + "comment" : "replaced r by r + 2**256", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "30460221012478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 159, + "comment" : "replaced r by r + 2**320", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "304e02290100000000000000002478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 160, + "comment" : "replaced s by s + n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "3046022101a07a59c3a41688548eb315e94effca0efd1ffe0a13467061783dde1cce167403022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 161, + "comment" : "replaced s by s - n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "30450220a07a59c5a41688528eb315e94effca0f835208aec517335790ca4896d5502961022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 162, + "comment" : "replaced s by s + 256 * n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "304702220100a07a58c4a41689538eb315e94effc9cc2733b10383cd56d03e4ed65634d89fb2022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 163, + "comment" : "replaced s by -s", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30460221ff5f85a63b5be977ac714cea16b10035f0bfc6fca393d12e237b7beca62e4cb14e022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 164, + "comment" : "replaced s by -n - s", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30460221fe5f85a63c5be977ab714cea16b10035f102e001f5ecb98f9e87c221e331e98bfd022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 165, + "comment" : "replaced s by s + 2**256", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "3046022101a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 166, + "comment" : "replaced s by s - 2**256", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "30450220a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 167, + "comment" : "replaced s by s + 2**320", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "304e0229010000000000000000a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2", + "result" : "invalid" + }, + { + "tcId" : 168, + "comment" : "Signature with special case values r=0 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100020100", + "result" : "invalid" + }, + { + "tcId" : 169, + "comment" : "Signature with special case values r=0 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100020101", + "result" : "invalid" + }, + { + "tcId" : 170, + "comment" : "Signature with special case values r=0 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201000201ff", + "result" : "invalid" + }, + { + "tcId" : 171, + "comment" : "Signature with special case values r=0 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 172, + "comment" : "Signature with special case values r=0 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 173, + "comment" : "Signature with special case values r=0 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 174, + "comment" : "Signature with special case values r=0 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 175, + "comment" : "Signature with special case values r=0 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 176, + "comment" : "Signature with special case values r=1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101020100", + "result" : "invalid" + }, + { + "tcId" : 177, + "comment" : "Signature with special case values r=1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101020101", + "result" : "invalid" + }, + { + "tcId" : 178, + "comment" : "Signature with special case values r=1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201010201ff", + "result" : "invalid" + }, + { + "tcId" : 179, + "comment" : "Signature with special case values r=1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 180, + "comment" : "Signature with special case values r=1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 181, + "comment" : "Signature with special case values r=1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 182, + "comment" : "Signature with special case values r=1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 183, + "comment" : "Signature with special case values r=1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 184, + "comment" : "Signature with special case values r=-1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff020100", + "result" : "invalid" + }, + { + "tcId" : 185, + "comment" : "Signature with special case values r=-1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff020101", + "result" : "invalid" + }, + { + "tcId" : 186, + "comment" : "Signature with special case values r=-1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff0201ff", + "result" : "invalid" + }, + { + "tcId" : 187, + "comment" : "Signature with special case values r=-1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 188, + "comment" : "Signature with special case values r=-1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 189, + "comment" : "Signature with special case values r=-1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 190, + "comment" : "Signature with special case values r=-1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 191, + "comment" : "Signature with special case values r=-1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 192, + "comment" : "Signature with special case values r=n and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020100", + "result" : "invalid" + }, + { + "tcId" : 193, + "comment" : "Signature with special case values r=n and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101", + "result" : "invalid" + }, + { + "tcId" : 194, + "comment" : "Signature with special case values r=n and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510201ff", + "result" : "invalid" + }, + { + "tcId" : 195, + "comment" : "Signature with special case values r=n and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 196, + "comment" : "Signature with special case values r=n and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 197, + "comment" : "Signature with special case values r=n and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 198, + "comment" : "Signature with special case values r=n and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 199, + "comment" : "Signature with special case values r=n and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 200, + "comment" : "Signature with special case values r=n - 1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550020100", + "result" : "invalid" + }, + { + "tcId" : 201, + "comment" : "Signature with special case values r=n - 1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550020101", + "result" : "invalid" + }, + { + "tcId" : 202, + "comment" : "Signature with special case values r=n - 1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325500201ff", + "result" : "invalid" + }, + { + "tcId" : 203, + "comment" : "Signature with special case values r=n - 1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 204, + "comment" : "Signature with special case values r=n - 1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 205, + "comment" : "Signature with special case values r=n - 1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 206, + "comment" : "Signature with special case values r=n - 1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 207, + "comment" : "Signature with special case values r=n - 1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 208, + "comment" : "Signature with special case values r=n + 1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552020100", + "result" : "invalid" + }, + { + "tcId" : 209, + "comment" : "Signature with special case values r=n + 1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552020101", + "result" : "invalid" + }, + { + "tcId" : 210, + "comment" : "Signature with special case values r=n + 1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325520201ff", + "result" : "invalid" + }, + { + "tcId" : 211, + "comment" : "Signature with special case values r=n + 1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 212, + "comment" : "Signature with special case values r=n + 1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 213, + "comment" : "Signature with special case values r=n + 1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 214, + "comment" : "Signature with special case values r=n + 1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 215, + "comment" : "Signature with special case values r=n + 1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 216, + "comment" : "Signature with special case values r=p and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff020100", + "result" : "invalid" + }, + { + "tcId" : 217, + "comment" : "Signature with special case values r=p and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff020101", + "result" : "invalid" + }, + { + "tcId" : 218, + "comment" : "Signature with special case values r=p and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0201ff", + "result" : "invalid" + }, + { + "tcId" : 219, + "comment" : "Signature with special case values r=p and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 220, + "comment" : "Signature with special case values r=p and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 221, + "comment" : "Signature with special case values r=p and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 222, + "comment" : "Signature with special case values r=p and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 223, + "comment" : "Signature with special case values r=p and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 224, + "comment" : "Signature with special case values r=p + 1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000001000000000000000000000000020100", + "result" : "invalid" + }, + { + "tcId" : 225, + "comment" : "Signature with special case values r=p + 1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000001000000000000000000000000020101", + "result" : "invalid" + }, + { + "tcId" : 226, + "comment" : "Signature with special case values r=p + 1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff000000010000000000000000000000010000000000000000000000000201ff", + "result" : "invalid" + }, + { + "tcId" : 227, + "comment" : "Signature with special case values r=p + 1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "result" : "invalid" + }, + { + "tcId" : 228, + "comment" : "Signature with special case values r=p + 1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + "result" : "invalid" + }, + { + "tcId" : 229, + "comment" : "Signature with special case values r=p + 1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "result" : "invalid" + }, + { + "tcId" : 230, + "comment" : "Signature with special case values r=p + 1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "result" : "invalid" + }, + { + "tcId" : 231, + "comment" : "Signature with special case values r=p + 1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000001000000000000000000000001000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 232, + "comment" : "Signature encoding contains incorrect types: r=0, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3008020100090380fe01", + "result" : "invalid" + }, + { + "tcId" : 233, + "comment" : "Signature encoding contains incorrect types: r=0, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100090142", + "result" : "invalid" + }, + { + "tcId" : 234, + "comment" : "Signature encoding contains incorrect types: r=0, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100010101", + "result" : "invalid" + }, + { + "tcId" : 235, + "comment" : "Signature encoding contains incorrect types: r=0, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100010100", + "result" : "invalid" + }, + { + "tcId" : 236, + "comment" : "Signature encoding contains incorrect types: r=0, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201000500", + "result" : "invalid" + }, + { + "tcId" : 237, + "comment" : "Signature encoding contains incorrect types: r=0, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201000c00", + "result" : "invalid" + }, + { + "tcId" : 238, + "comment" : "Signature encoding contains incorrect types: r=0, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201000c0130", + "result" : "invalid" + }, + { + "tcId" : 239, + "comment" : "Signature encoding contains incorrect types: r=0, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201003000", + "result" : "invalid" + }, + { + "tcId" : 240, + "comment" : "Signature encoding contains incorrect types: r=0, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201003003020100", + "result" : "invalid" + }, + { + "tcId" : 241, + "comment" : "Signature encoding contains incorrect types: r=1, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3008020101090380fe01", + "result" : "invalid" + }, + { + "tcId" : 242, + "comment" : "Signature encoding contains incorrect types: r=1, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101090142", + "result" : "invalid" + }, + { + "tcId" : 243, + "comment" : "Signature encoding contains incorrect types: r=1, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101010101", + "result" : "invalid" + }, + { + "tcId" : 244, + "comment" : "Signature encoding contains incorrect types: r=1, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101010100", + "result" : "invalid" + }, + { + "tcId" : 245, + "comment" : "Signature encoding contains incorrect types: r=1, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201010500", + "result" : "invalid" + }, + { + "tcId" : 246, + "comment" : "Signature encoding contains incorrect types: r=1, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201010c00", + "result" : "invalid" + }, + { + "tcId" : 247, + "comment" : "Signature encoding contains incorrect types: r=1, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201010c0130", + "result" : "invalid" + }, + { + "tcId" : 248, + "comment" : "Signature encoding contains incorrect types: r=1, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201013000", + "result" : "invalid" + }, + { + "tcId" : 249, + "comment" : "Signature encoding contains incorrect types: r=1, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201013003020100", + "result" : "invalid" + }, + { + "tcId" : 250, + "comment" : "Signature encoding contains incorrect types: r=-1, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201ff090380fe01", + "result" : "invalid" + }, + { + "tcId" : 251, + "comment" : "Signature encoding contains incorrect types: r=-1, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff090142", + "result" : "invalid" + }, + { + "tcId" : 252, + "comment" : "Signature encoding contains incorrect types: r=-1, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff010101", + "result" : "invalid" + }, + { + "tcId" : 253, + "comment" : "Signature encoding contains incorrect types: r=-1, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff010100", + "result" : "invalid" + }, + { + "tcId" : 254, + "comment" : "Signature encoding contains incorrect types: r=-1, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201ff0500", + "result" : "invalid" + }, + { + "tcId" : 255, + "comment" : "Signature encoding contains incorrect types: r=-1, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201ff0c00", + "result" : "invalid" + }, + { + "tcId" : 256, + "comment" : "Signature encoding contains incorrect types: r=-1, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff0c0130", + "result" : "invalid" + }, + { + "tcId" : 257, + "comment" : "Signature encoding contains incorrect types: r=-1, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201ff3000", + "result" : "invalid" + }, + { + "tcId" : 258, + "comment" : "Signature encoding contains incorrect types: r=-1, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201ff3003020100", + "result" : "invalid" + }, + { + "tcId" : 259, + "comment" : "Signature encoding contains incorrect types: r=n, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551090380fe01", + "result" : "invalid" + }, + { + "tcId" : 260, + "comment" : "Signature encoding contains incorrect types: r=n, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551090142", + "result" : "invalid" + }, + { + "tcId" : 261, + "comment" : "Signature encoding contains incorrect types: r=n, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551010101", + "result" : "invalid" + }, + { + "tcId" : 262, + "comment" : "Signature encoding contains incorrect types: r=n, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551010100", + "result" : "invalid" + }, + { + "tcId" : 263, + "comment" : "Signature encoding contains incorrect types: r=n, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510500", + "result" : "invalid" + }, + { + "tcId" : 264, + "comment" : "Signature encoding contains incorrect types: r=n, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510c00", + "result" : "invalid" + }, + { + "tcId" : 265, + "comment" : "Signature encoding contains incorrect types: r=n, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510c0130", + "result" : "invalid" + }, + { + "tcId" : 266, + "comment" : "Signature encoding contains incorrect types: r=n, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325513000", + "result" : "invalid" + }, + { + "tcId" : 267, + "comment" : "Signature encoding contains incorrect types: r=n, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325513003020100", + "result" : "invalid" + }, + { + "tcId" : 268, + "comment" : "Signature encoding contains incorrect types: r=p, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff090380fe01", + "result" : "invalid" + }, + { + "tcId" : 269, + "comment" : "Signature encoding contains incorrect types: r=p, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff090142", + "result" : "invalid" + }, + { + "tcId" : 270, + "comment" : "Signature encoding contains incorrect types: r=p, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff010101", + "result" : "invalid" + }, + { + "tcId" : 271, + "comment" : "Signature encoding contains incorrect types: r=p, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff010100", + "result" : "invalid" + }, + { + "tcId" : 272, + "comment" : "Signature encoding contains incorrect types: r=p, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0500", + "result" : "invalid" + }, + { + "tcId" : 273, + "comment" : "Signature encoding contains incorrect types: r=p, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0c00", + "result" : "invalid" + }, + { + "tcId" : 274, + "comment" : "Signature encoding contains incorrect types: r=p, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0c0130", + "result" : "invalid" + }, + { + "tcId" : 275, + "comment" : "Signature encoding contains incorrect types: r=p, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff3000", + "result" : "invalid" + }, + { + "tcId" : 276, + "comment" : "Signature encoding contains incorrect types: r=p, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff3003020100", + "result" : "invalid" + }, + { + "tcId" : 277, + "comment" : "Signature encoding contains incorrect types: r=0.25, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300a090380fe01090380fe01", + "result" : "invalid" + }, + { + "tcId" : 278, + "comment" : "Signature encoding contains incorrect types: r=nan, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006090142090142", + "result" : "invalid" + }, + { + "tcId" : 279, + "comment" : "Signature encoding contains incorrect types: r=True, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010101010101", + "result" : "invalid" + }, + { + "tcId" : 280, + "comment" : "Signature encoding contains incorrect types: r=False, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010100010100", + "result" : "invalid" + }, + { + "tcId" : 281, + "comment" : "Signature encoding contains incorrect types: r=Null, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300405000500", + "result" : "invalid" + }, + { + "tcId" : 282, + "comment" : "Signature encoding contains incorrect types: r=empyt UTF-8 string, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30040c000c00", + "result" : "invalid" + }, + { + "tcId" : 283, + "comment" : "Signature encoding contains incorrect types: r=\"0\", s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060c01300c0130", + "result" : "invalid" + }, + { + "tcId" : 284, + "comment" : "Signature encoding contains incorrect types: r=empty list, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300430003000", + "result" : "invalid" + }, + { + "tcId" : 285, + "comment" : "Signature encoding contains incorrect types: r=list containing 0, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300a30030201003003020100", + "result" : "invalid" + }, + { + "tcId" : 286, + "comment" : "Signature encoding contains incorrect types: r=0.25, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3008090380fe01020100", + "result" : "invalid" + }, + { + "tcId" : 287, + "comment" : "Signature encoding contains incorrect types: r=nan, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006090142020100", + "result" : "invalid" + }, + { + "tcId" : 288, + "comment" : "Signature encoding contains incorrect types: r=True, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010101020100", + "result" : "invalid" + }, + { + "tcId" : 289, + "comment" : "Signature encoding contains incorrect types: r=False, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010100020100", + "result" : "invalid" + }, + { + "tcId" : 290, + "comment" : "Signature encoding contains incorrect types: r=Null, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050500020100", + "result" : "invalid" + }, + { + "tcId" : 291, + "comment" : "Signature encoding contains incorrect types: r=empyt UTF-8 string, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050c00020100", + "result" : "invalid" + }, + { + "tcId" : 292, + "comment" : "Signature encoding contains incorrect types: r=\"0\", s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060c0130020100", + "result" : "invalid" + }, + { + "tcId" : 293, + "comment" : "Signature encoding contains incorrect types: r=empty list, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30053000020100", + "result" : "invalid" + }, + { + "tcId" : 294, + "comment" : "Signature encoding contains incorrect types: r=list containing 0, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30083003020100020100", + "result" : "invalid" + }, + { + "tcId" : 295, + "comment" : "Edge case for Shamir multiplication", + "flags" : [ + "EdgeCaseShamirMultiplication" + ], + "msg" : "3932323038", + "sig" : "3044022064a1aab5000d0e804f3e2fc02bdee9be8ff312334e2ba16d11547c97711c898e02203c623e7f7598376825fa8bc09e727c75794cbb4ee8716ae15c31cd1cbe9ca3ee", + "result" : "valid" + }, + { + "tcId" : 296, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33393439313934313732", + "sig" : "304402203a4f61f7f8c4546e3580f7848411786fee1229a07a6ecf5fb84870869188215d022018c5ce44354e2274eadb8fea319f8d6f60944532dbaae86bfd8105f253041bcb", + "result" : "valid" + }, + { + "tcId" : 297, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35333637363431383737", + "sig" : "304502203fa9975fb2b08b7b6e33f3843099da3f43f1dcfe9b171a60cafd5489ca9c5328022100985a86825a0cc728f5d9dac2a513b49127a06100f0fc4b8b1f200903e0df9ed2", + "result" : "valid" + }, + { + "tcId" : 298, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35363731343831303935", + "sig" : "304402204d66e7ee5edd02ab96db25954050079ef8de1d0f02f34d4d75112eaf3f73124002206292d1563140013c589be40e599862bdd6bda2103809928928a119b43851a2ce", + "result" : "valid" + }, + { + "tcId" : 299, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3131323037313732393039", + "sig" : "3046022100a9228305f7b486f568eb65d44e49ba007e3f14b8f23c689c952e4ced1e6cf91e022100b73c74d28bd1268002bed784a6b06c40a90ee5938ea6d08f272d027e0f96a72c", + "result" : "valid" + }, + { + "tcId" : 300, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3131323938303334323336", + "sig" : "304402203fa39842bfab6c38afa7963c60beb09484d4579fc75ef09efff44e91bc62ca8302205612add1924f0285ace5b158828e2b32ab2b6e7f10ee68dca1cc54591fee1fec", + "result" : "valid" + }, + { + "tcId" : 301, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "39383736303239363833", + "sig" : "3045022006c04b02edfeecd8620f035ea4f449bd924593e86e5288a6f22d1923b0e2e8a9022100f666718e6fefb515bb9339d29cc0e58cfba89d605ca0066bca87f6a3f08ebcfa", + "result" : "valid" + }, + { + "tcId" : 302, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3230323034323936353139", + "sig" : "304402201ddd953c32a5f84109cd4d9ec8c364dd318376ff5d228211a367483077d638800220563dba4845de762baf04910618d587e0dd0c97dd1c9785c24ffdf2f8a660abf2", + "result" : "valid" + }, + { + "tcId" : 303, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31343531363639313830", + "sig" : "30460221009fe4ec4831ef4945f100d5d35a2e6312411ca5df6c900ca60690f2985d553482022100c674ad5e1bead2f767c9248e444452a4a8530dd47246cbbc968da865bdf212b6", + "result" : "valid" + }, + { + "tcId" : 304, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31303933363835393531", + "sig" : "3046022100e8703d6b16a79fc2ab3653cece29d06f65dd6f2c230cb08ee30c5517407d75db0221008cfeb87b8e95ddacd638b37d315393c5005f3ab8bba0cc1cd1a050829b775bfb", + "result" : "valid" + }, + { + "tcId" : 305, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36323139353630323031", + "sig" : "3046022100def608caf1f277d71403009f209c1d7eef11aaa7920397fbf429b8146181aece022100f3b8f2aa5b3df9a8b37313ea66ad5b74673f3e8614ff471b1eb6773217511fb0", + "result" : "valid" + }, + { + "tcId" : 306, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35363832343734333033", + "sig" : "304402204f5d08e8d936ce831d02d6b23fb8fce0e0750101af3ab9c3b28636b95a5e24ad02206f034480553bcecac221f8be8288163c55492e2e56a88f4d0341b61436a0a6c0", + "result" : "valid" + }, + { + "tcId" : 307, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33373336353331373836", + "sig" : "3045022100bdd822bfe3733d9f4b88764fe091db2e8f8af366e4c44d876bf82e62bd48c7ee02207fbf7750c5dc849a2c55dbdd067806f869652a7b3a57baa4733781d3128f02de", + "result" : "valid" + }, + { + "tcId" : 308, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34373935393033373932", + "sig" : "304402201c4fc02961b7f4245566b410bf08f447502ea4f75b15690344681efa2edf7b4b02207d63eef119dc88bc4a1b2c43ac21cd53892443661f8c3a97d558bf888c29f769", + "result" : "valid" + }, + { + "tcId" : 309, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "39333939363131303037", + "sig" : "304402206406f2d249ab1264e175476ca3300efd049fcad569dff40b922082b41cc7b7ce0220461872b803383f785077714a9566c4d652e87b2cad90dd4f4cc84bc55004c530", + "result" : "valid" + }, + { + "tcId" : 310, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31303837343931313835", + "sig" : "30450220415c924b9ba1902b340058117d90623602d48b8280583fb231dc93823b83a153022100f18be8cdc2063a26ab030504d3397dc6e9c6b6c56f4e3a59832c0e4643c0263c", + "result" : "valid" + }, + { + "tcId" : 311, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33323336363738353030", + "sig" : "3045022100d12e96c7d2f177b7cf6d8a1ede060a2b174dc993d43f5fe60f75604824b64fef02200c97d87035fcca0a5f47fe6461bb30cbaf05b37e4211ec3fcd51fc71a12239ca", + "result" : "valid" + }, + { + "tcId" : 312, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31343438393937373033", + "sig" : "304502207df72a64c7e982c88f83b3a22802690098147e0e42ef4371ef069910858c0646022100adbaa7b10c6a3f995ed5f83d7bda4ba626b355f34a72bf92ff788300b70e72d0", + "result" : "valid" + }, + { + "tcId" : 313, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35373134363332383037", + "sig" : "30440220047c4306f8d30e425ae70e0bee9e0b94faa4ef18a9c6d7f2c95de0fe6e2a323702207a4d0d0a596bd9ea3fe9850e9c8c77322594344623c0b46ac2a8c95948aefd98", + "result" : "valid" + }, + { + "tcId" : 314, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "323236343837343932", + "sig" : "3044022057d603a367e23af39c95dd418c0176da8b211d50b1be82bf5ef621a2640204f702205dc3f285ad015c4d71157bd11e5b8df6a89e4b267393b08b5ad5013bdae544b1", + "result" : "valid" + }, + { + "tcId" : 315, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35333533343439343739", + "sig" : "3044022011df6741021ec8cc567584aea16817c540859c4e5011551c00b097fcfc2337e50220668551919d43206ac0571fc5ad3ac0efb489bea599e7bf99fe4c7468d6c2c5e0", + "result" : "valid" + }, + { + "tcId" : 316, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34373837333033383830", + "sig" : "304402207451ffede471bd370406533436fc42a89daa0af4903d087cbc062fe7e54dbf700220590895398f22b48ce72cbf7c3d3ee1dd7fb0ee645edb0b1b1de35f370e5bf5ee", + "result" : "valid" + }, + { + "tcId" : 317, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32323332313935383233", + "sig" : "3045022100fc4c4d81da6f687a6426263193c1a680b67734a1b180647b8c76407cc4f0a9c6022056f775d372c9bee685374085be676c9cf31cf1f978a5e6ccb04e4a0761159cc7", + "result" : "valid" + }, + { + "tcId" : 318, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3130373339333931393137", + "sig" : "3045022100feb978ca33c46ffba47eb63bb40de7833e43d5654575b54de1fea3d1de3c8ad50220108078ba997bfa064521baf342c97b0c64bd25240c8fd0fd7533ae2d03081b70", + "result" : "valid" + }, + { + "tcId" : 319, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31383831303237333135", + "sig" : "3046022100cc61729698467ba53da199ff481fe7433f194fc96367907e8dc5e1d9f42b1e2102210083dd9ef156e7c1f9c09b3bf86a4f1c88e5dd20cd74d997858e600797dbe74ad2", + "result" : "valid" + }, + { + "tcId" : 320, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36303631363933393037", + "sig" : "3045022100d47f616303ff0eb813eac32e760ba30ad445e0af7dc57e70756104823f6a895f0220047f2217b399c46a426b936a124980a6011f0896f51dbe07632828a72d7173f1", + "result" : "valid" + }, + { + "tcId" : 321, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "38383935323237303934", + "sig" : "3046022100cff73dfa2bac67ce1340b25c885abb3e7979ef7f840f15d5f19e86640cdd40a3022100c7d1210802796c4f251049ee08a2c29f5c71064033d17010c65bf2e94499381e", + "result" : "valid" + }, + { + "tcId" : 322, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31353830323334303934", + "sig" : "3044022010acaf9c485ab1220355b95be269f124e12eb252f2224b0fc50785eb2ee3df45022032443b557efc6896347fa778e1fcf33cbb769c9a7da896b20d93fea7c2791ea4", + "result" : "valid" + }, + { + "tcId" : 323, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33393635393931353132", + "sig" : "3046022100f919da0651abc2bff994a879d2778fa5195d57400e003e8dd6adb3fc7a0cc4cc0221009b945d06bd119665b278a59bd24fdd2350817d0be87997bee57b70c479d64a2d", + "result" : "valid" + }, + { + "tcId" : 324, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32323838373332313938", + "sig" : "3045022100cc38e7a018f6d70b2d9b49120cc9b4a169f2f72238821a86b81f553b6225d24e0220276efd8bf06ccce07c7aae35eaac3bd1c374dcf0cf0588d5e0e4171936688636", + "result" : "valid" + }, + { + "tcId" : 325, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32323330383837333139", + "sig" : "3045022100ff85ad66621991c318b85cef73c576cb2a8d43c568c1aafc85b40ef2a9a6b41c0220732a79e6837ebf8434fea6e7fefa948f506ae455c1a3eb36a030185a23037d96", + "result" : "valid" + }, + { + "tcId" : 326, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "313239303536393337", + "sig" : "3044022033f016e51eef9b1136380cb8b84c6b38b107e24c6731bd07cb1c7f4a29f33a83022036b177bb8be94c8be67ff3a41fcc4d22b5c9eb377da713eb014ae01c64ca6dd7", + "result" : "valid" + }, + { + "tcId" : 327, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32373438363536343338", + "sig" : "3045022100929413ee91f27454d74e91370a10a86fc98ac7305c8ab4ca59752bda3a7bfc370220483b47a26a0d7d2e6bd37d351d9ee37c5ec2a4686d884d78b6beb7f6b08c50f9", + "result" : "valid" + }, + { + "tcId" : 328, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37353833353032363034", + "sig" : "30450220578202c7d0abac93ca43dde3cb44414e5601c1eb557604cb9adb4bde0a12633b022100fb9a7412e307aee95ef4b53540571a21559414e5306794ab5182cfb229dab3e9", + "result" : "valid" + }, + { + "tcId" : 329, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32333237373534323739", + "sig" : "3045022046d45ad0bb75b8639d0e91d8450fc31887c211328a5784fc83b4cb7f5b962c1b022100d6751d13ede2079b7aa1d822bdb32d7f3cf00273a1ff03df90c0ec7c62a47568", + "result" : "valid" + }, + { + "tcId" : 330, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "373735353038353834", + "sig" : "3046022100abe84c941783d5ced284fea56341ecc68d6bdd3196d318fbd074641f8c885bd5022100bdea3c44d48e01aa40935c1c9723ff733199563440f26b4ecf0b444b0418d9f5", + "result" : "valid" + }, + { + "tcId" : 331, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3137393832363438333832", + "sig" : "3045022005277cdbf491e336fe81be24e393a161a4fb89112c9ffed1ee6649c406713408022100ab6934332e68e108bb0484d21c457dcf381a620c3a4712fdbfeb658a3fafd60c", + "result" : "valid" + }, + { + "tcId" : 332, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32333936373737333635", + "sig" : "30450220293825737c8c14430ed10dbadd7da337275f9b61d1d26377f778ffaa00c139de022100cdddec267a8678c96829bf6c1d6f38322e119937cfd2fee01e9dc9525f43ed6b", + "result" : "valid" + }, + { + "tcId" : 333, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35393938313035383031", + "sig" : "304402202041fdd6111c45dfd29e750e082dcdadc9a584a8a2be46580fb0ba3b3dc658620220421824fe987e4172a0f8bbcb7bcd9e1b073b7742ed9f9df98f2a1a37cd374ce3", + "result" : "valid" + }, + { + "tcId" : 334, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3136363737383237303537", + "sig" : "30450220267941db660e046ab14e795669e002b852f7788447c53ebef46a2056978b5574022100d00183bcaf75bc11e37653f952f6a6537151c3aa0a1b9e4e41b004a29185395b", + "result" : "valid" + }, + { + "tcId" : 335, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "323036323134333632", + "sig" : "304402205dcd7f6814739d47f80a363b9414e6cbfb5f0846223888510abd5b3903d7ae09022043418f138bb3c857c0ad750ca8389ebcf3719cb389634ac54a91de9f18fd7238", + "result" : "valid" + }, + { + "tcId" : 336, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36383432343936303435", + "sig" : "304502205e0e8cc0280409a0ce252da02b2424d2de3a52b406c3778932dbc60cb86c356702210093d25e929c5b00e950d89585ec6c01b6589ae0ec0af8a79c04df9e5b27b58bc5", + "result" : "valid" + }, + { + "tcId" : 337, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33323639383937333231", + "sig" : "304502204fcf9c9d9ffbf4e0b98268c087071bffe0673bb8dcb32aa667f8a639c364ea47022100820db0730bee8227fc831643fcb8e2ef9c0f7059ce42da45cf74828effa8d772", + "result" : "valid" + }, + { + "tcId" : 338, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31333837333234363932", + "sig" : "3046022100c60cd2e08248d58d1639b123633643c63f89aff611f998937ccb08c9113bcdca022100ac4bb470ce0164616dada7a173364ed3f9d16fd32c686136f904c99266fda17e", + "result" : "valid" + }, + { + "tcId" : 339, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34313138383837353336", + "sig" : "304502207cfdaf6f22c1c7668d7b6f56f8a7be3fdeeb17a7863539555bbfa899dd70c5f1022100cee151adc71e68483b95a7857a862ae0c5a6eee478d93d40ccc7d40a31dcbd90", + "result" : "valid" + }, + { + "tcId" : 340, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "393838363036353435", + "sig" : "304402202270be7ee033a706b59746eab34816be7e15c8784061d5281060707a0abe0a7d022056a163341ee95e7e3c04294a57f5f7d24bf3c3c6f13ef2f161077c47bd27665d", + "result" : "valid" + }, + { + "tcId" : 341, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32343739313135383435", + "sig" : "3044022016b5d2bfcaba21167a69f7433d0c476b21ded37d84dc74ca401a3ecddb2752a8022062852cf97d89adfb0ebbe6f398ee641bfea8a2271580aac8a3d8326d8c6e0ef9", + "result" : "valid" + }, + { + "tcId" : 342, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35303736383837333637", + "sig" : "3046022100d907eefa664115848b90c3d5baa0236f08eafaf81c0d52bb9d0f8acb57490847022100fd91bc45a76e31cdc58c4bfb3df27f6470d20b19f0fba6a77b6c8846650ed8a6", + "result" : "valid" + }, + { + "tcId" : 343, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "393838353036393637", + "sig" : "30450220048337b34f427e8774b3bf7c8ff4b1ae65d132ac8af94829bb2d32944579bb31022100bd6f8eab82213ccf80764644204bb6bf16c668729cdd31dd8596286c15686e8e", + "result" : "valid" + }, + { + "tcId" : 344, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32373231333036313331", + "sig" : "3046022100b2bc46b7c44293557ab7ebeb0264924277193f87a25d94c924df1518ba7c7260022100abf1f6238ff696aaafaf4f0cbbe152c3d771c5bfc43f36d7e5f5235819d02c1a", + "result" : "valid" + }, + { + "tcId" : 345, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33323034313031363535", + "sig" : "3045022040d4b38a61232e654ffd08b91e18609851f4189f7bf8a425ad59d9cbb1b54c990221009e775a7bd0d934c3ed886037f5d3b356f60eda41191690566e99677d7aaf64f3", + "result" : "valid" + }, + { + "tcId" : 346, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33313530363830393530", + "sig" : "3046022100ac8f64d7df8d9fea005744e3ac4af70aa3a38e5a0f3d069d85806a4f29710339022100c014e96decfef3857cc174f2c46ad0882bef0c4c8a17ce09441961e4ae8d2df3", + "result" : "valid" + }, + { + "tcId" : 347, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31373237343630313033", + "sig" : "3044022041b3766f41a673a01e2c0cab5ceedbcec8d82530a393f884d72aa4e6685dea0a0220073a55dca2da577cafb40e12dd20bf8529a13a6acdf9a1c7d4b2048d60876cb3", + "result" : "valid" + }, + { + "tcId" : 348, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3134353731343631323235", + "sig" : "304502201942755aa8128382cd8e35a4350c22cc45ba5704d99e8a240970df11956ad866022100f64cf1e0816cf7ac5044f73ba938e142ef3305cb09becb80a0a5b9ad7ba3eb07", + "result" : "valid" + }, + { + "tcId" : 349, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34313739353136303930", + "sig" : "3045022051aba4ff1c7ddf17e0632ab71684d8de6dc700219ef346cb28ce9dafc3565b3b022100b6aaebe1af0ad01f07a68bf1cf57f9d6040b43c14b7eb8238542760e32ce3b0c", + "result" : "valid" + }, + { + "tcId" : 350, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35383932373133303534", + "sig" : "304502210091efbfcc731650e9f004c38b71db146c17bf871c82c4e87716f7ff2f7f9e51d00220089ea631a7c5f05311c521d21ba798b5174881f0fd8095fb3a77515913efb6e0", + "result" : "valid" + }, + { + "tcId" : 351, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33383936313832323937", + "sig" : "304502204a7e47bd281ea09b9e3a32934c7a969e1f788f978b41585989f4689e804663fb022100e65f6bd702403cbbed7f8ad0045f331d4a96fbf8c43f71f11615b7d1b9153b7f", + "result" : "valid" + }, + { + "tcId" : 352, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "38323833333436373332", + "sig" : "3046022100c795f5da86e10a604d4f94bf7cac381c73edad1461d66929e53aa57ca294e89f022100bae784ab6c7b58332ee05e7d54169edf55ce45f030e71ae8df63969fb327a10c", + "result" : "valid" + }, + { + "tcId" : 353, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33333636393734383931", + "sig" : "3046022100ea68b24843b225f505e01c0e608b20b4d93e8faf6b9cf70cf8f9134a80e7b668022100a3abc044b4728f80fe414bdc66f032b262356720547bec7729fad94151c6adc7", + "result" : "valid" + }, + { + "tcId" : 354, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32313939313533323239", + "sig" : "3046022100bfe7502140c57a24a77edc3d9b3c4bc11d21bdb0b196977b7f2b13ac973ad697022100947a01da9731849d72b67ef7bc40b012480fd389895aad1f6b1cdbeab3b93b8d", + "result" : "valid" + }, + { + "tcId" : 355, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35363030333136383232", + "sig" : "304402203434ee1142740a0ab8623b97fc8dc2567eda45dadf6039b45c448819e840cf3002203c0fac0487841997202c29f3bf2df540b115b29dc619160d52203d4a1fd4b9f7", + "result" : "valid" + }, + { + "tcId" : 356, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "383639363531363935", + "sig" : "304502205338500e23ba96a0adc6ef84932e25fbad7435d9f70eb7f476c6912de12e33c8022100a002f5583ea8c0d7fb17136d0ee0415acf629879ce6b01ac52e3ecd7772a3704", + "result" : "valid" + }, + { + "tcId" : 357, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36353833393236333732", + "sig" : "304402204ff2d4e31f4180de6901d2d20341d12387c9c55f4cf003a742f049b84af6fe0502200312f38771414555fa5ed2817dcc629a8c7cf69d306300e87bc167278ec3ef37", + "result" : "valid" + }, + { + "tcId" : 358, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3133323035303135373235", + "sig" : "3044022051d665bad5f2d6306c6bbfe1f27555887670061d4df36ec9f4ce6cdfaf9ea7ac02202905e43f6207ee93df35a2e9fb9bc8098c448ae98a14e4ad1ebaea5d56b6e493", + "result" : "valid" + }, + { + "tcId" : 359, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35303835333330373931", + "sig" : "3046022100b804e0235f135aba7b7531b6831f26cc9fb77d3f83854957431be20706b813690221009d317fd08e4e0467617db819cde1d7d4d74da489b2bce4db055ea01eccfafcf2", + "result" : "valid" + }, + { + "tcId" : 360, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37383636383133313139", + "sig" : "30450221008ab50ef3660ccb6af34c78e795ded6b256ffca5c94f249f3d907fb65235ef680022049d5aaeae5a6d0c15b286e428b5e720cf37a822ede445baa143ffae69aba91b8", + "result" : "valid" + }, + { + "tcId" : 361, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32303832353339343239", + "sig" : "30440220571b9c46a47c5cc53a574c196c3fb07f3510c0f4443b9f2fe781252c24d343de022068a9aebd50ff165c89b5b9cb6c1754191958f360b4d2851a481a3e1106ee7809", + "result" : "valid" + }, + { + "tcId" : 362, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3130303635393536363937", + "sig" : "304502204cb7817b04dc73be60d3711803bc10687a6e3f4ab79c4c1a4e9d63a73174d4eb022100ce398d2d6602d2af58a64042f830bf774aee18209d6fb5c743b6a6e437826b98", + "result" : "valid" + }, + { + "tcId" : 363, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33303234313831363034", + "sig" : "30450220684399c6cd6ebb1c5d5efb0d78dce40ebd48d9d944eb6548c9ce68d7fdc82229022100cf25c8e427fae359bfe60fa02964f4c9b8d6db54612e05c78c341f0a8c52d0b5", + "result" : "valid" + }, + { + "tcId" : 364, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37373637383532383734", + "sig" : "3045022020b7b36d5bc76fa182ca27152a99a956e6a0880000694296e31af98a7312d04b022100eeeabc5521f9856e920eb7d29ed7e4042f178ff706dff8eeb24b429e3b63402a", + "result" : "valid" + }, + { + "tcId" : 365, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "353434313939393734", + "sig" : "304402206b65c95e8e121d2e6ee506cfd62cb88e0bfb3589da40876898ef66c43982aca9022009642c05ad619b4402fd297eb57e29cca5c2eb6823931ba82de32d7c652ba73e", + "result" : "valid" + }, + { + "tcId" : 366, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35383433343830333931", + "sig" : "3044022067c74cbf5ea4b777bf521ace099f4f094d8f58900e15e67e1b4bd399056629ed02203d2884655c49b8b5f64e802a054e7bf09b0fc80ca18ebf927b82e58bb4a00400", + "result" : "valid" + }, + { + "tcId" : 367, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "373138383932363239", + "sig" : "3045022079a5e40da5cf34c4c39adf7dfc5d454995a250314ebd212b5c8e3f4e6f875feb022100b268920e403ba17828ff271938a6558a5b2dd000229f8edb4a9d9f9b6ac1b472", + "result" : "valid" + }, + { + "tcId" : 368, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31373433323233343433", + "sig" : "3045022100c8b13006c3a51a322fff9321761b01de134f526be582b22e19693c443fc9fe46022034e7f60179c6162ab980fcd58f173b0e6c30b524d35c67921677522dcef843a1", + "result" : "valid" + }, + { + "tcId" : 369, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32343036303035393336", + "sig" : "304502203513db745489a487c88a6cedf8795b640f8f71578397bdabd6cc586c25bd66ad02210099a72cd3f0ca6c799149283ca0af37f86b88200d0c905bd3c9f1b859e55b1659", + "result" : "valid" + }, + { + "tcId" : 370, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31363134303336393838", + "sig" : "304402203a6386afb08f7ff8140b5a270f764e8706ef2830fb177446f7b4eeb8a25aac6402204b70854b38c29245b2b980eba10ea936c68a38c1da5255ce2386db23afc7c06a", + "result" : "valid" + }, + { + "tcId" : 371, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32303935343235363835", + "sig" : "3046022100b8fc54a8a6be3c55e99c06f99ccdcce7af5c18a3c5829726a870cc1068458f64022100cc7237c39c8e6a4a1c8c62f5f88636549c7410798b89684c502c3adfe5fb7ad2", + "result" : "valid" + }, + { + "tcId" : 372, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31303038303938393833", + "sig" : "3045022047b460851e5607f2021626635c565a63f78f558795e1b330d09115970dbbb8ab022100a6a9f4f213e08d3c736d3e1c44a35140cb107619f265a5b13608ed729fd6d894", + "result" : "valid" + }, + { + "tcId" : 373, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31353734313437393237", + "sig" : "30450221008cfda4f7a65864ebbea3144863da9b075c07b5b42cb4569643ddfd70dd753b190220595784b1ab217874b82b9585521f8090b9f6322884ab7a620464f51cf846c5b7", + "result" : "valid" + }, + { + "tcId" : 374, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32383636373731353232", + "sig" : "304402204cd6a45bd7c8bf0edbdf073dbf1f746234cbbca31ec20b526b077c9f480096e702207cf97ae0d33f50b73a5d7adf8aa4eeeb6ff10f89a8794efe1d874e23299c1b3d", + "result" : "valid" + }, + { + "tcId" : 375, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31363934323830373837", + "sig" : "304402202e233f4df8ffebeaec64842b23cce161c80d303b016eca562429b227ae2b58ec022046b6b56adec82f82b54daa6a5fca286740a1704828052072a5f0bc8c7b884242", + "result" : "valid" + }, + { + "tcId" : 376, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "39393231363932353638", + "sig" : "30440220549f658d4a3f98233a2c93bd5b1a52d64af10815ae60becb4139cac822b579c3022027bdddf0dbcf374a2aec8accc47a8ac897f8d1823dda8eb2052590970b39ce2a", + "result" : "valid" + }, + { + "tcId" : 377, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3131363039343339373938", + "sig" : "30450221009fabcc1e5fd965226902f594559e231369e584453974e74f49d7d762e134fb9d0220293cccc510793bac45ce5da2bb6c9e906437f59435ca206655f74b625df07c7c", + "result" : "valid" + }, + { + "tcId" : 378, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37313836313632313030", + "sig" : "304502202e5c140fd6f5f823addc8088ffaae967e7f4897274316769561dfb31435825d9022100eda47327d7cfae1daa344ff5582a467bd18eb9f01caeab9c6da3c0cc89df6713", + "result" : "valid" + }, + { + "tcId" : 379, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33323934333437313737", + "sig" : "304402204c11e3b7efbe3908ad2118e54d7d34d6c6eb4570bf7fdb11a7679fe93afa254c0220712e90f421836e542dac49d10bb39db4a98b2735b6336d8a3c392f3b90e60bbe", + "result" : "valid" + }, + { + "tcId" : 380, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3138353134343535313230", + "sig" : "3045022100dfb4619303f4ff689563d2275069fac44d63ea3c3b18f4fb1ac805d7df3d12ec022068e37b846583901db256329f9cf64f40c416fba50dcb9be333a3e29c76ae32db", + "result" : "valid" + }, + { + "tcId" : 381, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "343736303433393330", + "sig" : "3045022100e70e8e17bd758ff0c48f91cb2c53d293f0f5ae82eb9dfe76ab98f9b064278635022021dde32cb0389cad7bdf676d9b9b7d25bb034ad25a55ea71ee7ee26a18359dd2", + "result" : "valid" + }, + { + "tcId" : 382, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32353637333738373431", + "sig" : "30440220421397ecae30617a5a6081ad1badf6ce9d9d4cb2afdabf1f900e7fdb7fb0af5a022057ca89dc22801c75fdbefdaeca65c675625f94de7d635062b08ed308df5762cc", + "result" : "valid" + }, + { + "tcId" : 383, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35373339393334393935", + "sig" : "304502200610c08076909bb722fba105c23eac8f66b4db1d58f66a882fc90d59acdec8e0022100af59e8d570761cac589d49f11c884007f7ac1eea1a44c6f3fdad1d542187d25e", + "result" : "valid" + }, + { + "tcId" : 384, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33343738333636313339", + "sig" : "3045022059a1181cab0ee8ce94ab2b5ab4f4b13a422e38efe69f634bf947485a5b9ea49c0221009b3c913d98a4ab15f6a39f1802b8f2d28559aa1f8d03a3a88df00c89dc293a97", + "result" : "valid" + }, + { + "tcId" : 385, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "363439303532363032", + "sig" : "30460221008cae6c4dfbf901bd66ab82541011fa15c8e90e2c18c01bd881acaa2b63cb587b022100a86acf943f29cef91d1b66a7de5547df6cdfc45dd7bef816dcb8de9f5a425d2d", + "result" : "valid" + }, + { + "tcId" : 386, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34373633383837343936", + "sig" : "30450221008b00c74b86474d782eac9974aea606d8f7ee78c79597e15687021f5991e86acd0220309dfe3686648eae104e87b3e9b5616a3ad479ca4f0b558ae4f1e5ab3115346a", + "result" : "valid" + }, + { + "tcId" : 387, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "353739303230303830", + "sig" : "30450220433a915504c977809634a36fcf4480e4c8069fc127d201d30dfdb1f423c95fd4022100bcb1b89aafd50a1766b09741fc6a9a96e744ae9826d839bf85ffb50a91981773", + "result" : "valid" + }, + { + "tcId" : 388, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35333434373837383438", + "sig" : "304502204b69abd2b39840a545cdd4a72d384234580e2fd938b7091d0ecdb562780857db022100fdab9957119e0a4092af82f6cc29f3c8a692671ec86efb0a03c1112a0a1e0467", + "result" : "valid" + }, + { + "tcId" : 389, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3139323636343130393230", + "sig" : "3045022100dab9d3686c28363ad017b4a2b36d35bf2eb80633613d44deb9501d42a3efbd3802201392a562d79f9ab19014e4f7e2f2668259f3720a76c120d4a3c3964e880f7679", + "result" : "valid" + }, + { + "tcId" : 390, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33373033393135373035", + "sig" : "3045022023f94e47b440ce379b74c9311232b19a64e3e7c9b90da34b0c1c3f3d7af28105022100e1425903b1479c2ce18b108a6d1ec8b7a4f0f657dedb00de3a3ceea7fdeee9be", + "result" : "valid" + }, + { + "tcId" : 391, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3831353435373730", + "sig" : "30450221009d706a8fa85d15bd0c3492c6672dfe529f4073b217b3947b5b2cfd61f87ccb7102206aaaaf369f82a0e542f72ded7d7eb90c8314ffa613a0ea81da1c8393dbae2bac", + "result" : "valid" + }, + { + "tcId" : 392, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "313935353330333737", + "sig" : "3046022100ac77918c4085c8a7ce5020b00c315629aee053a445cb4661eb50f6b62a47da29022100df2aea2b9c11a6ce39d3cd9e1faf4a53057e0b1b2e48a324be9e773203fe9fbb", + "result" : "valid" + }, + { + "tcId" : 393, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31323637383130393033", + "sig" : "30460221009db2dbd2935f147fae7f6a95c8e2307bd8537c3d96eb732ad6d5ebdd89bc754e02210093a9ab99d2de9d08fe0a61e26c8fe1ebbf88726e4b69d551b57d15f0ae16df5a", + "result" : "valid" + }, + { + "tcId" : 394, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3131313830373230383135", + "sig" : "30440220769f70093939afbd1fa15873decfa803ca523ace8040280ba78cf833497722bc0220369875aba5e1ced5a4ca8444ec9399a38038b00e153a0ae34d9b3c9781447eea", + "result" : "valid" + }, + { + "tcId" : 395, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "38333831383639323930", + "sig" : "3045022026e5182b9822550ad52f46ad80781d6bef3d110a204db5e58a0746f796982200022100a9418e76029ced0cf78a571a9e59ad04086e91f70e6813981bb33c1dee891165", + "result" : "valid" + }, + { + "tcId" : 396, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33313331323837323737", + "sig" : "3046022100e7bd6aefcf7b27e1f3fadbe713f9adb3d23398e88200cd2e94989c9d12e921770221009583e0de3b76f8d4b1e634a81cbc34af54e2f8599f3684ce48d372760c8204c4", + "result" : "valid" + }, + { + "tcId" : 397, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3134333331393236353338", + "sig" : "30450221008638ed7eaa83609a01a6af9c52ec9bfddda90442b1e6031d61cfa22e48b2e1e2022020c284d596f71c6c8df732f5a5a2006302301e1a792e2b39663d93a9760762d2", + "result" : "valid" + }, + { + "tcId" : 398, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "333434393038323336", + "sig" : "3044022061d924307a96180b06383608ba91674e15c3ea06ff2534412b93a587dde649c1022059b84aa2115b2547edac88088ca6313e9fbe1ca6a361c7e57938f9dde3f4349c", + "result" : "valid" + }, + { + "tcId" : 399, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36383239383335393239", + "sig" : "30450220424fcfc3fd63d128c2eb125e88c7fe5d283b63470a786b82783edbb8a0b7a6d7022100b11548c2cd7fce9d44e795ca51af0b2f6a5180e9c9be0314007ed9e7f4bbe5e9", + "result" : "valid" + }, + { + "tcId" : 400, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33343435313538303233", + "sig" : "3045022100a5f747ae6290fa9582c6ce8d5608621d495f061551bc4531bacba586a563b184022062faf8f92291e12812835b3f1d43c967bceb885b110bd06e5a68e2d74781ae2b", + "result" : "valid" + }, + { + "tcId" : 401, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3132363937393837363434", + "sig" : "3045022100b731dc0d92c2cc7a605d78233f7814699bdf1cab2df297b6844eec4015af8ea0022039b1a0cc88eb85bcdc356b3620c51f1298c60aec5306b107e900ffdba049dd6f", + "result" : "valid" + }, + { + "tcId" : 402, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "333939323432353533", + "sig" : "3046022100ef73c4fa322da39fb6503bab6b66b64d241056afbcd6908f84b61ccbbe890433022100f1ef85413e5764aa58a3128ccfcf388324fe5340e5edf8d0135ae76786ce415b", + "result" : "valid" + }, + { + "tcId" : 403, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31363031393737393737", + "sig" : "30450220694cd30e2ad0182579331474b271ee2d48723bc8415dc6513873586ce705b76b022100c5ac0c0ed5a4017d110cb45d63aa955dc7dc5ce23e7965c5397c3ff46a884636", + "result" : "valid" + }, + { + "tcId" : 404, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3130383738373535313435", + "sig" : "3046022100f38b2236be3024e10b894ffb1cc68d0bb8d4cf0fcd2cfc1779f8883765d3cd96022100da69cd0b74c25566d60a486edd559fc39d569fb2751445a4798df8a36891802c", + "result" : "valid" + }, + { + "tcId" : 405, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37303034323532393939", + "sig" : "3046022100a881732c205a0b4b95669c00756fd91973450109a46f17d5a9d971b5e92b9aa40221008acefdca4e06c16b47ccad1c57c05912637e107096ba230c92b97187db79e19e", + "result" : "valid" + }, + { + "tcId" : 406, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31353635333235323833", + "sig" : "3044022004452f554bae819b42effb84ef44a9f1cb7e2d75b4ba9ff9b9cfffaddde3fd1b022061a3fbc5e73c350f2e3d85a7452cd231a3f3375fc11f5fe153b185f53b09c1d0", + "result" : "valid" + }, + { + "tcId" : 407, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3233383236333432333530", + "sig" : "3045022005814f57f58efc7cb490119e584e635e6f0ad1c19fb5dc2edafda075bb55f98e0221009dd5c6e39009d67d965903ecffe08a851775cc1248cc19c0b77798282131b8f6", + "result" : "valid" + }, + { + "tcId" : 408, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31343437383437303635", + "sig" : "3045022100dc1c4a46085e198843b1f01980cd5e4a1ff6f8e8ff7014397f0afd5b247fb0a0022038a13dc723ed90b30251d742b14733a03292ff26530a1ebcaf3d10862a6eff82", + "result" : "valid" + }, + { + "tcId" : 409, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3134323630323035353434", + "sig" : "304502201067667bf525734ca7f2510e36348fd9c2c9bccf032dfd571de6d45abd49361a022100fa762568d3a19e5a1d8ea65e00202a5b16f9afae56733a01f86e35378c558da4", + "result" : "valid" + }, + { + "tcId" : 410, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31393933383335323835", + "sig" : "3046022100e58d69dc56bc1031644847e3e046e2ea845a515d969d07ea1aa53aea5bd92fa1022100bfe50b80f7c512f5ab521fe7e1a131045fde78d4de826c91573baaba1e35ca97", + "result" : "valid" + }, + { + "tcId" : 411, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34323932313533353233", + "sig" : "3046022100fe79c6b8c14d0f23d426e3d157f1b541f6bb91bf29957ef97c55949c9ba48a350221009da112c4a4cf4b1ff490c426f6c8ff122183964a0de56f7336ab382dc9d10285", + "result" : "valid" + }, + { + "tcId" : 412, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34343539393031343936", + "sig" : "3045022045d4ed7e9edacb5a730944ab0037fba0a136ed9d0d26b2f4d4058554f148fa6f022100f136f15fd30cfe5e5548b3f4965c16a66a7c12904686abe12da777619212ae8c", + "result" : "valid" + }, + { + "tcId" : 413, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31333933393731313731", + "sig" : "304402204fb7c1727e40bae272f6143a50001b54b536f90233157896dbf845e263f2486302206fea5c924dca17519f6e502ef67efa08d39eb5cc3381266f0216864d2bd00a62", + "result" : "valid" + }, + { + "tcId" : 414, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32333930363936343935", + "sig" : "30450220779aac665dd988054b04f2e9d483ca79179b3372b58ca00fe43520f44fcb4c32022100b4eca1182cd51f0abd3ea2268dcda49a807ad4116a583102047498aa863653f5", + "result" : "valid" + }, + { + "tcId" : 415, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3131343436303536323634", + "sig" : "3046022100db7ac6f65fb1c38d80064fd11861631237a09924b4eeca4e1569fa4b7d80ad24022100a38d178d37e13e1afa07a9d03da025d594461938a62a6c6744f5c8f7d7b7bb81", + "result" : "valid" + }, + { + "tcId" : 416, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "363835303034373530", + "sig" : "3046022100c90043b4aadf795d870ac223f33acdbd1948c31afff059054dc99528c6503fa6022100829f67b312bb134f6954a23c611a7f7b5b2a69efced9c48db589ac0b4d3da827", + "result" : "valid" + }, + { + "tcId" : 417, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3232323035333630363139", + "sig" : "3045022100fa16c0125b6615b90e81f7499804308a90179bf3fcff6a4b2695271c68b23ded02200d6cda5ce041dc5a5f319ad9c0de4927d0cf5e89e37b79216194413d42976d54", + "result" : "valid" + }, + { + "tcId" : 418, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36323135363635313234", + "sig" : "304502201a4b5bd0f806549f46a3e71bfe412d6d89206017640ded66f3d0b2d9b26bec45022100aac5f74e3130264e01428570ee82ee47e245d160ed812ae252dedffd82e1ec2c", + "result" : "valid" + }, + { + "tcId" : 419, + "comment" : "Signature generated without truncating the hash", + "flags" : [ + "Untruncatedhash" + ], + "msg" : "313233343030", + "sig" : "3045022100f8e272234b51475ec4c6f327562a6e5c9080a96225e88b2e5f72a8eecbd41ab40220516b91617fc39e3141b3bc769f6a3b2e468e687f50bdc29e19088af62d203f4b", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04b6e08b1bcc89e7fb0b84d7497e310553495be4877eccc4b3d6d79f7c68a0573431760fa1bcea4972759174ac1103bc6011985ccee251918d0573fbcb78969116", + "wx" : "00b6e08b1bcc89e7fb0b84d7497e310553495be4877eccc4b3d6d79f7c68a05734", + "wy" : "31760fa1bcea4972759174ac1103bc6011985ccee251918d0573fbcb78969116" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b6e08b1bcc89e7fb0b84d7497e310553495be4877eccc4b3d6d79f7c68a0573431760fa1bcea4972759174ac1103bc6011985ccee251918d0573fbcb78969116", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEtuCLG8yJ5/sLhNdJfjEFU0lb5Id+\nzMSz1teffGigVzQxdg+hvOpJcnWRdKwRA7xgEZhczuJRkY0Fc/vLeJaRFg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 420, + "comment" : "k*G has a large x-coordinate", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "303502104319055358e8617b0c46353d039cdaab022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e", + "result" : "valid" + }, + { + "tcId" : 421, + "comment" : "r too large", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000001000000000000000000000000fffffffffffffffffffffffc022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "043590c6a10353d669bc94d8e2ff9e14bbeed4a7f45b887255ab7e37b676387bb615fc6f97ce39a3874c2b34cc571889abfa0a706c2cfb0e5a4750cc25690696f8", + "wx" : "3590c6a10353d669bc94d8e2ff9e14bbeed4a7f45b887255ab7e37b676387bb6", + "wy" : "15fc6f97ce39a3874c2b34cc571889abfa0a706c2cfb0e5a4750cc25690696f8" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043590c6a10353d669bc94d8e2ff9e14bbeed4a7f45b887255ab7e37b676387bb615fc6f97ce39a3874c2b34cc571889abfa0a706c2cfb0e5a4750cc25690696f8", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENZDGoQNT1mm8lNji/54Uu+7Up/Rb\niHJVq343tnY4e7YV/G+Xzjmjh0wrNMxXGImr+gpwbCz7DlpHUMwlaQaW+A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 422, + "comment" : "r,s are large", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04369e96402f2cfd1a37b3acbdecfc562862dbca944a0f12d7aaacb8d325d7650aa723621922be2bdac9186290fdcdda028d94437966507d93f2fc1f5c887fdedb", + "wx" : "369e96402f2cfd1a37b3acbdecfc562862dbca944a0f12d7aaacb8d325d7650a", + "wy" : "00a723621922be2bdac9186290fdcdda028d94437966507d93f2fc1f5c887fdedb" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004369e96402f2cfd1a37b3acbdecfc562862dbca944a0f12d7aaacb8d325d7650aa723621922be2bdac9186290fdcdda028d94437966507d93f2fc1f5c887fdedb", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENp6WQC8s/Ro3s6y97PxWKGLbypRK\nDxLXqqy40yXXZQqnI2IZIr4r2skYYpD9zdoCjZRDeWZQfZPy/B9ciH/e2w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 423, + "comment" : "r and s^-1 have a large Hamming weight", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100909135bdb6799286170f5ead2de4f6511453fe50914f3df2de54a36383df8dd4", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0427a0a80ea2e1aa798ea9bcc3aedbf01ab78e49c9ec2ad0e08a0429a0e1db4d0d32a8ee7bee9d0a40014e484f34a92bd6f33fe63624ea9579657441ac79666e7f", + "wx" : "27a0a80ea2e1aa798ea9bcc3aedbf01ab78e49c9ec2ad0e08a0429a0e1db4d0d", + "wy" : "32a8ee7bee9d0a40014e484f34a92bd6f33fe63624ea9579657441ac79666e7f" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000427a0a80ea2e1aa798ea9bcc3aedbf01ab78e49c9ec2ad0e08a0429a0e1db4d0d32a8ee7bee9d0a40014e484f34a92bd6f33fe63624ea9579657441ac79666e7f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEJ6CoDqLhqnmOqbzDrtvwGreOScns\nKtDgigQpoOHbTQ0yqO577p0KQAFOSE80qSvW8z/mNiTqlXlldEGseWZufw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 424, + "comment" : "r and s^-1 have a large Hamming weight", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022027b4577ca009376f71303fd5dd227dcef5deb773ad5f5a84360644669ca249a5", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "049cff61712d4bc5b3638341e6e0a576a8098c9c6d3f198d389c4669f398dc0867f3b9e09f567f3dfd9c4d2c1163e82beadf16c76e8f9d7a64673800ea76fa1e59", + "wx" : "009cff61712d4bc5b3638341e6e0a576a8098c9c6d3f198d389c4669f398dc0867", + "wy" : "00f3b9e09f567f3dfd9c4d2c1163e82beadf16c76e8f9d7a64673800ea76fa1e59" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200049cff61712d4bc5b3638341e6e0a576a8098c9c6d3f198d389c4669f398dc0867f3b9e09f567f3dfd9c4d2c1163e82beadf16c76e8f9d7a64673800ea76fa1e59", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEnP9hcS1LxbNjg0Hm4KV2qAmMnG0/\nGY04nEZp85jcCGfzueCfVn89/ZxNLBFj6Cvq3xbHbo+demRnOADqdvoeWQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 425, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020105020101", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04d9117cae81295e82682fa387991e668e1570e0e90100bf4e63964822460561bc19f96b1787ed15769929978ba3dd7f68c97adf5c16f671e756cd8f08c49456ca", + "wx" : "00d9117cae81295e82682fa387991e668e1570e0e90100bf4e63964822460561bc", + "wy" : "19f96b1787ed15769929978ba3dd7f68c97adf5c16f671e756cd8f08c49456ca" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d9117cae81295e82682fa387991e668e1570e0e90100bf4e63964822460561bc19f96b1787ed15769929978ba3dd7f68c97adf5c16f671e756cd8f08c49456ca", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE2RF8roEpXoJoL6OHmR5mjhVw4OkB\nAL9OY5ZIIkYFYbwZ+WsXh+0Vdpkpl4uj3X9oyXrfXBb2cedWzY8IxJRWyg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 426, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020105020103", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "048cfcbad3524c22b992529f943e3ce0b2d126085501d6e3edd4f1dbf74bdca21eafb259b1ba179cac09e8e43a88c8a09e7339910a7c941932e44b8be56f1fccde", + "wx" : "008cfcbad3524c22b992529f943e3ce0b2d126085501d6e3edd4f1dbf74bdca21e", + "wy" : "00afb259b1ba179cac09e8e43a88c8a09e7339910a7c941932e44b8be56f1fccde" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048cfcbad3524c22b992529f943e3ce0b2d126085501d6e3edd4f1dbf74bdca21eafb259b1ba179cac09e8e43a88c8a09e7339910a7c941932e44b8be56f1fccde", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEjPy601JMIrmSUp+UPjzgstEmCFUB\n1uPt1PHb90vcoh6vslmxuhecrAno5DqIyKCeczmRCnyUGTLkS4vlbx/M3g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 427, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020105020105", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04fbb51127e1f1b6a38e9fe9a2544614edb8e43ad7cd8c56f14b3235dda3bc11179abd9753a9e647e9340c395fb2b91384d6d33fcb6456214350b6f3fa00f4364c", + "wx" : "00fbb51127e1f1b6a38e9fe9a2544614edb8e43ad7cd8c56f14b3235dda3bc1117", + "wy" : "009abd9753a9e647e9340c395fb2b91384d6d33fcb6456214350b6f3fa00f4364c" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004fbb51127e1f1b6a38e9fe9a2544614edb8e43ad7cd8c56f14b3235dda3bc11179abd9753a9e647e9340c395fb2b91384d6d33fcb6456214350b6f3fa00f4364c", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+7URJ+HxtqOOn+miVEYU7bjkOtfN\njFbxSzI13aO8EReavZdTqeZH6TQMOV+yuROE1tM/y2RWIUNQtvP6APQ2TA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 428, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020105020106", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04cba74b6b024a29a173df9abb9593294a6b8e83efd7f48d67311dcfb557ca80b8e68417e9afb0494417a568129701137effb2174b5c50bb8adf716a4a5ca95d0c", + "wx" : "00cba74b6b024a29a173df9abb9593294a6b8e83efd7f48d67311dcfb557ca80b8", + "wy" : "00e68417e9afb0494417a568129701137effb2174b5c50bb8adf716a4a5ca95d0c" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cba74b6b024a29a173df9abb9593294a6b8e83efd7f48d67311dcfb557ca80b8e68417e9afb0494417a568129701137effb2174b5c50bb8adf716a4a5ca95d0c", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEy6dLawJKKaFz35q7lZMpSmuOg+/X\n9I1nMR3PtVfKgLjmhBfpr7BJRBelaBKXARN+/7IXS1xQu4rfcWpKXKldDA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 429, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020106020101", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04ea4518f4df8b277eb5ad16cb6bf851e841cedccd99c95c28f681c18a643d15ce4077c637f77b4da58ac8c9ab59523ebb0619d97dca2df1cb8a457b160af1adb9", + "wx" : "00ea4518f4df8b277eb5ad16cb6bf851e841cedccd99c95c28f681c18a643d15ce", + "wy" : "4077c637f77b4da58ac8c9ab59523ebb0619d97dca2df1cb8a457b160af1adb9" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ea4518f4df8b277eb5ad16cb6bf851e841cedccd99c95c28f681c18a643d15ce4077c637f77b4da58ac8c9ab59523ebb0619d97dca2df1cb8a457b160af1adb9", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE6kUY9N+LJ361rRbLa/hR6EHO3M2Z\nyVwo9oHBimQ9Fc5Ad8Y393tNpYrIyatZUj67BhnZfcot8cuKRXsWCvGtuQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 430, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020106020103", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04e148d9966e5b9b536380927de72e59a6655e7070091b25b47b44fdb2a8bd390f35259cd39d6f6ed62340d12152b0fdc1702be5ebdb8f0061d6607b05ca3d7b1b", + "wx" : "00e148d9966e5b9b536380927de72e59a6655e7070091b25b47b44fdb2a8bd390f", + "wy" : "35259cd39d6f6ed62340d12152b0fdc1702be5ebdb8f0061d6607b05ca3d7b1b" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004e148d9966e5b9b536380927de72e59a6655e7070091b25b47b44fdb2a8bd390f35259cd39d6f6ed62340d12152b0fdc1702be5ebdb8f0061d6607b05ca3d7b1b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE4UjZlm5bm1NjgJJ95y5ZpmVecHAJ\nGyW0e0T9sqi9OQ81JZzTnW9u1iNA0SFSsP3BcCvl69uPAGHWYHsFyj17Gw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 431, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020106020106", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04a61edf1f6e011a27b9fb4e43ca2ef58c1dd6a7f5cf9e89a678d87b2f9a6d8a80b6e5624c5ef144000bde93ccec7ec58b3c646b42e3d92806b281f35c62c39ccf", + "wx" : "00a61edf1f6e011a27b9fb4e43ca2ef58c1dd6a7f5cf9e89a678d87b2f9a6d8a80", + "wy" : "00b6e5624c5ef144000bde93ccec7ec58b3c646b42e3d92806b281f35c62c39ccf" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a61edf1f6e011a27b9fb4e43ca2ef58c1dd6a7f5cf9e89a678d87b2f9a6d8a80b6e5624c5ef144000bde93ccec7ec58b3c646b42e3d92806b281f35c62c39ccf", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEph7fH24BGie5+05Dyi71jB3Wp/XP\nnommeNh7L5ptioC25WJMXvFEAAvek8zsfsWLPGRrQuPZKAaygfNcYsOczw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 432, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020106020107", + "result" : "valid" + }, + { + "tcId" : 433, + "comment" : "r is larger than n", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632557020107", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04a1ff55a03cd061f2408c0ada1ae9f7197f53ef84190564fd3dace78839bc6420178e94a5d6028186997cd36f3c8d2631a272d7936b2cfb3d62730f8c0fe80983", + "wx" : "00a1ff55a03cd061f2408c0ada1ae9f7197f53ef84190564fd3dace78839bc6420", + "wy" : "178e94a5d6028186997cd36f3c8d2631a272d7936b2cfb3d62730f8c0fe80983" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a1ff55a03cd061f2408c0ada1ae9f7197f53ef84190564fd3dace78839bc6420178e94a5d6028186997cd36f3c8d2631a272d7936b2cfb3d62730f8c0fe80983", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEof9VoDzQYfJAjAraGun3GX9T74QZ\nBWT9PazniDm8ZCAXjpSl1gKBhpl80288jSYxonLXk2ss+z1icw+MD+gJgw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 434, + "comment" : "s is larger than n", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3026020106022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc75fbd8", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "041b824a11eed94fbcd9b722d06613bbcf7eca00b9136f2652642178f37b1a920ee900de495d9ef56fa6d19f3dd1e0edb23d23835ac8c2d3d13c0227e852e503eb", + "wx" : "1b824a11eed94fbcd9b722d06613bbcf7eca00b9136f2652642178f37b1a920e", + "wy" : "00e900de495d9ef56fa6d19f3dd1e0edb23d23835ac8c2d3d13c0227e852e503eb" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200041b824a11eed94fbcd9b722d06613bbcf7eca00b9136f2652642178f37b1a920ee900de495d9ef56fa6d19f3dd1e0edb23d23835ac8c2d3d13c0227e852e503eb", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEG4JKEe7ZT7zZtyLQZhO7z37KALkT\nbyZSZCF483sakg7pAN5JXZ71b6bRnz3R4O2yPSODWsjC09E8AifoUuUD6w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 435, + "comment" : "small r and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3027020201000221008f1e3c7862c58b16bb76eddbb76eddbb516af4f63f2d74d76e0d28c9bb75ea88", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042914b30c4c784696ffc3dddcec05f36cb1488bc342b9f529d5387acb9e48cb8d3dbd30d0d5d6d6a39108863c2d6a6e8571cd3261fb9eb98ce46125bd8f139136", + "wx" : "2914b30c4c784696ffc3dddcec05f36cb1488bc342b9f529d5387acb9e48cb8d", + "wy" : "3dbd30d0d5d6d6a39108863c2d6a6e8571cd3261fb9eb98ce46125bd8f139136" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042914b30c4c784696ffc3dddcec05f36cb1488bc342b9f529d5387acb9e48cb8d3dbd30d0d5d6d6a39108863c2d6a6e8571cd3261fb9eb98ce46125bd8f139136", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKRSzDEx4Rpb/w93c7AXzbLFIi8NC\nufUp1Th6y55Iy409vTDQ1dbWo5EIhjwtam6Fcc0yYfueuYzkYSW9jxORNg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 436, + "comment" : "smallish r and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "302c02072d9b4d347952d6022100ef3043e7329581dbb3974497710ab11505ee1c87ff907beebadd195a0ffe6d7a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042579f546fe2f2aeb5f822feb28f2f8371618d04815455a7e903c10024a17da415528e951147f76bee1314e65a49c6ec70686e62d38fbc23472f96e3d3b33fd1f", + "wx" : "2579f546fe2f2aeb5f822feb28f2f8371618d04815455a7e903c10024a17da41", + "wy" : "5528e951147f76bee1314e65a49c6ec70686e62d38fbc23472f96e3d3b33fd1f" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042579f546fe2f2aeb5f822feb28f2f8371618d04815455a7e903c10024a17da415528e951147f76bee1314e65a49c6ec70686e62d38fbc23472f96e3d3b33fd1f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEJXn1Rv4vKutfgi/rKPL4NxYY0EgV\nRVp+kDwQAkoX2kFVKOlRFH92vuExTmWknG7HBobmLTj7wjRy+W49OzP9Hw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 437, + "comment" : "100-bit r and small s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3032020d1033e67e37b32b445580bf4eff0221008b748b74000000008b748b748b748b7466e769ad4a16d3dcd87129b8e91d1b4d", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04b102196bf455ee5aafc6f895504d3c3b6b2d37c35f8669bd0f0b694795fbd992f777b6f829b9628ac35db0ef43f6a89f0a42812614e4c15924d8d47ebe45bae5", + "wx" : "00b102196bf455ee5aafc6f895504d3c3b6b2d37c35f8669bd0f0b694795fbd992", + "wy" : "00f777b6f829b9628ac35db0ef43f6a89f0a42812614e4c15924d8d47ebe45bae5" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b102196bf455ee5aafc6f895504d3c3b6b2d37c35f8669bd0f0b694795fbd992f777b6f829b9628ac35db0ef43f6a89f0a42812614e4c15924d8d47ebe45bae5", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEsQIZa/RV7lqvxviVUE08O2stN8Nf\nhmm9DwtpR5X72ZL3d7b4KbliisNdsO9D9qifCkKBJhTkwVkk2NR+vkW65Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 438, + "comment" : "small r and 100 bit s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "302702020100022100ef9f6ba4d97c09d03178fa20b4aaad83be3cf9cb824a879fec3270fc4b81ef5b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "044d056ab2ff57662fd6eebbe23930fef5cd08083e24146190cd01960b1fcd3749fe7ec5847651c857898be0f09efd6e0116a5dbe327f6f3080a65fc966bf64d91", + "wx" : "4d056ab2ff57662fd6eebbe23930fef5cd08083e24146190cd01960b1fcd3749", + "wy" : "00fe7ec5847651c857898be0f09efd6e0116a5dbe327f6f3080a65fc966bf64d91" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044d056ab2ff57662fd6eebbe23930fef5cd08083e24146190cd01960b1fcd3749fe7ec5847651c857898be0f09efd6e0116a5dbe327f6f3080a65fc966bf64d91", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETQVqsv9XZi/W7rviOTD+9c0ICD4k\nFGGQzQGWCx/NN0n+fsWEdlHIV4mL4PCe/W4BFqXb4yf28wgKZfyWa/ZNkQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 439, + "comment" : "100-bit r and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3032020d062522bbd3ecbe7c39e93e7c25022100ef9f6ba4d97c09d03178fa20b4aaad83be3cf9cb824a879fec3270fc4b81ef5b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04361c4a62cd867613138dfe24ccebc4b7df1b55fc7410f4995ee2b6b9ab2220584f116c6c84e53d262fd13a5f5de6b57e7a1981de4ecdffdf3323b4e91d80649c", + "wx" : "361c4a62cd867613138dfe24ccebc4b7df1b55fc7410f4995ee2b6b9ab222058", + "wy" : "4f116c6c84e53d262fd13a5f5de6b57e7a1981de4ecdffdf3323b4e91d80649c" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004361c4a62cd867613138dfe24ccebc4b7df1b55fc7410f4995ee2b6b9ab2220584f116c6c84e53d262fd13a5f5de6b57e7a1981de4ecdffdf3323b4e91d80649c", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENhxKYs2GdhMTjf4kzOvEt98bVfx0\nEPSZXuK2uasiIFhPEWxshOU9Ji/ROl9d5rV+ehmB3k7N/98zI7TpHYBknA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 440, + "comment" : "r and s^-1 are close to n", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d50220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "048156a2127c4c46a1ecf24c0522b85fabe94e6c8b9d962420b2acc9e2b6291af05235bf5dc5ccdd1bd333bce846197de363ba0dc158ef0f0174d714a09e76a66f", + "wx" : "008156a2127c4c46a1ecf24c0522b85fabe94e6c8b9d962420b2acc9e2b6291af0", + "wy" : "5235bf5dc5ccdd1bd333bce846197de363ba0dc158ef0f0174d714a09e76a66f" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048156a2127c4c46a1ecf24c0522b85fabe94e6c8b9d962420b2acc9e2b6291af05235bf5dc5ccdd1bd333bce846197de363ba0dc158ef0f0174d714a09e76a66f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEgVaiEnxMRqHs8kwFIrhfq+lObIud\nliQgsqzJ4rYpGvBSNb9dxczdG9MzvOhGGX3jY7oNwVjvDwF01xSgnnambw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 441, + "comment" : "r and s are 64-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30160209009c44febf31c3594f020900839ed28247c2b06b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04cb180dda5ed44ca0f78cc19c6659c88451b4d0084a4a904cb2dc770f78318613fae0bd290165858bd670788f5f78ad7806b49a2b932409e3dfb7195ccafaad0d", + "wx" : "00cb180dda5ed44ca0f78cc19c6659c88451b4d0084a4a904cb2dc770f78318613", + "wy" : "00fae0bd290165858bd670788f5f78ad7806b49a2b932409e3dfb7195ccafaad0d" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cb180dda5ed44ca0f78cc19c6659c88451b4d0084a4a904cb2dc770f78318613fae0bd290165858bd670788f5f78ad7806b49a2b932409e3dfb7195ccafaad0d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEyxgN2l7UTKD3jMGcZlnIhFG00AhK\nSpBMstx3D3gxhhP64L0pAWWFi9ZweI9feK14BrSaK5MkCePftxlcyvqtDQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 442, + "comment" : "r and s are 100-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "301e020d09df8b682430beef6f5fd7c7cd020d0fd0a62e13778f4222a0d61c8a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0417e9a8ed4d6141f99dcc7794468576b16a9404c82a1969b91db0ca7534a5e00bbc4edd49e6dcf0476bd986551c3adccd4ddcdcdee6eb567cb68d925b4674113d", + "wx" : "17e9a8ed4d6141f99dcc7794468576b16a9404c82a1969b91db0ca7534a5e00b", + "wy" : "00bc4edd49e6dcf0476bd986551c3adccd4ddcdcdee6eb567cb68d925b4674113d" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000417e9a8ed4d6141f99dcc7794468576b16a9404c82a1969b91db0ca7534a5e00bbc4edd49e6dcf0476bd986551c3adccd4ddcdcdee6eb567cb68d925b4674113d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEF+mo7U1hQfmdzHeURoV2sWqUBMgq\nGWm5HbDKdTSl4Au8Tt1J5tzwR2vZhlUcOtzNTdzc3ubrVny2jZJbRnQRPQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 443, + "comment" : "r and s are 128-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30260211008a598e563a89f526c32ebec8de26367c02110084f633e2042630e99dd0f1e16f7a04bf", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04f123d6999fec34a68c99539d2c9d50268fcdfafa99215d900c93c0c59bd34d933095156ba887f0f965804af24995cf5572553e6adb04da368a90419e523185ce", + "wx" : "00f123d6999fec34a68c99539d2c9d50268fcdfafa99215d900c93c0c59bd34d93", + "wy" : "3095156ba887f0f965804af24995cf5572553e6adb04da368a90419e523185ce" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004f123d6999fec34a68c99539d2c9d50268fcdfafa99215d900c93c0c59bd34d933095156ba887f0f965804af24995cf5572553e6adb04da368a90419e523185ce", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE8SPWmZ/sNKaMmVOdLJ1QJo/N+vqZ\nIV2QDJPAxZvTTZMwlRVrqIfw+WWASvJJlc9VclU+atsE2jaKkEGeUjGFzg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 444, + "comment" : "r and s are 160-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "302e021500aa6eeb5823f7fa31b466bb473797f0d0314c0bdf021500e2977c479e6d25703cebbc6bd561938cc9d1bfb9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04db9d5c5113f00822a146c9cda2e75cb6634cd0dff54aff6e22875171f57a0dad1c424cdd83eb01c02f6f8d36f42c6dc7e39db74358da8ac9bc9dc5890d46f667", + "wx" : "00db9d5c5113f00822a146c9cda2e75cb6634cd0dff54aff6e22875171f57a0dad", + "wy" : "1c424cdd83eb01c02f6f8d36f42c6dc7e39db74358da8ac9bc9dc5890d46f667" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004db9d5c5113f00822a146c9cda2e75cb6634cd0dff54aff6e22875171f57a0dad1c424cdd83eb01c02f6f8d36f42c6dc7e39db74358da8ac9bc9dc5890d46f667", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE251cURPwCCKhRsnNoudctmNM0N/1\nSv9uIodRcfV6Da0cQkzdg+sBwC9vjTb0LG3H4523Q1jaism8ncWJDUb2Zw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 445, + "comment" : "s == 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30250220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70020101", + "result" : "valid" + }, + { + "tcId" : 446, + "comment" : "s == 0", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30250220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70020100", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "044d9cddf6b4ff05cdf5f557a32db1712e49ab45ae53ade49b9469e665ffa2db773ead4c88e83f38cd16d61dda97645355424279e5132dfec14421cabfc1203a6b", + "wx" : "4d9cddf6b4ff05cdf5f557a32db1712e49ab45ae53ade49b9469e665ffa2db77", + "wy" : "3ead4c88e83f38cd16d61dda97645355424279e5132dfec14421cabfc1203a6b" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044d9cddf6b4ff05cdf5f557a32db1712e49ab45ae53ade49b9469e665ffa2db773ead4c88e83f38cd16d61dda97645355424279e5132dfec14421cabfc1203a6b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETZzd9rT/Bc319VejLbFxLkmrRa5T\nreSblGnmZf+i23c+rUyI6D84zRbWHdqXZFNVQkJ55RMt/sFEIcq/wSA6aw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 447, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022002f676969f451a8ccafa4c4f09791810e6d632dbd60b1d5540f3284fbe1889b0", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "045eb0559c2fde581a0df6207f3b2872d8e80a1ec8f6d542bf0319ec254c1c23ea272a1ab985cdfab8573a797ed554e137bda258ae3c841ccbf6559187b3471233", + "wx" : "5eb0559c2fde581a0df6207f3b2872d8e80a1ec8f6d542bf0319ec254c1c23ea", + "wy" : "272a1ab985cdfab8573a797ed554e137bda258ae3c841ccbf6559187b3471233" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045eb0559c2fde581a0df6207f3b2872d8e80a1ec8f6d542bf0319ec254c1c23ea272a1ab985cdfab8573a797ed554e137bda258ae3c841ccbf6559187b3471233", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEXrBVnC/eWBoN9iB/Oyhy2OgKHsj2\n1UK/AxnsJUwcI+onKhq5hc36uFc6eX7VVOE3vaJYrjyEHMv2VZGHs0cSMw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 448, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002204e260962e33362ef0046126d2d5a4edc6947ab20e19b8ec19cf79e5908b6e628", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042cb4debf57562b9aa191e38d101c51d8bd3eedf242a1123cd3c6060526c4dd2bdc6abd94d54374aede721d0c78193e9b999508a9f2a9ae8737f87a5fc7e0c673", + "wx" : "2cb4debf57562b9aa191e38d101c51d8bd3eedf242a1123cd3c6060526c4dd2b", + "wy" : "00dc6abd94d54374aede721d0c78193e9b999508a9f2a9ae8737f87a5fc7e0c673" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042cb4debf57562b9aa191e38d101c51d8bd3eedf242a1123cd3c6060526c4dd2bdc6abd94d54374aede721d0c78193e9b999508a9f2a9ae8737f87a5fc7e0c673", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAELLTev1dWK5qhkeONEBxR2L0+7fJC\noRI808YGBSbE3Svcar2U1UN0rt5yHQx4GT6bmZUIqfKproc3+Hpfx+DGcw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 449, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220077ed0d8f20f697d8fc591ac64dd5219c7932122b4f9b9ec6441e44a0092cf21", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0463d556714900ed08e751f58c1978c1a673c9a9bf975fc4b8af32c2e7944f21d4c2cdf2e7b72fcffe3e8767dc769856ef9fec98ef0139b22f87166300a3781599", + "wx" : "63d556714900ed08e751f58c1978c1a673c9a9bf975fc4b8af32c2e7944f21d4", + "wy" : "00c2cdf2e7b72fcffe3e8767dc769856ef9fec98ef0139b22f87166300a3781599" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000463d556714900ed08e751f58c1978c1a673c9a9bf975fc4b8af32c2e7944f21d4c2cdf2e7b72fcffe3e8767dc769856ef9fec98ef0139b22f87166300a3781599", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEY9VWcUkA7QjnUfWMGXjBpnPJqb+X\nX8S4rzLC55RPIdTCzfLnty/P/j6HZ9x2mFbvn+yY7wE5si+HFmMAo3gVmQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 450, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002203e0292a67e181c6c0105ee35e956e78e9bdd033c6e71ae57884039a245e4175f", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "040d09be47824c5c23f727bfb550c6dbbdf90abb35d3623013f1c6d7d31be03d95845fede0a0f580dff795e7d5b278a2c78bfa5c4facd1fccfe190ec8eef206778", + "wx" : "0d09be47824c5c23f727bfb550c6dbbdf90abb35d3623013f1c6d7d31be03d95", + "wy" : "00845fede0a0f580dff795e7d5b278a2c78bfa5c4facd1fccfe190ec8eef206778" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040d09be47824c5c23f727bfb550c6dbbdf90abb35d3623013f1c6d7d31be03d95845fede0a0f580dff795e7d5b278a2c78bfa5c4facd1fccfe190ec8eef206778", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEDQm+R4JMXCP3J7+1UMbbvfkKuzXT\nYjAT8cbX0xvgPZWEX+3goPWA3/eV59WyeKLHi/pcT6zR/M/hkOyO7yBneA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 451, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022013d22b06d6b8f5d97e0c64962b4a3bae30f668ca6217ef5b35d799f159e23ebe", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0435b75a83731a5b56325add4f28a09742039e0e62f75728e896783fd957400d5be3f3fa5269577faa7089e9c8e9d9f732ef78d433e4be382820323c197c5bbc39", + "wx" : "35b75a83731a5b56325add4f28a09742039e0e62f75728e896783fd957400d5b", + "wy" : "00e3f3fa5269577faa7089e9c8e9d9f732ef78d433e4be382820323c197c5bbc39" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000435b75a83731a5b56325add4f28a09742039e0e62f75728e896783fd957400d5be3f3fa5269577faa7089e9c8e9d9f732ef78d433e4be382820323c197c5bbc39", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENbdag3MaW1YyWt1PKKCXQgOeDmL3\nVyjolng/2VdADVvj8/pSaVd/qnCJ6cjp2fcy73jUM+S+OCggMjwZfFu8OQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 452, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002204523ce342e4994bb8968bf6613f60c06c86111f15a3a389309e72cd447d5dd99", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04fdd28d47e3d60ed4c7fd48e68003f48c5346354ecae2e4b1b4ff43ecd6058fcb010d7e9f008ae48f88a90640999a931ee47d77b2cfb442c614b14054af2c9ddf", + "wx" : "00fdd28d47e3d60ed4c7fd48e68003f48c5346354ecae2e4b1b4ff43ecd6058fcb", + "wy" : "010d7e9f008ae48f88a90640999a931ee47d77b2cfb442c614b14054af2c9ddf" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004fdd28d47e3d60ed4c7fd48e68003f48c5346354ecae2e4b1b4ff43ecd6058fcb010d7e9f008ae48f88a90640999a931ee47d77b2cfb442c614b14054af2c9ddf", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/dKNR+PWDtTH/UjmgAP0jFNGNU7K\n4uSxtP9D7NYFj8sBDX6fAIrkj4ipBkCZmpMe5H13ss+0QsYUsUBUryyd3w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 453, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022037d765be3c9c78189ad30edb5097a4db670de11686d01420e37039d4677f4809", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0473d914dde798f430d51de4e43b3cc5aa557fc4797d9a1820813509979efe3753089ffa286ba30505e3a9ae5c9587854ddb3de2a04ee7a0dbed0dfb087e2d190b", + "wx" : "73d914dde798f430d51de4e43b3cc5aa557fc4797d9a1820813509979efe3753", + "wy" : "089ffa286ba30505e3a9ae5c9587854ddb3de2a04ee7a0dbed0dfb087e2d190b" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000473d914dde798f430d51de4e43b3cc5aa557fc4797d9a1820813509979efe3753089ffa286ba30505e3a9ae5c9587854ddb3de2a04ee7a0dbed0dfb087e2d190b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEc9kU3eeY9DDVHeTkOzzFqlV/xHl9\nmhgggTUJl57+N1MIn/ooa6MFBeOprlyVh4VN2z3ioE7noNvtDfsIfi0ZCw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 454, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022044237823b54e0c74c2bf5f759d9ac5f8cb897d537ffa92effd4f0bb6c9acd860", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0424861819b9fb20fb1fcc75eb7a44b2abbb36047812429119ba5b232dfc1ad3c244ec4740e65634fae7d692ea166cb4640201486845c2fb96d4f49beaecc3289a", + "wx" : "24861819b9fb20fb1fcc75eb7a44b2abbb36047812429119ba5b232dfc1ad3c2", + "wy" : "44ec4740e65634fae7d692ea166cb4640201486845c2fb96d4f49beaecc3289a" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000424861819b9fb20fb1fcc75eb7a44b2abbb36047812429119ba5b232dfc1ad3c244ec4740e65634fae7d692ea166cb4640201486845c2fb96d4f49beaecc3289a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEJIYYGbn7IPsfzHXrekSyq7s2BHgS\nQpEZulsjLfwa08JE7EdA5lY0+ufWkuoWbLRkAgFIaEXC+5bU9Jvq7MMomg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 455, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220266d30a485385906054ca86d46f5f2b17e7f4646a3092092ad92877126538111", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04de056c8c24eb527ad5021ddcf3b16b099b668a03f7da03075f410a0770347bde01880d2a7b162491221c0b370fe81f28924422a4c70117682b898bc325791ce4", + "wx" : "00de056c8c24eb527ad5021ddcf3b16b099b668a03f7da03075f410a0770347bde", + "wy" : "01880d2a7b162491221c0b370fe81f28924422a4c70117682b898bc325791ce4" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004de056c8c24eb527ad5021ddcf3b16b099b668a03f7da03075f410a0770347bde01880d2a7b162491221c0b370fe81f28924422a4c70117682b898bc325791ce4", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE3gVsjCTrUnrVAh3c87FrCZtmigP3\n2gMHX0EKB3A0e94BiA0qexYkkSIcCzcP6B8okkQipMcBF2griYvDJXkc5A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 456, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220538c7b3798e84d0ce90340165806348971ed44db8f0c674f5f215968390f92ee", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04cf2de76812f62ecd4e7d8e674d1b79dddbdca18677c8ba338a71b65134d0429fad6d87d6d6592ba1130b81198f6fbe39719cb872d30fc1757af2ae86307b3f9e", + "wx" : "00cf2de76812f62ecd4e7d8e674d1b79dddbdca18677c8ba338a71b65134d0429f", + "wy" : "00ad6d87d6d6592ba1130b81198f6fbe39719cb872d30fc1757af2ae86307b3f9e" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cf2de76812f62ecd4e7d8e674d1b79dddbdca18677c8ba338a71b65134d0429fad6d87d6d6592ba1130b81198f6fbe39719cb872d30fc1757af2ae86307b3f9e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzy3naBL2Ls1OfY5nTRt53dvcoYZ3\nyLozinG2UTTQQp+tbYfW1lkroRMLgRmPb745cZy4ctMPwXV68q6GMHs/ng==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 457, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002206fef0ef15d1688e15e704c4e6bb8bb7f40d52d3af5c661bb78c4ed9b408699b3", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0428d9b9fe0d3c2471f224476eb89c13fa68b433213c31b6376b16226abfeae1c636fef52918dd106cd21958f1f379b09278051472309731ea1192121b3b78f873", + "wx" : "28d9b9fe0d3c2471f224476eb89c13fa68b433213c31b6376b16226abfeae1c6", + "wy" : "36fef52918dd106cd21958f1f379b09278051472309731ea1192121b3b78f873" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000428d9b9fe0d3c2471f224476eb89c13fa68b433213c31b6376b16226abfeae1c636fef52918dd106cd21958f1f379b09278051472309731ea1192121b3b78f873", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKNm5/g08JHHyJEduuJwT+mi0MyE8\nMbY3axYiar/q4cY2/vUpGN0QbNIZWPHzebCSeAUUcjCXMeoRkhIbO3j4cw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 458, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002206f44275e9aeb1331efcb8d58f35c0252791427e403ad84daad51d247cc2a64c6", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04334ddf8629f0b980796f255e650e247598f6f71e90c501dd11fcb58ea1e6c0a39215c31a4741e4b28657fc7ddb490c0e2a21c7b770460301344dbdd67e85f30d", + "wx" : "334ddf8629f0b980796f255e650e247598f6f71e90c501dd11fcb58ea1e6c0a3", + "wy" : "009215c31a4741e4b28657fc7ddb490c0e2a21c7b770460301344dbdd67e85f30d" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004334ddf8629f0b980796f255e650e247598f6f71e90c501dd11fcb58ea1e6c0a39215c31a4741e4b28657fc7ddb490c0e2a21c7b770460301344dbdd67e85f30d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM03fhinwuYB5byVeZQ4kdZj29x6Q\nxQHdEfy1jqHmwKOSFcMaR0HksoZX/H3bSQwOKiHHt3BGAwE0Tb3WfoXzDQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 459, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022021323755b103d2f9da6ab83eccab9ad8598bcf625652f10e7a3eeee3c3945fb3", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "048e889d0a2530f73421ad2e08302651f41ddeb1ae5083ce7e313e06d6928c375afeca9b4490f6aa5e8d45d187ec8d3ab699f29c0cc77386c56f93f2f39e0f2874", + "wx" : "008e889d0a2530f73421ad2e08302651f41ddeb1ae5083ce7e313e06d6928c375a", + "wy" : "00feca9b4490f6aa5e8d45d187ec8d3ab699f29c0cc77386c56f93f2f39e0f2874" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048e889d0a2530f73421ad2e08302651f41ddeb1ae5083ce7e313e06d6928c375afeca9b4490f6aa5e8d45d187ec8d3ab699f29c0cc77386c56f93f2f39e0f2874", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEjoidCiUw9zQhrS4IMCZR9B3esa5Q\ng85+MT4G1pKMN1r+yptEkPaqXo1F0YfsjTq2mfKcDMdzhsVvk/Lzng8odA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 460, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002206c50acfe76de1289e7a5edb240f1c2a7879db6873d5d931f3c6ac467a6eac171", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04297ef19b14f0dfb7c4a294732096ed4304bc5e2eeb86581e0014ddb6e14920878bf2260ecb396e33383c4898bd954dd3c6e7bcdd7810ad0a649f97722bad0095", + "wx" : "297ef19b14f0dfb7c4a294732096ed4304bc5e2eeb86581e0014ddb6e1492087", + "wy" : "008bf2260ecb396e33383c4898bd954dd3c6e7bcdd7810ad0a649f97722bad0095" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004297ef19b14f0dfb7c4a294732096ed4304bc5e2eeb86581e0014ddb6e14920878bf2260ecb396e33383c4898bd954dd3c6e7bcdd7810ad0a649f97722bad0095", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKX7xmxTw37fEopRzIJbtQwS8Xi7r\nhlgeABTdtuFJIIeL8iYOyzluMzg8SJi9lU3Txue83XgQrQpkn5dyK60AlQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 461, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220755b7fffb0b17ad57dca50fcefb7fe297b029df25e5ccb5069e8e70c2742c2a6", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0499f19f07b33e03caf4703e04b930d57d6d9baa44460c596a2d3064e0b63ea41286a74c4612a812ee348d2b43f80de627c11c75d81511e22a199c32119b792c6a", + "wx" : "0099f19f07b33e03caf4703e04b930d57d6d9baa44460c596a2d3064e0b63ea412", + "wy" : "0086a74c4612a812ee348d2b43f80de627c11c75d81511e22a199c32119b792c6a" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000499f19f07b33e03caf4703e04b930d57d6d9baa44460c596a2d3064e0b63ea41286a74c4612a812ee348d2b43f80de627c11c75d81511e22a199c32119b792c6a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEmfGfB7M+A8r0cD4EuTDVfW2bqkRG\nDFlqLTBk4LY+pBKGp0xGEqgS7jSNK0P4DeYnwRx12BUR4ioZnDIRm3ksag==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 462, + "comment" : "point at infinity during verify", + "flags" : [ + "PointDuplication", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a80220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04313f3309b236484c6eb4ea381e007854467a617343a2e97d845801c01a632cfe33f231854bba89a8ca3f802a2764d3bf6c3233c811a31e5e8028a0b862cb1977", + "wx" : "313f3309b236484c6eb4ea381e007854467a617343a2e97d845801c01a632cfe", + "wy" : "33f231854bba89a8ca3f802a2764d3bf6c3233c811a31e5e8028a0b862cb1977" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004313f3309b236484c6eb4ea381e007854467a617343a2e97d845801c01a632cfe33f231854bba89a8ca3f802a2764d3bf6c3233c811a31e5e8028a0b862cb1977", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEMT8zCbI2SExutOo4HgB4VEZ6YXND\noul9hFgBwBpjLP4z8jGFS7qJqMo/gConZNO/bDIzyBGjHl6AKKC4YssZdw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 463, + "comment" : "edge case for signature malleability", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a902207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a8", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04d3aa01fe59bad92cffe3db59e1385391fafd7af4e4ce462e8aac157274cc8a05c7a7e603e18538aac15f89610beacc21e39898e6c5f7680a81c5bd7bd744a989", + "wx" : "00d3aa01fe59bad92cffe3db59e1385391fafd7af4e4ce462e8aac157274cc8a05", + "wy" : "00c7a7e603e18538aac15f89610beacc21e39898e6c5f7680a81c5bd7bd744a989" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d3aa01fe59bad92cffe3db59e1385391fafd7af4e4ce462e8aac157274cc8a05c7a7e603e18538aac15f89610beacc21e39898e6c5f7680a81c5bd7bd744a989", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE06oB/lm62Sz/49tZ4ThTkfr9evTk\nzkYuiqwVcnTMigXHp+YD4YU4qsFfiWEL6swh45iY5sX3aAqBxb1710SpiQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 464, + "comment" : "edge case for signature malleability", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a902207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "045e31eccd4704ebf7a4247ea57f9351abadff63679f2276e2a3b05009ebc1b8df648465a925010db823b2a5f3a6072343a6cc9961a9c482399d0d82051c2e3232", + "wx" : "5e31eccd4704ebf7a4247ea57f9351abadff63679f2276e2a3b05009ebc1b8df", + "wy" : "648465a925010db823b2a5f3a6072343a6cc9961a9c482399d0d82051c2e3232" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045e31eccd4704ebf7a4247ea57f9351abadff63679f2276e2a3b05009ebc1b8df648465a925010db823b2a5f3a6072343a6cc9961a9c482399d0d82051c2e3232", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEXjHszUcE6/ekJH6lf5NRq63/Y2ef\nInbio7BQCevBuN9khGWpJQENuCOypfOmByNDpsyZYanEgjmdDYIFHC4yMg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 465, + "comment" : "u1 == 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04ce0a47f881fd7315a733c4317848fa33c72e38de0b8fda36b61aa9a164f5808a85b05d25115ea4097ddf63f878c8e83657e66de136a8f9e62ed81a58bf117ff9", + "wx" : "00ce0a47f881fd7315a733c4317848fa33c72e38de0b8fda36b61aa9a164f5808a", + "wy" : "0085b05d25115ea4097ddf63f878c8e83657e66de136a8f9e62ed81a58bf117ff9" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ce0a47f881fd7315a733c4317848fa33c72e38de0b8fda36b61aa9a164f5808a85b05d25115ea4097ddf63f878c8e83657e66de136a8f9e62ed81a58bf117ff9", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzgpH+IH9cxWnM8QxeEj6M8cuON4L\nj9o2thqpoWT1gIqFsF0lEV6kCX3fY/h4yOg2V+Zt4Tao+eYu2BpYvxF/+Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 466, + "comment" : "u1 == n - 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30450220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022100bc07ff031506dc74a75086a43252fb43731975a16dca6b025e867412d94222d0", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04cd6f487b47f36c0dea8f4b04c4e6ac637c76b725929c611f48addcf3d2f65941b50ea8f3a491190ee0b20cfb6efd113608e7c7c127577500e7f5c4a4e490fd60", + "wx" : "00cd6f487b47f36c0dea8f4b04c4e6ac637c76b725929c611f48addcf3d2f65941", + "wy" : "00b50ea8f3a491190ee0b20cfb6efd113608e7c7c127577500e7f5c4a4e490fd60" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cd6f487b47f36c0dea8f4b04c4e6ac637c76b725929c611f48addcf3d2f65941b50ea8f3a491190ee0b20cfb6efd113608e7c7c127577500e7f5c4a4e490fd60", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzW9Ie0fzbA3qj0sExOasY3x2tyWS\nnGEfSK3c89L2WUG1DqjzpJEZDuCyDPtu/RE2COfHwSdXdQDn9cSk5JD9YA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 467, + "comment" : "u2 == 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04456e5f8067d68a1b0a2e8fe2b28acad5755687154a0f167734ebabbdc059070d720dbe96659a66ef0cf27a73e7b3f3f145a60e0ad29f1e21dcc2bb42f0d82c1e", + "wx" : "456e5f8067d68a1b0a2e8fe2b28acad5755687154a0f167734ebabbdc059070d", + "wy" : "720dbe96659a66ef0cf27a73e7b3f3f145a60e0ad29f1e21dcc2bb42f0d82c1e" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004456e5f8067d68a1b0a2e8fe2b28acad5755687154a0f167734ebabbdc059070d720dbe96659a66ef0cf27a73e7b3f3f145a60e0ad29f1e21dcc2bb42f0d82c1e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAERW5fgGfWihsKLo/isorK1XVWhxVK\nDxZ3NOurvcBZBw1yDb6WZZpm7wzyenPns/PxRaYOCtKfHiHcwrtC8NgsHg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 468, + "comment" : "u2 == n - 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30450220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022100aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0442bf0c0ac1e3850baf5515748a878e34249f71035e20a9f54ed468ec273cb0fc5b3138500230055c71f12d53f5c7d0e3d8aa54a94c668cb311e20d195fc71abb", + "wx" : "42bf0c0ac1e3850baf5515748a878e34249f71035e20a9f54ed468ec273cb0fc", + "wy" : "5b3138500230055c71f12d53f5c7d0e3d8aa54a94c668cb311e20d195fc71abb" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000442bf0c0ac1e3850baf5515748a878e34249f71035e20a9f54ed468ec273cb0fc5b3138500230055c71f12d53f5c7d0e3d8aa54a94c668cb311e20d195fc71abb", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEQr8MCsHjhQuvVRV0ioeONCSfcQNe\nIKn1TtRo7Cc8sPxbMThQAjAFXHHxLVP1x9Dj2KpUqUxmjLMR4g0ZX8cauw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 469, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02206bfd55a8f8fdb68472e52873ef39ac3eace6d53df576f0ad2da4607bb52c0d46", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04ffdd48da63d3af67223f16c51eb7e95600eb0b0e8b964f4fcd8c534face3c2c2b4e009ab2a76829480e69c9e43b2f1fe076cfafb3fa8d27dd4d6bab4d6c3db54", + "wx" : "00ffdd48da63d3af67223f16c51eb7e95600eb0b0e8b964f4fcd8c534face3c2c2", + "wy" : "00b4e009ab2a76829480e69c9e43b2f1fe076cfafb3fa8d27dd4d6bab4d6c3db54" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ffdd48da63d3af67223f16c51eb7e95600eb0b0e8b964f4fcd8c534face3c2c2b4e009ab2a76829480e69c9e43b2f1fe076cfafb3fa8d27dd4d6bab4d6c3db54", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/91I2mPTr2ciPxbFHrfpVgDrCw6L\nlk9PzYxTT6zjwsK04AmrKnaClIDmnJ5DsvH+B2z6+z+o0n3U1rq01sPbVA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 470, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220654937791db0686f712ff9b453eeadb0026c9b058bba49199ca3e8fac03c094f", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04793cbfce6f335dcfede7c6898ea1c537d7661ed6a8c9d308d64a2560d21c6e2c483d23a5ff05da00eaf9d52cf5362be9b53b95316c6a32e9ebe68d9ac35c2fd6", + "wx" : "793cbfce6f335dcfede7c6898ea1c537d7661ed6a8c9d308d64a2560d21c6e2c", + "wy" : "483d23a5ff05da00eaf9d52cf5362be9b53b95316c6a32e9ebe68d9ac35c2fd6" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004793cbfce6f335dcfede7c6898ea1c537d7661ed6a8c9d308d64a2560d21c6e2c483d23a5ff05da00eaf9d52cf5362be9b53b95316c6a32e9ebe68d9ac35c2fd6", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEeTy/zm8zXc/t58aJjqHFN9dmHtao\nydMI1kolYNIcbixIPSOl/wXaAOr51Sz1NivptTuVMWxqMunr5o2aw1wv1g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 471, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100c51bbee23a95437abe5c978f8fe596a31c858ac8d55be9786aa5d36a5ac74e97", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04a9f7023f559d4bb6c9f4bc3643e2824aff5451d929479ec3ea5eb30bad2c36ac6a7c77e8dd21f4ad49b103e67da9d3cda62b653dd194fad2ba8d1dd37bb0ea9b", + "wx" : "00a9f7023f559d4bb6c9f4bc3643e2824aff5451d929479ec3ea5eb30bad2c36ac", + "wy" : "6a7c77e8dd21f4ad49b103e67da9d3cda62b653dd194fad2ba8d1dd37bb0ea9b" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a9f7023f559d4bb6c9f4bc3643e2824aff5451d929479ec3ea5eb30bad2c36ac6a7c77e8dd21f4ad49b103e67da9d3cda62b653dd194fad2ba8d1dd37bb0ea9b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEqfcCP1WdS7bJ9Lw2Q+KCSv9UUdkp\nR57D6l6zC60sNqxqfHfo3SH0rUmxA+Z9qdPNpitlPdGU+tK6jR3Te7Dqmw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 472, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0221008ba4c3da7154ba564ab344ae12005aa482b6c1639ea191f8568afb6e47163c45", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04df79ee082b2fc77e9ce4633471f569bbcb5ce53856e3067774f37e8a64a2c7ffaa488a6c34d499df76f427de3609bfcfd9feae67ffe0b0de594463c453b0ab16", + "wx" : "00df79ee082b2fc77e9ce4633471f569bbcb5ce53856e3067774f37e8a64a2c7ff", + "wy" : "00aa488a6c34d499df76f427de3609bfcfd9feae67ffe0b0de594463c453b0ab16" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004df79ee082b2fc77e9ce4633471f569bbcb5ce53856e3067774f37e8a64a2c7ffaa488a6c34d499df76f427de3609bfcfd9feae67ffe0b0de594463c453b0ab16", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE33nuCCsvx36c5GM0cfVpu8tc5ThW\n4wZ3dPN+imSix/+qSIpsNNSZ33b0J942Cb/P2f6uZ//gsN5ZRGPEU7CrFg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 473, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02204c3dafcf4ba55bf1344ae12005aa4a74f46eaa85f5023131cc637ae2ea90ab26", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "044cc3bf65e32e00284adfca00f40df755415c485091ac0489ae9a337103a5f8f0123ab86dd433b933b4f2063c002144df3cfeba78dad0ed89c0377541532908c2", + "wx" : "4cc3bf65e32e00284adfca00f40df755415c485091ac0489ae9a337103a5f8f0", + "wy" : "123ab86dd433b933b4f2063c002144df3cfeba78dad0ed89c0377541532908c2" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044cc3bf65e32e00284adfca00f40df755415c485091ac0489ae9a337103a5f8f0123ab86dd433b933b4f2063c002144df3cfeba78dad0ed89c0377541532908c2", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETMO/ZeMuAChK38oA9A33VUFcSFCR\nrASJrpozcQOl+PASOrht1DO5M7TyBjwAIUTfPP66eNrQ7YnAN3VBUykIwg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 474, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100987b5f9e974ab7e26895c2400b5494e9e8dd550bea04626398c6f5c5d521564c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04264a7ad439a4828a9dc97ecf837155355f99ae0b65975f851b541ad3a0e032f067268b7298c73e581866fbcbd161689b16b81cf262e007ce68e25a28c83ef041", + "wx" : "264a7ad439a4828a9dc97ecf837155355f99ae0b65975f851b541ad3a0e032f0", + "wy" : "67268b7298c73e581866fbcbd161689b16b81cf262e007ce68e25a28c83ef041" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004264a7ad439a4828a9dc97ecf837155355f99ae0b65975f851b541ad3a0e032f067268b7298c73e581866fbcbd161689b16b81cf262e007ce68e25a28c83ef041", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEJkp61DmkgoqdyX7Pg3FVNV+Zrgtl\nl1+FG1Qa06DgMvBnJotymMc+WBhm+8vRYWibFrgc8mLgB85o4looyD7wQQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 475, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100fcf97e2fbf0e80d412005aa4a75086a3f004f59d512cb47271798733ab418606", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "041d7ff4d3a41206c8143635f12876e0ea0875ea5e4a5a249250d0eda33daa211f56e89c0beaf910ac934ca12380455600d0fd85b56a7035cb171b3f1c72a15569", + "wx" : "1d7ff4d3a41206c8143635f12876e0ea0875ea5e4a5a249250d0eda33daa211f", + "wy" : "56e89c0beaf910ac934ca12380455600d0fd85b56a7035cb171b3f1c72a15569" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200041d7ff4d3a41206c8143635f12876e0ea0875ea5e4a5a249250d0eda33daa211f56e89c0beaf910ac934ca12380455600d0fd85b56a7035cb171b3f1c72a15569", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHX/006QSBsgUNjXxKHbg6gh16l5K\nWiSSUNDtoz2qIR9W6JwL6vkQrJNMoSOARVYA0P2FtWpwNcsXGz8ccqFVaQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 476, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022079d482b60864d6c5cb4fd5db9e7e28ccd9a5948c316c8740fb429c0f37169a02", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04b09685f338dceb421778a1458d52bed734c236242da2baa280d6f6b7b86e4f117fe6a34146b422d7aebd1a51b20948d7872a514c4cfd7686dc436b70733d6473", + "wx" : "00b09685f338dceb421778a1458d52bed734c236242da2baa280d6f6b7b86e4f11", + "wy" : "7fe6a34146b422d7aebd1a51b20948d7872a514c4cfd7686dc436b70733d6473" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b09685f338dceb421778a1458d52bed734c236242da2baa280d6f6b7b86e4f117fe6a34146b422d7aebd1a51b20948d7872a514c4cfd7686dc436b70733d6473", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEsJaF8zjc60IXeKFFjVK+1zTCNiQt\norqigNb2t7huTxF/5qNBRrQi1669GlGyCUjXhypRTEz9dobcQ2twcz1kcw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 477, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0221008ecd11081a4d0759c14f7bf46813d52cc6738115321be0a4da78a3356bb71510", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04dd811f2c0f5e9d4fbb2ef31818c1cd807247bc14fcd1170bef00e2c71dc037b443a15cdf8f3fbdc87e06250c0720d261d2b8d087fa7bf9548f6293f0ce5ae899", + "wx" : "00dd811f2c0f5e9d4fbb2ef31818c1cd807247bc14fcd1170bef00e2c71dc037b4", + "wy" : "43a15cdf8f3fbdc87e06250c0720d261d2b8d087fa7bf9548f6293f0ce5ae899" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004dd811f2c0f5e9d4fbb2ef31818c1cd807247bc14fcd1170bef00e2c71dc037b443a15cdf8f3fbdc87e06250c0720d261d2b8d087fa7bf9548f6293f0ce5ae899", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE3YEfLA9enU+7LvMYGMHNgHJHvBT8\n0RcL7wDixx3AN7RDoVzfjz+9yH4GJQwHINJh0rjQh/p7+VSPYpPwzlromQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 478, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100e8dbffed13c9a2093085c079714f11f24eb583d73ba2b416b3169183e7d9b4c2", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0469d60ae1f39e1da95809d408894707ad2134f4943a1db089bebf815a391f18db32b401d98bf894d3b6d59e6eb45573285642e358ad687b7d7bf9600b1987809e", + "wx" : "69d60ae1f39e1da95809d408894707ad2134f4943a1db089bebf815a391f18db", + "wy" : "32b401d98bf894d3b6d59e6eb45573285642e358ad687b7d7bf9600b1987809e" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000469d60ae1f39e1da95809d408894707ad2134f4943a1db089bebf815a391f18db32b401d98bf894d3b6d59e6eb45573285642e358ad687b7d7bf9600b1987809e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEadYK4fOeHalYCdQIiUcHrSE09JQ6\nHbCJvr+BWjkfGNsytAHZi/iU07bVnm60VXMoVkLjWK1oe317+WALGYeAng==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 479, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ca01552a838124bec68d6bc6086329e06673900eac5c262e5ce79a8521cd1eae", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04a658553a0620c95e987b5c3163bcfea68c52065f53c9d553f2a924d8b3ed511f79f0dfec4536b65aa5fb31297e96f6b464aa669b9268b3156c43d4612978a577", + "wx" : "00a658553a0620c95e987b5c3163bcfea68c52065f53c9d553f2a924d8b3ed511f", + "wy" : "79f0dfec4536b65aa5fb31297e96f6b464aa669b9268b3156c43d4612978a577" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a658553a0620c95e987b5c3163bcfea68c52065f53c9d553f2a924d8b3ed511f79f0dfec4536b65aa5fb31297e96f6b464aa669b9268b3156c43d4612978a577", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEplhVOgYgyV6Ye1wxY7z+poxSBl9T\nydVT8qkk2LPtUR958N/sRTa2WqX7MSl+lva0ZKpmm5JosxVsQ9RhKXildw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 480, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0221009402aa560702497c8d1ad78c10c653c11000256fb1a0add7c6156a474737180b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04bc4d3354a6a973dd8088919cc181194e879ed7920db30d0d1278edf74413b7b92450d162b26dcb25fbbd53ea4044189981d737055925bd2e86bfb0374b09f3ca", + "wx" : "00bc4d3354a6a973dd8088919cc181194e879ed7920db30d0d1278edf74413b7b9", + "wy" : "2450d162b26dcb25fbbd53ea4044189981d737055925bd2e86bfb0374b09f3ca" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004bc4d3354a6a973dd8088919cc181194e879ed7920db30d0d1278edf74413b7b92450d162b26dcb25fbbd53ea4044189981d737055925bd2e86bfb0374b09f3ca", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvE0zVKapc92AiJGcwYEZToee15IN\nsw0NEnjt90QTt7kkUNFism3LJfu9U+pARBiZgdc3BVklvS6Gv7A3Swnzyg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 481, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02205e03ff818a836e3a53a8435219297da1b98cbad0b6e535812f433a096ca11168", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "040eb628724fce764c687d874ade7b8e0aa4abf20ee6e3610fac9fe3e72f97ab5aed09f4843660eb1daf015d397a7c1073d7ae43bda0ba3e117008785abfffa00f", + "wx" : "0eb628724fce764c687d874ade7b8e0aa4abf20ee6e3610fac9fe3e72f97ab5a", + "wy" : "00ed09f4843660eb1daf015d397a7c1073d7ae43bda0ba3e117008785abfffa00f" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040eb628724fce764c687d874ade7b8e0aa4abf20ee6e3610fac9fe3e72f97ab5aed09f4843660eb1daf015d397a7c1073d7ae43bda0ba3e117008785abfffa00f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEDrYock/OdkxofYdK3nuOCqSr8g7m\n42EPrJ/j5y+Xq1rtCfSENmDrHa8BXTl6fBBz165DvaC6PhFwCHhav/+gDw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 482, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100e28ddf709d4aa1bddf2e4bc7c7f2cb516cb642bb3e39c3feaf2fcf16ab9539f4", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04e7ac5cc7f296912f703f59fe88e49b521da245e12e6eee161ee6b3b1127611a77b3bedd2a773cf58b0629b936dd85dad2d0c39676306ed63e1a9bcd0e08bccc2", + "wx" : "00e7ac5cc7f296912f703f59fe88e49b521da245e12e6eee161ee6b3b1127611a7", + "wy" : "7b3bedd2a773cf58b0629b936dd85dad2d0c39676306ed63e1a9bcd0e08bccc2" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004e7ac5cc7f296912f703f59fe88e49b521da245e12e6eee161ee6b3b1127611a77b3bedd2a773cf58b0629b936dd85dad2d0c39676306ed63e1a9bcd0e08bccc2", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE56xcx/KWkS9wP1n+iOSbUh2iReEu\nbu4WHuazsRJ2Ead7O+3Sp3PPWLBim5Nt2F2tLQw5Z2MG7WPhqbzQ4IvMwg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 483, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207fffffffaaaaaaaaffffffffffffffffe9a2538f37b28a2c513dee40fecbb71a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042407b60abf3ee5edaf92ed505a11d0ddce0ea33eca58a031bb2f162c512f4062fb81bff36bf967e834e3d5d468730dcd70440022ab60061a62fac53350fe259f", + "wx" : "2407b60abf3ee5edaf92ed505a11d0ddce0ea33eca58a031bb2f162c512f4062", + "wy" : "00fb81bff36bf967e834e3d5d468730dcd70440022ab60061a62fac53350fe259f" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042407b60abf3ee5edaf92ed505a11d0ddce0ea33eca58a031bb2f162c512f4062fb81bff36bf967e834e3d5d468730dcd70440022ab60061a62fac53350fe259f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEJAe2Cr8+5e2vku1QWhHQ3c4Ooz7K\nWKAxuy8WLFEvQGL7gb/za/ln6DTj1dRocw3NcEQAIqtgBhpi+sUzUP4lnw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 484, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100b62f26b5f2a2b26f6de86d42ad8a13da3ab3cccd0459b201de009e526adf21f2", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0447b2ad96dfc2f23fe5926809f38042b2c801962bd7394cefbf4aacb2554b7b0bdf2b937a16a7d96a2a0682cd164428890208597f2cdcc734fda73600b5cf6c59", + "wx" : "47b2ad96dfc2f23fe5926809f38042b2c801962bd7394cefbf4aacb2554b7b0b", + "wy" : "00df2b937a16a7d96a2a0682cd164428890208597f2cdcc734fda73600b5cf6c59" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000447b2ad96dfc2f23fe5926809f38042b2c801962bd7394cefbf4aacb2554b7b0bdf2b937a16a7d96a2a0682cd164428890208597f2cdcc734fda73600b5cf6c59", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAER7Ktlt/C8j/lkmgJ84BCssgBlivX\nOUzvv0qsslVLewvfK5N6FqfZaioGgs0WRCiJAghZfyzcxzT9pzYAtc9sWQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 485, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bb1d9ac949dd748cd02bbbe749bd351cd57b38bb61403d700686aa7b4c90851e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0469a65b75f31ae7b4930292f90902461befcee5d1606939c28e01b652a7fbc498cf68619e5860128f56cecf53eba2ffe82889a9bb04a5fa4c8b722bc91d55978a", + "wx" : "69a65b75f31ae7b4930292f90902461befcee5d1606939c28e01b652a7fbc498", + "wy" : "00cf68619e5860128f56cecf53eba2ffe82889a9bb04a5fa4c8b722bc91d55978a" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000469a65b75f31ae7b4930292f90902461befcee5d1606939c28e01b652a7fbc498cf68619e5860128f56cecf53eba2ffe82889a9bb04a5fa4c8b722bc91d55978a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaaZbdfMa57STApL5CQJGG+/O5dFg\naTnCjgG2Uqf7xJjPaGGeWGASj1bOz1Prov/oKImpuwSl+kyLcivJHVWXig==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 486, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022066755a00638cdaec1c732513ca0234ece52545dac11f816e818f725b4f60aaf2", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04b2037176c84db04a6c773e32f9ed1d6b25ef4c303c6725c6932ec2cc2788bcbb9361505e6b771691adb41598f292d6521722404bf183241b195738b77abd6cfe", + "wx" : "00b2037176c84db04a6c773e32f9ed1d6b25ef4c303c6725c6932ec2cc2788bcbb", + "wy" : "009361505e6b771691adb41598f292d6521722404bf183241b195738b77abd6cfe" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b2037176c84db04a6c773e32f9ed1d6b25ef4c303c6725c6932ec2cc2788bcbb9361505e6b771691adb41598f292d6521722404bf183241b195738b77abd6cfe", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEsgNxdshNsEpsdz4y+e0dayXvTDA8\nZyXGky7CzCeIvLuTYVBea3cWka20FZjyktZSFyJAS/GDJBsZVzi3er1s/g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 487, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022055a00c9fcdaebb6032513ca0234ecfffe98ebe492fdf02e48ca48e982beb3669", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "041eef95aef71f793afd50bb2604064d63e88bef7404a4d0e206446245ae2e7834c96e86dd040f9794b63712d90e719576b8b92c406ab0f288ad9b327bd124454f", + "wx" : "1eef95aef71f793afd50bb2604064d63e88bef7404a4d0e206446245ae2e7834", + "wy" : "00c96e86dd040f9794b63712d90e719576b8b92c406ab0f288ad9b327bd124454f" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200041eef95aef71f793afd50bb2604064d63e88bef7404a4d0e206446245ae2e7834c96e86dd040f9794b63712d90e719576b8b92c406ab0f288ad9b327bd124454f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHu+VrvcfeTr9ULsmBAZNY+iL73QE\npNDiBkRiRa4ueDTJbobdBA+XlLY3EtkOcZV2uLksQGqw8oitmzJ70SRFTw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 488, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ab40193f9b5d76c064a27940469d9fffd31d7c925fbe05c919491d3057d66cd2", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04a9734899c954e5b7adbca8f783428b5fbcbdfd3d2813f8d2f95b31a78ab107567667abf8c02ce4951bc59b2564130c27d7b64cdbc5cad95ca42d5bbb7cd4e793", + "wx" : "00a9734899c954e5b7adbca8f783428b5fbcbdfd3d2813f8d2f95b31a78ab10756", + "wy" : "7667abf8c02ce4951bc59b2564130c27d7b64cdbc5cad95ca42d5bbb7cd4e793" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a9734899c954e5b7adbca8f783428b5fbcbdfd3d2813f8d2f95b31a78ab107567667abf8c02ce4951bc59b2564130c27d7b64cdbc5cad95ca42d5bbb7cd4e793", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEqXNImclU5betvKj3g0KLX7y9/T0o\nE/jS+Vsxp4qxB1Z2Z6v4wCzklRvFmyVkEwwn17ZM28XK2VykLVu7fNTnkw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 489, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ca0234ebb5fdcb13ca0234ecffffffffcb0dadbbc7f549f8a26b4408d0dc8600", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "041ae51662331a1dbfab0751d30dfab2273a04a239e055a537b16ab595f9612396434f21c2bfe6555c9fc4a8e82dab1fa5631881b016e0831d9e1bbf5799fcf32e", + "wx" : "1ae51662331a1dbfab0751d30dfab2273a04a239e055a537b16ab595f9612396", + "wy" : "434f21c2bfe6555c9fc4a8e82dab1fa5631881b016e0831d9e1bbf5799fcf32e" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200041ae51662331a1dbfab0751d30dfab2273a04a239e055a537b16ab595f9612396434f21c2bfe6555c9fc4a8e82dab1fa5631881b016e0831d9e1bbf5799fcf32e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEGuUWYjMaHb+rB1HTDfqyJzoEojng\nVaU3sWq1lflhI5ZDTyHCv+ZVXJ/EqOgtqx+lYxiBsBbggx2eG79XmfzzLg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 490, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff3ea3677e082b9310572620ae19933a9e65b285598711c77298815ad3", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0453c90cdd8b0dadd21c44ad557b327f4dbf57144aaf06597deb3f94125206a6c14603475bd79b30e36340cd09b0b59e6cd46ce90150e9ffe5c8a0172b2c9898e3", + "wx" : "53c90cdd8b0dadd21c44ad557b327f4dbf57144aaf06597deb3f94125206a6c1", + "wy" : "4603475bd79b30e36340cd09b0b59e6cd46ce90150e9ffe5c8a0172b2c9898e3" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000453c90cdd8b0dadd21c44ad557b327f4dbf57144aaf06597deb3f94125206a6c14603475bd79b30e36340cd09b0b59e6cd46ce90150e9ffe5c8a0172b2c9898e3", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEU8kM3YsNrdIcRK1VezJ/Tb9XFEqv\nBll96z+UElIGpsFGA0db15sw42NAzQmwtZ5s1GzpAVDp/+XIoBcrLJiY4w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 491, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220266666663bbbbbbbe6666666666666665b37902e023fab7c8f055d86e5cc41f4", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0433797539515c51f429967b8e36930d9fdda1edb13aecec9771f7cde5f6f2e74eba51d0b6456bb902dba1f3ea436f96ad2355da454dc9b32c503c4bc6cfd6d410", + "wx" : "33797539515c51f429967b8e36930d9fdda1edb13aecec9771f7cde5f6f2e74e", + "wy" : "00ba51d0b6456bb902dba1f3ea436f96ad2355da454dc9b32c503c4bc6cfd6d410" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000433797539515c51f429967b8e36930d9fdda1edb13aecec9771f7cde5f6f2e74eba51d0b6456bb902dba1f3ea436f96ad2355da454dc9b32c503c4bc6cfd6d410", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM3l1OVFcUfQplnuONpMNn92h7bE6\n7OyXcffN5fby5066UdC2RWu5Atuh8+pDb5atI1XaRU3JsyxQPEvGz9bUEA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 492, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff36db6db7a492492492492492146c573f4c6dfc8d08a443e258970b09", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "040a8f5f1d5bbd2783fa7f37c86879057fb2fcf25383aafb86d03d6bafb41a17b3eaf6da715fe950349fd5736117b08e15e32cf1d2fdc003e510009f1b4ba1e648", + "wx" : "0a8f5f1d5bbd2783fa7f37c86879057fb2fcf25383aafb86d03d6bafb41a17b3", + "wy" : "00eaf6da715fe950349fd5736117b08e15e32cf1d2fdc003e510009f1b4ba1e648" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040a8f5f1d5bbd2783fa7f37c86879057fb2fcf25383aafb86d03d6bafb41a17b3eaf6da715fe950349fd5736117b08e15e32cf1d2fdc003e510009f1b4ba1e648", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECo9fHVu9J4P6fzfIaHkFf7L88lOD\nqvuG0D1rr7QaF7Pq9tpxX+lQNJ/Vc2EXsI4V4yzx0v3AA+UQAJ8bS6HmSA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 493, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff2aaaaaab7fffffffffffffffc815d0e60b3e596ecb1ad3a27cfd49c4", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "041dbc94e96c056b9d2cb6773bb24b69ed473851badf927a29955aff290ef3675a65e587561122aa8226facb95df08308cadf01c8351a1569176d917821113aa7c", + "wx" : "1dbc94e96c056b9d2cb6773bb24b69ed473851badf927a29955aff290ef3675a", + "wy" : "65e587561122aa8226facb95df08308cadf01c8351a1569176d917821113aa7c" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200041dbc94e96c056b9d2cb6773bb24b69ed473851badf927a29955aff290ef3675a65e587561122aa8226facb95df08308cadf01c8351a1569176d917821113aa7c", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHbyU6WwFa50stnc7sktp7Uc4Ubrf\nknoplVr/KQ7zZ1pl5YdWESKqgib6y5XfCDCMrfAcg1GhVpF22ReCEROqfA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 494, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207fffffff55555555ffffffffffffffffd344a71e6f651458a27bdc81fd976e37", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04084ab885dbff7f12e6cdadb59d456e500797779425c7518c259c83718289e6e991c345d3a093e86670605bbc2ff4c69d0ed694fd433ec6b6ba1bf7d56c3e6b51", + "wx" : "084ab885dbff7f12e6cdadb59d456e500797779425c7518c259c83718289e6e9", + "wy" : "0091c345d3a093e86670605bbc2ff4c69d0ed694fd433ec6b6ba1bf7d56c3e6b51" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004084ab885dbff7f12e6cdadb59d456e500797779425c7518c259c83718289e6e991c345d3a093e86670605bbc2ff4c69d0ed694fd433ec6b6ba1bf7d56c3e6b51", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECEq4hdv/fxLmza21nUVuUAeXd5Ql\nx1GMJZyDcYKJ5umRw0XToJPoZnBgW7wv9MadDtaU/UM+xra6G/fVbD5rUQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 495, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02203fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192aa", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04003adfa4c620a207096cd18ee8fd2a90e20106cf824a0c63d6dec727a9fe7f509430d26bdd5f71e819d12b70069901461ae083cc809122d4fb86b5c475244e5a", + "wx" : "3adfa4c620a207096cd18ee8fd2a90e20106cf824a0c63d6dec727a9fe7f50", + "wy" : "009430d26bdd5f71e819d12b70069901461ae083cc809122d4fb86b5c475244e5a" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004003adfa4c620a207096cd18ee8fd2a90e20106cf824a0c63d6dec727a9fe7f509430d26bdd5f71e819d12b70069901461ae083cc809122d4fb86b5c475244e5a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADrfpMYgogcJbNGO6P0qkOIBBs+C\nSgxj1t7HJ6n+f1CUMNJr3V9x6BnRK3AGmQFGGuCDzICRItT7hrXEdSROWg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 496, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02205d8ecd64a4eeba466815ddf3a4de9a8e6abd9c5db0a01eb80343553da648428f", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "047c98b2d47eb433c0d18e533cfbc8909d66f7b79d5925ccb17eccec9d105c58848d5ca99b350bd7d10ab5ee6fcfe46623fdc03e9f828158f4d4cc08ad1ff83de4", + "wx" : "7c98b2d47eb433c0d18e533cfbc8909d66f7b79d5925ccb17eccec9d105c5884", + "wy" : "008d5ca99b350bd7d10ab5ee6fcfe46623fdc03e9f828158f4d4cc08ad1ff83de4" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047c98b2d47eb433c0d18e533cfbc8909d66f7b79d5925ccb17eccec9d105c58848d5ca99b350bd7d10ab5ee6fcfe46623fdc03e9f828158f4d4cc08ad1ff83de4", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEfJiy1H60M8DRjlM8+8iQnWb3t51Z\nJcyxfszsnRBcWISNXKmbNQvX0Qq17m/P5GYj/cA+n4KBWPTUzAitH/g95A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 497, + "comment" : "point duplication during verification", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "304502206f2347cab7dd76858fe0555ac3bc99048c4aacafdfb6bcbe05ea6c42c4934569022100b4cfa1996ec1d24cdbc8fa17fcabc3a5d4b2b36cf4b50a7b775ab78785710746", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "047c98b2d47eb433c0d18e533cfbc8909d66f7b79d5925ccb17eccec9d105c588472a35663caf4282ff54a1190301b99dc023fc1617d7ea70b2b33f752e007c21b", + "wx" : "7c98b2d47eb433c0d18e533cfbc8909d66f7b79d5925ccb17eccec9d105c5884", + "wy" : "72a35663caf4282ff54a1190301b99dc023fc1617d7ea70b2b33f752e007c21b" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047c98b2d47eb433c0d18e533cfbc8909d66f7b79d5925ccb17eccec9d105c588472a35663caf4282ff54a1190301b99dc023fc1617d7ea70b2b33f752e007c21b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEfJiy1H60M8DRjlM8+8iQnWb3t51Z\nJcyxfszsnRBcWIRyo1ZjyvQoL/VKEZAwG5ncAj/BYX1+pwsrM/dS4AfCGw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 498, + "comment" : "duplication bug", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "304502206f2347cab7dd76858fe0555ac3bc99048c4aacafdfb6bcbe05ea6c42c4934569022100b4cfa1996ec1d24cdbc8fa17fcabc3a5d4b2b36cf4b50a7b775ab78785710746", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04b7a90e21e7547d73267940033cea05042c50f7c9fa5eaeb471cd6260c685f2e38bb7309d0c3bab249faaf3e44179d6dd5302375c580fd0570a788c6be3680c67", + "wx" : "00b7a90e21e7547d73267940033cea05042c50f7c9fa5eaeb471cd6260c685f2e3", + "wy" : "008bb7309d0c3bab249faaf3e44179d6dd5302375c580fd0570a788c6be3680c67" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b7a90e21e7547d73267940033cea05042c50f7c9fa5eaeb471cd6260c685f2e38bb7309d0c3bab249faaf3e44179d6dd5302375c580fd0570a788c6be3680c67", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEt6kOIedUfXMmeUADPOoFBCxQ98n6\nXq60cc1iYMaF8uOLtzCdDDurJJ+q8+RBedbdUwI3XFgP0FcKeIxr42gMZw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 499, + "comment" : "point with x-coordinate 0", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30250201010220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "041550a173373b2d594374f0642cd73de06a045c09c7a4f388c731e8cd8971adfc9a3a9843583a86c0e1c62cbde67165f40a926b1028ba38aa3895e188ebbc7066", + "wx" : "1550a173373b2d594374f0642cd73de06a045c09c7a4f388c731e8cd8971adfc", + "wy" : "009a3a9843583a86c0e1c62cbde67165f40a926b1028ba38aa3895e188ebbc7066" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200041550a173373b2d594374f0642cd73de06a045c09c7a4f388c731e8cd8971adfc9a3a9843583a86c0e1c62cbde67165f40a926b1028ba38aa3895e188ebbc7066", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFVChczc7LVlDdPBkLNc94GoEXAnH\npPOIxzHozYlxrfyaOphDWDqGwOHGLL3mcWX0CpJrECi6OKo4leGI67xwZg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 500, + "comment" : "point with x-coordinate 0", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022101000000000000000000000000000000000000000000000000000000000000000002203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aa9", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04313447778195daa1791a6530cd0697ae34bf9d8d225984394f72eef3505971110996a8fbdd1a70ecd64cb00b595afe1669bfef80d91756a62d84c1d83e0f22ab", + "wx" : "313447778195daa1791a6530cd0697ae34bf9d8d225984394f72eef350597111", + "wy" : "0996a8fbdd1a70ecd64cb00b595afe1669bfef80d91756a62d84c1d83e0f22ab" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004313447778195daa1791a6530cd0697ae34bf9d8d225984394f72eef3505971110996a8fbdd1a70ecd64cb00b595afe1669bfef80d91756a62d84c1d83e0f22ab", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEMTRHd4GV2qF5GmUwzQaXrjS/nY0i\nWYQ5T3Lu81BZcREJlqj73Rpw7NZMsAtZWv4Wab/vgNkXVqYthMHYPg8iqw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 501, + "comment" : "comparison with point at infinity ", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aa9", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "044ada634941476ca63c2c5803eec2f33b2d17920f798a5be6275f5a54cd2e7639b1a04bead5c7314c427492db21b9544d81caa8159587e41aa023aa967f31aaa1", + "wx" : "4ada634941476ca63c2c5803eec2f33b2d17920f798a5be6275f5a54cd2e7639", + "wy" : "00b1a04bead5c7314c427492db21b9544d81caa8159587e41aa023aa967f31aaa1" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044ada634941476ca63c2c5803eec2f33b2d17920f798a5be6275f5a54cd2e7639b1a04bead5c7314c427492db21b9544d81caa8159587e41aa023aa967f31aaa1", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEStpjSUFHbKY8LFgD7sLzOy0Xkg95\nilvmJ19aVM0udjmxoEvq1ccxTEJ0ktshuVRNgcqoFZWH5BqgI6qWfzGqoQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 502, + "comment" : "extreme value for k and edgecase s", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc476699780220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04aacce093270fa59ad412b5459a08e490743b97086c781ac3c8d54030b41a31193bece4956172d56befb7011d684e772905e48d2115444a75ac7a325a3f25f4b1", + "wx" : "00aacce093270fa59ad412b5459a08e490743b97086c781ac3c8d54030b41a3119", + "wy" : "3bece4956172d56befb7011d684e772905e48d2115444a75ac7a325a3f25f4b1" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004aacce093270fa59ad412b5459a08e490743b97086c781ac3c8d54030b41a31193bece4956172d56befb7011d684e772905e48d2115444a75ac7a325a3f25f4b1", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEqszgkycPpZrUErVFmgjkkHQ7lwhs\neBrDyNVAMLQaMRk77OSVYXLVa++3AR1oTncpBeSNIRVESnWsejJaPyX0sQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 503, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022100b6db6db6249249254924924924924924625bd7a09bec4ca81bcdd9f8fd6b63cc", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04f62b8d7feeff5a847ab79212269e55e62fa87ebe930821747b57a511a5ea99f0439ee057bb27898582a683c3fdb7f95404d41d42f276803751a316eb3aab7ebf", + "wx" : "00f62b8d7feeff5a847ab79212269e55e62fa87ebe930821747b57a511a5ea99f0", + "wy" : "439ee057bb27898582a683c3fdb7f95404d41d42f276803751a316eb3aab7ebf" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004f62b8d7feeff5a847ab79212269e55e62fa87ebe930821747b57a511a5ea99f0439ee057bb27898582a683c3fdb7f95404d41d42f276803751a316eb3aab7ebf", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE9iuNf+7/WoR6t5ISJp5V5i+ofr6T\nCCF0e1elEaXqmfBDnuBXuyeJhYKmg8P9t/lUBNQdQvJ2gDdRoxbrOqt+vw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 504, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022100cccccccc00000000cccccccccccccccc971f2ef152794b9d8fc7d568c9e8eaa7", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "044baa07ff6e7bb9aa223d1c61932005fe98fe78b787fdab4bd3619bc8833072a2bcacd63802c56af82607953e72a0f5d3c23bd265544e020951824ea485555d33", + "wx" : "4baa07ff6e7bb9aa223d1c61932005fe98fe78b787fdab4bd3619bc8833072a2", + "wy" : "00bcacd63802c56af82607953e72a0f5d3c23bd265544e020951824ea485555d33" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044baa07ff6e7bb9aa223d1c61932005fe98fe78b787fdab4bd3619bc8833072a2bcacd63802c56af82607953e72a0f5d3c23bd265544e020951824ea485555d33", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAES6oH/257uaoiPRxhkyAF/pj+eLeH\n/atL02GbyIMwcqK8rNY4AsVq+CYHlT5yoPXTwjvSZVROAglRgk6khVVdMw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 505, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc4766997802203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aaa", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "040c753ed1ba92f766800fdd0ae1c0d7f8f4cd8305fd803d8bca881397b5937e2db568509b1faf3cf251de6db9810e8b8caed235da10eeddbed62775c8e5c9460a", + "wx" : "0c753ed1ba92f766800fdd0ae1c0d7f8f4cd8305fd803d8bca881397b5937e2d", + "wy" : "00b568509b1faf3cf251de6db9810e8b8caed235da10eeddbed62775c8e5c9460a" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040c753ed1ba92f766800fdd0ae1c0d7f8f4cd8305fd803d8bca881397b5937e2db568509b1faf3cf251de6db9810e8b8caed235da10eeddbed62775c8e5c9460a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEDHU+0bqS92aAD90K4cDX+PTNgwX9\ngD2LyogTl7WTfi21aFCbH6888lHebbmBDouMrtI12hDu3b7WJ3XI5clGCg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 506, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022049249248db6db6dbb6db6db6db6db6db5a8b230d0b2b51dcd7ebf0c9fef7c185", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04030fdcae6541f22c5bab254e4f1a285c507d1cefea03bf90cf19daf3cb62df695ff2c94d588f2c2b2b0a12bebc011bcee4fa1b54506ec07d0a29d24a0891193c", + "wx" : "030fdcae6541f22c5bab254e4f1a285c507d1cefea03bf90cf19daf3cb62df69", + "wy" : "5ff2c94d588f2c2b2b0a12bebc011bcee4fa1b54506ec07d0a29d24a0891193c" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004030fdcae6541f22c5bab254e4f1a285c507d1cefea03bf90cf19daf3cb62df695ff2c94d588f2c2b2b0a12bebc011bcee4fa1b54506ec07d0a29d24a0891193c", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAw/crmVB8ixbqyVOTxooXFB9HO/q\nA7+Qzxna88ti32lf8slNWI8sKysKEr68ARvO5PobVFBuwH0KKdJKCJEZPA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 507, + "comment" : "extreme value for k", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022016a4502e2781e11ac82cbc9d1edd8c981584d13e18411e2f6e0478c34416e3bb", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0403fc621eaf90c23d8f9fa125d2c59b8728ebccb30ca3e3db879a06ca90f20cdcae58d3f0c6aef0e805be10ea54e23cf6f0397f9addddc2b09088855316b0ef44", + "wx" : "03fc621eaf90c23d8f9fa125d2c59b8728ebccb30ca3e3db879a06ca90f20cdc", + "wy" : "00ae58d3f0c6aef0e805be10ea54e23cf6f0397f9addddc2b09088855316b0ef44" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000403fc621eaf90c23d8f9fa125d2c59b8728ebccb30ca3e3db879a06ca90f20cdcae58d3f0c6aef0e805be10ea54e23cf6f0397f9addddc2b09088855316b0ef44", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEA/xiHq+Qwj2Pn6El0sWbhyjrzLMM\no+Pbh5oGypDyDNyuWNPwxq7w6AW+EOpU4jz28Dl/mt3dwrCQiIVTFrDvRA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 508, + "comment" : "extreme value for k and edgecase s", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2960220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0470f2ce24dc62923bb09cc92d74329bbd0d2e6b0e354c0be2383d24acdccb9e4cd42d1f973466f5e5462a939084a294ebfc7a45629c70ee5def46de9536ea7bf7", + "wx" : "70f2ce24dc62923bb09cc92d74329bbd0d2e6b0e354c0be2383d24acdccb9e4c", + "wy" : "00d42d1f973466f5e5462a939084a294ebfc7a45629c70ee5def46de9536ea7bf7" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000470f2ce24dc62923bb09cc92d74329bbd0d2e6b0e354c0be2383d24acdccb9e4cd42d1f973466f5e5462a939084a294ebfc7a45629c70ee5def46de9536ea7bf7", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEcPLOJNxikjuwnMktdDKbvQ0uaw41\nTAviOD0krNzLnkzULR+XNGb15UYqk5CEopTr/HpFYpxw7l3vRt6VNup79w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 509, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022100b6db6db6249249254924924924924924625bd7a09bec4ca81bcdd9f8fd6b63cc", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04732b8ac0c30fe44307431235271cb5d6e5f677a19ce3f058b939a7bf19349d3c858cc735af8577468275847cf5ec19972e6c20738276e2708b23c595bfc4433d", + "wx" : "732b8ac0c30fe44307431235271cb5d6e5f677a19ce3f058b939a7bf19349d3c", + "wy" : "00858cc735af8577468275847cf5ec19972e6c20738276e2708b23c595bfc4433d" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004732b8ac0c30fe44307431235271cb5d6e5f677a19ce3f058b939a7bf19349d3c858cc735af8577468275847cf5ec19972e6c20738276e2708b23c595bfc4433d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEcyuKwMMP5EMHQxI1Jxy11uX2d6Gc\n4/BYuTmnvxk0nTyFjMc1r4V3RoJ1hHz17BmXLmwgc4J24nCLI8WVv8RDPQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 510, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022100cccccccc00000000cccccccccccccccc971f2ef152794b9d8fc7d568c9e8eaa7", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0447aff9501825a166782bb58a5b459006eacdbce5e5323addad34ec1b6444cdce9199c31502ad4277c73ddd0c807b72634c45762404837d9814a5d4b5a7c3f398", + "wx" : "47aff9501825a166782bb58a5b459006eacdbce5e5323addad34ec1b6444cdce", + "wy" : "009199c31502ad4277c73ddd0c807b72634c45762404837d9814a5d4b5a7c3f398" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000447aff9501825a166782bb58a5b459006eacdbce5e5323addad34ec1b6444cdce9199c31502ad4277c73ddd0c807b72634c45762404837d9814a5d4b5a7c3f398", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAER6/5UBgloWZ4K7WKW0WQBurNvOXl\nMjrdrTTsG2REzc6RmcMVAq1Cd8c93QyAe3JjTEV2JASDfZgUpdS1p8PzmA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 511, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29602203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aaa", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04aed8eeff77644bf83b9222f8f57173fa8217ec7e0763ee7d7171fb6092fba5c06486a86d94f48834ba5adbaf349687f9cee400389642b828e68207b147ca2c46", + "wx" : "00aed8eeff77644bf83b9222f8f57173fa8217ec7e0763ee7d7171fb6092fba5c0", + "wy" : "6486a86d94f48834ba5adbaf349687f9cee400389642b828e68207b147ca2c46" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004aed8eeff77644bf83b9222f8f57173fa8217ec7e0763ee7d7171fb6092fba5c06486a86d94f48834ba5adbaf349687f9cee400389642b828e68207b147ca2c46", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAErtju/3dkS/g7kiL49XFz+oIX7H4H\nY+59cXH7YJL7pcBkhqhtlPSINLpa2680lof5zuQAOJZCuCjmggexR8osRg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 512, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022049249248db6db6dbb6db6db6db6db6db5a8b230d0b2b51dcd7ebf0c9fef7c185", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04f7c54a585a904300d05b53ef3b854e71999a344b89adc0caaa28e254db9bc7c7c161a79f38ff446051303577e40638fb020329940a63c241bb32c2205eb57b7d", + "wx" : "00f7c54a585a904300d05b53ef3b854e71999a344b89adc0caaa28e254db9bc7c7", + "wy" : "00c161a79f38ff446051303577e40638fb020329940a63c241bb32c2205eb57b7d" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004f7c54a585a904300d05b53ef3b854e71999a344b89adc0caaa28e254db9bc7c7c161a79f38ff446051303577e40638fb020329940a63c241bb32c2205eb57b7d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE98VKWFqQQwDQW1PvO4VOcZmaNEuJ\nrcDKqijiVNubx8fBYaefOP9EYFEwNXfkBjj7AgMplApjwkG7MsIgXrV7fQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 513, + "comment" : "extreme value for k", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022016a4502e2781e11ac82cbc9d1edd8c981584d13e18411e2f6e0478c34416e3bb", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5", + "wx" : "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", + "wy" : "4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaxfR8uEsQkf4vOblY6RA8ncDfYEt\n6zOg9KE5RdiYwpZP40Li/hp/m47n60p8D54WK84zV2sxXs7LtkBoN79R9Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 514, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3044022043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b0232102810220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2", + "result" : "invalid" + }, + { + "tcId" : 515, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3045022100bc07ff031506dc74a75086a43252fb43731975a16dca6b025e867412d94222d00220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a", + "wx" : "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", + "wy" : "00b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaxfR8uEsQkf4vOblY6RA8ncDfYEt\n6zOg9KE5RdiYwpawHL0cAeWAZXEYFLWD8GHp1DHMqZTOoTE0Sb+XyECuCg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 516, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3044022043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b0232102810220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2", + "result" : "invalid" + }, + { + "tcId" : 517, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3045022100bc07ff031506dc74a75086a43252fb43731975a16dca6b025e867412d94222d00220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "044f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685", + "wx" : "4f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000", + "wy" : "00ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETzN8z9Z3JqgF5PFgCuKEnfOAfsoR\nc4Ajn72BaQAAAADtneoSTMjDlkFkEemIww9CfrUEr0OjFGzV336mBmbWhQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 518, + "comment" : "x-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30440220554482404173a5582884b0d168a32ef8033d7eb780936c390e8eedf720c7f56402200a15413f9ed0d454b92ab901119e7251a4d444ba1421ba639fa57e0d8cf6b313", + "result" : "valid" + }, + { + "tcId" : 519, + "comment" : "x-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502200b1d838dd54a462745e2c8d5f32637f26fb16dde20a385e45f8a20a8a1f8370e022100ae855e0a10ef087075fda0ed84e2bc5786a681172ea9834e53351316df332bbd", + "result" : "valid" + }, + { + "tcId" : 520, + "comment" : "x-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022100af89e4f2b03e5d1f0352e258ef71493040c17d70c36cfd044128302df2ed5e4a0220420f04148c3e6f06561bd448362d6c6fa3f9aeeb7e42843b4674e7ddfd0ba901", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f49726500493584fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000", + "wx" : "3cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f497265004935", + "wy" : "0084fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f49726500493584fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPPA9YU2JOc/UmaB4c/rCgWGPBrj/\nh+gBXD9JcmUASTWE+hdNeRxyvyzjiAqJYN0qfHoTOKgvhanlnNvegAAAAA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 521, + "comment" : "y-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304402206c1581f1485ccc4e657606fa1a38cf227e3870dc9f41e26b84e28483635e321b02201b3e3c22af23e919b30330f8710f6ef3760c0e2237a9a9f5cf30a1d9f5bbd464", + "result" : "valid" + }, + { + "tcId" : 522, + "comment" : "y-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022100dc83bf97ca28db0e04104a16fe3de694311a6cd9f230a300504ae71d8ec755b1022064a83af0ab3e6037003a1f4240dffd8a342afdee50604ed1afa416fd009e4668", + "result" : "valid" + }, + { + "tcId" : 523, + "comment" : "y-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30450220575b70b4375684291b95d81e3c820ed9bde9e5b7343036e4951f3c46894a6d9d022100f10d716efbfeba953701b603fc9ef6ff6e47edef38c9eeef2d55e6486bc4d6e6", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f4972650049357b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff", + "wx" : "3cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f497265004935", + "wy" : "7b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f4972650049357b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPPA9YU2JOc/UmaB4c/rCgWGPBrj/\nh+gBXD9JcmUASTV7BeixhuONQdMcd/V2nyLVg4XsyFfQelYaYyQhf////w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 524, + "comment" : "y-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30450221008d4f113189dfd3d3239e331f76d3fca9cef86fcd5dc9b4ab2ca38aeba56c178b022078389c3cf11dcff6d6c7f5efd277d480060691144b568a6f090c8902557bfc61", + "result" : "valid" + }, + { + "tcId" : 525, + "comment" : "y-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100834d10ec2d2d50eeebfecd6328f03fafbb488fc043c362cbc67880ec0ebd04b302210094c026feaf6e68759146fe5b6fd52eaa3c3c5552d83719d2cb900615e2a634db", + "result" : "valid" + }, + { + "tcId" : 526, + "comment" : "y-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502206894de495e7bb5566807d475d96a0d414a94f4f02c3ab7c2edc2916deafc1e1f022100a603642c20fabc07182867fcc6923d35be23ad3f97a5f93c6ec5b9cce8239569", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "042829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffffa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e", + "wx" : "2829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffff", + "wy" : "00a01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffffa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKCnDH6ouQA40TtlLyj/NBUWVbrz+\nitD236X/jv////+gGq+vAA5SWFhVr6dnat4oQRMJkFLfV+frO9N+vrkiLg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 527, + "comment" : "x-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100e500c086fedd59e090ce7bfb615751ed9abe4c09b839ee8f05320245b9796f3e022100807b1d0638c86ef6113fff0d63497800e1b848b5a303a54c748e45ca8f35d7d7", + "result" : "valid" + }, + { + "tcId" : 528, + "comment" : "x-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100b922c1abe1a8309c0acf90e586c6de8c33e37057673390a97ff098f71680b32b022100f86d92b051b7923d82555c205e21b54eab869766c716209648c3e6cc2629057d", + "result" : "valid" + }, + { + "tcId" : 529, + "comment" : "x-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100823c37e46c74ec8497d89245fde3bf53ddb462c00d840e983dcb1b72bbf8bf27022100c4552f2425d14f0f0fa988778403d60a58962e7c548715af83b2edabbb24a49f", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f55a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73", + "wx" : "00fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f5", + "wy" : "5a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f55a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE////+UgIHmoEWN2PnnOPJmX/kFmt\naqwHCDGMTKmnpPVairy6LdqEdDEe5UFJuXPK4MD7iVV60L945lKaFmO9cw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 530, + "comment" : "x-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30450220577a08a95db6dcda9985109942d3786630f640190f920b95bd4d5d84e0f163ef022100d762286e92925973fd38b67ef944a99c0ec5b499b7175cbb4369e053c1fcbb10", + "result" : "valid" + }, + { + "tcId" : 531, + "comment" : "x-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304402207ba458cfe952326922c7aa2854bdc673ce3daaf65d464dfb9f700701503056b102200df8821c92d20546fa741fb426bf56728a53182691964225c9b380b56b22ee6d", + "result" : "valid" + }, + { + "tcId" : 532, + "comment" : "x-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304402205cd60c3b021b4be116f06f1d447f65e458329a8bbae1d9b5977d18cf5618486102204c635cd7aa9aebb5716d5ae09e57f8c481a741a029b40f71ec47344ef883e86e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "0400000003fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71", + "wx" : "03fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e", + "wy" : "1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400000003fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAAAAA/oV+WOUnV8DpvXH+G+eABXu\nsjrrv/EXOTe6dI4QmYcgcOjofFVfoTZZzKXX+tz8sAI+qIlUjKSK8rp+cQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 533, + "comment" : "x-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304402204b50e1e8cf830e04c17e7472caf60da8150ffa568e2c64498cc972a379e542e502202e3adaa5afab89cca91693609555f40543578852cde29c21cb037c0c0b78478e", + "result" : "valid" + }, + { + "tcId" : 534, + "comment" : "x-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304402205aea930c7d8fffcd5c6df2c9430ef76f8b5ed58a8b9c95847288abf8f09a1ac202207ddfef7688a6053ce4eeeeefd6f1a9d71381b7548925f6682aa0a9d05cf5a3a3", + "result" : "valid" + }, + { + "tcId" : 535, + "comment" : "x-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304602210098b092c2d14b5b14a23e9368e0ce1be744dfae9f9a5cdaba51e7872099df96f202210090d3e4f87bd7bc94589f8150b6b01045cd8759a00af78b24d7de771887610df5", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015000000001352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2", + "wx" : "00bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015", + "wy" : "1352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015000000001352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvLspFMefBF6qbsu8YSgWs75dLWeW\ncH2BJen4UcGK8BUAAAAAE1K7Sg+i6kzOuatj3WhK3loRJ7zzAKaYpxk7wg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 536, + "comment" : "y-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30460221009e95f2856a9fff9a172b07817c8c60fe185cd3ce9582678f8cc4b02bc444621a022100c54ca51d8117d904f0d3773911cb2792348fae21c2da7dad25f990d122376e4c", + "result" : "valid" + }, + { + "tcId" : 537, + "comment" : "y-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100e77df8f9782696344c33de29ebdc9f8d3fcf463d950cdbe256fd4fc2fd44877e02210087028850c962cf2fb450ffe6b983981e499dc498fbd654fa454c9e07c8cb5ca8", + "result" : "valid" + }, + { + "tcId" : 538, + "comment" : "y-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022100bd2dd6f5026d2b5ad7ead74bdf52b8cbcabc08facee0a1c8584658a85ed0c5dc02203e8543e819bdae47d872e29a85ba38addf3eaeaad8786d79c3fb027f6f1ff4bf", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256r1", + "keySize" : 256, + "uncompressed" : "04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d", + "wx" : "00bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015", + "wy" : "00fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d" + }, + "publicKeyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvLspFMefBF6qbsu8YSgWs75dLWeW\ncH2BJen4UcGK8BX////+7K1EtvBdFbMxRlScIpe1IqXu2EMM/1lnWObEPQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 539, + "comment" : "y-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022100bd5c0294acc28c15c5d1ebc7274c9ca21a081c8a67da430a34a7fff1a564fabb02207ec103a2385b4ff38b47d306434e9091de24dc9f1a25967ee06f8a0a53ac0181", + "result" : "valid" + }, + { + "tcId" : 540, + "comment" : "y-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304402203c7dbfb43dd80379ee2c23ad5472873a22c8a0179ac8f381ad9e0f193231dc1f02207cf8e07530ade503b3d43a84b75a2a76fc40763daed4e9734e745c58c9ae72d3", + "result" : "valid" + }, + { + "tcId" : 541, + "comment" : "y-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022100b38ca4dac6d949be5e5f969860269f0eedff2eb92f45bfc02470300cc96dd52602201c7b22992bb13749cc0c5bc25330a17446e40db734203f9035172725fc70f863", + "result" : "valid" + } + ] + } + ] +} diff --git a/packages/crypto/tests/wycheproof_secp256r1.rs b/packages/crypto/tests/wycheproof_secp256r1.rs new file mode 100644 index 0000000000..89499a14a3 --- /dev/null +++ b/packages/crypto/tests/wycheproof_secp256r1.rs @@ -0,0 +1,394 @@ +#![allow(clippy::single_match)] + +use cosmwasm_crypto::secp256r1_verify; +use serde::Deserialize; + +// See ./testdata/wycheproof/README.md for how to get/update those files +const SECP256R1_SHA256: &str = "./testdata/wycheproof/ecdsa_secp256r1_sha256_test.json"; +const SECP256R1_SHA512: &str = "./testdata/wycheproof/ecdsa_secp256r1_sha512_test.json"; +const SECP256R1_SHA3_256: &str = "./testdata/wycheproof/ecdsa_secp256r1_sha3_256_test.json"; +const SECP256R1_SHA3_512: &str = "./testdata/wycheproof/ecdsa_secp256r1_sha3_512_test.json"; + +#[derive(Deserialize, Debug)] +#[serde(rename_all = "camelCase")] +struct File { + number_of_tests: usize, + test_groups: Vec, +} + +#[derive(Deserialize, Debug)] +#[serde(rename_all = "camelCase")] +struct TestGroup { + public_key: Key, + tests: Vec, +} + +#[derive(Deserialize, Debug)] +#[serde(rename_all = "camelCase")] +struct Key { + uncompressed: String, +} + +#[derive(Deserialize, Debug)] +#[serde(rename_all = "camelCase")] +struct TestCase { + tc_id: u32, + msg: String, + sig: String, + // "acceptable", "valid" or "invalid" + result: String, +} + +fn read_file(path: &str) -> File { + use std::fs::File; + use std::io::BufReader; + + // Open the file in read-only mode with buffer. + let file = File::open(path).unwrap(); + let reader = BufReader::new(file); + + serde_json::from_reader(reader).unwrap() +} + +mod hashers { + use sha2::{Digest, Sha256, Sha512}; + use sha3::{Sha3_256, Sha3_512}; + + pub fn sha256(data: &[u8]) -> [u8; 32] { + Sha256::digest(data).into() + } + + // ecdsa_secp256r1_sha512 requires truncating to 32 bytes + pub fn sha512(data: &[u8]) -> [u8; 32] { + let mut out = [0u8; 32]; + let hash = Sha512::digest(data).to_vec(); + out.copy_from_slice(&hash[0..32]); + out + } + + pub fn sha3_256(data: &[u8]) -> [u8; 32] { + Sha3_256::digest(data).into() + } + + // ecdsa_secp256r1_sha3_512 requires truncating to 32 bytes + pub fn sha3_512(data: &[u8]) -> [u8; 32] { + let mut out = [0u8; 32]; + let hash = Sha3_512::digest(data).to_vec(); + out.copy_from_slice(&hash[0..32]); + out + } +} + +#[test] +fn ecdsa_secp256r1_sha256() { + let mut tested: usize = 0; + let File { + number_of_tests, + test_groups, + } = read_file(SECP256R1_SHA256); + assert_eq!(number_of_tests, 471, "Got unexpected number of tests"); + + for group in test_groups { + let public_key = hex::decode(group.public_key.uncompressed).unwrap(); + assert_eq!(public_key.len(), 65); + + for tc in group.tests { + tested += 1; + assert_eq!(tc.tc_id as usize, tested); + // eprintln!("Test case ID: {}", tc.tc_id); + + match tc.result.as_str() { + "valid" | "acceptable" => { + let message = hex::decode(tc.msg).unwrap(); + let message_hash = hashers::sha256(&message); + let der_signature = hex::decode(tc.sig).unwrap(); + let signature = from_der(&der_signature).unwrap(); + let valid = secp256r1_verify(&message_hash, &signature, &public_key).unwrap(); + assert!(valid); + } + "invalid" => { + let message = hex::decode(tc.msg).unwrap(); + let message_hash = hashers::sha256(&message); + let der_signature = hex::decode(tc.sig).unwrap(); + + if let Ok(signature) = from_der(&der_signature) { + match secp256r1_verify(&message_hash, &signature, &public_key) { + Ok(valid) => assert!(!valid), + Err(_) => { /* this is expected for "invalid", all good */ } + } + } else { + // invalid DER encoding, okay + } + } + _ => panic!("Found unexpected result value"), + } + if tc.result == "valid" {} + } + } + assert_eq!(tested, number_of_tests); +} + +#[test] +fn ecdsa_secp256r1_sha512() { + let mut tested: usize = 0; + let File { + number_of_tests, + test_groups, + } = read_file(SECP256R1_SHA512); + assert_eq!(number_of_tests, 541, "Got unexpected number of tests"); + + for group in test_groups { + let public_key = hex::decode(group.public_key.uncompressed).unwrap(); + assert_eq!(public_key.len(), 65); + + for tc in group.tests { + tested += 1; + assert_eq!(tc.tc_id as usize, tested); + // eprintln!("Test case ID: {}", tc.tc_id); + + match tc.result.as_str() { + "valid" | "acceptable" => { + let message = hex::decode(tc.msg).unwrap(); + let message_hash = hashers::sha512(&message); + let der_signature = hex::decode(tc.sig).unwrap(); + let signature = from_der(&der_signature).unwrap(); + let valid = secp256r1_verify(&message_hash, &signature, &public_key).unwrap(); + assert!(valid); + } + "invalid" => { + let message = hex::decode(tc.msg).unwrap(); + let message_hash = hashers::sha512(&message); + let der_signature = hex::decode(tc.sig).unwrap(); + + if let Ok(signature) = from_der(&der_signature) { + match secp256r1_verify(&message_hash, &signature, &public_key) { + Ok(valid) => assert!(!valid), + Err(_) => { /* this is expected for "invalid", all good */ } + } + } else { + // invalid DER encoding, okay + } + } + _ => panic!("Found unexpected result value"), + } + if tc.result == "valid" {} + } + } + assert_eq!(tested, number_of_tests); +} + +#[test] +fn ecdsa_secp256r1_sha3_256() { + let mut tested: usize = 0; + let File { + number_of_tests, + test_groups, + } = read_file(SECP256R1_SHA3_256); + assert_eq!(number_of_tests, 479, "Got unexpected number of tests"); + + for group in test_groups { + let public_key = hex::decode(group.public_key.uncompressed).unwrap(); + assert_eq!(public_key.len(), 65); + + for tc in group.tests { + tested += 1; + assert_eq!(tc.tc_id as usize, tested); + // eprintln!("Test case ID: {}", tc.tc_id); + + match tc.result.as_str() { + "valid" | "acceptable" => { + let message = hex::decode(tc.msg).unwrap(); + let message_hash = hashers::sha3_256(&message); + let der_signature = hex::decode(tc.sig).unwrap(); + let signature = from_der(&der_signature).unwrap(); + let valid = secp256r1_verify(&message_hash, &signature, &public_key).unwrap(); + assert!(valid); + } + "invalid" => { + let message = hex::decode(tc.msg).unwrap(); + let message_hash = hashers::sha3_256(&message); + let der_signature = hex::decode(tc.sig).unwrap(); + + if let Ok(signature) = from_der(&der_signature) { + match secp256r1_verify(&message_hash, &signature, &public_key) { + Ok(valid) => assert!(!valid), + Err(_) => { /* this is expected for "invalid", all good */ } + } + } else { + // invalid DER encoding, okay + } + } + _ => panic!("Found unexpected result value"), + } + if tc.result == "valid" {} + } + } + assert_eq!(tested, number_of_tests); +} + +#[test] +fn ecdsa_secp256r1_sha3_512() { + let mut tested: usize = 0; + let File { + number_of_tests, + test_groups, + } = read_file(SECP256R1_SHA3_512); + assert_eq!(number_of_tests, 545, "Got unexpected number of tests"); + + for group in test_groups { + let public_key = hex::decode(group.public_key.uncompressed).unwrap(); + assert_eq!(public_key.len(), 65); + + for tc in group.tests { + tested += 1; + assert_eq!(tc.tc_id as usize, tested); + // eprintln!("Test case ID: {}", tc.tc_id); + + match tc.result.as_str() { + "valid" | "acceptable" => { + let message = hex::decode(tc.msg).unwrap(); + let message_hash = hashers::sha3_512(&message); + let der_signature = hex::decode(tc.sig).unwrap(); + let signature = from_der(&der_signature).unwrap(); + let valid = secp256r1_verify(&message_hash, &signature, &public_key).unwrap(); + assert!(valid); + } + "invalid" => { + let message = hex::decode(tc.msg).unwrap(); + let message_hash = hashers::sha3_512(&message); + let der_signature = hex::decode(tc.sig).unwrap(); + + if let Ok(signature) = from_der(&der_signature) { + match secp256r1_verify(&message_hash, &signature, &public_key) { + Ok(valid) => assert!(!valid), + Err(_) => { /* this is expected for "invalid", all good */ } + } + } else { + // invalid DER encoding, okay + } + } + _ => panic!("Found unexpected result value"), + } + if tc.result == "valid" {} + } + } + assert_eq!(tested, number_of_tests); +} + +fn from_der(data: &[u8]) -> Result<[u8; 64], String> { + const DER_TAG_INTEGER: u8 = 0x02; + + let mut pos = 0; + + let Some(prefix) = data.get(pos) else { + return Err("Could not read prefix".to_string()); + }; + pos += 1; + if *prefix != 0x30 { + return Err("Prefix 0x30 expected".to_string()); + } + + let Some(body_length) = data.get(pos) else { + return Err("Could not read body length".to_string()); + }; + pos += 1; + if data.len() - pos != *body_length as usize { + return Err("Data length mismatch detected".to_string()); + } + + // r + let Some(r_tag) = data.get(pos) else { + return Err("Could not read r_tag".to_string()); + }; + pos += 1; + if *r_tag != DER_TAG_INTEGER { + return Err("INTEGER tag expected".to_string()); + } + let Some(r_length) = data.get(pos).map(|rl: &u8| *rl as usize) else { + return Err("Could not read r_length".to_string()); + }; + pos += 1; + if r_length >= 0x80 { + return Err("Decoding length values above 127 not supported".to_string()); + } + if pos + r_length > data.len() { + return Err("R length exceeds end of data".to_string()); + } + let r_data = &data[pos..pos + r_length]; + pos += r_length; + + // s + let Some(s_tag) = data.get(pos) else { + return Err("Could not read s_tag".to_string()); + }; + pos += 1; + if *s_tag != DER_TAG_INTEGER { + return Err("INTEGER tag expected".to_string()); + } + let Some(s_length) = data.get(pos).map(|sl| *sl as usize) else { + return Err("Could not read s_length".to_string()); + }; + pos += 1; + if s_length >= 0x80 { + return Err("Decoding length values above 127 not supported".to_string()); + } + if pos + s_length > data.len() { + return Err("S length exceeds end of data".to_string()); + } + let s_data = &data[pos..pos + s_length]; + pos += s_length; + + if pos != data.len() { + return Err("Extra bytes in data input".to_string()); + } + + let r = decode_unsigned_integer(r_data, "r")?; + let s = decode_unsigned_integer(s_data, "s")?; + + let mut out = [0u8; 64]; + out[0..32].copy_from_slice(&r); + out[32..].copy_from_slice(&s); + Ok(out) +} + +fn decode_unsigned_integer(mut data: &[u8], name: &str) -> Result<[u8; 32], String> { + if data.is_empty() { + return Err(format!("{name} data is empty")); + } + + // If high bit of first byte is set, this is interpreted as a negative integer. + // A leading zero is needed to prevent this. + if (data[0] & 0x80) != 0 { + return Err(format!("{name} data missing leading zero")); + } + + // "Leading octets of all 0's (or all 1's) are not allowed. In other words, the leftmost + // nine bits of an encoded INTEGER value may not be all 0's or all 1's. This ensures that + // an INTEGER value is encoded in the smallest possible number of octets." + // https://www.oss.com/asn1/resources/asn1-made-simple/asn1-quick-reference/basic-encoding-rules.html + + // If leading byte is 0 and there is more than 1 byte, trim it. + // If the high bit of the following byte is zero as well, the leading 0x00 was invalid. + if data.len() > 1 && data[0] == 0 { + data = &data[1..]; + if (data[0] & 0x80) == 0 { + return Err(format!("{name} data has invalid leading zero")); + } + } + + // The other requirement (first 9 bits being all 1) is not yet checked + + // Do we need a better value range check here? + if data.len() > 32 { + return Err(format!("{name} data exceeded 32 bytes")); + } + + Ok(pad_to_32(data)) +} + +fn pad_to_32(input: &[u8]) -> [u8; 32] { + let shift = 32 - input.len(); + let mut out = [0u8; 32]; + out[shift..].copy_from_slice(input); + out +} From 9aea77ef98172a0246cc8a97a95d2b1973af622b Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 15 Jan 2024 13:43:59 +0100 Subject: [PATCH 1175/2372] Count sum of all params over all functions --- packages/vm/src/compatibility.rs | 30 ++++++++++++++++++++++++++---- packages/vm/src/parsed_wasm.rs | 22 +++++++++++++++++++++- 2 files changed, 47 insertions(+), 5 deletions(-) diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index 77719e5c3d..125d6499d9 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -71,9 +71,9 @@ const TABLE_SIZE_LIMIT: u32 = 2500; // entries /// when a user accidentally includes wasm-bindgen, they get a bunch of unsupported imports. const MAX_IMPORTS: usize = 100; -const MAX_FUNCTIONS: usize = 10000; +const MAX_FUNCTIONS: usize = 1000000; // FIXME: reset to normal -const MAX_FUNCTION_PARAMS: usize = 50; +const MAX_FUNCTION_PARAMS: usize = 50_000000; // FIXME: reset to normal const MAX_FUNCTION_RESULTS: usize = 1; @@ -89,6 +89,26 @@ pub fn check_wasm(wasm_code: &[u8], available_capabilities: &HashSet) -> check_wasm_capabilities(&module, available_capabilities)?; check_wasm_functions(&module)?; + // Sum of all params over all functions + let total_params_count = + module + .type_usage + .iter() + .fold(0usize, |acc, (type_index, type_used_count)| { + let params = module + .type_params + .get(&type_index) + .expect("Found a function signature that is used with no known params count"); + acc + type_used_count * params + }); + + let bounds = core::cmp::max(module.max_func_params * module.function_count, 1); // >= 1 + let utilization = (100f64 * total_params_count as f64) / bounds as f64; // in percent + let function_count = module.function_count; + let max_params = module.max_func_params; + eprintln!("Functions: {function_count}; Max params: {max_params}; Total params count: {total_params_count}; Utilization: {utilization:.2}%"); + // eprintln!("Parsed module: {module:?}"); + Ok(()) } @@ -257,23 +277,25 @@ fn check_wasm_functions(module: &ParsedWasm) -> VmResult<()> { #[cfg(test)] mod tests { use super::*; - use crate::errors::VmError; + use crate::{capabilities_from_csv, errors::VmError}; static CONTRACT_0_7: &[u8] = include_bytes!("../testdata/hackatom_0.7.wasm"); static CONTRACT_0_12: &[u8] = include_bytes!("../testdata/hackatom_0.12.wasm"); static CONTRACT_0_14: &[u8] = include_bytes!("../testdata/hackatom_0.14.wasm"); static CONTRACT_0_15: &[u8] = include_bytes!("../testdata/hackatom_0.15.wasm"); static CONTRACT: &[u8] = include_bytes!("../testdata/hackatom.wasm"); + static CYBERPUNK: &[u8] = include_bytes!("../testdata/cyberpunk.wasm"); static CONTRACT_RUST_170: &[u8] = include_bytes!("../testdata/cyberpunk_rust170.wasm"); fn default_capabilities() -> HashSet { - ["staking".to_string()].into_iter().collect() + capabilities_from_csv("cosmwasm_1_1,cosmwasm_1_2,iterator,staking,stargate") } #[test] fn check_wasm_passes_for_latest_contract() { // this is our reference check, must pass check_wasm(CONTRACT, &default_capabilities()).unwrap(); + check_wasm(CYBERPUNK, &default_capabilities()).unwrap(); } #[test] diff --git a/packages/vm/src/parsed_wasm.rs b/packages/vm/src/parsed_wasm.rs index 37e5041899..99c73a22ef 100644 --- a/packages/vm/src/parsed_wasm.rs +++ b/packages/vm/src/parsed_wasm.rs @@ -1,3 +1,5 @@ +use std::collections::HashMap; + use wasmer::wasmparser::{ Export, Import, MemoryType, Parser, Payload, TableType, Type, ValidPayload, Validator, WasmFeatures, @@ -16,6 +18,10 @@ pub struct ParsedWasm<'a> { pub memories: Vec, pub function_count: usize, pub type_count: u32, + /// Counts how often each function signature is used by a function + pub type_usage: HashMap, + /// How many parameters a type has + pub type_params: HashMap, pub max_func_params: usize, pub max_func_results: usize, } @@ -41,6 +47,8 @@ impl<'a> ParsedWasm<'a> { memories: vec![], function_count: 0, type_count: 0, + type_usage: HashMap::default(), + type_params: HashMap::default(), max_func_params: 0, max_func_results: 0, }; @@ -61,10 +69,12 @@ impl<'a> ParsedWasm<'a> { match p { Payload::TypeSection(t) => { this.type_count = t.get_count(); - for t_res in t { + for (type_index, t_res) in t.into_iter().enumerate() { let ty: Type = t_res?; match ty { Type::Func(ft) => { + this.type_params.insert(type_index, ft.params().len()); + this.max_func_params = core::cmp::max(ft.params().len(), this.max_func_params); this.max_func_results = @@ -73,6 +83,16 @@ impl<'a> ParsedWasm<'a> { } } } + Payload::FunctionSection(section) => { + for a in section { + let type_index = a? as usize; + if let Some(value) = this.type_usage.get_mut(&(type_index)) { + *value += 1; + } else { + this.type_usage.insert(type_index, 1); + } + } + } Payload::Version { num, .. } => this.version = num, Payload::ImportSection(i) => { this.imports = i.into_iter().collect::, _>>()?; From d77b1102e53e575dd14ddef6cc39c8ccac6416f2 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 18 Jan 2024 14:56:26 +0100 Subject: [PATCH 1176/2372] Restrict total number of function params --- packages/vm/src/compatibility.rs | 33 +++++++++++--------------------- packages/vm/src/parsed_wasm.rs | 26 ++++++++++++++++--------- 2 files changed, 28 insertions(+), 31 deletions(-) diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index 125d6499d9..960c4fbfd5 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -71,9 +71,11 @@ const TABLE_SIZE_LIMIT: u32 = 2500; // entries /// when a user accidentally includes wasm-bindgen, they get a bunch of unsupported imports. const MAX_IMPORTS: usize = 100; -const MAX_FUNCTIONS: usize = 1000000; // FIXME: reset to normal +const MAX_FUNCTIONS: usize = 30000; -const MAX_FUNCTION_PARAMS: usize = 50_000000; // FIXME: reset to normal +const MAX_FUNCTION_PARAMS: usize = 150; + +const MAX_TOTAL_FUNCTION_PARAMS: usize = 7_000; const MAX_FUNCTION_RESULTS: usize = 1; @@ -89,26 +91,6 @@ pub fn check_wasm(wasm_code: &[u8], available_capabilities: &HashSet) -> check_wasm_capabilities(&module, available_capabilities)?; check_wasm_functions(&module)?; - // Sum of all params over all functions - let total_params_count = - module - .type_usage - .iter() - .fold(0usize, |acc, (type_index, type_used_count)| { - let params = module - .type_params - .get(&type_index) - .expect("Found a function signature that is used with no known params count"); - acc + type_used_count * params - }); - - let bounds = core::cmp::max(module.max_func_params * module.function_count, 1); // >= 1 - let utilization = (100f64 * total_params_count as f64) / bounds as f64; // in percent - let function_count = module.function_count; - let max_params = module.max_func_params; - eprintln!("Functions: {function_count}; Max params: {max_params}; Total params count: {total_params_count}; Utilization: {utilization:.2}%"); - // eprintln!("Parsed module: {module:?}"); - Ok(()) } @@ -271,6 +253,13 @@ fn check_wasm_functions(module: &ParsedWasm) -> VmResult<()> { "Wasm contract contains function with more than {MAX_FUNCTION_RESULTS} results" ))); } + + if module.total_func_params > MAX_TOTAL_FUNCTION_PARAMS { + return Err(VmError::static_validation_err(format!( + "Wasm contract contains more than {MAX_TOTAL_FUNCTION_PARAMS} function parameters in total" + ))); + } + Ok(()) } diff --git a/packages/vm/src/parsed_wasm.rs b/packages/vm/src/parsed_wasm.rs index 99c73a22ef..d53c57f885 100644 --- a/packages/vm/src/parsed_wasm.rs +++ b/packages/vm/src/parsed_wasm.rs @@ -5,7 +5,7 @@ use wasmer::wasmparser::{ WasmFeatures, }; -use crate::VmResult; +use crate::{VmError, VmResult}; /// A parsed and validated wasm module. /// It keeps track of the parts that are important for our static analysis and compatibility checks. @@ -18,12 +18,14 @@ pub struct ParsedWasm<'a> { pub memories: Vec, pub function_count: usize, pub type_count: u32, - /// Counts how often each function signature is used by a function - pub type_usage: HashMap, /// How many parameters a type has pub type_params: HashMap, + /// How many parameters the function with the most parameters has pub max_func_params: usize, + /// How many results the function with the most results has pub max_func_results: usize, + /// How many function parameters are used in the module + pub total_func_params: usize, } impl<'a> ParsedWasm<'a> { @@ -47,10 +49,10 @@ impl<'a> ParsedWasm<'a> { memories: vec![], function_count: 0, type_count: 0, - type_usage: HashMap::default(), type_params: HashMap::default(), max_func_params: 0, max_func_results: 0, + total_func_params: 0, }; let mut fun_allocations = Default::default(); @@ -84,13 +86,19 @@ impl<'a> ParsedWasm<'a> { } } Payload::FunctionSection(section) => { + // in valid wasm, the function section always has to come after the type section + // (see https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/#modules%E2%91%A0%E2%93%AA), + // so we can assume that the type_params map is already filled at this point + for a in section { let type_index = a? as usize; - if let Some(value) = this.type_usage.get_mut(&(type_index)) { - *value += 1; - } else { - this.type_usage.insert(type_index, 1); - } + this.total_func_params += + this.type_params.get(&type_index).ok_or_else(|| { + // this will also be thrown if the wasm section order is invalid + VmError::static_validation_err( + "Wasm bytecode error: function uses unknown type index", + ) + })? } } Payload::Version { num, .. } => this.version = num, From 6dfd99876644700ec8515ee97c89866887330366 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 24 Jan 2024 12:34:56 +0100 Subject: [PATCH 1177/2372] Use Vec for type params analysis --- packages/vm/src/parsed_wasm.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/vm/src/parsed_wasm.rs b/packages/vm/src/parsed_wasm.rs index d53c57f885..c9e10e8728 100644 --- a/packages/vm/src/parsed_wasm.rs +++ b/packages/vm/src/parsed_wasm.rs @@ -1,5 +1,3 @@ -use std::collections::HashMap; - use wasmer::wasmparser::{ Export, Import, MemoryType, Parser, Payload, TableType, Type, ValidPayload, Validator, WasmFeatures, @@ -18,8 +16,9 @@ pub struct ParsedWasm<'a> { pub memories: Vec, pub function_count: usize, pub type_count: u32, - /// How many parameters a type has - pub type_params: HashMap, + /// How many parameters a type has. + /// The index is the type id + pub type_params: Vec, /// How many parameters the function with the most parameters has pub max_func_params: usize, /// How many results the function with the most results has @@ -49,7 +48,7 @@ impl<'a> ParsedWasm<'a> { memories: vec![], function_count: 0, type_count: 0, - type_params: HashMap::default(), + type_params: Vec::new(), max_func_params: 0, max_func_results: 0, total_func_params: 0, @@ -71,11 +70,12 @@ impl<'a> ParsedWasm<'a> { match p { Payload::TypeSection(t) => { this.type_count = t.get_count(); - for (type_index, t_res) in t.into_iter().enumerate() { + this.type_params = Vec::with_capacity(t.get_count() as usize); + for t_res in t.into_iter() { let ty: Type = t_res?; match ty { Type::Func(ft) => { - this.type_params.insert(type_index, ft.params().len()); + this.type_params.push(ft.params().len()); this.max_func_params = core::cmp::max(ft.params().len(), this.max_func_params); @@ -93,7 +93,7 @@ impl<'a> ParsedWasm<'a> { for a in section { let type_index = a? as usize; this.total_func_params += - this.type_params.get(&type_index).ok_or_else(|| { + this.type_params.get(type_index).ok_or_else(|| { // this will also be thrown if the wasm section order is invalid VmError::static_validation_err( "Wasm bytecode error: function uses unknown type index", From e65d2396038e3e98086dc64addaac1caa9071e86 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 24 Jan 2024 12:38:49 +0100 Subject: [PATCH 1178/2372] Fix casing Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/vm/src/parsed_wasm.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vm/src/parsed_wasm.rs b/packages/vm/src/parsed_wasm.rs index c9e10e8728..c75b7b98a2 100644 --- a/packages/vm/src/parsed_wasm.rs +++ b/packages/vm/src/parsed_wasm.rs @@ -86,7 +86,7 @@ impl<'a> ParsedWasm<'a> { } } Payload::FunctionSection(section) => { - // in valid wasm, the function section always has to come after the type section + // In valid Wasm, the function section always has to come after the type section // (see https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/#modules%E2%91%A0%E2%93%AA), // so we can assume that the type_params map is already filled at this point From 81a69cbc223b68c8ecf219e8249ee2ca727869d5 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Wed, 24 Jan 2024 12:46:18 +0100 Subject: [PATCH 1179/2372] Adjust function limits Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/vm/src/compatibility.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index 960c4fbfd5..4850cf3006 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -71,11 +71,11 @@ const TABLE_SIZE_LIMIT: u32 = 2500; // entries /// when a user accidentally includes wasm-bindgen, they get a bunch of unsupported imports. const MAX_IMPORTS: usize = 100; -const MAX_FUNCTIONS: usize = 30000; +const MAX_FUNCTIONS: usize = 20_000; -const MAX_FUNCTION_PARAMS: usize = 150; +const MAX_FUNCTION_PARAMS: usize = 100; -const MAX_TOTAL_FUNCTION_PARAMS: usize = 7_000; +const MAX_TOTAL_FUNCTION_PARAMS: usize = 10_000; const MAX_FUNCTION_RESULTS: usize = 1; From 2d8c0e2cffa4982665d025c068cbf47579725435 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 24 Jan 2024 23:21:00 +0100 Subject: [PATCH 1180/2372] Add CHANGELOG entry for #1991 --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c83a60698..805fe4b915 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,14 @@ and this project adheres to ## [Unreleased] +### Changed + +- cosmwasm-vm: Limit total number of function parameters in + `check_wasm_functions` and increase max function count and max parameter + count. ([#1991]) + +[#1991]: https://github.com/CosmWasm/cosmwasm/pull/1991 + ## [2.0.0-beta.1] - 2023-01-22 ### Fixed From 576f26c7112e4d1555653275ff0541edf8665062 Mon Sep 17 00:00:00 2001 From: Simon Warta <2603011+webmaster128@users.noreply.github.com> Date: Fri, 26 Jan 2024 01:02:02 +0100 Subject: [PATCH 1181/2372] Apply suggestions from code review Co-authored-by: Mauro Lacy --- packages/crypto/testdata/wycheproof/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/crypto/testdata/wycheproof/README.md b/packages/crypto/testdata/wycheproof/README.md index 077ea37b8b..67740a6d9c 100644 --- a/packages/crypto/testdata/wycheproof/README.md +++ b/packages/crypto/testdata/wycheproof/README.md @@ -8,7 +8,7 @@ This test data is used by integration tests in `test/wycheproof_*.rs`. ## Update -To ensure integrety if the files and update them to the latest version, run this +To ensure integrity of the files and update them to the latest version, run this from the repo root: ```sh From a0efe138c54aa27fbb18893f1902a46d38a54df9 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 26 Jan 2024 01:02:43 +0100 Subject: [PATCH 1182/2372] Apply review feedback --- packages/crypto/tests/wycheproof_secp256r1.rs | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/packages/crypto/tests/wycheproof_secp256r1.rs b/packages/crypto/tests/wycheproof_secp256r1.rs index 89499a14a3..2003035746 100644 --- a/packages/crypto/tests/wycheproof_secp256r1.rs +++ b/packages/crypto/tests/wycheproof_secp256r1.rs @@ -60,10 +60,8 @@ mod hashers { // ecdsa_secp256r1_sha512 requires truncating to 32 bytes pub fn sha512(data: &[u8]) -> [u8; 32] { - let mut out = [0u8; 32]; let hash = Sha512::digest(data).to_vec(); - out.copy_from_slice(&hash[0..32]); - out + hash[..32].try_into().unwrap() } pub fn sha3_256(data: &[u8]) -> [u8; 32] { @@ -72,10 +70,8 @@ mod hashers { // ecdsa_secp256r1_sha3_512 requires truncating to 32 bytes pub fn sha3_512(data: &[u8]) -> [u8; 32] { - let mut out = [0u8; 32]; let hash = Sha3_512::digest(data).to_vec(); - out.copy_from_slice(&hash[0..32]); - out + hash[..32].try_into().unwrap() } } @@ -86,7 +82,7 @@ fn ecdsa_secp256r1_sha256() { number_of_tests, test_groups, } = read_file(SECP256R1_SHA256); - assert_eq!(number_of_tests, 471, "Got unexpected number of tests"); + assert!(number_of_tests >= 471, "Got unexpected number of tests"); for group in test_groups { let public_key = hex::decode(group.public_key.uncompressed).unwrap(); @@ -95,7 +91,6 @@ fn ecdsa_secp256r1_sha256() { for tc in group.tests { tested += 1; assert_eq!(tc.tc_id as usize, tested); - // eprintln!("Test case ID: {}", tc.tc_id); match tc.result.as_str() { "valid" | "acceptable" => { @@ -135,7 +130,7 @@ fn ecdsa_secp256r1_sha512() { number_of_tests, test_groups, } = read_file(SECP256R1_SHA512); - assert_eq!(number_of_tests, 541, "Got unexpected number of tests"); + assert!(number_of_tests >= 541, "Got unexpected number of tests"); for group in test_groups { let public_key = hex::decode(group.public_key.uncompressed).unwrap(); @@ -144,7 +139,6 @@ fn ecdsa_secp256r1_sha512() { for tc in group.tests { tested += 1; assert_eq!(tc.tc_id as usize, tested); - // eprintln!("Test case ID: {}", tc.tc_id); match tc.result.as_str() { "valid" | "acceptable" => { @@ -184,7 +178,7 @@ fn ecdsa_secp256r1_sha3_256() { number_of_tests, test_groups, } = read_file(SECP256R1_SHA3_256); - assert_eq!(number_of_tests, 479, "Got unexpected number of tests"); + assert!(number_of_tests >= 479, "Got unexpected number of tests"); for group in test_groups { let public_key = hex::decode(group.public_key.uncompressed).unwrap(); @@ -193,7 +187,6 @@ fn ecdsa_secp256r1_sha3_256() { for tc in group.tests { tested += 1; assert_eq!(tc.tc_id as usize, tested); - // eprintln!("Test case ID: {}", tc.tc_id); match tc.result.as_str() { "valid" | "acceptable" => { @@ -233,7 +226,7 @@ fn ecdsa_secp256r1_sha3_512() { number_of_tests, test_groups, } = read_file(SECP256R1_SHA3_512); - assert_eq!(number_of_tests, 545, "Got unexpected number of tests"); + assert!(number_of_tests >= 545, "Got unexpected number of tests"); for group in test_groups { let public_key = hex::decode(group.public_key.uncompressed).unwrap(); @@ -242,7 +235,6 @@ fn ecdsa_secp256r1_sha3_512() { for tc in group.tests { tested += 1; assert_eq!(tc.tc_id as usize, tested); - // eprintln!("Test case ID: {}", tc.tc_id); match tc.result.as_str() { "valid" | "acceptable" => { From 6b430ba21c8473dcc4a4bf57e93194d5b16f5cad Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 29 Jan 2024 12:16:55 +0100 Subject: [PATCH 1183/2372] Add payload field to SubMsg and Reply --- packages/std/src/results/response.rs | 2 + packages/std/src/results/submessages.rs | 72 ++++++++++++++++++++++++- packages/vm/src/calls.rs | 2 + 3 files changed, 75 insertions(+), 1 deletion(-) diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index 921dea5159..7ab54ced94 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -283,6 +283,7 @@ mod tests { messages: vec![ SubMsg { id: 12, + payload: Binary::new(vec![9, 8, 7, 6, 5]), msg: BankMsg::Send { to_address: String::from("checker"), amount: coins(888, "moon"), @@ -293,6 +294,7 @@ mod tests { }, SubMsg { id: UNUSED_MSG_ID, + payload: Binary::default(), msg: BankMsg::Send { to_address: String::from("you"), amount: coins(1015, "earth"), diff --git a/packages/std/src/results/submessages.rs b/packages/std/src/results/submessages.rs index ebc0efa177..d7134f8d09 100644 --- a/packages/std/src/results/submessages.rs +++ b/packages/std/src/results/submessages.rs @@ -33,6 +33,20 @@ pub struct SubMsg { /// An arbitrary ID chosen by the contract. /// This is typically used to match `Reply`s in the `reply` entry point to the submessage. pub id: u64, + /// Some arbirary data that the contract can set in an application specific way. + /// This is just passed into the `reply` entry point and is not stored to state. + /// Any encoding can be used. If `id` is used to identify a particular action, + /// the encoding can also be different for each of those actions since you can match `id` + /// first and then start processing the `payload`. + /// + /// The environment restricts the length of this field in order to avoid abuse. The limit + /// is environment specific and can change over time. The initial default is 128 KiB. + /// + /// Unset/nil/null cannot be differentiated from empty data. + /// + /// On chains running CosmWasm 1.x this field will be ignored. + #[serde(default)] + pub payload: Binary, pub msg: CosmosMsg, /// Gas limit measured in [Cosmos SDK gas](https://github.com/CosmWasm/cosmwasm/blob/main/docs/GAS.md). pub gas_limit: Option, @@ -89,6 +103,7 @@ impl SubMsg { fn reply_on(msg: CosmosMsg, id: u64, reply_on: ReplyOn) -> Self { SubMsg { id, + payload: Default::default(), msg, reply_on, gas_limit: None, @@ -103,6 +118,14 @@ pub struct Reply { /// The ID that the contract set when emitting the `SubMsg`. /// Use this to identify which submessage triggered the `reply`. pub id: u64, + /// Some arbirary data that the contract set when emitting the `SubMsg`. + /// This is just passed into the `reply` entry point and is not stored to state. + /// + /// Unset/nil/null cannot be differentiated from empty data. + /// + /// On chains running CosmWasm 1.x this field is never filled. + #[serde(default)] + pub payload: Binary, /// The amount of gas used by the submessage, /// measured in [Cosmos SDK gas](https://github.com/CosmWasm/cosmwasm/blob/main/docs/GAS.md). pub gas_used: u64, @@ -221,7 +244,7 @@ pub struct MsgResponse { #[allow(deprecated)] mod tests { use super::*; - use crate::{from_json, to_json_vec, StdError, StdResult}; + use crate::{from_json, to_json_vec, Attribute, StdError, StdResult}; #[test] fn sub_msg_result_serialization_works() { @@ -418,4 +441,51 @@ mod tests { let converted: Result = original.into(); assert_eq!(converted, Err("went wrong".to_string())); } + + #[test] + fn reply_deserialization_works() { + // 1.x reply without payload (from https://github.com/CosmWasm/cosmwasm/issues/1909) + let reply: Reply = from_json(r#"{"gas_used":4312324,"id":75,"result":{"ok":{"events":[{"type":"hi","attributes":[{"key":"si","value":"claro"}]}],"data":"PwCqXKs="}}}"#).unwrap(); + assert_eq!( + reply, + Reply { + id: 75, + payload: Binary::default(), + gas_used: 4312324, + result: SubMsgResult::Ok(SubMsgResponse { + data: Some(Binary::from_base64("PwCqXKs=").unwrap()), + events: vec![Event { + ty: "hi".to_string(), + attributes: vec![Attribute { + key: "si".to_string(), + value: "claro".to_string(), + }] + }], + msg_responses: vec![], + }) + } + ); + + // with payload (manually added to the above test) + let reply: Reply = from_json(r#"{"gas_used":4312324,"id":75,"payload":"3NxjC5U=","result":{"ok":{"events":[{"type":"hi","attributes":[{"key":"si","value":"claro"}]}],"data":"PwCqXKs="}}}"#).unwrap(); + assert_eq!( + reply, + Reply { + id: 75, + payload: Binary::from_base64("3NxjC5U=").unwrap(), + gas_used: 4312324, + result: SubMsgResult::Ok(SubMsgResponse { + data: Some(Binary::from_base64("PwCqXKs=").unwrap()), + events: vec![Event { + ty: "hi".to_string(), + attributes: vec![Attribute { + key: "si".to_string(), + value: "claro".to_string(), + }] + }], + msg_responses: vec![], + }) + } + ); + } } diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 872cd971c8..1b9fd3f1a6 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -907,6 +907,7 @@ mod tests { ); assert_eq!(ReplyOn::Success, res.messages[0].reply_on); let id = res.messages[0].id; + let payload = res.messages[0].payload.clone(); let event = Event::new("instantiate").add_attributes(vec![ // We have to force this one to avoid the debug assertion against _ mock_wasmd_attr("_contract_address", account), @@ -915,6 +916,7 @@ mod tests { #[allow(deprecated)] let response = Reply { id, + payload, gas_used: 1234567, result: SubMsgResult::Ok(SubMsgResponse { events: vec![event], From 7bdc3440036b45c71b85b406c18fafbce00a2d2a Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 29 Jan 2024 16:51:47 +0100 Subject: [PATCH 1184/2372] Adapt contracts to new new payload field in Reply --- contracts/ibc-reflect/src/contract.rs | 4 ++++ contracts/ibc-reflect/tests/integration.rs | 4 ++++ contracts/reflect/schema/raw/execute.json | 9 +++++++++ .../schema/raw/response_to_sub_msg_result.json | 9 +++++++++ contracts/reflect/schema/reflect.json | 18 ++++++++++++++++++ contracts/reflect/src/contract.rs | 6 ++++-- contracts/reflect/tests/integration.rs | 6 ++++-- 7 files changed, 52 insertions(+), 4 deletions(-) diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 900ed8f242..d66dd49af0 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -400,11 +400,13 @@ mod tests { res.events[0] ); let id = res.messages[0].id; + let payload = res.messages[0].payload.clone(); // fake a reply and ensure this works #[allow(deprecated)] let response = Reply { id, + payload, gas_used: 1234567, result: SubMsgResult::Ok(SubMsgResponse { events: fake_events(&account), @@ -461,6 +463,7 @@ mod tests { // and set up a reflect account assert_eq!(1, res.messages.len()); let id = res.messages[0].id; + let payload = res.messages[0].payload.clone(); if let CosmosMsg::Wasm(WasmMsg::Instantiate { admin, code_id, @@ -486,6 +489,7 @@ mod tests { #[allow(deprecated)] let response = Reply { id, + payload, gas_used: 1234567, result: SubMsgResult::Ok(SubMsgResponse { events: fake_events(reflect_addr.as_str()), diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index 7c69621065..ecbb60cb86 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -91,11 +91,13 @@ fn connect( res.events[0] ); let id = res.messages[0].id; + let payload = res.messages[0].payload.clone(); // fake a reply and ensure this works #[allow(deprecated)] let response = Reply { id, + payload, gas_used: 1234567, result: SubMsgResult::Ok(SubMsgResponse { events: fake_events(&account), @@ -153,6 +155,7 @@ fn proper_handshake_flow() { // and set up a reflect account assert_eq!(1, res.messages.len()); let id = res.messages[0].id; + let payload = res.messages[0].payload.clone(); if let CosmosMsg::Wasm(WasmMsg::Instantiate { admin, code_id, @@ -178,6 +181,7 @@ fn proper_handshake_flow() { #[allow(deprecated)] let response = Reply { id, + payload, gas_used: 1234567, result: SubMsgResult::Ok(SubMsgResponse { events: fake_events(reflect_addr.as_str()), diff --git a/contracts/reflect/schema/raw/execute.json b/contracts/reflect/schema/raw/execute.json index 65a3e108d7..55c55e28b1 100644 --- a/contracts/reflect/schema/raw/execute.json +++ b/contracts/reflect/schema/raw/execute.json @@ -715,6 +715,15 @@ "msg": { "$ref": "#/definitions/CosmosMsg_for_CustomMsg" }, + "payload": { + "description": "Some arbirary data that the contract can set in an application specific way. This is just passed into the `reply` entry point and is not stored to state. Any encoding can be used. If `id` is used to identify a particular action, the encoding can also be different for each of those actions since you can match `id` first and then start processing the `payload`.\n\nThe environment restricts the length of this field in order to avoid abuse. The limit is environment specific and can change over time. The initial default is 128 KiB.\n\nUnset/nil/null cannot be differentiated from empty data.\n\nOn chains running CosmWasm 1.x this field will be ignored.", + "default": "", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, "reply_on": { "$ref": "#/definitions/ReplyOn" } diff --git a/contracts/reflect/schema/raw/response_to_sub_msg_result.json b/contracts/reflect/schema/raw/response_to_sub_msg_result.json index e11c7ad73e..8b9a44cd09 100644 --- a/contracts/reflect/schema/raw/response_to_sub_msg_result.json +++ b/contracts/reflect/schema/raw/response_to_sub_msg_result.json @@ -21,6 +21,15 @@ "format": "uint64", "minimum": 0.0 }, + "payload": { + "description": "Some arbirary data that the contract set when emitting the `SubMsg`. This is just passed into the `reply` entry point and is not stored to state.\n\nUnset/nil/null cannot be differentiated from empty data.\n\nOn chains running CosmWasm 1.x this field is never filled.", + "default": "", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, "result": { "$ref": "#/definitions/SubMsgResult" } diff --git a/contracts/reflect/schema/reflect.json b/contracts/reflect/schema/reflect.json index 0eb4351c4a..b510a0572b 100644 --- a/contracts/reflect/schema/reflect.json +++ b/contracts/reflect/schema/reflect.json @@ -725,6 +725,15 @@ "msg": { "$ref": "#/definitions/CosmosMsg_for_CustomMsg" }, + "payload": { + "description": "Some arbirary data that the contract can set in an application specific way. This is just passed into the `reply` entry point and is not stored to state. Any encoding can be used. If `id` is used to identify a particular action, the encoding can also be different for each of those actions since you can match `id` first and then start processing the `payload`.\n\nThe environment restricts the length of this field in order to avoid abuse. The limit is environment specific and can change over time. The initial default is 128 KiB.\n\nUnset/nil/null cannot be differentiated from empty data.\n\nOn chains running CosmWasm 1.x this field will be ignored.", + "default": "", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, "reply_on": { "$ref": "#/definitions/ReplyOn" } @@ -1875,6 +1884,15 @@ "format": "uint64", "minimum": 0.0 }, + "payload": { + "description": "Some arbirary data that the contract set when emitting the `SubMsg`. This is just passed into the `reply` entry point and is not stored to state.\n\nUnset/nil/null cannot be differentiated from empty data.\n\nOn chains running CosmWasm 1.x this field is never filled.", + "default": "", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, "result": { "$ref": "#/definitions/SubMsgResult" } diff --git a/contracts/reflect/src/contract.rs b/contracts/reflect/src/contract.rs index 0aa15d3459..3b4149fcd7 100644 --- a/contracts/reflect/src/contract.rs +++ b/contracts/reflect/src/contract.rs @@ -434,6 +434,7 @@ mod tests { let _res = instantiate(deps.as_mut(), mock_env(), info, msg).unwrap(); let id = 123u64; + let payload = Binary::from(b"my dear"); let data = Binary::from(b"foobar"); let events = vec![Event::new("message").add_attribute("signer", "caller-addr")]; let gas_used = 1234567u64; @@ -443,12 +444,13 @@ mod tests { data: Some(data.clone()), msg_responses: vec![], }); - let subcall = Reply { + let the_reply = Reply { id, + payload, gas_used, result, }; - let res = reply(deps.as_mut(), mock_env(), subcall).unwrap(); + let res = reply(deps.as_mut(), mock_env(), the_reply).unwrap(); assert_eq!(0, res.messages.len()); // query for a non-existant id diff --git a/contracts/reflect/tests/integration.rs b/contracts/reflect/tests/integration.rs index b3cfda30c8..675b4786ad 100644 --- a/contracts/reflect/tests/integration.rs +++ b/contracts/reflect/tests/integration.rs @@ -268,6 +268,7 @@ fn reply_and_query() { let _res: Response = instantiate(&mut deps, mock_env(), info, msg).unwrap(); let id = 123u64; + let payload = Binary::from(b"my dear"); let data = Binary::from(b"foobar"); let events = vec![Event::new("message").add_attribute("signer", "caller-addr")]; let gas_used = 1234567u64; @@ -277,12 +278,13 @@ fn reply_and_query() { data: Some(data.clone()), msg_responses: vec![], }); - let subcall = Reply { + let the_reply = Reply { id, + payload, gas_used, result, }; - let res: Response = reply(&mut deps, mock_env(), subcall).unwrap(); + let res: Response = reply(&mut deps, mock_env(), the_reply).unwrap(); assert_eq!(0, res.messages.len()); // query for a non-existant id From 3defab9fc4249673be9c2585fe8f046602025737 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 29 Jan 2024 17:17:41 +0100 Subject: [PATCH 1185/2372] Add CHANGELOG entry for payload field --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 805fe4b915..b3b9abecdf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,14 @@ and this project adheres to ## [Unreleased] +### Added + +- cosmwasm-std: Add new field `payload` to `SubMsg` and `Reply`. This is binary + data the contract can set in a contract specific format and get back then the + `reply` entry point is called. ([#2008]) + +[#2008]: https://github.com/CosmWasm/cosmwasm/pull/2008 + ### Changed - cosmwasm-vm: Limit total number of function parameters in From 4528750c2ca7a9c6c3fbea8ec4ba1088d15acb98 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 29 Jan 2024 17:41:01 +0100 Subject: [PATCH 1186/2372] Add SubMsg::with_payload --- CHANGELOG.md | 3 +- packages/std/src/results/submessages.rs | 48 +++++++++++++++++++++---- 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b3b9abecdf..8bfeedb76d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,8 @@ and this project adheres to - cosmwasm-std: Add new field `payload` to `SubMsg` and `Reply`. This is binary data the contract can set in a contract specific format and get back then the - `reply` entry point is called. ([#2008]) + `reply` entry point is called. `SubMsg::with_payload` allows setting the + payload on an existing `SubMsg`. ([#2008]) [#2008]: https://github.com/CosmWasm/cosmwasm/pull/2008 diff --git a/packages/std/src/results/submessages.rs b/packages/std/src/results/submessages.rs index d7134f8d09..05dcc7a712 100644 --- a/packages/std/src/results/submessages.rs +++ b/packages/std/src/results/submessages.rs @@ -57,32 +57,50 @@ pub struct SubMsg { pub const UNUSED_MSG_ID: u64 = 0; impl SubMsg { - /// new creates a "fire and forget" message with the pre-0.14 semantics + /// Creates a "fire and forget" message with the pre-0.14 semantics. + /// Since this is just an alias for [`SubMsg::reply_never`] it is somewhat recommended + /// to use the latter in order to make the behaviour more explicit in the caller code. + /// But that's up to you for now. + /// + /// By default, the submessage's gas limit will be unlimited. Use [`SubMsg::with_gas_limit`] to change it. + /// Setting `payload` is not advised as this will never be used. pub fn new(msg: impl Into>) -> Self { Self::reply_never(msg) } - /// create a `SubMsg` that will provide a `reply` with the given id if the message returns `Ok` + /// Creates a `SubMsg` that will provide a `reply` with the given `id` if the message returns `Ok`. + /// + /// By default, the submessage's `payload` will be empty and the gas limit will be unlimited. Use + /// [`SubMsg::with_payload`] and [`SubMsg::with_gas_limit`] to change those. pub fn reply_on_success(msg: impl Into>, id: u64) -> Self { Self::reply_on(msg.into(), id, ReplyOn::Success) } - /// create a `SubMsg` that will provide a `reply` with the given id if the message returns `Err` + /// Creates a `SubMsg` that will provide a `reply` with the given `id` if the message returns `Err`. + /// + /// By default, the submessage's `payload` will be empty and the gas limit will be unlimited. Use + /// [`SubMsg::with_payload`] and [`SubMsg::with_gas_limit`] to change those. pub fn reply_on_error(msg: impl Into>, id: u64) -> Self { Self::reply_on(msg.into(), id, ReplyOn::Error) } - /// create a `SubMsg` that will always provide a `reply` with the given id + /// Create a `SubMsg` that will always provide a `reply` with the given `id`. + /// + /// By default, the submessage's `payload` will be empty and the gas limit will be unlimited. Use + /// [`SubMsg::with_payload`] and [`SubMsg::with_gas_limit`] to change those. pub fn reply_always(msg: impl Into>, id: u64) -> Self { Self::reply_on(msg.into(), id, ReplyOn::Always) } - /// create a `SubMsg` that will never `reply`. This is equivalent to standard message semantics. + /// Create a `SubMsg` that will never `reply`. This is equivalent to standard message semantics. + /// + /// By default, the submessage's gas limit will be unlimited. Use [`SubMsg::with_gas_limit`] to change it. + /// Setting `payload` is not advised as this will never be used. pub fn reply_never(msg: impl Into>) -> Self { Self::reply_on(msg.into(), UNUSED_MSG_ID, ReplyOn::Never) } - /// Add a gas limit to the message. + /// Add a gas limit to the submessage. /// This gas limit measured in [Cosmos SDK gas](https://github.com/CosmWasm/cosmwasm/blob/main/docs/GAS.md). /// /// ## Examples @@ -100,6 +118,24 @@ impl SubMsg { self } + /// Add a payload to the submessage. + /// + /// ## Examples + /// + /// ``` + /// # use cosmwasm_std::{coins, BankMsg, Binary, ReplyOn, SubMsg}; + /// # let msg = BankMsg::Send { to_address: String::from("you"), amount: coins(1015, "earth") }; + /// let sub_msg: SubMsg = SubMsg::reply_always(msg, 1234) + /// .with_payload(vec![1, 2, 3, 4]); + /// assert_eq!(sub_msg.id, 1234); + /// assert_eq!(sub_msg.payload, Binary::new(vec![1, 2, 3, 4])); + /// assert_eq!(sub_msg.reply_on, ReplyOn::Always); + /// ``` + pub fn with_payload(mut self, payload: impl Into) -> Self { + self.payload = payload.into(); + self + } + fn reply_on(msg: CosmosMsg, id: u64, reply_on: ReplyOn) -> Self { SubMsg { id, From cb7f2804bec587f7b2cfe933c17f4d13949a4a1e Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 29 Jan 2024 17:56:15 +0100 Subject: [PATCH 1187/2372] Improve docs on SubMsg.gas_limit --- contracts/reflect/schema/raw/execute.json | 2 +- contracts/reflect/schema/reflect.json | 2 +- packages/std/src/results/submessages.rs | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/contracts/reflect/schema/raw/execute.json b/contracts/reflect/schema/raw/execute.json index 55c55e28b1..57d1458f0b 100644 --- a/contracts/reflect/schema/raw/execute.json +++ b/contracts/reflect/schema/raw/execute.json @@ -698,7 +698,7 @@ ], "properties": { "gas_limit": { - "description": "Gas limit measured in [Cosmos SDK gas](https://github.com/CosmWasm/cosmwasm/blob/main/docs/GAS.md).", + "description": "Gas limit measured in [Cosmos SDK gas](https://github.com/CosmWasm/cosmwasm/blob/main/docs/GAS.md).\n\nSetting this to `None` means unlimited. Then the submessage execution can consume all gas of the current execution context.", "type": [ "integer", "null" diff --git a/contracts/reflect/schema/reflect.json b/contracts/reflect/schema/reflect.json index b510a0572b..c271b4a8ff 100644 --- a/contracts/reflect/schema/reflect.json +++ b/contracts/reflect/schema/reflect.json @@ -708,7 +708,7 @@ ], "properties": { "gas_limit": { - "description": "Gas limit measured in [Cosmos SDK gas](https://github.com/CosmWasm/cosmwasm/blob/main/docs/GAS.md).", + "description": "Gas limit measured in [Cosmos SDK gas](https://github.com/CosmWasm/cosmwasm/blob/main/docs/GAS.md).\n\nSetting this to `None` means unlimited. Then the submessage execution can consume all gas of the current execution context.", "type": [ "integer", "null" diff --git a/packages/std/src/results/submessages.rs b/packages/std/src/results/submessages.rs index 05dcc7a712..00b43cb011 100644 --- a/packages/std/src/results/submessages.rs +++ b/packages/std/src/results/submessages.rs @@ -49,6 +49,9 @@ pub struct SubMsg { pub payload: Binary, pub msg: CosmosMsg, /// Gas limit measured in [Cosmos SDK gas](https://github.com/CosmWasm/cosmwasm/blob/main/docs/GAS.md). + /// + /// Setting this to `None` means unlimited. Then the submessage execution can consume all gas of the + /// current execution context. pub gas_limit: Option, pub reply_on: ReplyOn, } From 82124127ceafd5b19d1f022e1a8667db8db9d75a Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 29 Jan 2024 23:13:44 +0100 Subject: [PATCH 1188/2372] Test SubMsg::new, ::reply_never, ::reply_always, ::with_gas_limit, ::with_payload --- packages/std/src/results/submessages.rs | 66 ++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/packages/std/src/results/submessages.rs b/packages/std/src/results/submessages.rs index 00b43cb011..a4c3d31da2 100644 --- a/packages/std/src/results/submessages.rs +++ b/packages/std/src/results/submessages.rs @@ -283,7 +283,71 @@ pub struct MsgResponse { #[allow(deprecated)] mod tests { use super::*; - use crate::{from_json, to_json_vec, Attribute, StdError, StdResult}; + use crate::{coins, from_json, to_json_vec, Attribute, BankMsg, StdError, StdResult}; + + #[test] + fn sub_msg_new_works() { + let msg = BankMsg::Send { + to_address: String::from("you"), + amount: coins(1015, "earth"), + }; + let sub_msg: SubMsg = SubMsg::new(msg.clone()); + // id and payload don't matter since there is no reply + assert_eq!(sub_msg.reply_on, ReplyOn::Never); + assert_eq!(sub_msg.gas_limit, None); + assert_eq!(sub_msg.msg, CosmosMsg::from(msg)); + } + + #[test] + fn sub_msg_reply_never_works() { + let msg = BankMsg::Send { + to_address: String::from("you"), + amount: coins(1015, "earth"), + }; + let sub_msg: SubMsg = SubMsg::reply_never(msg.clone()); + // id and payload don't matter since there is no reply + assert_eq!(sub_msg.reply_on, ReplyOn::Never); + assert_eq!(sub_msg.gas_limit, None); + assert_eq!(sub_msg.msg, CosmosMsg::from(msg)); + } + + #[test] + fn sub_msg_reply_always_works() { + let msg = BankMsg::Send { + to_address: String::from("you"), + amount: coins(1015, "earth"), + }; + let sub_msg: SubMsg = SubMsg::reply_always(msg.clone(), 54); + assert_eq!(sub_msg.id, 54); + assert_eq!(sub_msg.payload, Binary::default()); + assert_eq!(sub_msg.reply_on, ReplyOn::Always); + assert_eq!(sub_msg.gas_limit, None); + assert_eq!(sub_msg.msg, CosmosMsg::from(msg)); + } + + #[test] + fn sub_msg_with_gas_limit_works() { + let msg = BankMsg::Send { + to_address: String::from("you"), + amount: coins(1015, "earth"), + }; + let sub_msg: SubMsg = SubMsg::reply_never(msg); + assert_eq!(sub_msg.gas_limit, None); + let sub_msg = sub_msg.with_gas_limit(20); + assert_eq!(sub_msg.gas_limit, Some(20)); + } + + #[test] + fn sub_msg_with_payload_works() { + let msg = BankMsg::Send { + to_address: String::from("you"), + amount: coins(1015, "earth"), + }; + let sub_msg: SubMsg = SubMsg::reply_never(msg); + assert_eq!(sub_msg.payload, Binary::default()); + let sub_msg = sub_msg.with_payload(vec![0xAA, 3, 5, 1, 2]); + assert_eq!(sub_msg.payload, Binary::new(vec![0xAA, 3, 5, 1, 2])); + } #[test] fn sub_msg_result_serialization_works() { From 7addcf5f0219da8563794eef14a1ac8378b7ee67 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 30 Jan 2024 11:49:33 +0100 Subject: [PATCH 1189/2372] Add MIGRATING entry for payload --- MIGRATING.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/MIGRATING.md b/MIGRATING.md index 3649f40243..2b20ac4b57 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -221,6 +221,47 @@ major releases of `cosmwasm`. Note that you can also view the +}))?; ``` +- A new `payload` field allows you to send arbitrary data from the original + contract into the `reply`. If you construct `SubMsg` manually, add the + `payload` field: + + ```diff + SubMsg { + id: 12, + + payload: Binary::default(), + msg: my_bank_send, + gas_limit: Some(12345u64), + reply_on: ReplyOn::Always, + }, + ``` + + or with data: + + ```diff + SubMsg { + id: 12, + + payload: Binary::new(vec![9, 8, 7, 6, 5]), + msg: my_bank_send, + gas_limit: Some(12345u64), + reply_on: ReplyOn::Always, + }, + ``` + + If you use a constructor function, you can set the payload as follows: + + ```diff + SubMsg::new(BankMsg::Send { + to_address: payout, + amount: coins(123456u128,"gold") + }) + +.with_payload(vec![9, 8, 7, 6, 5]) + ``` + + The payload data will then be available in the new field `Reply.payload` in + the `reply` entry point. This functionality is an optional addition introduced + in 2.0. To keep the CosmWasm 1.x behaviour, just set payload to + `Binary::default()`. + ## 1.4.x -> 1.5.0 - Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use): From bd39d33ce74977cd52e7ad7a608ae8ca5d542b66 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 31 Jan 2024 10:18:24 +0100 Subject: [PATCH 1190/2372] Pin k256 version to 0.13.1 --- packages/crypto/Cargo.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index c1f0798ae7..e225f43d38 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -15,7 +15,8 @@ default = [] bench = false [dependencies] -k256 = { version = "0.13.1", features = ["ecdsa"] } +# Version pinned due to https://github.com/CosmWasm/cosmwasm/issues/2010 +k256 = { version = "=0.13.1", features = ["ecdsa"] } ed25519-zebra = "3" digest = "0.10" rand_core = { version = "0.6", features = ["getrandom"] } From b92c55dfab854cc018f7b72c85955dab0c683056 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 31 Jan 2024 10:18:37 +0100 Subject: [PATCH 1191/2372] Unrelated lockfile updates --- contracts/floaty/Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 5c82f7d206..a0339dc779 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -105,9 +105,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" +checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" [[package]] name = "bumpalo" @@ -1351,9 +1351,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" +checksum = "f05da0d153dd4595bdffd5099dc0e9ce425b205ee648eb93437ff7302af8c9a5" dependencies = [ "serde", ] From 3d8e2c0ae01fb8eb2e3126ae56779e355cd1eabd Mon Sep 17 00:00:00 2001 From: Shane Vitarana Date: Sun, 4 Feb 2024 17:40:40 -0500 Subject: [PATCH 1192/2372] Fix typo in comments --- packages/std/src/testing/mock.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 9f9096082d..9944a286d4 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -2262,7 +2262,7 @@ mod tests { res => panic!("Unexpected result: {res:?}"), } - // WasmQuery::ContractInfo + // WasmQuery::CodeInfo #[cfg(feature = "cosmwasm_1_2")] { let result = querier.query(&WasmQuery::CodeInfo { code_id: 4 }); From 0e947669997a8ef059964d9958b9ba0619fadb7c Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 23 Jan 2024 01:35:50 +0100 Subject: [PATCH 1193/2372] Add wycheproof tests for ECDSA secp256k1 --- .../ecdsa_secp256k1_sha256_test.json | 6356 +++++++++++++++ .../ecdsa_secp256k1_sha512_test.json | 7060 +++++++++++++++++ packages/crypto/tests/wycheproof_secp256k1.rs | 288 + 3 files changed, 13704 insertions(+) create mode 100644 packages/crypto/testdata/wycheproof/ecdsa_secp256k1_sha256_test.json create mode 100644 packages/crypto/testdata/wycheproof/ecdsa_secp256k1_sha512_test.json create mode 100644 packages/crypto/tests/wycheproof_secp256k1.rs diff --git a/packages/crypto/testdata/wycheproof/ecdsa_secp256k1_sha256_test.json b/packages/crypto/testdata/wycheproof/ecdsa_secp256k1_sha256_test.json new file mode 100644 index 0000000000..4ef54cef96 --- /dev/null +++ b/packages/crypto/testdata/wycheproof/ecdsa_secp256k1_sha256_test.json @@ -0,0 +1,6356 @@ +{ + "algorithm" : "ECDSA", + "schema" : "ecdsa_verify_schema.json", + "generatorVersion" : "0.9rc5", + "numberOfTests" : 463, + "header" : [ + "Test vectors of type EcdsaVerify are meant for the verification", + "of ASN encoded ECDSA signatures." + ], + "notes" : { + "ArithmeticError" : { + "bugType" : "EDGE_CASE", + "description" : "Some implementations of ECDSA have arithmetic errors that occur when intermediate results have extreme values. This test vector has been constructed to test such occurences.", + "cves" : [ + "CVE-2017-18146" + ] + }, + "BerEncodedSignature" : { + "bugType" : "BER_ENCODING", + "description" : "ECDSA signatures are usually DER encoded. This signature contains valid values for r and s, but it uses alternative BER encoding.", + "effect" : "Accepting alternative BER encodings may be benign in some cases, or be an issue if protocol requires signature malleability.", + "cves" : [ + "CVE-2020-14966", + "CVE-2020-13822", + "CVE-2019-14859", + "CVE-2016-1000342" + ] + }, + "EdgeCasePublicKey" : { + "bugType" : "EDGE_CASE", + "description" : "The test vector uses a special case public key. " + }, + "EdgeCaseShamirMultiplication" : { + "bugType" : "EDGE_CASE", + "description" : "Shamir proposed a fast method for computing the sum of two scalar multiplications efficiently. This test vector has been constructed so that an intermediate result is the point at infinity if Shamir's method is used." + }, + "IntegerOverflow" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an r and s that has been modified, so that the original value is restored if the implementation ignores the most significant bits.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "InvalidEncoding" : { + "bugType" : "CAN_OF_WORMS", + "description" : "ECDSA signatures are encoded using ASN.1. This test vector contains an incorrectly encoded signature. The test vector itself was generated from a valid signature by modifying its encoding.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "InvalidSignature" : { + "bugType" : "AUTH_BYPASS", + "description" : "The signature contains special case values such as r=0 and s=0. Buggy implementations may accept such values, if the implementation does not check boundaries and computes s^(-1) == 0.", + "effect" : "Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.", + "cves" : [ + "CVE-2022-21449", + "CVE-2021-43572", + "CVE-2022-24884" + ] + }, + "InvalidTypesInSignature" : { + "bugType" : "AUTH_BYPASS", + "description" : "The signature contains invalid types. Dynamic typed languages sometime coerce such values of different types into integers. If an implementation is careless and has additional bugs, such as not checking integer boundaries then it may be possible that such signatures are accepted.", + "effect" : "Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.", + "cves" : [ + "CVE-2022-21449" + ] + }, + "MissingZero" : { + "bugType" : "LEGACY", + "description" : "Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.", + "effect" : "While signatures are more malleable if such signatures are accepted, this typically leads to no vulnerability, since a badly encoded signature can be reencoded correctly." + }, + "ModifiedInteger" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an r and s that has been modified. The goal is to check for arithmetic errors.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "ModifiedSignature" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an invalid signature that was generated from a valid signature by modifying it.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "ModularInverse" : { + "bugType" : "EDGE_CASE", + "description" : "The test vectors contains a signature where computing the modular inverse of s hits an edge case.", + "effect" : "While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.", + "cves" : [ + "CVE-2019-0865" + ] + }, + "PointDuplication" : { + "bugType" : "EDGE_CASE", + "description" : "Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission.", + "cves" : [ + "2020-12607", + "CVE-2015-2730" + ] + }, + "RangeCheck" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an r and s that has been modified. By adding or subtracting the order of the group (or other values) the test vector checks whether signature verification verifies the range of r and s.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "SmallRandS" : { + "bugType" : "EDGE_CASE", + "description" : "The test vectors contains a signature where both r and s are small integers. Some libraries cannot verify such signatures.", + "effect" : "While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.", + "cves" : [ + "2020-13895" + ] + }, + "SpecialCaseHash" : { + "bugType" : "EDGE_CASE", + "description" : "The test vector contains a signature where the hash of the message is a special case, e.g., contains a long run of 0 or 1 bits." + }, + "ValidSignature" : { + "bugType" : "BASIC", + "description" : "The test vector contains a valid signature that was generated pseudorandomly. Such signatures should not fail to verify unless some of the parameters (e.g. curve or hash function) are not supported." + } + }, + "testGroups" : [ + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04782c8ed17e3b2a783b5464f33b09652a71c678e05ec51e84e2bcfc663a3de963af9acb4280b8c7f7c42f4ef9aba6245ec1ec1712fd38a0fa96418d8cd6aa6152", + "wx" : "782c8ed17e3b2a783b5464f33b09652a71c678e05ec51e84e2bcfc663a3de963", + "wy" : "00af9acb4280b8c7f7c42f4ef9aba6245ec1ec1712fd38a0fa96418d8cd6aa6152" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004782c8ed17e3b2a783b5464f33b09652a71c678e05ec51e84e2bcfc663a3de963af9acb4280b8c7f7c42f4ef9aba6245ec1ec1712fd38a0fa96418d8cd6aa6152", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEeCyO0X47Kng7VGTzOwllKnHGeOBexR6E\n4rz8Zjo96WOvmstCgLjH98QvTvmrpiRewewXEv04oPqWQY2M1qphUg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 1, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "", + "sig" : "3046022100f80ae4f96cdbc9d853f83d47aae225bf407d51c56b7776cd67d0dc195d99a9dc022100b303e26be1f73465315221f0b331528807a1a9b6eb068ede6eebeaaa49af8a36", + "result" : "valid" + }, + { + "tcId" : 2, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "4d7367", + "sig" : "30450220109cd8ae0374358984a8249c0a843628f2835ffad1df1a9a69aa2fe72355545c022100ac6f00daf53bd8b1e34da329359b6e08019c5b037fed79ee383ae39f85a159c6", + "result" : "valid" + }, + { + "tcId" : 3, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "313233343030", + "sig" : "3045022100d035ee1f17fdb0b2681b163e33c359932659990af77dca632012b30b27a057b302201939d9f3b2858bc13e3474cb50e6a82be44faa71940f876c1cba4c3e989202b6", + "result" : "valid" + }, + { + "tcId" : 4, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "0000000000000000000000000000000000000000", + "sig" : "304402204f053f563ad34b74fd8c9934ce59e79c2eb8e6eca0fef5b323ca67d5ac7ed23802204d4b05daa0719e773d8617dce5631c5fd6f59c9bdc748e4b55c970040af01be5", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04b838ff44e5bc177bf21189d0766082fc9d843226887fc9760371100b7ee20a6ff0c9d75bfba7b31a6bca1974496eeb56de357071955d83c4b1badaa0b21832e9", + "wx" : "00b838ff44e5bc177bf21189d0766082fc9d843226887fc9760371100b7ee20a6f", + "wy" : "00f0c9d75bfba7b31a6bca1974496eeb56de357071955d83c4b1badaa0b21832e9" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004b838ff44e5bc177bf21189d0766082fc9d843226887fc9760371100b7ee20a6ff0c9d75bfba7b31a6bca1974496eeb56de357071955d83c4b1badaa0b21832e9", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEuDj/ROW8F3vyEYnQdmCC/J2EMiaIf8l2\nA3EQC37iCm/wyddb+6ezGmvKGXRJbutW3jVwcZVdg8Sxutqgshgy6Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 5, + "comment" : "signature malleability", + "flags" : [ + "ValidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365022100900e75ad233fcc908509dbff5922647db37c21f4afd3203ae8dc4ae7794b0f87", + "result" : "valid" + }, + { + "tcId" : 6, + "comment" : "Legacy: ASN encoding of r misses leading 0", + "flags" : [ + "MissingZero" + ], + "msg" : "313233343030", + "sig" : "30440220813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 7, + "comment" : "valid", + "flags" : [ + "ValidSignature" + ], + "msg" : "313233343030", + "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "valid" + }, + { + "tcId" : 8, + "comment" : "length of sequence [r, s] uses long form encoding", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "308145022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 9, + "comment" : "length of sequence [r, s] contains a leading 0", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "30820045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 10, + "comment" : "length of sequence [r, s] uses 70 instead of 69", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 11, + "comment" : "length of sequence [r, s] uses 68 instead of 69", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3044022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 12, + "comment" : "uint32 overflow in length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30850100000045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 13, + "comment" : "uint64 overflow in length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3089010000000000000045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 14, + "comment" : "length of sequence [r, s] = 2**31 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30847fffffff022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 15, + "comment" : "length of sequence [r, s] = 2**31", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308480000000022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 16, + "comment" : "length of sequence [r, s] = 2**32 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3084ffffffff022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 17, + "comment" : "length of sequence [r, s] = 2**40 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3085ffffffffff022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 18, + "comment" : "length of sequence [r, s] = 2**64 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3088ffffffffffffffff022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 19, + "comment" : "incorrect length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30ff022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 20, + "comment" : "replaced sequence [r, s] by an indefinite length tag without termination", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 21, + "comment" : "removing sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "", + "result" : "invalid" + }, + { + "tcId" : 22, + "comment" : "lonely sequence tag", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30", + "result" : "invalid" + }, + { + "tcId" : 23, + "comment" : "appending 0's to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000", + "result" : "invalid" + }, + { + "tcId" : 24, + "comment" : "prepending 0's to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30470000022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 25, + "comment" : "appending unused 0's to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000", + "result" : "invalid" + }, + { + "tcId" : 26, + "comment" : "appending null value to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0500", + "result" : "invalid" + }, + { + "tcId" : 27, + "comment" : "prepending garbage to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a4981773045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 28, + "comment" : "prepending garbage to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304925003045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 29, + "comment" : "appending garbage to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30473045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0004deadbeef", + "result" : "invalid" + }, + { + "tcId" : 30, + "comment" : "including undefined tags", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304daa00bb00cd003045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 31, + "comment" : "including undefined tags", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d2229aa00bb00cd00022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 32, + "comment" : "including undefined tags", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323652228aa00bb00cd0002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 33, + "comment" : "truncated length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3081", + "result" : "invalid" + }, + { + "tcId" : 34, + "comment" : "including undefined tags to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304baa02aabb3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 35, + "comment" : "using composition with indefinite length for sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30803045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000", + "result" : "invalid" + }, + { + "tcId" : 36, + "comment" : "using composition with wrong tag for sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30803145022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000", + "result" : "invalid" + }, + { + "tcId" : 37, + "comment" : "Replacing sequence [r, s] with NULL", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "0500", + "result" : "invalid" + }, + { + "tcId" : 38, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "2e45022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 39, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "2f45022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 40, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3145022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 41, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3245022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 42, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "ff45022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 43, + "comment" : "dropping value of sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3000", + "result" : "invalid" + }, + { + "tcId" : 44, + "comment" : "using composition for sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304930010230442100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 45, + "comment" : "truncated sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3044022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31", + "result" : "invalid" + }, + { + "tcId" : 46, + "comment" : "truncated sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30442100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 47, + "comment" : "sequence [r, s] of size 4166 to check for overflows", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30821046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 48, + "comment" : "indefinite length", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000", + "result" : "invalid" + }, + { + "tcId" : 49, + "comment" : "indefinite length with truncated delimiter", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba00", + "result" : "invalid" + }, + { + "tcId" : 50, + "comment" : "indefinite length with additional element", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba05000000", + "result" : "invalid" + }, + { + "tcId" : 51, + "comment" : "indefinite length with truncated element", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba060811220000", + "result" : "invalid" + }, + { + "tcId" : 52, + "comment" : "indefinite length with garbage", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000fe02beef", + "result" : "invalid" + }, + { + "tcId" : 53, + "comment" : "indefinite length with nonempty EOC", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0002beef", + "result" : "invalid" + }, + { + "tcId" : 54, + "comment" : "prepend empty sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30473000022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 55, + "comment" : "append empty sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba3000", + "result" : "invalid" + }, + { + "tcId" : 56, + "comment" : "append zero", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3048022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba020100", + "result" : "invalid" + }, + { + "tcId" : 57, + "comment" : "append garbage with high tag number", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3048022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31babf7f00", + "result" : "invalid" + }, + { + "tcId" : 58, + "comment" : "append null with explicit tag", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31baa0020500", + "result" : "invalid" + }, + { + "tcId" : 59, + "comment" : "append null with implicit tag", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31baa000", + "result" : "invalid" + }, + { + "tcId" : 60, + "comment" : "sequence of sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30473045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 61, + "comment" : "truncated sequence: removed last 1 elements", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3023022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365", + "result" : "invalid" + }, + { + "tcId" : 62, + "comment" : "repeating element in sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3067022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 63, + "comment" : "flipped bit 0 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304300813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236402206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 64, + "comment" : "flipped bit 32 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304300813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccac983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 65, + "comment" : "flipped bit 48 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304300813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5133ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 66, + "comment" : "flipped bit 64 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304300813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc08b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 67, + "comment" : "length of r uses long form encoding", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "304602812100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 68, + "comment" : "length of r contains a leading 0", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "30470282002100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 69, + "comment" : "length of r uses 34 instead of 33", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045022200813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 70, + "comment" : "length of r uses 32 instead of 33", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045022000813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 71, + "comment" : "uint32 overflow in length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a0285010000002100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 72, + "comment" : "uint64 overflow in length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304e028901000000000000002100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 73, + "comment" : "length of r = 2**31 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902847fffffff00813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 74, + "comment" : "length of r = 2**31", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902848000000000813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 75, + "comment" : "length of r = 2**32 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30490284ffffffff00813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 76, + "comment" : "length of r = 2**40 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a0285ffffffffff00813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 77, + "comment" : "length of r = 2**64 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d0288ffffffffffffffff00813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 78, + "comment" : "incorrect length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502ff00813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 79, + "comment" : "replaced r by an indefinite length tag without termination", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045028000813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 80, + "comment" : "removing r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "302202206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 81, + "comment" : "lonely integer tag", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30230202206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 82, + "comment" : "lonely integer tag", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3024022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502", + "result" : "invalid" + }, + { + "tcId" : 83, + "comment" : "appending 0's to r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047022300813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365000002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 84, + "comment" : "prepending 0's to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30470223000000813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 85, + "comment" : "appending unused 0's to r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365000002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 86, + "comment" : "appending null value to r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047022300813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365050002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 87, + "comment" : "prepending garbage to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a2226498177022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 88, + "comment" : "prepending garbage to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304922252500022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 89, + "comment" : "appending garbage to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d2223022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650004deadbeef02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 90, + "comment" : "truncated length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3024028102206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 91, + "comment" : "including undefined tags to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304b2227aa02aabb022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 92, + "comment" : "using composition with indefinite length for r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30492280022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365000002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 93, + "comment" : "using composition with wrong tag for r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30492280032100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365000002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 94, + "comment" : "Replacing r with NULL", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3024050002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 95, + "comment" : "changing tag value of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3045002100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 96, + "comment" : "changing tag value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045012100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 97, + "comment" : "changing tag value of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3045032100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 98, + "comment" : "changing tag value of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3045042100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 99, + "comment" : "changing tag value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045ff2100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 100, + "comment" : "dropping value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3024020002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 101, + "comment" : "using composition for r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304922250201000220813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 102, + "comment" : "modifying first byte of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3045022102813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 103, + "comment" : "modifying last byte of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323e502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 104, + "comment" : "truncated r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3044022000813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832302206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 105, + "comment" : "r of size 4130 to check for overflows", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "308210480282102200813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 106, + "comment" : "leading ff in r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30460222ff00813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 107, + "comment" : "replaced r by infinity", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "302509018002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 108, + "comment" : "replacing r with zero", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "302502010002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 109, + "comment" : "flipped bit 0 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3043022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323656ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31bb", + "result" : "invalid" + }, + { + "tcId" : 110, + "comment" : "flipped bit 32 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3043022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323656ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a456eb31ba", + "result" : "invalid" + }, + { + "tcId" : 111, + "comment" : "flipped bit 48 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3043022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323656ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f713a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 112, + "comment" : "flipped bit 64 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3043022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323656ff18a52dcc0336f7af62400a6dd9b810732baf1ff758001d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 113, + "comment" : "length of s uses long form encoding", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650281206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 114, + "comment" : "length of s contains a leading 0", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365028200206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 115, + "comment" : "length of s uses 33 instead of 32", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502216ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 116, + "comment" : "length of s uses 31 instead of 32", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365021f6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 117, + "comment" : "uint32 overflow in length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365028501000000206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 118, + "comment" : "uint64 overflow in length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304e022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502890100000000000000206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 119, + "comment" : "length of s = 2**31 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502847fffffff6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 120, + "comment" : "length of s = 2**31", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650284800000006ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 121, + "comment" : "length of s = 2**32 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650284ffffffff6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 122, + "comment" : "length of s = 2**40 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650285ffffffffff6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 123, + "comment" : "length of s = 2**64 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650288ffffffffffffffff6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 124, + "comment" : "incorrect length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502ff6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 125, + "comment" : "replaced s by an indefinite length tag without termination", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502806ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 126, + "comment" : "appending 0's to s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502226ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000", + "result" : "invalid" + }, + { + "tcId" : 127, + "comment" : "prepending 0's to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365022200006ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 128, + "comment" : "appending null value to s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502226ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0500", + "result" : "invalid" + }, + { + "tcId" : 129, + "comment" : "prepending garbage to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365222549817702206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 130, + "comment" : "prepending garbage to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323652224250002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 131, + "comment" : "appending garbage to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365222202206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0004deadbeef", + "result" : "invalid" + }, + { + "tcId" : 132, + "comment" : "truncated length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3025022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650281", + "result" : "invalid" + }, + { + "tcId" : 133, + "comment" : "including undefined tags to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304b022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323652226aa02aabb02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 134, + "comment" : "using composition with indefinite length for s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365228002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000", + "result" : "invalid" + }, + { + "tcId" : 135, + "comment" : "using composition with wrong tag for s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365228003206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000", + "result" : "invalid" + }, + { + "tcId" : 136, + "comment" : "Replacing s with NULL", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650500", + "result" : "invalid" + }, + { + "tcId" : 137, + "comment" : "changing tag value of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236500206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 138, + "comment" : "changing tag value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236501206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 139, + "comment" : "changing tag value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236503206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 140, + "comment" : "changing tag value of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236504206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 141, + "comment" : "changing tag value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365ff206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 142, + "comment" : "dropping value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3025022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650200", + "result" : "invalid" + }, + { + "tcId" : 143, + "comment" : "using composition for s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365222402016f021ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 144, + "comment" : "modifying first byte of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206df18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 145, + "comment" : "modifying last byte of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb313a", + "result" : "invalid" + }, + { + "tcId" : 146, + "comment" : "truncated s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3044022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365021f6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31", + "result" : "invalid" + }, + { + "tcId" : 147, + "comment" : "truncated s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3044022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365021ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 148, + "comment" : "s of size 4129 to check for overflows", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30821048022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365028210216ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 149, + "comment" : "leading ff in s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650221ff6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 150, + "comment" : "replaced s by infinity", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365090180", + "result" : "invalid" + }, + { + "tcId" : 151, + "comment" : "replacing s with zero", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365020100", + "result" : "invalid" + }, + { + "tcId" : 152, + "comment" : "replaced r by r + n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "3045022101813ef79ccefa9a56f7ba805f0e478583b90deabca4b05c4574e49b5899b964a602206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 153, + "comment" : "replaced r by r - n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "30440220813ef79ccefa9a56f7ba805f0e47858643b030ef461f1bcdf53fde3ef94ce22402206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 154, + "comment" : "replaced r by r + 256 * n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "304602220100813ef79ccefa9a56f7ba805f0e47843fad3bf4853e07f7c98770c99bffc4646502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 155, + "comment" : "replaced r by -r", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30450221ff7ec10863310565a908457fa0f1b87a7b01a0f22a0a9843f64aedc334367cdc9b02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 156, + "comment" : "replaced r by n - r", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "304402207ec10863310565a908457fa0f1b87a79bc4fcf10b9e0e4320ac021c106b31ddc02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 157, + "comment" : "replaced r by -n - r", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30450221fe7ec10863310565a908457fa0f1b87a7c46f215435b4fa3ba8b1b64a766469b5a02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 158, + "comment" : "replaced r by r + 2**256", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "3045022101813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 159, + "comment" : "replaced r by r + 2**320", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "304d0229010000000000000000813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 160, + "comment" : "replaced s by s + n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "30450221016ff18a52dcc0336f7af62400a6dd9b7fc1e197d8aebe203c96c87232272172fb02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 161, + "comment" : "replaced s by s - n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "30450221ff6ff18a52dcc0336f7af62400a6dd9b824c83de0b502cdfc51723b51886b4f07902206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 162, + "comment" : "replaced s by s + 256 * n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "3046022201006ff18a52dcc0336f7af62400a6dd9a3bb60fa1a14815bbc0a954a0758d2c72ba02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 163, + "comment" : "replaced s by -s", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30440220900e75ad233fcc908509dbff5922647ef8cd450e008a7fff2909ec5aa914ce4602206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 164, + "comment" : "replaced s by -n - s", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30450221fe900e75ad233fcc908509dbff592264803e1e68275141dfc369378dcdd8de8d0502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 165, + "comment" : "replaced s by s + 2**256", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "30450221016ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 166, + "comment" : "replaced s by s - 2**256", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "30450221ff6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 167, + "comment" : "replaced s by s + 2**320", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "304d02290100000000000000006ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba", + "result" : "invalid" + }, + { + "tcId" : 168, + "comment" : "Signature with special case values r=0 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100020100", + "result" : "invalid" + }, + { + "tcId" : 169, + "comment" : "Signature with special case values r=0 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100020101", + "result" : "invalid" + }, + { + "tcId" : 170, + "comment" : "Signature with special case values r=0 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201000201ff", + "result" : "invalid" + }, + { + "tcId" : 171, + "comment" : "Signature with special case values r=0 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 172, + "comment" : "Signature with special case values r=0 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 173, + "comment" : "Signature with special case values r=0 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 174, + "comment" : "Signature with special case values r=0 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 175, + "comment" : "Signature with special case values r=0 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 176, + "comment" : "Signature with special case values r=1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101020100", + "result" : "invalid" + }, + { + "tcId" : 177, + "comment" : "Signature with special case values r=1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101020101", + "result" : "invalid" + }, + { + "tcId" : 178, + "comment" : "Signature with special case values r=1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201010201ff", + "result" : "invalid" + }, + { + "tcId" : 179, + "comment" : "Signature with special case values r=1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 180, + "comment" : "Signature with special case values r=1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 181, + "comment" : "Signature with special case values r=1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 182, + "comment" : "Signature with special case values r=1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 183, + "comment" : "Signature with special case values r=1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 184, + "comment" : "Signature with special case values r=-1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff020100", + "result" : "invalid" + }, + { + "tcId" : 185, + "comment" : "Signature with special case values r=-1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff020101", + "result" : "invalid" + }, + { + "tcId" : 186, + "comment" : "Signature with special case values r=-1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff0201ff", + "result" : "invalid" + }, + { + "tcId" : 187, + "comment" : "Signature with special case values r=-1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 188, + "comment" : "Signature with special case values r=-1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 189, + "comment" : "Signature with special case values r=-1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 190, + "comment" : "Signature with special case values r=-1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 191, + "comment" : "Signature with special case values r=-1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 192, + "comment" : "Signature with special case values r=n and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141020100", + "result" : "invalid" + }, + { + "tcId" : 193, + "comment" : "Signature with special case values r=n and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141020101", + "result" : "invalid" + }, + { + "tcId" : 194, + "comment" : "Signature with special case values r=n and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410201ff", + "result" : "invalid" + }, + { + "tcId" : 195, + "comment" : "Signature with special case values r=n and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 196, + "comment" : "Signature with special case values r=n and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 197, + "comment" : "Signature with special case values r=n and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 198, + "comment" : "Signature with special case values r=n and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 199, + "comment" : "Signature with special case values r=n and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 200, + "comment" : "Signature with special case values r=n - 1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140020100", + "result" : "invalid" + }, + { + "tcId" : 201, + "comment" : "Signature with special case values r=n - 1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140020101", + "result" : "invalid" + }, + { + "tcId" : 202, + "comment" : "Signature with special case values r=n - 1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641400201ff", + "result" : "invalid" + }, + { + "tcId" : 203, + "comment" : "Signature with special case values r=n - 1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 204, + "comment" : "Signature with special case values r=n - 1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 205, + "comment" : "Signature with special case values r=n - 1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 206, + "comment" : "Signature with special case values r=n - 1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 207, + "comment" : "Signature with special case values r=n - 1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 208, + "comment" : "Signature with special case values r=n + 1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142020100", + "result" : "invalid" + }, + { + "tcId" : 209, + "comment" : "Signature with special case values r=n + 1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142020101", + "result" : "invalid" + }, + { + "tcId" : 210, + "comment" : "Signature with special case values r=n + 1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641420201ff", + "result" : "invalid" + }, + { + "tcId" : 211, + "comment" : "Signature with special case values r=n + 1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 212, + "comment" : "Signature with special case values r=n + 1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 213, + "comment" : "Signature with special case values r=n + 1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 214, + "comment" : "Signature with special case values r=n + 1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 215, + "comment" : "Signature with special case values r=n + 1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 216, + "comment" : "Signature with special case values r=p and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f020100", + "result" : "invalid" + }, + { + "tcId" : 217, + "comment" : "Signature with special case values r=p and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f020101", + "result" : "invalid" + }, + { + "tcId" : 218, + "comment" : "Signature with special case values r=p and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0201ff", + "result" : "invalid" + }, + { + "tcId" : 219, + "comment" : "Signature with special case values r=p and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 220, + "comment" : "Signature with special case values r=p and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 221, + "comment" : "Signature with special case values r=p and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 222, + "comment" : "Signature with special case values r=p and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 223, + "comment" : "Signature with special case values r=p and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 224, + "comment" : "Signature with special case values r=p + 1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30020100", + "result" : "invalid" + }, + { + "tcId" : 225, + "comment" : "Signature with special case values r=p + 1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30020101", + "result" : "invalid" + }, + { + "tcId" : 226, + "comment" : "Signature with special case values r=p + 1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc300201ff", + "result" : "invalid" + }, + { + "tcId" : 227, + "comment" : "Signature with special case values r=p + 1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 228, + "comment" : "Signature with special case values r=p + 1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 229, + "comment" : "Signature with special case values r=p + 1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 230, + "comment" : "Signature with special case values r=p + 1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 231, + "comment" : "Signature with special case values r=p + 1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 232, + "comment" : "Signature encoding contains incorrect types: r=0, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3008020100090380fe01", + "result" : "invalid" + }, + { + "tcId" : 233, + "comment" : "Signature encoding contains incorrect types: r=0, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100090142", + "result" : "invalid" + }, + { + "tcId" : 234, + "comment" : "Signature encoding contains incorrect types: r=0, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100010101", + "result" : "invalid" + }, + { + "tcId" : 235, + "comment" : "Signature encoding contains incorrect types: r=0, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100010100", + "result" : "invalid" + }, + { + "tcId" : 236, + "comment" : "Signature encoding contains incorrect types: r=0, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201000500", + "result" : "invalid" + }, + { + "tcId" : 237, + "comment" : "Signature encoding contains incorrect types: r=0, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201000c00", + "result" : "invalid" + }, + { + "tcId" : 238, + "comment" : "Signature encoding contains incorrect types: r=0, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201000c0130", + "result" : "invalid" + }, + { + "tcId" : 239, + "comment" : "Signature encoding contains incorrect types: r=0, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201003000", + "result" : "invalid" + }, + { + "tcId" : 240, + "comment" : "Signature encoding contains incorrect types: r=0, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201003003020100", + "result" : "invalid" + }, + { + "tcId" : 241, + "comment" : "Signature encoding contains incorrect types: r=1, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3008020101090380fe01", + "result" : "invalid" + }, + { + "tcId" : 242, + "comment" : "Signature encoding contains incorrect types: r=1, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101090142", + "result" : "invalid" + }, + { + "tcId" : 243, + "comment" : "Signature encoding contains incorrect types: r=1, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101010101", + "result" : "invalid" + }, + { + "tcId" : 244, + "comment" : "Signature encoding contains incorrect types: r=1, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101010100", + "result" : "invalid" + }, + { + "tcId" : 245, + "comment" : "Signature encoding contains incorrect types: r=1, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201010500", + "result" : "invalid" + }, + { + "tcId" : 246, + "comment" : "Signature encoding contains incorrect types: r=1, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201010c00", + "result" : "invalid" + }, + { + "tcId" : 247, + "comment" : "Signature encoding contains incorrect types: r=1, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201010c0130", + "result" : "invalid" + }, + { + "tcId" : 248, + "comment" : "Signature encoding contains incorrect types: r=1, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201013000", + "result" : "invalid" + }, + { + "tcId" : 249, + "comment" : "Signature encoding contains incorrect types: r=1, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201013003020100", + "result" : "invalid" + }, + { + "tcId" : 250, + "comment" : "Signature encoding contains incorrect types: r=-1, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201ff090380fe01", + "result" : "invalid" + }, + { + "tcId" : 251, + "comment" : "Signature encoding contains incorrect types: r=-1, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff090142", + "result" : "invalid" + }, + { + "tcId" : 252, + "comment" : "Signature encoding contains incorrect types: r=-1, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff010101", + "result" : "invalid" + }, + { + "tcId" : 253, + "comment" : "Signature encoding contains incorrect types: r=-1, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff010100", + "result" : "invalid" + }, + { + "tcId" : 254, + "comment" : "Signature encoding contains incorrect types: r=-1, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201ff0500", + "result" : "invalid" + }, + { + "tcId" : 255, + "comment" : "Signature encoding contains incorrect types: r=-1, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201ff0c00", + "result" : "invalid" + }, + { + "tcId" : 256, + "comment" : "Signature encoding contains incorrect types: r=-1, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff0c0130", + "result" : "invalid" + }, + { + "tcId" : 257, + "comment" : "Signature encoding contains incorrect types: r=-1, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201ff3000", + "result" : "invalid" + }, + { + "tcId" : 258, + "comment" : "Signature encoding contains incorrect types: r=-1, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201ff3003020100", + "result" : "invalid" + }, + { + "tcId" : 259, + "comment" : "Signature encoding contains incorrect types: r=n, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141090380fe01", + "result" : "invalid" + }, + { + "tcId" : 260, + "comment" : "Signature encoding contains incorrect types: r=n, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141090142", + "result" : "invalid" + }, + { + "tcId" : 261, + "comment" : "Signature encoding contains incorrect types: r=n, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141010101", + "result" : "invalid" + }, + { + "tcId" : 262, + "comment" : "Signature encoding contains incorrect types: r=n, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141010100", + "result" : "invalid" + }, + { + "tcId" : 263, + "comment" : "Signature encoding contains incorrect types: r=n, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410500", + "result" : "invalid" + }, + { + "tcId" : 264, + "comment" : "Signature encoding contains incorrect types: r=n, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410c00", + "result" : "invalid" + }, + { + "tcId" : 265, + "comment" : "Signature encoding contains incorrect types: r=n, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410c0130", + "result" : "invalid" + }, + { + "tcId" : 266, + "comment" : "Signature encoding contains incorrect types: r=n, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641413000", + "result" : "invalid" + }, + { + "tcId" : 267, + "comment" : "Signature encoding contains incorrect types: r=n, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641413003020100", + "result" : "invalid" + }, + { + "tcId" : 268, + "comment" : "Signature encoding contains incorrect types: r=p, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f090380fe01", + "result" : "invalid" + }, + { + "tcId" : 269, + "comment" : "Signature encoding contains incorrect types: r=p, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f090142", + "result" : "invalid" + }, + { + "tcId" : 270, + "comment" : "Signature encoding contains incorrect types: r=p, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f010101", + "result" : "invalid" + }, + { + "tcId" : 271, + "comment" : "Signature encoding contains incorrect types: r=p, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f010100", + "result" : "invalid" + }, + { + "tcId" : 272, + "comment" : "Signature encoding contains incorrect types: r=p, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0500", + "result" : "invalid" + }, + { + "tcId" : 273, + "comment" : "Signature encoding contains incorrect types: r=p, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0c00", + "result" : "invalid" + }, + { + "tcId" : 274, + "comment" : "Signature encoding contains incorrect types: r=p, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0c0130", + "result" : "invalid" + }, + { + "tcId" : 275, + "comment" : "Signature encoding contains incorrect types: r=p, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f3000", + "result" : "invalid" + }, + { + "tcId" : 276, + "comment" : "Signature encoding contains incorrect types: r=p, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f3003020100", + "result" : "invalid" + }, + { + "tcId" : 277, + "comment" : "Signature encoding contains incorrect types: r=0.25, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300a090380fe01090380fe01", + "result" : "invalid" + }, + { + "tcId" : 278, + "comment" : "Signature encoding contains incorrect types: r=nan, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006090142090142", + "result" : "invalid" + }, + { + "tcId" : 279, + "comment" : "Signature encoding contains incorrect types: r=True, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010101010101", + "result" : "invalid" + }, + { + "tcId" : 280, + "comment" : "Signature encoding contains incorrect types: r=False, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010100010100", + "result" : "invalid" + }, + { + "tcId" : 281, + "comment" : "Signature encoding contains incorrect types: r=Null, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300405000500", + "result" : "invalid" + }, + { + "tcId" : 282, + "comment" : "Signature encoding contains incorrect types: r=empyt UTF-8 string, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30040c000c00", + "result" : "invalid" + }, + { + "tcId" : 283, + "comment" : "Signature encoding contains incorrect types: r=\"0\", s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060c01300c0130", + "result" : "invalid" + }, + { + "tcId" : 284, + "comment" : "Signature encoding contains incorrect types: r=empty list, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300430003000", + "result" : "invalid" + }, + { + "tcId" : 285, + "comment" : "Signature encoding contains incorrect types: r=list containing 0, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300a30030201003003020100", + "result" : "invalid" + }, + { + "tcId" : 286, + "comment" : "Signature encoding contains incorrect types: r=0.25, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3008090380fe01020100", + "result" : "invalid" + }, + { + "tcId" : 287, + "comment" : "Signature encoding contains incorrect types: r=nan, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006090142020100", + "result" : "invalid" + }, + { + "tcId" : 288, + "comment" : "Signature encoding contains incorrect types: r=True, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010101020100", + "result" : "invalid" + }, + { + "tcId" : 289, + "comment" : "Signature encoding contains incorrect types: r=False, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010100020100", + "result" : "invalid" + }, + { + "tcId" : 290, + "comment" : "Signature encoding contains incorrect types: r=Null, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050500020100", + "result" : "invalid" + }, + { + "tcId" : 291, + "comment" : "Signature encoding contains incorrect types: r=empyt UTF-8 string, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050c00020100", + "result" : "invalid" + }, + { + "tcId" : 292, + "comment" : "Signature encoding contains incorrect types: r=\"0\", s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060c0130020100", + "result" : "invalid" + }, + { + "tcId" : 293, + "comment" : "Signature encoding contains incorrect types: r=empty list, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30053000020100", + "result" : "invalid" + }, + { + "tcId" : 294, + "comment" : "Signature encoding contains incorrect types: r=list containing 0, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30083003020100020100", + "result" : "invalid" + }, + { + "tcId" : 295, + "comment" : "Edge case for Shamir multiplication", + "flags" : [ + "EdgeCaseShamirMultiplication" + ], + "msg" : "3235353835", + "sig" : "3045022100dd1b7d09a7bd8218961034a39a87fecf5314f00c4d25eb58a07ac85e85eab516022035138c401ef8d3493d65c9002fe62b43aee568731b744548358996d9cc427e06", + "result" : "valid" + }, + { + "tcId" : 296, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "343236343739373234", + "sig" : "304502210095c29267d972a043d955224546222bba343fc1d4db0fec262a33ac61305696ae02206edfe96713aed56f8a28a6653f57e0b829712e5eddc67f34682b24f0676b2640", + "result" : "valid" + }, + { + "tcId" : 297, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37313338363834383931", + "sig" : "3045022028f94a894e92024699e345fe66971e3edcd050023386135ab3939d550898fb25022100cd69c1a42be05a6ee1270c821479251e134c21858d800bda6f4e98b37196238e", + "result" : "valid" + }, + { + "tcId" : 298, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3130333539333331363638", + "sig" : "3046022100be26b18f9549f89f411a9b52536b15aa270b84548d0e859a1952a27af1a77ac60221008f3e2b05632fc33715572af9124681113f2b84325b80154c044a544dc1a8fa12", + "result" : "valid" + }, + { + "tcId" : 299, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33393439343031323135", + "sig" : "3046022100b1a4b1478e65cc3eafdf225d1298b43f2da19e4bcff7eacc0a2e98cd4b74b114022100e8655ce1cfb33ebd30af8ce8e8ae4d6f7b50cd3e22af51bf69e0a2851760d52b", + "result" : "valid" + }, + { + "tcId" : 300, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31333434323933303739", + "sig" : "30440220325332021261f1bd18f2712aa1e2252da23796da8a4b1ff6ea18cafec7e171f2022040b4f5e287ee61fc3c804186982360891eaa35c75f05a43ecd48b35d984a6648", + "result" : "valid" + }, + { + "tcId" : 301, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33373036323131373132", + "sig" : "3046022100a23ad18d8fc66d81af0903890cbd453a554cb04cdc1a8ca7f7f78e5367ed88a0022100dc1c14d31e3fb158b73c764268c8b55579734a7e2a2c9b5ee5d9d0144ef652eb", + "result" : "valid" + }, + { + "tcId" : 302, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "333433363838373132", + "sig" : "304502202bdea41cda63a2d14bf47353bd20880a690901de7cd6e3cc6d8ed5ba0cdb1091022100c31599433036064073835b1e3eba8335a650c8fd786f94fe235ad7d41dc94c7a", + "result" : "valid" + }, + { + "tcId" : 303, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31333531353330333730", + "sig" : "3046022100d7cd76ec01c1b1079eba9e2aa2a397243c4758c98a1ba0b7404a340b9b00ced6022100ca8affe1e626dd192174c2937b15bc48f77b5bdfe01f073a8aeaf7f24dc6c85b", + "result" : "valid" + }, + { + "tcId" : 304, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36353533323033313236", + "sig" : "3045022100a872c744d936db21a10c361dd5c9063355f84902219652f6fc56dc95a7139d960220400df7575d9756210e9ccc77162c6b593c7746cfb48ac263c42750b421ef4bb9", + "result" : "valid" + }, + { + "tcId" : 305, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31353634333436363033", + "sig" : "30460221009fa9afe07752da10b36d3afcd0fe44bfc40244d75203599cf8f5047fa3453854022100af1f583fec4040ae7e68c968d2bb4b494eec3a33edc7c0ccf95f7f75bc2569c7", + "result" : "valid" + }, + { + "tcId" : 306, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34343239353339313137", + "sig" : "3045022100885640384d0d910efb177b46be6c3dc5cac81f0b88c3190bb6b5f99c2641f2050220738ed9bff116306d9caa0f8fc608be243e0b567779d8dab03e8e19d553f1dc8e", + "result" : "valid" + }, + { + "tcId" : 307, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3130393533323631333531", + "sig" : "304502202d051f91c5a9d440c5676985710483bc4f1a6c611b10c95a2ff0363d90c2a45802210092206b19045a41a797cc2f3ac30de9518165e96d5b86341ecb3bcff231b3fd65", + "result" : "valid" + }, + { + "tcId" : 308, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35393837333530303431", + "sig" : "3045022100f3ac2523967482f53d508522712d583f4379cd824101ff635ea0935117baa54f022027f10812227397e02cea96fb0e680761636dab2b080d1fc5d11685cbe8500cfe", + "result" : "valid" + }, + { + "tcId" : 309, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33343633303036383738", + "sig" : "304602210096447cf68c3ab7266ed7447de3ac52fed7cc08cbdfea391c18a9b8ab370bc913022100f0a1878b2c53f16e70fe377a5e9c6e86f18ae480a22bb499f5b32e7109c07385", + "result" : "valid" + }, + { + "tcId" : 310, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "39383137333230323837", + "sig" : "30450220530a0832b691da0b5619a0b11de6877f3c0971baaa68ed122758c29caaf46b7202210093761bb0a14ccf9f15b4b9ce73c6ec700bd015b8cb1cfac56837f4463f53074e", + "result" : "valid" + }, + { + "tcId" : 311, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33323232303431303436", + "sig" : "30460221009c54c25500bde0b92d72d6ec483dc2482f3654294ca74de796b681255ed58a77022100988bac394a90ad89ce360984c0c149dcbd2684bb64498ace90bcf6b6af1c170e", + "result" : "valid" + }, + { + "tcId" : 312, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36363636333037313034", + "sig" : "3045022100e7909d41439e2f6af29136c7348ca2641a2b070d5b64f91ea9da7070c7a2618b022042d782f132fa1d36c2c88ba27c3d678d80184a5d1eccac7501f0b47e3d205008", + "result" : "valid" + }, + { + "tcId" : 313, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31303335393531383938", + "sig" : "304502205924873209593135a4c3da7bb381227f8a4b6aa9f34fe5bb7f8fbc131a039ffe022100e0e44ee4bbe370155bf0bbdec265bf9fe31c0746faab446de62e3631eacd111f", + "result" : "valid" + }, + { + "tcId" : 314, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31383436353937313935", + "sig" : "3045022100eeb692c9b262969b231c38b5a7f60649e0c875cd64df88f33aa571fa3d29ab0e0220218b3a1eb06379c2c18cf51b06430786d1c64cd2d24c9b232b23e5bac7989acd", + "result" : "valid" + }, + { + "tcId" : 315, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33313336303436313839", + "sig" : "3045022100a40034177f36091c2b653684a0e3eb5d4bff18e4d09f664c2800e7cafda1daf802203a3ec29853704e52031c58927a800a968353adc3d973beba9172cbbeab4dd149", + "result" : "valid" + }, + { + "tcId" : 316, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32363633373834323534", + "sig" : "3046022100b5d795cc75cea5c434fa4185180cd6bd21223f3d5a86da6670d71d95680dadbf022100ab1b277ef5ffe134460835e3d1402461ba104cb50b16f397fdc7a9abfefef280", + "result" : "valid" + }, + { + "tcId" : 317, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31363532313030353234", + "sig" : "3044022007dc2478d43c1232a4595608c64426c35510051a631ae6a5a6eb1161e57e42e102204a59ea0fdb72d12165cea3bf1ca86ba97517bd188db3dbd21a5a157850021984", + "result" : "valid" + }, + { + "tcId" : 318, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35373438303831363936", + "sig" : "3046022100ddd20c4a05596ca868b558839fce9f6511ddd83d1ccb53f82e5269d559a01552022100a46e8cb8d626cf6c00ddedc3b5da7e613ac376445ee260743f06f79054c7d42a", + "result" : "valid" + }, + { + "tcId" : 319, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36333433393133343638", + "sig" : "30450221009cde6e0ede0a003f02fda0a01b59facfe5dec063318f279ce2de7a9b1062f7b702202886a5b8c679bdf8224c66f908fd6205492cb70b0068d46ae4f33a4149b12a52", + "result" : "valid" + }, + { + "tcId" : 320, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31353431313033353938", + "sig" : "3046022100c5771016d0dd6357143c89f684cd740423502554c0c59aa8c99584f1ff38f609022100ab4bfa0bb88ab99791b9b3ab9c4b02bd2a57ae8dde50b9064063fcf85315cfe5", + "result" : "valid" + }, + { + "tcId" : 321, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3130343738353830313238", + "sig" : "3045022100a24ebc0ec224bd67ae397cbe6fa37b3125adbd34891abe2d7c7356921916dfe6022034f6eb6374731bbbafc4924fb8b0bdcdda49456d724cdae6178d87014cb53d8c", + "result" : "valid" + }, + { + "tcId" : 322, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3130353336323835353638", + "sig" : "304502202557d64a7aee2e0931c012e4fea1cd3a2c334edae68cdeb7158caf21b68e5a2402210080f93244956ffdc568c77d12684f7f004fa92da7e60ae94a1b98c422e23eda34", + "result" : "valid" + }, + { + "tcId" : 323, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "393533393034313035", + "sig" : "3046022100c4f2eccbb6a24350c8466450b9d61b207ee359e037b3dcedb42a3f2e6dd6aeb5022100cd9c394a65d0aa322e391eb76b2a1a687f8620a88adef3a01eb8e4fb05b6477a", + "result" : "valid" + }, + { + "tcId" : 324, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "393738383438303339", + "sig" : "3046022100eff04781c9cbcd162d0a25a6e2ebcca43506c523385cb515d49ea38a1b12fcad022100ea5328ce6b36e56ab87acb0dcfea498bcec1bba86a065268f6eff3c41c4b0c9c", + "result" : "valid" + }, + { + "tcId" : 325, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33363130363732343432", + "sig" : "3046022100f58b4e3110a64bf1b5db97639ee0e5a9c8dfa49dc59b679891f520fdf0584c87022100d32701ae777511624c1f8abbf02b248b04e7a9eb27938f524f3e8828ba40164a", + "result" : "valid" + }, + { + "tcId" : 326, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31303534323430373035", + "sig" : "3045022100f8abecaa4f0c502de4bf5903d48417f786bf92e8ad72fec0bd7fcb7800c0bbe302204c7f9e231076a30b7ae36b0cebe69ccef1cd194f7cce93a5588fd6814f437c0e", + "result" : "valid" + }, + { + "tcId" : 327, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35313734343438313937", + "sig" : "304402205d5b38bd37ad498b2227a633268a8cca879a5c7c94a4e416bd0a614d09e606d2022012b8d664ea9991062ecbb834e58400e25c46007af84f6007d7f1685443269afe", + "result" : "valid" + }, + { + "tcId" : 328, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31393637353631323531", + "sig" : "304402200c1cd9fe4034f086a2b52d65b9d3834d72aebe7f33dfe8f976da82648177d8e3022013105782e3d0cfe85c2778dec1a848b27ac0ae071aa6da341a9553a946b41e59", + "result" : "valid" + }, + { + "tcId" : 329, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33343437323533333433", + "sig" : "3045022100ae7935fb96ff246b7b5d5662870d1ba587b03d6e1360baf47988b5c02ccc1a5b02205f00c323272083782d4a59f2dfd65e49de0693627016900ef7e61428056664b3", + "result" : "valid" + }, + { + "tcId" : 330, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "333638323634333138", + "sig" : "3045022000a134b5c6ccbcefd4c882b945baeb4933444172795fa6796aae149067547098022100a991b9efa2db276feae1c115c140770901839d87e60e7ec45a2b81cf3b437be6", + "result" : "valid" + }, + { + "tcId" : 331, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33323631313938363038", + "sig" : "304502202e4721363ad3992c139e5a1c26395d2c2d777824aa24fde075e0d7381171309d0221008bf083b6bbe71ecff22baed087d5a77eaeaf726bf14ace2c03fd6e37ba6c26f2", + "result" : "valid" + }, + { + "tcId" : 332, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "39363738373831303934", + "sig" : "304502206852e9d3cd9fe373c2d504877967d365ab1456707b6817a042864694e1960ccf022100f9b4d815ebd4cf77847b37952334d05b2045cb398d4c21ba207922a7a4714d84", + "result" : "valid" + }, + { + "tcId" : 333, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34393538383233383233", + "sig" : "30440220188a8c5648dc79eace158cf886c62b5468f05fd95f03a7635c5b4c31f09af4c5022036361a0b571a00c6cd5e686ccbfcfa703c4f97e48938346d0c103fdc76dc5867", + "result" : "valid" + }, + { + "tcId" : 334, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "383234363337383337", + "sig" : "3045022100a74f1fb9a8263f62fc4416a5b7d584f4206f3996bb91f6fc8e73b9e92bad0e1302206815032e8c7d76c3ab06a86f33249ce9940148cb36d1f417c2e992e801afa3fa", + "result" : "valid" + }, + { + "tcId" : 335, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3131303230383333373736", + "sig" : "3045022007244865b72ff37e62e3146f0dc14682badd7197799135f0b00ade7671742bfe022100f27f3ddc7124b1b58579573a835650e7a8bad5eeb96e9da215cd7bf9a2a039ed", + "result" : "valid" + }, + { + "tcId" : 336, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "313333383731363438", + "sig" : "3045022100da7fdd05b5badabd619d805c4ee7d9a84f84ddd5cf9c5bf4d4338140d689ef08022028f1cf4fa1c3c5862cfa149c0013cf5fe6cf5076cae000511063e7de25bb38e5", + "result" : "valid" + }, + { + "tcId" : 337, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "333232313434313632", + "sig" : "3046022100d3027c656f6d4fdfd8ede22093e3c303b0133c340d615e7756f6253aea927238022100f6510f9f371b31068d68bfeeaa720eb9bbdc8040145fcf88d4e0b58de0777d2a", + "result" : "valid" + }, + { + "tcId" : 338, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3130363836363535353436", + "sig" : "304402200bf6c0188dc9571cd0e21eecac5fbb19d2434988e9cc10244593ef3a98099f6902204864a562661f9221ec88e3dd0bc2f6e27ac128c30cc1a80f79ec670a22b042ee", + "result" : "valid" + }, + { + "tcId" : 339, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3632313535323436", + "sig" : "3045022100ae459640d5d1179be47a47fa538e16d94ddea5585e7a244804a51742c686443a02206c8e30e530a634fae80b3ceb062978b39edbe19777e0a24553b68886181fd897", + "result" : "valid" + }, + { + "tcId" : 340, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37303330383138373734", + "sig" : "304402201cf3517ba3bf2ab8b9ead4ebb6e866cb88a1deacb6a785d3b63b483ca02ac4950220249a798b73606f55f5f1c70de67cb1a0cff95d7dc50b3a617df861bad3c6b1c9", + "result" : "valid" + }, + { + "tcId" : 341, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35393234353233373434", + "sig" : "3045022100e69b5238265ea35d77e4dd172288d8cea19810a10292617d5976519dc5757cb802204b03c5bc47e826bdb27328abd38d3056d77476b2130f3df6ec4891af08ba1e29", + "result" : "valid" + }, + { + "tcId" : 342, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31343935353836363231", + "sig" : "304402205f9d7d7c870d085fc1d49fff69e4a275812800d2cf8973e7325866cb40fa2b6f02206d1f5491d9f717a597a15fd540406486d76a44697b3f0d9d6dcef6669f8a0a56", + "result" : "valid" + }, + { + "tcId" : 343, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34303035333134343036", + "sig" : "304402200a7d5b1959f71df9f817146ee49bd5c89b431e7993e2fdecab6858957da685ae02200f8aad2d254690bdc13f34a4fec44a02fd745a422df05ccbb54635a8b86b9609", + "result" : "valid" + }, + { + "tcId" : 344, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33303936343537353132", + "sig" : "3044022079e88bf576b74bc07ca142395fda28f03d3d5e640b0b4ff0752c6d94cd553408022032cea05bd2d706c8f6036a507e2ab7766004f0904e2e5c5862749c0073245d6a", + "result" : "valid" + }, + { + "tcId" : 345, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32373834303235363230", + "sig" : "30450221009d54e037a00212b377bc8874798b8da080564bbdf7e07591b861285809d01488022018b4e557667a82bd95965f0706f81a29243fbdd86968a7ebeb43069db3b18c7f", + "result" : "valid" + }, + { + "tcId" : 346, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32363138373837343138", + "sig" : "304402202664f1ffa982fedbcc7cab1b8bc6e2cb420218d2a6077ad08e591ba9feab33bd022049f5c7cb515e83872a3d41b4cdb85f242ad9d61a5bfc01debfbb52c6c84ba728", + "result" : "valid" + }, + { + "tcId" : 347, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31363432363235323632", + "sig" : "304502205827518344844fd6a7de73cbb0a6befdea7b13d2dee4475317f0f18ffc81524b022100b0a334b1f4b774a5a289f553224d286d239ef8a90929ed2d91423e024eb7fa66", + "result" : "valid" + }, + { + "tcId" : 348, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36383234313839343336", + "sig" : "304602210097ab19bd139cac319325869218b1bce111875d63fb12098a04b0cd59b6fdd3a3022100bce26315c5dbc7b8cfc31425a9b89bccea7aa9477d711a4d377f833dcc28f820", + "result" : "valid" + }, + { + "tcId" : 349, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "343834323435343235", + "sig" : "3044022052c683144e44119ae2013749d4964ef67509278f6d38ba869adcfa69970e123d02203479910167408f45bda420a626ec9c4ec711c1274be092198b4187c018b562ca", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0407310f90a9eae149a08402f54194a0f7b4ac427bf8d9bd6c7681071dc47dc36226a6d37ac46d61fd600c0bf1bff87689ed117dda6b0e59318ae010a197a26ca0", + "wx" : "07310f90a9eae149a08402f54194a0f7b4ac427bf8d9bd6c7681071dc47dc362", + "wy" : "26a6d37ac46d61fd600c0bf1bff87689ed117dda6b0e59318ae010a197a26ca0" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000407310f90a9eae149a08402f54194a0f7b4ac427bf8d9bd6c7681071dc47dc36226a6d37ac46d61fd600c0bf1bff87689ed117dda6b0e59318ae010a197a26ca0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEBzEPkKnq4UmghAL1QZSg97SsQnv42b1s\ndoEHHcR9w2ImptN6xG1h/WAMC/G/+HaJ7RF92msOWTGK4BChl6JsoA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 350, + "comment" : "k*G has a large x-coordinate", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30360211014551231950b75fc4402da1722fc9baeb022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e", + "result" : "valid" + }, + { + "tcId" : 351, + "comment" : "r too large", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2c022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04bc97e7585eecad48e16683bc4091708e1a930c683fc47001d4b383594f2c4e22705989cf69daeadd4e4e4b8151ed888dfec20fb01728d89d56b3f38f2ae9c8c5", + "wx" : "00bc97e7585eecad48e16683bc4091708e1a930c683fc47001d4b383594f2c4e22", + "wy" : "705989cf69daeadd4e4e4b8151ed888dfec20fb01728d89d56b3f38f2ae9c8c5" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004bc97e7585eecad48e16683bc4091708e1a930c683fc47001d4b383594f2c4e22705989cf69daeadd4e4e4b8151ed888dfec20fb01728d89d56b3f38f2ae9c8c5", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEvJfnWF7srUjhZoO8QJFwjhqTDGg/xHAB\n1LODWU8sTiJwWYnPadrq3U5OS4FR7YiN/sIPsBco2J1Ws/OPKunIxQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 352, + "comment" : "r,s are large", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0444ad339afbc21e9abf7b602a5ca535ea378135b6d10d81310bdd8293d1df3252b63ff7d0774770f8fe1d1722fa83acd02f434e4fc110a0cc8f6dddd37d56c463", + "wx" : "44ad339afbc21e9abf7b602a5ca535ea378135b6d10d81310bdd8293d1df3252", + "wy" : "00b63ff7d0774770f8fe1d1722fa83acd02f434e4fc110a0cc8f6dddd37d56c463" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000444ad339afbc21e9abf7b602a5ca535ea378135b6d10d81310bdd8293d1df3252b63ff7d0774770f8fe1d1722fa83acd02f434e4fc110a0cc8f6dddd37d56c463", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAERK0zmvvCHpq/e2AqXKU16jeBNbbRDYEx\nC92Ck9HfMlK2P/fQd0dw+P4dFyL6g6zQL0NOT8EQoMyPbd3TfVbEYw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 353, + "comment" : "r and s^-1 have a large Hamming weight", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02203e9a7582886089c62fb840cf3b83061cd1cff3ae4341808bb5bdee6191174177", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "041260c2122c9e244e1af5151bede0c3ae23b54d7c596881d3eebad21f37dd878c5c9a0c1a9ade76737a8811bd6a7f9287c978ee396aa89c11e47229d2ccb552f0", + "wx" : "1260c2122c9e244e1af5151bede0c3ae23b54d7c596881d3eebad21f37dd878c", + "wy" : "5c9a0c1a9ade76737a8811bd6a7f9287c978ee396aa89c11e47229d2ccb552f0" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200041260c2122c9e244e1af5151bede0c3ae23b54d7c596881d3eebad21f37dd878c5c9a0c1a9ade76737a8811bd6a7f9287c978ee396aa89c11e47229d2ccb552f0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEEmDCEiyeJE4a9RUb7eDDriO1TXxZaIHT\n7rrSHzfdh4xcmgwamt52c3qIEb1qf5KHyXjuOWqonBHkcinSzLVS8A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 354, + "comment" : "r and s^-1 have a large Hamming weight", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022024238e70b431b1a64efdf9032669939d4b77f249503fc6905feb7540dea3e6d2", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "041877045be25d34a1d0600f9d5c00d0645a2a54379b6ceefad2e6bf5c2a3352ce821a532cc1751ee1d36d41c3d6ab4e9b143e44ec46d73478ea6a79a5c0e54159", + "wx" : "1877045be25d34a1d0600f9d5c00d0645a2a54379b6ceefad2e6bf5c2a3352ce", + "wy" : "00821a532cc1751ee1d36d41c3d6ab4e9b143e44ec46d73478ea6a79a5c0e54159" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200041877045be25d34a1d0600f9d5c00d0645a2a54379b6ceefad2e6bf5c2a3352ce821a532cc1751ee1d36d41c3d6ab4e9b143e44ec46d73478ea6a79a5c0e54159", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEGHcEW+JdNKHQYA+dXADQZFoqVDebbO76\n0ua/XCozUs6CGlMswXUe4dNtQcPWq06bFD5E7EbXNHjqanmlwOVBWQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 355, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020101020101", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04455439fcc3d2deeceddeaece60e7bd17304f36ebb602adf5a22e0b8f1db46a50aec38fb2baf221e9a8d1887c7bf6222dd1834634e77263315af6d23609d04f77", + "wx" : "455439fcc3d2deeceddeaece60e7bd17304f36ebb602adf5a22e0b8f1db46a50", + "wy" : "00aec38fb2baf221e9a8d1887c7bf6222dd1834634e77263315af6d23609d04f77" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004455439fcc3d2deeceddeaece60e7bd17304f36ebb602adf5a22e0b8f1db46a50aec38fb2baf221e9a8d1887c7bf6222dd1834634e77263315af6d23609d04f77", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAERVQ5/MPS3uzt3q7OYOe9FzBPNuu2Aq31\noi4Ljx20alCuw4+yuvIh6ajRiHx79iIt0YNGNOdyYzFa9tI2CdBPdw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 356, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020101020102", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "042e1f466b024c0c3ace2437de09127fed04b706f94b19a21bb1c2acf35cece7180449ae3523d72534e964972cfd3b38af0bddd9619e5af223e4d1a40f34cf9f1d", + "wx" : "2e1f466b024c0c3ace2437de09127fed04b706f94b19a21bb1c2acf35cece718", + "wy" : "0449ae3523d72534e964972cfd3b38af0bddd9619e5af223e4d1a40f34cf9f1d" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200042e1f466b024c0c3ace2437de09127fed04b706f94b19a21bb1c2acf35cece7180449ae3523d72534e964972cfd3b38af0bddd9619e5af223e4d1a40f34cf9f1d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAELh9GawJMDDrOJDfeCRJ/7QS3BvlLGaIb\nscKs81zs5xgESa41I9clNOlklyz9OzivC93ZYZ5a8iPk0aQPNM+fHQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 357, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020101020103", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "048e7abdbbd18de7452374c1879a1c3b01d13261e7d4571c3b47a1c76c55a2337326ed897cd517a4f5349db809780f6d2f2b9f6299d8b5a89077f1119a718fd7b3", + "wx" : "008e7abdbbd18de7452374c1879a1c3b01d13261e7d4571c3b47a1c76c55a23373", + "wy" : "26ed897cd517a4f5349db809780f6d2f2b9f6299d8b5a89077f1119a718fd7b3" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200048e7abdbbd18de7452374c1879a1c3b01d13261e7d4571c3b47a1c76c55a2337326ed897cd517a4f5349db809780f6d2f2b9f6299d8b5a89077f1119a718fd7b3", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEjnq9u9GN50UjdMGHmhw7AdEyYefUVxw7\nR6HHbFWiM3Mm7Yl81Rek9TSduAl4D20vK59imdi1qJB38RGacY/Xsw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 358, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020102020101", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "047b333d4340d3d718dd3e6aff7de7bbf8b72bfd616c8420056052842376b9af1942117c5afeac755d6f376fc6329a7d76051b87123a4a5d0bc4a539380f03de7b", + "wx" : "7b333d4340d3d718dd3e6aff7de7bbf8b72bfd616c8420056052842376b9af19", + "wy" : "42117c5afeac755d6f376fc6329a7d76051b87123a4a5d0bc4a539380f03de7b" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200047b333d4340d3d718dd3e6aff7de7bbf8b72bfd616c8420056052842376b9af1942117c5afeac755d6f376fc6329a7d76051b87123a4a5d0bc4a539380f03de7b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEezM9Q0DT1xjdPmr/fee7+Lcr/WFshCAF\nYFKEI3a5rxlCEXxa/qx1XW83b8Yymn12BRuHEjpKXQvEpTk4DwPeew==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 359, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020102020102", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04d30ca4a0ddb6616c851d30ced682c40f83c62758a1f2759988d6763a88f1c0e503a80d5415650d41239784e8e2fb1235e9fe991d112ebb81186cbf0da2de3aff", + "wx" : "00d30ca4a0ddb6616c851d30ced682c40f83c62758a1f2759988d6763a88f1c0e5", + "wy" : "03a80d5415650d41239784e8e2fb1235e9fe991d112ebb81186cbf0da2de3aff" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d30ca4a0ddb6616c851d30ced682c40f83c62758a1f2759988d6763a88f1c0e503a80d5415650d41239784e8e2fb1235e9fe991d112ebb81186cbf0da2de3aff", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE0wykoN22YWyFHTDO1oLED4PGJ1ih8nWZ\niNZ2OojxwOUDqA1UFWUNQSOXhOji+xI16f6ZHREuu4EYbL8Not46/w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 360, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020102020103", + "result" : "valid" + }, + { + "tcId" : 361, + "comment" : "r is larger than n", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364143020103", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0448969b39991297b332a652d3ee6e01e909b39904e71fa2354a7830c7750baf24b4012d1b830d199ccb1fc972b32bfded55f09cd62d257e5e844e27e57a1594ec", + "wx" : "48969b39991297b332a652d3ee6e01e909b39904e71fa2354a7830c7750baf24", + "wy" : "00b4012d1b830d199ccb1fc972b32bfded55f09cd62d257e5e844e27e57a1594ec" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000448969b39991297b332a652d3ee6e01e909b39904e71fa2354a7830c7750baf24b4012d1b830d199ccb1fc972b32bfded55f09cd62d257e5e844e27e57a1594ec", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAESJabOZkSl7MyplLT7m4B6QmzmQTnH6I1\nSngwx3ULryS0AS0bgw0ZnMsfyXKzK/3tVfCc1i0lfl6ETiflehWU7A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 362, + "comment" : "s is larger than n", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3026020102022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd04917c8", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0402ef4d6d6cfd5a94f1d7784226e3e2a6c0a436c55839619f38fb4472b5f9ee777eb4acd4eebda5cd72875ffd2a2f26229c2dc6b46500919a432c86739f3ae866", + "wx" : "02ef4d6d6cfd5a94f1d7784226e3e2a6c0a436c55839619f38fb4472b5f9ee77", + "wy" : "7eb4acd4eebda5cd72875ffd2a2f26229c2dc6b46500919a432c86739f3ae866" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000402ef4d6d6cfd5a94f1d7784226e3e2a6c0a436c55839619f38fb4472b5f9ee777eb4acd4eebda5cd72875ffd2a2f26229c2dc6b46500919a432c86739f3ae866", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEAu9NbWz9WpTx13hCJuPipsCkNsVYOWGf\nOPtEcrX57nd+tKzU7r2lzXKHX/0qLyYinC3GtGUAkZpDLIZznzroZg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 363, + "comment" : "small r and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "302702020101022100c58b162c58b162c58b162c58b162c58a1b242973853e16db75c8a1a71da4d39d", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04464f4ff715729cae5072ca3bd801d3195b67aec65e9b01aad20a2943dcbcb584b1afd29d31a39a11d570aa1597439b3b2d1971bf2f1abf15432d0207b10d1d08", + "wx" : "464f4ff715729cae5072ca3bd801d3195b67aec65e9b01aad20a2943dcbcb584", + "wy" : "00b1afd29d31a39a11d570aa1597439b3b2d1971bf2f1abf15432d0207b10d1d08" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004464f4ff715729cae5072ca3bd801d3195b67aec65e9b01aad20a2943dcbcb584b1afd29d31a39a11d570aa1597439b3b2d1971bf2f1abf15432d0207b10d1d08", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAERk9P9xVynK5Qcso72AHTGVtnrsZemwGq\n0gopQ9y8tYSxr9KdMaOaEdVwqhWXQ5s7LRlxvy8avxVDLQIHsQ0dCA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 364, + "comment" : "smallish r and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "302c02072d9b4d347952cc022100fcbc5103d0da267477d1791461cf2aa44bf9d43198f79507bd8779d69a13108e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04157f8fddf373eb5f49cfcf10d8b853cf91cbcd7d665c3522ba7dd738ddb79a4cdeadf1a5c448ea3c9f4191a8999abfcc757ac6d64567ef072c47fec613443b8f", + "wx" : "157f8fddf373eb5f49cfcf10d8b853cf91cbcd7d665c3522ba7dd738ddb79a4c", + "wy" : "00deadf1a5c448ea3c9f4191a8999abfcc757ac6d64567ef072c47fec613443b8f" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004157f8fddf373eb5f49cfcf10d8b853cf91cbcd7d665c3522ba7dd738ddb79a4cdeadf1a5c448ea3c9f4191a8999abfcc757ac6d64567ef072c47fec613443b8f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEFX+P3fNz619Jz88Q2LhTz5HLzX1mXDUi\nun3XON23mkzerfGlxEjqPJ9BkaiZmr/MdXrG1kVn7wcsR/7GE0Q7jw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 365, + "comment" : "100-bit r and small s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3032020d1033e67e37b32b445580bf4efc022100906f906f906f906f906f906f906f906ed8e426f7b1968c35a204236a579723d2", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "040934a537466c07430e2c48feb990bb19fb78cecc9cee424ea4d130291aa237f0d4f92d23b462804b5b68c52558c01c9996dbf727fccabbeedb9621a400535afa", + "wx" : "0934a537466c07430e2c48feb990bb19fb78cecc9cee424ea4d130291aa237f0", + "wy" : "00d4f92d23b462804b5b68c52558c01c9996dbf727fccabbeedb9621a400535afa" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200040934a537466c07430e2c48feb990bb19fb78cecc9cee424ea4d130291aa237f0d4f92d23b462804b5b68c52558c01c9996dbf727fccabbeedb9621a400535afa", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAECTSlN0ZsB0MOLEj+uZC7Gft4zsyc7kJO\npNEwKRqiN/DU+S0jtGKAS1toxSVYwByZltv3J/zKu+7bliGkAFNa+g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 366, + "comment" : "small r and 100 bit s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3026020201010220783266e90f43dafe5cd9b3b0be86de22f9de83677d0f50713a468ec72fcf5d57", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04d6ef20be66c893f741a9bf90d9b74675d1c2a31296397acb3ef174fd0b300c654a0c95478ca00399162d7f0f2dc89efdc2b28a30fbabe285857295a4b0c4e265", + "wx" : "00d6ef20be66c893f741a9bf90d9b74675d1c2a31296397acb3ef174fd0b300c65", + "wy" : "4a0c95478ca00399162d7f0f2dc89efdc2b28a30fbabe285857295a4b0c4e265" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d6ef20be66c893f741a9bf90d9b74675d1c2a31296397acb3ef174fd0b300c654a0c95478ca00399162d7f0f2dc89efdc2b28a30fbabe285857295a4b0c4e265", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE1u8gvmbIk/dBqb+Q2bdGddHCoxKWOXrL\nPvF0/QswDGVKDJVHjKADmRYtfw8tyJ79wrKKMPur4oWFcpWksMTiZQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 367, + "comment" : "100-bit r and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3031020d062522bbd3ecbe7c39e93e7c260220783266e90f43dafe5cd9b3b0be86de22f9de83677d0f50713a468ec72fcf5d57", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04b7291d1404e0c0c07dab9372189f4bd58d2ceaa8d15ede544d9514545ba9ee0629c9a63d5e308769cc30ec276a410e6464a27eeafd9e599db10f053a4fe4a829", + "wx" : "00b7291d1404e0c0c07dab9372189f4bd58d2ceaa8d15ede544d9514545ba9ee06", + "wy" : "29c9a63d5e308769cc30ec276a410e6464a27eeafd9e599db10f053a4fe4a829" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004b7291d1404e0c0c07dab9372189f4bd58d2ceaa8d15ede544d9514545ba9ee0629c9a63d5e308769cc30ec276a410e6464a27eeafd9e599db10f053a4fe4a829", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEtykdFATgwMB9q5NyGJ9L1Y0s6qjRXt5U\nTZUUVFup7gYpyaY9XjCHacww7CdqQQ5kZKJ+6v2eWZ2xDwU6T+SoKQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 368, + "comment" : "r and s^-1 are close to n", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03640c1022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046e28303305d642ccb923b722ea86b2a0bc8e3735ecb26e849b19c9f76b2fdbb8186e80d64d8cab164f5238f5318461bf89d4d96ee6544c816c7566947774e0f6", + "wx" : "6e28303305d642ccb923b722ea86b2a0bc8e3735ecb26e849b19c9f76b2fdbb8", + "wy" : "186e80d64d8cab164f5238f5318461bf89d4d96ee6544c816c7566947774e0f6" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046e28303305d642ccb923b722ea86b2a0bc8e3735ecb26e849b19c9f76b2fdbb8186e80d64d8cab164f5238f5318461bf89d4d96ee6544c816c7566947774e0f6", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEbigwMwXWQsy5I7ci6oayoLyONzXssm6E\nmxnJ92sv27gYboDWTYyrFk9SOPUxhGG/idTZbuZUTIFsdWaUd3Tg9g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 369, + "comment" : "r and s are 64-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30160209009c44febf31c3594d020900839ed28247c2b06b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04375bda93f6af92fb5f8f4b1b5f0534e3bafab34cb7ad9fb9d0b722e4a5c302a9a00b9f387a5a396097aa2162fc5bbcf4a5263372f681c94da51e9799120990fd", + "wx" : "375bda93f6af92fb5f8f4b1b5f0534e3bafab34cb7ad9fb9d0b722e4a5c302a9", + "wy" : "00a00b9f387a5a396097aa2162fc5bbcf4a5263372f681c94da51e9799120990fd" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004375bda93f6af92fb5f8f4b1b5f0534e3bafab34cb7ad9fb9d0b722e4a5c302a9a00b9f387a5a396097aa2162fc5bbcf4a5263372f681c94da51e9799120990fd", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEN1vak/avkvtfj0sbXwU047r6s0y3rZ+5\n0Lci5KXDAqmgC584elo5YJeqIWL8W7z0pSYzcvaByU2lHpeZEgmQ/Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 370, + "comment" : "r and s are 100-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "301e020d09df8b682430beef6f5fd7c7cf020d0fd0a62e13778f4222a0d61c8a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04d75b68216babe03ae257e94b4e3bf1c52f44e3df266d1524ff8c5ea69da73197da4bff9ed1c53f44917a67d7b978598e89df359e3d5913eaea24f3ae259abc44", + "wx" : "00d75b68216babe03ae257e94b4e3bf1c52f44e3df266d1524ff8c5ea69da73197", + "wy" : "00da4bff9ed1c53f44917a67d7b978598e89df359e3d5913eaea24f3ae259abc44" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d75b68216babe03ae257e94b4e3bf1c52f44e3df266d1524ff8c5ea69da73197da4bff9ed1c53f44917a67d7b978598e89df359e3d5913eaea24f3ae259abc44", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE11toIWur4DriV+lLTjvxxS9E498mbRUk\n/4xepp2nMZfaS/+e0cU/RJF6Z9e5eFmOid81nj1ZE+rqJPOuJZq8RA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 371, + "comment" : "r and s are 128-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30260211008a598e563a89f526c32ebec8de26367a02110084f633e2042630e99dd0f1e16f7a04bf", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0478bcda140aed23d430cb23c3dc0d01f423db134ee94a3a8cb483f2deac2ac653118114f6f33045d4e9ed9107085007bfbddf8f58fe7a1a2445d66a990045476e", + "wx" : "78bcda140aed23d430cb23c3dc0d01f423db134ee94a3a8cb483f2deac2ac653", + "wy" : "118114f6f33045d4e9ed9107085007bfbddf8f58fe7a1a2445d66a990045476e" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000478bcda140aed23d430cb23c3dc0d01f423db134ee94a3a8cb483f2deac2ac653118114f6f33045d4e9ed9107085007bfbddf8f58fe7a1a2445d66a990045476e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEeLzaFArtI9QwyyPD3A0B9CPbE07pSjqM\ntIPy3qwqxlMRgRT28zBF1OntkQcIUAe/vd+PWP56GiRF1mqZAEVHbg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 372, + "comment" : "r and s are 160-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "302e021500aa6eeb5823f7fa31b466bb473797f0d0314c0bdf021500e2977c479e6d25703cebbc6bd561938cc9d1bfb9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04bb79f61857f743bfa1b6e7111ce4094377256969e4e15159123d9548acc3be6c1f9d9f8860dcffd3eb36dd6c31ff2e7226c2009c4c94d8d7d2b5686bf7abd677", + "wx" : "00bb79f61857f743bfa1b6e7111ce4094377256969e4e15159123d9548acc3be6c", + "wy" : "1f9d9f8860dcffd3eb36dd6c31ff2e7226c2009c4c94d8d7d2b5686bf7abd677" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004bb79f61857f743bfa1b6e7111ce4094377256969e4e15159123d9548acc3be6c1f9d9f8860dcffd3eb36dd6c31ff2e7226c2009c4c94d8d7d2b5686bf7abd677", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEu3n2GFf3Q7+htucRHOQJQ3claWnk4VFZ\nEj2VSKzDvmwfnZ+IYNz/0+s23Wwx/y5yJsIAnEyU2NfStWhr96vWdw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 373, + "comment" : "s == 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3025022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1020101", + "result" : "valid" + }, + { + "tcId" : 374, + "comment" : "s == 0", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3025022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1020100", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0493591827d9e6713b4e9faea62c72b28dfefa68e0c05160b5d6aae88fd2e36c36073f5545ad5af410af26afff68654cf72d45e493489311203247347a890f4518", + "wx" : "0093591827d9e6713b4e9faea62c72b28dfefa68e0c05160b5d6aae88fd2e36c36", + "wy" : "073f5545ad5af410af26afff68654cf72d45e493489311203247347a890f4518" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000493591827d9e6713b4e9faea62c72b28dfefa68e0c05160b5d6aae88fd2e36c36073f5545ad5af410af26afff68654cf72d45e493489311203247347a890f4518", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEk1kYJ9nmcTtOn66mLHKyjf76aODAUWC1\n1qroj9LjbDYHP1VFrVr0EK8mr/9oZUz3LUXkk0iTESAyRzR6iQ9FGA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 375, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c10220419d981c515af8cc82545aac0c85e9e308fbb2eab6acd7ed497e0b4145a18fd9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0431ed3081aefe001eb6402069ee2ccc1862937b85995144dba9503943587bf0dada01b8cc4df34f5ab3b1a359615208946e5ee35f98ee775b8ccecd86ccc1650f", + "wx" : "31ed3081aefe001eb6402069ee2ccc1862937b85995144dba9503943587bf0da", + "wy" : "00da01b8cc4df34f5ab3b1a359615208946e5ee35f98ee775b8ccecd86ccc1650f" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000431ed3081aefe001eb6402069ee2ccc1862937b85995144dba9503943587bf0dada01b8cc4df34f5ab3b1a359615208946e5ee35f98ee775b8ccecd86ccc1650f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEMe0wga7+AB62QCBp7izMGGKTe4WZUUTb\nqVA5Q1h78NraAbjMTfNPWrOxo1lhUgiUbl7jX5jud1uMzs2GzMFlDw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 376, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102201b21717ad71d23bbac60a9ad0baf75b063c9fdf52a00ebf99d022172910993c9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "047dff66fa98509ff3e2e51045f4390523dccda43a3bc2885e58c248090990eea854c76c2b9adeb6bb571823e07fd7c65c8639cf9d905260064c8e7675ce6d98b4", + "wx" : "7dff66fa98509ff3e2e51045f4390523dccda43a3bc2885e58c248090990eea8", + "wy" : "54c76c2b9adeb6bb571823e07fd7c65c8639cf9d905260064c8e7675ce6d98b4" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200047dff66fa98509ff3e2e51045f4390523dccda43a3bc2885e58c248090990eea854c76c2b9adeb6bb571823e07fd7c65c8639cf9d905260064c8e7675ce6d98b4", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEff9m+phQn/Pi5RBF9DkFI9zNpDo7wohe\nWMJICQmQ7qhUx2wrmt62u1cYI+B/18ZchjnPnZBSYAZMjnZ1zm2YtA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 377, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102202f588f66018f3dd14db3e28e77996487e32486b521ed8e5a20f06591951777e9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "044280509aab64edfc0b4a2967e4cbce849cb544e4a77313c8e6ece579fbd7420a2e89fe5cc1927d554e6a3bb14033ea7c922cd75cba2c7415fdab52f20b1860f1", + "wx" : "4280509aab64edfc0b4a2967e4cbce849cb544e4a77313c8e6ece579fbd7420a", + "wy" : "2e89fe5cc1927d554e6a3bb14033ea7c922cd75cba2c7415fdab52f20b1860f1" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200044280509aab64edfc0b4a2967e4cbce849cb544e4a77313c8e6ece579fbd7420a2e89fe5cc1927d554e6a3bb14033ea7c922cd75cba2c7415fdab52f20b1860f1", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEQoBQmqtk7fwLSiln5MvOhJy1ROSncxPI\n5uzlefvXQgouif5cwZJ9VU5qO7FAM+p8kizXXLosdBX9q1LyCxhg8Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 378, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c10220091a08870ff4daf9123b30c20e8c4fc8505758dcf4074fcaff2170c9bfcf74f4", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "044f8df145194e3c4fc3eea26d43ce75b402d6b17472ddcbb254b8a79b0bf3d9cb2aa20d82844cb266344e71ca78f2ad27a75a09e5bc0fa57e4efd9d465a0888db", + "wx" : "4f8df145194e3c4fc3eea26d43ce75b402d6b17472ddcbb254b8a79b0bf3d9cb", + "wy" : "2aa20d82844cb266344e71ca78f2ad27a75a09e5bc0fa57e4efd9d465a0888db" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200044f8df145194e3c4fc3eea26d43ce75b402d6b17472ddcbb254b8a79b0bf3d9cb2aa20d82844cb266344e71ca78f2ad27a75a09e5bc0fa57e4efd9d465a0888db", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAET43xRRlOPE/D7qJtQ851tALWsXRy3cuy\nVLinmwvz2csqog2ChEyyZjROccp48q0np1oJ5bwPpX5O/Z1GWgiI2w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 379, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102207c370dc0ce8c59a8b273cba44a7c1191fc3186dc03cab96b0567312df0d0b250", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "049598a57dd67ec3e16b587a338aa3a10a3a3913b41a3af32e3ed3ff01358c6b14122819edf8074bbc521f7d4cdce82fef7a516706affba1d93d9dea9ccae1a207", + "wx" : "009598a57dd67ec3e16b587a338aa3a10a3a3913b41a3af32e3ed3ff01358c6b14", + "wy" : "122819edf8074bbc521f7d4cdce82fef7a516706affba1d93d9dea9ccae1a207" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200049598a57dd67ec3e16b587a338aa3a10a3a3913b41a3af32e3ed3ff01358c6b14122819edf8074bbc521f7d4cdce82fef7a516706affba1d93d9dea9ccae1a207", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAElZilfdZ+w+FrWHoziqOhCjo5E7QaOvMu\nPtP/ATWMaxQSKBnt+AdLvFIffUzc6C/velFnBq/7odk9neqcyuGiBw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 380, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1022070b59a7d1ee77a2f9e0491c2a7cfcd0ed04df4a35192f6132dcc668c79a6160e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "049171fec3ca20806bc084f12f0760911b60990bd80e5b2a71ca03a048b20f837e634fd17863761b2958d2be4e149f8d3d7abbdc18be03f451ab6c17fa0a1f8330", + "wx" : "009171fec3ca20806bc084f12f0760911b60990bd80e5b2a71ca03a048b20f837e", + "wy" : "634fd17863761b2958d2be4e149f8d3d7abbdc18be03f451ab6c17fa0a1f8330" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200049171fec3ca20806bc084f12f0760911b60990bd80e5b2a71ca03a048b20f837e634fd17863761b2958d2be4e149f8d3d7abbdc18be03f451ab6c17fa0a1f8330", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEkXH+w8oggGvAhPEvB2CRG2CZC9gOWypx\nygOgSLIPg35jT9F4Y3YbKVjSvk4Un409ervcGL4D9FGrbBf6Ch+DMA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 381, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102202736d76e412246e097148e2bf62915614eb7c428913a58eb5e9cd4674a9423de", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04777c8930b6e1d271100fe68ce93f163fa37612c5fff67f4a62fc3bafaf3d17a9ed73d86f60a51b5ed91353a3b054edc0aa92c9ebcbd0b75d188fdc882791d68d", + "wx" : "777c8930b6e1d271100fe68ce93f163fa37612c5fff67f4a62fc3bafaf3d17a9", + "wy" : "00ed73d86f60a51b5ed91353a3b054edc0aa92c9ebcbd0b75d188fdc882791d68d" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004777c8930b6e1d271100fe68ce93f163fa37612c5fff67f4a62fc3bafaf3d17a9ed73d86f60a51b5ed91353a3b054edc0aa92c9ebcbd0b75d188fdc882791d68d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEd3yJMLbh0nEQD+aM6T8WP6N2EsX/9n9K\nYvw7r689F6ntc9hvYKUbXtkTU6OwVO3AqpLJ68vQt10Yj9yIJ5HWjQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 382, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102204a1e12831fbe93627b02d6e7f24bccdd6ef4b2d0f46739eaf3b1eaf0ca117770", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04eabc248f626e0a63e1eb81c43d461a39a1dba881eb6ee2152b07c32d71bcf4700603caa8b9d33db13af44c6efbec8a198ed6124ac9eb17eaafd2824a545ec000", + "wx" : "00eabc248f626e0a63e1eb81c43d461a39a1dba881eb6ee2152b07c32d71bcf470", + "wy" : "0603caa8b9d33db13af44c6efbec8a198ed6124ac9eb17eaafd2824a545ec000" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004eabc248f626e0a63e1eb81c43d461a39a1dba881eb6ee2152b07c32d71bcf4700603caa8b9d33db13af44c6efbec8a198ed6124ac9eb17eaafd2824a545ec000", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE6rwkj2JuCmPh64HEPUYaOaHbqIHrbuIV\nKwfDLXG89HAGA8qoudM9sTr0TG777IoZjtYSSsnrF+qv0oJKVF7AAA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 383, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1022006c778d4dfff7dee06ed88bc4e0ed34fc553aad67caf796f2a1c6487c1b2e877", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "049f7a13ada158a55f9ddf1a45f044f073d9b80030efdcfc9f9f58418fbceaf001f8ada0175090f80d47227d6713b6740f9a0091d88a837d0a1cd77b58a8f28d73", + "wx" : "009f7a13ada158a55f9ddf1a45f044f073d9b80030efdcfc9f9f58418fbceaf001", + "wy" : "00f8ada0175090f80d47227d6713b6740f9a0091d88a837d0a1cd77b58a8f28d73" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200049f7a13ada158a55f9ddf1a45f044f073d9b80030efdcfc9f9f58418fbceaf001f8ada0175090f80d47227d6713b6740f9a0091d88a837d0a1cd77b58a8f28d73", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEn3oTraFYpV+d3xpF8ETwc9m4ADDv3Pyf\nn1hBj7zq8AH4raAXUJD4DUcifWcTtnQPmgCR2IqDfQoc13tYqPKNcw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 384, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102204de459ef9159afa057feb3ec40fef01c45b809f4ab296ea48c206d4249a2b451", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0411c4f3e461cd019b5c06ea0cea4c4090c3cc3e3c5d9f3c6d65b436826da9b4dbbbeb7a77e4cbfda207097c43423705f72c80476da3dac40a483b0ab0f2ead1cb", + "wx" : "11c4f3e461cd019b5c06ea0cea4c4090c3cc3e3c5d9f3c6d65b436826da9b4db", + "wy" : "00bbeb7a77e4cbfda207097c43423705f72c80476da3dac40a483b0ab0f2ead1cb" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000411c4f3e461cd019b5c06ea0cea4c4090c3cc3e3c5d9f3c6d65b436826da9b4dbbbeb7a77e4cbfda207097c43423705f72c80476da3dac40a483b0ab0f2ead1cb", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEEcTz5GHNAZtcBuoM6kxAkMPMPjxdnzxt\nZbQ2gm2ptNu763p35Mv9ogcJfENCNwX3LIBHbaPaxApIOwqw8urRyw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 385, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c10220745d294978007302033502e1acc48b63ae6500be43adbea1b258d6b423dbb416", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04e2e18682d53123aa01a6c5d00b0c623d671b462ea80bddd65227fd5105988aa4161907b3fd25044a949ea41c8e2ea8459dc6f1654856b8b61b31543bb1b45bdb", + "wx" : "00e2e18682d53123aa01a6c5d00b0c623d671b462ea80bddd65227fd5105988aa4", + "wy" : "161907b3fd25044a949ea41c8e2ea8459dc6f1654856b8b61b31543bb1b45bdb" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004e2e18682d53123aa01a6c5d00b0c623d671b462ea80bddd65227fd5105988aa4161907b3fd25044a949ea41c8e2ea8459dc6f1654856b8b61b31543bb1b45bdb", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE4uGGgtUxI6oBpsXQCwxiPWcbRi6oC93W\nUif9UQWYiqQWGQez/SUESpSepByOLqhFncbxZUhWuLYbMVQ7sbRb2w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 386, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102207b2a785e3896f59b2d69da57648e80ad3c133a750a2847fd2098ccd902042b6c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0490f8d4ca73de08a6564aaf005247b6f0ffe978504dce52605f46b7c3e56197dafadbe528eb70d9ee7ea0e70702db54f721514c7b8604ac2cb214f1decb7e383d", + "wx" : "0090f8d4ca73de08a6564aaf005247b6f0ffe978504dce52605f46b7c3e56197da", + "wy" : "00fadbe528eb70d9ee7ea0e70702db54f721514c7b8604ac2cb214f1decb7e383d" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000490f8d4ca73de08a6564aaf005247b6f0ffe978504dce52605f46b7c3e56197dafadbe528eb70d9ee7ea0e70702db54f721514c7b8604ac2cb214f1decb7e383d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEkPjUynPeCKZWSq8AUke28P/peFBNzlJg\nX0a3w+Vhl9r62+Uo63DZ7n6g5wcC21T3IVFMe4YErCyyFPHey344PQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 387, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1022071ae94a72ca896875e7aa4a4c3d29afdb4b35b6996273e63c47ac519256c5eb1", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04824c195c73cffdf038d101bce1687b5c3b6146f395c885976f7753b2376b948e3cdefa6fc347d13e4dcbc63a0b03a165180cd2be1431a0cf74ce1ea25082d2bc", + "wx" : "00824c195c73cffdf038d101bce1687b5c3b6146f395c885976f7753b2376b948e", + "wy" : "3cdefa6fc347d13e4dcbc63a0b03a165180cd2be1431a0cf74ce1ea25082d2bc" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004824c195c73cffdf038d101bce1687b5c3b6146f395c885976f7753b2376b948e3cdefa6fc347d13e4dcbc63a0b03a165180cd2be1431a0cf74ce1ea25082d2bc", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEgkwZXHPP/fA40QG84Wh7XDthRvOVyIWX\nb3dTsjdrlI483vpvw0fRPk3LxjoLA6FlGAzSvhQxoM90zh6iUILSvA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 388, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102200fa527fa7343c0bc9ec35a6278bfbff4d83301b154fc4bd14aee7eb93445b5f9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "042788a52f078eb3f202c4fa73e0d3386faf3df6be856003636f599922d4f5268f30b4f207c919bbdf5e67a8be4265a8174754b3aba8f16e575b77ff4d5a7eb64f", + "wx" : "2788a52f078eb3f202c4fa73e0d3386faf3df6be856003636f599922d4f5268f", + "wy" : "30b4f207c919bbdf5e67a8be4265a8174754b3aba8f16e575b77ff4d5a7eb64f" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200042788a52f078eb3f202c4fa73e0d3386faf3df6be856003636f599922d4f5268f30b4f207c919bbdf5e67a8be4265a8174754b3aba8f16e575b77ff4d5a7eb64f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEJ4ilLweOs/ICxPpz4NM4b6899r6FYANj\nb1mZItT1Jo8wtPIHyRm7315nqL5CZagXR1Szq6jxbldbd/9NWn62Tw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 389, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102206539c0adadd0525ff42622164ce9314348bd0863b4c80e936b23ca0414264671", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04d533b789a4af890fa7a82a1fae58c404f9a62a50b49adafab349c513b415087401b4171b803e76b34a9861e10f7bc289a066fd01bd29f84c987a10a5fb18c2d4", + "wx" : "00d533b789a4af890fa7a82a1fae58c404f9a62a50b49adafab349c513b4150874", + "wy" : "01b4171b803e76b34a9861e10f7bc289a066fd01bd29f84c987a10a5fb18c2d4" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d533b789a4af890fa7a82a1fae58c404f9a62a50b49adafab349c513b415087401b4171b803e76b34a9861e10f7bc289a066fd01bd29f84c987a10a5fb18c2d4", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE1TO3iaSviQ+nqCofrljEBPmmKlC0mtr6\ns0nFE7QVCHQBtBcbgD52s0qYYeEPe8KJoGb9Ab0p+EyYehCl+xjC1A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 390, + "comment" : "point at infinity during verify", + "flags" : [ + "PointDuplication", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "043a3150798c8af69d1e6e981f3a45402ba1d732f4be8330c5164f49e10ec555b4221bd842bc5e4d97eff37165f60e3998a424d72a450cf95ea477c78287d0343a", + "wx" : "3a3150798c8af69d1e6e981f3a45402ba1d732f4be8330c5164f49e10ec555b4", + "wy" : "221bd842bc5e4d97eff37165f60e3998a424d72a450cf95ea477c78287d0343a" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200043a3150798c8af69d1e6e981f3a45402ba1d732f4be8330c5164f49e10ec555b4221bd842bc5e4d97eff37165f60e3998a424d72a450cf95ea477c78287d0343a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEOjFQeYyK9p0ebpgfOkVAK6HXMvS+gzDF\nFk9J4Q7FVbQiG9hCvF5Nl+/zcWX2DjmYpCTXKkUM+V6kd8eCh9A0Og==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 391, + "comment" : "edge case for signature malleability", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a002207fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "043b37df5fb347c69a0f17d85c0c7ca83736883a825e13143d0fcfc8101e851e800de3c090b6ca21ba543517330c04b12f948c6badf14a63abffdf4ef8c7537026", + "wx" : "3b37df5fb347c69a0f17d85c0c7ca83736883a825e13143d0fcfc8101e851e80", + "wy" : "0de3c090b6ca21ba543517330c04b12f948c6badf14a63abffdf4ef8c7537026" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200043b37df5fb347c69a0f17d85c0c7ca83736883a825e13143d0fcfc8101e851e800de3c090b6ca21ba543517330c04b12f948c6badf14a63abffdf4ef8c7537026", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEOzffX7NHxpoPF9hcDHyoNzaIOoJeExQ9\nD8/IEB6FHoAN48CQtsohulQ1FzMMBLEvlIxrrfFKY6v/3074x1NwJg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 392, + "comment" : "edge case for signature malleability", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a002207fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04feb5163b0ece30ff3e03c7d55c4380fa2fa81ee2c0354942ff6f08c99d0cd82ce87de05ee1bda089d3e4e248fa0f721102acfffdf50e654be281433999df897e", + "wx" : "00feb5163b0ece30ff3e03c7d55c4380fa2fa81ee2c0354942ff6f08c99d0cd82c", + "wy" : "00e87de05ee1bda089d3e4e248fa0f721102acfffdf50e654be281433999df897e" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004feb5163b0ece30ff3e03c7d55c4380fa2fa81ee2c0354942ff6f08c99d0cd82ce87de05ee1bda089d3e4e248fa0f721102acfffdf50e654be281433999df897e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE/rUWOw7OMP8+A8fVXEOA+i+oHuLANUlC\n/28IyZ0M2CzofeBe4b2gidPk4kj6D3IRAqz//fUOZUvigUM5md+Jfg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 393, + "comment" : "u1 == 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04238ced001cf22b8853e02edc89cbeca5050ba7e042a7a77f9382cd414922897640683d3094643840f295890aa4c18aa39b41d77dd0fb3bb2700e4f9ec284ffc2", + "wx" : "238ced001cf22b8853e02edc89cbeca5050ba7e042a7a77f9382cd4149228976", + "wy" : "40683d3094643840f295890aa4c18aa39b41d77dd0fb3bb2700e4f9ec284ffc2" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004238ced001cf22b8853e02edc89cbeca5050ba7e042a7a77f9382cd414922897640683d3094643840f295890aa4c18aa39b41d77dd0fb3bb2700e4f9ec284ffc2", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEI4ztABzyK4hT4C7cicvspQULp+BCp6d/\nk4LNQUkiiXZAaD0wlGQ4QPKViQqkwYqjm0HXfdD7O7JwDk+ewoT/wg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 394, + "comment" : "u1 == n - 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022044a5ad0bd0636d9e12bc9e0a6bdd5e1bba77f523842193b3b82e448e05d5f11e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04961cf64817c06c0e51b3c2736c922fde18bd8c4906fcd7f5ef66c4678508f35ed2c5d18168cfbe70f2f123bd7419232bb92dd69113e2941061889481c5a027bf", + "wx" : "00961cf64817c06c0e51b3c2736c922fde18bd8c4906fcd7f5ef66c4678508f35e", + "wy" : "00d2c5d18168cfbe70f2f123bd7419232bb92dd69113e2941061889481c5a027bf" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004961cf64817c06c0e51b3c2736c922fde18bd8c4906fcd7f5ef66c4678508f35ed2c5d18168cfbe70f2f123bd7419232bb92dd69113e2941061889481c5a027bf", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAElhz2SBfAbA5Rs8JzbJIv3hi9jEkG/Nf1\n72bEZ4UI817SxdGBaM++cPLxI710GSMruS3WkRPilBBhiJSBxaAnvw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 395, + "comment" : "u2 == 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0413681eae168cd4ea7cf2e2a45d052742d10a9f64e796867dbdcb829fe0b1028816528760d177376c09df79de39557c329cc1753517acffe8fa2ec298026b8384", + "wx" : "13681eae168cd4ea7cf2e2a45d052742d10a9f64e796867dbdcb829fe0b10288", + "wy" : "16528760d177376c09df79de39557c329cc1753517acffe8fa2ec298026b8384" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000413681eae168cd4ea7cf2e2a45d052742d10a9f64e796867dbdcb829fe0b1028816528760d177376c09df79de39557c329cc1753517acffe8fa2ec298026b8384", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEE2gerhaM1Op88uKkXQUnQtEKn2TnloZ9\nvcuCn+CxAogWUodg0Xc3bAnfed45VXwynMF1NRes/+j6LsKYAmuDhA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 396, + "comment" : "u2 == n - 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022100aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b89", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "045aa7abfdb6b4086d543325e5d79c6e95ce42f866d2bb84909633a04bb1aa31c291c80088794905e1da33336d874e2f91ccf45cc59185bede5dd6f3f7acaae18b", + "wx" : "5aa7abfdb6b4086d543325e5d79c6e95ce42f866d2bb84909633a04bb1aa31c2", + "wy" : "0091c80088794905e1da33336d874e2f91ccf45cc59185bede5dd6f3f7acaae18b" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200045aa7abfdb6b4086d543325e5d79c6e95ce42f866d2bb84909633a04bb1aa31c291c80088794905e1da33336d874e2f91ccf45cc59185bede5dd6f3f7acaae18b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEWqer/ba0CG1UMyXl15xulc5C+GbSu4SQ\nljOgS7GqMcKRyACIeUkF4dozM22HTi+RzPRcxZGFvt5d1vP3rKrhiw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 397, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100e91e1ba6ba898620a46bcb51dc0b8b4ad1dc35dad892c4552d1847b2ce444637", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0400277791b305a45b2b39590b2f05d3392a6c8182cef4eb540120e0f5c206c3e464108233fb0b8c3ac892d79ef8e0fbf92ed133addb4554270132584dc52eef41", + "wx" : "277791b305a45b2b39590b2f05d3392a6c8182cef4eb540120e0f5c206c3e4", + "wy" : "64108233fb0b8c3ac892d79ef8e0fbf92ed133addb4554270132584dc52eef41" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000400277791b305a45b2b39590b2f05d3392a6c8182cef4eb540120e0f5c206c3e464108233fb0b8c3ac892d79ef8e0fbf92ed133addb4554270132584dc52eef41", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEACd3kbMFpFsrOVkLLwXTOSpsgYLO9OtU\nASDg9cIGw+RkEIIz+wuMOsiS15744Pv5LtEzrdtFVCcBMlhNxS7vQQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 398, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100e36bf0cec06d9b841da81332812f74f30bbaec9f202319206c6f0b8a0a400ff7", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046efa092b68de9460f0bcc919005a5f6e80e19de98968be3cd2c770a9949bfb1ac75e6e5087d6550d5f9beb1e79e5029307bc255235e2d5dc99241ac3ab886c49", + "wx" : "6efa092b68de9460f0bcc919005a5f6e80e19de98968be3cd2c770a9949bfb1a", + "wy" : "00c75e6e5087d6550d5f9beb1e79e5029307bc255235e2d5dc99241ac3ab886c49" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046efa092b68de9460f0bcc919005a5f6e80e19de98968be3cd2c770a9949bfb1ac75e6e5087d6550d5f9beb1e79e5029307bc255235e2d5dc99241ac3ab886c49", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEbvoJK2jelGDwvMkZAFpfboDhnemJaL48\n0sdwqZSb+xrHXm5Qh9ZVDV+b6x555QKTB7wlUjXi1dyZJBrDq4hsSQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 399, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100ea26b57af884b6c06e348efe139c1e4e9ec9518d60c340f6bac7d278ca08d8a6", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0472d4a19c4f9d2cf5848ea40445b70d4696b5f02d632c0c654cc7d7eeb0c6d058e8c4cd9943e459174c7ac01fa742198e47e6c19a6bdb0c4f6c237831c1b3f942", + "wx" : "72d4a19c4f9d2cf5848ea40445b70d4696b5f02d632c0c654cc7d7eeb0c6d058", + "wy" : "00e8c4cd9943e459174c7ac01fa742198e47e6c19a6bdb0c4f6c237831c1b3f942" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000472d4a19c4f9d2cf5848ea40445b70d4696b5f02d632c0c654cc7d7eeb0c6d058e8c4cd9943e459174c7ac01fa742198e47e6c19a6bdb0c4f6c237831c1b3f942", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEctShnE+dLPWEjqQERbcNRpa18C1jLAxl\nTMfX7rDG0FjoxM2ZQ+RZF0x6wB+nQhmOR+bBmmvbDE9sI3gxwbP5Qg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 400, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02205b1d27a7694c146244a5ad0bd0636d9d9ef3b9fb58385418d9c982105077d1b7", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "042a8ea2f50dcced0c217575bdfa7cd47d1c6f100041ec0e35512794c1be7e740258f8c17122ed303fda7143eb58bede70295b653266013b0b0ebd3f053137f6ec", + "wx" : "2a8ea2f50dcced0c217575bdfa7cd47d1c6f100041ec0e35512794c1be7e7402", + "wy" : "58f8c17122ed303fda7143eb58bede70295b653266013b0b0ebd3f053137f6ec" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200042a8ea2f50dcced0c217575bdfa7cd47d1c6f100041ec0e35512794c1be7e740258f8c17122ed303fda7143eb58bede70295b653266013b0b0ebd3f053137f6ec", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEKo6i9Q3M7QwhdXW9+nzUfRxvEABB7A41\nUSeUwb5+dAJY+MFxIu0wP9pxQ+tYvt5wKVtlMmYBOwsOvT8FMTf27A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 401, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100d27a7694c146244a5ad0bd0636d9e12abe687897e8e9998ddbd4e59a78520d0f", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0488de689ce9af1e94be6a2089c8a8b1253ffdbb6c8e9c86249ba220001a4ad3b80c4998e54842f413b9edb1825acbb6335e81e4d184b2b01c8bebdc85d1f28946", + "wx" : "0088de689ce9af1e94be6a2089c8a8b1253ffdbb6c8e9c86249ba220001a4ad3b8", + "wy" : "0c4998e54842f413b9edb1825acbb6335e81e4d184b2b01c8bebdc85d1f28946" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000488de689ce9af1e94be6a2089c8a8b1253ffdbb6c8e9c86249ba220001a4ad3b80c4998e54842f413b9edb1825acbb6335e81e4d184b2b01c8bebdc85d1f28946", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEiN5onOmvHpS+aiCJyKixJT/9u2yOnIYk\nm6IgABpK07gMSZjlSEL0E7ntsYJay7YzXoHk0YSysByL69yF0fKJRg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 402, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100a4f4ed29828c4894b5a17a0c6db3c256c2221449228a92dff7d76ca8206dd8dd", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04fea2d31f70f90d5fb3e00e186ac42ab3c1615cee714e0b4e1131b3d4d8225bf7b037a18df2ac15343f30f74067ddf29e817d5f77f8dce05714da59c094f0cda9", + "wx" : "00fea2d31f70f90d5fb3e00e186ac42ab3c1615cee714e0b4e1131b3d4d8225bf7", + "wy" : "00b037a18df2ac15343f30f74067ddf29e817d5f77f8dce05714da59c094f0cda9" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004fea2d31f70f90d5fb3e00e186ac42ab3c1615cee714e0b4e1131b3d4d8225bf7b037a18df2ac15343f30f74067ddf29e817d5f77f8dce05714da59c094f0cda9", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE/qLTH3D5DV+z4A4YasQqs8FhXO5xTgtO\nETGz1NgiW/ewN6GN8qwVND8w90Bn3fKegX1fd/jc4FcU2lnAlPDNqQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 403, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0220694c146244a5ad0bd0636d9e12bc9e09e60e68b90d0b5e6c5dddd0cb694d8799", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "047258911e3d423349166479dbe0b8341af7fbd03d0a7e10edccb36b6ceea5a3db17ac2b8992791128fa3b96dc2fbd4ca3bfa782ef2832fc6656943db18e7346b0", + "wx" : "7258911e3d423349166479dbe0b8341af7fbd03d0a7e10edccb36b6ceea5a3db", + "wy" : "17ac2b8992791128fa3b96dc2fbd4ca3bfa782ef2832fc6656943db18e7346b0" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200047258911e3d423349166479dbe0b8341af7fbd03d0a7e10edccb36b6ceea5a3db17ac2b8992791128fa3b96dc2fbd4ca3bfa782ef2832fc6656943db18e7346b0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEcliRHj1CM0kWZHnb4Lg0Gvf70D0KfhDt\nzLNrbO6lo9sXrCuJknkRKPo7ltwvvUyjv6eC7ygy/GZWlD2xjnNGsA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 404, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02203d7f487c07bfc5f30846938a3dcef696444707cf9677254a92b06c63ab867d22", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "044f28461dea64474d6bb34d1499c97d37b9e95633df1ceeeaacd45016c98b3914c8818810b8cc06ddb40e8a1261c528faa589455d5a6df93b77bc5e0e493c7470", + "wx" : "4f28461dea64474d6bb34d1499c97d37b9e95633df1ceeeaacd45016c98b3914", + "wy" : "00c8818810b8cc06ddb40e8a1261c528faa589455d5a6df93b77bc5e0e493c7470" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200044f28461dea64474d6bb34d1499c97d37b9e95633df1ceeeaacd45016c98b3914c8818810b8cc06ddb40e8a1261c528faa589455d5a6df93b77bc5e0e493c7470", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAETyhGHepkR01rs00Umcl9N7npVjPfHO7q\nrNRQFsmLORTIgYgQuMwG3bQOihJhxSj6pYlFXVpt+Tt3vF4OSTx0cA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 405, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02206c7648fc0fbf8a06adb8b839f97b4ff7a800f11b1e37c593b261394599792ba4", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0474f2a814fb5d8eca91a69b5e60712732b3937de32829be974ed7b68c5c2f5d66eff0f07c56f987a657f42196205f588c0f1d96fd8a63a5f238b48f478788fe3b", + "wx" : "74f2a814fb5d8eca91a69b5e60712732b3937de32829be974ed7b68c5c2f5d66", + "wy" : "00eff0f07c56f987a657f42196205f588c0f1d96fd8a63a5f238b48f478788fe3b" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000474f2a814fb5d8eca91a69b5e60712732b3937de32829be974ed7b68c5c2f5d66eff0f07c56f987a657f42196205f588c0f1d96fd8a63a5f238b48f478788fe3b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEdPKoFPtdjsqRppteYHEnMrOTfeMoKb6X\nTte2jFwvXWbv8PB8VvmHplf0IZYgX1iMDx2W/YpjpfI4tI9Hh4j+Ow==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 406, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0221009be363a286f23f6322c205449d320baad417953ecb70f6214e90d49d7d1f26a8", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04195b51a7cc4a21b8274a70a90de779814c3c8ca358328208c09a29f336b82d6ab2416b7c92fffdc29c3b1282dd2a77a4d04df7f7452047393d849989c5cee9ad", + "wx" : "195b51a7cc4a21b8274a70a90de779814c3c8ca358328208c09a29f336b82d6a", + "wy" : "00b2416b7c92fffdc29c3b1282dd2a77a4d04df7f7452047393d849989c5cee9ad" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004195b51a7cc4a21b8274a70a90de779814c3c8ca358328208c09a29f336b82d6ab2416b7c92fffdc29c3b1282dd2a77a4d04df7f7452047393d849989c5cee9ad", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEGVtRp8xKIbgnSnCpDed5gUw8jKNYMoII\nwJop8za4LWqyQWt8kv/9wpw7EoLdKnek0E3390UgRzk9hJmJxc7prQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 407, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022029798c5c45bdf58b4a7b2fdc2c46ab4af1218c7eeb9f0f27a88f1267674de3b0", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04622fc74732034bec2ddf3bc16d34b3d1f7a327dd2a8c19bab4bb4fe3a24b58aa736b2f2fae76f4dfaecc9096333b01328d51eb3fda9c9227e90d0b449983c4f0", + "wx" : "622fc74732034bec2ddf3bc16d34b3d1f7a327dd2a8c19bab4bb4fe3a24b58aa", + "wy" : "736b2f2fae76f4dfaecc9096333b01328d51eb3fda9c9227e90d0b449983c4f0" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004622fc74732034bec2ddf3bc16d34b3d1f7a327dd2a8c19bab4bb4fe3a24b58aa736b2f2fae76f4dfaecc9096333b01328d51eb3fda9c9227e90d0b449983c4f0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEYi/HRzIDS+wt3zvBbTSz0fejJ90qjBm6\ntLtP46JLWKpzay8vrnb0367MkJYzOwEyjVHrP9qckifpDQtEmYPE8A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 408, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02200b70f22ca2bb3cefadca1a5711fa3a59f4695385eb5aedf3495d0b6d00f8fd85", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "041f7f85caf2d7550e7af9b65023ebb4dce3450311692309db269969b834b611c70827f45b78020ecbbaf484fdd5bfaae6870f1184c21581baf6ef82bd7b530f93", + "wx" : "1f7f85caf2d7550e7af9b65023ebb4dce3450311692309db269969b834b611c7", + "wy" : "0827f45b78020ecbbaf484fdd5bfaae6870f1184c21581baf6ef82bd7b530f93" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200041f7f85caf2d7550e7af9b65023ebb4dce3450311692309db269969b834b611c70827f45b78020ecbbaf484fdd5bfaae6870f1184c21581baf6ef82bd7b530f93", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEH3+FyvLXVQ56+bZQI+u03ONFAxFpIwnb\nJplpuDS2EccIJ/RbeAIOy7r0hP3Vv6rmhw8RhMIVgbr274K9e1MPkw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 409, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022016e1e459457679df5b9434ae23f474b3e8d2a70bd6b5dbe692ba16da01f1fb0a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0449c197dc80ad1da47a4342b93893e8e1fb0bb94fc33a83e783c00b24c781377aefc20da92bac762951f72474becc734d4cc22ba81b895e282fdac4df7af0f37d", + "wx" : "49c197dc80ad1da47a4342b93893e8e1fb0bb94fc33a83e783c00b24c781377a", + "wy" : "00efc20da92bac762951f72474becc734d4cc22ba81b895e282fdac4df7af0f37d" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000449c197dc80ad1da47a4342b93893e8e1fb0bb94fc33a83e783c00b24c781377aefc20da92bac762951f72474becc734d4cc22ba81b895e282fdac4df7af0f37d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEScGX3ICtHaR6Q0K5OJPo4fsLuU/DOoPn\ng8ALJMeBN3rvwg2pK6x2KVH3JHS+zHNNTMIrqBuJXigv2sTfevDzfQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 410, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202252d685e831b6cf095e4f0535eeaf0ddd3bfa91c210c9d9dc17224702eaf88f", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04d8cb68517b616a56400aa3868635e54b6f699598a2f6167757654980baf6acbe7ec8cf449c849aa03461a30efada41453c57c6e6fbc93bbc6fa49ada6dc0555c", + "wx" : "00d8cb68517b616a56400aa3868635e54b6f699598a2f6167757654980baf6acbe", + "wy" : "7ec8cf449c849aa03461a30efada41453c57c6e6fbc93bbc6fa49ada6dc0555c" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d8cb68517b616a56400aa3868635e54b6f699598a2f6167757654980baf6acbe7ec8cf449c849aa03461a30efada41453c57c6e6fbc93bbc6fa49ada6dc0555c", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE2MtoUXthalZACqOGhjXlS29plZii9hZ3\nV2VJgLr2rL5+yM9EnISaoDRhow762kFFPFfG5vvJO7xvpJrabcBVXA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 411, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022075135abd7c425b60371a477f09ce0f274f64a8c6b061a07b5d63e93c65046c53", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04030713fb63f2aa6fe2cadf1b20efc259c77445dafa87dac398b84065ca347df3b227818de1a39b589cb071d83e5317cccdc2338e51e312fe31d8dc34a4801750", + "wx" : "030713fb63f2aa6fe2cadf1b20efc259c77445dafa87dac398b84065ca347df3", + "wy" : "00b227818de1a39b589cb071d83e5317cccdc2338e51e312fe31d8dc34a4801750" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004030713fb63f2aa6fe2cadf1b20efc259c77445dafa87dac398b84065ca347df3b227818de1a39b589cb071d83e5317cccdc2338e51e312fe31d8dc34a4801750", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEAwcT+2Pyqm/iyt8bIO/CWcd0Rdr6h9rD\nmLhAZco0ffOyJ4GN4aObWJywcdg+UxfMzcIzjlHjEv4x2Nw0pIAXUA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 412, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100d55555555555555555555555555555547c74934474db157d2a8c3f088aced62a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04babb3677b0955802d8e929a41355640eaf1ea1353f8a771331c4946e3480afa7252f196c87ed3d2a59d3b1b559137fed0013fecefc19fb5a92682b9bca51b950", + "wx" : "00babb3677b0955802d8e929a41355640eaf1ea1353f8a771331c4946e3480afa7", + "wy" : "252f196c87ed3d2a59d3b1b559137fed0013fecefc19fb5a92682b9bca51b950" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004babb3677b0955802d8e929a41355640eaf1ea1353f8a771331c4946e3480afa7252f196c87ed3d2a59d3b1b559137fed0013fecefc19fb5a92682b9bca51b950", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEurs2d7CVWALY6SmkE1VkDq8eoTU/incT\nMcSUbjSAr6clLxlsh+09KlnTsbVZE3/tABP+zvwZ+1qSaCubylG5UA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 413, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100c1777c8853938e536213c02464a936000ba1e21c0fc62075d46c624e23b52f31", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "041aab2018793471111a8a0e9b143fde02fc95920796d3a63de329b424396fba60bbe4130705174792441b318d3aa31dfe8577821e9b446ec573d272e036c4ebe9", + "wx" : "1aab2018793471111a8a0e9b143fde02fc95920796d3a63de329b424396fba60", + "wy" : "00bbe4130705174792441b318d3aa31dfe8577821e9b446ec573d272e036c4ebe9" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200041aab2018793471111a8a0e9b143fde02fc95920796d3a63de329b424396fba60bbe4130705174792441b318d3aa31dfe8577821e9b446ec573d272e036c4ebe9", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEGqsgGHk0cREaig6bFD/eAvyVkgeW06Y9\n4ym0JDlvumC75BMHBRdHkkQbMY06ox3+hXeCHptEbsVz0nLgNsTr6Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 414, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022030bbb794db588363b40679f6c182a50d3ce9679acdd3ffbe36d7813dacbdc818", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "048cb0b909499c83ea806cd885b1dd467a0119f06a88a0276eb0cfda274535a8ff47b5428833bc3f2c8bf9d9041158cf33718a69961cd01729bc0011d1e586ab75", + "wx" : "008cb0b909499c83ea806cd885b1dd467a0119f06a88a0276eb0cfda274535a8ff", + "wy" : "47b5428833bc3f2c8bf9d9041158cf33718a69961cd01729bc0011d1e586ab75" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200048cb0b909499c83ea806cd885b1dd467a0119f06a88a0276eb0cfda274535a8ff47b5428833bc3f2c8bf9d9041158cf33718a69961cd01729bc0011d1e586ab75", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEjLC5CUmcg+qAbNiFsd1GegEZ8GqIoCdu\nsM/aJ0U1qP9HtUKIM7w/LIv52QQRWM8zcYpplhzQFym8ABHR5YardQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 415, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202c37fd995622c4fb7fffffffffffffffc7cee745110cb45ab558ed7c90c15a2f", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "048f03cf1a42272bb1532723093f72e6feeac85e1700e9fbe9a6a2dd642d74bf5d3b89a7189dad8cf75fc22f6f158aa27f9c2ca00daca785be3358f2bda3862ca0", + "wx" : "008f03cf1a42272bb1532723093f72e6feeac85e1700e9fbe9a6a2dd642d74bf5d", + "wy" : "3b89a7189dad8cf75fc22f6f158aa27f9c2ca00daca785be3358f2bda3862ca0" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200048f03cf1a42272bb1532723093f72e6feeac85e1700e9fbe9a6a2dd642d74bf5d3b89a7189dad8cf75fc22f6f158aa27f9c2ca00daca785be3358f2bda3862ca0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEjwPPGkInK7FTJyMJP3Lm/urIXhcA6fvp\npqLdZC10v107iacYna2M91/CL28ViqJ/nCygDaynhb4zWPK9o4YsoA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 416, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02207fd995622c4fb7ffffffffffffffffff5d883ffab5b32652ccdcaa290fccb97d", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0444de3b9c7a57a8c9e820952753421e7d987bb3d79f71f013805c897e018f8acea2460758c8f98d3fdce121a943659e372c326fff2e5fc2ae7fa3f79daae13c12", + "wx" : "44de3b9c7a57a8c9e820952753421e7d987bb3d79f71f013805c897e018f8ace", + "wy" : "00a2460758c8f98d3fdce121a943659e372c326fff2e5fc2ae7fa3f79daae13c12" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000444de3b9c7a57a8c9e820952753421e7d987bb3d79f71f013805c897e018f8acea2460758c8f98d3fdce121a943659e372c326fff2e5fc2ae7fa3f79daae13c12", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAERN47nHpXqMnoIJUnU0IefZh7s9efcfAT\ngFyJfgGPis6iRgdYyPmNP9zhIalDZZ43LDJv/y5fwq5/o/edquE8Eg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 417, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100ffb32ac4589f6ffffffffffffffffffebb107ff56b664ca599b954521f9972fa", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046fb8b2b48e33031268ad6a517484dc8839ea90f6669ea0c7ac3233e2ac31394a0ac8bbe7f73c2ff4df9978727ac1dfc2fd58647d20f31f99105316b64671f204", + "wx" : "6fb8b2b48e33031268ad6a517484dc8839ea90f6669ea0c7ac3233e2ac31394a", + "wy" : "0ac8bbe7f73c2ff4df9978727ac1dfc2fd58647d20f31f99105316b64671f204" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046fb8b2b48e33031268ad6a517484dc8839ea90f6669ea0c7ac3233e2ac31394a0ac8bbe7f73c2ff4df9978727ac1dfc2fd58647d20f31f99105316b64671f204", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEb7iytI4zAxJorWpRdITciDnqkPZmnqDH\nrDIz4qwxOUoKyLvn9zwv9N+ZeHJ6wd/C/VhkfSDzH5kQUxa2RnHyBA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 418, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02205622c4fb7fffffffffffffffffffffff928a8f1c7ac7bec1808b9f61c01ec327", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04bea71122a048693e905ff602b3cf9dd18af69b9fc9d8431d2b1dd26b942c95e6f43c7b8b95eb62082c12db9dbda7fe38e45cbe4a4886907fb81bdb0c5ea9246c", + "wx" : "00bea71122a048693e905ff602b3cf9dd18af69b9fc9d8431d2b1dd26b942c95e6", + "wy" : "00f43c7b8b95eb62082c12db9dbda7fe38e45cbe4a4886907fb81bdb0c5ea9246c" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004bea71122a048693e905ff602b3cf9dd18af69b9fc9d8431d2b1dd26b942c95e6f43c7b8b95eb62082c12db9dbda7fe38e45cbe4a4886907fb81bdb0c5ea9246c", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEvqcRIqBIaT6QX/YCs8+d0Yr2m5/J2EMd\nKx3Sa5Qsleb0PHuLletiCCwS2529p/445Fy+SkiGkH+4G9sMXqkkbA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 419, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022044104104104104104104104104104103b87853fd3b7d3f8e175125b4382f25ed", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04da918c731ba06a20cb94ef33b778e981a404a305f1941fe33666b45b03353156e2bb2694f575b45183be78e5c9b5210bf3bf488fd4c8294516d89572ca4f5391", + "wx" : "00da918c731ba06a20cb94ef33b778e981a404a305f1941fe33666b45b03353156", + "wy" : "00e2bb2694f575b45183be78e5c9b5210bf3bf488fd4c8294516d89572ca4f5391" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004da918c731ba06a20cb94ef33b778e981a404a305f1941fe33666b45b03353156e2bb2694f575b45183be78e5c9b5210bf3bf488fd4c8294516d89572ca4f5391", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE2pGMcxugaiDLlO8zt3jpgaQEowXxlB/j\nNma0WwM1MVbiuyaU9XW0UYO+eOXJtSEL879Ij9TIKUUW2JVyyk9TkQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 420, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202739ce739ce739ce739ce739ce739ce705560298d1f2f08dc419ac273a5b54d9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "043007e92c3937dade7964dfa35b0eff031f7eb02aed0a0314411106cdeb70fe3d5a7546fc0552997b20e3d6f413e75e2cb66e116322697114b79bac734bfc4dc5", + "wx" : "3007e92c3937dade7964dfa35b0eff031f7eb02aed0a0314411106cdeb70fe3d", + "wy" : "5a7546fc0552997b20e3d6f413e75e2cb66e116322697114b79bac734bfc4dc5" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200043007e92c3937dade7964dfa35b0eff031f7eb02aed0a0314411106cdeb70fe3d5a7546fc0552997b20e3d6f413e75e2cb66e116322697114b79bac734bfc4dc5", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEMAfpLDk32t55ZN+jWw7/Ax9+sCrtCgMU\nQREGzetw/j1adUb8BVKZeyDj1vQT514stm4RYyJpcRS3m6xzS/xNxQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 421, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100b777777777777777777777777777777688e6a1fe808a97a348671222ff16b863", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0460e734ef5624d3cbf0ddd375011bd663d6d6aebc644eb599fdf98dbdcd18ce9bd2d90b3ac31f139af832cccf6ccbbb2c6ea11fa97370dc9906da474d7d8a7567", + "wx" : "60e734ef5624d3cbf0ddd375011bd663d6d6aebc644eb599fdf98dbdcd18ce9b", + "wy" : "00d2d90b3ac31f139af832cccf6ccbbb2c6ea11fa97370dc9906da474d7d8a7567" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000460e734ef5624d3cbf0ddd375011bd663d6d6aebc644eb599fdf98dbdcd18ce9bd2d90b3ac31f139af832cccf6ccbbb2c6ea11fa97370dc9906da474d7d8a7567", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEYOc071Yk08vw3dN1ARvWY9bWrrxkTrWZ\n/fmNvc0YzpvS2Qs6wx8TmvgyzM9sy7ssbqEfqXNw3JkG2kdNfYp1Zw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 422, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02206492492492492492492492492492492406dd3a19b8d5fb875235963c593bd2d3", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0485a900e97858f693c0b7dfa261e380dad6ea046d1f65ddeeedd5f7d8af0ba33769744d15add4f6c0bc3b0da2aec93b34cb8c65f9340ddf74e7b0009eeeccce3c", + "wx" : "0085a900e97858f693c0b7dfa261e380dad6ea046d1f65ddeeedd5f7d8af0ba337", + "wy" : "69744d15add4f6c0bc3b0da2aec93b34cb8c65f9340ddf74e7b0009eeeccce3c" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000485a900e97858f693c0b7dfa261e380dad6ea046d1f65ddeeedd5f7d8af0ba33769744d15add4f6c0bc3b0da2aec93b34cb8c65f9340ddf74e7b0009eeeccce3c", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEhakA6XhY9pPAt9+iYeOA2tbqBG0fZd3u\n7dX32K8LozdpdE0VrdT2wLw7DaKuyTs0y4xl+TQN33TnsACe7szOPA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 423, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100955555555555555555555555555555547c74934474db157d2a8c3f088aced62c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0438066f75d88efc4c93de36f49e037b234cc18b1de5608750a62cab0345401046a3e84bed8cfcb819ef4d550444f2ce4b651766b69e2e2901f88836ff90034fed", + "wx" : "38066f75d88efc4c93de36f49e037b234cc18b1de5608750a62cab0345401046", + "wy" : "00a3e84bed8cfcb819ef4d550444f2ce4b651766b69e2e2901f88836ff90034fed" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000438066f75d88efc4c93de36f49e037b234cc18b1de5608750a62cab0345401046a3e84bed8cfcb819ef4d550444f2ce4b651766b69e2e2901f88836ff90034fed", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEOAZvddiO/EyT3jb0ngN7I0zBix3lYIdQ\npiyrA0VAEEaj6EvtjPy4Ge9NVQRE8s5LZRdmtp4uKQH4iDb/kANP7Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 424, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3e3a49a23a6d8abe95461f8445676b17", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0498f68177dc95c1b4cbfa5245488ca523a7d5629470d035d621a443c72f39aabfa33d29546fa1c648f2c7d5ccf70cf1ce4ab79b5db1ac059dbecd068dbdff1b89", + "wx" : "0098f68177dc95c1b4cbfa5245488ca523a7d5629470d035d621a443c72f39aabf", + "wy" : "00a33d29546fa1c648f2c7d5ccf70cf1ce4ab79b5db1ac059dbecd068dbdff1b89" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000498f68177dc95c1b4cbfa5245488ca523a7d5629470d035d621a443c72f39aabfa33d29546fa1c648f2c7d5ccf70cf1ce4ab79b5db1ac059dbecd068dbdff1b89", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEmPaBd9yVwbTL+lJFSIylI6fVYpRw0DXW\nIaRDxy85qr+jPSlUb6HGSPLH1cz3DPHOSrebXbGsBZ2+zQaNvf8biQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 425, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100bffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364143", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "045c2bbfa23c9b9ad07f038aa89b4930bf267d9401e4255de9e8da0a5078ec8277e3e882a31d5e6a379e0793983ccded39b95c4353ab2ff01ea5369ba47b0c3191", + "wx" : "5c2bbfa23c9b9ad07f038aa89b4930bf267d9401e4255de9e8da0a5078ec8277", + "wy" : "00e3e882a31d5e6a379e0793983ccded39b95c4353ab2ff01ea5369ba47b0c3191" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200045c2bbfa23c9b9ad07f038aa89b4930bf267d9401e4255de9e8da0a5078ec8277e3e882a31d5e6a379e0793983ccded39b95c4353ab2ff01ea5369ba47b0c3191", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEXCu/ojybmtB/A4qom0kwvyZ9lAHkJV3p\n6NoKUHjsgnfj6IKjHV5qN54Hk5g8ze05uVxDU6sv8B6lNpukewwxkQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 426, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0220185ddbca6dac41b1da033cfb60c152869e74b3cd66e9ffdf1b6bc09ed65ee40c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "042ea7133432339c69d27f9b267281bd2ddd5f19d6338d400a05cd3647b157a3853547808298448edb5e701ade84cd5fb1ac9567ba5e8fb68a6b933ec4b5cc84cc", + "wx" : "2ea7133432339c69d27f9b267281bd2ddd5f19d6338d400a05cd3647b157a385", + "wy" : "3547808298448edb5e701ade84cd5fb1ac9567ba5e8fb68a6b933ec4b5cc84cc" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200042ea7133432339c69d27f9b267281bd2ddd5f19d6338d400a05cd3647b157a3853547808298448edb5e701ade84cd5fb1ac9567ba5e8fb68a6b933ec4b5cc84cc", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAELqcTNDIznGnSf5smcoG9Ld1fGdYzjUAK\nBc02R7FXo4U1R4CCmESO215wGt6EzV+xrJVnul6Ptoprkz7EtcyEzA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 427, + "comment" : "point duplication during verification", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3045022032b0d10d8d0e04bc8d4d064d270699e87cffc9b49c5c20730e1c26f6105ddcda022100d612c2984c2afa416aa7f2882a486d4a8426cb6cfc91ed5b737278f9fca8be68", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "042ea7133432339c69d27f9b267281bd2ddd5f19d6338d400a05cd3647b157a385cab87f7d67bb7124a18fe5217b32a04e536a9845a1704975946cc13a4a337763", + "wx" : "2ea7133432339c69d27f9b267281bd2ddd5f19d6338d400a05cd3647b157a385", + "wy" : "00cab87f7d67bb7124a18fe5217b32a04e536a9845a1704975946cc13a4a337763" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200042ea7133432339c69d27f9b267281bd2ddd5f19d6338d400a05cd3647b157a385cab87f7d67bb7124a18fe5217b32a04e536a9845a1704975946cc13a4a337763", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAELqcTNDIznGnSf5smcoG9Ld1fGdYzjUAK\nBc02R7FXo4XKuH99Z7txJKGP5SF7MqBOU2qYRaFwSXWUbME6SjN3Yw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 428, + "comment" : "duplication bug", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3045022032b0d10d8d0e04bc8d4d064d270699e87cffc9b49c5c20730e1c26f6105ddcda022100d612c2984c2afa416aa7f2882a486d4a8426cb6cfc91ed5b737278f9fca8be68", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "048aa2c64fa9c6437563abfbcbd00b2048d48c18c152a2a6f49036de7647ebe82e1ce64387995c68a060fa3bc0399b05cc06eec7d598f75041a4917e692b7f51ff", + "wx" : "008aa2c64fa9c6437563abfbcbd00b2048d48c18c152a2a6f49036de7647ebe82e", + "wy" : "1ce64387995c68a060fa3bc0399b05cc06eec7d598f75041a4917e692b7f51ff" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200048aa2c64fa9c6437563abfbcbd00b2048d48c18c152a2a6f49036de7647ebe82e1ce64387995c68a060fa3bc0399b05cc06eec7d598f75041a4917e692b7f51ff", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEiqLGT6nGQ3Vjq/vL0AsgSNSMGMFSoqb0\nkDbedkfr6C4c5kOHmVxooGD6O8A5mwXMBu7H1Zj3UEGkkX5pK39R/w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 429, + "comment" : "comparison with point at infinity ", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0022033333333333333333333333333333332f222f8faefdb533f265d461c29a47373", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04391427ff7ee78013c14aec7d96a8a062209298a783835e94fd6549d502fff71fdd6624ec343ad9fcf4d9872181e59f842f9ba4cccae09a6c0972fb6ac6b4c6bd", + "wx" : "391427ff7ee78013c14aec7d96a8a062209298a783835e94fd6549d502fff71f", + "wy" : "00dd6624ec343ad9fcf4d9872181e59f842f9ba4cccae09a6c0972fb6ac6b4c6bd" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004391427ff7ee78013c14aec7d96a8a062209298a783835e94fd6549d502fff71fdd6624ec343ad9fcf4d9872181e59f842f9ba4cccae09a6c0972fb6ac6b4c6bd", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEORQn/37ngBPBSux9lqigYiCSmKeDg16U\n/WVJ1QL/9x/dZiTsNDrZ/PTZhyGB5Z+EL5ukzMrgmmwJcvtqxrTGvQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 430, + "comment" : "extreme value for k and edgecase s", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04e762b8a219b4f180219cc7a9059245e4961bd191c03899789c7a34b89e8c138ec1533ef0419bb7376e0bfde9319d10a06968791d9ea0eed9c1ce6345aed9759e", + "wx" : "00e762b8a219b4f180219cc7a9059245e4961bd191c03899789c7a34b89e8c138e", + "wy" : "00c1533ef0419bb7376e0bfde9319d10a06968791d9ea0eed9c1ce6345aed9759e" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004e762b8a219b4f180219cc7a9059245e4961bd191c03899789c7a34b89e8c138ec1533ef0419bb7376e0bfde9319d10a06968791d9ea0eed9c1ce6345aed9759e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE52K4ohm08YAhnMepBZJF5JYb0ZHAOJl4\nnHo0uJ6ME47BUz7wQZu3N24L/ekxnRCgaWh5HZ6g7tnBzmNFrtl1ng==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 431, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3046022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022100b6db6db6db6db6db6db6db6db6db6db5f30f30127d33e02aad96438927022e9c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "049aedb0d281db164e130000c5697fae0f305ef848be6fffb43ac593fbb950e952fa6f633359bdcd82b56b0b9f965b037789d46b9a8141b791b2aefa713f96c175", + "wx" : "009aedb0d281db164e130000c5697fae0f305ef848be6fffb43ac593fbb950e952", + "wy" : "00fa6f633359bdcd82b56b0b9f965b037789d46b9a8141b791b2aefa713f96c175" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200049aedb0d281db164e130000c5697fae0f305ef848be6fffb43ac593fbb950e952fa6f633359bdcd82b56b0b9f965b037789d46b9a8141b791b2aefa713f96c175", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEmu2w0oHbFk4TAADFaX+uDzBe+Ei+b/+0\nOsWT+7lQ6VL6b2MzWb3NgrVrC5+WWwN3idRrmoFBt5GyrvpxP5bBdQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 432, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3046022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee502210099999999999999999999999999999998d668eaf0cf91f9bd7317d2547ced5a5a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "048ad445db62816260e4e687fd1884e48b9fc0636d031547d63315e792e19bfaee1de64f99d5f1cd8b6ec9cb0f787a654ae86993ba3db1008ef43cff0684cb22bd", + "wx" : "008ad445db62816260e4e687fd1884e48b9fc0636d031547d63315e792e19bfaee", + "wy" : "1de64f99d5f1cd8b6ec9cb0f787a654ae86993ba3db1008ef43cff0684cb22bd" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200048ad445db62816260e4e687fd1884e48b9fc0636d031547d63315e792e19bfaee1de64f99d5f1cd8b6ec9cb0f787a654ae86993ba3db1008ef43cff0684cb22bd", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEitRF22KBYmDk5of9GITki5/AY20DFUfW\nMxXnkuGb+u4d5k+Z1fHNi27Jyw94emVK6GmTuj2xAI70PP8GhMsivQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 433, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022066666666666666666666666666666665e445f1f5dfb6a67e4cba8c385348e6e7", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "041f5799c95be89063b24f26e40cb928c1a868a76fb0094607e8043db409c91c32e75724e813a4191e3a839007f08e2e897388b06d4a00de6de60e536d91fab566", + "wx" : "1f5799c95be89063b24f26e40cb928c1a868a76fb0094607e8043db409c91c32", + "wy" : "00e75724e813a4191e3a839007f08e2e897388b06d4a00de6de60e536d91fab566" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200041f5799c95be89063b24f26e40cb928c1a868a76fb0094607e8043db409c91c32e75724e813a4191e3a839007f08e2e897388b06d4a00de6de60e536d91fab566", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEH1eZyVvokGOyTybkDLkowahop2+wCUYH\n6AQ9tAnJHDLnVyToE6QZHjqDkAfwji6Jc4iwbUoA3m3mDlNtkfq1Zg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 434, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022049249249249249249249249249249248c79facd43214c011123c1b03a93412a5", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04a3331a4e1b4223ec2c027edd482c928a14ed358d93f1d4217d39abf69fcb5ccc28d684d2aaabcd6383775caa6239de26d4c6937bb603ecb4196082f4cffd509d", + "wx" : "00a3331a4e1b4223ec2c027edd482c928a14ed358d93f1d4217d39abf69fcb5ccc", + "wy" : "28d684d2aaabcd6383775caa6239de26d4c6937bb603ecb4196082f4cffd509d" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004a3331a4e1b4223ec2c027edd482c928a14ed358d93f1d4217d39abf69fcb5ccc28d684d2aaabcd6383775caa6239de26d4c6937bb603ecb4196082f4cffd509d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEozMaThtCI+wsAn7dSCySihTtNY2T8dQh\nfTmr9p/LXMwo1oTSqqvNY4N3XKpiOd4m1MaTe7YD7LQZYIL0z/1QnQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 435, + "comment" : "extreme value for k", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee502200eb10e5ab95f2f275348d82ad2e4d7949c8193800d8c9c75df58e343f0ebba7b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "043f3952199774c7cf39b38b66cb1042a6260d8680803845e4d433adba3bb248185ea495b68cbc7ed4173ee63c9042dc502625c7eb7e21fb02ca9a9114e0a3a18d", + "wx" : "3f3952199774c7cf39b38b66cb1042a6260d8680803845e4d433adba3bb24818", + "wy" : "5ea495b68cbc7ed4173ee63c9042dc502625c7eb7e21fb02ca9a9114e0a3a18d" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200043f3952199774c7cf39b38b66cb1042a6260d8680803845e4d433adba3bb248185ea495b68cbc7ed4173ee63c9042dc502625c7eb7e21fb02ca9a9114e0a3a18d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEPzlSGZd0x885s4tmyxBCpiYNhoCAOEXk\n1DOtujuySBhepJW2jLx+1Bc+5jyQQtxQJiXH634h+wLKmpEU4KOhjQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 436, + "comment" : "extreme value for k and edgecase s", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04cdfb8c0f422e144e137c2412c86c171f5fe3fa3f5bbb544e9076288f3ced786e054fd0721b77c11c79beacb3c94211b0a19bda08652efeaf92513a3b0a163698", + "wx" : "00cdfb8c0f422e144e137c2412c86c171f5fe3fa3f5bbb544e9076288f3ced786e", + "wy" : "054fd0721b77c11c79beacb3c94211b0a19bda08652efeaf92513a3b0a163698" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004cdfb8c0f422e144e137c2412c86c171f5fe3fa3f5bbb544e9076288f3ced786e054fd0721b77c11c79beacb3c94211b0a19bda08652efeaf92513a3b0a163698", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEzfuMD0IuFE4TfCQSyGwXH1/j+j9bu1RO\nkHYojzzteG4FT9ByG3fBHHm+rLPJQhGwoZvaCGUu/q+SUTo7ChY2mA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 437, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022100b6db6db6db6db6db6db6db6db6db6db5f30f30127d33e02aad96438927022e9c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0473598a6a1c68278fa6bfd0ce4064e68235bc1c0f6b20a928108be336730f87e3cbae612519b5032ecc85aed811271a95fe7939d5d3460140ba318f4d14aba31d", + "wx" : "73598a6a1c68278fa6bfd0ce4064e68235bc1c0f6b20a928108be336730f87e3", + "wy" : "00cbae612519b5032ecc85aed811271a95fe7939d5d3460140ba318f4d14aba31d" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000473598a6a1c68278fa6bfd0ce4064e68235bc1c0f6b20a928108be336730f87e3cbae612519b5032ecc85aed811271a95fe7939d5d3460140ba318f4d14aba31d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEc1mKahxoJ4+mv9DOQGTmgjW8HA9rIKko\nEIvjNnMPh+PLrmElGbUDLsyFrtgRJxqV/nk51dNGAUC6MY9NFKujHQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 438, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802210099999999999999999999999999999998d668eaf0cf91f9bd7317d2547ced5a5a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0458debd9a7ee2c9d59132478a5440ae4d5d7ed437308369f92ea86c82183f10a16773e76f5edbf4da0e4f1bdffac0f57257e1dfa465842931309a24245fda6a5d", + "wx" : "58debd9a7ee2c9d59132478a5440ae4d5d7ed437308369f92ea86c82183f10a1", + "wy" : "6773e76f5edbf4da0e4f1bdffac0f57257e1dfa465842931309a24245fda6a5d" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000458debd9a7ee2c9d59132478a5440ae4d5d7ed437308369f92ea86c82183f10a16773e76f5edbf4da0e4f1bdffac0f57257e1dfa465842931309a24245fda6a5d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEWN69mn7iydWRMkeKVECuTV1+1Dcwg2n5\nLqhsghg/EKFnc+dvXtv02g5PG9/6wPVyV+HfpGWEKTEwmiQkX9pqXQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 439, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022066666666666666666666666666666665e445f1f5dfb6a67e4cba8c385348e6e7", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "048b904de47967340c5f8c3572a720924ef7578637feab1949acb241a5a6ac3f5b950904496f9824b1d63f3313bae21b89fae89afdfc811b5ece03fd5aa301864f", + "wx" : "008b904de47967340c5f8c3572a720924ef7578637feab1949acb241a5a6ac3f5b", + "wy" : "00950904496f9824b1d63f3313bae21b89fae89afdfc811b5ece03fd5aa301864f" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200048b904de47967340c5f8c3572a720924ef7578637feab1949acb241a5a6ac3f5b950904496f9824b1d63f3313bae21b89fae89afdfc811b5ece03fd5aa301864f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEi5BN5HlnNAxfjDVypyCSTvdXhjf+qxlJ\nrLJBpaasP1uVCQRJb5gksdY/MxO64huJ+uia/fyBG17OA/1aowGGTw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 440, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022049249249249249249249249249249248c79facd43214c011123c1b03a93412a5", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04f4892b6d525c771e035f2a252708f3784e48238604b4f94dc56eaa1e546d941a346b1aa0bce68b1c50e5b52f509fb5522e5c25e028bc8f863402edb7bcad8b1b", + "wx" : "00f4892b6d525c771e035f2a252708f3784e48238604b4f94dc56eaa1e546d941a", + "wy" : "346b1aa0bce68b1c50e5b52f509fb5522e5c25e028bc8f863402edb7bcad8b1b" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004f4892b6d525c771e035f2a252708f3784e48238604b4f94dc56eaa1e546d941a346b1aa0bce68b1c50e5b52f509fb5522e5c25e028bc8f863402edb7bcad8b1b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE9IkrbVJcdx4DXyolJwjzeE5II4YEtPlN\nxW6qHlRtlBo0axqgvOaLHFDltS9Qn7VSLlwl4Ci8j4Y0Au23vK2LGw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 441, + "comment" : "extreme value for k", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802200eb10e5ab95f2f275348d82ad2e4d7949c8193800d8c9c75df58e343f0ebba7b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", + "wx" : "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", + "wy" : "483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEeb5mfvncu6xVoGKVzocLBwKb/NstzijZ\nWfKBWxb4F5hIOtp3JqPEZV2k+/wOEQio/Re0SKaFVBmcR9CP+xDUuA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 442, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3045022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca60502302202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952", + "result" : "invalid" + }, + { + "tcId" : 443, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3044022044a5ad0bd0636d9e12bc9e0a6bdd5e1bba77f523842193b3b82e448e05d5f11e02202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777", + "wx" : "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", + "wy" : "00b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEeb5mfvncu6xVoGKVzocLBwKb/NstzijZ\nWfKBWxb4F5i3xSWI2Vw7mqJbBAPx7vdXAuhLt1l6q+ZjuC9vBO8ndw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 444, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3045022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca60502302202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952", + "result" : "invalid" + }, + { + "tcId" : 445, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3044022044a5ad0bd0636d9e12bc9e0a6bdd5e1bba77f523842193b3b82e448e05d5f11e02202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff00000001060492d5a5673e0f25d8d50fb7e58c49d86d46d4216955e0aa3d40e1", + "wx" : "6e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff", + "wy" : "01060492d5a5673e0f25d8d50fb7e58c49d86d46d4216955e0aa3d40e1" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff00000001060492d5a5673e0f25d8d50fb7e58c49d86d46d4216955e0aa3d40e1", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEboI1VUUpFAmRgsaywdbwtdKNUMzQBa8s\n4bulQapAyv8AAAABBgSS1aVnPg8l2NUPt+WMSdhtRtQhaVXgqj1A4Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 446, + "comment" : "y-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304402206d6a4f556ccce154e7fb9f19e76c3deca13d59cc2aeb4ecad968aab2ded45965022053b9fa74803ede0fc4441bf683d56c564d3e274e09ccf47390badd1471c05fb7", + "result" : "valid" + }, + { + "tcId" : 447, + "comment" : "y-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100aad503de9b9fd66b948e9acf596f0a0e65e700b28b26ec56e6e45e846489b3c4022100fff223c5d0765447e8447a3f9d31fd0696e89d244422022ff61a110b2a8c2f04", + "result" : "valid" + }, + { + "tcId" : 448, + "comment" : "y-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30460221009182cebd3bb8ab572e167174397209ef4b1d439af3b200cdf003620089e43225022100abb88367d15fe62d1efffb6803da03109ee22e90bc9c78e8b4ed23630b82ea9d", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40cafffffffffef9fb6d2a5a98c1f0da272af0481a73b62792b92bde96aa1e55c2bb4e", + "wx" : "6e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff", + "wy" : "00fffffffef9fb6d2a5a98c1f0da272af0481a73b62792b92bde96aa1e55c2bb4e" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40cafffffffffef9fb6d2a5a98c1f0da272af0481a73b62792b92bde96aa1e55c2bb4e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEboI1VUUpFAmRgsaywdbwtdKNUMzQBa8s\n4bulQapAyv/////++fttKlqYwfDaJyrwSBpztieSuSvelqoeVcK7Tg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 449, + "comment" : "y-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502203854a3998aebdf2dbc28adac4181462ccac7873907ab7f212c42db0e69b56ed8022100c12c09475c772fd0c1b2060d5163e42bf71d727e4ae7c03eeba954bf50b43bb3", + "result" : "valid" + }, + { + "tcId" : 450, + "comment" : "y-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100e94dbdc38795fe5c904d8f16d969d3b587f0a25d2de90b6d8c5c53ff887e3607022100856b8c963e9b68dade44750bf97ec4d11b1a0a3804f4cb79aa27bdea78ac14e4", + "result" : "valid" + }, + { + "tcId" : 451, + "comment" : "y-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3044022049fc102a08ca47b60e0858cd0284d22cddd7233f94aaffbb2db1dd2cf08425e102205b16fca5a12cdb39701697ad8e39ffd6bdec0024298afaa2326aea09200b14d6", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04000000013fd22248d64d95f73c29b48ab48631850be503fd00f8468b5f0f70e0f6ee7aa43bc2c6fd25b1d8269241cbdd9dbb0dac96dc96231f430705f838717d", + "wx" : "013fd22248d64d95f73c29b48ab48631850be503fd00f8468b5f0f70e0", + "wy" : "00f6ee7aa43bc2c6fd25b1d8269241cbdd9dbb0dac96dc96231f430705f838717d" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004000000013fd22248d64d95f73c29b48ab48631850be503fd00f8468b5f0f70e0f6ee7aa43bc2c6fd25b1d8269241cbdd9dbb0dac96dc96231f430705f838717d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEAAAAAT/SIkjWTZX3PCm0irSGMYUL5QP9\nAPhGi18PcOD27nqkO8LG/SWx2CaSQcvdnbsNrJbcliMfQwcF+DhxfQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 452, + "comment" : "x-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022041efa7d3f05a0010675fcb918a45c693da4b348df21a59d6f9cd73e0d831d67a022100bbab52596c1a1d9484296cdc92cbf07e665259a13791a8fe8845e2c07cf3fc67", + "result" : "valid" + }, + { + "tcId" : 453, + "comment" : "x-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100b615698c358b35920dd883eca625a6c5f7563970cdfc378f8fe0cee17092144c022100da0b84cd94a41e049ef477aeac157b2a9bfa6b7ac8de06ed3858c5eede6ddd6d", + "result" : "valid" + }, + { + "tcId" : 454, + "comment" : "x-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304602210087cf8c0eb82d44f69c60a2ff5457d3aaa322e7ec61ae5aecfd678ae1c1932b0e022100c522c4eea7eafb82914cbf5c1ff76760109f55ddddcf58274d41c9bc4311e06e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0425afd689acabaed67c1f296de59406f8c550f57146a0b4ec2c97876dfffffffffa46a76e520322dfbc491ec4f0cc197420fc4ea5883d8f6dd53c354bc4f67c35", + "wx" : "25afd689acabaed67c1f296de59406f8c550f57146a0b4ec2c97876dffffffff", + "wy" : "00fa46a76e520322dfbc491ec4f0cc197420fc4ea5883d8f6dd53c354bc4f67c35" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000425afd689acabaed67c1f296de59406f8c550f57146a0b4ec2c97876dfffffffffa46a76e520322dfbc491ec4f0cc197420fc4ea5883d8f6dd53c354bc4f67c35", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEJa/WiayrrtZ8Hylt5ZQG+MVQ9XFGoLTs\nLJeHbf/////6RqduUgMi37xJHsTwzBl0IPxOpYg9j23VPDVLxPZ8NQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 455, + "comment" : "x-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022062f48ef71ace27bf5a01834de1f7e3f948b9dce1ca1e911d5e13d3b104471d82022100a1570cc0f388768d3ba7df7f212564caa256ff825df997f21f72f5280d53011f", + "result" : "valid" + }, + { + "tcId" : 456, + "comment" : "x-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100f6b0e2f6fe020cf7c0c20137434344ed7add6c4be51861e2d14cbda472a6ffb40221009be93722c1a3ad7d4cf91723700cb5486de5479d8c1b38ae4e8e5ba1638e9732", + "result" : "valid" + }, + { + "tcId" : 457, + "comment" : "x-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022100db09d8460f05eff23bc7e436b67da563fa4b4edb58ac24ce201fa8a358125057022046da116754602940c8999c8d665f786c50f5772c0a3cdbda075e77eabc64df16", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04d12e6c66b67734c3c84d2601cf5d35dc097e27637f0aca4a4fdb74b6aadd3bb93f5bdff88bd5736df898e699006ed750f11cf07c5866cd7ad70c7121ffffffff", + "wx" : "00d12e6c66b67734c3c84d2601cf5d35dc097e27637f0aca4a4fdb74b6aadd3bb9", + "wy" : "3f5bdff88bd5736df898e699006ed750f11cf07c5866cd7ad70c7121ffffffff" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d12e6c66b67734c3c84d2601cf5d35dc097e27637f0aca4a4fdb74b6aadd3bb93f5bdff88bd5736df898e699006ed750f11cf07c5866cd7ad70c7121ffffffff", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE0S5sZrZ3NMPITSYBz1013Al+J2N/CspK\nT9t0tqrdO7k/W9/4i9VzbfiY5pkAbtdQ8RzwfFhmzXrXDHEh/////w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 458, + "comment" : "y-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30450220592c41e16517f12fcabd98267674f974b588e9f35d35406c1a7bb2ed1d19b7b8022100c19a5f942607c3551484ff0dc97281f0cdc82bc48e2205a0645c0cf3d7f59da0", + "result" : "valid" + }, + { + "tcId" : 459, + "comment" : "y-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100be0d70887d5e40821a61b68047de4ea03debfdf51cdf4d4b195558b959a032b20221008266b4d270e24414ecacb14c091a233134b918d37320c6557d60ad0a63544ac4", + "result" : "valid" + }, + { + "tcId" : 460, + "comment" : "y-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100fae92dfcb2ee392d270af3a5739faa26d4f97bfd39ed3cbee4d29e26af3b206a02210093645c80605595e02c09a0dc4b17ac2a51846a728b3e8d60442ed6449fd3342b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046d4a7f60d4774a4f0aa8bbdedb953c7eea7909407e3164755664bc2800000000e659d34e4df38d9e8c9eaadfba36612c769195be86c77aac3f36e78b538680fb", + "wx" : "6d4a7f60d4774a4f0aa8bbdedb953c7eea7909407e3164755664bc2800000000", + "wy" : "00e659d34e4df38d9e8c9eaadfba36612c769195be86c77aac3f36e78b538680fb" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046d4a7f60d4774a4f0aa8bbdedb953c7eea7909407e3164755664bc2800000000e659d34e4df38d9e8c9eaadfba36612c769195be86c77aac3f36e78b538680fb", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEbUp/YNR3Sk8KqLve25U8fup5CUB+MWR1\nVmS8KAAAAADmWdNOTfONnoyeqt+6NmEsdpGVvobHeqw/NueLU4aA+w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-256", + "tests" : [ + { + "tcId" : 461, + "comment" : "x-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30450220176a2557566ffa518b11226694eb9802ed2098bfe278e5570fe1d5d7af18a943022100ed6e2095f12a03f2eaf6718f430ec5fe2829fd1646ab648701656fd31221b97d", + "result" : "valid" + }, + { + "tcId" : 462, + "comment" : "x-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022060be20c3dbc162dd34d26780621c104bbe5dace630171b2daef0d826409ee5c2022100bd8081b27762ab6e8f425956bf604e332fa066a99b59f87e27dc1198b26f5caa", + "result" : "valid" + }, + { + "tcId" : 463, + "comment" : "x-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100edf03cf63f658883289a1a593d1007895b9f236d27c9c1f1313089aaed6b16ae022100e5b22903f7eb23adc2e01057e39b0408d495f694c83f306f1216c9bf87506074", + "result" : "valid" + } + ] + } + ] +} diff --git a/packages/crypto/testdata/wycheproof/ecdsa_secp256k1_sha512_test.json b/packages/crypto/testdata/wycheproof/ecdsa_secp256k1_sha512_test.json new file mode 100644 index 0000000000..4eb93d6ff5 --- /dev/null +++ b/packages/crypto/testdata/wycheproof/ecdsa_secp256k1_sha512_test.json @@ -0,0 +1,7060 @@ +{ + "algorithm" : "ECDSA", + "schema" : "ecdsa_verify_schema.json", + "generatorVersion" : "0.9rc5", + "numberOfTests" : 533, + "header" : [ + "Test vectors of type EcdsaVerify are meant for the verification", + "of ASN encoded ECDSA signatures." + ], + "notes" : { + "ArithmeticError" : { + "bugType" : "EDGE_CASE", + "description" : "Some implementations of ECDSA have arithmetic errors that occur when intermediate results have extreme values. This test vector has been constructed to test such occurences.", + "cves" : [ + "CVE-2017-18146" + ] + }, + "BerEncodedSignature" : { + "bugType" : "BER_ENCODING", + "description" : "ECDSA signatures are usually DER encoded. This signature contains valid values for r and s, but it uses alternative BER encoding.", + "effect" : "Accepting alternative BER encodings may be benign in some cases, or be an issue if protocol requires signature malleability.", + "cves" : [ + "CVE-2020-14966", + "CVE-2020-13822", + "CVE-2019-14859", + "CVE-2016-1000342" + ] + }, + "EdgeCasePublicKey" : { + "bugType" : "EDGE_CASE", + "description" : "The test vector uses a special case public key. " + }, + "EdgeCaseShamirMultiplication" : { + "bugType" : "EDGE_CASE", + "description" : "Shamir proposed a fast method for computing the sum of two scalar multiplications efficiently. This test vector has been constructed so that an intermediate result is the point at infinity if Shamir's method is used." + }, + "IntegerOverflow" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an r and s that has been modified, so that the original value is restored if the implementation ignores the most significant bits.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "InvalidEncoding" : { + "bugType" : "CAN_OF_WORMS", + "description" : "ECDSA signatures are encoded using ASN.1. This test vector contains an incorrectly encoded signature. The test vector itself was generated from a valid signature by modifying its encoding.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "InvalidSignature" : { + "bugType" : "AUTH_BYPASS", + "description" : "The signature contains special case values such as r=0 and s=0. Buggy implementations may accept such values, if the implementation does not check boundaries and computes s^(-1) == 0.", + "effect" : "Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.", + "cves" : [ + "CVE-2022-21449", + "CVE-2021-43572", + "CVE-2022-24884" + ] + }, + "InvalidTypesInSignature" : { + "bugType" : "AUTH_BYPASS", + "description" : "The signature contains invalid types. Dynamic typed languages sometime coerce such values of different types into integers. If an implementation is careless and has additional bugs, such as not checking integer boundaries then it may be possible that such signatures are accepted.", + "effect" : "Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.", + "cves" : [ + "CVE-2022-21449" + ] + }, + "MissingZero" : { + "bugType" : "LEGACY", + "description" : "Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.", + "effect" : "While signatures are more malleable if such signatures are accepted, this typically leads to no vulnerability, since a badly encoded signature can be reencoded correctly." + }, + "ModifiedInteger" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an r and s that has been modified. The goal is to check for arithmetic errors.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "ModifiedSignature" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an invalid signature that was generated from a valid signature by modifying it.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "ModularInverse" : { + "bugType" : "EDGE_CASE", + "description" : "The test vectors contains a signature where computing the modular inverse of s hits an edge case.", + "effect" : "While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.", + "cves" : [ + "CVE-2019-0865" + ] + }, + "PointDuplication" : { + "bugType" : "EDGE_CASE", + "description" : "Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission.", + "cves" : [ + "2020-12607", + "CVE-2015-2730" + ] + }, + "RangeCheck" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an r and s that has been modified. By adding or subtracting the order of the group (or other values) the test vector checks whether signature verification verifies the range of r and s.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "SmallRandS" : { + "bugType" : "EDGE_CASE", + "description" : "The test vectors contains a signature where both r and s are small integers. Some libraries cannot verify such signatures.", + "effect" : "While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.", + "cves" : [ + "2020-13895" + ] + }, + "SpecialCaseHash" : { + "bugType" : "EDGE_CASE", + "description" : "The test vector contains a signature where the hash of the message is a special case, e.g., contains a long run of 0 or 1 bits." + }, + "Untruncatedhash" : { + "bugType" : "MISSING_STEP", + "description" : "If the size of the digest is longer than the size of the underlying order of the multiplicative subgroup then the hash digest must be truncated during signature generation and verification. This test vector contains a signature where this step has been omitted." + }, + "ValidSignature" : { + "bugType" : "BASIC", + "description" : "The test vector contains a valid signature that was generated pseudorandomly. Such signatures should not fail to verify unless some of the parameters (e.g. curve or hash function) are not supported." + } + }, + "testGroups" : [ + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04782c8ed17e3b2a783b5464f33b09652a71c678e05ec51e84e2bcfc663a3de963af9acb4280b8c7f7c42f4ef9aba6245ec1ec1712fd38a0fa96418d8cd6aa6152", + "wx" : "782c8ed17e3b2a783b5464f33b09652a71c678e05ec51e84e2bcfc663a3de963", + "wy" : "00af9acb4280b8c7f7c42f4ef9aba6245ec1ec1712fd38a0fa96418d8cd6aa6152" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004782c8ed17e3b2a783b5464f33b09652a71c678e05ec51e84e2bcfc663a3de963af9acb4280b8c7f7c42f4ef9aba6245ec1ec1712fd38a0fa96418d8cd6aa6152", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEeCyO0X47Kng7VGTzOwllKnHGeOBexR6E\n4rz8Zjo96WOvmstCgLjH98QvTvmrpiRewewXEv04oPqWQY2M1qphUg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 1, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "", + "sig" : "304502206632473c909425b6fa37095398e2538daab8552440320f9fe190dba8f672796b022100a8c3aacce9ffe4bc17c0530738f1386f9d9579f029ff3a7791b16e98422265e3", + "result" : "valid" + }, + { + "tcId" : 2, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "4d7367", + "sig" : "30430220465b0fb05c14cd4ddef23e13acbe5f2337c45ea3816536670cfa7f2ab9090619021f5e525e837c406cf8944383e20bcee32112d8da5b42b40f88415098f722aa89", + "result" : "valid" + }, + { + "tcId" : 3, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "313233343030", + "sig" : "304502207b1553e4d650c71fd49aa36ceed56f0438b0065e1b234445134bf7c83231ca9d022100e369a20fa6434bd138b092885a89e53a3f0b6bdcc5d2653e136c54070081dc5a", + "result" : "valid" + }, + { + "tcId" : 4, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "0000000000000000000000000000000000000000", + "sig" : "3045022100c7ba1c73bdc4364f6c7c61ab1fecc0547f8d6fcbeb251f734964407536353f3202207b3a6fb2fe60f8861e9e0955663f5703a17f5ecc3a5b5140eb87eaf35a3a5090", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04b838ff44e5bc177bf21189d0766082fc9d843226887fc9760371100b7ee20a6ff0c9d75bfba7b31a6bca1974496eeb56de357071955d83c4b1badaa0b21832e9", + "wx" : "00b838ff44e5bc177bf21189d0766082fc9d843226887fc9760371100b7ee20a6f", + "wy" : "00f0c9d75bfba7b31a6bca1974496eeb56de357071955d83c4b1badaa0b21832e9" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004b838ff44e5bc177bf21189d0766082fc9d843226887fc9760371100b7ee20a6ff0c9d75bfba7b31a6bca1974496eeb56de357071955d83c4b1badaa0b21832e9", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEuDj/ROW8F3vyEYnQdmCC/J2EMiaIf8l2\nA3EQC37iCm/wyddb+6ezGmvKGXRJbutW3jVwcZVdg8Sxutqgshgy6Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 5, + "comment" : "signature malleability", + "flags" : [ + "ValidSignature" + ], + "msg" : "313233343030", + "sig" : "304402206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022034d2f1a567d7e647b178552dec35875a2cc61df3ce8ae2c1357ea8c5ff505561", + "result" : "valid" + }, + { + "tcId" : 6, + "comment" : "Legacy: ASN encoding of s misses leading 0", + "flags" : [ + "MissingZero" + ], + "msg" : "313233343030", + "sig" : "304402206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90220cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 7, + "comment" : "valid", + "flags" : [ + "ValidSignature" + ], + "msg" : "313233343030", + "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "valid" + }, + { + "tcId" : 8, + "comment" : "length of sequence [r, s] uses long form encoding", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "30814502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 9, + "comment" : "length of sequence [r, s] contains a leading 0", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "3082004502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 10, + "comment" : "length of sequence [r, s] uses 70 instead of 69", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304602206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 11, + "comment" : "length of sequence [r, s] uses 68 instead of 69", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304402206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 12, + "comment" : "uint32 overflow in length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3085010000004502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 13, + "comment" : "uint64 overflow in length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308901000000000000004502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 14, + "comment" : "length of sequence [r, s] = 2**31 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30847fffffff02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 15, + "comment" : "length of sequence [r, s] = 2**31", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30848000000002206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 16, + "comment" : "length of sequence [r, s] = 2**32 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3084ffffffff02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 17, + "comment" : "length of sequence [r, s] = 2**40 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3085ffffffffff02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 18, + "comment" : "length of sequence [r, s] = 2**64 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3088ffffffffffffffff02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 19, + "comment" : "incorrect length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30ff02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 20, + "comment" : "replaced sequence [r, s] by an indefinite length tag without termination", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308002206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 21, + "comment" : "removing sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "", + "result" : "invalid" + }, + { + "tcId" : 22, + "comment" : "lonely sequence tag", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30", + "result" : "invalid" + }, + { + "tcId" : 23, + "comment" : "appending 0's to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00000", + "result" : "invalid" + }, + { + "tcId" : 24, + "comment" : "prepending 0's to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047000002206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 25, + "comment" : "appending unused 0's to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00000", + "result" : "invalid" + }, + { + "tcId" : 26, + "comment" : "appending null value to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00500", + "result" : "invalid" + }, + { + "tcId" : 27, + "comment" : "prepending garbage to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a498177304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 28, + "comment" : "prepending garbage to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30492500304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 29, + "comment" : "appending garbage to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3047304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00004deadbeef", + "result" : "invalid" + }, + { + "tcId" : 30, + "comment" : "including undefined tags", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304daa00bb00cd00304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 31, + "comment" : "including undefined tags", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d2228aa00bb00cd0002206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 32, + "comment" : "including undefined tags", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e92229aa00bb00cd00022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 33, + "comment" : "truncated length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3081", + "result" : "invalid" + }, + { + "tcId" : 34, + "comment" : "including undefined tags to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304baa02aabb304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 35, + "comment" : "using composition with indefinite length for sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3080304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00000", + "result" : "invalid" + }, + { + "tcId" : 36, + "comment" : "using composition with wrong tag for sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3080314502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00000", + "result" : "invalid" + }, + { + "tcId" : 37, + "comment" : "Replacing sequence [r, s] with NULL", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "0500", + "result" : "invalid" + }, + { + "tcId" : 38, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "2e4502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 39, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "2f4502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 40, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "314502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 41, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "324502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 42, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "ff4502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 43, + "comment" : "dropping value of sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3000", + "result" : "invalid" + }, + { + "tcId" : 44, + "comment" : "using composition for sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30493001023044206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 45, + "comment" : "truncated sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304402206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5eb", + "result" : "invalid" + }, + { + "tcId" : 46, + "comment" : "truncated sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3044206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 47, + "comment" : "sequence [r, s] of size 4166 to check for overflows", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3082104602206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 48, + "comment" : "indefinite length", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "308002206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00000", + "result" : "invalid" + }, + { + "tcId" : 49, + "comment" : "indefinite length with truncated delimiter", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308002206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe000", + "result" : "invalid" + }, + { + "tcId" : 50, + "comment" : "indefinite length with additional element", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "308002206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe005000000", + "result" : "invalid" + }, + { + "tcId" : 51, + "comment" : "indefinite length with truncated element", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308002206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0060811220000", + "result" : "invalid" + }, + { + "tcId" : 52, + "comment" : "indefinite length with garbage", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308002206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00000fe02beef", + "result" : "invalid" + }, + { + "tcId" : 53, + "comment" : "indefinite length with nonempty EOC", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308002206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00002beef", + "result" : "invalid" + }, + { + "tcId" : 54, + "comment" : "prepend empty sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047300002206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 55, + "comment" : "append empty sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe03000", + "result" : "invalid" + }, + { + "tcId" : 56, + "comment" : "append zero", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304802206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0020100", + "result" : "invalid" + }, + { + "tcId" : 57, + "comment" : "append garbage with high tag number", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304802206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0bf7f00", + "result" : "invalid" + }, + { + "tcId" : 58, + "comment" : "append null with explicit tag", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304902206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0a0020500", + "result" : "invalid" + }, + { + "tcId" : 59, + "comment" : "append null with implicit tag", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0a000", + "result" : "invalid" + }, + { + "tcId" : 60, + "comment" : "sequence of sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 61, + "comment" : "truncated sequence: removed last 1 elements", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "302202206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9", + "result" : "invalid" + }, + { + "tcId" : 62, + "comment" : "repeating element in sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "306802206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 63, + "comment" : "flipped bit 0 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30436cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e8022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 64, + "comment" : "flipped bit 32 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30436cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f19b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 65, + "comment" : "flipped bit 48 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30436cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561220f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 66, + "comment" : "flipped bit 64 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30436cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236461230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 67, + "comment" : "length of r uses long form encoding", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "30460281206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 68, + "comment" : "length of r contains a leading 0", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "3047028200206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 69, + "comment" : "length of r uses 33 instead of 32", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502216cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 70, + "comment" : "length of r uses 31 instead of 32", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045021f6cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 71, + "comment" : "uint32 overflow in length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a028501000000206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 72, + "comment" : "uint64 overflow in length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304e02890100000000000000206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 73, + "comment" : "length of r = 2**31 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902847fffffff6cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 74, + "comment" : "length of r = 2**31", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30490284800000006cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 75, + "comment" : "length of r = 2**32 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30490284ffffffff6cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 76, + "comment" : "length of r = 2**40 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a0285ffffffffff6cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 77, + "comment" : "length of r = 2**64 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d0288ffffffffffffffff6cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 78, + "comment" : "incorrect length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502ff6cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 79, + "comment" : "replaced r by an indefinite length tag without termination", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502806cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 80, + "comment" : "removing r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3023022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 81, + "comment" : "lonely integer tag", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "302402022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 82, + "comment" : "lonely integer tag", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "302302206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e902", + "result" : "invalid" + }, + { + "tcId" : 83, + "comment" : "appending 0's to r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702226cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90000022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 84, + "comment" : "prepending 0's to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3047022200006cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 85, + "comment" : "appending unused 0's to r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90000022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 86, + "comment" : "appending null value to r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702226cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90500022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 87, + "comment" : "prepending garbage to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a222549817702206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 88, + "comment" : "prepending garbage to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30492224250002206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 89, + "comment" : "appending garbage to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d222202206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90004deadbeef022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 90, + "comment" : "truncated length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30250281022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 91, + "comment" : "including undefined tags to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304b2226aa02aabb02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 92, + "comment" : "using composition with indefinite length for r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049228002206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90000022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 93, + "comment" : "using composition with wrong tag for r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049228003206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90000022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 94, + "comment" : "Replacing r with NULL", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30250500022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 95, + "comment" : "changing tag value of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304500206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 96, + "comment" : "changing tag value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304501206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 97, + "comment" : "changing tag value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304503206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 98, + "comment" : "changing tag value of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304504206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 99, + "comment" : "changing tag value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045ff206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 100, + "comment" : "dropping value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30250200022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 101, + "comment" : "using composition for r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049222402016c021fb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 102, + "comment" : "modifying first byte of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502206eb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 103, + "comment" : "modifying last byte of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a169022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 104, + "comment" : "truncated r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3044021f6cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 105, + "comment" : "truncated r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3044021fb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 106, + "comment" : "r of size 4129 to check for overflows", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30821048028210216cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 107, + "comment" : "leading ff in r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30460221ff6cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 108, + "comment" : "replaced r by infinity", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3026090180022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 109, + "comment" : "replacing r with zero", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 110, + "comment" : "flipped bit 0 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304302206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e900cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe1", + "result" : "invalid" + }, + { + "tcId" : 111, + "comment" : "flipped bit 32 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304302206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e900cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c7d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 112, + "comment" : "flipped bit 48 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304302206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e900cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a52b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 113, + "comment" : "flipped bit 64 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304302206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e900cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7b8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 114, + "comment" : "length of s uses long form encoding", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "304602206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e902812100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 115, + "comment" : "length of s contains a leading 0", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "304702206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90282002100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 116, + "comment" : "length of s uses 34 instead of 33", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022200cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 117, + "comment" : "length of s uses 32 instead of 33", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022000cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 118, + "comment" : "uint32 overflow in length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90285010000002100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 119, + "comment" : "uint64 overflow in length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304e02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9028901000000000000002100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 120, + "comment" : "length of s = 2**31 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e902847fffffff00cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 121, + "comment" : "length of s = 2**31", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e902848000000000cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 122, + "comment" : "length of s = 2**32 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90284ffffffff00cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 123, + "comment" : "length of s = 2**40 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90285ffffffffff00cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 124, + "comment" : "length of s = 2**64 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90288ffffffffffffffff00cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 125, + "comment" : "incorrect length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e902ff00cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 126, + "comment" : "replaced s by an indefinite length tag without termination", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9028000cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 127, + "comment" : "appending 0's to s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022300cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00000", + "result" : "invalid" + }, + { + "tcId" : 128, + "comment" : "prepending 0's to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304702206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90223000000cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 129, + "comment" : "appending null value to s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022300cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00500", + "result" : "invalid" + }, + { + "tcId" : 130, + "comment" : "prepending garbage to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e92226498177022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 131, + "comment" : "prepending garbage to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e922252500022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 132, + "comment" : "appending garbage to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e92223022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00004deadbeef", + "result" : "invalid" + }, + { + "tcId" : 133, + "comment" : "truncated length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "302402206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90281", + "result" : "invalid" + }, + { + "tcId" : 134, + "comment" : "including undefined tags to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304b02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e92227aa02aabb022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 135, + "comment" : "using composition with indefinite length for s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e92280022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00000", + "result" : "invalid" + }, + { + "tcId" : 136, + "comment" : "using composition with wrong tag for s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e92280032100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00000", + "result" : "invalid" + }, + { + "tcId" : 137, + "comment" : "Replacing s with NULL", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "302402206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90500", + "result" : "invalid" + }, + { + "tcId" : 138, + "comment" : "changing tag value of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9002100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 139, + "comment" : "changing tag value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9012100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 140, + "comment" : "changing tag value of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9032100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 141, + "comment" : "changing tag value of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9042100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 142, + "comment" : "changing tag value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9ff2100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 143, + "comment" : "dropping value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "302402206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90200", + "result" : "invalid" + }, + { + "tcId" : 144, + "comment" : "using composition for s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e922250201000220cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 145, + "comment" : "modifying first byte of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022102cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 146, + "comment" : "modifying last byte of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5eb60", + "result" : "invalid" + }, + { + "tcId" : 147, + "comment" : "truncated s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304402206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022000cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5eb", + "result" : "invalid" + }, + { + "tcId" : 148, + "comment" : "s of size 4130 to check for overflows", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3082104802206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90282102200cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 149, + "comment" : "leading ff in s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304602206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90222ff00cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 150, + "comment" : "replaced s by infinity", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "302502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9090180", + "result" : "invalid" + }, + { + "tcId" : 151, + "comment" : "replacing s with zero", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "302502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9020100", + "result" : "invalid" + }, + { + "tcId" : 152, + "comment" : "replaced r by r + n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "30460221016cb914246e1c92050a03d9b0b4f05dde199ab6bf23cec3a120f56da5843de32a022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 153, + "comment" : "replaced r by r - n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "30460221ff6cb914246e1c92050a03d9b0b4f05de0a43cfcf1c53d8329a150b08be3d160a8022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 154, + "comment" : "replaced r by r + 256 * n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "3047022201006cb914246e1c92050a03d9b0b4f05c9a0dc8c087bd265f2533819be8ea48e2e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 155, + "comment" : "replaced r by -r", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "304502209346ebdb91e36dfaf5fc264f4b0fa220a11426278b79dc9a9edcf0e74bf85e17022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 156, + "comment" : "replaced r by n - r", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30460221009346ebdb91e36dfaf5fc264f4b0fa21f5bc3030e3ac27cd65eaf4f741c2e9f58022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 157, + "comment" : "replaced r by -n - r", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30460221fe9346ebdb91e36dfaf5fc264f4b0fa221e6654940dc313c5edf0a925a7bc21cd6022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 158, + "comment" : "replaced r by r + 2**256", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "30460221016cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 159, + "comment" : "replaced r by r + 2**320", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "304e02290100000000000000006cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 160, + "comment" : "replaced s by s + n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "3046022101cb2d0e5a982819b84e87aad213ca78a348979bd990065db64a261453a11c2d21022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 161, + "comment" : "replaced s by s - n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "30450220cb2d0e5a982819b84e87aad213ca78a5d339e20c31751d3eca81573a00afaa9f022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 162, + "comment" : "replaced s by s + 256 * n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "304702220100cb2d0e5a982819b84e87aad213ca775f3cc5a5a2295df93a5cb2429707272ce0022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 163, + "comment" : "replaced s by -s", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30460221ff34d2f1a567d7e647b178552dec35875b7217410d1f42428575ac4a392f1a1420022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 164, + "comment" : "replaced s by -n - s", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30460221fe34d2f1a567d7e647b178552dec35875cb76864266ff9a249b5d9ebac5ee3d2df022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 165, + "comment" : "replaced s by s + 2**256", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "3046022101cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 166, + "comment" : "replaced s by s - 2**256", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "30450220cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 167, + "comment" : "replaced s by s + 2**320", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "304e0229010000000000000000cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0", + "result" : "invalid" + }, + { + "tcId" : 168, + "comment" : "Signature with special case values r=0 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100020100", + "result" : "invalid" + }, + { + "tcId" : 169, + "comment" : "Signature with special case values r=0 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100020101", + "result" : "invalid" + }, + { + "tcId" : 170, + "comment" : "Signature with special case values r=0 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201000201ff", + "result" : "invalid" + }, + { + "tcId" : 171, + "comment" : "Signature with special case values r=0 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 172, + "comment" : "Signature with special case values r=0 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 173, + "comment" : "Signature with special case values r=0 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 174, + "comment" : "Signature with special case values r=0 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 175, + "comment" : "Signature with special case values r=0 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 176, + "comment" : "Signature with special case values r=1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101020100", + "result" : "invalid" + }, + { + "tcId" : 177, + "comment" : "Signature with special case values r=1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101020101", + "result" : "invalid" + }, + { + "tcId" : 178, + "comment" : "Signature with special case values r=1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201010201ff", + "result" : "invalid" + }, + { + "tcId" : 179, + "comment" : "Signature with special case values r=1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 180, + "comment" : "Signature with special case values r=1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 181, + "comment" : "Signature with special case values r=1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 182, + "comment" : "Signature with special case values r=1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 183, + "comment" : "Signature with special case values r=1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 184, + "comment" : "Signature with special case values r=-1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff020100", + "result" : "invalid" + }, + { + "tcId" : 185, + "comment" : "Signature with special case values r=-1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff020101", + "result" : "invalid" + }, + { + "tcId" : 186, + "comment" : "Signature with special case values r=-1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff0201ff", + "result" : "invalid" + }, + { + "tcId" : 187, + "comment" : "Signature with special case values r=-1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 188, + "comment" : "Signature with special case values r=-1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 189, + "comment" : "Signature with special case values r=-1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 190, + "comment" : "Signature with special case values r=-1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 191, + "comment" : "Signature with special case values r=-1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 192, + "comment" : "Signature with special case values r=n and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141020100", + "result" : "invalid" + }, + { + "tcId" : 193, + "comment" : "Signature with special case values r=n and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141020101", + "result" : "invalid" + }, + { + "tcId" : 194, + "comment" : "Signature with special case values r=n and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410201ff", + "result" : "invalid" + }, + { + "tcId" : 195, + "comment" : "Signature with special case values r=n and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 196, + "comment" : "Signature with special case values r=n and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 197, + "comment" : "Signature with special case values r=n and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 198, + "comment" : "Signature with special case values r=n and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 199, + "comment" : "Signature with special case values r=n and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 200, + "comment" : "Signature with special case values r=n - 1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140020100", + "result" : "invalid" + }, + { + "tcId" : 201, + "comment" : "Signature with special case values r=n - 1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140020101", + "result" : "invalid" + }, + { + "tcId" : 202, + "comment" : "Signature with special case values r=n - 1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641400201ff", + "result" : "invalid" + }, + { + "tcId" : 203, + "comment" : "Signature with special case values r=n - 1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 204, + "comment" : "Signature with special case values r=n - 1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 205, + "comment" : "Signature with special case values r=n - 1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 206, + "comment" : "Signature with special case values r=n - 1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 207, + "comment" : "Signature with special case values r=n - 1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 208, + "comment" : "Signature with special case values r=n + 1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142020100", + "result" : "invalid" + }, + { + "tcId" : 209, + "comment" : "Signature with special case values r=n + 1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142020101", + "result" : "invalid" + }, + { + "tcId" : 210, + "comment" : "Signature with special case values r=n + 1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641420201ff", + "result" : "invalid" + }, + { + "tcId" : 211, + "comment" : "Signature with special case values r=n + 1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 212, + "comment" : "Signature with special case values r=n + 1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 213, + "comment" : "Signature with special case values r=n + 1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 214, + "comment" : "Signature with special case values r=n + 1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 215, + "comment" : "Signature with special case values r=n + 1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 216, + "comment" : "Signature with special case values r=p and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f020100", + "result" : "invalid" + }, + { + "tcId" : 217, + "comment" : "Signature with special case values r=p and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f020101", + "result" : "invalid" + }, + { + "tcId" : 218, + "comment" : "Signature with special case values r=p and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0201ff", + "result" : "invalid" + }, + { + "tcId" : 219, + "comment" : "Signature with special case values r=p and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 220, + "comment" : "Signature with special case values r=p and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 221, + "comment" : "Signature with special case values r=p and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 222, + "comment" : "Signature with special case values r=p and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 223, + "comment" : "Signature with special case values r=p and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 224, + "comment" : "Signature with special case values r=p + 1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30020100", + "result" : "invalid" + }, + { + "tcId" : 225, + "comment" : "Signature with special case values r=p + 1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30020101", + "result" : "invalid" + }, + { + "tcId" : 226, + "comment" : "Signature with special case values r=p + 1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc300201ff", + "result" : "invalid" + }, + { + "tcId" : 227, + "comment" : "Signature with special case values r=p + 1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 228, + "comment" : "Signature with special case values r=p + 1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 229, + "comment" : "Signature with special case values r=p + 1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 230, + "comment" : "Signature with special case values r=p + 1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 231, + "comment" : "Signature with special case values r=p + 1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 232, + "comment" : "Signature encoding contains incorrect types: r=0, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3008020100090380fe01", + "result" : "invalid" + }, + { + "tcId" : 233, + "comment" : "Signature encoding contains incorrect types: r=0, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100090142", + "result" : "invalid" + }, + { + "tcId" : 234, + "comment" : "Signature encoding contains incorrect types: r=0, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100010101", + "result" : "invalid" + }, + { + "tcId" : 235, + "comment" : "Signature encoding contains incorrect types: r=0, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100010100", + "result" : "invalid" + }, + { + "tcId" : 236, + "comment" : "Signature encoding contains incorrect types: r=0, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201000500", + "result" : "invalid" + }, + { + "tcId" : 237, + "comment" : "Signature encoding contains incorrect types: r=0, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201000c00", + "result" : "invalid" + }, + { + "tcId" : 238, + "comment" : "Signature encoding contains incorrect types: r=0, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201000c0130", + "result" : "invalid" + }, + { + "tcId" : 239, + "comment" : "Signature encoding contains incorrect types: r=0, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201003000", + "result" : "invalid" + }, + { + "tcId" : 240, + "comment" : "Signature encoding contains incorrect types: r=0, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201003003020100", + "result" : "invalid" + }, + { + "tcId" : 241, + "comment" : "Signature encoding contains incorrect types: r=1, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3008020101090380fe01", + "result" : "invalid" + }, + { + "tcId" : 242, + "comment" : "Signature encoding contains incorrect types: r=1, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101090142", + "result" : "invalid" + }, + { + "tcId" : 243, + "comment" : "Signature encoding contains incorrect types: r=1, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101010101", + "result" : "invalid" + }, + { + "tcId" : 244, + "comment" : "Signature encoding contains incorrect types: r=1, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101010100", + "result" : "invalid" + }, + { + "tcId" : 245, + "comment" : "Signature encoding contains incorrect types: r=1, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201010500", + "result" : "invalid" + }, + { + "tcId" : 246, + "comment" : "Signature encoding contains incorrect types: r=1, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201010c00", + "result" : "invalid" + }, + { + "tcId" : 247, + "comment" : "Signature encoding contains incorrect types: r=1, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201010c0130", + "result" : "invalid" + }, + { + "tcId" : 248, + "comment" : "Signature encoding contains incorrect types: r=1, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201013000", + "result" : "invalid" + }, + { + "tcId" : 249, + "comment" : "Signature encoding contains incorrect types: r=1, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201013003020100", + "result" : "invalid" + }, + { + "tcId" : 250, + "comment" : "Signature encoding contains incorrect types: r=-1, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201ff090380fe01", + "result" : "invalid" + }, + { + "tcId" : 251, + "comment" : "Signature encoding contains incorrect types: r=-1, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff090142", + "result" : "invalid" + }, + { + "tcId" : 252, + "comment" : "Signature encoding contains incorrect types: r=-1, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff010101", + "result" : "invalid" + }, + { + "tcId" : 253, + "comment" : "Signature encoding contains incorrect types: r=-1, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff010100", + "result" : "invalid" + }, + { + "tcId" : 254, + "comment" : "Signature encoding contains incorrect types: r=-1, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201ff0500", + "result" : "invalid" + }, + { + "tcId" : 255, + "comment" : "Signature encoding contains incorrect types: r=-1, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201ff0c00", + "result" : "invalid" + }, + { + "tcId" : 256, + "comment" : "Signature encoding contains incorrect types: r=-1, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff0c0130", + "result" : "invalid" + }, + { + "tcId" : 257, + "comment" : "Signature encoding contains incorrect types: r=-1, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201ff3000", + "result" : "invalid" + }, + { + "tcId" : 258, + "comment" : "Signature encoding contains incorrect types: r=-1, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201ff3003020100", + "result" : "invalid" + }, + { + "tcId" : 259, + "comment" : "Signature encoding contains incorrect types: r=n, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141090380fe01", + "result" : "invalid" + }, + { + "tcId" : 260, + "comment" : "Signature encoding contains incorrect types: r=n, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141090142", + "result" : "invalid" + }, + { + "tcId" : 261, + "comment" : "Signature encoding contains incorrect types: r=n, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141010101", + "result" : "invalid" + }, + { + "tcId" : 262, + "comment" : "Signature encoding contains incorrect types: r=n, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141010100", + "result" : "invalid" + }, + { + "tcId" : 263, + "comment" : "Signature encoding contains incorrect types: r=n, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410500", + "result" : "invalid" + }, + { + "tcId" : 264, + "comment" : "Signature encoding contains incorrect types: r=n, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410c00", + "result" : "invalid" + }, + { + "tcId" : 265, + "comment" : "Signature encoding contains incorrect types: r=n, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410c0130", + "result" : "invalid" + }, + { + "tcId" : 266, + "comment" : "Signature encoding contains incorrect types: r=n, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641413000", + "result" : "invalid" + }, + { + "tcId" : 267, + "comment" : "Signature encoding contains incorrect types: r=n, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641413003020100", + "result" : "invalid" + }, + { + "tcId" : 268, + "comment" : "Signature encoding contains incorrect types: r=p, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f090380fe01", + "result" : "invalid" + }, + { + "tcId" : 269, + "comment" : "Signature encoding contains incorrect types: r=p, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f090142", + "result" : "invalid" + }, + { + "tcId" : 270, + "comment" : "Signature encoding contains incorrect types: r=p, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f010101", + "result" : "invalid" + }, + { + "tcId" : 271, + "comment" : "Signature encoding contains incorrect types: r=p, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f010100", + "result" : "invalid" + }, + { + "tcId" : 272, + "comment" : "Signature encoding contains incorrect types: r=p, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0500", + "result" : "invalid" + }, + { + "tcId" : 273, + "comment" : "Signature encoding contains incorrect types: r=p, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0c00", + "result" : "invalid" + }, + { + "tcId" : 274, + "comment" : "Signature encoding contains incorrect types: r=p, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0c0130", + "result" : "invalid" + }, + { + "tcId" : 275, + "comment" : "Signature encoding contains incorrect types: r=p, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f3000", + "result" : "invalid" + }, + { + "tcId" : 276, + "comment" : "Signature encoding contains incorrect types: r=p, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f3003020100", + "result" : "invalid" + }, + { + "tcId" : 277, + "comment" : "Signature encoding contains incorrect types: r=0.25, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300a090380fe01090380fe01", + "result" : "invalid" + }, + { + "tcId" : 278, + "comment" : "Signature encoding contains incorrect types: r=nan, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006090142090142", + "result" : "invalid" + }, + { + "tcId" : 279, + "comment" : "Signature encoding contains incorrect types: r=True, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010101010101", + "result" : "invalid" + }, + { + "tcId" : 280, + "comment" : "Signature encoding contains incorrect types: r=False, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010100010100", + "result" : "invalid" + }, + { + "tcId" : 281, + "comment" : "Signature encoding contains incorrect types: r=Null, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300405000500", + "result" : "invalid" + }, + { + "tcId" : 282, + "comment" : "Signature encoding contains incorrect types: r=empyt UTF-8 string, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30040c000c00", + "result" : "invalid" + }, + { + "tcId" : 283, + "comment" : "Signature encoding contains incorrect types: r=\"0\", s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060c01300c0130", + "result" : "invalid" + }, + { + "tcId" : 284, + "comment" : "Signature encoding contains incorrect types: r=empty list, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300430003000", + "result" : "invalid" + }, + { + "tcId" : 285, + "comment" : "Signature encoding contains incorrect types: r=list containing 0, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300a30030201003003020100", + "result" : "invalid" + }, + { + "tcId" : 286, + "comment" : "Signature encoding contains incorrect types: r=0.25, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3008090380fe01020100", + "result" : "invalid" + }, + { + "tcId" : 287, + "comment" : "Signature encoding contains incorrect types: r=nan, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006090142020100", + "result" : "invalid" + }, + { + "tcId" : 288, + "comment" : "Signature encoding contains incorrect types: r=True, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010101020100", + "result" : "invalid" + }, + { + "tcId" : 289, + "comment" : "Signature encoding contains incorrect types: r=False, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010100020100", + "result" : "invalid" + }, + { + "tcId" : 290, + "comment" : "Signature encoding contains incorrect types: r=Null, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050500020100", + "result" : "invalid" + }, + { + "tcId" : 291, + "comment" : "Signature encoding contains incorrect types: r=empyt UTF-8 string, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050c00020100", + "result" : "invalid" + }, + { + "tcId" : 292, + "comment" : "Signature encoding contains incorrect types: r=\"0\", s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060c0130020100", + "result" : "invalid" + }, + { + "tcId" : 293, + "comment" : "Signature encoding contains incorrect types: r=empty list, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30053000020100", + "result" : "invalid" + }, + { + "tcId" : 294, + "comment" : "Signature encoding contains incorrect types: r=list containing 0, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30083003020100020100", + "result" : "invalid" + }, + { + "tcId" : 295, + "comment" : "Edge case for Shamir multiplication", + "flags" : [ + "EdgeCaseShamirMultiplication" + ], + "msg" : "313236373939", + "sig" : "3045022100dd1b7d09a7bd8218961034a39a87fecf5314f00c4d25eb58a07ac85e85eab51602202c8a79b49cae4ec15d293575a5a1af5b4d6efb74ef5c2c1be34e33cdeb7113cc", + "result" : "valid" + }, + { + "tcId" : 296, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33393439313934313732", + "sig" : "3045022100d743c5d76e1193a57438f1b43b1b0e33d0d1ab15bd3d57a5cf6aebb370d46ce002207df27cb730b33dfe01e34a0067e548a98c56846d9a4cd64a930c96bfd917cf08", + "result" : "valid" + }, + { + "tcId" : 297, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35333637363431383737", + "sig" : "3045022100ba30f4ddf3348f26835e9c50f6a2d5023a9a1f5fe2e9cf14b3270015dac283fe02201d1616abb204f615fbe99860d89158c3264182d617ac9f1560fa8291b349d579", + "result" : "valid" + }, + { + "tcId" : 298, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35363731343831303935", + "sig" : "30450220551d72e63f7b27283c4107f7d851f387b60f3f4713a5d35c21fa332fbeed449402210080914cc37a3fe13a74db7fcc5226388d95034a50a89a9b2fe9bf42ea29e5714d", + "result" : "valid" + }, + { + "tcId" : 299, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3131323037313732393039", + "sig" : "304602210080cead3d165ce05c7cf8469f1c35c5a3a641696c843bef0f022a6c68133dc49e022100ea8409d743a4ad5e136207736c3ad79c8cfc7b57ebd1bd9b8a596670ad12d41c", + "result" : "valid" + }, + { + "tcId" : 300, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3131323938303334323336", + "sig" : "3046022100bbc0e8b7721065a51bac9c3aad64168998cc0efa23298340d436867cc86ba847022100ae3baa131a83153cb31de2f758e45139f62fe6cc9ce3941c6b1789dc1010f3e2", + "result" : "valid" + }, + { + "tcId" : 301, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "39383736303239363833", + "sig" : "304402203a5ba93917b954617b40e1d866860d1522b0d310cac2457636e54e2ffdea888e02203eac6fe762aee127837c2c65fd9c1f65b404b2c31bb945e75d6166503fb5c8bd", + "result" : "valid" + }, + { + "tcId" : 302, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3230323034323936353139", + "sig" : "30440220647f2b4bef6d1ea7908ac5f3dfd705494c2587456557805fe64a703b2b17503c022020e164bbb505c6df56455908008cf9626df320f48aa3fc9d0cc8ad8bcf078cb2", + "result" : "valid" + }, + { + "tcId" : 303, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31343531363639313830", + "sig" : "30460221008aa653cfa001798c471eea3199dc975a4dea4f7c1ede47453409e606d05ceb51022100cab20967a056c0ea7fe9cdf8e1980f55b1597a2dad80c9223a0fab15c314fe6d", + "result" : "valid" + }, + { + "tcId" : 304, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31303933363835393531", + "sig" : "3045022100842e421f33be241d27f12f875355902a25819f210b3685ad536e23594012d9d002204fb894ae0e9c24b6ed280e224ab0811469296a9837d1e95b5d9d661d21a1c255", + "result" : "valid" + }, + { + "tcId" : 305, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36323139353630323031", + "sig" : "304402200b703fd75bdd8dce4820fe130a0b0af17aad4e4681b0254864d5d6f8931ff5730220404521acf84e72ff22c2ee05d14a4bc7b70e69adc78caf81350e01379694c3e8", + "result" : "valid" + }, + { + "tcId" : 306, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35363832343734333033", + "sig" : "3045022062f0df1650560a5800fa670377a4317a604d6475c490066ce15638f8d1330b63022100963edf905197096818368a993fbffe32908a57153e6a1612bae6ee9ee8a8a719", + "result" : "valid" + }, + { + "tcId" : 307, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33373336353331373836", + "sig" : "304502202901ade694d4b9c376b3244018e57bcde7057e8e11dd0f7d07080cdd1a39194b022100ee65a4c2baa70f8e236ceba9eed400d899f75276f94e4b7997b2b01ac008bbbc", + "result" : "valid" + }, + { + "tcId" : 308, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34373935393033373932", + "sig" : "3046022100aa9c8e5311b232b4ce9db03892f26eb77d655c6ff09a599424abbd4b11e750be022100c1034c44b02e2fdf05e1ba5eebdf954c5a01794600059e05e5c73d542da3ee38", + "result" : "valid" + }, + { + "tcId" : 309, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "39333939363131303037", + "sig" : "304502202febea016e55059e91e157b988f86048db57c37fd122f5cc60169ff4fcb4863c022100eb19cbc35b3061e1ac4b59b92d1f732cea3212dcbe943ccad82d32740bc22c33", + "result" : "valid" + }, + { + "tcId" : 310, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31303837343931313835", + "sig" : "304502202be463ff06af2096dd62f0326e1af51c585f18ca8f8aa361dedcf55d543e6b7d022100f56afd59dad42530d94f11c59a6408c54826b7a9ef83f4d020f209d71f9b74c5", + "result" : "valid" + }, + { + "tcId" : 311, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33323336363738353030", + "sig" : "3046022100f61f64defc45abe284b39161b49585f21edef1e88d06389e5b5aacbb394ce4dc022100a5a27e17df10aedace97eb2c48659f69b58cfe76a1f1ac30fea3043655bde515", + "result" : "valid" + }, + { + "tcId" : 312, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31343438393937373033", + "sig" : "30440220052134eae13c1dec5ac5aa46186391786f5b60591cb0dd30bfc61e89486abfe2022009cdaa279c4f0d3d5ae00e0d74e733a260b8b120a1bda7e5a90194ec442e592d", + "result" : "valid" + }, + { + "tcId" : 313, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35373134363332383037", + "sig" : "3044022024824614686b80f3b738970a27816f58cf103c4a93c2d6b0f5f6de65a65501e30220180e5801a593063e75b83cd7ab8e52575a013a1be5cdeeb05b30e3ac9dc4ed82", + "result" : "valid" + }, + { + "tcId" : 314, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "323236343837343932", + "sig" : "304402202ff7a5ab2f1a3323651a0d17c4263672ee4d2c560cda94e7d52ee755138bb0450220542ce83d8d9d441357e24b618b5695164d4391791cff62eeb01609d1d7cb1c0a", + "result" : "valid" + }, + { + "tcId" : 315, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35333533343439343739", + "sig" : "3045022100ae446d1a81766d21dd7fc515d0a956605d0cde26d6086a76f8ffc81a6dfbea4602204fccef9f75e94abc7eb3f2bdcafdc5d97d61b9d950a06010ab4c54e3da7fd4e0", + "result" : "valid" + }, + { + "tcId" : 316, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34373837333033383830", + "sig" : "304402203957cff4a75fc6039c0b0c2e47eb9b07ff6ec5dc8a3c3316590a7ec9a1d7d99302204e578ee6594a00cb80c640cb9589d616dbd1cecda2d15dcc0062f30686d6073b", + "result" : "valid" + }, + { + "tcId" : 317, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32323332313935383233", + "sig" : "30450220437c36031737a3140dc30eed281adac8e9074187aad41502a3b9a3bfd4ef252c022100da13f88f633202b9b9517b93a6c08a7b8e6858734e8894b1a64c6ec08f1d0423", + "result" : "valid" + }, + { + "tcId" : 318, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3130373339333931393137", + "sig" : "3045022100828c12fd9fe31f91bd8f58aac72ee6485e34ceddf91927cf3a09b63363b9d8e902200e889664a8c98619cab572687064edb4f0500f8324a5df0bfb5a431a3cb1ca39", + "result" : "valid" + }, + { + "tcId" : 319, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31383831303237333135", + "sig" : "3045022100807cb34aa6ea48b175f41f3afdf70a109d2b746ae48e08677cdafc33d916b2da022041980e6f7ad19944d278851f98e0a6220ae888964ae81a667a63fec21449334d", + "result" : "valid" + }, + { + "tcId" : 320, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36303631363933393037", + "sig" : "3046022100a998f9f0daf02f717f5292142dca447c722d2394dae0c84910433754669716ac022100826fc37269539cf8a98997f8a0268bfffe888d6c23bc68ad7c759db47f65a925", + "result" : "valid" + }, + { + "tcId" : 321, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "38383935323237303934", + "sig" : "3045022100f151b614afe5bc9d511d0c34a7eb44283921272e91b3e5d02821cf7a43a92bc50220097aa33dc50ebf8fea036cd7e224a4d38aa20773e5a78ddb83a2f3b579b2ef6c", + "result" : "valid" + }, + { + "tcId" : 322, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31353830323334303934", + "sig" : "304502205f21585381f5f42e9f76be3f61f4cfd6476ecc6f06cd4fbcf13e08c27f42614802210095d5b2deabf19891edd41ac52d9072fadebb2f0145bec9b916f68fd1fbcfb3cf", + "result" : "valid" + }, + { + "tcId" : 323, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33393635393931353132", + "sig" : "3045022100bdc361e68984482d7b169bc5e6ccf82d2263871be749d67a44f548d32bcaf5f10220375614fa4134d5055ac117a6ea948b74269b8063e39259d494a7544afb6291ab", + "result" : "valid" + }, + { + "tcId" : 324, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32323838373332313938", + "sig" : "304502205773b016dffac865ab008abe8a06353d197b4dff32403d7ce98ada4d20ea8a00022100d60de9c98cf50eff0515b962dffd6aac8a1b72bc9cfaf6bda12b99f63eb976d2", + "result" : "valid" + }, + { + "tcId" : 325, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32323330383837333139", + "sig" : "3044022057b747d21fc898472a888b88693a989eabaf143396e4cb2de4af19386fba384f02207c99f63904191a4464d0d23ca560d5558895cdcff93af4b00c1c66ca2d974393", + "result" : "valid" + }, + { + "tcId" : 326, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "313239303536393337", + "sig" : "3046022100854be2bf302a2d6db437eb9e78703673c1c7371399e68caa8625bb13c7aa0fec0221008fd22607e0169eb2e2e00c4af898fd2a609dc57a9fa94a7f93372098fa675649", + "result" : "valid" + }, + { + "tcId" : 327, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32373438363536343338", + "sig" : "3046022100ebb3359de3b13a518545a86b7fdd92f4793225b8ca4555a6bd4182922b0452be02210083faa7dff1aa0eed89a7ddcdaa5d716ba6253c5c21f7122c2755eb78b28884c4", + "result" : "valid" + }, + { + "tcId" : 328, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37353833353032363034", + "sig" : "30460221008bc91cfcfc85ba8aa171b703a330e398df4460d22602e73e327423ebf98bf632022100ec7569072aa73ff19f183daf433abff142d7d5edceb25b771d853acf0fbd68b6", + "result" : "valid" + }, + { + "tcId" : 329, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32333237373534323739", + "sig" : "3046022100895b07c0450ed6f4941633a053c978128c46e5225c00eb009c3c6cee5eb2b842022100c982818b260f1650e03eba8f9db1a2ca79c3f804dbe7d172233260e1a9c10640", + "result" : "valid" + }, + { + "tcId" : 330, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "373735353038353834", + "sig" : "3045022100d5e152ec304090d764fd7ae61abeeadff2fee8df3dccd8fb44d2af5a8dbee0bc022072518dc1ecc993faadffc3426594fe2024c7c84ba101a9274d88009393103ff6", + "result" : "valid" + }, + { + "tcId" : 331, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3137393832363438333832", + "sig" : "304502201298b131ce97a528e5dae05d92b286e2447b17ec002267b9e8f03784d4074bd1022100edf223ad9c308aef22e1e0c24a20268f966cc2b9ca4d941945bbca057db92d4c", + "result" : "valid" + }, + { + "tcId" : 332, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32333936373737333635", + "sig" : "304502201e79b3921d23d290a57d08958d3ad8305ec444efe1281c98fda44e8af7648f49022100f4c7610ad1ba9339178c50e7979b5aa9af07d8143e59d13a2e84f98f37101e3b", + "result" : "valid" + }, + { + "tcId" : 333, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35393938313035383031", + "sig" : "3045022100e455f464e0edff9c959f84f081828896149a330361ff2d16d5a2448c9d6836840220351cfa2f29a1318ebb3a46f0a36df8954043949b8d7cea94eacf99108b4d3fa0", + "result" : "valid" + }, + { + "tcId" : 334, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3136363737383237303537", + "sig" : "3046022100a885770c9ffef33f0c11245064936e3dd165ea2633575a6a155368670351f726022100de31e6a58626a41fd029cf766ef44b8273b88558e2452e893978fbdda1e321d1", + "result" : "valid" + }, + { + "tcId" : 335, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "323036323134333632", + "sig" : "304502204b6b451478ba253ae3c75ca5b18b70ccd3cca408ed245cb2af3369548dd2e507022100fe479b631a3431b42772925cbfe8e789f9c55fb2fd1d7ab51664cc2fa571ad93", + "result" : "valid" + }, + { + "tcId" : 336, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36383432343936303435", + "sig" : "304502207ca70376547ad6d18f8e539f09dc269ebaa06854c1adacd58fdc735ed3cf0c16022100f47654f4c0ac1b0e65b712300e3bb472983b116db5206520eabd886dc706b266", + "result" : "valid" + }, + { + "tcId" : 337, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33323639383937333231", + "sig" : "30450220388514d147664fbb37271cb8693e47459c0627d6b1dd52dff1d3947dfc9cabec02210099d3d40814aa177be99e4819696996bc75073f4518955587cd56b5ad8bbc2c58", + "result" : "valid" + }, + { + "tcId" : 338, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31333837333234363932", + "sig" : "3044022044d3ac50d9b65601d79b47d6c5d98394cef155211ff37d4bac15e0d4890809b802203ea03829afb0545e088361a8cf952aec17bab7637fddd6db35f039803523c921", + "result" : "valid" + }, + { + "tcId" : 339, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34313138383837353336", + "sig" : "3046022100a33004a2cd50a4f70447fd382e7fdc9257c4d9be7b16e686c5082a231ee7b010022100d87b96ed3beea54652607017702cfce5d4e7fcec1fdd28f41681ab80a5c5b63c", + "result" : "valid" + }, + { + "tcId" : 340, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "393838363036353435", + "sig" : "30450220668ad18cc22c1d1498cc8e5a11e2bfc4c1e1fcf0a7350a5806c5533ae332f0b1022100f58b49369771bd20bb08b63d4a9212e2dc71da9257ed3710d9eaef9bee469eb2", + "result" : "valid" + }, + { + "tcId" : 341, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32343739313135383435", + "sig" : "3046022100f7cdcb0281c70786cc3653820d1756a78395a9eeeab2a4d164e260f64ebfd6a8022100d966c74499cac97ca8ee67400df01b14793b6d7d07668fc202a9918f3c046e9b", + "result" : "valid" + }, + { + "tcId" : 342, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35303736383837333637", + "sig" : "3045022100de0e781d9e3e7f73021458fc1201fc021e5c54f1fe40b1b10db8fcf16ef7e54a02207d9db92321b5e5bb105990145390979390d32394116f4e78af34b85105dee8e9", + "result" : "valid" + }, + { + "tcId" : 343, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "393838353036393637", + "sig" : "30440220011dac8ea37f7bc6a530a42d0e3bec8c845694f73bec6950081a6f999ccdfbc60220153e57ee45e0a379839f3b8f6faf86de7a626b210f4c1007e431f842e39bf7d5", + "result" : "valid" + }, + { + "tcId" : 344, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32373231333036313331", + "sig" : "3044022063f9c43a8cab49f518685a120bd73a4e5956f9f167a78d4661fc795d41be2ae102206aaf4f3384f1489ef026cb29e97ea1b5562fe8ceb9978d506fb7064f427b9f31", + "result" : "valid" + }, + { + "tcId" : 345, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33323034313031363535", + "sig" : "304402207f0fd3736166195ba810d5a2dfb5e1f03aece2170510c8aa4cc4a0c974a7c5d60220370c8772a75d32e8c9cc103004e75e6d30a8ac8611b84b89c41c65542171bc5b", + "result" : "valid" + }, + { + "tcId" : 346, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33313530363830393530", + "sig" : "3045022100f975196086d10f683f4aa1a3c2d5fe13fd0f52ee72aa3f785006aa024c75873502206a66364156ef21b5dfdcee60cce8fb09c12019bc576848ff73db49856af74681", + "result" : "valid" + }, + { + "tcId" : 347, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31373237343630313033", + "sig" : "3045022035fe6d9bf9f7d47612c3f5be6a4e9a0fb0c14854d1a377adfb5485d6e3835c6f022100f96587fc460e7d07396f9f2d060693dae632721259e77c90b8314002a5235dd0", + "result" : "valid" + }, + { + "tcId" : 348, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3134353731343631323235", + "sig" : "30450220210c7c9b231293c8ec09b0f610d31724a045f6a33f84423fdd541ac11ff78962022100e5a40e6b80da99cfc49ce969f1f59146835183e61001b4513f927b71ec3b2a13", + "result" : "valid" + }, + { + "tcId" : 349, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34313739353136303930", + "sig" : "3044022009b7dcfad2c84b89825cf3aaaffed51664faccc0d171a43387a6ff98aa128a040220272b00e6e0917afe4fbe782604428e09fd91c38125d51c3ba06ce3198e6bf736", + "result" : "valid" + }, + { + "tcId" : 350, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35383932373133303534", + "sig" : "3045022009c7c99681c9159b22c0a467999559a31e279075d37ef872a88ae13565f6149b022100b0ff953be1940d2cf548663c1b4db7b416521db289467733b9a76629f8ab261f", + "result" : "valid" + }, + { + "tcId" : 351, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33383936313832323937", + "sig" : "304502202bfaae0ea6d8baab3e02ad7fa3dda3ce0725d11533e3666477f54d697e2ca9bc0221009289d5da443395bca18fe9d1a4afbe04a32b4ecd258eca6c1772acff2d0b9a89", + "result" : "valid" + }, + { + "tcId" : 352, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "38323833333436373332", + "sig" : "30440220368846edc677ae8fc237069cda719af3d7f17cc136fe443b2af614ccfb4844ab02205ebe6c1d3e88bc4e291841ea97c836bdcf67d9eabe926346c5f42105f7b38f67", + "result" : "valid" + }, + { + "tcId" : 353, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33333636393734383931", + "sig" : "3046022100f336da82bea2a111bddef6a25de4ab87d7c95aa80d21838f3a4efa3d9346555d022100da5ab612b327aa0fe95d1caf85f3b6698c23a47212006c5667cfa92aa3ef4dad", + "result" : "valid" + }, + { + "tcId" : 354, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32313939313533323239", + "sig" : "304602210097c2fb9865f9e76f8d54ce957120b68ccb04cd3183dae7130f73139cd56655cf022100fb63e38176ffac37d0ec1e49c2e2efeff04dffdad5a75f3576f8276cccee9851", + "result" : "valid" + }, + { + "tcId" : 355, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35363030333136383232", + "sig" : "304402207393e0207e07bd73b674d3667dfbc9c30022574d63079a040a23c0cd7e1b6aa602202994b3468432fecd0a32134171179d2809244d586bd971129cdba73fd3dc8876", + "result" : "valid" + }, + { + "tcId" : 356, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "383639363531363935", + "sig" : "3044022021e1943d7d396a8c46658bede4ce155c9a06f929cf6ad292d32c91cf8f493887022030783c682cebfffec5787d762bd725bafc9c4075ad8eb1582188f4c05dd5169d", + "result" : "valid" + }, + { + "tcId" : 357, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36353833393236333732", + "sig" : "304502205a269eb44e910bfe8a2656dee47556cb908a417917e2068e20d201721f44f9b1022100e69d463204dce77c249439f22f77cc4c88134012a286b36a9559f694203766c6", + "result" : "valid" + }, + { + "tcId" : 358, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3133323035303135373235", + "sig" : "3045022100cb8c146fb3d58846e5748c48742af2f1b77805f6cd1e4eb98d8c66cbdf5d6455022017ac992e10251e334467f8e57e2e1c269db8b19469321c74b443972a80f38b2d", + "result" : "valid" + }, + { + "tcId" : 359, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35303835333330373931", + "sig" : "30440220212d84a153db81cea5212fa7dee31d59bdca1307277a01b5936c3aead31bf1e40220520305dbef2bda6526fa2cfca789a1c9aca5c2ad4c0027cc8cf3881813da8a72", + "result" : "valid" + }, + { + "tcId" : 360, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37383636383133313139", + "sig" : "30450220310c82892f571134a36725f4a31c5cba8bc46e65002d73b11364084433d8da4a0221009ca552aca84b96cc9461e2b65a64975118ea78b8b355a0ebcc1a61de37877d13", + "result" : "valid" + }, + { + "tcId" : 361, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32303832353339343239", + "sig" : "30440220489deda580c62533783df9fe62de34c2e2cab91d676709beeff13afac8e90db9022032a85a9c56f308b7a794dcce614a5ed7e0857030b8429fe3b4e07ad533a5a00a", + "result" : "valid" + }, + { + "tcId" : 362, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3130303635393536363937", + "sig" : "3046022100e8897c1cad1fc870a7d364676a9d7f7cd3ac951f3bc3a9ef1f7231466c3493d7022100dd2128e876d62da82cfc5fc508d33bf66b71c0a84d0a9b7e47dfc620f5846bc6", + "result" : "valid" + }, + { + "tcId" : 363, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33303234313831363034", + "sig" : "3046022100b4d771d19fffb1fe5ead25ef5dbf6b53d4d3dad284641108ad84b2541ad435a4022100843ecdc2641b33a3ae9ae15d559f6229d7304ee5ecabe00db73bf2b6b5c6c21f", + "result" : "valid" + }, + { + "tcId" : 364, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37373637383532383734", + "sig" : "304502205ab5fb3136fabdbd22009642df03685935819895d675fc284e8b8112db522d08022100d87ec88173e823ed70438fb1088b00689352542fabad5e9fd6d4c3c58f722f86", + "result" : "valid" + }, + { + "tcId" : 365, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "353434313939393734", + "sig" : "3045022100be310120169f8d488c6e5ec5b5e588ab8a65040169d9efd3062e0d05fd7d58df022045033f291fa21a85cc08f78fec2dbd94135520de261360728b8743b558ed16f8", + "result" : "valid" + }, + { + "tcId" : 366, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35383433343830333931", + "sig" : "3045022100cd7fb3f2c25dfab6f9ee83fcbb08698680e9d1f3d47815bc772d717a764f99970220287dd85b976d7f56d23ae7837398c118932aadc982f675f94103036729a47c7c", + "result" : "valid" + }, + { + "tcId" : 367, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "373138383932363239", + "sig" : "3045022069f18c064ad2683cc1b6d8b79020aacd186b6ad1999e6e55bf28bb1dac33f339022100ef66e66001fcc219c9a927d7f0b84863483bfd1ffa6086c06921905310c793e1", + "result" : "valid" + }, + { + "tcId" : 368, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31373433323233343433", + "sig" : "3043021f547c6bb40f52d207fff796a29f6dbe62058e50fb73bde6b9c6ca11346fd8e802202bc82bd3efc9febe8578acdbc3148bb46c41a39be9ae1994ad52d8bf13195d09", + "result" : "valid" + }, + { + "tcId" : 369, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32343036303035393336", + "sig" : "3045022100a80496adce42e7971ebe91300710cf4f535fad266668d76d72c95fffe4d4257002200d4338ca32857e14e0ea8026bc194227b910b98509c8c9307b0d8d93d47b191b", + "result" : "valid" + }, + { + "tcId" : 370, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31363134303336393838", + "sig" : "304502203de40634d11a7a6b67023b84650420673ce6dbadb1159768cc0fd55f3784ec88022100a455fb08e51b8493177d88fca43aeff306e1490d7f6d24d6a910970a3d8619de", + "result" : "valid" + }, + { + "tcId" : 371, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32303935343235363835", + "sig" : "3046022100c1f229c0557d4c47962593781bc96cf745f3bd629ad85434dc2eee456ddb30310221008638f6c01c15d23db24bb851f6c63c763c1f040976f3f2b32c4bb1b9506c1c12", + "result" : "valid" + }, + { + "tcId" : 372, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31303038303938393833", + "sig" : "3045022035dd4957b352e8b1bbc80d1deb21f9b0989188ade3fbe46f75106da1684e1d6d0221008b508e2ed7a51efea0dfaf377f6bd5d4ae133cc4c93650600be545af5d3acd75", + "result" : "valid" + }, + { + "tcId" : 373, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31353734313437393237", + "sig" : "30450220410aa9c943e663082c6f76b84469c9845e0d439ba7ffc7cac0418eea0e20e638022100c873ab5c21c9f0ce0bf78484028796b77451e1187250ee33535dacfb3cee5f61", + "result" : "valid" + }, + { + "tcId" : 374, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32383636373731353232", + "sig" : "30460221008191db069b571cd40f2676348433430d3a65155c233c46a42a4299e6f5be806c022100f3679ef8af0b1b3a3aeaa7bcee51ce960441622e9ff2dcb22a8ec8de724e0a0c", + "result" : "valid" + }, + { + "tcId" : 375, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31363934323830373837", + "sig" : "3046022100889c44edbf3825b18d933aecd5ef70d12ebb00bf79550451205fd6f5ba7f372b022100ecb67194bed2b8176077622d58c9ab4fe4ca34601decc09f9386b8c4445c7224", + "result" : "valid" + }, + { + "tcId" : 376, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "39393231363932353638", + "sig" : "3045022100aa87113aff2e1ad6461191241f90a23b91242d0066779daaa9506a4188abc427022033dbaac5ac443fb4d9529f83247f94c0ad1360d4d0ba8e162a377946c6ab9ae2", + "result" : "valid" + }, + { + "tcId" : 377, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3131363039343339373938", + "sig" : "304402200e13f66a8ffd0da1c4b67f4d805941e90f98ce386540c48019c1ac105407568302200cb489e8d5acfca5245d9292f59c6ede52425157af77b8beef38d23b6e6ade13", + "result" : "valid" + }, + { + "tcId" : 378, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37313836313632313030", + "sig" : "304402206c1813f660c78bda956c1685bc924f69d1bbac5fadf3e4b027ab049bc82ad134022020de89ee005d7646f070bdac794ccce24d661b390a78851d35fe6fb5b25b3eba", + "result" : "valid" + }, + { + "tcId" : 379, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33323934333437313737", + "sig" : "3045022048dc830b6326ec218144391b658d52045ef86ef918a8d41c59131912b1a46fb1022100a431916cb7cf79129b90f09842b3f2164a6cf603db88f2d99944142c00b42559", + "result" : "valid" + }, + { + "tcId" : 380, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3138353134343535313230", + "sig" : "304502204d45782be145a27ae9ecb6cac1b9e30be87c0d13b7d6ada9f795ff051351ac70022100cf71d1eb15e88446ddb900f20d1e0739da499de9963fe99ded00a62da6462d62", + "result" : "valid" + }, + { + "tcId" : 381, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "343736303433393330", + "sig" : "3044022011acd8b8d736e7f00476495803fbd20ad351321e800cfbddbd6a7dd610c5ab8c0220734027aabcca9487773dc3ab069b802c00f5b6e5520e7761496ac1e7c78ced91", + "result" : "valid" + }, + { + "tcId" : 382, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32353637333738373431", + "sig" : "3045022041be8b3bf41a4c507de12f098f7d409a1f941fef84d93794c497f7242a7c382c02210081f7e7243116f24b84b0321e93eed35e2bdc32b00aa8eb9583be3e9b7a09a4f3", + "result" : "valid" + }, + { + "tcId" : 383, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35373339393334393935", + "sig" : "3046022100ea032ff41b061e93e456a5f0a9cdef36c0732df4d55ab4d3867484b0fc49d9eb022100ab298dd811826a6a9319c3632a96253c31c14f75baef536a645420442bab4d43", + "result" : "valid" + }, + { + "tcId" : 384, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33343738333636313339", + "sig" : "30460221008b1ff140c65adca22e5596ffb95a5121c356d2d4055f14606445249a5725686f022100ef8c16ff228114a7e33b35ad465f957577dea405fbdf3faf077a878754e58bef", + "result" : "valid" + }, + { + "tcId" : 385, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "363439303532363032", + "sig" : "304402203a40e8dc3ebe9e19dcd0d4d1b698ab2a4934a146def5427b3a6a8fbfbf347846022054f65e36088d2d4543011c94b1e5371697202d488b342dd6f77a69944128223d", + "result" : "valid" + }, + { + "tcId" : 386, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34373633383837343936", + "sig" : "3044022015fecd439137df74820727f71218405cbe525d403c574471d8a36fa4b1f592ab022018ec290971ed0a227ec47f1e2142f3b8fe5b17336350c5515d4a87eb3382fcb6", + "result" : "valid" + }, + { + "tcId" : 387, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "353739303230303830", + "sig" : "3046022100e676e84a299f481a207cde6a4271c87d73e29d1e49216393292323bcdc238844022100b8a98c769bf81429644758c8f803ddbedf81634e53099c43ad0ca42f4207ba16", + "result" : "valid" + }, + { + "tcId" : 388, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35333434373837383438", + "sig" : "304402205116f8f0af12b47bd025aa6eaec5007d4e3c5a3a72cb4c331f569581adb01bfb02206962251da7ba9ac951cfbd2051bcb7d953005cb9599ae0ad9c5f5139baacb976", + "result" : "valid" + }, + { + "tcId" : 389, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3139323636343130393230", + "sig" : "3046022100b83f3918b6c5506d648ba3dba36762db593ad4b791456babcc3c1a4966317ae60221008cd0166047cec89963e9c8ca43b556ac17d0d62177a9bda35e61d0bb16dd471d", + "result" : "valid" + }, + { + "tcId" : 390, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33373033393135373035", + "sig" : "30440220077858a840230ca21385c4ab4c36cbd3ffaf85656202fba58f1ea995f52ebc4c0220543e5e32a6d2f5c08664ed72175adaa25cdb5d6a754b0cb184e6994ede66c5b9", + "result" : "valid" + }, + { + "tcId" : 391, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3831353435373730", + "sig" : "30440220538ad8797a397414ac82287c9216e41915c9e3dadbd493a0bbef5cb0dc7935ec02202c94cfdae7bf76f90b3cc7d19feea4005b387e312ad4116654d63cfbecf2ae1a", + "result" : "valid" + }, + { + "tcId" : 392, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "313935353330333737", + "sig" : "3046022100ff8bbd1b6441388cb8d562c28ce29fbe51de11502fc825773ded3f0df225b2360221008eccca0148b82fdfb370cdd073aa0634b39cc70d0d5244a7319e4b13791e2c2a", + "result" : "valid" + }, + { + "tcId" : 393, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31323637383130393033", + "sig" : "304402207c179a010f51d66ec82fe5d5d45bd867b4b236a27be882e627506f7286ed7baa02205e38c048fb0fbd81c40df3dc16087d9aabeb51a193107499d29d8cf99c388a21", + "result" : "valid" + }, + { + "tcId" : 394, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3131313830373230383135", + "sig" : "304502207e0810885b405d54ceb2eb18cae08de2062f61b7ed94ab67eb15e87b64e730ef022100f511a7919e6e4d70c8d61b831e383f58dea5878a6c8c5f0436ee058dd80a7668", + "result" : "valid" + }, + { + "tcId" : 395, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "38333831383639323930", + "sig" : "3045022100c665d558dd638ef27a28557c3deb8a2f54abf9bd0bfa032c7ec9a514da9a9e9e022065c9efc355981f91778227eefacf1bb2fedb98657e6cd8674fdd42ae00d619ed", + "result" : "valid" + }, + { + "tcId" : 396, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33313331323837323737", + "sig" : "304402204f06b82aa0d070a004a7fd1135bc3a0bc36fcaeeca35e3edf00f5895394d59ab022065f71dd7406a17bf19e434a4635479340204dd862a9f2c4653e2fa39b178286c", + "result" : "valid" + }, + { + "tcId" : 397, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3134333331393236353338", + "sig" : "30450220539c8fe5715c3dc893815ec2f00e203b4cd4f8fd36cc5742cc81ced266e02e3b022100a5964b2d5157624cf42b6726ae23a7d5ef83a5d1f1460bd573d5a15316be5bf2", + "result" : "valid" + }, + { + "tcId" : 398, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "333434393038323336", + "sig" : "3045022025f337273591f276849cd855b03d07cbcb205924cda4f62a079591602cc10a8c022100d7b82c8fb38bbd503d92e5ae9303e8673c6dd0e9389f5af53366bbab851f0470", + "result" : "valid" + }, + { + "tcId" : 399, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36383239383335393239", + "sig" : "3045022100f36018945d24c89678ce2c8cf3cb4f93c38bdad3589891a5baa293744d4daa20022019ef05878dfc636a4662fd5dd127c908d7948991a324840323c8aef4fc2ff8ac", + "result" : "valid" + }, + { + "tcId" : 400, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33343435313538303233", + "sig" : "3045022043203c89ad43a2bb1910e70ea104347e84764599535d46dabbe547395b1463f4022100ed3d29c7c506ecc988614b368b38dd5b4f1e330c1b861efca8152a704b9146e5", + "result" : "valid" + }, + { + "tcId" : 401, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3132363937393837363434", + "sig" : "3046022100c2740bfb3f387df1b564e3ff48835b9e380104716f58c5a43e97bb2c2d84d04a022100e760ee5d0950b512f6c271cd1a87619b830df83fd40d44b9283539b3aa380019", + "result" : "valid" + }, + { + "tcId" : 402, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "333939323432353533", + "sig" : "3046022100ec07ec5378ed131b2dea7ae9776ba536daef2afc38e2556a70b89b9752eb1f71022100fea25b9e50b1cfa2cf475dbb2245761d5f4585fbbc438d97226c64ff74bff19e", + "result" : "valid" + }, + { + "tcId" : 403, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31363031393737393737", + "sig" : "3046022100e438303ccbbee359c865997e46112b0afd7a647c593429291398f0c432dfb9f00221008487e07a53da18793f8b527069e620e44587e420245d6ec827bb35cccfae7a47", + "result" : "valid" + }, + { + "tcId" : 404, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3130383738373535313435", + "sig" : "3045022100fc09fa30e89a2ba3d0c4d9d9350e717168c21253371359c0f3cb8c8807bdab5602205d6c4766bca462cf95b4aeb8f5886b52fc3286642ffee8d0bd7ffd4af7badb4a", + "result" : "valid" + }, + { + "tcId" : 405, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37303034323532393939", + "sig" : "304402204f184fba2be39078385290acb4cc4b3f39b099c3300c762df205c605c6b30e1a0220506481d2018b3a4c0ad558f029c82e0625c833cbbee978bee7b589742ee1e377", + "result" : "valid" + }, + { + "tcId" : 406, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31353635333235323833", + "sig" : "3045022100e9a27533a50eafb09561dc335d67f8e5e53b4fc16b3013f062e581ad027e110e02207e4150def368f969ace0fc28cac7a3312d6b9af538c412048be1763ea81f3f44", + "result" : "valid" + }, + { + "tcId" : 407, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3233383236333432333530", + "sig" : "3046022100fac24d54387202bff01a91f5504f778c183a0a7930c02af0b618ee64d1b1e438022100f3a53cb6f96feea45ccadcdf9ac78cd735ec3342163e573d2125caa0d8d507bb", + "result" : "valid" + }, + { + "tcId" : 408, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31343437383437303635", + "sig" : "304502203544590a0f9fa5d43ad4e0a003a8d7db58b8570951657aab3bab732727d1bbc2022100f257beac10d53e8012ecd236793d280026c5cf1c04aae522019b87e003500ec5", + "result" : "valid" + }, + { + "tcId" : 409, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3134323630323035353434", + "sig" : "3045022100bc0726386497c85da8f4055a727b1938e96786b009e6847a080a8aae571b0753022054b1b15fc7886f09b121af6520d0f4336d259d734713fc3e973cf28368830eff", + "result" : "valid" + }, + { + "tcId" : 410, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31393933383335323835", + "sig" : "30450220216f8051f9ceed5b5cc1085f83efd871128cb44b260ac12c486c0ea06c71aa55022100df90346cb028245a72ac7d8094497f0efb83a7c44ba3b258873127355e3b2edf", + "result" : "valid" + }, + { + "tcId" : 411, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34323932313533353233", + "sig" : "3045022100cb76652e19d6e7a72c9cac35c2ae46178d8c0ff59b06b0cb97c31aad39ec1b0902205c47b889a29c781540b8783ca24e2acc340178685d7331017e29b4efe92d9fbd", + "result" : "valid" + }, + { + "tcId" : 412, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34343539393031343936", + "sig" : "3045022100edfc03190c839528ba2aa0ba3a23b596fcfec1bf2bbf4467f1fd88398cab8ad2022045b41fa49e0fa7f060ac1ba38ab4d2d5ab5b9fa54ca59285aee09ceedd9865a3", + "result" : "valid" + }, + { + "tcId" : 413, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31333933393731313731", + "sig" : "3046022100e7631f03d9dfddc64cfd2a971523def68cb9f8a64e07eb2235c7250adc36480b022100a004cbac3e04056c7e65fdb48be051e9a52ab427c826c84e2cb2229252983663", + "result" : "valid" + }, + { + "tcId" : 414, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32333930363936343935", + "sig" : "3045022015e36a42515118021f6f5372ecbff90755d8ae77f9dd683972d2f26aa67164510221008d1cd988ba0a1bd919d2f9b5c8a3517eb59ef776caecdf2b5ac2f7a721858315", + "result" : "valid" + }, + { + "tcId" : 415, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3131343436303536323634", + "sig" : "304502206daacbc1125cb3690e43e16b414077c0dd274b96ed61892bad5a519274f01b23022100d044965811b4050c7a85021e8827635cf9f46260fc33bb7cb56b1b37180c4220", + "result" : "valid" + }, + { + "tcId" : 416, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "363835303034373530", + "sig" : "3044022037e50775ee06024d596ed49824b1e6a49efae25c7dce8181de33f93ce34ac3ce0220616a3e9d1fed086138f6feef6532647c02bd324ba4a8bfea20640d22f5494429", + "result" : "valid" + }, + { + "tcId" : 417, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3232323035333630363139", + "sig" : "3046022100d5b64cdf82e354ba6a01772f7d38e8d46a729b808aaed73616ed41a9afc83db7022100b5c456c91254e57013228c9724bb7f97aaf18e1bfd4c99d3ca9eaa8214382a10", + "result" : "valid" + }, + { + "tcId" : 418, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36323135363635313234", + "sig" : "3045022100915779b90ae6f6c1fb82c198c9f0719ce2ea37be0f261e36585ec89adaedd2b602207d05e7794ac57578790808c0ac52ca3a51d1399f1a4c7173a7ed19867732b3d9", + "result" : "valid" + }, + { + "tcId" : 419, + "comment" : "Signature generated without truncating the hash", + "flags" : [ + "Untruncatedhash" + ], + "msg" : "313233343030", + "sig" : "30440220097a04ee03a13c511d939e8bbe1471c57a71020e168e2689c69a5625686e24ad022040d24d52f3701ac8da959560c36ed0750a1cf031b728a9134e2b71ed3ddef889", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0412c90a5debd88d42686b84227dbc755351b78e7c6cb86c0b22536f394603646ed03d965851bc41bb089499c51987b899a8353d997e040fdd35290a2627f0a3ab", + "wx" : "12c90a5debd88d42686b84227dbc755351b78e7c6cb86c0b22536f394603646e", + "wy" : "00d03d965851bc41bb089499c51987b899a8353d997e040fdd35290a2627f0a3ab" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000412c90a5debd88d42686b84227dbc755351b78e7c6cb86c0b22536f394603646ed03d965851bc41bb089499c51987b899a8353d997e040fdd35290a2627f0a3ab", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEEskKXevYjUJoa4Qifbx1U1G3jnxsuGwL\nIlNvOUYDZG7QPZZYUbxBuwiUmcUZh7iZqDU9mX4ED901KQomJ/Cjqw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 420, + "comment" : "k*G has a large x-coordinate", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30360211014551231950b75fc4402da1722fc9baeb022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e", + "result" : "valid" + }, + { + "tcId" : 421, + "comment" : "r too large", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2c022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04913ed043022ee590f59e44f519e5cfd9d6f1b84a50fb417e9ad06683c6afa194b68fb80d6ef261b5a63b57f871d2ea7224319f5fa3ed3dd77f1012dba19d0395", + "wx" : "00913ed043022ee590f59e44f519e5cfd9d6f1b84a50fb417e9ad06683c6afa194", + "wy" : "00b68fb80d6ef261b5a63b57f871d2ea7224319f5fa3ed3dd77f1012dba19d0395" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004913ed043022ee590f59e44f519e5cfd9d6f1b84a50fb417e9ad06683c6afa194b68fb80d6ef261b5a63b57f871d2ea7224319f5fa3ed3dd77f1012dba19d0395", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEkT7QQwIu5ZD1nkT1GeXP2dbxuEpQ+0F+\nmtBmg8avoZS2j7gNbvJhtaY7V/hx0upyJDGfX6PtPdd/EBLboZ0DlQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 422, + "comment" : "r,s are large", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04644cc54e84467213fafe2a4451dba550f3ea76ea9970bd6251fc7783a420d8b51cd9439155ec45d5634677c281154bbdf99fe44051dcec322053ca69ea88297c", + "wx" : "644cc54e84467213fafe2a4451dba550f3ea76ea9970bd6251fc7783a420d8b5", + "wy" : "1cd9439155ec45d5634677c281154bbdf99fe44051dcec322053ca69ea88297c" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004644cc54e84467213fafe2a4451dba550f3ea76ea9970bd6251fc7783a420d8b51cd9439155ec45d5634677c281154bbdf99fe44051dcec322053ca69ea88297c", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEZEzFToRGchP6/ipEUdulUPPqduqZcL1i\nUfx3g6Qg2LUc2UORVexF1WNGd8KBFUu9+Z/kQFHc7DIgU8pp6ogpfA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 423, + "comment" : "r and s^-1 have a large Hamming weight", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02203e9a7582886089c62fb840cf3b83061cd1cff3ae4341808bb5bdee6191174177", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "040a11d42154bd2de10ca92321fb6b3e638ee8b5a7fb4fb5f501b44515cf60e8c906ccaab8748cd38ece73ddc975bc307e7de172357e14cd96a94bb3461d32d50e", + "wx" : "0a11d42154bd2de10ca92321fb6b3e638ee8b5a7fb4fb5f501b44515cf60e8c9", + "wy" : "06ccaab8748cd38ece73ddc975bc307e7de172357e14cd96a94bb3461d32d50e" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200040a11d42154bd2de10ca92321fb6b3e638ee8b5a7fb4fb5f501b44515cf60e8c906ccaab8748cd38ece73ddc975bc307e7de172357e14cd96a94bb3461d32d50e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEChHUIVS9LeEMqSMh+2s+Y47otaf7T7X1\nAbRFFc9g6MkGzKq4dIzTjs5z3cl1vDB+feFyNX4UzZapS7NGHTLVDg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 424, + "comment" : "r and s^-1 have a large Hamming weight", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022024238e70b431b1a64efdf9032669939d4b77f249503fc6905feb7540dea3e6d2", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "049fa2c32bb349846acb5af14e1c67acfdd8963ed251c4b5783cad4bcdd0fd505d6f724937217d1e5483920405cf1b20200797521c464a2355fdde5306f2a9e448", + "wx" : "009fa2c32bb349846acb5af14e1c67acfdd8963ed251c4b5783cad4bcdd0fd505d", + "wy" : "6f724937217d1e5483920405cf1b20200797521c464a2355fdde5306f2a9e448" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200049fa2c32bb349846acb5af14e1c67acfdd8963ed251c4b5783cad4bcdd0fd505d6f724937217d1e5483920405cf1b20200797521c464a2355fdde5306f2a9e448", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEn6LDK7NJhGrLWvFOHGes/diWPtJRxLV4\nPK1LzdD9UF1vckk3IX0eVIOSBAXPGyAgB5dSHEZKI1X93lMG8qnkSA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 425, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020101020101", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0460eace95001201cf4c83b580fb698bb6abf446e5c56ff945eb5769b1a477b55069f5354a77fe2d601528f126c9a6858deeddb9e5ec408356d05ed5c80d62b8e1", + "wx" : "60eace95001201cf4c83b580fb698bb6abf446e5c56ff945eb5769b1a477b550", + "wy" : "69f5354a77fe2d601528f126c9a6858deeddb9e5ec408356d05ed5c80d62b8e1" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000460eace95001201cf4c83b580fb698bb6abf446e5c56ff945eb5769b1a477b55069f5354a77fe2d601528f126c9a6858deeddb9e5ec408356d05ed5c80d62b8e1", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEYOrOlQASAc9Mg7WA+2mLtqv0RuXFb/lF\n61dpsaR3tVBp9TVKd/4tYBUo8SbJpoWN7t255exAg1bQXtXIDWK44Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 426, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020101020102", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04f1a57d9346842310975ed356672a48a06a70b5efbc0c23287c9b9952ec955b330091aee1224ecd69791856c521b12df172b45a5ce247e6dcaca7349684278f23", + "wx" : "00f1a57d9346842310975ed356672a48a06a70b5efbc0c23287c9b9952ec955b33", + "wy" : "0091aee1224ecd69791856c521b12df172b45a5ce247e6dcaca7349684278f23" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004f1a57d9346842310975ed356672a48a06a70b5efbc0c23287c9b9952ec955b330091aee1224ecd69791856c521b12df172b45a5ce247e6dcaca7349684278f23", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE8aV9k0aEIxCXXtNWZypIoGpwte+8DCMo\nfJuZUuyVWzMAka7hIk7NaXkYVsUhsS3xcrRaXOJH5tyspzSWhCePIw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 427, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020101020103", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "045f051894500a061da63c3558e1469cdffb8a57e260633d630e16c44149d914732f3881bf8954fffce9308e3792413910614341831f9a35b58d1ad0dde4f90cc4", + "wx" : "5f051894500a061da63c3558e1469cdffb8a57e260633d630e16c44149d91473", + "wy" : "2f3881bf8954fffce9308e3792413910614341831f9a35b58d1ad0dde4f90cc4" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200045f051894500a061da63c3558e1469cdffb8a57e260633d630e16c44149d914732f3881bf8954fffce9308e3792413910614341831f9a35b58d1ad0dde4f90cc4", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEXwUYlFAKBh2mPDVY4Uac3/uKV+JgYz1j\nDhbEQUnZFHMvOIG/iVT//OkwjjeSQTkQYUNBgx+aNbWNGtDd5PkMxA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 428, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020102020101", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "042b934479af23d6b8db0693538e9e15eae8436fe56e3c8c9580955a755103ebb2fd81cdb809b4f839856fa6c051c0df65e4fd8a5d01b297c7797e718c5121b416", + "wx" : "2b934479af23d6b8db0693538e9e15eae8436fe56e3c8c9580955a755103ebb2", + "wy" : "00fd81cdb809b4f839856fa6c051c0df65e4fd8a5d01b297c7797e718c5121b416" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200042b934479af23d6b8db0693538e9e15eae8436fe56e3c8c9580955a755103ebb2fd81cdb809b4f839856fa6c051c0df65e4fd8a5d01b297c7797e718c5121b416", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEK5NEea8j1rjbBpNTjp4V6uhDb+VuPIyV\ngJVadVED67L9gc24CbT4OYVvpsBRwN9l5P2KXQGyl8d5fnGMUSG0Fg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 429, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020102020102", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0409f5de48a08164e8032f79e4ca19ab5930ae6d85a914b5a000048471fc9f66c21ff3560f3345c9ccbdf49835eb6648c70f5777e41f5a2e010dbc25e1eb0ff1f4", + "wx" : "09f5de48a08164e8032f79e4ca19ab5930ae6d85a914b5a000048471fc9f66c2", + "wy" : "1ff3560f3345c9ccbdf49835eb6648c70f5777e41f5a2e010dbc25e1eb0ff1f4" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000409f5de48a08164e8032f79e4ca19ab5930ae6d85a914b5a000048471fc9f66c21ff3560f3345c9ccbdf49835eb6648c70f5777e41f5a2e010dbc25e1eb0ff1f4", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAECfXeSKCBZOgDL3nkyhmrWTCubYWpFLWg\nAASEcfyfZsIf81YPM0XJzL30mDXrZkjHD1d35B9aLgENvCXh6w/x9A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 430, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020102020103", + "result" : "valid" + }, + { + "tcId" : 431, + "comment" : "r is larger than n", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364143020103", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0419697f0b44b285f337dfb49eef051e8861097468d9e9e3cff149bb6add90a1dc774eba64f207bdea048381bc48fa7ac64eb8dc49e5cdd6ce007350e7a0e508ae", + "wx" : "19697f0b44b285f337dfb49eef051e8861097468d9e9e3cff149bb6add90a1dc", + "wy" : "774eba64f207bdea048381bc48fa7ac64eb8dc49e5cdd6ce007350e7a0e508ae" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000419697f0b44b285f337dfb49eef051e8861097468d9e9e3cff149bb6add90a1dc774eba64f207bdea048381bc48fa7ac64eb8dc49e5cdd6ce007350e7a0e508ae", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEGWl/C0SyhfM337Se7wUeiGEJdGjZ6ePP\n8Um7at2Qodx3Trpk8ge96gSDgbxI+nrGTrjcSeXN1s4Ac1DnoOUIrg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 432, + "comment" : "s is larger than n", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3026020102022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd04917c8", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04b3c7fbdf1d7472f7bd578757762c8ebc922ff063b0ae9c3aa9cd81600abea76c038eeb3852b836c0649fd82fe5d1d02c3d0dbb30fbcd7fe41866ebc3bd927c69", + "wx" : "00b3c7fbdf1d7472f7bd578757762c8ebc922ff063b0ae9c3aa9cd81600abea76c", + "wy" : "038eeb3852b836c0649fd82fe5d1d02c3d0dbb30fbcd7fe41866ebc3bd927c69" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004b3c7fbdf1d7472f7bd578757762c8ebc922ff063b0ae9c3aa9cd81600abea76c038eeb3852b836c0649fd82fe5d1d02c3d0dbb30fbcd7fe41866ebc3bd927c69", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEs8f73x10cve9V4dXdiyOvJIv8GOwrpw6\nqc2BYAq+p2wDjus4Urg2wGSf2C/l0dAsPQ27MPvNf+QYZuvDvZJ8aQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 433, + "comment" : "small r and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "302702020101022100c58b162c58b162c58b162c58b162c58a1b242973853e16db75c8a1a71da4d39d", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04759fdd1a64c000188b87eb0ddd291a50358fca2b0a5b92f027573845dc40b27a12ec1b2892ef46700f13cff8eb88f40076cc811478b008f5aabee4a74b4546f1", + "wx" : "759fdd1a64c000188b87eb0ddd291a50358fca2b0a5b92f027573845dc40b27a", + "wy" : "12ec1b2892ef46700f13cff8eb88f40076cc811478b008f5aabee4a74b4546f1" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004759fdd1a64c000188b87eb0ddd291a50358fca2b0a5b92f027573845dc40b27a12ec1b2892ef46700f13cff8eb88f40076cc811478b008f5aabee4a74b4546f1", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEdZ/dGmTAABiLh+sN3SkaUDWPyisKW5Lw\nJ1c4RdxAsnoS7Bsoku9GcA8Tz/jriPQAdsyBFHiwCPWqvuSnS0VG8Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 434, + "comment" : "smallish r and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "302c02072d9b4d347952cc022100fcbc5103d0da267477d1791461cf2aa44bf9d43198f79507bd8779d69a13108e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "044882825a892d30267264e300e868ab5d4b0ffc9ef3c2cb6e90d61d238daed856e4c8248a189eb36d83740f5928cb802fb9c50b5a18c9196344a0c2cb74416423", + "wx" : "4882825a892d30267264e300e868ab5d4b0ffc9ef3c2cb6e90d61d238daed856", + "wy" : "00e4c8248a189eb36d83740f5928cb802fb9c50b5a18c9196344a0c2cb74416423" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200044882825a892d30267264e300e868ab5d4b0ffc9ef3c2cb6e90d61d238daed856e4c8248a189eb36d83740f5928cb802fb9c50b5a18c9196344a0c2cb74416423", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAESIKCWoktMCZyZOMA6GirXUsP/J7zwstu\nkNYdI42u2FbkyCSKGJ6zbYN0D1koy4AvucULWhjJGWNEoMLLdEFkIw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 435, + "comment" : "100-bit r and small s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3032020d1033e67e37b32b445580bf4efc022100906f906f906f906f906f906f906f906ed8e426f7b1968c35a204236a579723d2", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04c4d1b1fdf274cf83f3395a70a36c94f7c51f1a31e99514b4ef10ba1304756caf4eaf435b20dd76d6ef447869503da9b28f0ea08edf287424d44aa04b254c1736", + "wx" : "00c4d1b1fdf274cf83f3395a70a36c94f7c51f1a31e99514b4ef10ba1304756caf", + "wy" : "4eaf435b20dd76d6ef447869503da9b28f0ea08edf287424d44aa04b254c1736" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004c4d1b1fdf274cf83f3395a70a36c94f7c51f1a31e99514b4ef10ba1304756caf4eaf435b20dd76d6ef447869503da9b28f0ea08edf287424d44aa04b254c1736", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAExNGx/fJ0z4PzOVpwo2yU98UfGjHplRS0\n7xC6EwR1bK9Or0NbIN121u9EeGlQPamyjw6gjt8odCTUSqBLJUwXNg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 436, + "comment" : "small r and 100 bit s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3026020201010220783266e90f43dafe5cd9b3b0be86de22f9de83677d0f50713a468ec72fcf5d57", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "043376df7376d5e651d45b8ec2e5ff9d891c6fdd6dbbb52b046e6b5ac4c9facedf76cf27f9fcb65403b1f585a2dafe26b43ebd622baccde699d81c9be98df9f4df", + "wx" : "3376df7376d5e651d45b8ec2e5ff9d891c6fdd6dbbb52b046e6b5ac4c9facedf", + "wy" : "76cf27f9fcb65403b1f585a2dafe26b43ebd622baccde699d81c9be98df9f4df" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200043376df7376d5e651d45b8ec2e5ff9d891c6fdd6dbbb52b046e6b5ac4c9facedf76cf27f9fcb65403b1f585a2dafe26b43ebd622baccde699d81c9be98df9f4df", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEM3bfc3bV5lHUW47C5f+diRxv3W27tSsE\nbmtaxMn6zt92zyf5/LZUA7H1haLa/ia0Pr1iK6zN5pnYHJvpjfn03w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 437, + "comment" : "100-bit r and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3031020d062522bbd3ecbe7c39e93e7c260220783266e90f43dafe5cd9b3b0be86de22f9de83677d0f50713a468ec72fcf5d57", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "045077fdd202fdb4194b05491b6c053fff8760697531fc5227879e9cbec3309585d0b5cffb3e0fdfb1c06e6d11a1182752730cfe439f7a4f8a49b9c2924f49ec14", + "wx" : "5077fdd202fdb4194b05491b6c053fff8760697531fc5227879e9cbec3309585", + "wy" : "00d0b5cffb3e0fdfb1c06e6d11a1182752730cfe439f7a4f8a49b9c2924f49ec14" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200045077fdd202fdb4194b05491b6c053fff8760697531fc5227879e9cbec3309585d0b5cffb3e0fdfb1c06e6d11a1182752730cfe439f7a4f8a49b9c2924f49ec14", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEUHf90gL9tBlLBUkbbAU//4dgaXUx/FIn\nh56cvsMwlYXQtc/7Pg/fscBubRGhGCdScwz+Q596T4pJucKST0nsFA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 438, + "comment" : "r and s^-1 are close to n", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03640c1022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04a218a180d55c05040417fa4d6881e8dbcf4952d427e4d5cbaf297e17848c49ae85b4c0e345073b0ad301fc9269d7df1cf328ca245910d9398ebbfa48782a70ff", + "wx" : "00a218a180d55c05040417fa4d6881e8dbcf4952d427e4d5cbaf297e17848c49ae", + "wy" : "0085b4c0e345073b0ad301fc9269d7df1cf328ca245910d9398ebbfa48782a70ff" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004a218a180d55c05040417fa4d6881e8dbcf4952d427e4d5cbaf297e17848c49ae85b4c0e345073b0ad301fc9269d7df1cf328ca245910d9398ebbfa48782a70ff", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEohihgNVcBQQEF/pNaIHo289JUtQn5NXL\nryl+F4SMSa6FtMDjRQc7CtMB/JJp198c8yjKJFkQ2TmOu/pIeCpw/w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 439, + "comment" : "r and s are 64-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30160209009c44febf31c3594d020900839ed28247c2b06b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "049b7e703d3c0224fb5fca71fab833a35fbea230453ae25ce3e3afbb646c587a5a9dd1e4b0c75250fc7845d4013a8f10988ed0875f8cbbdb6ab216bced9b8c3cb7", + "wx" : "009b7e703d3c0224fb5fca71fab833a35fbea230453ae25ce3e3afbb646c587a5a", + "wy" : "009dd1e4b0c75250fc7845d4013a8f10988ed0875f8cbbdb6ab216bced9b8c3cb7" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200049b7e703d3c0224fb5fca71fab833a35fbea230453ae25ce3e3afbb646c587a5a9dd1e4b0c75250fc7845d4013a8f10988ed0875f8cbbdb6ab216bced9b8c3cb7", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEm35wPTwCJPtfynH6uDOjX76iMEU64lzj\n46+7ZGxYelqd0eSwx1JQ/HhF1AE6jxCYjtCHX4y722qyFrztm4w8tw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 440, + "comment" : "r and s are 100-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "301e020d09df8b682430beef6f5fd7c7cf020d0fd0a62e13778f4222a0d61c8a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0482e6ec5429071f4a4571ff510a5cfea7f493492b7d4dcef0404563eebdf79f7af4d87d7e0da88f73c882dddab8d0b1edf9678a92b08d340a312900df34d860ac", + "wx" : "0082e6ec5429071f4a4571ff510a5cfea7f493492b7d4dcef0404563eebdf79f7a", + "wy" : "00f4d87d7e0da88f73c882dddab8d0b1edf9678a92b08d340a312900df34d860ac" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000482e6ec5429071f4a4571ff510a5cfea7f493492b7d4dcef0404563eebdf79f7af4d87d7e0da88f73c882dddab8d0b1edf9678a92b08d340a312900df34d860ac", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEgubsVCkHH0pFcf9RClz+p/STSSt9Tc7w\nQEVj7r33n3r02H1+DaiPc8iC3dq40LHt+WeKkrCNNAoxKQDfNNhgrA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 441, + "comment" : "r and s are 128-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30260211008a598e563a89f526c32ebec8de26367a02110084f633e2042630e99dd0f1e16f7a04bf", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "047937c7f3fbac0301f1e3b73f85cb97bab657c20ec493744c1c3ba692d999038de6b09c5471a987b685b8ff1e5fe9b4e20d59e0ff1299537069897c9ae2bd63ea", + "wx" : "7937c7f3fbac0301f1e3b73f85cb97bab657c20ec493744c1c3ba692d999038d", + "wy" : "00e6b09c5471a987b685b8ff1e5fe9b4e20d59e0ff1299537069897c9ae2bd63ea" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200047937c7f3fbac0301f1e3b73f85cb97bab657c20ec493744c1c3ba692d999038de6b09c5471a987b685b8ff1e5fe9b4e20d59e0ff1299537069897c9ae2bd63ea", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEeTfH8/usAwHx47c/hcuXurZXwg7Ek3RM\nHDumktmZA43msJxUcamHtoW4/x5f6bTiDVng/xKZU3BpiXya4r1j6g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 442, + "comment" : "r and s are 160-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "302e021500aa6eeb5823f7fa31b466bb473797f0d0314c0bdf021500e2977c479e6d25703cebbc6bd561938cc9d1bfb9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "041b1f773b472dac5e1adf94e69d865b404d2cc92cff7bb66cf2197978f6c45d08a9725791c5f33787977a9ddfa69296be998a968c51ec7f1c5447793bc56286b3", + "wx" : "1b1f773b472dac5e1adf94e69d865b404d2cc92cff7bb66cf2197978f6c45d08", + "wy" : "00a9725791c5f33787977a9ddfa69296be998a968c51ec7f1c5447793bc56286b3" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200041b1f773b472dac5e1adf94e69d865b404d2cc92cff7bb66cf2197978f6c45d08a9725791c5f33787977a9ddfa69296be998a968c51ec7f1c5447793bc56286b3", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEGx93O0ctrF4a35TmnYZbQE0sySz/e7Zs\n8hl5ePbEXQipcleRxfM3h5d6nd+mkpa+mYqWjFHsfxxUR3k7xWKGsw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 443, + "comment" : "s == 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3025022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1020101", + "result" : "valid" + }, + { + "tcId" : 444, + "comment" : "s == 0", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3025022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1020100", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04fab77f79e004a6890126e793df13464607eca844f29e645f16a0aa1a3ab9f7b39ef2a99df25c2f51cdab3e75810ef5fe36331e36a519ae5ebefefab5a55bfc6a", + "wx" : "00fab77f79e004a6890126e793df13464607eca844f29e645f16a0aa1a3ab9f7b3", + "wy" : "009ef2a99df25c2f51cdab3e75810ef5fe36331e36a519ae5ebefefab5a55bfc6a" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004fab77f79e004a6890126e793df13464607eca844f29e645f16a0aa1a3ab9f7b39ef2a99df25c2f51cdab3e75810ef5fe36331e36a519ae5ebefefab5a55bfc6a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE+rd/eeAEpokBJueT3xNGRgfsqETynmRf\nFqCqGjq597Oe8qmd8lwvUc2rPnWBDvX+NjMeNqUZrl6+/vq1pVv8ag==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 445, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c10220419d981c515af8cc82545aac0c85e9e308fbb2eab6acd7ed497e0b4145a18fd9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "040afc55541d6cf8bd16289c8954ce899805e39c41ba0d4b83deaef2baed94b2daa5a3a5f79deb3245a51e436c137ea60ddd152d09da5f6e121020ba560eede8b8", + "wx" : "0afc55541d6cf8bd16289c8954ce899805e39c41ba0d4b83deaef2baed94b2da", + "wy" : "00a5a3a5f79deb3245a51e436c137ea60ddd152d09da5f6e121020ba560eede8b8" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200040afc55541d6cf8bd16289c8954ce899805e39c41ba0d4b83deaef2baed94b2daa5a3a5f79deb3245a51e436c137ea60ddd152d09da5f6e121020ba560eede8b8", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAECvxVVB1s+L0WKJyJVM6JmAXjnEG6DUuD\n3q7yuu2Ustqlo6X3nesyRaUeQ2wTfqYN3RUtCdpfbhIQILpWDu3ouA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 446, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102201b21717ad71d23bbac60a9ad0baf75b063c9fdf52a00ebf99d022172910993c9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04b50c72e9b03e5ad9f12cd2f69fc442138d3a8917e800fa138795a24ed0aeada51e09f5ef6efa9aa866e763d5a90c62052ea682a217eba654c6b250962308f6de", + "wx" : "00b50c72e9b03e5ad9f12cd2f69fc442138d3a8917e800fa138795a24ed0aeada5", + "wy" : "1e09f5ef6efa9aa866e763d5a90c62052ea682a217eba654c6b250962308f6de" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004b50c72e9b03e5ad9f12cd2f69fc442138d3a8917e800fa138795a24ed0aeada51e09f5ef6efa9aa866e763d5a90c62052ea682a217eba654c6b250962308f6de", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEtQxy6bA+WtnxLNL2n8RCE406iRfoAPoT\nh5WiTtCuraUeCfXvbvqaqGbnY9WpDGIFLqaCohfrplTGslCWIwj23g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 447, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102202f588f66018f3dd14db3e28e77996487e32486b521ed8e5a20f06591951777e9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046c60df5622465b2c8bd6a22fc20483c450505687e3a832f94545de17c321872a8f6d60c5f3b8e064662562ccd6703cf7418d0f8fbdf55728e4ef69e8a20406a8", + "wx" : "6c60df5622465b2c8bd6a22fc20483c450505687e3a832f94545de17c321872a", + "wy" : "008f6d60c5f3b8e064662562ccd6703cf7418d0f8fbdf55728e4ef69e8a20406a8" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046c60df5622465b2c8bd6a22fc20483c450505687e3a832f94545de17c321872a8f6d60c5f3b8e064662562ccd6703cf7418d0f8fbdf55728e4ef69e8a20406a8", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEbGDfViJGWyyL1qIvwgSDxFBQVofjqDL5\nRUXeF8MhhyqPbWDF87jgZGYlYszWcDz3QY0Pj731Vyjk72noogQGqA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 448, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c10220091a08870ff4daf9123b30c20e8c4fc8505758dcf4074fcaff2170c9bfcf74f4", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "049326f5033bd0fc2a5108a4ba8872c3ff2d6125db90a0d4af7720d9b7cfe580b7d9d649c6090e76ba1d19ece34b3b3dc7b485df93f888017039eee2e92ebaf64f", + "wx" : "009326f5033bd0fc2a5108a4ba8872c3ff2d6125db90a0d4af7720d9b7cfe580b7", + "wy" : "00d9d649c6090e76ba1d19ece34b3b3dc7b485df93f888017039eee2e92ebaf64f" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200049326f5033bd0fc2a5108a4ba8872c3ff2d6125db90a0d4af7720d9b7cfe580b7d9d649c6090e76ba1d19ece34b3b3dc7b485df93f888017039eee2e92ebaf64f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEkyb1AzvQ/CpRCKS6iHLD/y1hJduQoNSv\ndyDZt8/lgLfZ1knGCQ52uh0Z7ONLOz3HtIXfk/iIAXA57uLpLrr2Tw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 449, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102207c370dc0ce8c59a8b273cba44a7c1191fc3186dc03cab96b0567312df0d0b250", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "048217f17c61e97b578e2586fb03274567099d6b329f4205827b0493d589b6d6cbf5259ef680d96395fde4da8a6a96095bbeb72fc1b616b40de3d91571bd4100a8", + "wx" : "008217f17c61e97b578e2586fb03274567099d6b329f4205827b0493d589b6d6cb", + "wy" : "00f5259ef680d96395fde4da8a6a96095bbeb72fc1b616b40de3d91571bd4100a8" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200048217f17c61e97b578e2586fb03274567099d6b329f4205827b0493d589b6d6cbf5259ef680d96395fde4da8a6a96095bbeb72fc1b616b40de3d91571bd4100a8", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEghfxfGHpe1eOJYb7AydFZwmdazKfQgWC\newST1Ym21sv1JZ72gNljlf3k2opqlglbvrcvwbYWtA3j2RVxvUEAqA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 450, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1022070b59a7d1ee77a2f9e0491c2a7cfcd0ed04df4a35192f6132dcc668c79a6160e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04367b67eb9ece04b532c9925b30595fd733e9f1fa52ca1d05d630c7a877b5162c99219249dc0ec6e92bcbfe6e46b7d500278b01f66397e7d9ce4236b5fb1a70a0", + "wx" : "367b67eb9ece04b532c9925b30595fd733e9f1fa52ca1d05d630c7a877b5162c", + "wy" : "0099219249dc0ec6e92bcbfe6e46b7d500278b01f66397e7d9ce4236b5fb1a70a0" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004367b67eb9ece04b532c9925b30595fd733e9f1fa52ca1d05d630c7a877b5162c99219249dc0ec6e92bcbfe6e46b7d500278b01f66397e7d9ce4236b5fb1a70a0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAENntn657OBLUyyZJbMFlf1zPp8fpSyh0F\n1jDHqHe1FiyZIZJJ3A7G6SvL/m5Gt9UAJ4sB9mOX59nOQja1+xpwoA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 451, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102202736d76e412246e097148e2bf62915614eb7c428913a58eb5e9cd4674a9423de", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046700d5c4ba0f6fad92f0deb2055b988fec6a427b689cd779b8e4f1606d22f7dff1f3ea8ed23eba61b5c90d66cf4820e4b1c51c9d23b062552f087a162a8c7b0c", + "wx" : "6700d5c4ba0f6fad92f0deb2055b988fec6a427b689cd779b8e4f1606d22f7df", + "wy" : "00f1f3ea8ed23eba61b5c90d66cf4820e4b1c51c9d23b062552f087a162a8c7b0c" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046700d5c4ba0f6fad92f0deb2055b988fec6a427b689cd779b8e4f1606d22f7dff1f3ea8ed23eba61b5c90d66cf4820e4b1c51c9d23b062552f087a162a8c7b0c", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEZwDVxLoPb62S8N6yBVuYj+xqQntonNd5\nuOTxYG0i99/x8+qO0j66YbXJDWbPSCDkscUcnSOwYlUvCHoWKox7DA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 452, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102204a1e12831fbe93627b02d6e7f24bccdd6ef4b2d0f46739eaf3b1eaf0ca117770", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04b0478cb90c29140cefdfbcb50ca2740c48a97df67ae9672e1e11cb827c1cede51d2824a9265a32d9d2221d453ea40bf64999d2c20e268d0bc061cf6ae2051cf2", + "wx" : "00b0478cb90c29140cefdfbcb50ca2740c48a97df67ae9672e1e11cb827c1cede5", + "wy" : "1d2824a9265a32d9d2221d453ea40bf64999d2c20e268d0bc061cf6ae2051cf2" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004b0478cb90c29140cefdfbcb50ca2740c48a97df67ae9672e1e11cb827c1cede51d2824a9265a32d9d2221d453ea40bf64999d2c20e268d0bc061cf6ae2051cf2", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEsEeMuQwpFAzv37y1DKJ0DEipffZ66Wcu\nHhHLgnwc7eUdKCSpJloy2dIiHUU+pAv2SZnSwg4mjQvAYc9q4gUc8g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 453, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1022006c778d4dfff7dee06ed88bc4e0ed34fc553aad67caf796f2a1c6487c1b2e877", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04940e51450409cd15529adc38e730a662916bc93ae10c0facf41580a75a0c598655c6b4c9b8fdc7d932fb4a0a6847e0d878a8bdbe9390567f0b8ed92eb86267fa", + "wx" : "00940e51450409cd15529adc38e730a662916bc93ae10c0facf41580a75a0c5986", + "wy" : "55c6b4c9b8fdc7d932fb4a0a6847e0d878a8bdbe9390567f0b8ed92eb86267fa" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004940e51450409cd15529adc38e730a662916bc93ae10c0facf41580a75a0c598655c6b4c9b8fdc7d932fb4a0a6847e0d878a8bdbe9390567f0b8ed92eb86267fa", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAElA5RRQQJzRVSmtw45zCmYpFryTrhDA+s\n9BWAp1oMWYZVxrTJuP3H2TL7SgpoR+DYeKi9vpOQVn8LjtkuuGJn+g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 454, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102204de459ef9159afa057feb3ec40fef01c45b809f4ab296ea48c206d4249a2b451", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "040b0beeaed3b2586106e814824a0803b19fe7085ec923e0865a3c803bd46760d1e2741cd27b03f78381957bf81d42f5d61124c001418e591d14480bb8e789d1e5", + "wx" : "0b0beeaed3b2586106e814824a0803b19fe7085ec923e0865a3c803bd46760d1", + "wy" : "00e2741cd27b03f78381957bf81d42f5d61124c001418e591d14480bb8e789d1e5" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200040b0beeaed3b2586106e814824a0803b19fe7085ec923e0865a3c803bd46760d1e2741cd27b03f78381957bf81d42f5d61124c001418e591d14480bb8e789d1e5", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAECwvurtOyWGEG6BSCSggDsZ/nCF7JI+CG\nWjyAO9RnYNHidBzSewP3g4GVe/gdQvXWESTAAUGOWR0USAu454nR5Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 455, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c10220745d294978007302033502e1acc48b63ae6500be43adbea1b258d6b423dbb416", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046d56bb0e13f31470316914085214ee218039df7a2ea062878e1d769e47f7e39295a122a009a17683f079c2da61cff3032e88347c525592edf0877bb5338bcedd", + "wx" : "6d56bb0e13f31470316914085214ee218039df7a2ea062878e1d769e47f7e392", + "wy" : "0095a122a009a17683f079c2da61cff3032e88347c525592edf0877bb5338bcedd" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046d56bb0e13f31470316914085214ee218039df7a2ea062878e1d769e47f7e39295a122a009a17683f079c2da61cff3032e88347c525592edf0877bb5338bcedd", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEbVa7DhPzFHAxaRQIUhTuIYA533ouoGKH\njh12nkf345KVoSKgCaF2g/B5wtphz/MDLog0fFJVku3wh3u1M4vO3Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 456, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102207b2a785e3896f59b2d69da57648e80ad3c133a750a2847fd2098ccd902042b6c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "049e38cd7f3aefb648b90dc9e3562737bda57cf73113cb110568af698392992d53bdaf4fe8760647abdbd91f14b4b32a21de6737629dd62e9f38f76e12bb4649ae", + "wx" : "009e38cd7f3aefb648b90dc9e3562737bda57cf73113cb110568af698392992d53", + "wy" : "00bdaf4fe8760647abdbd91f14b4b32a21de6737629dd62e9f38f76e12bb4649ae" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200049e38cd7f3aefb648b90dc9e3562737bda57cf73113cb110568af698392992d53bdaf4fe8760647abdbd91f14b4b32a21de6737629dd62e9f38f76e12bb4649ae", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEnjjNfzrvtki5DcnjVic3vaV89zETyxEF\naK9pg5KZLVO9r0/odgZHq9vZHxS0syoh3mc3Yp3WLp84924Su0ZJrg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 457, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1022071ae94a72ca896875e7aa4a4c3d29afdb4b35b6996273e63c47ac519256c5eb1", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04e1c989fd3b9e87020a508b72b6cd8da14f15b9c12125b4b2ed402e1257abed82aa6074e0a4ea09ffc24a36d61bd37e0ea642a06d4d58ebd51b2d172bacd5e525", + "wx" : "00e1c989fd3b9e87020a508b72b6cd8da14f15b9c12125b4b2ed402e1257abed82", + "wy" : "00aa6074e0a4ea09ffc24a36d61bd37e0ea642a06d4d58ebd51b2d172bacd5e525" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004e1c989fd3b9e87020a508b72b6cd8da14f15b9c12125b4b2ed402e1257abed82aa6074e0a4ea09ffc24a36d61bd37e0ea642a06d4d58ebd51b2d172bacd5e525", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE4cmJ/TuehwIKUItyts2NoU8VucEhJbSy\n7UAuEler7YKqYHTgpOoJ/8JKNtYb034OpkKgbU1Y69UbLRcrrNXlJQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 458, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102200fa527fa7343c0bc9ec35a6278bfbff4d83301b154fc4bd14aee7eb93445b5f9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0411119d9ac0b4e2adf1bb1db84324fff3c93c76f46999a453b5492151677b8dcebf16cb2f94bae17949c17714a6b0d87fe3cce99d9c149562df76ab035cf0c671", + "wx" : "11119d9ac0b4e2adf1bb1db84324fff3c93c76f46999a453b5492151677b8dce", + "wy" : "00bf16cb2f94bae17949c17714a6b0d87fe3cce99d9c149562df76ab035cf0c671" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000411119d9ac0b4e2adf1bb1db84324fff3c93c76f46999a453b5492151677b8dcebf16cb2f94bae17949c17714a6b0d87fe3cce99d9c149562df76ab035cf0c671", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEERGdmsC04q3xux24QyT/88k8dvRpmaRT\ntUkhUWd7jc6/FssvlLrheUnBdxSmsNh/48zpnZwUlWLfdqsDXPDGcQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 459, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102206539c0adadd0525ff42622164ce9314348bd0863b4c80e936b23ca0414264671", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "042f20bc2232b4ba9d75fea6a92bc827d91c5a8f5c887f4e304d76656ba15999ea5f83242efbd57dd16dbd3de0915bdb2ddec201d2f749b13fc22c223a2644dcdc", + "wx" : "2f20bc2232b4ba9d75fea6a92bc827d91c5a8f5c887f4e304d76656ba15999ea", + "wy" : "5f83242efbd57dd16dbd3de0915bdb2ddec201d2f749b13fc22c223a2644dcdc" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200042f20bc2232b4ba9d75fea6a92bc827d91c5a8f5c887f4e304d76656ba15999ea5f83242efbd57dd16dbd3de0915bdb2ddec201d2f749b13fc22c223a2644dcdc", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAELyC8IjK0up11/qapK8gn2Rxaj1yIf04w\nTXZla6FZmepfgyQu+9V90W29PeCRW9st3sIB0vdJsT/CLCI6JkTc3A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 460, + "comment" : "point at infinity during verify", + "flags" : [ + "PointDuplication", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "049e009cd0a1a7d0c51765169c468e62e56fc4f3ff02e8666c55483419a2560032cd36d713acd504598ff3b4f58046a4690f550bd60ef4c823c5c581c6b899315e", + "wx" : "009e009cd0a1a7d0c51765169c468e62e56fc4f3ff02e8666c55483419a2560032", + "wy" : "00cd36d713acd504598ff3b4f58046a4690f550bd60ef4c823c5c581c6b899315e" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200049e009cd0a1a7d0c51765169c468e62e56fc4f3ff02e8666c55483419a2560032cd36d713acd504598ff3b4f58046a4690f550bd60ef4c823c5c581c6b899315e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEngCc0KGn0MUXZRacRo5i5W/E8/8C6GZs\nVUg0GaJWADLNNtcTrNUEWY/ztPWARqRpD1UL1g70yCPFxYHGuJkxXg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 461, + "comment" : "edge case for signature malleability", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a002207fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04af58a6ecc8254b9b831ae0441c13990802c3d68c301d43634c71f1974c09e704d920612d82f32fca436c5c5097505271494875402731d03dba942b355306c783", + "wx" : "00af58a6ecc8254b9b831ae0441c13990802c3d68c301d43634c71f1974c09e704", + "wy" : "00d920612d82f32fca436c5c5097505271494875402731d03dba942b355306c783" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004af58a6ecc8254b9b831ae0441c13990802c3d68c301d43634c71f1974c09e704d920612d82f32fca436c5c5097505271494875402731d03dba942b355306c783", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEr1im7MglS5uDGuBEHBOZCALD1owwHUNj\nTHHxl0wJ5wTZIGEtgvMvykNsXFCXUFJxSUh1QCcx0D26lCs1UwbHgw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 462, + "comment" : "edge case for signature malleability", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a002207fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "044a7217cabc95b496f3f4e12d54e9def7651b866be69d3695cd77ad2e3a3f13d1d0fa71bf21d2c00b1ff4cc76b53a9c5c2a8a8b6b4c2ec88b99ee537ac6262b3d", + "wx" : "4a7217cabc95b496f3f4e12d54e9def7651b866be69d3695cd77ad2e3a3f13d1", + "wy" : "00d0fa71bf21d2c00b1ff4cc76b53a9c5c2a8a8b6b4c2ec88b99ee537ac6262b3d" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200044a7217cabc95b496f3f4e12d54e9def7651b866be69d3695cd77ad2e3a3f13d1d0fa71bf21d2c00b1ff4cc76b53a9c5c2a8a8b6b4c2ec88b99ee537ac6262b3d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAESnIXyryVtJbz9OEtVOne92UbhmvmnTaV\nzXetLjo/E9HQ+nG/IdLACx/0zHa1OpxcKoqLa0wuyIuZ7lN6xiYrPQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 463, + "comment" : "u1 == 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0400a42e277ce657fb3dd07e135a3cb9b0a75a30bd8b64911606ee68371e56124467cf22e26a7009045b73ff19cd79851cceaad9ae72ef2d043d75365245befa06", + "wx" : "00a42e277ce657fb3dd07e135a3cb9b0a75a30bd8b64911606ee68371e561244", + "wy" : "67cf22e26a7009045b73ff19cd79851cceaad9ae72ef2d043d75365245befa06" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000400a42e277ce657fb3dd07e135a3cb9b0a75a30bd8b64911606ee68371e56124467cf22e26a7009045b73ff19cd79851cceaad9ae72ef2d043d75365245befa06", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEAKQuJ3zmV/s90H4TWjy5sKdaML2LZJEW\nBu5oNx5WEkRnzyLianAJBFtz/xnNeYUczqrZrnLvLQQ9dTZSRb76Bg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 464, + "comment" : "u1 == n - 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022100bc07ff041506dc73a75086a43252fb4270e157da75fb6cb92a9f07dcad153ec0", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "048520b9502f9a5ed753f09a5282cad721f5ebfb3db4142d667c6279869e76bcf1678e9bbd04a51460afc40a3e0cb7b0f8b8add89b2979758a5a1ffeb4584ee49e", + "wx" : "008520b9502f9a5ed753f09a5282cad721f5ebfb3db4142d667c6279869e76bcf1", + "wy" : "678e9bbd04a51460afc40a3e0cb7b0f8b8add89b2979758a5a1ffeb4584ee49e" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200048520b9502f9a5ed753f09a5282cad721f5ebfb3db4142d667c6279869e76bcf1678e9bbd04a51460afc40a3e0cb7b0f8b8add89b2979758a5a1ffeb4584ee49e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEhSC5UC+aXtdT8JpSgsrXIfXr+z20FC1m\nfGJ5hp52vPFnjpu9BKUUYK/ECj4Mt7D4uK3Ymyl5dYpaH/60WE7kng==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 465, + "comment" : "u2 == 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04b5deca0fe0296905aac27e3604a95a0a2ecbee9fc453d2e1164632964454d0c94f9e4e85a143ee677d40919c71014e8cabf4d9db7442fe4b96298f99f90ca67f", + "wx" : "00b5deca0fe0296905aac27e3604a95a0a2ecbee9fc453d2e1164632964454d0c9", + "wy" : "4f9e4e85a143ee677d40919c71014e8cabf4d9db7442fe4b96298f99f90ca67f" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004b5deca0fe0296905aac27e3604a95a0a2ecbee9fc453d2e1164632964454d0c94f9e4e85a143ee677d40919c71014e8cabf4d9db7442fe4b96298f99f90ca67f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEtd7KD+ApaQWqwn42BKlaCi7L7p/EU9Lh\nFkYylkRU0MlPnk6FoUPuZ31AkZxxAU6Mq/TZ23RC/kuWKY+Z+Qymfw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 466, + "comment" : "u2 == n - 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022100aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b89", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "045dcb2767dc851e20911ed7be39dd87ba81c7a6d10255dfb825f241486f98ae10f8a9ef736b3e11d7d54a0e086902fb477246ec8c57de65d336570b65f65e0d83", + "wx" : "5dcb2767dc851e20911ed7be39dd87ba81c7a6d10255dfb825f241486f98ae10", + "wy" : "00f8a9ef736b3e11d7d54a0e086902fb477246ec8c57de65d336570b65f65e0d83" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200045dcb2767dc851e20911ed7be39dd87ba81c7a6d10255dfb825f241486f98ae10f8a9ef736b3e11d7d54a0e086902fb477246ec8c57de65d336570b65f65e0d83", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEXcsnZ9yFHiCRHte+Od2HuoHHptECVd+4\nJfJBSG+YrhD4qe9zaz4R19VKDghpAvtHckbsjFfeZdM2Vwtl9l4Ngw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 467, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02206bfd55a94e530bd972e52873ef39ac3e56d420a64d874694c701e714511d1696", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04c8e144c853a7e1a6f5bbabe7ef91ef5b152113210d44fd58d3cb6185184e168aac40fb3618882193fc6d113760e476465df49067480a0a7cffe686515b3391a8", + "wx" : "00c8e144c853a7e1a6f5bbabe7ef91ef5b152113210d44fd58d3cb6185184e168a", + "wy" : "00ac40fb3618882193fc6d113760e476465df49067480a0a7cffe686515b3391a8" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004c8e144c853a7e1a6f5bbabe7ef91ef5b152113210d44fd58d3cb6185184e168aac40fb3618882193fc6d113760e476465df49067480a0a7cffe686515b3391a8", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEyOFEyFOn4ab1u6vn75HvWxUhEyENRP1Y\n08thhRhOFoqsQPs2GIghk/xtETdg5HZGXfSQZ0gKCnz/5oZRWzORqA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 468, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100b494bd67c209a5adb1c9a09337e2629b03f8a924be53c542478e5864ed2622ad", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "047ffe185a23eb5b736704387e6357628a65984985773b4473cf9ef560b3fa50514740cb1217f1ad2b5910d7f74906602b1f9550b3d11cff705b358c3bcbf72c3d", + "wx" : "7ffe185a23eb5b736704387e6357628a65984985773b4473cf9ef560b3fa5051", + "wy" : "4740cb1217f1ad2b5910d7f74906602b1f9550b3d11cff705b358c3bcbf72c3d" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200047ffe185a23eb5b736704387e6357628a65984985773b4473cf9ef560b3fa50514740cb1217f1ad2b5910d7f74906602b1f9550b3d11cff705b358c3bcbf72c3d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEf/4YWiPrW3NnBDh+Y1diimWYSYV3O0Rz\nz571YLP6UFFHQMsSF/GtK1kQ1/dJBmArH5VQs9Ec/3BbNYw7y/csPQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 469, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100aad4e2b69a9f378dae7873b40f7c15cb4565fcc8cbc0ec55b0bd3fe9d8626b2c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "048a858226155e34dbb7e5dac7f13127c81c6ce8c9d891918c67c8738d7e4b46e96c1386e84c612312de53e9e4af34d9bd57f93d9a06b855b6e0b06ad4137ff57c", + "wx" : "008a858226155e34dbb7e5dac7f13127c81c6ce8c9d891918c67c8738d7e4b46e9", + "wy" : "6c1386e84c612312de53e9e4af34d9bd57f93d9a06b855b6e0b06ad4137ff57c" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200048a858226155e34dbb7e5dac7f13127c81c6ce8c9d891918c67c8738d7e4b46e96c1386e84c612312de53e9e4af34d9bd57f93d9a06b855b6e0b06ad4137ff57c", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEioWCJhVeNNu35drH8TEnyBxs6MnYkZGM\nZ8hzjX5LRulsE4boTGEjEt5T6eSvNNm9V/k9mga4VbbgsGrUE3/1fA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 470, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022073fec4995e9d3140bc07ff041506dc7313e95389fb599d22f24039392a4014d3", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04aec0be729b02f266c542d139a3e04110c933e8eca1008e8dba38d75e7f8fab532cd688d924b456848bd5c651444c67a9399fdfb5b5b9693162c1728bfadc1046", + "wx" : "00aec0be729b02f266c542d139a3e04110c933e8eca1008e8dba38d75e7f8fab53", + "wy" : "2cd688d924b456848bd5c651444c67a9399fdfb5b5b9693162c1728bfadc1046" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004aec0be729b02f266c542d139a3e04110c933e8eca1008e8dba38d75e7f8fab532cd688d924b456848bd5c651444c67a9399fdfb5b5b9693162c1728bfadc1046", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAErsC+cpsC8mbFQtE5o+BBEMkz6OyhAI6N\nujjXXn+Pq1Ms1ojZJLRWhIvVxlFETGepOZ/ftbW5aTFiwXKL+twQRg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 471, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100ec4995e9d3140bc07ff041506dc73a73dc25f4257a911e310e38744b482a5a01", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0401ed4b5f941f443b31a7e2583ea165551d1815b54740deb12e9fdeff32e2306184385ca448cc5dd71139bda3ab42d0b6e44d719e52fff64d971876efa9109fb2", + "wx" : "01ed4b5f941f443b31a7e2583ea165551d1815b54740deb12e9fdeff32e23061", + "wy" : "0084385ca448cc5dd71139bda3ab42d0b6e44d719e52fff64d971876efa9109fb2" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000401ed4b5f941f443b31a7e2583ea165551d1815b54740deb12e9fdeff32e2306184385ca448cc5dd71139bda3ab42d0b6e44d719e52fff64d971876efa9109fb2", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEAe1LX5QfRDsxp+JYPqFlVR0YFbVHQN6x\nLp/e/zLiMGGEOFykSMxd1xE5vaOrQtC25E1xnlL/9k2XGHbvqRCfsg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 472, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100d8932bd3a6281780ffe082a0db8e74e8fd9d0b6445d99c265c9e8a09c01e72c1", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0459c427cb6525eab511a06e03e00cf2aab4abc587c2601534338a50bc25701a703e4eb388b453cbaea594d6b5c14a519ac3fda770c53580beefc68f09200d55ff", + "wx" : "59c427cb6525eab511a06e03e00cf2aab4abc587c2601534338a50bc25701a70", + "wy" : "3e4eb388b453cbaea594d6b5c14a519ac3fda770c53580beefc68f09200d55ff" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000459c427cb6525eab511a06e03e00cf2aab4abc587c2601534338a50bc25701a703e4eb388b453cbaea594d6b5c14a519ac3fda770c53580beefc68f09200d55ff", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEWcQny2Ul6rURoG4D4AzyqrSrxYfCYBU0\nM4pQvCVwGnA+TrOItFPLrqWU1rXBSlGaw/2ncMU1gL7vxo8JIA1V/w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 473, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02205e9d3140bc07ff041506dc73a75086a3ba176f06c2b6e37363e2ce1c141f3c27", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0404acbbcd23cf2ec819fd297ab2cb5407ede6319518651a391e941cc8003568331206dd00df23bc8ce0b85a018c4b34e9c3b41b4ef59c71492fa62d134772f97e", + "wx" : "04acbbcd23cf2ec819fd297ab2cb5407ede6319518651a391e941cc800356833", + "wy" : "1206dd00df23bc8ce0b85a018c4b34e9c3b41b4ef59c71492fa62d134772f97e" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000404acbbcd23cf2ec819fd297ab2cb5407ede6319518651a391e941cc8003568331206dd00df23bc8ce0b85a018c4b34e9c3b41b4ef59c71492fa62d134772f97e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEBKy7zSPPLsgZ/Sl6sstUB+3mMZUYZRo5\nHpQcyAA1aDMSBt0A3yO8jOC4WgGMSzTpw7QbTvWccUkvpi0TR3L5fg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 474, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100fd6dc71a71f1d50d1bbd976af4357be4dd2fe850707c431fd376e53d176c6b62", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04ccacbc626fd6ea31175815cff958ca1637323877d3bdf09896b527bf4e255e8571f8a27e6309bd9b9b15d78d5270012ad2ed15a7fffe024fc0eca63fb6ac2f8d", + "wx" : "00ccacbc626fd6ea31175815cff958ca1637323877d3bdf09896b527bf4e255e85", + "wy" : "71f8a27e6309bd9b9b15d78d5270012ad2ed15a7fffe024fc0eca63fb6ac2f8d" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004ccacbc626fd6ea31175815cff958ca1637323877d3bdf09896b527bf4e255e8571f8a27e6309bd9b9b15d78d5270012ad2ed15a7fffe024fc0eca63fb6ac2f8d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEzKy8Ym/W6jEXWBXP+VjKFjcyOHfTvfCY\nlrUnv04lXoVx+KJ+Ywm9m5sV141ScAEq0u0Vp//+Ak/A7KY/tqwvjQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 475, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02207ee75ad2a5801c54722eb7d95ba67febcfc399b956b7b682fe89638de3690bf1", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04ccc30b65cad3dd1d793b6db80f57b2e1237973e4264c3d9bbc2551ec68a0b7be75ff6d1f4f535a131aa573f6e2d6912c397154933750417d28e46524392592de", + "wx" : "00ccc30b65cad3dd1d793b6db80f57b2e1237973e4264c3d9bbc2551ec68a0b7be", + "wy" : "75ff6d1f4f535a131aa573f6e2d6912c397154933750417d28e46524392592de" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004ccc30b65cad3dd1d793b6db80f57b2e1237973e4264c3d9bbc2551ec68a0b7be75ff6d1f4f535a131aa573f6e2d6912c397154933750417d28e46524392592de", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEzMMLZcrT3R15O224D1ey4SN5c+QmTD2b\nvCVR7Gigt751/20fT1NaExqlc/bi1pEsOXFUkzdQQX0o5GUkOSWS3g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 476, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100f533776f11c47ed0a7b5e25ace7a3b921866733c7454b2c678b8943dfb4cf232", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04cc9349aca0cbd0b2df0deecd88ed39e6d8c7c3d7b422fd5d92431baf7225fcc0ed494be698d6f3850be277c268792400f396025cfa95cf56018bcbc243e512eb", + "wx" : "00cc9349aca0cbd0b2df0deecd88ed39e6d8c7c3d7b422fd5d92431baf7225fcc0", + "wy" : "00ed494be698d6f3850be277c268792400f396025cfa95cf56018bcbc243e512eb" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004cc9349aca0cbd0b2df0deecd88ed39e6d8c7c3d7b422fd5d92431baf7225fcc0ed494be698d6f3850be277c268792400f396025cfa95cf56018bcbc243e512eb", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEzJNJrKDL0LLfDe7NiO055tjHw9e0Iv1d\nkkMbr3Il/MDtSUvmmNbzhQvid8JoeSQA85YCXPqVz1YBi8vCQ+US6w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 477, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100e8dbffee01807d75f9aa52c295e15b15f138439e7a195a40709b1abf511dbc6a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04000e7c30d2f259f7c13f194320e43905d0ead7277e283e8918437c10f9d052b02b39b66dbba2b1cf5dac1b41d2dec6f1fb08bdd14d420d703986f63aedeb5c47", + "wx" : "0e7c30d2f259f7c13f194320e43905d0ead7277e283e8918437c10f9d052b0", + "wy" : "2b39b66dbba2b1cf5dac1b41d2dec6f1fb08bdd14d420d703986f63aedeb5c47" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004000e7c30d2f259f7c13f194320e43905d0ead7277e283e8918437c10f9d052b02b39b66dbba2b1cf5dac1b41d2dec6f1fb08bdd14d420d703986f63aedeb5c47", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEAA58MNLyWffBPxlDIOQ5BdDq1yd+KD6J\nGEN8EPnQUrArObZtu6Kxz12sG0HS3sbx+wi90U1CDXA5hvY67etcRw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 478, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100ca01552b58d67a13468d6bc6086329df8f44cc938884fcf15c516b02a7a7b5f6", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "048fa298c00ac93f7c36892c5299005a0f6843f9cf0669fdbb7d6d81e0341803ed4cab33cc2821b2da849f90ef20dc1eb896fc67161440b3c52c0b1e88627e508c", + "wx" : "008fa298c00ac93f7c36892c5299005a0f6843f9cf0669fdbb7d6d81e0341803ed", + "wy" : "4cab33cc2821b2da849f90ef20dc1eb896fc67161440b3c52c0b1e88627e508c" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200048fa298c00ac93f7c36892c5299005a0f6843f9cf0669fdbb7d6d81e0341803ed4cab33cc2821b2da849f90ef20dc1eb896fc67161440b3c52c0b1e88627e508c", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEj6KYwArJP3w2iSxSmQBaD2hD+c8Gaf27\nfW2B4DQYA+1MqzPMKCGy2oSfkO8g3B64lvxnFhRAs8UsCx6IYn5QjA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 479, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0221009402aa56b1acf4268d1ad78c10c653c063dabc4061c159a6f8d077787f192aab", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046fbf608a83e37ec26b37da033e069816680b770ba766fb8c44fce003960562f1045f268ccc5e0949213f7f2f1fa57cfead04625ec3ccfc9c333596e487b2056f", + "wx" : "6fbf608a83e37ec26b37da033e069816680b770ba766fb8c44fce003960562f1", + "wy" : "045f268ccc5e0949213f7f2f1fa57cfead04625ec3ccfc9c333596e487b2056f" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046fbf608a83e37ec26b37da033e069816680b770ba766fb8c44fce003960562f1045f268ccc5e0949213f7f2f1fa57cfead04625ec3ccfc9c333596e487b2056f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEb79gioPjfsJrN9oDPgaYFmgLdwunZvuM\nRPzgA5YFYvEEXyaMzF4JSSE/fy8fpXz+rQRiXsPM/JwzNZbkh7IFbw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 480, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02205e03ff820a836e39d3a8435219297da13870abed3afdb65c954f83ee568a9f60", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04c4dd547ad750174179bac8b8ce27481c58b81347776220a1b52ada13d65c8124f9c2ef3b5b4957cf69d3a139891682363c040610f200f4c318e59aa68f298af0", + "wx" : "00c4dd547ad750174179bac8b8ce27481c58b81347776220a1b52ada13d65c8124", + "wy" : "00f9c2ef3b5b4957cf69d3a139891682363c040610f200f4c318e59aa68f298af0" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004c4dd547ad750174179bac8b8ce27481c58b81347776220a1b52ada13d65c8124f9c2ef3b5b4957cf69d3a139891682363c040610f200f4c318e59aa68f298af0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAExN1UetdQF0F5usi4zidIHFi4E0d3YiCh\ntSraE9ZcgST5wu87W0lXz2nToTmJFoI2PAQGEPIA9MMY5ZqmjymK8A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 481, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0220556a715b4d4f9bc6d73c39da07be0ae5a2b2fe6465e0762ad85e9ff4ec313596", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0400055d79fb26286bb6289a7983a2b23bf5c30cc3d70363b559adf5548af991f8cae8b1b0ace32fd74a86ee1a671cc36c052a4796eae323be32e02ce9a0fb6227", + "wx" : "055d79fb26286bb6289a7983a2b23bf5c30cc3d70363b559adf5548af991f8", + "wy" : "00cae8b1b0ace32fd74a86ee1a671cc36c052a4796eae323be32e02ce9a0fb6227" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000400055d79fb26286bb6289a7983a2b23bf5c30cc3d70363b559adf5548af991f8cae8b1b0ace32fd74a86ee1a671cc36c052a4796eae323be32e02ce9a0fb6227", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEAAVdefsmKGu2KJp5g6KyO/XDDMPXA2O1\nWa31VIr5kfjK6LGwrOMv10qG7hpnHMNsBSpHlurjI74y4CzpoPtiJw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 482, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100d55555555555555555555555555555547c74934474db157d2a8c3f088aced62a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "040db51c74d34e41baba67c13a60af404ee82d8f1b0386b09696ee1e6ea1327b86413886c4623fc222a6950c3c3a09f3fd867a566bfd345e06b09ec6c5c2e4a192", + "wx" : "0db51c74d34e41baba67c13a60af404ee82d8f1b0386b09696ee1e6ea1327b86", + "wy" : "413886c4623fc222a6950c3c3a09f3fd867a566bfd345e06b09ec6c5c2e4a192" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200040db51c74d34e41baba67c13a60af404ee82d8f1b0386b09696ee1e6ea1327b86413886c4623fc222a6950c3c3a09f3fd867a566bfd345e06b09ec6c5c2e4a192", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEDbUcdNNOQbq6Z8E6YK9ATugtjxsDhrCW\nlu4ebqEye4ZBOIbEYj/CIqaVDDw6CfP9hnpWa/00XgawnsbFwuShkg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 483, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100c1777c8853938e536213c02464a936000ba1e21c0fc62075d46c624e23b52f31", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04bc2f7bc74cb3bc7e797b06cc3e649bf3407d1a55b4eaaddd28d3dcfaff2c3737a23bb364e16ac79398c013ce29a22e762c0d6067aaefda958474aad194a92e8a", + "wx" : "00bc2f7bc74cb3bc7e797b06cc3e649bf3407d1a55b4eaaddd28d3dcfaff2c3737", + "wy" : "00a23bb364e16ac79398c013ce29a22e762c0d6067aaefda958474aad194a92e8a" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004bc2f7bc74cb3bc7e797b06cc3e649bf3407d1a55b4eaaddd28d3dcfaff2c3737a23bb364e16ac79398c013ce29a22e762c0d6067aaefda958474aad194a92e8a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEvC97x0yzvH55ewbMPmSb80B9GlW06q3d\nKNPc+v8sNzeiO7Nk4WrHk5jAE84poi52LA1gZ6rv2pWEdKrRlKkuig==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 484, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022030bbb794db588363b40679f6c182a50d3ce9679acdd3ffbe36d7813dacbdc818", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04d7edc7c645efff6af8821aea5b7f969f56ef6e615862b08fba3eaf0111c06f67e47fd0da61682adcc405f329148bf1c35b89cb5ec5a9ed0d98a410e261a6b41a", + "wx" : "00d7edc7c645efff6af8821aea5b7f969f56ef6e615862b08fba3eaf0111c06f67", + "wy" : "00e47fd0da61682adcc405f329148bf1c35b89cb5ec5a9ed0d98a410e261a6b41a" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d7edc7c645efff6af8821aea5b7f969f56ef6e615862b08fba3eaf0111c06f67e47fd0da61682adcc405f329148bf1c35b89cb5ec5a9ed0d98a410e261a6b41a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE1+3HxkXv/2r4ghrqW3+Wn1bvbmFYYrCP\nuj6vARHAb2fkf9DaYWgq3MQF8ykUi/HDW4nLXsWp7Q2YpBDiYaa0Gg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 485, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202c37fd995622c4fb7fffffffffffffffc7cee745110cb45ab558ed7c90c15a2f", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046bfd7ad01b5dcfb04de464083d3ca7ef5054506111df92ef02ff7690d9a6ec9306c469fe4c5a1e04f114e193b4bb197de2c8e35089037e5a20275bcf67d9bf73", + "wx" : "6bfd7ad01b5dcfb04de464083d3ca7ef5054506111df92ef02ff7690d9a6ec93", + "wy" : "06c469fe4c5a1e04f114e193b4bb197de2c8e35089037e5a20275bcf67d9bf73" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046bfd7ad01b5dcfb04de464083d3ca7ef5054506111df92ef02ff7690d9a6ec9306c469fe4c5a1e04f114e193b4bb197de2c8e35089037e5a20275bcf67d9bf73", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEa/160Btdz7BN5GQIPTyn71BUUGER35Lv\nAv92kNmm7JMGxGn+TFoeBPEU4ZO0uxl94sjjUIkDflogJ1vPZ9m/cw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 486, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02207fd995622c4fb7ffffffffffffffffff5d883ffab5b32652ccdcaa290fccb97d", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "048a9076c923021d5c5ef85894176ebb5c3a74aba75b3944c96f17debc2173ba99e5601d115bf08d37ae115c4d186bc21127bbfb21d0629bde27a16e9ed721b740", + "wx" : "008a9076c923021d5c5ef85894176ebb5c3a74aba75b3944c96f17debc2173ba99", + "wy" : "00e5601d115bf08d37ae115c4d186bc21127bbfb21d0629bde27a16e9ed721b740" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200048a9076c923021d5c5ef85894176ebb5c3a74aba75b3944c96f17debc2173ba99e5601d115bf08d37ae115c4d186bc21127bbfb21d0629bde27a16e9ed721b740", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEipB2ySMCHVxe+FiUF267XDp0q6dbOUTJ\nbxfevCFzupnlYB0RW/CNN64RXE0Ya8IRJ7v7IdBim94noW6e1yG3QA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 487, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100ffb32ac4589f6ffffffffffffffffffebb107ff56b664ca599b954521f9972fa", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "040fec6a85e077ef4240b98c62ab3b93e2cebcad0ae9617f7b0471504db1f45a65245a5fd0ad7a6d854125ed76d4787f77cc1983eca8c6ba8c019523a088c4d0f3", + "wx" : "0fec6a85e077ef4240b98c62ab3b93e2cebcad0ae9617f7b0471504db1f45a65", + "wy" : "245a5fd0ad7a6d854125ed76d4787f77cc1983eca8c6ba8c019523a088c4d0f3" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200040fec6a85e077ef4240b98c62ab3b93e2cebcad0ae9617f7b0471504db1f45a65245a5fd0ad7a6d854125ed76d4787f77cc1983eca8c6ba8c019523a088c4d0f3", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAED+xqheB370JAuYxiqzuT4s68rQrpYX97\nBHFQTbH0WmUkWl/QrXpthUEl7XbUeH93zBmD7KjGuowBlSOgiMTQ8w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 488, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02205622c4fb7fffffffffffffffffffffff928a8f1c7ac7bec1808b9f61c01ec327", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04d3ab94d8704fb51774dcc3838ad9703071e0851de9b2d6ca74ccd79b855581914e4979b67f377419e5a9d4f03012b7e75656556f23756d4dbee145834c8279ef", + "wx" : "00d3ab94d8704fb51774dcc3838ad9703071e0851de9b2d6ca74ccd79b85558191", + "wy" : "4e4979b67f377419e5a9d4f03012b7e75656556f23756d4dbee145834c8279ef" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d3ab94d8704fb51774dcc3838ad9703071e0851de9b2d6ca74ccd79b855581914e4979b67f377419e5a9d4f03012b7e75656556f23756d4dbee145834c8279ef", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE06uU2HBPtRd03MODitlwMHHghR3pstbK\ndMzXm4VVgZFOSXm2fzd0GeWp1PAwErfnVlZVbyN1bU2+4UWDTIJ57w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 489, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022044104104104104104104104104104103b87853fd3b7d3f8e175125b4382f25ed", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0449e13cd44c8b8350a5eaca2181bf96db120b768bde8800f379f43e9198333c75030ad9fb4b0b233bdc10ca0dc4c2134b18b691e46c7151e3573aa2b62891e69d", + "wx" : "49e13cd44c8b8350a5eaca2181bf96db120b768bde8800f379f43e9198333c75", + "wy" : "030ad9fb4b0b233bdc10ca0dc4c2134b18b691e46c7151e3573aa2b62891e69d" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000449e13cd44c8b8350a5eaca2181bf96db120b768bde8800f379f43e9198333c75030ad9fb4b0b233bdc10ca0dc4c2134b18b691e46c7151e3573aa2b62891e69d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAESeE81EyLg1Cl6sohgb+W2xILdoveiADz\nefQ+kZgzPHUDCtn7SwsjO9wQyg3EwhNLGLaR5GxxUeNXOqK2KJHmnQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 490, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202739ce739ce739ce739ce739ce739ce705560298d1f2f08dc419ac273a5b54d9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "044574fd94ad03828588cb0bc2d434842ee093efe639015cc107d1ea3710f2112d1786d6ef1d411cbd1af5b5ee8845993e738fb64519b4329d04be21f7902a1c1d", + "wx" : "4574fd94ad03828588cb0bc2d434842ee093efe639015cc107d1ea3710f2112d", + "wy" : "1786d6ef1d411cbd1af5b5ee8845993e738fb64519b4329d04be21f7902a1c1d" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200044574fd94ad03828588cb0bc2d434842ee093efe639015cc107d1ea3710f2112d1786d6ef1d411cbd1af5b5ee8845993e738fb64519b4329d04be21f7902a1c1d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAERXT9lK0DgoWIywvC1DSELuCT7+Y5AVzB\nB9HqNxDyES0XhtbvHUEcvRr1te6IRZk+c4+2RRm0Mp0EviH3kCocHQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 491, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100b777777777777777777777777777777688e6a1fe808a97a348671222ff16b863", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04ee824d818768f13fa0eb908e396ea1c56b11774ce69d01e563aa36bb41d6371c990291ce2abc55bb6682d502ae0129e7c57e146e96d44757daaa1f94c93e0b17", + "wx" : "00ee824d818768f13fa0eb908e396ea1c56b11774ce69d01e563aa36bb41d6371c", + "wy" : "00990291ce2abc55bb6682d502ae0129e7c57e146e96d44757daaa1f94c93e0b17" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004ee824d818768f13fa0eb908e396ea1c56b11774ce69d01e563aa36bb41d6371c990291ce2abc55bb6682d502ae0129e7c57e146e96d44757daaa1f94c93e0b17", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE7oJNgYdo8T+g65COOW6hxWsRd0zmnQHl\nY6o2u0HWNxyZApHOKrxVu2aC1QKuASnnxX4UbpbUR1faqh+UyT4LFw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 492, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02206492492492492492492492492492492406dd3a19b8d5fb875235963c593bd2d3", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "044825ee46b2d21564726a32a922f5e3f2da6098f780e1f15c6bf1640669c41fe7292c066a24f0f450c2603f1837210898f8e80fa384aaf077eb5c7e87c6b26976", + "wx" : "4825ee46b2d21564726a32a922f5e3f2da6098f780e1f15c6bf1640669c41fe7", + "wy" : "292c066a24f0f450c2603f1837210898f8e80fa384aaf077eb5c7e87c6b26976" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200044825ee46b2d21564726a32a922f5e3f2da6098f780e1f15c6bf1640669c41fe7292c066a24f0f450c2603f1837210898f8e80fa384aaf077eb5c7e87c6b26976", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAESCXuRrLSFWRyajKpIvXj8tpgmPeA4fFc\na/FkBmnEH+cpLAZqJPD0UMJgPxg3IQiY+OgPo4Sq8HfrXH6HxrJpdg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 493, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100955555555555555555555555555555547c74934474db157d2a8c3f088aced62c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0441348e7ac18eb1f4852801467bb0a0e36209321a8af4b410fd06f070a81f5de603b5594f1a5a79d23089e49e3e379f2a6cb14f92301c6999e510b8c8dc37fb4b", + "wx" : "41348e7ac18eb1f4852801467bb0a0e36209321a8af4b410fd06f070a81f5de6", + "wy" : "03b5594f1a5a79d23089e49e3e379f2a6cb14f92301c6999e510b8c8dc37fb4b" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000441348e7ac18eb1f4852801467bb0a0e36209321a8af4b410fd06f070a81f5de603b5594f1a5a79d23089e49e3e379f2a6cb14f92301c6999e510b8c8dc37fb4b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEQTSOesGOsfSFKAFGe7Cg42IJMhqK9LQQ\n/QbwcKgfXeYDtVlPGlp50jCJ5J4+N58qbLFPkjAcaZnlELjI3Df7Sw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 494, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3e3a49a23a6d8abe95461f8445676b17", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04753c74e5a36e1a4b61be7787202c98e05841fea2b0392b6ab69ee2e8a747e2b618971da1c85825c1d8141886115d27cb2add86545e6971bb835a2f452cde1e52", + "wx" : "753c74e5a36e1a4b61be7787202c98e05841fea2b0392b6ab69ee2e8a747e2b6", + "wy" : "18971da1c85825c1d8141886115d27cb2add86545e6971bb835a2f452cde1e52" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004753c74e5a36e1a4b61be7787202c98e05841fea2b0392b6ab69ee2e8a747e2b618971da1c85825c1d8141886115d27cb2add86545e6971bb835a2f452cde1e52", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEdTx05aNuGkthvneHICyY4FhB/qKwOStq\ntp7i6KdH4rYYlx2hyFglwdgUGIYRXSfLKt2GVF5pcbuDWi9FLN4eUg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 495, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100bffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364143", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0449c0254724576b0949827ce46240d90cb4075cd1978a416495a455f06a895504df7d64c35853353bd4d905da6adb88f26e62a5f20b3cd6382adf2c5a42d85053", + "wx" : "49c0254724576b0949827ce46240d90cb4075cd1978a416495a455f06a895504", + "wy" : "00df7d64c35853353bd4d905da6adb88f26e62a5f20b3cd6382adf2c5a42d85053" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000449c0254724576b0949827ce46240d90cb4075cd1978a416495a455f06a895504df7d64c35853353bd4d905da6adb88f26e62a5f20b3cd6382adf2c5a42d85053", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEScAlRyRXawlJgnzkYkDZDLQHXNGXikFk\nlaRV8GqJVQTffWTDWFM1O9TZBdpq24jybmKl8gs81jgq3yxaQthQUw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 496, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0220185ddbca6dac41b1da033cfb60c152869e74b3cd66e9ffdf1b6bc09ed65ee40c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04b05e98e84e2c19743c1dcf4e0ddf0bb1f32854033de63fcf3e605fbb2ed94cb1871d7415d5f6c57c840678f7e1a1c1e323519a4647fb3f6f52abb4647b9b6d70", + "wx" : "00b05e98e84e2c19743c1dcf4e0ddf0bb1f32854033de63fcf3e605fbb2ed94cb1", + "wy" : "00871d7415d5f6c57c840678f7e1a1c1e323519a4647fb3f6f52abb4647b9b6d70" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004b05e98e84e2c19743c1dcf4e0ddf0bb1f32854033de63fcf3e605fbb2ed94cb1871d7415d5f6c57c840678f7e1a1c1e323519a4647fb3f6f52abb4647b9b6d70", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEsF6Y6E4sGXQ8Hc9ODd8LsfMoVAM95j/P\nPmBfuy7ZTLGHHXQV1fbFfIQGePfhocHjI1GaRkf7P29Sq7Rke5ttcA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 497, + "comment" : "point duplication during verification", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3044022032b0d10d8d0e04bc8d4d064d270699e87cffc9b49c5c20730e1c26f6105ddcda02206fd848306e968e3ac1f6e443577c47a3c20bf0d01a5dc39c78c2c69d681850f4", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04b05e98e84e2c19743c1dcf4e0ddf0bb1f32854033de63fcf3e605fbb2ed94cb178e28bea2a093a837bf987081e5e3e1cdcae65b9b804c090ad544b9a84648ebf", + "wx" : "00b05e98e84e2c19743c1dcf4e0ddf0bb1f32854033de63fcf3e605fbb2ed94cb1", + "wy" : "78e28bea2a093a837bf987081e5e3e1cdcae65b9b804c090ad544b9a84648ebf" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004b05e98e84e2c19743c1dcf4e0ddf0bb1f32854033de63fcf3e605fbb2ed94cb178e28bea2a093a837bf987081e5e3e1cdcae65b9b804c090ad544b9a84648ebf", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEsF6Y6E4sGXQ8Hc9ODd8LsfMoVAM95j/P\nPmBfuy7ZTLF44ovqKgk6g3v5hwgeXj4c3K5lubgEwJCtVEuahGSOvw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 498, + "comment" : "duplication bug", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3044022032b0d10d8d0e04bc8d4d064d270699e87cffc9b49c5c20730e1c26f6105ddcda02206fd848306e968e3ac1f6e443577c47a3c20bf0d01a5dc39c78c2c69d681850f4", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04a49f9ebc082c064d61c0eab5f8bf23207b06e3a689dfc4fa2896ed114d1a88ab55783a6baf9401977d117ccb748c0d5c24a5d3bd2133d62c74de2be7cc7d9d40", + "wx" : "00a49f9ebc082c064d61c0eab5f8bf23207b06e3a689dfc4fa2896ed114d1a88ab", + "wy" : "55783a6baf9401977d117ccb748c0d5c24a5d3bd2133d62c74de2be7cc7d9d40" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004a49f9ebc082c064d61c0eab5f8bf23207b06e3a689dfc4fa2896ed114d1a88ab55783a6baf9401977d117ccb748c0d5c24a5d3bd2133d62c74de2be7cc7d9d40", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEpJ+evAgsBk1hwOq1+L8jIHsG46aJ38T6\nKJbtEU0aiKtVeDprr5QBl30RfMt0jA1cJKXTvSEz1ix03ivnzH2dQA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 499, + "comment" : "comparison with point at infinity ", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0022033333333333333333333333333333332f222f8faefdb533f265d461c29a47373", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04f9567a431b716388428510393b37feefd3afcfc6dc3881f623c0a0995e461ec3fba2f910ced19f8e789b158390a295e636c588c622d54f8feffbd2852e2911a9", + "wx" : "00f9567a431b716388428510393b37feefd3afcfc6dc3881f623c0a0995e461ec3", + "wy" : "00fba2f910ced19f8e789b158390a295e636c588c622d54f8feffbd2852e2911a9" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004f9567a431b716388428510393b37feefd3afcfc6dc3881f623c0a0995e461ec3fba2f910ced19f8e789b158390a295e636c588c622d54f8feffbd2852e2911a9", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE+VZ6QxtxY4hChRA5Ozf+79Ovz8bcOIH2\nI8CgmV5GHsP7ovkQztGfjnibFYOQopXmNsWIxiLVT4/v+9KFLikRqQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 500, + "comment" : "extreme value for k and edgecase s", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0426095ef93b10bf50fe283f4c99136fb81fa297814f09977e8e38a3bfb837f61baf8d7cfc46c1928624f201ed14a70701bc5531bff4e2e578d5c92dabddbc7580", + "wx" : "26095ef93b10bf50fe283f4c99136fb81fa297814f09977e8e38a3bfb837f61b", + "wy" : "00af8d7cfc46c1928624f201ed14a70701bc5531bff4e2e578d5c92dabddbc7580" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000426095ef93b10bf50fe283f4c99136fb81fa297814f09977e8e38a3bfb837f61baf8d7cfc46c1928624f201ed14a70701bc5531bff4e2e578d5c92dabddbc7580", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEJgle+TsQv1D+KD9MmRNvuB+il4FPCZd+\njjijv7g39huvjXz8RsGShiTyAe0UpwcBvFUxv/Ti5XjVyS2r3bx1gA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 501, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3046022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022100b6db6db6db6db6db6db6db6db6db6db5f30f30127d33e02aad96438927022e9c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "047a4b58ee76d461a1c3cde68400a0bbeeab346ee69315bed63f1700c66cf5e6cca642ae4078bb6bbbb76028977882e9c8374f267a2ced131029ae89560ce29825", + "wx" : "7a4b58ee76d461a1c3cde68400a0bbeeab346ee69315bed63f1700c66cf5e6cc", + "wy" : "00a642ae4078bb6bbbb76028977882e9c8374f267a2ced131029ae89560ce29825" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200047a4b58ee76d461a1c3cde68400a0bbeeab346ee69315bed63f1700c66cf5e6cca642ae4078bb6bbbb76028977882e9c8374f267a2ced131029ae89560ce29825", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEektY7nbUYaHDzeaEAKC77qs0buaTFb7W\nPxcAxmz15symQq5AeLtru7dgKJd4gunIN08meiztExAprolWDOKYJQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 502, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3046022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee502210099999999999999999999999999999998d668eaf0cf91f9bd7317d2547ced5a5a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04f2a111eb24c9d280d9a66e4ff18681d222dd6a1828ebc4528f2bebe3e25228a1a0699bcec507fd0ec83da541a5a6143e2e68e4af72fcdcc8a2aea2b17478cc8a", + "wx" : "00f2a111eb24c9d280d9a66e4ff18681d222dd6a1828ebc4528f2bebe3e25228a1", + "wy" : "00a0699bcec507fd0ec83da541a5a6143e2e68e4af72fcdcc8a2aea2b17478cc8a" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004f2a111eb24c9d280d9a66e4ff18681d222dd6a1828ebc4528f2bebe3e25228a1a0699bcec507fd0ec83da541a5a6143e2e68e4af72fcdcc8a2aea2b17478cc8a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE8qER6yTJ0oDZpm5P8YaB0iLdahgo68RS\njyvr4+JSKKGgaZvOxQf9Dsg9pUGlphQ+Lmjkr3L83MiirqKxdHjMig==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 503, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022066666666666666666666666666666665e445f1f5dfb6a67e4cba8c385348e6e7", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04e50054b3e4a4d1fef988e5a5e830155abc293fea3598af4c5ddaa10acd111274eb710d1834568cb379a1d1f3d691a8c0dc19f901fe3225c2b6691df5ef5333fe", + "wx" : "00e50054b3e4a4d1fef988e5a5e830155abc293fea3598af4c5ddaa10acd111274", + "wy" : "00eb710d1834568cb379a1d1f3d691a8c0dc19f901fe3225c2b6691df5ef5333fe" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004e50054b3e4a4d1fef988e5a5e830155abc293fea3598af4c5ddaa10acd111274eb710d1834568cb379a1d1f3d691a8c0dc19f901fe3225c2b6691df5ef5333fe", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE5QBUs+Sk0f75iOWl6DAVWrwpP+o1mK9M\nXdqhCs0REnTrcQ0YNFaMs3mh0fPWkajA3Bn5Af4yJcK2aR3171Mz/g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 504, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022049249249249249249249249249249248c79facd43214c011123c1b03a93412a5", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04edc17cd4ca6f9988fda5af4042e3f9eb42d0f7b6a1c0156e1a2af566b78103548a5d357777b306e96405f12e2617c1b29e8d574e5f6d66d1bc8ff7ea7c4b683c", + "wx" : "00edc17cd4ca6f9988fda5af4042e3f9eb42d0f7b6a1c0156e1a2af566b7810354", + "wy" : "008a5d357777b306e96405f12e2617c1b29e8d574e5f6d66d1bc8ff7ea7c4b683c" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004edc17cd4ca6f9988fda5af4042e3f9eb42d0f7b6a1c0156e1a2af566b78103548a5d357777b306e96405f12e2617c1b29e8d574e5f6d66d1bc8ff7ea7c4b683c", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE7cF81MpvmYj9pa9AQuP560LQ97ahwBVu\nGir1ZreBA1SKXTV3d7MG6WQF8S4mF8Gyno1XTl9tZtG8j/fqfEtoPA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 505, + "comment" : "extreme value for k", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee502200eb10e5ab95f2f275348d82ad2e4d7949c8193800d8c9c75df58e343f0ebba7b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046d267c10d2315b42dbaf34c97c3c0d331fabacaf6021df4dc85b3e9e63dc0798ed154b11fa3a5ed952c14d8a2dd242de2b6cce3c22df42cd97de30054a19555e", + "wx" : "6d267c10d2315b42dbaf34c97c3c0d331fabacaf6021df4dc85b3e9e63dc0798", + "wy" : "00ed154b11fa3a5ed952c14d8a2dd242de2b6cce3c22df42cd97de30054a19555e" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046d267c10d2315b42dbaf34c97c3c0d331fabacaf6021df4dc85b3e9e63dc0798ed154b11fa3a5ed952c14d8a2dd242de2b6cce3c22df42cd97de30054a19555e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEbSZ8ENIxW0LbrzTJfDwNMx+rrK9gId9N\nyFs+nmPcB5jtFUsR+jpe2VLBTYot0kLeK2zOPCLfQs2X3jAFShlVXg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 506, + "comment" : "extreme value for k and edgecase s", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04c24bf7a984c96ece10077a9def38cbd0d898abd555f1668e06c27cabc00f6f679f69b238e1f95e99e5b558e0036273ebd6c36d12b4515348b85a21f6283f5016", + "wx" : "00c24bf7a984c96ece10077a9def38cbd0d898abd555f1668e06c27cabc00f6f67", + "wy" : "009f69b238e1f95e99e5b558e0036273ebd6c36d12b4515348b85a21f6283f5016" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004c24bf7a984c96ece10077a9def38cbd0d898abd555f1668e06c27cabc00f6f679f69b238e1f95e99e5b558e0036273ebd6c36d12b4515348b85a21f6283f5016", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEwkv3qYTJbs4QB3qd7zjL0NiYq9VV8WaO\nBsJ8q8APb2efabI44flemeW1WOADYnPr1sNtErRRU0i4WiH2KD9QFg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 507, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022100b6db6db6db6db6db6db6db6db6db6db5f30f30127d33e02aad96438927022e9c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "041cd26d668807c815ed3f532c1db81ac473fb368f0f7ef1aff2592ea6fa6c4624a229b9ab5746cfbc47280c019a4248545354ca20880ff41cac2e252bc9b49704", + "wx" : "1cd26d668807c815ed3f532c1db81ac473fb368f0f7ef1aff2592ea6fa6c4624", + "wy" : "00a229b9ab5746cfbc47280c019a4248545354ca20880ff41cac2e252bc9b49704" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200041cd26d668807c815ed3f532c1db81ac473fb368f0f7ef1aff2592ea6fa6c4624a229b9ab5746cfbc47280c019a4248545354ca20880ff41cac2e252bc9b49704", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEHNJtZogHyBXtP1MsHbgaxHP7No8PfvGv\n8lkupvpsRiSiKbmrV0bPvEcoDAGaQkhUU1TKIIgP9BysLiUrybSXBA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 508, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802210099999999999999999999999999999998d668eaf0cf91f9bd7317d2547ced5a5a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04fc780777a3289af663fa02b1c262a8373b84614e659c1ab46942f1e058926ff82196c6bcae0b2798298d463be5c87924343d7f103a27131e0c7f4d60d2b5da8c", + "wx" : "00fc780777a3289af663fa02b1c262a8373b84614e659c1ab46942f1e058926ff8", + "wy" : "2196c6bcae0b2798298d463be5c87924343d7f103a27131e0c7f4d60d2b5da8c" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004fc780777a3289af663fa02b1c262a8373b84614e659c1ab46942f1e058926ff82196c6bcae0b2798298d463be5c87924343d7f103a27131e0c7f4d60d2b5da8c", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE/HgHd6MomvZj+gKxwmKoNzuEYU5lnBq0\naULx4FiSb/ghlsa8rgsnmCmNRjvlyHkkND1/EDonEx4Mf01g0rXajA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 509, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022066666666666666666666666666666665e445f1f5dfb6a67e4cba8c385348e6e7", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "045e25e2ee8af5ef8a3e0908341f9884501fb58a2fd234b1db6f22d561025524f4491d97a7793c9d9a1f35bb35f12121b9dbe075d8501cbd4db6697e3e0ad98bc0", + "wx" : "5e25e2ee8af5ef8a3e0908341f9884501fb58a2fd234b1db6f22d561025524f4", + "wy" : "491d97a7793c9d9a1f35bb35f12121b9dbe075d8501cbd4db6697e3e0ad98bc0" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200045e25e2ee8af5ef8a3e0908341f9884501fb58a2fd234b1db6f22d561025524f4491d97a7793c9d9a1f35bb35f12121b9dbe075d8501cbd4db6697e3e0ad98bc0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEXiXi7or174o+CQg0H5iEUB+1ii/SNLHb\nbyLVYQJVJPRJHZeneTydmh81uzXxISG52+B12FAcvU22aX4+CtmLwA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 510, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022049249249249249249249249249249248c79facd43214c011123c1b03a93412a5", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "043ddf2920607df596da90123ea5674958054c8ed7758661b813f1aa30f19778b0707243e1a7bcc264b54289832e950c27563856241b79c243d0fc54f7ad24bc25", + "wx" : "3ddf2920607df596da90123ea5674958054c8ed7758661b813f1aa30f19778b0", + "wy" : "707243e1a7bcc264b54289832e950c27563856241b79c243d0fc54f7ad24bc25" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200043ddf2920607df596da90123ea5674958054c8ed7758661b813f1aa30f19778b0707243e1a7bcc264b54289832e950c27563856241b79c243d0fc54f7ad24bc25", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEPd8pIGB99ZbakBI+pWdJWAVMjtd1hmG4\nE/GqMPGXeLBwckPhp7zCZLVCiYMulQwnVjhWJBt5wkPQ/FT3rSS8JQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 511, + "comment" : "extreme value for k", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802200eb10e5ab95f2f275348d82ad2e4d7949c8193800d8c9c75df58e343f0ebba7b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", + "wx" : "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", + "wy" : "483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEeb5mfvncu6xVoGKVzocLBwKb/NstzijZ\nWfKBWxb4F5hIOtp3JqPEZV2k+/wOEQio/Re0SKaFVBmcR9CP+xDUuA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 512, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3044022043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b02321028102202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952", + "result" : "invalid" + }, + { + "tcId" : 513, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3045022100bc07ff041506dc73a75086a43252fb4270e157da75fb6cb92a9f07dcad153ec002202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777", + "wx" : "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", + "wy" : "00b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEeb5mfvncu6xVoGKVzocLBwKb/NstzijZ\nWfKBWxb4F5i3xSWI2Vw7mqJbBAPx7vdXAuhLt1l6q+ZjuC9vBO8ndw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 514, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3044022043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b02321028102202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952", + "result" : "invalid" + }, + { + "tcId" : 515, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3045022100bc07ff041506dc73a75086a43252fb4270e157da75fb6cb92a9f07dcad153ec002202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff00000001060492d5a5673e0f25d8d50fb7e58c49d86d46d4216955e0aa3d40e1", + "wx" : "6e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff", + "wy" : "01060492d5a5673e0f25d8d50fb7e58c49d86d46d4216955e0aa3d40e1" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff00000001060492d5a5673e0f25d8d50fb7e58c49d86d46d4216955e0aa3d40e1", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEboI1VUUpFAmRgsaywdbwtdKNUMzQBa8s\n4bulQapAyv8AAAABBgSS1aVnPg8l2NUPt+WMSdhtRtQhaVXgqj1A4Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 516, + "comment" : "y-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304402202b9c9f85596fed708b3af80393b27edfd0b5ae2f0074270a56362f5f9f62b4e102202fae837503ba2c1d4c945e0913949ef094ce0b8086359bbb5dba4a12707c5600", + "result" : "valid" + }, + { + "tcId" : 517, + "comment" : "y-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304402205cd765209021d8c1a8aef4ff61d6fa6e7993bf9fea0b93609eea130de536fccc02204f10c7989587fe3019e36d85aa024bf20db6737c4f28900c1c9662f2782143e0", + "result" : "valid" + }, + { + "tcId" : 518, + "comment" : "y-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502204c1a59b1e578d76f1595e13b557057559f26ab559ec1df3f45ec98b90fa526ce022100c6872f094bdb3f82e31f93ad65357e2daafe66f304af197089ef0dc94ff90624", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40cafffffffffef9fb6d2a5a98c1f0da272af0481a73b62792b92bde96aa1e55c2bb4e", + "wx" : "6e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff", + "wy" : "00fffffffef9fb6d2a5a98c1f0da272af0481a73b62792b92bde96aa1e55c2bb4e" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40cafffffffffef9fb6d2a5a98c1f0da272af0481a73b62792b92bde96aa1e55c2bb4e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEboI1VUUpFAmRgsaywdbwtdKNUMzQBa8s\n4bulQapAyv/////++fttKlqYwfDaJyrwSBpztieSuSvelqoeVcK7Tg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 519, + "comment" : "y-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100a35d1400d4cc7a8f617b721faee7118a74103c4630dec5aa47e097951dafc1a7022100958221023024e97ef6df35a22e820c7bc5e16299f3f12e9d9b1b727c46d795e6", + "result" : "valid" + }, + { + "tcId" : 520, + "comment" : "y-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304402207fb733ed73c72fc4f4cf065e370c730301316ff4e9c6a8a701170f604c2d70b702207ca9ca985d3df48978b3a2f9c0bb8a58b216c795e687f74623a3321448bfa73c", + "result" : "valid" + }, + { + "tcId" : 521, + "comment" : "y-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502210095ae4df2fba8524e1151cb9a9c5c1ec1357a663722a18329303d86a58e7047540220591ea644b1dc6f4c7cd5d7d939397f84d9e077100760f0816ae5b22ae6a74203", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04000000013fd22248d64d95f73c29b48ab48631850be503fd00f8468b5f0f70e0f6ee7aa43bc2c6fd25b1d8269241cbdd9dbb0dac96dc96231f430705f838717d", + "wx" : "013fd22248d64d95f73c29b48ab48631850be503fd00f8468b5f0f70e0", + "wy" : "00f6ee7aa43bc2c6fd25b1d8269241cbdd9dbb0dac96dc96231f430705f838717d" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004000000013fd22248d64d95f73c29b48ab48631850be503fd00f8468b5f0f70e0f6ee7aa43bc2c6fd25b1d8269241cbdd9dbb0dac96dc96231f430705f838717d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEAAAAAT/SIkjWTZX3PCm0irSGMYUL5QP9\nAPhGi18PcOD27nqkO8LG/SWx2CaSQcvdnbsNrJbcliMfQwcF+DhxfQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 522, + "comment" : "x-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30440220717925f0dd5cf45e746e87f79c9ea97d11eb01444052c270aeccef56c2e958280220785787b664137080383d2fc500459fa713258205fdae97b3240fb64bb638a657", + "result" : "valid" + }, + { + "tcId" : 523, + "comment" : "x-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30460221008adfdeae3b586315d06183610d271fc423cc789908b8f5dc563253a3c782510a0221008137bedbb4e60da26041b351f72a6bc3b7741f745743f0733b40b7fc56febd04", + "result" : "valid" + }, + { + "tcId" : 524, + "comment" : "x-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502210092ded14e19b94d17c79b063a034b122ce3b93a2502f2f223fad3461abf631632022052ff8ad14ba3657242e29440d01cab36ebb6033ee36021dc8d9b38f0808a90bc", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0425afd689acabaed67c1f296de59406f8c550f57146a0b4ec2c97876dfffffffffa46a76e520322dfbc491ec4f0cc197420fc4ea5883d8f6dd53c354bc4f67c35", + "wx" : "25afd689acabaed67c1f296de59406f8c550f57146a0b4ec2c97876dffffffff", + "wy" : "00fa46a76e520322dfbc491ec4f0cc197420fc4ea5883d8f6dd53c354bc4f67c35" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000425afd689acabaed67c1f296de59406f8c550f57146a0b4ec2c97876dfffffffffa46a76e520322dfbc491ec4f0cc197420fc4ea5883d8f6dd53c354bc4f67c35", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEJa/WiayrrtZ8Hylt5ZQG+MVQ9XFGoLTs\nLJeHbf/////6RqduUgMi37xJHsTwzBl0IPxOpYg9j23VPDVLxPZ8NQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 525, + "comment" : "x-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100d48373483e0fa2f11cfdfaea6f1de59e6861e9e87c4f6446602ba0125ab7de460221009d753bba3a7be08aab456e93a6500d4781795ed59af8bd6d6133129abef1ad98", + "result" : "valid" + }, + { + "tcId" : 526, + "comment" : "x-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100f11473117b66e5d84a2ecd0f8b7ec4a2cc2aee89ae022020235777305142f498022100fe5ce43ced28f3f69f65e810678afefd2bdeefb051280ad2880157fda28b2ab1", + "result" : "valid" + }, + { + "tcId" : 527, + "comment" : "x-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502203c9f5bdde7310b5696c93c86203fc97e11a70739e20c71c9e722308d45a59e6c022100c09efb9a045a47cce799b768890bb17833a0210d869a36be1da33f2585477c32", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04d12e6c66b67734c3c84d2601cf5d35dc097e27637f0aca4a4fdb74b6aadd3bb93f5bdff88bd5736df898e699006ed750f11cf07c5866cd7ad70c7121ffffffff", + "wx" : "00d12e6c66b67734c3c84d2601cf5d35dc097e27637f0aca4a4fdb74b6aadd3bb9", + "wy" : "3f5bdff88bd5736df898e699006ed750f11cf07c5866cd7ad70c7121ffffffff" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d12e6c66b67734c3c84d2601cf5d35dc097e27637f0aca4a4fdb74b6aadd3bb93f5bdff88bd5736df898e699006ed750f11cf07c5866cd7ad70c7121ffffffff", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE0S5sZrZ3NMPITSYBz1013Al+J2N/CspK\nT9t0tqrdO7k/W9/4i9VzbfiY5pkAbtdQ8RzwfFhmzXrXDHEh/////w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 528, + "comment" : "y-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304402206953442c487f240487d2af81f9825c894b1fc2534321fa012db8248be20a4b06022056927395d64ce4d690caa98944c2ddebc312f57f439d37236ea63cc1de098718", + "result" : "valid" + }, + { + "tcId" : 529, + "comment" : "y-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100fb39aa5f36ceca6e68d1932e811598c412892734dade389fd9e8ba94c5c7a251022100fdddf0c3db66c7c46608ac98431f0ee8ebb1e27ba501937789ebcd0f7ac26ecc", + "result" : "valid" + }, + { + "tcId" : 530, + "comment" : "y-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3044022044fef6017638fd5bda17dfce346b0311b5e369bfb68aa85d5e970786b8e6644b0220720b3a52fe44be6028759f0f1a6fd7020ff6792cd4ece98dffd0d97d3b726091", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046d4a7f60d4774a4f0aa8bbdedb953c7eea7909407e3164755664bc2800000000e659d34e4df38d9e8c9eaadfba36612c769195be86c77aac3f36e78b538680fb", + "wx" : "6d4a7f60d4774a4f0aa8bbdedb953c7eea7909407e3164755664bc2800000000", + "wy" : "00e659d34e4df38d9e8c9eaadfba36612c769195be86c77aac3f36e78b538680fb" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046d4a7f60d4774a4f0aa8bbdedb953c7eea7909407e3164755664bc2800000000e659d34e4df38d9e8c9eaadfba36612c769195be86c77aac3f36e78b538680fb", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEbUp/YNR3Sk8KqLve25U8fup5CUB+MWR1\nVmS8KAAAAADmWdNOTfONnoyeqt+6NmEsdpGVvobHeqw/NueLU4aA+w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA-512", + "tests" : [ + { + "tcId" : 531, + "comment" : "x-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30430220304babc41346e6205cf03e2d0b26e4b222dce8227402d001ba233efa69c91234021f65add3279f51b2417fb0a13b0f06404199caac3430385513ee49f67d8e8cdf", + "result" : "valid" + }, + { + "tcId" : 532, + "comment" : "x-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3044022023868700b71fbafcaa73960faf922ee0458ef69e01fb060b2f9a80d992fe114c02206ec1526bd56f6eebf10463bd9210d62510b95166365e10a7b7abfc4d584ca338", + "result" : "valid" + }, + { + "tcId" : 533, + "comment" : "x-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100dd60d7cf83a08208637212b65d079fb658d8ef1b8438d9c58f4122b0cd14ac49022100f1d762516f4d6c3e6a98dd31dc3869dc7cf35944f33b35c6a17fe632d2b18cd5", + "result" : "valid" + } + ] + } + ] +} diff --git a/packages/crypto/tests/wycheproof_secp256k1.rs b/packages/crypto/tests/wycheproof_secp256k1.rs new file mode 100644 index 0000000000..352c65f6ed --- /dev/null +++ b/packages/crypto/tests/wycheproof_secp256k1.rs @@ -0,0 +1,288 @@ +#![allow(clippy::single_match)] // Only needed for old clippy (e.g. 1.70.0) + +use cosmwasm_crypto::secp256k1_verify; +use serde::Deserialize; +use sha2::{Digest, Sha256, Sha512}; + +// In repo root +// curl -sS -L https://github.com/google/wycheproof/raw/master/testvectors_v1/ecdsa_secp256k1_sha256_test.json > packages/crypto/testdata/wycheproof/ecdsa_secp256k1_sha256_test.json +// curl -sS -L https://github.com/google/wycheproof/raw/master/testvectors_v1/ecdsa_secp256k1_sha512_test.json > packages/crypto/testdata/wycheproof/ecdsa_secp256k1_sha512_test.json + +const SECP256K1_SHA256: &str = "./testdata/wycheproof/ecdsa_secp256k1_sha256_test.json"; +const SECP256K1_SHA512: &str = "./testdata/wycheproof/ecdsa_secp256k1_sha512_test.json"; + +#[derive(Deserialize, Debug)] +#[serde(rename_all = "camelCase")] +struct File { + number_of_tests: usize, + test_groups: Vec, +} + +#[derive(Deserialize, Debug)] +#[serde(rename_all = "camelCase")] +struct TestGroup { + public_key: Key, + tests: Vec, +} + +#[derive(Deserialize, Debug)] +#[serde(rename_all = "camelCase")] +struct Key { + uncompressed: String, +} + +#[derive(Deserialize, Debug)] +#[serde(rename_all = "camelCase")] +struct TestCase { + tc_id: u32, + msg: String, + sig: String, + // "acceptable", "valid" or "invalid" + result: String, +} + +fn read_file(path: &str) -> File { + use std::fs::File; + use std::io::BufReader; + + // Open the file in read-only mode with buffer. + let file = File::open(path).unwrap(); + let reader = BufReader::new(file); + + serde_json::from_reader(reader).unwrap() +} + +#[test] +fn test_ecdsa_secp256k1_sha256() { + let mut tested: usize = 0; + let File { + number_of_tests, + test_groups, + } = read_file(SECP256K1_SHA256); + assert_eq!(number_of_tests, 463); + + for group in test_groups { + let public_key = hex::decode(group.public_key.uncompressed).unwrap(); + assert_eq!(public_key.len(), 65); + + for tc in group.tests { + tested += 1; + assert_eq!(tc.tc_id as usize, tested); + // eprintln!("Test case ID: {}", tc.tc_id); + + match tc.result.as_str() { + "valid" | "acceptable" => { + let message = hex::decode(tc.msg).unwrap(); + let message_hash: [u8; 32] = Sha256::digest(message).into(); + let der_signature = hex::decode(tc.sig).unwrap(); + let signature = from_der(&der_signature).unwrap(); + let valid = secp256k1_verify(&message_hash, &signature, &public_key).unwrap(); + assert!(valid); + } + "invalid" => { + let message = hex::decode(tc.msg).unwrap(); + let message_hash = Sha256::digest(message); + let der_signature = hex::decode(tc.sig).unwrap(); + + if let Ok(signature) = from_der(&der_signature) { + match secp256k1_verify(&message_hash, &signature, &public_key) { + Ok(valid) => assert!(!valid), + Err(_) => { /* this is expected for "invalid", all good */ } + } + } else { + // invalid DER encoding, okay + } + } + _ => panic!("Found unexpected result value"), + } + if tc.result == "valid" {} + } + } + assert_eq!(tested, number_of_tests); +} + +#[test] +fn test_ecdsa_secp256k1_sha512() { + let mut tested: usize = 0; + let File { + number_of_tests, + test_groups, + } = read_file(SECP256K1_SHA512); + assert_eq!(number_of_tests, 533); + + for group in test_groups { + let public_key = hex::decode(group.public_key.uncompressed).unwrap(); + assert_eq!(public_key.len(), 65); + + for tc in group.tests { + tested += 1; + assert_eq!(tc.tc_id as usize, tested); + // eprintln!("Test case ID: {}", tc.tc_id); + + match tc.result.as_str() { + "valid" | "acceptable" => { + let message = hex::decode(tc.msg).unwrap(); + let message_hash = Sha512::digest(message); + let der_signature = hex::decode(tc.sig).unwrap(); + let signature = from_der(&der_signature).unwrap(); + let valid = secp256k1_verify(&message_hash, &signature, &public_key).unwrap(); + assert!(valid); + } + "invalid" => { + let message = hex::decode(tc.msg).unwrap(); + let message_hash = Sha512::digest(message); + let der_signature = hex::decode(tc.sig).unwrap(); + + if let Ok(signature) = from_der(&der_signature) { + match secp256k1_verify(&message_hash, &signature, &public_key) { + Ok(valid) => assert!(!valid), + Err(_) => { /* this is expected for "invalid", all good */ } + } + } else { + // invalid DER encoding, okay + } + } + _ => panic!("Found unexpected result value"), + } + if tc.result == "valid" {} + } + } + assert_eq!(tested, number_of_tests); +} + +fn from_der(data: &[u8]) -> Result<[u8; 64], &str> { + const DER_TAG_INTEGER: u8 = 0x02; + + let mut pos = 0; + + let Some(prefix) = data.get(pos) else { + return Err("Could not read prefix"); + }; + pos += 1; + if *prefix != 0x30 { + return Err("Prefix 0x30 expected"); + } + + let Some(body_length) = data.get(pos) else { + return Err("Could not read body length"); + }; + pos += 1; + if data.len() - pos != *body_length as usize { + return Err("Data length mismatch detected"); + } + + // r + let Some(r_tag) = data.get(pos) else { + return Err("Could not read r_tag"); + }; + pos += 1; + if *r_tag != DER_TAG_INTEGER { + return Err("INTEGER tag expected"); + } + let Some(r_length) = data.get(pos).map(|rl: &u8| *rl as usize) else { + return Err("Could not read r_length"); + }; + pos += 1; + if r_length >= 0x80 { + return Err("Decoding length values above 127 not supported"); + } + if pos + r_length > data.len() { + return Err("R lengths exceeds end of data"); + } + let mut r_data = &data[pos..pos + r_length]; + pos += r_length; + + // s + let Some(s_tag) = data.get(pos) else { + return Err("Could not read s_tag"); + }; + pos += 1; + if *s_tag != DER_TAG_INTEGER { + return Err("INTEGER tag expected"); + } + let Some(s_length) = data.get(pos).map(|sl| *sl as usize) else { + return Err("Could not read s_length"); + }; + pos += 1; + if s_length >= 0x80 { + return Err("Decoding length values above 127 not supported"); + } + if pos + s_length > data.len() { + return Err("S lengths exceeds end of data"); + } + let mut s_data = &data[pos..pos + s_length]; + pos += s_length; + + if pos != data.len() { + return Err("Extra bytes in data input"); + } + + if r_data.is_empty() { + return Err("r_data is empty"); + } + + if (r_data[0] & 0x80) != 0 { + return Err("r_data missing leading zero"); + } + + if r_data.len() > 1 && r_data[0] == 0 { + r_data = &r_data[1..]; + if (r_data[0] & 0x80) == 0 { + return Err("r_data has invalid leading zero"); + } + } + + // if r_data.len() > 1 && r_data[0] == 0xff && r_data[1] & 0x80 != 0 { + // return Err("r_data missing leading zero"); + // } + + if r_data.len() > 32 { + return Err("r_data exceeded 32 bytes"); + } + + if s_data.is_empty() { + return Err("s_data is empty"); + } + + if (s_data[0] & 0x80) != 0 { + return Err("s_data missing leading zero"); + } + + if s_data.len() > 1 && s_data[0] == 0 { + s_data = &s_data[1..]; + if (s_data[0] & 0x80) == 0 { + return Err("s_data has invalid leading zero"); + } + } + + // if s_data.len() > 1 && s_data[0] == 0xff && s_data[1] & 0x80 != 0 { + // return Err("s_data missing leading zero"); + // } + + if s_data.len() > 32 { + return Err("s_data exceeded 32 bytes"); + } + + let mut out = [0u8; 64]; + // r/s data can contain leading 0 bytes to express integers being non-negative in DER + out[0..32].copy_from_slice(&pad_to_32(r_data)); + out[32..].copy_from_slice(&pad_to_32(s_data)); + Ok(out) +} + +//fn trim_leading_null_bytes(input: &[u8]) -> &[u8] { +// let mut data = input; +// loop { +// match data.first() { +// Some(0x00) => data = &data[1..], +// Some(_) | None => return data, +// } +// } +//} + +fn pad_to_32(input: &[u8]) -> [u8; 32] { + let shift = 32 - input.len(); + let mut out = [0u8; 32]; + out[shift..].copy_from_slice(input); + out +} From 7e91fc60b1d4168367ac7928a1ed4893ab89d5c1 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 23 Jan 2024 12:39:10 +0100 Subject: [PATCH 1194/2372] Improve DER decoder --- packages/crypto/tests/wycheproof_secp256k1.rs | 115 ++++++++---------- 1 file changed, 48 insertions(+), 67 deletions(-) diff --git a/packages/crypto/tests/wycheproof_secp256k1.rs b/packages/crypto/tests/wycheproof_secp256k1.rs index 352c65f6ed..385cb00666 100644 --- a/packages/crypto/tests/wycheproof_secp256k1.rs +++ b/packages/crypto/tests/wycheproof_secp256k1.rs @@ -150,136 +150,117 @@ fn test_ecdsa_secp256k1_sha512() { assert_eq!(tested, number_of_tests); } -fn from_der(data: &[u8]) -> Result<[u8; 64], &str> { +fn from_der(data: &[u8]) -> Result<[u8; 64], String> { const DER_TAG_INTEGER: u8 = 0x02; let mut pos = 0; let Some(prefix) = data.get(pos) else { - return Err("Could not read prefix"); + return Err("Could not read prefix".to_string()); }; pos += 1; if *prefix != 0x30 { - return Err("Prefix 0x30 expected"); + return Err("Prefix 0x30 expected".to_string()); } let Some(body_length) = data.get(pos) else { - return Err("Could not read body length"); + return Err("Could not read body length".to_string()); }; pos += 1; if data.len() - pos != *body_length as usize { - return Err("Data length mismatch detected"); + return Err("Data length mismatch detected".to_string()); } // r let Some(r_tag) = data.get(pos) else { - return Err("Could not read r_tag"); + return Err("Could not read r_tag".to_string()); }; pos += 1; if *r_tag != DER_TAG_INTEGER { - return Err("INTEGER tag expected"); + return Err("INTEGER tag expected".to_string()); } let Some(r_length) = data.get(pos).map(|rl: &u8| *rl as usize) else { - return Err("Could not read r_length"); + return Err("Could not read r_length".to_string()); }; pos += 1; if r_length >= 0x80 { - return Err("Decoding length values above 127 not supported"); + return Err("Decoding length values above 127 not supported".to_string()); } if pos + r_length > data.len() { - return Err("R lengths exceeds end of data"); + return Err("R length exceeds end of data".to_string()); } - let mut r_data = &data[pos..pos + r_length]; + let r_data = &data[pos..pos + r_length]; pos += r_length; // s let Some(s_tag) = data.get(pos) else { - return Err("Could not read s_tag"); + return Err("Could not read s_tag".to_string()); }; pos += 1; if *s_tag != DER_TAG_INTEGER { - return Err("INTEGER tag expected"); + return Err("INTEGER tag expected".to_string()); } let Some(s_length) = data.get(pos).map(|sl| *sl as usize) else { - return Err("Could not read s_length"); + return Err("Could not read s_length".to_string()); }; pos += 1; if s_length >= 0x80 { - return Err("Decoding length values above 127 not supported"); + return Err("Decoding length values above 127 not supported".to_string()); } if pos + s_length > data.len() { - return Err("S lengths exceeds end of data"); + return Err("S length exceeds end of data".to_string()); } - let mut s_data = &data[pos..pos + s_length]; + let s_data = &data[pos..pos + s_length]; pos += s_length; if pos != data.len() { - return Err("Extra bytes in data input"); + return Err("Extra bytes in data input".to_string()); } - if r_data.is_empty() { - return Err("r_data is empty"); - } - - if (r_data[0] & 0x80) != 0 { - return Err("r_data missing leading zero"); - } - - if r_data.len() > 1 && r_data[0] == 0 { - r_data = &r_data[1..]; - if (r_data[0] & 0x80) == 0 { - return Err("r_data has invalid leading zero"); - } - } - - // if r_data.len() > 1 && r_data[0] == 0xff && r_data[1] & 0x80 != 0 { - // return Err("r_data missing leading zero"); - // } + let r = decode_unsigned_integer(r_data, "r")?; + let s = decode_unsigned_integer(s_data, "s")?; - if r_data.len() > 32 { - return Err("r_data exceeded 32 bytes"); - } + let mut out = [0u8; 64]; + out[0..32].copy_from_slice(&r); + out[32..].copy_from_slice(&s); + Ok(out) +} - if s_data.is_empty() { - return Err("s_data is empty"); +fn decode_unsigned_integer(mut data: &[u8], name: &str) -> Result<[u8; 32], String> { + if data.is_empty() { + return Err(format!("{name} data is empty")); } - if (s_data[0] & 0x80) != 0 { - return Err("s_data missing leading zero"); + // If high bit of first byte is set, this is interpreted as a negative integer. + // A leading zero is needed to prevent this. + if (data[0] & 0x80) != 0 { + return Err(format!("{name} data missing leading zero")); } - if s_data.len() > 1 && s_data[0] == 0 { - s_data = &s_data[1..]; - if (s_data[0] & 0x80) == 0 { - return Err("s_data has invalid leading zero"); + // "Leading octets of all 0's (or all 1's) are not allowed. In other words, the leftmost + // nine bits of an encoded INTEGER value may not be all 0's or all 1's. This ensures that + // an INTEGER value is encoded in the smallest possible number of octets." + // https://www.oss.com/asn1/resources/asn1-made-simple/asn1-quick-reference/basic-encoding-rules.html + + // If leading byte is 0 and there is more than 1 byte, trim it. + // If the high bit of the following byte is zero as well, the leading 0x00 was invalid. + if data.len() > 1 && data[0] == 0 { + data = &data[1..]; + if (data[0] & 0x80) == 0 { + return Err(format!("{name} data has invalid leading zero")); } } - // if s_data.len() > 1 && s_data[0] == 0xff && s_data[1] & 0x80 != 0 { - // return Err("s_data missing leading zero"); - // } + // The other requirement (first 9 bits being all 1) is not yet checked - if s_data.len() > 32 { - return Err("s_data exceeded 32 bytes"); + // Do we need a better value range check here? + if data.len() > 32 { + return Err(format!("{name} data exceeded 32 bytes")); } - let mut out = [0u8; 64]; - // r/s data can contain leading 0 bytes to express integers being non-negative in DER - out[0..32].copy_from_slice(&pad_to_32(r_data)); - out[32..].copy_from_slice(&pad_to_32(s_data)); - Ok(out) + Ok(pad_to_32(data)) } -//fn trim_leading_null_bytes(input: &[u8]) -> &[u8] { -// let mut data = input; -// loop { -// match data.first() { -// Some(0x00) => data = &data[1..], -// Some(_) | None => return data, -// } -// } -//} - fn pad_to_32(input: &[u8]) -> [u8; 32] { let shift = 32 - input.len(); let mut out = [0u8; 32]; From e44a1d9bb35d9daaabeb4f0c77c716780ae9858c Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 23 Jan 2024 12:48:47 +0100 Subject: [PATCH 1195/2372] Improve docs on test vectors --- packages/crypto/testdata/wycheproof/README.md | 18 ++++++++++++++++++ packages/crypto/tests/wycheproof_secp256k1.rs | 5 +---- 2 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 packages/crypto/testdata/wycheproof/README.md diff --git a/packages/crypto/testdata/wycheproof/README.md b/packages/crypto/testdata/wycheproof/README.md new file mode 100644 index 0000000000..5c383147f0 --- /dev/null +++ b/packages/crypto/testdata/wycheproof/README.md @@ -0,0 +1,18 @@ +# Wycheproof test data + +This folder contains test vectors from +[Project Wycheproof](https://github.com/google/wycheproof) to increase the test +coverage of signature verification implementations. + +This test data is used by integration tests in `test/wycheproof_*.rs`. + +## Update + +To ensure integrity of the files and update them to the latest version, run this +from the repo root: + +```sh +(cd packages/crypto/testdata/wycheproof \ + && curl -sSL https://github.com/google/wycheproof/raw/master/testvectors_v1/ecdsa_secp256k1_sha256_test.json > ecdsa_secp256k1_sha256_test.json \ + && curl -sSL https://github.com/google/wycheproof/raw/master/testvectors_v1/ecdsa_secp256k1_sha512_test.json > ecdsa_secp256k1_sha512_test.json) +``` diff --git a/packages/crypto/tests/wycheproof_secp256k1.rs b/packages/crypto/tests/wycheproof_secp256k1.rs index 385cb00666..fee3429624 100644 --- a/packages/crypto/tests/wycheproof_secp256k1.rs +++ b/packages/crypto/tests/wycheproof_secp256k1.rs @@ -4,10 +4,7 @@ use cosmwasm_crypto::secp256k1_verify; use serde::Deserialize; use sha2::{Digest, Sha256, Sha512}; -// In repo root -// curl -sS -L https://github.com/google/wycheproof/raw/master/testvectors_v1/ecdsa_secp256k1_sha256_test.json > packages/crypto/testdata/wycheproof/ecdsa_secp256k1_sha256_test.json -// curl -sS -L https://github.com/google/wycheproof/raw/master/testvectors_v1/ecdsa_secp256k1_sha512_test.json > packages/crypto/testdata/wycheproof/ecdsa_secp256k1_sha512_test.json - +// See ./testdata/wycheproof/README.md for how to get/update those files const SECP256K1_SHA256: &str = "./testdata/wycheproof/ecdsa_secp256k1_sha256_test.json"; const SECP256K1_SHA512: &str = "./testdata/wycheproof/ecdsa_secp256k1_sha512_test.json"; From c22ecd34d3551588cb1b70cd914052fb1a69fdfb Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 23 Jan 2024 12:56:56 +0100 Subject: [PATCH 1196/2372] Improve test code and disable sha512 --- packages/crypto/tests/wycheproof_secp256k1.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/crypto/tests/wycheproof_secp256k1.rs b/packages/crypto/tests/wycheproof_secp256k1.rs index fee3429624..903b3667e3 100644 --- a/packages/crypto/tests/wycheproof_secp256k1.rs +++ b/packages/crypto/tests/wycheproof_secp256k1.rs @@ -50,13 +50,13 @@ fn read_file(path: &str) -> File { } #[test] -fn test_ecdsa_secp256k1_sha256() { +fn ecdsa_secp256k1_sha256() { let mut tested: usize = 0; let File { number_of_tests, test_groups, } = read_file(SECP256K1_SHA256); - assert_eq!(number_of_tests, 463); + assert_eq!(number_of_tests, 463, "Got unexpected number of tests"); for group in test_groups { let public_key = hex::decode(group.public_key.uncompressed).unwrap(); @@ -99,13 +99,14 @@ fn test_ecdsa_secp256k1_sha256() { } #[test] -fn test_ecdsa_secp256k1_sha512() { +#[should_panic] // message hast size other than 256bits currently not supported +fn ecdsa_secp256k1_sha512() { let mut tested: usize = 0; let File { number_of_tests, test_groups, } = read_file(SECP256K1_SHA512); - assert_eq!(number_of_tests, 533); + assert_eq!(number_of_tests, 533, "Got unexpected number of tests"); for group in test_groups { let public_key = hex::decode(group.public_key.uncompressed).unwrap(); From b2d5c7ab3f1a31745737db685b785b65746c2b53 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 23 Jan 2024 12:57:29 +0100 Subject: [PATCH 1197/2372] Test ecdsa_secp256k1_sha3_256_test.json --- Cargo.lock | 20 + packages/crypto/Cargo.toml | 1 + packages/crypto/testdata/wycheproof/README.md | 4 +- .../ecdsa_secp256k1_sha3_256_test.json | 6436 +++++++++++++++++ packages/crypto/tests/wycheproof_secp256k1.rs | 51 + 5 files changed, 6511 insertions(+), 1 deletion(-) create mode 100644 packages/crypto/testdata/wycheproof/ecdsa_secp256k1_sha3_256_test.json diff --git a/Cargo.lock b/Cargo.lock index 9862d3f598..40ed91f9ce 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -433,6 +433,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.6", + "sha3", "thiserror", ] @@ -1339,6 +1340,15 @@ dependencies = [ "signature", ] +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -2070,6 +2080,16 @@ dependencies = [ "digest 0.10.6", ] +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.6", + "keccak", +] + [[package]] name = "shared-buffer" version = "0.1.4" diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index e225f43d38..2277ee1be4 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -29,6 +29,7 @@ criterion = "0.5.1" serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } serde_json = "1.0.40" sha2 = "0.10" +sha3 = "0.10" hex = "0.4" hex-literal = "0.3.1" english-numbers = "0.3" diff --git a/packages/crypto/testdata/wycheproof/README.md b/packages/crypto/testdata/wycheproof/README.md index 5c383147f0..fd5ded43d1 100644 --- a/packages/crypto/testdata/wycheproof/README.md +++ b/packages/crypto/testdata/wycheproof/README.md @@ -14,5 +14,7 @@ from the repo root: ```sh (cd packages/crypto/testdata/wycheproof \ && curl -sSL https://github.com/google/wycheproof/raw/master/testvectors_v1/ecdsa_secp256k1_sha256_test.json > ecdsa_secp256k1_sha256_test.json \ - && curl -sSL https://github.com/google/wycheproof/raw/master/testvectors_v1/ecdsa_secp256k1_sha512_test.json > ecdsa_secp256k1_sha512_test.json) + && curl -sSL https://github.com/google/wycheproof/raw/master/testvectors_v1/ecdsa_secp256k1_sha512_test.json > ecdsa_secp256k1_sha512_test.json \ + && curl -sSL https://github.com/google/wycheproof/raw/master/testvectors_v1/ecdsa_secp256k1_sha3_256_test.json > ecdsa_secp256k1_sha3_256_test.json \ + ) ``` diff --git a/packages/crypto/testdata/wycheproof/ecdsa_secp256k1_sha3_256_test.json b/packages/crypto/testdata/wycheproof/ecdsa_secp256k1_sha3_256_test.json new file mode 100644 index 0000000000..cc3fda062e --- /dev/null +++ b/packages/crypto/testdata/wycheproof/ecdsa_secp256k1_sha3_256_test.json @@ -0,0 +1,6436 @@ +{ + "algorithm" : "ECDSA", + "schema" : "ecdsa_verify_schema.json", + "generatorVersion" : "0.9rc5", + "numberOfTests" : 471, + "header" : [ + "Test vectors of type EcdsaVerify are meant for the verification", + "of ASN encoded ECDSA signatures." + ], + "notes" : { + "ArithmeticError" : { + "bugType" : "EDGE_CASE", + "description" : "Some implementations of ECDSA have arithmetic errors that occur when intermediate results have extreme values. This test vector has been constructed to test such occurences.", + "cves" : [ + "CVE-2017-18146" + ] + }, + "BerEncodedSignature" : { + "bugType" : "BER_ENCODING", + "description" : "ECDSA signatures are usually DER encoded. This signature contains valid values for r and s, but it uses alternative BER encoding.", + "effect" : "Accepting alternative BER encodings may be benign in some cases, or be an issue if protocol requires signature malleability.", + "cves" : [ + "CVE-2020-14966", + "CVE-2020-13822", + "CVE-2019-14859", + "CVE-2016-1000342" + ] + }, + "EdgeCasePublicKey" : { + "bugType" : "EDGE_CASE", + "description" : "The test vector uses a special case public key. " + }, + "EdgeCaseShamirMultiplication" : { + "bugType" : "EDGE_CASE", + "description" : "Shamir proposed a fast method for computing the sum of two scalar multiplications efficiently. This test vector has been constructed so that an intermediate result is the point at infinity if Shamir's method is used." + }, + "IntegerOverflow" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an r and s that has been modified, so that the original value is restored if the implementation ignores the most significant bits.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "InvalidEncoding" : { + "bugType" : "CAN_OF_WORMS", + "description" : "ECDSA signatures are encoded using ASN.1. This test vector contains an incorrectly encoded signature. The test vector itself was generated from a valid signature by modifying its encoding.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "InvalidSignature" : { + "bugType" : "AUTH_BYPASS", + "description" : "The signature contains special case values such as r=0 and s=0. Buggy implementations may accept such values, if the implementation does not check boundaries and computes s^(-1) == 0.", + "effect" : "Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.", + "cves" : [ + "CVE-2022-21449", + "CVE-2021-43572", + "CVE-2022-24884" + ] + }, + "InvalidTypesInSignature" : { + "bugType" : "AUTH_BYPASS", + "description" : "The signature contains invalid types. Dynamic typed languages sometime coerce such values of different types into integers. If an implementation is careless and has additional bugs, such as not checking integer boundaries then it may be possible that such signatures are accepted.", + "effect" : "Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.", + "cves" : [ + "CVE-2022-21449" + ] + }, + "MissingZero" : { + "bugType" : "LEGACY", + "description" : "Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.", + "effect" : "While signatures are more malleable if such signatures are accepted, this typically leads to no vulnerability, since a badly encoded signature can be reencoded correctly." + }, + "ModifiedInteger" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an r and s that has been modified. The goal is to check for arithmetic errors.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "ModifiedSignature" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an invalid signature that was generated from a valid signature by modifying it.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "ModularInverse" : { + "bugType" : "EDGE_CASE", + "description" : "The test vectors contains a signature where computing the modular inverse of s hits an edge case.", + "effect" : "While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.", + "cves" : [ + "CVE-2019-0865" + ] + }, + "PointDuplication" : { + "bugType" : "EDGE_CASE", + "description" : "Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission.", + "cves" : [ + "2020-12607", + "CVE-2015-2730" + ] + }, + "RangeCheck" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an r and s that has been modified. By adding or subtracting the order of the group (or other values) the test vector checks whether signature verification verifies the range of r and s.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "SmallRandS" : { + "bugType" : "EDGE_CASE", + "description" : "The test vectors contains a signature where both r and s are small integers. Some libraries cannot verify such signatures.", + "effect" : "While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.", + "cves" : [ + "2020-13895" + ] + }, + "SpecialCaseHash" : { + "bugType" : "EDGE_CASE", + "description" : "The test vector contains a signature where the hash of the message is a special case, e.g., contains a long run of 0 or 1 bits." + }, + "ValidSignature" : { + "bugType" : "BASIC", + "description" : "The test vector contains a valid signature that was generated pseudorandomly. Such signatures should not fail to verify unless some of the parameters (e.g. curve or hash function) are not supported." + } + }, + "testGroups" : [ + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04782c8ed17e3b2a783b5464f33b09652a71c678e05ec51e84e2bcfc663a3de963af9acb4280b8c7f7c42f4ef9aba6245ec1ec1712fd38a0fa96418d8cd6aa6152", + "wx" : "782c8ed17e3b2a783b5464f33b09652a71c678e05ec51e84e2bcfc663a3de963", + "wy" : "00af9acb4280b8c7f7c42f4ef9aba6245ec1ec1712fd38a0fa96418d8cd6aa6152" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004782c8ed17e3b2a783b5464f33b09652a71c678e05ec51e84e2bcfc663a3de963af9acb4280b8c7f7c42f4ef9aba6245ec1ec1712fd38a0fa96418d8cd6aa6152", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEeCyO0X47Kng7VGTzOwllKnHGeOBexR6E\n4rz8Zjo96WOvmstCgLjH98QvTvmrpiRewewXEv04oPqWQY2M1qphUg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 1, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "", + "sig" : "3046022100fc0f737a79d525eefe3c940c162173cc6fd9a6d5cc5017754026c4113d0f15cc022100894d6fb59cc79199b89cf12b556ba49f8623b66da8c11a55e267e3318497688c", + "result" : "valid" + }, + { + "tcId" : 2, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "4d7367", + "sig" : "3043022076bae33ffa376b496bde93c7748d50a3a8b73bac045e54c40c7fcd344a10fa83021f3e25a20716a902d524d656ead090b7bbe1ac25ff71269d7038d4b08db5b1d7", + "result" : "valid" + }, + { + "tcId" : 3, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "313233343030", + "sig" : "30450220016e2dfac600c8c994c0bb815b1072bb5bb680774121d342f93fe0a994f72c09022100c378944de05aaca70c71ed9a7fe4eed2b36ab3ddb4b32d09d53eebd91f2f9217", + "result" : "valid" + }, + { + "tcId" : 4, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "0000000000000000000000000000000000000000", + "sig" : "3045022100a33c4acb033f3d0d50d244249a1277448b6a52f524e30f4b73d595fb955e924702207f31b50c698a971c8fab98521ef3a1d6fa483a676230467c8af3018452bf1de1", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04b838ff44e5bc177bf21189d0766082fc9d843226887fc9760371100b7ee20a6ff0c9d75bfba7b31a6bca1974496eeb56de357071955d83c4b1badaa0b21832e9", + "wx" : "00b838ff44e5bc177bf21189d0766082fc9d843226887fc9760371100b7ee20a6f", + "wy" : "00f0c9d75bfba7b31a6bca1974496eeb56de357071955d83c4b1badaa0b21832e9" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004b838ff44e5bc177bf21189d0766082fc9d843226887fc9760371100b7ee20a6ff0c9d75bfba7b31a6bca1974496eeb56de357071955d83c4b1badaa0b21832e9", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEuDj/ROW8F3vyEYnQdmCC/J2EMiaIf8l2\nA3EQC37iCm/wyddb+6ezGmvKGXRJbutW3jVwcZVdg8Sxutqgshgy6Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 5, + "comment" : "signature malleability", + "flags" : [ + "ValidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022100bbdbc26e1099b2713ada34df9cfa8edaf905a4a6d2a1f449f05de03df8c2a696", + "result" : "valid" + }, + { + "tcId" : 6, + "comment" : "Legacy: ASN encoding of r misses leading 0", + "flags" : [ + "MissingZero" + ], + "msg" : "313233343030", + "sig" : "30440220eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 7, + "comment" : "valid", + "flags" : [ + "ValidSignature" + ], + "msg" : "313233343030", + "sig" : "3045022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "valid" + }, + { + "tcId" : 8, + "comment" : "length of sequence [r, s] uses long form encoding", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "308145022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 9, + "comment" : "length of sequence [r, s] contains a leading 0", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "30820045022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 10, + "comment" : "length of sequence [r, s] uses 70 instead of 69", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3046022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 11, + "comment" : "length of sequence [r, s] uses 68 instead of 69", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3044022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 12, + "comment" : "uint32 overflow in length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30850100000045022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 13, + "comment" : "uint64 overflow in length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3089010000000000000045022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 14, + "comment" : "length of sequence [r, s] = 2**31 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30847fffffff022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 15, + "comment" : "length of sequence [r, s] = 2**31", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308480000000022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 16, + "comment" : "length of sequence [r, s] = 2**32 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3084ffffffff022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 17, + "comment" : "length of sequence [r, s] = 2**40 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3085ffffffffff022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 18, + "comment" : "length of sequence [r, s] = 2**64 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3088ffffffffffffffff022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 19, + "comment" : "incorrect length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30ff022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 20, + "comment" : "replaced sequence [r, s] by an indefinite length tag without termination", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3080022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 21, + "comment" : "removing sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "", + "result" : "invalid" + }, + { + "tcId" : 22, + "comment" : "lonely sequence tag", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30", + "result" : "invalid" + }, + { + "tcId" : 23, + "comment" : "appending 0's to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab0000", + "result" : "invalid" + }, + { + "tcId" : 24, + "comment" : "prepending 0's to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30470000022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 25, + "comment" : "appending unused 0's to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab0000", + "result" : "invalid" + }, + { + "tcId" : 26, + "comment" : "appending null value to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab0500", + "result" : "invalid" + }, + { + "tcId" : 27, + "comment" : "prepending garbage to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a4981773045022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 28, + "comment" : "prepending garbage to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304925003045022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 29, + "comment" : "appending garbage to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30473045022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab0004deadbeef", + "result" : "invalid" + }, + { + "tcId" : 30, + "comment" : "including undefined tags", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304daa00bb00cd003045022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 31, + "comment" : "including undefined tags", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d2229aa00bb00cd00022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 32, + "comment" : "including undefined tags", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2512228aa00bb00cd00022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 33, + "comment" : "truncated length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3081", + "result" : "invalid" + }, + { + "tcId" : 34, + "comment" : "including undefined tags to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304baa02aabb3045022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 35, + "comment" : "using composition with indefinite length for sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30803045022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab0000", + "result" : "invalid" + }, + { + "tcId" : 36, + "comment" : "using composition with wrong tag for sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30803145022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab0000", + "result" : "invalid" + }, + { + "tcId" : 37, + "comment" : "Replacing sequence [r, s] with NULL", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "0500", + "result" : "invalid" + }, + { + "tcId" : 38, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "2e45022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 39, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "2f45022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 40, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3145022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 41, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3245022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 42, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "ff45022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 43, + "comment" : "dropping value of sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3000", + "result" : "invalid" + }, + { + "tcId" : 44, + "comment" : "using composition for sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304930010230442100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 45, + "comment" : "truncated sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3044022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739a", + "result" : "invalid" + }, + { + "tcId" : 46, + "comment" : "truncated sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30442100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 47, + "comment" : "sequence [r, s] of size 4166 to check for overflows", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30821046022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 48, + "comment" : "indefinite length", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "3080022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab0000", + "result" : "invalid" + }, + { + "tcId" : 49, + "comment" : "indefinite length with truncated delimiter", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3080022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab00", + "result" : "invalid" + }, + { + "tcId" : 50, + "comment" : "indefinite length with additional element", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3080022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab05000000", + "result" : "invalid" + }, + { + "tcId" : 51, + "comment" : "indefinite length with truncated element", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3080022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab060811220000", + "result" : "invalid" + }, + { + "tcId" : 52, + "comment" : "indefinite length with garbage", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3080022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab0000fe02beef", + "result" : "invalid" + }, + { + "tcId" : 53, + "comment" : "indefinite length with nonempty EOC", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3080022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab0002beef", + "result" : "invalid" + }, + { + "tcId" : 54, + "comment" : "prepend empty sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30473000022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 55, + "comment" : "append empty sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab3000", + "result" : "invalid" + }, + { + "tcId" : 56, + "comment" : "append zero", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3048022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab020100", + "result" : "invalid" + }, + { + "tcId" : 57, + "comment" : "append garbage with high tag number", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3048022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aabbf7f00", + "result" : "invalid" + }, + { + "tcId" : 58, + "comment" : "append null with explicit tag", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3049022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aaba0020500", + "result" : "invalid" + }, + { + "tcId" : 59, + "comment" : "append null with implicit tag", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aaba000", + "result" : "invalid" + }, + { + "tcId" : 60, + "comment" : "sequence of sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30473045022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 61, + "comment" : "truncated sequence: removed last 1 elements", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3023022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251", + "result" : "invalid" + }, + { + "tcId" : 62, + "comment" : "repeating element in sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3067022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 63, + "comment" : "flipped bit 0 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304300eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe250022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 64, + "comment" : "flipped bit 32 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304300eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e457534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 65, + "comment" : "flipped bit 48 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304300eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e0e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 66, + "comment" : "flipped bit 64 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304300eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73784e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 67, + "comment" : "length of r uses long form encoding", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "304602812100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 68, + "comment" : "length of r contains a leading 0", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "30470282002100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 69, + "comment" : "length of r uses 34 instead of 33", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045022200eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 70, + "comment" : "length of r uses 32 instead of 33", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045022000eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 71, + "comment" : "uint32 overflow in length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a0285010000002100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 72, + "comment" : "uint64 overflow in length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304e028901000000000000002100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 73, + "comment" : "length of r = 2**31 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902847fffffff00eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 74, + "comment" : "length of r = 2**31", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902848000000000eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 75, + "comment" : "length of r = 2**32 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30490284ffffffff00eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 76, + "comment" : "length of r = 2**40 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a0285ffffffffff00eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 77, + "comment" : "length of r = 2**64 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d0288ffffffffffffffff00eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 78, + "comment" : "incorrect length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502ff00eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 79, + "comment" : "replaced r by an indefinite length tag without termination", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045028000eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 80, + "comment" : "removing r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3022022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 81, + "comment" : "lonely integer tag", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "302302022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 82, + "comment" : "lonely integer tag", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3024022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe25102", + "result" : "invalid" + }, + { + "tcId" : 83, + "comment" : "appending 0's to r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047022300eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2510000022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 84, + "comment" : "prepending 0's to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30470223000000eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 85, + "comment" : "appending unused 0's to r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2510000022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 86, + "comment" : "appending null value to r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047022300eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2510500022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 87, + "comment" : "prepending garbage to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a2226498177022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 88, + "comment" : "prepending garbage to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304922252500022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 89, + "comment" : "appending garbage to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d2223022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2510004deadbeef022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 90, + "comment" : "truncated length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30240281022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 91, + "comment" : "including undefined tags to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304b2227aa02aabb022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 92, + "comment" : "using composition with indefinite length for r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30492280022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2510000022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 93, + "comment" : "using composition with wrong tag for r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30492280032100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2510000022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 94, + "comment" : "Replacing r with NULL", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30240500022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 95, + "comment" : "changing tag value of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3045002100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 96, + "comment" : "changing tag value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045012100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 97, + "comment" : "changing tag value of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3045032100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 98, + "comment" : "changing tag value of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3045042100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 99, + "comment" : "changing tag value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045ff2100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 100, + "comment" : "dropping value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30240200022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 101, + "comment" : "using composition for r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304922250201000220eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 102, + "comment" : "modifying first byte of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3045022102eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 103, + "comment" : "modifying last byte of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3045022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2d1022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 104, + "comment" : "truncated r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3044022000eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 105, + "comment" : "r of size 4130 to check for overflows", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "308210480282102200eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 106, + "comment" : "leading ff in r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30460222ff00eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 107, + "comment" : "replaced r by infinity", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3025090180022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 108, + "comment" : "replacing r with zero", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3025020100022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 109, + "comment" : "flipped bit 0 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3043022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe25144243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aaa", + "result" : "invalid" + }, + { + "tcId" : 110, + "comment" : "flipped bit 32 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3043022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe25144243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4fd7739aab", + "result" : "invalid" + }, + { + "tcId" : 111, + "comment" : "flipped bit 48 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3043022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe25144243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf757e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 112, + "comment" : "flipped bit 64 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3043022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe25144243d91ef664d8ec525cb2063057123c1a9383fdca6abf0cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 113, + "comment" : "length of s uses long form encoding", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe25102812044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 114, + "comment" : "length of s contains a leading 0", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "3047022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2510282002044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 115, + "comment" : "length of s uses 33 instead of 32", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022144243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 116, + "comment" : "length of s uses 31 instead of 32", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251021f44243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 117, + "comment" : "uint32 overflow in length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2510285010000002044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 118, + "comment" : "uint64 overflow in length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304e022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251028901000000000000002044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 119, + "comment" : "length of s = 2**31 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe25102847fffffff44243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 120, + "comment" : "length of s = 2**31", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe25102848000000044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 121, + "comment" : "length of s = 2**32 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2510284ffffffff44243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 122, + "comment" : "length of s = 2**40 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2510285ffffffffff44243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 123, + "comment" : "length of s = 2**64 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2510288ffffffffffffffff44243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 124, + "comment" : "incorrect length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe25102ff44243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 125, + "comment" : "replaced s by an indefinite length tag without termination", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251028044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 126, + "comment" : "appending 0's to s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022244243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab0000", + "result" : "invalid" + }, + { + "tcId" : 127, + "comment" : "prepending 0's to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3047022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2510222000044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 128, + "comment" : "appending null value to s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022244243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab0500", + "result" : "invalid" + }, + { + "tcId" : 129, + "comment" : "prepending garbage to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2512225498177022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 130, + "comment" : "prepending garbage to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe25122242500022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 131, + "comment" : "appending garbage to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2512222022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab0004deadbeef", + "result" : "invalid" + }, + { + "tcId" : 132, + "comment" : "truncated length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3025022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2510281", + "result" : "invalid" + }, + { + "tcId" : 133, + "comment" : "including undefined tags to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304b022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2512226aa02aabb022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 134, + "comment" : "using composition with indefinite length for s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2512280022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab0000", + "result" : "invalid" + }, + { + "tcId" : 135, + "comment" : "using composition with wrong tag for s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2512280032044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab0000", + "result" : "invalid" + }, + { + "tcId" : 136, + "comment" : "Replacing s with NULL", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2510500", + "result" : "invalid" + }, + { + "tcId" : 137, + "comment" : "changing tag value of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3045022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251002044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 138, + "comment" : "changing tag value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251012044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 139, + "comment" : "changing tag value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251032044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 140, + "comment" : "changing tag value of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3045022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251042044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 141, + "comment" : "changing tag value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251ff2044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 142, + "comment" : "dropping value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3025022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2510200", + "result" : "invalid" + }, + { + "tcId" : 143, + "comment" : "using composition for s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2512224020144021f243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 144, + "comment" : "modifying first byte of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3045022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022046243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 145, + "comment" : "modifying last byte of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3045022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739a2b", + "result" : "invalid" + }, + { + "tcId" : 146, + "comment" : "truncated s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3044022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251021f44243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739a", + "result" : "invalid" + }, + { + "tcId" : 147, + "comment" : "truncated s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3044022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251021f243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 148, + "comment" : "s of size 4129 to check for overflows", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30821048022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2510282102144243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 149, + "comment" : "leading ff in s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe2510221ff44243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 150, + "comment" : "replaced s by infinity", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251090180", + "result" : "invalid" + }, + { + "tcId" : 151, + "comment" : "replacing s with zero", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251020100", + "result" : "invalid" + }, + { + "tcId" : 152, + "comment" : "replaced r by r + n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "3045022101eb044a2e719d94a33837717ce9bc5ff94062cf047015777244b442e323862392022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 153, + "comment" : "replaced r by r - n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "30440220eb044a2e719d94a33837717ce9bc5ffbcb051537118436fac50f85c98319a110022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 154, + "comment" : "replaced r by r + 256 * n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "304602220100eb044a2e719d94a33837717ce9bc5eb53490d8cd096d12f65740712689912351022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 155, + "comment" : "replaced r by -r", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30450221ff14fbb5d18e626b5cc7c88e831643a0057a4c0de23f3328c97b1e1ba9acb01daf022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 156, + "comment" : "replaced r by n - r", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "3044022014fbb5d18e626b5cc7c88e831643a00434faeac8ee7bc9053af07a367ce65ef0022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 157, + "comment" : "replaced r by -n - r", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30450221fe14fbb5d18e626b5cc7c88e831643a006bf9d30fb8fea888dbb4bbd1cdc79dc6e022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 158, + "comment" : "replaced r by r + 2**256", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "3045022101eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 159, + "comment" : "replaced r by r + 2**320", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "304d0229010000000000000000eb044a2e719d94a33837717ce9bc5ffa85b3f21dc0ccd73684e1e456534fe251022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 160, + "comment" : "replaced s by s + n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "304502210144243d91ef664d8ec525cb20630571227c5815268bef4c2d8f46dcdba7a9dbec022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 161, + "comment" : "replaced s by s - n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "30450221ff44243d91ef664d8ec525cb206305712506fa5b592d5e0bb60fa21fc2073d596a022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 162, + "comment" : "replaced s by s + 256 * n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "30460222010044243d91ef664d8ec525cb2063056fde70861eef2546e7b1a1d30b1f0db4dbab022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 163, + "comment" : "replaced s by -s", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30440220bbdbc26e1099b2713ada34df9cfa8edc3e56c7c02359540e308b81b1288c6555022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 164, + "comment" : "replaced s by -n - s", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30450221febbdbc26e1099b2713ada34df9cfa8edd83a7ead97410b3d270b9232458562414022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 165, + "comment" : "replaced s by s + 2**256", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "304502210144243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 166, + "comment" : "replaced s by s - 2**256", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "30450221ff44243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 167, + "comment" : "replaced s by s + 2**320", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "304d022901000000000000000044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab022044243d91ef664d8ec525cb2063057123c1a9383fdca6abf1cf747e4ed7739aab", + "result" : "invalid" + }, + { + "tcId" : 168, + "comment" : "Signature with special case values r=0 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100020100", + "result" : "invalid" + }, + { + "tcId" : 169, + "comment" : "Signature with special case values r=0 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100020101", + "result" : "invalid" + }, + { + "tcId" : 170, + "comment" : "Signature with special case values r=0 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201000201ff", + "result" : "invalid" + }, + { + "tcId" : 171, + "comment" : "Signature with special case values r=0 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 172, + "comment" : "Signature with special case values r=0 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 173, + "comment" : "Signature with special case values r=0 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 174, + "comment" : "Signature with special case values r=0 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 175, + "comment" : "Signature with special case values r=0 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 176, + "comment" : "Signature with special case values r=1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101020100", + "result" : "invalid" + }, + { + "tcId" : 177, + "comment" : "Signature with special case values r=1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101020101", + "result" : "invalid" + }, + { + "tcId" : 178, + "comment" : "Signature with special case values r=1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201010201ff", + "result" : "invalid" + }, + { + "tcId" : 179, + "comment" : "Signature with special case values r=1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 180, + "comment" : "Signature with special case values r=1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 181, + "comment" : "Signature with special case values r=1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 182, + "comment" : "Signature with special case values r=1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 183, + "comment" : "Signature with special case values r=1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 184, + "comment" : "Signature with special case values r=-1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff020100", + "result" : "invalid" + }, + { + "tcId" : 185, + "comment" : "Signature with special case values r=-1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff020101", + "result" : "invalid" + }, + { + "tcId" : 186, + "comment" : "Signature with special case values r=-1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff0201ff", + "result" : "invalid" + }, + { + "tcId" : 187, + "comment" : "Signature with special case values r=-1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 188, + "comment" : "Signature with special case values r=-1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 189, + "comment" : "Signature with special case values r=-1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 190, + "comment" : "Signature with special case values r=-1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 191, + "comment" : "Signature with special case values r=-1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 192, + "comment" : "Signature with special case values r=n and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141020100", + "result" : "invalid" + }, + { + "tcId" : 193, + "comment" : "Signature with special case values r=n and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141020101", + "result" : "invalid" + }, + { + "tcId" : 194, + "comment" : "Signature with special case values r=n and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410201ff", + "result" : "invalid" + }, + { + "tcId" : 195, + "comment" : "Signature with special case values r=n and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 196, + "comment" : "Signature with special case values r=n and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 197, + "comment" : "Signature with special case values r=n and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 198, + "comment" : "Signature with special case values r=n and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 199, + "comment" : "Signature with special case values r=n and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 200, + "comment" : "Signature with special case values r=n - 1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140020100", + "result" : "invalid" + }, + { + "tcId" : 201, + "comment" : "Signature with special case values r=n - 1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140020101", + "result" : "invalid" + }, + { + "tcId" : 202, + "comment" : "Signature with special case values r=n - 1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641400201ff", + "result" : "invalid" + }, + { + "tcId" : 203, + "comment" : "Signature with special case values r=n - 1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 204, + "comment" : "Signature with special case values r=n - 1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 205, + "comment" : "Signature with special case values r=n - 1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 206, + "comment" : "Signature with special case values r=n - 1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 207, + "comment" : "Signature with special case values r=n - 1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 208, + "comment" : "Signature with special case values r=n + 1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142020100", + "result" : "invalid" + }, + { + "tcId" : 209, + "comment" : "Signature with special case values r=n + 1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142020101", + "result" : "invalid" + }, + { + "tcId" : 210, + "comment" : "Signature with special case values r=n + 1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641420201ff", + "result" : "invalid" + }, + { + "tcId" : 211, + "comment" : "Signature with special case values r=n + 1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 212, + "comment" : "Signature with special case values r=n + 1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 213, + "comment" : "Signature with special case values r=n + 1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 214, + "comment" : "Signature with special case values r=n + 1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 215, + "comment" : "Signature with special case values r=n + 1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 216, + "comment" : "Signature with special case values r=p and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f020100", + "result" : "invalid" + }, + { + "tcId" : 217, + "comment" : "Signature with special case values r=p and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f020101", + "result" : "invalid" + }, + { + "tcId" : 218, + "comment" : "Signature with special case values r=p and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0201ff", + "result" : "invalid" + }, + { + "tcId" : 219, + "comment" : "Signature with special case values r=p and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 220, + "comment" : "Signature with special case values r=p and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 221, + "comment" : "Signature with special case values r=p and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 222, + "comment" : "Signature with special case values r=p and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 223, + "comment" : "Signature with special case values r=p and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 224, + "comment" : "Signature with special case values r=p + 1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30020100", + "result" : "invalid" + }, + { + "tcId" : 225, + "comment" : "Signature with special case values r=p + 1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30020101", + "result" : "invalid" + }, + { + "tcId" : 226, + "comment" : "Signature with special case values r=p + 1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc300201ff", + "result" : "invalid" + }, + { + "tcId" : 227, + "comment" : "Signature with special case values r=p + 1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 228, + "comment" : "Signature with special case values r=p + 1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 229, + "comment" : "Signature with special case values r=p + 1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 230, + "comment" : "Signature with special case values r=p + 1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 231, + "comment" : "Signature with special case values r=p + 1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 232, + "comment" : "Signature encoding contains incorrect types: r=0, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3008020100090380fe01", + "result" : "invalid" + }, + { + "tcId" : 233, + "comment" : "Signature encoding contains incorrect types: r=0, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100090142", + "result" : "invalid" + }, + { + "tcId" : 234, + "comment" : "Signature encoding contains incorrect types: r=0, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100010101", + "result" : "invalid" + }, + { + "tcId" : 235, + "comment" : "Signature encoding contains incorrect types: r=0, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100010100", + "result" : "invalid" + }, + { + "tcId" : 236, + "comment" : "Signature encoding contains incorrect types: r=0, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201000500", + "result" : "invalid" + }, + { + "tcId" : 237, + "comment" : "Signature encoding contains incorrect types: r=0, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201000c00", + "result" : "invalid" + }, + { + "tcId" : 238, + "comment" : "Signature encoding contains incorrect types: r=0, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201000c0130", + "result" : "invalid" + }, + { + "tcId" : 239, + "comment" : "Signature encoding contains incorrect types: r=0, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201003000", + "result" : "invalid" + }, + { + "tcId" : 240, + "comment" : "Signature encoding contains incorrect types: r=0, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201003003020100", + "result" : "invalid" + }, + { + "tcId" : 241, + "comment" : "Signature encoding contains incorrect types: r=1, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3008020101090380fe01", + "result" : "invalid" + }, + { + "tcId" : 242, + "comment" : "Signature encoding contains incorrect types: r=1, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101090142", + "result" : "invalid" + }, + { + "tcId" : 243, + "comment" : "Signature encoding contains incorrect types: r=1, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101010101", + "result" : "invalid" + }, + { + "tcId" : 244, + "comment" : "Signature encoding contains incorrect types: r=1, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101010100", + "result" : "invalid" + }, + { + "tcId" : 245, + "comment" : "Signature encoding contains incorrect types: r=1, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201010500", + "result" : "invalid" + }, + { + "tcId" : 246, + "comment" : "Signature encoding contains incorrect types: r=1, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201010c00", + "result" : "invalid" + }, + { + "tcId" : 247, + "comment" : "Signature encoding contains incorrect types: r=1, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201010c0130", + "result" : "invalid" + }, + { + "tcId" : 248, + "comment" : "Signature encoding contains incorrect types: r=1, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201013000", + "result" : "invalid" + }, + { + "tcId" : 249, + "comment" : "Signature encoding contains incorrect types: r=1, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201013003020100", + "result" : "invalid" + }, + { + "tcId" : 250, + "comment" : "Signature encoding contains incorrect types: r=-1, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201ff090380fe01", + "result" : "invalid" + }, + { + "tcId" : 251, + "comment" : "Signature encoding contains incorrect types: r=-1, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff090142", + "result" : "invalid" + }, + { + "tcId" : 252, + "comment" : "Signature encoding contains incorrect types: r=-1, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff010101", + "result" : "invalid" + }, + { + "tcId" : 253, + "comment" : "Signature encoding contains incorrect types: r=-1, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff010100", + "result" : "invalid" + }, + { + "tcId" : 254, + "comment" : "Signature encoding contains incorrect types: r=-1, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201ff0500", + "result" : "invalid" + }, + { + "tcId" : 255, + "comment" : "Signature encoding contains incorrect types: r=-1, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201ff0c00", + "result" : "invalid" + }, + { + "tcId" : 256, + "comment" : "Signature encoding contains incorrect types: r=-1, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff0c0130", + "result" : "invalid" + }, + { + "tcId" : 257, + "comment" : "Signature encoding contains incorrect types: r=-1, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201ff3000", + "result" : "invalid" + }, + { + "tcId" : 258, + "comment" : "Signature encoding contains incorrect types: r=-1, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201ff3003020100", + "result" : "invalid" + }, + { + "tcId" : 259, + "comment" : "Signature encoding contains incorrect types: r=n, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141090380fe01", + "result" : "invalid" + }, + { + "tcId" : 260, + "comment" : "Signature encoding contains incorrect types: r=n, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141090142", + "result" : "invalid" + }, + { + "tcId" : 261, + "comment" : "Signature encoding contains incorrect types: r=n, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141010101", + "result" : "invalid" + }, + { + "tcId" : 262, + "comment" : "Signature encoding contains incorrect types: r=n, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141010100", + "result" : "invalid" + }, + { + "tcId" : 263, + "comment" : "Signature encoding contains incorrect types: r=n, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410500", + "result" : "invalid" + }, + { + "tcId" : 264, + "comment" : "Signature encoding contains incorrect types: r=n, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410c00", + "result" : "invalid" + }, + { + "tcId" : 265, + "comment" : "Signature encoding contains incorrect types: r=n, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410c0130", + "result" : "invalid" + }, + { + "tcId" : 266, + "comment" : "Signature encoding contains incorrect types: r=n, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641413000", + "result" : "invalid" + }, + { + "tcId" : 267, + "comment" : "Signature encoding contains incorrect types: r=n, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641413003020100", + "result" : "invalid" + }, + { + "tcId" : 268, + "comment" : "Signature encoding contains incorrect types: r=p, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f090380fe01", + "result" : "invalid" + }, + { + "tcId" : 269, + "comment" : "Signature encoding contains incorrect types: r=p, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f090142", + "result" : "invalid" + }, + { + "tcId" : 270, + "comment" : "Signature encoding contains incorrect types: r=p, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f010101", + "result" : "invalid" + }, + { + "tcId" : 271, + "comment" : "Signature encoding contains incorrect types: r=p, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f010100", + "result" : "invalid" + }, + { + "tcId" : 272, + "comment" : "Signature encoding contains incorrect types: r=p, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0500", + "result" : "invalid" + }, + { + "tcId" : 273, + "comment" : "Signature encoding contains incorrect types: r=p, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0c00", + "result" : "invalid" + }, + { + "tcId" : 274, + "comment" : "Signature encoding contains incorrect types: r=p, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0c0130", + "result" : "invalid" + }, + { + "tcId" : 275, + "comment" : "Signature encoding contains incorrect types: r=p, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f3000", + "result" : "invalid" + }, + { + "tcId" : 276, + "comment" : "Signature encoding contains incorrect types: r=p, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f3003020100", + "result" : "invalid" + }, + { + "tcId" : 277, + "comment" : "Signature encoding contains incorrect types: r=0.25, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300a090380fe01090380fe01", + "result" : "invalid" + }, + { + "tcId" : 278, + "comment" : "Signature encoding contains incorrect types: r=nan, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006090142090142", + "result" : "invalid" + }, + { + "tcId" : 279, + "comment" : "Signature encoding contains incorrect types: r=True, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010101010101", + "result" : "invalid" + }, + { + "tcId" : 280, + "comment" : "Signature encoding contains incorrect types: r=False, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010100010100", + "result" : "invalid" + }, + { + "tcId" : 281, + "comment" : "Signature encoding contains incorrect types: r=Null, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300405000500", + "result" : "invalid" + }, + { + "tcId" : 282, + "comment" : "Signature encoding contains incorrect types: r=empyt UTF-8 string, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30040c000c00", + "result" : "invalid" + }, + { + "tcId" : 283, + "comment" : "Signature encoding contains incorrect types: r=\"0\", s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060c01300c0130", + "result" : "invalid" + }, + { + "tcId" : 284, + "comment" : "Signature encoding contains incorrect types: r=empty list, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300430003000", + "result" : "invalid" + }, + { + "tcId" : 285, + "comment" : "Signature encoding contains incorrect types: r=list containing 0, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300a30030201003003020100", + "result" : "invalid" + }, + { + "tcId" : 286, + "comment" : "Signature encoding contains incorrect types: r=0.25, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3008090380fe01020100", + "result" : "invalid" + }, + { + "tcId" : 287, + "comment" : "Signature encoding contains incorrect types: r=nan, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006090142020100", + "result" : "invalid" + }, + { + "tcId" : 288, + "comment" : "Signature encoding contains incorrect types: r=True, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010101020100", + "result" : "invalid" + }, + { + "tcId" : 289, + "comment" : "Signature encoding contains incorrect types: r=False, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010100020100", + "result" : "invalid" + }, + { + "tcId" : 290, + "comment" : "Signature encoding contains incorrect types: r=Null, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050500020100", + "result" : "invalid" + }, + { + "tcId" : 291, + "comment" : "Signature encoding contains incorrect types: r=empyt UTF-8 string, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050c00020100", + "result" : "invalid" + }, + { + "tcId" : 292, + "comment" : "Signature encoding contains incorrect types: r=\"0\", s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060c0130020100", + "result" : "invalid" + }, + { + "tcId" : 293, + "comment" : "Signature encoding contains incorrect types: r=empty list, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30053000020100", + "result" : "invalid" + }, + { + "tcId" : 294, + "comment" : "Signature encoding contains incorrect types: r=list containing 0, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30083003020100020100", + "result" : "invalid" + }, + { + "tcId" : 295, + "comment" : "Edge case for Shamir multiplication", + "flags" : [ + "EdgeCaseShamirMultiplication" + ], + "msg" : "3232333836", + "sig" : "3046022100dd1b7d09a7bd8218961034a39a87fecf5314f00c4d25eb58a07ac85e85eab516022100b98c5232f0100d55db14eb0fe9e943fb45d8f192bbdd38147850f4d950f16a91", + "result" : "valid" + }, + { + "tcId" : 296, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33313930393433323838", + "sig" : "3046022100840a6cd819f21a2a3c3be7461bf516f5191c32d059eea09699ac4132f794881902210094c53906a1595cf9fe14831b5298b4e297219afb895c18a19f4508fa4f6e0394", + "result" : "valid" + }, + { + "tcId" : 297, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "383433343734313535", + "sig" : "304502205928b7eeb84242914d4d5b871feb3b0d789455e44a41e3b60e0e43856a4a7a39022100d650930d76eb2444713b63b501a8e8b39615784306f1f2fa90915066e4f60192", + "result" : "valid" + }, + { + "tcId" : 298, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33353732363936383239", + "sig" : "304502202ff05b06077811e7bf8a1b8804fa6bb7db793b0a8927745f5b543998dab306b3022100c9e7da07e2b2d28f169924bab22d90a107ca97f5022eac08d0a4577f30d89988", + "result" : "valid" + }, + { + "tcId" : 299, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "353931383333343239", + "sig" : "3045022019c5e74fd3ab3847d1ba8ec6ff682b184ed2ae466622890deb4206385c31b0a5022100c959ebce99b3446aacee56eecdbae1898fc71a6bacb4464a6a4b0276821b32e7", + "result" : "valid" + }, + { + "tcId" : 300, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3832353330383232353839", + "sig" : "3045022054bb584a67c79e19d3f9627cc1eadacce8075e3f5c03e45c807b46d505ca73ab022100ab37fbc790a0400debbbde06b9771b63732d79de6a56e87275a968e0d4aaefbf", + "result" : "valid" + }, + { + "tcId" : 301, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3133373334383238313432", + "sig" : "30450220699d4d68c233f44bf1d3f70001a9acac7be906e09ac440c8d16044364696b94d0221009990c2cd8d7c6a227dce6a94900bc7b69a8ee6cf0ba062767c09d9e5b12e413c", + "result" : "valid" + }, + { + "tcId" : 302, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "313733383135363430", + "sig" : "3046022100e779c882a97701293daa1413f9fe49ab97bd8f742331461d0e3b93333c1db5bb022100ad3fd904ab463ec8bc7ff988c142acdbc5dd73d8dce919b458987c1f32ba3e9b", + "result" : "valid" + }, + { + "tcId" : 303, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32353533343636353034", + "sig" : "3046022100d121d4639e90e4741919d9cb3888d69c46d6fdc84980b5ecc249fa01cae19be5022100ac0559aa580e535e401ea9e2710f067a375ec69dc49fba668d7a14d8bde42d0d", + "result" : "valid" + }, + { + "tcId" : 304, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32313833303339313937", + "sig" : "3046022100de04d387ddd0189ef2ec494594ed056675788d6cac25f9826e50fec66f47be6f022100a55cbc3e87809b4dcc634cea32fc23cf7ac70f71ef1731de41414c0a71891cb5", + "result" : "valid" + }, + { + "tcId" : 305, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3130353236313736353435", + "sig" : "304502205a8d2d504831a047c7277d9c13f7f456fd9569a311c5be93cbfa9a3122534ff3022100d0f9586630564236e9b133a7b53202b29d3a3caeb28f5d2360adfea238f41529", + "result" : "valid" + }, + { + "tcId" : 306, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32353031353339393836", + "sig" : "304502200e2dc3e0b7c51be950c814b4cd74b8707753bc5a7543d6589ae1464c93227bf70221009cea04df1218bb7a0c851da9fef4069cfca9fc00ef08c37976adfc4ec7b5e2b2", + "result" : "valid" + }, + { + "tcId" : 307, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3134393533313634363139", + "sig" : "304502200c93646c509040bac868258bf3f2d13d26e98993e8680f0da846c1712be95109022100c65386f8b0a12fef25791cd93a045140af9c24fe3d3d700e02d23b1ce2da05f3", + "result" : "valid" + }, + { + "tcId" : 308, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32303633383532393036", + "sig" : "30450221009906860d728638f6a260e13495f2c6099838e5c2f94828f10caf2c58970d3bf802204853235fd511b8db3956bd25b772fab54bad3867d1c637a9984016f785fdc6cf", + "result" : "valid" + }, + { + "tcId" : 309, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37383339373634393932", + "sig" : "3045022100c6d609fc861a35134b4dc180a3b2a7b13ad8477358e80286f90499c58bd37dd302200978e0b21055dcc81844d297d6bbecbd074f09717b46c695ae60799d564a1f9f", + "result" : "valid" + }, + { + "tcId" : 310, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32313239323634343639", + "sig" : "304502201496fd7a5023faf78b0e1008b054f25c509d34713d4594cfabf24c1b2229643d022100f660ac1daa7700a55189d6710a373b350ea2446ae76fc8a3522df3e01a2bc2f1", + "result" : "valid" + }, + { + "tcId" : 311, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34383332303432363833", + "sig" : "3044022031007f0306f171eb56c9bc7f7c0cd7d776acd86be680f600d3729aedc03aa9ef022059f529aecb6c8e7469830daea5065e6da8c349688ab4fa0ebec364035a68e58a", + "result" : "valid" + }, + { + "tcId" : 312, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "333635323231383136", + "sig" : "3046022100fbe1a139e3c74cef01d21d9c5a47a783080dbd9b86a202e933872a71a4b53838022100fe3164ad51c080ddd4126f42979e6b519075b2ec96060e02f9dd6fb6f9f3bfdf", + "result" : "valid" + }, + { + "tcId" : 313, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3234393137313236393635", + "sig" : "3044022004518c6be6586ceb5559014ff40311fe7e6d0ffcdfc655b6a06bbe203a185ed602201e0b927e43125aa196329bb0f09bf75d0481dba924f91e3e39e3e0878a972a83", + "result" : "valid" + }, + { + "tcId" : 314, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32363232373930373738", + "sig" : "3046022100ad67c0270ea088a9daa805788b6aa5161c6e7e12d237515518914ab66d1dcb66022100c5fa3b243e9148e1dcfc27abd9991a2c0c2d25bde9822ce26f344bc9e03f9ee7", + "result" : "valid" + }, + { + "tcId" : 315, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "313031323537373238393237", + "sig" : "3045022100edd7e3fb8581ded7c0961f7365a1a39c6fa301d9728000aeb84c41d918c17dbb022025cfb4fdade11816359ccfd2001cc2b0e509de9cca0c1aa7eaae719637e11156", + "result" : "valid" + }, + { + "tcId" : 316, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31303530383732323032", + "sig" : "304402204ca5021a99c50916f997009a2f6addc6cb2a57cada7b1eb72821f66ec353516d022043d471d4043f8fbb0765c059d1b5386b49a530a626d26d2bed4323c0aea5d24a", + "result" : "valid" + }, + { + "tcId" : 317, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32353037373237303332", + "sig" : "3045022100eb3a1a9165de050206fa045882f7f3bd06bd02c2e825740d72d8cb2a07f45cfb0220394fa8625004c62cb1c8eea02c3411e6a036b4afe14727d497b31d7251d4a20c", + "result" : "valid" + }, + { + "tcId" : 318, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "373139333435393339", + "sig" : "304502207921badf49f2beba3bc6d696494e7f6c74edc3b722247adbc9cf54d02527ef30022100a45ef9b623bad9a24433afc7e4e2b25270cf07ab20e29ee822255b6ee8da233d", + "result" : "valid" + }, + { + "tcId" : 319, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31363337333035373633", + "sig" : "304402203e2c342f84cb36f986b72bd19867c359ad195046ef30ca7549df842d33a51ccb02205b8bfcfc785ff44ccc2651b893b5dfbc12739cc3973988dbb209cd60f4c1b4e2", + "result" : "valid" + }, + { + "tcId" : 320, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34323431323733373133", + "sig" : "3046022100919eb36b4949e319427b2113927fd40f767c11d2c6a991c558438790959c00710221009e4bfd8bcca87632071bdc109cd47e45c90f7cbbff3ff05a1591585b2f0f6537", + "result" : "valid" + }, + { + "tcId" : 321, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "343735363134373337", + "sig" : "3045022100e36e3c1918e378f12ccaefe24954c4fb77d8a227f7a234a045c2fa69ec0184c4022065f7b5def112fd96d3c3ddf3aa5bce418ae5cb7322387b18b5b15e2caa78f209", + "result" : "valid" + }, + { + "tcId" : 322, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37313632333237373334", + "sig" : "304602210089674f75b7440869f9de0cdde21ef47003309be9f0ff7f858c6f43a3b9067096022100d37781ff993210da5470ba8ce3c16a088e58e79d7fd0f5e2d2336443d9b1aeb8", + "result" : "valid" + }, + { + "tcId" : 323, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31323232343034313239", + "sig" : "30440220584c05af98b487e9a0b5dd5e0154d124aeefa55eb48a274721365e597549ec98022047b4127c6c09077615a921be38942baa053a88b73884dfadd6a745cc9c6fa096", + "result" : "valid" + }, + { + "tcId" : 324, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33353234353833333638", + "sig" : "304402205f21b554fd91ca9cdd5109a00ab3ecb2d8b5137b4fd05c254c3faaa377b3da0602205d036a7dbebf9351c88d3bbe03991690cb7b67d3b5ca4266eb25029e3a1f75e6", + "result" : "valid" + }, + { + "tcId" : 325, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3331363334333936", + "sig" : "304402206a309780826539059b3b2c9d4315bbb83b4c3afc218d440acf2d01ec0a5cdf8302205d3ea569a5ad21db62e4bc0b60251e5f65b01158f2c8821973ee6c47cd15fc34", + "result" : "valid" + }, + { + "tcId" : 326, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36353332353938343339", + "sig" : "3045022041d51f04d6fdcc5f5cacf88e50e418ef0067f8d854dc991615003f1e49927a53022100c6f7c10cad03b89460a9794a171f2e10d84982c462cbf075b06738b3f904cc5c", + "result" : "valid" + }, + { + "tcId" : 327, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "373338353138353034", + "sig" : "3046022100da8e729ac23689e868129854fbbde5c9130ebad0e555047f6c4ffccdb0d75fde022100b693c1a3ccd93e2989f84e77e0ea5983b758f4c1a2a8c4b6219b6b006e9ba1e5", + "result" : "valid" + }, + { + "tcId" : 328, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31343635323636353739", + "sig" : "304502200793b70b17c7db1ee4f84a0fcc27115355bca4036e33830bddb58aaaf21db1e9022100b884dc3329f826a3cc1766ab7f67cd31ad17b4d48e81b8641d6cf70400c80649", + "result" : "valid" + }, + { + "tcId" : 329, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32303334383839343934", + "sig" : "304402203ee201732af7f4fb862991d162a11f79fae57233ff964782db1b35b2dee67f60022078e00f30babf2d483c9e9729c50ac07df9abe878ff8edd3cd7ea3cecc30b724e", + "result" : "valid" + }, + { + "tcId" : 330, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34343730383836373835", + "sig" : "30460221008f2c4f9daeae645deb8237f2598485a7c3ac3b0e0b945641e4f24f59ffe7845a022100a7f781e40a73cc4f49159ed982ffb264097c5f34382314ba0128a52c9144fd33", + "result" : "valid" + }, + { + "tcId" : 331, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "353537363430343436", + "sig" : "30450220750dad3a83d3c3621a78dcd92f7da948c6fc68d7f0d9603835b2488515c539ae022100a0736c57503c76c2342e3f13e55f6dfb6637b1fb6ba5caf00b9e540daa7f70c6", + "result" : "valid" + }, + { + "tcId" : 332, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36333434393536363038", + "sig" : "3046022100b3d14a7f7dd693c7fd62d073cb6bc77504431d8a992cc64af774703a981db0a1022100ab8a35acce773242850c086013869631e99cf9c5378d39d0fe10ca7b504c0cf9", + "result" : "valid" + }, + { + "tcId" : 333, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34393432383039303331", + "sig" : "3046022100ff35621d420e7a8343d222f18acb46ae5a5a29320f88e2f0977acfd96d7014410221009fc29bfd8a80a24959bd4494de1b3c0a3366131aefef4fe9d33f1f91d118bb27", + "result" : "valid" + }, + { + "tcId" : 334, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "323636353831393339", + "sig" : "30450220051291f27408436b4c56cc8993b3891c5c3a4bf3747041b4d915fdccc1c67a59022100f8d6971a948332617564b4c9581850f8992752f1afe30370a4d36af72376672f", + "result" : "valid" + }, + { + "tcId" : 335, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33333332323134313134", + "sig" : "3046022100b820f2163d1a902e847c69392da7124bc31f56ecad5f73c3db142c9c8220cc6502210089c527e55e559aa5efb263860fbac04f1ce556f82bcccb49991bc2c575808aa7", + "result" : "valid" + }, + { + "tcId" : 336, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "363136353237373135", + "sig" : "304402200180c08e97d4fe407c0eab2eb7d17bae60e8ca9ad459e57cdf48389ed9ed953602207d5eaeffffba65afbf1ba9ca9bc0fe1181da76e5e41ade8687799b09e9104597", + "result" : "valid" + }, + { + "tcId" : 337, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32333539393535383133", + "sig" : "3046022100985f15f0eecc62112817bc234784d60404804ea7dba48f8c09cc02401c4e13ae022100c73d1bed7077734492c700ede8e6800e048523ef9bcffb53cc79945805ff711e", + "result" : "valid" + }, + { + "tcId" : 338, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "323931333631393538", + "sig" : "3046022100d9a5ae9012bcacfc12fa3db623d2099657d4f321460d0135bc731a70478b79bc022100a5d882aa5cf390737839443ab059d68282064d3d827bfef52fc176d0de60ed46", + "result" : "valid" + }, + { + "tcId" : 339, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31363230393033333936", + "sig" : "3046022100f070e1285c47106a1ad23a774756a3d3453a48d245401604ef59a96b9a1910c2022100b43cf52041613dbf8d3a136a0d0f6bce87cd74262224e620f355ddeced20e5bd", + "result" : "valid" + }, + { + "tcId" : 340, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33333633313032383432", + "sig" : "3046022100963a3ae4b0a7ae86047e47f375c7e42de035f28fb430c408d0d815caebefa344022100a1edd8c2d39f04f99e05a793b7970dfa76f4b1fc0663d308edee9d3ecd077d66", + "result" : "valid" + }, + { + "tcId" : 341, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "363237373433343931", + "sig" : "3046022100e6adb9139cf47dae0890006732629c8e095c13df370717a42a8bc6e8936678ef022100a8df8acc7ee7551cf0409e8c1c2fd0df6e7e9b3827e95727fa492c274e4668fc", + "result" : "valid" + }, + { + "tcId" : 342, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33383536373938313437", + "sig" : "3044022007662a36a2bb779a276145e78543c360c7d0a22a1749f69ead2788c75750d24802207c0a4dba499b27cc249a705ba7bbf512a7484b93f9a83ca9305dd49cde6a302b", + "result" : "valid" + }, + { + "tcId" : 343, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32383831313830363430", + "sig" : "3045022036df003efdbec3bf53a2a45248c1e96e60c9bcf10b4f5dfb220744d2da51fc8e022100e5f103b3a74fa1d0a78e74d604f31889e6637cff2acbb31a70726e72f392d4ba", + "result" : "valid" + }, + { + "tcId" : 344, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3130393537333934363738", + "sig" : "30440220712dc3233f462b0a37f020ec559bb1a19d879ae36210c75efcb9c071915116e1022006a981761249cc1929f5c18d6f2a76eef487bbda0c4470bb098b87b91328083f", + "result" : "valid" + }, + { + "tcId" : 345, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "353432373131393834", + "sig" : "3044022010e373d1cb4c05295b63ce7103817b7c0fd096d7c63f65f56d950a61e455c1cb022044cb5c8270c069ac408a6c9f31ace9229ab6078a36adc465107f0a3d6ddfea66", + "result" : "valid" + }, + { + "tcId" : 346, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33313530303334333235", + "sig" : "3045022100cd1274f4c89ab194203ccb5c39e7d0bc364537b84b9dd48d922e43e79e4258c2022042e1fcf72eb65d76b13128d3065daa31312bf9c110f18b4799dce8eccae52d67", + "result" : "valid" + }, + { + "tcId" : 347, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31393939383231333931", + "sig" : "30450220516c983fe6567ac700f93028da6affc598dfa95391896c544c8f73c96314a0a0022100bfa56a1833668acfd14899e8cc160b79c5e92a30055dd7c700484f6bfce42cfd", + "result" : "valid" + }, + { + "tcId" : 348, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31393731323039323631", + "sig" : "3045022052279b3df58e2aa7ddaee1e5de155cb75d4f00ec7db74ae913a6ed33dea896d4022100ef5823ff9977fa492483bcbfc1d0bd765fd6dfa78cc11e658b4984b543e0e79e", + "result" : "valid" + }, + { + "tcId" : 349, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33353731383338383537", + "sig" : "3045022001c2a04eef5827e7e04eb51802cc3859af6d84fe35aee4da4bc1b0ee154b7ef3022100dc57a107da6bb12624313660233cbdcc55ff7147ecb3a328af3e86225c89be53", + "result" : "valid" + }, + { + "tcId" : 350, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "38363832323639383935", + "sig" : "304502201ce1bb1fc78a38d4af211b5fceebd01126c10ceab1de6401e1df1dc495dbf5b5022100c9b564a0a5b9675eece3cbe33498634e7943893fe16c61ef894bd4be349a6874", + "result" : "valid" + }, + { + "tcId" : 351, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32353438383536303331", + "sig" : "3045022100b7ae42b36f060c15c6745ea4d8bd91ae2eafe0e196c52cfac4e16ab74d3048b60220421bc2dcd0854dd4e69a3e930b2cb646557bd68c800c5a2ca7bbb3ddd32370aa", + "result" : "valid" + }, + { + "tcId" : 352, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34393935373031333139", + "sig" : "3045022100d51dc206df9cfb7198e22b957c644357542264badf5aede3f7474534da0d5b220220266d172a6d6775963f9ed4fb59065c8f1948c48a51463fe79bbf1b45df7e57b9", + "result" : "valid" + }, + { + "tcId" : 353, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32343536363831373835", + "sig" : "3045022100f881b3e21684fbf899f762c8fc7c7423a2ad2c276257c99eae86b66ee39e4ae1022027207d5ccff773b26bf0d282d884b3c3a6724ba06a1671c9f9be8cbe6e3589e4", + "result" : "valid" + }, + { + "tcId" : 354, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34313835333731323336", + "sig" : "304402202455ebf62b50f958781792fdc705755923a30c0eb7d515a0988c1a14de62caad022010bd68c881416205bd95a5f2765d69726e0bce5b2a0ec525aeb1bba7d35d8e4a", + "result" : "valid" + }, + { + "tcId" : 355, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "373237383439303034", + "sig" : "30450221009119d7949d9e4c55e4c712d257c4ba3ab9d657c7e0aa7840091cb2acfb4fc25a022042524fd0c4ae8b50644cba34f86c21a42ee045ce7c15b4eb817affc78d20fdb3", + "result" : "valid" + }, + { + "tcId" : 356, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31353632383139333138", + "sig" : "30450220191e716669d84631a04cc085f03b2f1a4f55810f70bebbaf5ee13d68f2598ffb02210090f208a9f1c27911b5fb8d867bdf123dd601639c2dfa1f6a61fd2f82cadb1361", + "result" : "valid" + }, + { + "tcId" : 357, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3231383739393238333836", + "sig" : "30460221008cc2cab9f257928181c4d3685d544bec0b88b95cbbdb8ad1b0543b46b24144730221009d1d158dab8e91c68b372ade107aac5c22f8be64463b0c23340dfc828d7b7df3", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0427504e893fd62d0bfdeaa073106b16e8f8d2726a9762529764cfe8fe8a38460e21bb0ddff040b7aff8f08a60d5ae1a59472f394846ae4f58c4be0cc8a2a36501", + "wx" : "27504e893fd62d0bfdeaa073106b16e8f8d2726a9762529764cfe8fe8a38460e", + "wy" : "21bb0ddff040b7aff8f08a60d5ae1a59472f394846ae4f58c4be0cc8a2a36501" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000427504e893fd62d0bfdeaa073106b16e8f8d2726a9762529764cfe8fe8a38460e21bb0ddff040b7aff8f08a60d5ae1a59472f394846ae4f58c4be0cc8a2a36501", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEJ1BOiT/WLQv96qBzEGsW6PjScmqXYlKX\nZM/o/oo4Rg4huw3f8EC3r/jwimDVrhpZRy85SEauT1jEvgzIoqNlAQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 358, + "comment" : "k*G has a large x-coordinate", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30360211014551231950b75fc4402da1722fc9baeb022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e", + "result" : "valid" + }, + { + "tcId" : 359, + "comment" : "r too large", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2c022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04f131f6dddde59bae7b0090a47bafbb33c157ac6da439324a6681bf67f575f90beccc2fb2c0be318fda9335bb83488bcafd33be82c38318bcf845fd0e5017c248", + "wx" : "00f131f6dddde59bae7b0090a47bafbb33c157ac6da439324a6681bf67f575f90b", + "wy" : "00eccc2fb2c0be318fda9335bb83488bcafd33be82c38318bcf845fd0e5017c248" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004f131f6dddde59bae7b0090a47bafbb33c157ac6da439324a6681bf67f575f90beccc2fb2c0be318fda9335bb83488bcafd33be82c38318bcf845fd0e5017c248", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE8TH23d3lm657AJCke6+7M8FXrG2kOTJK\nZoG/Z/V1+QvszC+ywL4xj9qTNbuDSIvK/TO+gsODGLz4Rf0OUBfCSA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 360, + "comment" : "r,s are large", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "041101c496d5f8910a7749efff9dc46f68a7fd02d6975fdf15bf90efb70463cb4ede199e46e67d463aa8c752cac8a342b8fe0e9a5ba9a67416c8865c45e478007e", + "wx" : "1101c496d5f8910a7749efff9dc46f68a7fd02d6975fdf15bf90efb70463cb4e", + "wy" : "00de199e46e67d463aa8c752cac8a342b8fe0e9a5ba9a67416c8865c45e478007e" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200041101c496d5f8910a7749efff9dc46f68a7fd02d6975fdf15bf90efb70463cb4ede199e46e67d463aa8c752cac8a342b8fe0e9a5ba9a67416c8865c45e478007e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEEQHEltX4kQp3Se//ncRvaKf9AtaXX98V\nv5DvtwRjy07eGZ5G5n1GOqjHUsrIo0K4/g6aW6mmdBbIhlxF5HgAfg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 361, + "comment" : "r and s^-1 have a large Hamming weight", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02203e9a7582886089c62fb840cf3b83061cd1cff3ae4341808bb5bdee6191174177", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046e43a5c63ad0bc8d178a745192671c06500f0dbd757c3f2eae65089aaf0d648982954ff60c3460a27748445525c6cd30701725e1697891cb7f32feed128a3ae7", + "wx" : "6e43a5c63ad0bc8d178a745192671c06500f0dbd757c3f2eae65089aaf0d6489", + "wy" : "0082954ff60c3460a27748445525c6cd30701725e1697891cb7f32feed128a3ae7" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046e43a5c63ad0bc8d178a745192671c06500f0dbd757c3f2eae65089aaf0d648982954ff60c3460a27748445525c6cd30701725e1697891cb7f32feed128a3ae7", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEbkOlxjrQvI0XinRRkmccBlAPDb11fD8u\nrmUImq8NZImClU/2DDRgondIRFUlxs0wcBcl4Wl4kct/Mv7tEoo65w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 362, + "comment" : "r and s^-1 have a large Hamming weight", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022024238e70b431b1a64efdf9032669939d4b77f249503fc6905feb7540dea3e6d2", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04ef4e8b5732f51a4b2547c6581381ccf750bb6d30a07cb758865414d9a45017fbf10247bcaa4ca73d5c9ad4c8a03a60a7f5cfa07fb57437b5a6f0a9bd381d78a5", + "wx" : "00ef4e8b5732f51a4b2547c6581381ccf750bb6d30a07cb758865414d9a45017fb", + "wy" : "00f10247bcaa4ca73d5c9ad4c8a03a60a7f5cfa07fb57437b5a6f0a9bd381d78a5" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004ef4e8b5732f51a4b2547c6581381ccf750bb6d30a07cb758865414d9a45017fbf10247bcaa4ca73d5c9ad4c8a03a60a7f5cfa07fb57437b5a6f0a9bd381d78a5", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE706LVzL1GkslR8ZYE4HM91C7bTCgfLdY\nhlQU2aRQF/vxAke8qkynPVya1MigOmCn9c+gf7V0N7Wm8Km9OB14pQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 363, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020101020101", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04a973c15a44d2dcd50558e033d242155a29808b87491576566a83821b650e6f2dfc5ecd5482fa591f578308b09f2e704116a375ba1e2837912bae2972d340414d", + "wx" : "00a973c15a44d2dcd50558e033d242155a29808b87491576566a83821b650e6f2d", + "wy" : "00fc5ecd5482fa591f578308b09f2e704116a375ba1e2837912bae2972d340414d" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004a973c15a44d2dcd50558e033d242155a29808b87491576566a83821b650e6f2dfc5ecd5482fa591f578308b09f2e704116a375ba1e2837912bae2972d340414d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEqXPBWkTS3NUFWOAz0kIVWimAi4dJFXZW\naoOCG2UOby38Xs1UgvpZH1eDCLCfLnBBFqN1uh4oN5Errily00BBTQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 364, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020101020102", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "048cd31f1656b21ec27276a533c35bf51d95490bfec57868a9b94433eda4579d61bb2c8e80c45d949bcaf6f0bbc76bc27c95939945052ad1a11014756556c6f978", + "wx" : "008cd31f1656b21ec27276a533c35bf51d95490bfec57868a9b94433eda4579d61", + "wy" : "00bb2c8e80c45d949bcaf6f0bbc76bc27c95939945052ad1a11014756556c6f978" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200048cd31f1656b21ec27276a533c35bf51d95490bfec57868a9b94433eda4579d61bb2c8e80c45d949bcaf6f0bbc76bc27c95939945052ad1a11014756556c6f978", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEjNMfFlayHsJydqUzw1v1HZVJC/7FeGip\nuUQz7aRXnWG7LI6AxF2Um8r28LvHa8J8lZOZRQUq0aEQFHVlVsb5eA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 365, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020101020103", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "047f70598f1e6a18c55fa199a858cf3a825792ed14b856a5b9b8435890cd1275b559c12d120bf363568ceb79941d793f200a7bc4262bf40264a7a05dae0ab92093", + "wx" : "7f70598f1e6a18c55fa199a858cf3a825792ed14b856a5b9b8435890cd1275b5", + "wy" : "59c12d120bf363568ceb79941d793f200a7bc4262bf40264a7a05dae0ab92093" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200047f70598f1e6a18c55fa199a858cf3a825792ed14b856a5b9b8435890cd1275b559c12d120bf363568ceb79941d793f200a7bc4262bf40264a7a05dae0ab92093", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEf3BZjx5qGMVfoZmoWM86gleS7RS4VqW5\nuENYkM0SdbVZwS0SC/NjVozreZQdeT8gCnvEJiv0AmSnoF2uCrkgkw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 366, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020102020101", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04df0005c3f4290809c6fc7c924cd389b44980d4b127db6f0d85a9e65b1f54a931a51e735ca524d208a684575630fd09f090562c8985756480cb6b0a86313b9147", + "wx" : "00df0005c3f4290809c6fc7c924cd389b44980d4b127db6f0d85a9e65b1f54a931", + "wy" : "00a51e735ca524d208a684575630fd09f090562c8985756480cb6b0a86313b9147" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004df0005c3f4290809c6fc7c924cd389b44980d4b127db6f0d85a9e65b1f54a931a51e735ca524d208a684575630fd09f090562c8985756480cb6b0a86313b9147", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE3wAFw/QpCAnG/HySTNOJtEmA1LEn228N\nhanmWx9UqTGlHnNcpSTSCKaEV1Yw/QnwkFYsiYV1ZIDLawqGMTuRRw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 367, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020102020102", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "045ab9318981cb3e597dd819205d9392e8ec750c517054ceeaf103b3e0f0ba8a365f330cc411e8b3821f4e1d5a17ee2fe7b8b1cacc36fed324d9837df7b4080b20", + "wx" : "5ab9318981cb3e597dd819205d9392e8ec750c517054ceeaf103b3e0f0ba8a36", + "wy" : "5f330cc411e8b3821f4e1d5a17ee2fe7b8b1cacc36fed324d9837df7b4080b20" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200045ab9318981cb3e597dd819205d9392e8ec750c517054ceeaf103b3e0f0ba8a365f330cc411e8b3821f4e1d5a17ee2fe7b8b1cacc36fed324d9837df7b4080b20", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEWrkxiYHLPll92BkgXZOS6Ox1DFFwVM7q\n8QOz4PC6ijZfMwzEEeizgh9OHVoX7i/nuLHKzDb+0yTZg333tAgLIA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 368, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020102020103", + "result" : "valid" + }, + { + "tcId" : 369, + "comment" : "r is larger than n", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364143020103", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0446e91a1e5fd2f2e2175dd6d86d0f63329b56a4b89af1a1689879c7b372afbbf07ef4e53c35856995f1964c59dca422b2b16c34e7c248d8bf1396e65361a7091c", + "wx" : "46e91a1e5fd2f2e2175dd6d86d0f63329b56a4b89af1a1689879c7b372afbbf0", + "wy" : "7ef4e53c35856995f1964c59dca422b2b16c34e7c248d8bf1396e65361a7091c" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000446e91a1e5fd2f2e2175dd6d86d0f63329b56a4b89af1a1689879c7b372afbbf07ef4e53c35856995f1964c59dca422b2b16c34e7c248d8bf1396e65361a7091c", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAERukaHl/S8uIXXdbYbQ9jMptWpLia8aFo\nmHnHs3Kvu/B+9OU8NYVplfGWTFncpCKysWw058JI2L8TluZTYacJHA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 370, + "comment" : "s is larger than n", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3026020102022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd04917c8", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046d4f41c9c4c15f02a199264a51266ed793952a7cea79125dcded805ed7a54c1350314fa927966b90b6c4e57cb521666fce4cb81b7e4d3550d729fe6dd6bbe5ab", + "wx" : "6d4f41c9c4c15f02a199264a51266ed793952a7cea79125dcded805ed7a54c13", + "wy" : "50314fa927966b90b6c4e57cb521666fce4cb81b7e4d3550d729fe6dd6bbe5ab" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046d4f41c9c4c15f02a199264a51266ed793952a7cea79125dcded805ed7a54c1350314fa927966b90b6c4e57cb521666fce4cb81b7e4d3550d729fe6dd6bbe5ab", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEbU9BycTBXwKhmSZKUSZu15OVKnzqeRJd\nze2AXtelTBNQMU+pJ5ZrkLbE5Xy1IWZvzky4G35NNVDXKf5t1rvlqw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 371, + "comment" : "small r and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "302702020101022100c58b162c58b162c58b162c58b162c58a1b242973853e16db75c8a1a71da4d39d", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "043bd4a602119bc50cfd05aa395c3c9f753b383bdd9539d27a1a143033fcfcaaa892d75438eba5af693196d4b7953184e2d649a0845d11af3c7d39e3b1f5449c19", + "wx" : "3bd4a602119bc50cfd05aa395c3c9f753b383bdd9539d27a1a143033fcfcaaa8", + "wy" : "0092d75438eba5af693196d4b7953184e2d649a0845d11af3c7d39e3b1f5449c19" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200043bd4a602119bc50cfd05aa395c3c9f753b383bdd9539d27a1a143033fcfcaaa892d75438eba5af693196d4b7953184e2d649a0845d11af3c7d39e3b1f5449c19", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEO9SmAhGbxQz9Bao5XDyfdTs4O92VOdJ6\nGhQwM/z8qqiS11Q466WvaTGW1LeVMYTi1kmghF0Rrzx9OeOx9UScGQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 372, + "comment" : "smallish r and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "302c02072d9b4d347952cc022100fcbc5103d0da267477d1791461cf2aa44bf9d43198f79507bd8779d69a13108e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "047c981d6870575725427fc84ce6b5f706af6e8c62b4b5f7f72c3ee2860836996d29f07476cbf3f93a34e73f737658070642c66d0e34f5d56c715a26b099078413", + "wx" : "7c981d6870575725427fc84ce6b5f706af6e8c62b4b5f7f72c3ee2860836996d", + "wy" : "29f07476cbf3f93a34e73f737658070642c66d0e34f5d56c715a26b099078413" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200047c981d6870575725427fc84ce6b5f706af6e8c62b4b5f7f72c3ee2860836996d29f07476cbf3f93a34e73f737658070642c66d0e34f5d56c715a26b099078413", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEfJgdaHBXVyVCf8hM5rX3Bq9ujGK0tff3\nLD7ihgg2mW0p8HR2y/P5OjTnP3N2WAcGQsZtDjT11WxxWiawmQeEEw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 373, + "comment" : "100-bit r and small s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3032020d1033e67e37b32b445580bf4efc022100906f906f906f906f906f906f906f906ed8e426f7b1968c35a204236a579723d2", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04d75a78cf296b58aeb52faee6a9348385bcdc61f980da8ad6f28654d86fe516e20ce9952182f5f06cba50db8c65aa6f8cf1a32f2a46599c0a2abb4c1402cef467", + "wx" : "00d75a78cf296b58aeb52faee6a9348385bcdc61f980da8ad6f28654d86fe516e2", + "wy" : "0ce9952182f5f06cba50db8c65aa6f8cf1a32f2a46599c0a2abb4c1402cef467" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d75a78cf296b58aeb52faee6a9348385bcdc61f980da8ad6f28654d86fe516e20ce9952182f5f06cba50db8c65aa6f8cf1a32f2a46599c0a2abb4c1402cef467", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE11p4zylrWK61L67mqTSDhbzcYfmA2orW\n8oZU2G/lFuIM6ZUhgvXwbLpQ24xlqm+M8aMvKkZZnAoqu0wUAs70Zw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 374, + "comment" : "small r and 100 bit s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3026020201010220783266e90f43dafe5cd9b3b0be86de22f9de83677d0f50713a468ec72fcf5d57", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "040a35a42fb4057e11e332442d73729cdc684e7e0a7875ec933337e74ab1e17de62152e3a6558865d7f30a950c64e9f2e9d2f06c2703d2a1984a79445d3870a1cf", + "wx" : "0a35a42fb4057e11e332442d73729cdc684e7e0a7875ec933337e74ab1e17de6", + "wy" : "2152e3a6558865d7f30a950c64e9f2e9d2f06c2703d2a1984a79445d3870a1cf" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200040a35a42fb4057e11e332442d73729cdc684e7e0a7875ec933337e74ab1e17de62152e3a6558865d7f30a950c64e9f2e9d2f06c2703d2a1984a79445d3870a1cf", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAECjWkL7QFfhHjMkQtc3Kc3GhOfgp4deyT\nMzfnSrHhfeYhUuOmVYhl1/MKlQxk6fLp0vBsJwPSoZhKeURdOHChzw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 375, + "comment" : "100-bit r and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3031020d062522bbd3ecbe7c39e93e7c260220783266e90f43dafe5cd9b3b0be86de22f9de83677d0f50713a468ec72fcf5d57", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04705e0c3ea1ca443a0105896e7af2b891a08243cca510cb5fffaebdd86ec6fc8c25d116fcf912e8246a64d5878436dfc958b59d4662a4b227a006876b5042fa58", + "wx" : "705e0c3ea1ca443a0105896e7af2b891a08243cca510cb5fffaebdd86ec6fc8c", + "wy" : "25d116fcf912e8246a64d5878436dfc958b59d4662a4b227a006876b5042fa58" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004705e0c3ea1ca443a0105896e7af2b891a08243cca510cb5fffaebdd86ec6fc8c25d116fcf912e8246a64d5878436dfc958b59d4662a4b227a006876b5042fa58", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEcF4MPqHKRDoBBYluevK4kaCCQ8ylEMtf\n/6692G7G/Iwl0Rb8+RLoJGpk1YeENt/JWLWdRmKksiegBodrUEL6WA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 376, + "comment" : "r and s^-1 are close to n", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03640c1022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04fce5ea1fb9571f170fd246c0eaf46e987d1fd3cd1dac1dc80828fb57e7b400f9610daa982627a64cff6cba23ba753de757dd772fb8055d33dfd6a5f4173f76ea", + "wx" : "00fce5ea1fb9571f170fd246c0eaf46e987d1fd3cd1dac1dc80828fb57e7b400f9", + "wy" : "610daa982627a64cff6cba23ba753de757dd772fb8055d33dfd6a5f4173f76ea" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004fce5ea1fb9571f170fd246c0eaf46e987d1fd3cd1dac1dc80828fb57e7b400f9610daa982627a64cff6cba23ba753de757dd772fb8055d33dfd6a5f4173f76ea", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE/OXqH7lXHxcP0kbA6vRumH0f080drB3I\nCCj7V+e0APlhDaqYJiemTP9suiO6dT3nV913L7gFXTPf1qX0Fz926g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 377, + "comment" : "r and s are 64-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30160209009c44febf31c3594d020900839ed28247c2b06b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04a49b1e3904315d7b9eccdb36fad8160ed6274ee4cf0c7effcb00d7ebcba5f1987a7f70c69a7bb789ad3cb33d5953f93eda39011490d1754c898f12f5a6b5c65b", + "wx" : "00a49b1e3904315d7b9eccdb36fad8160ed6274ee4cf0c7effcb00d7ebcba5f198", + "wy" : "7a7f70c69a7bb789ad3cb33d5953f93eda39011490d1754c898f12f5a6b5c65b" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004a49b1e3904315d7b9eccdb36fad8160ed6274ee4cf0c7effcb00d7ebcba5f1987a7f70c69a7bb789ad3cb33d5953f93eda39011490d1754c898f12f5a6b5c65b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEpJseOQQxXXuezNs2+tgWDtYnTuTPDH7/\nywDX68ul8Zh6f3DGmnu3ia08sz1ZU/k+2jkBFJDRdUyJjxL1prXGWw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 378, + "comment" : "r and s are 100-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "301e020d09df8b682430beef6f5fd7c7cf020d0fd0a62e13778f4222a0d61c8a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0418e9a2cc13f31868988806d92026684bd6a6c18a4c5ddad4a03de692fe7302b8cfcc5578f705ee864035bef8c5ea2d2d766f63b2b3bb45b0d4b73902d241c3ae", + "wx" : "18e9a2cc13f31868988806d92026684bd6a6c18a4c5ddad4a03de692fe7302b8", + "wy" : "00cfcc5578f705ee864035bef8c5ea2d2d766f63b2b3bb45b0d4b73902d241c3ae" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000418e9a2cc13f31868988806d92026684bd6a6c18a4c5ddad4a03de692fe7302b8cfcc5578f705ee864035bef8c5ea2d2d766f63b2b3bb45b0d4b73902d241c3ae", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEGOmizBPzGGiYiAbZICZoS9amwYpMXdrU\noD3mkv5zArjPzFV49wXuhkA1vvjF6i0tdm9jsrO7RbDUtzkC0kHDrg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 379, + "comment" : "r and s are 128-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30260211008a598e563a89f526c32ebec8de26367a02110084f633e2042630e99dd0f1e16f7a04bf", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046fcfda69628fe333e4dbb6237fd420a7d91965591d761bd2c1595e8029c4b194750d82e9f366db1304472248240549b3c95d2ddcb0e7944b1ba217c432c7d064", + "wx" : "6fcfda69628fe333e4dbb6237fd420a7d91965591d761bd2c1595e8029c4b194", + "wy" : "750d82e9f366db1304472248240549b3c95d2ddcb0e7944b1ba217c432c7d064" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046fcfda69628fe333e4dbb6237fd420a7d91965591d761bd2c1595e8029c4b194750d82e9f366db1304472248240549b3c95d2ddcb0e7944b1ba217c432c7d064", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEb8/aaWKP4zPk27Yjf9Qgp9kZZVkddhvS\nwVlegCnEsZR1DYLp82bbEwRHIkgkBUmzyV0t3LDnlEsbohfEMsfQZA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 380, + "comment" : "r and s are 160-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "302e021500aa6eeb5823f7fa31b466bb473797f0d0314c0bdf021500e2977c479e6d25703cebbc6bd561938cc9d1bfb9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04e322c7aad4a70024c4f80ea373e7e85f23dcbd11f186d55d5a744cd0f459f6db71d54db09ec66eeadbedbacfe2255bb87d0c1a737b3d3b1c7b76ce78d6342d7c", + "wx" : "00e322c7aad4a70024c4f80ea373e7e85f23dcbd11f186d55d5a744cd0f459f6db", + "wy" : "71d54db09ec66eeadbedbacfe2255bb87d0c1a737b3d3b1c7b76ce78d6342d7c" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004e322c7aad4a70024c4f80ea373e7e85f23dcbd11f186d55d5a744cd0f459f6db71d54db09ec66eeadbedbacfe2255bb87d0c1a737b3d3b1c7b76ce78d6342d7c", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE4yLHqtSnACTE+A6jc+foXyPcvRHxhtVd\nWnRM0PRZ9ttx1U2wnsZu6tvtus/iJVu4fQwac3s9Oxx7ds541jQtfA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 381, + "comment" : "s == 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3025022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1020101", + "result" : "valid" + }, + { + "tcId" : 382, + "comment" : "s == 0", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3025022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1020100", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "040d41fafcb0d752323bb2f5baae661dca8564a82bb685faf7869a1944bf1f9c6e5c5639c7a3018b84cfd509cbac7bd1913d8adf7e4d4d416ba9e8f0fed6bf20d8", + "wx" : "0d41fafcb0d752323bb2f5baae661dca8564a82bb685faf7869a1944bf1f9c6e", + "wy" : "5c5639c7a3018b84cfd509cbac7bd1913d8adf7e4d4d416ba9e8f0fed6bf20d8" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200040d41fafcb0d752323bb2f5baae661dca8564a82bb685faf7869a1944bf1f9c6e5c5639c7a3018b84cfd509cbac7bd1913d8adf7e4d4d416ba9e8f0fed6bf20d8", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEDUH6/LDXUjI7svW6rmYdyoVkqCu2hfr3\nhpoZRL8fnG5cVjnHowGLhM/VCcuse9GRPYrffk1NQWup6PD+1r8g2A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 383, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c10220419d981c515af8cc82545aac0c85e9e308fbb2eab6acd7ed497e0b4145a18fd9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04dc1fec92e7b225ada1677018b6362c614ea5c5a670f836ac485ce893d376ab24bd06303b42c4e6b568e8fb8a37e603f805bc4b2cc9e0e9daa635db16cdae9e79", + "wx" : "00dc1fec92e7b225ada1677018b6362c614ea5c5a670f836ac485ce893d376ab24", + "wy" : "00bd06303b42c4e6b568e8fb8a37e603f805bc4b2cc9e0e9daa635db16cdae9e79" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004dc1fec92e7b225ada1677018b6362c614ea5c5a670f836ac485ce893d376ab24bd06303b42c4e6b568e8fb8a37e603f805bc4b2cc9e0e9daa635db16cdae9e79", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE3B/skueyJa2hZ3AYtjYsYU6lxaZw+Das\nSFzok9N2qyS9BjA7QsTmtWjo+4o35gP4BbxLLMng6dqmNdsWza6eeQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 384, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102201b21717ad71d23bbac60a9ad0baf75b063c9fdf52a00ebf99d022172910993c9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0478fc8e5b816f37ee0d0fee4fa449b0dfacfbb9667a850bf2e62f6582606a8a0d4176387e658fbb0794b08659e984131fbdf2c855439232e0b2485fa2734b8092", + "wx" : "78fc8e5b816f37ee0d0fee4fa449b0dfacfbb9667a850bf2e62f6582606a8a0d", + "wy" : "4176387e658fbb0794b08659e984131fbdf2c855439232e0b2485fa2734b8092" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000478fc8e5b816f37ee0d0fee4fa449b0dfacfbb9667a850bf2e62f6582606a8a0d4176387e658fbb0794b08659e984131fbdf2c855439232e0b2485fa2734b8092", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEePyOW4FvN+4ND+5PpEmw36z7uWZ6hQvy\n5i9lgmBqig1Bdjh+ZY+7B5SwhlnphBMfvfLIVUOSMuCySF+ic0uAkg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 385, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102202f588f66018f3dd14db3e28e77996487e32486b521ed8e5a20f06591951777e9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "040a17ab990fe429a96a0d6a6d297795128f66e4ecc3e83913d1846a0c0bfb4daeb90a3909bb40d9d61d9c0419dd6f01788621a3cbb036db2cc4b21a35680d733d", + "wx" : "0a17ab990fe429a96a0d6a6d297795128f66e4ecc3e83913d1846a0c0bfb4dae", + "wy" : "00b90a3909bb40d9d61d9c0419dd6f01788621a3cbb036db2cc4b21a35680d733d" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200040a17ab990fe429a96a0d6a6d297795128f66e4ecc3e83913d1846a0c0bfb4daeb90a3909bb40d9d61d9c0419dd6f01788621a3cbb036db2cc4b21a35680d733d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEChermQ/kKalqDWptKXeVEo9m5OzD6DkT\n0YRqDAv7Ta65CjkJu0DZ1h2cBBndbwF4hiGjy7A22yzEsho1aA1zPQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 386, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c10220091a08870ff4daf9123b30c20e8c4fc8505758dcf4074fcaff2170c9bfcf74f4", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0439a08df231316804509067d6f25523c055726326df3e3efa94c419e288d377bf0e06e100b23d85472fb0788007e2e1bb7f60db6ecd832f276e0739ae5bbe7830", + "wx" : "39a08df231316804509067d6f25523c055726326df3e3efa94c419e288d377bf", + "wy" : "0e06e100b23d85472fb0788007e2e1bb7f60db6ecd832f276e0739ae5bbe7830" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000439a08df231316804509067d6f25523c055726326df3e3efa94c419e288d377bf0e06e100b23d85472fb0788007e2e1bb7f60db6ecd832f276e0739ae5bbe7830", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEOaCN8jExaARQkGfW8lUjwFVyYybfPj76\nlMQZ4ojTd78OBuEAsj2FRy+weIAH4uG7f2Dbbs2DLyduBzmuW754MA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 387, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102207c370dc0ce8c59a8b273cba44a7c1191fc3186dc03cab96b0567312df0d0b250", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0479071e08d1bace014c34b92e6c29ccbe1dcfc7e80f16c3d92855e7cefe669eca5d3a11a4e45e54377cfb3ea394db876c354e1e90d35382799fbf95ae491cf935", + "wx" : "79071e08d1bace014c34b92e6c29ccbe1dcfc7e80f16c3d92855e7cefe669eca", + "wy" : "5d3a11a4e45e54377cfb3ea394db876c354e1e90d35382799fbf95ae491cf935" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000479071e08d1bace014c34b92e6c29ccbe1dcfc7e80f16c3d92855e7cefe669eca5d3a11a4e45e54377cfb3ea394db876c354e1e90d35382799fbf95ae491cf935", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEeQceCNG6zgFMNLkubCnMvh3Px+gPFsPZ\nKFXnzv5mnspdOhGk5F5UN3z7PqOU24dsNU4ekNNTgnmfv5WuSRz5NQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 388, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1022070b59a7d1ee77a2f9e0491c2a7cfcd0ed04df4a35192f6132dcc668c79a6160e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0490d871670e972d948d86e0833b12935697a38cc17c96f4c6f11861c4967231adad5ec81f335e44d269956a0a36ec30e391d84f6147c945e50336d1158017ba06", + "wx" : "0090d871670e972d948d86e0833b12935697a38cc17c96f4c6f11861c4967231ad", + "wy" : "00ad5ec81f335e44d269956a0a36ec30e391d84f6147c945e50336d1158017ba06" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000490d871670e972d948d86e0833b12935697a38cc17c96f4c6f11861c4967231adad5ec81f335e44d269956a0a36ec30e391d84f6147c945e50336d1158017ba06", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEkNhxZw6XLZSNhuCDOxKTVpejjMF8lvTG\n8RhhxJZyMa2tXsgfM15E0mmVago27DDjkdhPYUfJReUDNtEVgBe6Bg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 389, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102202736d76e412246e097148e2bf62915614eb7c428913a58eb5e9cd4674a9423de", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0482914065bdb591606c6e4b4c430231155a55ac14fdd776d3ddb5460a5ab257e1a6b739fc234dba288922b9797ade8f87912784632348c5326708133247a43209", + "wx" : "0082914065bdb591606c6e4b4c430231155a55ac14fdd776d3ddb5460a5ab257e1", + "wy" : "00a6b739fc234dba288922b9797ade8f87912784632348c5326708133247a43209" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000482914065bdb591606c6e4b4c430231155a55ac14fdd776d3ddb5460a5ab257e1a6b739fc234dba288922b9797ade8f87912784632348c5326708133247a43209", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEgpFAZb21kWBsbktMQwIxFVpVrBT913bT\n3bVGClqyV+Gmtzn8I026KIkiuXl63o+HkSeEYyNIxTJnCBMyR6QyCQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 390, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102204a1e12831fbe93627b02d6e7f24bccdd6ef4b2d0f46739eaf3b1eaf0ca117770", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04be0ae560e37ac967a77da53d0aed473242c7eebeeaf8d9e423d3e7f3f36ac5ed9a5123407ea4cde90bfa2b7697dfabbee4fd8641f1e4a4b51ae5c8cf5a05006c", + "wx" : "00be0ae560e37ac967a77da53d0aed473242c7eebeeaf8d9e423d3e7f3f36ac5ed", + "wy" : "009a5123407ea4cde90bfa2b7697dfabbee4fd8641f1e4a4b51ae5c8cf5a05006c" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004be0ae560e37ac967a77da53d0aed473242c7eebeeaf8d9e423d3e7f3f36ac5ed9a5123407ea4cde90bfa2b7697dfabbee4fd8641f1e4a4b51ae5c8cf5a05006c", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEvgrlYON6yWenfaU9Cu1HMkLH7r7q+Nnk\nI9Pn8/Nqxe2aUSNAfqTN6Qv6K3aX36u+5P2GQfHkpLUa5cjPWgUAbA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 391, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1022006c778d4dfff7dee06ed88bc4e0ed34fc553aad67caf796f2a1c6487c1b2e877", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "048cfd6bf55f472fb38463580e07fca982248759ec780e2899a9395d57256c6fa2916c93ec5410f0403471fbd6385c83aa7d051cb18bf49453b030b16f814e50c2", + "wx" : "008cfd6bf55f472fb38463580e07fca982248759ec780e2899a9395d57256c6fa2", + "wy" : "00916c93ec5410f0403471fbd6385c83aa7d051cb18bf49453b030b16f814e50c2" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200048cfd6bf55f472fb38463580e07fca982248759ec780e2899a9395d57256c6fa2916c93ec5410f0403471fbd6385c83aa7d051cb18bf49453b030b16f814e50c2", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEjP1r9V9HL7OEY1gOB/ypgiSHWex4DiiZ\nqTldVyVsb6KRbJPsVBDwQDRx+9Y4XIOqfQUcsYv0lFOwMLFvgU5Qwg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 392, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102204de459ef9159afa057feb3ec40fef01c45b809f4ab296ea48c206d4249a2b451", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04db40ec05765b314b30d6d3856a7b60fb19ce16e0f79943aecb454c0e67d58956a0c608b9c60dbb59fe04dc0d33e8a884ec922a1ed3a35f6055949e7c9563a99d", + "wx" : "00db40ec05765b314b30d6d3856a7b60fb19ce16e0f79943aecb454c0e67d58956", + "wy" : "00a0c608b9c60dbb59fe04dc0d33e8a884ec922a1ed3a35f6055949e7c9563a99d" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004db40ec05765b314b30d6d3856a7b60fb19ce16e0f79943aecb454c0e67d58956a0c608b9c60dbb59fe04dc0d33e8a884ec922a1ed3a35f6055949e7c9563a99d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE20DsBXZbMUsw1tOFantg+xnOFuD3mUOu\ny0VMDmfViVagxgi5xg27Wf4E3A0z6KiE7JIqHtOjX2BVlJ58lWOpnQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 393, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c10220745d294978007302033502e1acc48b63ae6500be43adbea1b258d6b423dbb416", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "043301d39ed85ef80f592718086252f897e4db67f3e1d6edb2cf9ad936b1f0f8976f5fc066c02ddf19634e8e9ba2f62e2874f4157af3342348cdf082979ef2d6ac", + "wx" : "3301d39ed85ef80f592718086252f897e4db67f3e1d6edb2cf9ad936b1f0f897", + "wy" : "6f5fc066c02ddf19634e8e9ba2f62e2874f4157af3342348cdf082979ef2d6ac" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200043301d39ed85ef80f592718086252f897e4db67f3e1d6edb2cf9ad936b1f0f8976f5fc066c02ddf19634e8e9ba2f62e2874f4157af3342348cdf082979ef2d6ac", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEMwHTnthe+A9ZJxgIYlL4l+TbZ/Ph1u2y\nz5rZNrHw+JdvX8BmwC3fGWNOjpui9i4odPQVevM0I0jN8IKXnvLWrA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 394, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102207b2a785e3896f59b2d69da57648e80ad3c133a750a2847fd2098ccd902042b6c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04b2545a3088538196d9c37af2ba1fa243380c78fb68a68b11f16dbdf6dbf53892017edaf2d350277e5ecbb595e4facfc38dfdb8a61ff1c1dd349ca00842d208ff", + "wx" : "00b2545a3088538196d9c37af2ba1fa243380c78fb68a68b11f16dbdf6dbf53892", + "wy" : "017edaf2d350277e5ecbb595e4facfc38dfdb8a61ff1c1dd349ca00842d208ff" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004b2545a3088538196d9c37af2ba1fa243380c78fb68a68b11f16dbdf6dbf53892017edaf2d350277e5ecbb595e4facfc38dfdb8a61ff1c1dd349ca00842d208ff", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEslRaMIhTgZbZw3ryuh+iQzgMePtoposR\n8W299tv1OJIBftry01Anfl7LtZXk+s/Djf24ph/xwd00nKAIQtII/w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 395, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1022071ae94a72ca896875e7aa4a4c3d29afdb4b35b6996273e63c47ac519256c5eb1", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0493147e90217bd5a82bf39d7687dbd0c37f6e076629cb65f7d5d1328641ef1f38f4c81dd74368522382c1d566aac6d5ac71e4082bc7376df5d2b9aa5257ef3959", + "wx" : "0093147e90217bd5a82bf39d7687dbd0c37f6e076629cb65f7d5d1328641ef1f38", + "wy" : "00f4c81dd74368522382c1d566aac6d5ac71e4082bc7376df5d2b9aa5257ef3959" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000493147e90217bd5a82bf39d7687dbd0c37f6e076629cb65f7d5d1328641ef1f38f4c81dd74368522382c1d566aac6d5ac71e4082bc7376df5d2b9aa5257ef3959", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEkxR+kCF71agr8512h9vQw39uB2Ypy2X3\n1dEyhkHvHzj0yB3XQ2hSI4LB1WaqxtWsceQIK8c3bfXSuapSV+85WQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 396, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102200fa527fa7343c0bc9ec35a6278bfbff4d83301b154fc4bd14aee7eb93445b5f9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "043f7dcde1421597eb180d5c5ca1a9d68683ed7818b3c3d4b04b6fc913c48506085cb4f64eb20d31fea8408e66f714dce4351e04c7d299ad1b21c8dfc781b528c3", + "wx" : "3f7dcde1421597eb180d5c5ca1a9d68683ed7818b3c3d4b04b6fc913c4850608", + "wy" : "5cb4f64eb20d31fea8408e66f714dce4351e04c7d299ad1b21c8dfc781b528c3" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200043f7dcde1421597eb180d5c5ca1a9d68683ed7818b3c3d4b04b6fc913c48506085cb4f64eb20d31fea8408e66f714dce4351e04c7d299ad1b21c8dfc781b528c3", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEP33N4UIVl+sYDVxcoanWhoPteBizw9Sw\nS2/JE8SFBghctPZOsg0x/qhAjmb3FNzkNR4Ex9KZrRshyN/HgbUoww==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 397, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102206539c0adadd0525ff42622164ce9314348bd0863b4c80e936b23ca0414264671", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "044b242ee4a0a37835c590f6abe1af6668476c9c12c15b8aff776c7e7a8a452319b720cffae6423cf47aa375fe3b84346a83b09e0efa245eb89d99b2585451603d", + "wx" : "4b242ee4a0a37835c590f6abe1af6668476c9c12c15b8aff776c7e7a8a452319", + "wy" : "00b720cffae6423cf47aa375fe3b84346a83b09e0efa245eb89d99b2585451603d" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200044b242ee4a0a37835c590f6abe1af6668476c9c12c15b8aff776c7e7a8a452319b720cffae6423cf47aa375fe3b84346a83b09e0efa245eb89d99b2585451603d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAESyQu5KCjeDXFkPar4a9maEdsnBLBW4r/\nd2x+eopFIxm3IM/65kI89Hqjdf47hDRqg7CeDvokXridmbJYVFFgPQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 398, + "comment" : "point at infinity during verify", + "flags" : [ + "PointDuplication", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04f9532aa189138b5e203f8f3a9acf03affa80794f37b647ac289267e8293ededc61ac8ac734bc4c7676bbbf57ead50b4981d9bceee0172e947c22c05f4424c9b2", + "wx" : "00f9532aa189138b5e203f8f3a9acf03affa80794f37b647ac289267e8293ededc", + "wy" : "61ac8ac734bc4c7676bbbf57ead50b4981d9bceee0172e947c22c05f4424c9b2" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004f9532aa189138b5e203f8f3a9acf03affa80794f37b647ac289267e8293ededc61ac8ac734bc4c7676bbbf57ead50b4981d9bceee0172e947c22c05f4424c9b2", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE+VMqoYkTi14gP486ms8Dr/qAeU83tkes\nKJJn6Ck+3txhrIrHNLxMdna7v1fq1QtJgdm87uAXLpR8IsBfRCTJsg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 399, + "comment" : "edge case for signature malleability", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a002207fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "040f2256392bbc44714d5fd698b611b7140c3031845f14f8660baea5ec830088f5d5650dc0f784bd907f41b13936a2d13d0e05deb103efb069f8a771b527322155", + "wx" : "0f2256392bbc44714d5fd698b611b7140c3031845f14f8660baea5ec830088f5", + "wy" : "00d5650dc0f784bd907f41b13936a2d13d0e05deb103efb069f8a771b527322155" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200040f2256392bbc44714d5fd698b611b7140c3031845f14f8660baea5ec830088f5d5650dc0f784bd907f41b13936a2d13d0e05deb103efb069f8a771b527322155", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEDyJWOSu8RHFNX9aYthG3FAwwMYRfFPhm\nC66l7IMAiPXVZQ3A94S9kH9BsTk2otE9DgXesQPvsGn4p3G1JzIhVQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 400, + "comment" : "edge case for signature malleability", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a002207fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04260b66d47b3a3be44364f1fbdd576b824893ce43c78e474db3c1b25106fb486503620b6068877f8b9018efe98191b24cf667053c09ca94da7bcf854bf6924332", + "wx" : "260b66d47b3a3be44364f1fbdd576b824893ce43c78e474db3c1b25106fb4865", + "wy" : "03620b6068877f8b9018efe98191b24cf667053c09ca94da7bcf854bf6924332" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004260b66d47b3a3be44364f1fbdd576b824893ce43c78e474db3c1b25106fb486503620b6068877f8b9018efe98191b24cf667053c09ca94da7bcf854bf6924332", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEJgtm1Hs6O+RDZPH73VdrgkiTzkPHjkdN\ns8GyUQb7SGUDYgtgaId/i5AY7+mBkbJM9mcFPAnKlNp7z4VL9pJDMg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 401, + "comment" : "u1 == 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b802205731b7c4bd04cb9efb836935ff2e547bf2909f86824af4d8df78acf76d7b3d4e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0430549bef5174962c5650944bbd7833220338e2e31f27775666f7d124d8ed7783f43ee6599a8458c9d786dd50cc676babf489757ade3e267d87bf2654a34adb20", + "wx" : "30549bef5174962c5650944bbd7833220338e2e31f27775666f7d124d8ed7783", + "wy" : "00f43ee6599a8458c9d786dd50cc676babf489757ade3e267d87bf2654a34adb20" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000430549bef5174962c5650944bbd7833220338e2e31f27775666f7d124d8ed7783f43ee6599a8458c9d786dd50cc676babf489757ade3e267d87bf2654a34adb20", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEMFSb71F0lixWUJRLvXgzIgM44uMfJ3dW\nZvfRJNjtd4P0PuZZmoRYydeG3VDMZ2ur9Il1et4+Jn2HvyZUo0rbIA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 402, + "comment" : "u1 == n - 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022100a8ce483b42fb3461047c96ca00d1ab82c81e3d602cfdab62e059b19562bb03f3", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0422283ca6f055439e8540454f63ff02e2e1141d10e34a54737599fae66266636dc8fef97c98fa1160f829b7c1326a069e0bb442428f1503e8cfbb616cd8118832", + "wx" : "22283ca6f055439e8540454f63ff02e2e1141d10e34a54737599fae66266636d", + "wy" : "00c8fef97c98fa1160f829b7c1326a069e0bb442428f1503e8cfbb616cd8118832" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000422283ca6f055439e8540454f63ff02e2e1141d10e34a54737599fae66266636dc8fef97c98fa1160f829b7c1326a069e0bb442428f1503e8cfbb616cd8118832", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEIig8pvBVQ56FQEVPY/8C4uEUHRDjSlRz\ndZn65mJmY23I/vl8mPoRYPgpt8EyagaeC7RCQo8VA+jPu2Fs2BGIMg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 403, + "comment" : "u2 == 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04068f523d44cbb14a249394861c4f417c19dba72f74e1b123b4cbb89c74541b4144cd654d2b5871942e8d181f9e38f3946b3a73755a20e68ba555d56de6e290f4", + "wx" : "068f523d44cbb14a249394861c4f417c19dba72f74e1b123b4cbb89c74541b41", + "wy" : "44cd654d2b5871942e8d181f9e38f3946b3a73755a20e68ba555d56de6e290f4" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004068f523d44cbb14a249394861c4f417c19dba72f74e1b123b4cbb89c74541b4144cd654d2b5871942e8d181f9e38f3946b3a73755a20e68ba555d56de6e290f4", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEBo9SPUTLsUokk5SGHE9BfBnbpy904bEj\ntMu4nHRUG0FEzWVNK1hxlC6NGB+eOPOUazpzdVog5oulVdVt5uKQ9A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 404, + "comment" : "u2 == n - 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022100aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b89", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04123670ccceb86a9d5fce24f070de8dfab093ee66047b17c1d7cca4734820daed76495f92804999f894c0184f72235b2db0a7d8ad077427b346d41f24eb2210a1", + "wx" : "123670ccceb86a9d5fce24f070de8dfab093ee66047b17c1d7cca4734820daed", + "wy" : "76495f92804999f894c0184f72235b2db0a7d8ad077427b346d41f24eb2210a1" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004123670ccceb86a9d5fce24f070de8dfab093ee66047b17c1d7cca4734820daed76495f92804999f894c0184f72235b2db0a7d8ad077427b346d41f24eb2210a1", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEEjZwzM64ap1fziTwcN6N+rCT7mYEexfB\n18ykc0gg2u12SV+SgEmZ+JTAGE9yI1stsKfYrQd0J7NG1B8k6yIQoQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 405, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02201d109296e9ac43dfa92bcdbcaa64c6d3fb858a822b6e519d9fd2e45279d3bf1a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04f5ab53b565f170a3a83e61dc8cb5bb3a217398f0880db80c41da746d533993973d113d69a23e02aeb2e335b28b85490ace7df18279e2f4a7bd6f69c656fe6763", + "wx" : "00f5ab53b565f170a3a83e61dc8cb5bb3a217398f0880db80c41da746d53399397", + "wy" : "3d113d69a23e02aeb2e335b28b85490ace7df18279e2f4a7bd6f69c656fe6763" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004f5ab53b565f170a3a83e61dc8cb5bb3a217398f0880db80c41da746d533993973d113d69a23e02aeb2e335b28b85490ace7df18279e2f4a7bd6f69c656fe6763", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE9atTtWXxcKOoPmHcjLW7OiFzmPCIDbgM\nQdp0bVM5k5c9ET1poj4CrrLjNbKLhUkKzn3xgnni9Ke9b2nGVv5nYw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 406, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02203a8a53a9b98a2111e0c5e758a61f57822ead6ac1b9489d7b1bae29dc1dda7a87", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04d0abcee886b680233390f1e6d5ce27056cbfec35ba9231725849a3714b06e8285bb11395652a85301cf5110d75d404a1f449ab2ac4767013fd586a9b58114006", + "wx" : "00d0abcee886b680233390f1e6d5ce27056cbfec35ba9231725849a3714b06e828", + "wy" : "5bb11395652a85301cf5110d75d404a1f449ab2ac4767013fd586a9b58114006" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d0abcee886b680233390f1e6d5ce27056cbfec35ba9231725849a3714b06e8285bb11395652a85301cf5110d75d404a1f449ab2ac4767013fd586a9b58114006", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE0KvO6Ia2gCMzkPHm1c4nBWy/7DW6kjFy\nWEmjcUsG6ChbsROVZSqFMBz1EQ111ASh9EmrKsR2cBP9WGqbWBFABg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 407, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100ac2416840b83e89e188d94463bd19cdc296fb2f891782dbd736b7241d371e890", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "040f82392f4912bad8f4fcb151b290003174526a8cb27091d38c2aed163040698cdc34e9542d264ecffcd6339963804d68fc8a7376312b8a590d836e1ce1a9e637", + "wx" : "0f82392f4912bad8f4fcb151b290003174526a8cb27091d38c2aed163040698c", + "wy" : "00dc34e9542d264ecffcd6339963804d68fc8a7376312b8a590d836e1ce1a9e637" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200040f82392f4912bad8f4fcb151b290003174526a8cb27091d38c2aed163040698cdc34e9542d264ecffcd6339963804d68fc8a7376312b8a590d836e1ce1a9e637", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAED4I5L0kSutj0/LFRspAAMXRSaoyycJHT\njCrtFjBAaYzcNOlULSZOz/zWM5ljgE1o/IpzdjErilkNg24c4anmNw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 408, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202ec9288261d8fbcda8ce483b42fb3460c908624c8869161e6b15d76e66ec5dff", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "043b8497a00342aa0ca81408f40de05e938a151e6207a912bc35a13ab8ce8682d475d9d40f07fa88a7418e10d0f92bd10f646016be181c04af65e9ac1858f8e145", + "wx" : "3b8497a00342aa0ca81408f40de05e938a151e6207a912bc35a13ab8ce8682d4", + "wy" : "75d9d40f07fa88a7418e10d0f92bd10f646016be181c04af65e9ac1858f8e145" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200043b8497a00342aa0ca81408f40de05e938a151e6207a912bc35a13ab8ce8682d475d9d40f07fa88a7418e10d0f92bd10f646016be181c04af65e9ac1858f8e145", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEO4SXoANCqgyoFAj0DeBek4oVHmIHqRK8\nNaE6uM6GgtR12dQPB/qIp0GOEND5K9EPZGAWvhgcBK9l6awYWPjhRQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 409, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0221009288261d8fbcda8ce483b42fb34610470f37567e692db81ce2caa2fe67594614", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04e95914e5d692f4c30724c50a232d432a09664e1d485ecfc3a8299b7007b990b501a21060c529f3776a1df1b3828157dbcd432e84d3ac229585bc9234341788a8", + "wx" : "00e95914e5d692f4c30724c50a232d432a09664e1d485ecfc3a8299b7007b990b5", + "wy" : "01a21060c529f3776a1df1b3828157dbcd432e84d3ac229585bc9234341788a8" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004e95914e5d692f4c30724c50a232d432a09664e1d485ecfc3a8299b7007b990b501a21060c529f3776a1df1b3828157dbcd432e84d3ac229585bc9234341788a8", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE6VkU5daS9MMHJMUKIy1DKglmTh1IXs/D\nqCmbcAe5kLUBohBgxSnzd2od8bOCgVfbzUMuhNOsIpWFvJI0NBeIqA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 410, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022025104c3b1f79b519c907685f668c208f63bfd0162312cffe05c2e76ffe7c4ae7", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04af3e088449e97df3df478c59536965a18598122efc5bb20d23b9f5e41bc84e8a403177e836fa23bb3ba2b8fe6005c8d79e1392dc3b726dca4eca14e88c00fdfd", + "wx" : "00af3e088449e97df3df478c59536965a18598122efc5bb20d23b9f5e41bc84e8a", + "wy" : "403177e836fa23bb3ba2b8fe6005c8d79e1392dc3b726dca4eca14e88c00fdfd" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004af3e088449e97df3df478c59536965a18598122efc5bb20d23b9f5e41bc84e8a403177e836fa23bb3ba2b8fe6005c8d79e1392dc3b726dca4eca14e88c00fdfd", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAErz4IhEnpffPfR4xZU2lloYWYEi78W7IN\nI7n15BvITopAMXfoNvojuzuiuP5gBcjXnhOS3DtybcpOyhTojAD9/Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 411, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022061d8fbcda8ce483b42fb3461047c96c9847a30c583c9b9f495591fa1e037b4fe", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04acaf208d26995e464ebcc54a683b04985c7be74448927e5c15332852886e6d748b182e2468f86cae75d045dc426383d2da3c7e3ab515580f3ff6523f03ce40dc", + "wx" : "00acaf208d26995e464ebcc54a683b04985c7be74448927e5c15332852886e6d74", + "wy" : "008b182e2468f86cae75d045dc426383d2da3c7e3ab515580f3ff6523f03ce40dc" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004acaf208d26995e464ebcc54a683b04985c7be74448927e5c15332852886e6d748b182e2468f86cae75d045dc426383d2da3c7e3ab515580f3ff6523f03ce40dc", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAErK8gjSaZXkZOvMVKaDsEmFx750RIkn5c\nFTMoUohubXSLGC4kaPhsrnXQRdxCY4PS2jx+OrUVWA8/9lI/A85A3A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 412, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100856739764fc50a930e4201325d77815bcf9b7681ed11213a053e816c5df8e6c6", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "047821e20d3938bbb48240ff48096e928e404ed91eefa37ea7cb2c8f339347b6ee6f7ada5c814f0f06eae9516a7848361cc3ac2eb4450a4455743d363f84f0dd1d", + "wx" : "7821e20d3938bbb48240ff48096e928e404ed91eefa37ea7cb2c8f339347b6ee", + "wy" : "6f7ada5c814f0f06eae9516a7848361cc3ac2eb4450a4455743d363f84f0dd1d" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200047821e20d3938bbb48240ff48096e928e404ed91eefa37ea7cb2c8f339347b6ee6f7ada5c814f0f06eae9516a7848361cc3ac2eb4450a4455743d363f84f0dd1d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEeCHiDTk4u7SCQP9ICW6SjkBO2R7vo36n\nyyyPM5NHtu5vetpcgU8PBurpUWp4SDYcw6wutEUKRFV0PTY/hPDdHQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 413, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0220512c9e1178d280d8464412f2bdf2dd9a7e8065b7ba9216f700779794c9a849bd", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "049b0ef17c0bd3dea11be2c3358058a1e10b0283108bf79aaae34355c2329e84a0955f5cf7cb593ee756cf4c9f2f0a488a2993aeba923320bfab98c6f72e079d73", + "wx" : "009b0ef17c0bd3dea11be2c3358058a1e10b0283108bf79aaae34355c2329e84a0", + "wy" : "00955f5cf7cb593ee756cf4c9f2f0a488a2993aeba923320bfab98c6f72e079d73" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200049b0ef17c0bd3dea11be2c3358058a1e10b0283108bf79aaae34355c2329e84a0955f5cf7cb593ee756cf4c9f2f0a488a2993aeba923320bfab98c6f72e079d73", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEmw7xfAvT3qEb4sM1gFih4QsCgxCL95qq\n40NVwjKehKCVX1z3y1k+51bPTJ8vCkiKKZOuupIzIL+rmMb3Lgedcw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 414, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100c9e4be241bd52c69a2486b6d22291f502f64efab87e244d33cacce68672fd44b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "044ba97363a7e14ce09480bd3b88491a7a501b5d4871b470498abc9a698c0699558ce9e198c1d48ec6650d59c15f9e1fb40dc0adccdea6329613e3a9a4decc80f8", + "wx" : "4ba97363a7e14ce09480bd3b88491a7a501b5d4871b470498abc9a698c069955", + "wy" : "008ce9e198c1d48ec6650d59c15f9e1fb40dc0adccdea6329613e3a9a4decc80f8" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200044ba97363a7e14ce09480bd3b88491a7a501b5d4871b470498abc9a698c0699558ce9e198c1d48ec6650d59c15f9e1fb40dc0adccdea6329613e3a9a4decc80f8", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAES6lzY6fhTOCUgL07iEkaelAbXUhxtHBJ\niryaaYwGmVWM6eGYwdSOxmUNWcFfnh+0DcCtzN6mMpYT46mk3syA+A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 415, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100b0a10528cded5f2b80520ac549338c3f61bbb6f69877aa1b2fe9129c0ce717f2", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "040bad8d9f015770ed8ac654528717734214fff813809b5eb886f87c46d1bac68fc9134ebed0d79a82321cec4c77d5b91c1c7e3c34f6a69cc10140127421b87b92", + "wx" : "0bad8d9f015770ed8ac654528717734214fff813809b5eb886f87c46d1bac68f", + "wy" : "00c9134ebed0d79a82321cec4c77d5b91c1c7e3c34f6a69cc10140127421b87b92" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200040bad8d9f015770ed8ac654528717734214fff813809b5eb886f87c46d1bac68fc9134ebed0d79a82321cec4c77d5b91c1c7e3c34f6a69cc10140127421b87b92", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEC62NnwFXcO2KxlRShxdzQhT/+BOAm164\nhvh8RtG6xo/JE06+0NeagjIc7Ex31bkcHH48NPamnMEBQBJ0Ibh7kg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 416, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100f177b6b48b29de102b6a1921aacd9c94bcec17a59991776cefe8ec63934c61b4", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04ab53f0d664c621138893fc5ee2b26ad2d686bbbb67eda1ee0dfb9609a3f5777afcf2d72bbd357bea8a1545fd4f162f3faf43bf74666cf23914c7e3d8dde79e97", + "wx" : "00ab53f0d664c621138893fc5ee2b26ad2d686bbbb67eda1ee0dfb9609a3f5777a", + "wy" : "00fcf2d72bbd357bea8a1545fd4f162f3faf43bf74666cf23914c7e3d8dde79e97" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004ab53f0d664c621138893fc5ee2b26ad2d686bbbb67eda1ee0dfb9609a3f5777afcf2d72bbd357bea8a1545fd4f162f3faf43bf74666cf23914c7e3d8dde79e97", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEq1Pw1mTGIROIk/xe4rJq0taGu7tn7aHu\nDfuWCaP1d3r88tcrvTV76ooVRf1PFi8/r0O/dGZs8jkUx+PY3eeelw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 417, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100e2ef6d691653bc2056d43243559b392abf29526483da4e9e1fff7a3a56628227", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04418698cfe9d564e0e5d04a901c062042d864091573f2820f4592d40027dcfe2634909e2b92b3cbc595203553121ca46efdda2c23ca990e1e56137365c5a5b795", + "wx" : "418698cfe9d564e0e5d04a901c062042d864091573f2820f4592d40027dcfe26", + "wy" : "34909e2b92b3cbc595203553121ca46efdda2c23ca990e1e56137365c5a5b795" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004418698cfe9d564e0e5d04a901c062042d864091573f2820f4592d40027dcfe2634909e2b92b3cbc595203553121ca46efdda2c23ca990e1e56137365c5a5b795", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEQYaYz+nVZODl0EqQHAYgQthkCRVz8oIP\nRZLUACfc/iY0kJ4rkrPLxZUgNVMSHKRu/dosI8qZDh5WE3NlxaW3lQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 418, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100d467241da17d9a30823e4b650068d5c0c1668d236e2325cf501608111978a29a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04dc0515e400e3527d2785e4a21d105af4cae862b31e07de117f11c9cd8dc9bc9b034eef9d96a56c0e74efa10a9f75e2a44d1337e8008175fbb40fe1c700144601", + "wx" : "00dc0515e400e3527d2785e4a21d105af4cae862b31e07de117f11c9cd8dc9bc9b", + "wy" : "034eef9d96a56c0e74efa10a9f75e2a44d1337e8008175fbb40fe1c700144601" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004dc0515e400e3527d2785e4a21d105af4cae862b31e07de117f11c9cd8dc9bc9b034eef9d96a56c0e74efa10a9f75e2a44d1337e8008175fbb40fe1c700144601", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE3AUV5ADjUn0nheSiHRBa9MroYrMeB94R\nfxHJzY3JvJsDTu+dlqVsDnTvoQqfdeKkTRM36ACBdfu0D+HHABRGAQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 419, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022056120b4205c1f44f0c46ca231de8ce6e14b7d97c48bc16deb9b5b920e9b8f448", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0453ff623b312669b48cc8a120b76a811e48a930548de8476d2c4607a5524ce592477ae28b239f626067a1d3dee97d769d37b41b184bae95009e401e443e930ef7", + "wx" : "53ff623b312669b48cc8a120b76a811e48a930548de8476d2c4607a5524ce592", + "wy" : "477ae28b239f626067a1d3dee97d769d37b41b184bae95009e401e443e930ef7" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000453ff623b312669b48cc8a120b76a811e48a930548de8476d2c4607a5524ce592477ae28b239f626067a1d3dee97d769d37b41b184bae95009e401e443e930ef7", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEU/9iOzEmabSMyKEgt2qBHkipMFSN6Edt\nLEYHpVJM5ZJHeuKLI59iYGeh097pfXadN7QbGEuulQCeQB5EPpMO9w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 420, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100d55555555555555555555555555555547c74934474db157d2a8c3f088aced62a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04d2d5348db9d837537c90e930ce35d4cd90e7d7a3460b1384790b632281b98ce843cc7b9a20c8734ac2c62a7d207105f5b2d85c2418939d35e3886f3893cb21b4", + "wx" : "00d2d5348db9d837537c90e930ce35d4cd90e7d7a3460b1384790b632281b98ce8", + "wy" : "43cc7b9a20c8734ac2c62a7d207105f5b2d85c2418939d35e3886f3893cb21b4" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d2d5348db9d837537c90e930ce35d4cd90e7d7a3460b1384790b632281b98ce843cc7b9a20c8734ac2c62a7d207105f5b2d85c2418939d35e3886f3893cb21b4", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE0tU0jbnYN1N8kOkwzjXUzZDn16NGCxOE\neQtjIoG5jOhDzHuaIMhzSsLGKn0gcQX1sthcJBiTnTXjiG84k8shtA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 421, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100c1777c8853938e536213c02464a936000ba1e21c0fc62075d46c624e23b52f31", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04c5fe4159e0b606879fc2a11088d658030ed7fef2e6711aab04869612fd09c3daac9dc7e198495afc0f43f4de434b8da233d8492cda28db460e8480aecb0a88f5", + "wx" : "00c5fe4159e0b606879fc2a11088d658030ed7fef2e6711aab04869612fd09c3da", + "wy" : "00ac9dc7e198495afc0f43f4de434b8da233d8492cda28db460e8480aecb0a88f5" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004c5fe4159e0b606879fc2a11088d658030ed7fef2e6711aab04869612fd09c3daac9dc7e198495afc0f43f4de434b8da233d8492cda28db460e8480aecb0a88f5", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAExf5BWeC2BoefwqEQiNZYAw7X/vLmcRqr\nBIaWEv0Jw9qsncfhmEla/A9D9N5DS42iM9hJLNoo20YOhICuywqI9Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 422, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022030bbb794db588363b40679f6c182a50d3ce9679acdd3ffbe36d7813dacbdc818", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "049a72b785c90a695b8e355f5d8fc151046c360d739136241c7fd1e77a0e8b8545a470b4b9a54d1d42956ac43b9c9f2f0f5489da16130b7ba1da38516c912009bc", + "wx" : "009a72b785c90a695b8e355f5d8fc151046c360d739136241c7fd1e77a0e8b8545", + "wy" : "00a470b4b9a54d1d42956ac43b9c9f2f0f5489da16130b7ba1da38516c912009bc" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200049a72b785c90a695b8e355f5d8fc151046c360d739136241c7fd1e77a0e8b8545a470b4b9a54d1d42956ac43b9c9f2f0f5489da16130b7ba1da38516c912009bc", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEmnK3hckKaVuONV9dj8FRBGw2DXORNiQc\nf9Hneg6LhUWkcLS5pU0dQpVqxDucny8PVInaFhMLe6HaOFFskSAJvA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 423, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202c37fd995622c4fb7fffffffffffffffc7cee745110cb45ab558ed7c90c15a2f", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0481e427bc8f0509b19a14c16e8883b12641d1d68e070c36ab49d1690e5decd061a993d77e9bc0f2b66edc6cd7ca8e32becf32596405622ea2756006deb3e8ac5f", + "wx" : "0081e427bc8f0509b19a14c16e8883b12641d1d68e070c36ab49d1690e5decd061", + "wy" : "00a993d77e9bc0f2b66edc6cd7ca8e32becf32596405622ea2756006deb3e8ac5f" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000481e427bc8f0509b19a14c16e8883b12641d1d68e070c36ab49d1690e5decd061a993d77e9bc0f2b66edc6cd7ca8e32becf32596405622ea2756006deb3e8ac5f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEgeQnvI8FCbGaFMFuiIOxJkHR1o4HDDar\nSdFpDl3s0GGpk9d+m8Dytm7cbNfKjjK+zzJZZAViLqJ1YAbes+isXw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 424, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02207fd995622c4fb7ffffffffffffffffff5d883ffab5b32652ccdcaa290fccb97d", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04756279b4827c83372130d4feab66a4397ed4463ac9ee1dc8adcaddcfcec59269b6323337d89af4208ad8818b67e26f9b8080316bc43fab53d1b3b7cea5db9947", + "wx" : "756279b4827c83372130d4feab66a4397ed4463ac9ee1dc8adcaddcfcec59269", + "wy" : "00b6323337d89af4208ad8818b67e26f9b8080316bc43fab53d1b3b7cea5db9947" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004756279b4827c83372130d4feab66a4397ed4463ac9ee1dc8adcaddcfcec59269b6323337d89af4208ad8818b67e26f9b8080316bc43fab53d1b3b7cea5db9947", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEdWJ5tIJ8gzchMNT+q2akOX7URjrJ7h3I\nrcrdz87Fkmm2MjM32Jr0IIrYgYtn4m+bgIAxa8Q/q1PRs7fOpduZRw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 425, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100ffb32ac4589f6ffffffffffffffffffebb107ff56b664ca599b954521f9972fa", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04cf9345e850417aa81b01a941a02c5546950c27830841a435f4f3654927c6926d1ec53d04954a47f37915dddb48272fe733322d8250783991709b37d87fa296ef", + "wx" : "00cf9345e850417aa81b01a941a02c5546950c27830841a435f4f3654927c6926d", + "wy" : "1ec53d04954a47f37915dddb48272fe733322d8250783991709b37d87fa296ef" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004cf9345e850417aa81b01a941a02c5546950c27830841a435f4f3654927c6926d1ec53d04954a47f37915dddb48272fe733322d8250783991709b37d87fa296ef", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEz5NF6FBBeqgbAalBoCxVRpUMJ4MIQaQ1\n9PNlSSfGkm0exT0ElUpH83kV3dtIJy/nMzItglB4OZFwmzfYf6KW7w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 426, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02205622c4fb7fffffffffffffffffffffff928a8f1c7ac7bec1808b9f61c01ec327", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04f95f625795e6cc17b4c28b1ec643c36a34989084aa6a513812c3aa9bec0730312b22ce0eeeee9d45cee863c1b1d05381ac8b2c896a2cb17d3e9070d41d68bbea", + "wx" : "00f95f625795e6cc17b4c28b1ec643c36a34989084aa6a513812c3aa9bec073031", + "wy" : "2b22ce0eeeee9d45cee863c1b1d05381ac8b2c896a2cb17d3e9070d41d68bbea" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004f95f625795e6cc17b4c28b1ec643c36a34989084aa6a513812c3aa9bec0730312b22ce0eeeee9d45cee863c1b1d05381ac8b2c896a2cb17d3e9070d41d68bbea", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE+V9iV5XmzBe0wosexkPDajSYkISqalE4\nEsOqm+wHMDErIs4O7u6dRc7oY8Gx0FOBrIssiWossX0+kHDUHWi76g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 427, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022044104104104104104104104104104103b87853fd3b7d3f8e175125b4382f25ed", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04c3f0aadef8675dc8832a29b397488d6a4fb54780e5967e8b43449498c16ad4bdcb391b545464668d4d0a80b8e283132448a3c0be0abed304cf0839b5920f3867", + "wx" : "00c3f0aadef8675dc8832a29b397488d6a4fb54780e5967e8b43449498c16ad4bd", + "wy" : "00cb391b545464668d4d0a80b8e283132448a3c0be0abed304cf0839b5920f3867" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004c3f0aadef8675dc8832a29b397488d6a4fb54780e5967e8b43449498c16ad4bdcb391b545464668d4d0a80b8e283132448a3c0be0abed304cf0839b5920f3867", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEw/Cq3vhnXciDKimzl0iNak+1R4Dlln6L\nQ0SUmMFq1L3LORtUVGRmjU0KgLjigxMkSKPAvgq+0wTPCDm1kg84Zw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 428, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202739ce739ce739ce739ce739ce739ce705560298d1f2f08dc419ac273a5b54d9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0476b920709a9e5dc54a91bd4772ab2593a76f38841dae2880f547c3bb753ae7c15f01e6779d5e3aba75997bcf7e3f320868ba8f0bc1210ab80b42760a6a701206", + "wx" : "76b920709a9e5dc54a91bd4772ab2593a76f38841dae2880f547c3bb753ae7c1", + "wy" : "5f01e6779d5e3aba75997bcf7e3f320868ba8f0bc1210ab80b42760a6a701206" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000476b920709a9e5dc54a91bd4772ab2593a76f38841dae2880f547c3bb753ae7c15f01e6779d5e3aba75997bcf7e3f320868ba8f0bc1210ab80b42760a6a701206", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEdrkgcJqeXcVKkb1Hcqslk6dvOIQdriiA\n9UfDu3U658FfAeZ3nV46unWZe89+PzIIaLqPC8EhCrgLQnYKanASBg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 429, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100b777777777777777777777777777777688e6a1fe808a97a348671222ff16b863", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04e3895147f4e36a13c3483ac00c88a78a8ffa42478afc2e9d8386205b0b1df8b2b4156b56ba217b1ca08bd77f819abb52d742f6b2f7d61353e4cc5663da487317", + "wx" : "00e3895147f4e36a13c3483ac00c88a78a8ffa42478afc2e9d8386205b0b1df8b2", + "wy" : "00b4156b56ba217b1ca08bd77f819abb52d742f6b2f7d61353e4cc5663da487317" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004e3895147f4e36a13c3483ac00c88a78a8ffa42478afc2e9d8386205b0b1df8b2b4156b56ba217b1ca08bd77f819abb52d742f6b2f7d61353e4cc5663da487317", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE44lRR/TjahPDSDrADIinio/6QkeK/C6d\ng4YgWwsd+LK0FWtWuiF7HKCL13+BmrtS10L2svfWE1PkzFZj2khzFw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 430, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02206492492492492492492492492492492406dd3a19b8d5fb875235963c593bd2d3", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04e733999ce348cf7b363dcf931953cf1c247c3a887408c064b9791c178ad350290b0849329da7008e6a2d00142883f8041b9917528fcc4c5bd3f795accff28eb6", + "wx" : "00e733999ce348cf7b363dcf931953cf1c247c3a887408c064b9791c178ad35029", + "wy" : "0b0849329da7008e6a2d00142883f8041b9917528fcc4c5bd3f795accff28eb6" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004e733999ce348cf7b363dcf931953cf1c247c3a887408c064b9791c178ad350290b0849329da7008e6a2d00142883f8041b9917528fcc4c5bd3f795accff28eb6", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE5zOZnONIz3s2Pc+TGVPPHCR8Ooh0CMBk\nuXkcF4rTUCkLCEkynacAjmotABQog/gEG5kXUo/MTFvT95Wsz/KOtg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 431, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100955555555555555555555555555555547c74934474db157d2a8c3f088aced62c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04069b66f716902cbd51dadff61644ac74c6a35e8c776ea22c9c3492d1d3faa2ece4905cc480bc967ce389b82c8e6692b159d3fe9a268bfc12010993934d7e24dd", + "wx" : "069b66f716902cbd51dadff61644ac74c6a35e8c776ea22c9c3492d1d3faa2ec", + "wy" : "00e4905cc480bc967ce389b82c8e6692b159d3fe9a268bfc12010993934d7e24dd" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004069b66f716902cbd51dadff61644ac74c6a35e8c776ea22c9c3492d1d3faa2ece4905cc480bc967ce389b82c8e6692b159d3fe9a268bfc12010993934d7e24dd", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEBptm9xaQLL1R2t/2FkSsdMajXox3bqIs\nnDSS0dP6ouzkkFzEgLyWfOOJuCyOZpKxWdP+miaL/BIBCZOTTX4k3Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 432, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3e3a49a23a6d8abe95461f8445676b17", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "049543bfd3a0b678654fc65458e3e62269b30bbd2a40282d92058c3311a61bd885333d78221d9aa0a9663a5df5123d95c3ff4a02606278666179e33c94fe1e0cd1", + "wx" : "009543bfd3a0b678654fc65458e3e62269b30bbd2a40282d92058c3311a61bd885", + "wy" : "333d78221d9aa0a9663a5df5123d95c3ff4a02606278666179e33c94fe1e0cd1" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200049543bfd3a0b678654fc65458e3e62269b30bbd2a40282d92058c3311a61bd885333d78221d9aa0a9663a5df5123d95c3ff4a02606278666179e33c94fe1e0cd1", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAElUO/06C2eGVPxlRY4+YiabMLvSpAKC2S\nBYwzEaYb2IUzPXgiHZqgqWY6XfUSPZXD/0oCYGJ4ZmF54zyU/h4M0Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 433, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100bffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364143", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04a6884e6218642518a211f67b03aef6a84d3b32d18eea445b31913e8a1a00f4c531a318166cfcbce34307572eb823edc5d0334c5e5373af4e832e730047996aca", + "wx" : "00a6884e6218642518a211f67b03aef6a84d3b32d18eea445b31913e8a1a00f4c5", + "wy" : "31a318166cfcbce34307572eb823edc5d0334c5e5373af4e832e730047996aca" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004a6884e6218642518a211f67b03aef6a84d3b32d18eea445b31913e8a1a00f4c531a318166cfcbce34307572eb823edc5d0334c5e5373af4e832e730047996aca", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEpohOYhhkJRiiEfZ7A672qE07MtGO6kRb\nMZE+ihoA9MUxoxgWbPy840MHVy64I+3F0DNMXlNzr06DLnMAR5lqyg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 434, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0220185ddbca6dac41b1da033cfb60c152869e74b3cd66e9ffdf1b6bc09ed65ee40c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04bd4c6f9ab363a204fd1abe0f7158b84417cca2e0d355277ddc17cac22abdbc2dc66469bb8e8e04186e81a2b693cc2121ef22cb61803a2b4ebe1a3e0d367b295d", + "wx" : "00bd4c6f9ab363a204fd1abe0f7158b84417cca2e0d355277ddc17cac22abdbc2d", + "wy" : "00c66469bb8e8e04186e81a2b693cc2121ef22cb61803a2b4ebe1a3e0d367b295d" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004bd4c6f9ab363a204fd1abe0f7158b84417cca2e0d355277ddc17cac22abdbc2dc66469bb8e8e04186e81a2b693cc2121ef22cb61803a2b4ebe1a3e0d367b295d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEvUxvmrNjogT9Gr4PcVi4RBfMouDTVSd9\n3BfKwiq9vC3GZGm7jo4EGG6BoraTzCEh7yLLYYA6K06+Gj4NNnspXQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 435, + "comment" : "point duplication during verification", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3045022032b0d10d8d0e04bc8d4d064d270699e87cffc9b49c5c20730e1c26f6105ddcda022100eaafe4ce77ccd9137f39edc5370d26b73f4dc6ceadfb40a488b2dc6c93f1993c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04bd4c6f9ab363a204fd1abe0f7158b84417cca2e0d355277ddc17cac22abdbc2d399b96447171fbe7917e5d496c33dede10dd349e7fc5d4b141e5c1f1c984d2d2", + "wx" : "00bd4c6f9ab363a204fd1abe0f7158b84417cca2e0d355277ddc17cac22abdbc2d", + "wy" : "399b96447171fbe7917e5d496c33dede10dd349e7fc5d4b141e5c1f1c984d2d2" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004bd4c6f9ab363a204fd1abe0f7158b84417cca2e0d355277ddc17cac22abdbc2d399b96447171fbe7917e5d496c33dede10dd349e7fc5d4b141e5c1f1c984d2d2", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEvUxvmrNjogT9Gr4PcVi4RBfMouDTVSd9\n3BfKwiq9vC05m5ZEcXH755F+XUlsM97eEN00nn/F1LFB5cHxyYTS0g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 436, + "comment" : "duplication bug", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3045022032b0d10d8d0e04bc8d4d064d270699e87cffc9b49c5c20730e1c26f6105ddcda022100eaafe4ce77ccd9137f39edc5370d26b73f4dc6ceadfb40a488b2dc6c93f1993c", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04e1815bb1653b8146a2e9160fb0e946112b8994b9d90ef8a36a8ef2ba187b705d11b344caed87db94b9c9eab8a5e3277a9aa46b31768cee5406c3cbcffce0a945", + "wx" : "00e1815bb1653b8146a2e9160fb0e946112b8994b9d90ef8a36a8ef2ba187b705d", + "wy" : "11b344caed87db94b9c9eab8a5e3277a9aa46b31768cee5406c3cbcffce0a945" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004e1815bb1653b8146a2e9160fb0e946112b8994b9d90ef8a36a8ef2ba187b705d11b344caed87db94b9c9eab8a5e3277a9aa46b31768cee5406c3cbcffce0a945", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE4YFbsWU7gUai6RYPsOlGESuJlLnZDvij\nao7yuhh7cF0Rs0TK7YfblLnJ6ril4yd6mqRrMXaM7lQGw8vP/OCpRQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 437, + "comment" : "comparison with point at infinity ", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0022033333333333333333333333333333332f222f8faefdb533f265d461c29a47373", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "042be9265c148fc61379ca147e651e7f0a1c602cdd66f70b4b6ada2e83f56c1a71f5e1ede0139baa93af588cc7ec1b479b91d230c811575cb143af12c631d16a61", + "wx" : "2be9265c148fc61379ca147e651e7f0a1c602cdd66f70b4b6ada2e83f56c1a71", + "wy" : "00f5e1ede0139baa93af588cc7ec1b479b91d230c811575cb143af12c631d16a61" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200042be9265c148fc61379ca147e651e7f0a1c602cdd66f70b4b6ada2e83f56c1a71f5e1ede0139baa93af588cc7ec1b479b91d230c811575cb143af12c631d16a61", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEK+kmXBSPxhN5yhR+ZR5/ChxgLN1m9wtL\natoug/VsGnH14e3gE5uqk69YjMfsG0ebkdIwyBFXXLFDrxLGMdFqYQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 438, + "comment" : "extreme value for k and edgecase s", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04af3b3f73a409ffa51b10f3cdfa272d9b42358ca9aed2840bfaf5bd67e61fd1c49d07371ca919a069e46c473e6e45b2f2cd019fa21f84d0abfa285be5513781fb", + "wx" : "00af3b3f73a409ffa51b10f3cdfa272d9b42358ca9aed2840bfaf5bd67e61fd1c4", + "wy" : "009d07371ca919a069e46c473e6e45b2f2cd019fa21f84d0abfa285be5513781fb" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004af3b3f73a409ffa51b10f3cdfa272d9b42358ca9aed2840bfaf5bd67e61fd1c49d07371ca919a069e46c473e6e45b2f2cd019fa21f84d0abfa285be5513781fb", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAErzs/c6QJ/6UbEPPN+ictm0I1jKmu0oQL\n+vW9Z+Yf0cSdBzccqRmgaeRsRz5uRbLyzQGfoh+E0Kv6KFvlUTeB+w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 439, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3046022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022100b6db6db6db6db6db6db6db6db6db6db5f30f30127d33e02aad96438927022e9c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04e155240c3be314924ed787354325fdc3dcfe46d603798f2491152448e0e413b6ce1124313eb0048292f6edf9f248ff9624936e41be6c93dce2df9ab7997289fc", + "wx" : "00e155240c3be314924ed787354325fdc3dcfe46d603798f2491152448e0e413b6", + "wy" : "00ce1124313eb0048292f6edf9f248ff9624936e41be6c93dce2df9ab7997289fc" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004e155240c3be314924ed787354325fdc3dcfe46d603798f2491152448e0e413b6ce1124313eb0048292f6edf9f248ff9624936e41be6c93dce2df9ab7997289fc", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE4VUkDDvjFJJO14c1QyX9w9z+RtYDeY8k\nkRUkSODkE7bOESQxPrAEgpL27fnySP+WJJNuQb5sk9zi35q3mXKJ/A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 440, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3046022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee502210099999999999999999999999999999998d668eaf0cf91f9bd7317d2547ced5a5a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0487d4de4ed890da42d7e11a95e56070c95901500c53dd55b62952679884d2598ddf8a37ce6d8f86f4e8b3580d6e6a448520cb740888a3b0eac92bc9a2f1589b4e", + "wx" : "0087d4de4ed890da42d7e11a95e56070c95901500c53dd55b62952679884d2598d", + "wy" : "00df8a37ce6d8f86f4e8b3580d6e6a448520cb740888a3b0eac92bc9a2f1589b4e" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000487d4de4ed890da42d7e11a95e56070c95901500c53dd55b62952679884d2598ddf8a37ce6d8f86f4e8b3580d6e6a448520cb740888a3b0eac92bc9a2f1589b4e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEh9TeTtiQ2kLX4RqV5WBwyVkBUAxT3VW2\nKVJnmITSWY3fijfObY+G9OizWA1uakSFIMt0CIijsOrJK8mi8VibTg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 441, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022066666666666666666666666666666665e445f1f5dfb6a67e4cba8c385348e6e7", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "048c03d72664214f3bdaa6a2e1003b14864000e5993b41b71b68cdebc4a08f628a4a490efc9172983bec203e6096dd9778bec26f6e443e1dde67060dac18ca2440", + "wx" : "008c03d72664214f3bdaa6a2e1003b14864000e5993b41b71b68cdebc4a08f628a", + "wy" : "4a490efc9172983bec203e6096dd9778bec26f6e443e1dde67060dac18ca2440" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200048c03d72664214f3bdaa6a2e1003b14864000e5993b41b71b68cdebc4a08f628a4a490efc9172983bec203e6096dd9778bec26f6e443e1dde67060dac18ca2440", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEjAPXJmQhTzvapqLhADsUhkAA5Zk7Qbcb\naM3rxKCPYopKSQ78kXKYO+wgPmCW3Zd4vsJvbkQ+Hd5nBg2sGMokQA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 442, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022049249249249249249249249249249248c79facd43214c011123c1b03a93412a5", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "041ae8bf7b21b3ae00fd01d19b4f72ae6b47bf752edf476cc5cdfa1c2345588e7154dc306165f4f907802478ed2aed41ec54ddf870bc62c2c373971194308411f0", + "wx" : "1ae8bf7b21b3ae00fd01d19b4f72ae6b47bf752edf476cc5cdfa1c2345588e71", + "wy" : "54dc306165f4f907802478ed2aed41ec54ddf870bc62c2c373971194308411f0" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200041ae8bf7b21b3ae00fd01d19b4f72ae6b47bf752edf476cc5cdfa1c2345588e7154dc306165f4f907802478ed2aed41ec54ddf870bc62c2c373971194308411f0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEGui/eyGzrgD9AdGbT3Kua0e/dS7fR2zF\nzfocI0VYjnFU3DBhZfT5B4AkeO0q7UHsVN34cLxiwsNzlxGUMIQR8A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 443, + "comment" : "extreme value for k", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee502200eb10e5ab95f2f275348d82ad2e4d7949c8193800d8c9c75df58e343f0ebba7b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04c5dad21249273cd72ad06943b4e3be0822595bf9fa0459223d27354dea24179b97340abb326afd1eb6de5e525a23aad4929f8a09244c972841a0cb76680ff060", + "wx" : "00c5dad21249273cd72ad06943b4e3be0822595bf9fa0459223d27354dea24179b", + "wy" : "0097340abb326afd1eb6de5e525a23aad4929f8a09244c972841a0cb76680ff060" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004c5dad21249273cd72ad06943b4e3be0822595bf9fa0459223d27354dea24179b97340abb326afd1eb6de5e525a23aad4929f8a09244c972841a0cb76680ff060", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAExdrSEkknPNcq0GlDtOO+CCJZW/n6BFki\nPSc1TeokF5uXNAq7Mmr9HrbeXlJaI6rUkp+KCSRMlyhBoMt2aA/wYA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 444, + "comment" : "extreme value for k and edgecase s", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04f2c6643bf373a0812f993cd616993551d7bc7826d3d6bed0918ed4998b74e837d7160a452dd2c8d3e5f4f80a1efbc33793c35d6e243e9dfe9a39e26dfb7a1b9f", + "wx" : "00f2c6643bf373a0812f993cd616993551d7bc7826d3d6bed0918ed4998b74e837", + "wy" : "00d7160a452dd2c8d3e5f4f80a1efbc33793c35d6e243e9dfe9a39e26dfb7a1b9f" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004f2c6643bf373a0812f993cd616993551d7bc7826d3d6bed0918ed4998b74e837d7160a452dd2c8d3e5f4f80a1efbc33793c35d6e243e9dfe9a39e26dfb7a1b9f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE8sZkO/NzoIEvmTzWFpk1Ude8eCbT1r7Q\nkY7UmYt06DfXFgpFLdLI0+X0+Aoe+8M3k8NdbiQ+nf6aOeJt+3obnw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 445, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022100b6db6db6db6db6db6db6db6db6db6db5f30f30127d33e02aad96438927022e9c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "043a1bd608d3187c684d8d461a5406e2b86b09eedc5d2dd28fcc341bd2d483a6d85e3ab9d9e79ecb7e43135782ae60b12ff69b3349c1819b4ab27b738c7f803595", + "wx" : "3a1bd608d3187c684d8d461a5406e2b86b09eedc5d2dd28fcc341bd2d483a6d8", + "wy" : "5e3ab9d9e79ecb7e43135782ae60b12ff69b3349c1819b4ab27b738c7f803595" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200043a1bd608d3187c684d8d461a5406e2b86b09eedc5d2dd28fcc341bd2d483a6d85e3ab9d9e79ecb7e43135782ae60b12ff69b3349c1819b4ab27b738c7f803595", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEOhvWCNMYfGhNjUYaVAbiuGsJ7txdLdKP\nzDQb0tSDptheOrnZ557LfkMTV4KuYLEv9pszScGBm0qye3OMf4A1lQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 446, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802210099999999999999999999999999999998d668eaf0cf91f9bd7317d2547ced5a5a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04aee2e5aa96d31bde8b0ec1e71d79e721c5fb094eba49d61dfba6e636a77b215aaf3534fa210143ce3cecc5bfe1e0b136ab6811d662376637efe1eddd212b6ff0", + "wx" : "00aee2e5aa96d31bde8b0ec1e71d79e721c5fb094eba49d61dfba6e636a77b215a", + "wy" : "00af3534fa210143ce3cecc5bfe1e0b136ab6811d662376637efe1eddd212b6ff0" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004aee2e5aa96d31bde8b0ec1e71d79e721c5fb094eba49d61dfba6e636a77b215aaf3534fa210143ce3cecc5bfe1e0b136ab6811d662376637efe1eddd212b6ff0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEruLlqpbTG96LDsHnHXnnIcX7CU66SdYd\n+6bmNqd7IVqvNTT6IQFDzjzsxb/h4LE2q2gR1mI3Zjfv4e3dIStv8A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 447, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022066666666666666666666666666666665e445f1f5dfb6a67e4cba8c385348e6e7", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04db0dc63f6dfff9b2564498a2423449cc5d894222ddda86eabd6d2bb2549d28d75b5bc20153ef6a2649dc6f116e6ca5c916740a9a645618003a5a448eee928fcc", + "wx" : "00db0dc63f6dfff9b2564498a2423449cc5d894222ddda86eabd6d2bb2549d28d7", + "wy" : "5b5bc20153ef6a2649dc6f116e6ca5c916740a9a645618003a5a448eee928fcc" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004db0dc63f6dfff9b2564498a2423449cc5d894222ddda86eabd6d2bb2549d28d75b5bc20153ef6a2649dc6f116e6ca5c916740a9a645618003a5a448eee928fcc", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE2w3GP23/+bJWRJiiQjRJzF2JQiLd2obq\nvW0rslSdKNdbW8IBU+9qJkncbxFubKXJFnQKmmRWGAA6WkSO7pKPzA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 448, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022049249249249249249249249249249248c79facd43214c011123c1b03a93412a5", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0482a004a2ff4aa7c2fd4c71bc88a4ee16d75c11f5ad8599a6eb41ea73e49f80bcf360abc795b4b21b46584a1bebc41720df51a25044880f287c5e5d83f83c1d20", + "wx" : "0082a004a2ff4aa7c2fd4c71bc88a4ee16d75c11f5ad8599a6eb41ea73e49f80bc", + "wy" : "00f360abc795b4b21b46584a1bebc41720df51a25044880f287c5e5d83f83c1d20" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000482a004a2ff4aa7c2fd4c71bc88a4ee16d75c11f5ad8599a6eb41ea73e49f80bcf360abc795b4b21b46584a1bebc41720df51a25044880f287c5e5d83f83c1d20", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEgqAEov9Kp8L9THG8iKTuFtdcEfWthZmm\n60Hqc+SfgLzzYKvHlbSyG0ZYShvrxBcg31GiUESIDyh8Xl2D+DwdIA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 449, + "comment" : "extreme value for k", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802200eb10e5ab95f2f275348d82ad2e4d7949c8193800d8c9c75df58e343f0ebba7b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", + "wx" : "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", + "wy" : "483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEeb5mfvncu6xVoGKVzocLBwKb/NstzijZ\nWfKBWxb4F5hIOtp3JqPEZV2k+/wOEQio/Re0SKaFVBmcR9CP+xDUuA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 450, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "304402205731b7c4bd04cb9efb836935ff2e547bf2909f86824af4d8df78acf76d7b3d4e02202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952", + "result" : "invalid" + }, + { + "tcId" : 451, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3045022100a8ce483b42fb3461047c96ca00d1ab82c81e3d602cfdab62e059b19562bb03f302202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777", + "wx" : "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", + "wy" : "00b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEeb5mfvncu6xVoGKVzocLBwKb/NstzijZ\nWfKBWxb4F5i3xSWI2Vw7mqJbBAPx7vdXAuhLt1l6q+ZjuC9vBO8ndw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 452, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "304402205731b7c4bd04cb9efb836935ff2e547bf2909f86824af4d8df78acf76d7b3d4e02202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952", + "result" : "invalid" + }, + { + "tcId" : 453, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3045022100a8ce483b42fb3461047c96ca00d1ab82c81e3d602cfdab62e059b19562bb03f302202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff00000001060492d5a5673e0f25d8d50fb7e58c49d86d46d4216955e0aa3d40e1", + "wx" : "6e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff", + "wy" : "01060492d5a5673e0f25d8d50fb7e58c49d86d46d4216955e0aa3d40e1" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff00000001060492d5a5673e0f25d8d50fb7e58c49d86d46d4216955e0aa3d40e1", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEboI1VUUpFAmRgsaywdbwtdKNUMzQBa8s\n4bulQapAyv8AAAABBgSS1aVnPg8l2NUPt+WMSdhtRtQhaVXgqj1A4Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 454, + "comment" : "y-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30450220091bc829be861c20c4bb877f0da205b3911584708ddeef580ae46691b245b99d022100c03bb5e77a8fad94736775f31ae381015a93973954b2f3e541457fcb05bccb5f", + "result" : "valid" + }, + { + "tcId" : 455, + "comment" : "y-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100fd6a7eec40d1062b9a4a7af4817b3ea8cd21596d6dc228b287a21b647caab29f022100ab861672dfe3b428c26e08f2f7ca464ad3e966bbf62931408ed1ce2735bab62b", + "result" : "valid" + }, + { + "tcId" : 456, + "comment" : "y-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022053ebb6debd028f195c039ef4e04276adfa2d9551a6e02d2c4143907ec889e6d0022100fa01a27240dd63aff235cd9778c90a7c25c993791cda584fdcca1a979f5faf54", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40cafffffffffef9fb6d2a5a98c1f0da272af0481a73b62792b92bde96aa1e55c2bb4e", + "wx" : "6e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff", + "wy" : "00fffffffef9fb6d2a5a98c1f0da272af0481a73b62792b92bde96aa1e55c2bb4e" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40cafffffffffef9fb6d2a5a98c1f0da272af0481a73b62792b92bde96aa1e55c2bb4e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEboI1VUUpFAmRgsaywdbwtdKNUMzQBa8s\n4bulQapAyv/////++fttKlqYwfDaJyrwSBpztieSuSvelqoeVcK7Tg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 457, + "comment" : "y-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3044022060ec4f23f1b2c0b5acae075bbf09be76ffc978aa4d354d309746047a69c43ddd0220798c3df3ada3c91845272b9573e70e683d4e49d90a51f6ad047e24da19355d3b", + "result" : "valid" + }, + { + "tcId" : 458, + "comment" : "y-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502204457c32fe6bf74ee82ff8a38b8076b48323769f3b7970f419352283984dde081022100c6380b3ed90ddba62394c19e02a3b8690d1615dd1120c0fe67b86e7961b8e7d5", + "result" : "valid" + }, + { + "tcId" : 459, + "comment" : "y-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022024820a985bc72c8817ffdec275db7406ed5b897fff0b713d98a721a42bb4c6d402210094f1397d1e577fd47cfed7ac01f2aead6888863a3f8ff21f00c34c41e840af99", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04000000013fd22248d64d95f73c29b48ab48631850be503fd00f8468b5f0f70e0f6ee7aa43bc2c6fd25b1d8269241cbdd9dbb0dac96dc96231f430705f838717d", + "wx" : "013fd22248d64d95f73c29b48ab48631850be503fd00f8468b5f0f70e0", + "wy" : "00f6ee7aa43bc2c6fd25b1d8269241cbdd9dbb0dac96dc96231f430705f838717d" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004000000013fd22248d64d95f73c29b48ab48631850be503fd00f8468b5f0f70e0f6ee7aa43bc2c6fd25b1d8269241cbdd9dbb0dac96dc96231f430705f838717d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEAAAAAT/SIkjWTZX3PCm0irSGMYUL5QP9\nAPhGi18PcOD27nqkO8LG/SWx2CaSQcvdnbsNrJbcliMfQwcF+DhxfQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 460, + "comment" : "x-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304402201ed4e5132e4b11268ad55b9a4b7a54ad3e028976bbe85fef2e8cd0a3e4362c7002201d1ce94fd8ffda6df3c307150a98719f276381b0c9d261fba7feba37b402394b", + "result" : "valid" + }, + { + "tcId" : 461, + "comment" : "x-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304402204f030196e9a558b5af5557c7347d132b1308b3a1ce88a6bc6bf566ed22b5da780220392ddc6e83f995a0030856ecd0822449d8dac2bead6d269ef4b307d535dce238", + "result" : "valid" + }, + { + "tcId" : 462, + "comment" : "x-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30450221009eaa256762ee3d5d3ed269a2907c4a836c92073918be335469e25743ea9ba0e102202c70e1dbee671e9bbd6b68695ae40d58d11ce82592cf9824914a1d8d9e429fcc", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0425afd689acabaed67c1f296de59406f8c550f57146a0b4ec2c97876dfffffffffa46a76e520322dfbc491ec4f0cc197420fc4ea5883d8f6dd53c354bc4f67c35", + "wx" : "25afd689acabaed67c1f296de59406f8c550f57146a0b4ec2c97876dffffffff", + "wy" : "00fa46a76e520322dfbc491ec4f0cc197420fc4ea5883d8f6dd53c354bc4f67c35" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000425afd689acabaed67c1f296de59406f8c550f57146a0b4ec2c97876dfffffffffa46a76e520322dfbc491ec4f0cc197420fc4ea5883d8f6dd53c354bc4f67c35", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEJa/WiayrrtZ8Hylt5ZQG+MVQ9XFGoLTs\nLJeHbf/////6RqduUgMi37xJHsTwzBl0IPxOpYg9j23VPDVLxPZ8NQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 463, + "comment" : "x-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100db965e2d0d25c84c30ae8a3e31f12b55b8784b90f91d443a70f2c7cb4828f5bf022100aabb284a7715095cb11714ec76779c08ad5496d8870e2109467a21093f0b8bca", + "result" : "valid" + }, + { + "tcId" : 464, + "comment" : "x-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3044022058675835add3dd65f25c76b02545176c37a840748fb64a16b8bb113e361cf55d02203b1e25552a5c35732f33735f4dc6f50f947bbecb734599a987f1ffbf86b2842d", + "result" : "valid" + }, + { + "tcId" : 465, + "comment" : "x-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30440220786a687776da9c185afa16f90a596f5ddce3c2d3caece0344101be24581b86e1022075b13da23be046d551c68b54e72a990288dd73099800705e1a854366662b950e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04d12e6c66b67734c3c84d2601cf5d35dc097e27637f0aca4a4fdb74b6aadd3bb93f5bdff88bd5736df898e699006ed750f11cf07c5866cd7ad70c7121ffffffff", + "wx" : "00d12e6c66b67734c3c84d2601cf5d35dc097e27637f0aca4a4fdb74b6aadd3bb9", + "wy" : "3f5bdff88bd5736df898e699006ed750f11cf07c5866cd7ad70c7121ffffffff" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d12e6c66b67734c3c84d2601cf5d35dc097e27637f0aca4a4fdb74b6aadd3bb93f5bdff88bd5736df898e699006ed750f11cf07c5866cd7ad70c7121ffffffff", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE0S5sZrZ3NMPITSYBz1013Al+J2N/CspK\nT9t0tqrdO7k/W9/4i9VzbfiY5pkAbtdQ8RzwfFhmzXrXDHEh/////w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 466, + "comment" : "y-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022100cfce7188667568bd7d5269a75bef42aa360705db5232d189adcf2323036852bb02205d06871c28d89198870f94264ae11744d254682e06f154332f976b803da8a1a2", + "result" : "valid" + }, + { + "tcId" : 467, + "comment" : "y-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100b21cc81843c74779fc5ba9fe1b0d5e7173f696c6e91398cf83a31bc735b6050b0221008945e8711789093c80fe6cec3947cc9c36ffe2505f1ef721bb507e05c9c07bd2", + "result" : "valid" + }, + { + "tcId" : 468, + "comment" : "y-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100fbc5087d1e6bbc32dae22a837d03151028ac69ad71e66e5fc841de0548c06dce022100e2dfa5e56de28d72d0e770e7666033c42431bcae1fc6cffd9593d54cbcfcfa7c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046d4a7f60d4774a4f0aa8bbdedb953c7eea7909407e3164755664bc2800000000e659d34e4df38d9e8c9eaadfba36612c769195be86c77aac3f36e78b538680fb", + "wx" : "6d4a7f60d4774a4f0aa8bbdedb953c7eea7909407e3164755664bc2800000000", + "wy" : "00e659d34e4df38d9e8c9eaadfba36612c769195be86c77aac3f36e78b538680fb" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046d4a7f60d4774a4f0aa8bbdedb953c7eea7909407e3164755664bc2800000000e659d34e4df38d9e8c9eaadfba36612c769195be86c77aac3f36e78b538680fb", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEbUp/YNR3Sk8KqLve25U8fup5CUB+MWR1\nVmS8KAAAAADmWdNOTfONnoyeqt+6NmEsdpGVvobHeqw/NueLU4aA+w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-256", + "tests" : [ + { + "tcId" : 469, + "comment" : "x-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304502205ea780b73ce027c03ff81e1b26e61076c8944a835d349cd757ece0c4ddf1da24022100bd9b87db26158d5b9132bb0f3df54a2ab6c9ae9a4e0b8496a539ab4ab588ccba", + "result" : "valid" + }, + { + "tcId" : 470, + "comment" : "x-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304402204618f1a11cf8cbc1966416785c3149f75a71ae256d445deb31008d51ba6088c20220408087725dd6ce18bfb7493a5460b54022245e5dbd731ed6d35db88a51d2ba6e", + "result" : "valid" + }, + { + "tcId" : 471, + "comment" : "x-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30450221009d9cdb94e5e9a66bf8eedfdf9f1af43713bb05d880dec89aec21631958970de60220732932649bea35f11dfe0926618e4f091c1b264ca128a9eef14e6d94d7c9f207", + "result" : "valid" + } + ] + } + ] +} diff --git a/packages/crypto/tests/wycheproof_secp256k1.rs b/packages/crypto/tests/wycheproof_secp256k1.rs index 903b3667e3..0a6d0aaf6e 100644 --- a/packages/crypto/tests/wycheproof_secp256k1.rs +++ b/packages/crypto/tests/wycheproof_secp256k1.rs @@ -3,10 +3,12 @@ use cosmwasm_crypto::secp256k1_verify; use serde::Deserialize; use sha2::{Digest, Sha256, Sha512}; +use sha3::Sha3_256; // See ./testdata/wycheproof/README.md for how to get/update those files const SECP256K1_SHA256: &str = "./testdata/wycheproof/ecdsa_secp256k1_sha256_test.json"; const SECP256K1_SHA512: &str = "./testdata/wycheproof/ecdsa_secp256k1_sha512_test.json"; +const SECP256K1_SHA3_256: &str = "./testdata/wycheproof/ecdsa_secp256k1_sha3_256_test.json"; #[derive(Deserialize, Debug)] #[serde(rename_all = "camelCase")] @@ -148,6 +150,55 @@ fn ecdsa_secp256k1_sha512() { assert_eq!(tested, number_of_tests); } +#[test] +fn ecdsa_secp256k1_sha3_256() { + let mut tested: usize = 0; + let File { + number_of_tests, + test_groups, + } = read_file(SECP256K1_SHA3_256); + assert_eq!(number_of_tests, 471, "Got unexpected number of tests"); + + for group in test_groups { + let public_key = hex::decode(group.public_key.uncompressed).unwrap(); + assert_eq!(public_key.len(), 65); + + for tc in group.tests { + tested += 1; + assert_eq!(tc.tc_id as usize, tested); + // eprintln!("Test case ID: {}", tc.tc_id); + + match tc.result.as_str() { + "valid" | "acceptable" => { + let message = hex::decode(tc.msg).unwrap(); + let message_hash: [u8; 32] = Sha3_256::digest(message).into(); + let der_signature = hex::decode(tc.sig).unwrap(); + let signature = from_der(&der_signature).unwrap(); + let valid = secp256k1_verify(&message_hash, &signature, &public_key).unwrap(); + assert!(valid); + } + "invalid" => { + let message = hex::decode(tc.msg).unwrap(); + let message_hash = Sha3_256::digest(message); + let der_signature = hex::decode(tc.sig).unwrap(); + + if let Ok(signature) = from_der(&der_signature) { + match secp256k1_verify(&message_hash, &signature, &public_key) { + Ok(valid) => assert!(!valid), + Err(_) => { /* this is expected for "invalid", all good */ } + } + } else { + // invalid DER encoding, okay + } + } + _ => panic!("Found unexpected result value"), + } + if tc.result == "valid" {} + } + } + assert_eq!(tested, number_of_tests); +} + fn from_der(data: &[u8]) -> Result<[u8; 64], String> { const DER_TAG_INTEGER: u8 = 0x02; From cd13d6950d9b367fa66af486693cf3ccc71f7924 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 23 Jan 2024 13:52:13 +0100 Subject: [PATCH 1198/2372] Add ecdsa_secp256k1_sha3_512_test.json and fix sha512 hasher --- packages/crypto/testdata/wycheproof/README.md | 1 + .../ecdsa_secp256k1_sha3_512_test.json | 7100 +++++++++++++++++ packages/crypto/tests/wycheproof_secp256k1.rs | 94 +- 3 files changed, 7186 insertions(+), 9 deletions(-) create mode 100644 packages/crypto/testdata/wycheproof/ecdsa_secp256k1_sha3_512_test.json diff --git a/packages/crypto/testdata/wycheproof/README.md b/packages/crypto/testdata/wycheproof/README.md index fd5ded43d1..117cd04817 100644 --- a/packages/crypto/testdata/wycheproof/README.md +++ b/packages/crypto/testdata/wycheproof/README.md @@ -16,5 +16,6 @@ from the repo root: && curl -sSL https://github.com/google/wycheproof/raw/master/testvectors_v1/ecdsa_secp256k1_sha256_test.json > ecdsa_secp256k1_sha256_test.json \ && curl -sSL https://github.com/google/wycheproof/raw/master/testvectors_v1/ecdsa_secp256k1_sha512_test.json > ecdsa_secp256k1_sha512_test.json \ && curl -sSL https://github.com/google/wycheproof/raw/master/testvectors_v1/ecdsa_secp256k1_sha3_256_test.json > ecdsa_secp256k1_sha3_256_test.json \ + && curl -sSL https://github.com/google/wycheproof/raw/master/testvectors_v1/ecdsa_secp256k1_sha3_512_test.json > ecdsa_secp256k1_sha3_512_test.json \ ) ``` diff --git a/packages/crypto/testdata/wycheproof/ecdsa_secp256k1_sha3_512_test.json b/packages/crypto/testdata/wycheproof/ecdsa_secp256k1_sha3_512_test.json new file mode 100644 index 0000000000..abbdf2eca3 --- /dev/null +++ b/packages/crypto/testdata/wycheproof/ecdsa_secp256k1_sha3_512_test.json @@ -0,0 +1,7100 @@ +{ + "algorithm" : "ECDSA", + "schema" : "ecdsa_verify_schema.json", + "generatorVersion" : "0.9rc5", + "numberOfTests" : 537, + "header" : [ + "Test vectors of type EcdsaVerify are meant for the verification", + "of ASN encoded ECDSA signatures." + ], + "notes" : { + "ArithmeticError" : { + "bugType" : "EDGE_CASE", + "description" : "Some implementations of ECDSA have arithmetic errors that occur when intermediate results have extreme values. This test vector has been constructed to test such occurences.", + "cves" : [ + "CVE-2017-18146" + ] + }, + "BerEncodedSignature" : { + "bugType" : "BER_ENCODING", + "description" : "ECDSA signatures are usually DER encoded. This signature contains valid values for r and s, but it uses alternative BER encoding.", + "effect" : "Accepting alternative BER encodings may be benign in some cases, or be an issue if protocol requires signature malleability.", + "cves" : [ + "CVE-2020-14966", + "CVE-2020-13822", + "CVE-2019-14859", + "CVE-2016-1000342" + ] + }, + "EdgeCasePublicKey" : { + "bugType" : "EDGE_CASE", + "description" : "The test vector uses a special case public key. " + }, + "EdgeCaseShamirMultiplication" : { + "bugType" : "EDGE_CASE", + "description" : "Shamir proposed a fast method for computing the sum of two scalar multiplications efficiently. This test vector has been constructed so that an intermediate result is the point at infinity if Shamir's method is used." + }, + "IntegerOverflow" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an r and s that has been modified, so that the original value is restored if the implementation ignores the most significant bits.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "InvalidEncoding" : { + "bugType" : "CAN_OF_WORMS", + "description" : "ECDSA signatures are encoded using ASN.1. This test vector contains an incorrectly encoded signature. The test vector itself was generated from a valid signature by modifying its encoding.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "InvalidSignature" : { + "bugType" : "AUTH_BYPASS", + "description" : "The signature contains special case values such as r=0 and s=0. Buggy implementations may accept such values, if the implementation does not check boundaries and computes s^(-1) == 0.", + "effect" : "Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.", + "cves" : [ + "CVE-2022-21449", + "CVE-2021-43572", + "CVE-2022-24884" + ] + }, + "InvalidTypesInSignature" : { + "bugType" : "AUTH_BYPASS", + "description" : "The signature contains invalid types. Dynamic typed languages sometime coerce such values of different types into integers. If an implementation is careless and has additional bugs, such as not checking integer boundaries then it may be possible that such signatures are accepted.", + "effect" : "Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.", + "cves" : [ + "CVE-2022-21449" + ] + }, + "MissingZero" : { + "bugType" : "LEGACY", + "description" : "Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.", + "effect" : "While signatures are more malleable if such signatures are accepted, this typically leads to no vulnerability, since a badly encoded signature can be reencoded correctly." + }, + "ModifiedInteger" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an r and s that has been modified. The goal is to check for arithmetic errors.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "ModifiedSignature" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an invalid signature that was generated from a valid signature by modifying it.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "ModularInverse" : { + "bugType" : "EDGE_CASE", + "description" : "The test vectors contains a signature where computing the modular inverse of s hits an edge case.", + "effect" : "While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.", + "cves" : [ + "CVE-2019-0865" + ] + }, + "PointDuplication" : { + "bugType" : "EDGE_CASE", + "description" : "Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission.", + "cves" : [ + "2020-12607", + "CVE-2015-2730" + ] + }, + "RangeCheck" : { + "bugType" : "CAN_OF_WORMS", + "description" : "The test vector contains an r and s that has been modified. By adding or subtracting the order of the group (or other values) the test vector checks whether signature verification verifies the range of r and s.", + "effect" : "Without further analysis it is unclear if the modification can be used to forge signatures." + }, + "SmallRandS" : { + "bugType" : "EDGE_CASE", + "description" : "The test vectors contains a signature where both r and s are small integers. Some libraries cannot verify such signatures.", + "effect" : "While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.", + "cves" : [ + "2020-13895" + ] + }, + "SpecialCaseHash" : { + "bugType" : "EDGE_CASE", + "description" : "The test vector contains a signature where the hash of the message is a special case, e.g., contains a long run of 0 or 1 bits." + }, + "Untruncatedhash" : { + "bugType" : "MISSING_STEP", + "description" : "If the size of the digest is longer than the size of the underlying order of the multiplicative subgroup then the hash digest must be truncated during signature generation and verification. This test vector contains a signature where this step has been omitted." + }, + "ValidSignature" : { + "bugType" : "BASIC", + "description" : "The test vector contains a valid signature that was generated pseudorandomly. Such signatures should not fail to verify unless some of the parameters (e.g. curve or hash function) are not supported." + } + }, + "testGroups" : [ + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04782c8ed17e3b2a783b5464f33b09652a71c678e05ec51e84e2bcfc663a3de963af9acb4280b8c7f7c42f4ef9aba6245ec1ec1712fd38a0fa96418d8cd6aa6152", + "wx" : "782c8ed17e3b2a783b5464f33b09652a71c678e05ec51e84e2bcfc663a3de963", + "wy" : "00af9acb4280b8c7f7c42f4ef9aba6245ec1ec1712fd38a0fa96418d8cd6aa6152" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004782c8ed17e3b2a783b5464f33b09652a71c678e05ec51e84e2bcfc663a3de963af9acb4280b8c7f7c42f4ef9aba6245ec1ec1712fd38a0fa96418d8cd6aa6152", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEeCyO0X47Kng7VGTzOwllKnHGeOBexR6E\n4rz8Zjo96WOvmstCgLjH98QvTvmrpiRewewXEv04oPqWQY2M1qphUg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 1, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "", + "sig" : "3044022022bb0000e9648a0ee659f9b6a9ab6513dc90ab968ec49d3953f64c82bddc852002204aa0dfd047b0786e118231eff7e86311487ec9d1bc84aaef1f736f4178c288f9", + "result" : "valid" + }, + { + "tcId" : 2, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "4d7367", + "sig" : "3046022100855b60549e0d84ed3959ab2800eee0cbc9a2cecae2e510ed51e9f27975cdcc4e022100c60dcc80a3dcce9911cb9cfba123b6a6f85d20ab695a9ee7d46e0bd9eeb337f9", + "result" : "valid" + }, + { + "tcId" : 3, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "313233343030", + "sig" : "304502205cd73aa58188658ea513f8ecf0d9e2da9eb5d6bcc7cbadcd6a4a8e0cba5176de022100a9f090bb5d3fcf5b7fa7e16d287718773f5f4ba0973b329a3788cd45b4bd3765", + "result" : "valid" + }, + { + "tcId" : 4, + "comment" : "pseudorandom signature", + "flags" : [ + "ValidSignature" + ], + "msg" : "0000000000000000000000000000000000000000", + "sig" : "304502207f9eebad2a323f8346445d1e2fcde47aba4c96ad4686172bebcffaa604e8dbe3022100ec09d731e58e3a337ea03ab72612b1f801b88eac571bd3a031250ac6f2e34fda", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04b838ff44e5bc177bf21189d0766082fc9d843226887fc9760371100b7ee20a6ff0c9d75bfba7b31a6bca1974496eeb56de357071955d83c4b1badaa0b21832e9", + "wx" : "00b838ff44e5bc177bf21189d0766082fc9d843226887fc9760371100b7ee20a6f", + "wy" : "00f0c9d75bfba7b31a6bca1974496eeb56de357071955d83c4b1badaa0b21832e9" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004b838ff44e5bc177bf21189d0766082fc9d843226887fc9760371100b7ee20a6ff0c9d75bfba7b31a6bca1974496eeb56de357071955d83c4b1badaa0b21832e9", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEuDj/ROW8F3vyEYnQdmCC/J2EMiaIf8l2\nA3EQC37iCm/wyddb+6ezGmvKGXRJbutW3jVwcZVdg8Sxutqgshgy6Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 5, + "comment" : "signature malleability", + "flags" : [ + "ValidSignature" + ], + "msg" : "313233343030", + "sig" : "304402207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022059f100a7e4a774cf8f04577ebd9ab9ab2f09cfc5a6be10ffd0338524e6c26caa", + "result" : "valid" + }, + { + "tcId" : 6, + "comment" : "Legacy: ASN encoding of s misses leading 0", + "flags" : [ + "MissingZero" + ], + "msg" : "313233343030", + "sig" : "304402207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe60220a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 7, + "comment" : "valid", + "flags" : [ + "ValidSignature" + ], + "msg" : "313233343030", + "sig" : "304502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "valid" + }, + { + "tcId" : 8, + "comment" : "length of sequence [r, s] uses long form encoding", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "30814502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 9, + "comment" : "length of sequence [r, s] contains a leading 0", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "3082004502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 10, + "comment" : "length of sequence [r, s] uses 70 instead of 69", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304602207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 11, + "comment" : "length of sequence [r, s] uses 68 instead of 69", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304402207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 12, + "comment" : "uint32 overflow in length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3085010000004502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 13, + "comment" : "uint64 overflow in length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308901000000000000004502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 14, + "comment" : "length of sequence [r, s] = 2**31 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30847fffffff02207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 15, + "comment" : "length of sequence [r, s] = 2**31", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30848000000002207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 16, + "comment" : "length of sequence [r, s] = 2**32 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3084ffffffff02207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 17, + "comment" : "length of sequence [r, s] = 2**40 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3085ffffffffff02207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 18, + "comment" : "length of sequence [r, s] = 2**64 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3088ffffffffffffffff02207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 19, + "comment" : "incorrect length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30ff02207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 20, + "comment" : "replaced sequence [r, s] by an indefinite length tag without termination", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308002207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 21, + "comment" : "removing sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "", + "result" : "invalid" + }, + { + "tcId" : 22, + "comment" : "lonely sequence tag", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30", + "result" : "invalid" + }, + { + "tcId" : 23, + "comment" : "appending 0's to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d4970000", + "result" : "invalid" + }, + { + "tcId" : 24, + "comment" : "prepending 0's to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047000002207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 25, + "comment" : "appending unused 0's to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d4970000", + "result" : "invalid" + }, + { + "tcId" : 26, + "comment" : "appending null value to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d4970500", + "result" : "invalid" + }, + { + "tcId" : 27, + "comment" : "prepending garbage to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a498177304502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 28, + "comment" : "prepending garbage to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30492500304502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 29, + "comment" : "appending garbage to sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3047304502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d4970004deadbeef", + "result" : "invalid" + }, + { + "tcId" : 30, + "comment" : "including undefined tags", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304daa00bb00cd00304502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 31, + "comment" : "including undefined tags", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d2228aa00bb00cd0002207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 32, + "comment" : "including undefined tags", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d02207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe62229aa00bb00cd00022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 33, + "comment" : "truncated length of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3081", + "result" : "invalid" + }, + { + "tcId" : 34, + "comment" : "including undefined tags to sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304baa02aabb304502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 35, + "comment" : "using composition with indefinite length for sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3080304502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d4970000", + "result" : "invalid" + }, + { + "tcId" : 36, + "comment" : "using composition with wrong tag for sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3080314502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d4970000", + "result" : "invalid" + }, + { + "tcId" : 37, + "comment" : "Replacing sequence [r, s] with NULL", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "0500", + "result" : "invalid" + }, + { + "tcId" : 38, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "2e4502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 39, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "2f4502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 40, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "314502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 41, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "324502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 42, + "comment" : "changing tag value of sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "ff4502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 43, + "comment" : "dropping value of sequence [r, s]", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3000", + "result" : "invalid" + }, + { + "tcId" : 44, + "comment" : "using composition for sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30493001023044207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 45, + "comment" : "truncated sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304402207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d4", + "result" : "invalid" + }, + { + "tcId" : 46, + "comment" : "truncated sequence [r, s]", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3044207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 47, + "comment" : "sequence [r, s] of size 4166 to check for overflows", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3082104602207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d4970000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 48, + "comment" : "indefinite length", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "308002207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d4970000", + "result" : "invalid" + }, + { + "tcId" : 49, + "comment" : "indefinite length with truncated delimiter", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308002207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d49700", + "result" : "invalid" + }, + { + "tcId" : 50, + "comment" : "indefinite length with additional element", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "308002207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d49705000000", + "result" : "invalid" + }, + { + "tcId" : 51, + "comment" : "indefinite length with truncated element", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308002207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497060811220000", + "result" : "invalid" + }, + { + "tcId" : 52, + "comment" : "indefinite length with garbage", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308002207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d4970000fe02beef", + "result" : "invalid" + }, + { + "tcId" : 53, + "comment" : "indefinite length with nonempty EOC", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "308002207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d4970002beef", + "result" : "invalid" + }, + { + "tcId" : 54, + "comment" : "prepend empty sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047300002207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 55, + "comment" : "append empty sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d4973000", + "result" : "invalid" + }, + { + "tcId" : 56, + "comment" : "append zero", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304802207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497020100", + "result" : "invalid" + }, + { + "tcId" : 57, + "comment" : "append garbage with high tag number", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304802207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497bf7f00", + "result" : "invalid" + }, + { + "tcId" : 58, + "comment" : "append null with explicit tag", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304902207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497a0020500", + "result" : "invalid" + }, + { + "tcId" : 59, + "comment" : "append null with implicit tag", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497a000", + "result" : "invalid" + }, + { + "tcId" : 60, + "comment" : "sequence of sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3047304502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 61, + "comment" : "truncated sequence: removed last 1 elements", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "302202207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6", + "result" : "invalid" + }, + { + "tcId" : 62, + "comment" : "repeating element in sequence", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "306802207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 63, + "comment" : "flipped bit 0 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30437d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe7022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 64, + "comment" : "flipped bit 32 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30437d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccc4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 65, + "comment" : "flipped bit 48 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30437d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577462ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 66, + "comment" : "flipped bit 64 in r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30437d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd477472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 67, + "comment" : "length of r uses long form encoding", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "30460281207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 68, + "comment" : "length of r contains a leading 0", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "3047028200207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 69, + "comment" : "length of r uses 33 instead of 32", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502217d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 70, + "comment" : "length of r uses 31 instead of 32", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045021f7d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 71, + "comment" : "uint32 overflow in length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a028501000000207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 72, + "comment" : "uint64 overflow in length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304e02890100000000000000207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 73, + "comment" : "length of r = 2**31 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902847fffffff7d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 74, + "comment" : "length of r = 2**31", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30490284800000007d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 75, + "comment" : "length of r = 2**32 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30490284ffffffff7d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 76, + "comment" : "length of r = 2**40 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a0285ffffffffff7d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 77, + "comment" : "length of r = 2**64 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d0288ffffffffffffffff7d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 78, + "comment" : "incorrect length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502ff7d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 79, + "comment" : "replaced r by an indefinite length tag without termination", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502807d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 80, + "comment" : "removing r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3023022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 81, + "comment" : "lonely integer tag", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "302402022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 82, + "comment" : "lonely integer tag", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "302302207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe602", + "result" : "invalid" + }, + { + "tcId" : 83, + "comment" : "appending 0's to r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702227d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe60000022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 84, + "comment" : "prepending 0's to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3047022200007d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 85, + "comment" : "appending unused 0's to r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe60000022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 86, + "comment" : "appending null value to r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702227d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe60500022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 87, + "comment" : "prepending garbage to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a222549817702207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 88, + "comment" : "prepending garbage to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30492224250002207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 89, + "comment" : "appending garbage to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d222202207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe60004deadbeef022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 90, + "comment" : "truncated length of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30250281022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 91, + "comment" : "including undefined tags to r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304b2226aa02aabb02207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 92, + "comment" : "using composition with indefinite length for r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049228002207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe60000022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 93, + "comment" : "using composition with wrong tag for r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049228003207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe60000022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 94, + "comment" : "Replacing r with NULL", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30250500022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 95, + "comment" : "changing tag value of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304500207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 96, + "comment" : "changing tag value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304501207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 97, + "comment" : "changing tag value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304503207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 98, + "comment" : "changing tag value of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304504207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 99, + "comment" : "changing tag value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3045ff207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 100, + "comment" : "dropping value of r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "30250200022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 101, + "comment" : "using composition for r", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "3049222402017d021f68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 102, + "comment" : "modifying first byte of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502207f68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 103, + "comment" : "modifying last byte of r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32ab66022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 104, + "comment" : "truncated r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3044021f7d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32ab022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 105, + "comment" : "truncated r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3044021f68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 106, + "comment" : "r of size 4129 to check for overflows", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30821048028210217d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 107, + "comment" : "leading ff in r", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "30460221ff7d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 108, + "comment" : "replaced r by infinity", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3026090180022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 109, + "comment" : "replacing r with zero", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 110, + "comment" : "flipped bit 0 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304302207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe600a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d496", + "result" : "invalid" + }, + { + "tcId" : 111, + "comment" : "flipped bit 32 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304302207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe600a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed966e973d497", + "result" : "invalid" + }, + { + "tcId" : 112, + "comment" : "flipped bit 48 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304302207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe600a60eff581b588b3070fba881426546538ba50d21088a8f3bef9fd967e973d497", + "result" : "invalid" + }, + { + "tcId" : 113, + "comment" : "flipped bit 64 in s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304302207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe600a60eff581b588b3070fba881426546538ba50d21088a8f3aef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 114, + "comment" : "length of s uses long form encoding", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "304602207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe602812100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 115, + "comment" : "length of s contains a leading 0", + "flags" : [ + "BerEncodedSignature" + ], + "msg" : "313233343030", + "sig" : "304702207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe60282002100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 116, + "comment" : "length of s uses 34 instead of 33", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022200a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 117, + "comment" : "length of s uses 32 instead of 33", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022000a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 118, + "comment" : "uint32 overflow in length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a02207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe60285010000002100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 119, + "comment" : "uint64 overflow in length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304e02207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6028901000000000000002100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 120, + "comment" : "length of s = 2**31 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe602847fffffff00a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 121, + "comment" : "length of s = 2**31", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe602848000000000a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 122, + "comment" : "length of s = 2**32 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe60284ffffffff00a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 123, + "comment" : "length of s = 2**40 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a02207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe60285ffffffffff00a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 124, + "comment" : "length of s = 2**64 - 1", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d02207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe60288ffffffffffffffff00a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 125, + "comment" : "incorrect length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe602ff00a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 126, + "comment" : "replaced s by an indefinite length tag without termination", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6028000a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 127, + "comment" : "appending 0's to s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022300a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d4970000", + "result" : "invalid" + }, + { + "tcId" : 128, + "comment" : "prepending 0's to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304702207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe60223000000a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 129, + "comment" : "appending null value to s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304702207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022300a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d4970500", + "result" : "invalid" + }, + { + "tcId" : 130, + "comment" : "prepending garbage to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304a02207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe62226498177022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 131, + "comment" : "prepending garbage to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe622252500022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 132, + "comment" : "appending garbage to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304d02207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe62223022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d4970004deadbeef", + "result" : "invalid" + }, + { + "tcId" : 133, + "comment" : "truncated length of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "302402207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe60281", + "result" : "invalid" + }, + { + "tcId" : 134, + "comment" : "including undefined tags to s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304b02207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe62227aa02aabb022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 135, + "comment" : "using composition with indefinite length for s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe62280022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d4970000", + "result" : "invalid" + }, + { + "tcId" : 136, + "comment" : "using composition with wrong tag for s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe62280032100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d4970000", + "result" : "invalid" + }, + { + "tcId" : 137, + "comment" : "Replacing s with NULL", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "302402207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe60500", + "result" : "invalid" + }, + { + "tcId" : 138, + "comment" : "changing tag value of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6002100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 139, + "comment" : "changing tag value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6012100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 140, + "comment" : "changing tag value of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6032100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 141, + "comment" : "changing tag value of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6042100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 142, + "comment" : "changing tag value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6ff2100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 143, + "comment" : "dropping value of s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "302402207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe60200", + "result" : "invalid" + }, + { + "tcId" : 144, + "comment" : "using composition for s", + "flags" : [ + "InvalidEncoding" + ], + "msg" : "313233343030", + "sig" : "304902207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe622250201000220a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 145, + "comment" : "modifying first byte of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022102a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 146, + "comment" : "modifying last byte of s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d417", + "result" : "invalid" + }, + { + "tcId" : 147, + "comment" : "truncated s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304402207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022000a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d4", + "result" : "invalid" + }, + { + "tcId" : 148, + "comment" : "s of size 4130 to check for overflows", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "3082104802207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe60282102200a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d4970000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "result" : "invalid" + }, + { + "tcId" : 149, + "comment" : "leading ff in s", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "304602207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe60222ff00a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 150, + "comment" : "replaced s by infinity", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "302502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6090180", + "result" : "invalid" + }, + { + "tcId" : 151, + "comment" : "replacing s with zero", + "flags" : [ + "ModifiedSignature" + ], + "msg" : "313233343030", + "sig" : "302502207d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6020100", + "result" : "invalid" + }, + { + "tcId" : 152, + "comment" : "replaced r by r + n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "30460221017d68757ac197624ae5c77dfa1b3bdda5c3a93710ad3a9c1137198b5a1f68ed27022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 153, + "comment" : "replaced r by r - n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "30460221ff7d68757ac197624ae5c77dfa1b3bdda84e4b7d434ea95b99b774ce407efc6aa5022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 154, + "comment" : "replaced r by r + 256 * n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "3047022201007d68757ac197624ae5c77dfa1b3bdc61b7d740d94692379549a5b99d8573ece6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 155, + "comment" : "replaced r by -r", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "3045022082978a853e689db51a388205e4c42258f705a5d6020e042a88b8d332b0cd541a022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 156, + "comment" : "replaced r by n - r", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "304602210082978a853e689db51a388205e4c42257b1b482bcb156a466488b31bf8103955b022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 157, + "comment" : "replaced r by -n - r", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30460221fe82978a853e689db51a388205e4c4225a3c56c8ef52c563eec8e674a5e09712d9022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 158, + "comment" : "replaced r by r + 2**256", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "30460221017d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 159, + "comment" : "replaced r by r + 2**320", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "304e02290100000000000000007d68757ac197624ae5c77dfa1b3bdda708fa5a29fdf1fbd577472ccd4f32abe6022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 160, + "comment" : "replaced s by s + n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "3046022101a60eff581b588b3070fba881426546524653ea07b7d32f77af7137f4b9aa15d8022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 161, + "comment" : "replaced s by s - n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "30450220a60eff581b588b3070fba88142654654d0f6303a5941ef002fcc7adb193d9356022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 162, + "comment" : "replaced s by s + 256 * n", + "flags" : [ + "RangeCheck" + ], + "msg" : "313233343030", + "sig" : "304702220100a60eff581b588b3070fba8814265450e3a81f3d0512acafbc1fd66381fb51597022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 163, + "comment" : "replaced s by -s", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30460221ff59f100a7e4a774cf8f04577ebd9ab9ac745af2def77570c410612698168c2b69022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 164, + "comment" : "replaced s by -n - s", + "flags" : [ + "ModifiedInteger" + ], + "msg" : "313233343030", + "sig" : "30460221fe59f100a7e4a774cf8f04577ebd9ab9adb9ac15f8482cd088508ec80b4655ea28022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 165, + "comment" : "replaced s by s + 2**256", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "3046022101a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 166, + "comment" : "replaced s by s - 2**256", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "30450220a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 167, + "comment" : "replaced s by s + 2**320", + "flags" : [ + "IntegerOverflow" + ], + "msg" : "313233343030", + "sig" : "304e0229010000000000000000a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497022100a60eff581b588b3070fba881426546538ba50d21088a8f3bef9ed967e973d497", + "result" : "invalid" + }, + { + "tcId" : 168, + "comment" : "Signature with special case values r=0 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100020100", + "result" : "invalid" + }, + { + "tcId" : 169, + "comment" : "Signature with special case values r=0 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100020101", + "result" : "invalid" + }, + { + "tcId" : 170, + "comment" : "Signature with special case values r=0 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201000201ff", + "result" : "invalid" + }, + { + "tcId" : 171, + "comment" : "Signature with special case values r=0 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 172, + "comment" : "Signature with special case values r=0 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 173, + "comment" : "Signature with special case values r=0 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 174, + "comment" : "Signature with special case values r=0 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 175, + "comment" : "Signature with special case values r=0 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020100022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 176, + "comment" : "Signature with special case values r=1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101020100", + "result" : "invalid" + }, + { + "tcId" : 177, + "comment" : "Signature with special case values r=1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101020101", + "result" : "invalid" + }, + { + "tcId" : 178, + "comment" : "Signature with special case values r=1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201010201ff", + "result" : "invalid" + }, + { + "tcId" : 179, + "comment" : "Signature with special case values r=1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 180, + "comment" : "Signature with special case values r=1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 181, + "comment" : "Signature with special case values r=1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 182, + "comment" : "Signature with special case values r=1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 183, + "comment" : "Signature with special case values r=1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026020101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 184, + "comment" : "Signature with special case values r=-1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff020100", + "result" : "invalid" + }, + { + "tcId" : 185, + "comment" : "Signature with special case values r=-1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff020101", + "result" : "invalid" + }, + { + "tcId" : 186, + "comment" : "Signature with special case values r=-1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff0201ff", + "result" : "invalid" + }, + { + "tcId" : 187, + "comment" : "Signature with special case values r=-1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 188, + "comment" : "Signature with special case values r=-1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 189, + "comment" : "Signature with special case values r=-1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 190, + "comment" : "Signature with special case values r=-1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 191, + "comment" : "Signature with special case values r=-1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "30260201ff022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 192, + "comment" : "Signature with special case values r=n and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141020100", + "result" : "invalid" + }, + { + "tcId" : 193, + "comment" : "Signature with special case values r=n and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141020101", + "result" : "invalid" + }, + { + "tcId" : 194, + "comment" : "Signature with special case values r=n and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410201ff", + "result" : "invalid" + }, + { + "tcId" : 195, + "comment" : "Signature with special case values r=n and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 196, + "comment" : "Signature with special case values r=n and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 197, + "comment" : "Signature with special case values r=n and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 198, + "comment" : "Signature with special case values r=n and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 199, + "comment" : "Signature with special case values r=n and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 200, + "comment" : "Signature with special case values r=n - 1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140020100", + "result" : "invalid" + }, + { + "tcId" : 201, + "comment" : "Signature with special case values r=n - 1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140020101", + "result" : "invalid" + }, + { + "tcId" : 202, + "comment" : "Signature with special case values r=n - 1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641400201ff", + "result" : "invalid" + }, + { + "tcId" : 203, + "comment" : "Signature with special case values r=n - 1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 204, + "comment" : "Signature with special case values r=n - 1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 205, + "comment" : "Signature with special case values r=n - 1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 206, + "comment" : "Signature with special case values r=n - 1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 207, + "comment" : "Signature with special case values r=n - 1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 208, + "comment" : "Signature with special case values r=n + 1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142020100", + "result" : "invalid" + }, + { + "tcId" : 209, + "comment" : "Signature with special case values r=n + 1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142020101", + "result" : "invalid" + }, + { + "tcId" : 210, + "comment" : "Signature with special case values r=n + 1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641420201ff", + "result" : "invalid" + }, + { + "tcId" : 211, + "comment" : "Signature with special case values r=n + 1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 212, + "comment" : "Signature with special case values r=n + 1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 213, + "comment" : "Signature with special case values r=n + 1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 214, + "comment" : "Signature with special case values r=n + 1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 215, + "comment" : "Signature with special case values r=n + 1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 216, + "comment" : "Signature with special case values r=p and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f020100", + "result" : "invalid" + }, + { + "tcId" : 217, + "comment" : "Signature with special case values r=p and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f020101", + "result" : "invalid" + }, + { + "tcId" : 218, + "comment" : "Signature with special case values r=p and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0201ff", + "result" : "invalid" + }, + { + "tcId" : 219, + "comment" : "Signature with special case values r=p and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 220, + "comment" : "Signature with special case values r=p and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 221, + "comment" : "Signature with special case values r=p and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 222, + "comment" : "Signature with special case values r=p and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 223, + "comment" : "Signature with special case values r=p and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 224, + "comment" : "Signature with special case values r=p + 1 and s=0", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30020100", + "result" : "invalid" + }, + { + "tcId" : 225, + "comment" : "Signature with special case values r=p + 1 and s=1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30020101", + "result" : "invalid" + }, + { + "tcId" : 226, + "comment" : "Signature with special case values r=p + 1 and s=-1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc300201ff", + "result" : "invalid" + }, + { + "tcId" : 227, + "comment" : "Signature with special case values r=p + 1 and s=n", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "result" : "invalid" + }, + { + "tcId" : 228, + "comment" : "Signature with special case values r=p + 1 and s=n - 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "result" : "invalid" + }, + { + "tcId" : 229, + "comment" : "Signature with special case values r=p + 1 and s=n + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142", + "result" : "invalid" + }, + { + "tcId" : 230, + "comment" : "Signature with special case values r=p + 1 and s=p", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + "result" : "invalid" + }, + { + "tcId" : 231, + "comment" : "Signature with special case values r=p + 1 and s=p + 1", + "flags" : [ + "InvalidSignature" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30", + "result" : "invalid" + }, + { + "tcId" : 232, + "comment" : "Signature encoding contains incorrect types: r=0, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3008020100090380fe01", + "result" : "invalid" + }, + { + "tcId" : 233, + "comment" : "Signature encoding contains incorrect types: r=0, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100090142", + "result" : "invalid" + }, + { + "tcId" : 234, + "comment" : "Signature encoding contains incorrect types: r=0, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100010101", + "result" : "invalid" + }, + { + "tcId" : 235, + "comment" : "Signature encoding contains incorrect types: r=0, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020100010100", + "result" : "invalid" + }, + { + "tcId" : 236, + "comment" : "Signature encoding contains incorrect types: r=0, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201000500", + "result" : "invalid" + }, + { + "tcId" : 237, + "comment" : "Signature encoding contains incorrect types: r=0, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201000c00", + "result" : "invalid" + }, + { + "tcId" : 238, + "comment" : "Signature encoding contains incorrect types: r=0, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201000c0130", + "result" : "invalid" + }, + { + "tcId" : 239, + "comment" : "Signature encoding contains incorrect types: r=0, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201003000", + "result" : "invalid" + }, + { + "tcId" : 240, + "comment" : "Signature encoding contains incorrect types: r=0, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201003003020100", + "result" : "invalid" + }, + { + "tcId" : 241, + "comment" : "Signature encoding contains incorrect types: r=1, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3008020101090380fe01", + "result" : "invalid" + }, + { + "tcId" : 242, + "comment" : "Signature encoding contains incorrect types: r=1, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101090142", + "result" : "invalid" + }, + { + "tcId" : 243, + "comment" : "Signature encoding contains incorrect types: r=1, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101010101", + "result" : "invalid" + }, + { + "tcId" : 244, + "comment" : "Signature encoding contains incorrect types: r=1, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006020101010100", + "result" : "invalid" + }, + { + "tcId" : 245, + "comment" : "Signature encoding contains incorrect types: r=1, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201010500", + "result" : "invalid" + }, + { + "tcId" : 246, + "comment" : "Signature encoding contains incorrect types: r=1, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201010c00", + "result" : "invalid" + }, + { + "tcId" : 247, + "comment" : "Signature encoding contains incorrect types: r=1, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201010c0130", + "result" : "invalid" + }, + { + "tcId" : 248, + "comment" : "Signature encoding contains incorrect types: r=1, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201013000", + "result" : "invalid" + }, + { + "tcId" : 249, + "comment" : "Signature encoding contains incorrect types: r=1, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201013003020100", + "result" : "invalid" + }, + { + "tcId" : 250, + "comment" : "Signature encoding contains incorrect types: r=-1, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201ff090380fe01", + "result" : "invalid" + }, + { + "tcId" : 251, + "comment" : "Signature encoding contains incorrect types: r=-1, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff090142", + "result" : "invalid" + }, + { + "tcId" : 252, + "comment" : "Signature encoding contains incorrect types: r=-1, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff010101", + "result" : "invalid" + }, + { + "tcId" : 253, + "comment" : "Signature encoding contains incorrect types: r=-1, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff010100", + "result" : "invalid" + }, + { + "tcId" : 254, + "comment" : "Signature encoding contains incorrect types: r=-1, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201ff0500", + "result" : "invalid" + }, + { + "tcId" : 255, + "comment" : "Signature encoding contains incorrect types: r=-1, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201ff0c00", + "result" : "invalid" + }, + { + "tcId" : 256, + "comment" : "Signature encoding contains incorrect types: r=-1, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060201ff0c0130", + "result" : "invalid" + }, + { + "tcId" : 257, + "comment" : "Signature encoding contains incorrect types: r=-1, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050201ff3000", + "result" : "invalid" + }, + { + "tcId" : 258, + "comment" : "Signature encoding contains incorrect types: r=-1, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30080201ff3003020100", + "result" : "invalid" + }, + { + "tcId" : 259, + "comment" : "Signature encoding contains incorrect types: r=n, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141090380fe01", + "result" : "invalid" + }, + { + "tcId" : 260, + "comment" : "Signature encoding contains incorrect types: r=n, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141090142", + "result" : "invalid" + }, + { + "tcId" : 261, + "comment" : "Signature encoding contains incorrect types: r=n, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141010101", + "result" : "invalid" + }, + { + "tcId" : 262, + "comment" : "Signature encoding contains incorrect types: r=n, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141010100", + "result" : "invalid" + }, + { + "tcId" : 263, + "comment" : "Signature encoding contains incorrect types: r=n, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410500", + "result" : "invalid" + }, + { + "tcId" : 264, + "comment" : "Signature encoding contains incorrect types: r=n, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410c00", + "result" : "invalid" + }, + { + "tcId" : 265, + "comment" : "Signature encoding contains incorrect types: r=n, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410c0130", + "result" : "invalid" + }, + { + "tcId" : 266, + "comment" : "Signature encoding contains incorrect types: r=n, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641413000", + "result" : "invalid" + }, + { + "tcId" : 267, + "comment" : "Signature encoding contains incorrect types: r=n, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641413003020100", + "result" : "invalid" + }, + { + "tcId" : 268, + "comment" : "Signature encoding contains incorrect types: r=p, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f090380fe01", + "result" : "invalid" + }, + { + "tcId" : 269, + "comment" : "Signature encoding contains incorrect types: r=p, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f090142", + "result" : "invalid" + }, + { + "tcId" : 270, + "comment" : "Signature encoding contains incorrect types: r=p, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f010101", + "result" : "invalid" + }, + { + "tcId" : 271, + "comment" : "Signature encoding contains incorrect types: r=p, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f010100", + "result" : "invalid" + }, + { + "tcId" : 272, + "comment" : "Signature encoding contains incorrect types: r=p, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0500", + "result" : "invalid" + }, + { + "tcId" : 273, + "comment" : "Signature encoding contains incorrect types: r=p, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0c00", + "result" : "invalid" + }, + { + "tcId" : 274, + "comment" : "Signature encoding contains incorrect types: r=p, s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0c0130", + "result" : "invalid" + }, + { + "tcId" : 275, + "comment" : "Signature encoding contains incorrect types: r=p, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3025022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f3000", + "result" : "invalid" + }, + { + "tcId" : 276, + "comment" : "Signature encoding contains incorrect types: r=p, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3028022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f3003020100", + "result" : "invalid" + }, + { + "tcId" : 277, + "comment" : "Signature encoding contains incorrect types: r=0.25, s=0.25", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300a090380fe01090380fe01", + "result" : "invalid" + }, + { + "tcId" : 278, + "comment" : "Signature encoding contains incorrect types: r=nan, s=nan", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006090142090142", + "result" : "invalid" + }, + { + "tcId" : 279, + "comment" : "Signature encoding contains incorrect types: r=True, s=True", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010101010101", + "result" : "invalid" + }, + { + "tcId" : 280, + "comment" : "Signature encoding contains incorrect types: r=False, s=False", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010100010100", + "result" : "invalid" + }, + { + "tcId" : 281, + "comment" : "Signature encoding contains incorrect types: r=Null, s=Null", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300405000500", + "result" : "invalid" + }, + { + "tcId" : 282, + "comment" : "Signature encoding contains incorrect types: r=empyt UTF-8 string, s=empyt UTF-8 string", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30040c000c00", + "result" : "invalid" + }, + { + "tcId" : 283, + "comment" : "Signature encoding contains incorrect types: r=\"0\", s=\"0\"", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060c01300c0130", + "result" : "invalid" + }, + { + "tcId" : 284, + "comment" : "Signature encoding contains incorrect types: r=empty list, s=empty list", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300430003000", + "result" : "invalid" + }, + { + "tcId" : 285, + "comment" : "Signature encoding contains incorrect types: r=list containing 0, s=list containing 0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "300a30030201003003020100", + "result" : "invalid" + }, + { + "tcId" : 286, + "comment" : "Signature encoding contains incorrect types: r=0.25, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3008090380fe01020100", + "result" : "invalid" + }, + { + "tcId" : 287, + "comment" : "Signature encoding contains incorrect types: r=nan, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006090142020100", + "result" : "invalid" + }, + { + "tcId" : 288, + "comment" : "Signature encoding contains incorrect types: r=True, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010101020100", + "result" : "invalid" + }, + { + "tcId" : 289, + "comment" : "Signature encoding contains incorrect types: r=False, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "3006010100020100", + "result" : "invalid" + }, + { + "tcId" : 290, + "comment" : "Signature encoding contains incorrect types: r=Null, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050500020100", + "result" : "invalid" + }, + { + "tcId" : 291, + "comment" : "Signature encoding contains incorrect types: r=empyt UTF-8 string, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30050c00020100", + "result" : "invalid" + }, + { + "tcId" : 292, + "comment" : "Signature encoding contains incorrect types: r=\"0\", s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30060c0130020100", + "result" : "invalid" + }, + { + "tcId" : 293, + "comment" : "Signature encoding contains incorrect types: r=empty list, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30053000020100", + "result" : "invalid" + }, + { + "tcId" : 294, + "comment" : "Signature encoding contains incorrect types: r=list containing 0, s=0", + "flags" : [ + "InvalidTypesInSignature" + ], + "msg" : "313233343030", + "sig" : "30083003020100020100", + "result" : "invalid" + }, + { + "tcId" : 295, + "comment" : "Edge case for Shamir multiplication", + "flags" : [ + "EdgeCaseShamirMultiplication" + ], + "msg" : "37363338", + "sig" : "3046022100dd1b7d09a7bd8218961034a39a87fecf5314f00c4d25eb58a07ac85e85eab516022100f5133b41774a185247720d2aa5d8826b6ec5af4c076936c8eaa52ed6cdf59408", + "result" : "valid" + }, + { + "tcId" : 296, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32373239373236343137", + "sig" : "3046022100904b2bb6e9de8f73243fa7ecc19a5a9fe034acad2b75b97c8cc84a79c5f3577402210081452342987040d43f50c72f2a5246430aa7559bee6c56663fd12029507a915f", + "result" : "valid" + }, + { + "tcId" : 297, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "343331343737363137", + "sig" : "3045022100b08122f027076f924cd1dc877c93659ecf942410772fba58881c9109311bca5302200287a0033df7c069fbfab7faefffddd7121908fdef76c04a1a402d599f04942e", + "result" : "valid" + }, + { + "tcId" : 298, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36363033343338303333", + "sig" : "3044022048c044b94de8809898184e376a8a0903707679350e37ce290f858c8beef78c6d02206ccd83394e8abf4df2a40afb001ca4284d913d6b9caf6ef225d66bdddf9eb45d", + "result" : "valid" + }, + { + "tcId" : 299, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32383239363231343535", + "sig" : "3044022005535fc39278260eb2b8cfba00226cb3155d75c0cf6b418ac56df63b7c0b1e9b022031aebd43e848874347b38ad64ef172fa315fda09645c8752c0e010152e43418b", + "result" : "valid" + }, + { + "tcId" : 300, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34333131383231373336", + "sig" : "3044022078957c4f5a000af05fc477cc813cc6dcd9445438215b1c493780b6ccbd39a965022067023127ccde416b92cb3a7560436950ab643bbf08383ec9f4f6862cdb302095", + "result" : "valid" + }, + { + "tcId" : 301, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3131373730373734313735", + "sig" : "3045022100ea1b7fd5ba10eeb70a456c149d494fa3757a209093c4dfcf03730d1cd54829e502203cd204bb84656435e3656fa5e76edc4df3ee79615f7f1adfaf388a7eec4f8172", + "result" : "valid" + }, + { + "tcId" : 302, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31353938353135353635", + "sig" : "3046022100c9611952ab603753d0601e0c97de91a6d2927d38afeb1b2b622ea384968cbbe8022100dc32c42ce627f286f7d14aa4b037588abfc202b916a7bf9051c3d0527c66dca4", + "result" : "valid" + }, + { + "tcId" : 303, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32383831313031363138", + "sig" : "3044022012c960e3fcfee173335123fe15cd7f8c8bc55f6f84a071e440b0e418cc9c0c2c02203f494246c0889b4213150ce77b6f5f2957476d3faf898135d56c145fd3af35ef", + "result" : "valid" + }, + { + "tcId" : 304, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32303034373833333332", + "sig" : "3045022100dc921912a76a225819d4956a7ff0660bcdf695bdf286288858ccd5a26001277102206bc5879138b207c3e4e692d4412c9a3fdff91ac58a669ec830b68b1cd562e556", + "result" : "valid" + }, + { + "tcId" : 305, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "39353030323437373837", + "sig" : "3046022100e31a34cb647ddc65b03f9bd05aa3e5e62a800c6fb56794843b606f1f08890524022100e7f2e4ff291bd309b0617478da0fdba92535376a69dc43061783b3ef928113ad", + "result" : "valid" + }, + { + "tcId" : 306, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32323039353030303630", + "sig" : "3044022047b825bdd67cb5d91f017d52ea77f59b1de1e05be48a469978fc88ca577dba2c022053ee369d5b89bf58b3c76218b7cecf12de68127152917c58ee155ee85dc664f2", + "result" : "valid" + }, + { + "tcId" : 307, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "38313933373839323237", + "sig" : "304502210085b2d5faa65cd162e666df35beb535c797e7a2a20836d351ebcff798c343309b0220196a837aabc19fa4522c5fac4c8e63e7cf3a5819c97fcec10e80f33e41f266a2", + "result" : "valid" + }, + { + "tcId" : 308, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33363530363033323938", + "sig" : "3045022100de538dcaf220334aca9fbc11d1576643662c66585e268bc0eb331608ad9523ed02201b1d32790d46c6925ab909408170839f83e6a03a7632ec8877a0c191fffbee79", + "result" : "valid" + }, + { + "tcId" : 309, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3136333833393533353233", + "sig" : "3046022100b5d45e7fe1196bf5e076fd76742c1e12eefa7934de826d7395646c94a8013fbc022100f5475abab65d9ef64616fde95b3ca6b75fa864758950015441a4414acdd0c894", + "result" : "valid" + }, + { + "tcId" : 310, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32303931373638323035", + "sig" : "3046022100d973f8f20c33772413f214d1b8709cceaad159c9211ccf337e7477da197d49530221008d4c39ee66532e2ceea2f0861ee02781ba0339eefb30bc06218f4a63fd86c11a", + "result" : "valid" + }, + { + "tcId" : 311, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "39333634373032383235", + "sig" : "3046022100c487ab066b8bdac12b5c728586a61e42d0a1bea16fb544d3bd56fede77bb3db9022100d27022a17957dc23bd760d0f00e93f10189c67d32a9ec5489514f140e49272d3", + "result" : "valid" + }, + { + "tcId" : 312, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "393236383638373931", + "sig" : "3045022100f7777648b15af89af40cf9ea0a3c875aa0d9d736eca529af4eb6238f78a562d202203b70d46e1439bc5d941bdae8507625971c1c64dcf4c51bcdb43b1ca3ae0373d4", + "result" : "valid" + }, + { + "tcId" : 313, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35313738313334383231", + "sig" : "304402207bb4646c887062a6c3e680b1491854c4b26a4728e5f2b2c1cc3087c780dab7b3022062900f55b885617f9b3c7ef34c67ecc37bf78e11a04cd6b9052eb80f9756559c", + "result" : "valid" + }, + { + "tcId" : 314, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34373335303130373531", + "sig" : "304502204a96ed67d0950d97a8675c302f6102215ce0ec837ff53fbf06b57b010526b5740221008deb5f7a7c8cbeff01c3443700b8da129088771c8c2bf4ceca2a5fa81138a534", + "result" : "valid" + }, + { + "tcId" : 315, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3134333533393131363839", + "sig" : "3046022100d9c3938a4b91d0660f6ddae8540a7bbeae2b0d717bde1f33e6904280197471930221009b022d6547abf9bef980bf8fd67c366e234eff3aebee58a7ee56d335df807a29", + "result" : "valid" + }, + { + "tcId" : 316, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31333834353439323034", + "sig" : "3045022100f855a2d237016b1e0ec307672a793668b611d2b6d4e5acfe2b2088aadd6296a7022013c60acb5e6fa51f03ee8cbe3a220f3ac1ce527daee05e9d7430343030dea7e7", + "result" : "valid" + }, + { + "tcId" : 317, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32373632313932373839", + "sig" : "3045022100b8ddb1ed6e80056fb9cea2590b1b63cfd1e8098c27547ec8c6cacd78e6ebfddb02207514ac6644955744946fcb5617f8b067850a3ecf829d821f18435a5e11a4a58b", + "result" : "valid" + }, + { + "tcId" : 318, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31383331363534333331", + "sig" : "3046022100e903b7ead454ff8de871fdf67b6bae4ddc88254c35b333a98ba3a2f6562678a5022100f713e10293aec60e63c2a79b189129e54919a74cda6a204a2727c13bb63a25ba", + "result" : "valid" + }, + { + "tcId" : 319, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32343336383939303330", + "sig" : "30450220615208d06b392c418fba55c752fef7b9ab8ed47d98f40776d86ff4bfa3e95464022100f403d5984d446acb203eba58a5468372267f9004f263aaa1eaa208652297db5b", + "result" : "valid" + }, + { + "tcId" : 320, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "323034303431323232", + "sig" : "304502200eb65a5bc338cd920a174648dd84ed5443f37417d8d730ceab0dd3fb9a2046f3022100c7a86d7e09f5e142fc6d45a136b4581e081f66a26fe0255f012b812d7cf90189", + "result" : "valid" + }, + { + "tcId" : 321, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33333337313139393735", + "sig" : "30440220226464501f1ccc32f1e1482fff4624f4949343c79a820d4b9df637b493ab5b2302204eb47d0fd14db448cedd611e1dae972bdf27ce0fcfc19d9ec5bda9683081598d", + "result" : "valid" + }, + { + "tcId" : 322, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36363935363230363738", + "sig" : "3045022100bc0d706b5fdf102805cf83f66ce17a97aebd5e3b6e7d5c008cd51164750af1080220651388d190da29748df343dc61e23c248c753013a5688652ca43d222edd1bfb4", + "result" : "valid" + }, + { + "tcId" : 323, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32303933303137373437", + "sig" : "3045022039a1d9927356d6849b7e96cd34a5828bad112687198637e7b84900ed92fad0b70221009b5c753e2e10619e1993b8d8171a7aa4c4813a8721aca1f79bef06c0fa858462", + "result" : "valid" + }, + { + "tcId" : 324, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "313233343137393136", + "sig" : "3045022100d57adda8926a6b75a5c994a0b8abc75534e68bd79b02b8eaeb1a7add4c5c423202203b349431e37740c60f92c55dcc8a9f55e70e27b9f73d82e37d728ba7266cddf6", + "result" : "valid" + }, + { + "tcId" : 325, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31373634333530363837", + "sig" : "304402207d5b4c29599e97085686534f843d71d25f22b96d89c70b4030abcbe6abd73559022028797ed87120c4bf50e37b0704d2d3b4e0b1b98c27e618eb99568b08123a1be9", + "result" : "valid" + }, + { + "tcId" : 326, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3131343137323431343431", + "sig" : "304402200db6c547a1e7bbb715b48b7974104b6d7618f1dfed77019daa29bd59b273c087022057f054587cdd5628772c14dde0a77dc5c1bad06828410c5c63b9c1b35fe04410", + "result" : "valid" + }, + { + "tcId" : 327, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32323638323436343933", + "sig" : "30440220094a1e172012d9367852f228f49c382bbdf19a6b354b8511807e585cd46e907f02200e50740da30419a987ccd56746b8737aa74a1292892eef99a34025aebb6dd209", + "result" : "valid" + }, + { + "tcId" : 328, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32373234373936373737", + "sig" : "3045022073a5445895e0796686dc28c3e4cd5bc1f85368b3264b455d470a7cbeb7592d910221008a9ffabf9f65921734934d65053a00bfa3c353ac81cc9b6f60271635026cd0e1", + "result" : "valid" + }, + { + "tcId" : 329, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "393733333935313139", + "sig" : "304402200630f2c6277e9e0414b7e8da64311850b6f3912193970fd6e2f4df79df720c7c02206ccdaf47a44ee1043b76ef62b3de3aee876c26f4efe492cb3649423e599753d0", + "result" : "valid" + }, + { + "tcId" : 330, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31353037303032373036", + "sig" : "304502201e1b75a3495bb5ceb2adb84b80f117672b79c5bc71e953d1a274b11dc4238729022100dcf48d930d89c0d301e97f9083487e63cb39127310b0f5e3c8769e98e5b2605d", + "result" : "valid" + }, + { + "tcId" : 331, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33373433353638373832", + "sig" : "3045022100eb92e1a80ad7f440d8a2e9d88ac765c5cbf724bd367f414c9d91cc1904afe497022074fe0ec7cc0122eea4e63c4d16c89edf6a57823178c3747b01e7aff3df710007", + "result" : "valid" + }, + { + "tcId" : 332, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "393437363731323438", + "sig" : "304402207c99e1ae6941f4bcf54ea65491cafca180eee1605a2ed908c476ee67cbdd737302201f94f03ed47cc9674abb294cfe7e7b10ad67101b8cb245a8b5fb883a21a06dd9", + "result" : "valid" + }, + { + "tcId" : 333, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "373235343434333234", + "sig" : "3044022029bd14a9dafbe562e0c4c0d4aecb6491bbd37f707133f78fc5cb3313365377b702202ea1d86246d8edad31132f3dbe642cac488690849bdd7438d5c626cf8c973970", + "result" : "valid" + }, + { + "tcId" : 334, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35353334303231323139", + "sig" : "3046022100cf7219dcc18e22bd487b6f59c6494f637c5f0ccb18192e9e60178621220b49fc022100a05d5abbe25a610c8e3615cf7d01c69563ddbfe76d7235fda45f046af03e50ff", + "result" : "valid" + }, + { + "tcId" : 335, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3132333031383133373933", + "sig" : "304402201589de61cd315ba0bf7f0e577f00589d28f72131f4c7af41c6bb31ae8ba271da02202ff82a9a1f52901c4c6f8b8a41c0f6e760f160da266d788da5bdc945084dff8d", + "result" : "valid" + }, + { + "tcId" : 336, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "39313135333137363130", + "sig" : "3046022100a8c59942907039886bc374c17ff452b604385c3537b9b6c6113c1b19d72e68a9022100d376bc866cc82d78ca17b461edf16faea44e577659b1fef02cec0f41bd2e747c", + "result" : "valid" + }, + { + "tcId" : 337, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32383934333937393632", + "sig" : "304602210099cc652412dcdfc574b6fc2525615e6711caaf7d558cc781a3a11cf371f40f71022100866dd4ab6b58b5d6379f0b431f9a251399defd5516bf6bb5495511e05b24f801", + "result" : "valid" + }, + { + "tcId" : 338, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31323333353833303333", + "sig" : "3045022100b47cad5c88161e29620957061e24cdf46f3fff97c266b1635fcf2e9cb4d92879022013549f3b1b639eeb33f40cb338ecd089b9094d9625b76734f3803e9d40a1eb26", + "result" : "valid" + }, + { + "tcId" : 339, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "323131323639323536", + "sig" : "3045022100f4f3a043b5bdc56bd471876e2df15ea80ccb189b25486e6ab9007cffe121acfc022078e8e3b3589580dac1ce299a18f5704901104cd21205317608c330adc8d35272", + "result" : "valid" + }, + { + "tcId" : 340, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33303035343833383634", + "sig" : "304502205df45e90f9413908b47f7cbb05d6c43a81eb62375ab961d2b065c6118023c018022100d720a2a23c34ece3acc1a516070bde6bfcad28fd89c482d72b69d8113b1903f6", + "result" : "valid" + }, + { + "tcId" : 341, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "38333536373632373235", + "sig" : "30440220780bb93f52d53752a9a877dab0578c7702d1ea889960e1682e84f82740b1be5d022008e366ffe8f72d041426aee57aeffce7822b209c34b28255a5de67190870ce42", + "result" : "valid" + }, + { + "tcId" : 342, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "38333239353030373630", + "sig" : "3045022100f743a77c86dce094cc265a87b2e053c8cc773370851dbc7ba1a52c58df24d55402202516e4614dd7ccd36a23cbbb1b58c29f900d4da2113e7b9ac956bf8879907680", + "result" : "valid" + }, + { + "tcId" : 343, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31393237303834313635", + "sig" : "304502200b77b2ab21a5c92cb0e3f2f5b8594edcc0dd6c70dbeea9d9d363a3718c64dfb402210091c2d6515ff6f2977fd0a150cb04c600102f0ae07a9061993244783e62f2337a", + "result" : "valid" + }, + { + "tcId" : 344, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37333032333538323838", + "sig" : "3045022041f0a220d11a014dfe43f89ab647abea430cf5a9703088f28c1222abb77e8857022100f811c584c10a25fba6216113698e5a2dc52d8ea340d92ce7a11d356f6d5a1382", + "result" : "valid" + }, + { + "tcId" : 345, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3133343733373337333833", + "sig" : "3045022100ed707e3cac8bd56a4f0a3118558e8402dd477be7dcaa1a7ff448b0bcbfc0fac102203d9933e01d7e9439059973fa499c37b896213b04346bb292f867ff3a58c3d07a", + "result" : "valid" + }, + { + "tcId" : 346, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32353031353533363839", + "sig" : "30460221008035d10dfd533e01718fa9d0a1773e55b424770415e570aef766ea2cbe577c27022100815b0f14d6f7f4ca45191428d98c9b414871ffecdac3d0717d285a473e5ddb06", + "result" : "valid" + }, + { + "tcId" : 347, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33353335303430303239", + "sig" : "3045022100fbc3576a648ebd633152fc896ae6b4827c55824fb0c96fdd217fb2cfe3bbe63602200b37a95b15589663db322e1f089aa8132965ed6490362d243ef749c6094527f2", + "result" : "valid" + }, + { + "tcId" : 348, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31343230333537323930", + "sig" : "3045022100de08cc84004d3fb30521b8e0ade66b6d52734ccd182cace8a34ba0e390fea89302202c1e3deb79d16117ed84c8982276d43709c5963d57bd2b10a530ebf161da1a3d", + "result" : "valid" + }, + { + "tcId" : 349, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "393035313735303638", + "sig" : "304502204eef795dc7b17efde95dc52062e3b60ab360d37704800fc915785e7739b834d9022100c68356eacc3509bf4d2b62412b2472f22383d18fa8851527294b1fad194c7bcf", + "result" : "valid" + }, + { + "tcId" : 350, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31363133373734323935", + "sig" : "3045022100cb845b9fcfa07e88e9011f0311cae9f3f740516e7d16d9819b7d0f6fc764dac702203d7f3ba5173e130937b02bb7b8da25c506ace6182b8f9ae4ed891f7d216c0378", + "result" : "valid" + }, + { + "tcId" : 351, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "383733363733343931", + "sig" : "304502207d19ff3efc71258f747e74d76f091107b1fa47c87c638720b55178c0655dcbcc022100b8a653e31931dbd2ffc4e957675c68c28719b8118ec3ed3778c57ce3eff1613f", + "result" : "valid" + }, + { + "tcId" : 352, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34333535313036343035", + "sig" : "3045022010d465e03829dad77e8246ad11caf8c6aa8aa918c2bef5a9a9e601c5a919f68f022100f365a7a7540dcb642de90e6d6ccf0c74094a8005deaed4062e394e1cf2bcd8fb", + "result" : "valid" + }, + { + "tcId" : 353, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34353339353735383736", + "sig" : "30450220674330ea5a5d45d71fca1f3ba031494dee9a8623e0d9e9adbb2822794acb4f12022100ae4d3830157c820bc23fa792188b94bb559c3a6212768d7ac59dcf36f74402f6", + "result" : "valid" + }, + { + "tcId" : 354, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "383933363633323031", + "sig" : "3046022100a632c676f667669bda1b0ecf5f33fa67aaaf8aee46bc9e9f2bd5bd10c36cbb95022100a99352cacd6bd42b78a93908008c23eec2d36e5e4fd0aa349d5634fc543199c5", + "result" : "valid" + }, + { + "tcId" : 355, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33383036303638303338", + "sig" : "304502200c9d2e8935f855e69dccd877d95248303e1b6daf8f61da500150185f5565fa97022100e4ce328f00e218aa13d496d85b73b5b891cf0b7c66ebefe5e6b92b1da7f837a9", + "result" : "valid" + }, + { + "tcId" : 356, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32323332383137343937", + "sig" : "304402204748c00f44a6b3a8726f604d7b933303d98cd458b850ff2d7cb90c11d5950ac70220766df7aa4c8b3f8b03b0eb8aec653fb70eab7433a84e7ef2d57f368a051b704d", + "result" : "valid" + }, + { + "tcId" : 357, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34303734333232353538", + "sig" : "304402204e4fee37b0b93d7d6dbee89b47dab0c065186ee81caf2227bb26e85149bbf9ef02203eb83850edda9a1b1011118feccd03e47b3e1ec815837bb7f8867288ad8df831", + "result" : "valid" + }, + { + "tcId" : 358, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "363130363735383237", + "sig" : "30460221009e8520c5e8296935fe93da2dad55963b9f1f88187f76810fff53c0a6e95b0c07022100d185de4f682a97d28fc3067d56a3d24f743f32d47a6f390068b2ceb71678fadf", + "result" : "valid" + }, + { + "tcId" : 359, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3137343138373339323133", + "sig" : "304402203cacb67364a3fc1a379557f7e6f5d0f501977fd4822666956c9356146b7d922f0220686e27be6217045a5010c88003dd3956a864798c8ae687714fc8b7277f7b520f", + "result" : "valid" + }, + { + "tcId" : 360, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35313237383432323837", + "sig" : "304502205df702c77d4638a4302d21a9fdd70bbe31a4a4a79c7d531d4f4c8283970f664a022100f72d799abce3cd22985c5cfc68f7afc8f96f4e7dce8485ed5c595edc1e1f1d4b", + "result" : "valid" + }, + { + "tcId" : 361, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35303338363930383739", + "sig" : "30450220243a857dfd167b938492c421bd657659d101944736fa79b903cf91ec1c49e8e3022100bab3f04f130d737993ec8f45503376abe816c2b8e5ab3decb0dbca4f5e181d08", + "result" : "valid" + }, + { + "tcId" : 362, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33383737303432333937", + "sig" : "3045022067a7996b7680e958480ac2f97084f2055194b38e0ecf82246dc87918ee1954a8022100de187dfbeefce383dcea1a7fd71362385d09c6d25aacdfa34ea270a91ec97cf5", + "result" : "valid" + }, + { + "tcId" : 363, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "333231373038313738", + "sig" : "3045022100ab6cf003aa7865cf8010ea01944fa0d2f825ac6a997a427f8a4e791e797ac6f6022028a7a6c80582ba8f888d2008fbd696799561e92d9a51922cc602aec2135f08aa", + "result" : "valid" + }, + { + "tcId" : 364, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37363637303434323730", + "sig" : "30460221009f9f0be992fdd3e069167599dc55e331c9f189d2c230ae15d1b5b441d3843c74022100f8e5b4ed8ead0352e032f79b5f0475f0975e3738d784d895e9e4002b26762b79", + "result" : "valid" + }, + { + "tcId" : 365, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31313034373435303432", + "sig" : "30440220373b8587777d2b4ff461fddf521abd8fc5d3a1caca847f4a5461dab6ba242d83022051a98da2628724018dff804c26a9671f7df3e24490392a2d1a91fdc7f50deab2", + "result" : "valid" + }, + { + "tcId" : 366, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "313533383730313534", + "sig" : "304502210090a6286a271d8ffa72ddb55e8c924793e03b2af73ce10f2deae857961cb07070022028df2b6379501110c12ac167189f9ea8873e1d62ffc76e6ada83f2cf412ea5d3", + "result" : "valid" + }, + { + "tcId" : 367, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32323631333835303439", + "sig" : "30450220107434a824ec05568d52219ab3e847046f01493f1db57a82fabe754555838292022100d1c2f7c1ecb5afbc9b0e63e20fcf34cfc16bb260b0748343eb86c44012449b8f", + "result" : "valid" + }, + { + "tcId" : 368, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37353538373437363632", + "sig" : "304502204b737fb724c97348fb67a994e88816b1091951b77234f1904717ec7ef1aa951d022100ff722b669bd4342e6b856232b5a5c03d2cf16f09b3d3842d0a87fc19d910acd4", + "result" : "valid" + }, + { + "tcId" : 369, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33343939333634313832", + "sig" : "3046022100abe804f6c76fa3f1470c0f244a7ed96807ddffff4031926cfad9a2c9f73ed773022100e48352653ccc46f5f5a76d7eb3997dfd412001fb1692312788f7c297ef792fa7", + "result" : "valid" + }, + { + "tcId" : 370, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32333639323733393835", + "sig" : "304402207d55a5da3201de5343703ff8ee363b7ddbcb3d786afca8f157b25e7c90d09de802203dfcb55acd7def4218abd3f989e901f824cc2d4ed3a37b8794117975103ff004", + "result" : "valid" + }, + { + "tcId" : 371, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "343933383339353635", + "sig" : "3044022025d2c88f0b79f2289f92d3ecb6de119fab764fb43ab5286391f9a282c82ac1980220105f44fa27afe4dc9800e6a16528314de01b17737e9741862f93ed0cc33b30f3", + "result" : "valid" + }, + { + "tcId" : 372, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32353334333739393337", + "sig" : "3045022100d725c2731a6db8d623027a926a665e9dba0f95e90a5fe6807a84b200111f04ec0220346140bffb84731f0f1cf857193dea25a2f721463dc3b85a8e72c73ff72bda94", + "result" : "valid" + }, + { + "tcId" : 373, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "383334383031353938", + "sig" : "304402204fa9704d3eaa5760da0b97abc0de1f872840e58bfdb1a8f9d8be3f96f950ca7d02206ae15b572c7d1a49c99e1aa54de5fb2bbe055d45686770f579c08ee79924ede9", + "result" : "valid" + }, + { + "tcId" : 374, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32343131303537343836", + "sig" : "30450220343353c8be35ca222a38771b19ff3550abe41b91f2ffdea9c9f4887d70b02782022100c285e3761c6645b3db4ff99a7ac40803286f28475ba28b9cd55cacdefb330984", + "result" : "valid" + }, + { + "tcId" : 375, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "373836343638363335", + "sig" : "30450220529b121d5b3cccb426189d7343d571adf05cfaee843669da6722f728c192bb8202210086490a7686215fb29b18a166bc22c1b8a982fd7d57ab593318adf8355684b45f", + "result" : "valid" + }, + { + "tcId" : 376, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33303534373733373638", + "sig" : "3045022100ff65707177bb9aa135c5fd774bf72eb3058e80afc7d8bdea8f7fd18040ea995902200d4ed13f9e01bab8aaaa40d7f5c923a78470888375b4690e1164a83fdf136201", + "result" : "valid" + }, + { + "tcId" : 377, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31393237303137373338", + "sig" : "30450220471ebfcc45de07bd4118f94b0284f0c5848dd93149a217b56b49e20baf583ced022100ad498b79d6151bf64e003f502fca8fb7b05b2106a96ca1b977ee002c73bc721b", + "result" : "valid" + }, + { + "tcId" : 378, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31303531333235363334", + "sig" : "304402201e279add50ce6148dd4a3d311bad896745a169364ef68b94e6360fc48e949b9f02207230fbe4007fb7d6a4274c396081f37a1c9b2559b526db1efe435ead15e4b74e", + "result" : "valid" + }, + { + "tcId" : 379, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34303139383636363832", + "sig" : "3044022052dfbabbcb99651021c025a308530b9cd04732f43463bbc51160cd542d9028df02200ebef4f6870bce1ca302e7120560e5170067c0fb3dc8668448b89dd4821b53fb", + "result" : "valid" + }, + { + "tcId" : 380, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3130343530323537333530", + "sig" : "3046022100dabd19aeb87fd56119a3354c468f4429fc14421c54e8be9e9b927941579ae55e022100b10a7396c973e052af2944d37247e9016682d4da7cab2d5428618ce120a21056", + "result" : "valid" + }, + { + "tcId" : 381, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "333236393538353830", + "sig" : "304402202b9950c4005dea8e603ffe0fd9b3f66b7c0f07509e50913bb825ef7ddf2e6e77022062c9fcdf79026f60f830e7cae4af814db2cb58b5a948562772da130613bbef94", + "result" : "valid" + }, + { + "tcId" : 382, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33303734363533323431", + "sig" : "3045022009d881e300448b9eac33c67f10c061c2c985c415a414d09c891847e3eec88598022100e75455a508493506f8746074f8bb3698d4362f98a9daa20fa916f6c4023764ae", + "result" : "valid" + }, + { + "tcId" : 383, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "37373134363833343830", + "sig" : "304402202db5a6d9b16c61c888a5de064f621e45227ab63efba61ef210fe4ef81c93e00f022004b8e57a7373b3642e58db0cc652d6da541d6d25c7b32c1ed2b408c9e3c39719", + "result" : "valid" + }, + { + "tcId" : 384, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31373933333831333230", + "sig" : "304502207bd46dbe132d95aff854bebf1c0dd1e90303328fd84d381e93217723d1a4bc18022100f795a0c68d6c318c038dc37bd22d36bce8083096637e8912c3d01cbabd3feec7", + "result" : "valid" + }, + { + "tcId" : 385, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34383830363235353636", + "sig" : "304502200ca03beb6d348d3d36d2e9f6773e5882ded66fe6026c9c27b847e34523c77c2c0221008770b6f0b6aa7c982e84235f1840a6172386a41ae75fd9affac7916cbd19f8c3", + "result" : "valid" + }, + { + "tcId" : 386, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3439343337363438383537", + "sig" : "304502203f1a74c1dab6bfc319da38cde7a812695b530c60b36d2ae3fa11a7206b2031d5022100f07f8eb5825b2d5642443185d6afd2264e98996dc392519f812883dbe0e247fc", + "result" : "valid" + }, + { + "tcId" : 387, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34373038363839373836", + "sig" : "304402201ae1c3ec96f8591a3a235de7c6f739201104381eebeab5fb5ee523f577b6c7fa022007ac1a9348fc8946964fbef0af11dc8b2da6feb3eee8cf475c4926ca9cd571a3", + "result" : "valid" + }, + { + "tcId" : 388, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33303239383732393531", + "sig" : "3046022100c6ef5423c69541caa3bb8f361f4fa9caeca30fb329a0da806ea956270e0a9928022100c045de5205eb8bc861bc159522b41c0d66e62fac0f58730861000cdf9e27bd96", + "result" : "valid" + }, + { + "tcId" : 389, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33303137313930333835", + "sig" : "304402203097d229239b4085e3fb3188106d5da53456752976d2c4ba82dcff6ab96d1909022056f60ab76d33bc94ebae3042a1d56a731429f1bed162bf3ef7269d912aaeea71", + "result" : "valid" + }, + { + "tcId" : 390, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "393536333633393339", + "sig" : "304402206c9ecb8dd5b8badd49ea1b26ae3ae2af7236cbe1c626aa6b27029ef1d6d05901022006c9bf356441f84215b006c721a00697cede6941a18fbc0f9c5b3c267eeaa371", + "result" : "valid" + }, + { + "tcId" : 391, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35333030373634333530", + "sig" : "3045022043ae5619f91b711a61be076581f91d382c39fe53d500b136f81be639bea76add022100824594f08185479731ed095367c04def2ff196229c5b136b3835eb8bb819c56d", + "result" : "valid" + }, + { + "tcId" : 392, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31393334363634383434", + "sig" : "3045022013e8dc460a0d2af2305a6abfeac834737d4441576b194fe83147b7d7d1247479022100c590a7b7fd6de8c2d658aa2bde97de84505985e2979ab2a527658122cafaf61e", + "result" : "valid" + }, + { + "tcId" : 393, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3335353435303535393632", + "sig" : "3045022027feb06a4c5bb046162467e523b4b62c2c8dabf26ded997eb0737d3eafd16c8a0221009ce87c4cd6b93d1ec3b3c5d29fa415cf918edd24e0febd7b200d6c82c91e5f78", + "result" : "valid" + }, + { + "tcId" : 394, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31333031373232313038", + "sig" : "30450221009d76a05d5803a2da17dc2782ec469c8024b1d293a38c23ac4eeb3058595a24a70220226595b192ea8336faa44670fef5e808ff9911ccda85a1765c19ec44671b0505", + "result" : "valid" + }, + { + "tcId" : 395, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35363137363931363932", + "sig" : "30440220791088736561f41932cd86f066cca6d63d4473aebb869bcc70c923ef80a7fd95022033402973e7a824602712a5abf7030bad2f183e6b4fa40c66399a14ae48e288e3", + "result" : "valid" + }, + { + "tcId" : 396, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33353831393332353334", + "sig" : "3044022052685eef5f2168598c294870188c043dff0496638037170763ef5778b7b6fc1f022079a88d3e7b2c3a44be4b3b3305e4bad5fcfe07d179136f5ac926315ff9d4787a", + "result" : "valid" + }, + { + "tcId" : 397, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3135373136363738373434", + "sig" : "304502205db883b5a3766a2a14ab26a25ec598f7bd1f97585fe0b55341e7da251a62ec1e022100bf63c66e992c91fde513abdbd59b4f9f542881cfdc2be3fbf3e772b97e505b3d", + "result" : "valid" + }, + { + "tcId" : 398, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33313939373833333630", + "sig" : "304502207e2f80300a4c81543e324e9c8973bbb6f16599c3d337ee82aed816624843f37002210080a807e920deaebaf3c3247010cb3c91cfce21b0d5ad695177d934ee5a7f7cbe", + "result" : "valid" + }, + { + "tcId" : 399, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "373430343735303832", + "sig" : "3046022100de12eb33b717fd887fd684a64af9439a27ee83b28ac5751772249e600856b59e0221008dca367bd7bc83709f25b0fc4e1f4a0e7e747be0b8a2977aabd25750a0ba60c2", + "result" : "valid" + }, + { + "tcId" : 400, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "343137343336353339", + "sig" : "3045022100dee112ed7000c0776ba4fab09f439a844addb86c5046223397498ad72d059de402207039b715851e4b386ea15e9bb0899ca21a4e6f4ecbbce4f706d29274806400b6", + "result" : "valid" + }, + { + "tcId" : 401, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31323335363538383839", + "sig" : "30450221009d01032d95cac596e7df6c75965c3669f29cb8e58cc9a933bc5d60c1a97e946e02201cf2ce39df73cc734bb4180ef09de883bad7c8d82ab1a5861d265b48aa195bb6", + "result" : "valid" + }, + { + "tcId" : 402, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "32343239323535343034", + "sig" : "304502206f1513d12e2112ec4f396ef4ea38324102ec3c7fb63ee49f485cb421a07dce57022100a78fbd65b2582a4031c34c7a8c28f03f16ef2ba18e2da41ef173ee5a85af1fe3", + "result" : "valid" + }, + { + "tcId" : 403, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3531383033303235343636", + "sig" : "3046022100c3fb59671cb8c6db48bd51a667060428f75124b5e990af1e997fd636335072d5022100c797e7245cfc8d98bca3ae1f4239b88684cadeda2c628f09ae61053eeb683771", + "result" : "valid" + }, + { + "tcId" : 404, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34343736333938323030", + "sig" : "3046022100e8b5b3f3443d59d7521d093884486e7a6732e275ec13313bd4d178f28128e075022100d299b062928e5f058c705acc3c62f24128ec703c28288b0d294216370cad69b0", + "result" : "valid" + }, + { + "tcId" : 405, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "39303630303335323132", + "sig" : "3045022100ce43218d44e113ec38d5cbcf402f3dbfa87d58826a760f0bf2c88f11981f77190220648f3ed0d1b76dec5437cb685dda7a1512ef07f4eb078dc50e418efeb1af8849", + "result" : "valid" + }, + { + "tcId" : 406, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31373536303533303938", + "sig" : "3046022100fdc99047865eeffcb69f8b8728a008e31f9f6ba78f698fae62b71cce79501888022100f06612f593873a13459695a5c4cb504acc2a8c56179b68553e60f2319c905b4e", + "result" : "valid" + }, + { + "tcId" : 407, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34393830383630303338", + "sig" : "30450220256e5c4f4cd121e2dee1987be7b241b6e91f90d483210aab9a4b367db5613174022100f75060db4bd6cd52bb8e6aa94f7ab68488a638873515787ec0d7e61bad58ab7f", + "result" : "valid" + }, + { + "tcId" : 408, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "33363231383735333335", + "sig" : "3046022100c7a269986b6ad540dd30e620d1606e3267935c7fd5551b3311fd4e840510c2480221008db7c8c464109cf0edb89357e663de6e882b6f5906adde6d58575ce0a2cce257", + "result" : "valid" + }, + { + "tcId" : 409, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36363433333334373231", + "sig" : "304502200bea324758ea80ed4a0a56f7d836fc73bf196e43fbc59d953f0ce34abba57b22022100f04027248e83bd48fb1571291ca1a5f088eb3e89f00904d71b9ea8d6677f7893", + "result" : "valid" + }, + { + "tcId" : 410, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34343534393432373832", + "sig" : "304402205b53c96d7a195f02cfac2d155aa7e132fbc35d59afb080f649dc13056248addf02202b157db2154bd5dc0ef2fc6eecd867fabdc633d2ca683a48f3f9095745351aa6", + "result" : "valid" + }, + { + "tcId" : 411, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3230313834343032", + "sig" : "3044022024174a81d221a4bfd8978f312acec4dacc4f08f8f8cdf29b2024bad2177758df022073fc1bf3388009e3219cf4c7e62e4aeaffc1b9614b2831405a01403c86936452", + "result" : "valid" + }, + { + "tcId" : 412, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3538313332313733", + "sig" : "304502205de7e80ce3137f5705d23397197c86e7749e5e682104f13beb5a6365a63780ea022100f3da2bfd6442638da60201be68fe2ad206365af9e40c4c1531cd3a05db1ad3c6", + "result" : "valid" + }, + { + "tcId" : 413, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31313833383631383131", + "sig" : "3045022100dcdc28f81ff5ed91fa15f15fc4f1d38f9cddfc3df65bb2d3a55582faf7c0910d0220515b7759a130d667eff7ff3167c305cca101be3a07945fd7cb6a1359c16db678", + "result" : "valid" + }, + { + "tcId" : 414, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31393232363032393036", + "sig" : "304502207407261c978018cc6e92a340de80edd3044a6e7116eb9fa9b022a2aeb318c65e022100bb5826953e0b85ad69745249f69507765a93f82198bca1e4475fd5de7dfb15ca", + "result" : "valid" + }, + { + "tcId" : 415, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "393735313433323037", + "sig" : "304402203962520ea2ef01cba7d5135117a7fcb5ab120b28baf6e31de2e6ec9993d8d5bc02202583659fbdf83399309bddc89ea5f39fe22187671f3149d94f96fa234a6013db", + "result" : "valid" + }, + { + "tcId" : 416, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "38333135313136333833", + "sig" : "3046022100bec3ea35844452bb739d92b20882e5b672dc6eff323cd31d1a2db37db93791e80221008ef77b3c709d60b9d5d998f81d3f72c466fd7bb99c681ae8bc9c580db1f7c213", + "result" : "valid" + }, + { + "tcId" : 417, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "333236333136383132", + "sig" : "3045022100b8fbdfedee5376cfc9177d96c45e003f90b7367aa40cf37d63e483bfaa4be95102204dcacdfbe41df7899382607489bb75422f3eb67822890ea3bbfd80cd456fc127", + "result" : "valid" + }, + { + "tcId" : 418, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "34303239363837313336", + "sig" : "3045022100df228c1a8bb3684b7ffa2e3f777643c369e1bc2299d66a66c8ed27a4ed59b783022047314aaf3629a0de02313df06c0cb363e4e019aafd20ec06be63b7b4c21538ed", + "result" : "valid" + }, + { + "tcId" : 419, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "36333230383831313931", + "sig" : "30440220528746b280d8a0e54851cb99894afc01ce24cff7edd60116e3d8dae42adb496102204eb264629e5cf4aba77e05c54774bd0cf20b057142a1ac2103099d664c2c5dee", + "result" : "valid" + }, + { + "tcId" : 420, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "35323235333930373830", + "sig" : "3045022044c391f82cf5eeb80f87c347a5bfe461c49fd8779311e237abc05b19f6aed093022100866853619339b716092df4466aa0cc9e6256fb7e18a79854b60ccc534bb6df10", + "result" : "valid" + }, + { + "tcId" : 421, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "31333439333933363934", + "sig" : "3045022003d127a6f72465bd1c02109f9605202b246763097c756235d8f8a26848eb609c02210083d551427f31b9572b61180cf18bc85c20306c0de2c39d00430b3fc91dc50c6b", + "result" : "valid" + }, + { + "tcId" : 422, + "comment" : "special case hash", + "flags" : [ + "SpecialCaseHash" + ], + "msg" : "3130333937393630373631", + "sig" : "304502205044ef2362c8e6c32fc14584b0751eda8e8e8901d9382354040d2615d9cc07c1022100dd16765911dce7a7ae5f3b64b3ce3a5e12e548784597dc0a379f7bb8f4fca879", + "result" : "valid" + }, + { + "tcId" : 423, + "comment" : "Signature generated without truncating the hash", + "flags" : [ + "Untruncatedhash" + ], + "msg" : "313233343030", + "sig" : "3045022100ce645f0f1ccb63844e54bd7603a4280ea065e3c147d26e73cfbe58c6116b0cf1022040ccc23188aa20453d7f95d33868f247b3d77c516b70e4c351b48ca2ebef0027", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "040fa36769835d1d215f156d5e82bed2fa76aab134bdb1d3bd40975faf5ac19cc6e67d675a8f0dc4760b3f8fbe0f0853a80b58af8dd2c4a41afbf9cb0c72d016ca", + "wx" : "0fa36769835d1d215f156d5e82bed2fa76aab134bdb1d3bd40975faf5ac19cc6", + "wy" : "00e67d675a8f0dc4760b3f8fbe0f0853a80b58af8dd2c4a41afbf9cb0c72d016ca" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200040fa36769835d1d215f156d5e82bed2fa76aab134bdb1d3bd40975faf5ac19cc6e67d675a8f0dc4760b3f8fbe0f0853a80b58af8dd2c4a41afbf9cb0c72d016ca", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAED6NnaYNdHSFfFW1egr7S+naqsTS9sdO9\nQJdfr1rBnMbmfWdajw3Edgs/j74PCFOoC1ivjdLEpBr7+csMctAWyg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 424, + "comment" : "k*G has a large x-coordinate", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30360211014551231950b75fc4402da1722fc9baeb022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e", + "result" : "valid" + }, + { + "tcId" : 425, + "comment" : "r too large", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2c022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "042f1db0895a8d615779a38ddcbeacad9458f35688b587abeeda1cb5a891e954a5b591478e3b81f5881dd71f93b811130a67ea697f452faccd5c5117fac15f5f93", + "wx" : "2f1db0895a8d615779a38ddcbeacad9458f35688b587abeeda1cb5a891e954a5", + "wy" : "00b591478e3b81f5881dd71f93b811130a67ea697f452faccd5c5117fac15f5f93" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200042f1db0895a8d615779a38ddcbeacad9458f35688b587abeeda1cb5a891e954a5b591478e3b81f5881dd71f93b811130a67ea697f452faccd5c5117fac15f5f93", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAELx2wiVqNYVd5o43cvqytlFjzVoi1h6vu\n2hy1qJHpVKW1kUeOO4H1iB3XH5O4ERMKZ+ppf0UvrM1cURf6wV9fkw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 426, + "comment" : "r,s are large", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04462155174b64dd050601b6d7c2297251815d413e26c9b91d123536e76fd3fb135f0a20f86528dff246ecc71d5d005b2935e4d8e0b076fd6792d4a2b3fd2b7bb9", + "wx" : "462155174b64dd050601b6d7c2297251815d413e26c9b91d123536e76fd3fb13", + "wy" : "5f0a20f86528dff246ecc71d5d005b2935e4d8e0b076fd6792d4a2b3fd2b7bb9" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004462155174b64dd050601b6d7c2297251815d413e26c9b91d123536e76fd3fb135f0a20f86528dff246ecc71d5d005b2935e4d8e0b076fd6792d4a2b3fd2b7bb9", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAERiFVF0tk3QUGAbbXwilyUYFdQT4mybkd\nEjU252/T+xNfCiD4ZSjf8kbsxx1dAFspNeTY4LB2/WeS1KKz/St7uQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 427, + "comment" : "r and s^-1 have a large Hamming weight", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02203e9a7582886089c62fb840cf3b83061cd1cff3ae4341808bb5bdee6191174177", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "048e89e0fff2d768c7c139b22b90aa66b24b3b1ced4345c469e439b2c80d6fed084eb9ca1486ff3411db46590f78008d6d6a0a9cf9cf36b2bef833407af5bc883e", + "wx" : "008e89e0fff2d768c7c139b22b90aa66b24b3b1ced4345c469e439b2c80d6fed08", + "wy" : "4eb9ca1486ff3411db46590f78008d6d6a0a9cf9cf36b2bef833407af5bc883e" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200048e89e0fff2d768c7c139b22b90aa66b24b3b1ced4345c469e439b2c80d6fed084eb9ca1486ff3411db46590f78008d6d6a0a9cf9cf36b2bef833407af5bc883e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEjong//LXaMfBObIrkKpmsks7HO1DRcRp\n5DmyyA1v7QhOucoUhv80EdtGWQ94AI1tagqc+c82sr74M0B69byIPg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 428, + "comment" : "r and s^-1 have a large Hamming weight", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022024238e70b431b1a64efdf9032669939d4b77f249503fc6905feb7540dea3e6d2", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04f4c2d7df7ca616bce49212e47ed112106445f47cf114782626740d37e1c596df1088b19bcaf0d10609a46bbdfd626a83d13e62d405775ae3941755b278a443c0", + "wx" : "00f4c2d7df7ca616bce49212e47ed112106445f47cf114782626740d37e1c596df", + "wy" : "1088b19bcaf0d10609a46bbdfd626a83d13e62d405775ae3941755b278a443c0" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004f4c2d7df7ca616bce49212e47ed112106445f47cf114782626740d37e1c596df1088b19bcaf0d10609a46bbdfd626a83d13e62d405775ae3941755b278a443c0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE9MLX33ymFrzkkhLkftESEGRF9HzxFHgm\nJnQNN+HFlt8QiLGbyvDRBgmka739YmqD0T5i1AV3WuOUF1WyeKRDwA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 429, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020101020101", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0443053fa57436a0b26f0f887b2403ccd9d18f14b7866e1da593835e93cd103a156039d7ccf6c355ac94ed59225aab8a5aa190c89c422f80e71246b998818ecd54", + "wx" : "43053fa57436a0b26f0f887b2403ccd9d18f14b7866e1da593835e93cd103a15", + "wy" : "6039d7ccf6c355ac94ed59225aab8a5aa190c89c422f80e71246b998818ecd54" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000443053fa57436a0b26f0f887b2403ccd9d18f14b7866e1da593835e93cd103a156039d7ccf6c355ac94ed59225aab8a5aa190c89c422f80e71246b998818ecd54", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEQwU/pXQ2oLJvD4h7JAPM2dGPFLeGbh2l\nk4Nek80QOhVgOdfM9sNVrJTtWSJaq4paoZDInEIvgOcSRrmYgY7NVA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 430, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020101020102", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "049b27e4409c49abe9d8d1b90edc64367daedb43d68a41c501032dba5d73ef10210cd42cc8488eb0588680b94e934ff744f4e6cb079737beb5eeabbe56fd11a7bb", + "wx" : "009b27e4409c49abe9d8d1b90edc64367daedb43d68a41c501032dba5d73ef1021", + "wy" : "0cd42cc8488eb0588680b94e934ff744f4e6cb079737beb5eeabbe56fd11a7bb" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200049b27e4409c49abe9d8d1b90edc64367daedb43d68a41c501032dba5d73ef10210cd42cc8488eb0588680b94e934ff744f4e6cb079737beb5eeabbe56fd11a7bb", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEmyfkQJxJq+nY0bkO3GQ2fa7bQ9aKQcUB\nAy26XXPvECEM1CzISI6wWIaAuU6TT/dE9ObLB5c3vrXuq75W/RGnuw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 431, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020101020103", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04ef2c0193d262327fbe06d3a6edeada676b0aeac94f43b5cff5d819e853f637dd7917a8ace976df5ca947daba44607d623d65b7a29a59297723b66cd6fe060345", + "wx" : "00ef2c0193d262327fbe06d3a6edeada676b0aeac94f43b5cff5d819e853f637dd", + "wy" : "7917a8ace976df5ca947daba44607d623d65b7a29a59297723b66cd6fe060345" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004ef2c0193d262327fbe06d3a6edeada676b0aeac94f43b5cff5d819e853f637dd7917a8ace976df5ca947daba44607d623d65b7a29a59297723b66cd6fe060345", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE7ywBk9JiMn++BtOm7eraZ2sK6slPQ7XP\n9dgZ6FP2N915F6is6XbfXKlH2rpEYH1iPWW3oppZKXcjtmzW/gYDRQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 432, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020102020101", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04bce72b0e7d13fc61fb298d7e799c31eb7561ca022c00f7cc66848110295055a8526a501171c1007be07d433f9cb4659a26d1cb910aed64e1b2cce73fb3ceee2b", + "wx" : "00bce72b0e7d13fc61fb298d7e799c31eb7561ca022c00f7cc66848110295055a8", + "wy" : "526a501171c1007be07d433f9cb4659a26d1cb910aed64e1b2cce73fb3ceee2b" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004bce72b0e7d13fc61fb298d7e799c31eb7561ca022c00f7cc66848110295055a8526a501171c1007be07d433f9cb4659a26d1cb910aed64e1b2cce73fb3ceee2b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEvOcrDn0T/GH7KY1+eZwx63VhygIsAPfM\nZoSBEClQVahSalARccEAe+B9Qz+ctGWaJtHLkQrtZOGyzOc/s87uKw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 433, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020102020102", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "048afb5d6db0101d97bed729ad568856639c73d39f19353ed60d7c9515c3e33378a0587fb9aca4ffd17787f3ae81cd871218eacf2c32bdd9ed5ee5e4d15cb779f1", + "wx" : "008afb5d6db0101d97bed729ad568856639c73d39f19353ed60d7c9515c3e33378", + "wy" : "00a0587fb9aca4ffd17787f3ae81cd871218eacf2c32bdd9ed5ee5e4d15cb779f1" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200048afb5d6db0101d97bed729ad568856639c73d39f19353ed60d7c9515c3e33378a0587fb9aca4ffd17787f3ae81cd871218eacf2c32bdd9ed5ee5e4d15cb779f1", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEivtdbbAQHZe+1ymtVohWY5xz058ZNT7W\nDXyVFcPjM3igWH+5rKT/0XeH866BzYcSGOrPLDK92e1e5eTRXLd58Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 434, + "comment" : "small r and s", + "flags" : [ + "SmallRandS", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3006020102020103", + "result" : "valid" + }, + { + "tcId" : 435, + "comment" : "r is larger than n", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364143020103", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04358a4f5840da0d9344a4f62e090d75870948f57714be0eb331f7fc956e77e9fc84245dcf34ac6ace334c1b6cea82082fe4ccddd2f780b4eb737bc8f4648ef98e", + "wx" : "358a4f5840da0d9344a4f62e090d75870948f57714be0eb331f7fc956e77e9fc", + "wy" : "0084245dcf34ac6ace334c1b6cea82082fe4ccddd2f780b4eb737bc8f4648ef98e" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004358a4f5840da0d9344a4f62e090d75870948f57714be0eb331f7fc956e77e9fc84245dcf34ac6ace334c1b6cea82082fe4ccddd2f780b4eb737bc8f4648ef98e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAENYpPWEDaDZNEpPYuCQ11hwlI9XcUvg6z\nMff8lW536fyEJF3PNKxqzjNMG2zqgggv5Mzd0veAtOtze8j0ZI75jg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 436, + "comment" : "s is larger than n", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3026020102022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd04917c8", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0406b2c1b72f12846bbcceda68183372d3f05ec591c43569361646f5916a00a7202282d15b70f19db914c6fdd8faf15ab90ced3bd4c3f59a247be41610497594c6", + "wx" : "06b2c1b72f12846bbcceda68183372d3f05ec591c43569361646f5916a00a720", + "wy" : "2282d15b70f19db914c6fdd8faf15ab90ced3bd4c3f59a247be41610497594c6" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000406b2c1b72f12846bbcceda68183372d3f05ec591c43569361646f5916a00a7202282d15b70f19db914c6fdd8faf15ab90ced3bd4c3f59a247be41610497594c6", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEBrLBty8ShGu8ztpoGDNy0/BexZHENWk2\nFkb1kWoApyAigtFbcPGduRTG/dj68Vq5DO071MP1miR75BYQSXWUxg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 437, + "comment" : "small r and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "302702020101022100c58b162c58b162c58b162c58b162c58a1b242973853e16db75c8a1a71da4d39d", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "044e61226e0b1c1e5a40767956c7b530eace83d550038e32bd14c5258c48c939fd57d069215ea210b386820a2d426fc711862bcfb34c7deaaed404d17692892cc4", + "wx" : "4e61226e0b1c1e5a40767956c7b530eace83d550038e32bd14c5258c48c939fd", + "wy" : "57d069215ea210b386820a2d426fc711862bcfb34c7deaaed404d17692892cc4" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200044e61226e0b1c1e5a40767956c7b530eace83d550038e32bd14c5258c48c939fd57d069215ea210b386820a2d426fc711862bcfb34c7deaaed404d17692892cc4", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAETmEibgscHlpAdnlWx7Uw6s6D1VADjjK9\nFMUljEjJOf1X0GkhXqIQs4aCCi1Cb8cRhivPs0x96q7UBNF2koksxA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 438, + "comment" : "smallish r and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "302c02072d9b4d347952cc022100fcbc5103d0da267477d1791461cf2aa44bf9d43198f79507bd8779d69a13108e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04cf259a52f769eecab5071c0b4676bc4cc474474b74675fe8bd1660df5b70ce1b722f774a601a61f2e8e364477b0ccea457b76977ab300139c4ee0e1fbb7fe8f9", + "wx" : "00cf259a52f769eecab5071c0b4676bc4cc474474b74675fe8bd1660df5b70ce1b", + "wy" : "722f774a601a61f2e8e364477b0ccea457b76977ab300139c4ee0e1fbb7fe8f9" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004cf259a52f769eecab5071c0b4676bc4cc474474b74675fe8bd1660df5b70ce1b722f774a601a61f2e8e364477b0ccea457b76977ab300139c4ee0e1fbb7fe8f9", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEzyWaUvdp7sq1BxwLRna8TMR0R0t0Z1/o\nvRZg31twzhtyL3dKYBph8ujjZEd7DM6kV7dpd6swATnE7g4fu3/o+Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 439, + "comment" : "100-bit r and small s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3032020d1033e67e37b32b445580bf4efc022100906f906f906f906f906f906f906f906ed8e426f7b1968c35a204236a579723d2", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0467ba78328cffa6eb3f7119096adf17e3fca6b2da966c03bc66174c2984a1d5539abdde7989d6f5083187261393a6e162eb508ae62749e41caf55b2be14d9a960", + "wx" : "67ba78328cffa6eb3f7119096adf17e3fca6b2da966c03bc66174c2984a1d553", + "wy" : "009abdde7989d6f5083187261393a6e162eb508ae62749e41caf55b2be14d9a960" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000467ba78328cffa6eb3f7119096adf17e3fca6b2da966c03bc66174c2984a1d5539abdde7989d6f5083187261393a6e162eb508ae62749e41caf55b2be14d9a960", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEZ7p4Moz/pus/cRkJat8X4/ymstqWbAO8\nZhdMKYSh1VOavd55idb1CDGHJhOTpuFi61CK5idJ5ByvVbK+FNmpYA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 440, + "comment" : "small r and 100 bit s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3026020201010220783266e90f43dafe5cd9b3b0be86de22f9de83677d0f50713a468ec72fcf5d57", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "048f8c5fdf711aff7ddc807c4308a132b1099e3e95dabf803ca29283dd41b090558f60c71b4a813e7b4364b0a7260765042d3696a9580548f585be12633ac3b824", + "wx" : "008f8c5fdf711aff7ddc807c4308a132b1099e3e95dabf803ca29283dd41b09055", + "wy" : "008f60c71b4a813e7b4364b0a7260765042d3696a9580548f585be12633ac3b824" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200048f8c5fdf711aff7ddc807c4308a132b1099e3e95dabf803ca29283dd41b090558f60c71b4a813e7b4364b0a7260765042d3696a9580548f585be12633ac3b824", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEj4xf33Ea/33cgHxDCKEysQmePpXav4A8\nopKD3UGwkFWPYMcbSoE+e0NksKcmB2UELTaWqVgFSPWFvhJjOsO4JA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 441, + "comment" : "100-bit r and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3031020d062522bbd3ecbe7c39e93e7c260220783266e90f43dafe5cd9b3b0be86de22f9de83677d0f50713a468ec72fcf5d57", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04fb78c45f16de9b4e098ddc9ef6eb340b055a6a49c438b87bf7969dc24f7967dd2af9ebaba55b6713e06e9df9e42b79ea9364405ebab1199ea230ae38ec83b91a", + "wx" : "00fb78c45f16de9b4e098ddc9ef6eb340b055a6a49c438b87bf7969dc24f7967dd", + "wy" : "2af9ebaba55b6713e06e9df9e42b79ea9364405ebab1199ea230ae38ec83b91a" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004fb78c45f16de9b4e098ddc9ef6eb340b055a6a49c438b87bf7969dc24f7967dd2af9ebaba55b6713e06e9df9e42b79ea9364405ebab1199ea230ae38ec83b91a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE+3jEXxbem04Jjdye9us0CwVaaknEOLh7\n95adwk95Z90q+eurpVtnE+BunfnkK3nqk2RAXrqxGZ6iMK447IO5Gg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 442, + "comment" : "r and s^-1 are close to n", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03640c1022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0448d5a8e42195b4e9ccd4dceb80bf1b730777de266b34a3c7e88ef9befe4fac2e261525ba6f1145f51b35936502c421e208d3646ff7b92703afb7663d0c786cb0", + "wx" : "48d5a8e42195b4e9ccd4dceb80bf1b730777de266b34a3c7e88ef9befe4fac2e", + "wy" : "261525ba6f1145f51b35936502c421e208d3646ff7b92703afb7663d0c786cb0" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000448d5a8e42195b4e9ccd4dceb80bf1b730777de266b34a3c7e88ef9befe4fac2e261525ba6f1145f51b35936502c421e208d3646ff7b92703afb7663d0c786cb0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAESNWo5CGVtOnM1NzrgL8bcwd33iZrNKPH\n6I75vv5PrC4mFSW6bxFF9Rs1k2UCxCHiCNNkb/e5JwOvt2Y9DHhssA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 443, + "comment" : "r and s are 64-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30160209009c44febf31c3594d020900839ed28247c2b06b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04166112b56939449167ae713e3f7dbe4225e82321ee84fbbfea10d4f7b035a7c5b8c96bd3bb190f8bbae83aa4210b315d650b536860e21621dce0d751dfa471a1", + "wx" : "166112b56939449167ae713e3f7dbe4225e82321ee84fbbfea10d4f7b035a7c5", + "wy" : "00b8c96bd3bb190f8bbae83aa4210b315d650b536860e21621dce0d751dfa471a1" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004166112b56939449167ae713e3f7dbe4225e82321ee84fbbfea10d4f7b035a7c5b8c96bd3bb190f8bbae83aa4210b315d650b536860e21621dce0d751dfa471a1", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEFmEStWk5RJFnrnE+P32+QiXoIyHuhPu/\n6hDU97A1p8W4yWvTuxkPi7roOqQhCzFdZQtTaGDiFiHc4NdR36RxoQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 444, + "comment" : "r and s are 100-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "301e020d09df8b682430beef6f5fd7c7cf020d0fd0a62e13778f4222a0d61c8a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04cfc9b4068550c2b847fd3f2d993b75161aeda903b156bd5e9a06b9fec14393386a02aad5b6bb8b63b4669c5f8b31ad669ea5461c348f9d2775b537eb43f9175c", + "wx" : "00cfc9b4068550c2b847fd3f2d993b75161aeda903b156bd5e9a06b9fec1439338", + "wy" : "6a02aad5b6bb8b63b4669c5f8b31ad669ea5461c348f9d2775b537eb43f9175c" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004cfc9b4068550c2b847fd3f2d993b75161aeda903b156bd5e9a06b9fec14393386a02aad5b6bb8b63b4669c5f8b31ad669ea5461c348f9d2775b537eb43f9175c", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEz8m0BoVQwrhH/T8tmTt1FhrtqQOxVr1e\nmga5/sFDkzhqAqrVtruLY7RmnF+LMa1mnqVGHDSPnSd1tTfrQ/kXXA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 445, + "comment" : "r and s are 128-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "30260211008a598e563a89f526c32ebec8de26367a02110084f633e2042630e99dd0f1e16f7a04bf", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04ddf6e65f686360b9487530ae2d6f717f86070fbd5333cbbd8c08576ba976cf5872b1edc23ace294715798912e007d59761b6f63dd29f14a0d65c076bd6aad2cf", + "wx" : "00ddf6e65f686360b9487530ae2d6f717f86070fbd5333cbbd8c08576ba976cf58", + "wy" : "72b1edc23ace294715798912e007d59761b6f63dd29f14a0d65c076bd6aad2cf" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004ddf6e65f686360b9487530ae2d6f717f86070fbd5333cbbd8c08576ba976cf5872b1edc23ace294715798912e007d59761b6f63dd29f14a0d65c076bd6aad2cf", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE3fbmX2hjYLlIdTCuLW9xf4YHD71TM8u9\njAhXa6l2z1hyse3COs4pRxV5iRLgB9WXYbb2PdKfFKDWXAdr1qrSzw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 446, + "comment" : "r and s are 160-bit integer", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "302e021500aa6eeb5823f7fa31b466bb473797f0d0314c0bdf021500e2977c479e6d25703cebbc6bd561938cc9d1bfb9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04b7b91538786272e70a603cfc80c52f87f057a369149848dbc865a8d2f445ec26bd90ba8844f58db6744b5f31a470e59ebfee1891be36ee65b18ba172e5eaf943", + "wx" : "00b7b91538786272e70a603cfc80c52f87f057a369149848dbc865a8d2f445ec26", + "wy" : "00bd90ba8844f58db6744b5f31a470e59ebfee1891be36ee65b18ba172e5eaf943" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004b7b91538786272e70a603cfc80c52f87f057a369149848dbc865a8d2f445ec26bd90ba8844f58db6744b5f31a470e59ebfee1891be36ee65b18ba172e5eaf943", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEt7kVOHhicucKYDz8gMUvh/BXo2kUmEjb\nyGWo0vRF7Ca9kLqIRPWNtnRLXzGkcOWev+4Ykb427mWxi6Fy5er5Qw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 447, + "comment" : "s == 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3025022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1020101", + "result" : "valid" + }, + { + "tcId" : 448, + "comment" : "s == 0", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3025022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1020100", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04ae56d3389670bc30043e0ec892e01842fde6612b32e84fc8b09e013492fd47a9420e10582476634678b200368868730d3b38b4d53a854de259e0431564837e39", + "wx" : "00ae56d3389670bc30043e0ec892e01842fde6612b32e84fc8b09e013492fd47a9", + "wy" : "420e10582476634678b200368868730d3b38b4d53a854de259e0431564837e39" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004ae56d3389670bc30043e0ec892e01842fde6612b32e84fc8b09e013492fd47a9420e10582476634678b200368868730d3b38b4d53a854de259e0431564837e39", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAErlbTOJZwvDAEPg7IkuAYQv3mYSsy6E/I\nsJ4BNJL9R6lCDhBYJHZjRniyADaIaHMNOzi01TqFTeJZ4EMVZIN+OQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 449, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c10220419d981c515af8cc82545aac0c85e9e308fbb2eab6acd7ed497e0b4145a18fd9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04aaf6fe07d1022e52b605a88f3a7e569571cace4b8c0bb0ab70b4160dc6926c6e20e90e7d0ab15b87d432a293ce039b77f64978f1a7da23c7a1b1129e0ba9a4b4", + "wx" : "00aaf6fe07d1022e52b605a88f3a7e569571cace4b8c0bb0ab70b4160dc6926c6e", + "wy" : "20e90e7d0ab15b87d432a293ce039b77f64978f1a7da23c7a1b1129e0ba9a4b4" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004aaf6fe07d1022e52b605a88f3a7e569571cace4b8c0bb0ab70b4160dc6926c6e20e90e7d0ab15b87d432a293ce039b77f64978f1a7da23c7a1b1129e0ba9a4b4", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEqvb+B9ECLlK2BaiPOn5WlXHKzkuMC7Cr\ncLQWDcaSbG4g6Q59CrFbh9QyopPOA5t39kl48afaI8ehsRKeC6mktA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 450, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102201b21717ad71d23bbac60a9ad0baf75b063c9fdf52a00ebf99d022172910993c9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04810f37f1426b0e59292171e8a493450496733c5114b95b35b185239e58b5b7adff7e4a8fc5ad14a0136075c88ca77659b6bca409e8cf0705b0b8c00d3bef5bfc", + "wx" : "00810f37f1426b0e59292171e8a493450496733c5114b95b35b185239e58b5b7ad", + "wy" : "00ff7e4a8fc5ad14a0136075c88ca77659b6bca409e8cf0705b0b8c00d3bef5bfc" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004810f37f1426b0e59292171e8a493450496733c5114b95b35b185239e58b5b7adff7e4a8fc5ad14a0136075c88ca77659b6bca409e8cf0705b0b8c00d3bef5bfc", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEgQ838UJrDlkpIXHopJNFBJZzPFEUuVs1\nsYUjnli1t63/fkqPxa0UoBNgdciMp3ZZtrykCejPBwWwuMANO+9b/A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 451, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102202f588f66018f3dd14db3e28e77996487e32486b521ed8e5a20f06591951777e9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0493ae05a499eecf676fa6ca2cc4fc0c2bcecabdba28e2a626a10066d3748fa472b543a33c9e7930daed518f5920ef883175a3af764a7eaa57acf988dabf2288b3", + "wx" : "0093ae05a499eecf676fa6ca2cc4fc0c2bcecabdba28e2a626a10066d3748fa472", + "wy" : "00b543a33c9e7930daed518f5920ef883175a3af764a7eaa57acf988dabf2288b3" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000493ae05a499eecf676fa6ca2cc4fc0c2bcecabdba28e2a626a10066d3748fa472b543a33c9e7930daed518f5920ef883175a3af764a7eaa57acf988dabf2288b3", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEk64FpJnuz2dvpsosxPwMK87Kvboo4qYm\noQBm03SPpHK1Q6M8nnkw2u1Rj1kg74gxdaOvdkp+qles+YjavyKIsw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 452, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c10220091a08870ff4daf9123b30c20e8c4fc8505758dcf4074fcaff2170c9bfcf74f4", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04a4e5a3f71b8de9d50d82cc0020dd73a9d53df41951cf33b97cf655d7d90d95dceadec6f6e1a5bb374b367bc4aa977ea7014c52898754156f8510c990235f184b", + "wx" : "00a4e5a3f71b8de9d50d82cc0020dd73a9d53df41951cf33b97cf655d7d90d95dc", + "wy" : "00eadec6f6e1a5bb374b367bc4aa977ea7014c52898754156f8510c990235f184b" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004a4e5a3f71b8de9d50d82cc0020dd73a9d53df41951cf33b97cf655d7d90d95dceadec6f6e1a5bb374b367bc4aa977ea7014c52898754156f8510c990235f184b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEpOWj9xuN6dUNgswAIN1zqdU99BlRzzO5\nfPZV19kNldzq3sb24aW7N0s2e8Sql36nAUxSiYdUFW+FEMmQI18YSw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 453, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102207c370dc0ce8c59a8b273cba44a7c1191fc3186dc03cab96b0567312df0d0b250", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0401645fd8c249d6c1c9a42d49c1bf8ae8c069e415d6c5f01e54dfcc0370e108f92d1e8cef9f160e5272c618e80d6a288f37215f9625e9b65de5090aa10a02d548", + "wx" : "01645fd8c249d6c1c9a42d49c1bf8ae8c069e415d6c5f01e54dfcc0370e108f9", + "wy" : "2d1e8cef9f160e5272c618e80d6a288f37215f9625e9b65de5090aa10a02d548" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000401645fd8c249d6c1c9a42d49c1bf8ae8c069e415d6c5f01e54dfcc0370e108f92d1e8cef9f160e5272c618e80d6a288f37215f9625e9b65de5090aa10a02d548", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEAWRf2MJJ1sHJpC1Jwb+K6MBp5BXWxfAe\nVN/MA3DhCPktHozvnxYOUnLGGOgNaiiPNyFfliXptl3lCQqhCgLVSA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 454, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1022070b59a7d1ee77a2f9e0491c2a7cfcd0ed04df4a35192f6132dcc668c79a6160e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04fd1ac8422519c2b37bb07c995e005431740a61fc6b7908e9b029ceac9f4c3a56bf605dc4fd7fa8dc6195ba61ec11278382156ff2394751524e80f3c718553212", + "wx" : "00fd1ac8422519c2b37bb07c995e005431740a61fc6b7908e9b029ceac9f4c3a56", + "wy" : "00bf605dc4fd7fa8dc6195ba61ec11278382156ff2394751524e80f3c718553212" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004fd1ac8422519c2b37bb07c995e005431740a61fc6b7908e9b029ceac9f4c3a56bf605dc4fd7fa8dc6195ba61ec11278382156ff2394751524e80f3c718553212", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE/RrIQiUZwrN7sHyZXgBUMXQKYfxreQjp\nsCnOrJ9MOla/YF3E/X+o3GGVumHsESeDghVv8jlHUVJOgPPHGFUyEg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 455, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102202736d76e412246e097148e2bf62915614eb7c428913a58eb5e9cd4674a9423de", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "044e773d65966770b64d2e0e76b44fe3f75ffe0db6f12c207f382f78afacd52f2bf53bbe2709374374e644a5f35844b82d7a1504134eb82099ea901941566a184a", + "wx" : "4e773d65966770b64d2e0e76b44fe3f75ffe0db6f12c207f382f78afacd52f2b", + "wy" : "00f53bbe2709374374e644a5f35844b82d7a1504134eb82099ea901941566a184a" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200044e773d65966770b64d2e0e76b44fe3f75ffe0db6f12c207f382f78afacd52f2bf53bbe2709374374e644a5f35844b82d7a1504134eb82099ea901941566a184a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAETnc9ZZZncLZNLg52tE/j91/+DbbxLCB/\nOC94r6zVLyv1O74nCTdDdOZEpfNYRLgtehUEE064IJnqkBlBVmoYSg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 456, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102204a1e12831fbe93627b02d6e7f24bccdd6ef4b2d0f46739eaf3b1eaf0ca117770", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "044ce8f39f857b80325713262b0816823dea62a5b73aa9d0724e9f750156706147fd7e1688e6b0f6a8ba20a8df5cc8cdf585f2c6cb90e76ca7e10dd54a9f469332", + "wx" : "4ce8f39f857b80325713262b0816823dea62a5b73aa9d0724e9f750156706147", + "wy" : "00fd7e1688e6b0f6a8ba20a8df5cc8cdf585f2c6cb90e76ca7e10dd54a9f469332" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200044ce8f39f857b80325713262b0816823dea62a5b73aa9d0724e9f750156706147fd7e1688e6b0f6a8ba20a8df5cc8cdf585f2c6cb90e76ca7e10dd54a9f469332", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAETOjzn4V7gDJXEyYrCBaCPepipbc6qdBy\nTp91AVZwYUf9fhaI5rD2qLogqN9cyM31hfLGy5DnbKfhDdVKn0aTMg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 457, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1022006c778d4dfff7dee06ed88bc4e0ed34fc553aad67caf796f2a1c6487c1b2e877", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "049ad2fdb05c2377d28b1905ad02e2c2a117cd1cdb5bc0db4c1796d27c1ab5b56220ca038df4b0c06f3afc08fa9cf25a2e28ade3da63510ef7405487abbfb96262", + "wx" : "009ad2fdb05c2377d28b1905ad02e2c2a117cd1cdb5bc0db4c1796d27c1ab5b562", + "wy" : "20ca038df4b0c06f3afc08fa9cf25a2e28ade3da63510ef7405487abbfb96262" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200049ad2fdb05c2377d28b1905ad02e2c2a117cd1cdb5bc0db4c1796d27c1ab5b56220ca038df4b0c06f3afc08fa9cf25a2e28ade3da63510ef7405487abbfb96262", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEmtL9sFwjd9KLGQWtAuLCoRfNHNtbwNtM\nF5bSfBq1tWIgygON9LDAbzr8CPqc8louKK3j2mNRDvdAVIerv7liYg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 458, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102204de459ef9159afa057feb3ec40fef01c45b809f4ab296ea48c206d4249a2b451", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0493db0e5fbfda983ba543821c7bc0a4fd5f98287d18575e8b815bf36f2d18cd3dfdb192a8912b317f95a9f1756aa9e73e12be45e39c764fb23b108197ac3ea8af", + "wx" : "0093db0e5fbfda983ba543821c7bc0a4fd5f98287d18575e8b815bf36f2d18cd3d", + "wy" : "00fdb192a8912b317f95a9f1756aa9e73e12be45e39c764fb23b108197ac3ea8af" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000493db0e5fbfda983ba543821c7bc0a4fd5f98287d18575e8b815bf36f2d18cd3dfdb192a8912b317f95a9f1756aa9e73e12be45e39c764fb23b108197ac3ea8af", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEk9sOX7/amDulQ4Ice8Ck/V+YKH0YV16L\ngVvzby0YzT39sZKokSsxf5Wp8XVqqec+Er5F45x2T7I7EIGXrD6orw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 459, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c10220745d294978007302033502e1acc48b63ae6500be43adbea1b258d6b423dbb416", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "049389f01b62417b372ec1f18c61b11cb500af39a9ac94a2c89735deb2b527cc230122435f6058f32b3e5defa25d7fe7c5bc757749da40df426a4fc1e7ef005c17", + "wx" : "009389f01b62417b372ec1f18c61b11cb500af39a9ac94a2c89735deb2b527cc23", + "wy" : "0122435f6058f32b3e5defa25d7fe7c5bc757749da40df426a4fc1e7ef005c17" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200049389f01b62417b372ec1f18c61b11cb500af39a9ac94a2c89735deb2b527cc230122435f6058f32b3e5defa25d7fe7c5bc757749da40df426a4fc1e7ef005c17", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEk4nwG2JBezcuwfGMYbEctQCvOamslKLI\nlzXesrUnzCMBIkNfYFjzKz5d76Jdf+fFvHV3SdpA30JqT8Hn7wBcFw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 460, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102207b2a785e3896f59b2d69da57648e80ad3c133a750a2847fd2098ccd902042b6c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04339050b9f8039f925f105ca80ef12fbf2480c4a95827395584e59212ec2045338657db3296a8b7629243c149012b5d64f40df5f104c7629f65f51ad25a9dc1d5", + "wx" : "339050b9f8039f925f105ca80ef12fbf2480c4a95827395584e59212ec204533", + "wy" : "008657db3296a8b7629243c149012b5d64f40df5f104c7629f65f51ad25a9dc1d5" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004339050b9f8039f925f105ca80ef12fbf2480c4a95827395584e59212ec2045338657db3296a8b7629243c149012b5d64f40df5f104c7629f65f51ad25a9dc1d5", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEM5BQufgDn5JfEFyoDvEvvySAxKlYJzlV\nhOWSEuwgRTOGV9sylqi3YpJDwUkBK11k9A318QTHYp9l9RrSWp3B1Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 461, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1022071ae94a72ca896875e7aa4a4c3d29afdb4b35b6996273e63c47ac519256c5eb1", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0458850b0841339746b06decc9ca47ffda18cb8e5289a97574bb62604ace0dfaf4d0e10766024bb042cb04bd61d282a006b59139a8623c9443652894b2f1255af6", + "wx" : "58850b0841339746b06decc9ca47ffda18cb8e5289a97574bb62604ace0dfaf4", + "wy" : "00d0e10766024bb042cb04bd61d282a006b59139a8623c9443652894b2f1255af6" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000458850b0841339746b06decc9ca47ffda18cb8e5289a97574bb62604ace0dfaf4d0e10766024bb042cb04bd61d282a006b59139a8623c9443652894b2f1255af6", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEWIULCEEzl0awbezJykf/2hjLjlKJqXV0\nu2JgSs4N+vTQ4QdmAkuwQssEvWHSgqAGtZE5qGI8lENlKJSy8SVa9g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 462, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102200fa527fa7343c0bc9ec35a6278bfbff4d83301b154fc4bd14aee7eb93445b5f9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04cecffaa16b57999d3fe95627a312a06b0554f2641ff6f781e366283c9fc24a9e5588700c6a4ebea111151d1f5c96265c62d5f905e5b2590c202cfcd3c1848fc3", + "wx" : "00cecffaa16b57999d3fe95627a312a06b0554f2641ff6f781e366283c9fc24a9e", + "wy" : "5588700c6a4ebea111151d1f5c96265c62d5f905e5b2590c202cfcd3c1848fc3" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004cecffaa16b57999d3fe95627a312a06b0554f2641ff6f781e366283c9fc24a9e5588700c6a4ebea111151d1f5c96265c62d5f905e5b2590c202cfcd3c1848fc3", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEzs/6oWtXmZ0/6VYnoxKgawVU8mQf9veB\n42YoPJ/CSp5ViHAMak6+oREVHR9cliZcYtX5BeWyWQwgLPzTwYSPww==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 463, + "comment" : "edge case modular inverse", + "flags" : [ + "ModularInverse", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c102206539c0adadd0525ff42622164ce9314348bd0863b4c80e936b23ca0414264671", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "049c0c462658f6493295775ed99348db5895ae8471c819a1ed9ae1b5180397f08ff386d14d6e56758d1dafa50755af4fe079233c139436abf61a9208f8b7f893af", + "wx" : "009c0c462658f6493295775ed99348db5895ae8471c819a1ed9ae1b5180397f08f", + "wy" : "00f386d14d6e56758d1dafa50755af4fe079233c139436abf61a9208f8b7f893af" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200049c0c462658f6493295775ed99348db5895ae8471c819a1ed9ae1b5180397f08ff386d14d6e56758d1dafa50755af4fe079233c139436abf61a9208f8b7f893af", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEnAxGJlj2STKVd17Zk0jbWJWuhHHIGaHt\nmuG1GAOX8I/zhtFNblZ1jR2vpQdVr0/geSM8E5Q2q/Yakgj4t/iTrw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 464, + "comment" : "point at infinity during verify", + "flags" : [ + "PointDuplication", + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0489e63127c97dd4cb19fb802f22229decd0d852639b3d982b2589817a7e520049e1fd70b15e5e5d3ea4ab748903ca891ab3964ff4d7bf48b17c6007957a5e2021", + "wx" : "0089e63127c97dd4cb19fb802f22229decd0d852639b3d982b2589817a7e520049", + "wy" : "00e1fd70b15e5e5d3ea4ab748903ca891ab3964ff4d7bf48b17c6007957a5e2021" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000489e63127c97dd4cb19fb802f22229decd0d852639b3d982b2589817a7e520049e1fd70b15e5e5d3ea4ab748903ca891ab3964ff4d7bf48b17c6007957a5e2021", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEieYxJ8l91MsZ+4AvIiKd7NDYUmObPZgr\nJYmBen5SAEnh/XCxXl5dPqSrdIkDyokas5ZP9Ne/SLF8YAeVel4gIQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 465, + "comment" : "edge case for signature malleability", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a002207fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04eb89c838542537c3f530b6e8bc62d1e6284ed4e9b8c6aea96e82970d8abdefff58cae0df61874d30c2afa05c8a703800ac80564397688b19a5149f65054b138f", + "wx" : "00eb89c838542537c3f530b6e8bc62d1e6284ed4e9b8c6aea96e82970d8abdefff", + "wy" : "58cae0df61874d30c2afa05c8a703800ac80564397688b19a5149f65054b138f" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004eb89c838542537c3f530b6e8bc62d1e6284ed4e9b8c6aea96e82970d8abdefff58cae0df61874d30c2afa05c8a703800ac80564397688b19a5149f65054b138f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE64nIOFQlN8P1MLbovGLR5ihO1Om4xq6p\nboKXDYq97/9YyuDfYYdNMMKvoFyKcDgArIBWQ5doixmlFJ9lBUsTjw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 466, + "comment" : "edge case for signature malleability", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a002207fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0472bdb42d379cd807e8dcdd597e5c68c464ecb4211ee885f7210e55ff52e9368834231f3921839c8a3a2cc7ff5964f1f79c77f2c8813e2659684ee1d8bf7125c0", + "wx" : "72bdb42d379cd807e8dcdd597e5c68c464ecb4211ee885f7210e55ff52e93688", + "wy" : "34231f3921839c8a3a2cc7ff5964f1f79c77f2c8813e2659684ee1d8bf7125c0" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000472bdb42d379cd807e8dcdd597e5c68c464ecb4211ee885f7210e55ff52e9368834231f3921839c8a3a2cc7ff5964f1f79c77f2c8813e2659684ee1d8bf7125c0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEcr20LTec2Afo3N1ZflxoxGTstCEe6IX3\nIQ5V/1LpNog0Ix85IYOcijosx/9ZZPH3nHfyyIE+JlloTuHYv3ElwA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 467, + "comment" : "u1 == 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b80220342dae751a63a3ca8189cf342b3b34eaaa2565e2c7e26121c1bfd5435447f1c3", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0457cf2c69876d8a9822a6b796492aa889c39fa1371fc730c5a15532ac4aa197b38c936d0041821e1ca81df3f1fd0a495c0c8974a81fb41cec4622cc1bfcccf3d2", + "wx" : "57cf2c69876d8a9822a6b796492aa889c39fa1371fc730c5a15532ac4aa197b3", + "wy" : "008c936d0041821e1ca81df3f1fd0a495c0c8974a81fb41cec4622cc1bfcccf3d2" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000457cf2c69876d8a9822a6b796492aa889c39fa1371fc730c5a15532ac4aa197b38c936d0041821e1ca81df3f1fd0a495c0c8974a81fb41cec4622cc1bfcccf3d2", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEV88saYdtipgipreWSSqoicOfoTcfxzDF\noVUyrEqhl7OMk20AQYIeHKgd8/H9CklcDIl0qB+0HOxGIswb/Mzz0g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 468, + "comment" : "u1 == n - 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022100cbd2518ae59c5c357e7630cbd4c4cb1410897703e7663f19fe1289497bee4f7e", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "040a7413800a6571b03100d9f327c68a89aaaef2e7ff922b0a0aa95e39a082c4fb37466eb04ed38187bedfd767de7c45416577bca4bd961de3d8890bea3409f697", + "wx" : "0a7413800a6571b03100d9f327c68a89aaaef2e7ff922b0a0aa95e39a082c4fb", + "wy" : "37466eb04ed38187bedfd767de7c45416577bca4bd961de3d8890bea3409f697" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200040a7413800a6571b03100d9f327c68a89aaaef2e7ff922b0a0aa95e39a082c4fb37466eb04ed38187bedfd767de7c45416577bca4bd961de3d8890bea3409f697", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAECnQTgAplcbAxANnzJ8aKiaqu8uf/kisK\nCqleOaCCxPs3Rm6wTtOBh77f12fefEVBZXe8pL2WHePYiQvqNAn2lw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 469, + "comment" : "u2 == 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "047e27893adb379d40a61668ad660edc256004bbfc12d55889fbd5121eac56a06e9a36f42598db7d643842a72562fe6d86ddc38623830e42a17d444d44a2472b5f", + "wx" : "7e27893adb379d40a61668ad660edc256004bbfc12d55889fbd5121eac56a06e", + "wy" : "009a36f42598db7d643842a72562fe6d86ddc38623830e42a17d444d44a2472b5f" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200047e27893adb379d40a61668ad660edc256004bbfc12d55889fbd5121eac56a06e9a36f42598db7d643842a72562fe6d86ddc38623830e42a17d444d44a2472b5f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEfieJOts3nUCmFmitZg7cJWAEu/wS1ViJ\n+9USHqxWoG6aNvQlmNt9ZDhCpyVi/m2G3cOGI4MOQqF9RE1EokcrXw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 470, + "comment" : "u2 == n - 1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022100aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b89", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "043b65f40a248d91a7e6377bfb5989f47d562bdaaf364ea982830f61b71957bda5e42108c5d388f2e173210f867633167eb0f5cbc693aa7bb9223ae8f1aaa26983", + "wx" : "3b65f40a248d91a7e6377bfb5989f47d562bdaaf364ea982830f61b71957bda5", + "wy" : "00e42108c5d388f2e173210f867633167eb0f5cbc693aa7bb9223ae8f1aaa26983" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200043b65f40a248d91a7e6377bfb5989f47d562bdaaf364ea982830f61b71957bda5e42108c5d388f2e173210f867633167eb0f5cbc693aa7bb9223ae8f1aaa26983", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEO2X0CiSNkafmN3v7WYn0fVYr2q82TqmC\ngw9htxlXvaXkIQjF04jy4XMhD4Z2MxZ+sPXLxpOqe7kiOujxqqJpgw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 471, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100bc0f3a2708cbe1438083451163be66f80a810a900cd135ddc076db7451917c17", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "040585249ff4a3acbb996eed6f17a70a7b83a6dfe96e80edc0cd4cc7594e806d59b7576508dbb4eab123e0ed688a9e6625d056c7ad8134776252728dcae375cd84", + "wx" : "0585249ff4a3acbb996eed6f17a70a7b83a6dfe96e80edc0cd4cc7594e806d59", + "wy" : "00b7576508dbb4eab123e0ed688a9e6625d056c7ad8134776252728dcae375cd84" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200040585249ff4a3acbb996eed6f17a70a7b83a6dfe96e80edc0cd4cc7594e806d59b7576508dbb4eab123e0ed688a9e6625d056c7ad8134776252728dcae375cd84", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEBYUkn/SjrLuZbu1vF6cKe4Om3+lugO3A\nzUzHWU6AbVm3V2UI27TqsSPg7WiKnmYl0FbHrYE0d2JSco3K43XNhA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 472, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022062bf43ba34e73cc3c8922f26d64e3bf882f12dcc06e0b30c8363efa6badcff55", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04dd6ba66855e37b7fc91ad160bc4a7c5089f8633ac0e12298a6aba34db680e16b798f5573bd93756e39dd635d9c5f8e876364445a1c9a43f2918beb9137ba3b92", + "wx" : "00dd6ba66855e37b7fc91ad160bc4a7c5089f8633ac0e12298a6aba34db680e16b", + "wy" : "798f5573bd93756e39dd635d9c5f8e876364445a1c9a43f2918beb9137ba3b92" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004dd6ba66855e37b7fc91ad160bc4a7c5089f8633ac0e12298a6aba34db680e16b798f5573bd93756e39dd635d9c5f8e876364445a1c9a43f2918beb9137ba3b92", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE3WumaFXje3/JGtFgvEp8UIn4YzrA4SKY\npqujTbaA4Wt5j1VzvZN1bjndY12cX46HY2REWhyaQ/KRi+uRN7o7kg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 473, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022039422623a4386033ccfa96ad4f8228fb88ac9364ae8b3cd0715ee188c467572c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04ce2d8a8432670515b2133689d96e7369decfe994c87e39a28e5636897a360f2aba43f7fa77feba76de9634b6adfde47fb16f70b790bc9a1a5065ef16f6fd2467", + "wx" : "00ce2d8a8432670515b2133689d96e7369decfe994c87e39a28e5636897a360f2a", + "wy" : "00ba43f7fa77feba76de9634b6adfde47fb16f70b790bc9a1a5065ef16f6fd2467" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004ce2d8a8432670515b2133689d96e7369decfe994c87e39a28e5636897a360f2aba43f7fa77feba76de9634b6adfde47fb16f70b790bc9a1a5065ef16f6fd2467", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEzi2KhDJnBRWyEzaJ2W5zad7P6ZTIfjmi\njlY2iXo2Dyq6Q/f6d/66dt6WNLat/eR/sW9wt5C8mhpQZe8W9v0kZw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 474, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02206233bcf8558bae02cbd2518ae59c5c3501ab620efcbd7b40d8dd1f7288ff5dac", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046cefd89c949069c4ef5fefd20512a6fde92e08a2dfc408694a05d2a974bd0284ae4769496c219a59383a7fd6dc1e0690c25506264b0088e0362897e0da59103a", + "wx" : "6cefd89c949069c4ef5fefd20512a6fde92e08a2dfc408694a05d2a974bd0284", + "wy" : "00ae4769496c219a59383a7fd6dc1e0690c25506264b0088e0362897e0da59103a" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046cefd89c949069c4ef5fefd20512a6fde92e08a2dfc408694a05d2a974bd0284ae4769496c219a59383a7fd6dc1e0690c25506264b0088e0362897e0da59103a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEbO/YnJSQacTvX+/SBRKm/ekuCKLfxAhp\nSgXSqXS9AoSuR2lJbCGaWTg6f9bcHgaQwlUGJksAiOA2KJfg2lkQOg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 475, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02203bcf8558bae02cbd2518ae59c5c357e7170b54262d04bee3a9fcee6e38e84e1d", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0433a6ee1a121ccab25b00fbecc860be15641a5baa4b4beb35d9a6dad35a1691fa36ba2323e463d684219a1bd15c5eb304878d82d1da113c52c7663cfae3f5751a", + "wx" : "33a6ee1a121ccab25b00fbecc860be15641a5baa4b4beb35d9a6dad35a1691fa", + "wy" : "36ba2323e463d684219a1bd15c5eb304878d82d1da113c52c7663cfae3f5751a" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000433a6ee1a121ccab25b00fbecc860be15641a5baa4b4beb35d9a6dad35a1691fa36ba2323e463d684219a1bd15c5eb304878d82d1da113c52c7663cfae3f5751a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEM6buGhIcyrJbAPvsyGC+FWQaW6pLS+s1\n2aba01oWkfo2uiMj5GPWhCGaG9FcXrMEh42C0doRPFLHZjz64/V1Gg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 476, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0220779f0ab175c0597a4a315cb38b86afce2e16a84c5a097dc753f9dcdc71d09c3a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04a2d2e9810bf8f988af6cdf111f2f15062900d2ce06bb72c9c1dd1ca90d69c58c36c24fbc1323359ffc3d7cfdd66451dd3e950ad97cc7f1ddedf30e3aa4425c0f", + "wx" : "00a2d2e9810bf8f988af6cdf111f2f15062900d2ce06bb72c9c1dd1ca90d69c58c", + "wy" : "36c24fbc1323359ffc3d7cfdd66451dd3e950ad97cc7f1ddedf30e3aa4425c0f" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004a2d2e9810bf8f988af6cdf111f2f15062900d2ce06bb72c9c1dd1ca90d69c58c36c24fbc1323359ffc3d7cfdd66451dd3e950ad97cc7f1ddedf30e3aa4425c0f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEotLpgQv4+YivbN8RHy8VBikA0s4Gu3LJ\nwd0cqQ1pxYw2wk+8EyM1n/w9fP3WZFHdPpUK2XzH8d3t8w46pEJcDw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 477, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0220558bae02cbd2518ae59c5c357e7630cb680f5a3ee98045977a021c9091920d08", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04e93d658ec3a9418daed0ee219d18180d0684fd676ed24f693bcdeb7e358ec44d6914850bd227eeb22bf22a02c3bfd628c769b0f0e50040b50fd3aaa324a1d4ce", + "wx" : "00e93d658ec3a9418daed0ee219d18180d0684fd676ed24f693bcdeb7e358ec44d", + "wy" : "6914850bd227eeb22bf22a02c3bfd628c769b0f0e50040b50fd3aaa324a1d4ce" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004e93d658ec3a9418daed0ee219d18180d0684fd676ed24f693bcdeb7e358ec44d6914850bd227eeb22bf22a02c3bfd628c769b0f0e50040b50fd3aaa324a1d4ce", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE6T1ljsOpQY2u0O4hnRgYDQaE/Wdu0k9p\nO83rfjWOxE1pFIUL0ifusivyKgLDv9Yox2mw8OUAQLUP06qjJKHUzg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 478, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022019ffa32fd51fb796c6154167347b7773d9058ddb148fdaef8c287fef848f2f7b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04ebe7e1278636290cb09c7d4554c71c117337d2ed40c77789433c27eaf4d4bc3273025752ca492238b622884c9fe287ce3723ae04ebfaa53505e14b8e86c5dbac", + "wx" : "00ebe7e1278636290cb09c7d4554c71c117337d2ed40c77789433c27eaf4d4bc32", + "wy" : "73025752ca492238b622884c9fe287ce3723ae04ebfaa53505e14b8e86c5dbac" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004ebe7e1278636290cb09c7d4554c71c117337d2ed40c77789433c27eaf4d4bc3273025752ca492238b622884c9fe287ce3723ae04ebfaa53505e14b8e86c5dbac", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE6+fhJ4Y2KQywnH1FVMccEXM30u1Ax3eJ\nQzwn6vTUvDJzAldSykkiOLYiiEyf4ofONyOuBOv6pTUF4UuOhsXbrA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 479, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02203d180992c1a38ddfd49ecf3d1813b0b195c69b06bbd41cf101fe40dac9c9e6ba", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04d1150530bac21e35524ff9e1b7d00731401072d591e696a17bb388b4d7e5ca19bcc66bce3fc176d2da4a2cb954c836bf9b81f1913230ba99ea6e5054073ddf6f", + "wx" : "00d1150530bac21e35524ff9e1b7d00731401072d591e696a17bb388b4d7e5ca19", + "wy" : "00bcc66bce3fc176d2da4a2cb954c836bf9b81f1913230ba99ea6e5054073ddf6f" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d1150530bac21e35524ff9e1b7d00731401072d591e696a17bb388b4d7e5ca19bcc66bce3fc176d2da4a2cb954c836bf9b81f1913230ba99ea6e5054073ddf6f", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE0RUFMLrCHjVST/nht9AHMUAQctWR5pah\ne7OItNflyhm8xmvOP8F20tpKLLlUyDa/m4HxkTIwupnqblBUBz3fbw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 480, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100d39813c8e58536460cbfac4b0fa028e60d5d45c13612d79f9964a58cb33be185", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "045233a1deddbbdc29c0994fd43ceda3b020b35c465e02d1c12fd29017306be87bc31db5c0e32fbd3f045664acf088014a1116eb3379f24886b3a13f009628df42", + "wx" : "5233a1deddbbdc29c0994fd43ceda3b020b35c465e02d1c12fd29017306be87b", + "wy" : "00c31db5c0e32fbd3f045664acf088014a1116eb3379f24886b3a13f009628df42" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200045233a1deddbbdc29c0994fd43ceda3b020b35c465e02d1c12fd29017306be87bc31db5c0e32fbd3f045664acf088014a1116eb3379f24886b3a13f009628df42", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEUjOh3t273CnAmU/UPO2jsCCzXEZeAtHB\nL9KQFzBr6HvDHbXA4y+9PwRWZKzwiAFKERbrM3nySIazoT8AlijfQg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 481, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100e9fcbcae7e1d744cf6bf4ca0d8573312a131fcb3b90eb26bed6c7f6ba908ab53", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04a160ab41fd3fe7d088ee874c8b82d8ae97c8ed99467579d01b97bade23ec46a6ae709a088bcbc72342996efeed0e913f8a5dd8c8878b1caec5c9e057e35d5cfe", + "wx" : "00a160ab41fd3fe7d088ee874c8b82d8ae97c8ed99467579d01b97bade23ec46a6", + "wy" : "00ae709a088bcbc72342996efeed0e913f8a5dd8c8878b1caec5c9e057e35d5cfe" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004a160ab41fd3fe7d088ee874c8b82d8ae97c8ed99467579d01b97bade23ec46a6ae709a088bcbc72342996efeed0e913f8a5dd8c8878b1caec5c9e057e35d5cfe", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEoWCrQf0/59CI7odMi4LYrpfI7ZlGdXnQ\nG5e63iPsRqaucJoIi8vHI0KZbv7tDpE/il3YyIeLHK7FyeBX411c/g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 482, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022021f862ec7b9a0f5e3fbe5d774e20cc835816e92b513bb52effadc18c3f526295", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "041d915ecbbf4c25bbc0d2216db6d1a3da8f80058653a24885494aff88fe1599fc8816898d958fa5431bb557d17b6b1b520c3fbdab6bc5984109d1468b6cc141f0", + "wx" : "1d915ecbbf4c25bbc0d2216db6d1a3da8f80058653a24885494aff88fe1599fc", + "wy" : "008816898d958fa5431bb557d17b6b1b520c3fbdab6bc5984109d1468b6cc141f0" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200041d915ecbbf4c25bbc0d2216db6d1a3da8f80058653a24885494aff88fe1599fc8816898d958fa5431bb557d17b6b1b520c3fbdab6bc5984109d1468b6cc141f0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEHZFey79MJbvA0iFtttGj2o+ABYZTokiF\nSUr/iP4VmfyIFomNlY+lQxu1V9F7axtSDD+9q2vFmEEJ0UaLbMFB8A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 483, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022043f0c5d8f7341ebc7f7cbaee9c419906b02dd256a2776a5dff5b83187ea4c52a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "049598101f8704e2dd0e889ecab9ffe7a5e7536f3ee60d5f05111ce6f5a4ca0405c4c39bbca34c6a687c46a6ddff65e81d0a9a78a8c104f91ea6636a7c8ea6819a", + "wx" : "009598101f8704e2dd0e889ecab9ffe7a5e7536f3ee60d5f05111ce6f5a4ca0405", + "wy" : "00c4c39bbca34c6a687c46a6ddff65e81d0a9a78a8c104f91ea6636a7c8ea6819a" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200049598101f8704e2dd0e889ecab9ffe7a5e7536f3ee60d5f05111ce6f5a4ca0405c4c39bbca34c6a687c46a6ddff65e81d0a9a78a8c104f91ea6636a7c8ea6819a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAElZgQH4cE4t0OiJ7Kuf/npedTbz7mDV8F\nERzm9aTKBAXEw5u8o0xqaHxGpt3/ZegdCpp4qMEE+R6mY2p8jqaBmg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 484, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022065e928c572ce2e1abf3b1865ea62658a0844bb81f3b31f8cff0944a4bdf727bf", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0459ee9e0a000baefbe3fb59ea61d7370df77c58dee9d829b6c5e89faae019951bbf61a756c7a30d049bd37010b7b1c25670d4ddb6ceb8f1d7c7d449e393465959", + "wx" : "59ee9e0a000baefbe3fb59ea61d7370df77c58dee9d829b6c5e89faae019951b", + "wy" : "00bf61a756c7a30d049bd37010b7b1c25670d4ddb6ceb8f1d7c7d449e393465959" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000459ee9e0a000baefbe3fb59ea61d7370df77c58dee9d829b6c5e89faae019951bbf61a756c7a30d049bd37010b7b1c25670d4ddb6ceb8f1d7c7d449e393465959", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEWe6eCgALrvvj+1nqYdc3Dfd8WN7p2Cm2\nxeifquAZlRu/YadWx6MNBJvTcBC3scJWcNTdts648dfH1Enjk0ZZWQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 485, + "comment" : "edge case for u1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02201ca11311d21c3019e67d4b56a7c1147dc45649b257459e6838af70c46233ab96", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04d1f1ddd12c710d7c35617a0ed2fc35f4d09888f17034a47fe0a78415858e66a25fcda6abedc3a58ffc55bc5d9f320c60eb6b4c9a22833e13511b2e140ef14057", + "wx" : "00d1f1ddd12c710d7c35617a0ed2fc35f4d09888f17034a47fe0a78415858e66a2", + "wy" : "5fcda6abedc3a58ffc55bc5d9f320c60eb6b4c9a22833e13511b2e140ef14057" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d1f1ddd12c710d7c35617a0ed2fc35f4d09888f17034a47fe0a78415858e66a25fcda6abedc3a58ffc55bc5d9f320c60eb6b4c9a22833e13511b2e140ef14057", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE0fHd0SxxDXw1YXoO0vw19NCYiPFwNKR/\n4KeEFYWOZqJfzaar7cOlj/xVvF2fMgxg62tMmiKDPhNRGy4UDvFAVw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 486, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100d55555555555555555555555555555547c74934474db157d2a8c3f088aced62a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "043c9a5007f19ec624a73ce75fb61ab3e16736d519ee36381497f24bfd3bb691b534b42b0134e17222eff05f3b5477323a3224310b108c4a8fc9b17833128cb822", + "wx" : "3c9a5007f19ec624a73ce75fb61ab3e16736d519ee36381497f24bfd3bb691b5", + "wy" : "34b42b0134e17222eff05f3b5477323a3224310b108c4a8fc9b17833128cb822" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200043c9a5007f19ec624a73ce75fb61ab3e16736d519ee36381497f24bfd3bb691b534b42b0134e17222eff05f3b5477323a3224310b108c4a8fc9b17833128cb822", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEPJpQB/GexiSnPOdfthqz4Wc21RnuNjgU\nl/JL/Tu2kbU0tCsBNOFyIu/wXztUdzI6MiQxCxCMSo/JsXgzEoy4Ig==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 487, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100c1777c8853938e536213c02464a936000ba1e21c0fc62075d46c624e23b52f31", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04f7a2f1027241c8514b2be7097a3eb5b208e8ffd09a700e5d72fc3af6964b3bbf08318a9043d959a8fc8bafa5d403d3490e4e45d9b1e156ff3e2aee38ece66e88", + "wx" : "00f7a2f1027241c8514b2be7097a3eb5b208e8ffd09a700e5d72fc3af6964b3bbf", + "wy" : "08318a9043d959a8fc8bafa5d403d3490e4e45d9b1e156ff3e2aee38ece66e88" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004f7a2f1027241c8514b2be7097a3eb5b208e8ffd09a700e5d72fc3af6964b3bbf08318a9043d959a8fc8bafa5d403d3490e4e45d9b1e156ff3e2aee38ece66e88", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE96LxAnJByFFLK+cJej61sgjo/9CacA5d\ncvw69pZLO78IMYqQQ9lZqPyLr6XUA9NJDk5F2bHhVv8+Ku447OZuiA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 488, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022030bbb794db588363b40679f6c182a50d3ce9679acdd3ffbe36d7813dacbdc818", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04e58d8aba787d54ffcbe530c5ba5955f54e286d31f1a7558dce8924000d7a1b96f5acbdf479b313380325edbbadbc6287e08e98cc86e2ba8339873724437ce813", + "wx" : "00e58d8aba787d54ffcbe530c5ba5955f54e286d31f1a7558dce8924000d7a1b96", + "wy" : "00f5acbdf479b313380325edbbadbc6287e08e98cc86e2ba8339873724437ce813" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004e58d8aba787d54ffcbe530c5ba5955f54e286d31f1a7558dce8924000d7a1b96f5acbdf479b313380325edbbadbc6287e08e98cc86e2ba8339873724437ce813", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE5Y2Kunh9VP/L5TDFullV9U4obTHxp1WN\nzokkAA16G5b1rL30ebMTOAMl7butvGKH4I6YzIbiuoM5hzckQ3zoEw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 489, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202c37fd995622c4fb7fffffffffffffffc7cee745110cb45ab558ed7c90c15a2f", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04167df009cec2efd44991a523dc2fd4a13e4de3e76390382d4c1088593f33da65838f62138f2ed73fbc7be316ba5b6a79a4768fd1f4ea07df9eb0eeeef988ab73", + "wx" : "167df009cec2efd44991a523dc2fd4a13e4de3e76390382d4c1088593f33da65", + "wy" : "00838f62138f2ed73fbc7be316ba5b6a79a4768fd1f4ea07df9eb0eeeef988ab73" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004167df009cec2efd44991a523dc2fd4a13e4de3e76390382d4c1088593f33da65838f62138f2ed73fbc7be316ba5b6a79a4768fd1f4ea07df9eb0eeeef988ab73", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEFn3wCc7C79RJkaUj3C/UoT5N4+djkDgt\nTBCIWT8z2mWDj2ITjy7XP7x74xa6W2p5pHaP0fTqB9+esO7u+Yircw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 490, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02207fd995622c4fb7ffffffffffffffffff5d883ffab5b32652ccdcaa290fccb97d", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0401a3a8df8aee278aa306844d60d9c5113e596d66cc92a3566ab0797cd01638250062494573ddc9a21706030fd795708b3fe0d0f224ac01e5957ad0d11d6ee265", + "wx" : "01a3a8df8aee278aa306844d60d9c5113e596d66cc92a3566ab0797cd0163825", + "wy" : "62494573ddc9a21706030fd795708b3fe0d0f224ac01e5957ad0d11d6ee265" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000401a3a8df8aee278aa306844d60d9c5113e596d66cc92a3566ab0797cd01638250062494573ddc9a21706030fd795708b3fe0d0f224ac01e5957ad0d11d6ee265", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEAaOo34ruJ4qjBoRNYNnFET5ZbWbMkqNW\narB5fNAWOCUAYklFc93JohcGAw/XlXCLP+DQ8iSsAeWVetDRHW7iZQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 491, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100ffb32ac4589f6ffffffffffffffffffebb107ff56b664ca599b954521f9972fa", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04d6d0f45dbfa12ab4ea5b29a848c71923d1ecb57b148ec1c969b43662a18d00f988c2728d21508a421af6b612a4433c4b7c97f55dc12b24db2cf6cb7fada43f15", + "wx" : "00d6d0f45dbfa12ab4ea5b29a848c71923d1ecb57b148ec1c969b43662a18d00f9", + "wy" : "0088c2728d21508a421af6b612a4433c4b7c97f55dc12b24db2cf6cb7fada43f15" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d6d0f45dbfa12ab4ea5b29a848c71923d1ecb57b148ec1c969b43662a18d00f988c2728d21508a421af6b612a4433c4b7c97f55dc12b24db2cf6cb7fada43f15", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE1tD0Xb+hKrTqWymoSMcZI9HstXsUjsHJ\nabQ2YqGNAPmIwnKNIVCKQhr2thKkQzxLfJf1XcErJNss9st/raQ/FQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 492, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02205622c4fb7fffffffffffffffffffffff928a8f1c7ac7bec1808b9f61c01ec327", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0469214198388da2a0d1a0c9464c6eb3731ad44e27287c17cd24bf73c3ada67c2a48dfabbfa5d9127fec9fb7986fb386cb5c7ebe3f609d95e71a70ad7f83334584", + "wx" : "69214198388da2a0d1a0c9464c6eb3731ad44e27287c17cd24bf73c3ada67c2a", + "wy" : "48dfabbfa5d9127fec9fb7986fb386cb5c7ebe3f609d95e71a70ad7f83334584" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000469214198388da2a0d1a0c9464c6eb3731ad44e27287c17cd24bf73c3ada67c2a48dfabbfa5d9127fec9fb7986fb386cb5c7ebe3f609d95e71a70ad7f83334584", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEaSFBmDiNoqDRoMlGTG6zcxrUTicofBfN\nJL9zw62mfCpI36u/pdkSf+yft5hvs4bLXH6+P2CdlecacK1/gzNFhA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 493, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022044104104104104104104104104104103b87853fd3b7d3f8e175125b4382f25ed", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0484672e2de042df2668775733c9b0cc716edd7d7534eb859279316ec5186d7733badc81e933abf3d4ce75fae00d1a47b30d69de8754666a294b4c925807dc3ecc", + "wx" : "0084672e2de042df2668775733c9b0cc716edd7d7534eb859279316ec5186d7733", + "wy" : "00badc81e933abf3d4ce75fae00d1a47b30d69de8754666a294b4c925807dc3ecc" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000484672e2de042df2668775733c9b0cc716edd7d7534eb859279316ec5186d7733badc81e933abf3d4ce75fae00d1a47b30d69de8754666a294b4c925807dc3ecc", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEhGcuLeBC3yZod1czybDMcW7dfXU064WS\neTFuxRhtdzO63IHpM6vz1M51+uANGkezDWneh1RmailLTJJYB9w+zA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 494, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202739ce739ce739ce739ce739ce739ce705560298d1f2f08dc419ac273a5b54d9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04c9be9c1906a73789a9af1a677f60dd4163c5fa06c7f45c0993a63051aa0c0f303205debee5dc413e4abb3e1f6af550ac64c41b97e425cc2efa2a833c2ee72221", + "wx" : "00c9be9c1906a73789a9af1a677f60dd4163c5fa06c7f45c0993a63051aa0c0f30", + "wy" : "3205debee5dc413e4abb3e1f6af550ac64c41b97e425cc2efa2a833c2ee72221" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004c9be9c1906a73789a9af1a677f60dd4163c5fa06c7f45c0993a63051aa0c0f303205debee5dc413e4abb3e1f6af550ac64c41b97e425cc2efa2a833c2ee72221", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEyb6cGQanN4mprxpnf2DdQWPF+gbH9FwJ\nk6YwUaoMDzAyBd6+5dxBPkq7Ph9q9VCsZMQbl+QlzC76KoM8LuciIQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 495, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100b777777777777777777777777777777688e6a1fe808a97a348671222ff16b863", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04026794f7b5a84849f41141c68d3248f9c90c4de7edad4fb8f446e3076ffb7962c98e7b67192296efe04379c6a40280b4f113876981b44b73bb676a881f398790", + "wx" : "026794f7b5a84849f41141c68d3248f9c90c4de7edad4fb8f446e3076ffb7962", + "wy" : "00c98e7b67192296efe04379c6a40280b4f113876981b44b73bb676a881f398790" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004026794f7b5a84849f41141c68d3248f9c90c4de7edad4fb8f446e3076ffb7962c98e7b67192296efe04379c6a40280b4f113876981b44b73bb676a881f398790", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEAmeU97WoSEn0EUHGjTJI+ckMTeftrU+4\n9EbjB2/7eWLJjntnGSKW7+BDecakAoC08ROHaYG0S3O7Z2qIHzmHkA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 496, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02206492492492492492492492492492492406dd3a19b8d5fb875235963c593bd2d3", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0418bd65dd46f8c0e326553be55e5e234bb43188ac1fddb37003d12f091aa7a1b9e9c00a03e4d5452ba9a607951d4e4d8a7391a952109d96599266d1e2d9ab2199", + "wx" : "18bd65dd46f8c0e326553be55e5e234bb43188ac1fddb37003d12f091aa7a1b9", + "wy" : "00e9c00a03e4d5452ba9a607951d4e4d8a7391a952109d96599266d1e2d9ab2199" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000418bd65dd46f8c0e326553be55e5e234bb43188ac1fddb37003d12f091aa7a1b9e9c00a03e4d5452ba9a607951d4e4d8a7391a952109d96599266d1e2d9ab2199", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEGL1l3Ub4wOMmVTvlXl4jS7QxiKwf3bNw\nA9EvCRqnobnpwAoD5NVFK6mmB5UdTk2Kc5GpUhCdllmSZtHi2ashmQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 497, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100955555555555555555555555555555547c74934474db157d2a8c3f088aced62c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04b86ae764f2f95eb9331af538fa516fd78435794ebb244c090c6d6b286750f94cf3712f767495a10f2e81350662af3ba09defa2e0e6f27eceea35513032dafb61", + "wx" : "00b86ae764f2f95eb9331af538fa516fd78435794ebb244c090c6d6b286750f94c", + "wy" : "00f3712f767495a10f2e81350662af3ba09defa2e0e6f27eceea35513032dafb61" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004b86ae764f2f95eb9331af538fa516fd78435794ebb244c090c6d6b286750f94cf3712f767495a10f2e81350662af3ba09defa2e0e6f27eceea35513032dafb61", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEuGrnZPL5XrkzGvU4+lFv14Q1eU67JEwJ\nDG1rKGdQ+UzzcS92dJWhDy6BNQZirzugne+i4Obyfs7qNVEwMtr7YQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 498, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3e3a49a23a6d8abe95461f8445676b17", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04e045cc5a9414e45e63f1b08648e20e229a9950ab56ec304e1b907989e81af2bf21e52db489853dc470713aaecd6aadc7bfd8504a9c82d0243f6e774600b5ea0a", + "wx" : "00e045cc5a9414e45e63f1b08648e20e229a9950ab56ec304e1b907989e81af2bf", + "wy" : "21e52db489853dc470713aaecd6aadc7bfd8504a9c82d0243f6e774600b5ea0a" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004e045cc5a9414e45e63f1b08648e20e229a9950ab56ec304e1b907989e81af2bf21e52db489853dc470713aaecd6aadc7bfd8504a9c82d0243f6e774600b5ea0a", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE4EXMWpQU5F5j8bCGSOIOIpqZUKtW7DBO\nG5B5iega8r8h5S20iYU9xHBxOq7Naq3Hv9hQSpyC0CQ/bndGALXqCg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 499, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100bffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364143", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0437e377faea8a867f494bb402032c70c12af6fd57feb3866bfc5a5fc1d0a909f008dcbc53fd41b67073a4e71a81f3fe578da4d5add0d698041a9b7f38a9a19bff", + "wx" : "37e377faea8a867f494bb402032c70c12af6fd57feb3866bfc5a5fc1d0a909f0", + "wy" : "08dcbc53fd41b67073a4e71a81f3fe578da4d5add0d698041a9b7f38a9a19bff" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000437e377faea8a867f494bb402032c70c12af6fd57feb3866bfc5a5fc1d0a909f008dcbc53fd41b67073a4e71a81f3fe578da4d5add0d698041a9b7f38a9a19bff", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEN+N3+uqKhn9JS7QCAyxwwSr2/Vf+s4Zr\n/FpfwdCpCfAI3LxT/UG2cHOk5xqB8/5XjaTVrdDWmAQam384qaGb/w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 500, + "comment" : "edge case for u2", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0220185ddbca6dac41b1da033cfb60c152869e74b3cd66e9ffdf1b6bc09ed65ee40c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0409a33110676e4a4f8a977150a7be291e0a269cae9678710b1d87f8068b0fe961043a6f64e86278a656a39e4468b3472597afb2dcd930ccba1b1ea2c988c13450", + "wx" : "09a33110676e4a4f8a977150a7be291e0a269cae9678710b1d87f8068b0fe961", + "wy" : "043a6f64e86278a656a39e4468b3472597afb2dcd930ccba1b1ea2c988c13450" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000409a33110676e4a4f8a977150a7be291e0a269cae9678710b1d87f8068b0fe961043a6f64e86278a656a39e4468b3472597afb2dcd930ccba1b1ea2c988c13450", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAECaMxEGduSk+Kl3FQp74pHgomnK6WeHEL\nHYf4BosP6WEEOm9k6GJ4plajnkRos0cll6+y3NkwzLobHqLJiME0UA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 501, + "comment" : "point duplication during verification", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3045022032b0d10d8d0e04bc8d4d064d270699e87cffc9b49c5c20730e1c26f6105ddcda022100c55205f423611c7e96615bcc20141945fde24bbce956d49cd43e14ab4cef3659", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0409a33110676e4a4f8a977150a7be291e0a269cae9678710b1d87f8068b0fe961fbc5909b179d8759a95c61bb974cb8da68504d2326cf3345e4e15d35773ec7df", + "wx" : "09a33110676e4a4f8a977150a7be291e0a269cae9678710b1d87f8068b0fe961", + "wy" : "00fbc5909b179d8759a95c61bb974cb8da68504d2326cf3345e4e15d35773ec7df" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000409a33110676e4a4f8a977150a7be291e0a269cae9678710b1d87f8068b0fe961fbc5909b179d8759a95c61bb974cb8da68504d2326cf3345e4e15d35773ec7df", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAECaMxEGduSk+Kl3FQp74pHgomnK6WeHEL\nHYf4BosP6WH7xZCbF52HWalcYbuXTLjaaFBNIybPM0Xk4V01dz7H3w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 502, + "comment" : "duplication bug", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3045022032b0d10d8d0e04bc8d4d064d270699e87cffc9b49c5c20730e1c26f6105ddcda022100c55205f423611c7e96615bcc20141945fde24bbce956d49cd43e14ab4cef3659", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04b7021faebf4081a63094d8ea78ca2004d02a303bbf363470ea4a649b08c1995bde5efba25c9d2f490f181e16795d5c75f83b5c11c81d67ede2ea8df81d970cef", + "wx" : "00b7021faebf4081a63094d8ea78ca2004d02a303bbf363470ea4a649b08c1995b", + "wy" : "00de5efba25c9d2f490f181e16795d5c75f83b5c11c81d67ede2ea8df81d970cef" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004b7021faebf4081a63094d8ea78ca2004d02a303bbf363470ea4a649b08c1995bde5efba25c9d2f490f181e16795d5c75f83b5c11c81d67ede2ea8df81d970cef", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEtwIfrr9AgaYwlNjqeMogBNAqMDu/NjRw\n6kpkmwjBmVveXvuiXJ0vSQ8YHhZ5XVx1+DtcEcgdZ+3i6o34HZcM7w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 503, + "comment" : "comparison with point at infinity ", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0022033333333333333333333333333333332f222f8faefdb533f265d461c29a47373", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "044de024ff2abe7af94fb5e9f53c87d4b4bf1c5447c7c39a9280839f12e52e38d83ce6941fc329978e794abf91a25e83463f8eabcf106d76d4dcd92c0ae05493f3", + "wx" : "4de024ff2abe7af94fb5e9f53c87d4b4bf1c5447c7c39a9280839f12e52e38d8", + "wy" : "3ce6941fc329978e794abf91a25e83463f8eabcf106d76d4dcd92c0ae05493f3" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200044de024ff2abe7af94fb5e9f53c87d4b4bf1c5447c7c39a9280839f12e52e38d83ce6941fc329978e794abf91a25e83463f8eabcf106d76d4dcd92c0ae05493f3", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAETeAk/yq+evlPten1PIfUtL8cVEfHw5qS\ngIOfEuUuONg85pQfwymXjnlKv5GiXoNGP46rzxBtdtTc2SwK4FST8w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 504, + "comment" : "extreme value for k and edgecase s", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04425e137c5fe08e842c3bcc4efbb6c4bca89edda8d6beb130e14899de2f20b74bb1af66ef5baead32e7892160deddcb57f43503104dbc331fa20a8de376e5bd17", + "wx" : "425e137c5fe08e842c3bcc4efbb6c4bca89edda8d6beb130e14899de2f20b74b", + "wy" : "00b1af66ef5baead32e7892160deddcb57f43503104dbc331fa20a8de376e5bd17" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004425e137c5fe08e842c3bcc4efbb6c4bca89edda8d6beb130e14899de2f20b74bb1af66ef5baead32e7892160deddcb57f43503104dbc331fa20a8de376e5bd17", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEQl4TfF/gjoQsO8xO+7bEvKie3ajWvrEw\n4UiZ3i8gt0uxr2bvW66tMueJIWDe3ctX9DUDEE28Mx+iCo3jduW9Fw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 505, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3046022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022100b6db6db6db6db6db6db6db6db6db6db5f30f30127d33e02aad96438927022e9c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046c63d82f22bbeb1bd1c8eba4c680ae17dc2b4d196a0da0e191dc79fefd85e367a883018fb8d160ca01d17234fa0b060a619215ccb9dfea629d6bf92cfd8ed34b", + "wx" : "6c63d82f22bbeb1bd1c8eba4c680ae17dc2b4d196a0da0e191dc79fefd85e367", + "wy" : "00a883018fb8d160ca01d17234fa0b060a619215ccb9dfea629d6bf92cfd8ed34b" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046c63d82f22bbeb1bd1c8eba4c680ae17dc2b4d196a0da0e191dc79fefd85e367a883018fb8d160ca01d17234fa0b060a619215ccb9dfea629d6bf92cfd8ed34b", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEbGPYLyK76xvRyOukxoCuF9wrTRlqDaDh\nkdx5/v2F42eogwGPuNFgygHRcjT6CwYKYZIVzLnf6mKda/ks/Y7TSw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 506, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3046022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee502210099999999999999999999999999999998d668eaf0cf91f9bd7317d2547ced5a5a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04dbf77c566f7483d7407f0095b8b468efdf85b7476e614b8658bcf5e71e6fd588413b50407df0def01b8fcba5621028a6cb0972831c893e3d3c20065b75a8e8e6", + "wx" : "00dbf77c566f7483d7407f0095b8b468efdf85b7476e614b8658bcf5e71e6fd588", + "wy" : "413b50407df0def01b8fcba5621028a6cb0972831c893e3d3c20065b75a8e8e6" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004dbf77c566f7483d7407f0095b8b468efdf85b7476e614b8658bcf5e71e6fd588413b50407df0def01b8fcba5621028a6cb0972831c893e3d3c20065b75a8e8e6", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE2/d8Vm90g9dAfwCVuLRo79+Ft0duYUuG\nWLz15x5v1YhBO1BAffDe8BuPy6ViECimywlygxyJPj08IAZbdajo5g==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 507, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022066666666666666666666666666666665e445f1f5dfb6a67e4cba8c385348e6e7", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04a7967bfb54cfbd8d13492b9ac421d967d7c4b0a3b18efb6408a424914789c8ef90969628e6553898c978ba48eb852714f9e220e5e93cada91478ce1af8948fd8", + "wx" : "00a7967bfb54cfbd8d13492b9ac421d967d7c4b0a3b18efb6408a424914789c8ef", + "wy" : "0090969628e6553898c978ba48eb852714f9e220e5e93cada91478ce1af8948fd8" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004a7967bfb54cfbd8d13492b9ac421d967d7c4b0a3b18efb6408a424914789c8ef90969628e6553898c978ba48eb852714f9e220e5e93cada91478ce1af8948fd8", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEp5Z7+1TPvY0TSSuaxCHZZ9fEsKOxjvtk\nCKQkkUeJyO+QlpYo5lU4mMl4ukjrhScU+eIg5ek8rakUeM4a+JSP2A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 508, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022049249249249249249249249249249248c79facd43214c011123c1b03a93412a5", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04325fd7ab7bc8cd7d859687937a90083f1b46776c2b8fdf4ce2bd9e2e808c68b1bb0d689ca6f542c094c99c71918f5455c7608514149148470494e05aa4ff6110", + "wx" : "325fd7ab7bc8cd7d859687937a90083f1b46776c2b8fdf4ce2bd9e2e808c68b1", + "wy" : "00bb0d689ca6f542c094c99c71918f5455c7608514149148470494e05aa4ff6110" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004325fd7ab7bc8cd7d859687937a90083f1b46776c2b8fdf4ce2bd9e2e808c68b1bb0d689ca6f542c094c99c71918f5455c7608514149148470494e05aa4ff6110", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEMl/Xq3vIzX2FloeTepAIPxtGd2wrj99M\n4r2eLoCMaLG7DWicpvVCwJTJnHGRj1RVx2CFFBSRSEcElOBapP9hEA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 509, + "comment" : "extreme value for k", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee502200eb10e5ab95f2f275348d82ad2e4d7949c8193800d8c9c75df58e343f0ebba7b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04d637dc3c63060a0b21b80d6dc8a97ab6a543c21c18cb5e5c63ad80c3b86050fb1d68bb9b9c36ade49ddd84c7fa3ae5c70f45549592ee03a23a490a891cc70ebb", + "wx" : "00d637dc3c63060a0b21b80d6dc8a97ab6a543c21c18cb5e5c63ad80c3b86050fb", + "wy" : "1d68bb9b9c36ade49ddd84c7fa3ae5c70f45549592ee03a23a490a891cc70ebb" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d637dc3c63060a0b21b80d6dc8a97ab6a543c21c18cb5e5c63ad80c3b86050fb1d68bb9b9c36ade49ddd84c7fa3ae5c70f45549592ee03a23a490a891cc70ebb", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE1jfcPGMGCgshuA1tyKl6tqVDwhwYy15c\nY62Aw7hgUPsdaLubnDat5J3dhMf6OuXHD0VUlZLuA6I6SQqJHMcOuw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 510, + "comment" : "extreme value for k and edgecase s", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046bc87ce6047a3164be15ad781ef32d12bad8caaef7707ac3e15a53ed75efc90c8eee286e2ac0c8f9f6f0350b8bba94b6c5bfade87ba211adc0cad5f3818091e0", + "wx" : "6bc87ce6047a3164be15ad781ef32d12bad8caaef7707ac3e15a53ed75efc90c", + "wy" : "008eee286e2ac0c8f9f6f0350b8bba94b6c5bfade87ba211adc0cad5f3818091e0" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046bc87ce6047a3164be15ad781ef32d12bad8caaef7707ac3e15a53ed75efc90c8eee286e2ac0c8f9f6f0350b8bba94b6c5bfade87ba211adc0cad5f3818091e0", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEa8h85gR6MWS+Fa14HvMtErrYyq73cHrD\n4VpT7XXvyQyO7ihuKsDI+fbwNQuLupS2xb+t6HuiEa3AytXzgYCR4A==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 511, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022100b6db6db6db6db6db6db6db6db6db6db5f30f30127d33e02aad96438927022e9c", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04dac247040488bec28dc3ec9a81a990701f45c0ba4bb6e22573da400efaa65e2e7de375486e1757b6c7b4269bee423edb84c7f4b333c1557b5ddfba0dd983ccf3", + "wx" : "00dac247040488bec28dc3ec9a81a990701f45c0ba4bb6e22573da400efaa65e2e", + "wy" : "7de375486e1757b6c7b4269bee423edb84c7f4b333c1557b5ddfba0dd983ccf3" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004dac247040488bec28dc3ec9a81a990701f45c0ba4bb6e22573da400efaa65e2e7de375486e1757b6c7b4269bee423edb84c7f4b333c1557b5ddfba0dd983ccf3", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE2sJHBASIvsKNw+yagamQcB9FwLpLtuIl\nc9pADvqmXi5943VIbhdXtse0JpvuQj7bhMf0szPBVXtd37oN2YPM8w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 512, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3045022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802210099999999999999999999999999999998d668eaf0cf91f9bd7317d2547ced5a5a", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "041d4d073190b327ab4e4f5ace8d8c8b68e100fd2565a1a4c4610bca309fe6a9c3e274a19b41e496b0832e9e42f5229fc000706c966d2557f3441d323d8faca129", + "wx" : "1d4d073190b327ab4e4f5ace8d8c8b68e100fd2565a1a4c4610bca309fe6a9c3", + "wy" : "00e274a19b41e496b0832e9e42f5229fc000706c966d2557f3441d323d8faca129" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200041d4d073190b327ab4e4f5ace8d8c8b68e100fd2565a1a4c4610bca309fe6a9c3e274a19b41e496b0832e9e42f5229fc000706c966d2557f3441d323d8faca129", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEHU0HMZCzJ6tOT1rOjYyLaOEA/SVloaTE\nYQvKMJ/mqcPidKGbQeSWsIMunkL1Ip/AAHBslm0lV/NEHTI9j6yhKQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 513, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022066666666666666666666666666666665e445f1f5dfb6a67e4cba8c385348e6e7", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04274ba8da21e4ed44e218320daa103f0d4227bb351b67d84ad2628629b82fa8274c90d1dcfe55fe7ee66571ff4526c755cac8c8ed16b01c4db830b7dd9deae749", + "wx" : "274ba8da21e4ed44e218320daa103f0d4227bb351b67d84ad2628629b82fa827", + "wy" : "4c90d1dcfe55fe7ee66571ff4526c755cac8c8ed16b01c4db830b7dd9deae749" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004274ba8da21e4ed44e218320daa103f0d4227bb351b67d84ad2628629b82fa8274c90d1dcfe55fe7ee66571ff4526c755cac8c8ed16b01c4db830b7dd9deae749", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEJ0uo2iHk7UTiGDINqhA/DUInuzUbZ9hK\n0mKGKbgvqCdMkNHc/lX+fuZlcf9FJsdVysjI7RawHE24MLfdnernSQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 514, + "comment" : "extreme value for k and s^-1", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022049249249249249249249249249249248c79facd43214c011123c1b03a93412a5", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04b45406f951d31975e953ac11c25c238046a7975dd2fbb38d890913c1c8b451cbcae0be688e6e400a9265bd9a59ba1047e164306ef6cd358bc0ff00e9e027e957", + "wx" : "00b45406f951d31975e953ac11c25c238046a7975dd2fbb38d890913c1c8b451cb", + "wy" : "00cae0be688e6e400a9265bd9a59ba1047e164306ef6cd358bc0ff00e9e027e957" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004b45406f951d31975e953ac11c25c238046a7975dd2fbb38d890913c1c8b451cbcae0be688e6e400a9265bd9a59ba1047e164306ef6cd358bc0ff00e9e027e957", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEtFQG+VHTGXXpU6wRwlwjgEanl13S+7ON\niQkTwci0UcvK4L5ojm5ACpJlvZpZuhBH4WQwbvbNNYvA/wDp4CfpVw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 515, + "comment" : "extreme value for k", + "flags" : [ + "ArithmeticError" + ], + "msg" : "313233343030", + "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802200eb10e5ab95f2f275348d82ad2e4d7949c8193800d8c9c75df58e343f0ebba7b", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", + "wx" : "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", + "wy" : "483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEeb5mfvncu6xVoGKVzocLBwKb/NstzijZ\nWfKBWxb4F5hIOtp3JqPEZV2k+/wOEQio/Re0SKaFVBmcR9CP+xDUuA==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 516, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "30440220342dae751a63a3ca8189cf342b3b34eaaa2565e2c7e26121c1bfd5435447f1c302202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952", + "result" : "invalid" + }, + { + "tcId" : 517, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3045022100cbd2518ae59c5c357e7630cbd4c4cb1410897703e7663f19fe1289497bee4f7e02202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777", + "wx" : "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", + "wy" : "00b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEeb5mfvncu6xVoGKVzocLBwKb/NstzijZ\nWfKBWxb4F5i3xSWI2Vw7mqJbBAPx7vdXAuhLt1l6q+ZjuC9vBO8ndw==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 518, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "30440220342dae751a63a3ca8189cf342b3b34eaaa2565e2c7e26121c1bfd5435447f1c302202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952", + "result" : "invalid" + }, + { + "tcId" : 519, + "comment" : "public key shares x-coordinate with generator", + "flags" : [ + "PointDuplication" + ], + "msg" : "313233343030", + "sig" : "3045022100cbd2518ae59c5c357e7630cbd4c4cb1410897703e7663f19fe1289497bee4f7e02202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952", + "result" : "invalid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff00000001060492d5a5673e0f25d8d50fb7e58c49d86d46d4216955e0aa3d40e1", + "wx" : "6e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff", + "wy" : "01060492d5a5673e0f25d8d50fb7e58c49d86d46d4216955e0aa3d40e1" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff00000001060492d5a5673e0f25d8d50fb7e58c49d86d46d4216955e0aa3d40e1", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEboI1VUUpFAmRgsaywdbwtdKNUMzQBa8s\n4bulQapAyv8AAAABBgSS1aVnPg8l2NUPt+WMSdhtRtQhaVXgqj1A4Q==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 520, + "comment" : "y-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100c28ad156fe809ed36dc80812ae2f32d84dbbfbb9400123305c332551c4f10d39022100fc5b95b0c7fbc2e7cc4ec1bf01020f8050260ce2ca45c3bf5b64a7b2aeeface9", + "result" : "valid" + }, + { + "tcId" : 521, + "comment" : "y-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100a36bfde0f5e23f6e3b3d6cc80ede3d9e4ea1c2cb9337221388f70aa52dec5e53022100c27e1db10d29720a120c2625c7e0756790200b2d9bcceb170a1356e1d5477e3c", + "result" : "valid" + }, + { + "tcId" : 522, + "comment" : "y-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022100818dee9730f01b3f525daa9cc0d5423b0c4af0414c647b6e0bc88546db9c0d75022061c16a90de1dbb1ab1e3c7917e891632f557f493b4106f225517ef186abc0ff9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40cafffffffffef9fb6d2a5a98c1f0da272af0481a73b62792b92bde96aa1e55c2bb4e", + "wx" : "6e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff", + "wy" : "00fffffffef9fb6d2a5a98c1f0da272af0481a73b62792b92bde96aa1e55c2bb4e" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40cafffffffffef9fb6d2a5a98c1f0da272af0481a73b62792b92bde96aa1e55c2bb4e", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEboI1VUUpFAmRgsaywdbwtdKNUMzQBa8s\n4bulQapAyv/////++fttKlqYwfDaJyrwSBpztieSuSvelqoeVcK7Tg==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 523, + "comment" : "y-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3044022053cc0edfc688e3d264ed4755f9cf006418e16e24dc978453a6ef14fbecff617f022024694c00d38c13259973aa6db88adf7cc49b5673e628b3c65e7fe06f2665db86", + "result" : "valid" + }, + { + "tcId" : 524, + "comment" : "y-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022100cacd14406211ed85d8de1b50e167f59dec688574524c6fc1762c9268214e3bba0220289cf8949f717626c25833a0a159d63d77d022b48e161007464f59f5072df8a7", + "result" : "valid" + }, + { + "tcId" : 525, + "comment" : "y-coordinate of the public key is large", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022100c1a4c9d1feef48045813d911f6abb188502e06d26b34194f2deaa356e578a76902204063d3367b2bab52bf9fbc4cd3f670667569ccb1cfb05a7c7c156622ba593d45", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04000000013fd22248d64d95f73c29b48ab48631850be503fd00f8468b5f0f70e0f6ee7aa43bc2c6fd25b1d8269241cbdd9dbb0dac96dc96231f430705f838717d", + "wx" : "013fd22248d64d95f73c29b48ab48631850be503fd00f8468b5f0f70e0", + "wy" : "00f6ee7aa43bc2c6fd25b1d8269241cbdd9dbb0dac96dc96231f430705f838717d" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004000000013fd22248d64d95f73c29b48ab48631850be503fd00f8468b5f0f70e0f6ee7aa43bc2c6fd25b1d8269241cbdd9dbb0dac96dc96231f430705f838717d", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEAAAAAT/SIkjWTZX3PCm0irSGMYUL5QP9\nAPhGi18PcOD27nqkO8LG/SWx2CaSQcvdnbsNrJbcliMfQwcF+DhxfQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 526, + "comment" : "x-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304402205af5683467b4cb3d68bd168c5fe229a07b7eb1de2f92b8a9743fb46c3691872a02204cbe35cbe66805729e907462169c13b5c4feb497aab658774bec1ecd7bd8863c", + "result" : "valid" + }, + { + "tcId" : 527, + "comment" : "x-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30440220051e5f825a5c29f92a108a3ddcdcbf7ffce37ab32915985978512e89a2a83b0c02206340ac187077a7fb4373537b4595a39299ad0ba351db23bcae9176125c61eded", + "result" : "valid" + }, + { + "tcId" : 528, + "comment" : "x-coordinate of the public key is small", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022034e28decbf74abd30f55155ee2ff96f621066001a853acef916cdb39a7d07b4002210087561a96167016fb7dd6f3c7259f8c563f2144332ebb9a48e93b9512d3bf5392", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "0425afd689acabaed67c1f296de59406f8c550f57146a0b4ec2c97876dfffffffffa46a76e520322dfbc491ec4f0cc197420fc4ea5883d8f6dd53c354bc4f67c35", + "wx" : "25afd689acabaed67c1f296de59406f8c550f57146a0b4ec2c97876dffffffff", + "wy" : "00fa46a76e520322dfbc491ec4f0cc197420fc4ea5883d8f6dd53c354bc4f67c35" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a0342000425afd689acabaed67c1f296de59406f8c550f57146a0b4ec2c97876dfffffffffa46a76e520322dfbc491ec4f0cc197420fc4ea5883d8f6dd53c354bc4f67c35", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEJa/WiayrrtZ8Hylt5ZQG+MVQ9XFGoLTs\nLJeHbf/////6RqduUgMi37xJHsTwzBl0IPxOpYg9j23VPDVLxPZ8NQ==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 529, + "comment" : "x-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100cafded1bc98a4bdfe76e1df9ab75342a7fed16b0c1688a2e744d871b9404be14022100a11fcb57d1212068afed86a37e7291aa02061e75b883e9b9a7af3a52e81f5033", + "result" : "valid" + }, + { + "tcId" : 530, + "comment" : "x-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "30440220254f9541aebd4fca9ce7136fa8e6ed6367778afedf36201779b0ea6a61a82f3b022038668103eebca5e786e05dfffd8b9f1d87d4a1558b1cdfc0eeb98a606ab654c6", + "result" : "valid" + }, + { + "tcId" : 531, + "comment" : "x-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100f998e8322b2a1101bbdf9b8b80bc147e5225632cdb6b1a8c4c4c25c29cd3319d022100ee6b3e7b59621fd62b3253ef646ad7cd4a4d53dd11372038b0b314ced0e2e5a9", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "04d12e6c66b67734c3c84d2601cf5d35dc097e27637f0aca4a4fdb74b6aadd3bb93f5bdff88bd5736df898e699006ed750f11cf07c5866cd7ad70c7121ffffffff", + "wx" : "00d12e6c66b67734c3c84d2601cf5d35dc097e27637f0aca4a4fdb74b6aadd3bb9", + "wy" : "3f5bdff88bd5736df898e699006ed750f11cf07c5866cd7ad70c7121ffffffff" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d12e6c66b67734c3c84d2601cf5d35dc097e27637f0aca4a4fdb74b6aadd3bb93f5bdff88bd5736df898e699006ed750f11cf07c5866cd7ad70c7121ffffffff", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE0S5sZrZ3NMPITSYBz1013Al+J2N/CspK\nT9t0tqrdO7k/W9/4i9VzbfiY5pkAbtdQ8RzwfFhmzXrXDHEh/////w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 532, + "comment" : "y-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304402200c426a3f25f5d0250928ac4e5ea03cf949d34444283ac18a49ec638a2a6ea4c5022009f0df2fe78f8ce301057c734cf3c2505d7219775fb778758461360b168e2c8e", + "result" : "valid" + }, + { + "tcId" : 533, + "comment" : "y-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "304402201309ba742999ad66aef104cc140246bc576bd14acc6bb0be728577e49f4f8ed5022031e29fedcab5999d66b27a4f4ffc950dcc8066fb7cdbad9a6362270c066a500a", + "result" : "valid" + }, + { + "tcId" : 534, + "comment" : "y-coordinate of the public key has many trailing 1's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022100cb565ebfd48044d17d2e241b7cd5fec6089e3d0bee83516b710f68d583ccd1c6022026d6d5a1f12ae063528e7e4b1a6a9c5c760af38f2828db9407c439484f2ae9c1", + "result" : "valid" + } + ] + }, + { + "type" : "EcdsaVerify", + "publicKey" : { + "type" : "EcPublicKey", + "curve" : "secp256k1", + "keySize" : 256, + "uncompressed" : "046d4a7f60d4774a4f0aa8bbdedb953c7eea7909407e3164755664bc2800000000e659d34e4df38d9e8c9eaadfba36612c769195be86c77aac3f36e78b538680fb", + "wx" : "6d4a7f60d4774a4f0aa8bbdedb953c7eea7909407e3164755664bc2800000000", + "wy" : "00e659d34e4df38d9e8c9eaadfba36612c769195be86c77aac3f36e78b538680fb" + }, + "publicKeyDer" : "3056301006072a8648ce3d020106052b8104000a034200046d4a7f60d4774a4f0aa8bbdedb953c7eea7909407e3164755664bc2800000000e659d34e4df38d9e8c9eaadfba36612c769195be86c77aac3f36e78b538680fb", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEbUp/YNR3Sk8KqLve25U8fup5CUB+MWR1\nVmS8KAAAAADmWdNOTfONnoyeqt+6NmEsdpGVvobHeqw/NueLU4aA+w==\n-----END PUBLIC KEY-----\n", + "sha" : "SHA3-512", + "tests" : [ + { + "tcId" : 535, + "comment" : "x-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022100a6c419f478007ce4eb07cd8deb248b8d9d11e16c02364e18391ab934c6f3e91d0220363ab461b8d40c864998a6dfa9c9c77419930b9336f0cd471b74786b09aba27b", + "result" : "valid" + }, + { + "tcId" : 536, + "comment" : "x-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3046022100e22ab46f883c6ea58de97f982ffd3ef581749fe5568f8121761566509145b0c8022100fc4a53daf4122aa10b98a4d18c2e4920b37744447f0d843ff9ed1d79d482d73c", + "result" : "valid" + }, + { + "tcId" : 537, + "comment" : "x-coordinate of the public key has many trailing 0's", + "flags" : [ + "EdgeCasePublicKey" + ], + "msg" : "4d657373616765", + "sig" : "3045022100921a16ea241e69c9d4f3bde6ba2cc7e10a27c9dfd8b92076d0a4a6d9f8ae0ab3022039b66ee2afd7db1099fee2cd8c69c9f1ea29047efacc1c6e8ee92e5a2244a40b", + "result" : "valid" + } + ] + } + ] +} diff --git a/packages/crypto/tests/wycheproof_secp256k1.rs b/packages/crypto/tests/wycheproof_secp256k1.rs index 0a6d0aaf6e..03dca1b83e 100644 --- a/packages/crypto/tests/wycheproof_secp256k1.rs +++ b/packages/crypto/tests/wycheproof_secp256k1.rs @@ -2,13 +2,12 @@ use cosmwasm_crypto::secp256k1_verify; use serde::Deserialize; -use sha2::{Digest, Sha256, Sha512}; -use sha3::Sha3_256; // See ./testdata/wycheproof/README.md for how to get/update those files const SECP256K1_SHA256: &str = "./testdata/wycheproof/ecdsa_secp256k1_sha256_test.json"; const SECP256K1_SHA512: &str = "./testdata/wycheproof/ecdsa_secp256k1_sha512_test.json"; const SECP256K1_SHA3_256: &str = "./testdata/wycheproof/ecdsa_secp256k1_sha3_256_test.json"; +const SECP256K1_SHA3_512: &str = "./testdata/wycheproof/ecdsa_secp256k1_sha3_512_test.json"; #[derive(Deserialize, Debug)] #[serde(rename_all = "camelCase")] @@ -51,6 +50,35 @@ fn read_file(path: &str) -> File { serde_json::from_reader(reader).unwrap() } +mod hashers { + use sha2::{Digest, Sha256, Sha512}; + use sha3::{Sha3_256, Sha3_512}; + + pub fn sha256(data: &[u8]) -> [u8; 32] { + Sha256::digest(data).into() + } + + // ecdsa_secp256k1_sha512 requires truncating to 32 bytes + pub fn sha512(data: &[u8]) -> [u8; 32] { + let mut out = [0u8; 32]; + let hash = Sha512::digest(data).to_vec(); + out.copy_from_slice(&hash[0..32]); + out + } + + pub fn sha3_256(data: &[u8]) -> [u8; 32] { + Sha3_256::digest(data).into() + } + + // ecdsa_secp256k1_sha3_512 requires truncating to 32 bytes + pub fn sha3_512(data: &[u8]) -> [u8; 32] { + let mut out = [0u8; 32]; + let hash = Sha3_512::digest(data).to_vec(); + out.copy_from_slice(&hash[0..32]); + out + } +} + #[test] fn ecdsa_secp256k1_sha256() { let mut tested: usize = 0; @@ -72,7 +100,7 @@ fn ecdsa_secp256k1_sha256() { match tc.result.as_str() { "valid" | "acceptable" => { let message = hex::decode(tc.msg).unwrap(); - let message_hash: [u8; 32] = Sha256::digest(message).into(); + let message_hash = hashers::sha256(&message); let der_signature = hex::decode(tc.sig).unwrap(); let signature = from_der(&der_signature).unwrap(); let valid = secp256k1_verify(&message_hash, &signature, &public_key).unwrap(); @@ -80,7 +108,7 @@ fn ecdsa_secp256k1_sha256() { } "invalid" => { let message = hex::decode(tc.msg).unwrap(); - let message_hash = Sha256::digest(message); + let message_hash = hashers::sha256(&message); let der_signature = hex::decode(tc.sig).unwrap(); if let Ok(signature) = from_der(&der_signature) { @@ -101,7 +129,6 @@ fn ecdsa_secp256k1_sha256() { } #[test] -#[should_panic] // message hast size other than 256bits currently not supported fn ecdsa_secp256k1_sha512() { let mut tested: usize = 0; let File { @@ -122,7 +149,7 @@ fn ecdsa_secp256k1_sha512() { match tc.result.as_str() { "valid" | "acceptable" => { let message = hex::decode(tc.msg).unwrap(); - let message_hash = Sha512::digest(message); + let message_hash = hashers::sha512(&message); let der_signature = hex::decode(tc.sig).unwrap(); let signature = from_der(&der_signature).unwrap(); let valid = secp256k1_verify(&message_hash, &signature, &public_key).unwrap(); @@ -130,7 +157,7 @@ fn ecdsa_secp256k1_sha512() { } "invalid" => { let message = hex::decode(tc.msg).unwrap(); - let message_hash = Sha512::digest(message); + let message_hash = hashers::sha512(&message); let der_signature = hex::decode(tc.sig).unwrap(); if let Ok(signature) = from_der(&der_signature) { @@ -171,7 +198,56 @@ fn ecdsa_secp256k1_sha3_256() { match tc.result.as_str() { "valid" | "acceptable" => { let message = hex::decode(tc.msg).unwrap(); - let message_hash: [u8; 32] = Sha3_256::digest(message).into(); + let message_hash = hashers::sha3_256(&message); + let der_signature = hex::decode(tc.sig).unwrap(); + let signature = from_der(&der_signature).unwrap(); + let valid = secp256k1_verify(&message_hash, &signature, &public_key).unwrap(); + assert!(valid); + } + "invalid" => { + let message = hex::decode(tc.msg).unwrap(); + let message_hash = hashers::sha3_256(&message); + let der_signature = hex::decode(tc.sig).unwrap(); + + if let Ok(signature) = from_der(&der_signature) { + match secp256k1_verify(&message_hash, &signature, &public_key) { + Ok(valid) => assert!(!valid), + Err(_) => { /* this is expected for "invalid", all good */ } + } + } else { + // invalid DER encoding, okay + } + } + _ => panic!("Found unexpected result value"), + } + if tc.result == "valid" {} + } + } + assert_eq!(tested, number_of_tests); +} + +#[test] +fn ecdsa_secp256k1_sha3_512() { + let mut tested: usize = 0; + let File { + number_of_tests, + test_groups, + } = read_file(SECP256K1_SHA3_512); + assert_eq!(number_of_tests, 537, "Got unexpected number of tests"); + + for group in test_groups { + let public_key = hex::decode(group.public_key.uncompressed).unwrap(); + assert_eq!(public_key.len(), 65); + + for tc in group.tests { + tested += 1; + assert_eq!(tc.tc_id as usize, tested); + // eprintln!("Test case ID: {}", tc.tc_id); + + match tc.result.as_str() { + "valid" | "acceptable" => { + let message = hex::decode(tc.msg).unwrap(); + let message_hash = hashers::sha3_512(&message); let der_signature = hex::decode(tc.sig).unwrap(); let signature = from_der(&der_signature).unwrap(); let valid = secp256k1_verify(&message_hash, &signature, &public_key).unwrap(); @@ -179,7 +255,7 @@ fn ecdsa_secp256k1_sha3_256() { } "invalid" => { let message = hex::decode(tc.msg).unwrap(); - let message_hash = Sha3_256::digest(message); + let message_hash = hashers::sha3_512(&message); let der_signature = hex::decode(tc.sig).unwrap(); if let Ok(signature) = from_der(&der_signature) { From 0a67b384fc1643ef48d291ddda466199290dfb91 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 26 Jan 2024 15:06:17 +0100 Subject: [PATCH 1199/2372] Make hashers more compact --- packages/crypto/tests/wycheproof_secp256k1.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/crypto/tests/wycheproof_secp256k1.rs b/packages/crypto/tests/wycheproof_secp256k1.rs index 03dca1b83e..f5268330c6 100644 --- a/packages/crypto/tests/wycheproof_secp256k1.rs +++ b/packages/crypto/tests/wycheproof_secp256k1.rs @@ -60,10 +60,8 @@ mod hashers { // ecdsa_secp256k1_sha512 requires truncating to 32 bytes pub fn sha512(data: &[u8]) -> [u8; 32] { - let mut out = [0u8; 32]; let hash = Sha512::digest(data).to_vec(); - out.copy_from_slice(&hash[0..32]); - out + hash[..32].try_into().unwrap() } pub fn sha3_256(data: &[u8]) -> [u8; 32] { @@ -72,10 +70,8 @@ mod hashers { // ecdsa_secp256k1_sha3_512 requires truncating to 32 bytes pub fn sha3_512(data: &[u8]) -> [u8; 32] { - let mut out = [0u8; 32]; let hash = Sha3_512::digest(data).to_vec(); - out.copy_from_slice(&hash[0..32]); - out + hash[..32].try_into().unwrap() } } From ae62c9c164b62e7b446ddf8b5f50fa9dab33c250 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 26 Jan 2024 15:07:28 +0100 Subject: [PATCH 1200/2372] Make test number checks less strict --- packages/crypto/tests/wycheproof_secp256k1.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/crypto/tests/wycheproof_secp256k1.rs b/packages/crypto/tests/wycheproof_secp256k1.rs index f5268330c6..582f1b5213 100644 --- a/packages/crypto/tests/wycheproof_secp256k1.rs +++ b/packages/crypto/tests/wycheproof_secp256k1.rs @@ -82,7 +82,7 @@ fn ecdsa_secp256k1_sha256() { number_of_tests, test_groups, } = read_file(SECP256K1_SHA256); - assert_eq!(number_of_tests, 463, "Got unexpected number of tests"); + assert!(number_of_tests >= 463, "Got unexpected number of tests"); for group in test_groups { let public_key = hex::decode(group.public_key.uncompressed).unwrap(); @@ -131,7 +131,7 @@ fn ecdsa_secp256k1_sha512() { number_of_tests, test_groups, } = read_file(SECP256K1_SHA512); - assert_eq!(number_of_tests, 533, "Got unexpected number of tests"); + assert!(number_of_tests >= 533, "Got unexpected number of tests"); for group in test_groups { let public_key = hex::decode(group.public_key.uncompressed).unwrap(); @@ -180,7 +180,7 @@ fn ecdsa_secp256k1_sha3_256() { number_of_tests, test_groups, } = read_file(SECP256K1_SHA3_256); - assert_eq!(number_of_tests, 471, "Got unexpected number of tests"); + assert!(number_of_tests >= 471, "Got unexpected number of tests"); for group in test_groups { let public_key = hex::decode(group.public_key.uncompressed).unwrap(); @@ -229,7 +229,7 @@ fn ecdsa_secp256k1_sha3_512() { number_of_tests, test_groups, } = read_file(SECP256K1_SHA3_512); - assert_eq!(number_of_tests, 537, "Got unexpected number of tests"); + assert!(number_of_tests >= 537, "Got unexpected number of tests"); for group in test_groups { let public_key = hex::decode(group.public_key.uncompressed).unwrap(); From 4b2da659759fbab5c62147efa7f9553e55687b29 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 31 Jan 2024 23:22:08 +0100 Subject: [PATCH 1201/2372] Test secp256k1_recover_pubkey as well --- packages/crypto/tests/wycheproof_secp256k1.rs | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/packages/crypto/tests/wycheproof_secp256k1.rs b/packages/crypto/tests/wycheproof_secp256k1.rs index 582f1b5213..2d8a307c5b 100644 --- a/packages/crypto/tests/wycheproof_secp256k1.rs +++ b/packages/crypto/tests/wycheproof_secp256k1.rs @@ -1,6 +1,6 @@ #![allow(clippy::single_match)] // Only needed for old clippy (e.g. 1.70.0) -use cosmwasm_crypto::secp256k1_verify; +use cosmwasm_crypto::{secp256k1_recover_pubkey, secp256k1_verify}; use serde::Deserialize; // See ./testdata/wycheproof/README.md for how to get/update those files @@ -33,6 +33,7 @@ struct Key { #[serde(rename_all = "camelCase")] struct TestCase { tc_id: u32, + comment: String, msg: String, sig: String, // "acceptable", "valid" or "invalid" @@ -101,6 +102,9 @@ fn ecdsa_secp256k1_sha256() { let signature = from_der(&der_signature).unwrap(); let valid = secp256k1_verify(&message_hash, &signature, &public_key).unwrap(); assert!(valid); + if tc.comment != "k*G has a large x-coordinate" { + test_secp256k1_recover_pubkey(&message_hash, &signature, &public_key); + } } "invalid" => { let message = hex::decode(tc.msg).unwrap(); @@ -150,6 +154,9 @@ fn ecdsa_secp256k1_sha512() { let signature = from_der(&der_signature).unwrap(); let valid = secp256k1_verify(&message_hash, &signature, &public_key).unwrap(); assert!(valid); + if tc.comment != "k*G has a large x-coordinate" { + test_secp256k1_recover_pubkey(&message_hash, &signature, &public_key); + } } "invalid" => { let message = hex::decode(tc.msg).unwrap(); @@ -199,6 +206,9 @@ fn ecdsa_secp256k1_sha3_256() { let signature = from_der(&der_signature).unwrap(); let valid = secp256k1_verify(&message_hash, &signature, &public_key).unwrap(); assert!(valid); + if tc.comment != "k*G has a large x-coordinate" { + test_secp256k1_recover_pubkey(&message_hash, &signature, &public_key); + } } "invalid" => { let message = hex::decode(tc.msg).unwrap(); @@ -248,6 +258,9 @@ fn ecdsa_secp256k1_sha3_512() { let signature = from_der(&der_signature).unwrap(); let valid = secp256k1_verify(&message_hash, &signature, &public_key).unwrap(); assert!(valid); + if tc.comment != "k*G has a large x-coordinate" { + test_secp256k1_recover_pubkey(&message_hash, &signature, &public_key); + } } "invalid" => { let message = hex::decode(tc.msg).unwrap(); @@ -271,6 +284,19 @@ fn ecdsa_secp256k1_sha3_512() { assert_eq!(tested, number_of_tests); } +fn test_secp256k1_recover_pubkey(message_hash: &[u8], signature: &[u8], public_key: &[u8]) { + // Since the recovery param is missing in the test vectors, we try both 0 and 1 + for recovery_param in 0..=1 { + if let Ok(recovered) = secp256k1_recover_pubkey(message_hash, signature, recovery_param) { + if recovered == public_key { + // success, found working recovery param + return; + } + } + } + panic!("secp256k1_recover_pubkey failed for all recovery params"); +} + fn from_der(data: &[u8]) -> Result<[u8; 64], String> { const DER_TAG_INTEGER: u8 = 0x02; From 6f5ecb4bd598dcb7cf83f8ca24c2096b94964bf7 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Sat, 3 Feb 2024 13:53:57 +0100 Subject: [PATCH 1202/2372] Require two pubkey recoveries to succeed --- packages/crypto/src/secp256k1.rs | 19 ++++++++----------- packages/crypto/tests/wycheproof_secp256k1.rs | 14 +++++--------- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/packages/crypto/src/secp256k1.rs b/packages/crypto/src/secp256k1.rs index d77f71181d..e7038db252 100644 --- a/packages/crypto/src/secp256k1.rs +++ b/packages/crypto/src/secp256k1.rs @@ -380,17 +380,14 @@ mod tests { assert_eq!(hash.as_slice(), message_hash.as_slice()); // Since the recovery param is missing in the test vectors, we try both 0 and 1 - let try0 = secp256k1_recover_pubkey(&message_hash, &signature, 0); - let try1 = secp256k1_recover_pubkey(&message_hash, &signature, 1); - match (try0, try1) { - (Ok(recovered0), Ok(recovered1)) => { - // Got two different pubkeys. Without the recovery param, we don't know which one is the right one. - assert!(recovered0 == public_key || recovered1 == public_key) - }, - (Ok(recovered), Err(_)) => assert_eq!(recovered, public_key), - (Err(_), Ok(recovered)) => assert_eq!(recovered, public_key), - (Err(_), Err(_)) => panic!("secp256k1_recover_pubkey failed (test case {i} in {COSMOS_SECP256K1_TESTS_JSON})"), - } + let recovered0 = secp256k1_recover_pubkey(&message_hash, &signature, 0).unwrap(); + let recovered1 = secp256k1_recover_pubkey(&message_hash, &signature, 1).unwrap(); + // Got two different pubkeys. Without the recovery param, we don't know which one is the right one. + assert_ne!(recovered0, recovered1); + assert!( + recovered0 == public_key || recovered1 == public_key, + "Did not find correct pubkey (test case {i} in {COSMOS_SECP256K1_TESTS_JSON})" + ); } } diff --git a/packages/crypto/tests/wycheproof_secp256k1.rs b/packages/crypto/tests/wycheproof_secp256k1.rs index 2d8a307c5b..e248c4599b 100644 --- a/packages/crypto/tests/wycheproof_secp256k1.rs +++ b/packages/crypto/tests/wycheproof_secp256k1.rs @@ -286,15 +286,11 @@ fn ecdsa_secp256k1_sha3_512() { fn test_secp256k1_recover_pubkey(message_hash: &[u8], signature: &[u8], public_key: &[u8]) { // Since the recovery param is missing in the test vectors, we try both 0 and 1 - for recovery_param in 0..=1 { - if let Ok(recovered) = secp256k1_recover_pubkey(message_hash, signature, recovery_param) { - if recovered == public_key { - // success, found working recovery param - return; - } - } - } - panic!("secp256k1_recover_pubkey failed for all recovery params"); + let recovered0 = secp256k1_recover_pubkey(message_hash, signature, 0).unwrap(); + let recovered1 = secp256k1_recover_pubkey(message_hash, signature, 1).unwrap(); + // Got two different pubkeys. Without the recovery param, we don't know which one is the right one. + assert_ne!(recovered0, recovered1); + assert!(recovered0 == public_key || recovered1 == public_key); } fn from_der(data: &[u8]) -> Result<[u8; 64], String> { From 0e9624a2bb9e38ecd16e16456fd954bd2e438e4f Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 5 Feb 2024 13:38:17 +0100 Subject: [PATCH 1203/2372] Deduplicate test case processing --- packages/crypto/tests/wycheproof_secp256k1.rs | 40 ++++++------------- 1 file changed, 12 insertions(+), 28 deletions(-) diff --git a/packages/crypto/tests/wycheproof_secp256k1.rs b/packages/crypto/tests/wycheproof_secp256k1.rs index e248c4599b..931761f542 100644 --- a/packages/crypto/tests/wycheproof_secp256k1.rs +++ b/packages/crypto/tests/wycheproof_secp256k1.rs @@ -93,12 +93,12 @@ fn ecdsa_secp256k1_sha256() { tested += 1; assert_eq!(tc.tc_id as usize, tested); // eprintln!("Test case ID: {}", tc.tc_id); + let message = hex::decode(tc.msg).unwrap(); + let message_hash = hashers::sha256(&message); + let der_signature = hex::decode(tc.sig).unwrap(); match tc.result.as_str() { "valid" | "acceptable" => { - let message = hex::decode(tc.msg).unwrap(); - let message_hash = hashers::sha256(&message); - let der_signature = hex::decode(tc.sig).unwrap(); let signature = from_der(&der_signature).unwrap(); let valid = secp256k1_verify(&message_hash, &signature, &public_key).unwrap(); assert!(valid); @@ -107,10 +107,6 @@ fn ecdsa_secp256k1_sha256() { } } "invalid" => { - let message = hex::decode(tc.msg).unwrap(); - let message_hash = hashers::sha256(&message); - let der_signature = hex::decode(tc.sig).unwrap(); - if let Ok(signature) = from_der(&der_signature) { match secp256k1_verify(&message_hash, &signature, &public_key) { Ok(valid) => assert!(!valid), @@ -145,12 +141,12 @@ fn ecdsa_secp256k1_sha512() { tested += 1; assert_eq!(tc.tc_id as usize, tested); // eprintln!("Test case ID: {}", tc.tc_id); + let message = hex::decode(tc.msg).unwrap(); + let message_hash = hashers::sha512(&message); + let der_signature = hex::decode(tc.sig).unwrap(); match tc.result.as_str() { "valid" | "acceptable" => { - let message = hex::decode(tc.msg).unwrap(); - let message_hash = hashers::sha512(&message); - let der_signature = hex::decode(tc.sig).unwrap(); let signature = from_der(&der_signature).unwrap(); let valid = secp256k1_verify(&message_hash, &signature, &public_key).unwrap(); assert!(valid); @@ -159,10 +155,6 @@ fn ecdsa_secp256k1_sha512() { } } "invalid" => { - let message = hex::decode(tc.msg).unwrap(); - let message_hash = hashers::sha512(&message); - let der_signature = hex::decode(tc.sig).unwrap(); - if let Ok(signature) = from_der(&der_signature) { match secp256k1_verify(&message_hash, &signature, &public_key) { Ok(valid) => assert!(!valid), @@ -197,12 +189,12 @@ fn ecdsa_secp256k1_sha3_256() { tested += 1; assert_eq!(tc.tc_id as usize, tested); // eprintln!("Test case ID: {}", tc.tc_id); + let message = hex::decode(tc.msg).unwrap(); + let message_hash = hashers::sha3_256(&message); + let der_signature = hex::decode(tc.sig).unwrap(); match tc.result.as_str() { "valid" | "acceptable" => { - let message = hex::decode(tc.msg).unwrap(); - let message_hash = hashers::sha3_256(&message); - let der_signature = hex::decode(tc.sig).unwrap(); let signature = from_der(&der_signature).unwrap(); let valid = secp256k1_verify(&message_hash, &signature, &public_key).unwrap(); assert!(valid); @@ -211,10 +203,6 @@ fn ecdsa_secp256k1_sha3_256() { } } "invalid" => { - let message = hex::decode(tc.msg).unwrap(); - let message_hash = hashers::sha3_256(&message); - let der_signature = hex::decode(tc.sig).unwrap(); - if let Ok(signature) = from_der(&der_signature) { match secp256k1_verify(&message_hash, &signature, &public_key) { Ok(valid) => assert!(!valid), @@ -249,12 +237,12 @@ fn ecdsa_secp256k1_sha3_512() { tested += 1; assert_eq!(tc.tc_id as usize, tested); // eprintln!("Test case ID: {}", tc.tc_id); + let message = hex::decode(tc.msg).unwrap(); + let message_hash = hashers::sha3_512(&message); + let der_signature = hex::decode(tc.sig).unwrap(); match tc.result.as_str() { "valid" | "acceptable" => { - let message = hex::decode(tc.msg).unwrap(); - let message_hash = hashers::sha3_512(&message); - let der_signature = hex::decode(tc.sig).unwrap(); let signature = from_der(&der_signature).unwrap(); let valid = secp256k1_verify(&message_hash, &signature, &public_key).unwrap(); assert!(valid); @@ -263,10 +251,6 @@ fn ecdsa_secp256k1_sha3_512() { } } "invalid" => { - let message = hex::decode(tc.msg).unwrap(); - let message_hash = hashers::sha3_512(&message); - let der_signature = hex::decode(tc.sig).unwrap(); - if let Ok(signature) = from_der(&der_signature) { match secp256k1_verify(&message_hash, &signature, &public_key) { Ok(valid) => assert!(!valid), From d7bd81ddad6c50091ccf6309bba3d805d1a4d15e Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 31 Jan 2024 23:36:06 +0100 Subject: [PATCH 1204/2372] Bump k256 to ^0.13.3 --- Cargo.lock | 38 +++++++++++++-------------- contracts/burner/Cargo.lock | 16 +++++------ contracts/crypto-verify/Cargo.lock | 16 +++++------ contracts/cyberpunk/Cargo.lock | 16 +++++------ contracts/empty/Cargo.lock | 16 +++++------ contracts/floaty/Cargo.lock | 16 +++++------ contracts/hackatom/Cargo.lock | 16 +++++------ contracts/ibc-reflect-send/Cargo.lock | 16 +++++------ contracts/ibc-reflect/Cargo.lock | 16 +++++------ contracts/queue/Cargo.lock | 16 +++++------ contracts/reflect/Cargo.lock | 16 +++++------ contracts/staking/Cargo.lock | 16 +++++------ contracts/virus/Cargo.lock | 16 +++++------ packages/crypto/Cargo.toml | 3 +-- packages/crypto/src/secp256k1.rs | 10 +++++-- 15 files changed, 124 insertions(+), 119 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 40ed91f9ce..fb6c6ecd73 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -422,7 +422,7 @@ name = "cosmwasm-crypto" version = "2.0.0-beta.1" dependencies = [ "criterion", - "digest 0.10.6", + "digest 0.10.7", "ecdsa", "ed25519-zebra", "english-numbers", @@ -864,9 +864,9 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", "const-oid", @@ -914,12 +914,12 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.16.7" +version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0997c976637b606099b9985693efa3581e84e41f5c11ba5255f88711058ad428" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der", - "digest 0.10.6", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", @@ -949,13 +949,13 @@ checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest 0.10.6", + "digest 0.10.7", "ff", "generic-array", "group", @@ -1235,7 +1235,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -1328,9 +1328,9 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" dependencies = [ "cfg-if", "ecdsa", @@ -1514,9 +1514,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "oorandom" @@ -2077,7 +2077,7 @@ checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -2086,7 +2086,7 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "keccak", ] @@ -2106,7 +2106,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "rand_core 0.6.4", ] @@ -2927,6 +2927,6 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index f3c96d85fb..dd45441e15 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -637,9 +637,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -884,9 +884,9 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" dependencies = [ "cfg-if", "ecdsa", @@ -1021,9 +1021,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -1996,6 +1996,6 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 520a186bc1..79e361d274 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -642,9 +642,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -895,9 +895,9 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" dependencies = [ "cfg-if", "ecdsa", @@ -1038,9 +1038,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -2039,6 +2039,6 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 06652c5718..7eb992a885 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -673,9 +673,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -976,9 +976,9 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" dependencies = [ "cfg-if", "ecdsa", @@ -1119,9 +1119,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -2208,6 +2208,6 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/contracts/empty/Cargo.lock b/contracts/empty/Cargo.lock index e2ef687ca6..b0ec536d30 100644 --- a/contracts/empty/Cargo.lock +++ b/contracts/empty/Cargo.lock @@ -626,9 +626,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -883,9 +883,9 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" dependencies = [ "cfg-if", "ecdsa", @@ -1020,9 +1020,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -1995,6 +1995,6 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index a0339dc779..e9557a879d 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -626,9 +626,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -885,9 +885,9 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" dependencies = [ "cfg-if", "ecdsa", @@ -1022,9 +1022,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -2013,6 +2013,6 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 02c30500ab..c9b1b3fbe2 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -626,9 +626,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -886,9 +886,9 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" dependencies = [ "cfg-if", "ecdsa", @@ -1023,9 +1023,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -1998,6 +1998,6 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 1797bea8ae..98fa0e118a 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -626,9 +626,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -884,9 +884,9 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" dependencies = [ "cfg-if", "ecdsa", @@ -1021,9 +1021,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -1996,6 +1996,6 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index d9f4d0cea7..df52cc9a54 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -626,9 +626,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -884,9 +884,9 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" dependencies = [ "cfg-if", "ecdsa", @@ -1021,9 +1021,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -1996,6 +1996,6 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 831f473fcd..2a7d9085e0 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -626,9 +626,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -873,9 +873,9 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" dependencies = [ "cfg-if", "ecdsa", @@ -1010,9 +1010,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -1996,6 +1996,6 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 3d9ba25124..a26a0457e5 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -626,9 +626,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -873,9 +873,9 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" dependencies = [ "cfg-if", "ecdsa", @@ -1010,9 +1010,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -1997,6 +1997,6 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index cbc36980f2..797a9e8bbd 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -632,9 +632,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -879,9 +879,9 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" dependencies = [ "cfg-if", "ecdsa", @@ -1016,9 +1016,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -2024,6 +2024,6 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index 91c051fdbd..ba06757c83 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -626,9 +626,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -873,9 +873,9 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" dependencies = [ "cfg-if", "ecdsa", @@ -1010,9 +1010,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -1997,6 +1997,6 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 2277ee1be4..9ce890e7a1 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -15,8 +15,7 @@ default = [] bench = false [dependencies] -# Version pinned due to https://github.com/CosmWasm/cosmwasm/issues/2010 -k256 = { version = "=0.13.1", features = ["ecdsa"] } +k256 = { version = "0.13.3", features = ["ecdsa"] } ed25519-zebra = "3" digest = "0.10" rand_core = { version = "0.6", features = ["getrandom"] } diff --git a/packages/crypto/src/secp256k1.rs b/packages/crypto/src/secp256k1.rs index e7038db252..cf1d8a6187 100644 --- a/packages/crypto/src/secp256k1.rs +++ b/packages/crypto/src/secp256k1.rs @@ -105,18 +105,24 @@ pub fn secp256k1_recover_pubkey( let signature = read_signature(signature)?; // params other than 0 and 1 are explicitly not supported - let id = match recovery_param { + let mut id = match recovery_param { 0 => RecoveryId::new(false, false), 1 => RecoveryId::new(true, false), _ => return Err(CryptoError::invalid_recovery_param()), }; // Compose extended signature - let signature = Signature::from_bytes(&signature.into()) + let mut signature = Signature::from_bytes(&signature.into()) .map_err(|e| CryptoError::generic_err(e.to_string()))?; // Recover let message_digest = Identity256::new().chain(message_hash); + + if let Some(normalized) = signature.normalize_s() { + signature = normalized; + id = RecoveryId::new(!id.is_y_odd(), id.is_x_reduced()); + } + let pubkey = VerifyingKey::recover_from_digest(message_digest, &signature, id) .map_err(|e| CryptoError::generic_err(e.to_string()))?; let encoded: Vec = pubkey.to_encoded_point(false).as_bytes().into(); From 8fe308f055b2479c2f38db6dea2c578185ed695c Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 1 Feb 2024 00:34:52 +0100 Subject: [PATCH 1205/2372] Remove obsolete ecdsa dependency k256 requires ecdsa 0.16.9 now: https://github.com/RustCrypto/elliptic-curves/blob/k256/v0.13.2/k256/Cargo.toml#L26 --- Cargo.lock | 1 - contracts/burner/Cargo.lock | 1 - contracts/crypto-verify/Cargo.lock | 1 - contracts/cyberpunk/Cargo.lock | 1 - contracts/empty/Cargo.lock | 1 - contracts/floaty/Cargo.lock | 1 - contracts/hackatom/Cargo.lock | 1 - contracts/ibc-reflect-send/Cargo.lock | 1 - contracts/ibc-reflect/Cargo.lock | 1 - contracts/queue/Cargo.lock | 1 - contracts/reflect/Cargo.lock | 1 - contracts/staking/Cargo.lock | 1 - contracts/virus/Cargo.lock | 1 - packages/crypto/Cargo.toml | 2 -- 14 files changed, 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fb6c6ecd73..c431fd603f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -423,7 +423,6 @@ version = "2.0.0-beta.1" dependencies = [ "criterion", "digest 0.10.7", - "ecdsa", "ed25519-zebra", "english-numbers", "hex", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index dd45441e15..0e9808e0e0 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -202,7 +202,6 @@ name = "cosmwasm-crypto" version = "2.0.0-beta.1" dependencies = [ "digest 0.10.7", - "ecdsa", "ed25519-zebra", "k256", "rand_core 0.6.4", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 79e361d274..befdaca816 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -191,7 +191,6 @@ name = "cosmwasm-crypto" version = "2.0.0-beta.1" dependencies = [ "digest 0.10.7", - "ecdsa", "ed25519-zebra", "k256", "rand_core 0.6.4", diff --git a/contracts/cyberpunk/Cargo.lock b/contracts/cyberpunk/Cargo.lock index 7eb992a885..ebdab2978f 100644 --- a/contracts/cyberpunk/Cargo.lock +++ b/contracts/cyberpunk/Cargo.lock @@ -226,7 +226,6 @@ name = "cosmwasm-crypto" version = "2.0.0-beta.1" dependencies = [ "digest 0.10.7", - "ecdsa", "ed25519-zebra", "k256", "rand_core 0.6.4", diff --git a/contracts/empty/Cargo.lock b/contracts/empty/Cargo.lock index b0ec536d30..40c7ce7216 100644 --- a/contracts/empty/Cargo.lock +++ b/contracts/empty/Cargo.lock @@ -191,7 +191,6 @@ name = "cosmwasm-crypto" version = "2.0.0-beta.1" dependencies = [ "digest 0.10.7", - "ecdsa", "ed25519-zebra", "k256", "rand_core 0.6.4", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index e9557a879d..045b341813 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -191,7 +191,6 @@ name = "cosmwasm-crypto" version = "2.0.0-beta.1" dependencies = [ "digest 0.10.7", - "ecdsa", "ed25519-zebra", "k256", "rand_core 0.6.4", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index c9b1b3fbe2..27309541d6 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -191,7 +191,6 @@ name = "cosmwasm-crypto" version = "2.0.0-beta.1" dependencies = [ "digest 0.10.7", - "ecdsa", "ed25519-zebra", "k256", "rand_core 0.6.4", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 98fa0e118a..0e9f62283e 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -191,7 +191,6 @@ name = "cosmwasm-crypto" version = "2.0.0-beta.1" dependencies = [ "digest 0.10.7", - "ecdsa", "ed25519-zebra", "k256", "rand_core 0.6.4", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index df52cc9a54..e6904f4b27 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -191,7 +191,6 @@ name = "cosmwasm-crypto" version = "2.0.0-beta.1" dependencies = [ "digest 0.10.7", - "ecdsa", "ed25519-zebra", "k256", "rand_core 0.6.4", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 2a7d9085e0..0d8ddae7f2 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -191,7 +191,6 @@ name = "cosmwasm-crypto" version = "2.0.0-beta.1" dependencies = [ "digest 0.10.7", - "ecdsa", "ed25519-zebra", "k256", "rand_core 0.6.4", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index a26a0457e5..0cb04720cb 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -191,7 +191,6 @@ name = "cosmwasm-crypto" version = "2.0.0-beta.1" dependencies = [ "digest 0.10.7", - "ecdsa", "ed25519-zebra", "k256", "rand_core 0.6.4", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 797a9e8bbd..cd096916c9 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -191,7 +191,6 @@ name = "cosmwasm-crypto" version = "2.0.0-beta.1" dependencies = [ "digest 0.10.7", - "ecdsa", "ed25519-zebra", "k256", "rand_core 0.6.4", diff --git a/contracts/virus/Cargo.lock b/contracts/virus/Cargo.lock index ba06757c83..d016c1e6cc 100644 --- a/contracts/virus/Cargo.lock +++ b/contracts/virus/Cargo.lock @@ -191,7 +191,6 @@ name = "cosmwasm-crypto" version = "2.0.0-beta.1" dependencies = [ "digest 0.10.7", - "ecdsa", "ed25519-zebra", "k256", "rand_core 0.6.4", diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 9ce890e7a1..473349b0e0 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -20,8 +20,6 @@ ed25519-zebra = "3" digest = "0.10" rand_core = { version = "0.6", features = ["getrandom"] } thiserror = "1.0.38" -# Not used directly, but needed to bump transitive dependency, see: https://github.com/CosmWasm/cosmwasm/pull/1899 for details. -ecdsa = "0.16.2" [dev-dependencies] criterion = "0.5.1" From 824905e06806cbdf6f12d2cb64c04a312825d479 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Sun, 21 Jan 2024 21:37:01 +0100 Subject: [PATCH 1206/2372] Add Noop --- contracts/cyberpunk/schema/cyberpunk.json | 14 ++++++++++++++ contracts/cyberpunk/schema/raw/execute.json | 14 ++++++++++++++ contracts/cyberpunk/src/contract.rs | 5 +++++ contracts/cyberpunk/src/msg.rs | 2 ++ 4 files changed, 35 insertions(+) diff --git a/contracts/cyberpunk/schema/cyberpunk.json b/contracts/cyberpunk/schema/cyberpunk.json index ccb550b1ad..0660511517 100644 --- a/contracts/cyberpunk/schema/cyberpunk.json +++ b/contracts/cyberpunk/schema/cyberpunk.json @@ -179,6 +179,20 @@ } }, "additionalProperties": false + }, + { + "description": "Does nothing. This can be used for baseline contract execution performance measurements.", + "type": "object", + "required": [ + "noop" + ], + "properties": { + "noop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false } ] }, diff --git a/contracts/cyberpunk/schema/raw/execute.json b/contracts/cyberpunk/schema/raw/execute.json index 8ea521b97f..eeb2687ead 100644 --- a/contracts/cyberpunk/schema/raw/execute.json +++ b/contracts/cyberpunk/schema/raw/execute.json @@ -169,6 +169,20 @@ } }, "additionalProperties": false + }, + { + "description": "Does nothing. This can be used for baseline contract execution performance measurements.", + "type": "object", + "required": [ + "noop" + ], + "properties": { + "noop": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false } ] } diff --git a/contracts/cyberpunk/src/contract.rs b/contracts/cyberpunk/src/contract.rs index 4972297e00..80254fe64d 100644 --- a/contracts/cyberpunk/src/contract.rs +++ b/contracts/cyberpunk/src/contract.rs @@ -39,6 +39,7 @@ pub fn execute( Unreachable {} => execute_unreachable(), MirrorEnv {} => execute_mirror_env(env), Debug {} => execute_debug(deps.api), + Noop {} => execute_noop(), } } @@ -178,6 +179,10 @@ fn execute_debug(api: &dyn Api) -> Result { Ok(Response::default()) } +fn execute_noop() -> Result { + Ok(Response::new()) +} + #[entry_point] pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { use QueryMsg::*; diff --git a/contracts/cyberpunk/src/msg.rs b/contracts/cyberpunk/src/msg.rs index c02b518721..6dc9febca6 100644 --- a/contracts/cyberpunk/src/msg.rs +++ b/contracts/cyberpunk/src/msg.rs @@ -30,6 +30,8 @@ pub enum ExecuteMsg { MirrorEnv {}, /// Does a bit of work and calls debug Debug {}, + /// Does nothing. This can be used for baseline contract execution performance measurements. + Noop {}, } #[cw_serde] From 5011a41d561d7a718ad07e26ad75909260a44c50 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Sun, 21 Jan 2024 22:27:55 +0100 Subject: [PATCH 1207/2372] Add cyberpunk build command --- contracts/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contracts/README.md b/contracts/README.md index 84795914e2..c9f6dd2131 100644 --- a/contracts/README.md +++ b/contracts/README.md @@ -64,6 +64,11 @@ docker run --rm -v "$(pwd)":/code \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ cosmwasm/optimizer:0.15.0 ./contracts/crypto-verify +docker run --rm -v "$(pwd)":/code \ + --mount type=volume,source="devcontract_cache_cyberpunk",target=/target \ + --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ + cosmwasm/optimizer:0.15.0 ./contracts/cyberpunk + docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_floaty",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ From 878c1ae722b0780d50187bd70ff2d3412042e8fb Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 22 Jan 2024 00:04:52 +0100 Subject: [PATCH 1208/2372] Rebuild cyberpunk test contract --- packages/vm/benches/main.rs | 11 ++++++----- packages/vm/src/calls.rs | 7 ++++--- packages/vm/src/compatibility.rs | 2 +- packages/vm/testdata/cyberpunk.wasm | Bin 172461 -> 252265 bytes 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/vm/benches/main.rs b/packages/vm/benches/main.rs index 9f47467131..7b34447b5a 100644 --- a/packages/vm/benches/main.rs +++ b/packages/vm/benches/main.rs @@ -30,6 +30,7 @@ const MEMORY_CACHE_SIZE: Size = Size::mebi(200); const INSTANTIATION_THREADS: usize = 128; const CONTRACTS: u64 = 10; +const DEFAULT_CAPABILITIES: &str = "cosmwasm_1_1,cosmwasm_1_2,cosmwasm_1_3,iterator,staking"; static CONTRACT: &[u8] = include_bytes!("../testdata/hackatom.wasm"); static CYBERPUNK: &[u8] = include_bytes!("../testdata/cyberpunk.wasm"); @@ -129,7 +130,7 @@ fn bench_cache(c: &mut Criterion) { let options = CacheOptions::new( TempDir::new().unwrap().into_path(), - capabilities_from_csv("iterator,staking"), + capabilities_from_csv(DEFAULT_CAPABILITIES), MEMORY_CACHE_SIZE, DEFAULT_MEMORY_LIMIT, ); @@ -182,7 +183,7 @@ fn bench_cache(c: &mut Criterion) { group.bench_function("instantiate from fs", |b| { let non_memcache = CacheOptions::new( TempDir::new().unwrap().into_path(), - capabilities_from_csv("iterator,staking"), + capabilities_from_csv(DEFAULT_CAPABILITIES), Size::new(0), DEFAULT_MEMORY_LIMIT, ); @@ -204,7 +205,7 @@ fn bench_cache(c: &mut Criterion) { group.bench_function("instantiate from fs unchecked", |b| { let non_memcache = CacheOptions::new( TempDir::new().unwrap().into_path(), - capabilities_from_csv("iterator,staking"), + capabilities_from_csv(DEFAULT_CAPABILITIES), Size::new(0), DEFAULT_MEMORY_LIMIT, ); @@ -267,11 +268,11 @@ fn bench_cache(c: &mut Criterion) { group.finish(); } -pub fn bench_instance_threads(c: &mut Criterion) { +fn bench_instance_threads(c: &mut Criterion) { c.bench_function("multi-threaded get_instance", |b| { let options = CacheOptions::new( TempDir::new().unwrap().into_path(), - capabilities_from_csv("iterator,staking"), + capabilities_from_csv(DEFAULT_CAPABILITIES), MEMORY_CACHE_SIZE, DEFAULT_MEMORY_LIMIT, ); diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 1b9fd3f1a6..f09e9841c4 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -692,9 +692,10 @@ mod tests { call_execute::<_, _, _, Empty>(&mut instance, &mock_env(), &info, msg).unwrap_err(); match err { VmError::RuntimeErr { msg, .. } => { - assert!(msg.contains( - "RuntimeError: Aborted: panicked at 'This page intentionally faulted'" - )) + assert!( + msg.contains("RuntimeError: Aborted: panicked at src/contract.rs:"), + "Unexpected error msg: {msg}" + ) } err => panic!("Unexpected error: {err:?}"), } diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index 4850cf3006..8bbda004c9 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -277,7 +277,7 @@ mod tests { static CONTRACT_RUST_170: &[u8] = include_bytes!("../testdata/cyberpunk_rust170.wasm"); fn default_capabilities() -> HashSet { - capabilities_from_csv("cosmwasm_1_1,cosmwasm_1_2,iterator,staking,stargate") + capabilities_from_csv("cosmwasm_1_1,cosmwasm_1_2,cosmwasm_1_3,iterator,staking,stargate") } #[test] diff --git a/packages/vm/testdata/cyberpunk.wasm b/packages/vm/testdata/cyberpunk.wasm index 68aa44257f0d1ffeea63324d3af51528474f473d..885a1dbdf34842ec4da94247fc51588de0212801 100644 GIT binary patch literal 252265 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

e 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�eom5FZI%#?k17*BM29 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 literal 0 HcmV?d00001 From 44c8b828afc665efd4f1e1a7065f0185b76969ed Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 8 Sep 2023 17:07:04 +0200 Subject: [PATCH 0773/2372] Format readme --- contracts/floaty/README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/contracts/floaty/README.md b/contracts/floaty/README.md index 882488413b..8c64b87bf7 100644 --- a/contracts/floaty/README.md +++ b/contracts/floaty/README.md @@ -1,9 +1,10 @@ # Floaty Contract -This contract contains all WebAssembly floating point instructions. It is used for testing the floating point support. +This contract contains all WebAssembly floating point instructions. It is used +for testing the floating point support. -In order to compile it, you need a nightly version of Rust and enable -the `nontrapping-fptoint` target-feature like this: +In order to compile it, you need a nightly version of Rust and enable the +`nontrapping-fptoint` target-feature like this: ```sh RUSTFLAGS="-C target-feature=+nontrapping-fptoint" cargo wasm From 85a6958695527cdd9e263ed03503da1efa119a07 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 8 Sep 2023 17:09:48 +0200 Subject: [PATCH 0774/2372] Disable floaty contract in ci --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ddc969c61d..71d7341522 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -61,7 +61,7 @@ workflows: - contract_hackatom - contract_ibc_reflect - contract_ibc_reflect_send - - contract_floaty + # - contract_floaty # This contract needs nightly Rust to compile - contract_queue - contract_reflect - contract_staking From ef2222b4df2ccf95a877734f037f73ed62cb5339 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 8 Sep 2023 17:10:44 +0200 Subject: [PATCH 0775/2372] Fix clippy --- packages/vm/src/calls.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 84dded29bb..3953854ab1 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -812,10 +812,10 @@ mod tests { let result = match call_query(&mut instance, &mock_env(), msg.as_bytes()) { Ok(ContractResult::Ok(r)) => format!("{:?}", from_slice::(&r).unwrap()), Err(VmError::RuntimeErr { msg }) => msg, - e => panic!("unexpected error: {:?}", e), + e => panic!("unexpected error: {e:?}"), }; // add the result to the hash - hasher.update(format!("{}{}{}", instr, seed, result).as_bytes()); + hasher.update(format!("{instr}{seed}{result}").as_bytes()); } } let hash = Digest::finalize(hasher); From d523baf76ad83800b3f15ac2bfa5ee79f619628a Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 19 Sep 2023 11:27:31 +0200 Subject: [PATCH 0776/2372] Improve floaty readme --- contracts/floaty/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/contracts/floaty/README.md b/contracts/floaty/README.md index 8c64b87bf7..33da3058cc 100644 --- a/contracts/floaty/README.md +++ b/contracts/floaty/README.md @@ -4,8 +4,10 @@ This contract contains all WebAssembly floating point instructions. It is used for testing the floating point support. In order to compile it, you need a nightly version of Rust and enable the -`nontrapping-fptoint` target-feature like this: +`nontrapping-fptoint` target-feature. +This allows the usage of [some more conversion instructions](https://github.com/WebAssembly/spec/blob/main/proposals/nontrapping-float-to-int-conversion/Overview.md). +To do this, run: ```sh -RUSTFLAGS="-C target-feature=+nontrapping-fptoint" cargo wasm +RUSTFLAGS="-C link-arg=-s -C target-feature=+nontrapping-fptoint" cargo wasm ``` From 4fb3e2dfdb2e2cc61b1ea6178c519af75172557d Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 19 Sep 2023 12:55:50 +0200 Subject: [PATCH 0777/2372] Ignore floaty when building contracts --- .circleci/config.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 71d7341522..acd3756e6f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1030,13 +1030,14 @@ jobs: name: Build development contracts command: | echo "Building all contracts under ./contracts" + export GLOBIGNORE="./contracts/floaty/" docker run --volumes-from with_code cosmwasm/rust-optimizer:0.12.13 ./contracts/*/ - run: name: Check development contracts command: | echo "Checking all contracts under ./artifacts" docker run --volumes-from with_code rust:1.67.0 \ - /bin/bash -e -c 'export GLOBIGNORE="artifacts/floaty.wasm"; cd ./code; cargo run --bin cosmwasm-check artifacts/*.wasm' + /bin/bash -e -c 'cd ./code; cargo run --bin cosmwasm-check artifacts/*.wasm' docker cp with_code:/code/artifacts . - run: name: Publish artifacts on GitHub From 7940da9d785cd367b00e34df8ff2693e061aedc0 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 19 Sep 2023 12:58:24 +0200 Subject: [PATCH 0778/2372] Refactor --- contracts/floaty/Cargo.toml | 2 +- contracts/floaty/src/contract.rs | 10 --------- contracts/floaty/src/floats.rs | 36 +++++++++++++++++++------------- 3 files changed, 22 insertions(+), 26 deletions(-) diff --git a/contracts/floaty/Cargo.toml b/contracts/floaty/Cargo.toml index 63a78be956..e78bf00175 100644 --- a/contracts/floaty/Cargo.toml +++ b/contracts/floaty/Cargo.toml @@ -35,7 +35,7 @@ cosmwasm-schema = { path = "../../packages/schema" } cosmwasm-std = { path = "../../packages/std" } schemars = "0.8.3" serde = { version = "1.0.103", default-features = false, features = ["derive"] } -rand_chacha = "0.3.1" +rand_chacha = { version = "0.3.1", default-features = false } [dev-dependencies] cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator"] } diff --git a/contracts/floaty/src/contract.rs b/contracts/floaty/src/contract.rs index 9ec2197075..99b0def3b2 100644 --- a/contracts/floaty/src/contract.rs +++ b/contracts/floaty/src/contract.rs @@ -21,16 +21,6 @@ pub fn instantiate( Ok(Response::default()) } -#[entry_point] -pub fn execute( - _deps: DepsMut, - _env: Env, - _info: MessageInfo, - _msg: Empty, -) -> Result { - Ok(Response::default()) -} - #[entry_point] pub fn query(_deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { match msg { diff --git a/contracts/floaty/src/floats.rs b/contracts/floaty/src/floats.rs index 7e921182b7..d928700113 100644 --- a/contracts/floaty/src/floats.rs +++ b/contracts/floaty/src/floats.rs @@ -21,22 +21,28 @@ const MANTISSA_MASK_64: u64 = 0x000fffffffffffff; /// then generate a random pattern within that class pub fn random_f32(rng: &mut impl RngCore) -> f32 { let decider = rng.next_u32(); - let bits = if decider < u32::MAX / 4 { - // 25% chance of being a NaN - random_nan_32(rng) - } else if decider < u32::MAX / 2 { - // 25% chance of being a subnormal - random_subnormal_32(rng) - } else if decider < u32::MAX / 4 * 3 { - // 25% chance of being an infinite - if decider % 2 == 0 { - INF_32 - } else { - NEG_INF_32 + let bits = match decider % 4 { + 0 => { + // 25% chance of being a NaN + random_nan_32(rng) } - } else { - // 25% chance of being a random bit pattern - rng.next_u32() + 1 => { + // 25% chance of being a subnormal + random_subnormal_32(rng) + } + 2 => { + // 25% chance of being an infinite + if decider % 2 == 0 { + INF_32 + } else { + NEG_INF_32 + } + } + 3 => { + // 25% chance of being a random bit pattern + rng.next_u32() + } + _ => unreachable!(), }; f32::from_bits(bits) } From dc2737c16f06f9fab7052ddedaf767ec3e0e51cb Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Tue, 19 Sep 2023 13:01:33 +0200 Subject: [PATCH 0779/2372] Use smaller floaty build --- packages/vm/testdata/floaty_2.0.wasm | Bin 2022223 -> 181647 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/vm/testdata/floaty_2.0.wasm b/packages/vm/testdata/floaty_2.0.wasm index c165731f8d62d14f0efbe577265bca8bf8795845..255560f0d0446896d60423c3312bde7dc805f1cf 100755 GIT binary patch delta 58672 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 literal 2022223 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%0Dw4 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 diff --git a/packages/vm/testdata/floaty.wasm b/packages/vm/testdata/floaty.wasm index 8ae4d6a31d..76b5ee18c7 120000 --- a/packages/vm/testdata/floaty.wasm +++ b/packages/vm/testdata/floaty.wasm @@ -1 +1 @@ -floaty_1.0.wasm \ No newline at end of file +floaty_1.2.wasm \ No newline at end of file diff --git a/packages/vm/testdata/floaty_1.2.wasm b/packages/vm/testdata/floaty_1.2.wasm new file mode 100644 index 0000000000000000000000000000000000000000..653c3e884ec9a53009e77fada6d8e6eb8caedc6b GIT binary patch literal 163839 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